From 6d9a741334ef9084c4c1f082ac92b59a7bace2a5 Mon Sep 17 00:00:00 2001 From: olivier <> Date: Mon, 23 Apr 2007 08:09:32 +0000 Subject: [PATCH] - coupled the web interface with the export layer - improved collections and items browsing - minor CSS improvements - now using Django typical models instead of "dynamic" ones - made simple models based on Dublin Core elements --- telemeta/css/style.css | 19 +++ telemeta/models.py | 159 +++++++++++----------- telemeta/templates/base.html | 6 +- telemeta/templates/collection_detail.html | 30 ++++ telemeta/templates/collection_list.html | 17 +++ telemeta/templates/index.html | 17 ++- telemeta/templates/mediaitem_detail.html | 32 +++++ telemeta/templates/mediaitem_list.html | 2 +- telemeta/urls.py | 24 +++- telemeta/views/web.py | 61 ++++++++- 10 files changed, 273 insertions(+), 94 deletions(-) create mode 100644 telemeta/templates/collection_detail.html create mode 100644 telemeta/templates/collection_list.html create mode 100644 telemeta/templates/mediaitem_detail.html diff --git a/telemeta/css/style.css b/telemeta/css/style.css index 54afe4f6..5b3036fa 100644 --- a/telemeta/css/style.css +++ b/telemeta/css/style.css @@ -1,5 +1,6 @@ body { font-family: Verdana; + font-size: 11px; } #header { @@ -17,3 +18,21 @@ label { input { margin-bottom: 4px; } + +#menu { + text-align: right; +} + +#menu a:link, #menu a:visited { + border-bottom:1px dotted #BBBBBB; + color:#BB0000; + text-decoration:none; +} + +#menu a:link:hover, #menu a:visited:hover { + background-color:#EEEEEE; + color:#555555; +} + +#menu a { +} diff --git a/telemeta/models.py b/telemeta/models.py index be0a80c6..ae202810 100644 --- a/telemeta/models.py +++ b/telemeta/models.py @@ -1,112 +1,115 @@ import telemeta from django.db import models -from django.core import validators +from telemeta.core import * -class Collection(models.Model): - "Group related media items" +class MediaModel(Component): + pass - name = models.CharField(maxlength=250) +class MediaCore: + def list(self): + fields_list = [] + for field in self._meta.fields: + fields_list.append({'name': field.name, 'value': getattr(self, field.name)}) + return fields_list - def __str__(self): - return self.name + def to_dict(self): + fields_dict = {} + for field in self._meta.fields: + fields_dict[field.name] = getattr(self, field.name) + return fields_dict - class Admin: - pass - -class MediaItem(models.Model): - "Describe an audio/video item with metadata" +class MediaCollection(models.Model, MediaCore): + "Group related media items" - collection = models.ForeignKey(Collection) title = models.CharField(maxlength=250) - author = models.CharField(maxlength=250) - - - - def get_dynamic_properties(self): - "Retrieve dynamic properties associated with a given media item" - - definitions = MediaItemPropertyDefinition.objects.all() - assigned = MediaItemProperty.objects.filter(media_item=self) - assigned_dict = {} - for p in assigned: - assigned_dict[p.definition.id] = p - - properties = [] - for d in definitions: - enumeration = MediaItemPropertyEnumerationItem.objects.filter(definition=d) - - if d.id in assigned_dict: - if d.type == "text": - value = assigned_dict[d.id].value - else: - value = assigned_dict[d.id].enum_item - - properties.append({ - "id": d.id, "name": d.name, "value": value, - "type" : d.type, "enumeration" : enumeration}) - else: - properties.append({"id": d.id, "name": d.name, "value": "", - "type" : d.type, "enumeration" : enumeration}) - - return properties + date = models.DateField() + contributor = models.CharField(maxlength=250, blank=True) + coverage = models.CharField(maxlength=250, blank=True) + creator = models.CharField(maxlength=250, blank=True) + description = models.CharField(maxlength=250, blank=True) + format = models.CharField(maxlength=250, blank=True) + identifier = models.CharField(maxlength=250, blank=True) + language = models.CharField(maxlength=250, blank=True) + publisher = models.CharField(maxlength=250, blank=True) + rights = models.CharField(maxlength=250, blank=True) + source = models.CharField(maxlength=250, blank=True) + subject = models.CharField(maxlength=250, blank=True) def __str__(self): - return self.author + " - " + self.title + return self.title class Meta: - pass + ordering = ['title'] + db_table = 'telemeta_collection' class Admin: pass -class MediaItemPropertyDefinition(models.Model): - "Define a media item dynamic property" - - TYPE_CHOICES = ( - ('text', 'Text'), - ('enumeration', 'Enumeration'), - ) - name = models.CharField(maxlength=64) - type = models.CharField(maxlength=64, choices = TYPE_CHOICES) - - def __str__(self): - return self.name - - class Admin: - pass -class MediaItemPropertyEnumerationItem(models.Model): - "Define a possible value for media item dynamic enumeration properties" +class MediaItem(models.Model, MediaCore): + "Describe a item with metadata" - definition = models.ForeignKey(MediaItemPropertyDefinition, core=True) - name = models.CharField(maxlength=250) + collection = models.ForeignKey(MediaCollection, related_name="items") + collection.dublin_core = 'relation' + identifier = models.CharField(maxlength=250) + title = models.CharField(maxlength=250) + creator = models.CharField(maxlength=250) + date = models.DateField() + file = models.FileField(upload_to='items/%Y/%m/%d') + subject = models.CharField(maxlength=250, blank=True) + description = models.TextField(maxlength=250, blank=True) + contributor = models.CharField(maxlength=250, blank=True) + coverage = models.CharField(maxlength=250, blank=True) + format = models.CharField(maxlength=25, blank=True) + language = models.CharField(maxlength=250, blank=True) + publisher = models.CharField(maxlength=250, blank=True) + rights = models.CharField(maxlength=250, blank=True) + source = models.CharField(maxlength=250, blank=True) + duration = models.FloatField(max_digits=11, decimal_places=3, null=True, blank=True) def __str__(self): - return self.definition.name + " / " + self.name + return self.title class Admin: pass - -class MediaItemProperty(models.Model): - "Associate a value to a media item dynamic property" - definition = models.ForeignKey(MediaItemPropertyDefinition, core=True) + class Meta: + ordering = ['title'] + db_table = 'telemeta_item' + + +class MediaPart(models.Model, MediaCore): + "Describe the part of a media item" + + contributor = models.CharField(maxlength=250) + coverage = models.CharField(maxlength=250) + creator = models.CharField(maxlength=250) + date = models.DateField() + description = models.CharField(maxlength=250) + format = models.CharField(maxlength=250) + identifier = models.CharField(maxlength=250) + language = models.CharField(maxlength=250) + publisher = models.CharField(maxlength=250) + rights = models.CharField(maxlength=250) + source = models.CharField(maxlength=250) + subject = models.CharField(maxlength=250) + title = models.CharField(maxlength=250) media_item = models.ForeignKey(MediaItem) - value = models.CharField(maxlength=250) - enum_item = models.ForeignKey(MediaItemPropertyEnumerationItem, null=True) + media_item.dublin_core = 'relation' + parent = models.ForeignKey('self', null=True, related_name='children') + media_item.dublin_core = 'relation' + start = models.FloatField(max_digits=11, decimal_places=3) + end = models.FloatField(max_digits=11, decimal_places=3) def __str__(self): - return str(self.media_item) + " / " + str(self.definition) + return self.title class Meta: - unique_together = (("media_item", "definition"),) + ordering = ['title'] + db_table = 'telemeta_part' class Admin: pass - -class Part: - media_item = models.ForeignKey(MediaItem) - parent = models.ForeignKey('self', null=True, related_name='children') - name = models.CharField(maxlength=250) + diff --git a/telemeta/templates/base.html b/telemeta/templates/base.html index 38bff8fa..f69b266e 100644 --- a/telemeta/templates/base.html +++ b/telemeta/templates/base.html @@ -1,9 +1,13 @@ - +
No such collection
+{% endif %} +{% endblock %} diff --git a/telemeta/templates/collection_list.html b/telemeta/templates/collection_list.html new file mode 100644 index 00000000..d70c35b2 --- /dev/null +++ b/telemeta/templates/collection_list.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} + +{% block content %} +No pieces are available.
+{% endif %} +{% endblock %} diff --git a/telemeta/templates/index.html b/telemeta/templates/index.html index 99470102..47858bc7 100644 --- a/telemeta/templates/index.html +++ b/telemeta/templates/index.html @@ -1,12 +1,17 @@ -{% debug %}+{% extends "base.html" %} -
No pieces are available.
+No media item available.
{% endif %} +{% endblock %} diff --git a/telemeta/templates/mediaitem_detail.html b/telemeta/templates/mediaitem_detail.html new file mode 100644 index 00000000..3e529c75 --- /dev/null +++ b/telemeta/templates/mediaitem_detail.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} + +{% block content %} +{% if item %} +No such item
+{% endif %} +{% endblock %} diff --git a/telemeta/templates/mediaitem_list.html b/telemeta/templates/mediaitem_list.html index b32353ff..bcdec1b1 100644 --- a/telemeta/templates/mediaitem_list.html +++ b/telemeta/templates/mediaitem_list.html @@ -5,7 +5,7 @@ {% if object_list %}