]> git.parisson.com Git - telemeta.git/commitdiff
#67: allow element repetition in dublin core data returned by datasource
authorolivier <>
Fri, 3 Apr 2009 18:20:35 +0000 (18:20 +0000)
committerolivier <>
Fri, 3 Apr 2009 18:20:35 +0000 (18:20 +0000)
telemeta/interop/oai.py
telemeta/interop/oaitest.py

index 246730db2a184be8a4fb118d4a5f3f6d62d3969b..f607f0b985bc972d4edac3bf6f4de0da446c79dd 100644 (file)
@@ -49,7 +49,11 @@ class IDataSource(object):
         pass
 
     def get_record(self, id):
-        """Must return a tuple of the form (dublin core dict, change time)
+        """Must return a tuple of the form:
+              (
+                [(dublin core element, element value), ...],
+                change time
+              )
            or None if the record doesn't exist.
            
            The dublin core data must contain an 'identifier' element, which is the same
@@ -63,8 +67,8 @@ class IDataSource(object):
     def list_records(self, offset, limit, from_time = None, until_time = None):
         """Must return the list of records between (optional) from and 
            until change time, starting from record at offset, with a maximum of limit
-           entries. Each entry of the list must be a tuple of the form:
-           (dublin core dict, change time)
+           entries. Each entry of the list must be a tuple of the same form as returned
+           by getRecord().
 
            If no record matches, should return an empty list. The dublin core data must
            contain an 'identifier' element, which can be used as a parameter to get_record()."""
@@ -362,6 +366,26 @@ class Response(object):
         self.append_elements(container, dc, prefix='dc')
         return record
 
+    def parse_dc(self, data):
+        valid = ['title', 'creator', 'subject', 'description', 'publisher', 'contributor',
+                 'date', 'type', 'format', 'identifier', 'source', 'language', 'relation',
+                 'coverage', 'rights']
+
+        print data
+        parsed = []
+        id = None
+        for k, v in data:
+            try:
+                valid.index(k)
+                parsed.append((k, v))
+                if k == 'identifier':
+                    id = v
+            except ValueError:
+                pass
+
+        return id, parsed                
+            
+
     def get_record(self, id):
         """Append GetRecord result"""
         record = self.datasource.get_record(id)
@@ -369,9 +393,10 @@ class Response(object):
             self.error('idDoesNotExist')
         else:
             dc, ctime = record
-            if not dc.get('identifier'):
+            dc_id, dc = self.parse_dc(dc)
+            if dc_id == None:
                 raise Exception("DataSource.get_record() didn't provide an 'identifier' dublin core element")
-            elif dc["identifier"] != id:
+            elif dc_id != id:
                 raise Exception("DataSource.get_record() returned an 'identifier' dublin core element "
                                 "which is different from the requested identifier")
                 
@@ -426,10 +451,10 @@ class Response(object):
             container = self.root.appendChild(self.doc.createElement(self.verb))
             for item in data:
                 dc, ctime = item
-                if not dc.get('identifier'):
+                id, dc = self.parse_dc(dc)
+                if id == None:
                     raise Exception("DataSource.list_records() didn't provide an 'identifier' dublin core element")
 
-                id = dc['identifier']    
                 if ids_only:
                     container.appendChild(self.make_record_header(id, ctime))
                 else:
index c390fbb0a2e0b52ec734cd2b0c0567228fcb1209..22605c3055911d8882e331314784b82528f8ce5b 100644 (file)
@@ -10,9 +10,9 @@ class DataSource(object):
         self.oldest = datetime(1988, 1, 1)
 
         self.data = {
-            '10': ({'title': 'Roger Rabbit', 'creator': 'Bugs Bunny'}, self.oldest),
-            '20': ({'title': 'Pulp Fiction', 'creator': 'Quentin Tarantino'}, datetime(1994, 10, 14)),
-            '30': ({'title': 'Children of Men', 'creator': u'Alfonso Cuarón'}, datetime(2006, 10, 18))
+            '10': ([('title', 'Roger Rabbit'), ('title', 'Roger Le Lapin'), ('creator', 'Bugs Bunny')], self.oldest),
+            '20': ([('title', 'Pulp Fiction'), ('creator', 'Quentin Tarantino')], datetime(1994, 10, 14)),
+            '30': ([('title', 'Children of Men'), ('creator', u'Alfonso Cuarón')], datetime(2006, 10, 18))
         }
 
 
@@ -22,7 +22,10 @@ class DataSource(object):
     def get_record(self, id):
         record = self.data.get(id)
         if record:
-            record[0]['identifier'] = id
+            dc = []
+            dc[:] = record[0][:]
+            dc.insert(0, ('identifier', id))
+            record = (dc, record[1])
         return record
 
     def count_records(self, from_time = None, until_time = None):        
@@ -39,8 +42,10 @@ class DataSource(object):
         i = 0
         n = 0
         for k in self.data:
-            dc, ctime = self.data[k]
-            dc['identifier'] = k
+            dc = []
+            _dc, ctime = self.data[k]
+            dc[:] = _dc[:]
+            dc.insert(0, ('identifier', k))
             if ((not from_time) or ctime >= from_time) and ((not until_time) or ctime <= until_time):
                 if (i >= offset) and (n < limit):
                     result.append((dc, ctime))