Skip to content
Snippets Groups Projects

Feature/dummy data pdp

Merged Carlos Vega requested to merge feature/dummy_data_pdp into master
1 unresolved thread
1 file
+ 133
124
Compare changes
  • Side-by-side
  • Inline
+ 133
124
@@ -4,7 +4,7 @@ import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "smash.settings")
django.setup()
from django.contrib.auth.models import User
from web.models import StudySubject, Appointment, Study, Subject, Worker, Location, Language, Country, WorkerStudyRole, Item, FlyingTeam, Room, MailTemplate
from web.models import StudySubject, Availability, Appointment, AppointmentType, Study, Subject, Worker, Location, Language, Country, WorkerStudyRole, Item, FlyingTeam, Room, MailTemplate
from web.models.constants import REDCAP_TOKEN_CONFIGURATION_TYPE, REDCAP_BASE_URL_CONFIGURATION_TYPE, \
SEX_CHOICES_MALE, SEX_CHOICES_FEMALE, SUBJECT_TYPE_CHOICES_CONTROL, SUBJECT_TYPE_CHOICES_PATIENT, CONTACT_TYPES_PHONE, \
MONDAY_AS_DAY_OF_WEEK, COUNTRY_AFGHANISTAN_ID, VOUCHER_STATUS_NEW, GLOBAL_STUDY_ID, DEFAULT_LOCALE_NAME
@@ -17,124 +17,7 @@ from collections import defaultdict
import logging
logger = logging.getLogger(__name__)
def add_mail_templates(languages):
template_file = get_resource_path('upcoming_appointment_FR.docx')
t1, _ = MailTemplate.objects.update_or_create(name='test_fr', language=languages[0], context=MAIL_TEMPLATE_CONTEXT_APPOINTMENT,template_file = template_file)
t2, _ = MailTemplate.objects.update_or_create(name='test_fr', language=languages[0], context=MAIL_TEMPLATE_CONTEXT_VOUCHER, template_file =template_file)
t3, _ = MailTemplate.objects.update_or_create(name='test_fr', language=languages[0], context=MAIL_TEMPLATE_CONTEXT_VISIT, template_file =template_file)
t4, _ = MailTemplate.objects.update_or_create(name='test_en', language=languages[1], context=MAIL_TEMPLATE_CONTEXT_SUBJECT, template_file = template_file)
return [t1, t2, t3, t4]
def add_flying_teams():
places = ['Belval', 'Belvaux', 'Arlon', 'Metz']
return [FlyingTeam.objects.update_or_create(place=place)[0] for place in places]
def add_items(): #equipments
items = [
{'name': 'Table', 'is_fixed': True, 'disposable': False},
{'name': 'X-Ray Machine', 'is_fixed': True, 'disposable': False},
{'name': 'The mysterious potion', 'is_fixed': False, 'disposable': True},
{'name': 'Even more mysterious potion', 'is_fixed': False, 'disposable': True}]
return [Item.objects.update_or_create(**item)[0] for item in items]
def add_rooms(equipments):
rooms = [
{'owner': 'McOwner', 'city': 'Esch', 'address': 'Rue', 'floor': 1, 'is_vehicle': False, 'room_number': 1},
{'owner': 'McOwner', 'city': 'Luxembourg', 'address': 'Rue', 'floor': 2, 'is_vehicle': False, 'room_number': 2},
{'owner': 'McOwner', 'city': 'Vianden', 'address': 'Rue', 'floor': 1, 'is_vehicle': False, 'room_number': 4},
{'owner': 'McOwner', 'city': 'Petange', 'address': 'Rue', 'floor': 4, 'is_vehicle': False, 'room_number': 2}]
return_rooms = []
for i in range(len(rooms)):
room, _ = Room.objects.update_or_create(**rooms[i])
room.equipment = [equipments[i%len(equipments)]]
return_rooms.append(room)
return return_rooms
def add_languages():
languages = ['French', 'English', 'Luxembourgish', 'German', 'Spanish', 'Portuguese']
return [Language.objects.update_or_create(name=language, locale=DEFAULT_LOCALE_NAME)[0] for language in languages]
def add_subjects(locations):
subjects = [
{'first_name': 'Sick', 'last_name': 'Guy', 'sex': SEX_CHOICES_MALE, 'country_id': COUNTRY_AFGHANISTAN_ID},
{'first_name': 'Patient', 'last_name': 'Pers', 'sex': SEX_CHOICES_FEMALE, 'country_id': COUNTRY_AFGHANISTAN_ID},
{'first_name': 'Control', 'last_name': 'Lia', 'sex': SEX_CHOICES_FEMALE, 'country_id': COUNTRY_AFGHANISTAN_ID},
{'first_name': 'Sick Jr.', 'last_name': 'Norg', 'sex': SEX_CHOICES_MALE, 'country_id': COUNTRY_AFGHANISTAN_ID},
{'first_name': 'Patient Jr.', 'last_name': 'Voga', 'sex': SEX_CHOICES_FEMALE, 'country_id': COUNTRY_AFGHANISTAN_ID},
{'first_name': 'Control Jr.', 'last_name': 'Yung', 'sex': SEX_CHOICES_FEMALE, 'country_id': COUNTRY_AFGHANISTAN_ID},
{'first_name': 'Patient 2', 'last_name': 'Porl', 'sex': SEX_CHOICES_FEMALE, 'country_id': COUNTRY_AFGHANISTAN_ID},
{'first_name': 'Control 2', 'last_name': 'Weal', 'sex': SEX_CHOICES_FEMALE, 'country_id': COUNTRY_AFGHANISTAN_ID},
{'first_name': 'John Jr.', 'last_name': 'Righ', 'sex': SEX_CHOICES_MALE, 'country_id': COUNTRY_AFGHANISTAN_ID},
{'first_name': 'Carol', 'last_name': 'Adams', 'sex': SEX_CHOICES_FEMALE, 'country_id': COUNTRY_AFGHANISTAN_ID},
{'first_name': 'Control Jr.', 'last_name': 'Roi', 'sex': SEX_CHOICES_FEMALE, 'country_id': COUNTRY_AFGHANISTAN_ID}
]
types = [SUBJECT_TYPE_CHOICES_CONTROL, SUBJECT_TYPE_CHOICES_PATIENT]
letters = ['P', 'C', 'E', 'V']
letters2 = ['V', 'L', 'O', 'E']
letters3 = ['L', 'P', 'E', 'V']
study = Study.objects.filter(id=GLOBAL_STUDY_ID)[0]
study_subjects = []
for i, subject in enumerate(subjects):
subject, _ = Subject.objects.update_or_create(**subject)
if i%3 == 0:
screening_number = '{}-{:03}; {}-{:03}'.format(letters[i%len(letters)], i, letters2[i%len(letters2)], (i+1)*2)
elif i%2 != 0:
screening_number = '{}-{:03}; {}-{:03}'.format(letters2[i%len(letters2)], (i+1)*2, letters[i%len(letters)], i)
else:
screening_number = '{}-{:03}'.format(letters3[i%len(letters3)], i)
study_subject, _ = StudySubject.objects.update_or_create(subject=subject, defaults={'default_location':locations[i%len(locations)], 'type':types[i%len(types)], 'screening_number':screening_number, 'study':study})
study_subjects.append(study_subject)
return study_subject
def add_locations():
l1, _ = Location.objects.update_or_create(name='Luxembourg', color='#f00', prefix='L')
l2, _ = Location.objects.update_or_create(name='Esch', color='#0f0', prefix='E')
l3, _ = Location.objects.update_or_create(name='Petange', color='#00f', prefix='P')
l4, _ = Location.objects.update_or_create(name='Vianden', color='#0ff', prefix='V')
return [l1, l2, l3, l4]
def add_workers(locations, languages):
users = [
{'username':'manager', 'email':'manager@hospital.abc', 'password':'password1234'},
{'username':'secretary', 'email':'secretary@hospital.abc', 'password':'password1234'},
{'username':'doctor', 'email':'doctor@hospital.abc', 'password':'password1234'},
{'username':'doctor2', 'email':'doctor2@hospital.abc', 'password':'password1234'}
]
workers = [
{'first_name':'Manager', 'last_name': 'Office', 'email':'manager@hospital.abc',
'specialization': 'spec', 'unit':"Parkinson", 'phone_number':'0123456789'},
{'first_name':'Secretary', 'last_name': 'Office', 'email':'secretary@hospital.abc',
'specialization': 'spec', 'unit':"Parkinson", 'phone_number':'0123456789'},
{'first_name':'Doctor', 'last_name': 'Office', 'email':'doctor@hospital.abc',
'specialization': 'spec', 'unit':"Parkinson", 'phone_number':'0123456789'},
{'first_name':'Doctor2', 'last_name': 'Office', 'email':'doctor2@hospital.abc',
'specialization': 'spec', 'unit':"Parkinson", 'phone_number':'0123456789'}
]
roles = [ROLE_CHOICES_PROJECT_MANAGER, ROLE_CHOICES_SECRETARY, ROLE_CHOICES_DOCTOR, ROLE_CHOICES_DOCTOR]
for i in range(len(users)):
user, _ = User.objects.update_or_create(username=users[i]['username'], defaults=users[i])
user.set_password(users[i]['password']) # internally triggers the password hashing mechanism
user.save()
workers[i]['user'] = user
worker, _ = Worker.objects.update_or_create(first_name=workers[i]['first_name'], last_name=workers[i]['last_name'], defaults=workers[i])
worker.locations = [locations[i%len(locations)]]
worker.languages = [languages[i%len(locations)]]
WorkerStudyRole.objects.update_or_create(worker=worker, study_id=GLOBAL_STUDY_ID, role=roles[i])
from web.views.notifications import get_today_midnight_date
from faker.providers import BaseProvider, color
from numpy.random import choice
from faker import Faker
@@ -145,6 +28,7 @@ class smashProvider(BaseProvider):
__provider__ = 'smash'
__lang__ = 'fr_FR'
fake = Faker()
fake.seed(4321)
specialists = ['Psychiatrist', 'Radiologist', 'Immunologist', 'Anesthesiologist', 'Surgeon', 'Pediatrician', 'Neurologist', 'Medical examiner']
units = ['LHI', 'PCR', 'LCSB', 'ACO', 'PLI', 'LRSU']
@@ -186,11 +70,20 @@ class smashProvider(BaseProvider):
places = ['Belval', 'Belvaux', 'Arlon', 'Metz']
alreadyCreatedFlyingTeams = {}
#countries
countries = ['France', 'Luxembourg', 'Germamny', 'Belgium']
countries = ['France', 'Luxembourg', 'Germamny', 'Belgium']
alreadyCreatedCountries = {}
#screening number
screening_number_ctrs = defaultdict(int)
#template file
template_file = get_resource_path('upcoming_appointment_FR.docx')
template_context = [MAIL_TEMPLATE_CONTEXT_APPOINTMENT, MAIL_TEMPLATE_CONTEXT_VOUCHER, MAIL_TEMPLATE_CONTEXT_VISIT, MAIL_TEMPLATE_CONTEXT_SUBJECT]
#subjects
alreadyCreatedSubjects = []
alreadyCreatedStudySubjects = []
#appointment type
alreadyCreatedAppointmentTypes = []
#workers
alreadyCreatedWorkers = []
def getLuxembourgTown(self):
return self.fake.word(ext_word_list=self.luxtowns)
@@ -207,6 +100,112 @@ class smashProvider(BaseProvider):
def getWorkerRole(self):
return self.fake.word(ext_word_list=self.workerRoles)
#availability
def createSmashAvailabilities(self):
for worker in self.alreadyCreatedWorkers:
for weekday in set(choice(range(1,6), 4)):
availability = self.createSmashAvailability(worker=worker, day_number=weekday)
def createSmashAvailability(self, worker=None, day_number=None, available_from=None, available_till=None):
if worker is None:
worker = choice(self.alreadyCreatedWorkers)
if day_number is None:
day_number = choice(range(1,6))
if available_from is None:
available_from = '8:00'
if available_till is None:
available_till = '18:00'
availability, _ = Availability.objects.update_or_create(person=worker,
day_number=day_number,
available_from=available_from,
available_till=available_till)
return availability
#appointments
def createSmashAppointments(self):
for subject in self.alreadyCreatedSubjects:
visit = self.createSmashVisit(subject=subject)
appointment = self.createSmashAppointment(visit=visit)
def createSmashAppointment(self, visit=None, datetime_when=None, location=None, length=30, status=Appointment.APPOINTMENT_STATUS_SCHEDULED):
if visit is None:
visit = self.createSmashVisit()
if datetime_when is None:
datetime_when = get_today_midnight_date()
if location is None:
location = self.getAlreadyCreatedSmashLocation()
appointment, _ = Appointment.objects.update_or_create(
visit=visit, length=length, location=location,
status=status, datetime_when=datetime_when)
appointment.types.set(self.getAlreadyCreatedAppointmentTypes())
appointment.save()
return appointment
#visit
def createSmashVisit(self, datetime_begin=None, datetime_end=None, subject=None, is_finished=False):
if datetime_begin is None:
datetime_begin = get_today_midnight_date() + datetime.timedelta(days=-31)
if datetime_end is None:
datetime_end = get_today_midnight_date() + datetime.timedelta(days=31)
if subject is None:
subject = choice(self.alreadyCreatedSubjects, 1)[0]
visit, _ = Visit.objects.update_or_create(datetime_begin=datetime_begin, datetime_end=datetime_end,
subject=subject, is_finished=is_finished)
return visit
#AppointmentTypes
def getAlreadyCreatedAppointmentTypes(self, n=3):
return choice(self.alreadyCreatedAppointmentTypes, n)
def createSmashAppointmentTypes(self, n_max=5):
return [self.createSmashAppointmentType() for _ in xrange(n_max)]
def createSmashAppointmentType(self, code=None, default_duration=10, rest_time=5, description=None):
if code is None:
code = self.fake.word(ext_word_list=['C', 'A', 'N', 'P'])
if description is None:
description = self.fake.word(ext_word_list=['Examination', 'Analysis', 'Questions', 'Test'])
equipment = self.getSmashAlreadyCreatedItems()
appointmentType, _ = AppointmentType.objects.update_or_create(code=code, rest_time=rest_time,
default_duration=default_duration, description=description)
appointmentType.required_equipment.set(equipment)
appointmentType.required_worker = choice(['DOCTOR', 'NURSE', 'PSYCHOLOGIST', 'ANY'])
appointmentType.save()
self.alreadyCreatedAppointmentTypes.append(appointmentType)
return appointmentType
#mail template
def createSmashMailTemplates(self):
'''
Returns a list of template objects
'''
languages = self.getAlreadyCreatedSmashLanguages()
templates = []
for context in self.template_context:
for language in languages:
template = self.createSmashMailTemplate(language=language, context=context)
templates.append(template)
return templates
def createSmashMailTemplate(self, name=None, language=None, context=MAIL_TEMPLATE_CONTEXT_APPOINTMENT, template_file=None):
if language is None:
language = self.getAlreadyCreatedSmashLanguages()[0]
if name is None:
name = '{} Template'.format(language.name)
if template_file is None:
template_file = self.template_file
template, _ = MailTemplate.objects.update_or_create(name=name, language=language, context=context, template_file = template_file)
return template
#flying teams
def createSmashFlyingTeams(self):
return [self.createSmashFlyingTeam(place=place) for place in self.places]
@@ -246,7 +245,7 @@ class smashProvider(BaseProvider):
return item
def getSmashAlreadyCreatedItem(self, max_n=3):
def getSmashAlreadyCreatedItems(self, max_n=3):
if len(self.alreadyCreatedItems.keys()) == 0:
self.createSmashItems()
@@ -269,7 +268,7 @@ class smashProvider(BaseProvider):
'''
if equipment is None:
item = self.fake.word(ext_word_list=self.alreadyCreatedItems.keys())
equipment = self.getSmashAlreadyCreatedItem()
equipment = self.getSmashAlreadyCreatedItems()
if owner is None:
owner = self.fake.first_name()
@@ -352,6 +351,8 @@ class smashProvider(BaseProvider):
defaults={'default_location':default_location, 'type':type,
'screening_number': screening_number, 'study':study})
self.alreadyCreatedStudySubjects.append(study_subject)
return study_subject
def createSmashSubject(self, first_name=None, last_name=None, languages=None,
@@ -406,6 +407,8 @@ class smashProvider(BaseProvider):
subject.languages.set(languages)
subject.save()
self.alreadyCreatedSubjects.append(subject)
return subject
#user
@@ -493,6 +496,8 @@ class smashProvider(BaseProvider):
worker.languages.set(self.getAlreadyCreatedSmashLanguages())
worker.save()
self.alreadyCreatedWorkers.append(worker)
#create workerStudyRole
workerStudyRole, _ = WorkerStudyRole.objects.update_or_create(worker=worker,
study_id=GLOBAL_STUDY_ID, role=role)
@@ -566,16 +571,20 @@ class smashProvider(BaseProvider):
if __name__ == "__main__":
fake = Faker()
fake.seed(4321)
fake.add_provider(smashProvider)
fake.createSmashFlyingTeams()
fake.createSmashItems()
fake.createSmashAppointmentTypes()
fake.createSmashRooms()
fake.createSmashLocations()
fake.createSmashLanguages()
fake.createSmashMailTemplates()
fake.createSmashCountries()
fake.createSmashWorkers()
fake.createSmashAvailabilities()
fake.createSmashStudySubjects()
# flying_teams = add_flying_teams()
Loading