At the moment, there is no way to show when any of the models were created or last modified. For some models, this feature would be useful. For example: timestamps on the patch model would allow sorting by "last updated".
Add a mixin that enables this functionality, and use the mixin in appropriate models. Signed-off-by: Stephen Finucane <[email protected]> --- patchwork/migrations/0013_add_timestamp_mixin.py | 65 ++++++++++++++++++++++ patchwork/models.py | 34 ++++++++++-- 2 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 patchwork/migrations/0013_add_timestamp_mixin.py diff --git a/patchwork/migrations/0013_add_timestamp_mixin.py b/patchwork/migrations/0013_add_timestamp_mixin.py new file mode 100644 index 0000000..f3d60c2 --- /dev/null +++ b/patchwork/migrations/0013_add_timestamp_mixin.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import datetime + + +class Migration(migrations.Migration): + + dependencies = [ + ('patchwork', '0012_add_coverletter_model'), + ] + + operations = [ + migrations.AddField( + model_name='bundle', + name='created_at', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AddField( + model_name='bundle', + name='updated_at', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AddField( + model_name='person', + name='created_at', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AddField( + model_name='person', + name='updated_at', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AddField( + model_name='project', + name='created_at', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AddField( + model_name='project', + name='updated_at', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AddField( + model_name='submission', + name='created_at', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AddField( + model_name='submission', + name='updated_at', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AddField( + model_name='userprofile', + name='created_at', + field=models.DateTimeField(default=datetime.datetime.now), + ), + migrations.AddField( + model_name='userprofile', + name='updated_at', + field=models.DateTimeField(default=datetime.datetime.now), + ), + ] diff --git a/patchwork/models.py b/patchwork/models.py index 4d454c7..eb0849c 100644 --- a/patchwork/models.py +++ b/patchwork/models.py @@ -38,8 +38,28 @@ from patchwork.fields import HashField from patchwork.parser import extract_tags, hash_patch +class TimestampMixin(models.Model): + """Mixin for models with timestamps. + + This mixin does not make use of the 'auto_now' and 'auto_now_add' + parameters, owing to the fact that we override 'save' in some + places where this mixin is used. See: + https://code.djangoproject.com/ticket/22995 + """ + # timestamps + + created_at = models.DateTimeField(default=datetime.datetime.now) + updated_at = models.DateTimeField(default=datetime.datetime.now) + + def pre_save(self, instance, add): + instance.updated_at = datetime.datetime.now() + + class Meta: + abstract = True + + @python_2_unicode_compatible -class Person(models.Model): +class Person(TimestampMixin, models.Model): # properties email = models.CharField(max_length=255, unique=True) @@ -62,7 +82,7 @@ class Person(models.Model): @python_2_unicode_compatible -class Project(models.Model): +class Project(TimestampMixin, models.Model): # properties linkname = models.CharField(max_length=255, unique=True) @@ -115,7 +135,7 @@ class DelegationRule(models.Model): @python_2_unicode_compatible -class UserProfile(models.Model): +class UserProfile(TimestampMixin, models.Model): user = models.OneToOneField(User, unique=True, related_name='profile') # projects @@ -290,7 +310,7 @@ class EmailMixin(models.Model): @python_2_unicode_compatible -class Submission(EmailMixin, models.Model): +class Submission(EmailMixin, TimestampMixin, models.Model): # parent project = models.ForeignKey(Project) @@ -359,6 +379,9 @@ class Patch(Submission): for tag in tags: self._set_tag(tag, counter[tag]) + # save, thus ensuring timestamps are updated + self.save() + def save(self): if not hasattr(self, 'state') or not self.state: self.state = get_default_initial_patch_state() @@ -366,6 +389,7 @@ class Patch(Submission): if self.hash is None and self.diff is not None: self.hash = hash_patch(self.diff).hexdigest() + TimestampMixin.save() super(Patch, self).save() self.refresh_tag_counts() @@ -484,7 +508,7 @@ class Comment(EmailMixin, models.Model): unique_together = [('msgid', 'submission')] -class Bundle(models.Model): +class Bundle(TimestampMixin, models.Model): owner = models.ForeignKey(User) project = models.ForeignKey(Project) name = models.CharField(max_length=50, null=False, blank=False) -- 1.7.4.1 _______________________________________________ Patchwork mailing list [email protected] https://lists.ozlabs.org/listinfo/patchwork
