From 3815c512493ac017e7c62e8aa0ce1ab5e01f73e3 Mon Sep 17 00:00:00 2001 From: olivier <> Date: Fri, 18 May 2007 10:28:50 +0000 Subject: [PATCH] - the media objects ID regex is now in the models, following DRY (see urls) - media objects IDs are now validated at model level - experimenting new logo by Julia - trying some new layout + cleaned css - renamed "dictionaries" to "enumerations" - new PublishingStatus enumerations model (you simply need to syncdb) --- telemeta/htdocs/css/telemeta.css | 65 +++------- telemeta/htdocs/images/logo.png | Bin 6557 -> 6801 bytes telemeta/models.py | 49 +++---- telemeta/templates/admin.html | 18 +-- telemeta/templates/base.html | 4 +- ...ionary_edit.html => enumeration_edit.html} | 17 ++- ...value.html => enumeration_edit_value.html} | 8 +- telemeta/urls.py | 56 ++++---- telemeta/views/web.py | 122 ++++++------------ 9 files changed, 137 insertions(+), 202 deletions(-) rename telemeta/templates/{dictionary_edit.html => enumeration_edit.html} (62%) rename telemeta/templates/{dictionary_edit_value.html => enumeration_edit_value.html} (53%) diff --git a/telemeta/htdocs/css/telemeta.css b/telemeta/htdocs/css/telemeta.css index 08aaed8b..b21658f7 100644 --- a/telemeta/htdocs/css/telemeta.css +++ b/telemeta/htdocs/css/telemeta.css @@ -1,7 +1,4 @@ -body { - font-family: Verdana; - font-size: 80%; -} +body { font-family: Verdana; font-size: 80%; } a:link, a:visited { border-bottom:1px dotted #BBBBBB; @@ -9,51 +6,35 @@ a:link, a:visited { text-decoration:none; } -a:link:hover, a:visited:hover { - background-color:#EEEEEE; - color:#555555; -} +a:link:hover, a:visited:hover { background-color:#EEEEEE; color:#555555; } +a img { border: none; } #header { - border-bottom: solid 1px black; padding-bottom: 0.2em; padding-top: 0.2em; } -#header a { - text-decoration: none; -} -#header a img { - border: none; -} - - -#menu { - text-align: right; - clear: right; -} -#submenu { - clear: right; - float: right; - padding-top: 1em; -} -#submenu a { - color: #000066; -} +#logo { padding-top: 1ex; } +#logo a, #logo a:hover { border: none; background: transparent; } -#quick_search { - position: absolute; - top: 2em; - right: 1em; +#menu a, #menu a:hover { border: none;} +#menu { + text-align: right; + clear: right; + background: #DDDDDD; + padding: 1px; + border-bottom: solid 1px black; } +#submenu { clear: right; float: right; padding-top: 1em; } +#submenu a { color: #000066; } +#quick_search { position: absolute; top: 2em; right: 1em; } #quick_search input { vertical-align: middle; font-size: 90%; } -#quick_search_pattern { -} +#quick_search_pattern { } .item_visualization { clear: right; @@ -61,14 +42,8 @@ a:link:hover, a:visited:hover { padding: 1ex; margin-top: 1em; } -.item_visualization select { - width: 200px; -} - -.item_visualization img { - width: 300px; - border: solid 1px black; -} +.item_visualization select { width: 200px; } +.item_visualization img { width: 300px; border: solid 1px black; } /* Styles for tabular listings (stolen from trac) */ @@ -163,6 +138,4 @@ label.disabled { color: #d7d7d7 } /* HTML dublin core display */ -table.dublincore { - width: auto; -} +table.dublincore { width: auto; } diff --git a/telemeta/htdocs/images/logo.png b/telemeta/htdocs/images/logo.png index 0041d069d31db635cb6fed3dee5193e6bef76092..b99eb35568d7ebf93fab1099545ac736292724e3 100644 GIT binary patch literal 6801 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 literal 6557 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 P00000NkvXXu0mjf!j-iQ diff --git a/telemeta/models.py b/telemeta/models.py index 067dc2ce..f2d47579 100644 --- a/telemeta/models.py +++ b/telemeta/models.py @@ -7,13 +7,18 @@ # # Author: Olivier Guilyardi -import telemeta from django.db import models from django.db.models import Q -from telemeta.core import * from django.core.exceptions import ObjectDoesNotExist +from django.core import validators + +import telemeta +from telemeta.core import * from telemeta import dublincore as dc +# Regular (sub) expression for matching/validating media objects IDs +media_id_regex = r'[0-9A-Za-z._:%?-]+' + class MediaModel(Component): pass @@ -25,27 +30,22 @@ class MediaCore: fields_dict[field.name] = getattr(self, field.name) return fields_dict -# def dc_elements(self): -# """Return model fields mapped to Dublin Core elements, as a dict of -# the form: {dc_element_name: [value1, value2, ....], ...} -# """ -# fields_dict = {} -# for field in self._meta.fields: -# if (hasattr(field, 'dc_element')): -# if fields_dict.has_key(field.dc_element): -# fields_dict[field.dc_element].append(getattr(self, field.name)) -# else: -# fields_dict[field.dc_element] = [getattr(self, field.name)] -# -# return fields_dict - class PhysicalFormat(models.Model): value = models.CharField(maxlength=250) - is_dictionary = True + is_enumeration = True + def __str__(self): + return self.value + class Meta: + ordering = ['value'] + +class PublishingStatus(models.Model): + value = models.CharField(maxlength=250) + is_enumeration = True def __str__(self): return self.value class Meta: ordering = ['value'] + verbose_name_plural = "Publishing status" class MediaCollectionManager(models.Manager): def quick_search(self, pattern): @@ -55,20 +55,22 @@ class MediaCollectionManager(models.Manager): Q(creator__icontains=pattern) ) - class MediaCollection(models.Model, MediaCore): "Group related media items" + id_regex = media_id_regex + id_validator = validators.MatchesRegularExpression('^' + id_regex + '$') + publisher_reference = models.CharField(maxlength=250, blank=True) physical_format = models.CharField(maxlength=250, blank=True) id = models.CharField(maxlength=250, primary_key=True, - verbose_name='identifier') + verbose_name='identifier', validator_list=[id_validator]) title = models.CharField(maxlength=250) native_title = models.CharField(maxlength=250, blank=True) physical_items_num = models.CharField(maxlength=250, blank=True) publishing_status = models.CharField(maxlength=250, blank=True) - is_original = models.CharField(maxlength=250) - is_full_copy = models.CharField(maxlength=250) + is_original = models.CharField(maxlength=250, blank=True) + is_full_copy = models.CharField(maxlength=250, blank=True) copied_from = models.ForeignKey('self', null=True, blank=True) creator = models.CharField(maxlength=250) booklet_writer = models.CharField(maxlength=250, blank=True) @@ -146,12 +148,15 @@ class MediaItemManager(models.Manager): class MediaItem(models.Model, MediaCore): "Describe a item with metadata" + id_regex = media_id_regex + id_validator = validators.MatchesRegularExpression('^' + id_regex + '$') + ref = models.CharField(maxlength=250, blank=True) format = models.CharField(maxlength=250, blank=True) collection = models.ForeignKey(MediaCollection, related_name="items") face_plage = models.CharField(maxlength=250, blank=True) id = models.CharField(maxlength=250, primary_key=True, - verbose_name='identifier') + verbose_name='identifier', validator_list=[id_validator]) duree = models.CharField(maxlength=250, blank=True) dates_enregistr = models.CharField(maxlength=250, blank=True) etat = models.CharField(maxlength=250, blank=True) diff --git a/telemeta/templates/admin.html b/telemeta/templates/admin.html index 8de5c33a..171f5a31 100644 --- a/telemeta/templates/admin.html +++ b/telemeta/templates/admin.html @@ -10,14 +10,15 @@
  • Users
  • -{% if dictionaries %} -
  • Dictionaries +{% if enumerations %} +
  • Enumerations
      - {% for d in dictionaries %} - {%ifequal d.id dictionary_id %} -
    • {{ d.name|capfirst }}
    • + {% for enum in enumerations %} + {%ifequal enum.id enumeration_id %} +
    • {{ enum.name|capfirst }}
    • {%else%} -
    • {{ d.name|capfirst }}
    • +
    • + {{ enum.name|capfirst }}
    • {%endifequal%} {% endfor %}
    @@ -27,11 +28,6 @@
    {% block tabcontents %} - - - - - {% endblock %}
    {% endblock %} diff --git a/telemeta/templates/base.html b/telemeta/templates/base.html index 5f3c6626..7ed55b94 100644 --- a/telemeta/templates/base.html +++ b/telemeta/templates/base.html @@ -13,7 +13,9 @@ {% endif %} -->