Ejemplo n.º 1
0
def find_cancelled(dry_run):
    """Find cancelled data and delete it"""
    settings = load_settings()
    filter_ids = settings.get("integrations.opus.units.filter_ids", [])
    dumps = opus_helpers.read_available_dumps()
    for date1, date2 in tqdm(pairwise(sorted(dumps)),
                             total=len(dumps) - 1,
                             unit="file-pairs"):
        file_diffs = opus_helpers.file_diff(dumps[date1],
                                            dumps[date2],
                                            disable_tqdm=True)
        units = file_diffs["units"]
        employees, _ = opus_helpers.split_employees_leaves(
            file_diffs["cancelled_employees"])
        # set enddate to filedate for cancelled employees
        employees = opus_helpers.include_cancelled(dumps[date2], [],
                                                   list(employees))
        if units or employees:
            msg = f"Found {len(units)} units and {len(employees)} employees wich were cancelled on {date2}"
            if dry_run:
                click.echo(msg + "(Dry-run)")
                continue
            click.echo(msg + ". Terminating now.")
            diff = OpusDiffImport(date2, None, {}, filter_ids=filter_ids)
            for employee in employees:
                # Updates each employee with their leave-date overwritten, so that their engagement will be terminated.
                try:
                    diff.update_employee(employee)
                except UnknownOpusUnit:
                    # The unit might be terminated by now, since we're looking through older files. No problem, carry on.
                    continue
            # Handles cancelled units as filtered, wich means terminates them from the date of the file.
            mo_units = diff.find_unterminated_filtered_units(units)
            diff.handle_filtered_units(mo_units)
Ejemplo n.º 2
0
def terminate_filtered_units(dry_run):
    settings = load_settings()
    filter_ids = settings.get("integrations.opus.units.filter_ids", [])
    latest_date, opus_dump = opus_helpers.get_latest_dump()
    file_diffs = opus_helpers.file_diff(None, opus_dump)
    filtered_units, _ = opus_helpers.filter_units(file_diffs["units"],
                                                  filter_ids)
    diff = OpusDiffImport(latest_date, ad_reader=None, employee_mapping={})
    mo_units = list(diff.find_unterminated_filtered_units(filtered_units))
    diff.handle_filtered_units(mo_units, dry_run=dry_run)
    return mo_units
Ejemplo n.º 3
0
def terminate_filtered_employees(dry_run):
    settings = load_settings()
    filter_ids = settings.get("integrations.opus.units.filter_ids", [])
    mox_base = settings.get("mox.base", "localhost:8080")
    latest_date, opus_dump = opus_helpers.get_latest_dump()
    file_diffs = opus_helpers.file_diff(None, opus_dump)
    # Get every id of filtered units
    all_ids = opus_helpers.find_all_filtered_ids(opus_dump, filter_ids)
    # find all engagements to a filtered unit in latest opus-file
    filtered_employees = list(
        filter(lambda emp: emp.get("orgUnit") in all_ids,
               file_diffs["employees"]))
    diff = OpusDiffImport(latest_date, ad_reader=None, employee_mapping={})
    # Check if any engagements exist that should have been filtered
    eng_info = [
        diff._find_engagement(e["@id"], "Engagement", present=False)
        for e in filtered_employees
    ]
    eng_info = list(filter(lambda x: x is not None, eng_info))
    if dry_run:
        print(
            f"There are {len(eng_info)} engagements that should have been terminated."
        )
        return eng_info

    for eng_uuid in tqdm(eng_info, desc="Deleting filtered engagements"):
        r = httpx.delete(
            f"{mox_base}/organisation/organisationfunktion/{eng_uuid}")
        r.raise_for_status()

    # Check users in MO - if no engagements are left then delete the user and all details to it.
    user_cprs = set(map(opus_helpers.read_cpr, filtered_employees))
    users = [diff.helper.read_user(user_cpr=cpr) for cpr in user_cprs]
    users = filter(lambda x: x, users)
    user_uuids = set(map(itemgetter("uuid"), users))

    user_engagements = {
        user_uuid: diff.helper.read_user_engagements(user_uuid, read_all=True)
        for user_uuid in user_uuids
    }

    delete_users = dict(filter(lambda x: x[1] == [], user_engagements.items()))
    for user_uuid in tqdm(delete_users,
                          desc="Deleting users with no other engagements"):
        delete_object_and_orgfuncs(uuid=user_uuid,
                                   mox_base=mox_base,
                                   object_type="bruger",
                                   dry_run=dry_run)
Ejemplo n.º 4
0
 def test_split_employees_active(self, inputfile, expected):
     file_diffs = opus_helpers.file_diff(None, inputfile, disable_tqdm=True)
     employees, leaves = opus_helpers.split_employees_leaves(file_diffs["employees"])
     employees = list(employees)
     leaves = list(leaves)
     self.assertEqual(len(leaves), expected)
Ejemplo n.º 5
0
 def test_file_diff(self):
     file_diffs = opus_helpers.file_diff(testfile1, testfile2, disable_tqdm=True)
     self.assertNotEqual(file_diffs["units"], [])
     self.assertNotEqual(file_diffs["employees"], [])
Ejemplo n.º 6
0
 def test_file_diff_same(self, file):
     file_diffs = opus_helpers.file_diff(file, file, disable_tqdm=True)
     self.assertEqual(file_diffs["units"], [])
     self.assertEqual(file_diffs["employees"], [])
Ejemplo n.º 7
0
 def test_find_cancelled(self):
     file_diffs = opus_helpers.file_diff(testfile1, testfile2, disable_tqdm=True)
     assert (
         len(file_diffs["cancelled_employees"]) == 1
     ), "Expected to find 1 cancelled employee"