X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/2f9cb34a07fcd98effda2fa900e48c31813f14c8..1b9ba95da190a11d915fc910b62fdfc9d6dca356:/apps/wiki/views.py diff --git a/apps/wiki/views.py b/apps/wiki/views.py index 9a17faab..da747ccc 100644 --- a/apps/wiki/views.py +++ b/apps/wiki/views.py @@ -1,28 +1,30 @@ -from datetime import datetime +# -*- coding: utf-8 -*- +# +# This file is part of MIL/PEER, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# import json import os import logging import urllib from django.conf import settings -from django.core.urlresolvers import reverse from django import http -from django.http import Http404, HttpResponseForbidden +from django.http import HttpResponseForbidden from django.middleware.gzip import GZipMiddleware from django.utils.decorators import decorator_from_middleware from django.utils.encoding import smart_unicode from django.utils.formats import localize +from django.utils.html import escape from django.utils.translation import ugettext as _ -from django.views.decorators.http import require_POST, require_GET +from django.views.decorators.http import require_POST from django.shortcuts import get_object_or_404, render -from django.contrib.auth.decorators import login_required -from catalogue.models import Document, Template +from catalogue.models import Document, Template, Category from dvcs.models import Revision import nice_diff from wiki import forms -from wiki.helpers import (JSONResponse, JSONFormInvalid, JSONServerError, - ajax_require_permission) +from wiki.helpers import JSONResponse, JSONFormInvalid # # Quick hack around caching problems, TODO: use ETags @@ -38,38 +40,27 @@ def get_history(document): revisions = [] for i, revision in enumerate(document.history()): revisions.append({ - "version": i + 1, - "description": revision.description, - "author": revision.author_str(), - "date": localize(revision.created_at), - "published": "", - "revision": revision.pk, - "published": _("Published") + ": " + \ - localize(revision.publish_log.order_by('-timestamp')[0].timestamp) \ - if revision.publish_log.exists() else "", - }) + "version": i + 1, + "description": revision.description, + "author": escape(revision.author_str()), + "date": localize(revision.created_at), + "revision": revision.pk, + "published": _("Published") + ": " + + localize(revision.publish_log.order_by('-timestamp')[0].timestamp) + if revision.publish_log.exists() else "", + }) return revisions @never_cache -#@login_required -def editor(request, pk, chunk=None, template_name='wiki/bootstrap.html'): +def editor(request, pk, template_name='wiki/bootstrap.html'): doc = get_object_or_404(Document, pk=pk, deleted=False) - #~ if not doc.accessible(request): - #~ return HttpResponseForbidden("Not authorized.") - - access_time = datetime.now() + if not doc.can_edit(request.user): + return HttpResponseForbidden("Not authorized.") save_form = forms.DocumentTextSaveForm(user=request.user, prefix="textsave") - try: - version = int(request.GET.get('version', None)) - except: - version = None - if version: - text = doc.at_revision(version).materialize() - else: - text = doc.materialize() - revision = doc.revision + text = doc.materialize() + revision = doc.revision history = get_history(doc) return render(request, template_name, { 'serialized_document_data': json.dumps({ @@ -77,10 +68,11 @@ def editor(request, pk, chunk=None, template_name='wiki/bootstrap.html'): 'document_id': doc.pk, 'title': doc.meta().get('title', ''), 'history': history, - 'version': len(history), #version or chunk.revision(), + 'version': len(history), 'revision': revision.pk, 'stage': doc.stage, - 'assignment': str(doc.assigned_to), + 'stage_name': doc.stage_name(), + 'assignment': doc.assigned_to.username if doc.assigned_to else None, }), 'serialized_templates': json.dumps([ {'id': t.id, 'name': t.name, 'content': t.content} for t in Template.objects.filter(is_partial=True) @@ -90,48 +82,19 @@ def editor(request, pk, chunk=None, template_name='wiki/bootstrap.html'): "text_revert": forms.DocumentTextRevertForm(prefix="textrevert"), "text_publish": forms.DocumentTextPublishForm(prefix="textpublish"), }, + 'tag_categories': Category.objects.all(), 'pk': doc.pk, }) -@require_GET -def editor_readonly(request, slug, chunk=None, template_name='wiki/document_details_readonly.html'): - try: - chunk = Chunk.get(slug, chunk) - revision = request.GET['revision'] - except (Chunk.MultipleObjectsReturned, Chunk.DoesNotExist, KeyError): - raise Http404 - if not chunk.book.accessible(request): - return HttpResponseForbidden("Not authorized.") - - access_time = datetime.now() - last_books = request.session.get("wiki_last_books", {}) - last_books[slug, chunk.slug] = { - 'time': access_time, - 'title': chunk.book.title, - } - - if len(last_books) > MAX_LAST_DOCS: - oldest_key = min(last_books, key=lambda x: last_books[x]['time']) - del last_books[oldest_key] - request.session['wiki_last_books'] = last_books - - return render(request, template_name, { - 'chunk': chunk, - 'revision': revision, - 'readonly': True, - 'REDMINE_URL': settings.REDMINE_URL, - }) - - @never_cache @decorator_from_middleware(GZipMiddleware) def text(request, doc_id): doc = get_object_or_404(Document, pk=doc_id, deleted=False) - #~ if not doc.book.accessible(request): - #~ return HttpResponseForbidden("Not authorized.") if request.method == 'POST': + if not doc.can_edit(request.user): + return HttpResponseForbidden("Not authorized.") form = forms.DocumentTextSaveForm(request.POST, user=request.user, prefix="textsave") if form.is_valid(): if request.user.is_authenticated(): @@ -139,33 +102,30 @@ def text(request, doc_id): else: author = None text = form.cleaned_data['text'] - #~ parent_revision = form.cleaned_data['parent_revision'] - #~ if parent_revision is not None: - #~ parent = doc.at_revision(parent_revision) - #~ else: - #~ parent = None + # parent_revision = form.cleaned_data['parent_revision'] + # if parent_revision is not None: + # parent = doc.at_revision(parent_revision) + # else: + # parent = None stage = form.cleaned_data['stage'] - #~ tags = [stage] if stage else [] - #~ publishable = (form.cleaned_data['publishable'] and - #~ request.user.has_perm('catalogue.can_pubmark')) try: - doc.commit(author=author, - text=text, - parent=False, - description=form.cleaned_data['comment'], - author_name=form.cleaned_data['author_name'], - author_email=form.cleaned_data['author_email'], - ) + doc.commit( + author=author, + text=text, + description=form.cleaned_data['comment'], + author_name=form.cleaned_data['author_name'], + author_email=form.cleaned_data['author_email'], + ) doc.set_stage(stage) except: from traceback import print_exc print_exc() raise - #revision = doc.revision() return JSONResponse({ - 'text': None, #doc.materialize() if parent_revision != revision else None, - #'version': revision, - #'stage': doc.stage.name if doc.stage else None, + 'text': None, # doc.materialize() if parent_revision != revision else None, + 'version': len(get_history(doc)), + 'stage': doc.stage, + 'stage_name': doc.stage_name(), 'assignment': doc.assigned_to.username if doc.assigned_to else None }) else: @@ -196,6 +156,8 @@ def revert(request, doc_id): form = forms.DocumentTextRevertForm(request.POST, prefix="textrevert") if form.is_valid(): doc = get_object_or_404(Document, pk=doc_id, deleted=False) + if not doc.can_edit(request.user): + return HttpResponseForbidden("Not authorized.") rev = get_object_or_404(Revision, pk=form.cleaned_data['revision']) comment = form.cleaned_data['comment'] @@ -206,20 +168,23 @@ def revert(request, doc_id): else: author = None - #before = doc.revision + # before = doc.revision logger.info("Reverting %s to %s", doc_id, rev.pk) - doc.commit(author=author, - text=rev.materialize(), - parent=False, #? - description=comment, - #author_name=form.cleaned_data['author_name'], #? - #author_email=form.cleaned_data['author_email'], #? - ) + doc.commit( + author=author, + text=rev.materialize(), + description=comment, + # author_name=form.cleaned_data['author_name'], #? + # author_email=form.cleaned_data['author_email'], #? + ) return JSONResponse({ - #'document': None, #doc.materialize() if before != doc.revision else None, - #'version': doc.revision(), + 'document': doc.materialize(), + 'version': len(get_history(doc)), + 'stage': doc.stage, + 'stage_name': doc.stage_name(), + 'assignment': doc.assigned_to.username if doc.assigned_to else None, }) else: return JSONFormInvalid(form) @@ -278,16 +243,7 @@ def diff(request, doc_id): docA = "" docB = Revision.objects.get(pk=revB).materialize() - return http.HttpResponse(nice_diff.html_diff_table(docA.splitlines(), - docB.splitlines(), context=3)) - - -@never_cache -def revision(request, chunk_id): - doc = get_object_or_404(Chunk, pk=chunk_id) - if not doc.book.accessible(request): - return HttpResponseForbidden("Not authorized.") - return http.HttpResponse(str(doc.revision())) + return http.HttpResponse(nice_diff.html_diff_table(docA.splitlines(), docB.splitlines(), context=3)) @never_cache