### Models
class base(models.Model):
created_by = models.ForeignKey(User, verbose_name=_("User"), on_delete=models.CASCADE, editable=False, null=True, blank=True)
created = models.DateTimeField(_("created date"), auto_now=False, auto_now_add=True, editable=False)
class Meta:
abstract = True
# Level 1 model
class Building(base):
name = models.CharField(_("Name"), max_length=50)
managers = models.ManyToManyField(User, verbose_name=_("Admins"), related_name='buildingmanagers')
class Meta:
verbose_name = _("building")
verbose_name_plural = _("buildings")
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse("building_detail", kwargs={"pk": self.pk})
# Level 2
# list should be on /buildings/<building_id>/properties
# Details could be on either
# /buildings/<building_id>/properties/<property_id>
# /properties/<property_id>
class Property(base):
name = models.CharField(_("Nombre de la propiedad"), max_length=50)
building = models.ForeignKey("core.Building", verbose_name=_("Edificio"), on_delete=models.CASCADE)
owner = models.CharField(_("Nombre propietario"), max_length=50, blank=True, null=True)
class Meta:
verbose_name = _("property")
verbose_name_plural = _("propertys")
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse("property_detail", kwargs={"pk": self.pk})
# Level 3
# list should be on
# /buildings/<building_id>/properties/<property_id>/invoices
# or /properties/<property_id>/invoices
# Details could be on either
# /buildings/<building_id>/properties/<property_id>/invoices/<property_invoice_id>
# /property_invoices/<property_invoice_id>
class PropertyInvoice(invoice_base):
prop = models.ForeignKey(Property, verbose_name=_("Property"), on_delete=models.CASCADE)
class Meta:
verbose_name = _("property invoice")
verbose_name_plural = _("property invoices")
def __str__(self):
return self.concept
def get_absolute_url(self):
return reverse("propertyinvoice_detail", kwargs={"pk": self.pk})
def get_building(self):
return self.prop.building
# Level 4
# list should be on
# /buildings/<building_id>/properties/<property_id>/invoices/<invoice_id>/payments
# or /property_invoices/<invoice_id>/payments
# Details could be on either
# /buildings/<building_id>/properties/<property_id>/invoices/<invoice_id>/payments/<payment_id>
# /property_payments/<payment_id>
class PropertyInvoicePayment(payment_base):
invoice = models.ForeignKey("core.PropertyInvoice", verbose_name=_("Related Invoice"), on_delete=models.CASCADE)
def get_building(self):
return self.invoice.prop.building