def ical_all(): """ Returns a iCal feed of all calendars from today - 1 month to today + 6 month. """ startd = datetime.date.today() - datetime.timedelta(days=30) endd = datetime.date.today() + datetime.timedelta(days=180) ical = vobject.iCalendar() meetings = [] for calendar in Calendar.get_all(SESSION): meetings.extend(fedocallib.get_meetings_by_date(SESSION, calendar.calendar_name, startd, endd)) fedocallib.add_meetings_to_vcal(ical, meetings) return flask.Response(ical.serialize(), mimetype="text/calendar")
def ical_out(calendar_name): """ Returns a iCal feed of the calendar from today - 1 month to today + 6 month. :arg calendar_name: the name of the calendar for which one would like to get the iCal feed. """ startd = datetime.date.today() - datetime.timedelta(days=30) endd = datetime.date.today() + datetime.timedelta(days=180) meetings = fedocallib.get_meetings_by_date(SESSION, calendar_name, startd, endd) ical = vobject.iCalendar() fedocallib.add_meetings_to_vcal(ical, meetings) return flask.Response(ical.serialize(), mimetype="text/calendar")
def api_meetings(): """ Retrieve meetings ================= The ``/api/meetings/`` endpoint returns the meetings meeting the provided criteria. Response format ---------------- Sample response: .. code-block:: javascript { "meetings": [ { "meeting_time_start": "23:00:00", "meeting_information": "", "meeting_time_stop": "23:00:00", "calendar_name": "test", "meeting_date_end": "2013-05-27", "meeting_manager": "pingou2,", "meeting_date": "2013-05-27", "meeting_name": "test1.5", "meeting_region": "None" }, { "meeting_time_start": "06:00:00", "meeting_information": "", "meeting_time_stop": "07:00:00", "calendar_name": "test", "meeting_date_end": "2013-05-28", "meeting_manager": "pingou,", "meeting_date": "2013-05-28", "meeting_name": "test3", "meeting_region": null } ], "arguments": { "start": "2013-05-04", "calendar": "test", "end": "2013-11-30", "region": null } } The ``arguments`` item in the root dictionary contains all possible arguments, and displays the value used (the default if the argument was not provided). Time arguments -------------- Below is a table describing what timeframe messages are received from depending on what combination of time options you provide. ========= ======= ================= ``start`` ``end`` Message timeframe ========= ======= ================= no no the last 30 days and the coming 180 days **yes** no from ``start`` until the coming 180 days no **yes** the last 30 days until ``end`` **yes** **yes** between ``start`` and ``end`` ========= ======= ================= ``start`` Return results starting at date ``start`` (prefered format is "+%Y-%m-%d" see ``date "+%Y-%m-%d"``). Default: 30 days ago ``date "+%Y-%m-%d" -d "30 days ago"`` ``end`` Return results ending at date ``end`` (prefered format is "+%Y-%m-%d" see ``date "+%Y-%m-%d"``). Default: coming 180 days ``date "+%Y-%m-%d" -d "180 days"`` Filter arguments ---------------- ``calendar`` Restrict the meetings to a specific calendar. Default: all calendars ``region`` Restrict the meeting to a specific region. If the calendar does not have support for regions enabled, no meetings will be found matching this criteria and no meetings will be returned. Default: all regions """ @flask.after_this_request def callback(response): return check_callback(response) startd = flask.request.args.get('start', None) if startd is None: startd = datetime.date.today() - datetime.timedelta(days=30) else: try: startd = parser.parse(startd).date() except ValueError: output = {"meetings": [], "error": "Invalid start date format: %s" % startd} return flask.Response( response=json.dumps(output), status=400, mimetype='application/json') endd = flask.request.args.get('end', None) if endd is None: endd = datetime.date.today() + datetime.timedelta(days=180) else: try: endd = parser.parse(endd).date() except ValueError: output = {"meetings": [], "error": "Invalid end date format: %s" % endd} return flask.Response( response=json.dumps(output), status=400, mimetype='application/json') calendar_name = flask.request.args.get('calendar', None) region = flask.request.args.get('region', None) status = 200 meetings = [] try: if calendar_name: if region: #print "calendar and region" meetings = fedocallib.get_meetings_by_date_and_region( SESSION, calendar_name, startd, endd, region) else: #print "calendar and no region" meetings = fedocallib.get_meetings_by_date( SESSION, calendar_name, startd, endd) else: meetings = [] for calendar in fedocallib.get_calendars(SESSION): if region: #print "no calendar and region" meetings.extend(fedocallib.get_meetings_by_date_and_region( SESSION, calendar.calendar_name, startd, endd, region)) else: #print "no calendar and no region" meetings.extend(fedocallib.get_meetings_by_date( SESSION, calendar.calendar_name, startd, endd)) except SQLAlchemyError: # pragma: no cover status = 500 output = {} output['arguments'] = { 'start': startd.strftime('%Y-%m-%d'), 'end': endd.strftime('%Y-%m-%d'), 'calendar': calendar_name, 'region': region, } cnt = 0 meetings_json = [] for meeting in meetings: meetings_json.append(meeting.to_json()) output['meetings'] = meetings_json return flask.Response( response=json.dumps(output), status=status, mimetype='application/json' )