Moona/moona/main.py

1072 lines
46 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import datetime
import logging
import os
from random import randint, choices
from threading import Timer
from flask import Flask, render_template, request, jsonify, make_response, session, url_for
from flask_login import LoginManager, login_user, logout_user, login_required, current_user
from flask_restful import abort
from waitress import serve
from werkzeug.utils import redirect
from data import db_session
from data.answer_quest import Answer
from data.app_school_user_point import UserPoint
from data.diary_post import DiaryPost
from data.like import Like
from data.popularity import Popularity
from data.questions import Quest
from data.users import User
from forms.add_question import AddQuest
from forms.answer_quest import AnswerQuest
from forms.login import LoginForm
from forms.point_user import PointForm
from forms.post import AddPost
from forms.register import RegisterForm, Confirmation
from post import mail
app = Flask(__name__)
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY', 'default_key_for_dev')
logging.basicConfig(filename='main.log')
login_manager = LoginManager()
login_manager.init_app(app)
help_arg = False
help_arg_2 = False
send_msg = False
secret_code = None
photo = None
user_email = ""
def remove_java():
global help_arg
os.remove(help_arg)
def norm_data(datatime, date_or_time, r=False):
if date_or_time == 'date':
return '.'.join(str(datatime).split()[0].split('-')[::-1])
elif date_or_time == 'time':
return ':'.join(str(datatime).split()[1].split(':')[0:2])
elif date_or_time == 'datetime':
date = '.'.join(str(datatime).split()[0].split('-')[::-1])
times = ':'.join(str(datatime).split()[1].split(':')[0:2])
datatimes = date + ' ' + times if r else times + ' ' + date
datatimes = datetime
return datatimes
def save_photo(photo, login, post=False, id_post=None):
if not post:
with open(f'static/app_image/users_photo/{login}_logo.png', 'wb') as f:
photo.save(f)
return f'static/app_image/users_photo/{login}_logo.png'
elif post and id_post is not None:
with open(f'static/app_image/post_photo/{login}_post_{id_post}.png', 'wb') as f:
photo.save(f)
return f'static/app_image/post_photo/{login}_post_{id_post}.png'
def secret_key():
return ''.join([str(randint(0, 9)) for i in range(5)])
@login_manager.user_loader
def load_user(user_id):
db_sess = db_session.create_session()
return db_sess.query(User).get(user_id)
@app.route('/')
def main_page():
return render_template('/main/main.html', title='Добро пожаловать')
@app.route('/login', methods=['GET', 'POST'])
def login():
if not current_user.is_authenticated:
redir = request.args.get('redir') if request.args.get('redir') else False
form = LoginForm()
if form.validate_on_submit():
db_sess = db_session.create_session()
user = db_sess.query(User).filter(User.email == form.email.data).first()
if user and user.check_password(form.password.data):
login_user(user, remember=form.remember_me.data)
if redir:
return redirect(f'/{redir}')
else:
return redirect('/')
return render_template('main/login.html',
message="Неправильный логин или пароль",
form=form)
return render_template('main/login.html', title='Авторизация', form=form, message='')
else:
return redirect('/')
@app.route('/register', methods=['GET', 'POST'])
def register():
if not current_user.is_authenticated:
form = RegisterForm()
form.simple = True
if form.validate_on_submit():
if form.password.data != form.password2.data:
return render_template('main/register.html', title='Регистрация',
form=form,
message="Пароли не совпадают")
data_session = db_session.create_session()
if data_session.query(User).filter(User.login == form.login.data).first():
return render_template('main/register.html', title='Регистрация',
form=form,
message="Такой пользователь уже есть")
if data_session.query(User).filter(User.email == form.email.data).first():
return render_template('main/register.html', title='Регистрация',
form=form,
message="Такая почта уже есть")
if form.photo.data:
photo = save_photo(form.photo.data, form.login.data)
else:
photo = False
session['ps'] = form.password.data
return redirect(
url_for('confirmation', photo=photo, name=form.name.data, surname=form.surname.data,
login=form.login.data,
birthday=form.birthday.data, about=form.about.data, email=form.email.data, form=True))
return render_template('main/register.html', title='Регистрация', form=form, message='')
else:
return redirect('/')
@app.route('/user/<string:login>', methods=['GET', 'POST'])
def profile(login):
if current_user.is_authenticated and current_user.login == login:
message = request.args.get('message') if request.args.get('message') else ''
form = RegisterForm()
if form.del_photo.data:
data_session = db_session.create_session()
user = data_session.query(User).filter(User.id == current_user.id).first()
os.remove(user.photo)
user.photo = '/static/img/None_logo.png'
data_session.commit()
data_session.close()
return redirect(f'/user/{login}')
if request.method == 'GET':
form.email.data = current_user.email
form.name.data = current_user.name
form.surname.data = current_user.surname
form.birthday.data = current_user.birthday
form.about.data = current_user.about
form.photo.data = current_user.photo if current_user.photo and 'None' not in current_user.photo else None
if form.submit2.data:
data_session = db_session.create_session()
user = data_session.query(User).filter(User.id == current_user.id).first()
if user:
if form.photo.data != current_user.photo:
if form.photo.data:
user.photo = save_photo(form.photo.data, login)
user.name = form.name.data
user.surname = form.surname.data
user.birthday = form.birthday.data
user.about = form.about.data
data_session.commit()
data_session.close()
if form.email.data != current_user.email:
if data_session.query(User).filter(User.email == form.email.data).first():
return redirect(f'/user/{login}?message=Такая почта уже есть')
session['ps'] = None
return redirect(
url_for('confirmation', email_conf=True, email=form.email.data, form=True)
)
return redirect(f'/user/{login}')
else:
abort(404)
return render_template('main/profile.html', title='Профиль', form=form, message=message)
elif current_user.is_authenticated and current_user.login != login:
pass
else:
return redirect('/login')
@app.route('/confirmation', methods=['GET', 'POST'])
def confirmation():
if request.args.get('form'):
app_school = request.args.get('app_school') if request.args.get('app_school') else False
email_conf = request.args.get('email_conf') if request.args.get('email_conf') else False
data_session = db_session.create_session()
form = RegisterForm(
name=request.args.get('name'),
surname=request.args.get('surname'),
login=request.args.get('login'),
birthday=request.args.get('birthday'),
about=request.args.get('about'),
email=request.args.get('email'),
password=session['ps']
)
session['photo'] = request.args.get('photo')
if 'send_msg' not in session:
session['secret_code'] = secret_key()
mail(f'Ваш секретный код: {session["secret_code"]}', form.email.data, 'Moona Код')
session['send_msg'] = True
else:
if not session['send_msg']:
if 'no_code' in session:
if not session['no_code']:
session['secret_code'] = secret_key()
mail(f'Ваш секретный код: {session["secret_code"]}', form.email.data, 'Moona Код')
session['send_msg'] = True
session['no_code'] = False
else:
session['secret_code'] = secret_key()
mail(f'Ваш секретный код: {session["secret_code"]}', form.email.data, 'Moona Код')
session['send_msg'] = True
session['send_msg'] = False
conf = Confirmation()
if conf.validate_on_submit():
if str(conf.code_key.data).strip() == str(session['secret_code']).strip():
if not email_conf:
if form.photo.data:
user = User(
name=form.name.data,
surname=form.surname.data,
login=form.login.data,
birthday=datetime.datetime.strptime(form.birthday.data, "%Y-%m-%d").date(),
about=form.about.data,
email=form.email.data,
photo=save_photo(session['photo'], form.login.data),
role='user'
)
else:
user = User(
name=form.name.data,
surname=form.surname.data,
login=form.login.data,
birthday=datetime.datetime.strptime(form.birthday.data, "%Y-%m-%d").date(),
about=form.about.data,
email=form.email.data,
role='user',
photo='/static/img/None_logo.png'
)
user.set_password(form.password.data)
data_session.add(user)
data_session.commit()
data_session.close()
session['send_msg'] = False
if app_school:
return redirect('/safeappschool/login')
else:
return redirect('/login')
else:
user = data_session.query(User).filter(User.id == current_user.id).first()
if user:
user.email = form.email.data
data_session.commit()
data_session.close()
return redirect(f'/user/{current_user.login}')
else:
abort(404)
else:
session['no_code'] = True
if app_school:
return render_template('safe_app_school/confirmation.html', title='Подтверждение', form=conf,
message='Коды не совпадают')
else:
return render_template('main/confirmation_reg.html', title='Подтверждение', form=conf,
message='Коды не совпадают')
else:
if app_school:
return render_template('safe_app_school/confirmation.html', title='Подтверждение', form=conf,
message='')
else:
return render_template('main/confirmation_reg.html', title='Подтверждение', form=conf, message='')
else:
return redirect('/')
@app.route('/logout')
@login_required
def logout():
path = request.args.get('path')
logout_user()
if not path:
return redirect("/")
else:
return redirect(f'/{path}')
@app.route('/safeappschool')
def safe_app_school():
return redirect('/safeappschool/main')
@app.route('/safeappschool/main', methods=['GET', 'POST'])
def safe_app_school_main():
if current_user.is_authenticated:
return render_template('safe_app_school/main.html', title='SafeAppSchool')
else:
return redirect('/safeappschool/login')
@app.route('/safeappschool/login', methods=['GET', 'POST'])
def safe_app_school_login():
if current_user.is_authenticated:
return redirect('/safeappschool/main')
else:
form = LoginForm()
if form.validate_on_submit():
db_sess = db_session.create_session()
user = db_sess.query(User).filter(User.email == form.email.data).first()
if user and user.check_password(form.password.data):
login_user(user, remember=form.remember_me.data)
return redirect('/safeappschool/main')
return render_template('/safe_app_school/login.html',
message="Неправильный логин или пароль",
form=form)
return render_template('/safe_app_school/login.html', title='Вход', form=form, message='')
@app.route('/safeappschool/register', methods=['GET', 'POST'])
def safe_app_school_register():
if current_user.is_authenticated:
return redirect('/safeappschool/main')
else:
form = RegisterForm()
form.simple = True
if form.validate_on_submit():
if form.password.data != form.password2.data:
return render_template('simple/simple_register.html', title='Регистрация',
form=form,
message="Пароли не совпадают")
data_session = db_session.create_session()
if data_session.query(User).filter(User.login == form.login.data).first():
return render_template('safe_app_school/register.html', title='Регистрация',
form=form,
message="Такой пользователь уже есть")
if data_session.query(User).filter(User.email == form.email.data).first():
return render_template('safe_app_school/register.html', title='Регистрация',
form=form,
message="Такая почта уже есть")
if form.photo.data:
photo = save_photo(form.photo.data, form.login.data)
else:
photo = False
session['ps'] = form.password.data
return redirect(
url_for('confirmation', photo=photo, name=form.name.data, surname=form.surname.data,
login=form.login.data,
birthday=form.birthday.data, about=form.about.data, email=form.email.data, form=True,
app_school=True))
return render_template('safe_app_school/register.html', title='Регистрация', form=form, message='')
@app.route('/safeappschool/about')
def safe_app_school_about():
if current_user.is_authenticated:
return render_template('safe_app_school/about.html')
else:
return redirect('/safe_app_school/login')
@app.route('/safeappschool/setting', methods=['GET', 'POST'])
def safe_app_school_setting():
if current_user.is_authenticated:
form = PointForm()
data_session = db_session.create_session()
point = data_session.query(UserPoint).filter(UserPoint.user == current_user.id).first()
if form.validate_on_submit():
if point:
point.school_address = form.school_address.data
point.home_address = form.home_address.data
else:
point = UserPoint(
user=current_user.id,
home_address=form.home_address.data,
school_address=form.school_address.data
)
data_session.add(point)
data_session.commit()
data_session.close()
return redirect('/safeappschool/main')
if point:
form.school_address.data = point.school_address
form.home_address.data = point.home_address
return render_template('safe_app_school/setting.html', form=form, message='')
else:
return redirect('/safe_app_school/login')
@app.route('/safeappschool/go/<string:point>')
def safe_app_school_go(point):
global help_arg
if current_user.is_authenticated:
data_session = db_session.create_session()
address = data_session.query(UserPoint).filter(UserPoint.user == current_user.id).first()
if address:
if address.school_address and address.home_address:
with open('static/js/safe_app_school/mapbasics_templates.js', 'r', encoding='utf-8') as file:
new_file = file.read().split('<point1>')
new_file = new_file[
0] + f'\'{str(address.home_address).strip() if point == "school" else str(address.school_address).strip()}\'' \
+ new_file[1]
new_file = new_file.split('<point2>')
new_file = new_file[
0] + f'\'{str(address.school_address).strip() if point == "school" else str(address.home_address).strip()}\'' + \
new_file[1]
with open(f'static/js/safe_app_school/{str(current_user.id)}mapbasics.js', 'w',
encoding='utf-8') as new_js:
new_js.write(new_file)
help_arg = f'static/js/safe_app_school/{str(current_user.id)}mapbasics.js'
t = Timer(15, remove_java, args=None, kwargs=None)
t.start()
if point == 'home':
return render_template('safe_app_school/route.html', title='Маршрут домой', route='домой',
path=help_arg)
elif point == 'school':
return render_template('safe_app_school/route.html', title='Маршрут в школу', route='в школу',
path=help_arg)
else:
return redirect('/safe_app_school/main')
else:
return render_template('safe_app_school/route.html', title='Маршрут не указан', route=False)
else:
return render_template('safe_app_school/route.html', title='Маршрут не указан', route=False)
else:
return redirect('/safe_app_school/login')
@app.route('/diary/')
def main_diary_page():
return render_template('diary/main.html', title='moona')
@app.route('/diary/edit_profile/<string:logins>', methods=['GET', 'POST'])
def edit_profile(logins):
if current_user.is_authenticated:
global photo
global help_arg
global help_arg_2
form = RegisterForm()
session = db_session.create_session()
ph_f = False
if 'None_logo' not in current_user.photo:
photo = current_user.photo
ph_f = True
else:
photo = None
if form.del_photo.data:
help_arg = photo
ph_f = False
if form.submit2.data:
user = session.query(User).filter(User.login == logins).first()
if user.email != form.email.data:
if session.query(User).filter(User.email == form.email.data).first():
if not form.photo.data and help_arg:
help_arg = False
return render_template('diary/edit_profile.html', title='Редактирование профиля', form=form,
ph_f=ph_f,
message="Такая почта уже есть")
else:
help_arg = True
help_arg_2 = form.email.data
return redirect('/diary/confirmation')
user.name = form.name.data
user.surname = form.surname.data
user.birthday = form.birthday.data
user.about = form.about.data
photo = '../../static/img/None_logo.png'
if not ph_f and form.photo.data:
photo = save_photo(form.photo.data, logins)
if help_arg == photo:
os.remove(help_arg)
help_arg = False
photo = '../../static/img/None_logo.png'
user.photo = photo
session.commit()
if user.email == form.email.data:
return redirect('/diary/profile')
else:
help_arg_2 = form.email.data
help_arg = False
return redirect('/diary/confirmation')
if request.method == "GET":
if current_user.login == logins:
form.email.data = current_user.email
form.name.data = current_user.name
form.surname.data = current_user.surname
form.login.data = logins
form.birthday.data = current_user.birthday
form.about.data = current_user.about
form.password.data = None
form.password2.data = None
if not form.photo.data and help_arg:
help_arg = False
return render_template('diary/edit_profile.html', title='Редактирование профиля', form=form, message='',
ph_f=ph_f)
else:
return redirect('/diary/login')
@app.route('/diary/profile')
def diary_profile():
if current_user.is_authenticated:
global help_arg_2
db_sess = db_session.create_session()
pub_post = db_sess.query(DiaryPost).filter(DiaryPost.author == current_user.id, DiaryPost.public == 1).all()
pub_post = pub_post[::-1]
emotion_pub = []
for i in pub_post:
emotion = {id: i.id, 'pos_emot': [], 'nig_emot': [], 'link': [], 'like': None, 'is_like': 0,
'author': current_user}
if i.pos_emot:
emotion['pos_emot'] = i.pos_emot.split()
else:
emotion['pos_emot'] = None
if i.nig_emot:
emotion['nig_emot'] = i.nig_emot.split()
else:
emotion['nig_emot'] = None
if i.link:
emotion['link'] = i.link.split()
else:
emotion['link'] = None
like = db_sess.query(Like).filter(Like.post == i.id).all()
if like:
emotion['like'] = len(like)
if db_sess.query(Like).filter(Like.post == i.id, Like.user == current_user.id).first():
emotion['is_like'] = 1
emotion_pub.append(emotion)
message = 'Ваша почта успешно изменена!' if help_arg_2 == 'EditEmail' else ''
if help_arg_2:
help_arg_2 = False
return render_template('diary/profile.html', title='Профиль', pub_post=pub_post, emotion_pub=emotion_pub,
message=message)
else:
return redirect('/diary/login')
@app.route('/diary/new_like/<int:user_id>/<int:post_id>/<string:ret_href>')
def new_like(user_id, post_id, ret_href):
if current_user.is_authenticated:
session = db_session.create_session()
find = session.query(Like).filter(Like.post == post_id, Like.user == user_id).first()
if find:
if (find.date - datetime.datetime.now()).days <= 30:
pop = session.query(Popularity).filter(Popularity.post == post_id).first()
pop.popularity = 10 * sum(1 if (i.date - datetime.datetime.now()).days <= 30 else 0 for i in
session.query(Like).filter(Like.post == post_id).all()) - 10
if not pop.popularity:
session.delete(pop)
session.delete(find)
session.commit()
if ret_href != 'main':
return redirect(f"/diary/{ret_href}")
else:
return redirect('/diary/')
else:
popular = session.query(Popularity).filter(Popularity.post == post_id).first()
if not popular:
pop = Popularity()
pop.post = post_id
pop.popularity = 10
pop.edit_date = datetime.datetime.now()
session.add(pop)
else:
popular.popularity += 10
like = Like()
like.user = user_id
like.post = post_id
like.date = datetime.datetime.now()
session.add(like)
session.commit()
if ret_href != 'main':
return redirect(f"/diary/{ret_href}")
else:
return redirect('/diary/')
else:
return redirect('/diary/')
@app.route('/diary/publications', methods=['GET', 'POST'])
def publications():
session = db_session.create_session()
fresh_posts_betta = session.query(DiaryPost).filter(DiaryPost.public == 1).all()[::-1]
day, posts = 7, 20
fresh_posts = []
for i in fresh_posts_betta:
copy_pos = fresh_posts_betta[::]
if abs((i.date - datetime.datetime.now()).days) <= day:
fresh_posts.append(copy_pos.pop(copy_pos.index(i)))
while len(fresh_posts) < posts < len(fresh_posts) + len(fresh_posts_betta):
copy_pos = fresh_posts_betta[::]
day += 1
posts -= 5
for i in fresh_posts_betta:
if abs((i.date - datetime.datetime.now()).days) <= day:
fresh_posts.append(copy_pos.pop(copy_pos.index(i)))
emotion_fresh = []
if fresh_posts:
for i in fresh_posts:
emotion = {id: i.id, 'pos_emot': [], 'nig_emot': [], 'link': [],
'author': session.query(User).filter(User.id == i.author).first(), 'like': None, 'is_like': 0}
if i.pos_emot:
emotion['pos_emot'] = i.pos_emot.split()
else:
emotion['pos_emot'] = None
if i.nig_emot:
emotion['nig_emot'] = i.nig_emot.split()
else:
emotion['nig_emot'] = None
if i.link:
emotion['link'] = i.link.split()
else:
emotion['link'] = None
like = session.query(Like).filter(Like.post == i.id).all()
if like:
emotion['like'] = len(like)
if current_user.is_authenticated:
if session.query(Like).filter(Like.post == i.id, Like.user == current_user.id).first():
emotion['is_like'] = 1
emotion_fresh.append(emotion)
pop = sorted(session.query(Popularity).all(), key=lambda x: x.popularity, reverse=True)
if pop:
if len(pop) > 50:
pop = pop[:50]
pop_post = list(
map(lambda x: session.query(DiaryPost).filter(DiaryPost.public == 1, DiaryPost.id == x.post).first(), pop))
emotion_pop = []
for i in pop_post:
logging.warning(f'{datetime.datetime.now()}:{i} - i_pop_post')
emotion = {id: i.id, 'pos_emot': [], 'nig_emot': [], 'link': [],
'author': session.query(User).filter(User.id == i.author).first(), 'like': None,
'is_like': 0}
if i.pos_emot:
emotion['pos_emot'] = i.pos_emot.split()
else:
emotion['pos_emot'] = None
if i.nig_emot:
emotion['nig_emot'] = i.nig_emot.split()
else:
emotion['nig_emot'] = None
if i.link:
emotion['link'] = i.link.split()
else:
emotion['link'] = None
like = session.query(Like).filter(Like.post == i.id).all()
if like:
emotion['like'] = len(like)
if current_user.is_authenticated:
if session.query(Like).filter(Like.post == i.id, Like.user == current_user.id).first():
emotion['is_like'] = 1
emotion_pop.append(emotion)
else:
pop_post = []
emotion_pop = []
for_you = sorted(session.query(DiaryPost).filter(DiaryPost.public == 1).all(),
key=lambda x: (len(x.text), 1 if x.photo else 0, -(x.date - datetime.datetime.now()).days))
if len(for_you) > 50:
for_you_post = choices(for_you, k=50)
else:
for_you_post = set(for_you)
emotion_for_you = []
for i in for_you_post:
emotion = {id: i.id, 'pos_emot': [], 'nig_emot': [], 'link': [],
'author': session.query(User).filter(User.id == i.author).first(), 'like': None, 'is_like': 0}
if i.pos_emot:
emotion['pos_emot'] = i.pos_emot.split()
else:
emotion['pos_emot'] = None
if i.nig_emot:
emotion['nig_emot'] = i.nig_emot.split()
else:
emotion['nig_emot'] = None
if i.link:
emotion['link'] = i.link.split()
else:
emotion['link'] = None
like = session.query(Like).filter(Like.post == i.id).all()
if like:
emotion['like'] = len(like)
if current_user.is_authenticated:
if session.query(Like).filter(Like.post == i.id, Like.user == current_user.id).first():
emotion['is_like'] = 1
emotion_for_you.append(emotion)
return render_template('diary/publications.html', fresh_post=fresh_posts, emotion_fresh=emotion_fresh,
title='Публикации',
pop_post=pop_post, emotion_pop=emotion_pop, for_you_post=for_you_post,
emotion_for_you=emotion_for_you)
@app.route('/diary/answer_quest/<int:id>', methods=['GET', 'POST'])
def answer_quest(id):
if current_user.is_authenticated:
session = db_session.create_session()
answer = AnswerQuest()
quest = session.query(Quest).filter(Quest.id == id).first()
if request.method == 'GET':
if session.query(Answer).filter(Answer.id_question == id, Answer.user == current_user.id).first():
ans_quest = session.query(Answer).filter(Answer.id_question == id,
Answer.user == current_user.id).first()
answer.answer.data = ans_quest.answer
if answer.validate_on_submit():
if not session.query(Answer).filter(Answer.id_question == id, Answer.user == current_user.id).first():
answer_user = Answer(id_question=id,
answer=answer.answer.data,
user=current_user.id,
date=datetime.date.today())
quest.one_used = True
if len(session.query(Answer).filter(Answer.id_question == id).all()) == len(session.query(User).all()):
quest.all_used = True
session.add(answer_user)
session.commit()
return redirect('/diary/diary')
else:
ans_quest = session.query(Answer).filter(Answer.id_question == id).first()
ans_quest.answer = answer.answer.data
session.commit()
return redirect('/diary/diary')
return render_template('diary/answer_quest.html', tetle='Ответ на вопрос', form=answer, message='', quest=quest)
else:
return redirect('/diary/')
@app.route('/diary/delete_quest/<int:id>', methods=['GET', 'POST'])
def delete_quest(id):
if current_user.is_authenticated:
session = db_session.create_session()
pos = session.query(Quest).filter(Quest.id == id).first()
if pos:
session.delete(pos)
session.commit()
else:
abort(404)
return redirect('/diary/add_question')
else:
return redirect('/diary/')
@app.route('/diary/add_question', methods=['GET', 'POST'])
def add_question():
if current_user.is_authenticated:
if current_user.role == 'admin':
que = AddQuest()
session = db_session.create_session()
if que.validate_on_submit():
if que.quest.data in list(map(lambda x: x.quest, session.query(Quest).all())):
return render_template('diary/add_question.html', message='Такой вопрос уже есть!',
title='Добавить вопрос',
form=que)
new_que = Quest()
new_que.quest = que.quest.data.strip()
session.add(new_que)
session.commit()
que.quest.data = ''
return render_template('diary/add_question.html', message='', title='Добавить вопрос', form=que,
question=session.query(Quest).all())
else:
return redirect('/diary/')
else:
return redirect('/diary/')
@app.route('/diary/post/<int:id>', methods=['GET', 'POST'])
def post_edit(id):
if current_user.is_authenticated:
session = db_session.create_session()
find_post = session.query(DiaryPost).filter(DiaryPost.id == id).first()
if find_post:
if find_post.author == current_user.id:
global photo
global help_arg
post_ed = AddPost()
ph_f = False
if post_ed.del_photo.data:
help_arg = photo
photo = None
if request.method == "GET":
session = db_session.create_session()
post_exc = session.query(DiaryPost).filter(DiaryPost.id == id,
DiaryPost.author == current_user.id).first()
if post_exc:
post_ed.name.data = post_exc.name
post_ed.text.data = post_exc.text
post_ed.public.data = post_exc.public
post_ed.pos_emot.data = post_exc.pos_emot
post_ed.nig_emot.data = post_exc.nig_emot
post_ed.link.data = post_exc.link
if post_exc.photo:
photo = post_exc.photo
ph_f = True
else:
photo = None
else:
abort(404)
if post_ed.validate_on_submit() and not post_ed.del_photo.data:
session = db_session.create_session()
post_exc = session.query(DiaryPost).filter(DiaryPost.id == id,
DiaryPost.author == current_user.id).first()
if post_exc:
post_exc.name = post_ed.name.data
post_exc.text = post_ed.text.data
post_exc.public = post_ed.public.data
post_exc.pos_emot = post_ed.pos_emot.data
post_exc.nig_emot = post_ed.nig_emot.data
post_exc.link = post_ed.link.data
if help_arg:
os.remove(help_arg)
help_arg = False
if post_ed.photo.data:
post_exc.photo = save_photo(post_ed.photo.data, current_user.login, post=True,
id_post=post_exc.id)
else:
post_exc.photo = photo
check_pop = session.query(Popularity).filter(Popularity.post == post_exc.id).first()
if not post_ed.public.data and check_pop:
session.delete(check_pop)
session.commit()
return redirect('/diary/diary')
else:
abort(404)
return render_template('diary/post.html', form=post_ed, message='', title='Изменить запись', pht=ph_f)
else:
return redirect('/diary/diary')
else:
return redirect('/diary/diary')
else:
return redirect('/diary/login')
@app.route('/diary/post_deleted/<int:id>', methods=['GET', 'POST'])
def post_deleted(id):
if current_user.is_authenticated:
session = db_session.create_session()
find_post = session.query(DiaryPost).filter(DiaryPost.id == id).first()
if find_post:
if find_post.author == current_user.id or current_user.role == 'admin':
session = db_session.create_session()
pos = session.query(DiaryPost).filter(DiaryPost.id == id).first()
if pos:
if pos.photo:
os.remove(pos.photo)
likes = session.query(Like).filter(Like.post == pos.id).all()
if likes:
list(map(lambda i: session.delete(i), likes))
pop = session.query(Popularity).filter(Popularity.post == pos.id).first()
if pop:
session.delete(pop)
session.delete(pos)
session.commit()
else:
abort(404)
return redirect('/diary/diary')
else:
return redirect('/diary/diary')
else:
return redirect('/diary/diary')
else:
return redirect('/diary/login')
@app.route('/diary/add_post', methods=['GET', 'POST'])
def add_post():
if current_user.is_authenticated:
pos = AddPost()
session = db_session.create_session()
if pos.validate_on_submit():
try:
id = session.query(DiaryPost).order_by(DiaryPost.id)[-1].id
if id:
id += 1
else:
id = -1
except Exception:
id = -1
if pos.photo.data:
diart_pos = DiaryPost(name=pos.name.data,
text=pos.text.data,
author=current_user.id,
date=datetime.datetime.now(),
photo=save_photo(pos.photo.data, current_user.login, post=True, id_post=id),
public=pos.public.data,
pos_emot=pos.pos_emot.data,
nig_emot=pos.nig_emot.data,
link=pos.link.data)
session.add(diart_pos)
session.commit()
return redirect("/diary/diary")
else:
diart_pos = DiaryPost(name=pos.name.data,
text=pos.text.data,
author=current_user.id,
date=datetime.datetime.now(),
public=pos.public.data,
pos_emot=pos.pos_emot.data,
nig_emot=pos.nig_emot.data,
link=pos.link.data)
session.add(diart_pos)
session.commit()
return redirect("/diary/diary")
return render_template('diary/post.html', form=pos, title='Новый пост', message='')
else:
return redirect('/diary/login')
@app.route('/diary/diary', methods=['GET', 'POST'])
def diary():
db_sess = db_session.create_session()
if current_user.is_authenticated:
posts = db_sess.query(DiaryPost).filter(DiaryPost.author == current_user.id).all()
posts = posts[::-1]
pub_post = db_sess.query(DiaryPost).filter(DiaryPost.author == current_user.id, DiaryPost.public == 1).all()
pub_post = pub_post[::-1]
emotion_pub = []
for i in pub_post:
emotion = {id: i.id, 'pos_emot': [], 'nig_emot': [], 'link': [], 'like': None, 'is_like': 0}
if i.pos_emot:
emotion['pos_emot'] = i.pos_emot.split()
else:
emotion['pos_emot'] = None
if i.nig_emot:
emotion['nig_emot'] = i.nig_emot.split()
else:
emotion['nig_emot'] = None
if i.link:
emotion['link'] = i.link.split()
else:
emotion['link'] = None
like = db_sess.query(Like).filter(Like.post == i.id).all()
if like:
emotion['like'] = len(like)
if db_sess.query(Like).filter(Like.post == i.id, Like.user == current_user.id).first():
emotion['is_like'] = 1
emotion_pub.append(emotion)
lis_emotion = []
for i in posts:
emotion = {id: i.id, 'pos_emot': [], 'nig_emot': [], 'link': []}
if i.pos_emot:
emotion['pos_emot'] = i.pos_emot.split()
else:
emotion['pos_emot'] = None
if i.nig_emot:
emotion['nig_emot'] = i.nig_emot.split()
else:
emotion['nig_emot'] = None
if i.link:
emotion['link'] = i.link.split()
else:
emotion['link'] = None
lis_emotion.append(emotion)
quest = db_sess.query(Answer).filter(Answer.user == current_user.id).all()
try:
days_reg = current_user.data_reg - datetime.date.today()
days_reg = abs(days_reg.days) + 1
if quest:
post_quest = db_sess.query(Quest).filter(Quest.id.in_([i.id_question for i in quest])).all()
else:
post_quest = []
max_quests = len(db_sess.query(Quest).all())
while len(post_quest) < days_reg and max_quests > len(post_quest):
post_quest.append(
db_sess.query(Quest).filter(Quest.id.notin_([i.id for i in post_quest])).first())
ans = []
for i in post_quest:
if i is not None:
ans_id = db_sess.query(Answer).filter(
Answer.id_question == i.id, Answer.user == current_user.id).first()
if ans_id is not None:
ans.append(ans_id)
post_quest = post_quest[::-1]
ans = ans[::-1]
ans2 = {}
for i in ans:
ans2[i.id_question] = i
except Exception as e:
ans2 = []
else:
posts = None
post_quest = None
ans2 = None
lis_emotion = None
emotion_pub = None
pub_post = None
return render_template('diary/diary.html', title='Дневник', my_post=posts, message='', question=post_quest,
ans=ans2, emotion=lis_emotion, emotion_pub=emotion_pub, pub_post=pub_post)
@app.route('/diary/logout')
@login_required
def diary_logout():
logout_user()
return redirect("/diary/")
@app.route('/diary/about_us')
def about():
return render_template('diary/about.html', title='О нас')
@app.route('/school_app_check_auth', methods=['POST'])
def check_auth():
req = request.json
email = req['login']
password = req['password']
session = db_session.create_session()
user = session.query(User).filter(User.email == email).first()
if user:
if user.check_password(password) or user.check_hash_password(password):
return make_response(jsonify({
'key': open('key.txt', 'r', encoding='utf-8').read(),
'name': user.name,
'surname': user.surname,
'login': user.login,
'hash': user.password
}), 200)
else:
return abort(403)
else:
return abort(404)
@app.route('/simple/can_close')
def can_close():
return render_template('simple/simple_can_close.html', title='Можете закрыть страницу')
@app.route('/simple/register', methods=['GET', 'POST'])
def school_reg():
global help_arg
global photo
form = RegisterForm()
form.simple = True
if form.validate_on_submit():
if form.password.data != form.password2.data:
return render_template('simple/simple_register.html', title='Регистрация',
form=form,
message="Пароли не совпадают")
session = db_session.create_session()
if session.query(User).filter(User.login == form.login.data).first():
return render_template('simple/simple_register.html', title='Регистрация',
form=form,
message="Такой пользователь уже есть")
if session.query(User).filter(User.email == form.email.data).first():
return render_template('simple/simple_register.html', title='Регистрация',
form=form,
message="Такая почта уже есть")
help_arg = form
if form.photo.data:
photo = save_photo(form.photo.data, form.login.data)
return redirect('/diary/confirmation')
return render_template('simple/simple_register.html', title='Регистрация', form=form, message='')
def main():
db_session.global_init("db/moona_data.db")
try:
serve(app, host='0.0.0.0', port=5000)
except Exception as error:
logging.warning(f'{datetime.datetime.now()}:{error}')
# после запуска переходите по ссылке http://127.0.0.1:5000/ в вашем браузере
if __name__ == '__main__':
main()