#!/usr/bin/env python # -*- coding: UTF-8 -*- import webapp2 from StringIO import StringIO from datetime import datetime, timedelta from ntuceiba import NtuCeibaEvent from ntuceiba.parse import ntuceiba_parser from ntuceiba.toxml import ntuceiba_toxml from access import CalEvent from google.appengine.api import users from google.appengine.ext import db def ntuceiba_merge(listobj, useremail, allow_overwrite): for entry in listobj: if entry.duedate == None: continue data = db.GqlQuery("SELECT * FROM CalEvent " "WHERE ANCESTOR IS :1 AND " "begin >= :2 AND " "begin < :3 " "ORDER BY begin", db.Key.from_path('user', useremail), entry.duedate, entry.duedate + timedelta(0, 3600, 0)) for matched in data.run(): if matched.datafrom == "ntuceiba" and matched.title.find(entry.title) >= 0: if allow_overwrite: entry.key = str(matched.key()) else: entry.enabled = False break def ntuceiba_gaeds_update(listobj, useremail, fakencobj, titleadd): listlen = len(listobj) createlen = 0 updatelen = 0 for entry in listobj: if entry.enabled: contstr = "" if entry.key != None: calevent = db.get(db.Key(entry.key)) updatelen = updatelen + 1 else: calevent = CalEvent( db.Key.from_path('user', useremail), # 我在亂打...... 這個不重要 title="臺大 CEIBA 匯入工具" , begin=datetime(1, 1, 1), datafrom="ntuceiba") createlen = createlen + 1 if titleadd == None or titleadd == "": calevent.title = entry.title else: calevent.title = "[" + titleadd + "]" + " " + entry.title calevent.begin = entry.duedate calevent.icon = 0 calevent.remind = 30 calevent.datafrom = "ntuceiba" if fakencobj.title: contstr = contstr + u"名稱:" + entry.title + "\n" if fakencobj.member: contstr = contstr + u"成員:" + entry.member + "\n" if fakencobj.method: contstr = contstr + u"繳交方法:" + entry.method + "\n" if fakencobj.percent: contstr = contstr + u"成績比重:" + entry.percent + "\n" if fakencobj.duedate: contstr = contstr + u"繳交期限:" + str(entry.duedate) + "\n" if fakencobj.late: if entry.late: contstr = contstr + u"逾期繳交:可以\n" else: contstr = contstr + u"逾期繳交:不可以\n" if fakencobj.subdate: contstr = contstr + u"繳交日期:" + entry.subdate + "\n" if fakencobj.comment: contstr = contstr + u"作業評語:" + entry.comment + "\n" calevent.content = contstr calevent.put() return (listlen, createlen, updatelen) class NtuCeibaImport(webapp2.RedirectHandler): def get(self): return def post(self): guserid = users.get_current_user() if not guserid: return merge = self.request.get('merge') viewonly = self.request.get('viewonly') overwrite = self.request.get('overwrite') htmlfile = self.request.get('file') useremail = guserid.email() htmlfile = StringIO(htmlfile) htmlfile.readline() cblist = ntuceiba_parser(htmlfile) enflag = NtuCeibaEvent() enflag.flagize() if self.request.get('addtitle') != "": enflag.title = True if self.request.get('addmember') != "": enflag.member = True if self.request.get('addmethod') != "": enflag.method = True if self.request.get('addpercent') != "": enflag.percent = True if self.request.get('adddue') != "": enflag.duedate = True if self.request.get('addlate') != "": enflag.late = True if self.request.get('addsub') != "": enflag.subdate = True if self.request.get('addcomment') != "": enflag.comment = True if merge != "": if overwrite != "": ntuceiba_merge(cblist, useremail, True) else: ntuceiba_merge(cblist, useremail, False) if viewonly != "": self.response.headers['Content-Type'] = 'text/xml; charset=UTF-8' self.response.out.write(ntuceiba_toxml(cblist)) else: resrepo = ntuceiba_gaeds_update(cblist, useremail, enflag, None) self.response.headers['Content-Type'] = 'text/plain' self.response.out.write( str(resrepo[0]) + " " + str(resrepo[1]) + " " + str(resrepo[2])) app = webapp2.WSGIApplication([('/access/imnc', NtuCeibaImport)])