From 435a271eabe80cc161211fb184f145cc9ec499bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Mon, 2 Dec 2024 11:43:35 +0100 Subject: [PATCH] allow direct proposing of changesets as well as direct commiting --- src/c3nav/editor/models/changeset.py | 5 +- .../templates/editor/changeset_edit.html | 3 ++ src/c3nav/editor/views/changes.py | 50 +++++++++++++++++-- 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/c3nav/editor/models/changeset.py b/src/c3nav/editor/models/changeset.py index eee92779..9c537f28 100644 --- a/src/c3nav/editor/models/changeset.py +++ b/src/c3nav/editor/models/changeset.py @@ -40,7 +40,7 @@ class ChangeSet(models.Model): state = models.CharField(max_length=20, db_index=True, choices=STATES, default='unproposed') 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')) + description = models.TextField(max_length=1000, default='', verbose_name=_('Description'), blank=True) assigned_to = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.PROTECT, related_name='assigned_changesets', verbose_name=_('assigned to')) map_update = models.OneToOneField(MapUpdate, null=True, related_name='changeset', @@ -172,6 +172,9 @@ class ChangeSet(models.Model): def can_unpropose(self, request): return self.author_id == request.user.pk and self.state in ('proposed', 'reproposed') + def can_commit(self, request): + return self.can_edit(request) and not self.proposed and self.changes and self.can_review(request) + def has_space_access_on_all_objects(self, request, force=False): # todo: reimplement this if not request.user.is_authenticated: diff --git a/src/c3nav/editor/templates/editor/changeset_edit.html b/src/c3nav/editor/templates/editor/changeset_edit.html index ec22f5bf..d9fea083 100644 --- a/src/c3nav/editor/templates/editor/changeset_edit.html +++ b/src/c3nav/editor/templates/editor/changeset_edit.html @@ -18,6 +18,9 @@ {% csrf_token %} {% bootstrap_messages %} {% bootstrap_form form %} + {% if action %} + + {% endif %} {% buttons %} {% trans 'Back' %} diff --git a/src/c3nav/editor/views/changes.py b/src/c3nav/editor/views/changes.py index d6eac70a..d1017cd3 100644 --- a/src/c3nav/editor/views/changes.py +++ b/src/c3nav/editor/views/changes.py @@ -70,9 +70,22 @@ def changeset_detail(request, pk): return redirect(reverse('editor.login') + '?r=' + request.path) with changeset.lock_to_edit(request) as changeset: - if not changeset.title or not changeset.description: - messages.warning(request, _('You need to add a title an a description to propose this change set.')) - return redirect(reverse('editor.changesets.edit', kwargs={'pk': changeset.pk})) + if not changeset.title: + form = ChangeSetForm(instance=changeset, data=request.POST) + if not form.is_valid(): + form = ChangeSetForm(instance=changeset) + messages.warning(request, _('You need to add a title to propose this change set.')) + return render(request, 'editor/changeset_edit.html', { + 'changeset': changeset, + 'action': 'propose', + 'form': form, + }) + + changeset = form.instance + update = changeset.updates.create(user=request.user, + title=changeset.title, description=changeset.description) + changeset.last_update = update + changeset.save() if changeset.can_propose(request): changeset.propose(request.user) @@ -82,6 +95,37 @@ def changeset_detail(request, pk): return redirect(reverse('editor.changesets.detail', kwargs={'pk': changeset.pk})) + elif request.POST.get('commit') == '1': + if not request.user.is_authenticated: + messages.info(request, _('You need to log in to apply changes.')) + return redirect(reverse('editor.login') + '?r=' + request.path) + + with changeset.lock_to_edit(request) as changeset: + if not changeset.title: + form = ChangeSetForm(instance=changeset, data=request.POST) + if not form.is_valid(): + form = ChangeSetForm(instance=changeset) + messages.warning(request, _('You need to add a title to apply this change set.')) + return render(request, 'editor/changeset_edit.html', { + 'changeset': changeset, + 'action': 'commit', + 'form': form, + }) + + changeset = form.instance + update = changeset.updates.create(user=request.user, + title=changeset.title, description=changeset.description) + changeset.last_update = update + changeset.save() + + if changeset.can_commit(request): + changeset.apply(request.user) + messages.success(request, _('You applied your changes.')) + else: + messages.error(request, _('You cannot apply this change set.')) + + return redirect(reverse('editor.changesets.detail', kwargs={'pk': changeset.pk})) + elif request.POST.get('unpropose') == '1': with changeset.lock_to_edit(request) as changeset: if changeset.can_unpropose(request):