203 lines
8.4 KiB
Python
203 lines
8.4 KiB
Python
from django.db import models
|
|
from django.utils.translation import get_language, gettext_lazy as _
|
|
|
|
|
|
class FormOption(models.Model):
|
|
CATEGORY_CHOICES = [
|
|
('department', _('Abteilung')),
|
|
('device', _('Geräte')),
|
|
('software', _('Software')),
|
|
('access', _('Zugänge')),
|
|
('workspace_group', _('Workspace-Gruppen')),
|
|
('resource', _('Ressourcen')),
|
|
('phone', _('Telefonnummern')),
|
|
]
|
|
|
|
category = models.CharField(max_length=40, choices=CATEGORY_CHOICES)
|
|
label = models.CharField(max_length=255)
|
|
label_en = models.CharField(max_length=255, blank=True)
|
|
value = models.CharField(max_length=255, blank=True)
|
|
sort_order = models.PositiveIntegerField(default=0)
|
|
is_active = models.BooleanField(default=True)
|
|
|
|
class Meta:
|
|
ordering = ['category', 'sort_order', 'label']
|
|
unique_together = ('category', 'label')
|
|
|
|
def __str__(self) -> str:
|
|
return f"{self.get_category_display()}: {self.label}"
|
|
|
|
def translated_label(self, language_code: str | None = None) -> str:
|
|
lang = (language_code or get_language() or 'de').split('-')[0]
|
|
if lang == 'en' and self.label_en.strip():
|
|
return self.label_en.strip()
|
|
return self.label.strip()
|
|
|
|
|
|
class FormFieldConfig(models.Model):
|
|
PAGE_CHOICES = [
|
|
('', _('Automatisch')),
|
|
('stammdaten', _('Stammdaten')),
|
|
('vertrag', _('Vertrag')),
|
|
('itsetup', _('IT-Setup')),
|
|
('abschluss', _('Abschluss')),
|
|
('mitarbeitende', _('Mitarbeitende')),
|
|
('austritt', _('Austritt')),
|
|
]
|
|
FORM_CHOICES = [('onboarding', _('Onboarding')), ('offboarding', _('Offboarding'))]
|
|
|
|
form_type = models.CharField(max_length=20, choices=FORM_CHOICES)
|
|
field_name = models.CharField(max_length=80)
|
|
sort_order = models.PositiveIntegerField(default=0)
|
|
is_visible = models.BooleanField(default=True)
|
|
is_required = models.BooleanField(null=True, blank=True, default=None)
|
|
page_key = models.CharField(max_length=80, blank=True, default='')
|
|
label_override = models.CharField(max_length=255, blank=True)
|
|
label_override_en = models.CharField(max_length=255, blank=True)
|
|
help_text_override = models.TextField(blank=True)
|
|
help_text_override_en = models.TextField(blank=True)
|
|
|
|
class Meta:
|
|
ordering = ['form_type', 'sort_order', 'field_name']
|
|
unique_together = ('form_type', 'field_name')
|
|
verbose_name = 'Formularfeld-Konfiguration'
|
|
verbose_name_plural = 'Formularfeld-Konfigurationen'
|
|
|
|
def __str__(self) -> str:
|
|
return f'{self.get_form_type_display()}: {self.field_name}'
|
|
|
|
def translated_label_override(self, language_code: str | None = None) -> str:
|
|
lang = (language_code or get_language() or 'de').split('-')[0]
|
|
if lang == 'en' and self.label_override_en.strip():
|
|
return self.label_override_en.strip()
|
|
return self.label_override.strip()
|
|
|
|
def translated_help_text_override(self, language_code: str | None = None) -> str:
|
|
lang = (language_code or get_language() or 'de').split('-')[0]
|
|
if lang == 'en' and self.help_text_override_en.strip():
|
|
return self.help_text_override_en.strip()
|
|
return self.help_text_override.strip()
|
|
|
|
|
|
class FormSectionConfig(models.Model):
|
|
FORM_CHOICES = [('onboarding', _('Onboarding')), ('offboarding', _('Offboarding'))]
|
|
form_type = models.CharField(max_length=20, choices=FORM_CHOICES)
|
|
section_key = models.CharField(max_length=80)
|
|
sort_order = models.PositiveIntegerField(default=0)
|
|
is_visible = models.BooleanField(default=True)
|
|
|
|
class Meta:
|
|
ordering = ['form_type', 'sort_order', 'section_key']
|
|
unique_together = ('form_type', 'section_key')
|
|
verbose_name = 'Formularabschnitt-Konfiguration'
|
|
verbose_name_plural = 'Formularabschnitt-Konfigurationen'
|
|
|
|
def __str__(self) -> str:
|
|
return f'{self.form_type}: {self.section_key}'
|
|
|
|
|
|
class FormConditionalRuleConfig(models.Model):
|
|
FORM_CHOICES = [('onboarding', _('Onboarding'))]
|
|
form_type = models.CharField(max_length=20, choices=FORM_CHOICES)
|
|
target_key = models.CharField(max_length=80)
|
|
clauses = models.JSONField(default=list, blank=True)
|
|
is_active = models.BooleanField(default=True)
|
|
|
|
class Meta:
|
|
ordering = ['form_type', 'target_key']
|
|
unique_together = ('form_type', 'target_key')
|
|
verbose_name = 'Formular-Bedingungsregel'
|
|
verbose_name_plural = 'Formular-Bedingungsregeln'
|
|
|
|
def __str__(self) -> str:
|
|
return f'{self.form_type}: {self.target_key}'
|
|
|
|
|
|
class FormCustomSectionConfig(models.Model):
|
|
FORM_CHOICES = [('onboarding', _('Onboarding'))]
|
|
form_type = models.CharField(max_length=20, choices=FORM_CHOICES)
|
|
section_key = models.SlugField(max_length=80)
|
|
sort_order = models.PositiveIntegerField(default=0)
|
|
title = models.CharField(max_length=255)
|
|
title_en = models.CharField(max_length=255, blank=True)
|
|
is_active = models.BooleanField(default=True)
|
|
|
|
class Meta:
|
|
ordering = ['form_type', 'sort_order', 'section_key']
|
|
unique_together = ('form_type', 'section_key')
|
|
verbose_name = 'Benutzerdefinierter Formularabschnitt'
|
|
verbose_name_plural = 'Benutzerdefinierte Formularabschnitte'
|
|
|
|
def __str__(self) -> str:
|
|
return f'{self.form_type}: {self.title}'
|
|
|
|
def translated_title(self, language_code: str | None = None) -> str:
|
|
lang = (language_code or get_language() or 'de').split('-')[0]
|
|
if lang == 'en' and self.title_en.strip():
|
|
return self.title_en.strip()
|
|
return self.title.strip()
|
|
|
|
|
|
class FormCustomFieldConfig(models.Model):
|
|
FIELD_TYPE_TEXT = 'text'
|
|
FIELD_TYPE_TEXTAREA = 'textarea'
|
|
FIELD_TYPE_SELECT = 'select'
|
|
FIELD_TYPE_CHECKBOX = 'checkbox'
|
|
FIELD_TYPE_CHOICES = [
|
|
(FIELD_TYPE_TEXT, _('Text')),
|
|
(FIELD_TYPE_TEXTAREA, _('Mehrzeilig')),
|
|
(FIELD_TYPE_SELECT, _('Auswahl')),
|
|
(FIELD_TYPE_CHECKBOX, _('Checkbox')),
|
|
]
|
|
FORM_CHOICES = [('onboarding', _('Onboarding')), ('offboarding', _('Offboarding'))]
|
|
form_type = models.CharField(max_length=20, choices=FORM_CHOICES)
|
|
field_key = models.SlugField(max_length=80)
|
|
section_key = models.CharField(max_length=80)
|
|
sort_order = models.PositiveIntegerField(default=0)
|
|
field_type = models.CharField(max_length=20, choices=FIELD_TYPE_CHOICES, default=FIELD_TYPE_TEXT)
|
|
is_active = models.BooleanField(default=True)
|
|
is_required = models.BooleanField(default=False)
|
|
label = models.CharField(max_length=255)
|
|
label_en = models.CharField(max_length=255, blank=True)
|
|
help_text = models.TextField(blank=True)
|
|
help_text_en = models.TextField(blank=True)
|
|
select_options = models.TextField(blank=True, help_text='Eine Option pro Zeile. Optional: wert|Label')
|
|
select_options_en = models.TextField(blank=True, help_text='Eine Option pro Zeile. Optional: value|Label')
|
|
|
|
class Meta:
|
|
ordering = ['form_type', 'section_key', 'sort_order', 'field_key']
|
|
unique_together = ('form_type', 'field_key')
|
|
verbose_name = 'Benutzerdefiniertes Formularfeld'
|
|
verbose_name_plural = 'Benutzerdefinierte Formularfelder'
|
|
|
|
def __str__(self) -> str:
|
|
return f'{self.form_type}: {self.label}'
|
|
|
|
def translated_label(self, language_code: str | None = None) -> str:
|
|
lang = (language_code or get_language() or 'de').split('-')[0]
|
|
if lang == 'en' and self.label_en.strip():
|
|
return self.label_en.strip()
|
|
return self.label.strip()
|
|
|
|
def translated_help_text(self, language_code: str | None = None) -> str:
|
|
lang = (language_code or get_language() or 'de').split('-')[0]
|
|
if lang == 'en' and self.help_text_en.strip():
|
|
return self.help_text_en.strip()
|
|
return self.help_text.strip()
|
|
|
|
def translated_select_options(self, language_code: str | None = None) -> list[tuple[str, str]]:
|
|
lang = (language_code or get_language() or 'de').split('-')[0]
|
|
raw = self.select_options_en if lang == 'en' and self.select_options_en.strip() else self.select_options
|
|
options = []
|
|
for line in (raw or '').splitlines():
|
|
line = line.strip()
|
|
if not line:
|
|
continue
|
|
if '|' in line:
|
|
value, label = [part.strip() for part in line.split('|', 1)]
|
|
else:
|
|
value = label = line
|
|
if value:
|
|
options.append((value, label or value))
|
|
return options
|