· 9 years ago · Aug 07, 2016, 06:18 PM
1# coding: utf8
2from flask import Flask, session, render_template, request, abort, redirect, url_for, flash
3from functools import wraps
4import pymongo
5from pymongo import MongoClient
6from flask.ext.bcrypt import check_password_hash
7from flask.ext.bcrypt import generate_password_hash
8import random
9import time
10
11app = Flask(__name__)
12
13SECRET_KEY = 'X860sTSofiVJHfX6r3DUtAMNId5tHHszAf2GG/avurNxOBVBu0/j703CyO6d'
14app.config.from_object(__name__)
15
16connection = MongoClient("localhost", 27017)
17db_users = connection.users
18
19def get_task(user):
20 global db_users
21 all_rows=db_users.users.find({})
22 done=[]
23 active=[]
24 for e in all_rows:
25 for i in e['status']['tasks_done']:
26 done.append(i)
27 for e in db_users.users.find({}):
28 if len(e['status']['tasks_done'])>0:
29 if 'task_active' in e['status']:
30 active.append(e['status']['task_active'])
31 done=filter(lambda x: not x in active,done)
32 done=dict((x, done.count(x)) for x in set(done))
33 all_id_tasks=map(lambda x: x.items()[0][1],list(db_users.tasks.find({},{'task_id':1,'_id':0})))
34 null_tasks=list(set(all_id_tasks)-set([e[0] for e in done.items()])-set(active))
35 for e in null_tasks:
36 done[e]=0
37 done=sorted(done.items(),key=lambda x: x[1])# Ñто только получение ÑпиÑка приоритетных таÑков, на которых ещё мало команд было
38 status=db_users.users.find({'user':user})[0]["status"]["tasks_done"]
39 if len(status)==0:
40 return done[0][0]
41 elif len(status)==db_users.tasks.count():
42 return "win"
43 elif len(status)>0 and len(status)<db_users.tasks.count():
44 result=list(set([x[0] for x in done])-set(status))
45 if len(result)>0:
46 for e in done:
47 if e[0] in result:
48 return e[0]
49 else:
50 return random.choice(list(set(range(db_users.tasks.count()))-set(status)))
51 else:
52 return 'error'
53
54def get_user():
55 login = 'user' in session
56 if login:
57 login=session['user']
58 return (True, login)
59 return (False, None)
60
61def login_required(f):
62 @wraps(f)
63 def decorated_function(*args, **kwargs):
64 if 'user' not in session:
65 flash('Login please!')
66 return redirect(url_for('login'))
67 return f(*args, **kwargs)
68 return decorated_function
69
70def session_login(username):
71 session['user'] = username
72
73@app.route('/logout')
74@login_required
75def logout():
76 del session['user']
77 return redirect('/')
78
79@app.route('/volonter', methods=['GET', 'POST'])
80def volonter():
81 global db_users
82 form="""
83 <!DOCTYPE html>
84 <html lang="en">
85 <body>
86 <form class="login" action="/volonter" method="post" autocomplete="off">
87 <p>Login: <input type="text" name="user" /></p><br>
88 <p>Password: <input type="password" name="pass" /></p>
89 <input type="submit" value="Submit" />
90 </form>
91 </body>
92 </html>
93 """
94 try:
95 list_teams_from_history=map(lambda x: x, list(db_users.volonters.find({'user':get_user()[1]},{'history':1,'_id':0}))[0]['history'])
96 except: list_teams_from_history=[]
97 list_teams=map(lambda x: x.items()[0][1], list(db_users.users.find({},{'user':1,'_id':0})))
98 list_teams=list(set(list_teams)-set(list_teams_from_history))
99 list_volonters=map(lambda x: x.items()[0][1],list(db_users.volonters.find({},{'user':1,'_id':0})))
100 max_score=db_users.tasks.find({'task_id':0},{'task_social_score':1,'_id':0})[0]['task_social_score']
101 if request.method == 'GET' and get_user()[0]==False:
102 return form
103 elif request.method == 'GET' and get_user()[1] in list_volonters:
104 task_id=db_users.volonters.find({'user':'vasya'},{'task_id':1,'_id':0})[0]['task_id']
105 return render_template('volonter.html',list_teams=list_teams,max_score=max_score)
106 elif request.method == 'GET' and not get_user()[1] in list_volonters:
107 return form
108 if request.method == 'POST' and get_user()[0]==False:
109 username = request.form['user']
110 password = request.form['pass']
111 user_pass = list(db_users.volonters.find({'user':username},{'pass':1,'_id':0}))
112 if len(user_pass)>0 and check_password_hash(user_pass[0]['pass'],password):
113 session_login(username)
114 task_id=db_users.volonters.find({'user':'vasya'},{'task_id':1,'_id':0})[0]['task_id']
115 return render_template('volonter.html',list_teams=list_teams,max_score=max_score)
116 else:
117 return redirect(url_for('volonter'))
118 if request.method == 'POST' and get_user()[1] in list_volonters:
119 scroll= int(request.form['scroll'])
120 team_name= request.form['team_name']
121 history=list(db_users.volonters.find({'user':get_user()[1]},{'history':1,'_id':0}))[0]['history']
122 print history
123 if not team_name in history:
124 db_users.users.update({'user':team_name}, {'$inc':{'score':scroll}})
125 history[team_name]=scroll
126 db_users.volonters.update({'user':get_user()[1]},{'$set':{'history':history}})
127 list_teams=[x for x in list_teams if x!=team_name]
128 print list_teams
129 print max_score
130 return render_template('volonter.html',list_teams=list_teams,max_score=max_score)
131 else:
132 return abort(405)
133
134
135@app.route('/login', methods=['GET', 'POST'])
136def login():
137 try:
138 del session['user']
139 except: pass
140 global db_users
141 if request.method == 'GET':
142 return render_template('login.html')
143 elif request.method == 'POST':
144 username = request.form['user']
145 passw = request.form['pass']
146 user=db_users.users.find_one({'user':username})
147# print generate_password_hash(passw)
148 if not user:
149 flash('Invalid login')
150 return render_template('login.html')
151 else:
152 if check_password_hash(user['password'],passw):
153 session_login(username)
154 return redirect(url_for('tasks'))
155 else:
156 flash('Invalid Password')
157 return render_template('login.html')
158 else:
159 return abort(405)
160
161@app.route('/create_team', methods=['POST'])
162@login_required
163def create_team():
164 global db_users
165 if request.method == 'POST' and get_user()[1]=='admin':
166 username=request.form['user']
167 passwd=generate_password_hash(request.form['pass'])
168 new_user={}
169 new_user['user']=username
170 new_user['password']=passwd
171 new_user['score']=0
172 new_user['status']={'tasks_done':[],'type_task':'social'}
173 db_users.users.save(new_user)
174 flash='DONE!'
175 return redirect(url_for('admin'))
176 else:
177 flash='ERROR!'
178 return redirect(url_for('admin'))
179 return abort(405)
180
181@app.route('/create_valater', methods=['POST'])
182@login_required
183def create_valater():
184 global db_users
185 if request.method == 'POST' and get_user()[1]=='admin':
186 username=request.form['user']
187 passwd=generate_password_hash(request.form['pass'])
188 task_id=request.form['id']
189 new_val={}
190 new_val['user']=username
191 new_val['pass']=passwd
192 new_val['task_id']=int(task_id)
193 new_val['history']={}
194 db_users.volonters.save(new_val)
195 flash='DONE!'
196 return redirect(url_for('admin'))
197 else:
198 flash='ERROR!'
199 return redirect("/admin")
200 return abort(405)
201
202@app.route('/create_task', methods=['POST'])
203@login_required
204def create_task():
205 global db_users
206 if request.method == 'POST' and get_user()[1]=='admin':
207 new_task={}
208 new_task['task_id']=int(request.form['task_id'])
209 new_task['task_social']=request.form['task_social']
210 new_task['task_social_text']=request.form['task_social_text']
211 new_task['task_social_flag']=request.form['task_social_flag']
212 new_task['task_social_score']=int(request.form['task_social_score'])
213 new_task['task_tech']=request.form['task_tech']
214 new_task['task_tech_text']=request.form['task_tech_text']
215 new_task['task_tech_flag']=request.form['task_tech_flag']
216 new_task['task_tech_score']=int(request.form['task_tech_score'])
217 new_task['task_time']=1200
218 db_users.tasks.save(new_task)
219 flash='DONE!'
220 return redirect(url_for('admin'))
221 else:
222 flash='ERROR!'
223 return redirect("/admin")
224
225@app.route('/chek_flag',methods=['GET','POST'])
226@login_required
227def chek_flag():
228 global db_users
229 user=get_user()[1]
230 status = db_users.users.find({'user':user})
231 task_id=status[0]['status']['task_active']
232 task=db_users.tasks.find_one({'task_id':task_id})
233 if request.method == 'POST':
234 status = db_users.users.find({'user':user})
235 flag = request.form['flag']
236 if status[0]['status']['type_task']=='social':
237 if flag==task['task_social_flag']:
238 status = db_users.users.find_one({'user':user})
239
240 status["status"]={"tasks_done":status['status']['tasks_done'],"task_active":task_id,
241 "type_task":"tech", "time":int(round(time.time() * 1000))+1000*60*20}
242 db_users.users.save(status)
243 return redirect('/tasks')
244 if status[0]['status']['type_task']=='tech':
245 timestemp=status[0]['status']['time']
246 if int(round(time.time() * 1000)) < timestemp:
247 if flag==task['task_tech_flag']:
248 status = db_users.users.find_one({'user':user})
249 score=task["task_tech_score"]
250 user_score=status['score']
251 status['score']=user_score+score
252 status["status"]={"tasks_done":status['status']['tasks_done']+[task_id],
253 "type_task":"social"}
254 db_users.users.save(status)
255 return redirect('/tasks')
256 else:
257 status = db_users.users.find_one({'user':user})
258 print status['status']
259 status["status"]={"tasks_done":status['status']['tasks_done']+[task_id], "type_task":"social"}
260 db_users.users.save(status)
261 return redirect('/tasks')
262 return redirect('/tasks')
263 else:
264 return render_template('tasks.html')
265
266@app.route('/tasks', methods=['GET'])
267@login_required
268def tasks():
269 global db_users
270 if request.method == 'GET':
271 user = get_user()[1]
272 status = db_users.users.find({'user':user})
273 #ЕÑли таÑки закончиличь, поздравим команду
274 if len(status[0]["status"]["tasks_done"])==db_users.tasks.count():
275 return render_template('tasks.html',task="Ð£Ð¼ÐµÐ½Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ нет Ð´Ð»Ñ Ð²Ð°Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ð¹".decode("utf-8"),
276 task_text='Срочно Ñледуйте к универиÑтету! Ð’Ñе ÑобираемÑÑ Ñ‚Ð°Ð¼ и подводим результаты.'.decode("utf-8"),submit=False)
277 if 'task_active' in status[0]['status']:
278 task_id=status[0]['status']['task_active']
279 task=db_users.tasks.find_one({'task_id':task_id})
280 if status[0]['status']['type_task']=='social':
281 return render_template('tasks.html',task=task['task_social'],
282 task_text=task['task_social_text'],submit=True,tech=False)
283 if status[0]['status']['type_task']=='tech':
284 timestemp=status[0]['status']['time']
285 print timestemp
286 return render_template('tasks.html',task=task['task_tech'],
287 task_text=task['task_tech_text'],submit=True,tech=timestemp)
288 else:
289 task_id=get_task(user)
290 task=db_users.tasks.find_one({'task_id':task_id})
291 status = db_users.users.find_one({'user':get_user()[1]})
292 status["status"]={"tasks_done":status['status']['tasks_done'],"task_active":task_id,"type_task":"social"}
293 db_users.users.save(status)
294 return render_template('tasks.html',task=task['task_social'],
295 task_text=task['task_social_text'],submit=True,tech=False)
296 return redirect('tasks.html')
297 else:
298 return abort(405)
299
300@app.route('/scoreboard', methods=['GET'])
301def scoreboard():
302 global db_users
303 if request.method == 'GET':
304 score = db_users.users.find({},{"user":1,"score":1,"_id":0}).sort("score",-1)
305 return render_template('scoreboard.html',score=score)
306 else:
307 return abort(405)
308
309@app.route('/admin', methods=['GET','POST'])
310def admin():
311 passwd='$2a$12$oJVE0j3tHAnyc2zM9A89YO11bNbfId7G.0za2dHp/TYDg0dDgbUYa'
312 user='admin'
313 form="""
314 <!DOCTYPE html>
315 <html lang="en">
316 <body>
317 <form class="login" action="/admin" method="post" autocomplete="off">
318 <p>Login: <input type="text" name="user" /></p><br>
319 <p>Password: <input type="password" name="pass" /></p>
320 <input type="submit" value="Submit" />
321 </form>
322 </body>
323 </html>
324 """
325 if request.method == 'GET' and get_user()[1]=='admin':
326 if not get_user()[0]:
327 return form
328 else:
329 return render_template('admin.html')
330 if request.method == 'POST':
331 username = request.form['user']
332 password = request.form['pass']
333 if username==user and check_password_hash(passwd, password):
334 session_login(username)
335 return render_template('admin.html')
336 else:
337 return form
338 else:
339 return form
340
341@app.route('/')
342def index():
343 login,user=get_user()
344 if login:
345 return render_template('tasks.html')
346 else:
347 return render_template('login.html')
348
349if __name__ == '__main__':
350 print