feat(aufgaben): Verknüpfungen, implizite Fälligkeit, Issue-Facade (WP-0015)
- Aufgabe.erstellt_am für implizite 7-Tage-Fälligkeit - frist_effektiv property; ist_ueberfaellig nutzt sie - AufgabenVerknuepfung (GenericForeignKey) mit HTMX-Panel - ExternalIssue (OneToOne) mit IssueAdapter-ABC und HTMX-Panel - link_registry.py und issue_facade.py als zentrale Registries - 8 neue Tests, 76 gesamt grün Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
a0c0ddf2eb
commit
816c281f6a
19 changed files with 713 additions and 19 deletions
27
vergabe_teilnahme/apps/aufgaben/link_registry.py
Normal file
27
vergabe_teilnahme/apps/aufgaben/link_registry.py
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
from django.contrib.contenttypes.models import ContentType
|
||||
|
||||
|
||||
_VERKNUEPFBARE_MODELLE = [
|
||||
('lose', 'Anforderung'),
|
||||
('lose', 'Los'),
|
||||
('aufgaben', 'Bieterfrage'),
|
||||
('dokumente', 'Dokument'),
|
||||
('preise', 'Preispunkt'),
|
||||
]
|
||||
|
||||
|
||||
def verknuepfbare_typen():
|
||||
"""Gibt eine geordnete Liste (ContentType, label) der verknüpfbaren Typen zurück."""
|
||||
result = []
|
||||
for app_label, model_name in _VERKNUEPFBARE_MODELLE:
|
||||
try:
|
||||
ct = ContentType.objects.get(app_label=app_label, model=model_name.lower())
|
||||
result.append((ct, f'{ct.app_label} / {model_name}'))
|
||||
except ContentType.DoesNotExist:
|
||||
pass
|
||||
return result
|
||||
|
||||
|
||||
def ziel_choices():
|
||||
"""Gibt (content_type_id, label)-Tupel für ein ChoiceField zurück."""
|
||||
return [(ct.pk, label) for ct, label in verknuepfbare_typen()]
|
||||
Loading…
Add table
Add a link
Reference in a new issue