def render(self, item_template, output_template=OUTPUT_TEMPLATE): if self.results is None: self.execute() if self.aggregate_by: item_template = AGGREGATE_TEMPLATE # if we can, iterate efficiently over our results if hasattr(self.results, 'iterator'): results = self.results.iterator() else: results = self.results template_args = {'fobjs': results, 'trc': self.trc, 'group_by': self.group_by, 'date_group': self.date_group, 'aggregate_by': self.aggregate_by, 'limit': self.limit, 'offset': self.offset, 'order_by': self.order_by, 'status': self.status, 'date_range': self.date_range, 'filters': self.query_filters, 'item_template': item_template } return render_template(output_template, template_args, type="xml")
def render(self, item_template, output_template=OUTPUT_TEMPLATE): if self.results is None: self.execute() if self.aggregate_by: item_template = AGGREGATE_TEMPLATE # if we can, iterate efficiently over our results if hasattr(self.results, "iterator"): results = self.results.iterator() else: results = self.results template_args = { "fobjs": results, "trc": self.trc, "group_by": self.group_by, "date_group": self.date_group, "aggregate_by": self.aggregate_by, "limit": self.limit, "offset": self.offset, "order_by": self.order_by, "status": self.status, "date_range": self.date_range, "filters": self.query_filters, "item_template": item_template, } return render_template(output_template, template_args, type="xml")
def _equipment_list(request, limit, offset, status, order_by='created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) equipment = carenet_filter( carenet, Equipment.objects.select_related().filter( record=record, document__status=status).order_by(processed_order_by)) return render_template('reports/equipment', { 'equipment': equipment[offset:offset + limit], 'trc': len(equipment), 'limit': limit, 'offset': offset, 'order_by': order_by }, type="xml")
def _videomessage_list(request, limit, offset, status, order_by='created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) type_obj = DocumentSchema.objects.get( type='http://indivo.org/vocab/xml/documents#VideoMessage') videomessages = carenet_filter( carenet, Document.objects.filter(type=type_obj, replaced_by=None, record=record, status=status).order_by(processed_order_by)) print "Number of Video Messages: " + str(len(videomessages)) return render_template( 'reports/videomessages', { 'videomessages': videomessages[offset:offset + limit], 'trc': len(videomessages), 'limit': limit, 'offset': offset, 'order_by': order_by }, type="xml")
def _adherenceitem_list(request, limit, offset, status, order_by='created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) type_obj = DocumentSchema.objects.get( type='http://indivo.org/vocab/xml/documents#AdherenceItem') adherenceitems = carenet_filter( carenet, Document.objects.filter(type=type_obj, replaced_by=None, record=record, status=status).order_by(processed_order_by)) return render_template( 'reports/adherenceitems', { 'adherenceitems': adherenceitems[offset:offset + limit], 'trc': len(adherenceitems), 'limit': limit, 'offset': offset, 'order_by': order_by }, type="xml")
def report_ccr(request, record=None, carenet=None): """ Export patient data as a Continuity of Care Record (CCR) document. Will return :http:statuscode:`200` with a CCR on success, :http:statuscode:`400` if neither a record or carenet was passed. """ if carenet: record = carenet.record if not record: return HttpResponseBadRequest() # FIXME: fix these carenet filters to be smarter active_status = StatusName.objects.get(name='active') medications = carenet_facts_filter(carenet, Medication.objects.select_related().filter(record=record, document__status=active_status)) immunizations = carenet_facts_filter(carenet, Immunization.objects.select_related().filter(record=record, document__status=active_status)) vitalsigns = carenet_facts_filter(carenet, VitalSigns.objects.select_related().filter(record=record, document__status=active_status)) return render_template('reports/ccr', {'record': record, 'now': datetime.datetime.utcnow(), 'medications': medications, 'immunizations' : immunizations, 'vitalsigns' : vitalsigns}, type="xml")
def render(self, item_template, output_template=OUTPUT_TEMPLATE): if self.results is None: self.execute() if self.aggregate_by: item_template = AGGREGATE_TEMPLATE # if we can, iterate efficiently over our results if hasattr(self.results, 'iterator'): results = self.results.iterator() else: results = self.results template_args = { 'fobjs': results, 'trc': self.trc, 'group_by': self.group_by, 'date_group': self.date_group, 'aggregate_by': self.aggregate_by, 'limit': self.limit, 'offset': self.offset, 'order_by': self.order_by, 'status': self.status, 'date_range': self.date_range, 'filters': self.query_filters, 'item_template': item_template } return render_template(output_template, template_args, type="xml")
def report_ccr(request, record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() # FIXME: fix these carenet filters to be smarter active_status = StatusName.objects.get(name='active') medications = carenet_facts_filter(carenet, Medication.objects.select_related().filter(record=record, document__status=active_status)) immunizations = carenet_facts_filter(carenet, Immunization.objects.select_related().filter(record=record, document__status=active_status)) vitalsigns = carenet_facts_filter(carenet, Vitals.objects.select_related().filter(record=record, document__status=active_status)) return render_template('reports/ccr', {'record': record, 'now': datetime.datetime.utcnow(), 'medications': medications, 'immunizations' : immunizations, 'vitalsigns' : vitalsigns}, type="xml")
def _medication_list(request, limit, offset, status, order_by='created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) medications = carenet_filter( carenet, Medication.objects.select_related().filter( record=record, document__status=status).order_by(processed_order_by)) """ medications = [] relationship = DocumentSchema.objects.get(type=DocumentSchema.expand_rel('ScheduledAction')) for med in medication_objs: rels = Document.objects.filter(record=record, status=status, rels_as_doc_0__document_1__original=med.document.original_id, rels_as_doc_0__relationship=relationship) medications += [med, rels] """ return render_template('reports/medications', { 'medications': medications[offset:offset + limit], 'trc': len(medications), 'limit': limit, 'offset': offset, 'order_by': order_by }, type="xml")
def _vitals_list(request, limit, offset, status, category=None, order_by='-created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() # change underscores to spaces in the category, to make it easier without URL encoding if category: category = category.replace("_"," ") processed_order_by = report_orderby_update(order_by) if category: vitals = carenet_filter(carenet, Vitals.objects.select_related().filter( record=record, name=category, document__status=status).order_by(processed_order_by)) else: vitals = carenet_filter(carenet, Vitals.objects.select_related().filter( record=record, document__status=status).order_by(processed_order_by)) return render_template('reports/vitals', { 'vitals' : vitals[offset:offset+limit], 'trc' : len(vitals), 'limit' : limit, 'offset' : offset, 'order_by' : order_by }, type='xml')
def _medicationscheduleitem_list(request, limit, offset, status, order_by="created_at", record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) type_obj = DocumentSchema.objects.get(type="http://indivo.org/vocab/xml/documents#MedicationScheduleItem") medicationscheduleitems = carenet_filter( carenet, Document.objects.filter(type=type_obj, replaced_by=None, record=record, status=status).order_by( processed_order_by ), ) return render_template( "reports/medicationscheduleitems", { "medicationscheduleitems": medicationscheduleitems[offset : offset + limit], "trc": len(medicationscheduleitems), "limit": limit, "offset": offset, "order_by": order_by, }, type="xml", )
def _medication_list(request, limit, offset, status, order_by='created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) medications = carenet_filter(carenet, Medication.objects.select_related().filter( record=record, document__status=status).order_by(processed_order_by)) """ medications = [] relationship = DocumentSchema.objects.get(type=DocumentSchema.expand_rel('ScheduledAction')) for med in medication_objs: rels = Document.objects.filter(record=record, status=status, rels_as_doc_0__document_1__original=med.document.original_id, rels_as_doc_0__relationship=relationship) medications += [med, rels] """ return render_template('reports/medications', { 'medications' : medications[offset:offset+limit], 'trc' : len(medications), 'limit' : limit, 'offset' : offset, 'order_by' : order_by }, type="xml")
def report_ccr(request, record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() # FIXME: fix these carenet filters to be smarter active_status = StatusName.objects.get(name='active') medications = carenet_filter( carenet, Medication.objects.select_related().filter( record=record, document__status=active_status)) immunizations = carenet_filter( carenet, Immunization.objects.select_related().filter( record=record, document__status=active_status)) vitalsigns = carenet_filter( carenet, Vitals.objects.select_related().filter(record=record, document__status=active_status)) return render_template('reports/ccr', { 'record': record, 'now': datetime.datetime.utcnow(), 'medications': medications, 'immunizations': immunizations, 'vitalsigns': vitalsigns }, type="xml")
def _problem_list(request, limit, offset, status, order_by='created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) problems = carenet_filter( carenet, Problem.objects.select_related().filter( record=record, document__status=status).order_by(processed_order_by)) return render_template('reports/problems', { 'problems': problems[offset:offset + limit], 'trc': len(problems), 'limit': limit, 'offset': offset, 'order_by': order_by }, type='xml')
def simple_clinical_notes_list(request, limit, offset, status, order_by='created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) simple_clinical_notes = carenet_filter( carenet, SimpleClinicalNote.objects.select_related().filter( record=record, document__status=status).order_by(processed_order_by)) return render_template('reports/simple_clinical_notes', { 'scns': simple_clinical_notes[offset:offset + limit], 'trc': len(simple_clinical_notes), 'limit': limit, 'offset': offset, 'order_by': order_by }, type='xml')
def _measurement_list(request, limit, offset, status, order_by, lab_code, record=None, carenet=None): """ Func for listing measurements """ if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) measurements = carenet_filter( carenet, Measurement.objects.select_related().filter( record=record, document__status=status).order_by(processed_order_by)) return render_template('reports/measurements', { 'measurements': measurements[offset:offset + limit], 'record': record, 'trc': len(measurements), 'limit': limit, 'offset': offset, 'order_by': order_by }, type="xml")
def _render_documents(request, docs, record, pha, tdc, format_type="xml"): # tdc: Total Document Count if docs: for doc in docs: if doc.id: _set_doc_latest(doc) doc.relates_to, doc.is_related_from = _get_doc_relations(doc) return utils.render_template( "documents", {"docs": docs, "record": record, "pha": pha, "tdc": tdc}, type=format_type )
def _render_documents(docs, record, pha, tdc, format_type='xml'): # tdc: Total Document Count if docs: for doc in docs: if doc.id: _set_doc_latest(doc) doc.relates_to, doc.is_related_from = _get_doc_relations(doc) return utils.render_template('documents', { 'docs' : docs, 'record' : record, 'pha' : pha, 'tdc' : tdc}, type=format_type)
def _render_documents(docs, record, pha, tdc, format_type='xml'): # tdc: Total Document Count if docs: for doc in docs: if doc.id: _set_doc_latest(doc) doc.relates_to, doc.is_related_from = _get_doc_relations(doc) return utils.render_template('documents', { 'docs': docs, 'record': record, 'pha': pha, 'tdc': tdc }, type=format_type)
def _render_documents(docs, record, pha, tdc, format_type='xml'): """ Lowlevel document rendering to response data. **Arguments:** * *docs*: An iterable of :py:class:`~indivo.models.records_and_documents.Document` objects to be rendered. * *record*: The :py:class:`~indivo.models.records_and_documents.Record` that every document in *docs* belongs to. * *pha*: The :py:class:`~indivo.models.apps.PHA` that *docs* are scoped to. * *tdc*: The total document count of objects to render (i.e., ``len(docs)``). This can be passed in to avoid recomputing the size of docs if that might be expensive (i.e., a QuerySet which would require an extra DB call). * *format_type*: The format to render into. Options are ``xml``. **Returns:** * an HTTPResponse whose body is an XML string containing the rendered list of documents (which might be empty). """ if docs: for doc in docs: if doc.id: _set_doc_latest(doc) doc.relates_to, doc.is_related_from = _get_doc_relations(doc) return utils.render_template('documents', { 'docs': docs, 'record': record, 'pha': pha, 'tdc': tdc }, type=format_type)
def problem_list(request, limit, offset, status, order_by='created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) problems = carenet_filter(carenet, Problem.objects.select_related().filter( record=record, document__status=status).order_by(processed_order_by)) return render_template('reports/problems', { 'problems' : problems[offset:offset+limit], 'trc' : len(problems), 'limit' : limit, 'offset' : offset, 'order_by' : order_by}, type='xml')
def _schedulegroup_list(request, limit, offset, status, order_by='created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) type_obj = DocumentSchema.objects.get(type='http://indivo.org/vocab/xml/documents#ScheduleGroup') schedulegroups = carenet_filter(carenet, Document.objects.filter(type=type_obj, replaced_by=None, record=record, status=status).order_by(processed_order_by)) return render_template('reports/schedulegroups', { 'schedulegroups' : schedulegroups[offset:offset+limit], 'trc' : len(schedulegroups), 'limit' : limit, 'offset' : offset, 'order_by' : order_by }, type="xml")
def _immunization_list(request, limit, offset, status, order_by='created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) immunizations = carenet_filter(carenet, Immunization.objects.select_related().filter( record=record, document__status=status).order_by(processed_order_by)) return render_template('reports/immunizations', { 'immunizations' : immunizations[offset:offset+limit], 'trc' : len(immunizations), 'limit' : limit, 'offset' : offset, 'order_by' : order_by}, type="xml")
def render(self, item_template, output_template=OUTPUT_TEMPLATE): if self.results is None: self.execute() if self.aggregate_by: item_template = AGGREGATE_TEMPLATE template_args = {'fobjs': self.results, 'trc': self.trc, 'group_by': self.group_by, 'date_group': self.date_group, 'aggregate_by': self.aggregate_by, 'limit': self.limit, 'offset': self.offset, 'order_by': self.order_by, 'status': self.status, 'date_range': self.date_range, 'filters': self.query_filters, 'item_template': item_template } return render_template(output_template, template_args, type="xml")
def _videomessage_list(request, limit, offset, status, order_by='created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) type_obj = DocumentSchema.objects.get(type='http://indivo.org/vocab/xml/documents#VideoMessage') videomessages = carenet_filter(carenet, Document.objects.filter(type=type_obj, replaced_by=None, record=record, status=status).order_by(processed_order_by)) print "Number of Video Messages: " + str(len(videomessages)) return render_template('reports/videomessages', { 'videomessages' : videomessages[offset:offset+limit], 'trc' : len(videomessages), 'limit' : limit, 'offset' : offset, 'order_by' : order_by }, type="xml")
def simple_clinical_notes_list(request, limit, offset, status, order_by='created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) simple_clinical_notes = carenet_filter(carenet, SimpleClinicalNote.objects.select_related().filter( record=record, document__status=status).order_by(processed_order_by)) return render_template('reports/simple_clinical_notes', { 'scns' : simple_clinical_notes[offset:offset+limit], 'trc' : len(simple_clinical_notes), 'limit' : limit, 'offset' : offset, 'order_by' : order_by }, type='xml')
def _render_documents(docs, record, pha, tdc, format_type='xml'): """ Lowlevel document rendering to response data. **Arguments:** * *docs*: An iterable of :py:class:`~indivo.models.records_and_documents.Document` objects to be rendered. * *record*: The :py:class:`~indivo.models.records_and_documents.Record` that every document in *docs* belongs to. * *pha*: The :py:class:`~indivo.models.apps.PHA` that *docs* are scoped to. * *tdc*: The total document count of objects to render (i.e., ``len(docs)``). This can be passed in to avoid recomputing the size of docs if that might be expensive (i.e., a QuerySet which would require an extra DB call). * *format_type*: The format to render into. Options are ``xml``. **Returns:** * an HTTPResponse whose body is an XML string containing the rendered list of documents (which might be empty). """ if docs: for doc in docs: if doc.id: _set_doc_latest(doc) doc.relates_to, doc.is_related_from = _get_doc_relations(doc) return utils.render_template('documents', { 'docs' : docs, 'record' : record, 'pha' : pha, 'tdc' : tdc}, type=format_type)
def _measurement_list(request, limit, offset, status, order_by, lab_code, record=None, carenet=None): """ Func for listing measurements """ if carenet: record = carenet.record if not record: return HttpResponseBadRequest() processed_order_by = report_orderby_update(order_by) measurements = carenet_filter(carenet, Measurement.objects.select_related().filter( record=record, document__status=status).order_by(processed_order_by)) return render_template('reports/measurements', { 'measurements': measurements[offset:offset+limit], 'record': record, 'trc' : len(measurements), 'limit' : limit, 'offset' : offset, 'order_by' : order_by}, type="xml")
try: doc = _document_create( record=record, creator=request.principal, pha=pha, content=request.raw_post_data, external_id=external_id, replaces_document=existing_doc, mime_type=utils.get_content_type(request), ) except ValueError, e: return HttpResponseBadRequest("the document submitted is malformed:" + str(e)) _set_doc_latest(doc) return utils.render_template("document", {"record": doc.record, "doc": doc, "pha": pha}) @commit_on_200 def document_create(request, record): """ Create a record-specific Indivo Document. Calls into :py:meth:`~indivo.views.documents.document.__local_document_create`. """ return __local_document_create(request, record, pha=None, external_id=None, existing_doc=None) @commit_on_200
def vitals_list(request, limit, offset, status, category=None, order_by='-created_at', record=None, carenet=None): if carenet: record = carenet.record if not record: return HttpResponseBadRequest() occurred_min = request.GET.get('occurred-min', None) occurred_max = request.GET.get('occurred-max', None) aggregation = request.GET.get('aggregation', None) segmentation = request.GET.get('segmentation', None) processed_order_by = report_orderby_update(order_by) vitals = Vitals.objects.select_related().filter(record=record, document__status=status) #Apply all the different filters if category: # change underscores to spaces in the category, to make it easier without URL encoding category = category.replace("_"," ") vitals = vitals.filter(name=category) if occurred_min: occurred_min = datetime.datetime.strptime(occurred_min, "%Y-%m-%dT%H:%M:%SZ") vitals = vitals.filter(date_measured__gte = occurred_min) if occurred_max: occurred_max = datetime.datetime.strptime(occurred_max, "%Y-%m-%dT%H:%M:%SZ") #If there is no date_measured_end then it should be date_measured (start) vitals = vitals.filter(date_measured_end__lte = occurred_max) #Create the segments #These functions are methods in the class of vitals segmentation_functions = { "weekday" : lambda v: v.weekday(), "hourofday" : lambda v: v.hour_of_day(), "hour" : lambda v: v.hour(), "day" : lambda v: v.day(), "week" : lambda v: v.week(), "weekofyear" : lambda v: v.week_of_year(), "month" : lambda v: v.month(), "year" : lambda v: v.year() } if segmentation: if segmentation in segmentation_functions.keys(): temp = {} for key, group in groupby(vitals, segmentation_functions[segmentation]): temp[key] = [vital for vital in group] vitals = temp # at this point we have a dictionary where Keys are the #segment identifiers and the values are lists of vitals #Aggregation functions sum_vitals = lambda l: reduce(lambda x,y: x + y.value, l, 0) aggregation_functions = { "sum" : lambda l: sum_vitals(l), "avg" : lambda l: sum_vitals(l) / float(len(l)), "min" : lambda l: min(l, key=lambda x: x.value).value, "max" : lambda l: max(l, key=lambda x: x.value).value } #Apply the aggregation functions if aggregation: #Apply the aggregation if we know how to do if aggregation in aggregation_functions.keys(): temp = [] for key in vitals.keys(): #res.append(vitals[k].aggregate(functions[aggregation]('value'))) #value = reduce(lambda x,y: x + y.value, vitals[k], 0) value = aggregation_functions[aggregation](vitals[key]) vital = Vitals(value = value, name = "Step Count", unit = "steps") vital.index = key temp.append(vital) vitals = temp #Apply carenet_filter and order the results #vitals = carenet_filter(carenet, vitals.order_by(processed_order_by)) vitals = carenet_filter(carenet, vitals) #FIX: The ordering data does not work on a normal list. Only in querysets #Select the template depending if is aggregated vitals or not if aggregation: template = "reports/vitals_aggregation" else: template = "reports/vitals" return render_template(template, { 'vitals' : vitals[offset:offset+limit], 'trc' : len(vitals), 'limit' : limit, 'offset' : offset, 'order_by' : order_by }, type='xml')
""" try: doc = _document_create(record = record, creator = request.principal, pha = pha, content = request.raw_post_data, external_id = external_id, replaces_document = existing_doc, mime_type = utils.get_content_type(request)) except ValueError, e: return HttpResponseBadRequest("the document submitted is malformed:" + str(e)) _set_doc_latest(doc) return utils.render_template('document', {'record': doc.record, 'doc' : doc, 'pha' : pha }) @commit_on_200 def document_create(request, record): """ Create a record-specific Indivo Document. Calls into :py:meth:`~indivo.views.documents.document.__local_document_create`. """ return __local_document_create(request, record, pha=None, external_id = None, existing_doc=None)
try: doc = _document_create(record=record, creator=request.principal, pha=pha, content=request.raw_post_data, external_id=external_id, replaces_document=existing_doc, mime_type=utils.get_content_type(request)) except ValueError, e: return HttpResponseBadRequest("the document submitted is malformed:" + str(e)) _set_doc_latest(doc) return utils.render_template('document', { 'record': doc.record, 'doc': doc, 'pha': pha }) @commit_on_200 def document_create(request, record): """ Create a record-specific Indivo Document. Calls into :py:meth:`~indivo.views.documents.document.__local_document_create`. """ return __local_document_create(request, record,
""" Indivo Views -- Base """ from django.http import HttpResponse, HttpResponseRedirect, Http404, HttpResponseBadRequest from django.contrib.auth.models import User from django.core.exceptions import * from django.core import serializers from django.db import transaction from indivo.models import * from indivo.accesscontrol.security import * from indivo.lib.view_decorators import marsloader, commit_on_200 import logging, datetime # SZ: standardize from indivo.lib import utils from indivo.lib.utils import render_template, render_template_raw DONE = render_template('ok', {}, type="xml")