Advertisement
Guest User

Untitled

a guest
Nov 25th, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.79 KB | None | 0 0
  1. from django.http import HttpResponse
  2.  
  3.  
  4. from dreamed_dms.lib import *
  5. from django.views.generic import TemplateView
  6. from dreamed_dms.forms import *
  7. from dreamed_dms.parsers import carelink_personal, carelink_pro, diasend, gocap, diabetesm, doctor_recommendation_parser,glooko_multi_patient
  8. from dreamed_dms.parsers.tidepool_parser import TidepoolParser
  9. from dreamed_dms.parsers.libre_parser import LibreParser
  10. from dreamed_dms.parsers.ads_mongodb import *
  11. from dreamed_dms.parsers import master_file
  12. from dreamed_dms.decorators import *
  13. from django.utils.decorators import method_decorator
  14. from datetime import datetime as dt, timedelta as td
  15. import json
  16. import time
  17. from dreamed_dms.models import *
  18. from django.shortcuts import render
  19. from django.views.generic.edit import FormView
  20. from adp_api.models import AdpRequest
  21. from dreamed_dms.parsers.lib import find_sync_timestamps
  22. from adp_api.core.lib import process_adp_request,parse_glooko_data,AdpInput
  23.  
  24. log = logging.getLogger(__name__)
  25.  
  26. #@method_decorator(staff_member_required, name='dispatch')
  27.  
  28.  
  29.  
  30. class RunAdvisorPro(FormView):
  31. """
  32. A view to run the Advisor Pro algorithm on a patient data in the DB and receive the recommendation with an option to feedback directly in the returned page
  33.  
  34. - SRS-24
  35. """
  36. form_class = RunAdvisorProForm
  37. template_name = 'form_generic.html' # Replace with your template.
  38. success_url = 'done/' # Replace with your URL or reverse().
  39.  
  40. def post(self, request, **kwargs):
  41. form = self.get_form(self.form_class)
  42.  
  43. if form.is_valid():
  44. patient = Patient.objects.get(id=request.POST.get("patient"))
  45.  
  46. end_date_str = request.POST.get("end_date")
  47.  
  48. if end_date_str:
  49. end_date = dt.strptime(end_date_str, "%Y-%m-%d")
  50. end = dt.combine(end_date.date(), dt.max.time())
  51. else:
  52. end = dt.combine(dt.now().date(), dt.max.time())
  53.  
  54. start_exact = end - td(days=21)
  55. start = dt.combine(start_exact.date(), dt.min.time())
  56.  
  57. language = request.POST.get("language") or patient.language
  58. adp_request = AdpRequest.objects.create(patient=patient, start=start, end=end, user=request.user, status="IN_PROCESS") # to avoid running in using the queue
  59. try:
  60. process_adp_request(adp_request)
  61. except Exception as e:
  62. log.exception(e)
  63. adp_request.status = "ERROR"
  64. adp_request.error = "error processing request: " + str(e)
  65. adp_request.save()
  66.  
  67. if adp_request.status == "COMPLETED":
  68. context = create_recommendation_context(adp_request, language)
  69. return render(request, 'advisor_pro_output.html', context)
  70. else:
  71. log.error("Advisor Pro request Failed: " + str(adp_request.error))
  72. return HttpResponse("Advisor Pro request Failed: " + str(adp_request.error))
  73. else:
  74. return self.form_invalid(form)
  75.  
  76.  
  77.  
  78. class GenerateAdpInput(FormView):
  79. """
  80. A view for generating an ADP Input JSON the same way it is generated for an Advisor Pro request
  81.  
  82. - SRS-29
  83. """
  84. form_class = GenerateAdpInput
  85. template_name = 'form_generic.html' # Replace with your template.
  86. success_url = 'done/' # Replace with your URL or reverse().
  87.  
  88. def post(self, request, **kwargs):
  89. form = self.get_form(self.form_class)
  90.  
  91. if form.is_valid():
  92. patient = Patient.objects.get(id=request.POST.get("patient"))
  93. # glooko_format = request.POST.get("glooko_format")
  94. end_date_str = request.POST.get("end_date")
  95.  
  96. if end_date_str:
  97. end_date = dt.strptime(end_date_str, "%Y-%m-%d")
  98. end = dt.combine(end_date.date(), dt.max.time())
  99. else:
  100. end = dt.combine(dt.now().date(), dt.max.time())
  101.  
  102. start_exact = end - td(days=21)
  103. start = dt.combine(start_exact.date(), dt.min.time())
  104.  
  105. try:
  106. adp_input = AdpInput(patient=patient, start=start, end=end)
  107. except AssertionError as e:
  108. log.exception(e)
  109. return HttpResponse("error generating ADP Input JSON: " + str(e))
  110.  
  111. # if glooko_format:
  112. # return HttpResponse('<textarea rows="50" cols="200">' + json.dumps(adp_input_to_glooko(adp_input), sort_keys=True, indent=4) + '</textarea>')
  113. # else:
  114. return HttpResponse('<textarea rows="50" cols="200">'+json.dumps(adp_input.json,sort_keys=True, indent=4)+'</textarea>')
  115. else:
  116. return self.form_invalid(form)
  117.  
  118.  
  119. class ParsePlans(FormView):
  120. form_class = ParsePlansForm
  121. template_name = 'form_generic.html' # Replace with your template.
  122. success_url = 'done/' # Replace with your URL or reverse().
  123.  
  124. def post(self, request, **kwargs):
  125. form = self.get_form(self.form_class)
  126.  
  127. if form.is_valid():
  128. patient = Patient.objects.get(id=request.POST.get("patient"))
  129. plans = json.loads(request.POST.get("plans_json"))
  130.  
  131. effective_date_str = request.POST.get("effective_date")
  132.  
  133. if not effective_date_str:
  134. effective_date = dt.now()
  135. else:
  136. effective_date = dt.strptime(effective_date_str, "%Y-%m-%d")
  137.  
  138. #new plans
  139. pump_setting, created = patient.pump_settings.get_or_create(start=effective_date, type="ai")
  140. pump_setting.plan = plans['ai']
  141. pump_setting.save()
  142.  
  143. pump_setting, created = patient.pump_settings.get_or_create(start=effective_date, type="basal")
  144. pump_setting.plan = plans['basal']
  145. pump_setting.save()
  146.  
  147. pump_setting, created = patient.pump_settings.get_or_create(start=effective_date, type="cr")
  148. pump_setting.plan = plans['cr']
  149. pump_setting.save()
  150.  
  151. pump_setting, created = patient.pump_settings.get_or_create(start=effective_date, type="cf")
  152. pump_setting.plan = plans['cf']
  153. pump_setting.save()
  154.  
  155. pump_setting, created = patient.pump_settings.get_or_create(start=effective_date, type="targets")
  156. pump_setting.plan = plans['targets']
  157. pump_setting.save()
  158.  
  159. #old plans
  160. plan, created = patient.plans.get_or_create(start_hour=plans['ai']['start_hour'], type="ai", plan_index=1)
  161. plan.value = plans['ai']['value']
  162. plan.timestamp = effective_date
  163. plan.save()
  164.  
  165. for x in plans['basal']:
  166. plan, created = patient.plans.get_or_create(start_hour=x['start_hour'], type="basal", plan_index=1)
  167. plan.value = x['value']
  168. plan.timestamp = effective_date
  169. plan.save()
  170.  
  171. for x in plans['cr']:
  172. plan, created = patient.plans.get_or_create(start_hour=x['start_hour'], type="cr", plan_index=1)
  173. plan.value = x['value']
  174. plan.timestamp = effective_date
  175. plan.save()
  176.  
  177. for x in plans['cf']:
  178. plan, created = patient.plans.get_or_create(start_hour=x['start_hour'], type="cf", plan_index=1)
  179. plan.value = x['value']
  180. plan.timestamp = effective_date
  181. plan.save()
  182.  
  183. for x in plans['targets']:
  184. plan, created = patient.plans.get_or_create(start_hour=x['start_hour'], type="targets", plan_index=1)
  185.  
  186. plan.high = x['high'] if x['high'] != "null" else None
  187. plan.low = x['low'] if x['low'] != "null" else None
  188. plan.target = x['target'] if x['target'] != "null" else None
  189. plan.threshold = x['threshold'] if x['threshold'] != "null" else None
  190. plan.timestamp = effective_date
  191. plan.save()
  192.  
  193. return self.form_valid(form)
  194.  
  195. else:
  196. return self.form_invalid(form)
  197. class ParseLibreReport(FormView):
  198. """
  199. A view that enables parsing data to the DB from a Abott Libre report
  200.  
  201. - SRS-48
  202. """
  203. form_class = ParseLibreReportForm
  204. template_name = 'form_generic.html' # Replace with your template.
  205. success_url = 'done/' # Replace with your URL or reverse().
  206.  
  207. def post(self, request, **kwargs):
  208. form_class = self.get_form_class()
  209. form = self.get_form(form_class)
  210. request_files = request.FILES.getlist('reports')
  211.  
  212. is_sensor_mode = not request.POST.get("parse_as_bg")
  213. trial = Trial.objects.get(id=request.POST.get("trial"))
  214. if form.is_valid():
  215. files_on_disk = write_files_to_disk(request_files)
  216. for file in files_on_disk:
  217. try:
  218. libre_parser = LibreParser(trial=trial, is_sensor_mode=is_sensor_mode)
  219. with open(file) as f:
  220. libre_parser.parse(f)
  221.  
  222. except Exception as e:
  223. log.exception(e)
  224. return HttpResponse("Error:" + str(e) + ". in file: " + str(file))
  225. return HttpResponse('File Parsed Successfully!')
  226. else:
  227. return self.form_invalid(form)
  228.  
  229.  
  230.  
  231. class ParseGlookoAndRunAdvisorPro(FormView):
  232. """
  233. A view that enables parsing data to the DB of a glooko patient in a given time and, optionally, run the advisor pro algorithm oin the data fetched
  234.  
  235. - SRS-45
  236. """
  237. form_class = ParseGlookoForm
  238. template_name = 'form_generic.html' # Replace with your template.
  239. success_url = 'done/' # Replace with your URL or reverse().
  240.  
  241. def post(self, request, **kwargs):
  242. form = self.get_form(self.form_class)
  243.  
  244. if form.is_valid():
  245. # if not request.user.dms:
  246. # return HttpResponse("error: configuration error for user" + request.user.email, status=400)
  247. #
  248. # if request.user.dms.name not in list(adp_api_settings.dms_settings.keys()):
  249. # return HttpResponse("error: configuration error dms " + request.user.dms.name, status=400)
  250.  
  251. treatment_plan_request = json.loads(request.POST.get("treatment_plan_request"))
  252. run_advisor_pro = request.POST.get("run_advisor_pro")
  253.  
  254. if not request.user.dms:
  255. dms = Dms.objects.get(name="glooko")
  256. else:
  257. dms = request.user.dms
  258.  
  259. trial = Trial.objects.get(id = request.POST.get("trial"))
  260. patient, created = Patient.objects.get_or_create(trial=trial, ext_name=treatment_plan_request['userId'])
  261.  
  262. if "syncTimestamps" in treatment_plan_request:
  263. params = treatment_plan_request['syncTimestamps']
  264.  
  265. else:
  266. end_date_str = request.POST.get("end_date")
  267.  
  268. if not end_date_str:
  269. end = dt.combine(dt.now().date(), dt.max.time())
  270. else:
  271. end_date = dt.strptime(end_date_str, "%Y-%m-%d")
  272. end = dt.combine(end_date.date(), dt.max.time())
  273.  
  274. try:
  275. params = find_sync_timestamps(dms=dms, end_date=end,start_date = end-td(days=10), glooko_code=patient.ext_name,last_only=True)
  276. log.info("found sync timestamps: "+str(params))
  277. except Exception as e:
  278. log.exception(e)
  279. return HttpResponse("error finding sync timestamps: " + str(e))
  280.  
  281. #re-calc the time range according to the found syc timestamps
  282. timestamps = []
  283.  
  284. if "meter" in params:
  285. if params['meter']:
  286. meter_ts = dt.strptime(params['meter'], "%Y-%m-%dT%H:%M:%S.%fZ")
  287. timestamps.append(meter_ts)
  288. if "pump" in params:
  289. if params['pump']:
  290. pump_ts = dt.strptime(params['pump'], "%Y-%m-%dT%H:%M:%S.%fZ")
  291. timestamps.append(pump_ts)
  292. if "cgm" in params:
  293. if params['cgm']:
  294. cgm_ts = dt.strptime(params['cgm'], "%Y-%m-%dT%H:%M:%S.%fZ")
  295. timestamps.append(cgm_ts)
  296.  
  297. if not timestamps:
  298. error = "no sync timestamps were found"
  299. log.error(error)
  300. return HttpResponse(error)
  301.  
  302. end = max(timestamps)
  303. start_exact = min(timestamps) - td(days=21)
  304. start = dt.combine(start_exact.date(), dt.min.time())
  305.  
  306. try:
  307. parse_glooko_data(patient=patient, dms=dms, sync_timestamps=params)
  308. except Exception as e:
  309. error = "data query error: " + str(e)
  310. log.exception(e)
  311. return HttpResponse(error)
  312.  
  313. if run_advisor_pro:
  314. #TODO glooko parser should handle optionals params
  315. language = request.POST.get("language") or patient.language
  316. adp_request = AdpRequest.objects.create(patient=patient, params=params, start=start, end=end, user=request.user, status="IN_PROCESS") # to avoid running in using the queue
  317.  
  318. try:
  319. process_adp_request(adp_request)
  320. except Exception as e:
  321. log.exception(e)
  322. adp_request.status = "ERROR"
  323. adp_request.error = "error processing request: " + str(e)
  324. adp_request.save()
  325.  
  326. if adp_request.status == "COMPLETED":
  327. context = create_recommendation_context(adp_request, language)
  328. return render(request, 'recommendation_doctor.html', context)
  329. else:
  330. return HttpResponse("adp request processing failed: " + str(adp_request.error))
  331.  
  332. else:
  333. return HttpResponse("Done parsing data to DB")
  334.  
  335. else:
  336. return self.form_invalid(form)
  337.  
  338.  
  339. class DisplayRecommendation(FormView):
  340. """
  341. A view for displaying an Advisor Pro recommendation that was already generated
  342.  
  343. - SRS-45
  344. """
  345. form_class = DisplayRecommendationForm
  346. template_name = 'form_generic.html' # Replace with your template.
  347. success_url = 'done/' # Replace with your URL or reverse().
  348.  
  349. def post(self, request, **kwargs):
  350.  
  351. form = self.get_form(self.form_class)
  352.  
  353. if form.is_valid():
  354. adp_request = AdpRequest.objects.get(id=request.POST.get("adp_request"))
  355. language = request.POST.get("language") or adp_request.patient.language
  356.  
  357. context = create_recommendation_context(adp_request, language)
  358. return render(request, 'advisor_pro_output.html', context)
  359. else:
  360. return self.form_invalid(form)
  361.  
  362.  
  363. class DisplayRecommendationDoctor(FormView):
  364. """
  365. A view for displaying an Advisor Pro recommendation that was already generated and ment to be exported to excel for a doctor review and feedback
  366.  
  367. - SRS-45
  368. """
  369. form_class = DisplayRecommendationFormDoctor
  370. template_name = 'form_generic.html' # Replace with your template.
  371. success_url = 'done/' # Replace with your URL or reverse().
  372.  
  373. def post(self, request, **kwargs):
  374.  
  375. form = self.get_form(self.form_class)
  376.  
  377. if form.is_valid():
  378. adp_request = AdpRequest.objects.get(id=request.POST.get("adp_request"))
  379. language = request.POST.get("language") or adp_request.patient.language
  380.  
  381. context = create_recommendation_context(adp_request, language)
  382. return render(request, 'recommendation_doctor.html', context)
  383. else:
  384. return self.form_invalid(form)
  385.  
  386.  
  387. def create_recommendation_context_from_feedback(adp_feedback):
  388. def calc_daily_amount(items):
  389. sum = (dt.strptime(items[0]['start'], '%H:%M:%S') + td(hours=24) - dt.strptime(items[-1]['start'], '%H:%M:%S')).total_seconds() * items[-1]['value']
  390. for i, item in enumerate(items[:-1]):
  391. second = dt.strptime(items[i + 1]['start'], '%H:%M:%S')
  392. first = dt.strptime(item['start'], '%H:%M:%S')
  393. duration = second - first
  394. sum += item['value'] * duration.total_seconds()
  395. return round(sum / 60 / 60,3)
  396.  
  397. data = adp_feedback.data
  398.  
  399. context = {}
  400. context["start_date"] = adp_feedback.request.start.date().strftime("%b. %d, %Y")
  401. context["end_date"] = adp_feedback.request.end.date().strftime("%b. %d, %Y")
  402. context['patient_id'] = adp_feedback.request.patient.ext_name
  403.  
  404. context['recommended_basal_rates'] = data['plans']['basal']
  405. context['recommended_total_basal'] = calc_daily_amount(data['plans']['basal'])
  406.  
  407. context['recommended_carb_ratio'] = data['plans']['cr']
  408. context['recommended_correction_factor'] = data['plans']['cf']
  409.  
  410. context['recommendation_texts'] = data['rationales']
  411. context['comment'] = adp_feedback.comment
  412.  
  413. context['language_rtl'] = data['meta']['is_rtl']
  414.  
  415. context['report_date'] = adp_feedback.received_at
  416. context['advisor_version'] = adp_feedback.request.recommendation['advisorVersion']
  417. context['request_id'] = adp_feedback.request.identifier
  418. return context
  419.  
  420.  
  421. class DisplayRecommendationPatient(FormView):
  422. """
  423. A view for displaying a doctor feedback for an Advisor Pro recommendation as a recommendation for his patient
  424.  
  425. - SRS-45
  426. """
  427. form_class = DisplayRecommendationFormPatient
  428. template_name = 'form_generic.html' # Replace with your template.
  429. success_url = 'done/' # Replace with your URL or reverse().
  430.  
  431. def post(self, request, **kwargs):
  432.  
  433. form = self.get_form(self.form_class)
  434.  
  435. if form.is_valid():
  436. adp_feedback = AdpFeedback.objects.get(id=request.POST.get("adp_feedback"))
  437. #language = request.POST.get("language") or adp_request.patient.language
  438. context = create_recommendation_context_from_feedback(adp_feedback)
  439. return render(request, 'recommendation_patient.html', context)
  440. else:
  441. return self.form_invalid(form)
  442.  
  443.  
  444. @method_decorator(user_is_admin, name='dispatch')
  445. class CobelliUploader(FormView):
  446. """
  447. A view for uploading a diasend report, and parsing it using the diasend parser into the database.
  448.  
  449. - SRS-41
  450. """
  451. form_class = UploadCobelli
  452. template_name = 'form_generic.html' # Replace with your template.
  453. success_url = 'done/' # Replace with your URL or reverse().
  454.  
  455. def post(self, request, **kwargs):
  456. from dreamed_dms.parsers import cobelli
  457. form_class = self.get_form_class()
  458. form = self.get_form(form_class)
  459. request_files = request.FILES.getlist('reports')
  460.  
  461. if form.is_valid():
  462. trial = Trial.objects.get(id=request.POST.get("trial"))
  463. files_on_disk = write_files_to_disk(request_files)
  464.  
  465. for file in files_on_disk:
  466. try:
  467. with open(file) as f:
  468. data = json.load(f)
  469. cobelli.parse(data=data, trial=trial)
  470. except Exception as e:
  471. log.exception(e)
  472. return HttpResponse("Error:" + str(e) + ". in file: " + str(file))
  473.  
  474. return self.form_valid(form)
  475. else:
  476. return self.form_invalid(form)
  477.  
  478.  
  479. @method_decorator(user_is_admin, name='dispatch')
  480. class DiasendUploader(FormView):
  481. """
  482. A view for uploading a diasend report, and parsing it using the diasend parser into the database.
  483.  
  484. - SRS-19
  485. """
  486. form_class = UploadDiasend
  487. template_name = 'form_generic.html' # Replace with your template.
  488. success_url = 'done/' # Replace with your URL or reverse().
  489.  
  490. def post(self, request, **kwargs):
  491. form_class = self.get_form_class()
  492. form = self.get_form(form_class)
  493. request_files = request.FILES.getlist('reports')
  494. glucose_only = request.POST.get("glucose_only")
  495.  
  496. if form.is_valid():
  497. trial = Trial.objects.get(id=request.POST.get("trial"))
  498. files_on_disk = write_files_to_disk(request_files)
  499.  
  500. for file in files_on_disk:
  501. try:
  502. diasend.parse(file=file, trial=trial,glucose_only=glucose_only)
  503. except Exception as e:
  504. log.exception(e)
  505. return HttpResponse("Error:" + str(e) + ". in file: " + str(file))
  506.  
  507. return self.form_valid(form)
  508. else:
  509. return self.form_invalid(form)
  510.  
  511. @method_decorator(user_is_admin, name='dispatch')
  512. class DiabetesmUploader(FormView):
  513. """
  514. A view for uploading and parsing a diabetesm report of a patient into the DB
  515.  
  516. - SRS-27
  517. """
  518. form_class = UploadDiabetesm
  519. template_name = 'form_generic.html' # Replace with your template.
  520. success_url = 'done/' # Replace with your URL or reverse().
  521.  
  522. def post(self, request, **kwargs):
  523. form_class = self.get_form_class()
  524. form = self.get_form(form_class)
  525. request_files = request.FILES.getlist('reports')
  526.  
  527. if form.is_valid():
  528.  
  529. files_on_disk = write_files_to_disk(request_files)
  530. for file in files_on_disk:
  531. try:
  532. diabetesm.parse(file, trial=Trial.objects.get(id=request.POST.get("trial")), date_format=request.POST.get("date_format"))
  533. except Exception as e:
  534. log.exception(e)
  535. return HttpResponse("Error:" + str(e) + ". in file: " + str(file))
  536. return self.form_valid(form)
  537. else:
  538. return self.form_invalid(form)
  539.  
  540.  
  541. @method_decorator(user_is_admin, name='dispatch')
  542. class CarelinkProUploader(FormView):
  543. """
  544. A view for uploading a carelink pro report, and parsing it using the carelink pro parser into the database.
  545.  
  546. - SRS-29
  547. """
  548. form_class = UploadCarelink
  549. template_name = 'form_generic.html' # Replace with your template.
  550. success_url = 'done/' # Replace with your URL or reverse().
  551.  
  552. def post(self, request, **kwargs):
  553. form_class = self.get_form_class()
  554. form = self.get_form(form_class)
  555. request_files = request.FILES.getlist('reports')
  556.  
  557. if form.is_valid():
  558. files_on_disk = write_files_to_disk(request_files)
  559. for file in files_on_disk:
  560. try:
  561. carelink_pro.parse(file, trial=Trial.objects.get(id=request.POST.get("trial")), date_format=request.POST.get("date_format"))
  562. except Exception as e:
  563. log.exception(e)
  564. return HttpResponse("Error:" + str(e) + ". in file: " + str(file))
  565. return self.form_valid(form)
  566. else:
  567. return self.form_invalid(form)
  568.  
  569.  
  570. @method_decorator(user_is_admin, name='dispatch')
  571. class CarelinkPersonalUploader(FormView):
  572. """
  573. A view for uploading a carelink personal report, and parsing it using the carelink personal parser into the database.
  574.  
  575. - SRS-20
  576. """
  577. form_class = UploadCarelinkClinical
  578. template_name = 'form_generic.html' # Replace with your template.
  579. success_url = 'done/' # Replace with your URL or reverse().
  580.  
  581. def post(self, request, **kwargs):
  582. form_class = self.get_form_class()
  583. form = self.get_form(form_class)
  584. request_files = request.FILES.getlist('reports')
  585.  
  586. if form.is_valid():
  587.  
  588. files_on_disk = write_files_to_disk(request_files)
  589. trial = Trial.objects.get(id=request.POST.get("trial"))
  590. for file in files_on_disk:
  591. try:
  592. carelink_personal.parse(file, trial=trial, date_format=request.POST.get("date_format"))
  593. except Exception as e:
  594. log.exception(e)
  595. return HttpResponse("Error:" + str(e) + ". in file: " + str(file))
  596. return self.form_valid(form)
  597. else:
  598. return self.form_invalid(form)
  599.  
  600.  
  601. @method_decorator(user_is_admin, name='dispatch')
  602. class MasterFileUploader(FormView):
  603. """
  604. A view for uploading a master file report and parsing it using the master file parser into the database.
  605.  
  606. - SRS-21
  607. """
  608. form_class = UploadMasterFile
  609. template_name = 'form_generic.html' # Replace with your template.
  610. success_url = 'done/' # Replace with your URL or reverse().
  611.  
  612. def post(self, request, **kwargs):
  613. form_class = self.get_form_class()
  614. form = self.get_form(form_class)
  615. request_files = request.FILES.getlist('reports')
  616.  
  617. if form.is_valid():
  618. files_on_disk = write_files_to_disk(request_files)
  619. for file in files_on_disk:
  620. try:
  621. master_file.parse(file)
  622. except Exception as e:
  623. log.error("Error:" + str(e))
  624. return HttpResponse("Error:" + str(e) + ". in file: " + str(file))
  625.  
  626. return self.form_valid(form)
  627. else:
  628. return self.form_invalid(form)
  629.  
  630. class GlookoMultiPatient(FormView):
  631. """
  632. A view for uploading a master file report and parsing it using the master file parser into the database.
  633.  
  634. - SRS-21
  635. """
  636. form_class = GlookoMultiPatientForm
  637. template_name = 'form_generic.html' # Replace with your template.
  638. success_url = 'done/' # Replace with your URL or reverse().
  639.  
  640. def post(self, request, **kwargs):
  641. form = self.get_form(self.form_class)
  642.  
  643. if form.is_valid():
  644. end_date_str = request.POST.get("end_date")
  645. if end_date_str:
  646. end_date = dt.strptime(end_date_str, "%Y-%m-%d")
  647. end = dt.combine(end_date.date(), dt.max.time())
  648. else:
  649. end = None
  650.  
  651. start_date_str = request.POST.get("start_date")
  652. if start_date_str:
  653. start_date = dt.strptime(start_date_str, "%Y-%m-%d")
  654. start = dt.combine(start_date.date(), dt.min.time())
  655. else:
  656. start = None
  657.  
  658. if start and end:
  659. if end < start:
  660. return HttpResponse("start date cannot be greater then end date")
  661.  
  662. dms = Dms.objects.get(id=request.POST.get("dms"))
  663.  
  664. request_files = request.FILES.getlist('reports')
  665. files_on_disk = write_files_to_disk(request_files)
  666. for file in files_on_disk:
  667. try:
  668. glooko_multi_patient.parse(file=file,dms=dms,end_date=end,start_date=start)
  669. except Exception as e:
  670. log.exception("Error:" + str(e))
  671. return HttpResponse("Error:" + str(e) + ". in file: " + str(file))
  672.  
  673. return self.form_valid(form)
  674. else:
  675. return self.form_invalid(form)
  676.  
  677.  
  678. @method_decorator(user_is_admin, name='dispatch')
  679. class DoctorRecommendationUploader(FormView):
  680. """
  681. A view for uploading a master file report and parsing it using the master file parser into the database.
  682.  
  683. - SRS-45
  684. """
  685. form_class = UploadDoctorRecoForm
  686. template_name = 'form_generic.html' # Replace with your template.
  687. success_url = 'done/' # Replace with your URL or reverse().
  688.  
  689. def post(self, request, **kwargs):
  690. form_class = self.get_form_class()
  691. form = self.get_form(form_class)
  692. request_files = request.FILES.getlist('reports')
  693.  
  694. if form.is_valid():
  695. files_on_disk = write_files_to_disk(request_files)
  696. for file in files_on_disk:
  697. try:
  698. doctor_recommendation_parser.parse(file)
  699. except Exception as e:
  700. log.exception("Error:" + str(e))
  701. return HttpResponse("Error:" + str(e) + ". in file: " + str(file))
  702.  
  703. return self.form_valid(form)
  704. else:
  705. return self.form_invalid(form)
  706.  
  707.  
  708. class upload_done(TemplateView):
  709. """
  710. A view for displaying a done message for general use cases only needed a "done" response for a user.
  711. """
  712. template_name = "done.html"
  713.  
  714.  
  715. @method_decorator(user_can_login_app, name='dispatch')
  716. class Index(TemplateView):
  717. """
  718. A view for the main app page.
  719. """
  720. template_name = "index.html"
  721.  
  722.  
  723. @method_decorator(user_is_admin, name='dispatch')
  724. class GocapSync(FormView):
  725. """
  726. A view for pooling a Gocap user using the Gocap api and parse it to the database using the gocap parser.
  727. """
  728. form_class = GocapForm
  729. template_name = 'form_generic.html' # Replace with your template.
  730. success_url = 'done/' # Replace with your URL or reverse().
  731.  
  732. def get_form_kwargs(self):
  733. kw = super(GocapSync, self).get_form_kwargs()
  734. kw['request'] = self.request # the trick!
  735. return kw
  736.  
  737. def post(self, request, **kwargs):
  738. form = self.get_form(self.form_class)
  739.  
  740. if form.is_valid():
  741. gocap_user = request.POST.get('gocap_user')
  742. gocap_password = request.POST.get('gocap_password')
  743. patient = Patient.objects.get(id=request.POST.get("patient"))
  744. # login:
  745. try:
  746. gocap.get_data(gocap_user, gocap_password, patient)
  747. except Exception as e:
  748. log.error("Error:" + str(e))
  749. return HttpResponse("Error:" + str(e))
  750.  
  751. return self.form_valid(form)
  752. else:
  753. return self.form_invalid(form)
  754.  
  755.  
  756. @user_is_admin
  757. def pull_data(request):
  758. log.debug("||" + str(dt.now()) + "|| " + "Before Getting into Parser")
  759. req_counter = parse_mongo_data()
  760. return HttpResponse('Finished Successfully \n (%d) Requests Parsed Successfully ' % req_counter)
  761.  
  762.  
  763. @method_decorator(user_is_admin, name='dispatch')
  764. class TidePoolUploader(FormView):
  765. """
  766. A view for uploading a TidePool Data, parsing it using the tidepool parser into the database.
  767.  
  768. - SRS-44
  769. """
  770. form_class = UploadTidePool
  771. template_name = 'form_generic.html' # Replace with your template.
  772. success_url = 'done/' # Replace with your URL or reverse().
  773.  
  774. def post(self, request, **kwargs):
  775. form_class = self.get_form_class()
  776. form = self.get_form(form_class)
  777. request_files = request.FILES.getlist('reports')
  778.  
  779. if form.is_valid():
  780. files_on_disk = write_files_to_disk(request_files)
  781. for file in files_on_disk:
  782. try:
  783. tidepool_parser = TidepoolParser()
  784. with open(file) as f:
  785. tidepool_parser.parse(f)
  786.  
  787. except Exception as e:
  788. log.exception(e)
  789. return HttpResponse("Error:" + str(e) + ". in file: " + str(file))
  790. return HttpResponse('File Parsed Successfully!')
  791. else:
  792. return self.form_invalid(form)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement