@@ -28,12 +28,24 @@ def deconstruct(self):
28
28
return name , "django.db.models.CharField" , args , kwargs
29
29
30
30
31
+ class TimestampedModel (models .Model ):
32
+ created_at = models .DateTimeField (_ ("created at" ), auto_now_add = True )
33
+ updated_at = models .DateTimeField (_ ("updated at" ), auto_now = True )
34
+
35
+ class Meta :
36
+ abstract = True
37
+
38
+ @property
39
+ def pretty_timesince (self ):
40
+ return timesince (self .updated_at , depth = 1 )
41
+
42
+
31
43
class ProjectQuerySet (models .QuerySet ):
32
44
def for_user (self , user ):
33
45
return self if user .is_staff else self .filter (users = user )
34
46
35
47
36
- class Project (models . Model ):
48
+ class Project (TimestampedModel ):
37
49
created_at = models .DateTimeField (_ ("created at" ), auto_now_add = True )
38
50
updated_at = models .DateTimeField (_ ("updated at" ), auto_now = True )
39
51
@@ -81,10 +93,6 @@ def clean(self):
81
93
def get_api_url (self ):
82
94
return f"/api/pofile/{ self .slug } /"
83
95
84
- @property
85
- def pretty_timesince (self ):
86
- return timesince (self .updated_at , depth = 1 )
87
-
88
96
@cached_property
89
97
def all_users (self ):
90
98
return User .objects .filter (
@@ -97,7 +105,7 @@ def for_user(self, user):
97
105
return self if user .is_staff else self .filter (project__users = user )
98
106
99
107
100
- class Catalog (models . Model ):
108
+ class Catalog (TimestampedModel ):
101
109
created_at = models .DateTimeField (_ ("created at" ), auto_now_add = True )
102
110
updated_at = models .DateTimeField (_ ("updated at" ), auto_now = True )
103
111
@@ -143,7 +151,3 @@ def get_absolute_url(self):
143
151
@cached_property
144
152
def po (self ):
145
153
return polib .pofile (self .pofile , wrapwidth = 0 )
146
-
147
- @property
148
- def pretty_timesince (self ):
149
- return timesince (self .updated_at , depth = 1 )
0 commit comments