1 # -*- encoding: utf-8 -*-
3 __author__= "Ćukasz Rekucki"
4 __date__ = "$2009-09-25 15:49:50$"
5 __doc__ = "Module documentation."
7 from piston.handler import BaseHandler, AnonymousBaseHandler
8 from piston.utils import rc
12 import api.forms as forms
13 from datetime import date
15 from django.core.urlresolvers import reverse
16 from wlrepo import MercurialLibrary, RevisionNotFound
18 from librarian import dcparser
21 # Document List Handlers
23 class BasicLibraryHandler(AnonymousBaseHandler):
24 allowed_methods = ('GET',)
26 def read(self, request):
27 """Return the list of documents."""
28 lib = MercurialLibrary(path=settings.REPOSITORY_PATH)
31 'url': reverse('document_view', args=[docid]),
32 'name': docid } for docid in lib.documents() ]
34 return {'documents' : document_list}
36 class LibraryHandler(BaseHandler):
37 allowed_methods = ('GET', 'POST')
38 anonymous = BasicLibraryHandler
40 def read(self, request):
41 """Return the list of documents."""
42 lib = MercurialLibrary(path=settings.REPOSITORY_PATH)
45 'url': reverse('document_view', args=[docid]),
46 'name': docid } for docid in lib.documents() ]
48 return {'documents' : document_list }
50 def create(self, request):
51 """Create a new document."""
52 lib = MercurialLibrary(path=settings.REPOSITORY_PATH)
54 form = forms.DocumentUploadForm(request.POST, request.FILES)
55 if not form.is_valid():
58 f = request.FILES['ocr']
59 data = f.read().decode('utf-8')
61 if form.cleaned_data['generate_dc']:
62 data = librarian.wrap_text(data, unicode(date.today()))
64 # TODO: what if the file exists ?
65 doc = lib.document_create(form.cleaned_data['bookname'])
66 doc.quickwrite('xml', data, '$AUTO$ XML data uploaded.',
67 user=request.user.username)
70 'url': reverse('document_view', args=[doc.id]),
72 'revision': doc.revision }
77 class BasicDocumentHandler(AnonymousBaseHandler):
78 allowed_methods = ('GET',)
80 def read(self, request, docid):
81 lib = MercurialLibrary(path=settings.REPOSITORY_PATH)
83 opts = forms.DocumentGetForm(request.GET)
84 if not opts.is_valid():
87 doc = lib.document(docid)
91 'text_url': reverse('doctext_view', args=[doc.id]),
92 'dc_url': reverse('docdc_view', docid=doc.id),
93 'latest_rev': doc.revision,
101 class DocumentHandler(BaseHandler):
102 allowed_methods = ('GET', 'PUT')
103 anonymous = BasicDocumentHandler
105 def read(self, request, docid):
106 """Read document's meta data"""
107 lib = MercurialLibrary(path=settings.REPOSITORY_PATH)
109 opts = forms.DocumentGetForm(request.GET)
110 if not opts.is_valid():
111 return rc.BAD_REQUEST
114 doc = lib.document(docid)
115 udoc = doc.take(request.user.username)
116 except RevisionNotFound:
119 # is_shared = udoc.ancestorof(doc)
120 # is_uptodate = is_shared or shared.ancestorof(document)
124 'text_url': reverse('doctext_view', args=[udoc.id]),
125 'dc_url': reverse('docdc_view', args=[udoc.id]),
126 'parts_url': reverse('docparts_view', args=[udoc.id]),
127 'latest_rev': udoc.revision,
128 'latest_shared_rev': doc.revision,
129 # 'shared': is_shared,
130 # 'up_to_date': is_uptodate,
133 #if request.GET.get('with_part', 'no') == 'yes':
134 # result['parts'] = document.parts()
141 class DocumentTextHandler(BaseHandler):
142 allowed_methods = ('GET', 'PUT')
144 def read(self, request, docid):
145 """Read document as raw text"""
146 lib = MercurialLibrary(path=settings.REPOSITORY_PATH)
148 return lib.document(docid, request.user.username).data('xml')
149 except RevisionNotFound:
152 def update(self, request, docid):
153 lib = MercurialLibrary(path=settings.REPOSITORY_PATH)
155 data = request.PUT['contents']
156 prev = request.PUT['revision']
158 if request.PUT.has_key('message'):
159 msg = u"$USER$ " + request.PUT['message']
161 msg = u"$AUTO$ XML content update."
163 current = lib.document(docid, request.user.username)
164 orig = lib.document_for_rev(prev)
167 return rc.DUPLICATE_ENTRY
169 doc.quickwrite('xml', data, msg)
172 except (RevisionNotFound, KeyError):
176 # Dublin Core handlers
178 # @requires librarian
180 class DocumentDublinCoreHandler(BaseHandler):
181 allowed_methods = ('GET', 'PUT')
183 def read(self, request, docid):
184 """Read document as raw text"""
185 lib = MercurialLibrary(path=settings.REPOSITORY_PATH)
187 doc = lib.document(docid, request.user.username).data('xml')
188 bookinfo = dcparser.BookInfo.from_string(doc.read())
190 return bookinfo.serialize()
191 except RevisionNotFound:
194 def update(self, request, docid):
195 lib = MercurialLibrary(path=settings.REPOSITORY_PATH)
197 bi_json = request.PUT['contents']
198 prev = request.PUT['revision']
199 if request.PUT.has_key('message'):
200 msg = u"$USER$ " + request.PUT['message']
202 msg = u"$AUTO$ Dublin core update."
204 current = lib.document(docid, request.user.username)
205 orig = lib.document_for_rev(prev)
208 return rc.DUPLICATE_ENTRY
210 xmldoc = parser.WLDocument.from_string(current.data('xml'))
211 document.book_info = dcparser.BookInfo.from_json(bi_json)
214 current.quickwrite('xml', document.serialize().encode('utf-8'),\
215 message=msg, user=request.user.username)
218 except (RevisionNotFound, KeyError):