def setUp(self):
     """
     Setup an example users generator instance so can use the record
     """
     gen = UsersGenerator({})
     gen.generate_adt_user()
     self.record = gen.class_data.findall('record')[0]
 def test_multi_wards_with_all_multi_ward_user(self):
     """
     Test that when only one user is a multiward user that only one record
     is generated
     """
     schema = {"ward_manager": {"total": 2, "per_ward": 1, "unassigned": 0, "multi_wards": "all"}}
     gen = UsersGenerator(schema)
     gen.generate_multi_wards_users(["a", "b"])
     xml = gen.class_data
     records = xml.findall("record")
     self.assertEqual(len(records), 2, "Incorrect number of records")
     multi_record_one = records[0]
     multi_record_two = records[1]
     one_locations = multi_record_one.find("field[@name='location_ids']")
     two_locations = multi_record_two.find("field[@name='location_ids']")
     self.assertEqual(
         one_locations.attrib["eval"],
         "[[6, False, [ref('nhc_def_conf_location_wa')," "ref('nhc_def_conf_location_wb')]]]",
         "Incorrect Location ids for multiple wards",
     )
     self.assertEqual(
         two_locations.attrib["eval"],
         "[[6, False, [ref('nhc_def_conf_location_wa')," "ref('nhc_def_conf_location_wb')]]]",
         "Incorrect Location ids for multiple wards",
     )
 def test_multi_wards_with_all_multi_ward_user(self):
     """
     Test that when only one user is a multiward user that only one record
     is generated
     """
     schema = {
         'ward_manager': {
             'total': 2,
             'per_ward': 0,
             'unassigned': 2,
             'multi_wards': 'all'
         }
     }
     gen = UsersGenerator(schema)
     gen.generate_users_not_assigned()
     xml = gen.class_data
     records = xml.findall('record')
     self.assertEqual(len(records), 2, 'Incorrect number of records')
     unassigned_record_one = records[0]
     unassigned_record_two = records[1]
     one_locations = \
         unassigned_record_one.find('field[@name=\'location_ids\']')
     two_locations = \
         unassigned_record_two.find('field[@name=\'location_ids\']')
     self.assertEqual(
         one_locations.attrib['eval'], '[[6, False, []]]',
         'Incorrect Location ids for multiple wards'
     )
     self.assertEqual(
         two_locations.attrib['eval'], '[[6, False, []]]',
         'Incorrect Location ids for multiple wards'
     )
 def test_unassigned_with_empty_user_schema(self):
     """
     Test that multiwards doesn't do anything if no user schema defined
     """
     gen = UsersGenerator({})
     gen.generate_users_not_assigned()
     xml = gen.class_data
     records = xml.findall('record')
     self.assertEqual(len(records), 0, 'Incorrect number of records')
 def test_multi_wards_with_empty_user_schema(self):
     """
     Test that multiwards doesn't do anything if no user schema defined
     """
     gen = UsersGenerator({})
     gen.generate_multi_wards_users(["a", "b", "c", "d", "e"])
     xml = gen.class_data
     records = xml.findall("record")
     self.assertEqual(len(records), 0, "Incorrect number of records")
 def test_users_per_ward_with_empty_user_schema(self):
     """
     Test that doesn't do anything if no user schema defined
     """
     gen = UsersGenerator({})
     doc = gen.generate_users_per_ward('a', 666)
     xml = doc.findall('data')[0]
     records = xml.findall('record')
     self.assertEqual(len(records), 0, 'Incorrect number of records')
    def test_get_role(self):
        hca = "[(4, ref('nh_clinical.role_nhc_hca'))]"
        basic_schema = {'hca': {'total': 1, 'per_ward': 1, 'unassigned': 0}}
        gen = UsersGenerator(basic_schema)
        doc = gen.generate_users_per_ward('a', 2)
        user = doc.findall(".//record/[@model='res.users']")[0]

        role = get_role(user)

        self.assertEqual(role, hca)
 def test_bed_number_method(self):
     """
     Test that the bed number generator works
     """
     gen = UsersGenerator({})
     bed_number_gen = gen.get_beds_number_generator(2)
     bed_number_first = bed_number_gen.next()
     bed_number_last = bed_number_gen.next()
     self.assertEqual(bed_number_first, 1, 'Incorrect first generator call')
     self.assertEqual(bed_number_last, 2, 'Incorrect last generator call')
 def test_create_adt_user(self):
     """
     Test that the class has a means of creating the ADT user
     """
     gen = UsersGenerator({})
     gen.generate_adt_user()
     records = gen.class_data.findall('record')
     self.assertEqual(len(records), 1, 'Incorrect number of records')
     adt_record = records[0]
     login = adt_record.find('field[@name=\'login\']')
     self.assertEqual(login.text, 'adt', 'Incorrect login name')
 def setUp(self):
     """
     Setup an example users generator instance so can use the record
     """
     john_schema = {  # http://cdn.makeagif.com/media/9-13-2015/28JfPx.gif
         "nurse": {"total": 1, "per_ward": 0, "unassigned": 1, "multi_wards": [[]]}
     }
     gen = UsersGenerator(john_schema)
     gen.names_generators["nurse"] = (n for n in ["Nadine"])
     gen.generate_users_not_assigned()
     self.record = gen.class_data.findall("record")[0]
    def test_get_hca_nurse_users(self):
        basic_schema = {
            'hca': {'total': 1, 'per_ward': 1, 'unassigned': 0},
            'nurse': {'total': 1, 'per_ward': 1, 'unassigned': 0}
        }
        gen = UsersGenerator(basic_schema)
        doc = gen.generate_users_per_ward('a', 2)

        user_ids = get_hca_nurse_users(doc)

        self.assertEqual(len(user_ids), 2)
 def test_user_per_ward_with_no_user_per_ward(self):
     """
     Test that doesn't do anything if no users by ward
     """
     basic_schema = {
         'hca': {
             'total': 666,
             'per_ward': 0,
             'unassigned': 666,
         }
     }
     gen = UsersGenerator(basic_schema)
     doc = gen.generate_users_per_ward('a', 666)
     xml = doc.findall('data')[0]
     records = xml.findall('record')
     self.assertEqual(len(records), 0, 'Incorrect number of records')
 def setUp(self):
     """
     Setup an example users generator instance so can use the record
     """
     john_schema = {  # http://cdn.makeagif.com/media/9-13-2015/28JfPx.gif
         'ward_manager': {
             'total': 1,
             'per_ward': 1,
             'unassigned': 0,
             'multi_wards': [['a', 'b']]
         }
     }
     gen = UsersGenerator(john_schema)
     gen.names_generators['ward_manager'] = (n for n in ['Waino'])
     gen.generate_multi_wards_users(['a'])
     self.record = gen.class_data.findall('record')[0]
 def setUp(self):
     """
     Setup an example users generator instance so can use the record
     """
     john_schema = {  # http://cdn.makeagif.com/media/9-13-2015/28JfPx.gif
         'nurse': {
             'total': 1,
             'per_ward': 1,
             'unassigned': 0,
             'multi_wards': [[]]
         }
     }
     gen = UsersGenerator(john_schema)
     gen.names_generators['nurse'] = (n for n in ['Nadine'])
     users = gen.generate_users_per_ward('a', 1)
     self.record = users.find('data').findall('record')[0]
 def test_unassigned_without_unassigned_users(self):
     """
     Test that when only one user is a multiward user that only one record
     is generated
     """
     schema = {
         'ward_manager': {
             'total': 2,
             'per_ward': 1,
             'unassigned': 0,
             'multi_wards': [['a', 'b'], []]
         }
     }
     gen = UsersGenerator(schema)
     gen.generate_users_not_assigned()
     xml = gen.class_data
     records = xml.findall('record')
     self.assertEqual(len(records), 0, 'Incorrect number of records')
 def test_user_per_ward_with_non_bed_ward_assignable_user(self):
     """
     Test that assigns user to bed when bed assignable
     """
     basic_schema = {
         'senior_manager': {
             'total': 1,
             'per_ward': 1,
             'unassigned': 0,
         }
     }
     gen = UsersGenerator(basic_schema)
     doc = gen.generate_users_per_ward('a', 2)
     xml = doc.findall('data')[0]
     records = xml.findall('record')
     self.assertEqual(len(records), 1, 'Incorrect number of records')
     record = records[0]
     location = record.find('field[@name=\'location_ids\']')
     self.assertEqual(
         location.attrib['eval'],
         '[[6, False, []]]',
         'Incorrect Location ids for user per ward'
     )
    def __init__(self, wards, beds_per_ward, bed_patient_per_ward,
                 non_bed_patient_per_ward, users_schema, data_folder):

        total_patients_per_ward = \
            bed_patient_per_ward + non_bed_patient_per_ward
        patient_id_offset = 1
        # wards = ['a', 'b', 'c', 'd', 'e']
        # bed_patients_per_ward = 28
        # non_bed_patients_per_ward = 12

        # List of time periods to randomly offset admissions
        self.admit_offset_list = ['-1', '-2']
        self.admit_date_eval_string = '(datetime.now() + timedelta({0}))' \
                                      '.strftime(\'%Y-%m-%d %H:%M:%S\')'

        # Regex to use to get the ID for a patient from id attribute on record
        patient_id_regex_string = r'nhc_demo_patient_(\d+)'
        self.patient_id_regex = re.compile(patient_id_regex_string)

        point_of_service = POSGenerator()
        self.indent(point_of_service.root)
        users_tree = ElementTree(point_of_service.root)
        users_tree.write(os.path.join(data_folder, 'pos.xml'))

        users_generator = UsersGenerator(users_schema)
        users_generator.generate_adt_user()
        users_generator.generate_multi_wards_users(wards)
        users_generator.generate_users_not_assigned()
        self.indent(users_generator.class_root)
        users_tree = ElementTree(users_generator.class_root)
        users_tree.write(os.path.join(data_folder, 'users.xml'))

        # Generate demo data for each ward,
        # with files named after different type of data,
        # grouped in one folder for each ward
        self.ews_seq = 0
        self.assess_seq = 0
        self.medical_seq = 0

        for index, ward in enumerate(wards):
            # Locations demo data
            locations = LocationsGenerator(ward, beds_per_ward)
            # Users demo data
            users_per_ward_root = users_generator.generate_users_per_ward(
                ward, beds_per_ward)
            # Patients demo data
            patients = PatientsGenerator(
                (index * total_patients_per_ward) + patient_id_offset,
                bed_patient_per_ward,
                non_bed_patient_per_ward,
                ward
            )
            offsets = [random.choice(
                self.admit_offset_list) for _ in range(
                len(patients.data.findall('record')))]
            # Spells demo data
            spells = SpellsGenerator(patients, offsets)
            # Admissions demo data
            admissions = AdmissionsGenerator(patients, offsets)
            # Placements demo data
            placements = PlacementsGenerator(patients, offsets)

            # Strategy
            risk_distribution = {
                'high': 0, 'medium': 2, 'low': 11, 'none': 15
            }
            # 50% observations are overdue by default
            overdue_ratio = 0.5
            # all overdue observations are within 30 mins overdue
            overdue_distribution = [30]
            if index == 0:
                # ICU
                risk_distribution = {
                    'high': 3, 'medium': 4, 'low': 20, 'none': 1
                }
            elif index == 1:
                # 75% observations are overdue, 1/3 overdue by 60 mins, the
                # rest overdue by, at most, 30 mins
                overdue_ratio = 0.75
                overdue_distribution = [30, 30, 60]
                risk_distribution = {
                    'high': 0, 'medium': 0, 'low': 20, 'none': 8
                }
            elif index == 4:
                # all observations are on-time
                overdue_ratio = 0
                risk_distribution = {
                    'high': 0, 'medium': 0, 'low': 0, 'none': 28
                }

            news_patients = patients_factory(placements.root)
            hca_nurse_ids = get_hca_nurse_users(users_per_ward_root)
            partial_news_per_patient = 1
            # create ward strategy here
            ward_strategy = WardStrategy(
                news_patients, hca_nurse_ids, risk_distribution,
                partial_news_per_patient, overdue_ratio, overdue_distribution

            )

            # NEWS demo data
            news = NewsGenerator(ward_strategy, self.ews_seq, self.assess_seq,
                                 self.medical_seq)

            self.ews_seq = news.ews_seq
            self.assess_seq = news.assess_seq
            self.medical_seq = news.medical_seq

            # Pretty format the XML trees
            self.indent(locations.root)
            self.indent(users_per_ward_root)
            self.indent(patients.root)
            self.indent(spells.root)
            self.indent(admissions.root)
            self.indent(placements.root)
            self.indent(news.root)

            # Actually write the XML files (creating them if needed)
            ward_folder = os.path.join(data_folder, 'ward_{0}'.format(ward))
            if not os.path.isdir(ward_folder):
                os.mkdir(ward_folder)

            locations_tree = ElementTree(locations.root)
            locations_tree.write(os.path.join(ward_folder,
                                              'demo_locations.xml'))

            users_per_ward_tree = ElementTree(users_per_ward_root)
            users_per_ward_tree.write(os.path.join(ward_folder,
                                                   'demo_users.xml'))

            patients_tree = ElementTree(patients.root)
            patients_tree.write(os.path.join(ward_folder, 'demo_patients.xml'))

            spells_tree = ElementTree(spells.root)
            spells_tree.write(os.path.join(ward_folder, 'demo_spells.xml'))

            admissions_tree = ElementTree(admissions.root)
            admissions_tree.write(os.path.join(ward_folder,
                                               'demo_admissions.xml'))

            placements_tree = ElementTree(placements.root)
            placements_tree.write(os.path.join(ward_folder,
                                               'demo_placements.xml'))
            news_tree = ElementTree(news.root)
            news_tree.write(os.path.join(ward_folder, 'demo_news.xml'))