aboutsummaryrefslogtreecommitdiffstats
path: root/access/fetch.py
blob: 170a7a7d416dec7b4928c76942012385174d1578 (plain) (blame)
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)])