135 lines
6.6 KiB
Python
135 lines
6.6 KiB
Python
from django.contrib import messages
|
|
from django.shortcuts import redirect, render
|
|
|
|
from .models import IntroChecklistItem
|
|
|
|
|
|
def intro_builder_page_impl(request, *, audit_fn, translate_choice_list):
|
|
if request.method == 'POST':
|
|
delete_id = (request.POST.get('delete_item_id') or '').strip()
|
|
if delete_id:
|
|
item = IntroChecklistItem.objects.filter(id=delete_id).first()
|
|
if item:
|
|
deleted_label = item.label
|
|
deleted_id_int = item.id
|
|
item.delete()
|
|
audit_fn(request, 'intro_checklist_item_deleted', target_type='intro_checklist_item', target_id=deleted_id_int, target_label=deleted_label)
|
|
messages.success(request, 'Checklistenpunkt wurde gelöscht.')
|
|
else:
|
|
messages.error(request, 'Checklistenpunkt nicht gefunden.')
|
|
return redirect('intro_builder_page')
|
|
|
|
action = (request.POST.get('builder_action') or '').strip()
|
|
if action == 'add_item':
|
|
section = (request.POST.get('section') or '').strip()
|
|
label = (request.POST.get('label') or '').strip()
|
|
label_en = (request.POST.get('label_en') or '').strip()
|
|
if section not in {k for k, _ in IntroChecklistItem.SECTION_CHOICES}:
|
|
messages.error(request, 'Ungültiger Abschnitt.')
|
|
return redirect('intro_builder_page')
|
|
if not label:
|
|
messages.error(request, 'Bitte eine Bezeichnung für den Checklistenpunkt angeben.')
|
|
return redirect('intro_builder_page')
|
|
next_sort = (
|
|
IntroChecklistItem.objects.filter(section=section).order_by('-sort_order').values_list('sort_order', flat=True).first()
|
|
)
|
|
IntroChecklistItem.objects.create(
|
|
section=section,
|
|
label=label,
|
|
label_en=label_en,
|
|
sort_order=(next_sort + 1) if next_sort is not None else 0,
|
|
is_active=True,
|
|
condition_operator='always',
|
|
)
|
|
audit_fn(request, 'intro_checklist_item_added', target_type='intro_checklist_item', target_label=label, details={'section': section, 'label_en': label_en})
|
|
messages.success(request, 'Checklistenpunkt wurde hinzugefügt.')
|
|
return redirect('intro_builder_page')
|
|
|
|
if action == 'save_items':
|
|
item_ids = request.POST.getlist('item_ids')
|
|
valid_sections = {k for k, _ in IntroChecklistItem.SECTION_CHOICES}
|
|
valid_ops = {k for k, _ in IntroChecklistItem.OPERATOR_CHOICES}
|
|
for pos, raw_id in enumerate(item_ids):
|
|
item = IntroChecklistItem.objects.filter(id=raw_id).first()
|
|
if not item:
|
|
continue
|
|
section = (request.POST.get(f'section_{item.id}') or item.section).strip()
|
|
if section not in valid_sections:
|
|
section = item.section
|
|
operator = (request.POST.get(f'operator_{item.id}') or item.condition_operator).strip()
|
|
if operator not in valid_ops:
|
|
operator = 'always'
|
|
item.section = section
|
|
item.label = (request.POST.get(f'label_{item.id}') or item.label).strip() or item.label
|
|
item.label_en = (request.POST.get(f'label_en_{item.id}') or '').strip()
|
|
item.is_active = request.POST.get(f'active_{item.id}') == 'on'
|
|
item.condition_field = (request.POST.get(f'field_{item.id}') or '').strip()
|
|
item.condition_operator = operator
|
|
item.condition_value = (request.POST.get(f'value_{item.id}') or '').strip()
|
|
item.sort_order = pos
|
|
item.save(
|
|
update_fields=[
|
|
'section',
|
|
'label',
|
|
'label_en',
|
|
'is_active',
|
|
'condition_field',
|
|
'condition_operator',
|
|
'condition_value',
|
|
'sort_order',
|
|
]
|
|
)
|
|
audit_fn(request, 'intro_checklist_saved', target_type='intro_checklist_item', details={'count': len(item_ids)})
|
|
messages.success(request, 'Einweisungs-Checkliste wurde gespeichert.')
|
|
return redirect('intro_builder_page')
|
|
|
|
condition_field_choices = [
|
|
('', 'Keine Bedingung'),
|
|
('needed_devices', 'Benötigte Geräte und Gegenstände'),
|
|
('needed_software', 'Benötigte Software'),
|
|
('needed_accesses', 'Benötigte Zugänge'),
|
|
('needed_workspace_groups', 'Benötigte Gruppen im Workspace'),
|
|
('needed_resources', 'Benötigte Ressourcen'),
|
|
('additional_hardware', 'Zusätzliche Hardware'),
|
|
('additional_software', 'Zusätzliche Software'),
|
|
('additional_access_text', 'Weitere Zugänge (Freitext)'),
|
|
('group_mailboxes_required', 'Gruppenpostfächer erforderlich'),
|
|
('order_business_cards', 'Visitenkarten bestellt'),
|
|
('phone_number', 'Direktwahl vorhanden'),
|
|
('successor_name', 'Nachfolge vorhanden'),
|
|
('department', 'Abteilung'),
|
|
]
|
|
|
|
items = list(IntroChecklistItem.objects.all().order_by('section', 'sort_order', 'label'))
|
|
section_label_map = dict(translate_choice_list(IntroChecklistItem.SECTION_CHOICES))
|
|
grouped_items = []
|
|
for value, _label in IntroChecklistItem.SECTION_CHOICES:
|
|
section_items = [item for item in items if item.section == value]
|
|
grouped_items.append(
|
|
{
|
|
'key': value,
|
|
'label': section_label_map.get(value, value),
|
|
'items': section_items,
|
|
'count': len(section_items),
|
|
'active_count': len([item for item in section_items if item.is_active]),
|
|
}
|
|
)
|
|
|
|
return render(
|
|
request,
|
|
'workflows/intro_builder.html',
|
|
{
|
|
'items': items,
|
|
'grouped_items': grouped_items,
|
|
'intro_summary': {
|
|
'total_items': len(items),
|
|
'active_items': len([item for item in items if item.is_active]),
|
|
'conditional_items': len([item for item in items if item.condition_operator != 'always']),
|
|
'section_count': len([group for group in grouped_items if group['count']]),
|
|
},
|
|
'section_choices': translate_choice_list(IntroChecklistItem.SECTION_CHOICES),
|
|
'operator_choices': translate_choice_list(IntroChecklistItem.OPERATOR_CHOICES),
|
|
'condition_field_choices': condition_field_choices,
|
|
},
|
|
)
|