From: zuber Date: Mon, 19 Oct 2009 10:19:45 +0000 (+0200) Subject: Merge branch 'master' of stigma.nowoczesnapolska.org.pl:platforma X-Git-Url: https://git.mdrn.pl/redakcja.git/commitdiff_plain/bc6587a11ccc72c7f4bf525f9b37fedc15f8bfa5?hp=e024b596f2a1b5346fd22837aec0116c05f17ed9 Merge branch 'master' of stigma.nowoczesnapolska.org.pl:platforma --- diff --git a/apps/api/admin.py b/apps/api/admin.py new file mode 100644 index 00000000..efa64f3a --- /dev/null +++ b/apps/api/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin + +import api.models + +admin.site.register(api.models.PullRequest) +admin.site.register(api.models.PartCache) diff --git a/apps/api/handlers/library_handlers.py b/apps/api/handlers/library_handlers.py index f7d57849..06358618 100644 --- a/apps/api/handlers/library_handlers.py +++ b/apps/api/handlers/library_handlers.py @@ -29,7 +29,7 @@ from explorer.models import GalleryForDocument import api.forms as forms import api.response as response from api.utils import validate_form, hglibrary, natural_order -from api.models import PartCache +from api.models import PartCache, PullRequest # import settings @@ -38,18 +38,24 @@ import settings def is_prq(username): return username.startswith('$prq-') +def prq_for_user(username): + try: + return PullRequest.objects.get(id=int(username[5:])) + except: + return None + def check_user(request, user): log.info("user: %r, perm: %r" % (request.user, request.user.get_all_permissions()) ) #pull request if is_prq(user): - if not request.user.has_perm('api.pullrequest.can_view'): + if not request.user.has_perm('api.view_prq'): yield response.AccessDenied().django_response({ 'reason': 'access-denied', 'message': "You don't have enough priviliges to view pull requests." }) # other users elif request.user.username != user: - if not request.user.has_perm('api.document.can_view_other'): + if not request.user.has_perm('api.view_other_document'): yield response.AccessDenied().django_response({ 'reason': 'access-denied', 'message': "You don't have enough priviliges to view other people's document." @@ -140,7 +146,6 @@ class LibraryHandler(BaseHandler): log.info("DOCID %s", docid) doc = lib.document_create(docid) # document created, but no content yet - try: doc = doc.quickwrite('xml', data.encode('utf-8'), '$AUTO$ XML data uploaded.', user=request.user.username) @@ -229,28 +234,28 @@ class DocumentHandler(BaseHandler): # the user doesn't have this document checked out # or some other weird error occured # try to do the checkout - if is_prq(user) or (user == request.user.username): - try: + try: + if user == request.user.username: mdoc = lib.document(docid) doc = mdoc.take(user) - - if is_prq(user): - # source revision, should probably change - # but there are no changes yet, so... - pass - - except RevisionNotFound, e: + elif is_prq(user): + prq = prq_for_user(user) + # commiter's document + prq_doc = lib.document_for_rev(prq.source_revision) + doc = prq_doc.take(user) + else: return response.EntityNotFound().django_response({ 'reason': 'document-not-found', 'message': e.message, - 'docid': docid + 'docid': docid, + 'user': user, }) - else: + except RevisionNotFound, e: return response.EntityNotFound().django_response({ 'reason': 'document-not-found', 'message': e.message, 'docid': docid, - 'user': user, + 'user': user }) return { @@ -337,7 +342,7 @@ class DocumentGalleryHandler(BaseHandler): gallery = {'name': assoc.name, 'pages': []} - for file in sorted(os.listdir(dirpath)): + for file in os.listdir(dirpath): if not isinstance(file, unicode): try: file = file.decode('utf-8') @@ -363,7 +368,7 @@ class DocumentGalleryHandler(BaseHandler): # gallery['pages'].sort() galleries.append(gallery) - return galleries + return galleries # # Document Text View @@ -623,13 +628,7 @@ class MergeHandler(BaseHandler): if form.cleaned_data['type'] == 'update': # update is always performed from the file branch # to the user branch - changed, clean = base_doc.update(request.user.username) - - # update user document - if changed: - user_doc_new = user_doc.latest() - else: - user_doc_new = user_doc + user_doc_new = base_doc.update(request.user.username) # shared document is the same doc_new = doc @@ -648,7 +647,7 @@ class MergeHandler(BaseHandler): "message": "There are unresolved conflicts in your file. Fix them, and try again." }) - if not request.user.has_perm('api.document.can_share'): + if not request.user.has_perm('api.share_document'): # User is not permitted to make a merge, right away # So we instead create a pull request in the database try: @@ -699,8 +698,8 @@ class MergeHandler(BaseHandler): "revision": user_doc_new.revision, 'timestamp': user_doc_new.revision.timestamp, - "parent_revision": user_doc_new.revision, - "parent_timestamp": user_doc_new.revision.timestamp, + "parent_revision": user_doc.revision, + "parent_timestamp": user_doc.revision.timestamp, "shared_revision": doc_new.revision, "shared_timestamp": doc_new.revision.timestamp, diff --git a/apps/api/handlers/manage_handlers.py b/apps/api/handlers/manage_handlers.py index 5905724f..b94ca729 100644 --- a/apps/api/handlers/manage_handlers.py +++ b/apps/api/handlers/manage_handlers.py @@ -8,17 +8,18 @@ __date__ = "$2009-09-25 15:49:50$" __doc__ = "Module documentation." from piston.handler import BaseHandler +from wlrepo import UpdateException from api.utils import hglibrary from api.models import PullRequest from api.response import * -from datetime import datetime +import datetime class PullRequestListHandler(BaseHandler): allowed_methods = ('GET',) def read(self, request): - if request.user.has_perm('api.pullrequest.can_change'): + if request.user.has_perm('change_pullrequest'): return PullRequest.objects.all() else: return PullRequest.objects.filter(commiter=request.user) @@ -33,7 +34,7 @@ class PullRequestHandler(BaseHandler): def update(self, request, prq_id): """Change the status of request""" - if not request.user.has_perm('api.pullrequest.can_change'): + if not request.user.has_perm('change_pullrequest'): return AccessDenied().django_response("Insufficient priviliges") prq = PullRequest.objects.get(id=prq_id) @@ -59,7 +60,7 @@ class PullRequestHandler(BaseHandler): 'message': "This pull request is alredy resolved. Can't accept." }) - src_doc = lib.document( prq.source_revision ) + src_doc = lib.document_for_rev( prq.source_revision ) lock = lib.lock() try: @@ -69,30 +70,28 @@ class PullRequestHandler(BaseHandler): # # Q: where to put the updated revision ? # A: create a special user branch named prq-#prqid - prq_doc = src_doc.take("$prq-%d" % prd.id) + prq_doc = src_doc.take("$prq-%d" % prq.id) # This could be not the first time we try this, # so the prq_doc could already be there # and up to date - success, changed = prq_doc.update(user.username) - prq.status = 'E' - - if not success: - prq.save() + try: + prq_doc = prq_doc.update(user.username) + prq.source_revision = str(prq_doc.revision) + src_doc = prq_doc + except UpdateException, e: # this can happen only if the merge program # is misconfigured - try returning an entity conflict # TODO: put some useful infor here - return EntityConflict().django_response() - - if changed: - prq_doc = prq_doc.latest() - - prq.source_revision = str(prq_doc.revision) - src_doc = prq_doc + prq.status = 'E' + prq.save() + return EntityConflict().django_response({ + 'reason': 'update-failed', + 'message': e.message }) # check if there are conflicts - if prq_doc.has_conflict_marks(): + if src_doc.has_conflict_marks(): prq.status = 'E' prq.save() # Now, the user must resolve the conflict @@ -111,7 +110,7 @@ class PullRequestHandler(BaseHandler): # sync state with repository prq.status = 'A' prq.merged_revision = str(src_doc.shared().revision) - prq.merged_timestamp = datetime() + prq.merged_timestamp = datetime.now() prq.save() return SuccessAllOk().django_response({ diff --git a/apps/api/models.py b/apps/api/models.py index 90f962e0..82525898 100644 --- a/apps/api/models.py +++ b/apps/api/models.py @@ -59,7 +59,7 @@ class PullRequest(models.Model): class Meta: permissions = ( - ("pullrequest.can_view", "Can view pull request's contents."), + ("view_prq", "Can view pull request's contents."), ) @@ -68,6 +68,6 @@ class PullRequest(models.Model): class Document(models.Model): class Meta: permissions = ( - ("document.can_share", "Can share documents without pull requests."), - ("document.can_view_other", "Can view other's documents."), + ("share_document", "Can share documents without pull requests."), + ("view_other_document", "Can view other's documents."), ) \ No newline at end of file diff --git a/lib/wlrepo/__init__.py b/lib/wlrepo/__init__.py index 9de75a02..0f373d40 100644 --- a/lib/wlrepo/__init__.py +++ b/lib/wlrepo/__init__.py @@ -105,6 +105,9 @@ class LibraryException(Exception): Exception.__init__(self, msg) self.cause = cause +class UpdateException(LibraryException): + pass + class RevisionNotFound(LibraryException): def __init__(self, rev): LibraryException.__init__(self, "Revision %r not found." % rev) diff --git a/lib/wlrepo/mercurial_backend/__init__.py b/lib/wlrepo/mercurial_backend/__init__.py index 536d08ce..22a9d520 100644 --- a/lib/wlrepo/mercurial_backend/__init__.py +++ b/lib/wlrepo/mercurial_backend/__init__.py @@ -89,9 +89,9 @@ class MercurialRevision(wlrepo.Revision): status = self._library._merge(other._changectx.node()) if status.isclean(): self._library._commit(user=user, message=message) - return (True, True) + return True else: - return (False, False) + return False finally: lock.release() diff --git a/lib/wlrepo/mercurial_backend/document.py b/lib/wlrepo/mercurial_backend/document.py index 0883d99b..3911d042 100644 --- a/lib/wlrepo/mercurial_backend/document.py +++ b/lib/wlrepo/mercurial_backend/document.py @@ -116,23 +116,24 @@ class MercurialDocument(wlrepo.Document): try: if self.ismain(): # main revision of the document - return (True, False) + return self - if self._revision.has_children(): - log.info('Update failed: has children.') - # can't update non-latest revision - return (False, False) + if self._revision.has_children(): + raise UpdateException("Revision has children.") sv = self.shared() if self.parentof(sv): - return (True, False) + return self if sv.ancestorof(self): - return (True, False) + return self - return self._revision.merge_with(sv._revision, user=user, - message="$AUTO$ Personal branch update.") + if self._revision.merge_with(sv._revision, user=user,\ + message="$AUTO$ Personal branch update."): + return self.latest() + else: + raise UpdateException("Merge failed.") finally: lock.release() diff --git a/platforma/locale/pl/LC_MESSAGES/django.mo b/platforma/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 00000000..a0cefb7b Binary files /dev/null and b/platforma/locale/pl/LC_MESSAGES/django.mo differ diff --git a/platforma/locale/pl/LC_MESSAGES/django.po b/platforma/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 00000000..52d7a6d2 --- /dev/null +++ b/platforma/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,69 @@ +# Polskie tłumaczenie dla platformy wolnych lektur. +# Copyright (C) 2009 +# This file is distributed under the same license as the 'platforma' package. +# lrekucki@gmail.com, 2009. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-16 10:52+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: templates/explorer/editor.html:53 +msgid "Refresh panel" +msgstr "Odśwież panel" + +#: templates/explorer/editor.html:67 +msgid "Print version" +msgstr "Wersja do druku" + +#: templates/explorer/editor.html:96 +msgid "Next page" +msgstr "Następna strona" + +#: templates/explorer/editor.html:100 +msgid "Zoom in" +msgstr "Powiększ" + +#: templates/explorer/editor.html:103 +msgid "Zoom out" +msgstr "Zmniejsz" + +#: templates/explorer/editor.html:106 +msgid "Reset zoom" +msgstr "Oryginalny rozmiar" + +#: templates/explorer/editor.html:155 +msgid "History" +msgstr "Historia" + +#: templates/explorer/editor.html:156 +msgid "Push" +msgstr "Zatwierdź" + +#: templates/explorer/editor.html:157 +msgid "Pull" +msgstr "Uaktualnij" + +#: templates/explorer/editor.html:158 +msgid "Save" +msgstr "Zapisz" + +#: templates/explorer/editor.html:159 +msgid "Quick save" +msgstr "Szybki zapis" + +#: templates/registration/head_login.html:5 +msgid "Log Out" +msgstr "Wyloguj" + +#: templates/registration/head_login.html:9 +msgid "Log In" +msgstr "Logowanie" diff --git a/platforma/static/js/models.js b/platforma/static/js/models.js index fe42e895..c57f4f0f 100644 --- a/platforma/static/js/models.js +++ b/platforma/static/js/models.js @@ -347,7 +347,7 @@ Editor.ImageGalleryModel = Editor.Model.extend({ data: [], state: 'empty', - init: function(serverURL) { + init: function(document, serverURL) { this._super(); this.set('state', 'empty'); this.serverURL = serverURL; @@ -357,16 +357,22 @@ Editor.ImageGalleryModel = Editor.Model.extend({ load: function(force) { if (force || this.get('state') == 'empty') { + console.log("setting state"); this.set('state', 'loading'); + console.log("going ajax"); $.ajax({ url: this.serverURL, dataType: 'json', - success: this.loadingSucceeded.bind(this) + success: this.loadingSucceeded.bind(this), + error: this.loadingFailed.bind(this) }); } }, - loadingSucceeded: function(data) { + loadingSucceeded: function(data) + { + console.log("success"); + if (this.get('state') != 'loading') { alert('erroneous state:', this.get('state')); } @@ -382,6 +388,16 @@ Editor.ImageGalleryModel = Editor.Model.extend({ this.set('state', 'synced'); }, + loadingFailed: function(data) { + console.log("failed"); + + if (this.get('state') != 'loading') { + alert('erroneous state:', this.get('state')); + } + + this.set('state', 'error'); + }, + set: function(property, value) { if (property == 'state') { console.log(this.description(), ':', property, '=', value); diff --git a/platforma/static/js/views/gallery.js b/platforma/static/js/views/gallery.js index 74493444..176b0abb 100644 --- a/platforma/static/js/views/gallery.js +++ b/platforma/static/js/views/gallery.js @@ -13,7 +13,7 @@ var ImageGalleryView = View.extend({ this._super(element, model, template); this.parent = parent; - console.log("galley model", this.model); + console.log("gallery model", this.model); this.model .addObserver(this, 'data', this.modelDataChanged.bind(this)) @@ -85,9 +85,9 @@ var ImageGalleryView = View.extend({ modelStateChanged: function(property, value) { if (value == 'loading') { - this.parent.freeze('Ładowanie...'); + // this.freeze('Ładowanie...'); } else { - this.parent.unfreeze(); + this.unfreeze(); } }, @@ -102,8 +102,7 @@ var ImageGalleryView = View.extend({ $page.hide(); $('img', $page).unbind(); - $page.empty(); - + $page.empty(); this.setPageViewOffset($page, {x:0, y:0}); }, @@ -183,7 +182,11 @@ var ImageGalleryView = View.extend({ offset.y = vp_height-MARGIN; $page.css({left: offset.x, top: offset.y}); - }, + }, + + reload: function() { + this.model.load(true); + }, renderImage: function(target) { diff --git a/platforma/templates/explorer/editor.html b/platforma/templates/explorer/editor.html index f55f4ecd..151ffa60 100644 --- a/platforma/templates/explorer/editor.html +++ b/platforma/templates/explorer/editor.html @@ -50,7 +50,7 @@ <% for (panel in panels) { %> <% }; %> -

+

@@ -64,7 +64,7 @@