OAI catalogue, started implementation + tests
[wolnelektury.git] / apps / oai / handlers.py
diff --git a/apps/oai/handlers.py b/apps/oai/handlers.py
new file mode 100644 (file)
index 0000000..db43657
--- /dev/null
@@ -0,0 +1,58 @@
+
+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()]
+