1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#!/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)])
|