Changeset 3815c51
- Timestamp:
- 05/18/07 12:28:50 (6 years ago)
- Branches:
- master, crem, crem2, dev, diadems, forma, generic, instru_search, lam, nlivemulti, production, release/1.4.4, security, social, storage, test, video
- Children:
- 879d772
- Parents:
- aa5a73f
- git-author:
- olivier <> (05/18/07 12:28:50)
- git-committer:
- olivier <> (05/18/07 12:28:50)
- Location:
- telemeta
- Files:
-
- 7 edited
- 2 moved
-
htdocs/css/telemeta.css (modified) (5 diffs)
-
htdocs/images/logo.png (modified) (previous)
-
models.py (modified) (5 diffs)
-
templates/admin.html (modified) (2 diffs)
-
templates/base.html (modified) (1 diff)
-
templates/enumeration_edit.html (moved) (moved from telemeta/templates/dictionary_edit.html) (4 diffs)
-
templates/enumeration_edit_value.html (moved) (moved from telemeta/templates/dictionary_edit_value.html) (1 diff)
-
urls.py (modified) (4 diffs)
-
views/web.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
telemeta/htdocs/css/telemeta.css
r33b65e3 r3815c51 1 body { 2 font-family: Verdana; 3 font-size: 80%; 4 } 1 body { font-family: Verdana; font-size: 80%; } 5 2 6 3 a:link, a:visited { … … 10 7 } 11 8 12 a:link:hover, a:visited:hover { 13 background-color:#EEEEEE; 14 color:#555555; 15 } 9 a:link:hover, a:visited:hover { background-color:#EEEEEE; color:#555555; } 10 a img { border: none; } 16 11 17 12 #header { 18 border-bottom: solid 1px black;19 13 padding-bottom: 0.2em; 20 14 padding-top: 0.2em; 21 15 } 22 #header a { 23 text-decoration: none; 16 17 #logo { padding-top: 1ex; } 18 #logo a, #logo a:hover { border: none; background: transparent; } 19 20 #menu a, #menu a:hover { border: none;} 21 #menu { 22 text-align: right; 23 clear: right; 24 background: #DDDDDD; 25 padding: 1px; 26 border-bottom: solid 1px black; 24 27 } 25 #header a img { 26 border: none; 27 } 28 #submenu { clear: right; float: right; padding-top: 1em; } 29 #submenu a { color: #000066; } 28 30 29 30 #menu { 31 text-align: right; 32 clear: right; 33 } 34 35 #submenu { 36 clear: right; 37 float: right; 38 padding-top: 1em; 39 } 40 #submenu a { 41 color: #000066; 42 } 43 44 #quick_search { 45 position: absolute; 46 top: 2em; 47 right: 1em; 48 } 49 31 #quick_search { position: absolute; top: 2em; right: 1em; } 50 32 #quick_search input { 51 33 vertical-align: middle; … … 53 35 } 54 36 55 #quick_search_pattern { 56 } 37 #quick_search_pattern { } 57 38 58 39 .item_visualization { … … 62 43 margin-top: 1em; 63 44 } 64 .item_visualization select { 65 width: 200px; 66 } 67 68 .item_visualization img { 69 width: 300px; 70 border: solid 1px black; 71 } 45 .item_visualization select { width: 200px; } 46 .item_visualization img { width: 300px; border: solid 1px black; } 72 47 73 48 … … 164 139 /* HTML dublin core display */ 165 140 166 table.dublincore { 167 width: auto; 168 } 141 table.dublincore { width: auto; } -
telemeta/models.py
r01bf9f7 r3815c51 8 8 # Author: Olivier Guilyardi <olivier@samalyse.com> 9 9 10 import telemeta11 10 from django.db import models 12 11 from django.db.models import Q 12 from django.core.exceptions import ObjectDoesNotExist 13 from django.core import validators 14 15 import telemeta 13 16 from telemeta.core import * 14 from django.core.exceptions import ObjectDoesNotExist15 17 from telemeta import dublincore as dc 18 19 # Regular (sub) expression for matching/validating media objects IDs 20 media_id_regex = r'[0-9A-Za-z._:%?-]+' 16 21 17 22 class MediaModel(Component): … … 26 31 return fields_dict 27 32 28 # def dc_elements(self):29 # """Return model fields mapped to Dublin Core elements, as a dict of30 # the form: {dc_element_name: [value1, value2, ....], ...}31 # """32 # fields_dict = {}33 # for field in self._meta.fields:34 # if (hasattr(field, 'dc_element')):35 # if fields_dict.has_key(field.dc_element):36 # fields_dict[field.dc_element].append(getattr(self, field.name))37 # else:38 # fields_dict[field.dc_element] = [getattr(self, field.name)]39 #40 # return fields_dict41 42 33 class PhysicalFormat(models.Model): 43 34 value = models.CharField(maxlength=250) 44 is_ dictionary= True35 is_enumeration = True 45 36 def __str__(self): 46 37 return self.value 47 38 class Meta: 48 39 ordering = ['value'] 40 41 class PublishingStatus(models.Model): 42 value = models.CharField(maxlength=250) 43 is_enumeration = True 44 def __str__(self): 45 return self.value 46 class Meta: 47 ordering = ['value'] 48 verbose_name_plural = "Publishing status" 49 49 50 50 class MediaCollectionManager(models.Manager): … … 56 56 ) 57 57 58 59 58 class MediaCollection(models.Model, MediaCore): 60 59 "Group related media items" 60 61 id_regex = media_id_regex 62 id_validator = validators.MatchesRegularExpression('^' + id_regex + '$') 61 63 62 64 publisher_reference = models.CharField(maxlength=250, blank=True) 63 65 physical_format = models.CharField(maxlength=250, blank=True) 64 66 id = models.CharField(maxlength=250, primary_key=True, 65 verbose_name='identifier' )67 verbose_name='identifier', validator_list=[id_validator]) 66 68 title = models.CharField(maxlength=250) 67 69 native_title = models.CharField(maxlength=250, blank=True) 68 70 physical_items_num = models.CharField(maxlength=250, blank=True) 69 71 publishing_status = models.CharField(maxlength=250, blank=True) 70 is_original = models.CharField(maxlength=250 )71 is_full_copy = models.CharField(maxlength=250 )72 is_original = models.CharField(maxlength=250, blank=True) 73 is_full_copy = models.CharField(maxlength=250, blank=True) 72 74 copied_from = models.ForeignKey('self', null=True, blank=True) 73 75 creator = models.CharField(maxlength=250) … … 147 149 "Describe a item with metadata" 148 150 151 id_regex = media_id_regex 152 id_validator = validators.MatchesRegularExpression('^' + id_regex + '$') 153 149 154 ref = models.CharField(maxlength=250, blank=True) 150 155 format = models.CharField(maxlength=250, blank=True) … … 152 157 face_plage = models.CharField(maxlength=250, blank=True) 153 158 id = models.CharField(maxlength=250, primary_key=True, 154 verbose_name='identifier' )159 verbose_name='identifier', validator_list=[id_validator]) 155 160 duree = models.CharField(maxlength=250, blank=True) 156 161 dates_enregistr = models.CharField(maxlength=250, blank=True) -
telemeta/templates/admin.html
r7b2ff59 r3815c51 11 11 <li>Users</li> 12 12 13 {% if dictionaries %}14 <li> Dictionaries13 {% if enumerations %} 14 <li>Enumerations 15 15 <ul> 16 {% for d in dictionaries %}17 {%ifequal d.id dictionary_id %}18 <li class="active">{{ d.name|capfirst }}</li>16 {% for enum in enumerations %} 17 {%ifequal enum.id enumeration_id %} 18 <li class="active">{{ enum.name|capfirst }}</li> 19 19 {%else%} 20 <li><a href="{% url telemeta-dictionary-edit d.id %}">{{ d.name|capfirst }}</a></li> 20 <li><a href="{% url telemeta-enumeration-edit enum.id %}"> 21 {{ enum.name|capfirst }}</a></li> 21 22 {%endifequal%} 22 23 {% endfor %} … … 28 29 <div class="tabcontents"> 29 30 {% block tabcontents %} 30 31 32 33 34 35 31 {% endblock %} 36 32 </div> -
telemeta/templates/base.html
r01bf9f7 r3815c51 14 14 --> 15 15 <div id="header"> 16 <a href="/"><img src="/images/logo.png"></a> 16 <div id="logo"> 17 <a href="{% url telemeta-home %}"><img src="/images/logo.png"></a> 18 </div> 17 19 18 20 <div id="quick_search"> -
telemeta/templates/enumeration_edit.html
r7b2ff59 r3815c51 2 2 3 3 {% block tabcontents %} 4 <h4>Manage {{ dictionary_name_plural|capfirst }}</h4>4 <h4>Manage {{ enumeration_name_plural|capfirst }}</h4> 5 5 6 6 7 7 8 8 <form class="addnew" id="addenum" method="post" 9 action="{% url telemeta- dictionary-add dictionary_id %}">9 action="{% url telemeta-enumeration-add enumeration_id %}"> 10 10 <fieldset> 11 <legend>Add {{ dictionary_name|capfirst }}</legend>11 <legend>Add {{ enumeration_name|capfirst }}</legend> 12 12 <div class="field"> 13 13 <label>Value: <input type="text" name="value"></label> … … 19 19 </fieldset> 20 20 </form> 21 {% if dictionary_values %}22 <form method="POST" action="{% url telemeta- dictionary-update dictionary_id %}">21 {% if enumeration_values %} 22 <form method="POST" action="{% url telemeta-enumeration-update enumeration_id %}"> 23 23 <table class="listing"> 24 24 <thead> … … 27 27 </tr> 28 28 </thead><tbody> 29 {% for record in dictionary_values %}29 {% for record in enumeration_values %} 30 30 <tr> 31 31 <td><input type="checkbox" name="sel" value="{{record.id}}" /></td> 32 <td><a href="{% url telemeta- dictionary-record-edit dictionary_id,record.id %}">32 <td><a href="{% url telemeta-enumeration-record-edit enumeration_id,record.id %}"> 33 33 {{record.value}}</a></td> 34 34 </tr> … … 41 41 </form> 42 42 {% else %} 43 <p class="help">This dictionaryis empty.</p>43 <p class="help">This enumeration is empty.</p> 44 44 {% endif %} 45 45 46 46 <br style="clear: right"/> 47 48 47 {% endblock %} -
telemeta/templates/enumeration_edit_value.html
r7b2ff59 r3815c51 2 2 3 3 {% block tabcontents %} 4 <h4>Manage {{ dictionary_name_plural|capfirst }}</h4>4 <h4>Manage {{ enumeration_name_plural|capfirst }}</h4> 5 5 6 6 <form class="mod" id="addenum" method="post" 7 action="{% url telemeta-dictionary-record-update dictionary_id,dictionary_record.id %}">7 action="{% url telemeta-enumeration-record-update enumeration_id,enumeration_record.id %}"> 8 8 <fieldset> 9 <legend>Modify {{ dictionary_name|capfirst }}</legend>9 <legend>Modify {{ enumeration_name|capfirst }}</legend> 10 10 <div class="field"> 11 <label>Value: <input type="text" name="value" value="{{ dictionary_record.value}}" /></label>11 <label>Value: <input type="text" name="value" value="{{enumeration_record.value}}" /></label> 12 12 13 13 </div> -
telemeta/urls.py
r01bf9f7 r3815c51 21 21 all_collections = { 'queryset': MediaCollection.objects.all(), } 22 22 23 # ID's regular expressions 24 i_ex = MediaItem.id_regex 25 c_ex = MediaCollection.id_regex 26 23 27 urlpatterns = patterns('', 24 (r'^$', web_view.index),28 url(r'^$', web_view.index, name="telemeta-home"), 25 29 26 30 # items … … 28 32 dict(all_items, paginate_by=20, template_name="mediaitem_list.html"), 29 33 name="telemeta-items"), 30 url(r'^items/(?P<item_id> [0-9A-Z._:%?-]+)/$', web_view.item_detail,34 url(r'^items/(?P<item_id>' + i_ex + ')/$', web_view.item_detail, 31 35 name="telemeta-item-detail"), 32 url(r'^items/(?P<item_id> [0-9A-Z._:%?-]+)/dc/$', web_view.item_detail,36 url(r'^items/(?P<item_id>' + i_ex + ')/dc/$', web_view.item_detail, 33 37 {'template': 'mediaitem_detail_dc.html'}, 34 38 name="telemeta-item-dublincore"), 35 url(r'^items/(?P<item_id> [0-9A-Z._:%?-]+)/dc/xml/$', web_view.item_detail,39 url(r'^items/(?P<item_id>' + i_ex + ')/dc/xml/$', web_view.item_detail, 36 40 {'format': 'dublin_core_xml'}, 37 41 name="telemeta-item-dublincore-xml"), 38 url(r'^items/(?P<item_id> [0-9A-Z._:%?-]+)/download/(?P<format>[0-9A-Z]+)/$',42 url(r'^items/(?P<item_id>' + i_ex + ')/download/(?P<format>[0-9A-Z]+)/$', 39 43 web_view.item_export, 40 44 name="telemeta-item-export"), 41 url(r'^items/(?P<item_id> [0-9A-Z._:%?-]+)/visualize/(?P<visualizer_id>[0-9a-z]+)/$',45 url(r'^items/(?P<item_id>' + i_ex + ')/visualize/(?P<visualizer_id>[0-9a-z]+)/$', 42 46 web_view.item_visualize, 43 47 name="telemeta-item-visualize"), … … 51 55 'django.views.generic.list_detail.object_list', 52 56 dict(all_collections, paginate_by=20)), 53 url(r'^collections/(?P<object_id> [0-9A-Z._%?-]+)/$',57 url(r'^collections/(?P<object_id>' + c_ex + ')/$', 54 58 'django.views.generic.list_detail.object_detail', 55 59 dict(all_collections, template_name="collection_detail.html"), 56 60 name="telemeta-collection-detail"), 57 url(r'^collections/(?P<object_id> [0-9A-Z._%?-]+)/dc/$',61 url(r'^collections/(?P<object_id>' + c_ex + ')/dc/$', 58 62 'django.views.generic.list_detail.object_detail', 59 63 dict(all_collections, template_name="collection_detail_dc.html"), … … 66 70 url(r'^admin/$', web_view.admin_index, name="telemeta-admin"), 67 71 68 # dictionaries administration69 url(r'^admin/ dictionaries/(?P<dictionary_id>[0-9a-z]+)/$',70 web_view.edit_ dictionary,71 name="telemeta- dictionary-edit"),72 url(r'^admin/ dictionaries/(?P<dictionary_id>[0-9a-z]+)/add/$',73 web_view.add_to_ dictionary,74 name="telemeta- dictionary-add"),75 url(r'^admin/ dictionaries/(?P<dictionary_id>[0-9a-z]+)/update/$',76 web_view.update_ dictionary,77 name="telemeta- dictionary-update"),78 url(r'^admin/ dictionaries/(?P<dictionary_id>[0-9a-z]+)/(?P<value_id>[0-9]+)/$',79 web_view.edit_dictionary_value,80 name="telemeta-dictionary-record-edit"),81 82 url(r'^admin/ dictionaries/(?P<dictionary_id>[0-9a-z]+)/(?P<value_id>[0-9]+)/update/$',83 web_view.update_dictionary_value,84 name="telemeta-dictionary-record-update"),85 72 # enumerations administration 73 url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/$', 74 web_view.edit_enumeration , 75 name="telemeta-enumeration-edit"), 76 url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/add/$', 77 web_view.add_to_enumeration, 78 name="telemeta-enumeration-add"), 79 url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/update/$', 80 web_view.update_enumeration, 81 name="telemeta-enumeration-update"), 82 url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/' 83 + r'(?P<value_id>[0-9]+)/$', 84 web_view.edit_enumeration_value, 85 name="telemeta-enumeration-record-edit"), 86 url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/' 87 + r'(?P<value_id>[0-9]+)/update/$', 88 web_view.update_enumeration_value, 89 name="telemeta-enumeration-record-update"), 86 90 87 91 # CSS+Images (FIXME: for developement only) -
telemeta/views/web.py
r01bf9f7 r3815c51 102 102 'items': items}) 103 103 104 def __get_ dictionary_list(self):104 def __get_enumerations_list(self): 105 105 from django.db.models import get_models 106 106 models = get_models(telemeta.models) 107 107 108 dictionaries = []108 enumerations = [] 109 109 for model in models: 110 if getattr(model, "is_ dictionary", False):111 dictionaries.append({"name": model._meta.verbose_name_plural,110 if getattr(model, "is_enumeration", False): 111 enumerations.append({"name": model._meta.verbose_name_plural, 112 112 "id": model._meta.module_name}) 113 return dictionaries113 return enumerations 114 114 115 115 def __get_admin_context_vars(self): 116 return {" dictionaries": self.__get_dictionary_list()}116 return {"enumerations": self.__get_enumerations_list()} 117 117 118 118 def admin_index(self, request): 119 119 return render_to_response('admin.html', self. __get_admin_context_vars()) 120 120 121 def __get_ dictionary(self, id):121 def __get_enumeration(self, id): 122 122 from django.db.models import get_models 123 123 models = get_models(telemeta.models) … … 130 130 131 131 return model 132 133 132 134 def edit_ dictionary(self, request, dictionary_id):133 def edit_enumeration(self, request, enumeration_id): 135 134 136 dictionary = self.__get_dictionary(dictionary_id)137 if dictionary== None:135 enumeration = self.__get_enumeration(enumeration_id) 136 if enumeration == None: 138 137 raise Http404 139 138 140 139 vars = self.__get_admin_context_vars() 141 vars[" dictionary_id"] = dictionary._meta.module_name142 vars[" dictionary_name"] = dictionary._meta.verbose_name143 vars[" dictionary_name_plural"] = dictionary._meta.verbose_name_plural144 vars[" dictionary_values"] = dictionary.objects.all()145 return render_to_response(' dictionary_edit.html', vars)140 vars["enumeration_id"] = enumeration._meta.module_name 141 vars["enumeration_name"] = enumeration._meta.verbose_name 142 vars["enumeration_name_plural"] = enumeration._meta.verbose_name_plural 143 vars["enumeration_values"] = enumeration.objects.all() 144 return render_to_response('enumeration_edit.html', vars) 146 145 147 def add_to_ dictionary(self, request, dictionary_id):146 def add_to_enumeration(self, request, enumeration_id): 148 147 149 dictionary = self.__get_dictionary(dictionary_id)150 if dictionary== None:148 enumeration = self.__get_enumeration(enumeration_id) 149 if enumeration == None: 151 150 raise Http404 152 151 153 dictionary_value = dictionary(value=request.POST['value'])154 dictionary_value.save()152 enumeration_value = enumeration(value=request.POST['value']) 153 enumeration_value.save() 155 154 156 return self.edit_ dictionary(request, dictionary_id)155 return self.edit_enumeration(request, enumeration_id) 157 156 158 def update_ dictionary(self, request, dictionary_id):157 def update_enumeration(self, request, enumeration_id): 159 158 160 dictionary = self.__get_dictionary(dictionary_id)161 if dictionary== None:159 enumeration = self.__get_enumeration(enumeration_id) 160 if enumeration == None: 162 161 raise Http404 163 162 164 163 if request.POST.has_key("remove"): 165 dictionary.objects.filter(id__in=request.POST['sel']).delete()164 enumeration.objects.filter(id__in=request.POST.getlist('sel')).delete() 166 165 167 return self.edit_ dictionary(request, dictionary_id)166 return self.edit_enumeration(request, enumeration_id) 168 167 169 def edit_ dictionary_value(self, request, dictionary_id, value_id):168 def edit_enumeration_value(self, request, enumeration_id, value_id): 170 169 171 dictionary = self.__get_dictionary(dictionary_id)172 if dictionary== None:170 enumeration = self.__get_enumeration(enumeration_id) 171 if enumeration == None: 173 172 raise Http404 174 173 175 174 vars = self.__get_admin_context_vars() 176 vars[" dictionary_id"] = dictionary._meta.module_name177 vars[" dictionary_name"] = dictionary._meta.verbose_name178 vars[" dictionary_name_plural"] = dictionary._meta.verbose_name_plural179 vars[" dictionary_record"] = dictionary.objects.get(id__exact=value_id)180 return render_to_response(' dictionary_edit_value.html', vars)175 vars["enumeration_id"] = enumeration._meta.module_name 176 vars["enumeration_name"] = enumeration._meta.verbose_name 177 vars["enumeration_name_plural"] = enumeration._meta.verbose_name_plural 178 vars["enumeration_record"] = enumeration.objects.get(id__exact=value_id) 179 return render_to_response('enumeration_edit_value.html', vars) 181 180 182 def update_ dictionary_value(self, request, dictionary_id, value_id):181 def update_enumeration_value(self, request, enumeration_id, value_id): 183 182 184 183 if request.POST.has_key("save"): 185 dictionary = self.__get_dictionary(dictionary_id)186 if dictionary== None:184 enumeration = self.__get_enumeration(enumeration_id) 185 if enumeration == None: 187 186 raise Http404 188 187 189 record = dictionary.objects.get(id__exact=value_id)188 record = enumeration.objects.get(id__exact=value_id) 190 189 record.value = request.POST["value"] 191 190 record.save() 192 191 193 return self.edit_ dictionary(request, dictionary_id)192 return self.edit_enumeration(request, enumeration_id) 194 193 195 194 196 def media_item_edit(request, media_item_id):197 "Provide MediaItem object edition"198 199 media_item = MediaItem.objects.get(pk=media_item_id)200 dynprops = media_item.get_dynamic_properties()201 return render_to_response('media_item.html', {'media_item': media_item, 'dynprops' : dynprops})202 203 def media_item_update(request, media_item_id):204 "Handle MediaItem object edition form submission"205 206 media_item = MediaItem.objects.get(pk=media_item_id)207 media_item.author = request.POST['author']208 media_item.title = request.POST['title']209 media_item.save()210 211 pattern = re.compile(r'^dynprop_(\d+)$')212 for name, value in request.POST.items():213 match = pattern.search(name)214 if match:215 prop_id = match.groups()[0]216 prop = MediaItemPropertyDefinition.objects.get(pk=prop_id)217 telemeta.logger.debug("prop_id: " + prop_id + " ; " + "media_item_id: " +218 media_item_id + " ; value: " + value +219 " ; type:" + prop.type)220 media_item = MediaItem.objects.get(pk=media_item_id)221 property, created = MediaItemProperty.objects.get_or_create(222 media_item=media_item, definition=prop)223 224 if prop.type == 'text':225 property.value = value226 else:227 value = int(value)228 229 if value > 0:230 enum_item = MediaItemPropertyEnumerationItem.objects.get(pk=value)231 property.enum_item = enum_item232 else:233 property.enum_item = 0234 235 property.save()236 237 return media_item_edit(request, media_item_id)238 239 195 240 196
Note: See TracChangeset
for help on using the changeset viewer.
