From 536a1a56acff3b061a880ea2c49e9d577e9f0925 Mon Sep 17 00:00:00 2001 From: Carlos Vega <carlos.vega@uni.lu> Date: Mon, 15 Oct 2018 20:23:28 +0200 Subject: [PATCH] dummy data version 1 --- smash/create_dummy_data.py | 588 +++++++++++++++++++++++++++++++++++++ 1 file changed, 588 insertions(+) create mode 100644 smash/create_dummy_data.py diff --git a/smash/create_dummy_data.py b/smash/create_dummy_data.py new file mode 100644 index 00000000..51a33e49 --- /dev/null +++ b/smash/create_dummy_data.py @@ -0,0 +1,588 @@ +from django.conf import settings +import django +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.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 +from web.models.constants import MAIL_TEMPLATE_CONTEXT_APPOINTMENT, MAIL_TEMPLATE_CONTEXT_VISIT, \ + MAIL_TEMPLATE_CONTEXT_SUBJECT, MAIL_TEMPLATE_CONTEXT_VOUCHER +from web.models.worker_study_role import ROLE_CHOICES_PROJECT_MANAGER, ROLE_CHOICES_SECRETARY, ROLE_CHOICES_DOCTOR, WORKER_VOUCHER_PARTNER +from web.tests.functions import get_resource_path + +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 faker.providers import BaseProvider, color +from numpy.random import choice +from faker import Faker +import unidecode + +class smashProvider(BaseProvider): + + __provider__ = 'smash' + __lang__ = 'fr_FR' + fake = Faker() + + specialists = ['Psychiatrist', 'Radiologist', 'Immunologist', 'Anesthesiologist', 'Surgeon', 'Pediatrician', 'Neurologist', 'Medical examiner'] + units = ['LHI', 'PCR', 'LCSB', 'ACO', 'PLI', 'LRSU'] + workerRoles = [ROLE_CHOICES_PROJECT_MANAGER, ROLE_CHOICES_SECRETARY, ROLE_CHOICES_DOCTOR, ROLE_CHOICES_DOCTOR] + + #towns and cities + near_fr_towns = ['Metz', 'Audun-le-Tiche', 'Thionville'] + near_de_towns = ['Trier'] + near_be_towns = ['Aubange', 'Arlon'] + luxtowns = ['Luxembourg City', 'Esch-sur-Alzette', 'Differdange', 'Dudelange', 'Ettelbruck', 'Diekirch', 'Wiltz', 'Rumelange', 'Echternach', 'Grevenmacher', 'Remich', 'Vianden'] + + #if you add or remove cities, be careful and change the probabilities as well + #here the probs ensure the luxembourgish towns have 0.8 prob, and so on... + cities = luxtowns + near_fr_towns + near_de_towns + near_be_towns + city_prob = [0.8/len(luxtowns)] *len(luxtowns) + \ + [0.1/len(near_fr_towns)] *len(near_fr_towns) + \ + [0.05/len(near_de_towns)]*len(near_de_towns) + \ + [0.05/len(near_be_towns)]*len(near_be_towns) + + alreadyCreatedLocations = {} + #languages + language_base_dir = './smash/web/static/flags/' + language_flags = { + 'French' : 'FR.png', + 'English': 'GB.png', + 'Spanish': 'ES.png', + 'Portuguese': 'PT.png', + 'Luxembourgish': 'LU.png', + 'German': 'DE.png', + 'Dutch' : 'NL.png' + } + languages = ['English', 'Luxembourgish', 'French', 'German', 'Portuguese', 'Spanish', 'Dutch'] + languages_prob = [0.25, 0.2, 0.16, 0.16, 0.13, 0.05, 0.05] + alreadyCreatedLanguages = {} + #items + items = ['Ambulance', 'Bandages', 'Examination Table', 'X-Ray Machine', 'Lab Coat', 'Needle', 'Stretcher', 'Vial', 'Wheelchair'] + alreadyCreatedItems = {} + #flying teams + places = ['Belval', 'Belvaux', 'Arlon', 'Metz'] + alreadyCreatedFlyingTeams = {} + #countries + countries = ['France', 'Luxembourg', 'Germamny', 'Belgium'] + + alreadyCreatedCountries = {} + + screening_number_ctrs = defaultdict(int) + + def getLuxembourgTown(self): + return self.fake.word(ext_word_list=self.luxtowns) + + def getFrenchTown(self): + return self.fake.word(ext_word_list=self.near_fr_towns) + + def getBelgiumTown(self): + return self.fake.word(ext_word_list=self.near_be_towns) + + def getDeutschTown(self): + return self.fake.word(ext_word_list=self.near_de_towns) + + def getWorkerRole(self): + return self.fake.word(ext_word_list=self.workerRoles) + + #flying teams + def createSmashFlyingTeams(self): + return [self.createSmashFlyingTeam(place=place) for place in self.places] + + def createSmashFlyingTeam(self, place=None): + if place is None: + place = self.fake.word(ext_word_list=self.places) + flying_team, _ = FlyingTeam.objects.update_or_create(place=place) + + self.alreadyCreatedFlyingTeams[place] = flying_team + + return flying_team + + #item + def createSmashItems(self): + ''' + Returns a list of Item objects + ''' + return [self.createSmashItem(name=item) for item in self.items] + + def createSmashItem(self, name=None, is_fixed=None, disposable=None): + ''' + Returns an Item object + ''' + if name is None: + name = self.fake.word(ext_word_list=self.items) + + if is_fixed is None: + is_fixed = self.fake.boolean(chance_of_getting_true=75) + + if disposable is None: + disposable = self.fake.boolean(chance_of_getting_true=75) + + item, _ = Item.objects.update_or_create(name=name, is_fixed=is_fixed, disposable=disposable) + + self.alreadyCreatedItems[name] = item + + return item + + def getSmashAlreadyCreatedItem(self, max_n=3): + if len(self.alreadyCreatedItems.keys()) == 0: + self.createSmashItems() + + keys = set(choice(self.alreadyCreatedItems.keys(), max_n)) + return [self.alreadyCreatedItems[key] for key in keys] + + #room + def createSmashRooms(self, n=4): + return [self.createSmashRoom() for _ in xrange(n)] + + def createSmashRoom(self, equipment=None, owner=None, address=None, city=None, room_number=None, floor=None, is_vehicle=None): + ''' + equipment: List of Item objects: + owner: string: + address: string: + city: string: + room_number: int: + floor: int: + is_vehicle: boolean: + ''' + if equipment is None: + item = self.fake.word(ext_word_list=self.alreadyCreatedItems.keys()) + equipment = self.getSmashAlreadyCreatedItem() + + if owner is None: + owner = self.fake.first_name() + + if address is None: + address = '{}, {} {}'.format(self.fake.word(ext_word_list=self.cities), self.fake.random_digit_not_null_or_empty(), self.fake.street_name()) + address = address.replace('\n', ' ') + + if city is None: + city = self.fake.word(ext_word_list=self.cities) + + if room_number is None: + room_number = choice(range(10), 1)[0] #choice returns a list + + if floor is None: + floor = choice(range(10), 1)[0] + + if is_vehicle is None: + is_vehicle = self.fake.boolean(chance_of_getting_true=25) + + dicc = {'owner': owner, 'city': city, 'address': address, + 'floor': floor, 'room_number': room_number, 'is_vehicle': is_vehicle} + room, _ = Room.objects.update_or_create(**dicc) + room.equipment.set(equipment) + room.save() + + return room + + #country + def getAlreadyCreatedSmashCountry(self): + if len(self.alreadyCreatedCountries) == 0: + self.createSmashCountries() + + name = self.fake.word(ext_word_list=self.countries) + return self.alreadyCreatedCountries[name] + + def createSmashCountries(self): + return [self.createSmashCountry(name=country) for country in self.countries] + + def createSmashCountry(self, name=None, order=0): + if name is None: + name = self.fake.word(ext_word_list=self.countries) + country, _ = Country.objects.update_or_create(name=name, order=order) + self.alreadyCreatedCountries[name] = country + return country + + def createSmashScreeningNumber(self, prefix): + self.screening_number_ctrs[prefix]+=1 + return '{}-{:03}'.format(prefix, self.screening_number_ctrs[prefix]) + + #subject + def createSmashStudySubjects(self, n=30): + ''' + Returns a list of tuples (subject, study_subject) + ''' + study = Study.objects.filter(id=GLOBAL_STUDY_ID)[0] + return [self.createSmashStudySubject(study=study) for _ in xrange(n)] + + def createSmashStudySubject(self, subject=None, study=None, postponed=None, + datetime_contact_reminder=None, type=None, default_location=None, flying_team=None, + screening_number=None): # complete code and args... + + if subject is None: + subject = self.createSmashSubject() + + if study is None: + study = Study.objects.filter(id=GLOBAL_STUDY_ID)[0] + + if type is None: + type = choice([SUBJECT_TYPE_CHOICES_CONTROL, SUBJECT_TYPE_CHOICES_PATIENT], 1, p=[0.2, 0.8]) + type = type[0] + + if default_location is None: + default_location = self.getAlreadyCreatedSmashLocation() + + if screening_number is None: + screening_number = self.createSmashScreeningNumber(default_location.prefix) + + study_subject, _ = StudySubject.objects.update_or_create(subject=subject, + defaults={'default_location':default_location, 'type':type, + 'screening_number': screening_number, 'study':study}) + + return study_subject + + def createSmashSubject(self, first_name=None, last_name=None, languages=None, + default_written_communication_language=None, phone_number=None, social_security_number=None, + sex=None, country_id=None, date_born=None, address=None, + postal_code=None, city=None, country=None, dead=None): + + if first_name is None: + first_name = self.fake.first_name() + + if last_name is None: + last_name = self.fake.last_name() + + if languages is None: + languages = self.getAlreadyCreatedSmashLanguages() + + if default_written_communication_language is None: + getAlreadyCreatedSmashLanguages = languages[0] + + if phone_number is None: + phone_number = self.fake.phone_number() + + if social_security_number is None: + social_security_number = self.fake.ean(length=8) + + if sex is None: + sex = self.fake.word(ext_word_list=[SEX_CHOICES_MALE, SEX_CHOICES_FEMALE]) + + if country_id is None: + country_id = COUNTRY_AFGHANISTAN_ID + + if date_born is None: + date_born = self.fake.date_of_birth(minimum_age=50, maximum_age=105).strftime('%Y-%m-%d') + if address is None: + address = self.fake.address() + if postal_code is None: + postal_code = self.fake.postcode() + if city is None: + city = self.fake.word(ext_word_list=self.cities) + if country is None: + country = self.getAlreadyCreatedSmashCountry() + if dead is None: + dead = self.fake.boolean(chance_of_getting_true=1) + + dicc = {'first_name': first_name, 'last_name': last_name, + 'default_written_communication_language': default_written_communication_language, + 'phone_number': phone_number, 'social_security_number': social_security_number, + 'sex': sex, 'country_id': country_id, 'date_born': date_born, 'address': address, + 'postal_code': postal_code, 'city': city, 'country': country, 'dead': dead} + + subject, _ = Subject.objects.update_or_create(**dicc) + subject.languages.set(languages) + subject.save() + + return subject + + #user + def createSmashUser(self, username=None, email=None, password='password1234'): + ''' + username: string: Sets the username. By default None. Random values are generated unless other value is provided. + email: string: Sets the email. By default None. Random values are generated unless other value is provided. + password: string: Sets the password. By default password1234 unless other value is provided. + Returns a user + ''' + first_name = self.fake.first_name().lower().replace('_', '') + last_name = self.fake.last_name().lower().replace('_', '') + if username is None: + username = u'{}_{}'.format(first_name, last_name) + username = unidecode.unidecode(username) + + if email is None: + email = u'{}.{}@smash.lu'.format(first_name, last_name) + email = unidecode.unidecode(email) + #create user + defaults = {'email':email, 'password': password} + user, _ = User.objects.update_or_create(username=username, defaults=defaults) + user.set_password(password) + user.save() + return user + + #worker + def createSmashWorkers(self, n=10): + ''' + :n int: number of workers to create + + Returns a list of tuples (user, worker, workerStuyRole) + ''' + logger.info('creating Smash Worker...') + return [self.createSmashWorker() for _ in xrange(n)] + + def createSmashWorker(self, first_name=None, last_name=None, username=None, email=None, specialization=None, unit=None, phone_number=None, password='password1234', role=None): + ''' + first_name: string: Sets the first_name. By default None. Random values are generated. Provide a value to overwrite random generation + last_name: string: Sets the last_name. By default None. Random values are generated. Provide a value to overwrite random generation + username: string: Sets the username. By default None. Random values are generated. Provide a value to overwrite random generation + email: string: Sets the email. By default None. Random values are generated. Provide a value to overwrite random generation + specialization: string: Sets the specialization. By default None. Random values are generated. Provide a value to overwrite random generation + unit: string: Sets the unit. By default None. Random values are generated. Provide a value to overwrite random generation + phone_number: string: Sets the phone_number. By default None. Random values are generated. Provide a value to overwrite random generation + password: string: Sets the password. By default None. Random values are generated. Provide a value to overwrite random generation + role: string: Sets the role. By default None. Random values are generated. Provide a value to overwrite random generation + Returns a tuple with (user, worker, workerStuyRole) + ''' + if first_name is None: + first_name = self.fake.first_name() + + if last_name is None: + last_name = self.fake.last_name() + + if username is None: + username = u'{}_{}'.format(first_name, last_name) + + if email is None: + email = u'{}.{}@smash.lu'.format(first_name, last_name) + + if specialization is None: + specialization = self.getSmashSpecialization() + + if unit is None: + unit = self.getSmashUnit() + + if phone_number is None: + phone_number = self.fake.phone_number() + + if role is None: + role = self.getWorkerRole() + + #create user + user = self.createSmashUser(username=username, email=email, password=password) + + #create worker + defaults = {'first_name': first_name, 'last_name': last_name, + 'email': email, 'unit':unit, 'specialization': specialization, + 'phone_number': phone_number, 'user': user} + worker, _ = Worker.objects.update_or_create(first_name=first_name, + last_name=last_name, defaults=defaults) + + worker.locations.set([self.getAlreadyCreatedSmashLocation()]) + worker.languages.set(self.getAlreadyCreatedSmashLanguages()) + worker.save() + + #create workerStudyRole + workerStudyRole, _ = WorkerStudyRole.objects.update_or_create(worker=worker, + study_id=GLOBAL_STUDY_ID, role=role) + + #unit + def getSmashUnit(self): + return self.fake.word(ext_word_list=self.units) + + #specialization + def getSmashSpecialization(self): + return self.fake.word(ext_word_list=self.specialists) + + #languages + def createSmashLanguages(self): + ''' + Returns a list of Language objects + ''' + logger.info('creating Smash Languages...') + return [self.createSmashLanguage(name=name) for name in self.languages] + + def createSmashLanguage(self, name=None, locale=DEFAULT_LOCALE_NAME): + ''' + Returns a Language object + ''' + if name is None: + name = self.fake.word(ext_word_list=self.languages) + + language, _ = Language.objects.update_or_create(name=name, locale=locale) + self.alreadyCreatedLanguages[name] = language + return language + + def getAlreadyCreatedSmashLanguages(self, max_n=3): + ''' + Returns a list of Languages from the already created languages, + if no languages are created, then the list is generated. + + max_n: int: maximum number of languages to return + + Returns a list of Language objects. + ''' + if len(self.alreadyCreatedLanguages.keys()) == 0: + self.createSmashLanguages() + + languages = choice(self.languages, max_n, p=self.languages_prob) + keys = set(languages) #unique + return [self.alreadyCreatedLanguages[key] for key in keys] + + #locations + def getAlreadyCreatedSmashLocation(self): + return self.random_element(self.alreadyCreatedLocations.values()) + + def createSmashLocations(self, n=5): + logger.info('creating Smash Locations...') + return [self.createSmashLocation() for _ in xrange(n)] + + def createSmashLocation(self, city=None, color=None, prefix=None): + if city is None: + city = choice(self.cities, 1, p=self.city_prob)[0] + + if color is None: + color = self.fake.hex_color() + + if prefix is None: + prefix = city[:1] + + location, _ = Location.objects.update_or_create(name=city, color=color, prefix=prefix) + + self.alreadyCreatedLocations[city] = location + + return location + +if __name__ == "__main__": + fake = Faker() + fake.add_provider(smashProvider) + + fake.createSmashFlyingTeams() + fake.createSmashItems() + fake.createSmashRooms() + fake.createSmashLocations() + fake.createSmashLanguages() + fake.createSmashCountries() + + fake.createSmashWorkers() + fake.createSmashStudySubjects() + + # flying_teams = add_flying_teams() + # items = add_items() + # add_rooms(items) + # locations = add_locations() + # languages = add_languages() + # add_workers(locations, languages) + # add_mail_templates(languages) + # add_subjects(locations) \ No newline at end of file -- GitLab