def test_system_modificator_tag_form_filled(self): """test additional form content""" # get object systemstatus_id = Systemstatus.objects.get( systemstatus_name='systemstatus_1').systemstatus_id # get object tag_1_id = Tag.objects.get(tag_name='tag_1').tag_id tag_2_id = Tag.objects.get(tag_name='tag_2').tag_id # get object system = System.objects.get(system_name='system_1') # get object form = SystemModificatorForm( data={ 'systemlist': [ str(system.system_id), ], 'systemstatus': systemstatus_id, 'systemstatus_choice': 'keep_status', 'analysisstatus_choice': 'keep_status', 'tag': [tag_1_id, tag_2_id], 'company_delete': 'keep_not_add', 'tag_delete': 'keep_not_add', 'contact_delete': 'keep_existing', 'location_delete': 'keep_existing', 'serviceprovider_delete': 'keep_existing', }) # compare self.assertTrue(form.is_valid())
def test_system_modificator_form_empty(self): """ test minimum form requirements / INVALID """ # get object form = SystemModificatorForm(data={}) # compare self.assertFalse(form.is_valid())
def test_system_modificator_contact_form_filled(self): """ test additional form content """ # get object systemstatus_id = Systemstatus.objects.get( systemstatus_name='systemstatus_1').systemstatus_id # get object contact_id = Contact.objects.get(contact_name='contact_1').contact_id # get object system = System.objects.get(system_name='system_1') # get object form = SystemModificatorForm( data={ 'systemlist': [ str(system.system_id), ], 'systemstatus': systemstatus_id, 'contact': contact_id, 'company_delete': 'keep_not_add', 'tag_delete': 'keep_not_add', 'contact_delete': 'keep_existing', 'location_delete': 'keep_existing', 'serviceprovider_delete': 'keep_existing', }) # compare self.assertTrue(form.is_valid())
def test_system_modificator_systemlist_admin_style(self): """ test for multiple line input """ # get object systemstatus_id = Systemstatus.objects.get( systemstatus_name='systemstatus_1').systemstatus_id # get object system1 = System.objects.get(system_name='system_1') system2 = System.objects.get(system_name='system_2') # get object form = SystemModificatorForm( data={ 'systemlist': [ str(system1.system_id), str(system2.system_id), ], 'systemstatus': systemstatus_id, 'company_delete': 'keep_not_add', 'tag_delete': 'keep_not_add', 'contact_delete': 'keep_existing', 'location_delete': 'keep_existing', 'serviceprovider_delete': 'keep_existing', }) # compare self.assertTrue(form.is_valid())
def test_system_modificator_systemlist_form_filled(self): """ test minimum form requirements / INVALID """ # get object form = SystemModificatorForm(data = { 'systemlist': 'system_1', }) # compare self.assertFalse(form.is_valid())
def test_system_modificator_systemlist_multi_line(self): """ test for multiple line input """ # get object systemstatus_id = Systemstatus.objects.get(systemstatus_name='systemstatus_1').systemstatus_id # get object form = SystemModificatorForm(data = { 'systemlist': 'system_1\nsystem_2\nsystem_3', 'systemstatus': systemstatus_id, }) # compare self.assertTrue(form.is_valid())
def test_system_modificator_systemstatus_form_filled(self): """ test minimum form requirements / VALID """ # get object systemstatus_id = Systemstatus.objects.get(systemstatus_name='systemstatus_1').systemstatus_id # get object form = SystemModificatorForm(data = { 'systemlist': 'system_1', 'systemstatus': systemstatus_id, }) # compare self.assertTrue(form.is_valid())
def test_system_modificator_analysisstatus_form_filled(self): """ test additional form content """ # get object systemstatus_id = Systemstatus.objects.get(systemstatus_name='systemstatus_1').systemstatus_id # get object analysisstatus_id = Analysisstatus.objects.get(analysisstatus_name='analysisstatus_1').analysisstatus_id # get object form = SystemModificatorForm(data = { 'systemlist': 'system_1', 'systemstatus': systemstatus_id, 'analysisstatus': analysisstatus_id, }) # compare self.assertTrue(form.is_valid())
def test_system_modificator_location_form_label(self): """ test form label """ # get object form = SystemModificatorForm() # compare self.assertEqual(form.fields['location'].label, 'Location')
def test_system_modificator_systemstatus_form_label(self): """ test form label """ # get object form = SystemModificatorForm() # compare self.assertEqual(form.fields['systemstatus'].label, 'Systemstatus (*)')
def test_system_modificator_company_form_label(self): """ test form label """ # get object form = SystemModificatorForm() # compare self.assertEqual(form.fields['company'].label, 'Companies')
def test_system_modificator_tag_form_filled(self): """ test additional form content """ # get object systemstatus_id = Systemstatus.objects.get(systemstatus_name='systemstatus_1').systemstatus_id # get object tag_1_id = Tag.objects.get(tag_name='tag_1').tag_id tag_2_id = Tag.objects.get(tag_name='tag_2').tag_id # get object form = SystemModificatorForm(data = { 'systemlist': 'system_1', 'systemstatus': systemstatus_id, 'tag': [tag_1_id, tag_2_id], }) # compare self.assertTrue(form.is_valid())
def system_modificator(request): """ function to modify many systems at once (helper function to call the real function) """ # form was valid to post if request.method == "POST": request_post = request.POST request_user = request.user # call async function async_task( "dfirtrack_main.modificator.system_modificator.system_modificator_async", request_post, request_user, ) return redirect(reverse('system_list')) # show empty form else: form = SystemModificatorForm(initial={ 'systemstatus': 2, 'analysisstatus': 1, }) # call logger debug_logger(str(request.user), " SYSTEM_MODIFICATOR_ENTERED") return render(request, 'dfirtrack_main/system/system_modificator.html', {'form': form})
def test_system_modificator_tag_form_label(self): """ test form label """ # get object form = SystemModificatorForm() # compare self.assertEqual(form.fields['tag'].label, 'Tags')
def test_system_modificator_serviceprovider_delete_form_label(self): """ test form label """ # get object form = SystemModificatorForm() # compare self.assertEqual(form.fields['serviceprovider_delete'].label, 'How to deal with serviceproviders')
def test_system_modificator_analysisstatus_choice_form_label(self): """test form label""" # get object form = SystemModificatorForm() # compare self.assertEqual(form.fields['analysisstatus_choice'].label, 'Keep analysisstatus')
def test_system_modificator_serviceprovider_form_label(self): """ test form label """ # get object form = SystemModificatorForm() # compare self.assertEqual(form.fields['serviceprovider'].label, 'Serviceprovider')
def test_system_modificator_tag_delete_form_label(self): """ test form label """ # get object form = SystemModificatorForm() # compare self.assertEqual(form.fields['tag_delete'].label, 'How to deal with existing tags')
def test_system_modificator_contact_form_label(self): """ test form label """ # get object form = SystemModificatorForm() # compare self.assertEqual(form.fields['contact'].label, 'Contact') self.assertEqual(form.fields['contact'].empty_label, 'Select contact (optional)')
def test_system_modificator_delete_options_form_filled(self): """ test minimum form requirements / INVALID """ # get object system = System.objects.get(system_name='system_1') # get object form = SystemModificatorForm( data={ 'systemlist': [ str(system.system_id), ], 'company_delete': 'keep_not_add', 'tag_delete': 'keep_not_add', 'contact_delete': 'keep_existing', 'location_delete': 'keep_existing', 'serviceprovider_delete': 'keep_existing', }) # compare self.assertFalse(form.is_valid())
def test_system_modificator_contact_form_filled(self): """ test additional form content """ # get object systemstatus_id = Systemstatus.objects.get( systemstatus_name='systemstatus_1').systemstatus_id # get object contact_id = Contact.objects.get(contact_name='contact_1').contact_id # get object system = System.objects.get(system_name='system_1') # get object form = SystemModificatorForm( data={ 'systemlist': [ str(system.system_id), ], 'systemstatus': systemstatus_id, 'contact': contact_id, }) # compare self.assertTrue(form.is_valid())
def test_system_modificator_location_form_filled(self): """ test additional form content """ # get object systemstatus_id = Systemstatus.objects.get( systemstatus_name='systemstatus_1').systemstatus_id # get object location_id = Location.objects.get( location_name='location_1').location_id # get object system = System.objects.get(system_name='system_1') # get object form = SystemModificatorForm( data={ 'systemlist': [ str(system.system_id), ], 'systemstatus': systemstatus_id, 'location': location_id, }) # compare self.assertTrue(form.is_valid())
def test_system_modificator_serviceprovider_form_filled(self): """ test additional form content """ # get object systemstatus_id = Systemstatus.objects.get( systemstatus_name='systemstatus_1').systemstatus_id # get object serviceprovider_id = Serviceprovider.objects.get( serviceprovider_name='serviceprovider_1').serviceprovider_id # get object system = System.objects.get(system_name='system_1') # get object form = SystemModificatorForm( data={ 'systemlist': [ str(system.system_id), ], 'systemstatus': systemstatus_id, 'serviceprovider': serviceprovider_id, }) # compare self.assertTrue(form.is_valid())
def system_modificator(request): """ function to modify many systems at once (helper function to call the real function) """ # form was valid to post if request.method == "POST": # get objects from request object request_post = request.POST request_user = request.user # show immediate message for user messages.success(request, 'System modificator started') # call async function async_task( "dfirtrack_main.modificator.system_modificator.system_modificator_async", request_post, request_user, ) # return directly to system list return redirect(reverse('system_list')) # show empty form else: # get id of first status objects sorted by name systemstatus = Systemstatus.objects.order_by('systemstatus_name')[0].systemstatus_id analysisstatus = Analysisstatus.objects.order_by('analysisstatus_name')[0].analysisstatus_id show_systemlist = bool(int(request.GET.get('systemlist', 0))) # workflows workflows = Workflow.objects.all() # show empty form with default values for convenience and speed reasons form = SystemModificatorForm(initial={ 'systemstatus': systemstatus, 'analysisstatus': analysisstatus, 'company_delete': 'keep_not_add', 'tag_delete': 'keep_not_add', 'contact_delete': 'keep_existing', 'location_delete': 'keep_existing', 'serviceprovider_delete': 'keep_existing', }, use_system_charfield = show_systemlist) # call logger debug_logger(str(request.user), ' SYSTEM_MODIFICATOR_ENTERED') return render(request, 'dfirtrack_main/system/system_modificator.html', {'form': form, 'workflows': workflows})
def system_modificator(request): """ function to modify many systems at once (helper function to call the real function) """ # form was valid to post if request.method == "POST": # get objects from request object request_post = request.POST request_user = request.user # show immediate message for user messages.success(request, 'System modificator started') # call async function async_task( "dfirtrack_main.modificator.system_modificator.system_modificator_async", request_post, request_user, ) # return directly to system list return redirect(reverse('system_list')) # show empty form else: show_systemlist = bool(int(request.GET.get('systemlist', 0))) form = SystemModificatorForm(initial={ 'systemstatus': 2, 'analysisstatus': 1, }, use_system_charfield=show_systemlist) # call logger debug_logger(str(request.user), ' SYSTEM_MODIFICATOR_ENTERED') return render(request, 'dfirtrack_main/system/system_modificator.html', {'form': form})
def system_modificator_async(request_post, request_user): """ function to modify many systems at once """ # call logger debug_logger(str(request_user), ' SYSTEM_MODIFICATOR_BEGIN') # exctract lines from systemlist (list results either from request object via multiline selector or via large text area) lines = request_post.getlist('systemlist') system_char_field_used = False # if large text area was used, the list contains only one entry with (one or more) line breaks if len(lines) == 1 and ("\r\n" in lines[0] or not lines[0].isdigit()): system_char_field_used = True lines = lines[0].splitlines() # count lines (needed for messages) number_of_lines = len(lines) # set systems_modified_counter (needed for messages) systems_modified_counter = 0 # set systems_skipped_counter (needed for messages) systems_skipped_counter = 0 # set lines_faulty_counter (needed for messages) lines_faulty_counter = 0 # create empty list (needed for messages) skipped_systems = [] # iterate over lines for line in lines: # skip emtpy lines if line == '': # autoincrement counter lines_faulty_counter += 1 # call logger warning_logger(str(request_user), ' SYSTEM_MODIFICATOR_ROW_EMPTY') continue # check line for string if not isinstance(line, str): # coverage: ignore branch # autoincrement counter lines_faulty_counter += 1 # call logger warning_logger(str(request_user), ' SYSTEM_MODIFICATOR_NO_STRING') continue # check line for length of string if len(line) > 50: # autoincrement counter lines_faulty_counter += 1 # call logger warning_logger(str(request_user), ' SYSTEM_MODIFICATOR_LONG_STRING') continue # check for existence of system if system_char_field_used: system = System.objects.filter(system_name=line) else: system = System.objects.filter(system_id=line) """ handling non-existing or non-unique systems 2 """ # system does not exist if system.count() == 0: # autoincrement counter systems_skipped_counter += 1 # add system name to list of skipped systems skipped_systems.append(line) # call logger error_logger( str(request_user), ' SYSTEM_MODIFICATOR_SYSTEM_DOES_NOT_EXISTS ' + 'system_id/system_name:' + line) # leave this loop because system with this systemname does not exist continue # more than one system exists elif system.count() > 1: # autoincrement counter systems_skipped_counter += 1 # add system name to list of skipped systems skipped_systems.append(line) # call logger error_logger( str(request_user), ' SYSTEM_MODIFICATOR_SYSTEM_NOT_DISTINCT ' + 'system_id/system_name:' + line) # leave this loop because system with this systemname is not distinct continue # get existing system if system_char_field_used: system = System.objects.get(system_name=line) else: system = System.objects.get(system_id=line) """ new system """ # create form with request data form = SystemModificatorForm( request_post, instance=system, use_system_charfield=system_char_field_used) # extract tags (list results from request object via multiple choice field) tags = request_post.getlist('tag') # extract companies (list results from request object via multiple choice field) companies = request_post.getlist('company') # modify system if form.is_valid(): """ object modification """ # don't save form yet system = form.save(commit=False) # set auto values system.system_modified_by_user_id = request_user system.system_modify_time = timezone.now() # save object system.save() """ object counter / log """ # autoincrement counter systems_modified_counter += 1 # call logger system.logger(str(request_user), ' SYSTEM_MODIFICATOR_EXECUTED') """ many 2 many """ # TODO: add check for empty list # add tags (using save_m2m would replace existing tags) for tag_id in tags: # get object tag = Tag.objects.get(tag_id=tag_id) # add tag to system system.tag.add(tag) for company_id in companies: # get object company = Company.objects.get(company_id=company_id) # add company to system system.company.add(company) """ call final messages """ # finish message message_user(request_user, 'System modificator finished', constants.SUCCESS) # number messages if systems_modified_counter > 0: if systems_modified_counter == 1: message_user( request_user, str(systems_modified_counter) + ' system was modified.', constants.SUCCESS) else: message_user( request_user, str(systems_modified_counter) + ' systems were modified.', constants.SUCCESS) if systems_skipped_counter > 0: if systems_skipped_counter == 1: message_user( request_user, str(systems_skipped_counter) + ' system was skipped. ' + str(skipped_systems), constants.ERROR) else: message_user( request_user, str(systems_skipped_counter) + ' systems were skipped. ' + str(skipped_systems), constants.ERROR) if lines_faulty_counter > 0: if lines_faulty_counter == 1: message_user( request_user, str(lines_faulty_counter) + ' line out of ' + str(number_of_lines) + ' lines was faulty (see log file for details).', constants.WARNING) else: message_user( request_user, str(lines_faulty_counter) + ' lines out of ' + str(number_of_lines) + ' lines were faulty (see log file for details).', constants.WARNING) # call logger info_logger( str(request_user), ' SYSTEM_MODIFICATOR_STATUS ' + 'modified:' + str(systems_modified_counter) + '|' + 'skipped:' + str(systems_skipped_counter) + '|' + 'faulty_lines:' + str(lines_faulty_counter)) # call logger debug_logger(str(request_user), " SYSTEM_MODIFICATOR_END")
def system_modificator_async(request_post, request_user): """function to modify many systems at once""" # call logger debug_logger(str(request_user), ' SYSTEM_MODIFICATOR_START') # extract lines from systemlist (list results either from request object via multiline selector or via large text area) lines = request_post.getlist('systemlist') system_char_field_used = False # if large text area was used, the list contains only one entry with (one or more) line breaks if len(lines) == 1 and ("\r\n" in lines[0] or not lines[0].isdigit()): system_char_field_used = True lines = lines[0].splitlines() """ prepare and start loop """ # count lines (needed for messages) number_of_lines = len(lines) # set systems_modified_counter (needed for messages) systems_modified_counter = 0 # set systems_skipped_counter (needed for messages) systems_skipped_counter = 0 # set lines_faulty_counter (needed for messages) lines_faulty_counter = 0 # create empty list (needed for messages) skipped_systems = [] # workflows to apply workflows = request_post.getlist("workflow") # set workflows_applied (needed for messages) if workflows: workflow_count = len(workflows) else: workflow_count = 0 workflows_applied = 0 # iterate over lines for line in lines: # skip empty lines if line == '': # autoincrement counter lines_faulty_counter += 1 # call logger warning_logger(str(request_user), ' SYSTEM_MODIFICATOR_ROW_EMPTY') continue # check line for string if not isinstance(line, str): # coverage: ignore branch # autoincrement counter lines_faulty_counter += 1 # call logger warning_logger(str(request_user), ' SYSTEM_MODIFICATOR_NO_STRING') continue # check line for length of string if len(line) > 50: # autoincrement counter lines_faulty_counter += 1 # call logger warning_logger(str(request_user), ' SYSTEM_MODIFICATOR_LONG_STRING') continue # check for existence of system if system_char_field_used: system = System.objects.filter(system_name=line) else: system = System.objects.filter(system_id=line) """ handling non-existing (== 0) or non-unique (> 1) systems """ # system does not exist if system.count() == 0: # autoincrement counter systems_skipped_counter += 1 # add system name to list of skipped systems skipped_systems.append(line) # call logger warning_logger( str(request_user), f' SYSTEM_MODIFICATOR_SYSTEM_DOES_NOT_EXISTS system_id/system_name:{line}', ) # leave this loop because system with this systemname does not exist continue # more than one system exists elif system.count() > 1: # autoincrement counter systems_skipped_counter += 1 # add system name to list of skipped systems skipped_systems.append(line) # call logger warning_logger( str(request_user), f' SYSTEM_MODIFICATOR_SYSTEM_NOT_DISTINCT system_id/system_name:{line}', ) # leave this loop because system with this systemname is not distinct continue """ unique system (== 1) """ # get existing system if system_char_field_used: system = System.objects.get(system_name=line) else: system = System.objects.get(system_id=line) # create form with request data form = SystemModificatorForm( request_post, instance=system, use_system_charfield=system_char_field_used) # extract tags (list results from request object via multiple choice field) tags = request_post.getlist('tag') # extract companies (list results from request object via multiple choice field) companies = request_post.getlist('company') # TODO: [code] add condition for invalid form, not implemented yet because of multiple constraints # modify system if form.is_valid(): """object modification""" # don't save form yet system = form.save(commit=False) # set auto values system.system_modified_by_user_id = request_user """ status fields """ # replace, if 'change status' was selected (checking for status value independent of form field validation) if (form['analysisstatus_choice'].value() == 'change_status' and form['analysisstatus'].value()): # replace status analysisstatus_id = form['analysisstatus'].value() analysisstatus = Analysisstatus.objects.get( analysisstatus_id=analysisstatus_id) system.analysisstatus = analysisstatus # replace, if 'change status' was selected (checking for status value independent of form field validation) if (form['systemstatus_choice'].value() == 'change_status' and form['systemstatus'].value()): # replace status systemstatus_id = form['systemstatus'].value() systemstatus = Systemstatus.objects.get( systemstatus_id=systemstatus_id) system.systemstatus = systemstatus """ fk non-model fields """ # replace / delete, if 'switch_new / Switch to selected item or none' was selected if form['contact_delete'].value() == 'switch_new': # replace, if value was submitted via form if form['contact'].value(): contact_id = form['contact'].value() contact = Contact.objects.get(contact_id=contact_id) system.contact = contact # delete, if form field was empty else: system.contact = None # replace / delete, if 'switch_new / Switch to selected item or none' was selected if form['location_delete'].value() == 'switch_new': # replace, if value was submitted via form if form['location'].value(): location_id = form['location'].value() location = Location.objects.get(location_id=location_id) system.location = location # delete, if form field was empty else: system.location = None # replace / delete, if 'switch_new / Switch to selected item or none' was selected if form['serviceprovider_delete'].value() == 'switch_new': # replace, if value was submitted via form if form['serviceprovider'].value(): serviceprovider_id = form['serviceprovider'].value() serviceprovider = Serviceprovider.objects.get( serviceprovider_id=serviceprovider_id) system.serviceprovider = serviceprovider # delete, if form field was empty else: system.serviceprovider = None # save object system.save() """ object counter / log """ # autoincrement counter systems_modified_counter += 1 # call logger system.logger(str(request_user), ' SYSTEM_MODIFICATOR_EXECUTED') """ many 2 many """ # remove existing relations if 'remove_and_add / Delete existing and add new items' was selected if form['tag_delete'].value() == 'remove_and_add': # remove all m2m system.tag.clear() # add new relations if not 'keep_not_add / Do not change and keep existing' was selected if form['tag_delete'].value() != 'keep_not_add': # add new tags (using save_m2m would replace existing tags it there were any) for tag_id in tags: # get object tag = Tag.objects.get(tag_id=tag_id) # add tag to system system.tag.add(tag) # remove existing relations if 'remove_and_add / Delete existing and add new items' was selected if form['company_delete'].value() == 'remove_and_add': # remove all m2m system.company.clear() # add new relations if not 'keep_not_add / Do not change and keep existing' was selected if form['company_delete'].value() != 'keep_not_add': # add new companies (using save_m2m would replace existing companies it there were any) for company_id in companies: # get object company = Company.objects.get(company_id=company_id) # add company to system system.company.add(company) # apply workflows if workflows: error_code = Workflow.apply(workflows, system, request_user) if error_code: system.logger(str(request_user), ' COULD_NOT_APPLY_WORKFLOW') else: workflows_applied += workflow_count """ finish system modificator """ # call final messages final_messages( systems_modified_counter, systems_skipped_counter, lines_faulty_counter, skipped_systems, number_of_lines, request_user, workflow_count, workflows_applied, ) # call logger info_logger( str(request_user), f' SYSTEM_MODIFICATOR_STATUS' f' modified:{systems_modified_counter}' f'|skipped:{systems_skipped_counter}' f'|faulty_lines:{lines_faulty_counter}', ) # call logger debug_logger(str(request_user), ' SYSTEM_MODIFICATOR_END')
def system_modificator_async(request_post, request_user): """ function to modify many systems at once """ # call logger debug_logger(str(request_user), " SYSTEM_MODIFICATOR_BEGIN") # exctract lines from systemlist (list results from request object via large text area) lines = request_post.get('systemlist').splitlines() # iterate over lines for line in lines: # skip emtpy lines if line == '': warning_logger(str(request_user), " SYSTEM_MODIFICATOR_ROW_EMPTY") continue # check line for string if not isinstance(line, str): warning_logger(str(request_user), " SYSTEM_MODIFICATOR_NO_STRING") continue # check line for length of string if len(line) > 50: warning_logger(str(request_user), " SYSTEM_MODIFICATOR_LONG_STRING") continue # check for existence of system system = System.objects.filter(system_name = line) if system.count() == 0: # call logger error_logger(str(request_user), " SYSTEM_MODIFICATOR_SYSTEM_DOES_NOT_EXISTS " + "system_name:" + line) # leave this loop because system with this systemname does not exist continue elif system.count() > 1: # call logger error_logger(str(request_user), " SYSTEM_MODIFICATOR_SYSTEM_NOT_DISTINCT " + "system_name:" + line) # leave this loop because system with this systemname is not distinct continue # get existing system system = System.objects.get(system_name = line) # create form with request data form = SystemModificatorForm(request_post, instance = system) # extract tags (list results from request object via multiple choice field) tags = request_post.getlist('tag') # modify system if form.is_valid(): # don't save form yet system = form.save(commit=False) # set system_name system.system_name = line # set auto values system.system_modified_by_user_id = request_user system.system_modify_time = timezone.now() # save object system.save() # call logger system.logger(str(request_user), ' SYSTEM_MODIFICATOR_EXECUTED') # TODO: add check for empty list # add tags (using save_m2m would replace existing tags) for tag_id in tags: # get object tag = Tag.objects.get(tag_id=tag_id) # add tag to system system.tag.add(tag) # call logger debug_logger(str(request_user), " SYSTEM_MODIFICATOR_END")