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

Reply via email to