def find_matching_organisations_and_append_new_values(cls, facet_value):
     new_values = []
     organisations = ExternalResourceHelper.get_organisation_by_name(facet_value.value)
     if len(organisations) > 0:
         for org in organisations:
             new_value = copy.copy(facet_value)
             new_value.value = org['id']
             new_values.append(new_value)
     return new_values
    def fetch_soknader(self, facets):
        url = ExternalResourceHelper.sak_root_uri + '/queries/'

        # "søker" facet can require extra processing if its type is 'free'
        soker_facet = SoknaderResource.find_facet(facets, u'Søker')
        if soker_facet and SoknaderResource.facet_type_equals(soker_facet, 'free'):
            new_values = self.create_correct_query_values(soker_facet)
            if new_values is not None and len(new_values) > 0:
                soker_facet.values = new_values
            else:
                # no organisations have been found if new_values is empty,
                # then the search is not supposed to return anything
                return []

        response = ExternalResourceHelper.post_to_ext(url, {"type": "soknad", "filters": [facet.to_json() for facet in facets]})
        soknader = json.loads(response.content)
        ExternalResourceHelper.load_organisations(soknader)
        ExternalResourceHelper.load_persons(soknader)

        return soknader
    def get(self, soknad_id=None):
        if soknad_id:
            soknad = self.soknad_resource.get(soknad_id)
            ExternalResourceHelper.load_organisation(soknad)
            ExternalResourceHelper.load_persons([soknad])
            ExternalResourceHelper.load_users([soknad])
            return output_pdf(soknad, 200, template=u"pdf/soknad.html")
            # return output_csv(soknad, 200, fieldname_mapping=get_fieldname_mapping(), fields_to_ignore=get_fields_to_ignore())
        else:
            parser = RequestParser()
            parser.add_argument("id", type=int, action="append", required=True)
            args = parser.parse_args()
            soknader = self.soknad_resource.get()
            soknader = [s for s in soknader if s["id"] in args["id"]]

            ExternalResourceHelper.load_organisations(soknader)
            ExternalResourceHelper.load_persons(soknader)
            ExternalResourceHelper.load_users(soknader)

            return output_csv(
                soknader, 200, fieldname_mapping=get_fieldname_mapping(), fields_to_ignore=get_fields_to_ignore()
            )
def get_resource_overview(facilities_ids, start_date, end_date):
    facilities = get_facilities_from_web(facilities_ids)
    facilities_uris = [facility.get('uri') for facility in facilities]
    statuses = ["Granted"]

    single_booking_query = current_app.db_session.query(Application) \
        .filter(Resource.id == Application.resource_id,
                Resource.uri.in_(facilities_uris),
                Slot.application_id == Application.id,
                Application.status.in_(statuses),
                cast(Slot.start_time, Date).between(start_date, end_date),
                cast(Slot.end_time, Date).between(start_date, end_date),
                )

    strotime_booking_query = current_app.db_session.query(Application) \
        .filter(Resource.id == Application.resource_id,
                Resource.uri.in_(facilities_uris),
                Slot.application_id == Application.id,
                Application.status.in_(statuses),
                cast(StrotimeSlot.start_time, Date).between(start_date, end_date),
                cast(StrotimeSlot.end_time, Date).between(start_date, end_date),
                )

    repeating_booking_query = current_app.db_session.query(Application) \
        .filter(Resource.id == Application.resource_id,
                Resource.uri.in_(facilities_uris),
                RepeatingSlot.application_id == Application.id,
                Application.status.in_(statuses),
                # Get all slots between start and end date
                cast(RepeatingSlot.start_date, Date) <= end_date,
                cast(RepeatingSlot.end_date, Date) >= start_date
                )

    resources = current_app.db_session.query(Resource).filter(Resource.uri.in_(facilities_uris))
    blocked_times = {}
    for resource in resources:
        blocked_times[resource.uri] = BlockedTimeUtil.get_blocked_time_for_date_range(current_app.db_session, resource, start_date, end_date)

    persons_ids = [app.person.uri.replace('/persons/', '') for app in single_booking_query] + \
                  [app.person.uri.replace('/persons/', '') for app in repeating_booking_query] + \
                  [app.person.uri.replace('/persons/', '') for app in strotime_booking_query]

    organisations_ids = [app.organisation.uri.replace('/organisations/', '') for app in single_booking_query if
                         app.organisation] + \
                        [app.organisation.uri.replace('/organisations/', '') for app in repeating_booking_query if
                         app.organisation] + \
                        [app.organisation.uri.replace('/organisations/', '') for app in strotime_booking_query if
                         app.organisation]

    current_user = get_user(request.cookies)

    persons = ExternalResourceHelper.get_persons_by_id(person_ids=persons_ids,
                                                       auth_token_username=current_user.get('id'))
    organisations = ExternalResourceHelper.get_organisations_by_id(organisation_ids=organisations_ids)

    result = []

    single_soknader = map_applications_from_query_to_pers_and_orgs_and_resources(single_booking_query, organisations, persons, facilities)
    add_entries_for_single_day_bookings(result=result, soknader=single_soknader)

    strotime_soknader = map_applications_from_query_to_pers_and_orgs_and_resources(strotime_booking_query, organisations, persons, facilities)
    add_entries_for_single_day_bookings(result=result, soknader=strotime_soknader)

    repeating_soknader = map_applications_from_query_to_pers_and_orgs_and_resources(repeating_booking_query, organisations, persons, facilities)
    add_entries_for_repeating_booking(result=result, repeating_bookings=repeating_soknader, start_date=start_date,
                                      end_date=end_date)

    add_entries_for_blocked_time(result, blocked_times, facilities)

    return result