Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding: utf8
- from flask import Flask, session, render_template, request, abort, redirect, url_for, flash
- from functools import wraps
- import pymongo
- from pymongo import MongoClient
- from flask.ext.bcrypt import check_password_hash
- from flask.ext.bcrypt import generate_password_hash
- import random
- import time
- app = Flask(__name__)
- SECRET_KEY = 'X860sTSofiVJHfX6r3DUtAMNId5tHHszAf2GG/avurNxOBVBu0/j703CyO6d'
- app.config.from_object(__name__)
- connection = MongoClient("localhost", 27017)
- db_users = connection.users
- def get_task(user):
- global db_users
- all_rows=db_users.users.find({})
- done=[]
- active=[]
- for e in all_rows:
- for i in e['status']['tasks_done']:
- done.append(i)
- for e in db_users.users.find({}):
- if len(e['status']['tasks_done'])>0:
- if 'task_active' in e['status']:
- active.append(e['status']['task_active'])
- done=filter(lambda x: not x in active,done)
- done=dict((x, done.count(x)) for x in set(done))
- all_id_tasks=map(lambda x: x.items()[0][1],list(db_users.tasks.find({},{'task_id':1,'_id':0})))
- null_tasks=list(set(all_id_tasks)-set([e[0] for e in done.items()])-set(active))
- for e in null_tasks:
- done[e]=0
- done=sorted(done.items(),key=lambda x: x[1])# это только получение списка приоритетных тасков, на которых ещё мало команд было
- status=db_users.users.find({'user':user})[0]["status"]["tasks_done"]
- if len(status)==0:
- return done[0][0]
- elif len(status)==db_users.tasks.count():
- return "win"
- elif len(status)>0 and len(status)<db_users.tasks.count():
- result=list(set([x[0] for x in done])-set(status))
- if len(result)>0:
- for e in done:
- if e[0] in result:
- return e[0]
- else:
- return random.choice(list(set(range(db_users.tasks.count()))-set(status)))
- else:
- return 'error'
- def get_user():
- login = 'user' in session
- if login:
- login=session['user']
- return (True, login)
- return (False, None)
- def login_required(f):
- @wraps(f)
- def decorated_function(*args, **kwargs):
- if 'user' not in session:
- flash('Login please!')
- return redirect(url_for('login'))
- return f(*args, **kwargs)
- return decorated_function
- def session_login(username):
- session['user'] = username
- @app.route('/logout')
- @login_required
- def logout():
- del session['user']
- return redirect('/')
- @app.route('/volonter', methods=['GET', 'POST'])
- def volonter():
- global db_users
- form="""
- <!DOCTYPE html>
- <html lang="en">
- <body>
- <form class="login" action="/volonter" method="post" autocomplete="off">
- <p>Login: <input type="text" name="user" /></p><br>
- <p>Password: <input type="password" name="pass" /></p>
- <input type="submit" value="Submit" />
- </form>
- </body>
- </html>
- """
- try:
- list_teams_from_history=map(lambda x: x, list(db_users.volonters.find({'user':get_user()[1]},{'history':1,'_id':0}))[0]['history'])
- except: list_teams_from_history=[]
- list_teams=map(lambda x: x.items()[0][1], list(db_users.users.find({},{'user':1,'_id':0})))
- list_teams=list(set(list_teams)-set(list_teams_from_history))
- list_volonters=map(lambda x: x.items()[0][1],list(db_users.volonters.find({},{'user':1,'_id':0})))
- max_score=db_users.tasks.find({'task_id':0},{'task_social_score':1,'_id':0})[0]['task_social_score']
- if request.method == 'GET' and get_user()[0]==False:
- return form
- elif request.method == 'GET' and get_user()[1] in list_volonters:
- task_id=db_users.volonters.find({'user':'vasya'},{'task_id':1,'_id':0})[0]['task_id']
- return render_template('volonter.html',list_teams=list_teams,max_score=max_score)
- elif request.method == 'GET' and not get_user()[1] in list_volonters:
- return form
- if request.method == 'POST' and get_user()[0]==False:
- username = request.form['user']
- password = request.form['pass']
- user_pass = list(db_users.volonters.find({'user':username},{'pass':1,'_id':0}))
- if len(user_pass)>0 and check_password_hash(user_pass[0]['pass'],password):
- session_login(username)
- task_id=db_users.volonters.find({'user':'vasya'},{'task_id':1,'_id':0})[0]['task_id']
- return render_template('volonter.html',list_teams=list_teams,max_score=max_score)
- else:
- return redirect(url_for('volonter'))
- if request.method == 'POST' and get_user()[1] in list_volonters:
- scroll= int(request.form['scroll'])
- team_name= request.form['team_name']
- history=list(db_users.volonters.find({'user':get_user()[1]},{'history':1,'_id':0}))[0]['history']
- print history
- if not team_name in history:
- db_users.users.update({'user':team_name}, {'$inc':{'score':scroll}})
- history[team_name]=scroll
- db_users.volonters.update({'user':get_user()[1]},{'$set':{'history':history}})
- list_teams=[x for x in list_teams if x!=team_name]
- print list_teams
- print max_score
- return render_template('volonter.html',list_teams=list_teams,max_score=max_score)
- else:
- return abort(405)
- @app.route('/login', methods=['GET', 'POST'])
- def login():
- try:
- del session['user']
- except: pass
- global db_users
- if request.method == 'GET':
- return render_template('login.html')
- elif request.method == 'POST':
- username = request.form['user']
- passw = request.form['pass']
- user=db_users.users.find_one({'user':username})
- # print generate_password_hash(passw)
- if not user:
- flash('Invalid login')
- return render_template('login.html')
- else:
- if check_password_hash(user['password'],passw):
- session_login(username)
- return redirect(url_for('tasks'))
- else:
- flash('Invalid Password')
- return render_template('login.html')
- else:
- return abort(405)
- @app.route('/create_team', methods=['POST'])
- @login_required
- def create_team():
- global db_users
- if request.method == 'POST' and get_user()[1]=='admin':
- username=request.form['user']
- passwd=generate_password_hash(request.form['pass'])
- new_user={}
- new_user['user']=username
- new_user['password']=passwd
- new_user['score']=0
- new_user['status']={'tasks_done':[],'type_task':'social'}
- db_users.users.save(new_user)
- flash='DONE!'
- return redirect(url_for('admin'))
- else:
- flash='ERROR!'
- return redirect(url_for('admin'))
- return abort(405)
- @app.route('/create_valater', methods=['POST'])
- @login_required
- def create_valater():
- global db_users
- if request.method == 'POST' and get_user()[1]=='admin':
- username=request.form['user']
- passwd=generate_password_hash(request.form['pass'])
- task_id=request.form['id']
- new_val={}
- new_val['user']=username
- new_val['pass']=passwd
- new_val['task_id']=int(task_id)
- new_val['history']={}
- db_users.volonters.save(new_val)
- flash='DONE!'
- return redirect(url_for('admin'))
- else:
- flash='ERROR!'
- return redirect("/admin")
- return abort(405)
- @app.route('/create_task', methods=['POST'])
- @login_required
- def create_task():
- global db_users
- if request.method == 'POST' and get_user()[1]=='admin':
- new_task={}
- new_task['task_id']=int(request.form['task_id'])
- new_task['task_social']=request.form['task_social']
- new_task['task_social_text']=request.form['task_social_text']
- new_task['task_social_flag']=request.form['task_social_flag']
- new_task['task_social_score']=int(request.form['task_social_score'])
- new_task['task_tech']=request.form['task_tech']
- new_task['task_tech_text']=request.form['task_tech_text']
- new_task['task_tech_flag']=request.form['task_tech_flag']
- new_task['task_tech_score']=int(request.form['task_tech_score'])
- new_task['task_time']=1200
- db_users.tasks.save(new_task)
- flash='DONE!'
- return redirect(url_for('admin'))
- else:
- flash='ERROR!'
- return redirect("/admin")
- @app.route('/chek_flag',methods=['GET','POST'])
- @login_required
- def chek_flag():
- global db_users
- user=get_user()[1]
- status = db_users.users.find({'user':user})
- task_id=status[0]['status']['task_active']
- task=db_users.tasks.find_one({'task_id':task_id})
- if request.method == 'POST':
- status = db_users.users.find({'user':user})
- flag = request.form['flag']
- if status[0]['status']['type_task']=='social':
- if flag==task['task_social_flag']:
- status = db_users.users.find_one({'user':user})
- status["status"]={"tasks_done":status['status']['tasks_done'],"task_active":task_id,
- "type_task":"tech", "time":int(round(time.time() * 1000))+1000*60*20}
- db_users.users.save(status)
- return redirect('/tasks')
- if status[0]['status']['type_task']=='tech':
- timestemp=status[0]['status']['time']
- if int(round(time.time() * 1000)) < timestemp:
- if flag==task['task_tech_flag']:
- status = db_users.users.find_one({'user':user})
- score=task["task_tech_score"]
- user_score=status['score']
- status['score']=user_score+score
- status["status"]={"tasks_done":status['status']['tasks_done']+[task_id],
- "type_task":"social"}
- db_users.users.save(status)
- return redirect('/tasks')
- else:
- status = db_users.users.find_one({'user':user})
- print status['status']
- status["status"]={"tasks_done":status['status']['tasks_done']+[task_id], "type_task":"social"}
- db_users.users.save(status)
- return redirect('/tasks')
- return redirect('/tasks')
- else:
- return render_template('tasks.html')
- @app.route('/tasks', methods=['GET'])
- @login_required
- def tasks():
- global db_users
- if request.method == 'GET':
- user = get_user()[1]
- status = db_users.users.find({'user':user})
- #Если таски закончиличь, поздравим команду
- if len(status[0]["status"]["tasks_done"])==db_users.tasks.count():
- return render_template('tasks.html',task="Уменя больше нет для вас заданий".decode("utf-8"),
- task_text='Срочно следуйте к универистету! Все собираемся там и подводим результаты.'.decode("utf-8"),submit=False)
- if 'task_active' in status[0]['status']:
- task_id=status[0]['status']['task_active']
- task=db_users.tasks.find_one({'task_id':task_id})
- if status[0]['status']['type_task']=='social':
- return render_template('tasks.html',task=task['task_social'],
- task_text=task['task_social_text'],submit=True,tech=False)
- if status[0]['status']['type_task']=='tech':
- timestemp=status[0]['status']['time']
- print timestemp
- return render_template('tasks.html',task=task['task_tech'],
- task_text=task['task_tech_text'],submit=True,tech=timestemp)
- else:
- task_id=get_task(user)
- task=db_users.tasks.find_one({'task_id':task_id})
- status = db_users.users.find_one({'user':get_user()[1]})
- status["status"]={"tasks_done":status['status']['tasks_done'],"task_active":task_id,"type_task":"social"}
- db_users.users.save(status)
- return render_template('tasks.html',task=task['task_social'],
- task_text=task['task_social_text'],submit=True,tech=False)
- return redirect('tasks.html')
- else:
- return abort(405)
- @app.route('/scoreboard', methods=['GET'])
- def scoreboard():
- global db_users
- if request.method == 'GET':
- score = db_users.users.find({},{"user":1,"score":1,"_id":0}).sort("score",-1)
- return render_template('scoreboard.html',score=score)
- else:
- return abort(405)
- @app.route('/admin', methods=['GET','POST'])
- def admin():
- passwd='$2a$12$oJVE0j3tHAnyc2zM9A89YO11bNbfId7G.0za2dHp/TYDg0dDgbUYa'
- user='admin'
- form="""
- <!DOCTYPE html>
- <html lang="en">
- <body>
- <form class="login" action="/admin" method="post" autocomplete="off">
- <p>Login: <input type="text" name="user" /></p><br>
- <p>Password: <input type="password" name="pass" /></p>
- <input type="submit" value="Submit" />
- </form>
- </body>
- </html>
- """
- if request.method == 'GET' and get_user()[1]=='admin':
- if not get_user()[0]:
- return form
- else:
- return render_template('admin.html')
- if request.method == 'POST':
- username = request.form['user']
- password = request.form['pass']
- if username==user and check_password_hash(passwd, password):
- session_login(username)
- return render_template('admin.html')
- else:
- return form
- else:
- return form
- @app.route('/')
- def index():
- login,user=get_user()
- if login:
- return render_template('tasks.html')
- else:
- return render_template('login.html')
- if __name__ == '__main__':
- print
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement