nummi/nummi/transaction/models.py

105 lines
3.2 KiB
Python

import datetime
from pathlib import Path
from uuid import uuid4
from category.models import Category
from django.core.validators import FileExtensionValidator
from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from main.models import UserModel
from media.utils import get_path
from statement.models import Statement
class Transaction(UserModel):
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
name = models.CharField(
max_length=256, default=_("Transaction"), verbose_name=_("Name")
)
description = models.TextField(null=True, blank=True, verbose_name=_("Description"))
value = models.DecimalField(
max_digits=12, decimal_places=2, default=0, verbose_name=_("Value")
)
date = models.DateField(default=datetime.date.today, verbose_name=_("Date"))
real_date = models.DateField(blank=True, null=True, verbose_name=_("Real date"))
trader = models.CharField(
max_length=128, blank=True, null=True, verbose_name=_("Trader")
)
payment = models.CharField(
max_length=128, blank=True, null=True, verbose_name=_("Payment")
)
category = models.ForeignKey(
Category,
on_delete=models.SET_NULL,
blank=True,
null=True,
verbose_name=_("Category"),
)
statement = models.ForeignKey(
Statement,
on_delete=models.CASCADE,
blank=True,
null=True,
verbose_name=_("Statement"),
)
def __str__(self):
return f"{self.name}"
def get_absolute_url(self):
return reverse("transaction", args=(self.pk,))
def get_delete_url(self):
return reverse("del_transaction", args=(self.pk,))
@property
def account(self):
if self.statement:
return self.statement.account
class Meta:
ordering = ["-date", "statement"]
verbose_name = _("Transaction")
verbose_name_plural = _("Transactions")
class Invoice(UserModel):
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
name = models.CharField(
max_length=256, default=_("Invoice"), verbose_name=_("Name")
)
file = models.FileField(
upload_to=get_path,
validators=[FileExtensionValidator(["pdf"])],
verbose_name=_("File"),
max_length=128,
)
transaction = models.ForeignKey(
Transaction, on_delete=models.CASCADE, editable=False
)
def save(self, *args, **kwargs):
if Invoice.objects.filter(id=self.id).exists():
_prever = Invoice.objects.get(id=self.id)
if _prever.file and _prever.file != self.file:
Path(_prever.file.path).unlink(missing_ok=True)
super().save(*args, **kwargs)
def __str__(self):
return str(self.name)
def delete(self, *args, **kwargs):
self.file.delete()
super().delete(*args, **kwargs)
def get_absolute_url(self):
return reverse("invoice", args=(self.transaction.pk, self.pk))
def get_delete_url(self):
return reverse("del_invoice", args=(self.transaction.pk, self.pk))
class Meta:
verbose_name = _("Invoice")
verbose_name_plural = _("Invoices")
ordering = ["transaction", "name"]