diff --git a/src/c3nav/editor/models/changeset.py b/src/c3nav/editor/models/changeset.py
index fb2372f9..3ce5746e 100644
--- a/src/c3nav/editor/models/changeset.py
+++ b/src/c3nav/editor/models/changeset.py
@@ -8,6 +8,7 @@ from django.db import models, transaction
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext_lazy
+from rest_framework.exceptions import PermissionDenied
from c3nav.editor.models.changedobject import ChangedObject
from c3nav.editor.utils import is_created_pk
@@ -244,6 +245,10 @@ class ChangeSet(models.Model):
def proposed(self):
return self.state not in ('unproposed', 'rejected')
+ @property
+ def closed(self):
+ return self.state in ('finallyrejected', 'applied')
+
def is_author(self, request):
return (self.author == request.user or (self.author is None and not request.user.is_authenticated and
request.session.get('changeset', None) == self.pk))
@@ -257,7 +262,7 @@ class ChangeSet(models.Model):
if self.pk is not None:
changeset = ChangeSet.objects.select_for_update().get(pk=self.pk)
if request is not None and not changeset.can_edit(request):
- raise PermissionError
+ raise PermissionDenied
self._object_changed = False
yield changeset
diff --git a/src/c3nav/editor/templates/editor/changeset.html b/src/c3nav/editor/templates/editor/changeset.html
index ad20a6bf..688e833a 100644
--- a/src/c3nav/editor/templates/editor/changeset.html
+++ b/src/c3nav/editor/templates/editor/changeset.html
@@ -82,7 +82,7 @@
{% endfor %}
{% buttons %}
- {% if editing %}
+ {% if active %}
{% if can_delete %}
{% endif %}
@@ -97,7 +97,7 @@
{% endif %}
- {% elif can_edit %}
+ {% elif not changeset.closed %}
{% endif %}
{% endbuttons %}
diff --git a/src/c3nav/editor/views/changes.py b/src/c3nav/editor/views/changes.py
index 848f6f8b..7e874278 100644
--- a/src/c3nav/editor/views/changes.py
+++ b/src/c3nav/editor/views/changes.py
@@ -19,9 +19,9 @@ from c3nav.mapdata.models.locations import LocationRedirect, LocationSlug
@sidebar_view
def changeset_detail(request, pk):
changeset = request.changeset
- editing = True
+ active = True
if str(pk) != str(request.changeset.pk):
- editing = False
+ active = False
changeset = get_object_or_404(ChangeSet.qs_for_request(request), pk=pk)
if not changeset.can_see(request):
@@ -29,7 +29,6 @@ def changeset_detail(request, pk):
can_edit = changeset.can_edit(request)
can_delete = changeset.can_delete(request)
- editing = editing and can_edit
if request.method == 'POST':
restore = request.POST.get('restore')
@@ -51,8 +50,8 @@ def changeset_detail(request, pk):
return redirect(reverse('editor.changesets.detail', kwargs={'pk': changeset.pk}))
elif request.POST.get('activate') == '1':
- with changeset.lock_to_edit(request) as changeset:
- if changeset.can_edit(request):
+ with changeset.lock_to_edit() as changeset:
+ if not changeset.closed:
changeset.activate(request)
messages.success(request, _('You activated this change set.'))
else:
@@ -136,7 +135,7 @@ def changeset_detail(request, pk):
obj_still_exists = pk not in changeset.deleted_existing.get(obj.__class__, ())
edit_url = None
- if obj_still_exists and editing and not isinstance(obj, LocationRedirect):
+ if obj_still_exists and active and can_edit and not isinstance(obj, LocationRedirect):
reverse_kwargs = {'pk': obj.pk}
if hasattr(obj, 'level_id'):
reverse_kwargs['level'] = obj.level_id
@@ -264,7 +263,7 @@ def changeset_detail(request, pk):
'can_edit': can_edit,
'can_delete': can_delete,
'can_unpropose': changeset.can_unpropose(request),
- 'editing': editing,
+ 'active': active,
'changed_objects': changed_objects_data,
}