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, }, )