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
        """
Example #5
0
        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