Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion arbeitsplan/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class AufgabeAdmin(admin.ModelAdmin):

class MeldungAdmin(admin.ModelAdmin):
date_hierachy = 'erstellt'
list_display = 'melder', 'aufgabe', 'prefMitglied', 'prefVorstand'
list_display = 'melder', 'aufgabe', 'prefMitglied'
# list_filter = ('melder', 'aufgabe')
list_filter = ('aufgabe__gruppe__gruppe', )
search_fields = ('melder__last_name', 'melder__first_name', 'aufgabe__aufgabe')
Expand Down
48 changes: 14 additions & 34 deletions arbeitsplan/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
def __init__(self, *args, **kwargs):
try:
user = kwargs.pop('user')
except:

Check failure on line 41 in arbeitsplan/forms.py

View workflow job for this annotation

GitHub Actions / test

Ruff (E722)

arbeitsplan/forms.py:41:9: E722 Do not use bare `except`
user = None

super(CreateLeistungForm, self).__init__(*args, **kwargs)
Expand Down Expand Up @@ -147,7 +147,7 @@
if 'uhrzeit' == k[:7] and v != '0':
try:
v = int(v)
except:

Check failure on line 150 in arbeitsplan/forms.py

View workflow job for this annotation

GitHub Actions / test

Ruff (E722)

arbeitsplan/forms.py:150:17: E722 Do not use bare `except`
v = 0
if v < 0:
raise ValidationError("Keine negativen Personen im Stundenplan",
Expand Down Expand Up @@ -243,7 +243,7 @@
layoutattributes = self.get_mixin_attributes('layout')

self.helper.layout = Layout()
for l in layoutattributes:

Check failure on line 246 in arbeitsplan/forms.py

View workflow job for this annotation

GitHub Actions / test

Ruff (E741)

arbeitsplan/forms.py:246:13: E741 Ambiguous variable name: `l`
self.helper.layout = Layout(self.helper.layout,
l)

Expand Down Expand Up @@ -294,45 +294,25 @@
pass


class PraeferenzFilterForm (CrispyFilterMixin, forms.Form):

praeferenz = forms.MultipleChoiceField(choices=models.Meldung.Preferences.choices,
widget=forms.CheckboxSelectMultiple,
label="Vorliebe Mitglied",
required=False,
initial=[models.Meldung.Preferences.RELUCTANTLY,
models.Meldung.Preferences.OK,
models.Meldung.Preferences.GLADLY,
],
)
__layout = Layout(
HTML('<br>'),
InlineCheckboxes('praeferenz'),
)


class PraeferenzVorstandFilterForm (CrispyFilterMixin, forms.Form):

praeferenzVorstand = forms.MultipleChoiceField(choices=models.Meldung.Preferences.choices,
widget=forms.CheckboxSelectMultiple,
label="Vorliebe Vorstand",
required=False,
initial=[models.Meldung.Preferences.NEVER,
models.Meldung.Preferences.RELUCTANTLY,
models.Meldung.Preferences.OK,
models.Meldung.Preferences.GLADLY,
],
)
class PraeferenzFilterForm(CrispyFilterMixin, forms.Form):
praeferenz = forms.MultipleChoiceField(
choices=models.Meldung.Preferences.choices,
widget=forms.CheckboxSelectMultiple,
label="Vorliebe Mitglied",
required=False,
initial=[
models.Meldung.Preferences.YES,
],
)
__layout = Layout(
HTML('<br>'),
InlineCheckboxes('praeferenzVorstand'),
)
HTML("<br>"),
InlineCheckboxes("praeferenz"),
)


class PersonAufgGrpPraefernzFilterForm (NameFilterForm,
class PersonAufgGrpPraeferenzFilterForm (NameFilterForm,
AufgabengruppeFilterForm,
PraeferenzFilterForm,
PraeferenzVorstandFilterForm,
forms.Form):
pass

Expand Down
23 changes: 23 additions & 0 deletions arbeitsplan/migrations/0024_alter_meldung_prefmitglied_and_more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.2.19 on 2026-01-09 20:28

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('arbeitsplan', '0023_remove_aufgabe_teamleader'),
]

operations = [
migrations.AlterField(
model_name='meldung',
name='prefMitglied',
field=models.IntegerField(choices=[(-1, 'Nein'), (1, 'Ja')], default=-1, help_text='Welche Präferenz hast du für diese Aufgabe?', verbose_name='Präferenz'),
),
migrations.AlterField(
model_name='meldung',
name='prefVorstand',
field=models.IntegerField(choices=[(-1, 'Nein'), (1, 'Ja')], default=1, help_text='Traust du diesem Mitglied die Aufgabe zu?'),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 4.2.19 on 2026-01-09 22:00

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('arbeitsplan', '0024_alter_meldung_prefmitglied_and_more'),
]

operations = [
migrations.RemoveField(
model_name='meldung',
name='bemerkungVorstand',
),
migrations.RemoveField(
model_name='meldung',
name='prefVorstand',
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 4.2.19 on 2026-01-10 12:08

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('arbeitsplan', '0025_remove_meldung_bemerkungvorstand_and_more'),
]

operations = [
migrations.AddConstraint(
model_name='meldung',
constraint=models.UniqueConstraint(fields=('aufgabe', 'melder'), name='unique_aufgabe_melder'),
),
migrations.AddConstraint(
model_name='stundenzuteilung',
constraint=models.UniqueConstraint(fields=('uhrzeit', 'zuteilung'), name='unique_uhrzeit_zuteilung'),
),
migrations.AddConstraint(
model_name='zuteilung',
constraint=models.UniqueConstraint(fields=('aufgabe', 'ausfuehrer'), name='unique_aufgabe_ausfuehrer'),
),
]
61 changes: 35 additions & 26 deletions arbeitsplan/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,13 +150,13 @@ def __str__(self):

def gemeldeteAnzahlAufgaben(self):
return self.user.meldung_set.exclude(
prefMitglied=Meldung.Preferences.NEVER
prefMitglied=Meldung.Preferences.NO
).count()

def gemeldeteStunden(self):
"""Compute hours for which the Mitglied has entered a Meldung."""
echteMeldungen = self.user.meldung_set.exclude(
prefMitglied=Meldung.Preferences.NEVER
prefMitglied=Meldung.Preferences.NO
)
return sum([m.aufgabe.stunden for m in echteMeldungen])

Expand Down Expand Up @@ -292,10 +292,10 @@ class Aufgabe(models.Model):
bemerkung = models.TextField(blank=True)

def numMeldungen(self):
"""How many Meldungen of status better than NEVER
"""How many Meldungen of status better than NO
exist for this Aufgabe?
"""
return self.meldung_set.exclude(prefMitglied=Meldung.Preferences.NEVER).count()
return self.meldung_set.exclude(prefMitglied=Meldung.Preferences.NO).count()

def has_Stundenplan(self):
"""Is there a Stundenplan for this Aufgabe?"""
Expand Down Expand Up @@ -356,25 +356,16 @@ class Meta:

class Meldung(models.Model):
class Preferences(models.IntegerChoices):
NEVER = -1, "Nein"
RELUCTANTLY = 0, "Wenn es sein muss"
OK = 1, "Ok"
GLADLY = 2, "Gerne!"
NO = -1, "Nein"
YES = 1, "Ja"

PREFERENCES_STRING = "; ".join(
[f"{value}: {label}" for (value, label) in Preferences.choices]
)
PREFERENCES_BUTTONS = {
Preferences.NEVER: "btn-outline-secondary",
Preferences.RELUCTANTLY: "btn-outline-secondary",
Preferences.OK: "btn-outline-secondary",
Preferences.GLADLY: "btn-outline-secondary",
Preferences.NO: "btn-outline-secondary",
Preferences.YES: "btn-outline-secondary",
}
MODELDEFAULTS = {
"prefMitglied": Preferences.NEVER,
"prefVorstand": Preferences.OK,
"prefMitglied": Preferences.NO,
"bemerkung": "",
"bemerkungVorstand": "",
}

erstellt = models.DateField(auto_now_add=True)
Expand All @@ -388,17 +379,11 @@ class Preferences(models.IntegerChoices):

prefMitglied = models.IntegerField(
choices=Preferences.choices,
default=Preferences.OK,
default=Preferences.NO,
verbose_name="Präferenz",
help_text="Haben Sie Vorlieben für diese Aufgabe?",
)
prefVorstand = models.IntegerField(
choices=Preferences.choices,
default=Preferences.OK,
help_text="Trauen Sie diesem Mitglied die Aufgabe zu?",
help_text="Welche Präferenz hast du für diese Aufgabe?",
)
bemerkung = models.TextField(blank=True)
bemerkungVorstand = models.TextField(blank=True)

def __str__(self):
return (
Expand All @@ -410,6 +395,14 @@ def __str__(self):
)

class Meta:
constraints = [
# Enforce uniqueness to ensure get_or_create works as intended, see
# https://docs.djangoproject.com/en/5.2/ref/models/querysets/#get-or-create
models.UniqueConstraint(
fields=["aufgabe", "melder"],
name="unique_aufgabe_melder"
)
]
verbose_name_plural = "Meldungen"
verbose_name = "Meldung"

Expand Down Expand Up @@ -484,6 +477,14 @@ def stundenString(self):
return r

class Meta:
constraints = [
# Enforce uniqueness to ensure get_or_create works as intended, see
# https://docs.djangoproject.com/en/5.2/ref/models/querysets/#get-or-create
models.UniqueConstraint(
fields=["aufgabe", "ausfuehrer"],
name="unique_aufgabe_ausfuehrer"
)
]
verbose_name_plural = "Zuteilungen"
verbose_name = "Zuteilung"

Expand All @@ -504,6 +505,14 @@ def delete(self, *args, **kwargs):
super(StundenZuteilung, self).delete(*args, **kwargs)

class Meta:
constraints = [
# Enforce uniqueness to ensure get_or_create works as intended, see
# https://docs.djangoproject.com/en/5.2/ref/models/querysets/#get-or-create
models.UniqueConstraint(
fields=["uhrzeit", "zuteilung"],
name="unique_uhrzeit_zuteilung"
)
]
verbose_name = "Zuteilung einer Stunde"
verbose_name_plural = "Zuteilungen für einzelne Stunden"

Expand Down
Loading