From 9ac3eeeca08ee86a172a7628593039b3b4d2ba22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Thu, 29 Jun 2017 15:53:26 +0200 Subject: [PATCH] edit title and description of changesets --- src/c3nav/editor/forms.py | 8 +++++ .../migrations/0007_auto_20170629_1327.py | 25 +++++++++++++ src/c3nav/editor/models/changeset.py | 8 ++--- .../editor/templates/editor/changeset.html | 24 ++++++++----- .../templates/editor/changeset_edit.html | 27 ++++++++++++++ src/c3nav/editor/urls.py | 3 +- src/c3nav/editor/views/changes.py | 35 +++++++++++++++++-- src/c3nav/editor/wrappers.py | 2 +- 8 files changed, 113 insertions(+), 19 deletions(-) create mode 100644 src/c3nav/editor/migrations/0007_auto_20170629_1327.py create mode 100644 src/c3nav/editor/templates/editor/changeset_edit.html diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index 4774164c..8e576500 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -7,6 +7,8 @@ from django.forms.widgets import HiddenInput from django.utils.translation import ugettext_lazy as _ from shapely.geometry.geo import mapping +from c3nav.editor.models import ChangeSet + class MapitemFormMixin(ModelForm): def __init__(self, *args, request=None, **kwargs): @@ -104,3 +106,9 @@ def create_editor_form(editor_model): EditorForm.__name__ = editor_model.__name__+'EditorForm' return EditorForm + + +class ChangeSetForm(ModelForm): + class Meta: + model = ChangeSet + fields = ('title', 'description') diff --git a/src/c3nav/editor/migrations/0007_auto_20170629_1327.py b/src/c3nav/editor/migrations/0007_auto_20170629_1327.py new file mode 100644 index 00000000..b6eef0ff --- /dev/null +++ b/src/c3nav/editor/migrations/0007_auto_20170629_1327.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.2 on 2017-06-29 13:27 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('editor', '0006_auto_20170629_1222'), + ] + + operations = [ + migrations.AddField( + model_name='changeset', + name='description', + field=models.TextField(default='', max_length=1000, verbose_name='Description'), + ), + migrations.AddField( + model_name='changeset', + name='title', + field=models.CharField(default='', max_length=100, verbose_name='Title'), + ), + ] diff --git a/src/c3nav/editor/models/changeset.py b/src/c3nav/editor/models/changeset.py index f3ef4962..a106b0e4 100644 --- a/src/c3nav/editor/models/changeset.py +++ b/src/c3nav/editor/models/changeset.py @@ -21,6 +21,8 @@ from c3nav.mapdata.utils.models import get_submodels class ChangeSet(models.Model): created = models.DateTimeField(auto_now_add=True, verbose_name=_('created')) author = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.PROTECT, verbose_name=_('Author')) + title = models.CharField(max_length=100, default='', verbose_name=_('Title')) + description = models.TextField(max_length=1000, default='', verbose_name=_('Description')) session_id = models.CharField(unique=True, null=True, max_length=32) proposed = models.DateTimeField(null=True, verbose_name=_('proposed')) applied = models.DateTimeField(null=True, verbose_name=_('applied')) @@ -277,12 +279,6 @@ class ChangeSet(models.Model): return (ungettext_lazy('%(num)d changed object', '%(num)d changed objects', 'num') % {'num': self.changed_objects_count}) - @property - def title(self): - if self.pk is None: - return '' - return _('Changeset #%d') % self.pk - @property def last_change(self): last_change = cache.get('changeset:%s:last_change' % self.pk) diff --git a/src/c3nav/editor/templates/editor/changeset.html b/src/c3nav/editor/templates/editor/changeset.html index 6555ba0b..2d73279b 100644 --- a/src/c3nav/editor/templates/editor/changeset.html +++ b/src/c3nav/editor/templates/editor/changeset.html @@ -2,17 +2,22 @@ {% load i18n %} {% include 'editor/fragment_modal_close.html' %} -

{{ changeset.title }}

+

+ {% if changeset.title %} + {{ changeset.title }} + {% else %} + {% with id=changeset.pk %} + {% blocktrans %}Changeset #{{ id }}{% endblocktrans %} + {% endwith %} + {% endif %} +

{% csrf_token %} -

{{ desc }}{% if changeset.author %} {{ changeset.author.username }}{% endif %}

-

No description

+

{{ created }}{% if changeset.author %} {{ changeset.author.username }}{% endif %}

+{% if changeset.description %} +

{{ changeset.description }}

+{% endif %} -

- - {% trans 'Edit' %} - -

{% bootstrap_messages %} {% for obj in changed_objects %} @@ -62,6 +67,9 @@ {% buttons %}
+ {% if can_edit %} + {% trans 'Edit' %} + {% endif %}
{% endbuttons %} diff --git a/src/c3nav/editor/templates/editor/changeset_edit.html b/src/c3nav/editor/templates/editor/changeset_edit.html new file mode 100644 index 00000000..30ecefe1 --- /dev/null +++ b/src/c3nav/editor/templates/editor/changeset_edit.html @@ -0,0 +1,27 @@ +{% load bootstrap3 %} +{% load i18n %} + +{% include 'editor/fragment_modal_close.html' %} +

+ {% if changeset.title %} + {{ changeset.title }} + {% else %} + {% with id=changeset.pk %} + {% blocktrans %}Changeset #{{ id }}{% endblocktrans %} + {% endwith %} + {% endif %} +

+ +{% csrf_token %} + + + {% csrf_token %} + {% bootstrap_form form %} + + {% buttons %} + {% trans 'Back' %} +
+ +
+ {% endbuttons %} +
diff --git a/src/c3nav/editor/urls.py b/src/c3nav/editor/urls.py index 2fe8fe7b..b2d94fc4 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.changes import changeset_detail +from c3nav.editor.views.changes import changeset_detail, changeset_edit from c3nav.editor.views.edit import edit, level_detail, list_objects, main_index, space_detail from c3nav.editor.views.login import login_view, logout_view @@ -37,6 +37,7 @@ urlpatterns = [ url(r'^levels/(?Pc?[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'), + url(r'^changesets/(?P[0-9]+)/edit$', changeset_edit, name='editor.changesets.edit'), url(r'^login$', login_view, name='editor.login'), url(r'^logout$', logout_view, name='editor.logout'), ] diff --git a/src/c3nav/editor/views/changes.py b/src/c3nav/editor/views/changes.py index 27a73ad2..6795dbfd 100644 --- a/src/c3nav/editor/views/changes.py +++ b/src/c3nav/editor/views/changes.py @@ -3,11 +3,13 @@ from operator import itemgetter from django.conf import settings from django.contrib import messages +from django.core.exceptions import PermissionDenied from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.formats import date_format from django.utils.translation import ugettext_lazy as _ +from c3nav.editor.forms import ChangeSetForm from c3nav.editor.models import ChangeSet from c3nav.editor.utils import is_created_pk from c3nav.editor.views.base import sidebar_view @@ -203,15 +205,42 @@ def changeset_detail(request, pk): changed_objects_data = sorted(changed_objects_data, key=itemgetter('order')) if changeset.author: - desc = _('created at %(datetime)s by') % {'datetime': date_format(changeset.created, 'DATETIME_FORMAT')} + created = _('created at %(datetime)s by') % {'datetime': date_format(changeset.created, 'DATETIME_FORMAT')} else: - desc = _('created at %(datetime)s') % {'datetime': date_format(changeset.created, 'DATETIME_FORMAT')} + created = _('created at %(datetime)s') % {'datetime': date_format(changeset.created, 'DATETIME_FORMAT')} ctx = { 'pk': changeset.pk, 'changeset': changeset, - 'desc': desc, + 'created': created, + 'can_edit': can_edit, 'changed_objects': changed_objects_data, } return render(request, 'editor/changeset.html', ctx) + + +@sidebar_view +def changeset_edit(request, pk): + can_edit = True + changeset = request.changeset + + if str(pk) != str(request.changeset.pk): + can_edit = False + changeset = get_object_or_404(ChangeSet.qs_for_request(request), pk=pk) + + if not can_edit: + raise PermissionDenied + + if request.method == 'POST': + form = ChangeSetForm(instance=changeset, data=request.POST) + if form.is_valid(): + form.save() + return redirect(reverse('editor.changesets.detail', kwargs={'pk': changeset.pk})) + else: + form = ChangeSetForm(instance=changeset) + + return render(request, 'editor/changeset_edit.html', { + 'changeset': changeset, + 'form': form, + }) diff --git a/src/c3nav/editor/wrappers.py b/src/c3nav/editor/wrappers.py index 4c2a05eb..9e7af3ca 100644 --- a/src/c3nav/editor/wrappers.py +++ b/src/c3nav/editor/wrappers.py @@ -8,7 +8,6 @@ from django.db import models from django.db.models import FieldDoesNotExist, Manager, ManyToManyRel, Prefetch, Q from django.utils.functional import cached_property -from c3nav.editor.forms import create_editor_form from c3nav.editor.utils import is_created_pk from c3nav.mapdata.utils.models import get_submodels @@ -122,6 +121,7 @@ class ModelWrapper(BaseWrapper): """ Returns an editor form for this model. """ + from c3nav.editor.forms import create_editor_form return create_editor_form(self._obj) @cached_property