Esempio n. 1
0
 def handle(self, *args, **options):
     while True:
         default_h = Hospitals.get_default_hospital()
         self.stdout.write("Start sync at {:%Y-%m-%d %H:%M}".format(
             datetime.datetime.now()))
         count = 0
         for call in DoctorCall.objects.filter(need_send_status=True):
             count += 1
             hospital: Hospitals = call.hospital or default_h
             self.stdout.write(
                 f"Sync status {call.num}:{call.external_num} -> {call.status}"
             )
             resp = update_doc_call_status(call.external_num, call.status,
                                           hospital.oid,
                                           hospital.code_tfoms)
             self.stdout.write(f"Result: {resp}")
             call.need_send_status = False
             call.save(update_fields=['need_send_status'])
         if SettingManager.l2('send_doc_calls'):
             call: DoctorCall
             for call in DoctorCall.objects.filter(
                     need_send_to_external=True,
                     hospital__isnull=False).exclude(
                         hospital__remote_url='').exclude(
                             hospital__remote_token=''):
                 try:
                     base = call.hospital.remote_url
                     token = call.hospital.remote_token
                     if base and token:
                         data = call.json()
                         send_doc_call(
                             base,
                             token,
                             {
                                 "patientData": {
                                     'enp':
                                     call.client.individual.get_enp(),
                                 },
                                 "form": data,
                             },
                         )
                 except Exception as e:
                     self.stdout.write(str(e))
                 call.need_send_to_external = False
                 call.save(update_fields=['need_send_to_external'])
         if count == 0:
             self.stdout.write(
                 "Waiting {}\n".format(DOC_CALL_SYNC_WAIT_LONG_TIME_SECS))
             time.sleep(DOC_CALL_SYNC_WAIT_LONG_TIME_SECS)
         else:
             self.stdout.write(
                 "Waiting {}\n".format(DOC_CALL_SYNC_WAIT_TIME_SECS))
             time.sleep(DOC_CALL_SYNC_WAIT_TIME_SECS)
Esempio n. 2
0
def get_expertise(pk, with_check_available=False):
    expertise_data = {
        'canCreateExpertise': False,
        'serviceId': None,
        'serviceTitle': None,
        'status': 'empty',
        'directions': [],
    }

    if SettingManager.l2('expertise'):
        iss_pk = Issledovaniya.objects.filter(napravleniye_id=pk).values_list('pk').first()
        expertise_from_sql = expertise_tree_direction(iss_pk) if iss_pk else []

        if with_check_available:
            iss: Issledovaniya = Issledovaniya.objects.filter(napravleniye_id=pk).first()
            if iss.research and iss.research.expertise_params_id and iss.time_confirmation:
                expertise_data['serviceId'] = iss.research.expertise_params_id
                expertise_data['serviceTitle'] = iss.research.expertise_params.get_title()
                expertise_data['status'] = 'available'
                expertise_data['canCreateExpertise'] = True

        for i in expertise_from_sql:
            if i.level == 2 and i.is_expertise:
                without_remarks = False
                if i.date_confirm:
                    result_protocol = get_json_protocol_data(i.napravleniye_id)
                    content = result_protocol["content"]
                    if content and content.get("Наличие замечаний"):
                        if content["Наличие замечаний"].lower() == "нет":
                            without_remarks = True
                expertise_data['directions'].append(
                    {
                        "pk": i.napravleniye_id,
                        "confirmedAt": f"{i.date_confirm} {i.time_confirm}" if i.date_confirm else None,
                        "withoutRemarks": without_remarks,
                        "serviceTitle": i.title,
                    }
                )
                if i.date_confirm:
                    expertise_data['status'] = 'ok' if without_remarks else 'error'
    return expertise_data
Esempio n. 3
0
    def doctor_call_save(data, doc_who_create=None):
        patient_card = Card.objects.get(pk=data['card_pk']) if 'card' not in data else data['card']
        research_obj = Researches.objects.get(pk=data['research'])
        if int(data['district']) < 0:
            district_obj = None
        else:
            district_obj = District.objects.get(pk=data['district'])

        if int(data['doc']) < 0:
            doc_obj = None
        else:
            doc_obj = DoctorProfile.objects.get(pk=data['doc'])

        if int(data['purpose']) < 0:
            purpose = 5
        else:
            purpose = int(data['purpose'])

        hospital_obj: Optional[Hospitals]

        if int(data['hospital']) < 0:
            hospital_obj = None
        else:
            hospital_obj = Hospitals.objects.get(pk=data['hospital'])

        email = data.get('email')

        has_external_org = bool(hospital_obj and hospital_obj.remote_url)

        is_main_external = has_external_org and data.get('is_main_external', SettingManager.l2('send_doc_calls'))

        doc_call = DoctorCall(
            client=patient_card,
            research=research_obj,
            exec_at=datetime.datetime.strptime(data['date'], '%Y-%m-%d') if isinstance(data['date'], str) else data['date'],
            comment=data['comment'],
            doc_who_create=doc_who_create,
            cancel=False,
            district=district_obj,
            address=data['address'],
            phone=data['phone'],
            purpose=purpose,
            doc_assigned=doc_obj,
            hospital=hospital_obj,
            is_external=data['external'],
            is_main_external=bool(is_main_external),
            external_num=data.get('external_num') or '',
            email=None if not email else email[:64],
            need_send_to_external=has_external_org and SettingManager.l2('send_doc_calls') and not is_main_external,
            direction_id=data.get('direction'),
        )
        if data.get('as_executed'):
            doc_call.status = 3
            doc_call.executor = doc_who_create
        doc_call.save()

        slog.Log(
            key=doc_call.pk,
            type=80003,
            body=json.dumps(
                {
                    "card_pk": patient_card.pk,
                    "card": str(patient_card),
                    "research": research_obj.title,
                    "district": district_obj.title if district_obj else None,
                    "purpose": doc_call.get_purpose_display(),
                    "doc_assigned": str(doc_obj),
                    "hospital": str(hospital_obj),
                    "date": str(data['date']),
                    "comment": data['comment'],
                    "is_external": data['external'],
                    "external_num": data.get('external_num'),
                    "is_main_external": data.get('is_main_external'),
                    "email": email,
                    "as_executed": data.get('as_executed'),
                }
            ),
            user=doc_who_create,
        ).save()
        return doc_call
Esempio n. 4
0
def s_l2(key):
    return SettingManager.l2(key)
Esempio n. 5
0
def form(request):
    request_data = json.loads(request.body)
    pk = request_data["pk"]
    iss: Issledovaniya = Issledovaniya.objects.prefetch_related(
        'result_set').get(pk=pk)
    research: Researches = Researches.objects.prefetch_related(
        Prefetch('fractions_set',
                 queryset=Fractions.objects.all().order_by(
                     "sort_weight",
                     "pk").prefetch_related('references_set'))).get(
                         pk=iss.research_id)
    data = {
        "pk":
        pk,
        "confirmed":
        bool(iss.time_confirmation),
        "saved":
        bool(iss.time_save),
        "execData": {
            "timeSave":
            strfdatetime(iss.time_save, '%d.%m.%Y %X') or None,
            "docSave":
            iss.doc_save.get_fio() if iss.doc_save else None,
            "timeConfirm":
            strfdatetime(iss.time_confirmation, '%d.%m.%Y %X') or None,
            "docConfirmation":
            iss.doc_confirmation.get_fio() if iss.doc_confirmation else None,
            "app":
            iss.api_app.name if iss.api_app else None,
        },
        "allow_reset_confirm":
        iss.allow_reset_confirm(request.user),
        "research": {
            "title": research.title,
            "can_comment": research.can_lab_result_comment,
            "no_units_and_ref": research.no_units_and_ref,
            "co_executor_mode": research.co_executor_mode or 0,
            "co_executor_title": research.co_executor_2_title,
            "template": research.template,
        },
        "result": [],
        "comment":
        iss.lab_comment or "",
        "laborants": ([
            {
                "id": -1,
                "label": 'Не выбрано'
            },
            *[{
                "id": x.pk,
                "label": x.get_full_fio()
            } for x in DoctorProfile.objects.filter(
                user__groups__name="Лаборант",
                podrazdeleniye__p_type=Podrazdeleniya.LABORATORY).order_by(
                    'fio')],
        ] if SettingManager.l2('results_laborants') else []),
        "legalAuthenticators": ([{
            "id": x.pk,
            "label": x.get_full_fio()
        } for x in DoctorProfile.objects.filter(
            user__groups__name="Подпись от организации").order_by('fio')] if
                                SettingManager.get('legal_authenticator',
                                                   default="false",
                                                   default_type='b') else []),
        "co_executor":
        iss.co_executor_id or -1,
        "co_executor2":
        iss.co_executor2_id or -1,
        "legal_authenticator":
        iss.legal_authenticator_id or SettingManager.get(
            "preselected_legal_authenticator", default='-1', default_type='i')
        or -1,
    }

    f: Fractions
    for f in research.fractions_set.all():
        r: Optional[Result] = iss.result_set.filter(fraction=f).first()

        if not r and f.hide:
            continue

        ref_m = f.ref_m
        ref_f = f.ref_f
        if isinstance(ref_m, str):
            ref_m = json.loads(ref_m)
        if isinstance(ref_f, str):
            ref_f = json.loads(ref_f)
        av = {}

        def_ref_pk = -1 if not f.default_ref else f.default_ref_id

        for avref in f.references_set.all():
            av[avref.pk] = {
                "title":
                avref.title,
                "about":
                avref.about,
                "m":
                json.loads(avref.ref_m)
                if isinstance(avref.ref_m, str) else avref.ref_m,
                "f":
                json.loads(avref.ref_f)
                if isinstance(avref.ref_f, str) else avref.ref_f,
            }

        empty_ref = {
            "m": ref_m,
            "f": ref_f,
        }

        selected_reference = r.selected_reference if r else def_ref_pk

        current_ref = r.get_ref(full=True) if r else (
            empty_ref if def_ref_pk == -1 else av.get(def_ref_pk, {}))

        av[-1] = {
            "title": "Основной референс",
            "about": "",
            **empty_ref,
        }

        if selected_reference == -2:
            av[-2] = current_ref

        av[-3] = {
            "title": "Настраиваемый референс",
            "about": "",
            "m": {},
            "f": {},
        }

        data["result"].append({
            "fraction": {
                "pk": f.pk,
                "title": f.title,
                "units": f.get_unit_str(),
                "render_type": f.render_type,
                "options": f.options,
                "formula": f.formula,
                "type": f.variants.get_variants() if f.variants else [],
                "type2": f.variants2.get_variants() if f.variants2 else [],
                "references": {
                    **empty_ref,
                    "default": def_ref_pk,
                    "available": av,
                },
            },
            "ref":
            current_ref,
            "selectedReference":
            selected_reference,
            "norm":
            r.get_is_norm(recalc=True)[0] if r else None,
            "value":
            str(r.value if r else '').replace('&lt;',
                                              '<').replace('&gt;', '>'),
        })

    return JsonResponse({
        "data": data,
    })