]> git.parisson.com Git - telemeta.git/commitdiff
OAI fix : better id management (database id by default), split multiple coverage...
authoryomguy <yomguy@parisson.com>
Mon, 17 Oct 2011 09:59:52 +0000 (02:59 -0700)
committeryomguy <yomguy@parisson.com>
Mon, 17 Oct 2011 09:59:52 +0000 (02:59 -0700)
telemeta/interop/oai.py
telemeta/models/dublincore.py
telemeta/models/location.py
telemeta/urls.py
telemeta/web/base.py

index 90e464e505932ad4dab90da6e0144b3e23633ec3..8d3973a65a726ff35ec5874840ade2be4ed4ac12 100644 (file)
@@ -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")
 
index 8ac675d1e4d781c6c39079661695171402a05d51..19fea1c66839cf053f2321991c9b0aa3a50be22e 100644 (file)
@@ -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)
    
index e1efbfba413a9f380c5d6f18c788a89ed6ed32f3..d3a1741b3b0106fcfcd2926bf6349ccf85219f04 100644 (file)
@@ -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"
index a93113e92c69db645dabdff361ad6fe00f7a78a3..3ac754dae6ec6a8fa3e1d481dbb1bbf894125dbd 100644 (file)
@@ -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"),
 
index 4043efdd3d460941eea0923f0b107f218172dad1..e309eaf8a2154746997f5b24c9b95fa8f6d9490c 100644 (file)
@@ -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)