def test_get_field_names_to_extract(self): # field names to extract should be the same # as the field names to serialise self.assertEqual( Episode._get_fieldnames_to_serialize(), Episode._get_fieldnames_to_extract() )
def create(self, request): """ Create a new episode, optionally implicitly creating a patient. * Extract the data from the request * Create or locate the patient * Create a new episode * Update the patient with any extra data passed in * return the patient """ demographics_data = request.data.pop('demographics', None) location_data = request.data.pop('location', {}) tagging = request.data.pop('tagging', {}) hospital_number = demographics_data.get('hospital_number', None) if hospital_number: patient, created = Patient.objects.get_or_create( demographics__hospital_number=hospital_number) if created: demographics = patient.demographics_set.get() demographics.hospital_number = hospital_number demographics.save() else: patient = Patient.objects.create() patient.update_from_demographics_dict(demographics_data, request.user) episode = Episode(patient=patient) episode.update_from_dict(request.data, request.user) location = episode.location_set.get() location.update_from_dict(location_data, request.user) episode.set_tag_names([n for n, v in tagging[0].items() if v], request.user) serialised = episode.to_dict(request.user) return _build_json_response(serialised, status_code=status.HTTP_201_CREATED)
def get_data_dictionary(): schema = {} for subrecord in subrecords(): if getattr(subrecord, '_exclude_from_extract', False): continue field_names = subrecord._get_fieldnames_to_extract() record_schema = [field_to_dict(subrecord, i) for i in field_names] schema[subrecord.get_display_name()] = record_schema field_names = Episode._get_fieldnames_to_extract() schema["Episode"] = [field_to_dict(Episode, i) for i in field_names] return OrderedDict(sorted(schema.items(), key=lambda t: t[0]))
def episode_csv(episodes, user, file_name): """ Given an iterable of EPISODES, create a CSV file containing Episode details. """ with open(file_name, "w") as csv_file: fieldnames = Episode._get_fieldnames_to_serialize() fieldnames.remove('consistency_token') headers = list(fieldnames) headers.append("tagging") writer = csv.DictWriter(csv_file, fieldnames=headers) writer.writeheader() for episode in episodes: row = {h: unicode(getattr(episode, h)).encode('UTF-8') for h in fieldnames} row["tagging"] = ';'.join(episode.get_tag_names(user, historic=True)) writer.writerow(row)
def get_data_dictionary(): schema = {} for subrecord in subrecords(): field_names = subrecord._get_fieldnames_to_extract() record_schema = [field_to_dict(subrecord, i) for i in field_names] schema[subrecord.get_display_name()] = record_schema field_names = Episode._get_fieldnames_to_extract() field_names.remove("start") field_names.remove("end") schema["Episode"] = [field_to_dict(Episode, i) for i in field_names] schema["Episode"].append(dict( display_name="Start", type_display_name="Date & Time" )) schema["Episode"].append(dict( display_name="End", type_display_name="Date & Time" )) return OrderedDict(sorted(schema.items(), key=lambda t: t[0]))
def episode_csv(episodes, user, file_name): """ Given an iterable of EPISODES, create a CSV file containing Episode details. """ with open(file_name, "w") as csv_file: fieldnames = Episode._get_fieldnames_to_serialize() fieldnames.remove('consistency_token') headers = list(fieldnames) headers.append("tagging") writer = csv.DictWriter(csv_file, fieldnames=headers) writer.writeheader() for episode in episodes: row = { h: unicode(getattr(episode, h)).encode('UTF-8') for h in fieldnames } row["tagging"] = ';'.join( episode.get_tag_names(user, historic=True)) writer.writerow(row)
def create(self, request): from opal.models import Patient hospital_number = request.data.pop('patient_hospital_number', None) tagging = request.data.pop('tagging', {}) if hospital_number: patient, created = Patient.objects.get_or_create( demographics__hospital_number=hospital_number) if created: demographics = patient.demographics_set.get() demographics.hospital_number = hospital_number demographics.save() else: patient = Patient.objects.create() episode = Episode(patient=patient) episode.update_from_dict(request.data, request.user) episode.set_tag_names([n for n, v in tagging[0].items() if v], request.user) serialised = episode.to_dict(request.user) return Response(serialised, status=status.HTTP_201_CREATED)
def create(self, request): """ Create a new episode, optionally implicitly creating a patient. * Extract the data from the request * Create or locate the patient * Create a new episode * Update the patient with any extra data passed in * return the patient """ demographics_data = request.data.pop('demographics', None) location_data = request.data.pop('location', {}) tagging = request.data.pop('tagging', {}) hospital_number = demographics_data.get('hospital_number', None) if hospital_number: patient, created = Patient.objects.get_or_create( demographics__hospital_number=hospital_number) if created: demographics = patient.demographics_set.get() demographics.hospital_number = hospital_number demographics.save() else: patient = Patient.objects.create() patient.update_from_demographics_dict(demographics_data, request.user) episode = Episode(patient=patient) episode.update_from_dict(request.data, request.user) location = episode.location_set.get() location.update_from_dict(location_data, request.user) episode.set_tag_names(list(tagging.keys()), request.user) serialised = episode.to_dict(request.user) return json_response( serialised, status_code=status.HTTP_201_CREATED )
def test_get_field_names_to_extract(self): # field names to extract should be the same # as the field names to serialise self.assertEqual(Episode._get_fieldnames_to_serialize(), Episode._get_fieldnames_to_extract())