From 03b523bea8875fb849da2fd91ad66c6447aa5370 Mon Sep 17 00:00:00 2001 From: Andrei Date: Fri, 10 Feb 2023 23:55:51 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D1=82=D1=8C=20=D0=BD=D0=B0=D0=B4=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=D0=BC=D0=B8=20=D0=B2=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=D1=85,=20=D1=81?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D1=84=D0=B0=D0=B9=D0=BB=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=B0=D1=80=D0=BE=D0=BB=D1=8F=20=D0=BE=D1=82=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=87=D1=82=D1=8B=20=D1=81=D0=B0=D0=B9=D1=82=D0=B0?= =?UTF-8?q?=20=D0=B8=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B0=20=D1=88=D0=B8=D1=84=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/proof_to_quests.py | 17 ++++++ data/quests.py | 6 +- functions.py | 6 +- main.py | 22 ++++++-- requirements.txt | Bin 196 -> 550 bytes static/css/project.css | 119 +++++++++++++++++++++++++++++++++++---- static/images/plus_b.png | Bin 0 -> 9380 bytes static/images/plus_w.png | Bin 0 -> 25832 bytes templates/base.html | 4 +- templates/project.html | 34 +++++++++-- 10 files changed, 179 insertions(+), 29 deletions(-) create mode 100644 data/proof_to_quests.py create mode 100644 static/images/plus_b.png create mode 100644 static/images/plus_w.png diff --git a/data/proof_to_quests.py b/data/proof_to_quests.py new file mode 100644 index 0000000..e9efb71 --- /dev/null +++ b/data/proof_to_quests.py @@ -0,0 +1,17 @@ +import sqlalchemy +from flask_login import UserMixin +from datetime import datetime + +from .db_session import SqlAlchemyBase + + +class Proofs(SqlAlchemyBase, UserMixin): + __tablename__ = 'proofs' + + id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True, autoincrement=True) + quest = sqlalchemy.Column(sqlalchemy.Integer, sqlalchemy.ForeignKey("quests.id"), nullable=True, default=None) + file = sqlalchemy.Column(sqlalchemy.Integer, sqlalchemy.ForeignKey("files.id"), nullable=True, default=None) + creator = sqlalchemy.Column(sqlalchemy.Integer, sqlalchemy.ForeignKey("users.id"), nullable=True, + default=None) + date_create = sqlalchemy.Column(sqlalchemy.DateTime, default=datetime.now()) + date_edit = sqlalchemy.Column(sqlalchemy.DateTime, default=datetime.now()) diff --git a/data/quests.py b/data/quests.py index 812c8e1..072acd1 100644 --- a/data/quests.py +++ b/data/quests.py @@ -1,6 +1,6 @@ import sqlalchemy from flask_login import UserMixin -from datetime import date +from datetime import datetime from .db_session import SqlAlchemyBase @@ -13,6 +13,6 @@ class Quests(SqlAlchemyBase, UserMixin): creator = sqlalchemy.Column(sqlalchemy.Integer, sqlalchemy.ForeignKey("users.id"), nullable=True, default=None) name = sqlalchemy.Column(sqlalchemy.String, nullable=False) description = sqlalchemy.Column(sqlalchemy.String, nullable=True) - date_create = sqlalchemy.Column(sqlalchemy.DateTime, default=date.today()) - deadline = sqlalchemy.Column(sqlalchemy.DateTime, default=date.today()) + date_create = sqlalchemy.Column(sqlalchemy.DateTime, default=datetime.now()) + deadline = sqlalchemy.Column(sqlalchemy.DateTime, default=datetime.now()) realized = sqlalchemy.Column(sqlalchemy.Boolean, default=False) diff --git a/functions.py b/functions.py index 463c48b..f565fd0 100644 --- a/functions.py +++ b/functions.py @@ -1,4 +1,5 @@ import smtplib +from json import loads from email.message import EmailMessage from data.roles import Roles from data.users import User @@ -22,8 +23,9 @@ def check_password(password=''): def mail(msg, to, topic='Подтверждение почты'): - file = open('mail.incepted', 'r', encoding='utf-8').readline().split() - login, password = file[0], file[1] + with open('incepted.config', 'r', encoding='utf-8').read() as file: + file = loads(file) + login, password = file["mail_login"], file["mail_password"] email_server = "smtp.yandex.ru" sender = "incepted@yandex.ru" em = EmailMessage() diff --git a/main.py b/main.py index f44b53f..8e7b561 100644 --- a/main.py +++ b/main.py @@ -9,6 +9,7 @@ from werkzeug.datastructures import CombinedMultiDict from werkzeug.utils import redirect from itsdangerous import URLSafeTimedSerializer, SignatureExpired from sqlalchemy import or_ +from json import loads from functions import check_password, mail, init_db_default, get_projects_data, get_user_data, save_project_logo from forms.edit_profile import EditProfileForm @@ -28,7 +29,10 @@ from waitress import serve from data import db_session app = Flask(__name__) -key = 'test_secret_key' +with open('incepted.config', 'r', encoding='utf-8') as file: + file = file.read() + file = loads(file) +key = file["encrypt_key"] app.config['SECRET_KEY'] = key csrf = CSRFProtect(app) s = URLSafeTimedSerializer(key) @@ -83,7 +87,7 @@ def edit_project(id_project): current_project.name = form.name.data current_project.description = form.description.data data_session.commit() - return redirect(f'/project/{current_project.id}/edit') + return redirect(f'/project/{current_project.id}') if form.del_photo.data: os.remove(current_project.photo) current_project.photo = 'static/images/none_project.png' @@ -109,8 +113,9 @@ def project(id_project): if current_project: staff = data_session.query(StaffProjects).filter(StaffProjects.project == current_project.id).all() if current_user.id == current_project.creator or current_user.id in list(map(lambda x: x.user, staff)): - - return render_template('project.html', project=current_project, title=current_project.name) + staff = list(map(lambda x: get_user_data(x), data_session.query(User).filter( + User.id.in_(list(map(lambda x: x.user, staff)))).all())) if staff else [] + return render_template('project.html', project=current_project, title=current_project.name, staff=staff) else: abort(403) else: @@ -180,6 +185,7 @@ def delete_project(id_project): data_session.delete(i) if 'none_project' not in project_del.photo: os.remove(project_del.photo) + shutil.rmtree(f'static/app_files/all_projects/{str(project_del.id)}') data_session.delete(project_del) data_session.commit() return redirect('/projects') @@ -241,6 +247,7 @@ def new_project(): ) data_session.add(new_staffer) data_session.commit() + os.mkdir(f'static/app_files/all_projects/{str(currnet_project.id)}') return redirect('/projects') return render_template('new_project.html', title='Новый проект', form=form, list_users=list_users) else: @@ -302,7 +309,12 @@ def profile(): return render_template('profile.html', title='Профиль', form=form, message='Ошибка, пользователь ненайден') if form.email.data != current_user.email: - pass + token = s.dumps(form.email.data) + link_conf = url_for('confirmation', token=token, _external=True) + mail(f'Для изменения почты пройдите по ссылке: {link_conf}', form.email.data, + 'Изменение почты') + user.activated = False + user.email = form.email.data if form.photo.data: with open(f'static/app_files/user_logo/{current_user.login}.png', 'wb') as file: form.photo.data.save(file) diff --git a/requirements.txt b/requirements.txt index 81010474e2ef9e686a25953e1c1de92d6fd8ec14..be128f6d155166cc13ce2da8b1b68ce6444600b7 100644 GIT binary patch literal 550 zcmZvZPfvqT5X9$f;zubdwAS|E!9#m6deEBmOps!2fd(Z0`S9v*7tB**US0w_v$He% zK0i`b+No8oxn>$G)&*ywi0_EMQ=KT&0Zyj9V{@-ZnhaPCTB}j2l55@8Ipxlru>wz- z(03=)`)kSp8|h9P=YQ(Wi2H2TdQ^~SvS0U4uYGtOPf z^0&-*b<~t&HfCN8S?gBUx+F)YN3=_n%%kyaw^N-t?}gcx$#S><=Gb`3JuY(G7K4|c Quh4JP-mn}LENj@=7epRQ=l}o! literal 196 zcmX|*!485j5Jd0&7dMom@v;Xm91I)`CY&2wYo)ZNr7`;Twh+ml-b`k82BU`&@dz9Q ztBni^N=UcDu5n6R!~zbR)L&~v4h3+gJdrgt=S*fjhnuvDyo(`gJcZ8MK4pn07HXv* tAgQibzt)SYox74$zuvPTr$1g?opOzLlKP6i%Uw_;hIDY^D diff --git a/static/css/project.css b/static/css/project.css index f97fa2a..7cf9d63 100644 --- a/static/css/project.css +++ b/static/css/project.css @@ -22,20 +22,10 @@ flex-direction: column; align-items: center; justify-content: space-between; - color: #dcb495 - #a8886f - #f5d3b8 - #a65b1e - #d49d51 - #face7d - #ffe8d6 - #a8876b - #fff2e8 - #c79b77 - #d69d5c; + color: #dcb495; } .name_project { - font-size: 3vw; + font-size: 3vw !important; } .edit_block { display: flex; @@ -52,4 +42,109 @@ .edit_button_image { height: 3vw; width: 3vw; +} +.collaborator_block { + width: 95%; + height: 25vw; + background-color: #EDCBB0; + border-radius: 2vw; + overflow-y: auto; +} +.staff_block { + margin: 20px; +} +.user { + width: 24vw; + height: 3.5vw; + background-color: #ffffff; + border: 2px solid #9E795A; + border-radius: 3vw; + margin-top: 5px; + display: flex; + align-items: center; + justify-content: flex-start; + flex-direction: row; + flex-wrap: no-wrap; +} +.user_logo { + margin-left: 3px; + width: 3vw; + height: 3vw; + border-radius: 5vw; + background-color: #000000; +} +.user_names { + margin-left: 9px; + margin-top: 10px; + overflow-x: auto; + color: #000000 !important; +} +.link_to_user { + width: 26vw; + height: 3.5vw; + display: flex; + align-items: center; + justify-content: flex-start; + flex-direction: row; + flex-wrap: no-wrap; + text-decoration: none; +} +.link_to_user:hover { + text-decoration: none; +} +.head_staff_block { + display: flex; + width: 30vw; + flex-direction: column; + align-items: center; +} +.header_title, .header_title_2 { + text-align: center; + color: #000000; + font-size: 3vw; + margin-bottom: 15px; +} +.header_title { + width: 100%; +} +.header_task_block { + width: 60vw; + height: 30vw; + display: flex; + flex-direction: column; + align-items: center; +} +.task_block { + background-color: #EDCBB0; + width: 95%; + height: 25vw; + border-radius: 2vw; + overflow-y: auto; +} +.task { + margin: 20px; +} +.body_block { + display: flex; + justify-content: space-evenly; + align-items: flex-start; + flex-direction: row; +} +.new_task_block { + width: 4.5vw; + height: 4.5vw; +} +.new_task_link { + width: 4.5vw; + height: 4.5vw; +} +.new_task_image { + width: 4.5vw; + height: 4.5vw; +} +.head_task { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + width: 60vw; } \ No newline at end of file diff --git a/static/images/plus_b.png b/static/images/plus_b.png new file mode 100644 index 0000000000000000000000000000000000000000..840785bbb3347b47d6c02e2f985357502ba94f37 GIT binary patch literal 9380 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 SD<Qfl@Op-|}1n>RER;o|%E?`fO= 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 Ra9}uUr#ap%b(`ab{{mXzmvsOD literal 0 HcmV?d00001 diff --git a/templates/base.html b/templates/base.html index e5deb27..1620c4f 100644 --- a/templates/base.html +++ b/templates/base.html @@ -29,8 +29,8 @@ - - + + diff --git a/templates/project.html b/templates/project.html index bbc086b..a108cc4 100644 --- a/templates/project.html +++ b/templates/project.html @@ -9,18 +9,42 @@
-

{{ project.name }}

+

{{ project.name }}

-
- +
+

Участники

+
+
+ {% for user in staff %} + + {% endfor %} +
+
-
- +
+
+

Задачи

+
+ + + +
+
+
+
+ p +
+