From d18352d1666da0ee1571ef6524c411b5e69a274f Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 14 Feb 2023 23:50:38 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=83=20=D1=81=D0=BE=D0=B7?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B9?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8,=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BD=D0=B0=20=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=81=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=86=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=D0=B7=D0=B0=D0=B4,=20=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=83=20=D0=BE=D1=82=D0=B2?= =?UTF-8?q?=D0=B5=D1=82=D0=B0=20=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/proof_to_quests.py | 1 + forms/register.py | 2 +- forms/task.py | 17 +++++ main.py | 39 +++++++++++- static/css/decision.css | 124 +++++++++++++++++++++++++++++++++++++ static/css/new_project.css | 29 +++++++++ static/css/new_task.css | 100 ++++++++++++++++++++++++++++++ static/css/project.css | 36 ++++++++++- templates/base.html | 8 +-- templates/decision.html | 41 ++++++++++++ templates/new_project.html | 7 ++- templates/new_task.html | 47 ++++++++++++++ templates/project.html | 5 ++ 13 files changed, 447 insertions(+), 9 deletions(-) create mode 100644 forms/task.py create mode 100644 static/css/decision.css create mode 100644 static/css/new_task.css create mode 100644 templates/decision.html create mode 100644 templates/new_task.html diff --git a/data/proof_to_quests.py b/data/proof_to_quests.py index e9efb71..f601159 100644 --- a/data/proof_to_quests.py +++ b/data/proof_to_quests.py @@ -11,6 +11,7 @@ class Proofs(SqlAlchemyBase, UserMixin): 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) + text = sqlalchemy.Column(sqlalchemy.Text, 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()) diff --git a/forms/register.py b/forms/register.py index 8cced83..0c85d28 100644 --- a/forms/register.py +++ b/forms/register.py @@ -8,4 +8,4 @@ class RegisterForm(FlaskForm): name = StringField('Имя', validators=[DataRequired()]) login = StringField('Логин', validators=[DataRequired()]) password = PasswordField('Пароль', validators=[DataRequired()]) - submit = SubmitField('Регистрация') \ No newline at end of file + submit = SubmitField('Регистрация') diff --git a/forms/task.py b/forms/task.py new file mode 100644 index 0000000..e6c964e --- /dev/null +++ b/forms/task.py @@ -0,0 +1,17 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, SubmitField, TextAreaField, DateField, TimeField, FileField +from wtforms.validators import DataRequired + + +class NewTask(FlaskForm): + name = StringField('Название', validators=[DataRequired()]) + description = TextAreaField('Описание', validators=[DataRequired()]) + deadline_date = DateField('Дедлайн', validators=[DataRequired()]) + deadline_time = TimeField('', validators=[DataRequired()]) + submit = SubmitField('Создать') + + +class AnswerTask(FlaskForm): + text = TextAreaField('Письменный ответ') + file = FileField('Файловый ответ') + submit = SubmitField('Ответить') diff --git a/main.py b/main.py index d5db8ea..10b6a01 100644 --- a/main.py +++ b/main.py @@ -20,6 +20,7 @@ from forms.register import RegisterForm from forms.project import ProjectForm from forms.recovery import RecoveryForm, NewPasswordForm from forms.conf_delete_project import DeleteProjectForm +from forms.task import NewTask, AnswerTask from data.users import User from data.quests import Quests @@ -49,13 +50,47 @@ def base(): return redirect('/projects') -@app.route('/project//task/new') +@app.route('/project//quest/') +def task_project(id_project, id_task): + if current_user.is_authenticated: + data_session = db_session.create_session() + current_project = data_session.query(Projects).filter(Projects.id == id_project).first() + current_task = data_session.query(Quests).filter(Quests.id == id_task).first() + if current_project and current_task and current_task.project == current_project.id: + form = AnswerTask() + return render_template('decision.html', title='Решение', project=current_project, task=current_task, + form=form) + else: + abort(404) + else: + return redirect('/login') + + +@app.route('/project//task/new', methods=['GET', 'POST']) def new_task_project(id_project): if current_user.is_authenticated: data_session = db_session.create_session() current_project = data_session.query(Projects).filter(Projects.id == id_project).first() if current_project: - pass + form = NewTask() + if form.validate_on_submit(): + if form.deadline_date.data and form.deadline_time.data: + deadline = datetime.datetime.combine(form.deadline_date.data, form.deadline_time.data) + else: + deadline = None + quest = Quests( + project=current_project.id, + creator=current_user.id, + name=form.name.data if form.name.data else None, + description=form.description.data if form.description.data else None, + date_create=datetime.datetime.now(), + deadline=deadline, + realized=False + ) + data_session.add(quest) + data_session.commit() + return redirect(f'/project/{str(current_project.id)}') + return render_template('new_task.html', title='Новая задача', form=form, porject=current_project) else: abort(404) else: diff --git a/static/css/decision.css b/static/css/decision.css new file mode 100644 index 0000000..06aa82f --- /dev/null +++ b/static/css/decision.css @@ -0,0 +1,124 @@ +.decision_page { + height: 90vw; + background-color: #dcb495; + display: flex; + flex-direction: column; + align-items: center; +} +.link_back_block { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + flex-wrap: nowrap; +} +.link_back { + background-color: #ffffff; + color: #000000; + width: 15vw; + height: 4.5vw; + vertical-align: middle; + border-radius: 5vw; + display: flex; + align-items: center; + justify-content: center; +} +.link_back:hover { + text-decoration: none; + color: #000000; +} +.link_back_text { + font-size: 1.5vw; + margin-top: 15px; + display: flex; + align-items: center; + justify-content: center; +} +.name_block { + margin-top: 3vw; + width: 90%; + height: 25vw; + display: flex; + flex-direction: column; + align-items: center; +} +.title_block { + width: 90%; + display: flex; + justify-content: center; +} +.title_task { + text-align: center; + color: #000000; + font-size: 4vw; +} +.description_task { + width: 80%; + background-color: #EDCBB0; + height: auto; + max-height: 15vw; + border-radius: 2vw; + display: flex; + overflow-y: auto; +} +.description { + margin: 15px; +} +.description_text { + font-size: 1.5vw; + text-align: justify; +} +.data_block { + width: 90%; + display: flex; + align-items: flex-start; + justify-content: center +} +.bottom_data { + margin: 2vw; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} +.form_label { + margin-top: 10px; + font-size: 1.3vw; + color: #000000; + font-weight: bold; +} +.input_data { + color: #000000; + border: 0.1vw solid #595008; + height: 4.5vw; + min-height: 4.5vw; + width: 30vw; + 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; +} +.text_data { + border-radius: 2vw !important; + width: 35vw; +} +.form_data { + display: flex; + flex-direction: column; + margin-left: 2%; +} +.decision_block { + margin-top: 3vw; + width: 90%; + height: 25vw; + display: flex; + flex-direction: column; + align-items: center; +} \ No newline at end of file diff --git a/static/css/new_project.css b/static/css/new_project.css index c8100f7..919c0be 100644 --- a/static/css/new_project.css +++ b/static/css/new_project.css @@ -130,4 +130,33 @@ align-items: center; justify-content: flex-start; flex-direction: row; +} +.link_back_block { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + flex-wrap: nowrap; +} +.link_back { + background-color: #ffffff; + color: #000000; + width: 15vw; + height: 4.5vw; + vertical-align: middle; + border-radius: 5vw; + display: flex; + align-items: center; + justify-content: center; +} +.link_back:hover { + text-decoration: none; + color: #000000; +} +.link_back_text { + font-size: 1.5vw; + margin-top: 15px; + display: flex; + align-items: center; + justify-content: center; } \ No newline at end of file diff --git a/static/css/new_task.css b/static/css/new_task.css new file mode 100644 index 0000000..f5be8a8 --- /dev/null +++ b/static/css/new_task.css @@ -0,0 +1,100 @@ +.new_task_page { + height: 50vw; + background-color: #dcb495; +} +.form_data { + display: flex; + flex-direction: column; + margin-left: 2%; +} +.form_block { + display: flex; + align-items: center; + justify-content: center; +} +.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: 50vw; + background-color: #dbc3af; + border-radius: 4.5vw; + font-size: 1.3vw; + display: inline-flex; + align-items: center; +} +.form_label { + margin-top: 10px; + font-size: 1.3vw; + color: #ffffff; + font-weight: bold; +} +.description { + border-radius: 2vw !important; + width: 50vw; +} +.name_form_block { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; +} +.deadline { + width: 20vw; +} +.quest_button { + margin-top: 5vw; + margin-left: 5vw; + width: 20vw; + height: 5vw; + background-color: #000000; + color: #ffffff; + border-radius: 5vw; + vertical-align: middle; + font-size: 1.5vw; +} +.data_form_block { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; +} +.deadline { + margin: 5px; +} +.link_back_block { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + flex-wrap: nowrap; +} +.link_back { + background-color: #ffffff; + color: #000000; + width: 15vw; + height: 4.5vw; + vertical-align: middle; + border-radius: 5vw; + display: flex; + align-items: center; + justify-content: center; +} +.link_back:hover { + text-decoration: none; + color: #000000; +} +.link_back_text { + font-size: 1.5vw; + margin-top: 15px; + display: flex; + align-items: center; + justify-content: center; +} \ No newline at end of file diff --git a/static/css/project.css b/static/css/project.css index d86eefa..bbe2225 100644 --- a/static/css/project.css +++ b/static/css/project.css @@ -1,6 +1,9 @@ .projects_page { height: 120vw; background-color: #dcb495; + display: flex; + flex-direction: column; + align-items: center; } .project_header { height: 25vw; @@ -10,6 +13,7 @@ justify-content: space-around; } .project_logo { + margin-right: 4vw; margin-top: 30px; width: 15vw; height: 15vw; @@ -26,6 +30,7 @@ } .name_project { font-size: 3vw !important; + margin-right: 4vw; } .edit_block { display: flex; @@ -156,7 +161,7 @@ .list_quests { width: 95%; margin-left: 2.5%; - margin-top: 2vw; + margin-top: 0.5vw; overflow-y: hidden; overflow-x: hidden; } @@ -272,4 +277,33 @@ } #quest_solve_link_id { display: none; +} +.link_back_block { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + flex-wrap: nowrap; +} +.link_back { + background-color: #ffffff; + color: #000000; + width: 15vw; + height: 4.5vw; + vertical-align: middle; + border-radius: 5vw; + display: flex; + align-items: center; + justify-content: center; +} +.link_back:hover { + text-decoration: none; + color: #000000; +} +.link_back_text { + font-size: 1.5vw; + margin-top: 15px; + display: flex; + align-items: center; + justify-content: center; } \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index 1620c4f..9fcfaac 100644 --- a/templates/base.html +++ b/templates/base.html @@ -2,14 +2,14 @@ - + - + {{title}} @@ -38,7 +38,7 @@