From 709d2f971ddf426f7bcffb5eab3c2eecde07a140 Mon Sep 17 00:00:00 2001 From: Andrei Date: Sat, 21 Jan 2023 22:08:52 +0500 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B0=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D0=B2,=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20=D1=81=D0=BE=D0=B7=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0,=20=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D1=86=D1=8B=20=D0=B2=20=D0=B1=D0=B0=D0=B7=D0=B5=20=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/projects.py | 2 +- data/staff_projects.py | 4 +- forms/edit_profile.py | 2 +- forms/new_project.py | 10 ++ forms/register.py | 1 - functions.py | 27 +++++ main.py | 30 ++++- static/css/new_project.css | 38 +++++++ static/css/profile.css | 1 - static/css/projects.css | 197 +++++++++++++++++++++++++++++++++ static/images/none_project.png | Bin 0 -> 44753 bytes templates/new_project.html | 45 ++++++++ templates/profile.html | 3 +- templates/projects.html | 55 +++++++-- 14 files changed, 395 insertions(+), 20 deletions(-) create mode 100644 forms/new_project.py create mode 100644 static/css/new_project.css create mode 100644 static/images/none_project.png create mode 100644 templates/new_project.html diff --git a/data/projects.py b/data/projects.py index 7a41ded..11d2412 100644 --- a/data/projects.py +++ b/data/projects.py @@ -11,7 +11,7 @@ class Projects(SqlAlchemyBase, UserMixin): id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True, autoincrement=True) name = sqlalchemy.Column(sqlalchemy.String, nullable=False) - about = sqlalchemy.Column(sqlalchemy.String, nullable=True) + description = sqlalchemy.Column(sqlalchemy.String, nullable=True) photo = sqlalchemy.Column(sqlalchemy.Text) date_create = sqlalchemy.Column(sqlalchemy.Date, default=date.today()) diff --git a/data/staff_projects.py b/data/staff_projects.py index 0193517..e04d0bf 100644 --- a/data/staff_projects.py +++ b/data/staff_projects.py @@ -11,6 +11,8 @@ class StaffProjects(SqlAlchemyBase, UserMixin): primary_key=True, autoincrement=True) user = sqlalchemy.Column(sqlalchemy.Integer, sqlalchemy.ForeignKey("users.id"), nullable=True, default=None) + project = sqlalchemy.Column(sqlalchemy.Integer, + sqlalchemy.ForeignKey("projects.id"), nullable=True, default=None) role = sqlalchemy.Column(sqlalchemy.Text) permission = sqlalchemy.Column(sqlalchemy.Integer, - sqlalchemy.ForeignKey("roles.id"), nullable=True, default=None) \ No newline at end of file + sqlalchemy.ForeignKey("roles.id"), nullable=True, default=None) diff --git a/forms/edit_profile.py b/forms/edit_profile.py index 8aff299..c11d8bb 100644 --- a/forms/edit_profile.py +++ b/forms/edit_profile.py @@ -7,7 +7,7 @@ from wtforms.validators import DataRequired class EditProfileForm(FlaskForm): email = EmailField('Почта', validators=[DataRequired()]) name = StringField('Имя', validators=[DataRequired()]) - surname = StringField('Фамилия', ) + surname = StringField('Фамилия') about = TextAreaField('Расскажите о себе', default='') birthday = DateField('Дата рождения') photo = FileField('Фото', validators=[FileAllowed(['jpg', 'png', 'bmp'], 'Только фотографии!')]) diff --git a/forms/new_project.py b/forms/new_project.py new file mode 100644 index 0000000..30373ec --- /dev/null +++ b/forms/new_project.py @@ -0,0 +1,10 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, SubmitField, TextAreaField, FileField +from wtforms.validators import DataRequired + + +class NewProjectForm(FlaskForm): + name = StringField('Название', validators=[DataRequired()]) + description = TextAreaField('Описание') + logo = FileField('Логотип') + submit = SubmitField('Регистрация') diff --git a/forms/register.py b/forms/register.py index 0e6613e..8cced83 100644 --- a/forms/register.py +++ b/forms/register.py @@ -1,5 +1,4 @@ from flask_wtf import FlaskForm -from flask_wtf.file import FileAllowed from wtforms import EmailField, StringField, PasswordField, SubmitField from wtforms.validators import DataRequired diff --git a/functions.py b/functions.py index 7c4cdca..49e2d32 100644 --- a/functions.py +++ b/functions.py @@ -1,6 +1,8 @@ import smtplib from email.message import EmailMessage from data.roles import Roles +from data.users import User +from data.staff_projects import StaffProjects from data import db_session @@ -50,3 +52,28 @@ def init_db_default(): data_session.add(role) data_session.commit() data_session.close() + + +def get_user_data(user): + resp = { + 'name': user.name, + 'surname': user.surname, + 'login': user.login, + 'email': user.email, + 'photo': user.photo, + 'role': user.role + } + return resp + + +def get_projects_data(project): + data_session = db_session.create_session() + resp = { + 'id': project.id, + 'name': project.name, + 'logo': project.photo, + 'description': project.description, + 'staff': list(map(lambda x: get_user_data(x), data_session.query(User).filter( + User.id.in_(*data_session.query(StaffProjects.user).filter(StaffProjects.id == project.id).all())).all())) + } + return resp diff --git a/main.py b/main.py index 74638ab..1a80c4a 100644 --- a/main.py +++ b/main.py @@ -1,18 +1,24 @@ import datetime import os +import pprint from flask import Flask, render_template, request, url_for from flask_login import login_user, current_user, LoginManager, logout_user, login_required from werkzeug.datastructures import CombinedMultiDict from werkzeug.utils import redirect from itsdangerous import URLSafeTimedSerializer, SignatureExpired +from sqlalchemy import or_ -from functions import check_password, mail, init_db_default +from functions import check_password, mail, init_db_default, get_projects_data from forms.edit_profile import EditProfileForm from forms.login import LoginForm from forms.register import RegisterForm +from forms.new_project import NewProjectForm + from data.users import User from data.files import Files +from data.projects import Projects +from data.staff_projects import StaffProjects from waitress import serve from data import db_session @@ -32,12 +38,30 @@ def base(): return redirect('/projects') +@app.route('/projects/new', methods=['GET', 'POST']) +def new_project(): + if current_user.is_authenticated: + form = NewProjectForm() + if form.validate_on_submit(): + pass + return render_template('new_project.html', title='Новый проект', form=form) + else: + return redirect('/login') + + @app.route('/projects', methods=['GET', 'POST']) def project(): if current_user.is_authenticated: + data_session = db_session.create_session() + resp = [] if request.method == 'POST': - print(request.form.to_dict()) - return render_template('projects.html', title='Проекты') + pass + else: + projects = data_session.query(Projects).filter(or_(Projects.creator == current_user.id, current_user.id in + data_session.query(StaffProjects.project).filter( + StaffProjects.user == current_user.id).all())).all() + resp = list(map(lambda x: get_projects_data(x), projects)) + return render_template('projects.html', title='Проекты', list_projects=resp) else: return redirect('/login') diff --git a/static/css/new_project.css b/static/css/new_project.css new file mode 100644 index 0000000..a2da0eb --- /dev/null +++ b/static/css/new_project.css @@ -0,0 +1,38 @@ +.new_project_page { + height: 120vw; + background-color: #dcb495; +} +.form_data, .form_data_button { + display: flex; + flex-direction: column; + 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; + min-height: 4.5vw; + width: 35vw; + background-color: #dbc3af; + border-radius: 4.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; +} \ No newline at end of file diff --git a/static/css/profile.css b/static/css/profile.css index 33c4d18..e08cae5 100644 --- a/static/css/profile.css +++ b/static/css/profile.css @@ -51,7 +51,6 @@ form { display: flex; flex-direction: column; margin-left: 2%; - margin-left: 2%; } .form_data_button { display: flex; diff --git a/static/css/projects.css b/static/css/projects.css index 59aa669..539b117 100644 --- a/static/css/projects.css +++ b/static/css/projects.css @@ -64,4 +64,201 @@ margin-left: 2.5%; height: 95%; margin-top: 2.5%; + overflow-y: auto; + overflow-x: hidden; +} +.project_header_button { + height: 5.5vw; + width: 100%; + text-align: left; + border-radius: 5vw; + background-color: #9E795A; + border-color: #9E795A; + border-bottom-color: #9E795A; + color: #ffffff; + display: flex; + align-items: center; +} +.project_description_block { + background-color: #9E795A; + width: 100%; + height: 20vw; + border-radius: 2vw; +} +.project_logo_block { + width: 4.5vw; + height: 4.5vw; + border:2px solid #ffffff; + background-color: #ffffff; + border-radius: 2vw; + display: flex; + justify-content: center; + align-items: center; +} +.project_logo { + width: 4vw; + height: 4vw; + border-radius: 5vw; +} +.project_title_block { + width: 70%; + height: 4vw; +} +.project_title { + font-size: 3.5vw; +} +.project_button_block_one { + width: 50%; + display: flex; + justify-content: space-evenly; + align-items: flex-start; +} +.project_description { + width: 98%; + height: 100%; + margin-left: 1%; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-content: center; + align-items: center; + justify-content: space-evenly; +} +.collaborator_block { + width: 22%; + height: 90%; + background-color: #EDCBB0; + border-radius: 2vw; + overflow-y: auto; +} +.description_block { + width: 48%; + height: 90%; + display: flex; + flex-direction: column; + align-items: center; + flex-wrap: nowrap; +} +.description_header_text { + font-size: 2vw; +} +.description_block_text { + width: 90% !important; + height: 80% !important; + width: 50%; + background-color: #dcb495; + border-radius: 2vw; +} +.description_text { + width: 100% !important; + height: 100%; + font-size: 1.5vw; + overflow-wrap: normal; /* не поддерживает IE, Firefox; является копией word-wrap */ + word-wrap: normal; + word-break: normal; /* не поддерживает Opera12.14, значение keep-all не поддерживается IE, Chrome */ + line-break: auto; /* нет поддержки для русского языка */ + hyphens: manual; /* значение auto не поддерживается Chrome */ + margin: 2vw; +} +.open_project_block { + width: 20%; + height: 90%; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + flex-wrap: nowrap; +} +.open_button { + background-color: #ffffff; + color: #000000; + width: 15vw; + height: 4.5vw; + vertical-align: middle; + border-radius: 5vw; + display: flex; + align-items: center; + justify-content: center; +} +.open_button:hover { + text-decoration: none; + color: #000000; +} +.open_button_text { + font-size: 1.5vw; + margin-top: 15px; + display: flex; + align-items: center; + justify-content: center; +} +.open_button, .open_button_link { + display: flex; + align-items: center; + justify-content: center; + width: 15vw; + height: 4.5vw; + color: #000000; +} +.open_button_link:hover { + text-decoration: none; + color: #000000; +} +.staff_block { + margin: 20px; +} +.user { + width: 16vw; + 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; +} +.new_project_button { + width: 13vw; + height: 5vw; + background-color: #000000; + border: 2px solid #ffffff; + border-radius: 3vw; + margin-left: 2vw; +} +.new_project_button_text { + width: 13vw; + height: 5vw; + text-align: center; + font-size: 1.5vw; + color: #ffffff; + display: flex; + align-items: center; + justify-content: center; +} +.new_project_button_link { + width: 13vw; + height: 5vw; +} +.new_project_button_link:hover { + text-decoration: none; + color: #000000; +} +.form_project_block { + display: flex; + align-items: center; + justify-content: center; } \ No newline at end of file diff --git a/static/images/none_project.png b/static/images/none_project.png new file mode 100644 index 0000000000000000000000000000000000000000..4aabb8ba61f6cc95a6e4f45c144d8f87ad7af43a GIT binary patch literal 44753 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 literal 0 HcmV?d00001 diff --git a/templates/new_project.html b/templates/new_project.html new file mode 100644 index 0000000..a9715fb --- /dev/null +++ b/templates/new_project.html @@ -0,0 +1,45 @@ + +{% extends "base.html" %} {% block content %} +
+
+
+ {{ form.hidden_tag() }} +
+
+ + {{ form.name(class="input_data", type="name", placeholder='your project name') }} + {% for error in form.name.errors %} + + {% endfor %} +
+
+ + {{ form.description(class="input_data", type="description", placeholder='your project description') }} + {% for error in form.description.errors %} + + {% endfor %} +
+
+
+
+
+ +
+
+
+
+ + {{ form.logo(class="input_data file_data", type="file") }} + {% for error in form.logo.errors %} + + {% endfor %} +
+
+ {{ form.submit(type="submit", class="project_button") }} +
+
+
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/templates/profile.html b/templates/profile.html index 643ff7f..4a55ff3 100644 --- a/templates/profile.html +++ b/templates/profile.html @@ -5,7 +5,8 @@
+ {% for project in list_projects %}

-

-
-
- This is the first item's accordion body. It is shown by default, until the - collapse plugin adds the appropriate classes that we use to style each element. These classes - control the overall appearance, as well as the showing and hiding via CSS transitions. You can - modify any of this with custom CSS or overriding our default variables. It's also worth noting - that just about any HTML can go within the .accordion-body, though the transition - does limit overflow. +
+
+
+ {% for user in project.staff %} +
+ +

{{user.name}}

+
+ {% endfor %} +
+
+
+
+

Описание

+
+
+

{{ project.description }}

+
+
+
+ {% endfor %}
{% endblock %} \ No newline at end of file