+
+from oaipmh import server, common
+from catalogue.models import Book, Tag
+from api.models import Deleted
+from librarian.dcparser import BookInfo
+from django.contrib.contenttypes.models import ContentType
+
+
+class Catalogue(common.ResumptionOAIPMH):
+ def __init__(self):
+ super(Catalogue, self).__init__()
+
+ def metadata(self, book):
+ bi = BookInfo.from_file(book.xml_file)
+ meta = {}
+ for field in bi.FIELDS:
+ dc_field = field.uri.split('}')[1]
+ value = getattr(bi, dc_field.name)
+ if isinstance(value,list):
+ value = ';'.join(map(unicode, value))
+ else:
+ value = unicode(value)
+ meta["dc:"+dc_field] = value
+ return meta
+
+ def record_for_book(self, book):
+ header = common.Header(book.slug, book.changed_at, [], False)
+ meta = common.Metadata(self.metadata(book))
+ about = None
+ return header, meta, about
+
+ def getRecord(self, record, **kw):
+ """
+Returns (header, metadata, about) for given record.
+ """
+ slug = kw['record']
+ try:
+ book = Book.objects.get(slug=slug)
+ return self.record_for_book(book)
+ except Book.DoesNotExist, e:
+ book_type = ContentType.objects.get_for_model(Book)
+ deleted_book = Deleted.objects.filter(content_type=book_type,
+ slug=slug)
+ header = common.Header(deleted_book.slug,
+ deleted_book.deleted_at,
+ [], True)
+ meta = common.Metadata({})
+ return header, meta, None # None for about.
+
+
+
+ def listRecords(self, **kw):
+ """
+can get a resumptionToken kw.
+returns result, token
+ """
+ return [self.record_for_book(book) for book in Book.objects.all()]
+