Codice sorgente per thx.core.models
# -*- coding: utf-8 -*-
'''
Db Mixins
============
Per semplificare la creazione dei nostri modelli e per renderla più omogenea sono
stati creati dei mixin astratti (``Meta: abstract=True``) che aggiungono campi e
funzionalità (vedi in particolare :class:`CleanModel`):
* :class:`UserModel` (``creator``, ``last_modifier``)
* :class:`DateModel` (``date_create``, ``date_last_modify``)
* :class:`StatusModel` (``status``)
* :class:`OrderedModel` (``ordering``)
* :class:`SEOModel` (``meta_description``, ``page_title``, ``meta_keywords``)
* :class:`CleanModel` (sovrascive ``.save()``)
Esempio
--------
::
class PriceList(CleanModel, UserModel, DateModel, StatusModel, OrderedModel):
"""
Price List belongs to Stores, not to Suppliers. A supplier can have different PriceList for
different Stores
"""
objects = models.Manager()
available = managers.AvailablePriceListManager()
code = models.CharField(
max_length=100,
verbose_name=_('code'),
)
...
Modelli
========
.. autoclass:: UserModel
:members:
.. autoclass:: DateModel
:members:
.. autoclass:: StatusModel
:members:
.. autoclass:: OrderedModel
:members:
.. autoclass:: SEOModel
:members:
.. autoclass:: CleanModel
:members:
'''
from __future__ import unicode_literals
from django.db import models
from django.conf import settings
from django.utils.timezone import datetime
from django.utils.translation import ugettext_lazy as _
[documenti]class UserModel(models.Model):
"""
**UserModel** è una classe *abstract* che estende django.db.models.Model.
Alla classe erede vengono aggiunti due attributi entrambi di tipo settings.AUTH_USER_MODEL:
:creator: indica l'utente che ha creato il record; una volta inserito non dovrà più essere aggiornato;
:last_modifier: indica l'ultimo utente in ordine temporale che ha modificato il record
Entrambe le FK sono definite on_delete=models.PROTECT
"""
creator = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.PROTECT,
related_name="%(app_label)s_%(class)s_creator",
verbose_name=_("creator"),
)
last_modifier = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.PROTECT,
related_name='%(app_label)s_%(class)s_last_modifier',
verbose_name=_("last modifier"),
)
class Meta:
abstract = True
[documenti]class DateModel(models.Model):
"""
**DateModel** è una classe *abstract* che estende django.db.models.Model.
Alla classe erede vengono aggiunti due attributi entrambi di tipo settings.DateTimeField:
:date_create: indica il datetime di creazione; viene valorizzato in modo automatico durante la creazione del record non verrà più aggiornato
:date_last_modify: indica il datetime di ultima modifica; viene valorizzato ad ogni salvataggio con il datetime corrente
"""
date_create = models.DateTimeField(
auto_now_add=True,
verbose_name=_('date create'),
)
date_last_modify = models.DateTimeField(
auto_now=True,
verbose_name=_('date last modify'),
)
class Meta:
abstract = True
[documenti]class StatusModel(models.Model):
"""
**StatusModel** è una classe *abstract* che estende django.db.models.Model.
Alla classe erede viene aggiunto un attributo:
- status: indica se un record è enable o disable e i valori sono limitati dal settings STATUS_CODES; viene utilizzato per la cancellazione logica di un record
"""
STATUS_CODES = (
(0, _('disable')),
(1, _('enable')),
)
status = models.IntegerField(
choices=STATUS_CODES,
default=1,
verbose_name=_('status'),
null=True
)
class Meta:
abstract = True
[documenti]class OrderedModel(models.Model):
"""
**OrderedModel** è una classe *abstract* che estende django.db.models.Model.
Alla classe erede viene aggiunto un attributo:
- ordering: serve per dare una posizione fissa al record nell'ordine del queryset
"""
ordering = models.IntegerField(
default=0,
verbose_name=_('ordering'),
)
class Meta:
abstract = True
[documenti]class SEOModel(models.Model):
"""
**SEOModel** è una classe *abstract* che estende django.db.models.Model.
Alla classe erede vengono aggiunti tre attributi che possono essere utilizzati per il SEO
"""
meta_description = models.TextField(
_("description"),
max_length=255,
blank=True,
)
meta_keywords = models.CharField(
_("keywords"),
max_length=255,
blank=True,
)
page_title = models.CharField(
_("title"),
max_length=255,
help_text=_("overwrite the title (html title tag)"),
blank=True,
)
class Meta:
abstract = True
[documenti]class CleanModel(models.Model):
"""
**CleanModel** è una classe *abstract* che estende django.db.models.Model.
viene ridefinita la funzione 'save' nella quale viene richiamata la full_clean (chiama tutte le clean() in cascata)
per validare gli attributi del record prima della 'save' effettiva
"""
class Meta:
abstract = True
[documenti] def save(self, *args, **kwargs):
self.full_clean()
super().save(*args, **kwargs)