add CHangeset state

This commit is contained in:
Laura Klünder 2017-07-01 14:18:39 +02:00
parent 45e300b4af
commit d67716c0e5
2 changed files with 47 additions and 16 deletions

View file

@ -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),
),
]

View file

@ -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())),
))