Files
fet2020/fet2020/rental/models.py
2025-07-16 19:21:47 +02:00

110 lines
3.5 KiB
Python

from django.core.validators import FileExtensionValidator
from django.db import models
from django.forms import ValidationError
from .mails import send_mail_approved, send_mail_rejected
from .validators import PhoneNumberValidator
class RentalItem(models.Model):
name = models.CharField(verbose_name="Name", max_length=128)
description = models.CharField(
verbose_name="Beschreibung", max_length=128, blank=True, default=""
)
deposit = models.DecimalField(
verbose_name="Kaution (EUR)", max_digits=6, decimal_places=2, default=0
)
image = models.ImageField(verbose_name="Bild", upload_to="rentalitems", blank=True, null=True)
induction = models.BooleanField(verbose_name="Einschulung notwendig", default=False)
location = models.CharField(verbose_name="Standort", max_length=128, blank=True, default="")
class Meta:
verbose_name = "Verleihgegenstand"
verbose_name_plural = "Verleihgegenstände"
def __str__(self):
return self.name
class Rental(models.Model):
firstname = models.CharField(max_length=128, verbose_name="Vorname")
surname = models.CharField(max_length=128, verbose_name="Nachname")
matriculation_number = models.CharField(verbose_name="Matrikelnummer", max_length=8)
email = models.EmailField(verbose_name="E-Mail")
phone = models.CharField(
verbose_name="Telefonnummer", max_length=32, validators=[PhoneNumberValidator()]
)
organization = models.CharField(verbose_name="Organisation", max_length=128)
date_start = models.DateField(verbose_name="Abholdatum")
date_end = models.DateField(verbose_name="Rückgabedatum")
reason = models.TextField(verbose_name="Grund der Ausleihe", max_length=500)
comment = models.TextField(verbose_name="Kommentar", max_length=500, blank=True, default="")
file_field = models.FileField(
upload_to="uploads/rental/rental/",
validators=[FileExtensionValidator(["pdf"])],
blank=True,
null=True,
verbose_name="Verleihformular",
)
class Status(models.TextChoices):
SUBMITTED = "S", "Eingereicht"
APPROVED = "A", "Verleih genehmigt"
REJECTED = "J", "Verleih abgelehnt"
ISSUED = "I", "Verleihgegenstände ausgegeben"
RETURNED = "R", "Verleihgegenstände zurückgegeben"
status = models.CharField(
verbose_name="Status",
max_length=1,
choices=Status.choices,
default=Status.SUBMITTED,
)
rentalitems = models.ManyToManyField(
RentalItem,
verbose_name="Verleihgegenstände",
)
class Meta:
verbose_name = "Verleih"
verbose_name_plural = "Verleih"
def __str__(self):
return f"Verleih #{self.id}: {self.firstname} {self.surname}"
def save(self, *args, **kwargs):
pre_obj = Rental.objects.filter(pk=self.pk).first()
super().save(*args, **kwargs)
if (
pre_obj
and pre_obj.status != self.Status.APPROVED
and self.status == self.Status.APPROVED
):
send_mail_approved(self)
elif (
pre_obj
and pre_obj.status != self.Status.REJECTED
and self.status == self.Status.REJECTED
):
send_mail_rejected(self)
def clean(self):
if not self.date_end:
self.date_end = self.date_start
if self.date_start > self.date_end:
raise ValidationError("Das Abholdatum muss vor dem Rückgabedatum liegen.")