HH/apps/complaints/ui_views_templates.py
2026-02-25 04:47:05 +03:00

266 lines
9.1 KiB
Python

"""
Complaint Templates UI views
"""
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect, render
from django.utils.translation import gettext_lazy as _
from apps.complaints.models import ComplaintTemplate, ComplaintCategory
from apps.organizations.models import Hospital, Department
@login_required
def template_list(request):
"""
List all complaint templates
"""
if not (request.user.is_px_admin() or request.user.is_hospital_admin()):
messages.error(request, _("You don't have permission to manage templates."))
return redirect('complaints:complaint_list')
templates = ComplaintTemplate.objects.select_related('hospital', 'category', 'auto_assign_department').all()
# Filter by hospital
hospital_filter = request.GET.get('hospital')
if hospital_filter:
templates = templates.filter(hospital_id=hospital_filter)
# Filter by active status
is_active = request.GET.get('is_active')
if is_active:
templates = templates.filter(is_active=is_active == 'true')
# Search
search = request.GET.get('search')
if search:
templates = templates.filter(name_en__icontains=search)
templates = templates.order_by('-usage_count', 'name_en')
# Get hospitals for filter
if request.user.is_px_admin():
hospitals = Hospital.objects.filter(status='active').order_by('name')
else:
hospitals = Hospital.objects.filter(id=request.user.hospital_id) if request.user.hospital else []
context = {
'templates': templates,
'hospitals': hospitals,
'hospital_filter': hospital_filter,
'is_active_filter': is_active,
'search': search,
}
return render(request, 'complaints/templates/template_list.html', context)
@login_required
def template_create(request):
"""
Create a new complaint template
"""
if not (request.user.is_px_admin() or request.user.is_hospital_admin()):
messages.error(request, _("You don't have permission to create templates."))
return redirect('complaints:template_list')
if request.method == 'POST':
try:
# Get hospital
hospital_id = request.POST.get('hospital')
hospital = get_object_or_404(Hospital, id=hospital_id)
# Get category if provided
category_id = request.POST.get('category')
category = None
if category_id:
category = get_object_or_404(ComplaintCategory, id=category_id)
# Get auto-assign department if provided
auto_assign_dept_id = request.POST.get('auto_assign_department')
auto_assign_department = None
if auto_assign_dept_id:
auto_assign_department = get_object_or_404(Department, id=auto_assign_dept_id)
# Parse placeholders from JSON or empty list
import json
try:
placeholders = json.loads(request.POST.get('placeholders', '[]'))
except:
placeholders = []
template = ComplaintTemplate.objects.create(
hospital=hospital,
name=request.POST.get('name'),
description=request.POST.get('description'),
category=category,
default_severity=request.POST.get('default_severity', 'medium'),
default_priority=request.POST.get('default_priority', 'medium'),
auto_assign_department=auto_assign_department,
placeholders=placeholders,
is_active=request.POST.get('is_active') == 'on',
)
messages.success(request, _("Template created successfully!"))
return redirect('complaints:template_detail', pk=template.pk)
except Exception as e:
messages.error(request, _("Error creating template: {}").format(str(e)))
# Get hospitals and categories for form
if request.user.is_px_admin():
hospitals = Hospital.objects.filter(status='active').order_by('name')
else:
hospitals = Hospital.objects.filter(id=request.user.hospital_id) if request.user.hospital else []
categories = ComplaintCategory.objects.filter(level=2, is_active=True).order_by('name_en')[:50]
context = {
'hospitals': hospitals,
'categories': categories,
'template': None,
'action': 'create',
}
return render(request, 'complaints/templates/template_form.html', context)
@login_required
def template_detail(request, pk):
"""
View template details
"""
template = get_object_or_404(
ComplaintTemplate.objects.select_related('hospital', 'category', 'auto_assign_department'),
pk=pk
)
context = {
'template': template,
}
return render(request, 'complaints/templates/template_detail.html', context)
@login_required
def template_edit(request, pk):
"""
Edit an existing template
"""
if not (request.user.is_px_admin() or request.user.is_hospital_admin()):
messages.error(request, _("You don't have permission to edit templates."))
return redirect('complaints:template_detail', pk=pk)
template = get_object_or_404(
ComplaintTemplate.objects.select_related('hospital', 'category', 'auto_assign_department'),
pk=pk
)
if request.method == 'POST':
try:
# Get hospital
hospital_id = request.POST.get('hospital')
template.hospital = get_object_or_404(Hospital, id=hospital_id)
# Get category if provided
category_id = request.POST.get('category')
if category_id:
template.category = get_object_or_404(ComplaintCategory, id=category_id)
else:
template.category = None
# Get auto-assign department if provided
auto_assign_dept_id = request.POST.get('auto_assign_department')
if auto_assign_dept_id:
template.auto_assign_department = get_object_or_404(Department, id=auto_assign_dept_id)
else:
template.auto_assign_department = None
# Parse placeholders
import json
try:
template.placeholders = json.loads(request.POST.get('placeholders', '[]'))
except:
template.placeholders = []
template.name = request.POST.get('name')
template.description = request.POST.get('description')
template.default_severity = request.POST.get('default_severity', 'medium')
template.default_priority = request.POST.get('default_priority', 'medium')
template.is_active = request.POST.get('is_active') == 'on'
template.save()
messages.success(request, _("Template updated successfully!"))
return redirect('complaints:template_detail', pk=template.pk)
except Exception as e:
messages.error(request, _("Error updating template: {}").format(str(e)))
# Get hospitals and categories for form
if request.user.is_px_admin():
hospitals = Hospital.objects.filter(status='active').order_by('name')
else:
hospitals = Hospital.objects.filter(id=request.user.hospital_id) if request.user.hospital else []
categories = ComplaintCategory.objects.filter(level=2, is_active=True).order_by('name_en')[:50]
context = {
'hospitals': hospitals,
'categories': categories,
'template': template,
'action': 'edit',
}
return render(request, 'complaints/templates/template_form.html', context)
@login_required
def template_delete(request, pk):
"""
Delete a template
"""
if not request.user.is_px_admin():
messages.error(request, _("You don't have permission to delete templates."))
return redirect('complaints:template_detail', pk=pk)
template = get_object_or_404(ComplaintTemplate, pk=pk)
if request.method == 'POST':
template_name = template.name
template.delete()
messages.success(request, _("Template '{}' deleted successfully!").format(template_name))
return redirect('complaints:template_list')
context = {
'template': template,
}
return render(request, 'complaints/templates/template_confirm_delete.html', context)
@login_required
def template_toggle_status(request, pk):
"""
Toggle template active status (AJAX)
"""
if not (request.user.is_px_admin() or request.user.is_hospital_admin()):
from django.http import JsonResponse
return JsonResponse({'error': 'Permission denied'}, status=403)
from django.http import JsonResponse
if request.method != 'POST':
return JsonResponse({'error': 'Method not allowed'}, status=405)
template = get_object_or_404(ComplaintTemplate, pk=pk)
template.is_active = not template.is_active
template.save()
return JsonResponse({
'success': True,
'is_active': template.is_active,
'message': 'Template {} successfully'.format(
'activated' if template.is_active else 'deactivated'
)
})