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)
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
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)
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)
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"], [])
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"], [])
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"