snapshot: modularize integrations and builder order flows
This commit is contained in:
@@ -1,7 +1,12 @@
|
||||
import json
|
||||
import re
|
||||
|
||||
from django.contrib import messages
|
||||
from django.db import IntegrityError
|
||||
from django.http import JsonResponse
|
||||
from django.shortcuts import redirect, render
|
||||
from django.utils.translation import get_language, gettext as _
|
||||
|
||||
from .forms import OffboardingRequestForm, OnboardingRequestForm
|
||||
from .form_builder import (
|
||||
DEFAULT_FIELD_ORDER,
|
||||
@@ -27,7 +32,6 @@ from .models import (
|
||||
FormOption,
|
||||
)
|
||||
from .roles import ROLE_PLATFORM_OWNER, get_user_role_key
|
||||
import re
|
||||
|
||||
|
||||
def form_builder_page_impl(
|
||||
@@ -482,6 +486,7 @@ def form_builder_page_impl(
|
||||
if form_type == 'onboarding'
|
||||
else OffboardingRequestForm.base_fields.keys()
|
||||
)
|
||||
|
||||
for name in existing_names:
|
||||
if name not in default_names:
|
||||
default_names.append(name)
|
||||
@@ -891,3 +896,73 @@ def form_builder_page_impl(
|
||||
'can_override_locked_builder_rules': can_override_locked_builder_rules,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def form_builder_save_order_impl(request, *, audit_fn):
|
||||
try:
|
||||
payload = json.loads(request.body.decode('utf-8'))
|
||||
except (json.JSONDecodeError, UnicodeDecodeError):
|
||||
return JsonResponse({'ok': False, 'error': _('Ungültige JSON-Daten.')}, status=400)
|
||||
|
||||
form_type = payload.get('form_type')
|
||||
if form_type not in DEFAULT_FIELD_ORDER:
|
||||
return JsonResponse({'ok': False, 'error': _('Ungültiger Formulartyp.')}, status=400)
|
||||
default_page_map = get_default_page_map(form_type)
|
||||
|
||||
columns = payload.get('columns')
|
||||
if not isinstance(columns, dict):
|
||||
return JsonResponse({'ok': False, 'error': _('Spalten-Daten fehlen.')}, status=400)
|
||||
|
||||
configs = list(FormFieldConfig.objects.filter(form_type=form_type).order_by('sort_order', 'field_name'))
|
||||
custom_configs = list(FormCustomFieldConfig.objects.filter(form_type=form_type).order_by('sort_order', 'field_key'))
|
||||
allowed_names = {cfg.field_name for cfg in configs} | {f'custom__{cfg.field_key}' for cfg in custom_configs}
|
||||
seen = set()
|
||||
|
||||
allowed_columns = get_section_order(form_type)
|
||||
fallback_section = allowed_columns[-1] if allowed_columns else ''
|
||||
|
||||
name_to_cfg = {cfg.field_name: cfg for cfg in configs}
|
||||
custom_name_to_cfg = {f'custom__{cfg.field_key}': cfg for cfg in custom_configs}
|
||||
sort_order = 0
|
||||
|
||||
for column_key in allowed_columns:
|
||||
names = columns.get(column_key, [])
|
||||
if not isinstance(names, list):
|
||||
return JsonResponse({'ok': False, 'error': _('Ungültige Spalte: %(column)s') % {'column': column_key}}, status=400)
|
||||
|
||||
for name in names:
|
||||
if not isinstance(name, str):
|
||||
continue
|
||||
if name not in allowed_names or name in seen:
|
||||
continue
|
||||
seen.add(name)
|
||||
if name in name_to_cfg:
|
||||
cfg = name_to_cfg[name]
|
||||
cfg.sort_order = sort_order
|
||||
cfg.page_key = column_key
|
||||
else:
|
||||
cfg = custom_name_to_cfg[name]
|
||||
cfg.sort_order = sort_order
|
||||
cfg.section_key = column_key
|
||||
sort_order += 1
|
||||
|
||||
missing = [cfg.field_name for cfg in configs if cfg.field_name not in seen]
|
||||
for name in missing:
|
||||
cfg = name_to_cfg[name]
|
||||
cfg.sort_order = sort_order
|
||||
sort_order += 1
|
||||
cfg.page_key = cfg.page_key or default_page_map.get(name, fallback_section)
|
||||
|
||||
missing_custom = [name for name in custom_name_to_cfg.keys() if name not in seen]
|
||||
for name in missing_custom:
|
||||
cfg = custom_name_to_cfg[name]
|
||||
cfg.sort_order = sort_order
|
||||
sort_order += 1
|
||||
cfg.section_key = cfg.section_key or fallback_section
|
||||
|
||||
FormFieldConfig.objects.bulk_update(configs, ['sort_order', 'page_key'])
|
||||
if custom_configs:
|
||||
FormCustomFieldConfig.objects.bulk_update(custom_configs, ['sort_order', 'section_key'])
|
||||
saved_count = len(configs) + len(custom_configs)
|
||||
audit_fn(request, 'form_layout_saved', target_type='form_config', target_label=form_type, details={'saved_count': saved_count})
|
||||
return JsonResponse({'ok': True, 'saved_count': saved_count})
|
||||
|
||||
Reference in New Issue
Block a user