From: gfawcett Date: Thu, 19 Mar 2009 02:56:07 +0000 (+0000) Subject: Add/edit extended metadata on all item forms. X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=445b60fd77d9d28ccbe6e55ce6cfe4231bc59ed4;p=Syrup.git Add/edit extended metadata on all item forms. God forgive me for the ugliness I push into views.py with this commit. I'll clean it up once the dust settles, honest. git-svn-id: svn://svn.open-ils.org/ILS-Contrib/servres/trunk@200 6d9bc8c9-1ec2-4278-b937-99fde70a366f --- diff --git a/conifer/syrup/models.py b/conifer/syrup/models.py index 3f0b379..1f8e199 100644 --- a/conifer/syrup/models.py +++ b/conifer/syrup/models.py @@ -446,32 +446,34 @@ class Item(m.Model): metadata_attributes = { - 'dc:contributor': 'Contributor', - 'dc:coverage': 'Coverage', - 'dc:creator': 'Creator', - 'dc:date': 'Date', - 'dc:description': 'Description', - 'dc:format': 'Format', - 'dc:identifier': 'Identifier', - 'dc:language': 'Language', - 'dc:publisher': 'Publisher', - 'dc:relation': 'Relation', - 'dc:rights': 'Rights', - 'dc:source': 'Source', - 'dc:subject': 'Subject', - 'dc:title': 'Title', - 'dc:type': 'Type', - 'syrup:barcode': 'Barcode', - 'syrup:enumeration': 'Enumeration', - 'syrup:chronology': 'Chronology'} - - + 'dc:contributor': _('Contributor'), + 'dc:coverage': _('Coverage'), + 'dc:creator': _('Creator'), + 'dc:date': _('Date'), + 'dc:description': _('Description'), + 'dc:format': _('Format'), + 'dc:identifier': _('Identifier'), + 'dc:language': _('Language'), + 'dc:publisher': _('Publisher'), + 'dc:relation': _('Relation'), + 'dc:rights': _('Rights'), + 'dc:source': _('Source'), + 'dc:subject': _('Subject'), + 'dc:title': _('Title'), + 'dc:type': _('Type'), + 'syrup:barcode': _('Barcode'), + 'syrup:enumeration': _('Enumeration'), + 'syrup:chronology': _('Chronology')} + + +metadata_attribute_choices = metadata_attributes.items() +metadata_attribute_choices.sort(key=lambda (a,b): b) class Metadata(m.Model): """Metadata for items.""" item = m.ForeignKey(Item) #fixme, arbitrary sizes. - name = m.CharField(max_length=128, choices=metadata_attributes.items()) + name = m.CharField('Attribute', max_length=128, choices=metadata_attribute_choices) value = m.CharField(max_length=4096) #------------------------------------------------------------ diff --git a/conifer/syrup/views.py b/conifer/syrup/views.py index c6a43fc..df9e3ce 100644 --- a/conifer/syrup/views.py +++ b/conifer/syrup/views.py @@ -33,6 +33,7 @@ import conifer.genshi_support as g import django.forms import re import sys +from django.forms.models import modelformset_factory #----------------------------------------------------------------------------- # Z39.50 Support @@ -595,11 +596,20 @@ def item_add(request, course_id, item_id): if request.method != 'POST': item = models.Item() # dummy object + metadata_formset = metadata_formset_class(queryset=item.metadata_set.all()) return g.render('item_add_%s.xhtml' % item_type.lower(), **locals()) else: # fixme, this will need refactoring. But not yet. author = request.user.get_full_name() or request.user.username + item = models.Item() # dummy object + metadata_formset = metadata_formset_class(request.POST, queryset=item.metadata_set.all()) + assert metadata_formset.is_valid() + def do_metadata(item): + for obj in [obj for obj in metadata_formset.cleaned_data if obj]: # ignore empty dicts + if not obj.get('DELETE'): + item.metadata_set.create(name=obj['name'], value=obj['value']) + if item_type == 'HEADING': title = request.POST.get('title', '').strip() if not title: @@ -613,6 +623,8 @@ def item_add(request, course_id, item_id): title=title, ) item.save() + do_metadata(item) + item.save() elif item_type == 'URL': title = request.POST.get('title', '').strip() url = request.POST.get('url', '').strip() @@ -627,6 +639,8 @@ def item_add(request, course_id, item_id): title=title, url = url) item.save() + do_metadata(item) + item.save() elif item_type == 'ELEC': title = request.POST.get('title', '').strip() upload = request.FILES.get('file') @@ -642,6 +656,8 @@ def item_add(request, course_id, item_id): ) item.fileobj.save(upload.name, upload) item.save() + do_metadata(item) + item.save() else: raise NotImplementedError @@ -650,6 +666,11 @@ def item_add(request, course_id, item_id): else: return HttpResponseRedirect(course.course_url()) +metadata_formset_class = modelformset_factory(models.Metadata, + fields=['name','value'], + extra=3, can_delete=True) + + @instructors_only def item_edit(request, course_id, item_id): course = get_object_or_404(models.Course, pk=course_id) @@ -657,9 +678,13 @@ def item_edit(request, course_id, item_id): item_type = item.item_type template = 'item_add_%s.xhtml' % item_type.lower() parent_item = item.parent_heading + if request.method != 'POST': + metadata_formset = metadata_formset_class(queryset=item.metadata_set.all()) return g.render(template, **locals()) else: + metadata_formset = metadata_formset_class(request.POST, queryset=item.metadata_set.all()) + assert metadata_formset.is_valid() if 'file' in request.FILES: # this is a 'replace-current-file' action. upload = request.FILES.get('file') @@ -668,6 +693,12 @@ def item_edit(request, course_id, item_id): else: # generally update the item. [setattr(item, k, v) for (k,v) in request.POST.items()] + # generally update the metadata + item.metadata_set.all().delete() + for obj in [obj for obj in metadata_formset.cleaned_data if obj]: # ignore empty dicts + if not obj.get('DELETE'): + item.metadata_set.create(name=obj['name'], value=obj['value']) + item.save() return HttpResponseRedirect(item.parent_url()) diff --git a/conifer/templates/components/course.xhtml b/conifer/templates/components/course.xhtml index 611f846..8da8c61 100644 --- a/conifer/templates/components/course.xhtml +++ b/conifer/templates/components/course.xhtml @@ -61,5 +61,26 @@ searchtext = _('search this course...')
  • Physical Book/Document
  • - + +
    + +
    + +
    +

    Show more attributes

    +
    + ${Markup(metadata_formset.management_form)} + + + + +
    ${Markup(thing.as_p())}
    +
    +
    diff --git a/conifer/templates/item_add_elec.xhtml b/conifer/templates/item_add_elec.xhtml index 3f874fc..0259d0f 100644 --- a/conifer/templates/item_add_elec.xhtml +++ b/conifer/templates/item_add_elec.xhtml @@ -13,6 +13,7 @@ course_title = '%s: %s (%s)' % (course.code, course.title, course.term) + ${item_metadata_formset_header()} ${course_banner(course)} @@ -27,6 +28,7 @@ course_title = '%s: %s (%s)' % (course.code, course.title, course.term) value="${item.title}"/> File + ${item_metadata_formset()}

    diff --git a/conifer/templates/item_add_heading.xhtml b/conifer/templates/item_add_heading.xhtml index 2ede6a1..0fb19a6 100644 --- a/conifer/templates/item_add_heading.xhtml +++ b/conifer/templates/item_add_heading.xhtml @@ -13,6 +13,7 @@ course_title = '%s: %s (%s)' % (course.code, course.title, course.term) + ${item_metadata_formset_header()} ${course_banner(course)} @@ -25,6 +26,7 @@ course_title = '%s: %s (%s)' % (course.code, course.title, course.term) value="${item.title}"/> + ${item_metadata_formset()}

    diff --git a/conifer/templates/item_add_url.xhtml b/conifer/templates/item_add_url.xhtml index 2f78f04..bf20a62 100644 --- a/conifer/templates/item_add_url.xhtml +++ b/conifer/templates/item_add_url.xhtml @@ -13,6 +13,7 @@ course_title = '%s: %s (%s)' % (course.code, course.title, course.term) + ${item_metadata_formset_header()} ${course_banner(course)} @@ -23,6 +24,7 @@ course_title = '%s: %s (%s)' % (course.code, course.title, course.term) Title URL + ${item_metadata_formset()}