From: olivier <> Date: Fri, 3 Apr 2009 18:20:35 +0000 (+0000) Subject: #67: allow element repetition in dublin core data returned by datasource X-Git-Tag: 1.1~706 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=ff2fe0d9f3cac5bb0ab9d649efca91191354f13f;p=telemeta.git #67: allow element repetition in dublin core data returned by datasource --- diff --git a/telemeta/interop/oai.py b/telemeta/interop/oai.py index 246730db..f607f0b9 100644 --- a/telemeta/interop/oai.py +++ b/telemeta/interop/oai.py @@ -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: diff --git a/telemeta/interop/oaitest.py b/telemeta/interop/oaitest.py index c390fbb0..22605c30 100644 --- a/telemeta/interop/oaitest.py +++ b/telemeta/interop/oaitest.py @@ -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))