snapshot: modularize workflow views by domain
This commit is contained in:
134
backend/workflows/intro_builder_views.py
Normal file
134
backend/workflows/intro_builder_views.py
Normal file
@@ -0,0 +1,134 @@
|
||||
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,
|
||||
},
|
||||
)
|
||||
Reference in New Issue
Block a user