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):