266 lines
9.1 KiB
Python
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'
|
|
)
|
|
})
|