From 3761ffd6a9db3e22befa9ea7af48a6e658303fd1 Mon Sep 17 00:00:00 2001 From: relikd Date: Tue, 6 Jun 2023 01:14:15 +0200 Subject: [PATCH] feat: add types for model fields --- app/base/models/account.py | 11 ++++++++--- app/base/models/booking.py | 15 ++++++++------- app/base/models/booking_type.py | 2 +- app/base/models/course.py | 12 +++++++++--- app/base/models/course_visit.py | 14 +++++++------- app/base/models/note.py | 9 +++++++-- app/base/models/person.py | 13 +++++++------ app/base/models/trait.py | 3 ++- app/base/models/trait_mapping.py | 9 +++++---- app/base/models/transaction.py | 27 ++++++++++++++++++--------- 10 files changed, 72 insertions(+), 43 deletions(-) diff --git a/app/base/models/account.py b/app/base/models/account.py index 7107ed6..e1998bb 100755 --- a/app/base/models/account.py +++ b/app/base/models/account.py @@ -1,12 +1,17 @@ from django.db import models from app.base.forms.fields import CurrencyField -from app.base.models.person import Person + +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from decimal import Decimal + from app.base.models.person import Person class Account(models.Model): - user = models.OneToOneField(Person, on_delete=models.CASCADE) - balance = CurrencyField('Guthaben') + user: 'models.OneToOneField[Person]' = models.OneToOneField( + 'Person', on_delete=models.CASCADE) + balance: 'models.DecimalField[Decimal]' = CurrencyField('Guthaben') locked = models.BooleanField('Gesperrt', default=False) class Meta: diff --git a/app/base/models/booking.py b/app/base/models/booking.py index af345f6..35740a1 100755 --- a/app/base/models/booking.py +++ b/app/base/models/booking.py @@ -6,13 +6,11 @@ from django.urls import reverse from app.base.forms.fields import DateTimeField, TextField from app.base.forms.utils import datetime_now -from datetime import datetime from typing import TYPE_CHECKING if TYPE_CHECKING: from django.db.models import OuterRef - from app.base.models.person import Person - from app.base.models.booking_type import BookingType - from datetime import timedelta # noqa F401 + from app.base.models import Person, BookingType + from datetime import datetime, timedelta # noqa F401 class Booking(models.Model): @@ -20,9 +18,12 @@ class Booking(models.Model): 'BookingType', on_delete=models.PROTECT, verbose_name='Art') user: 'models.ForeignKey[Person]' = models.ForeignKey( 'Person', on_delete=models.CASCADE, verbose_name='Nutzer:in') - begin_time = DateTimeField('Beginn', default=datetime_now) - end_time = DateTimeField('Ende', blank=True, null=True) - comment = TextField('Kommentar', blank=True) + begin_time: 'models.DateTimeField[datetime]' = DateTimeField( + 'Beginn', default=datetime_now) + end_time: 'models.DateTimeField[datetime|None]' = DateTimeField( + 'Ende', blank=True, null=True) + comment: 'models.TextField[str]' = TextField( + 'Kommentar', blank=True) class Meta: verbose_name = 'Buchung' diff --git a/app/base/models/booking_type.py b/app/base/models/booking_type.py index 1b51fa3..77f4ce0 100755 --- a/app/base/models/booking_type.py +++ b/app/base/models/booking_type.py @@ -10,7 +10,7 @@ from typing import Iterable class BookingType(models.Model): key = models.CharField('UUID', primary_key=True, max_length=20) label = models.CharField('Bezeichnung', max_length=200) - price = CurrencyField('Preis (€)') + price: 'models.DecimalField[Decimal]' = CurrencyField('Preis (€)') interval = models.IntegerField('Intervall (Min)', default=60) is_checkin = models.BooleanField('Ist Eincheck-Option', default=False) diff --git a/app/base/models/course.py b/app/base/models/course.py index f869f0b..7e72a82 100755 --- a/app/base/models/course.py +++ b/app/base/models/course.py @@ -2,14 +2,20 @@ from django.db import models from django.urls import reverse from app.base.forms.fields import TextField -from app.base.models.course_visit import CourseVisit + +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from app.base.models import CourseVisit class Course(models.Model): - instructed: models.QuerySet[CourseVisit] title = models.CharField('Titel', max_length=280) mandatory = models.BooleanField('Braucht jeder?', default=False) - description = TextField('Beschreibung', blank=True) + description: 'models.TextField[str]' = TextField( + 'Beschreibung', blank=True) + + # related_name + instructed: 'models.QuerySet[CourseVisit]' class Meta: verbose_name = 'Einweisung' diff --git a/app/base/models/course_visit.py b/app/base/models/course_visit.py index 37ef5c4..0648a6e 100755 --- a/app/base/models/course_visit.py +++ b/app/base/models/course_visit.py @@ -6,22 +6,22 @@ from app.base.forms.fields import DateField from datetime import date from typing import TYPE_CHECKING if TYPE_CHECKING: - from app.base.models.course import Course - from app.base.models.person import Person + from app.base.models import Course, Person class CourseVisit(models.Model): course: 'models.ForeignKey[Course]' = models.ForeignKey( - 'Course', on_delete=models.CASCADE, - related_name='visits', verbose_name='Einweisung') + 'Course', on_delete=models.CASCADE, related_name='visits', + verbose_name='Einweisung') participant: 'models.ForeignKey[Person]' = models.ForeignKey( - 'Person', on_delete=models.CASCADE, - related_name='courses', verbose_name='Wer wurde eingewiesen?') + 'Person', on_delete=models.CASCADE, related_name='courses', + verbose_name='Wer wurde eingewiesen?') teacher: 'models.ForeignKey[Person]|models.ForeignKey[None]' =\ models.ForeignKey( 'Person', on_delete=models.SET_NULL, blank=True, null=True, related_name='instructed', verbose_name='Durchgeführt von') - date = DateField('Datum', default=date.today) + date: 'models.DateField[date]' = DateField( + 'Datum', default=date.today) class Meta: verbose_name = 'Teilnahme' diff --git a/app/base/models/note.py b/app/base/models/note.py index 89484fd..02626b3 100755 --- a/app/base/models/note.py +++ b/app/base/models/note.py @@ -2,10 +2,15 @@ from django.db import models from app.base.forms.fields import TextField +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from app.base.models import Person + class Note(models.Model): - user = models.OneToOneField('Person', on_delete=models.CASCADE) - text = TextField('Notiz', blank=True) + user: 'models.OneToOneField[Person]' = models.OneToOneField( + 'Person', on_delete=models.CASCADE) + text: 'models.TextField[str]' = TextField('Notiz', blank=True) class Meta: verbose_name = 'Notiz' diff --git a/app/base/models/person.py b/app/base/models/person.py index 38a3803..ded41d5 100755 --- a/app/base/models/person.py +++ b/app/base/models/person.py @@ -17,15 +17,16 @@ class Person(models.Model): first_name = models.CharField('Vorname', max_length=200) last_name = models.CharField('Nachname', max_length=200) - email = models.EmailField('Email', blank=True, null=True) - phone = models.CharField('Telefon', max_length=200, blank=True, null=True) - birth_date = DateField('Geburtsdatum') - zip_code = models.CharField('PLZ', max_length=10) - city = models.CharField('Stadt', max_length=200) + birth_date: 'models.DateField[date]' = DateField('Geburtsdatum') street = models.CharField('Straße', max_length=200) house_nr = models.CharField('Hausnummer', max_length=10) + zip_code = models.CharField('PLZ', max_length=10) + city = models.CharField('Stadt', max_length=200) + email = models.EmailField('Email', blank=True, null=True) + phone = models.CharField('Telefon', max_length=200, blank=True, null=True) - identified = models.BooleanField('Ausweis vorgezeigt', default=False) + identified = models.BooleanField( + 'Ausweis vorgezeigt', default=False) agreed_to_terms_of_service = models.BooleanField( 'Nutzungsbedingungen zugestimmt', default=False) diff --git a/app/base/models/trait.py b/app/base/models/trait.py index aa2e7ea..21c7e55 100755 --- a/app/base/models/trait.py +++ b/app/base/models/trait.py @@ -6,7 +6,8 @@ from app.base.forms.fields import TextField class Trait(models.Model): key = models.CharField('UUID', primary_key=True, max_length=20) label = models.CharField('Label', max_length=200) - description = TextField('Beschreibung', blank=True) + description: 'models.TextField[str]' = TextField( + 'Beschreibung', blank=True) class Meta: verbose_name = 'Attribut' diff --git a/app/base/models/trait_mapping.py b/app/base/models/trait_mapping.py index 899b41f..c6662b1 100755 --- a/app/base/models/trait_mapping.py +++ b/app/base/models/trait_mapping.py @@ -6,8 +6,7 @@ from app.base.forms.fields import DateField from datetime import date from typing import TYPE_CHECKING if TYPE_CHECKING: - from app.base.models.person import Person - from app.base.models.trait import Trait + from app.base.models import Person, Trait class TraitMapping(models.Model): @@ -16,8 +15,10 @@ class TraitMapping(models.Model): verbose_name='Werkstattnutzer:in') trait: 'models.ForeignKey[Trait]' = models.ForeignKey( 'Trait', on_delete=models.CASCADE, verbose_name='Attribut') - valid_from = DateField('Gültig von', default=date.today) - valid_until = DateField('Gültig bis', blank=True, null=True) + valid_from: 'models.DateField[date]' = DateField( + 'Gültig von', default=date.today) + valid_until: 'models.DateField[date|None]' = DateField( + 'Gültig bis', blank=True, null=True) class Meta: verbose_name = 'Attributzuweisung' diff --git a/app/base/models/transaction.py b/app/base/models/transaction.py index c36805d..86e2262 100755 --- a/app/base/models/transaction.py +++ b/app/base/models/transaction.py @@ -3,18 +3,27 @@ from django.urls import reverse from app.base.forms.fields import CurrencyField, DateTimeField from app.base.forms.utils import datetime_now -from app.base.models.account import Account + +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from datetime import datetime + from decimal import Decimal + from app.base.models import Account, Booking class Transaction(models.Model): - account = models.ForeignKey(Account, on_delete=models.CASCADE, - verbose_name='Konto') - amount = CurrencyField('Betrag') - booking = models.OneToOneField('Booking', on_delete=models.CASCADE, - verbose_name='Zugehörige Zeitbuchung', - null=True, blank=True, default=None) - description = models.CharField('Beschreibung', max_length=500) - time_stamp = DateTimeField('Datum / Uhrzeit', editable=False) + account: 'models.ForeignKey[Account]' = models.ForeignKey( + 'Account', on_delete=models.CASCADE, verbose_name='Konto') + amount: 'models.DecimalField[Decimal]' = CurrencyField( + 'Betrag') + booking: 'models.OneToOneField[Booking]|models.OneToOneField[None]' = \ + models.OneToOneField('Booking', on_delete=models.CASCADE, + verbose_name='Zugehörige Zeitbuchung', + blank=True, null=True, default=None) + description = models.CharField( + 'Beschreibung', max_length=500) + time_stamp: 'models.DateTimeField[datetime]' = DateTimeField( + 'Datum / Uhrzeit', editable=False) class Meta: verbose_name = 'Transaktion'