From 4cae5252debe54cf38c64021e895603b0d09b5fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Tue, 13 Jun 2017 15:31:54 +0200 Subject: [PATCH] show or delete current changeset --- src/c3nav/editor/models.py | 15 ++++++++-- src/c3nav/editor/static/editor/js/editor.js | 4 +-- .../editor/templates/editor/changeset.html | 21 ++++++++++++++ src/c3nav/editor/templates/editor/list.html | 2 +- src/c3nav/editor/templates/editor/map.html | 2 +- src/c3nav/editor/urls.py | 3 +- src/c3nav/editor/views.py | 28 +++++++++++++++++-- 7 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 src/c3nav/editor/templates/editor/changeset.html diff --git a/src/c3nav/editor/models.py b/src/c3nav/editor/models.py index e331da1c..42137fe9 100644 --- a/src/c3nav/editor/models.py +++ b/src/c3nav/editor/models.py @@ -6,6 +6,7 @@ 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.urls import reverse from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext_lazy @@ -75,10 +76,17 @@ class ChangeSet(models.Model): new_changeset.default_author = request.user return new_changeset + def get_absolute_url(self): + return reverse('editor.changesets.detail', kwargs={'pk': self.pk}) + @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 title(self): + return _('Changeset #%d') % self.pk + @property def count_display(self): return ungettext_lazy('%(num)d Change', '%(num)d Changes', 'num') % {'num': self.undeleted_changes_count} @@ -86,7 +94,7 @@ class ChangeSet(models.Model): def wrap(self, obj, author=None): if author is None: author = self.default_author - if not author.is_authenticated(): + if author is not None and not author.is_authenticated(): author = None if isinstance(obj, str): return ModelWrapper(self, apps.get_model('mapdata', obj), author) @@ -155,6 +163,7 @@ class Change(models.Model): verbose_name = _('Change') verbose_name_plural = _('Changes') default_related_name = 'changes' + ordering = ['created', 'pk'] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -180,14 +189,14 @@ class Change(models.Model): self.model_name = value.__name__ @property - def obj(self) -> models.Model: + def obj(self) -> ModelInstanceWrapper: if self._set_object is not None: return self._set_object if self.existing_object_pk is not None: if self.created_object is not None: raise TypeError('existing_object_pk and created_object can not both be set.') - self._set_object = self.model_class.objects.get(pk=self.existing_object_pk) + self._set_object = self.changeset.wrap(self.model_class.objects.get(pk=self.existing_object_pk)) # noinspection PyTypeChecker return self._set_object elif self.created_object is not None: diff --git a/src/c3nav/editor/static/editor/js/editor.js b/src/c3nav/editor/static/editor/js/editor.js index a114310c..3b63811d 100644 --- a/src/c3nav/editor/static/editor/js/editor.js +++ b/src/c3nav/editor/static/editor/js/editor.js @@ -143,9 +143,9 @@ editor = { return; } - var changeset = content.find('span[data-changeset]'); + var changeset = content.find('a[data-changeset]'); if (changeset.length) { - $('.changeset a').text(changeset.text()); + $('.changeset a').text(changeset.text()).attr('href', changeset.attr('href')); } var geometry_url = content.find('[data-geometry-url]'); diff --git a/src/c3nav/editor/templates/editor/changeset.html b/src/c3nav/editor/templates/editor/changeset.html new file mode 100644 index 00000000..2b0aa4ea --- /dev/null +++ b/src/c3nav/editor/templates/editor/changeset.html @@ -0,0 +1,21 @@ +{% load bootstrap3 %} +{% load i18n %} + +{% include 'editor/fragment_levels.html' %} + +

{{ changeset.title }}

+ +
+ {% csrf_token %} + +
+ + + + {% for change in changeset.changes.all %} + + + + {% endfor %} + +
{{ change|stringformat:'r' }}
diff --git a/src/c3nav/editor/templates/editor/list.html b/src/c3nav/editor/templates/editor/list.html index d85bdda0..ae5f1674 100644 --- a/src/c3nav/editor/templates/editor/list.html +++ b/src/c3nav/editor/templates/editor/list.html @@ -4,7 +4,7 @@ {% include 'editor/fragment_levels.html' %} - {% blocktrans %}New {{ model_title }}{% endblocktrans %} + {% blocktrans %}DeleteNew {{ model_title }}{% endblocktrans %}

{% blocktrans %}{{ model_title_plural }}{% endblocktrans %} diff --git a/src/c3nav/editor/templates/editor/map.html b/src/c3nav/editor/templates/editor/map.html index 4a6663a0..e6186da3 100644 --- a/src/c3nav/editor/templates/editor/map.html +++ b/src/c3nav/editor/templates/editor/map.html @@ -7,7 +7,7 @@
{% trans 'Without Javascript' %}
{% endblock %} diff --git a/src/c3nav/editor/urls.py b/src/c3nav/editor/urls.py index 289733e5..0020af83 100644 --- a/src/c3nav/editor/urls.py +++ b/src/c3nav/editor/urls.py @@ -1,7 +1,7 @@ from django.apps import apps from django.conf.urls import url -from c3nav.editor.views import edit, level_detail, list_objects, main_index, space_detail +from c3nav.editor.views import changeset_detail, edit, level_detail, list_objects, main_index, space_detail def add_editor_urls(model_name, parent_model_name=None, with_list=True, explicit_edit=False): @@ -34,6 +34,7 @@ urlpatterns = [ url(r'^levels/(?P[0-9]+)/spaces/(?P[0-9]+)/$', space_detail, name='editor.spaces.detail'), url(r'^levels/(?P[0-9]+)/levels_on_top/create$', edit, name='editor.levels_on_top.create', kwargs={'model': 'Level'}), + url(r'^changesets/(?P[0-9]+)/$', changeset_detail, name='editor.changesets.detail'), ] urlpatterns.extend(add_editor_urls('Level', with_list=False, explicit_edit=True)) urlpatterns.extend(add_editor_urls('LocationGroup')) diff --git a/src/c3nav/editor/views.py b/src/c3nav/editor/views.py index 643d19ec..f0fd4bb4 100644 --- a/src/c3nav/editor/views.py +++ b/src/c3nav/editor/views.py @@ -22,7 +22,8 @@ def sidebar_view(func): 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)) + response.write('%s' % (request.changeset.get_absolute_url(), + escape(request.changeset.count_display))) return response return render(request, 'editor/map.html', {'content': response.content}) return never_cache(with_ajax_check) @@ -250,7 +251,6 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals Level = request.changeset.wrap('Level') Space = request.changeset.wrap('Space') - # noinspection PyProtectedMember ctx = { 'path': request.path, 'model_name': model.__name__.lower(), @@ -302,3 +302,27 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals }) return render(request, 'editor/list.html', ctx) + + +@sidebar_view +def changeset_detail(request, pk): + changeset = get_object_or_404(ChangeSet.qs_for_request(request), pk=pk) + + ctx = { + 'pk': pk, + 'changeset': changeset, + } + + if request.method == 'POST': + if request.POST.get('delete') == '1': + if request.POST.get('delete_confirm') == '1': + changeset.delete() + return redirect(reverse('editor.index')) + + ctx.update({ + 'model_title': ChangeSet._meta.verbose_name, + 'obj_title': changeset.title, + }) + return render(request, 'editor/delete.html', ctx) + + return render(request, 'editor/changeset.html', ctx)