From 266d77105e814d9c0520a0e59d7f3b0170a73246 Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Wed, 3 Aug 2022 17:01:33 -0400
Subject: [PATCH] Add abstract models

---
 program/models.py | 52 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/program/models.py b/program/models.py
index ba2b09ec..bad049fc 100644
--- a/program/models.py
+++ b/program/models.py
@@ -47,6 +47,58 @@ class ScheduleConflictError(ValidationError):
         self.conflicts = conflicts
 
 
+class ModelWithImageFields(models.Model):
+    """Abstract model that adds:
+    - `image`, a `VersatileImageField`
+    - `image_ppoi`, a `PPOIField`
+    - `image_width`, a `PositiveIntegerField`
+    - `image_height`, a `PositiveIntegerField`
+    - `image_credits`, a `TextField`
+    - `image_alt_text`, a `TextField`
+    """
+
+    image = VersatileImageField(
+        blank=True,
+        null=True,
+        upload_to="images",
+        width_field="image_width",
+        height_field="image_height",
+        ppoi_field="image_ppoi",
+    )
+    image_ppoi = PPOIField()
+    image_width = models.PositiveIntegerField(blank=True, null=True, editable=False)
+    image_height = models.PositiveIntegerField(blank=True, null=True, editable=False)
+    image_credits = models.TextField(blank=True, null=True)
+    image_alt_text = models.TextField(blank=True, null=True)
+
+    class Meta:
+        abstract = True
+
+    def save(self, *args, **kwargs):
+        super().save(*args, **kwargs)
+
+        if self.image.name and THUMBNAIL_SIZES:
+            for size in THUMBNAIL_SIZES:
+                self.image.thumbnail = self.image.crop[size].name
+
+
+class ModelWithCreatedUpdatedFields(models.Model):
+    """Abstract model that adds:
+    - `created_at`, a `DateTimeField` with `auto_now_add=True`
+    - `updated_at`, a `DateTimeField` with `auto_now=True`
+    - `created_by`, a `CharField`
+    - `updated_by`, a `CharField`
+    """
+
+    created_at = models.DateTimeField(auto_now_add=True)
+    created_by = models.CharField()
+    updated_at = models.DateTimeField(auto_now=True)
+    updated_by = models.CharField()
+
+    class Meta:
+        abstract = True
+
+
 class Type(models.Model):
     name = models.CharField(max_length=32)
     slug = models.SlugField(max_length=32, unique=True)
-- 
GitLab