def get_price_modifier(self): """ На основании источника финансирования возвращает прайс(объект)+модификатор(множитель цены) Если источник финансирования ДМС поиск осуществляется по цепочке company-contract. Company(Страховая организация) Если источник финансирования МЕДОСМОТР поиск осуществляется по цепочке company-contract. Company(место работы) Если источник финансирования ПЛАТНО поиск осуществляется по цепочке ист.фин-contract-прайс Если источник финансирования ОМС, ДИСПАНСЕРИЗАЦИЯ поиск осуществляется по цепочке ист.фин-contract-прайс Если источник финансирования Бюджет поиск осуществляется по цепочке contract """ price_modifier = None price_contract = set(SettingManager.get("price_contract").split(',')) price_company = set(SettingManager.get("price_company").split(',')) if self.title.upper() in price_contract: contract_l = IstochnikiFinansirovaniya.objects.values_list( 'contracts_id').filter(pk=self.pk).first() if contract_l[0]: price_modifier = contracts.Contract.objects.values_list( 'price', 'modifier').get(id=contract_l[0]) elif self.title.upper() in price_company: contract_l = contracts.Company.objects.values_list( 'contracts_id').filter(pk=self.pk).first() if contract_l[0]: price_modifier = contracts.Contract.objects.values_list( 'price', 'modifier').get(id=contract_l[0]) return price_modifier
def confirm_reset(request): result = {"ok": False, "msg": "Ошибка"} if "pk" in request.POST.keys() or "pk" in request.GET.keys(): if request.method == "POST": pk = int(request.POST["pk"]) else: pk = int(request.GET["pk"]) if Issledovaniya.objects.filter(pk=pk).exists(): iss = Issledovaniya.objects.get(pk=pk) import time ctp = int(0 if not iss.time_confirmation else int( time. mktime(timezone.localtime(iss.time_confirmation).timetuple()))) ctime = int(time.time()) cdid = -1 if not iss.doc_confirmation else iss.doc_confirmation.pk if ( ctime - ctp < SettingManager.get("lab_reset_confirm_time_min") * 60 and cdid == request.user.doctorprofile.pk ) or request.user.is_superuser or "Сброс подтверждений результатов" in [ str(x) for x in request.user.groups.all() ]: predoc = { "fio": 'не подтверждено' if cdid == -1 else iss.doc_confirmation.get_fio(), "pk": cdid, "direction": iss.napravleniye.pk } iss.doc_confirmation = iss.time_confirmation = None iss.save() if iss.napravleniye.result_rmis_send: c = Client() c.directions.delete_services(iss.napravleniye, request.user.doctorprofile) result = {"ok": True} slog.Log(key=pk, type=24, body=json.dumps(predoc), user=request.user.doctorprofile).save() else: result[ "msg"] = "Сброс подтверждения разрешен в течении %s минут" % ( str(SettingManager.get("lab_reset_confirm_time_min"))) return JsonResponse(result)
def dashboard(request): if not request.is_ajax(): return render( request, 'dashboard.html', { "rmis": SettingManager.get( "rmis_enabled", default='false', default_type='b'), "mis_module": SettingManager.get( "mis_module", default='false', default_type='b'), "paraclinic": SettingManager.get( "paraclinic_module", default='false', default_type='b') }) return HttpResponse("OK")
def drawTituls(c, user, pages, page, paddingx, obj, otd="", group=-2, start=1): """Функция рисования шапки и подвала страницы pdf""" c.setFont('OpenSans', 9) c.setStrokeColorRGB(0, 0, 0) c.setLineWidth(1) c.drawCentredString(w / 2, h - 30, SettingManager.get("org_title")) c.setFont('OpenSans', 12) c.drawCentredString(w / 2, h - 50, "Журнал приема материала") group_str = "Все исследования" if group >= 0: group_str = directory.ResearchGroup.objects.get(pk=group).title elif group == -2: group_str = "Все исследования" else: group_str = "Без группы" c.drawString(paddingx, h - 65, "Группа: %s" % group_str) c.drawString(paddingx, h - 78, "Отделение: %s" % otd) c.setFont('OpenSans', 10) # c.drawString(paddingx * 3, h - 70, "№ " + str(doc_num)) c.drawRightString( w - paddingx, h - 65, "Дата: " + str(dateformat.format(date.today(), settings.DATE_FORMAT))) c.drawRightString(w - paddingx, 20, "Страница " + str(page) + " из " + str(pages))
def get_active_ref(self, raw_ref=True, single=False): if raw_ref: if single: show_only_needed_ref = SettingManager.get("show_only_needed_ref", default='True', default_type='b') if not show_only_needed_ref or not self.raw_ref: return None show_full_needed_ref = SettingManager.get("show_full_needed_ref", default='False', default_type='b') if show_full_needed_ref: return {self.key: self.raw_ref} return {'Все': self.raw_ref} return self.raw_ref if isinstance(self.ref, ResultRight): return self.ref return ValueRange((0, ")"), (0, ")"))
def can_invalidate(self): rt = SettingManager.get("ticket_invalidate_time_min", default='1440.0', default_type='f') * 60 ctp = time.mktime(timezone.localtime(self.date).timetuple()) ctime = int(time.time()) return ctime - ctp < rt
def make_service(request): data = json.loads(request.body) main_direction = Napravleniya.objects.get(pk=data["main_direction"]) parent_iss = Issledovaniya.objects.filter( napravleniye=main_direction, research__is_hospital=True).first() service = HospitalService.objects.get(pk=data["service"]) TADP = SettingManager.get("tadp", default='Температура', default_type='s') if "Врач стационара" not in [ str(x) for x in request.user.groups.all() ] and TADP not in service.slave_research.title: return JsonResponse({"pk": None}) result = Napravleniya.gen_napravleniya_by_issledovaniya( main_direction.client_id, "", None, "", None, request.user.doctorprofile, {-1: [service.slave_research_id]}, {}, False, {}, vich_code="", count=1, discount=0, parent_iss=parent_iss.pk, rmis_slot=None, ) pk = result["list_id"][0] return JsonResponse({"pk": pk})
def get_phones_transfers(request): phones_transfer = SettingManager.get("phones_transfer_file", default='False', default_type='b') org_phones = [] extrenal_phones = [] if phones_transfer: try: phones_transfer_file = os.path.join(BASE_DIR, 'external_system', 'settings', 'phones_org.json') with open(phones_transfer_file) as json_file: org_phones = json.load(json_file) except Exception: org_phones = [] if phones_transfer: try: extrenal_phones_file = os.path.join(BASE_DIR, 'external_system', 'settings', 'extrenal_phones.json') with open(extrenal_phones_file) as json_file: extrenal_phones = json.load(json_file) except Exception: extrenal_phones = [] return JsonResponse({ "org_phones": list(org_phones), "extrenal_phones": list(extrenal_phones) })
def get_url(path, query=None): if query is None: query = {} base = SettingManager.get_cda_base_url() if not base or base == 'empty': return {} return urljoin(base, path) + ('?{}'.format(urlencode(query)) if query else '')
def researches_paraclinic(request): if SettingManager.get("paraclinic_module", default='false', default_type='b'): return render(request, 'construct_paraclinic.html') else: return redirect('/')
def get_url(path, query=None): if query is None: query = {} return urljoin( SettingManager.get( "tfoms_api_url", default='http://localhost/', default_type='s'), path) + ('?{}'.format(urlencode(query)) if query else '')
def researches_paraclinic(request): if SettingManager.get("paraclinic_module", default='false', default_type='b'): return redirect('/ui/construct/descriptive') else: return redirect('/')
def get_headers(): return { "Authorization": "Bearer {}".format( SettingManager.get("tfoms_api_token", default='token', default_type='s')) }
def log(request): response = { "cnt": slog.objects.all().count(), "store_days": SettingManager.get("max_log_store_days", "120", "i") } response["to_delete"] = slog.objects.filter( time__lt=datetime.today() - timedelta(days=response["store_days"]), type__in=CLEANUP_TYPES_LOG).count() return JsonResponse(response)
def suggest(query, resource='address', count=5, detalized=False): k = SettingManager.get("dadata_key", default='', default_type='s') if not k: return [] key = f'sugg:{k[:6]}:{resource}:{get_md5(query)}:{len(query)}:{detalized}' result = cache.get(key) if not result: url = BASE_URL.format(resource) headers = {"Authorization": "Token {}".format(k), "Content-Type": "application/json"} data = {"query": query, "count": count, "locations_boost": [{"kladr_id": SettingManager.get("dadata_kladr_prior_city", default='38', default_type='s')}]} result = requests.post(url, data=json.dumps(data), headers=headers, proxies=FIAS_PROXY).json() result = result.get('suggestions', []) if not detalized: result = [x.get('value', '') for x in result] cache.set(key, pickle.dumps(result, protocol=4), 24 * 3600) else: result = pickle.loads(result, encoding="utf8") return result
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 make_menu(pages, groups, superuser, current_path=None): menu = [] groups_set = set(groups) for page in pages: if (not superuser and "*" not in page["access"] and len(groups_set & set(page["access"])) == 0) or (page.get("module") and not SettingManager.get( page["module"], default='false', default_type='b')): continue page["active"] = current_path == page.get("url") menu.append(page) return menu
def kladrapi_request(data: dict): kladrapi_url = SettingManager.get('kladrapi_url', default='https://kladr-api.ru/api.php', default_type='s') token = SettingManager.get('kladrapi_token', default='', default_type='s') try: if token: data['token'] = token key = f"kladrapi_request:{get_md5(json.dumps(data, sort_keys=True))}" result = cache.get(key) if not result: result = requests.get(kladrapi_url, params=data, proxies=FIAS_PROXY).json() if not result or not isinstance(result, dict) or 'result' not in result: return {} cache.set(key, pickle.dumps(result, protocol=4), 24 * 3600) else: result = pickle.loads(result, encoding="utf8") return result except Exception as e: logger.exception(e) return {}
def get_default_hospital() -> Optional['Hospitals']: hosp = Hospitals.objects.filter(hide=False, is_default=True).first() if not hosp: hosp = Hospitals.objects.filter(hide=False, code_tfoms=SettingManager.get( "org_id", default='', default_type='s')).first() if hosp: hosp.is_default = True hosp.save() return hosp
def confirm_reset(request): result = {"ok": False, "msg": "Ошибка"} if "pk" in request.POST.keys() or "pk" in request.GET.keys(): if request.method == "POST": pk = int(request.POST["pk"]) else: pk = int(request.GET["pk"]) if Issledovaniya.objects.filter(pk=pk).exists(): iss = Issledovaniya.objects.get(pk=pk) import time ctp = int(0 if not iss.time_confirmation else int( time.mktime(iss.time_confirmation.timetuple()))) + 8 * 60 * 60 ctime = int(time.time()) cdid = -1 if not iss.doc_confirmation else iss.doc_confirmation.pk if (ctime - ctp < SettingManager.get("lab_reset_confirm_time_min") * 60 and cdid == request.user.doctorprofile.pk ) or request.user.is_superuser: predoc = { "fio": iss.doc_confirmation.get_fio(), "pk": iss.doc_confirmation.pk } iss.doc_confirmation = iss.time_confirmation = None iss.save() result = {"ok": True} slog.Log(key=pk, type=24, body=json.dumps(predoc), user=request.user.doctorprofile).save() else: result[ "msg"] = "Сброс подтверждения разрешен в течении %s минут" % ( str(SettingManager.get("lab_reset_confirm_time_min"))) return HttpResponse(json.dumps(result), content_type="application/json")
def match_enp(enp) -> Optional[dict]: logger.exception(f"tfms: match enp: {enp}") if SettingManager.get("l2_patients_is_active", default='f', default_type='b'): logger.exception("l2_patients_is_active") resp = check_l2_enp(enp) logger.exception(f"resp: {resp}") if not isinstance( resp, dict) or not resp.get('ok') or not resp.get('patient_data'): return None return resp.get('patient_data') data = make_request("match-patient-by-enp-set2", {"enp": enp}, timeout=5) if isinstance(data, list) and len(data) > 0: return data[0] return data
def make_menu(pages, groups, superuser, current_path=None): menu = [] groups_set = set(groups) hide_buttons = [] for k, v in HIDE_TITLE_BUTTONS_MAIN_MENU.items(): if k in groups: hide_buttons.extend(v) for page in pages: is_hide_button = False if page.get("title", "Нет такой кнопки") in hide_buttons: is_hide_button = True if (not superuser and "*" not in page["access"] and len(groups_set & set(page["access"])) == 0) or ( page.get("module") and not SettingManager.get(page["module"], default='false', default_type='b') ): continue if is_hide_button and not superuser: continue page["active"] = current_path == page.get("url") menu.append(page) return menu
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 handle(self, *args, **kwargs): research_pk = kwargs["research_pk"] research_data = {} r = Researches.objects.get(pk=research_pk) research_data['title'] = r.title research_data['code'] = r.code research_data['short_title'] = r.short_title groups = ParaclinicInputGroups.objects.filter(research=r) groups_to_save = [] for group in groups: fields_in_group = [] for f in ParaclinicInputField.objects.filter(group=group, hide=False): field_data = { 'title': f.title, 'short_title': f.short_title, 'order': f.order, 'default_value': f.default_value, 'lines': f.lines, 'field_type': f.field_type, 'for_extract_card': f.for_extract_card, 'for_talon': f.for_talon, 'helper': f.helper, 'input_templates': f.input_templates, 'required': f.required, 'hide': f.hide, } fields_in_group.append(field_data) groups_to_save.append({ 'title': group.title, 'show_title': group.show_title, 'order': group.order, 'hide': group.hide, 'paraclinic_input_field': fields_in_group, 'fieldsInline': group.fields_inline, }) research_data['paraclinic_input_groups'] = groups_to_save dir_tmp = SettingManager.get("dir_param") with open(f'{dir_tmp}/{research_pk}.json', 'w') as fp: json.dump(research_data, fp)
def match_patient(family, name, patronymic, birthday) -> List[dict]: logger.exception(f"match_patient: {(family, name, patronymic, birthday)}") if SettingManager.get("l2_patients_is_active", default='f', default_type='b'): logger.exception("l2_patients_is_active") resp = check_l2_patient(family, name, patronymic, birthday) logger.exception(f"resp: {resp}") if not isinstance(resp, dict) or not resp.get('ok') or not resp.get('list'): return [] return resp.get('list') q = { "family": family, "name": name, "birthdate": birthday, } if patronymic: q["patronymic"] = patronymic return make_request("match-patient", q)
def dnk_covid(request): prefixes = [] key_dnk = SettingManager.get("dnk_kovid", default='false', default_type='s') to_return = None for x in "ABCDEF": prefixes.extend([f"{x}{i}" for i in range(1, 13)]) file = request.FILES['file'] if file.content_type == 'application/pdf' and file.size < 100000: with tempfile.TemporaryFile() as fp: fp.write(file.read()) text = extract_text_from_pdf(fp) if text: text = text.replace("\n", "").split( "Коронавирусы подобные SARS-CoVВККоронавирус SARS-CoV-2") to_return = [] if text: for i in text: k = i.split("N") if len(k) > 1 and k[1].split(" ")[0].isdigit(): result = json.dumps({ "pk": k[1].split(" ")[0], "result": [{ "dnk_SARS": "Положительно" if "+" in i else "Отрицательно" }] }) to_return.append({ "pk": k[1].split(" ")[0], "result": "Положительно" if "+" in i else "Отрицательно" }) http_func({"key": key_dnk, "result": result}, request.user) return to_return
def form_02(request_data): """ Форма 025/у - титульный лист амбулаторной карты Приказ Минздрава России от 15.12.2014 N 834н (ред. от 09.01.2018) """ ind_card = Card.objects.get(pk=request_data["card_pk"]) ind = ind_card.individual ind_doc = Document.objects.filter(individual=ind, is_active=True) hospital_name = SettingManager.get("org_title") hospital_address = SettingManager.get("org_address") hospital_kod_ogrn = SettingManager.get("org_ogrn", "<TODO:OGRN>") hospital_okpo = SettingManager.get("org_ogrn", "<TODO:OKPO>") individual_fio = ind.fio() individual_sex = ind.sex individual_date_born = ind.bd() document_passport = "Паспорт РФ" documents = forms_func.get_all_doc(ind_doc) document_passport_num = documents['passport']['num'] document_passport_serial = documents['passport']['serial'] document_passport_date_start = documents['passport']['date_start'] document_passport_issued = documents['passport']['issued'] document_polis = documents['polis']['num'] document_snils = documents['snils']['num'] indivudual_insurance_org = documents['polis']['issued'] individual_benefit_code = "_________" ind_card_num = ind_card.number_with_type() ind_card_address = ind_card.main_address ind_card_phone = ", ".join(ind_card.get_phones()) individual_work_organization = "Управление Федераньной службы по ветеринарному и фитосанитрному надзору по Иркутской области" \ "и Усть-Ордынскому бурятскому автономному округу" # реест организаций work_organization_okved = "91.5 - Обслуживание и ремонт компютерной и оргтехники, заправка картриджей" \ "обслуживание принтеров" individual_department = "отдел информационных технология, ораганизаци ремонта и обслуживания медицинского оборудования" individual_profession = "старший государственный таможенный инспектор" # реест профессий if sys.platform == 'win32': locale.setlocale(locale.LC_ALL, 'rus_rus') else: locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8') pdfmetrics.registerFont( TTFont('PTAstraSerifBold', os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf'))) pdfmetrics.registerFont( TTFont('PTAstraSerifReg', os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf'))) # http://www.cnews.ru/news/top/2018-12-10_rossijskim_chinovnikam_zapretili_ispolzovat # Причина PTAstraSerif использовать buffer = BytesIO() individual_fio = ind.fio() individual_date_born = ind.bd() doc = SimpleDocTemplate(buffer, pagesize=A4, leftMargin=25 * mm, rightMargin=5 * mm, topMargin=6 * mm, bottomMargin=6 * mm, allowSplitting=1, title="Форма {}".format("025/у")) width, height = portrait(A4) styleSheet = getSampleStyleSheet() style = styleSheet["Normal"] style.fontName = "PTAstraSerifReg" style.fontSize = 10 style.leading = 12 style.spaceAfter = 0.5 * mm styleBold = deepcopy(style) styleBold.fontName = "PTAstraSerifBold" styleCenter = deepcopy(style) styleCenter.alignment = TA_CENTER styleCenter.fontSize = 12 styleCenter.leading = 15 styleCenter.spaceAfter = 1 * mm styleCenterBold = deepcopy(styleBold) styleCenterBold.alignment = TA_CENTER styleCenterBold.fontSize = 12 styleCenterBold.leading = 15 styleCenterBold.face = 'PTAstraSerifBold' styleJustified = deepcopy(style) styleJustified.alignment = TA_JUSTIFY styleJustified.spaceAfter = 4.5 * mm styleJustified.fontSize = 12 styleJustified.leading = 4.5 * mm objs = [] styleT = deepcopy(style) styleT.alignment = TA_LEFT styleT.fontSize = 10 styleT.leading = 4.5 * mm styleT.face = 'PTAstraSerifReg' opinion = [ [ Paragraph( '<font size=11>{}<br/>Адрес: {}<br/>ОГРН: {} </font>'.format( hospital_name, hospital_address, hospital_kod_ogrn), styleT), Paragraph( '<font size=9 >Код формы по ОКУД:<br/>Код организации по ОКПО: 31348613<br/>' 'Медицинская документация<br/>Учетная форма № 025/у</font>', styleT) ], ] tbl = Table(opinion, 2 * [90 * mm]) tbl.setStyle( TableStyle([ ('GRID', (0, 0), (-1, -1), 0.75, colors.white), ('LEFTPADDING', (1, 0), (-1, -1), 80), ('VALIGN', (0, 0), (-1, -1), 'TOP'), ])) objs.append(tbl) space_symbol = ' ' content_title = [ Indenter(left=0 * mm), Spacer(1, 4 * mm), Paragraph( 'МЕДИЦИНСКАЯ КАРТА ПАЦИЕНТА, <br/> ПОЛУЧАЮЩЕГО МЕДИЦИНСКУЮ ПОМОЩЬ В АМБУЛАТОРНЫХ УСЛОВИЯХ', styleCenter), Paragraph('{}№ {}'.format(3 * space_symbol, ind_card_num), styleCenterBold), Spacer(1, 2 * mm), Paragraph( '1.Дата заполнения медицинской карты: {}'.format( pytils.dt.ru_strftime(u"%d %B %Y", inflected=True, date=datetime.datetime.now())), style), Paragraph( "2. Фамилия, имя, отчество:<b> {} </b> ".format(individual_fio), style), Paragraph( '3. Пол: {} {} 4. Дата рождения: {}'.format( individual_sex, 3 * space_symbol, individual_date_born), style), Paragraph('5. Место регистрации: {}'.format(ind_card_address), style), Paragraph('тел. {}'.format(ind_card_phone), style), Paragraph('6. Местность: городская — 1, сельская — 2', style), Paragraph( '7. Полис ОМС: серия______№: {} {}' '8. СНИЛС: {}'.format(document_polis, 13 * space_symbol, document_snils), style), Paragraph( '9. Наименование страховой медицинской организации: {}'.format( indivudual_insurance_org), style), Paragraph( '10. Код категории льготы: {} {} 11. Документ: {} серия: {} №: {}' .format(individual_benefit_code, 35 * space_symbol, document_passport, document_passport_serial, document_passport_num), style), Paragraph( '12. Заболевания, по поводу которых осуществляется диспансерное наблюдение:', style), Spacer(1, 2 * mm), ] objs.extend(content_title) styleTCenter = deepcopy(styleT) styleTCenter.alignment = TA_CENTER styleTCenter.leading = 3.5 * mm opinion = [ [ Paragraph( '<font size=9>Дата начала диспансерного наблюдения </font>', styleTCenter), Paragraph( '<font size=9 >Дата прекращения диспансерного наблюдения</font>', styleTCenter), Paragraph('<font size=9 >Диагноз</font>', styleTCenter), Paragraph('<font size=9 >Код по МКБ-10</font>', styleTCenter), Paragraph('<font size=9 >Врач</font>', styleTCenter), ], ] for i in range(0, 5): para = ['', '', '', '', ''] opinion.append(para) row_height = [] for i in opinion: row_height.append(6 * mm) row_height[0] = None tbl = Table(opinion, colWidths=(27 * mm, 30 * mm, 75 * mm, 20 * mm, 27 * mm), rowHeights=row_height) tbl.setStyle( TableStyle([ ('GRID', (0, 0), (-1, -1), 1.0, colors.black), ('VALIGN', (0, 0), (-1, 0), 'MIDDLE'), ])) objs.append(tbl) doc.build(objs) pdf = buffer.getvalue() buffer.close() return pdf
def form_01(request_data): """ Договор, включающий услуги на оплату и необходимые реквизиты """ form_name = "Договор" ind_card = Card.objects.get(pk=request_data["card_pk"]) ind = ind_card.individual ind_doc = Document.objects.filter(individual=ind, is_active=True) ind_dir = json.loads(request_data["dir"]) #exec_person = print(request_data.user.doctorprofile.fio) exec_person = 'Иванов Иван Иванович' # Получить данные с клиента физлицо-ФИО, пол, дата рождения individual_fio = ind.fio() individual_date_born = ind.bd() # Получить все источники, у которых title-ПЛАТНО ist_f = [] ist_f = list( IstochnikiFinansirovaniya.objects.values_list('id').filter( title__exact='Платно')) ist_f_list = [] ist_f_list = ([int(x[0]) for x in ist_f]) napr = Napravleniya.objects.filter(id__in=ind_dir) dir_temp = [] #Проверить, что все направления принадлежат к одной карте и имеют ист. финансирования "Платно" num_contract_set = set() for n in napr: if (n.istochnik_f_id in ist_f_list) and (n.client == ind_card): num_contract_set.add(n.num_contract) dir_temp.append(n.pk) # получить УСЛУГИ по направлениям(отфильтрованы по "платно" и нет сохраненных исследований) в Issledovaniya research_direction = forms_func.get_research_by_dir(dir_temp) # получить по направлению-услугам цену из Issledovaniya research_price = forms_func.get_coast_from_issledovanie(research_direction) #Получить Итоговую стр-ру данных result_data = forms_func.get_final_data(research_price) today = datetime.datetime.now() date_now1 = datetime.datetime.strftime(today, "%y%m%d%H%M%S%f")[:-3] date_now_str = str(ind_card.pk) + str(date_now1) # Проверить записан ли номер контракта в направлениях # ПереЗаписать номер контракта Если в наборе направлений значение None num_contract_set = set() napr_end = [] napr_end = Napravleniya.objects.filter(id__in=result_data[3]) for n in napr_end: num_contract_set.add(n.num_contract) if (len(num_contract_set) == 1) and (None in num_contract_set): print('Перезаписано т.к. было NONE') Napravleniya.objects.filter(id__in=result_data[3]).update( num_contract=date_now_str) # ПереЗаписать номер контракта Если в наборе направлении значение разные значения if len(num_contract_set) > 1: print('Перезаписано т.к. были разные контракты в направлениях') Napravleniya.objects.filter(id__in=result_data[3]).update( num_contract=date_now_str) if (len(num_contract_set) == 1) and (not None in num_contract_set): print('No-No-No-No не надо создавать номер контракта он есть') print() date_now_str = num_contract_set.pop() # Получить данные физлицо-документы: паспорт, полис, снилс document_passport = "Паспорт РФ" documents = forms_func.get_all_doc(ind_doc) document_passport_num = documents['passport']['num'] document_passport_serial = documents['passport']['serial'] document_passport_date_start = documents['passport']['date_start'] document_passport_issued = documents['passport']['issued'] if sys.platform == 'win32': locale.setlocale(locale.LC_ALL, 'rus_rus') else: locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8') # Генерировать pdf-Лист на оплату pdfmetrics.registerFont( TTFont('PTAstraSerifBold', os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf'))) pdfmetrics.registerFont( TTFont('PTAstraSerifReg', os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf'))) pdfmetrics.registerFont( TTFont('Symbola', os.path.join(FONTS_FOLDER, 'Symbola.ttf'))) buffer = BytesIO() doc = SimpleDocTemplate(buffer, pagesize=A4, leftMargin=12 * mm, rightMargin=5 * mm, topMargin=6 * mm, bottomMargin=22 * mm, allowSplitting=1, title="Форма {}".format("Лист на оплату")) width, height = portrait(A4) styleSheet = getSampleStyleSheet() style = styleSheet["Normal"] style.fontName = "PTAstraSerifReg" style.fontSize = 9 style.leading = 12 style.spaceAfter = 0 * mm style.alignment = TA_JUSTIFY style.firstLineIndent = 15 styleBold = deepcopy(style) styleBold.fontName = "PTAstraSerifBold" styleCenter = deepcopy(style) styleCenter.alignment = TA_CENTER styleCenter.fontSize = 9 styleCenter.leading = 10 styleCenter.spaceAfter = 0 * mm styleCenterBold = deepcopy(styleBold) styleCenterBold.alignment = TA_CENTER styleCenterBold.fontSize = 20 styleCenterBold.leading = 15 styleCenterBold.face = 'PTAstraSerifBold' styleJustified = deepcopy(style) styleJustified.alignment = TA_JUSTIFY styleJustified.spaceAfter = 4.5 * mm styleJustified.fontSize = 12 styleJustified.leading = 4.5 * mm objs = [] barcode128 = code128.Code128(date_now_str, barHeight=6 * mm, barWidth=1.25) objs.append(Spacer(1, 11 * mm)) # head = [ # Paragraph('ДОГОВОР № <u>{}</u>'.format(date_now_str),styleCenter), # Spacer(1, 1 * mm), # Paragraph('НА ОКАЗАНИЕ ПЛАТНЫХ МЕДИЦИНСКИХ УСЛУГ НАСЕЛЕНИЮ', styleCenter), # ] objs.append( Paragraph('ДОГОВОР № <u>{}</u>'.format(date_now_str), styleCenter)) objs.append(Spacer(1, 1 * mm)) objs.append( Paragraph('НА ОКАЗАНИЕ ПЛАТНЫХ МЕДИЦИНСКИХ УСЛУГ НАСЕЛЕНИЮ', styleCenter)) styleTCenter = deepcopy(styleCenter) styleTCenter.alignment = TA_CENTER styleTCenter.leading = 3.5 * mm styleTBold = deepcopy(styleCenterBold) styleTBold.fontSize = 10 styleTBold.alignment = TA_LEFT # barcode128 = code128.Code128(date_now_str,barHeight= 4 * mm, barWidth = 1.25) date_now = pytils.dt.ru_strftime(u"%d %B %Y", inflected=True, date=datetime.datetime.now()) styleTR = deepcopy(style) styleTR.alignment = TA_RIGHT opinion = [ [ Paragraph('г. Иркутск', style), Paragraph('{} года'.format(date_now), styleTR) ], ] tbl = Table(opinion, colWidths=(95 * mm, 95 * mm)) tbl.setStyle( TableStyle([ ('GRID', (0, 0), (-1, -1), 1.0, colors.white), ('BOTTOMPADDING', (0, 0), (-1, -1), 1.5 * mm), ])) objs.append(Spacer(1, 5 * mm)) objs.append(tbl) objs.append(Spacer(1, 4.5 * mm)) hospital_name = SettingManager.get("rmis_orgname") hospital_short_name = SettingManager.get("org_title") hospital_address = SettingManager.get("org_address") post_contract = SettingManager.get("post_contract") document_base = SettingManager.get("document_base") if document_passport_issued: passport_who_give = document_passport_issued else: passport_who_give = "______________________________________________________________________" if ind_card.main_address: main_address = ind_card.main_address else: main_address = "______________________________________________________________________" if ind_card.fact_address: fact_address = ind_card.fact_address elif main_address: fact_address = main_address else: fact_address = "______________________________________________________________________" objs.append( Paragraph( '{}, именуемая в дальнейшем "Исполнитель", в лице {} {}, действующего(ей) на основании {} с ' 'одной стороны, и <u>{}</u>, именуемый(ая) в дальнейшем "Пациент", дата рождения {} г., ' 'паспорт: {}-{} ' 'выдан {} г. ' 'кем: {} ' 'зарегистрирован по адресу: {}, ' 'адрес проживания: {} ' 'с другой стороны, вместе также именуемые "Стороны", заключили настоящий договор (далее - "Договор") о нижеследующем:' .format(hospital_name, post_contract, exec_person, document_base, individual_fio, individual_date_born, document_passport_serial, document_passport_num, document_passport_date_start, passport_who_give, main_address, fact_address), style)) objs.append(Spacer(1, 2 * mm)) objs.append(Paragraph('1. ПРЕДМЕТ ДОГОВОРА', styleCenter)) objs.append( Paragraph( '1.1. Исполнитель на основании обращения Пациента обязуется оказать ему медицинские услуги в соответствие с лицензией:', style)) #Касьяненко начало шаблон услуг только для водителей, на работу template_research = "Перечень услуг" # Касьяненко конец tr = "" if template_research: tr = template_research objs.append(Spacer(1, 2 * mm)) objs.append(Paragraph('{}'.format(tr), style)) styleTB = deepcopy(style) styleTB.firstLineIndent = 0 styleTB.fontSize = 8.5 styleTB.alignment = TA_CENTER styleTB.fontName = "PTAstraSerifBold" styleTC = deepcopy(style) styleTC.firstLineIndent = 0 styleTC.fontSize = 8.5 styleTC.alignment = TA_LEFT styleTCright = deepcopy(styleTC) styleTCright.alignment = TA_RIGHT styleTCcenter = deepcopy(styleTC) styleTCcenter.alignment = TA_CENTER opinion = [] if result_data[2] == 'no_discount': opinion = [ [ Paragraph('Код услуги', styleTB), Paragraph('Направление', styleTB), Paragraph('Услуга', styleTB), Paragraph('Цена,<br/>руб.', styleTB), Paragraph('Кол-во, усл.', styleTB), Paragraph('Сумма, руб.', styleTB), ], ] else: opinion = [ [ Paragraph('Код услуги', styleTB), Paragraph('Направление', styleTB), Paragraph('Услуга', styleTB), Paragraph('Цена,<br/>руб.', styleTB), Paragraph('Скидка<br/>Наценка<br/>%', styleTB), Paragraph('Цена со<br/> скидкой,<br/>руб.', styleTB), Paragraph('Кол-во, усл.', styleTB), Paragraph('Сумма, руб.', styleTB), ], ] # example_template = [ # ['1.2.3','4856397','Полный гематологический анализ','1000.00','0','1000.00','1','1000.00'], # ['1.2.3','','РМП','2500.45','0','2500.45','1','2500.45'], # ['1.2.3', '4856398', 'УЗИ брюшной полости', '3500.49', '0', '3500.49', '1', '3500.49'], # ['1.2.3','4856398','Эзофагогастродуоденоскопия','5700.99','0','5700.99','1','5700.99'] # ] # # example_template = result_data[0] list_g = [] #используется range(len()) - к определенной колонке (по номеру) применяется свое свойство for i in range(len(example_template)): list_t = [] for j in range(len(example_template[i])): if j in (3, 5, 7): s = styleTCright elif j in (4, 6): s = styleTCcenter else: s = styleTC list_t.append(Paragraph(example_template[i][j], s)) list_g.append(list_t) sum_research = result_data[1] sum_research_decimal = sum_research.replace(' ', '') opinion.extend(list_g) if result_data[2] == 'is_discount': tbl = Table(opinion, colWidths=(18 * mm, 19 * mm, 52 * mm, 22 * mm, 21 * mm, 22 * mm, 13 * mm, 25 * mm)) else: tbl = Table(opinion, colWidths=(23 * mm, 34 * mm, 62 * mm, 22 * mm, 23 * mm, 25 * mm)) tbl.setStyle( TableStyle([ ('GRID', (0, 0), (-1, -1), 1.0, colors.black), ('BOTTOMPADDING', (0, 0), (-1, -1), 1.5 * mm), ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), ])) objs.append(tbl) objs.append(Spacer(1, 1 * mm)) objs.append( Paragraph('<font size=12> Итого: {}</font>'.format(sum_research), styleTCright)) objs.append(Spacer(1, 2 * mm)) objs.append(Spacer(1, 3 * mm)) objs.append( Paragraph( '(далее - "медицинские услуги"), а Пациент уплачивает Исполнителю вознаграждение в размере, ' 'порядке и сроки, которые установлены настоящим Договором.', style)) objs.append( Paragraph( '1.2. Исполнитель оказывает услуги по месту своего нахождения по адресу: ' 'г. Иркутск, Байкальская, 201, в соответствии с установленными Правилами предоставления платных медицинских услуг.', style)) objs.append(Spacer(1, 2 * mm)) objs.append(Paragraph('2. ПРАВА И ОБЯЗАННОСТИ СТОРОН', styleCenter)) objs.append(Paragraph('<u>2.1. Исполнитель обязуется:</u>', style)) objs.append( Paragraph( '2.1.1. Обеспечить Пациента бесплатной, доступной и достоверной информацией о платных медицинских услугах, ' 'содержащей следующие сведения о:', style)) objs.append( Paragraph( 'а) порядках оказания медицинской помощи и стандартах медицинской помощи, применяемых при предоставлении платных медицинских услуг;', style)) objs.append( Paragraph( 'б) данных о конкретном медицинском работнике, предоставляющем соответствующую платную медицинскую услугу (его профессиональном образовании и квалификации);', style)) objs.append( Paragraph( 'в) данных о методах оказания медицинской помощи, связанных с ними рисках, возможных видах медицинского вмешательства, их последствиях и ожидаемых результатах оказания медицинской помощи;', style)) objs.append( Paragraph( 'г) других сведениях, относящихся к предмету настоящего Договора.', style)) objs.append( Paragraph( '2.1.2.Оказывать Пациенту услуги, предусмотренные п. 1.1 настоящего Договора, а при необходимости и дополнительные услуги.', style)) objs.append( Paragraph( '2.1.3.Давать при необходимости по просьбе Пациента разъяснения о ходе оказания услуг ему и ' 'предоставлять по требованию Пациента необходимую медицинскую документацию.', style)) objs.append( Paragraph( '2.1.4.Предоставить в доступной форме информацию о возможности получения соответствующих видов ' 'и объемов медицинской помощи без взимания платы в рамках Программы государственных гарантий ' 'бесплатного оказания гражданам медицинской помощи и территориальной программы государственных гарантий ' 'бесплатного оказания гражданам медицинской помощи.', style)) objs.append( Paragraph( '2.15. Соблюдать порядки оказания медицинской помощи, утвержденные Министерством здравоохранения ' 'Российской Федерации.', style)) objs.append(Paragraph('<u>2.2. Пациент обязуется:</u>', style)) objs.append( Paragraph('2.2.1. Соблюдать назначение и рекомендации лечащих врачей.', style)) objs.append( Paragraph( '2.2.3. Оплачивать услуги Исполнителя в порядке, сроки и на условиях, которые установлены настоящим Договором.', style)) objs.append( Paragraph( '2.2.4. Подписывать своевременно акты об оказании услуг Исполнителем.', style)) objs.append(Paragraph('2.2.5. Кроме того Пациент обязан:', style)) objs.append( Paragraph( '- информировать врача о перенесенных заболеваниях, известных ему аллергических реакциях, противопоказаниях;', style)) objs.append( Paragraph( '- соблюдать правила поведения пациентов в медицинском учреждении, режим работы медицинского учреждения;', style)) objs.append( Paragraph( '- выполнять все рекомендации медицинского персонала и третьих лиц, оказывающих ему по настоящему Договору' 'медицинские услуги, по лечению, в том числе соблюдать указания медицинского учреждения, предписанные на период после оказания услуг.', style)) objs.append( Paragraph( '2.3. Предоставление Исполнителем дополнительных услуг оформляется дополнительным соглашением Сторон и оплачивается дополнительно.', style)) objs.append( Paragraph( '2.4. Стороны обязуются хранить в тайне лечебную, финансовую и иную конфиденциальную информацию, ' 'полученную от другой Стороны при исполнении настоящего Договора.', style)) objs.append(Paragraph('3. ПОРЯДОК ИСПОЛНЕНИЯ ДОГОВОРА', styleCenter)) objs.append( Paragraph( '3.1. Условия получения Пациентом медицинских услуг: (вне медицинской организации; амбулаторно; ' 'в дневном стационаре; стационарно; указать,организационные моменты, связанные с оказанием медицинских услуг)', style)) objs.append( Paragraph( '3.2. В случае если при предоставлении платных медицинских услуг требуется предоставление ' 'на возмездной основе дополнительных медицинских услуг, не предусмотренных настоящим Договором, ' 'Исполнитель обязан предупредить об этом Пациента.', style)) objs.append( Paragraph( 'Без согласия Пациента Исполнитель не вправе предоставлять дополнительные медицинские услуги на возмездной основе.', style)) objs.append( Paragraph( '3.3. В случае, если при предоставлении платных медицинских услуг потребуется предоставление ' 'дополнительных медицинских услуг по экстренным показаниям для устранения угрозы жизни Пациента' ' при внезапных острых заболеваниях, состояниях, обострениях хронических заболеваний, такие ' 'медицинские услуги оказываются без взимания платы в соответствии с Федеральным загоном ' 'от 21.11.2011N 323-ФЗ "Об основах охраны здоровья граждан в Российской Федерации".', style)) objs.append( Paragraph( '3.4. В случае отказа Пациента после заключения Договора от получения медицинских услуг Договор ' 'расторгается. При этом Пациент оплачивает Исполнителю фактически понесенные Исполнителем расходы,' 'связанные с исполнением обязательств по Договору. ', style)) objs.append( Paragraph( '3.5. К отношениям, связанным с исполнением настоящего Договора, применяются положения Закона ' 'Российской Федерации от 7 февраля 1992 г. N 2300-1 "О защите прав потребителей".', style)) objs.append(Paragraph('4. ПОРЯДОК ОПЛАТЫ', styleCenter)) s = pytils.numeral.rubles(float(sum_research_decimal)) objs.append( Paragraph( '4.1. Стоимость медицинских услуг составляет: <u>{}</u> '.format( s.capitalize()), style)) objs.append(Paragraph('Сроки оплаты:', style)) objs.append( Paragraph( 'Предоплата________________________________________ , оставшаяся сумма______________________________ рублей', style)) objs.append(Paragraph('Сроки оплаты: _________________________', style)) objs.append( Paragraph( '4.2. Компенсируемые расходы Исполнителя на _________________________________________________', style)) objs.append(Paragraph('составляют_____________________ рублей', style)) objs.append( Paragraph( '4.3. Оплата услуг производится путем перечисления суммы на расчетный счет Исполнителя или путем внесения в кассу Исполнителя.', style)) objs.append( Paragraph( 'Пациенту в соответствии с законодательством Российской Федерации выдается документ; ' 'подтверждающий произведенную оплату предоставленных медицинских услуг (кассовый чек, квитанция ' 'или иные документы).', style)) objs.append( Paragraph( '4.4. Дополнительные услуги оплачиваются на основании акта об оказанных услугах, подписанного Сторонами.', style)) objs.append(Paragraph('5. ОТВЕТСТВЕННОСТЬ СТОРОН', styleCenter)) objs.append( Paragraph( '5.1. Исполнитель несет ответственность перед Пациентом за неисполнение или ненадлежащее ' 'исполнение условий настоящего Договора, несоблюдение требований, предъявляемых к методам ' 'диагностики, профилактики и лечения, разрешенным на территории Российской Федерации, а также ' 'в случае причинения вреда здоровью и жизни Пациента.', style)) objs.append( Paragraph( '5.2. При несоблюдении Исполнителем обязательств по срокам исполнения услуг Пациент вправе по своему выбору:', style)) objs.append(Paragraph('- назначить новый срок оказания услуги;', style)) objs.append( Paragraph('- потребовать уменьшения стоимости предоставленной услуги;', style)) objs.append( Paragraph('- потребовать исполнения услуги другим специалистом;', style)) objs.append( Paragraph( '- расторгнуть настоящий Договор и потребовать возмещения убытков.', style)) objs.append( Paragraph( '5.3. Ни одна из Сторон не будет нести ответственности за полное или частичное неисполнение другой ' 'Стороной своих обязанностей, если, неисполнение будет являться следствием обстоятельств непреодолимой ' 'силы, таких как, пожар, наводнение, землетрясение, забастовки и другие стихийные бедствия; ' 'война и военные действия или другие обстоятельства, находящиеся вне контроля Сторон, ' 'препятствующие выполнению настоящего Договора, возникшие после заключения Договора, а также по ' 'иным основаниям, предусмотренным законом', style)) objs.append( Paragraph( 'Если любое из таких обстоятельств непосредственно повлияло на неисполнение обязательства в ' 'срок, указанный в Договоре, то этот срок соразмерно отодвигается на время действия соответствующего ' 'обстоятельства.', style)) objs.append( Paragraph( '5.4. Вред, причиненный жизни или здоровью Пациента в результате предоставления некачественной ' 'платной медицинской услуги, подлежит возмещению Исполнителем в соответствии с законодательством ' 'Российской Федерации.', style)) objs.append(Paragraph('6. ПОРЯДОК РАССМОТРЕНИЯ СПОРОВ', styleCenter)) objs.append( Paragraph( '6.1. Все споры, претензии и разногласия, которые могут возникнуть между Сторонами, будут ' 'разрешаться путем переговоров.', style)) objs.append( Paragraph( '6.2. При не урегулировании в процессе переговоров спорных вопросов споры подлежат рассмотрению ' 'в судебном порядке.', style)) objs.append(Paragraph('7. СРОК ДЕЙСТВИЯ ДОГОВОРА', styleCenter)) objs.append( Paragraph( '7.1. Срок действия настоящего Договора: с « » 201 г. по « » 201 г.', style)) objs.append( Paragraph( '7.2. Настоящий Договор, может быть, расторгнут по обоюдному согласию Сторон или в порядке, ' 'предусмотренном действующим законодательством.', style)) objs.append( Paragraph( '7.3. Все изменения и дополнения к настоящему Договору, а также его расторжение считаются ' 'действительными при условии, если они совершены в письменной форме и подписаны уполномоченными' ' на то представителями обеих Сторон.', style)) objs.append(Paragraph('8. ИНЫЕ УСЛОВИЯ', styleCenter)) objs.append( Paragraph( '8.1. Все дополнительные соглашения Сторон, акты и иные приложения к настоящему Договору, ' 'подписываемые Сторонами при исполнении настоящего Договора, являются его неотъемлемой частью.', style)) objs.append( Paragraph( '8.2. Настоящий Договор составлен в 2 (двух) экземплярах, имеющих одинаковую юридическую силу, ' 'по одному для каждой из Сторон', style)) # objs.append(Paragraph('9. АДРЕСА И РЕКВИЗИТЫ СТОРОН', styleCenter)) styleAtr = deepcopy(style) styleAtr.firstLineIndent = 0 f = ind.family n = ind.name[0:1] p = ind.patronymic[0:1] npf = n + '.' + ' ' + p + '.' + ' ' + f fio_director_list = exec_person.split(' ') print(fio_director_list) dir_f = fio_director_list[0] dir_n = fio_director_list[1] dir_p = fio_director_list[2] dir_npf = dir_n[0:1] + '.' + ' ' + dir_p[0:1] + '.' + ' ' + dir_f styleAtrEndStr = deepcopy(styleAtr) # styleAtrEndStr.spaceBefor = 5 space_symbol = ' ' opinion = [ [ Paragraph('Исполнитель', styleAtr), Paragraph('', styleAtr), Paragraph('Пациент/Плательщик:', styleAtr) ], [ Paragraph('{} <br/>{}'.format(hospital_name, hospital_address), styleAtr), Paragraph('', styleAtr), Paragraph( '{}<br/>Паспорт: {}-{}<br/>Адрес:{}'.format( individual_fio, document_passport_serial, document_passport_num, ind_card.main_address), styleAtr) ], [ Paragraph('', styleAtr), Paragraph('', style), Paragraph('', styleAtr) ], [ Paragraph('Сотрудник {}'.format(hospital_short_name), styleAtr), Paragraph('', styleAtr), Paragraph('', styleAtr) ], [ Paragraph('________________________/{}/'.format(dir_npf), styleAtr), Paragraph('', styleAtr), Paragraph( '/{}/________________________ <font face="Symbola" size=18>\u2713</font>' .format(npf), styleAtr) ], ] rowHeights = 5 * [None] rowHeights[4] = 35 tbl = Table(opinion, colWidths=(90 * mm, 10 * mm, 90 * mm), rowHeights=rowHeights) tbl.setStyle( TableStyle([ ('GRID', (0, 0), (-1, -1), 1.0, colors.white), ('TOPPADDING', (0, 0), (-1, -1), 1.5 * mm), ('VALIGN', (0, 0), (-1, -2), 'TOP'), ('VALIGN', (0, -1), (-1, -1), 'BOTTOM'), ('BOTTOMPADDING', (0, -1), (-1, -1), 4.2 * mm), ('BOTTOMPADDING', (0, -1), (0, -1), 1 * mm), ])) objs.append(Spacer(1, 2 * mm)) objs.append( KeepTogether( [Paragraph('9. АДРЕСА И РЕКВИЗИТЫ СТОРОН', styleCenter), tbl])) objs.append(Spacer(1, 7 * mm)) styleRight = deepcopy(style) styleRight.alignment = TA_RIGHT space_symbol = ' ' qr_napr = ','.join([str(elem) for elem in result_data[3]]) protect_val = SettingManager.get('protect_val') bstr = (qr_napr + protect_val).encode() protect_code = str(zlib.crc32(bstr)) left_size_str = hospital_short_name + 15 * space_symbol + protect_code + 15 * space_symbol qr_value = npf + '(' + qr_napr + '),' + protect_code def first_pages(canvas, document): canvas.saveState() canvas.setFont("PTAstraSerifReg", 9) # вывести интерактивную форму "текст" form = canvas.acroForm # canvas.drawString(25, 780, '') form.textfield(name='comment', tooltip='comment', fontName='Times-Roman', fontSize=10, x=57, y=750, borderStyle='underlined', borderColor=black, fillColor=white, width=515, height=13, textColor=black, forceBorder=False) # Вывести на первой странице код-номер договора barcode128.drawOn(canvas, 120 * mm, 283 * mm) #вывести внизу QR-code (ФИО, (номера направлений)) qr_code = qr.QrCodeWidget(qr_value) qr_code.barWidth = 70 qr_code.barHeight = 70 qr_code.qrVersion = 1 bounds = qr_code.getBounds() width = bounds[2] - bounds[0] height = bounds[3] - bounds[1] d = Drawing() d.add(qr_code) renderPDF.draw(d, canvas, 90 * mm, 7) #вывести атрибуты для подписей canvas.setFont('PTAstraSerifReg', 10) canvas.drawString(40 * mm, 10 * mm, '____________________________') canvas.drawString(115 * mm, 10 * mm, '/{}/____________________________'.format(npf)) canvas.setFont('Symbola', 18) canvas.drawString(195 * mm, 10 * mm, '\u2713') canvas.setFont('PTAstraSerifReg', 8) canvas.drawString(50 * mm, 7 * mm, '(подпись сотрудника)') canvas.drawString(160 * mm, 7 * mm, '(подпись плательщика)') #вывестии защитны вертикальный мелкий текст canvas.rotate(90) canvas.setFillColor(HexColor(0x4f4b4b)) canvas.setFont('PTAstraSerifReg', 5.2) canvas.drawString(10 * mm, -12 * mm, '{}'.format(6 * left_size_str)) canvas.restoreState() def later_pages(canvas, document): canvas.saveState() #вывести внизу QR-code (ФИО, (номера направлений)) qr_code = qr.QrCodeWidget(qr_value) qr_code.barWidth = 70 qr_code.barHeight = 70 qr_code.qrVersion = 1 bounds = qr_code.getBounds() width = bounds[2] - bounds[0] height = bounds[3] - bounds[1] d = Drawing() d.add(qr_code) renderPDF.draw(d, canvas, 90 * mm, 7) #вывести атрибуты для подписей canvas.setFont('PTAstraSerifReg', 10) canvas.drawString(40 * mm, 10 * mm, '____________________________') canvas.drawString(115 * mm, 10 * mm, '/{}/____________________________'.format(npf)) canvas.setFont('Symbola', 18) canvas.drawString(195 * mm, 10 * mm, '\u2713') canvas.setFont('PTAstraSerifReg', 8) canvas.drawString(50 * mm, 7 * mm, '(подпись сотрудника)') canvas.drawString(160 * mm, 7 * mm, '(подпись плательщика)') canvas.rotate(90) canvas.setFillColor(HexColor(0x4f4b4b)) canvas.setFont('PTAstraSerifReg', 5.2) canvas.drawString(10 * mm, -12 * mm, '{}'.format(6 * left_size_str)) canvas.restoreState() doc.build(objs, onFirstPage=first_pages, onLaterPages=later_pages, canvasmaker=PageNumCanvas) pdf = buffer.getvalue() buffer.close() return pdf
def log_cleanup(request): _, cnt = slog.objects.filter( time__lt=datetime.today() - timedelta(days=SettingManager.get("max_log_store_days", "120", "i"))).exclude(type__in=(7, 21, 9, 11, 12, 4000, 13, 14, 24, 26, 5001)).delete() return HttpResponse(str(cnt.get("slog.Log", 0)), content_type="text/plain")
def log(request): response = {"cnt": slog.objects.all().count(), "store_days": SettingManager.get("max_log_store_days", "120", "i")} response["to_delete"] = slog.objects.filter( time__lt=datetime.today() - timedelta(days=response["store_days"])).exclude(type__in=(7, 21, 9, 11, 12, 4000, 13, 14, 24, 26, 5001)).count() return JsonResponse(response)