Fixes to pull/push logic.
[redakcja.git] / apps / api / handlers / library_handlers.py
old mode 100644 (file)
new mode 100755 (executable)
index aef1e9c..562ed1b
@@ -9,6 +9,7 @@ __date__ = "$2009-09-25 15:49:50$"
 __doc__ = "Module documentation."
 
 from piston.handler import BaseHandler, AnonymousBaseHandler
 __doc__ = "Module documentation."
 
 from piston.handler import BaseHandler, AnonymousBaseHandler
+from django.http import HttpResponse
 
 from datetime import date
 
 
 from datetime import date
 
@@ -17,6 +18,8 @@ from django.db import IntegrityError
 
 import librarian
 import librarian.html
 
 import librarian
 import librarian.html
+import difflib
+from librarian import dcparser, parser
 
 from wlrepo import *
 from api.models import PullRequest
 
 from wlrepo import *
 from api.models import PullRequest
@@ -197,6 +200,26 @@ class BasicDocumentHandler(AnonymousBaseHandler):
 
         return result
 
 
         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
 #
 #
 # Document Meta Data
 #
@@ -305,7 +328,7 @@ class DocumentHTMLHandler(BaseHandler):
                 return error
 
             return librarian.html.transform(document.data('xml'), is_file=False, \
                 return error
 
             return librarian.html.transform(document.data('xml'), is_file=False, \
-                parse_dublincore=False, stylesheet=stylesheet,\
+                parse_dublincore=False, stylesheet='full',\
                 options={
                     "with-paths": 'boolean(1)',                    
                 })
                 options={
                     "with-paths": 'boolean(1)',                    
                 })
@@ -313,6 +336,9 @@ class DocumentHTMLHandler(BaseHandler):
         except (EntryNotFound, RevisionNotFound), e:
             return response.EntityNotFound().django_response({
                 'reason': 'not-found', 'message': e.message})
         except (EntryNotFound, RevisionNotFound), e:
             return response.EntityNotFound().django_response({
                 'reason': 'not-found', 'message': e.message})
+        except librarian.ValidationError, e:
+            return response.InternalError().django_response({
+                'reason': 'xml-non-valid', 'message': e.message })
         except librarian.ParseError, e:
             return response.InternalError().django_response({
                 'reason': 'xml-parse-error', 'message': e.message })
         except librarian.ParseError, e:
             return response.InternalError().django_response({
                 'reason': 'xml-parse-error', 'message': e.message })
@@ -362,7 +388,7 @@ class DocumentGalleryHandler(BaseHandler):
                     
                 gallery['pages'].append( quote(url.encode('utf-8')) )
 
                     
                 gallery['pages'].append( quote(url.encode('utf-8')) )
 
-#            gallery['pages'].sort()
+            gallery['pages'].sort()
             galleries.append(gallery)
 
         return galleries
             galleries.append(gallery)
 
         return galleries
@@ -486,7 +512,7 @@ class MergeHandler(BaseHandler):
                     "message": "You must first update your 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):
+            if not base_doc.would_share():
                 return response.SuccessAllOk().django_response({
                     "result": "no-op"
                 })
                 return response.SuccessAllOk().django_response({
                     "result": "no-op"
                 })