def post(self, request, *args, **kwargs): opening_date = request.POST.get("opening_date") projects = request.POST.getlist("projects") length_of_list = int(request.POST.get("length_of_list")) stadia = request.POST.getlist("stadia") exclude_stadia = request.POST.getlist("exclude_stadia") main_stadium = request.POST.get("main_stadium") start_case_id = request.POST.get("start_case_id", "") weight_distance = float(request.POST.get("weight_distance")) weight_fraud_probability = float(request.POST.get("weight_fraud_probability")) weight_primary_stadium = float(request.POST.get("weight_primary_stadium")) weight_secondary_stadium = float(request.POST.get("weight_secondary_stadium")) weight_issuemelding = float(request.POST.get("weight_issuemelding")) postal_code_range_start = int(request.POST.get("postal_code_range_start")) postal_code_range_end = int(request.POST.get("postal_code_range_end")) context_data = self.get_data(self.get_object()) context_data["selected_opening_date"] = opening_date context_data["selected_projects"] = projects context_data["length_of_list"] = length_of_list context_data["selected_stadia"] = stadia context_data["selected_exclude_stadia"] = exclude_stadia context_data["main_stadium"] = main_stadium context_data["weight_distance"] = weight_distance context_data["weight_fraud_probability"] = weight_fraud_probability context_data["weight_primary_stadium"] = weight_primary_stadium context_data["weight_secondary_stadium"] = weight_secondary_stadium context_data["weight_issuemelding"] = weight_issuemelding context_data["start_case_id"] = start_case_id context_data["postal_code_range_start"] = postal_code_range_start context_data["postal_code_range_end"] = postal_code_range_end context_data["postal_codes"] = [ { "range_start": postal_code_range_start, "range_end": postal_code_range_end, }, ] settings = SettingsMock(context_data) settings_weights = SettingsWeightMock(context_data) settings_postal_codes = SettingsPostalCodeMock(context_data) generator = ItineraryKnapsackList( settings=settings, settings_weights=settings_weights, postal_code_settings=settings_postal_codes.postal_codes.all(), ) eligible_cases = generator.__get_eligible_cases__() planned_cases = generator.generate() unplanned_cases = remove_cases_from_list(eligible_cases, planned_cases) context_data["planning"] = { "planned_cases": planned_cases, "unplanned_cases": unplanned_cases, } return render(request, self.template_name, context_data)
def test_remove_cases_from_list(self): case_a = {"stadium": ONDERZOEK_BUITENDIENST, "id": "foo-a"} case_b = {"stadium": ISSUEMELDING, "id": "foo-b"} case_c = {"stadium": TWEEDE_CONTROLE, "id": "foo-c"} case_d = {"stadium": ONDERZOEK_BUITENDIENST, "id": "foo-d"} case_e = {"stadium": ISSUEMELDING, "id": "foo-e"} cases = [case_a, case_b, case_c, case_d, case_e] cases_to_remove = [case_b, case_e] result = remove_cases_from_list(cases, cases_to_remove) expected = [case_a, case_c, case_d] self.assertEquals(result, expected)
def test_remove_cases_from_list_safety_fallback(self): """ Wil still succeed if items from the cases_to_remove don't exist in the cases list """ case_a = {"stadium": ONDERZOEK_BUITENDIENST, "id": "foo-a"} case_b = {"stadium": ISSUEMELDING, "id": "foo-b"} case_c = {"stadium": TWEEDE_CONTROLE, "id": "foo-c"} case_d = {"stadium": ONDERZOEK_BUITENDIENST, "id": "foo-d"} case_e = {"stadium": ISSUEMELDING, "id": "foo-e"} case_not_in_list = {"stadium": ISSUEMELDING, "id": "foo-f"} cases = [case_a, case_b, case_c, case_d, case_e] cases_to_remove = [case_a, case_b, case_not_in_list] result = remove_cases_from_list(cases, cases_to_remove) expected = [case_c, case_d, case_e] self.assertEquals(result, expected)
returns a list of cases which are already in itineraries for a given date """ itineraries = Itinerary.objects.filter(created_at=date) itineraries = [itinerary.get_cases() for itinerary in itineraries] cases = flatten(itineraries) return cases def get_unplanned_cases(date, stadium, projects): """ Returns a list of unplanned cases which """ planned_cases = Itinerary.get_cases_for_date(date) exclude_cases = [{"id": case.case_id} for case in planned_cases] all_cases = get_cases_from_bwv(STARTING_FROM_DATE, projects, [stadium]) cases = remove_cases_from_list(all_cases, exclude_cases) return cases def add_team_members(self, user_ids): """ Adds team members to this itinerary """ for user_id in user_ids: user = User.objects.get(id=user_id) ItineraryTeamMember.objects.create(user=user, itinerary=self) def clear_team_members(self): """ Removes all team members from this itinerary """
filtered_cases = filter_out_cases(filtered_cases, self.exclude_stadia) LOGGER.info("Total cases after excluding stadia: {}".format( len(filtered_cases))) filtered_cases = filter_cases_with_missing_coordinates(filtered_cases) LOGGER.info( "Total cases after filtering on missing coordinates: {}".format( len(filtered_cases))) filtered_cases = filter_cases_with_postal_code(filtered_cases, self.postal_code_ranges) LOGGER.info("Total cases after filtering on postal codes: {}".format( len(filtered_cases))) exclude_cases = [{"id": case.case_id} for case in self.exclude_cases] filtered_cases = remove_cases_from_list(filtered_cases, exclude_cases) LOGGER.info("Total cases after removing exclude cases: {}".format( len(filtered_cases))) if not filtered_cases: LOGGER.warning("No eligible cases found") return [] return filtered_cases def exclude(self, cases): """ Makes sure the givens are not used when generating a list """ self.exclude_cases = cases