allow unsaved changesets (getting saved when the first change is added)

This commit is contained in:
Laura Klünder 2017-06-18 22:14:03 +02:00
parent 70a57b0c1d
commit 8c850c61fb
4 changed files with 65 additions and 13 deletions

View file

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-06-18 19:42
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('editor', '0002_auto_20170612_1615'),
]
operations = [
migrations.AlterModelOptions(
name='change',
options={'ordering': ['created', 'pk'], 'verbose_name': 'Change', 'verbose_name_plural': 'Changes'},
),
migrations.AddField(
model_name='changeset',
name='session_id',
field=models.CharField(max_length=32, null=True, unique=True),
),
]

View file

@ -19,6 +19,7 @@ from c3nav.editor.wrappers import ModelInstanceWrapper, ModelWrapper, is_created
class ChangeSet(models.Model):
created = models.DateTimeField(auto_now_add=True, verbose_name=_('created'))
author = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.PROTECT, verbose_name=_('Author'))
session_id = models.CharField(unique=True, null=True, max_length=32)
proposed = models.DateTimeField(null=True, verbose_name=_('proposed'))
applied = models.DateTimeField(null=True, verbose_name=_('applied'))
applied_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.PROTECT,
@ -42,7 +43,7 @@ class ChangeSet(models.Model):
self._last_change_pk = 0
def parse_changes(self):
if self.parsed:
if self.pk is None or self.parsed:
return
for change in self.changes.all():
self._parse_change(change)
@ -155,6 +156,8 @@ class ChangeSet(models.Model):
@property
def cache_key(self):
if self.pk is None:
return None
return str(self.pk)+'-'+str(self._last_change_pk)
@classmethod
@ -168,7 +171,7 @@ class ChangeSet(models.Model):
def qs_for_request(cls, request):
qs = cls.qs_base()
if request.user.is_authenticated:
qs = qs.filter(Q(author__isnull=False) | Q(author=request.user))
qs = qs.filter(author=request.user)
else:
qs = qs.filter(author__isnull=True)
return qs
@ -176,9 +179,9 @@ class ChangeSet(models.Model):
@classmethod
def get_for_request(cls, request):
qs = cls.qs_for_request(request)
changeset_pk = request.session.get('changeset_pk', None)
if changeset_pk is not None:
changeset = qs.filter(pk=changeset_pk).first()
if request.session.session_key is not None:
changeset = qs.filter(session_id=request.session.session_key).first()
if changeset is not None:
changeset.default_author = request.user
if changeset.author_id is None and request.user.is_authenticated:
@ -187,37 +190,48 @@ class ChangeSet(models.Model):
return changeset
new_changeset = cls()
new_changeset.request = request
if request.user.is_authenticated:
changeset = qs.filter(Q(author=request.user)).order_by('-created').first()
if changeset is not None:
request.session['changeset_pk'] = changeset.pk
if request.session.session_key is None:
request.session.save()
changeset.session_id = request.session.session_key
changeset.save()
changeset.default_author = request.user
return changeset
new_changeset.author = request.user
new_changeset.save()
request.session['changeset_pk'] = new_changeset.pk
new_changeset.session_id = request.session.session_key
new_changeset.default_author = request.user
return new_changeset
def get_absolute_url(self):
if self.pk is None:
return ''
return reverse('editor.changesets.detail', kwargs={'pk': self.pk})
@cached_property
def undeleted_changes_count(self):
if self.pk is None:
return 0
return len([True for change in self.changes.all() if ((change.model_name != 'LocationRedirect' or
change.action != 'update') and
change.deletes_change_id is None)])
@property
def title(self):
if self.pk is None:
return ''
return _('Changeset #%d') % self.pk
@property
def count_display(self):
return ungettext_lazy('%(num)d Change', '%(num)d Changes', 'num') % {'num': self.undeleted_changes_count}
if self.pk is None:
return _('No changes')
return ungettext_lazy('%(num)d change', '%(num)d changes', 'num') % {'num': self.undeleted_changes_count}
def wrap(self, obj, author=None):
self.parse_changes()
@ -234,6 +248,17 @@ class ChangeSet(models.Model):
raise ValueError
def _new_change(self, author, **kwargs):
if self.pk is None:
if self.session_id is None:
try:
# noinspection PyUnresolvedReferences
session = self.request.session
if session.session_key is None:
session.save()
self.session_id = session.session_key
except AttributeError:
pass # ok, so lets keep it this way
self.save()
self.parse_changes()
change = Change(changeset=self)
change.changeset_id = self.pk

View file

@ -98,6 +98,7 @@ editor = {
};
},
sidebar_get: function(location, no_push) {
if (location === '') return;
// load a new page into the sidebar using a GET request
if (!no_push) history.pushState({}, '', location);
editor._sidebar_unload();

View file

@ -494,10 +494,12 @@ def login_view(request):
if form.is_valid():
login(request, form.user_cache)
request.changeset.author = form.user_cache
request.changeset.save()
request.session['changeset_pk'] = request.changeset.pk
if request.changeset.pk is not None:
if request.session.session_key is None:
request.session.save()
request.changeset.author = form.user_cache
request.changeset.session_key = request.session.session_key
request.changeset.save()
return redirect(redirect_path)
else:
form = AuthenticationForm(request)