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', ('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