#!/usr/bin/env python # -*- coding: UTF-8 -*- import webapp2 import datetime from google.appengine.api import users from google.appengine.ext import db from lxml import etree def XMLBuildCalEvent(calevent, entry): newdata = etree.SubElement(calevent, 'key') newdata.text = str(entry.key()) newdata = etree.SubElement(calevent, 'title') newdata.text = entry.title newdata = etree.SubElement(calevent, 'content') newdata.text = entry.content newdata = etree.SubElement(calevent, 'icon') newdata.text = str(entry.icon) newdata = etree.SubElement(calevent, 'year') newdata.text = str(entry.begin.year) newdata = etree.SubElement(calevent, 'month') newdata.text = str(entry.begin.month) newdata = etree.SubElement(calevent, 'date') newdata.text = str(entry.begin.day) newdata = etree.SubElement(calevent, 'hour') newdata.text = str(entry.begin.hour) newdata = etree.SubElement(calevent, 'minute') newdata.text = str(entry.begin.minute) newdata = etree.SubElement(calevent, 'remind') newdata.text = str(entry.remind) newdata = etree.SubElement(calevent, 'datafrom') newdata.text = entry.datafrom class FetchEvent(webapp2.RequestHandler): def get(self): # GET 適用於已知 key 的狀況 guserid = users.get_current_user() if not guserid: return mykey = self.request.get('key') eventroot = etree.Element('inccalender') calevent = etree.SubElement(eventroot, 'calevent') entrykey = db.Key(mykey) if entrykey.parent().name() != guserid.email(): self.response.set_status(403) return entry = db.get(entrykey) XMLBuildCalEvent(calevent, entry) self.response.headers['Content-Type'] = 'text/xml; charset=UTF-8' self.response.out.write( etree.tostring(eventroot, pretty_print=True, xml_declaration=True, encoding='UTF-8')) def post(self): # POST 適用於需要查詢的情況,要提供年月 guserid = users.get_current_user() if not guserid: return year = self.request.get('year') month = self.request.get('month') withcursor = self.request.get('gqlcursor') if month == "": year = int(year) data = db.GqlQuery("SELECT * FROM CalEvent " "WHERE ANCESTOR IS :1 AND " "begin >= :2 AND " "begin < :3 " "ORDER BY begin", db.Key.from_path('user', guserid.email()), datetime.datetime(year, 1, 1), datetime.datetime(year + 1, 1, 1)) else: year = int(year) month = int(month) if month >= 12: nextmonth = 1 nextyear = year + 1 else: nextmonth = month + 1 nextyear = year data = db.GqlQuery("SELECT * FROM CalEvent " "WHERE ANCESTOR IS :1 AND " "begin >= :2 AND " "begin < :3 " "ORDER BY begin", db.Key.from_path('user', guserid.email()), datetime.datetime(year, month, 1), datetime.datetime(nextyear, nextmonth, 1)) if withcursor != "": data.with_cursor(withcursor) eventroot = etree.Element('inccalender') for entry in data.run(limit=50): calevent = etree.SubElement(eventroot, 'calevent') XMLBuildCalEvent(calevent, entry) gqlcursor = etree.SubElement(eventroot, 'gqlcursor') gqlcursor.text = data.cursor() self.response.headers['Content-Type'] = 'text/xml; charset=UTF-8' self.response.out.write( etree.tostring(eventroot, xml_declaration=True, encoding='UTF-8')) app = webapp2.WSGIApplication([('/access/fetch', FetchEvent)])