diff --git a/aleksis/apps/tezor/models/base.py b/aleksis/apps/tezor/models/base.py index e8feec9086097aa215fea9fdf5f865d7a3e51e9c..a7e9020105b8062a4933bf71f9a4e74543a74632 100644 --- a/aleksis/apps/tezor/models/base.py +++ b/aleksis/apps/tezor/models/base.py @@ -1,3 +1,5 @@ +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType from django.db import models from django.utils.translation import gettext_lazy as _ @@ -11,3 +13,23 @@ class Client(ExtensibleModel): constraints = [ models.UniqueConstraint(fields=["name", "site"], name="uniq_client_per_site") ] + + +class Subject(ExtensibleModel): + content_type = models.ForeignKey(ContetType, on_delete=models.SET_NULL) + object_id = models.PositiveIntegerField() + related = GenericForeignKey("content_type", "object_id") + + def get_address(self): + if hasattr(self.related, "get_address"): + return self.related.get_address() + elif hasattr(self.related, "addressing_name") and hasattr(self.related, "street") and hasattr(self.related, "housenumber") and hasattr(self.related, "postal_code") and hasattr(self.related, "place"): + # FIXME Use proper locale-based address generation + return f"{self.related.addressing_name}\n{self.related.street} {self.related.housenumber}\n{self.related.postal_code} {self.related.place}" + + @classmethod + def from_person(cls, person): + ct = ContentType.objects.get_for_model(person) + subject, created = cls.objects.get_or_create(content_type=ct, object_id=person) + + return subject diff --git a/aleksis/apps/tezor/models/invoice.py b/aleksis/apps/tezor/models/invoice.py index 4b4c6d0b73ddd1b0063c5c1840bea213744e5fe7..e18fb9a554bfd28f8faa7e371821f319a5bfcda3 100644 --- a/aleksis/apps/tezor/models/invoice.py +++ b/aleksis/apps/tezor/models/invoice.py @@ -5,7 +5,7 @@ from djmoney.models.fields import CurrencyField, MoneyField from aleksis.core.mixins import ExtensibleModel -from .base import Client +from .base import Client, Subject class InvoiceGroup(ExtensibleModel): @@ -27,6 +27,7 @@ class Invoice(ExtensibleModel): number = models.CharField(verbose_name=_("Invoice number")) date = models.DateField(verbose_name=_("Invoice date")) + recipient = models.ForeignKey(Subject, verbose_name=_("Recipient"), on_delete=models.SET_NULL) @property def currency(self):