def post(self):
        data = request.get_json()

        resource_data = data.get("resource", None)
        if resource_data:
            resource_uri = resource_data["uri"]
            resource = get_resource_for_uri(resource_uri)
            if not resource:
                abort(403, __error__=[u'Ressursen ble ikke funnet.'])
        else:
            abort(403, __error__=[u'Data om ressursen mangler.'])

        umbrella_organisation_data = data.get("umbrella_organisation", None)
        if umbrella_organisation_data:
            umbrella_organisation_uri = umbrella_organisation_data["uri"]
            umbrella_organisation = get_umbrella_organisation_for_uri(umbrella_organisation_uri)
            if not umbrella_organisation:
                abort(403, __error__=[u'Paraplyorganisasjonen ble ikke funnet.'])
        else:
            abort(403, __error__=[u'Data om paraplyorganisasjonen mangler.'])

        rammetid = Rammetid(umbrella_organisation, resource)

        rammetid_slots_data = data.get("rammetid_slots", None)
        if rammetid_slots_data:
            for rammetid_slot in rammetid_slots_data:
                rammetid_slot_parsed = parse_repeating_slot(rammetid_slot)
                if BaseApplicationResource.is_conflict_rammetid(resource, rammetid_slot_parsed.start_date, rammetid_slot_parsed.end_date, rammetid_slot_parsed.week_day,
                                                                rammetid_slot_parsed.start_time, rammetid_slot_parsed.end_time):
                    abort(
                        400,
                        __error__=[u'Tiden er ikke tilgjengelig']
                    )
                if BaseApplicationResource.is_conflict_blocked_time(resource, rammetid_slot_parsed.start_date, rammetid_slot_parsed.end_date, rammetid_slot_parsed.week_day,
                                                                    rammetid_slot_parsed.start_time, rammetid_slot_parsed.end_time):
                    abort(
                        400,
                        __error__=[u'Tiden er blokkert']
                    )
                rammetid.add_rammetid_slot(rammetid_slot_parsed)

        current_app.db_session.add(rammetid)
        current_app.db_session.commit()
        current_app.db_session.refresh(rammetid)

        return marshal(rammetid, rammetid_fields), 201
    def get(self, rammetid_id=None):
        if rammetid_id:
            rammetid = self.get_object_by_id(rammetid_id)
            return marshal(rammetid, rammetid_fields)
        else:
            resource_uri = request.args.get('resource_uri')
            umbrella_organisation_uri = request.args.get('umbrella_organisation_uri')
            if "only_periods" in request.args and resource_uri and umbrella_organisation_uri:
                resource = self.get_resource_with_id_or_uri(None, resource_uri)
                umbrella_organisation = get_umbrella_organisation_for_uri(umbrella_organisation_uri)
                rammetids = current_app.db_session.query(RammetidSlot.start_date.label('start_date'), RammetidSlot.end_date.label('end_date')) \
                    .filter(Rammetid.id == RammetidSlot.rammetid_id, Rammetid.resource_id == resource.id, Rammetid.umbrella_organisation_id == umbrella_organisation.id) \
                    .distinct(RammetidSlot.start_date, RammetidSlot.end_date) \
                    .group_by(RammetidSlot.start_date, RammetidSlot.end_date) \
                    .order_by(RammetidSlot.start_date, RammetidSlot.end_date)

                res = [dict(zip(['start_date', 'end_date'], r)) for r in rammetids.all()]

                return marshal(res, {'start_date': ISO8601DateTime, 'end_date': ISO8601DateTime})
            else:
                rammetids = current_app.db_session.query(Rammetid).order_by(Rammetid.id)
                return marshal(rammetids.all(), rammetid_fields)
    def post(self):
        data = request.get_json()

        rammetid_to_application = RammetidToApplication(data.get('umbrella_organisation').get('uri'))
        ensure(POST, rammetid_to_application)

        resource = data.get("resource", None)
        if not resource:
            abort(403, __error__=[u'Ressurs er ikke angitt.'])

        resource = get_resource_for_uri(resource['uri'])
        if not resource:
            abort(404, __error__=[u'Ressursen finnes ikke.'])

        if not resource.repeating_booking_allowed:
            abort(403, __error__=[u'Gjentakende lån ikke tillatt'])

        user = get_user(request.cookies)
        person_uri = '/persons/{}'.format(user['person_id'])
        person = get_person_for_uri(person_uri)
        if not person:
            abort(404, __error__=[u'Personen finnes ikke.'])

        # get umbrella member orgs from organisations backend
        umbrella_member_organisations = get_umbrella_organisation_from_web(data.get('umbrella_organisation').get('uri')).get('organisations', [])

        # get local umbrella organisation object
        umbrella_organisation = get_umbrella_organisation_for_uri(data.get('umbrella_organisation').get('uri'))

        text = "Rammetid fordeling"

        applications = []
        organisations = data.get('organisations', None)
        for organisation in organisations:
            organisation_data = organisations[organisation]
            # have to be superuser if the organisation is not public and not copied to booking already
            organisation = get_organisation_for_uri(organisation_data['uri'], cookies=make_superuser_auth_cookie())

            if not organisation:
                abort(404, __error__=[u'Organisasjonen finnes ikke.'])

            if not any(org.get('uri') == organisation_data['uri'] for org in umbrella_member_organisations):
                abort(403, __error__=[u'Organisasjonen hører ikke til paraplyorganisasjonen'])

            application = Application(person, organisation, text, None, resource)
            application.status = 'Granted'

            slots = organisation_data["slots"]
            for slot_data in slots:

                slot = self.parse_slot(slot_data, application)
                slot_request = self.parse_slot_request(slot_data)

                start_date = slot.start_date
                end_date = slot.end_date
                week_day = slot.week_day
                start_time = slot.start_time
                end_time = slot.end_time

                self.validate_start_and_end_times(start_date, end_date, start_time, end_time)

                if not self.has_matching_rammetid(umbrella_organisation.id, start_date, end_date, week_day, start_time, end_time):
                    abort(400, __error__=[u'Ingen rammetid passer'])

                if self.is_conflict_slot_time(resource, start_date, end_date, week_day, start_time, end_time):
                    abort(400, __error__=[u'Tiden du har søkt på er ikke tilgjengelig'])

                if self.is_conflict_blocked_time(resource, start_date, end_date, week_day, start_time, end_time):
                    abort(400, __error__=[u'Tiden du har søkt på er blokkert'])

                application.request_repeating_slot(slot_request)
                application.add_repeating_slot(slot)
            applications.append(application)

        for application in applications:
            current_app.db_session.add(application)
            current_app.db_session.commit()
            current_app.db_session.refresh(application)

        return applications, 201