class PatientCVsViewSet(viewsets.ModelViewSet): queryset = Patient.all(active=True) serializer_class = PatientSerializer def retrieve(self, request, *args, **kwargs): patient = self.get_object() return self.buildResponse(patient) #Refactor this URGENT def buildResponse(self, patient): headers = CVGroup.all() headerSerialized = CVGroupSerializer(headers, many=True) results = [] for group in headers: obj = {"group": group.title} cvs = CVPatient.all(patient=patient, group=group) content = [] cvsSplitedByDate = [ list(grp) for i, grp in groupby(sorted(cvs.values()), key=lambda item: item["measure_date"]) ] # These nested fors hurts my soul, but i don't know a better solution for cvsInThatDate in cvsSplitedByDate: cvToAddInResponse = { "measure_date": cvsInThatDate[0]["measure_date"].strftime("%Y-%m-%d %H:%M") } for cv in cvsInThatDate: cvName = ClinicalVariable.objects.get( id=cv["variable_id"]).variable cvToAddInResponse[cvName] = cv["value"] content += [cvToAddInResponse] obj["content"] = content results += [obj] return Response({"headers": headerSerialized.data, "results": results}) @list_route(methods=['post']) @transaction.atomic def addVariables(self, request, *args, **kwargs): measure_date = timezone.now() group = CVGroup.objects.get(title=request.data["group"]) patient = Patient.objects.get(id=request.data["patient"]) for cv in request.data: if (cv != "group" and cv != "patient"): variable = cv value = request.data[cv] CVPatient.new(patient, group, variable, value, measure_date) return self.buildResponse(patient)
def listDischarged(self, request, *args, **kwargs): ''' Return a list of active patients that are discharged from the hospital ''' self.queryset = Patient.all(status=Patient.DISCHARGED) return super(PatientViewSet, self).list(request, *args, **kwargs)
def listAdmitted(self, request, *args, **kwargs): ''' Return a list of active patients that are admitted in the hospital ''' self.queryset = Patient.all(status=Patient.ADMITTED) return super(PatientViewSet, self).list(request, *args, **kwargs)