From 4d416e04602056b661b118c1a8e5f2fea293786a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Wed, 5 Jul 2017 15:40:28 +0200 Subject: [PATCH] save changeset last_update and last_change as foreign keys --- .../0014_last_update_foreign_key.py | 78 +++++++++++++++++++ src/c3nav/editor/models/changeset.py | 10 ++- src/c3nav/editor/models/changesetupdate.py | 1 + .../editor/templates/editor/changeset.html | 2 +- 4 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 src/c3nav/editor/migrations/0014_last_update_foreign_key.py diff --git a/src/c3nav/editor/migrations/0014_last_update_foreign_key.py b/src/c3nav/editor/migrations/0014_last_update_foreign_key.py new file mode 100644 index 00000000..6ad4bd3b --- /dev/null +++ b/src/c3nav/editor/migrations/0014_last_update_foreign_key.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.2 on 2017-07-05 13:27 +from __future__ import unicode_literals + +from django.core.exceptions import ObjectDoesNotExist +from django.db import migrations, models +import django.db.models.deletion + + +def forwards_func(apps, schema_editor): + ChangeSet = apps.get_model('editor', 'ChangeSet') + for changeset in ChangeSet.objects.all(): + try: + changeset.last_update_obj = changeset.updates.latest() + except ObjectDoesNotExist: + pass + try: + changeset.last_change_obj = changeset.updates.filter(objects_changed=True).latest() + except ObjectDoesNotExist: + pass + changeset.save() + +def reverse_func(apps, schema_editor): + ChangeSet = apps.get_model('editor', 'ChangeSet') + for changeset in ChangeSet.objects.all(): + try: + changeset.last_update = changeset.last_update_obj.datetime + except ObjectDoesNotExist: + changeset.last_update = changeset.created + try: + changeset.last_change = changeset.last_change_obj.datetime + except ObjectDoesNotExist: + changeset.last_change = changeset.created + changeset.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('editor', '0013_remove_changesetupdate_session_user'), + ] + + operations = [ + migrations.AlterModelOptions( + name='changesetupdate', + options={'get_latest_by': 'datetime', 'ordering': ['datetime', 'pk'], 'verbose_name': 'Change set update', + 'verbose_name_plural': 'Change set updates'}, + ), + migrations.AddField( + model_name='changeset', + name='last_change_obj', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='editor.ChangeSetUpdate', verbose_name='last object change'), + ), + migrations.AddField( + model_name='changeset', + name='last_update_obj', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='editor.ChangeSetUpdate', verbose_name='last update'), + ), + migrations.RunPython(forwards_func, reverse_func), + migrations.RemoveField( + model_name='changeset', + name='last_change', + ), + migrations.RemoveField( + model_name='changeset', + name='last_update', + ), + migrations.RenameField( + model_name='changeset', + old_name='last_change_obj', + new_name='last_change', + ), + migrations.RenameField( + model_name='changeset', + old_name='last_update_obj', + new_name='last_update', + ), + ] diff --git a/src/c3nav/editor/models/changeset.py b/src/c3nav/editor/models/changeset.py index 3ce5746e..ea380eb6 100644 --- a/src/c3nav/editor/models/changeset.py +++ b/src/c3nav/editor/models/changeset.py @@ -29,8 +29,10 @@ class ChangeSet(models.Model): ('applied', _('accepted')), ) created = models.DateTimeField(auto_now_add=True, verbose_name=_('created')) - last_change = models.DateTimeField(auto_now_add=True, verbose_name=_('last change')) - last_update = models.DateTimeField(auto_now_add=True, verbose_name=_('last update')) + last_change = models.ForeignKey('editor.ChangeSetUpdate', null=True, related_name='+', + verbose_name=_('last object change')) + last_update = models.ForeignKey('editor.ChangeSetUpdate', null=True, related_name='+', + verbose_name=_('last update')) 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')) @@ -65,7 +67,7 @@ class ChangeSet(models.Model): Returns a base QuerySet to get only changesets the current user is allowed to see """ if request.user.is_authenticated: - return ChangeSet.objects.filter(author=request.user) + return ChangeSet.objects.select_related('last_update', 'last_change').filter(author=request.user) return ChangeSet.objects.none() @classmethod @@ -82,7 +84,7 @@ class ChangeSet(models.Model): """ changeset_pk = request.session.get('changeset') if changeset_pk is not None: - qs = ChangeSet.objects.exclude(state='applied') + qs = ChangeSet.objects.select_related('last_update', 'last_change').exclude(state='applied') if request.user.is_authenticated: qs = qs.filter(author=request.user) else: diff --git a/src/c3nav/editor/models/changesetupdate.py b/src/c3nav/editor/models/changesetupdate.py index 6333c8af..5aa0eb68 100644 --- a/src/c3nav/editor/models/changesetupdate.py +++ b/src/c3nav/editor/models/changesetupdate.py @@ -22,6 +22,7 @@ class ChangeSetUpdate(models.Model): verbose_name = _('Change set update') verbose_name_plural = _('Change set updates') ordering = ['datetime', 'pk'] + get_latest_by = 'datetime' def __repr__(self): return '' % (str(self.pk), str(self.changeset_id)) diff --git a/src/c3nav/editor/templates/editor/changeset.html b/src/c3nav/editor/templates/editor/changeset.html index 688e833a..ce1c2e4e 100644 --- a/src/c3nav/editor/templates/editor/changeset.html +++ b/src/c3nav/editor/templates/editor/changeset.html @@ -23,7 +23,7 @@ {% endif %} {% endwith %}
- {% with datetime=changeset.last_update|date:"DATETIME_FORMAT" %} + {% with datetime=changeset.last_update.datetime|date:"DATETIME_FORMAT" %} {% blocktrans %}last update at {{ datetime }}{% endblocktrans %} {% endwith %}