diff --git a/ennead/app.py b/ennead/app.py index 12b1a02..9613b5e 100644 --- a/ennead/app.py +++ b/ennead/app.py @@ -8,11 +8,13 @@ from ennead.views.auth import register, register_page, login, login_page, logout from ennead.views.tasks import index +from ennead.views.student_profile import create_update_student_profile, read_student_profile from ennead.models.base import database from ennead.models.user import User from ennead.models.task import TaskSet, Task from ennead.models.thread import Thread, Post +from ennead.models.student_profile import StudentProfile def inject_user() -> None: @@ -38,7 +40,7 @@ def create_app(config_path: Optional[str] = None) -> Flask: app.config.from_object(config) database.initialize(config.DB_CLASS(config.DB_NAME, **config.DB_PARAMS)) - database.create_tables([User, Task, TaskSet, Thread, Post]) + database.create_tables([User, Task, TaskSet, Thread, Post, StudentProfile]) app.before_request(inject_user) @@ -50,8 +52,12 @@ def create_app(config_path: Optional[str] = None) -> Flask: app.add_url_rule('/login', 'login', login, methods=['POST']) app.add_url_rule('/logout', 'logout', logout) + app.add_url_rule('/student_profile', 'read_student_profile', read_student_profile) + app.add_url_rule('/student_profile', 'create_student_profile', create_update_student_profile, methods=['POST']) + return app if __name__ == '__main__': create_app('ennead.json').run() + diff --git a/ennead/models/student_profile.py b/ennead/models/student_profile.py new file mode 100644 index 0000000..5aa5ebe --- /dev/null +++ b/ennead/models/student_profile.py @@ -0,0 +1,38 @@ +"""Module for Ennead task model and corresponding helper classes""" + +from typing import TYPE_CHECKING, List + +from peewee import BooleanField, CharField, TextField, IntegerField, ForeignKeyField, DateField + +from datetime import date +from ennead.models.user import User +from flask import Request + +from ennead.models.base import BaseModel + + +class StudentProfile(BaseModel): + """Student questionnaire + + Attributes: + grade: year of education + city: city of living + birth_date: date of birth + sex: sex (True if male) + allergy: human-readable list of allergies + communication: preferred communication type (vk/telegram profile) + telephone: student's telephone number + parent_information: human-readable name and contacts of one + """ + + grade: int = IntegerField() + city: str = CharField(32) + birth_date: date = DateField() + sex: bool = BooleanField() + allergy: str = TextField() + communication: str = TextField() + telephone: str = CharField(20) + parent_information: str = TextField() + + user: User = ForeignKeyField(User, backref='student_profiles') + diff --git a/ennead/static/style.css b/ennead/static/style.css index 3fa979e..c30a3d9 100644 --- a/ennead/static/style.css +++ b/ennead/static/style.css @@ -14,3 +14,7 @@ position: relative; top: 0.05em; } + +textarea.student-profile-area { + height: 6em; +} diff --git a/ennead/templates/student_profile.html b/ennead/templates/student_profile.html new file mode 100644 index 0000000..fe42048 --- /dev/null +++ b/ennead/templates/student_profile.html @@ -0,0 +1,48 @@ +{% extends 'base.html' %} + +{% block title %}Ennead / Анкета ученика{% endblock %} + +{% block body %} +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+{% endblock %} diff --git a/ennead/views/student_profile.py b/ennead/views/student_profile.py new file mode 100644 index 0000000..f8d2e34 --- /dev/null +++ b/ennead/views/student_profile.py @@ -0,0 +1,46 @@ +"""Views, used for student profiles""" + +from datetime import date +from ennead.models.user import User + +from flask import session, current_app, render_template, request, redirect, url_for, g +from werkzeug.wrappers import Response + +from ennead.utils import require_logged_in +from ennead.models.user import User, UserGroup +from ennead.models.student_profile import StudentProfile + + +@require_logged_in +def read_student_profile() -> Response: + """GET /student_profile: read profile page""" + + if g.user.student_profiles: + student_profile = g.user.student_profiles[0] + else: + student_profile = StudentProfile() + + return render_template('student_profile.html', student_profile=student_profile) + + +@require_logged_in +def create_update_student_profile() -> Response: + """POST /student_profile: update student profile""" + + if g.user.student_profiles: + student_profile = g.user.student_profiles[0] + else: + student_profile = StudentProfile() + + for field in ('grade', 'city', 'birth_date', 'allergy', 'sex', + 'communication', 'parent_information'): + setattr(student_profile, field, request.form[field]) + + # TODO: add telephone validation + student_profile.telephone = request.form['telephone'] + + student_profile.user = g.user + + student_profile.save() + return redirect(url_for('read_student_profile')) +