Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 33.64 KB | None | 0 0
  1. # stdlib imports
  2. import logging
  3. import traceback
  4. import json
  5. from datetime import datetime
  6. from dateutil import relativedelta
  7. from sys import exc_info
  8. # django imports
  9.  
  10. from django.db import models
  11. from django.apps import apps
  12. from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned, ValidationError, FieldDoesNotExist
  13. from django.db import DatabaseError, transaction, IntegrityError
  14. from django.db.models import Q
  15. from django.forms import model_to_dict
  16.  
  17. from indivo.lib.indivo_exception import IndivoException
  18. from indivo.lib.utils import to_json
  19. from indivo.models.accounts import Account
  20. from indivo.models.records_and_documents import Record
  21. from indivo.models.doctor import DoctorAppointment
  22. from prescription.models import PrescriptionEntry, Prescription
  23. from rxprofile.models import DoctorProfile, ParentHistory
  24. # from doctor.models import AppointmentVital
  25. from complaint.models import SimpleComplaint
  26. from .utils import (get_complaints, get_diagnosis, get_doctor_notes, get_examination_findings, get_investigation,
  27. get_provisional_diagnosis, get_visit_history_item, get_lab_tests)
  28. from complaint.utils import get_simple_complaint_id, get_simple_complaint_appointment
  29. # from common.utils import get_appointment_vital
  30. # from doctor.models import OpReview
  31.  
  32.  
  33. logger = logging.getLogger(__name__)
  34.  
  35.  
  36. class OpReviewManager(models.Manager):
  37. def create_op_review(self, account, input_data):
  38. result = {}
  39. try:
  40. with transaction.atomic():
  41. patient = Account.objects.get(account__email=input_data.get('patient_email'))
  42. if input_data.get('follow_up_date'):
  43. follow_up_date = datetime.strptime(input_data.get('follow_up_date'), '%Y-%m-%d')
  44. else:
  45. follow_up_date = None
  46. op_review = self.create(doctor_account=account, patient_account=patient,
  47. appointment_id=input_data.get('appointment_id'),
  48. complaint_id=input_data.get('complaint_id'),
  49. notes=input_data.get('notes'), findings=input_data.get('findings'),
  50. provisional_diagnosis=input_data.get('provisional_diagnosis'),
  51. investigation=input_data.get('investigation'),
  52. diagnosis=input_data.get('diagnosis'),
  53. prescription_id=input_data.get('prescription_id'),
  54. advice=input_data.get('advice'),
  55. lab_tests=input_data.get('lab_tests'),
  56. image_attachments=input_data.get('image_attachments'),
  57. others=input_data.get('others'), follow_up_date=follow_up_date,
  58. follow_up_text=input_data.get('follow_up_text'))
  59. except (KeyError, ValueError, DatabaseError, Account.DoesNotExist) as e:
  60. print(e)
  61. logger.exception(e)
  62. result = {'error': 'unable to save review data'}
  63. except ValidationError as e:
  64. print(e)
  65. logger.exception(e)
  66. result = {'error': 'duplicate data or data not valid'}
  67. else:
  68. result = op_review
  69. finally:
  70. return result
  71.  
  72. def _get_complaint_vitals(self, op_review, appointment_id):
  73. if op_review.complaint:
  74. complaint_data = get_simple_complaint_id(op_review.complaint.id)
  75. else:
  76. complaint_data = get_simple_complaint_appointment(appointment_id)
  77.  
  78. if op_review:
  79. vitals_id = self._get_vitals_data(op_review)
  80. else:
  81. appointment = DoctorAppointment.objects.get(id=appointment_id)
  82. vitals_id = appointment.appointment_vital.get().vitals
  83.  
  84. return (complaint_data, vitals_id)
  85.  
  86. def get_op_review(self, appointment_id):
  87. try:
  88. op_review = self.prefetch_related('complaint').prefetch_related('prescription')\
  89. .get(appointment_id=appointment_id)
  90. if op_review.prescription:
  91. # obj = Prescription.objects.get(id=op_review.prescription)
  92. prescription = PrescriptionEntry.objects.get_prescription_entries(op_review.prescription)
  93. else:
  94. prescription = None
  95.  
  96. complaint_data, vitals_id = self._get_complaint_vitals(op_review, appointment_id)
  97.  
  98. op_review_data = {
  99. 'appointment_id': op_review.appointment_id, 'complaint': complaint_data, 'notes': op_review.notes,
  100. 'findings': op_review.findings, 'provisional_diagnosis': op_review.provisional_diagnosis,
  101. 'investigation': op_review.investigation, 'diagnosis': op_review.diagnosis,
  102. 'prescription': prescription, 'advice': op_review.advice,
  103. 'others': op_review.others, 'follow_up_date': op_review.follow_up_date,
  104. 'follow_up_text': op_review.follow_up_text,
  105. 'lab_tests': op_review.lab_tests, 'image_attachments': op_review.image_attachments,
  106. 'vitals': vitals_id
  107. }
  108. # except self.model.related_field.RelatedObjectDoesNotExist:
  109. # pass
  110. except (DatabaseError, KeyError, ValueError) as e:
  111. logger.exception(e)
  112. result = {'error': 'unable to retrieve object'}
  113. raise IndivoException
  114. except (PrescriptionEntry.DoesNotExist, Prescription.DoesNotExist) as e:
  115. complaint_data, vitals_id = self._get_complaint_vitals(op_review, appointment_id)
  116.  
  117. result = {
  118. 'appointment_id': op_review.appointment_id, 'complaint': complaint_data, 'notes': op_review.notes,
  119. 'findings': op_review.findings, 'provisional_diagnosis': op_review.provisional_diagnosis,
  120. 'investigation': op_review.investigation, 'diagnosis': op_review.diagnosis,
  121. 'prescription': None, 'advice': op_review.advice,
  122. 'others': op_review.others, 'follow_up_date': op_review.follow_up_date,
  123. 'follow_up_text': op_review.follow_up_text,
  124. 'lab_tests': op_review.lab_tests, 'image_attachments': op_review.image_attachments,
  125. 'vitals': vitals_id
  126. }
  127. except self.model.DoesNotExist as e:
  128. # print('no object: {}'.format(e))
  129. try:
  130. complaint_data = get_simple_complaint_appointment(appointment_id)
  131. except self.model.DoesNotExist:
  132. result = {}
  133. else:
  134. result = {'complaint': complaint_data}
  135. finally:
  136. return result
  137. else:
  138. result = op_review_data
  139. finally:
  140. return result
  141.  
  142. def update_op_review(self, input_data):
  143. result = {}
  144. try:
  145. op_review = self.prefetch_related('complaint').prefetch_related('prescription')\
  146. .get(appointment_id=input_data['appointment_id'])
  147. prescription = PrescriptionEntry.objects.get_prescription_entries(op_review.prescription)
  148. if input_data.get('notes'):
  149. op_review.notes = input_data.get('notes')
  150.  
  151. if input_data.get('findings'):
  152. op_review.findings = input_data.get('findings')
  153.  
  154. if input_data.get('provisional_diagnosis'):
  155. op_review.provisional_diagnosis = input_data.get('provisional_diagnosis')
  156.  
  157. if input_data.get('investigation'):
  158. op_review.investigation = input_data.get('investigation')
  159.  
  160. if input_data.get('diagnosis'):
  161. op_review.diagnosis = input_data.get('diagnosis')
  162.  
  163. if input_data.get('advice'):
  164. op_review.food_instructions = input_data.get('advice')
  165.  
  166. if input_data.get('others'):
  167. op_review.others = input_data.get('others')
  168.  
  169. if input_data.get('follow_up_date'):
  170. follow_up_date = datetime.strptime(input_data.get('follow_up_date'), '%Y-%m-%d')
  171. op_review.follow_up_date = follow_up_date
  172.  
  173. if input_data.get('follow_up_text'):
  174. op_review.follow_up_text = input_data.get('follow_up_text')
  175.  
  176. if input_data.get('prescription_id'):
  177. op_review.prescription_id = input_data.get('prescription_id')
  178.  
  179. if input_data.get('complaint_id'):
  180. op_review.complaint_id = input_data.get('complaint_id')
  181.  
  182. if input_data.get('lab_tests'):
  183. op_review.complaint_id = input_data.get('lab_tests')
  184.  
  185. op_review.save()
  186.  
  187. op_review_data = {
  188. 'appointment_id': op_review.appointment_id, 'complaint': {'issue': op_review.complaint.issue,
  189. 'medicine_given': op_review.complaint.medicine_given},
  190. 'notes': op_review.notes,
  191. 'findings': op_review.findings, 'provisional_diagnosis': op_review.provisional_diagnosis,
  192. 'investigation': op_review.investigation, 'diagnosis': op_review.diagnosis,
  193. 'prescription': prescription, 'advice': op_review.advice,
  194. 'others': op_review.others, 'follow_up_date': op_review.follow_up_date, 'lab_tests': op_review.lab_tests
  195. }
  196.  
  197. except (DatabaseError, KeyError, ValueError) as e:
  198. # print(e)
  199. logger.exception(e)
  200. result = {'error': 'unable to save'}
  201. except self.model.DoesNotExist as e:
  202. # print(e)
  203. logger.exception(e)
  204. result = {'error': 'unable to retrieve existing overview entry'}
  205. else:
  206. result = op_review_data
  207. finally:
  208. return result
  209.  
  210. def get_historical_items(self, doctor_account, patient_email):
  211. complaints = list()
  212. notes = list()
  213. findings = list()
  214. provisional_diagnosis = list()
  215. investigations = list()
  216. diagnosis = list()
  217. try:
  218. patient_account = Account.objects.get(account__email=patient_email)
  219. op_reviews = self.filter(doctor_account=doctor_account, patient_account=patient_account)\
  220. .prefetch_related('complaint')
  221. for item in op_reviews:
  222. get_complaints(item, complaints)
  223. get_doctor_notes(item, notes)
  224. get_examination_findings(item, findings)
  225. get_provisional_diagnosis(item, provisional_diagnosis)
  226. get_investigation(item, investigations)
  227. get_diagnosis(item, diagnosis)
  228.  
  229. result = {'overview_history': {
  230. 'complaints': complaints, 'doctor_notes': notes, 'examination_findings': findings,
  231. 'provisional_diagnosis': provisional_diagnosis, 'investigations': investigations,
  232. 'diagnosis': diagnosis
  233. }}
  234. except (DatabaseError, KeyError, ValueError) as e:
  235. print(e)
  236. logger.error(e)
  237. result = {'error': 'unable to get overview history'}
  238. except Account.DoesNotExist as e:
  239. logger.error(e)
  240. result = {'error': 'unable to retrieve patient'}
  241. else:
  242. pass
  243. finally:
  244. return result
  245.  
  246. def get_simple_visit_history(self, doctor_account, patient_email):
  247. history_items = list()
  248. try:
  249. patient_account = Account.objects.get(account__email=patient_email)
  250. op_reviews = self.filter(doctor_account=doctor_account, patient_account=patient_account)\
  251. .prefetch_related('complaint')
  252. # print('op reviews model:{}'.format(op_reviews))
  253. for item in op_reviews:
  254. get_visit_history_item(item, history_items)
  255.  
  256. result = {'visit_history': history_items}
  257. except (DatabaseError, KeyError, ValueError) as e:
  258. logger.error(e)
  259. result = {'error': 'unable to get visit history'}
  260. except Account.DoesNotExist as e:
  261. logger.error(e)
  262. result = {'error': 'unable to retrieve patient'}
  263. else:
  264. pass
  265. finally:
  266. return result
  267.  
  268. def get_simple_visit_history_mobile(self, patient_account, doctor_email):
  269. history_items = list()
  270. try:
  271. doctor_account = Account.objects.get(account__email=doctor_email)
  272. op_reviews = self.filter(doctor_account=doctor_account, patient_account=patient_account)\
  273. .prefetch_related('complaint')
  274. # print('op reviews model:{}'.format(op_reviews))
  275. for item in op_reviews:
  276. get_visit_history_item(item, history_items)
  277.  
  278. result = {'visit_history': history_items}
  279. except (DatabaseError, KeyError, ValueError) as e:
  280. logger.error(e)
  281. result = {'error': 'unable to get visit history'}
  282. except Account.DoesNotExist as e:
  283. logger.error(e)
  284. result = {'error': 'unable to retrieve doctor'}
  285. else:
  286. pass
  287. finally:
  288. return result
  289.  
  290. def get_lab_tests(self, doctor_account, patient_email):
  291. lab_tests_list = list()
  292. try:
  293. patient_account = Account.objects.get(account__email=patient_email)
  294. op_reviews = self.filter(doctor_account=doctor_account, patient_account=patient_account)
  295. for item in op_reviews:
  296. get_lab_tests(item, lab_tests_list)
  297.  
  298. result = {'lab_tests': lab_tests_list}
  299. except (DatabaseError, KeyError, ValueError) as e:
  300. logger.error(e)
  301. except Account.DoesNotExist as e:
  302. logger.error(e)
  303. else:
  304. return result
  305.  
  306. @staticmethod
  307. def _get_simple_report(op_review):
  308. """
  309. common information for simple prescription and visit history
  310. :param op_review:
  311. :return:
  312. """
  313. try:
  314. prescription = PrescriptionEntry.objects.get_prescription_entries(op_review.prescription)
  315. advice_data = {'advice': op_review.advice,
  316. 'others': op_review.others, }
  317.  
  318. result = {'diagnosis': op_review.diagnosis, 'advice': advice_data,
  319. 'follow_up_date': op_review.follow_up_date, 'follow_up_text': op_review.follow_up_text,
  320. 'prescription': prescription, 'prescription_expiry_date': op_review.prescription.expiry_date}
  321. except (PrescriptionEntry.DoesNotExist, Prescription.DoesNotExist):
  322. advice_data = {'advice': op_review.advice,
  323. 'others': op_review.others, }
  324.  
  325. result = {'diagnosis': op_review.diagnosis, 'advice': advice_data,
  326. 'follow_up_date': op_review.follow_up_date, 'follow_up_text': op_review.follow_up_text,
  327. 'prescription': None, 'prescription_expiry_date': None}
  328. except (DatabaseError, KeyError, ValueError, Exception) as e:
  329. logger.error(e)
  330. # print(e)
  331. result = {'error': 'unable to get report data'}
  332. else:
  333. pass
  334. finally:
  335. return result
  336.  
  337. @staticmethod
  338. def _get_doctor_details(op_review):
  339. """
  340. doctor details for prescription
  341. :param op_review:
  342. :return:
  343. """
  344. try:
  345. # profile = DoctorProfile.objects.get_doctor_profile(op_review.doctor_account)
  346. profile = op_review.doctor_account.account_doctor_profile
  347. profile_data = {'full_name': op_review.doctor_account.full_name,
  348. 'registration_number': profile.registration, 'degree': profile.degree}
  349. result = {'doctor_profile': profile_data}
  350. except (DatabaseError, KeyError, ValueError) as e:
  351. logger.error(e)
  352. result = {'error': 'unable to get report data'}
  353. except DoctorProfile.DoesNotExist as e:
  354. logger.error(e)
  355. result = {'error': 'doctor profile not present'}
  356. else:
  357. pass
  358. finally:
  359. return result
  360.  
  361. @staticmethod
  362. def _get_doctor_notes(op_review):
  363. """
  364. get doctor notes
  365. :param op_review:
  366. :return:
  367. """
  368. try:
  369. notes_data = op_review.notes
  370. result = {'notes': notes_data}
  371. except (DatabaseError, KeyError, ValueError, FieldDoesNotExist) as e:
  372. logger.error(e)
  373. result = {'error': 'unable to get notes data'}
  374. else:
  375. pass
  376. finally:
  377. return result
  378.  
  379. @staticmethod
  380. def _get_lab_test_data(op_review):
  381. """
  382. get lab test data
  383. :param op_review:
  384. :return:
  385. """
  386. try:
  387. lab_test_data = op_review.lab_tests
  388. result = {'lab_tests': lab_test_data}
  389. except (DatabaseError, KeyError, ValueError, FieldDoesNotExist) as e:
  390. logger.error(e)
  391. result = {'error': 'unable to get lab test data'}
  392. else:
  393. pass
  394. finally:
  395. return result
  396.  
  397. @staticmethod
  398. def _get_patient_details(op_review):
  399. try:
  400. record = Record.objects.prefetch_related('demographics').get(owner_id=op_review.patient_account.id)
  401. today = datetime.today()
  402. age = relativedelta.relativedelta(today, record.demographics.bday)
  403. if age.years > 1:
  404. years = 'years'
  405. else:
  406. years = 'year'
  407.  
  408. if age.months > 1:
  409. months = 'months'
  410. else:
  411. months = 'month'
  412.  
  413. demographics_data = {'patient_name': '{} {}'.format(record.demographics.name_given,
  414. record.demographics.name_family),
  415. 'gender': record.demographics.gender, 'dob': record.demographics.bday,
  416. 'mr_number': record.demographics.mr_number,
  417. 'blood_group': record.demographics.blood_group,
  418. 'age': '{} {} {} {}'.format(age.years, years, age.months, months)}
  419.  
  420. family_history_data = ParentHistory.objects.get_hereditary_disease(op_review.patient_account.email)
  421.  
  422. result = {'patient_demographics': demographics_data, 'family_history': family_history_data}
  423. except (DatabaseError, KeyError, ValueError) as e:
  424. logger.error(e)
  425. result = {'error': 'unable to get report data'}
  426. except Record.DoesNotExist as e:
  427. logger.error(e)
  428. result = {'error': 'patient record not present'}
  429. else:
  430. pass
  431. finally:
  432. return result
  433.  
  434. @staticmethod
  435. def _get_additional_prescription_details(op_review):
  436. try:
  437. complaint_data = get_simple_complaint_id(op_review.complaint.id)
  438. # print(complaint_data)
  439. doctor_data = {
  440. 'complaint': complaint_data, 'diagnosis': op_review.diagnosis, 'findings': op_review.findings,
  441. 'investigation': op_review.investigation
  442. }
  443. result = doctor_data
  444. except (IndivoException, KeyError, ValueError) as e:
  445. # print(e)
  446. logger.error(e)
  447. result = {'error': 'unable to get report data'}
  448. else:
  449. pass
  450. finally:
  451. return result
  452.  
  453. @staticmethod
  454. def _get_vitals_data(op_review):
  455. try:
  456. vitals_id = op_review.appointment.appointment_vital.get().vitals
  457. except ObjectDoesNotExist:
  458. vitals_id = ''
  459.  
  460. return vitals_id
  461.  
  462. def get_visit_history_detailed(self, overview_id):
  463. try:
  464. op_review = self.prefetch_related('prescription').get(id=overview_id)
  465. final_data = self._get_simple_report(op_review)
  466. notes_data = self._get_doctor_notes(op_review)
  467. final_data.update(notes_data)
  468. lab_test_data = self._get_lab_test_data(op_review)
  469. final_data.update(lab_test_data)
  470. # try:
  471. # vitals_id = op_review.appointment.appointment_vital.get().vitals
  472. # except ObjectDoesNotExist:
  473. # vitals_id = ''
  474. vitals_id = self._get_vitals_data(op_review)
  475. vitals_data = dict(vitals=vitals_id)
  476. final_data.update(vitals_data)
  477. # print('before result')
  478. result = {'visit_history_detailed': final_data}
  479. # print(result)
  480. except (DatabaseError, KeyError, ValueError, Exception) as e:
  481. # print('in ex mgr')
  482. logger.error(e)
  483. # print(e)
  484. # print(traceback.print_exc())
  485. result = {'error': 'unable to get patient overview data'}
  486. else:
  487. pass
  488. finally:
  489. return result
  490.  
  491. def get_simple_prescription_report(self, overview_id):
  492. try:
  493. op_review = self.prefetch_related('prescription').prefetch_related('doctor_account').get(id=overview_id)
  494. final_data = self._get_simple_report(op_review)
  495. doctor_profile_data = self._get_doctor_details(op_review)
  496. final_data.update(doctor_profile_data)
  497. patient_data = self._get_patient_details(op_review)
  498. final_data.update(patient_data)
  499. result = {'simple_prescription': final_data}
  500. except (DatabaseError, KeyError, ValueError) as e:
  501. logger.error(e)
  502. result = {'error': 'unable to get patient overview data'}
  503. else:
  504. pass
  505. finally:
  506. return result
  507.  
  508. def get_detailed_prescription_report(self, overview_id):
  509. try:
  510. op_review = self.prefetch_related('prescription').prefetch_related('complaint').get(id=overview_id)
  511. final_data = self._get_simple_report(op_review)
  512. doctor_profile_data = self._get_doctor_details(op_review)
  513. final_data.update(doctor_profile_data)
  514. patient_data = self._get_patient_details(op_review)
  515. final_data.update(patient_data)
  516. notes_data = self._get_doctor_notes(op_review)
  517. final_data.update(notes_data)
  518. lab_test_data = self._get_lab_test_data(op_review)
  519. final_data.update(lab_test_data)
  520. doctor_data = self._get_additional_prescription_details(op_review)
  521. final_data.update(doctor_data)
  522. # try:
  523. # vitals_id = op_review.appointment.appointment_vital.get().vitals
  524. # except ObjectDoesNotExist:
  525. # vitals_id = ''
  526. vitals_id = self._get_vitals_data(op_review)
  527. vitals_data = dict(vitals=vitals_id)
  528. final_data.update(vitals_data)
  529. result = {'detailed_prescription': final_data}
  530. except (DatabaseError, KeyError, ValueError) as e:
  531. logger.error(e)
  532. result = {'error': 'unable to get patient overview data'}
  533. else:
  534. pass
  535. finally:
  536. return result
  537.  
  538. def attach_lab_test_image(self, overview_id, image_list):
  539. try:
  540. with transaction.atomic():
  541. op_review = self.get(id=overview_id)
  542. op_review.image_attachments = image_list
  543. op_review.save()
  544. except (DatabaseError, KeyError, ValueError, FieldDoesNotExist) as e:
  545. # print(e)
  546. raise IndivoException(e)
  547. else:
  548. result = {'response': 'image attached successfully'}
  549. return result
  550.  
  551. def get_previous_investigation_reports(self, overview_id):
  552. try:
  553. op_review = self.get(id=overview_id)
  554. previous = op_review.get_previous_by_created_at()
  555. attachments = previous.image_attachments
  556. except (self.model.DoesNotExist, KeyError, ValueError, FieldDoesNotExist, DatabaseError) as e:
  557. raise IndivoException(e)
  558. else:
  559. return attachments
  560.  
  561.  
  562. class ImageManager(models.Manager):
  563. def add_profile_image(self, account, data, image_id):
  564. try:
  565. # print('in add profile')
  566. if data.get('user_type') == 'doctor' and data.get('profile_type') == 'patient':
  567. patient_account = Account.objects.get(account__email=data.get('patient_email'))
  568. created_for = patient_account
  569. else:
  570. created_for = account
  571. with transaction.atomic():
  572. kwargs = {'account': created_for, 'category': 'profile'}
  573. defaults = {'image_id': image_id, 'creator': account}
  574. image = self.update_or_create(defaults=defaults, **kwargs)
  575. except (DatabaseError, KeyError, ValidationError, IntegrityError, FieldDoesNotExist) as e:
  576. # print(e)
  577. raise IndivoException(e)
  578. else:
  579. return {'response': 'image link saved successfully'}
  580.  
  581. def get_image_link(self, account, category):
  582. try:
  583. if category == 'profile':
  584. image = self.get(account=account, category=category)
  585. image_link = image.image_id
  586. except (MultipleObjectsReturned, KeyError, ValueError) as e:
  587. raise IndivoException(e)
  588. else:
  589. return {'image_id': image_link}
  590.  
  591. def get_images(self, account, category, user_type=None, patient_email=None):
  592. try:
  593. if user_type == 'doctor':
  594. patient = Account.objects.get(account__email=patient_email)
  595. image_account = patient
  596. else:
  597. image_account = account
  598. images = self.filter(account=image_account, category=category).values_list('image_id', flat=True)
  599. except (DatabaseError, KeyError, ValueError) as e:
  600. raise
  601. else:
  602. return images
  603.  
  604.  
  605. class LabTestManager(models.Manager):
  606. def add_lab_test(self, account, test_data):
  607. try:
  608. with transaction.atomic():
  609. test = self.create(account=account, creator=account, json=test_data, status='active')
  610. result = dict(id=test.id, created_at=test.created_at, account=test.account_id, status=test.status,
  611. json=test.json)
  612. except (KeyError, DatabaseError, ValueError) as e:
  613. raise IndivoException(e)
  614. else:
  615. return result
  616.  
  617. def get_lab_test(self, account, filter_option, filter_value=None):
  618. try:
  619. if filter_option == 'all':
  620. tests = self.filter(account=account, status='active').order_by('created_at')
  621. # result = [x for x in tests]
  622. result = list()
  623. for item in tests:
  624. data = dict(id=item.id, created_at=item.created_at, account=item.account_id, status=item.status,
  625. json=item.json)
  626. result.append(data)
  627. # print(result)
  628. # print('in all')
  629. elif filter_option == 'id':
  630. obj = self.get(id=filter_value)
  631. # result = model_to_dict(obj)
  632. result = dict(id=obj.id, created_at=obj.created_at, account=obj.account_id, status=obj.status,
  633. json=obj.json)
  634. elif filter_option == 'title_like':
  635. # search =
  636. result = list()
  637.  
  638. tests = self.filter(account=account, status='active', json__iregex=filter_value)\
  639. .order_by('created_at')
  640. for obj in tests:
  641. data = dict(id=obj.id, created_at=obj.created_at, account=obj.account_id, status=obj.status,
  642. json=obj.json)
  643. result.append(data)
  644.  
  645. except (DatabaseError, KeyError, ValueError) as e:
  646. raise IndivoException(e)
  647. else:
  648. return result
  649.  
  650. def update_lab_test(self, account, doc_id, test_data):
  651. try:
  652. with transaction.atomic():
  653. existing_test = self.get(id=doc_id)
  654. existing_test.status = 'void'
  655. existing_test.save()
  656.  
  657. new_test = self.create(account=account, creator=account, json=test_data, status='active')
  658. result = dict(id=new_test.id, created_at=new_test.created_at, account=new_test.account_id,
  659. status=new_test.status, json=new_test.json)
  660. except (DatabaseError, KeyError, ValueError) as e:
  661. raise IndivoException(e)
  662. else:
  663. return result
  664.  
  665.  
  666. class AdviceManager(models.Manager):
  667. def create_advice(self, account, disease, description):
  668. try:
  669. with transaction.atomic():
  670. advice = self.create(doctor_account=account, creator=account, disease=disease, description=description)
  671. except (DatabaseError, FieldDoesNotExist, KeyError) as e:
  672. logger.error(e)
  673. raise IndivoException(e)
  674. else:
  675. return advice
  676.  
  677. def create_advice_bulk(self, account, input_data):
  678. try:
  679. for item in input_data:
  680. with transaction.atomic():
  681. advice = self.create(doctor_account=account, creator=account, disease=item.get('disease'),
  682. description=item.get('description'))
  683. except (DatabaseError, FieldDoesNotExist, KeyError) as e:
  684. logger.error(e)
  685. raise IndivoException(e)
  686. else:
  687. return self._get_advice_list(account)
  688.  
  689. def _get_advice_list(self, account):
  690. try:
  691. result = self.filter(doctor_account=account).values('id', 'disease', 'description')
  692. result_list = [x for x in result]
  693. except (DatabaseError, KeyError, ValueError) as e:
  694. logger.error(e)
  695. raise IndivoException(e)
  696. else:
  697. return result_list
  698.  
  699. def list_advice(self, account):
  700. return self._get_advice_list(account)
  701.  
  702. def update_advice(self, input_data):
  703. try:
  704. advice = self.get(id=input_data.get('id'))
  705. with transaction.atomic():
  706. if input_data.get('disease'):
  707. advice.disease = input_data.get('disease')
  708.  
  709. if input_data.get('description'):
  710. advice.description = input_data.get('description')
  711.  
  712. advice.save()
  713. result = {'id': advice.id, 'disease': advice.disease, 'description': advice.description}
  714.  
  715. except (DatabaseError, KeyError, ValueError) as e:
  716. logger.error(e)
  717. else:
  718. return result
  719.  
  720.  
  721. class AppointmentVitalManager(models.Manager):
  722. def link_appointment(self, appointment_id, vital_id):
  723. try:
  724. obj = self.create(appointment_id=appointment_id, vitals=vital_id)
  725. except (DatabaseError, KeyError, ValueError, IntegrityError) as e:
  726. raise IndivoException(e)
  727. else:
  728. return {'result': 'appointment and vital linked'}
  729.  
  730. def get_vitals(self, appointment_id):
  731. try:
  732. obj = self.get(appointment_id=appointment_id)
  733. except (self.model.DoesNotExist, DatabaseError, KeyError, ValueError, IndexError) as e:
  734. raise IndivoException(e)
  735. else:
  736. result = obj.vitals
  737. return result
  738.  
  739.  
  740. class MedicalHistoryManager(models.Manager):
  741. def create_medical_history(self, doctor_account, patient_email, input_data):
  742. try:
  743. # print(patient_email)
  744. patient_account = Account.objects.get(account__email=patient_email)
  745. obj = self.create(patient_account=patient_account,
  746. date=input_data.get('date'),
  747. problem_type=input_data.get('problem_type'),
  748. hospital_name=input_data.get('hospital_name'),
  749. doctor_first_name=input_data.get('doctor_first_name'),
  750. doctor_last_name=input_data.get('doctor_last_name'),
  751. diagnosis=input_data.get('diagnosis'),
  752. creator=doctor_account
  753. )
  754. except Account.DoesNotExist as e:
  755. raise
  756. except (DatabaseError, KeyError, ValueError, IndexError, FieldDoesNotExist) as e:
  757. raise
  758. else:
  759. return obj
  760.  
  761. def get_medical_history(self, history_id):
  762. try:
  763. obj = self.get(id=history_id)
  764. except (self.model.DoesNotExist, KeyError, IndexError, FieldDoesNotExist) as e:
  765. raise
  766. else:
  767. return obj
  768.  
  769. def list_medical_history(self, patient_email):
  770. try:
  771. patient_account = Account.objects.get(account__email=patient_email)
  772. items = self.filter(patient_account=patient_account).values('date', 'problem_type', 'hospital_name',
  773. 'doctor_first_name', 'doctor_last_name',
  774. 'diagnosis', 'id')
  775. result = [x for x in items]
  776. except (DatabaseError, KeyError, ValueError, IndexError) as e:
  777. raise
  778. else:
  779. return result
  780.  
  781. def update_medical_history(self, history_id, input_data):
  782. try:
  783. obj = self.get(id=history_id)
  784.  
  785. if input_data.get('date'):
  786. obj.date = input_data.get('date')
  787.  
  788. if input_data.get('problem_type'):
  789. obj.problem_type = input_data.get('problem_type')
  790.  
  791. if input_data.get('hospital_name'):
  792. obj.hospital_name = input_data.get('hospital_name')
  793.  
  794. if input_data.get('doctor_first_name'):
  795. obj.doctor_first_name = input_data.get('doctor_first_name')
  796.  
  797. if input_data.get('doctor_last_name'):
  798. obj.doctor_last_name = input_data.get('doctor_last_name')
  799.  
  800. if input_data.get('diagnosis'):
  801. obj.diagnosis = input_data.get('diagnosis')
  802.  
  803. obj.save()
  804.  
  805. except (self.model.DoesNotExist, KeyError, IndexError, FieldDoesNotExist) as e:
  806. raise
  807. else:
  808. return obj
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement