Начал делать изменение профиля

This commit is contained in:
Андрей Дувакин 2022-12-16 23:54:24 +05:00
parent 158409f158
commit 89bb80c73c
17 changed files with 1185 additions and 865 deletions

15
forms/edit_profile.py Normal file
View File

@ -0,0 +1,15 @@
from flask_wtf import FlaskForm
from flask_wtf.file import FileAllowed
from wtforms import EmailField, StringField, TextAreaField, FileField, SubmitField, DateField
from wtforms.validators import DataRequired
class EditProfileForm(FlaskForm):
email = EmailField('Почта', validators=[DataRequired()])
name = StringField('Имя', validators=[DataRequired()])
surname = StringField('Фамилия', )
about = TextAreaField('Расскажите о себе', default='')
birthday = DateField('Дата рождения')
photo = FileField('Фото', validators=[FileAllowed(['jpg', 'png', 'bmp'], 'Только фотографии!')])
del_photo = SubmitField('Удалить фотографию')
submit = SubmitField('Сохранить')

View File

@ -1,6 +1,6 @@
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from flask_wtf.file import FileAllowed from flask_wtf.file import FileAllowed
from wtforms import EmailField, StringField, PasswordField, SubmitField, FileField, DateField, TextAreaField from wtforms import EmailField, StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired from wtforms.validators import DataRequired

View File

@ -1,37 +1,37 @@
import smtplib import smtplib
from email.message import EmailMessage from email.message import EmailMessage
def check_password(password=''): def check_password(password=''):
smb = 'qwertyuiopasdfghjklzxcvbnm' smb = 'qwertyuiopasdfghjklzxcvbnm'
if len(password) < 6: if len(password) < 6:
return 'Пароль должен быть длиннее 6 символов' return 'Пароль должен быть длиннее 6 символов'
elif False in [True if i.isalpha() and i.lower() in smb or i.isdigit() else False for i in password]: elif False in [True if i.isalpha() and i.lower() in smb or i.isdigit() else False for i in password]:
return 'Пароль может содержать только буквы латинского алфавита и цифры' return 'Пароль может содержать только буквы латинского алфавита и цифры'
elif True not in [True if i.isdigit() else False for i in password]: elif True not in [True if i.isdigit() else False for i in password]:
return 'Пароль должен содержать буквы разного регистра и цифры' return 'Пароль должен содержать буквы разного регистра и цифры'
elif False not in [True if i.islower() and i.isalpha() else False for i in password]: elif False not in [True if i.islower() and i.isalpha() else False for i in password]:
return 'Пароль должен содержать буквы разного регистра и цифры' return 'Пароль должен содержать буквы разного регистра и цифры'
else: else:
return 'OK' return 'OK'
def mail(msg, to, topic='Подтверждение почты'): def mail(msg, to, topic='Подтверждение почты'):
file = open('mail.incepted', 'r', encoding='utf-8').readline().split() file = open('mail.incepted', 'r', encoding='utf-8').readline().split()
login, password = file[0], file[1] login, password = file[0], file[1]
email_server = "smtp.yandex.ru" email_server = "smtp.yandex.ru"
sender = "incepted@yandex.ru" sender = "incepted@yandex.ru"
em = EmailMessage() em = EmailMessage()
em.set_content(msg) em.set_content(msg)
em['To'] = to em['To'] = to
em['From'] = sender em['From'] = sender
em['Subject'] = topic em['Subject'] = topic
mailServer = smtplib.SMTP(email_server) mailServer = smtplib.SMTP(email_server)
mailServer.set_debuglevel(1) mailServer.set_debuglevel(1)
mailServer.ehlo() mailServer.ehlo()
mailServer.starttls() mailServer.starttls()
mailServer.ehlo() mailServer.ehlo()
mailServer.login(login, password) mailServer.login(login, password)
mailServer.ehlo() mailServer.ehlo()
mailServer.send_message(em) mailServer.send_message(em)
mailServer.quit() mailServer.quit()

328
main.py
View File

@ -1,133 +1,195 @@
import datetime import datetime
import os
from flask import Flask, render_template, request, url_for
from flask_login import login_user, current_user, LoginManager, logout_user, login_required from flask import Flask, render_template, request, url_for
from werkzeug.utils import redirect from flask_login import login_user, current_user, LoginManager, logout_user, login_required
from itsdangerous import URLSafeTimedSerializer, SignatureExpired from werkzeug.datastructures import CombinedMultiDict
from werkzeug.utils import redirect
from functions import check_password, mail from itsdangerous import URLSafeTimedSerializer, SignatureExpired
from forms.login import LoginForm
from forms.register import RegisterForm from functions import check_password, mail
from data.users import User from forms.edit_profile import EditProfileForm
from waitress import serve from forms.login import LoginForm
from data import db_session from forms.register import RegisterForm
from data.users import User
app = Flask(__name__) from waitress import serve
key = 'test_secret_key' from data import db_session
app.config['SECRET_KEY'] = key
s = URLSafeTimedSerializer(key) app = Flask(__name__)
login_manager = LoginManager() key = 'test_secret_key'
login_manager.init_app(app) app.config['SECRET_KEY'] = key
s = URLSafeTimedSerializer(key)
login_manager = LoginManager()
@app.route('/') login_manager.init_app(app)
def base():
return render_template('main.html', title='Главная')
@app.route('/')
def base():
@login_manager.user_loader if not current_user.is_authenticated:
def load_user(user_id): return render_template('main.html', title='Главная')
db_sess = db_session.create_session() else:
return db_sess.query(User).get(user_id) return redirect('/project')
@app.route('/login', methods=['GET', 'POST']) @app.route('/project')
def login(): def project():
if not current_user.is_authenticated: if current_user.is_authenticated:
message = request.args.get('message') if request.args.get('message') else '' return redirect(f'/profile')
danger = request.args.get('danger') if request.args.get('danger') else False else:
form = LoginForm() return redirect('/login')
if form.validate_on_submit():
db_sess = db_session.create_session()
user = db_sess.query(User).filter(User.email == form.login.data).first() @app.route('/profile', methods=['GET', 'POST'])
if user and user.check_password(form.password.data): def profile():
if user.activated: if current_user.is_authenticated:
login_user(user, remember=form.remember_me.data) form = EditProfileForm(
return redirect('/') CombinedMultiDict((request.files, request.form)),
else: email=current_user.email,
return render_template('login.html', name=current_user.name,
message="Ваша почта не подтверждена", surname=current_user.surname,
danger=True, about=current_user.about,
form=form) birthday=current_user.birthday
return render_template('login.html', )
message="Неправильный логин или пароль", if form.del_photo.data:
danger=True, data_session = db_session.create_session()
form=form) user = data_session.query(User).filter(User.id == current_user.id).first()
return render_template('login.html', title='Авторизация', form=form, message=message, if not user:
danger=danger) return render_template('profile.html', title='Профиль', form=form,
else: message='Ошибка, пользователь ненайден')
return redirect('/') os.remove(current_user.photo)
user.photo = 'static/images/none_logo.png'
data_session.commit()
@app.route('/logout') data_session.close()
@login_required if form.validate_on_submit():
def logout(): data_session = db_session.create_session()
logout_user() user = data_session.query(User).filter(User.id == current_user.id).first()
return redirect("/") if not user:
return render_template('profile.html', title='Профиль', form=form,
message='Ошибка, пользователь ненайден')
@app.route('/register', methods=['GET', 'POST']) if form.email.data != current_user.email:
def register(): pass
if not current_user.is_authenticated: if form.photo.data:
form = RegisterForm() with open(f'static/app_files/user_logo/{current_user.login}.png', 'wb') as file:
if form.validate_on_submit(): form.photo.data.save(file)
data_session = db_session.create_session() user.photo = f'static/app_files/user_logo/{current_user.login}.png'
if data_session.query(User).filter(User.login == form.login.data).first(): user.name = form.name.data
return render_template('register.html', form=form, message="Такой пользователь уже есть", user.surname = form.surname.data
title='Регистрация') user.about = form.about.data
if data_session.query(User).filter(User.email == form.email.data).first(): user.birthday = form.birthday.data
return render_template('register.html', form=form, message="Такая почта уже есть", title='Регистрация') data_session.commit()
status_password = check_password(form.password.data) data_session.close()
if status_password != 'OK': return redirect('/profile')
return render_template('register.html', form=form, message=status_password, title='Регистрация') return render_template('profile.html', title='Профиль', form=form, message='')
user = User( else:
email=form.email.data, return redirect('/login')
name=form.name.data,
login=form.login.data,
activity=datetime.datetime.now() @login_manager.user_loader
) def load_user(user_id):
user.set_password(form.password.data) db_sess = db_session.create_session()
data_session.add(user) return db_sess.query(User).get(user_id)
data_session.commit()
data_session.close()
token = s.dumps(form.email.data) @app.route('/login', methods=['GET', 'POST'])
link_conf = url_for('confirmation', token=token, _external=True) def login():
mail(f'Для завершения регистрации пройдите по ссылке: {link_conf}', form.email.data, if not current_user.is_authenticated:
'Подтверждение регистрации') message = request.args.get('message') if request.args.get('message') else ''
return redirect('/login?message=Мы выслали ссылку для подтверждения почты') danger = request.args.get('danger') if request.args.get('danger') else False
return render_template('register.html', form=form, message='', title='Регистрация') form = LoginForm()
else: if form.validate_on_submit():
return redirect('/') db_sess = db_session.create_session()
user = db_sess.query(User).filter(User.email == form.login.data).first()
if user and user.check_password(form.password.data):
@app.route('/confirmation/<token>') if user.activated:
def confirmation(token): login_user(user, remember=form.remember_me.data)
try: return redirect('/')
user_email = s.loads(token, max_age=86400) else:
data_session = db_session.create_session() return render_template('login.html',
user = data_session.query(User).filter(User.email == user_email).first() message="Ваша почта не подтверждена",
if user: danger=True,
user.activated = True form=form)
data_session.commit() return render_template('login.html',
data_session.close() message="Неправильный логин или пароль",
return redirect('/login?message=Почта успешно подтверждена') danger=True,
else: form=form)
return redirect('/login?message=Пользователь не найден&danger=True') return render_template('login.html', title='Авторизация', form=form, message=message,
except SignatureExpired: danger=danger)
data_session = db_session.create_session() else:
users = data_session.query(User).filter( return redirect('/project')
User.activated == 0 and User.activated < datetime.datetime.now() - datetime.timedelta(days=1)).all()
if users:
list(map(lambda x: data_session.delete(x), users)) @app.route('/logout')
data_session.commit() @login_required
data_session.close() def logout():
return redirect('/login?message=Срок действия ссылки истек, данные удалены&danger=True') logout_user()
return redirect("/")
def main():
db_session.global_init("db/incepted.db") @app.route('/register', methods=['GET', 'POST'])
serve(app, host='0.0.0.0', port=5000) def register():
if not current_user.is_authenticated:
form = RegisterForm()
if __name__ == '__main__': if form.validate_on_submit():
main() data_session = db_session.create_session()
if data_session.query(User).filter(User.login == form.login.data).first():
return render_template('register.html', form=form, message="Такой пользователь уже есть",
title='Регистрация')
if data_session.query(User).filter(User.email == form.email.data).first():
return render_template('register.html', form=form, message="Такая почта уже есть", title='Регистрация')
status_password = check_password(form.password.data)
if status_password != 'OK':
return render_template('register.html', form=form, message=status_password, title='Регистрация')
user = User(
email=form.email.data,
name=form.name.data,
login=form.login.data,
activity=datetime.datetime.now(),
data_reg=datetime.date.today(),
photo='static/images/none_logo.png',
role='user'
)
user.set_password(form.password.data)
data_session.add(user)
data_session.commit()
data_session.close()
token = s.dumps(form.email.data)
link_conf = url_for('confirmation', token=token, _external=True)
mail(f'Для завершения регистрации пройдите по ссылке: {link_conf}', form.email.data,
'Подтверждение регистрации')
return redirect('/login?message=Мы выслали ссылку для подтверждения почты')
return render_template('register.html', form=form, message='', title='Регистрация')
else:
return redirect('/project')
@app.route('/confirmation/<token>')
def confirmation(token):
try:
user_email = s.loads(token, max_age=86400)
data_session = db_session.create_session()
user = data_session.query(User).filter(User.email == user_email).first()
if user:
user.activated = True
data_session.commit()
data_session.close()
return redirect('/login?message=Почта успешно подтверждена')
else:
return redirect('/login?message=Пользователь не найден&danger=True')
except SignatureExpired:
data_session = db_session.create_session()
users = data_session.query(User).filter(
User.activated == 0 and User.activated < datetime.datetime.now() - datetime.timedelta(days=1)).all()
if users:
list(map(lambda x: data_session.delete(x), users))
data_session.commit()
data_session.close()
return redirect('/login?message=Срок действия ссылки истек, данные удалены&danger=True')
def main():
db_session.global_init("db/incepted.db")
serve(app, host='0.0.0.0', port=5000)
if __name__ == '__main__':
main()

View File

@ -1,51 +1,91 @@
html { html {
background-color: #fdf5e6; background-color: #fdf5e6;
height: 100%; height: 100%;
} }
body { body {
min-height: 100%; min-height: 100%;
} }
.navbar { .navbar {
background-color: #dcb495; background-color: #dcb495;
display: inline-flex; display: inline-flex;
height: 8vw; height: 8vw;
} }
#navbar { #navbar {
position: fixed; position: fixed;
width: 100%; width: 100%;
transition: top 0.3s; transition: top 0.3s;
opacity: .9; opacity: .9;
border-bottom: 1px solid #bf9c81; border-bottom: 1px solid #bf9c81;
} }
.auth_button { .auth_button {
color: #ffffff; color: #ffffff;
font-size: 1.5vw; font-size: 1.5vw;
transition: color 0.5s ease-in, border-bottom 0.5s ease-in; transition: color 0.5s ease-in, border-bottom 0.5s ease-in;
} }
.auth_button:hover { .auth_button:hover {
color: #694a2d; color: #694a2d;
border-bottom: 3px solid #f3c79e; border-bottom: 3px solid #f3c79e;
text-decoration: none; text-decoration: none;
} }
.footer { .footer {
background-color: #171717; background-color: #171717;
height: 15vw; height: 15vw;
} }
.footer_block { .footer_block {
height: 100%; height: 100%;
width: 90%; width: 90%;
margin-left: 5%; margin-left: 5%;
display: flex; display: flex;
align-content: center; align-content: center;
align-items: center; align-items: center;
} }
.footer_logo, .nav_logo { .footer_logo, .nav_logo {
width: 7vw; width: 7vw;
height: 6vw; height: 6vw;
} }
.footer_rights { .footer_rights {
color: #ffffff; color: #ffffff;
font-size: 1.5vw; font-size: 1.5vw;
width: 85%; width: 85%;
text-align: center; text-align: center;
}
.nav_panel {
width: 100%;
display: inline-flex;
justify-content: center;
}
.nav_user {
display: flex;
flex-direction: row;
justify-content: center;
height: 100%;
align-items: center;
}
.nav_user_name {
margin-left: 10px;
align-self: center;
}
.nav_chapter_text {
height: 100%;
font-family: Georgia, 'Times New Roman', Times, serif;
font-style: bold;
color: #946137;
font-size: 2vw;
transition: color 0.3s ease-in;
}
.nav_chapter_text:hover {
color: #f3d5be;
}
.nav_chapter {
text-align: center;
width: 30%;
border-bottom: 0.2vw solid #d49d51;
transition: border-bottom 0.3s ease-in;
}
.nav_chapter:hover {
text-decoration: none;
border-bottom: 0.2vw solid #face7d;
}
.nav_user_name_div {
height: 100%;
} }

View File

@ -1,95 +1,95 @@
#navbar { #navbar {
display: none; display: none;
} }
.login_page { .login_page {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
height: 75vw; height: 75vw;
background: linear-gradient( rgba(0, 0, 0, 0.55), rgba(0, 0, 0, 0.55) ), url(../images/back_main_one.jpg);background-repeat: repeat; background-position: center; background: linear-gradient( rgba(0, 0, 0, 0.55), rgba(0, 0, 0, 0.55) ), url(../images/back_main_one.jpg);background-repeat: repeat; background-position: center;
} }
.login { .login {
width: 80%; width: 80%;
height: 50%; height: 50%;
margin-left: 10%; margin-left: 10%;
margin-right: 10%; margin-right: 10%;
background-color: #dbc3af; background-color: #dbc3af;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-evenly; justify-content: space-evenly;
} }
.login_form { .login_form {
margin-bottom: 10%; margin-bottom: 10%;
} }
.header_title { .header_title {
text-align: center; text-align: center;
color: #000000; color: #000000;
font-size: 3.5vw; font-size: 3.5vw;
width: 100%; width: 100%;
} }
.data_block { .data_block {
width: 100%; width: 100%;
display: inline-flex; display: inline-flex;
justify-content: center; justify-content: center;
} }
.form_data, .form_data_button { .form_data, .form_data_button {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
margin-left: 2%; margin-left: 2%;
margin-left: 2%; margin-left: 2%;
} }
.form_data_button { .form_data_button {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.input_data { .input_data {
color: #000000; color: #000000;
border: 0.1vw solid #595008; border: 0.1vw solid #595008;
height: 4.7vw; height: 4.7vw;
width: 20vw; width: 20vw;
background-color: #dbc3af; background-color: #dbc3af;
border-radius: 5vw; border-radius: 5vw;
font-size: 1.3vw; font-size: 1.3vw;
} }
.input_button { .input_button {
width: 20vw; width: 20vw;
height: 5vw; height: 5vw;
border-radius: 5vw; border-radius: 5vw;
vertical-align: middle; vertical-align: middle;
} }
.form-label { .form-label {
font-size: 1.3vw; font-size: 1.3vw;
} }
.login_button { .login_button {
background-color: #000000; background-color: #000000;
color: #ffffff; color: #ffffff;
font-size: 1.5vw; font-size: 1.5vw;
margin-bottom: 5px; margin-bottom: 5px;
} }
.register_button { .register_button {
margin-top: 5px; margin-top: 5px;
background-color: #f5c99f; background-color: #f5c99f;
width: 20vw; width: 20vw;
height: 5vw; height: 5vw;
color: #000000; color: #000000;
border-radius: 5vw; border-radius: 5vw;
vertical-align: middle; vertical-align: middle;
font-size: 1.5vw; font-size: 1.5vw;
} }
.register_button:hover { .register_button:hover {
text-decoration: none; text-decoration: none;
color: #000000; color: #000000;
} }
.register { .register {
width: 100%; width: 100%;
text-align: center; text-align: center;
height: 100%; height: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.box { .box {
margin-left: 9vw; margin-left: 9vw;
} }

View File

@ -1,258 +1,271 @@
main, html { main, html {
background-color: #dcb495; background-color: #dcb495;
} }
#header_block { #header_block {
position: absolute; position: absolute;
margin-bottom: 60%; margin-bottom: 60%;
} }
.header_block { .header_block {
width: 100%; width: 100%;
height: 75vw; height: 75vw;
background-position: center; background-position: center;
display: flex; display: flex;
justify-content: center; justify-content: center;
flex-direction: column; flex-direction: column;
background: linear-gradient( rgba(0, 0, 0, 0.85), rgba(0, 0, 0, 0.85) ), url(../images/back_main_one.jpg);background-repeat: repeat; background-position: center; background: linear-gradient( rgba(0, 0, 0, 0.85), rgba(0, 0, 0, 0.85) ), url(../images/back_main_one.jpg);background-repeat: repeat; background-position: center;
} }
.header_title { .header_title {
margin-left: 10%; margin-left: 10%;
color: #ffffff; color: #ffffff;
font: bold; font: bold;
font-size: 4vw; font-size: 4vw;
transition: font-size 0.5s ease-in, text-shadow 1s ease-in; transition: font-size 0.5s ease-in, text-shadow 1s ease-in;
} }
.header_title:hover { .header_title:hover {
font-size: 4.05vw; font-size: 4.05vw;
text-shadow: 0px 0px 20px #ffffff; text-shadow: 0px 0px 20px #ffffff;
} }
.header_title_2 { .header_title_2 {
margin-left: 10%; margin-left: 10%;
color: #afafaf; color: #afafaf;
font: bold; font: bold;
font-size: 2vw; font-size: 2vw;
transition: font-size 0.5s ease-in, text-shadow 1s ease-in; transition: font-size 0.5s ease-in, text-shadow 1s ease-in;
} }
.header_title_2:hover { .header_title_2:hover {
font-size: 2.05vw; font-size: 2.05vw;
text-shadow: 0px 0px 20px #ffffff; text-shadow: 0px 0px 20px #ffffff;
} }
.header_buttons { .header_buttons {
margin-top: 5%; margin-top: 5%;
margin-left: 10%; margin-left: 10%;
width: 90%; width: 90%;
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
} }
.header_button { .header_button {
background-color: #f5c99f; background-color: #f5c99f;
width: 20vw; width: 20vw;
height: 5vw; height: 5vw;
color: #000000; color: #000000;
border-radius: 30px; border-radius: 30px;
vertical-align: middle; vertical-align: middle;
} }
.header_button:hover { .header_button:hover {
text-decoration: none; text-decoration: none;
color: #000000; color: #000000;
} }
#link_to_about { #link_to_about {
margin-left: 40px; margin-left: 40px;
background-color: #000000; background-color: #000000;
color: #ffffff; color: #ffffff;
border: 2px solid #ffffff; border: 2px solid #ffffff;
} }
.header_button_text { .header_button_text {
width: 100%; width: 100%;
height: 100%; height: 100%;
text-align: center; text-align: center;
font-size: 1.5vw; font-size: 1.5vw;
margin-top: 5%; margin-top: 5%;
} }
.body_block { .body_block {
background-color: #dcb495; background-color: #dcb495;
} }
.about_block { .about_block {
margin-top: 10%; margin-top: 10%;
margin-left: 5%; margin-left: 5%;
width: 90%; width: 90%;
} }
.about_title { .about_title {
color: #000000; color: #000000;
font-size: 4vw; font-size: 4vw;
} }
.about_info_block { .about_info_block {
margin-top: 50px; margin-top: 50px;
width: 100%; width: 100%;
display: inline-flex; display: inline-flex;
justify-content: space-between; justify-content: space-between;
} }
.about_article_block { .about_article_block {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-content: space-around; align-content: space-around;
} }
.about_article { .about_article {
display: inline-flex; display: inline-flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
} }
.article_image { .article_image {
width: 10vw; width: 10vw;
height: 10vw; height: 10vw;
} }
.main_image { .main_image {
width: 40vw; width: 40vw;
height: 26vw; height: 26vw;
} }
.article_text { .article_text {
max-width: 70%; max-width: 70%;
margin-left: 10px; margin-left: 10px;
font-size: 1.3vw; font-size: 1.3vw;
} }
.how_work_block { .how_work_block {
margin-top: 20%; margin-top: 20%;
margin-left: 5%; margin-left: 5%;
width: 90%; width: 90%;
} }
.how_work_title { .how_work_title {
text-align: center; text-align: center;
color: #000000; color: #000000;
font-size: 4vw; font-size: 4vw;
} }
.how_work_info_block { .how_work_info_block {
display: inline-flex; display: inline-flex;
justify-content: space-evenly; justify-content: space-evenly;
margin-top: 100px; margin-top: 100px;
} }
.how_work_image { .how_work_image {
width: 10vw; width: 10vw;
height: 10vw; height: 10vw;
} }
.how_work_info, .how_work_article { .how_work_info, .how_work_article {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.how_work_article_title { .how_work_article_title {
text-align: center; text-align: center;
font-size: 1.5vw; font-size: 1.5vw;
} }
.how_work_article_text { .how_work_article_text {
text-align: center; text-align: center;
margin-top: 1vw; margin-top: 1vw;
font-size: 1.1vw; font-size: 1.1vw;
} }
.reg_block { .reg_block {
margin-top: 20%; margin-top: 20%;
width: 100%; width: 100%;
height: 50vw; height: 50vw;
} }
.reg_content_block { .reg_content_block {
margin-top: 100px; margin-top: 100px;
width: 90%; width: 90%;
margin-left: 5%; margin-left: 5%;
display: inline-flex; display: inline-flex;
justify-content: space-between; justify-content: space-between;
flex-wrap: nowrap; flex-wrap: nowrap;
align-content: center; align-content: center;
} }
.reg_title { .reg_title {
text-align: center; text-align: center;
color: #000000; color: #000000;
font-size: 4vw; font-size: 4vw;
} }
.reg_content { .reg_content {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-self: center; align-self: center;
align-content: space-evenly; align-content: space-evenly;
} }
.reg_button_group { .reg_button_group {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
} }
.reg_button_title { .reg_button_title {
margin-bottom: 10%; margin-bottom: 10%;
color: #000000; color: #000000;
font-size: 2.5vw; font-size: 2.5vw;
text-align: left; text-align: left;
} }
.reg_button_info { .reg_button_info {
margin-top: 8%; margin-top: 8%;
} }
.reg_button_group { .reg_button_group {
width: 100%; width: 100%;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
} }
.reg_button { .reg_button {
background-color: #a8886f; background-color: #a8886f;
width: 20vw; width: 20vw;
height: 5vw; height: 5vw;
color: #ffffff; color: #ffffff;
border-radius: 30px; border-radius: 30px;
vertical-align: middle; vertical-align: middle;
} }
.reg_button:hover { .reg_button:hover {
text-decoration: none; text-decoration: none;
color: #ffffff; color: #ffffff;
} }
.reg_button_text { .reg_button_text {
width: 100%; width: 100%;
height: 100%; height: 100%;
text-align: center; text-align: center;
font-size: 1.5vw; font-size: 1.5vw;
margin-top: 6%; margin-top: 6%;
} }
#link_to_start{ #link_to_start{
width: 18vw; width: 18vw;
background-color:#f5d3b8; background-color:#f5d3b8;
} }
#link_to_start_text { #link_to_start_text {
color: #000000; color: #000000;
} }
.feedback_block { .feedback_block {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
height: 75vw; height: 75vw;
background: linear-gradient( rgba(0, 0, 0, 0.85), rgba(0, 0, 0, 0.85) ), url(../images/back_main_two.jpg);background-repeat: repeat; background-position: center; background: linear-gradient( rgba(0, 0, 0, 0.85), rgba(0, 0, 0, 0.85) ), url(../images/back_main_two.jpg);background-repeat: repeat; background-position: center;
} }
.feedback { .feedback {
width: 50%; width: 50%;
height: 80%; height: 80%;
margin-left: 25%; margin-left: 25%;
margin-right: 25%; margin-right: 25%;
background-color: #dcb495; background-color: #dcb495;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
align-content: space-around; align-content: space-around;
} }
.feedback_title { .feedback_title {
width: 80%; width: 80%;
margin-bottom: 20%; margin-bottom: 20%;
text-align: center; text-align: center;
color: #000000; color: #000000;
font-size: 3vw; font-size: 3vw;
} }
.feedback_logo { .feedback_logo {
margin-bottom: 20%; margin-bottom: 20%;
width: 10vw; width: 10vw;
height: 10vw; height: 10vw;
} }
.feedback_mail, .feedback_mail_link { .feedback_mail, .feedback_mail_link {
font-size: 1.5vw; font-size: 1.5vw;
color: #000000; color: #000000;
transition: color 0.5s ease-in, border-bottom 0.5s ease-in; transition: color 0.5s ease-in, border-bottom 0.5s ease-in;
} }
.feedback_mail_link:hover { .feedback_mail_link:hover {
color: #694a2d; color: #694a2d;
border-bottom: 3px solid #f3c79e; border-bottom: 3px solid #f3c79e;
text-decoration: none; text-decoration: none;
}
.scroll_button {
position: fixed;
width: 50px;
height: 50px;
background-color: #e5e5e5;
border-radius: 2vw;
margin-left: 95%;
margin-top: 45%;
transition: background-color 0.5s ease-in;
}
.scroll_button:hover {
background-color: #1c59fe;
} }

95
static/css/profile.css Normal file
View File

@ -0,0 +1,95 @@
.profile_page {
display: flex;
flex-direction: column;
height: 70vw;
width: 100%;
background: linear-gradient( rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.8) ), url(../images/back_profile_one.jpg);background-repeat: repeat; background-position: center;
}
.profile_block {
height: 80%;
width: 85%;
margin-left: 7.5%;
margin-top: 10%;
background: linear-gradient( rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.3) ), url(../images/back_profile_two.jpg);background-repeat: repeat; background-position: center;
display: flex;
flex-direction: column;
}
.header_profile {
display: inline;
flex-direction: column;
width: 15vw;
height: 15vw;
margin-top: 50px;
align-self: center;
}
.user_photo {
width: 15vw;
height: 15vw;
border: 0.2vw solid #ffffff;
border-radius: 2vw;
}
.edit_form {
align-self: center;
margin-top: 20px;
width: 80%;
}
form {
display: flex;
flex-direction: column;
}
.form_data_button {
align-self: center;
}
.form_blocks {
width: 100%;
margin-top: 50px;
display: inline-flex;
justify-content: space-evenly;
}
.form_data, .form_data_button {
display: flex;
flex-direction: column;
margin-left: 2%;
margin-left: 2%;
}
.form_data_button {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.input_data {
color: #000000;
border: 0.1vw solid #595008;
height: 4.5vw;
width: 20vw;
background-color: #dbc3af;
border-radius: 5vw;
font-size: 1.3vw;
display: inline-flex;
align-items: center;
}
.input_button {
width: 10vw;
height: 5vw;
border-radius: 5vw;
vertical-align: middle;
}
.form-label {
font-size: 1.3vw;
color: #ffffff;
font-weight: bold;
}
.profile_button {
margin-top: 15px;
width: 20vw;
height: 5vw;
background-color: #000000;
color: #ffffff;
border-radius: 5vw;
vertical-align: middle;
font-size: 1.5vw;
}
#delete_button {
margin-top: 45px;
}

View File

@ -1,80 +1,80 @@
#navbar { #navbar {
display: none; display: none;
} }
.register_page { .register_page {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
height: 75vw; height: 75vw;
background: linear-gradient( rgba(0, 0, 0, 0.55), rgba(0, 0, 0, 0.55) ), url(../images/back_main_one.jpg);background-repeat: repeat; background-position: center; background: linear-gradient( rgba(0, 0, 0, 0.55), rgba(0, 0, 0, 0.55) ), url(../images/back_main_one.jpg);background-repeat: repeat; background-position: center;
} }
.register { .register {
width: 70%; width: 70%;
height: 70%; height: 70%;
margin-left: 15%; margin-left: 15%;
margin-right: 15%; margin-right: 15%;
background-color: #dbc3af; background-color: #dbc3af;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-evenly; justify-content: space-evenly;
} }
.register_form { .register_form {
margin-bottom: 10%; margin-bottom: 10%;
} }
.header_title { .header_title {
text-align: center; text-align: center;
color: #000000; color: #000000;
font-size: 3.5vw; font-size: 3.5vw;
width: 100%; width: 100%;
} }
.data_block { .data_block {
width: 100%; width: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.form_data, .form_data_button { .form_data, .form_data_button {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
margin-left: 2%; margin-left: 2%;
margin-left: 2%; margin-left: 2%;
} }
.form_data_button { .form_data_button {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.input_data { .input_data {
color: #000000; color: #000000;
border: 0.1vw solid #595008; border: 0.1vw solid #595008;
height: 4.5vw; height: 4.5vw;
width: 60vw; width: 60vw;
background-color: #dbc3af; background-color: #dbc3af;
border-radius: 5vw; border-radius: 5vw;
font-size: 1.3vw; font-size: 1.3vw;
} }
.input_button { .input_button {
width: 20vw; width: 20vw;
height: 5vw; height: 5vw;
border-radius: 5vw; border-radius: 5vw;
vertical-align: middle; vertical-align: middle;
} }
.form-label { .form-label {
font-size: 1.3vw; font-size: 1.3vw;
} }
.register_button { .register_button {
margin-top: 15px; margin-top: 15px;
width: 20vw; width: 20vw;
height: 5vw; height: 5vw;
background-color: #000000; background-color: #000000;
color: #ffffff; color: #ffffff;
border-radius: 5vw; border-radius: 5vw;
vertical-align: middle; vertical-align: middle;
font-size: 1.5vw; font-size: 1.5vw;
} }
.box { .box {
margin-left: 9vw; margin-left: 9vw;
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

BIN
static/images/none_logo.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,45 +1,58 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="ru"> <html lang="ru">
<head> <head>
<meta charset="UTF-8"/> <meta charset="UTF-8" />
<link rel="stylesheet" href="../static/css/base.css"/> <link rel="stylesheet" href="../static/css/base.css" />
<link <link
rel="stylesheet" rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
crossorigin="anonymous" crossorigin="anonymous"
/> />
<link rel="icon" href="../static/images/logo_b.ico" type="image/x-icon"/> <link rel="icon" href="../static/images/logo_b.ico" type="image/x-icon" />
<title>{{title}}</title> <title>{{title}}</title>
</head> </head>
<body> <body>
<script <script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/js/bootstrap.bundle.min.js" src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/js/bootstrap.bundle.min.js"
integrity="sha384-u1OknCvxWvY5kfmNBILK2hRnQC3Pr17a+RTT6rIHI7NnikvbZlHgTPOOmMi466C8" integrity="sha384-u1OknCvxWvY5kfmNBILK2hRnQC3Pr17a+RTT6rIHI7NnikvbZlHgTPOOmMi466C8"
crossorigin="anonymous" crossorigin="anonymous"
></script> ></script>
<nav class="navbar" id="navbar"> {% if current_user.is_authenticated %}
<div class="container-fluid"> <nav class="navbar">
<a class="navbar-brand" href="/"> <div class="nav_panel">
<img <a class="nav_chapter" href="/profile">
src="../static/images/logo_b.png" <div class="nav_user">
class="nav_logo" <div class="nav_user_name_div"><p class="nav_user_name nav_chapter_text">{{current_user.name}}</p></div>
/> </div>
</a> </a>
{% if current_user.is_authenticated %} <a class="nav_chapter" href="/projects">
<a class="auth_button" href="/logout">Выход</a> <p class="nav_chapter_text">Проекты</p>
{% else %} </a>
<a class="auth_button" href="/login">Авторизация</a> <a class="nav_chapter" href="/messages">
{% endif %} <p class="nav_chapter_text">Сообщения</p>
</div> </a>
</nav> </div>
<!-- Begin page content --> </nav>
<main role="main">{% block content %}{% endblock %}</main> {% else %}
<footer class="footer"> <nav class="navbar" id="navbar">
<div class="footer_block"> <div class="container-fluid">
<a href="/#header_block"><img class="footer_logo" src="../static/images/logo_w.png"></a> <a class="navbar-brand" href="/">
<strong class="footer_rights">© All rights reserved</strong> <img src="../static/images/logo_b.png" class="nav_logo" />
</div> </a>
</footer> <a class="auth_button" href="/login">Авторизация</a>
</body> </div>
</html> </nav>
{% endif %}
<!-- Begin page content -->
<main role="main">{% block content %}{% endblock %}</main>
<footer class="footer">
<div class="footer_block">
<a href="/#header_block"
><img class="footer_logo" src="../static/images/logo_w.png"
/></a>
<strong class="footer_rights">© All rights reserved</strong>
</div>
</footer>
</body>
</html>

View File

@ -1,55 +1,55 @@
<link rel="stylesheet" href="../static/css/login.css"/> <link rel="stylesheet" href="../static/css/login.css"/>
{% extends "base.html" %} {% block content %} {% extends "base.html" %} {% block content %}
<div class="login_page"> <div class="login_page">
<div class="login"> <div class="login">
<h1 class="header_title">Авторизация</h1> <h1 class="header_title">Авторизация</h1>
<div> <div>
<form action="" method="post" class="login_form"> <form action="" method="post" class="login_form">
{{ form.hidden_tag() }} {{ form.hidden_tag() }}
<div class="data_block"> <div class="data_block">
<div class="form_data"> <div class="form_data">
<label class="form-label">{{ form.login.label }}</label> <label class="form-label">{{ form.login.label }}</label>
{{ form.login(class="input_data", type="login", placeholder='example@mail.ex') }} {% for {{ form.login(class="input_data", type="login", placeholder='example@mail.ex') }} {% for
error in form.login.errors %} error in form.login.errors %}
<div class="alert alert-danger" role="alert">{{ error }}</div> <div class="alert alert-danger" role="alert">{{ error }}</div>
{% endfor %} {% endfor %}
</div> </div>
<div class="form_data"> <div class="form_data">
<label class="form-label">{{ form.password.label }}</label> <label class="form-label">{{ form.password.label }}</label>
{{ form.password(class="input_data", type="password", placeholder='good_password') }} {% {{ form.password(class="input_data", type="password", placeholder='good_password') }} {%
for error in form.password.errors %} for error in form.password.errors %}
<div class="alert alert-danger" role="alert">{{ error }}</div> <div class="alert alert-danger" role="alert">{{ error }}</div>
{% endfor %} {% endfor %}
</div> </div>
<div class="form_data_button"> <div class="form_data_button">
{{ form.submit(type="submit", class="input_button login_button") }} {{ form.submit(type="submit", class="input_button login_button") }}
<a class="input_button register_button" type="submit" href="/register"> <a class="input_button register_button" type="submit" href="/register">
<div class="register"><strong>Регистрация</strong></div> <div class="register"><strong>Регистрация</strong></div>
</a> </a>
</div> </div>
</div> </div>
<div class="box"> <div class="box">
{{ form.remember_me(class="remember")}} {{ {{ form.remember_me(class="remember")}} {{
form.remember_me.label }}<br/> form.remember_me.label }}<br/>
{% for error in form.remember_me.errors %} {% for error in form.remember_me.errors %}
<div class="alert alert-danger" role="alert">{{ error }}</div> <div class="alert alert-danger" role="alert">{{ error }}</div>
{% endfor %} {% endfor %}
</div> </div>
<div class="message_block"> <div class="message_block">
{% if message != '' %} {% if message != '' %}
{% if danger %} {% if danger %}
<div class="alert alert-danger message" role="alert"> <div class="alert alert-danger message" role="alert">
{{ message }} {{ message }}
</div> </div>
{% else %} {% else %}
<div class="alert alert-success message" role="alert"> <div class="alert alert-success message" role="alert">
{{ message }} {{ message }}
</div> </div>
{% endif %} {% endif %}
{% endif %} {% endif %}
</div> </div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -1,115 +1,118 @@
<link rel="stylesheet" href="../static/css/main.css"> <link rel="stylesheet" href="../static/css/main.css">
{% extends "base.html" %} {% extends "base.html" %}
{% block content %} {% block content %}
<div class="header_block"> <rect class="scroll_button">
<div id="header_block"></div> <img class="scroll_image" src="">
<div class="header_text"> </rect>
<h2 class="header_title">INCEPTED</h2> <div class="header_block">
<strong class="header_title_2">Самый удобный сайт для создания проектов</strong> <div id="header_block"></div>
</div> <div class="header_text">
<div class="header_buttons"> <h2 class="header_title">INCEPTED</h2>
<a class="header_button" href="/register"> <strong class="header_title_2">Самый удобный сайт для создания проектов</strong>
<div class="header_button_text"> </div>
<p>Регистрация</p> <div class="header_buttons">
</div> <a class="header_button" href="/register">
</a> <div class="header_button_text">
<a class="header_button" id="link_to_about" href="#about_block"> <p>Регистрация</p>
<div class="header_button_text"> </div>
<p>Больше о нас</p> </a>
</div> <a class="header_button" id="link_to_about" href="#about_block">
</a> <div class="header_button_text">
</div> <p>Больше о нас</p>
</div> </div>
<div id="about_block"></div> </a>
<div class="body_block"> </div>
<div class="about_block"> </div>
<h2 class="about_title">Почему INCEPTED?</h2> <div id="about_block"></div>
<div class="about_info_block"> <div class="body_block">
<div class="about_article_block"> <div class="about_block">
<div class="about_article"> <h2 class="about_title">Почему INCEPTED?</h2>
<img class="article_image" src="../static/images/yellow_man.svg"> <div class="about_info_block">
<strong class="article_text">Проект INCEPTED позволяет создавать проекты, поддерживать их, вести <div class="about_article_block">
учет активности участников, <div class="about_article">
контролировать их материалы и получать уведомления по истечению срока дедлайна</strong> <img class="article_image" src="../static/images/yellow_man.svg">
</div> <strong class="article_text">Проект INCEPTED позволяет создавать проекты, поддерживать их, вести
<div class="about_article"> учет активности участников,
<img class="article_image" src="../static/images/yellow_cup.svg"> контролировать их материалы и получать уведомления по истечению срока дедлайна</strong>
<strong class="article_text">Индивидуальные и расширенные возможности по созданию проектов</strong> </div>
</div> <div class="about_article">
<div class="about_article"> <img class="article_image" src="../static/images/yellow_cup.svg">
<img class="article_image" src="../static/images/yellow_like.svg"> <strong class="article_text">Индивидуальные и расширенные возможности по созданию проектов</strong>
<strong class="article_text">Быстро, удобно, без лишних функций</strong> </div>
</div> <div class="about_article">
</div> <img class="article_image" src="../static/images/yellow_like.svg">
<img src="../static/images/main_image_1.jpg" class="main_image"> <strong class="article_text">Быстро, удобно, без лишних функций</strong>
</div> </div>
</div> </div>
<div class="how_work_block"> <img src="../static/images/main_image_1.jpg" class="main_image">
<h2 class="how_work_title">Как это работает ?</h2> </div>
<div class="how_work_info_block"> </div>
<div class="how_work_info"> <div class="how_work_block">
<img src="../static/images/main_image_2.png" class="how_work_image"> <h2 class="how_work_title">Как это работает ?</h2>
<div class="how_work_article"> <div class="how_work_info_block">
<strong class="how_work_article_title">Появление идеи</strong> <div class="how_work_info">
<p class="how_work_article_text">Вы в любой момент можете создать и заполнить описание проекта, как <img src="../static/images/main_image_2.png" class="how_work_image">
и построить задачи для него.</p> <div class="how_work_article">
</div> <strong class="how_work_article_title">Появление идеи</strong>
</div> <p class="how_work_article_text">Вы в любой момент можете создать и заполнить описание проекта, как
<div class="how_work_info"> и построить задачи для него.</p>
<img src="../static/images/main_image_3.png" class="how_work_image"> </div>
<div class="how_work_article"> </div>
<strong class="how_work_article_title">Сбор команды</strong> <div class="how_work_info">
<p class="how_work_article_text">Вы можете добавить участников в свою команду и дать им необходимые <img src="../static/images/main_image_3.png" class="how_work_image">
задачи.</p> <div class="how_work_article">
</div> <strong class="how_work_article_title">Сбор команды</strong>
</div> <p class="how_work_article_text">Вы можете добавить участников в свою команду и дать им необходимые
<div class="how_work_info"> задачи.</p>
<img src="../static/images/main_image_4.png" class="how_work_image"> </div>
<div class="how_work_article"> </div>
<strong class="how_work_article_title">Проверка выполнения</strong> <div class="how_work_info">
<p class="how_work_article_text">В редакторе проекта вы можете отслеживать выполнение задач <img src="../static/images/main_image_4.png" class="how_work_image">
участников и проверять их</p> <div class="how_work_article">
</div> <strong class="how_work_article_title">Проверка выполнения</strong>
</div> <p class="how_work_article_text">В редакторе проекта вы можете отслеживать выполнение задач
<div class="how_work_info"> участников и проверять их</p>
<img src="../static/images/main_image_5.png" class="how_work_image"> </div>
<div class="how_work_article"> </div>
<strong class="how_work_article_title">Представление проекта</strong> <div class="how_work_info">
<p class="how_work_article_text">После завершения проекта вы можете вывести в виде архива со всеми <img src="../static/images/main_image_5.png" class="how_work_image">
нужными файлами или заморозить его.</p> <div class="how_work_article">
</div> <strong class="how_work_article_title">Представление проекта</strong>
</div> <p class="how_work_article_text">После завершения проекта вы можете вывести в виде архива со всеми
</div> нужными файлами или заморозить его.</p>
</div> </div>
<div class="reg_block"> </div>
<h2 class="reg_title">Зарегистрируйся и пользуйся!</h2> </div>
<div class="reg_content_block"> </div>
<div class="reg_content"> <div class="reg_block">
<p class="reg_button_title">Проектирование ждет тебя !</p> <h2 class="reg_title">Зарегистрируйся и пользуйся!</h2>
<div class="reg_button_group"> <div class="reg_content_block">
<a class="reg_button" href="/register"> <div class="reg_content">
<div class="reg_button_text"> <p class="reg_button_title">Проектирование ждет тебя !</p>
<p>Регистрация</p> <div class="reg_button_group">
</div> <a class="reg_button" href="/register">
</a> <div class="reg_button_text">
<a class="reg_button" id="link_to_start" href="#header_block"> <p>Регистрация</p>
<div class="reg_button_text" id="link_to_start_text"> </div>
<p>В самое начало</p> </a>
</div> <a class="reg_button" id="link_to_start" href="#header_block">
</a> <div class="reg_button_text" id="link_to_start_text">
</div> <p>В самое начало</p>
<p class="reg_button_info">Регистрируясь, вы подтверждаете политику конфиденциальности.</p> </div>
</div> </a>
<img src="../static/images/main_image_6.jpg" class="main_image"> </div>
</div> <p class="reg_button_info">Регистрируясь, вы подтверждаете политику конфиденциальности.</p>
</div> </div>
<div class="feedback_block"> <img src="../static/images/main_image_6.jpg" class="main_image">
<div class="feedback"> </div>
<h2 class="feedback_title">Вы можете связаться с нами:</h2> </div>
<img class="feedback_logo" src="../static/images/logo_b.png"> <div class="feedback_block">
<p><strong class="feedback_mail">Почта:</strong> <a class="feedback_mail_link" href="mailto:incepted@yandex.ru" class="feedback_mail">incepted@yandex.ru</a></p> <div class="feedback">
</div> <h2 class="feedback_title">Вы можете связаться с нами:</h2>
</div> <img class="feedback_logo" src="../static/images/logo_b.png">
</div> <p><strong class="feedback_mail">Почта:</strong> <a class="feedback_mail_link" href="mailto:incepted@yandex.ru" class="feedback_mail">incepted@yandex.ru</a></p>
</div>
</div>
</div>
{% endblock %} {% endblock %}

79
templates/profile.html Normal file
View File

@ -0,0 +1,79 @@
<link rel="stylesheet" href="../static/css/profile.css"/>
{% extends "base.html" %} {% block content %}
<div class="profile_page">
<div class="profile_block">
<div class="header_profile">
<img class="user_photo" src="../{{current_user.photo}}">
</div>
<div class="edit_form">
<form action="" method="post" class="register_form" enctype="multipart/form-data">
{{ form.hidden_tag() }}
<div class="form_blocks">
<div class="data_block">
<div class="form_data">
<label class="form-label">{{ form.email.label }}</label>
{{ form.email(class="input_data", type="email", placeholder='example@mail.ex') }} {% for
error in form.email.errors %}
<div class="alert alert-danger" role="alert">{{ error }}</div>
{% endfor %}
</div>
<div class="form_data">
<label class="form-label">{{ form.name.label }}</label>
{{ form.name(class="input_data", type="name", placeholder='name') }} {%
for error in form.name.errors %}
<div class="alert alert-danger" role="alert">{{ error }}</div>
{% endfor %}
</div>
<div class="form_data">
<label class="form-label">{{ form.surname.label }}</label>
{{ form.surname(class="input_data", type="surname", placeholder='surname') }}
{% for error in form.surname.errors %}
<div class="alert alert-danger" role="alert">{{ error }}</div>
{% endfor %}
</div>
</div>
<div class="data_block">
<div class="form_data">
<label class="form-label">{{ form.birthday.label }}</label>
{{ form.birthday(class="input_data", type="date") }}
{% for error in form.birthday.errors %}
<div class="alert alert-danger" role="alert">
{{ error }}
</div>
{% endfor %}
</div>
<div class="form_data">
<label class="form-label">{{ form.about.label }}</label>
{{ form.about(class="input_data", type="name", placeholder='about') }} {%
for error in form.about.errors %}
<div class="alert alert-danger" role="alert">{{ error }}</div>
{% endfor %}
</div>
{% if 'none' in current_user.photo %}
<div class="form_data">
<label class="form-label">{{ form.photo.label }}</label>
{{ form.photo(class="input_data", type="file") }}
{% for error in form.photo.errors %}
<div class="alert alert-danger" role="alert">{{ error }}</div>
{% endfor %}
</div>
{% else %}
<div class="form_data_button">
{{ form.del_photo(type="submit", class="profile_button", id="delete_button") }}
</div>
{% endif %}
<div class="message_block">
{% if message != '' %}
<div class="alert alert-danger message" role="alert">{{ message }}</div>
{% endif %}
</div>
</div>
</div>
<div class="form_data_button">
{{ form.submit(type="submit", class="profile_button") }}
</div>
</form>
</div>
</div>
</div>
{% endblock %}