import uuid
from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from model_utils import managers
__all__ = ("Model", "QuerySet", "InheritanceQuerySet")
[docs]
class QuerySet(models.QuerySet):
[docs]
def uuid(self, value: uuid.UUID):
"""Filter by uuid."""
return self.filter(uuid=value)
[docs]
class InheritanceQuerySet(managers.InheritanceQuerySet, QuerySet):
"""This is utility QuerySet subclass for :py:class:`Model`, inheriting from
``model_utils.InheritanceQuerySet``."""
pass
[docs]
class Model(models.Model):
"""Model class used by Oxylus applications. It provides:
- public uuid: reducing bruteforcing database row index;
- url reverse;
Using :py:attr:`uuid` as a public identifier is preferred over directly exposing
database primary key.
"""
uuid = models.UUIDField(
_("Reference"),
db_index=True,
default=uuid.uuid4,
editable=False,
)
objects = QuerySet.as_manager()
class Meta:
abstract = True
[docs]
def get_absolute_url(self):
"""Return model detail url."""
return self.reverse_url("detail", uuid=self.uuid)
[docs]
def get_api_url(self, action: str = "detail") -> str:
"""Return model api url."""
return self.reverse_url(action, "api", uuid=self.uuid)
[docs]
def get_list_url(self) -> str:
"""Return model list url."""
return self.reverse_url("list")
[docs]
@classmethod
def reverse_url(cls, action: str, namespace: str = "", **kwargs) -> str:
"""Reverse an url for the provided action.
:param str action: name of the action (eg. detail, update);
:param str namespace: if provided insert namespace after application namespace;
:param **kwargs: passed down to reverse
:return reversed url as string.
"""
name = cls._meta.label_lower.replace(".", ":")
if namespace:
name = name.replace(":", namespace + ":")
if action:
name = f"{name}-{action}"
return reverse(name, **kwargs)