From d67716c0e51cf6c79d13cd412df25752c88cdeab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Sat, 1 Jul 2017 14:18:39 +0200 Subject: [PATCH] add CHangeset state --- .../migrations/0009_auto_20170701_1218.py | 28 +++++++++++++++ src/c3nav/editor/models/changeset.py | 35 ++++++++++--------- 2 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 src/c3nav/editor/migrations/0009_auto_20170701_1218.py diff --git a/src/c3nav/editor/migrations/0009_auto_20170701_1218.py b/src/c3nav/editor/migrations/0009_auto_20170701_1218.py new file mode 100644 index 00000000..cf5c1792 --- /dev/null +++ b/src/c3nav/editor/migrations/0009_auto_20170701_1218.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.2 on 2017-07-01 12:18 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('editor', '0008_auto_20170629_1450'), + ] + + operations = [ + migrations.RemoveField( + model_name='changeset', + name='applied', + ), + migrations.RemoveField( + model_name='changeset', + name='proposed', + ), + migrations.AddField( + model_name='changeset', + name='state', + field=models.CharField(choices=[('unproposed', 'unproposed'), ('proposed', 'proposed'), ('review', 'in review'), ('rejected', 'rejected'), ('finallyrejected', 'finally rejected'), ('applied', 'accepted')], default='unproposed', max_length=20), + ), + ] diff --git a/src/c3nav/editor/models/changeset.py b/src/c3nav/editor/models/changeset.py index 0d23a386..7b370992 100644 --- a/src/c3nav/editor/models/changeset.py +++ b/src/c3nav/editor/models/changeset.py @@ -19,15 +19,22 @@ from c3nav.mapdata.utils.models import get_submodels class ChangeSet(models.Model): + STATES = ( + ('unproposed', _('unproposed')), + ('proposed', _('proposed')), + ('review', _('in review')), + ('rejected', _('rejected')), + ('finallyrejected', _('finally rejected')), + ('applied', _('accepted')), + ) created = models.DateTimeField(auto_now_add=True, verbose_name=_('created')) + state = models.CharField(max_length=20, 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')) + 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')) assigned_to = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.PROTECT, related_name='assigned_changesets', verbose_name=_('assigned to')) - applied = models.DateTimeField(null=True, verbose_name=_('applied')) class Meta: verbose_name = _('Change Set') @@ -53,7 +60,7 @@ class ChangeSet(models.Model): def qs_base(cls, hide_applied=True): qs = cls.objects.select_related('author') if hide_applied: - qs = qs.filter(applied__isnull=True) + qs = qs.exclude(state='applied') return qs @classmethod @@ -73,9 +80,10 @@ class ChangeSet(models.Model): """ Returns a base QuerySet to get only changesets the current user is allowed to edit """ - qs = cls.qs_for_request(request).filter(applied__isnull=True) + qs = cls.qs_for_request(request) if request.user.is_authenticated: - qs = qs.filter(Q(proposed__isnull=True) | Q(assigned_to=request.user)) + qs = qs.filter(Q(state='review', assigned_to=request.user) | + Q(state='unproposed', author=request.user)) else: qs = qs.filter(proposed__isnull=True) return qs @@ -258,23 +266,22 @@ class ChangeSet(models.Model): """ @property def editable(self): - return self.applied is None + return self.state in ('unproposed', 'review') def can_see(self, request): return self.session_id == request.session.session_key or self.author_id is request.user.pk def can_edit(self, request): - return (self.editable and self.session_id == request.session.session_key and - (self.proposed is None or self.assigned_to_id is request.user.pk)) + return (self.session_id == request.session.session_key and self.state in ('unproposed', 'review')) def can_delete(self, request): - return self.can_edit(request) and self.proposed is None + return self.can_edit(request) and self.state == 'unproposed' def can_propose(self, request): - return self.author_id == request.user.pk and self.proposed is None + return self.author_id == request.user.pk and self.state == 'unproposed' def can_unpropose(self, request): - return self.proposed is not None and self.assigned_to_id is None and self.author_id == request.user.pk + return self.author_id == request.user.pk and self.state in ('proposed', 'rejected') """ Methods for display @@ -344,8 +351,4 @@ class ChangeSet(models.Model): ('id', self.pk), ('author', self.author_id), ('created', None if self.created is None else self.created.isoformat()), - ('proposed', None if self.proposed is None else self.proposed.isoformat()), - ('applied', None if self.applied is None else self.applied.isoformat()), - ('applied_by', None if self.applied_by_id is None else self.applied_by_id), - ('changes', tuple(change.serialize() for change in self.changes.all())), ))