From f55ea561bd65244c379c43cf427fdf8917556e97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Mon, 12 Jun 2017 17:22:38 +0200 Subject: [PATCH] get changeset for session/user and show it in ediutr in top right corner --- src/c3nav/editor/models.py | 45 +++++++++++++++++++ src/c3nav/editor/static/editor/css/editor.css | 5 ++- src/c3nav/editor/static/editor/js/editor.js | 5 +++ src/c3nav/editor/templates/editor/map.html | 3 ++ src/c3nav/editor/views.py | 5 +++ 5 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/c3nav/editor/models.py b/src/c3nav/editor/models.py index ee41049f..9d6d3ba1 100644 --- a/src/c3nav/editor/models.py +++ b/src/c3nav/editor/models.py @@ -5,7 +5,9 @@ from django.conf import settings from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.db import models from django.db.models import Q +from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import ungettext_lazy class ChangeSet(models.Model): @@ -21,6 +23,49 @@ class ChangeSet(models.Model): verbose_name_plural = _('Change Sets') default_related_name = 'changesets' + @classmethod + def qs_base(cls): + return cls.objects.prefetch_related('changes').select_related('author') + + @classmethod + def get_for_request(cls, request): + qs_base = cls.qs_base().filter(applied__isnull=True) + changeset_pk = request.session.get('changeset_pk', None) + if changeset_pk is not None: + if request.user.is_authenticated(): + qs = qs_base.filter(Q(author__isnull=True) | Q(author=request.user)) + else: + qs = qs_base.filter(author__isnull=True) + + changeset = qs.filter(pk=changeset_pk).first() + if changeset is not None: + if changeset.author_id is None and request.user.is_authenticated(): + changeset.author = request.user + changeset.save() + return changeset + + new_changeset = cls() + + if request.user.is_authenticated(): + changeset = qs_base.filter(Q(author=request.user)).order_by('-created').first() + if changeset is not None: + request.session['changeset_pk'] = changeset.pk + return changeset + + new_changeset.author = request.user + + new_changeset.save() + request.session['changeset_pk'] = new_changeset.pk + return new_changeset + + @cached_property + def undeleted_changes_count(self): + return len([True for change in self.changes.all() if change.deletes_change_id is None]) + + @property + def count_display(self): + return ungettext_lazy('%(num)d Change', '%(num)d Changes', 'num') % {'num': self.undeleted_changes_count} + class Change(models.Model): ACTIONS = ( diff --git a/src/c3nav/editor/static/editor/css/editor.css b/src/c3nav/editor/static/editor/css/editor.css index febbc4fc..b553b5c6 100644 --- a/src/c3nav/editor/static/editor/css/editor.css +++ b/src/c3nav/editor/static/editor/css/editor.css @@ -68,6 +68,9 @@ body:not(.map-enabled) #sidebar { left:15px; top:23px; } +nav.navbar .navbar-nav > li > a { + color:#666666; +} /* sidebar contents */ #sidebar form.creation-lock .btn.btn-primary { @@ -112,7 +115,7 @@ legend { right: 8px; top: 8px; } -[data-levels], [data-sublevels] { +[data-levels], [data-sublevels], [data-changeset] { display:none; } form button.invisiblesubmit { diff --git a/src/c3nav/editor/static/editor/js/editor.js b/src/c3nav/editor/static/editor/js/editor.js index aeaac821..a114310c 100644 --- a/src/c3nav/editor/static/editor/js/editor.js +++ b/src/c3nav/editor/static/editor/js/editor.js @@ -143,6 +143,11 @@ editor = { return; } + var changeset = content.find('span[data-changeset]'); + if (changeset.length) { + $('.changeset a').text(changeset.text()); + } + var geometry_url = content.find('[data-geometry-url]'); if (geometry_url.length) { geometry_url = geometry_url.attr('data-geometry-url'); diff --git a/src/c3nav/editor/templates/editor/map.html b/src/c3nav/editor/templates/editor/map.html index 6d947c8c..4a6663a0 100644 --- a/src/c3nav/editor/templates/editor/map.html +++ b/src/c3nav/editor/templates/editor/map.html @@ -6,6 +6,9 @@ + {% endblock %} {% block subheader %} diff --git a/src/c3nav/editor/views.py b/src/c3nav/editor/views.py index a9eb14a6..7881e628 100644 --- a/src/c3nav/editor/views.py +++ b/src/c3nav/editor/views.py @@ -7,9 +7,11 @@ from django.core.exceptions import FieldDoesNotExist, PermissionDenied from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse +from django.utils.html import escape from django.utils.translation import ugettext_lazy as _ from django.views.decorators.cache import never_cache +from c3nav.editor.models import ChangeSet from c3nav.mapdata.models import Level, Space from c3nav.mapdata.models.base import EDITOR_FORM_MODELS @@ -17,10 +19,13 @@ from c3nav.mapdata.models.base import EDITOR_FORM_MODELS def sidebar_view(func): @wraps(func) def with_ajax_check(request, *args, **kwargs): + request.changeset = ChangeSet.get_for_request(request) + response = func(request, *args, **kwargs) if request.is_ajax() or 'ajax' in request.GET: if isinstance(response, HttpResponseRedirect): return render(request, 'editor/redirect.html', {'target': response['location']}) + response.write('%s' % escape(request.changeset.count_display)) return response return render(request, 'editor/map.html', {'content': response.content}) return never_cache(with_ajax_check)