From 8cae994bbdda71dbe88a989f7d44ccdfdebd1709 Mon Sep 17 00:00:00 2001 From: yomguy Date: Mon, 17 Oct 2011 02:59:52 -0700 Subject: [PATCH] OAI fix : better id management (database id by default), split multiple coverage, repositoryName becomes settings.TELEMETA_ORGANIZATION --- telemeta/interop/oai.py | 8 ++++++++ telemeta/models/dublincore.py | 17 ++++++++++++----- telemeta/models/location.py | 7 +++++++ telemeta/urls.py | 2 +- telemeta/web/base.py | 2 +- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/telemeta/interop/oai.py b/telemeta/interop/oai.py index 90e464e5..8d3973a6 100644 --- a/telemeta/interop/oai.py +++ b/telemeta/interop/oai.py @@ -408,6 +408,13 @@ class Response(object): container = self.root.appendChild(self.doc.createElement(self.verb)) container.appendChild(self.make_record(id, dc, ctime)) + def format_id_header(self, id): + organization = self.identity[0][1] + if 'http' in id: + return ':'.join(['oai', organization.lower(), 'items', id.split('/')[-1]]) + else: + return id + def list_records(self, from_time, until_time, token = None, ids_only = False): """Append ListIdentifiers or ListRecords result""" offset = 0 @@ -456,6 +463,7 @@ class Response(object): for item in data: dc, ctime = item id, dc = self.parse_dc(dc) + id = self.format_id_header(id) if id == None: raise Exception("DataSource.list_records() didn't provide an 'identifier' dublin core element") diff --git a/telemeta/models/dublincore.py b/telemeta/models/dublincore.py index 8ac675d1..19fea1c6 100644 --- a/telemeta/models/dublincore.py +++ b/telemeta/models/dublincore.py @@ -162,6 +162,7 @@ def express_collection(collection): parts.append(Element('relation', id, 'hasPart', item)) resource = Resource( + Element('record_identifier', collection.public_id, related=collection), Element('identifier', media_identifier(collection), related=collection), Element('type', 'Collection'), Element('title', collection.title), @@ -213,6 +214,7 @@ def express_item(item): mime_type = '' resource = Resource( + Element('record_identifier', item.public_id, related=item), Element('identifier', media_identifier(item), related=item), Element('type', 'Sound'), Element('title', title), @@ -226,7 +228,7 @@ def express_item(item): Element('publisher', settings.TELEMETA_ORGANIZATION), date, Date(item.collection.year_published, refinement='issued'), - Element.multiple('coverage', item.location and item.location.fullnames(), 'spatial'), + Element.multiple('coverage', item.location and item.location.listnames(), 'spatial'), Element('coverage', item.location_comment, 'spatial'), Element('rights', item.collection.legal_rights, 'license'), Element('rights', media_access_rights(item.collection), 'accessRights'), @@ -248,23 +250,28 @@ def express_resource(res): def lookup_resource(media_id): try: - type, code = media_id.split(':', 1) + id = media_id.split(':') + type = id[-2] + code = id[-1] except ValueError: raise MalformedMediaIdentifier("Media identifier must be in type:code format") - if (type == 'collection'): + if (type == 'collection') or (type == 'collections'): try: return MediaCollection.objects.get(code=code) except MediaCollection.DoesNotExist: return None - elif (type == 'item'): + elif (type == 'item') or (type == 'items'): try: return MediaItem.objects.get(code=code) except MediaItem.DoesNotExist: try: return MediaItem.objects.get(old_code=code) except MediaItem.DoesNotExist: - return None + try: + return MediaItem.objects.get(id=code) + except MediaItem.DoesNotExist: + return None else: raise MalformedMediaIdentifier("No such type in media identifier: " + type) diff --git a/telemeta/models/location.py b/telemeta/models/location.py index e1efbfba..d3a1741b 100644 --- a/telemeta/models/location.py +++ b/telemeta/models/location.py @@ -144,6 +144,13 @@ class Location(ModelCore): for path in self.paths(): names.append(u', '.join([unicode(l) for l in path])) return names + + def listnames(self): + names = [] + for path in self.paths(): + for l in path: + names.append(unicode(l)) + return names class LocationType(ModelCore): "Location types" diff --git a/telemeta/urls.py b/telemeta/urls.py index a93113e9..3ac754da 100644 --- a/telemeta/urls.py +++ b/telemeta/urls.py @@ -237,7 +237,7 @@ urlpatterns = patterns('', url(r'^oai/.*$', general_view.handle_oai_request, name="telemeta-oai"), # Authentication - url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'telemeta/login.html'}, + url(r'^login/$', 'ipauth.views.login', {'template_name': 'telemeta/login.html'}, name="telemeta-login"), url(r'^logout/$', general_view.logout, name="telemeta-logout"), diff --git a/telemeta/web/base.py b/telemeta/web/base.py index 4043efdd..e309eaf8 100644 --- a/telemeta/web/base.py +++ b/telemeta/web/base.py @@ -204,7 +204,7 @@ class GeneralView(object): def handle_oai_request(self, request): host = request.META['HTTP_HOST'] datasource = TelemetaOAIDataSource() - repository_name = settings.TELEMETA_DESCRIPTION + repository_name = settings.TELEMETA_ORGANIZATION url = 'http://' + host + request.path admin = settings.ADMINS[0][1] provider = oai.DataProvider(datasource, repository_name, url, admin) -- 2.39.5