Skip to content
Snippets Groups Projects
Verified Commit de95a459 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Add models for Absence and AbsenceReason

parent 6e0ecdcf
No related branches found
No related tags found
1 merge request!1Create models
...@@ -10,6 +10,4 @@ class DefaultConfig(AppConfig): ...@@ -10,6 +10,4 @@ class DefaultConfig(AppConfig):
"Repository": "https://edugit.org/AlekSIS/onboarding//AlekSIS-App-Kolego", "Repository": "https://edugit.org/AlekSIS/onboarding//AlekSIS-App-Kolego",
} }
licence = "EUPL-1.2+" licence = "EUPL-1.2+"
copyright_info = ( copyright_info = (([2023], "Jonathan Weth", "dev@jonathanweth.de"),)
([2023], "Jonathan Weth", "dev@jonathanweth.de"),
)
from django.db import models
from aleksis.core.managers import DateRangeQuerySetMixin
from aleksis.core.models import Person
class AbsenceQuerySet(DateRangeQuerySetMixin, models.QuerySet):
"""QuerySet with custom query methods for absences."""
def absent_persons(self):
return Person.objects.filter(absences__in=self).distinct().order_by("short_name")
# Generated by Django 4.1.9 on 2023-05-28 10:43
import django.contrib.sites.managers
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
("sites", "0002_alter_domain_unique"),
("core", "0049_alter_activity_site_alter_additionalfield_site_and_more"),
]
operations = [
migrations.CreateModel(
name="AbsenceReason",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("extended_data", models.JSONField(default=dict, editable=False)),
("short_name", models.CharField(max_length=255, verbose_name="Short name")),
(
"name",
models.CharField(blank=True, max_length=255, null=True, verbose_name="Name"),
),
(
"site",
models.ForeignKey(
default=1,
editable=False,
on_delete=django.db.models.deletion.CASCADE,
related_name="+",
to="sites.site",
),
),
],
options={
"verbose_name": "Absence reason",
"verbose_name_plural": "Absence reasons",
},
managers=[
("objects", django.contrib.sites.managers.CurrentSiteManager()),
],
),
migrations.CreateModel(
name="Absence",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("extended_data", models.JSONField(default=dict, editable=False)),
("date_start", models.DateField(verbose_name="Start date")),
("date_end", models.DateField(verbose_name="End date")),
("time_start", models.TimeField(blank=True, null=True, verbose_name="Start time")),
("time_end", models.TimeField(blank=True, null=True, verbose_name="End time")),
("comment", models.TextField(blank=True, verbose_name="Comment")),
(
"person",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="absences",
to="core.person",
verbose_name="Person",
),
),
(
"reason",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="absences",
to="kolego.absencereason",
verbose_name="Absence reason",
),
),
(
"site",
models.ForeignKey(
default=1,
editable=False,
on_delete=django.db.models.deletion.CASCADE,
related_name="+",
to="sites.site",
),
),
],
options={
"verbose_name": "Absence",
"verbose_name_plural": "Absences",
"ordering": ["date_start"],
},
),
migrations.AddConstraint(
model_name="absencereason",
constraint=models.UniqueConstraint(
fields=("site_id", "short_name"),
name="kolego_unique_short_name_per_site_absence_reason",
),
),
migrations.AddIndex(
model_name="absence",
index=models.Index(
fields=["date_start", "date_end"], name="kolego_abse_date_st_846150_idx"
),
),
]
from .absence import Absence, AbsenceReason
from django.db import models
from django.utils.translation import gettext_lazy as _
from aleksis.core.managers import CurrentSiteManagerWithoutMigrations
from aleksis.core.mixins import ExtensibleModel
from ..managers import AbsenceQuerySet
class AbsenceReason(ExtensibleModel):
short_name = models.CharField(verbose_name=_("Short name"), max_length=255)
name = models.CharField(verbose_name=_("Name"), blank=True, null=True, max_length=255)
def __str__(self):
if self.name:
return f"{self.short_name} ({self.name})"
else:
return self.short_name
class Meta:
verbose_name = _("Absence reason")
verbose_name_plural = _("Absence reasons")
constraints = [
models.UniqueConstraint(
fields=["site_id", "short_name"],
name="kolego_unique_short_name_per_site_absence_reason",
),
]
class Absence(ExtensibleModel):
objects = CurrentSiteManagerWithoutMigrations.from_queryset(AbsenceQuerySet)()
reason = models.ForeignKey(
"AbsenceReason",
on_delete=models.SET_NULL,
related_name="absences",
blank=True,
null=True,
verbose_name=_("Absence reason"),
)
person = models.ForeignKey(
"core.Person",
on_delete=models.CASCADE,
related_name="kolego_absences",
verbose_name=_("Person"),
)
date_start = models.DateField(verbose_name=_("Start date"))
date_end = models.DateField(verbose_name=_("End date"))
time_start = models.TimeField(verbose_name=_("Start time"), blank=True, null=True)
time_end = models.TimeField(verbose_name=_("End time"), blank=True, null=True)
comment = models.TextField(verbose_name=_("Comment"), blank=True)
def __str__(self):
return f"{self.person} ({self.date_start} - {self.date_end})"
class Meta:
ordering = ["date_start"]
indexes = [models.Index(fields=["date_start", "date_end"])]
verbose_name = _("Absence")
verbose_name_plural = _("Absences")
...@@ -7,4 +7,4 @@ class Query(graphene.ObjectType): ...@@ -7,4 +7,4 @@ class Query(graphene.ObjectType):
app_name = graphene.String() app_name = graphene.String()
def resolve_app_name(root, info, **kwargs) -> str: def resolve_app_name(root, info, **kwargs) -> str:
return apps.get_app_config("kolego").verbose_name return apps.get_app_config("kolego").verbose_name
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment