from django import forms
from django.contrib import admin
from django.utils.safestring import mark_safe
from ace_editor import AceJSONWidget
from rangefilter.filters import DateRangeFilterBuilder
from .models import *
from .admin_filters import *
from .tasks import send_call_request_task, update_call_requests_task
@admin.register(CallMedicalSpeciality)
class CallMedicalSpecialityAdmin(admin.ModelAdmin):
autocomplete_fields = ['speciality']
list_display = ('speciality_name', 'name')
search_fields = ('name',)
@admin.display(description='Специальность')
def speciality_name(self, obj):
return obj.speciality.name
@admin.register(CallLPU)
class CallLPUAdmin(admin.ModelAdmin):
autocomplete_fields = ['lpu']
list_display = ('__str__', 'lpu_short_name', 'name', 'address')
@admin.display(description='Название')
def lpu_short_name(self, obj):
return obj.lpu.short_name
@admin.register(CallRequest)
class CallRequestAdmin(admin.ModelAdmin):
list_display = (
'date',
'get_status',
'get_request_status',
'patient_last_name',
'patient_first_name',
'patient_phone',
'service_name',
'is_active',
)
list_filter = (
DateListFilter,
'status',
'request_status',
'call_result',
('date', DateRangeFilterBuilder()),
)
search_fields = (
'patient_last_name',
'patient_phone',
)
form = forms.modelform_factory(CallRequest, fields='__all__', widgets={
'data': AceJSONWidget()
})
actions = [
'send_call_request',
'delete_call_request',
'set_is_active_false',
'set_is_active_true',
'update_call_requests'
]
list_editable = ('is_active',)
readonly_fields = (
'call_id',
'call_result',
'call_text_log',
'request_time'
)
@admin.display(description='Статус приема', ordering='status')
def get_status(self, obj):
return mark_safe(f'''
{obj.get_status_display()}
''')
@admin.display(description='Статус запроса', ordering='request_status')
def get_request_status(self, obj):
return mark_safe(f'''
{obj.get_request_status_display()}
''')
@admin.action(description='Отправить выбранные записи на обзвон')
def send_call_request(self, request, queryset):
ids = [item.id for item in queryset.filter(request_status=CallRequest.RequestStatus.NOT_SENT)]
if len(ids) > 0:
send_call_request_task.apply_async(args=(ids,))
self.message_user(request, message=f'Записей отправлено на обзвон: {len(ids)}')
@admin.action(description='Удалить выбранные записи из обзвона')
def delete_call_request(self, request, queryset):
for call_request in queryset: #.filter(request_status=CallRequest.RequestStatus.SENT):
from appa.call_api.api import delete_call_request
delete_call_request(call_request)
@admin.action(description='Установить активность на "False"')
def set_is_active_false(self, request, queryset):
queryset.update(is_active=False)
self.message_user(request, f'Обновлено записей: {queryset.count()}')
@admin.action(description='Установить активность на "True"')
def set_is_active_true(self, request, queryset):
queryset.update(is_active=True)
self.message_user(request, f'Обновлено записей: {queryset.count()}')
@admin.action(description='Синхронизировать список запросов на звонки с МИС')
def update_call_requests(self, request, queryset):
update_call_requests_task.apply_async()
self.message_user(request, f'Задача отправлена на выполнение')
@admin.register(RequestLog)
class RequestLogAdmin(admin.ModelAdmin):
list_display = ('request_url', 'request_method', 'response_http_code', 'created')
search_fields = ('request_url', 'request_body', 'response_body', 'response_http_code')
date_hierarchy = 'created'
form = forms.modelform_factory(RequestLog, fields='__all__', widgets={
'request_body': AceJSONWidget(read_only=True),
'response_body': AceJSONWidget(read_only=True)
})
readonly_fields = [
'request_url',
'request_method',
'response_http_code',
'created'
]
fieldsets = [
('', {'fields': (
'request_url',
'request_method',
'response_http_code',
'created',
'request_body',
'response_body'
)})
]
def has_add_permission(self, request):
return False