Merge branch 'master' of stigma.nowoczesnapolska.org.pl:platforma
authorzuber <marek@stepniowski.com>
Tue, 20 Oct 2009 16:08:21 +0000 (18:08 +0200)
committerzuber <marek@stepniowski.com>
Tue, 20 Oct 2009 16:08:21 +0000 (18:08 +0200)
Conflicts:
apps/api/handlers/library_handlers.py

1  2 
apps/api/handlers/library_handlers.py
apps/api/resources.py

@@@ -9,19 -9,14 +9,17 @@@ __date__ = "$2009-09-25 15:49:50$
  __doc__ = "Module documentation."
  
  from piston.handler import BaseHandler, AnonymousBaseHandler
 +from django.http import HttpResponse
  
- import re
  from datetime import date
  
  from django.core.urlresolvers import reverse
- from django.utils import simplejson as json
  from django.db import IntegrityError
  
  import librarian
  import librarian.html
 +import difflib
 +from librarian import dcparser, parser
  
  from wlrepo import *
  from api.models import PullRequest
@@@ -202,26 -197,6 +200,26 @@@ class BasicDocumentHandler(AnonymousBas
  
          return result
  
 +
 +class DiffHandler(BaseHandler):
 +    allowed_methods = ('GET',)
 +    
 +    @hglibrary
 +    def read(self, request, source_revision, target_revision, lib):
 +        '''Return diff between source_revision and target_revision)'''
 +        source_document = lib.document_for_rev(source_revision)
 +        target_document = lib.document_for_rev(target_revision)
 +        print source_document,
 +        print target_document
 +        diff = difflib.unified_diff(
 +            source_document.data('xml').splitlines(True),
 +            target_document.data('xml').splitlines(True),
 +            'source',
 +            'target')
 +        
 +        return ''.join(list(diff))
 +
 +
  #
  # Document Meta Data
  #
@@@ -392,162 -367,6 +390,6 @@@ class DocumentGalleryHandler(BaseHandle
  
          return galleries
  
- #
- # Document Text View
- #
- XINCLUDE_REGEXP = r"""<(?:\w+:)?include\s+[^>]*?href=("|')wlrepo://(?P<link>[^\1]+?)\1\s*[^>]*?>"""
- #
- #
- #
- class DocumentTextHandler(BaseHandler):
-     allowed_methods = ('GET', 'POST')
-     @validate_form(forms.TextRetrieveForm, 'GET')
-     @hglibrary
-     def read(self, request, form, docid, lib):
-         """Read document as raw text"""        
-         try:
-             revision = form.cleaned_data['revision']
-             part = form.cleaned_data['part']
-             user = form.cleaned_data['user'] or request.user.username            
-             
-             document = lib.document_for_rev(revision)
-             
-             if document.id != docid:
-                 return response.BadRequest().django_response({
-                     'reason': 'name-mismatch',
-                     'message': 'Provided revision is not valid for this document'
-                 })
-             if document.owner != user:
-                 return response.BadRequest().django_response({
-                     'reason': 'user-mismatch',
-                     'message': "Provided revision doesn't belong to user %s" % user
-                 })
-             for error in check_user(request, user):
-                 return error
-             
-             if not part:                
-                 return document.data('xml')
-             
-             xdoc = parser.WLDocument.from_string(document.data('xml'),\
-                 parse_dublincore=False)
-             ptext = xdoc.part_as_text(part)
-             if ptext is None:
-                 return response.EntityNotFound().django_response({
-                       'reason': 'no-part-in-document'                     
-                 })
-             return ptext
-         except librarian.ParseError, e:
-             return response.EntityNotFound().django_response({
-                 'reason': 'invalid-document-state',
-                 'exception': type(e),
-                 'message': e.message
-             })
-         except (EntryNotFound, RevisionNotFound), e:
-             return response.EntityNotFound().django_response({
-                 'reason': 'not-found',
-                 'exception': type(e), 'message': e.message
-             })   
-     @validate_form(forms.TextUpdateForm, 'POST')
-     @hglibrary
-     def create(self, request, form, docid, lib):
-         try:
-             revision = form.cleaned_data['revision']
-             msg = form.cleaned_data['message']
-             user = form.cleaned_data['user'] or request.user.username
-             # do not allow changing not owned documents
-             # (for now... )
-             
-             
-             if user != request.user.username:
-                 return response.AccessDenied().django_response({
-                     'reason': 'insufficient-priviliges',
-                 })
-             
-             current = lib.document(docid, user)
-             orig = lib.document_for_rev(revision)
-             if current != orig:
-                 return response.EntityConflict().django_response({
-                         "reason": "out-of-date",
-                         "provided_revision": orig.revision,
-                         "latest_revision": current.revision })
-             
-             if form.cleaned_data.has_key('contents'):
-                 data = form.cleaned_data['contents']
-             else:                               
-                 chunks = form.cleaned_data['chunks']
-                 xdoc = parser.WLDocument.from_string(current.data('xml'))
-                 errors = xdoc.merge_chunks(chunks)
-                 if len(errors):
-                     return response.EntityConflict().django_response({
-                             "reason": "invalid-chunks",
-                             "message": "Unable to merge following parts into the document: %s " % ",".join(errors)
-                     })
-                 data = xdoc.serialize()
-             # try to find any Xinclude tags
-             includes = [m.groupdict()['link'] for m in (re.finditer(\
-                 XINCLUDE_REGEXP, data, flags=re.UNICODE) or []) ]
-             log.info("INCLUDES: %s", includes)
-             # TODO: provide useful routines to make this simpler
-             def xml_update_action(lib, resolve):
-                 try:
-                     f = lib._fileopen(resolve('parts'), 'r')
-                     stored_includes = json.loads(f.read())
-                     f.close()
-                 except:
-                     stored_includes = []
-                 
-                 if stored_includes != includes:
-                     f = lib._fileopen(resolve('parts'), 'w+')
-                     f.write(json.dumps(includes))
-                     f.close()
-                     lib._fileadd(resolve('parts'))
-                     # update the parts cache
-                     PartCache.update_cache(docid, current.owner,\
-                         stored_includes, includes)
-                 # now that the parts are ok, write xml
-                 f = lib._fileopen(resolve('xml'), 'w+')
-                 f.write(data.encode('utf-8'))
-                 f.close()
-             ndoc = None
-             ndoc = current.invoke_and_commit(\
-                 xml_update_action, lambda d: (msg, user) )
-             try:
-                 # return the new revision number
-                 return response.SuccessAllOk().django_response({
-                     "document": ndoc.id,
-                     "user": user,
-                     "subview": "xml",
-                     "previous_revision": current.revision,
-                     "revision": ndoc.revision,
-                     'timestamp': ndoc.revision.timestamp,
-                     "url": reverse("doctext_view", args=[ndoc.id])
-                 })
-             except Exception, e:
-                 if ndoc: lib._rollback()
-                 raise e        
-         except RevisionNotFound, e:
-             return response.EntityNotFound(mimetype="text/plain").\
-                 django_response(e.message)
  
  
  #
@@@ -651,6 -470,11 +493,11 @@@ class MergeHandler(BaseHandler)
              # update is always performed from the file branch
              # to the user branch
              user_doc_new = base_doc.update(request.user.username)
+             if user_doc_new == user_doc:
+                 return response.SuccessAllOk().django_response({
+                     "result": "no-op"
+                 })
                  
              # shared document is the same
              doc_new = doc
              if not base_doc.up_to_date():
                  return response.BadRequest().django_response({
                      "reason": "not-fast-forward",
-                     "message": "You must first update yout branch to the latest version."
+                     "message": "You must first update your branch to the latest version."
+                 })
+             if base_doc.parentof(doc) or base_doc.has_parent_from(doc):
+                 return response.SuccessAllOk().django_response({
+                     "result": "no-op"
                  })
  
              # check for unresolved conflicts            
              if base_doc.has_conflict_marks():
-                 return response.BadRequest().django_response({
+                 return response.BadRequest().django_response({                    
                      "reason": "unresolved-conflicts",
                      "message": "There are unresolved conflicts in your file. Fix them, and try again."
                  })
          # Same goes for shared view
          
          return response.SuccessAllOk().django_response({
+             "result": "success",
              "name": user_doc_new.id,
              "user": user_doc_new.owner,
  
diff --combined apps/api/resources.py
@@@ -14,14 -14,15 +14,16 @@@ authdata = {'authentication': DjangoAut
  #
  
  import api.handlers.library_handlers as dh
+ from api.handlers.text_handler import DocumentTextHandler
  library_resource = Resource(dh.LibraryHandler, **authdata)
  document_resource = Resource(dh.DocumentHandler, **authdata)
- document_text_resource = Resource(dh.DocumentTextHandler, **authdata)
+ document_text_resource = Resource(DocumentTextHandler, **authdata)
  document_html_resource = Resource(dh.DocumentHTMLHandler, **authdata)
  # document_dc_resource = Resource(dh.DocumentDublinCoreHandler, **authdata)
  document_gallery = Resource(dh.DocumentGalleryHandler, **authdata)
  document_merge = Resource(dh.MergeHandler, **authdata)
 +diff_resource = Resource(dh.DiffHandler, **authdata)
  
  import api.handlers.manage_handlers as mh
  
@@@ -49,5 -50,4 +51,5 @@@ __all__ = 
      'scriptlets',
      'pullrequest_collection',
      'pullrequest_rsrc',
 +    'diff_resource',
  ]