web.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. """
  2. module organization:
  3. 0. imports
  4. 1. views
  5. 2. server related functions
  6. 3. get_app
  7. """
  8. from pyramid.config import Configurator
  9. from pyramid.events import NewRequest
  10. from pyramid.response import Response, FileResponse
  11. from med.views.appointments import get_appointments_view
  12. from med.views.begin_appointment import get_begin_appointment_view
  13. from med.views.current_user import get_current_user_view
  14. from med.views.download import get_download_file
  15. from med.views.entry import get_entry_view
  16. from med.views.filters import get_filters_view
  17. from med.views.profile import get_profile_view
  18. from med.views.reassign import get_reassign_view
  19. from med.views.record import get_record_view
  20. from med.views.search import get_search_view
  21. from med.views.update_condition import get_update_condition_view
  22. from med.views.users import get_users_view
  23. # ======== PAGES =====================================================
  24. def home(request):
  25. return Response("OK")
  26. def login(request):
  27. return Response("TODO: The login page goes here.")
  28. # ======== SESSION ===================================================
  29. def current_user(request):
  30. return get_current_user_view()
  31. def filters(request):
  32. return get_filters_view()
  33. def keep_alive(request):
  34. return Response("OK")
  35. def users(request):
  36. return get_users_view()
  37. # ======== REMAINING VIEWS ===========================================
  38. # ======== APPOINTMENTS
  39. def begin_appointment(request):
  40. return get_begin_appointment_view()
  41. def reassign_appointment(request):
  42. return get_reassign_view()
  43. def appointment_users(request):
  44. return get_users_view()
  45. def update_condition(request):
  46. return get_update_condition_view()
  47. def appointments(request):
  48. return get_appointments_view()
  49. # ======== ENTRY
  50. def entry(request):
  51. return get_entry_view(entry_id=request.params.get("id", None))
  52. def reassign_entry(request):
  53. return {
  54. "status": "success",
  55. "reason": "",
  56. "errors": {},
  57. "testing": True,
  58. }
  59. def resolve_entry(request):
  60. return {
  61. "status": "success",
  62. "reason": "",
  63. "errors": {},
  64. "testing": True,
  65. }
  66. def add_message(request):
  67. return {
  68. "status": "success",
  69. "reason": "",
  70. "errors": {},
  71. "testing": True,
  72. }
  73. # NOTE: Appointment data on the Entry view
  74. def finish_appointment(request):
  75. return {
  76. "status": "success",
  77. "reason": "",
  78. "errors": {},
  79. "testing": True,
  80. }
  81. # NOTE: Record data on the Entry view
  82. def clear_hold(request):
  83. return {
  84. "status": "success",
  85. "reason": "",
  86. "errors": {},
  87. "testing": True,
  88. }
  89. # ======== PROFILE
  90. def profile(request):
  91. return get_profile_view()
  92. # ======== SEARCH
  93. def search_records(request):
  94. return get_search_view(search_input=request.params.get("q", None))
  95. def intake(request):
  96. return {
  97. "status": "success",
  98. "reason": "",
  99. "errors": {},
  100. "testing": True,
  101. }
  102. # ======== RECORDS
  103. def record(request):
  104. return get_record_view(record_id=request.params.get("id", None))
  105. def download(request):
  106. filepath, filename, content_type = get_download_file(
  107. file_id=request.params.get("id", None),
  108. filename=request.params.get("filename", None),
  109. repo=request.params.get("repo", None),
  110. fkey=request.params.get("fkey", None),
  111. )
  112. response = FileResponse(filepath, request=request, content_type=content_type)
  113. response.headers["Content-Disposition"] = f'attachment; filename="{filename}"'
  114. return response
  115. def followup(request):
  116. return {
  117. "status": "success",
  118. "reason": "",
  119. "errors": {},
  120. "testing": True,
  121. }
  122. # ======== SERVER ====================================================
  123. def add_cors_headers_response_callback(event):
  124. def cors_headers(request, response):
  125. response.headers.update(
  126. {
  127. "Access-Control-Allow-Origin": "*",
  128. "Access-Control-Allow-Methods": "POST,GET,DELETE,PUT,OPTIONS",
  129. "Access-Control-Allow-Headers": "Origin, Content-Type, Accept, Authorization",
  130. "Access-Control-Allow-Credentials": "true",
  131. "Access-Control-Max-Age": "1728000",
  132. }
  133. )
  134. event.request.add_response_callback(cors_headers)
  135. def get_app(enable_cors=False):
  136. with Configurator() as config:
  137. if enable_cors:
  138. config.add_subscriber(add_cors_headers_response_callback, NewRequest)
  139. # NOTE: Group route/view and order by route.
  140. config.add_route(home.__name__, "/")
  141. config.add_view(home, route_name=home.__name__)
  142. config.add_route(login.__name__, "/login")
  143. config.add_view(login, route_name=login.__name__)
  144. config.add_route(reassign_appointment.__name__, "/api/appointment/reassign")
  145. config.add_view(
  146. reassign_appointment,
  147. route_name=reassign_appointment.__name__,
  148. renderer="json",
  149. )
  150. config.add_route(begin_appointment.__name__, "/api/appointment/begin")
  151. config.add_view(
  152. begin_appointment,
  153. route_name=begin_appointment.__name__,
  154. renderer="json",
  155. )
  156. config.add_route(update_condition.__name__, "/api/appointment/checkin")
  157. config.add_view(
  158. update_condition,
  159. route_name=update_condition.__name__,
  160. renderer="json",
  161. )
  162. config.add_route(appointment_users.__name__, "/api/appointment/users")
  163. config.add_view(
  164. appointment_users,
  165. route_name=appointment_users.__name__,
  166. renderer="json",
  167. )
  168. config.add_route(appointments.__name__, "/api/appointments")
  169. config.add_view(
  170. appointments,
  171. route_name=appointments.__name__,
  172. renderer="json",
  173. )
  174. config.add_route(download.__name__, "/api/download")
  175. config.add_view(
  176. download,
  177. route_name=download.__name__,
  178. renderer="json",
  179. )
  180. config.add_route(entry.__name__, "/api/entry")
  181. config.add_view(
  182. entry,
  183. route_name=entry.__name__,
  184. renderer="json",
  185. )
  186. config.add_route(reassign_entry.__name__, "/api/entry/reassign")
  187. config.add_view(
  188. reassign_entry,
  189. route_name=reassign_entry.__name__,
  190. renderer="json",
  191. )
  192. config.add_route(resolve_entry.__name__, "/api/entry/resolve")
  193. config.add_view(
  194. resolve_entry,
  195. route_name=resolve_entry.__name__,
  196. renderer="json",
  197. )
  198. config.add_route(add_message.__name__, "/api/entry/add_message")
  199. config.add_view(
  200. add_message,
  201. route_name=add_message.__name__,
  202. renderer="json",
  203. )
  204. config.add_route(finish_appointment.__name__, "/api/entry/finish_appointment")
  205. config.add_view(
  206. finish_appointment,
  207. route_name=finish_appointment.__name__,
  208. renderer="json",
  209. )
  210. config.add_route(record.__name__, "/api/record")
  211. config.add_view(
  212. record,
  213. route_name=record.__name__,
  214. renderer="json",
  215. )
  216. config.add_route(clear_hold.__name__, "/api/record/clear_hold")
  217. config.add_view(
  218. clear_hold,
  219. route_name=clear_hold.__name__,
  220. renderer="json",
  221. )
  222. config.add_route(followup.__name__, "/api/record/followup")
  223. config.add_view(
  224. followup,
  225. route_name=followup.__name__,
  226. renderer="json",
  227. )
  228. config.add_route(intake.__name__, "/api/record/intake")
  229. config.add_view(
  230. intake,
  231. route_name=intake.__name__,
  232. renderer="json",
  233. )
  234. config.add_route(search_records.__name__, "/api/records")
  235. config.add_view(
  236. search_records,
  237. route_name=search_records.__name__,
  238. renderer="json",
  239. )
  240. config.add_route(current_user.__name__, "/api/session/user")
  241. config.add_view(
  242. current_user,
  243. route_name=current_user.__name__,
  244. renderer="json",
  245. )
  246. config.add_route(keep_alive.__name__, "/api/session")
  247. config.add_view(
  248. keep_alive,
  249. route_name=keep_alive.__name__,
  250. renderer="json",
  251. )
  252. config.add_route(filters.__name__, "/api/session/filters")
  253. config.add_view(
  254. filters,
  255. route_name=filters.__name__,
  256. renderer="json",
  257. )
  258. config.add_route(profile.__name__, "/api/user")
  259. config.add_view(
  260. profile,
  261. route_name=profile.__name__,
  262. renderer="json",
  263. )
  264. config.add_route(users.__name__, "/api/users")
  265. config.add_view(
  266. users,
  267. route_name=users.__name__,
  268. renderer="json",
  269. )
  270. return config.make_wsgi_app()