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)
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
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
def s_l2(key): return SettingManager.l2(key)
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('<', '<').replace('>', '>'), }) return JsonResponse({ "data": data, })