From 512b4e0ed991c1da6db0485e34b37c5c0bc322d1 Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Sun, 16 Mar 2025 10:25:39 +0100 Subject: [PATCH] Add created_at and updated_at to all models --- ...ed_at_billingentity_updated_at_and_more.py | 89 +++++++++++++++++++ src/servala/core/models/mixins.py | 15 ++++ src/servala/core/models/organization.py | 10 ++- src/servala/core/models/user.py | 4 +- 4 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 src/servala/core/migrations/0002_billingentity_created_at_billingentity_updated_at_and_more.py create mode 100644 src/servala/core/models/mixins.py diff --git a/src/servala/core/migrations/0002_billingentity_created_at_billingentity_updated_at_and_more.py b/src/servala/core/migrations/0002_billingentity_created_at_billingentity_updated_at_and_more.py new file mode 100644 index 0000000..83d5c00 --- /dev/null +++ b/src/servala/core/migrations/0002_billingentity_created_at_billingentity_updated_at_and_more.py @@ -0,0 +1,89 @@ +# Generated by Django 5.2b1 on 2025-03-17 06:19 + +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("core", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="billingentity", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="billingentity", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + migrations.AddField( + model_name="organization", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="organization", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + migrations.AddField( + model_name="organizationmembership", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="organizationmembership", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + migrations.AddField( + model_name="organizationorigin", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="organizationorigin", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + migrations.AddField( + model_name="user", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + verbose_name="Created", + ), + preserve_default=False, + ), + migrations.AddField( + model_name="user", + name="updated_at", + field=models.DateTimeField(auto_now=True, verbose_name="Last updated"), + ), + ] diff --git a/src/servala/core/models/mixins.py b/src/servala/core/models/mixins.py new file mode 100644 index 0000000..ac8c3b0 --- /dev/null +++ b/src/servala/core/models/mixins.py @@ -0,0 +1,15 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ + + +class ServalaModelMixin(models.Model): + created_at = models.DateTimeField( + auto_now_add=True, editable=False, verbose_name=_("Created") + ) + updated_at = models.DateTimeField( + auto_now=True, editable=False, verbose_name=_("Last updated") + ) + + class Meta: + abstract = True + ordering = ("-created_at",) diff --git a/src/servala/core/models/organization.py b/src/servala/core/models/organization.py index ce0b43d..6fd6c67 100644 --- a/src/servala/core/models/organization.py +++ b/src/servala/core/models/organization.py @@ -1,8 +1,10 @@ from django.db import models from django.utils.translation import gettext_lazy as _ +from .mixins import ServalaModelMixin -class Organization(models.Model): + +class Organization(ServalaModelMixin, models.Model): name = models.CharField(max_length=100, verbose_name=_("Name")) billing_entity = models.ForeignKey( @@ -33,7 +35,7 @@ class Organization(models.Model): return self.name -class BillingEntity(models.Model): +class BillingEntity(ServalaModelMixin, models.Model): """ Every organization has a billing entity, though billing entities may be shared across different organizations. @@ -53,7 +55,7 @@ class BillingEntity(models.Model): return self.name -class OrganizationOrigin(models.Model): +class OrganizationOrigin(ServalaModelMixin, models.Model): """ Every organization has an origin, though origins may be shared across different organizations. The default origin @@ -77,7 +79,7 @@ class OrganizationRole(models.TextChoices): OWNER = "owner", _("Owner") -class OrganizationMembership(models.Model): +class OrganizationMembership(ServalaModelMixin, models.Model): """Through-model for the many-to-many relationship between organizations and users.""" user = models.ForeignKey( diff --git a/src/servala/core/models/user.py b/src/servala/core/models/user.py index 66f420d..12545a8 100644 --- a/src/servala/core/models/user.py +++ b/src/servala/core/models/user.py @@ -2,6 +2,8 @@ from django.contrib.auth.models import AbstractBaseUser, BaseUserManager from django.db import models from django.utils.translation import gettext_lazy as _ +from .mixins import ServalaModelMixin + class UserManager(BaseUserManager): """ @@ -30,7 +32,7 @@ class UserManager(BaseUserManager): return self.create_user(email, password, **extra_fields) -class User(AbstractBaseUser): +class User(ServalaModelMixin, AbstractBaseUser): """The Django model provides a password and last_login field.""" objects = UserManager()