コード例 #1
0
    def post(self):
        data = request.get_json()

        person_uri = data["person"]["uri"]
        text = data["text"]

        resource_uri = data["resource"]["uri"]
        resource = get_resource_for_uri(resource_uri)

        settings = SettingsResource().get()

        if not (resource.auto_approval_allowed and settings["strotime_booking_allowed"]):
            abort(403, __error__=[u"Strøtimer ikke tillatt"])

        person = get_person_for_uri(person_uri)
        application = Application(person, None, text, None, resource)

        datetime_now = datetime.now()

        slots = [self.parse_slot_request(d, application) for d in data["slots"]]

        for slot in slots:
            start_date = slot.start_time.date()
            end_date = slot.end_time.date()
            week_day = slot.start_time.isoweekday()
            start_time = slot.start_time.time()
            end_time = slot.end_time.time()
            self.validate_start_and_end_times(start_date, end_date, start_time, end_time)

            if slot.start_time < nearest_hour(datetime_now):
                abort(400, __error__=[u"Du kan ikke søke om en time tilbake i tid"])

            if self.is_conflict_slot_time(
                resource, start_date, end_date, week_day, start_time, end_time
            ) or self.is_conflict_rammetid(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"])

            # The start time must be in the range 3-21 days (inclusive)
            days = (slot.start_time.date() - datetime_now.date()).days
            if days >= 3 and days <= 21:
                application.add_strotime_slot(slot)
            else:
                abort(400, __error__=[u"Tiden må være innenfor 3-21 dager fra dagens dato"])

        application.status = "Granted"
        current_app.db_session.add(application)
        current_app.db_session.commit()
        current_app.db_session.refresh(application)

        send_email_strotime_granted(application)
        send_email_to_resource(application)

        return application, 201