"""Metadata handling commonalities""" from urllib import unquote_plus from django.shortcuts import get_object_or_404 from django.core.exceptions import ObjectDoesNotExist from django.utils.translation import ugettext_lazy as _ from documents.models import DocumentMetadata, MetadataType def decode_metadata_from_url(url_dict): """Parse a URL query string to a list of metadata""" metadata_dict = { 'id': {}, 'value': {} } metadata_list = [] #Match out of order metadata_type ids with metadata values from request for key, value in url_dict.items(): if 'metadata' in key: index, element = key[8:].split('_') metadata_dict[element][index] = value #Convert the nested dictionary into a list of id+values dictionaries for order, identifier in metadata_dict['id'].items(): if order in metadata_dict['value'].keys(): metadata_list.append({ 'id': identifier, 'value': metadata_dict['value'][order] }) return metadata_list def save_metadata_list(metadata_list, document): """ Take a list of metadata values and associate a document to it """ for item in metadata_list: save_metadata(item, document) #if item['value']: # save_metadata(item, document) #else: # #If there is no metadata value, delete the metadata entry # #completely from the document # try: # metadata_type = MetadataType.objects.get(id=item['id']) # document_metadata = DocumentMetadata.objects.get( # document=document, # metadata_type=metadata_type # ) # document_metadata.delete() # except ObjectDoesNotExist: # pass def save_metadata(metadata_dict, document): """save metadata_dict""" # Use matched metadata now to create document metadata document_metadata, created = DocumentMetadata.objects.get_or_create( document=document, metadata_type=get_object_or_404( MetadataType, pk=metadata_dict['id'] ), ) # Handle 'plus sign as space' in the url # unquote_plus handles utf-8?!? # http://stackoverflow.com/questions/4382875/handling-iri-in-django #.decode('utf-8') document_metadata.value = unquote_plus(metadata_dict['value']) document_metadata.save() def metadata_repr(metadata_list): """Return a printable representation of a metadata list""" return u', '.join(metadata_repr_as_list(metadata_list)) def metadata_repr_as_list(metadata_list): """ Turn a list of metadata into a list of printable representations """ output = [] for metadata_dict in metadata_list: try: output.append(u'%s - %s' % (MetadataType.objects.get( pk=metadata_dict['id']), metadata_dict.get('value', ''))) except: pass return output