X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/0e5e4a0d816add3c0c13559fbed4f79eb295baf8..f8dc1e5b5062456deab01f927e82b753202f31e3:/apps/api/handlers/library_handlers.py diff --git a/apps/api/handlers/library_handlers.py b/apps/api/handlers/library_handlers.py old mode 100644 new mode 100755 index aef1e9c1..b635d4ec --- a/apps/api/handlers/library_handlers.py +++ b/apps/api/handlers/library_handlers.py @@ -9,6 +9,7 @@ __date__ = "$2009-09-25 15:49:50$" __doc__ = "Module documentation." from piston.handler import BaseHandler, AnonymousBaseHandler +from django.http import HttpResponse from datetime import date @@ -17,6 +18,8 @@ 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 @@ -28,6 +31,10 @@ import api.response as response from api.utils import validate_form, hglibrary, natural_order from api.models import PartCache, PullRequest +from pygments import highlight +from pygments.lexers import DiffLexer +from pygments.formatters import HtmlFormatter + # import settings @@ -197,6 +204,30 @@ class BasicDocumentHandler(AnonymousBaseHandler): return result + +class DiffHandler(BaseHandler): + allowed_methods = ('GET',) + + @hglibrary + def read(self, request, docid, lib): + '''Return diff between source_revision and target_revision)''' + revision = request.GET.get('revision') + if not revision: + return '' + source_document = lib.document(docid) + target_document = lib.document_for_revision(revision) + print source_document, target_document + + diff = difflib.unified_diff( + source_document.data('xml').splitlines(True), + target_document.data('xml').splitlines(True), + 'source', + 'target') + + s = ''.join(list(diff)) + return highlight(s, DiffLexer(), HtmlFormatter(cssclass="pastie")) + + # # Document Meta Data # @@ -208,7 +239,7 @@ class DocumentHandler(BaseHandler): @hglibrary def read(self, request, form, docid, lib): """Read document's meta data""" - log.info(u"User '%s' wants to %s(%s) as %s" % \ + log.info(u"User '%s' wants to edit %s(%s) as %s" % \ (request.user.username, docid, form.cleaned_data['revision'], form.cleaned_data['user']) ) user = form.cleaned_data['user'] or request.user.username @@ -238,7 +269,7 @@ class DocumentHandler(BaseHandler): elif is_prq(user): prq = prq_for_user(user) # commiter's document - prq_doc = lib.document_for_rev(prq.source_revision) + prq_doc = lib.document_for_revision(prq.source_revision) doc = prq_doc.take(user) else: return response.EntityNotFound().django_response({ @@ -287,7 +318,7 @@ class DocumentHTMLHandler(BaseHandler): try: revision = form.cleaned_data['revision'] user = form.cleaned_data['user'] or request.user.username - document = lib.document_for_rev(revision) + document = lib.document_for_revision(revision) if document.id != docid: return response.BadRequest().django_response({ @@ -305,7 +336,7 @@ class DocumentHTMLHandler(BaseHandler): 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)', }) @@ -313,9 +344,12 @@ class DocumentHTMLHandler(BaseHandler): 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 or u''}) except librarian.ParseError, e: return response.InternalError().django_response({ - 'reason': 'xml-parse-error', 'message': e.message }) + 'reason': 'xml-parse-error', 'message': e.message or u'' }) # # Image Gallery @@ -362,7 +396,7 @@ class DocumentGalleryHandler(BaseHandler): gallery['pages'].append( quote(url.encode('utf-8')) ) -# gallery['pages'].sort() + gallery['pages'].sort() galleries.append(gallery) return galleries @@ -386,7 +420,7 @@ class DocumentGalleryHandler(BaseHandler): # if revision == 'latest': # doc = lib.document(docid) # else: -# doc = lib.document_for_rev(revision) +# doc = lib.document_for_revision(revision) # # # if document.id != docid: @@ -411,7 +445,7 @@ class DocumentGalleryHandler(BaseHandler): # msg = u"$AUTO$ Dublin core update." # # current = lib.document(docid, request.user.username) -# orig = lib.document_for_rev(revision) +# orig = lib.document_for_revision(revision) # # if current != orig: # return response.EntityConflict().django_response({ @@ -456,7 +490,7 @@ class MergeHandler(BaseHandler): doc = lib.document(docid) # fetch the base document - user_doc = lib.document_for_rev(revision) + user_doc = lib.document_for_revision(revision) base_doc = user_doc.latest() if base_doc != user_doc: @@ -486,9 +520,11 @@ class MergeHandler(BaseHandler): "message": "You must first update your branch to the latest version." }) - if base_doc.parentof(doc) or base_doc.has_parent_from(doc): + anwser, info = base_doc.would_share() + + if not anwser: return response.SuccessAllOk().django_response({ - "result": "no-op" + "result": "no-op", "message": info }) # check for unresolved conflicts