-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmessageviewer.py
133 lines (107 loc) · 3.87 KB
/
messageviewer.py
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#-*- coding: UTF-8 -*-
#/usr/bin/env python
import json
from multiprocessing import Process
import jinja2
from bottle import Bottle
from bottle import route
from bottle import run
from bottle import template
from bottle import static_file
from bottle import request
from bottle import abort
from bottle import redirect
from bottle import response
from config import REdict
from worker import ParseHandler
from dbSqlite3 import dbSqlite3
JINJA_ENVIRONMENT = jinja2.Environment(
loader = jinja2.FileSystemLoader('template'),
extensions=['jinja2.ext.autoescape'],
autoescape=True)
database = dbSqlite3()
parser = ParseHandler()
def MessageUploadFormHandler():
data = request.files.get('file')
filename = data.filename
file_content = data.file.read()
print("filename: {}".format(filename))
parser.setLang("en")
if not parser.isValid(file_content):
print("The uploaded file not valid")
redirect('/view')
# simple check OK, parse username store database
username = parser.parseUsername()
userid = database.insertUser(username)
# invoke another process to processing
p = Process(target = parser.parse, args=(userid,))
p.start()
redirect('/view')
def MessageViewHandler():
template = JINJA_ENVIRONMENT.get_template('view.html')
template_values = {
'upload_url': '/uploadhandler',
'langs': REdict,
}
return template.render(template_values)
def callback(path):
return static_file(path, root='static')
def MessageFetchHandler():
reqType = request.query.type
print("API request type: {}".format(reqType))
userid = 1
response.content_type = "application/json"
if reqType == "user":
pass
elif reqType == "groups":
groupquery = database.getGroup(userid)
groups = [{"name": grp[1], "nickname": grp[2]} for grp in groupquery]
print("Get {} groups".format(len(groups)))
return json.dumps({"groups": groups})
elif reqType == "message":
groupname = request.query.group
startstr = request.query.startdate
endstr = request.query.enddate
offset = int(request.query.offset or 0)
# fetch database
messages = database.getMessage(userid, groupname, startstr, endstr, offset)
# prepare message
ret = [{"name": msg[0],
"nickname": msg[1],
"time": msg[2],
"content": msg[3]} for msg in messages]
return json.dumps({"messages": ret})
elif reqType == "date":
groupname = request.query.groups
dates = map(lambda x: x[0].split()[0],
database.getDate(userid, groupname))
seen = set()
uniqDates = [x for x in dates if x not in seen and not seen.add(x)]
return json.dumps({"dates": uniqDates})
elif reqType == "friend":
fname = request.query.fname
fnickname = request.query.fnickname
oldfnick = None
# find old nickname
friendquery = database.getFriend(userid)
for fitem in friendquery:
if fname == fitem[0]:
oldfnick = fitem[1]
break;
# update friend's nickname
database.updateFriend(userid, fname, fnickname)
# update group that contain fname
groupquery = database.getGroup(userid)
for g in filter(lambda x: fname in x[1], groupquery):
gname, gnickname = g[1], g[2].replace(oldfnick, fnickname)
database.updateGroup(userid, gname, gnickname)
def setup_routing(app):
app.route('/', 'GET', MessageViewHandler)
app.route('/view', 'GET', MessageViewHandler)
app.route('/uploadhandler', 'POST', MessageUploadFormHandler)
app.route('/static/<path:path>', 'GET', callback)
app.route('/fetch', 'GET', MessageFetchHandler)
if __name__ == "__main__":
app = Bottle()
setup_routing(app)
run(app=app, host='localhost', port=8080, reloader=True)