def get(self, year="current"): """year can be 'all', 'current', '2002', '2011', etc.""" self.response.headers["Content-Type"] = "text/calendar; charset=utf-8" # find from cache q = Cache.gql("WHERE site = :site AND year = :year", site="nuscs", year=year) c = q.get() if c: self.response.out.write(c.data) return # generate now cal = Calendar() cal.add("prodid", "-//NUS CS Seminars//ronhuang.org//") cal.add("version", "2.0") cal.add("X-WR-CALNAME", "NUS CS Seminars") cal.add("X-WR-CALDESC", "Seminars are open to the public, and usually held in the School's Seminar Room.") q = Seminar.all().order("start") if year != "all": yn = None try: yn = int(year) except: pass if yn: # return events within that year q = q.filter("start >=", datetime(yn, 1, 1, tzinfo=SGT)) q = q.filter("start <", datetime(yn + 1, 1, 1, tzinfo=SGT)) else: # default # return a year of events. q = q.filter("start >=", datetime.now(SGT) - timedelta(days=366)) for s in q: event = Event() event["uid"] = s.url event.add("summary", s.title) event.add("dtstart", s.start) event.add("dtend", s.end) event.add("dtstamp", s.stamp) event.add("location", s.venue) event.add("url", s.url) event.add("description", s.speaker) event.add("categories", "seminar") event.add("class", "PUBLIC") cal.add_component(event) # generated data data = cal.as_string() encoding = chardet.detect(data)["encoding"] data = unicode(data, encoding) # store in datastore q = Cache.gql("WHERE site = :site AND year = :year", site="nuscs", year=year) c = q.get() if c: c.data = data else: c = Cache(site="nuscs", data=data, year=year) c.put() self.response.out.write(data)