Advertisement
Guest User

Untitled

a guest
Aug 7th, 2016
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.22 KB | None | 0 0
  1. # coding: utf8
  2. from flask import Flask, session, render_template, request, abort, redirect, url_for, flash
  3. from functools import wraps
  4. import pymongo
  5. from pymongo import MongoClient
  6. from flask.ext.bcrypt import check_password_hash
  7. from flask.ext.bcrypt import generate_password_hash
  8. import random
  9. import time
  10.  
  11. app = Flask(__name__)
  12.  
  13. SECRET_KEY = 'X860sTSofiVJHfX6r3DUtAMNId5tHHszAf2GG/avurNxOBVBu0/j703CyO6d'
  14. app.config.from_object(__name__)
  15.  
  16. connection = MongoClient("localhost", 27017)
  17. db_users = connection.users
  18.  
  19. def 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.  
  54. def get_user():
  55.     login = 'user' in session  
  56.     if login:
  57.         login=session['user']
  58.         return (True, login)
  59.     return (False, None)
  60.    
  61. def 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.  
  70. def session_login(username):
  71.     session['user'] = username
  72.  
  73. @app.route('/logout')
  74. @login_required
  75. def logout():
  76.     del session['user']
  77.     return redirect('/')
  78.  
  79. @app.route('/volonter', methods=['GET', 'POST'])
  80. def 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'])
  136. def 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
  163. def 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
  183. def 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
  204. def 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
  227. def 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
  268. def 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'])
  301. def 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'])
  310. def 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('/')
  342. def index():
  343.     login,user=get_user()
  344.     if login:
  345.         return render_template('tasks.html')
  346.     else:
  347.         return render_template('login.html')
  348.  
  349. if __name__ == '__main__':
  350.     print
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement