-body {
- font-family: Verdana;
- font-size: 80%;
-}
+body { font-family: Verdana; font-size: 80%; }
a:link, a:visited {
border-bottom:1px dotted #BBBBBB;
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;
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) */
/* HTML dublin core display */
-table.dublincore {
- width: auto;
-}
+table.dublincore { width: auto; }
#
# Author: Olivier Guilyardi <olivier@samalyse.com>
-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
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):
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)
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)
<ul>
<li>Users</li>
-{% if dictionaries %}
- <li>Dictionaries
+{% if enumerations %}
+ <li>Enumerations
<ul>
- {% for d in dictionaries %}
- {%ifequal d.id dictionary_id %}
- <li class="active">{{ d.name|capfirst }}</li>
+ {% for enum in enumerations %}
+ {%ifequal enum.id enumeration_id %}
+ <li class="active">{{ enum.name|capfirst }}</li>
{%else%}
- <li><a href="{% url telemeta-dictionary-edit d.id %}">{{ d.name|capfirst }}</a></li>
+ <li><a href="{% url telemeta-enumeration-edit enum.id %}">
+ {{ enum.name|capfirst }}</a></li>
{%endifequal%}
{% endfor %}
</ul>
</div>
<div class="tabcontents">
{% block tabcontents %}
-
-
-
-
-
{% endblock %}
</div>
{% endblock %}
{% endif %}
-->
<div id="header">
-<a href="/"><img src="/images/logo.png"></a>
+<div id="logo">
+<a href="{% url telemeta-home %}"><img src="/images/logo.png"></a>
+</div>
<div id="quick_search">
<form action="{% url telemeta-quicksearch %}" method="GET">
+++ /dev/null
-{% extends "admin.html" %}
-
-{% block tabcontents %}
- <h4>Manage {{ dictionary_name_plural|capfirst }}</h4>
-
-
-
- <form class="addnew" id="addenum" method="post"
- action="{% url telemeta-dictionary-add dictionary_id %}">
- <fieldset>
- <legend>Add {{ dictionary_name|capfirst }}</legend>
- <div class="field">
- <label>Value: <input type="text" name="value"></label>
-
- </div>
- <div class="buttons">
- <input type="submit" name="add" value="Add">
- </div>
- </fieldset>
- </form>
- {% if dictionary_values %}
- <form method="POST" action="{% url telemeta-dictionary-update dictionary_id %}">
- <table class="listing">
- <thead>
- <tr><th class="sel"> </th><th>Value</th>
-
- </tr>
- </thead><tbody>
- {% for record in dictionary_values %}
- <tr>
- <td><input type="checkbox" name="sel" value="{{record.id}}" /></td>
- <td><a href="{% url telemeta-dictionary-record-edit dictionary_id,record.id %}">
- {{record.value}}</a></td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- <div class="buttons">
- <input type="submit" name="remove" value="Remove selected items" />
- </div>
- </form>
- {% else %}
- <p class="help">This dictionary is empty.</p>
- {% endif %}
-
- <br style="clear: right"/>
-
-{% endblock %}
+++ /dev/null
-{% extends "admin.html" %}
-
-{% block tabcontents %}
- <h4>Manage {{ dictionary_name_plural|capfirst }}</h4>
-
- <form class="mod" id="addenum" method="post"
- action="{% url telemeta-dictionary-record-update dictionary_id,dictionary_record.id %}">
- <fieldset>
- <legend>Modify {{ dictionary_name|capfirst }}</legend>
- <div class="field">
- <label>Value: <input type="text" name="value" value="{{dictionary_record.value}}" /></label>
-
- </div>
- <div class="buttons">
- <input type="submit" name="save" value="Save">
- <input type="submit" name="cancel" value="Cancel">
- </div>
- </fieldset>
- </form>
- <br style="clear: right"/>
-
-{% endblock %}
--- /dev/null
+{% extends "admin.html" %}
+
+{% block tabcontents %}
+ <h4>Manage {{ enumeration_name_plural|capfirst }}</h4>
+
+
+
+ <form class="addnew" id="addenum" method="post"
+ action="{% url telemeta-enumeration-add enumeration_id %}">
+ <fieldset>
+ <legend>Add {{ enumeration_name|capfirst }}</legend>
+ <div class="field">
+ <label>Value: <input type="text" name="value"></label>
+
+ </div>
+ <div class="buttons">
+ <input type="submit" name="add" value="Add">
+ </div>
+ </fieldset>
+ </form>
+ {% if enumeration_values %}
+ <form method="POST" action="{% url telemeta-enumeration-update enumeration_id %}">
+ <table class="listing">
+ <thead>
+ <tr><th class="sel"> </th><th>Value</th>
+
+ </tr>
+ </thead><tbody>
+ {% for record in enumeration_values %}
+ <tr>
+ <td><input type="checkbox" name="sel" value="{{record.id}}" /></td>
+ <td><a href="{% url telemeta-enumeration-record-edit enumeration_id,record.id %}">
+ {{record.value}}</a></td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ <div class="buttons">
+ <input type="submit" name="remove" value="Remove selected items" />
+ </div>
+ </form>
+ {% else %}
+ <p class="help">This enumeration is empty.</p>
+ {% endif %}
+
+ <br style="clear: right"/>
+{% endblock %}
--- /dev/null
+{% extends "admin.html" %}
+
+{% block tabcontents %}
+ <h4>Manage {{ enumeration_name_plural|capfirst }}</h4>
+
+ <form class="mod" id="addenum" method="post"
+ action="{% url telemeta-enumeration-record-update enumeration_id,enumeration_record.id %}">
+ <fieldset>
+ <legend>Modify {{ enumeration_name|capfirst }}</legend>
+ <div class="field">
+ <label>Value: <input type="text" name="value" value="{{enumeration_record.value}}" /></label>
+
+ </div>
+ <div class="buttons">
+ <input type="submit" name="save" value="Save">
+ <input type="submit" name="cancel" value="Cancel">
+ </div>
+ </fieldset>
+ </form>
+ <br style="clear: right"/>
+
+{% endblock %}
all_items = { 'queryset': MediaItem.objects.all(), }
all_collections = { 'queryset': MediaCollection.objects.all(), }
+# ID's regular expressions
+i_ex = MediaItem.id_regex
+c_ex = MediaCollection.id_regex
+
urlpatterns = patterns('',
- (r'^$', web_view.index),
+ url(r'^$', web_view.index, name="telemeta-home"),
# items
url(r'^items/$', 'django.views.generic.list_detail.object_list',
dict(all_items, paginate_by=20, template_name="mediaitem_list.html"),
name="telemeta-items"),
- url(r'^items/(?P<item_id>[0-9A-Z._:%?-]+)/$', web_view.item_detail,
+ url(r'^items/(?P<item_id>' + i_ex + ')/$', web_view.item_detail,
name="telemeta-item-detail"),
- url(r'^items/(?P<item_id>[0-9A-Z._:%?-]+)/dc/$', web_view.item_detail,
+ url(r'^items/(?P<item_id>' + i_ex + ')/dc/$', web_view.item_detail,
{'template': 'mediaitem_detail_dc.html'},
name="telemeta-item-dublincore"),
- url(r'^items/(?P<item_id>[0-9A-Z._:%?-]+)/dc/xml/$', web_view.item_detail,
+ url(r'^items/(?P<item_id>' + i_ex + ')/dc/xml/$', web_view.item_detail,
{'format': 'dublin_core_xml'},
name="telemeta-item-dublincore-xml"),
- url(r'^items/(?P<item_id>[0-9A-Z._:%?-]+)/download/(?P<format>[0-9A-Z]+)/$',
+ url(r'^items/(?P<item_id>' + i_ex + ')/download/(?P<format>[0-9A-Z]+)/$',
web_view.item_export,
name="telemeta-item-export"),
- url(r'^items/(?P<item_id>[0-9A-Z._:%?-]+)/visualize/(?P<visualizer_id>[0-9a-z]+)/$',
+ url(r'^items/(?P<item_id>' + i_ex + ')/visualize/(?P<visualizer_id>[0-9a-z]+)/$',
web_view.item_visualize,
name="telemeta-item-visualize"),
url(r'^collections/?page=(?P<page>[0-9]+)$',
'django.views.generic.list_detail.object_list',
dict(all_collections, paginate_by=20)),
- url(r'^collections/(?P<object_id>[0-9A-Z._%?-]+)/$',
+ url(r'^collections/(?P<object_id>' + c_ex + ')/$',
'django.views.generic.list_detail.object_detail',
dict(all_collections, template_name="collection_detail.html"),
name="telemeta-collection-detail"),
- url(r'^collections/(?P<object_id>[0-9A-Z._%?-]+)/dc/$',
+ url(r'^collections/(?P<object_id>' + c_ex + ')/dc/$',
'django.views.generic.list_detail.object_detail',
dict(all_collections, template_name="collection_detail_dc.html"),
name="telemeta-collection-dublincore"),
# administration
url(r'^admin/$', web_view.admin_index, name="telemeta-admin"),
- # dictionaries administration
- url(r'^admin/dictionaries/(?P<dictionary_id>[0-9a-z]+)/$',
- web_view.edit_dictionary ,
- name="telemeta-dictionary-edit"),
- url(r'^admin/dictionaries/(?P<dictionary_id>[0-9a-z]+)/add/$',
- web_view.add_to_dictionary,
- name="telemeta-dictionary-add"),
- url(r'^admin/dictionaries/(?P<dictionary_id>[0-9a-z]+)/update/$',
- web_view.update_dictionary,
- name="telemeta-dictionary-update"),
- url(r'^admin/dictionaries/(?P<dictionary_id>[0-9a-z]+)/(?P<value_id>[0-9]+)/$',
- web_view.edit_dictionary_value,
- name="telemeta-dictionary-record-edit"),
-
- url(r'^admin/dictionaries/(?P<dictionary_id>[0-9a-z]+)/(?P<value_id>[0-9]+)/update/$',
- web_view.update_dictionary_value,
- name="telemeta-dictionary-record-update"),
-
+ # enumerations administration
+ url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/$',
+ web_view.edit_enumeration ,
+ name="telemeta-enumeration-edit"),
+ url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/add/$',
+ web_view.add_to_enumeration,
+ name="telemeta-enumeration-add"),
+ url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/update/$',
+ web_view.update_enumeration,
+ name="telemeta-enumeration-update"),
+ url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/'
+ + r'(?P<value_id>[0-9]+)/$',
+ web_view.edit_enumeration_value,
+ name="telemeta-enumeration-record-edit"),
+ url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/'
+ + r'(?P<value_id>[0-9]+)/update/$',
+ web_view.update_enumeration_value,
+ name="telemeta-enumeration-record-update"),
# CSS+Images (FIXME: for developement only)
(r'^css/(?P<path>.*)$', 'django.views.static.serve',
{'pattern': pattern, 'collections': collections,
'items': items})
- def __get_dictionary_list(self):
+ def __get_enumerations_list(self):
from django.db.models import get_models
models = get_models(telemeta.models)
- dictionaries = []
+ enumerations = []
for model in models:
- if getattr(model, "is_dictionary", False):
- dictionaries.append({"name": model._meta.verbose_name_plural,
+ if getattr(model, "is_enumeration", False):
+ enumerations.append({"name": model._meta.verbose_name_plural,
"id": model._meta.module_name})
- return dictionaries
+ return enumerations
def __get_admin_context_vars(self):
- return {"dictionaries": self.__get_dictionary_list()}
+ return {"enumerations": self.__get_enumerations_list()}
def admin_index(self, request):
return render_to_response('admin.html', self. __get_admin_context_vars())
- def __get_dictionary(self, id):
+ def __get_enumeration(self, id):
from django.db.models import get_models
models = get_models(telemeta.models)
for model in models:
return None
return model
-
- def edit_dictionary(self, request, dictionary_id):
+ def edit_enumeration(self, request, enumeration_id):
- dictionary = self.__get_dictionary(dictionary_id)
- if dictionary == None:
+ enumeration = self.__get_enumeration(enumeration_id)
+ if enumeration == None:
raise Http404
vars = self.__get_admin_context_vars()
- vars["dictionary_id"] = dictionary._meta.module_name
- vars["dictionary_name"] = dictionary._meta.verbose_name
- vars["dictionary_name_plural"] = dictionary._meta.verbose_name_plural
- vars["dictionary_values"] = dictionary.objects.all()
- return render_to_response('dictionary_edit.html', vars)
+ vars["enumeration_id"] = enumeration._meta.module_name
+ vars["enumeration_name"] = enumeration._meta.verbose_name
+ vars["enumeration_name_plural"] = enumeration._meta.verbose_name_plural
+ vars["enumeration_values"] = enumeration.objects.all()
+ return render_to_response('enumeration_edit.html', vars)
- def add_to_dictionary(self, request, dictionary_id):
+ def add_to_enumeration(self, request, enumeration_id):
- dictionary = self.__get_dictionary(dictionary_id)
- if dictionary == None:
+ enumeration = self.__get_enumeration(enumeration_id)
+ if enumeration == None:
raise Http404
- dictionary_value = dictionary(value=request.POST['value'])
- dictionary_value.save()
+ enumeration_value = enumeration(value=request.POST['value'])
+ enumeration_value.save()
- return self.edit_dictionary(request, dictionary_id)
+ return self.edit_enumeration(request, enumeration_id)
- def update_dictionary(self, request, dictionary_id):
+ def update_enumeration(self, request, enumeration_id):
- dictionary = self.__get_dictionary(dictionary_id)
- if dictionary == None:
+ enumeration = self.__get_enumeration(enumeration_id)
+ if enumeration == None:
raise Http404
if request.POST.has_key("remove"):
- dictionary.objects.filter(id__in=request.POST['sel']).delete()
+ enumeration.objects.filter(id__in=request.POST.getlist('sel')).delete()
- return self.edit_dictionary(request, dictionary_id)
+ return self.edit_enumeration(request, enumeration_id)
- def edit_dictionary_value(self, request, dictionary_id, value_id):
+ def edit_enumeration_value(self, request, enumeration_id, value_id):
- dictionary = self.__get_dictionary(dictionary_id)
- if dictionary == None:
+ enumeration = self.__get_enumeration(enumeration_id)
+ if enumeration == None:
raise Http404
vars = self.__get_admin_context_vars()
- vars["dictionary_id"] = dictionary._meta.module_name
- vars["dictionary_name"] = dictionary._meta.verbose_name
- vars["dictionary_name_plural"] = dictionary._meta.verbose_name_plural
- vars["dictionary_record"] = dictionary.objects.get(id__exact=value_id)
- return render_to_response('dictionary_edit_value.html', vars)
+ vars["enumeration_id"] = enumeration._meta.module_name
+ vars["enumeration_name"] = enumeration._meta.verbose_name
+ vars["enumeration_name_plural"] = enumeration._meta.verbose_name_plural
+ vars["enumeration_record"] = enumeration.objects.get(id__exact=value_id)
+ return render_to_response('enumeration_edit_value.html', vars)
- def update_dictionary_value(self, request, dictionary_id, value_id):
+ def update_enumeration_value(self, request, enumeration_id, value_id):
if request.POST.has_key("save"):
- dictionary = self.__get_dictionary(dictionary_id)
- if dictionary == None:
+ enumeration = self.__get_enumeration(enumeration_id)
+ if enumeration == None:
raise Http404
- record = dictionary.objects.get(id__exact=value_id)
+ record = enumeration.objects.get(id__exact=value_id)
record.value = request.POST["value"]
record.save()
- return self.edit_dictionary(request, dictionary_id)
+ return self.edit_enumeration(request, enumeration_id)
-def media_item_edit(request, media_item_id):
- "Provide MediaItem object edition"
-
- media_item = MediaItem.objects.get(pk=media_item_id)
- dynprops = media_item.get_dynamic_properties()
- return render_to_response('media_item.html', {'media_item': media_item, 'dynprops' : dynprops})
-
-def media_item_update(request, media_item_id):
- "Handle MediaItem object edition form submission"
-
- media_item = MediaItem.objects.get(pk=media_item_id)
- media_item.author = request.POST['author']
- media_item.title = request.POST['title']
- media_item.save()
-
- pattern = re.compile(r'^dynprop_(\d+)$')
- for name, value in request.POST.items():
- match = pattern.search(name)
- if match:
- prop_id = match.groups()[0]
- prop = MediaItemPropertyDefinition.objects.get(pk=prop_id)
- telemeta.logger.debug("prop_id: " + prop_id + " ; " + "media_item_id: " +
- media_item_id + " ; value: " + value +
- " ; type:" + prop.type)
- media_item = MediaItem.objects.get(pk=media_item_id)
- property, created = MediaItemProperty.objects.get_or_create(
- media_item=media_item, definition=prop)
-
- if prop.type == 'text':
- property.value = value
- else:
- value = int(value)
-
- if value > 0:
- enum_item = MediaItemPropertyEnumerationItem.objects.get(pk=value)
- property.enum_item = enum_item
- else:
- property.enum_item = 0
-
- property.save()
-
- return media_item_edit(request, media_item_id)
-