from uuid import uuid4 from django.contrib.auth import get_user_model from django.db import models from django.db.models.fields.related import RelatedField User = get_user_model() class BaseQuerySet(models.QuerySet): def headers(self): """Return the list of header for a list.""" def _field(field): ret = { field.name: { "text": field.verbose_name.capitalize(), "align": "", "encrypted": field.name in self.model.Encryption.fields, "editable": field.name not in self.model.Serialization.excluded_fields_edit, "field_widget": "v-textarea", } } if isinstance(field, RelatedField): ret[f"{field.name}__name"] = { "text": f"{field.verbose_name.capitalize()} - Name", "align": "", "encrypted": True, } ret[f"{field.name}__name"] = { "text": f"{field.verbose_name.capitalize()} - Identifier", "align": "", "encrypted": True, } ret[field.name].update( align=" d-none", testing=123, field_widget="v-select", ) return ret fields = {} for field in self.model._meta.fields: if field.name in self.model.Serialization.excluded_fields: continue fields.update(_field(field)) return fields def serialize(self): """Serialize a queryset.""" fields = [] for field_name, _ in self.headers().items(): fields.append(field_name) return self.values(*fields) class BaseManager(models.Manager.from_queryset(BaseQuerySet)): pass class BaseModel(models.Model): class Meta: abstract = True class Serialization: # Exclude fields from serialization excluded_fields = [] excluded_fields_edit = ["id", "created_at", "last_modified_at"] class Encryption: fields = ["name", "description", "custom_identifier"] id = models.UUIDField(primary_key=True, default=uuid4, editable=False) name = models.TextField(max_length=2048) description = models.TextField(max_length=2048) custom_identifier = models.TextField(max_length=2048, null=True) created_at = models.DateTimeField(auto_now_add=True) last_modified_at = models.DateTimeField(auto_now=True) objects = BaseManager()