snapshot: preserve custom field parity across forms timeline and pdf
This commit is contained in:
@@ -422,6 +422,7 @@ class OnboardingRequest(models.Model):
|
||||
verbose_name='Personalisierter Text für PDF',
|
||||
help_text='Optionaler individueller Textblock im Onboarding PDF.',
|
||||
)
|
||||
custom_field_values = models.JSONField(default=dict, blank=True)
|
||||
|
||||
generated_pdf_path = models.CharField(max_length=500, blank=True)
|
||||
intro_pdf_path = models.CharField(max_length=500, blank=True)
|
||||
@@ -566,6 +567,82 @@ class FormConditionalRuleConfig(models.Model):
|
||||
return f'{self.form_type}: {self.target_key}'
|
||||
|
||||
|
||||
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')),
|
||||
]
|
||||
SECTION_CHOICES = [
|
||||
('stammdaten', _('Stammdaten')),
|
||||
('vertrag', _('Vertrag')),
|
||||
('itsetup', _('IT-Setup')),
|
||||
('abschluss', _('Abschluss')),
|
||||
('mitarbeitende', _('Mitarbeitende')),
|
||||
('austritt', _('Austritt')),
|
||||
]
|
||||
|
||||
form_type = models.CharField(max_length=20, choices=FORM_CHOICES)
|
||||
field_key = models.SlugField(max_length=80)
|
||||
section_key = models.CharField(max_length=20, choices=SECTION_CHOICES)
|
||||
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
|
||||
|
||||
|
||||
class NotificationTemplate(models.Model):
|
||||
TEMPLATE_CHOICES = [
|
||||
('onboarding_it', _('Onboarding: IT')),
|
||||
@@ -844,6 +921,7 @@ class OffboardingRequest(models.Model):
|
||||
requested_by_name = models.CharField(max_length=255, blank=True, verbose_name='Name der anfordernden Person')
|
||||
preferred_language = models.CharField(max_length=10, blank=True, default='de', db_default='de')
|
||||
generated_pdf_path = models.CharField(max_length=500, blank=True)
|
||||
custom_field_values = models.JSONField(default=dict, blank=True)
|
||||
processing_status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='submitted')
|
||||
last_error = models.TextField(blank=True)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
Reference in New Issue
Block a user