Skip to content

Commit ef4852d

Browse files
committed
show threads (but not send messages to them yet)
1 parent 18b0c22 commit ef4852d

File tree

8 files changed

+150
-3
lines changed

8 files changed

+150
-3
lines changed

ennead/app.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from ennead.views.auth import register, register_page, login, login_page, logout
1010
from ennead.views.tasks import index
11+
from ennead.views.dialogue import student_thread_page
1112

1213
from ennead.models.base import database
1314
from ennead.models.user import User
@@ -49,6 +50,8 @@ def create_app(config_path: Optional[str] = None) -> Flask:
4950
app.add_url_rule('/login', 'login_page', login_page)
5051
app.add_url_rule('/login', 'login', login, methods=['POST'])
5152
app.add_url_rule('/logout', 'logout', logout)
53+
54+
app.add_url_rule('/student_thread_page/<int:task_id>', 'student_thread_page', student_thread_page)
5255

5356
return app
5457

ennead/models/task.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ class TaskSet(BaseModel):
2626
tasks: List['Task']
2727
threads: List['Thread']
2828

29+
@property
30+
def ordered_tasks(self) -> List["Task"]:
31+
return sorted(self.tasks, key=lambda task: task.order_num)
32+
2933

3034
class Task(BaseModel):
3135
"""One task for student
@@ -35,12 +39,14 @@ class Task(BaseModel):
3539
description: `Task` description in Markdown
3640
base_score: basic maximal score for `Task`
3741
task_set: set this `Task` belongs to
42+
order_num: order of this `Task` in a `TaskSet`
3843
threads: list of `Thread`s about this `Task`
3944
"""
4045

4146
name: str = CharField()
4247
description: str = TextField()
4348
base_score: int = IntegerField()
49+
order_num: int = IntegerField()
4450
task_set: TaskSet = ForeignKeyField(TaskSet, backref='tasks')
4551

4652
threads: List['Thread']

ennead/models/thread.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import datetime
44
from typing import List
55

6-
from peewee import DateTimeField, IntegerField, TextField, ForeignKeyField
6+
from peewee import DateTimeField, IntegerField, DecimalField, TextField, ForeignKeyField
77

88
from ennead.models.user import User
99
from ennead.models.task import Task
@@ -21,11 +21,19 @@ class Thread(BaseModel):
2121
"""
2222

2323
task: Task = ForeignKeyField(Task, backref='threads')
24-
score: int = IntegerField()
24+
score: float = DecimalField(default=0)
2525
student: User = ForeignKeyField(User, backref='threads')
2626

2727
posts: List['Post']
2828

29+
def ordered_posts(self, show_hidden=False):
30+
posts = self.posts
31+
if show_hidden:
32+
posts = filter(lambda post: not post.hidden, posts)
33+
posts = sorted(posts, key=lambda post: post.date)
34+
return posts
35+
36+
2937

3038
class Post(BaseModel):
3139
"""One post in `Thread` with `User` about `Task`

ennead/models/user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def is_teacher(self) -> bool:
7979
return self.group == UserGroup.teacher
8080

8181
@property
82-
def score(self) -> int:
82+
def score(self) -> float:
8383
"""Get `User`s score in current task set"""
8484

8585
return sum(

ennead/static/style.css

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,24 @@
1414
position: relative;
1515
top: 0.05em;
1616
}
17+
18+
.post {
19+
border: 1px solid black;
20+
margin: 10px 0;
21+
padding: 10px;
22+
}
23+
.post-teacher {
24+
text-align: right;
25+
background-color: lightblue;
26+
}
27+
.post-student {
28+
text-align: left;
29+
background-color: white;
30+
}
31+
32+
.message-form {
33+
34+
}
35+
.message-form textarea {
36+
width: 100%;
37+
}

ennead/templates/dialogue.html

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{% extends 'base.html' %}
2+
3+
{% block title %}{{task.order}}. {{ task.name }}{% endblock %}
4+
5+
{% block body %}
6+
<div class="row">
7+
<div class="col-4 offset-4">
8+
<h3>{{ task.order }}{{ task.name }}</h3>
9+
<p class="score">Максимальный балл: {{ task.base_score }}</p>
10+
<p class="task-description">{{ task.description }}</p>
11+
<!-- <p>Отладочная инфа: {{sorted_posts}}</p> -->
12+
</div>
13+
</div>
14+
<div class="row">
15+
<div class="col-8 offset-2">
16+
{% for post in thread.ordered_posts(show_hidden=False): %}
17+
<div class="post {{ 'post-teacher' if post.author.is_teacher else 'post-student' }}">
18+
<div class="post-body">{{ post.text }}</div>
19+
</div>
20+
{% endfor %}
21+
</div>
22+
</div>
23+
<div class="row">
24+
<div class="col-8 offset-2">
25+
<form class="message-form">
26+
<textarea name="text" placeholder="Решение задачи"></textarea>
27+
<button class="btn btn-primary float-right" type="submit">Отправить</button>
28+
</form>
29+
</div>
30+
</div>
31+
{% endblock %}

ennead/views/dialogue.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"""Views for dialogues"""
2+
3+
import datetime
4+
from flask import g
5+
6+
from flask import session, current_app, render_template, request, redirect, url_for
7+
from werkzeug.wrappers import Response
8+
9+
from ennead.utils import require_logged_in
10+
from ennead.models.user import User, UserGroup
11+
from ennead.models.task import Task
12+
from ennead.models.thread import Thread, Post
13+
14+
15+
@require_logged_in
16+
def student_thread_page(task_id: int) -> Response:
17+
"""GET /thread/{task}: show student's thread for a specified task"""
18+
task = Task.get_by_id(task_id)
19+
thread, _ = Thread.get_or_create(task=task_id, student=g.user)
20+
return render_template('dialogue.html', task=task, thread=thread)

populate_db.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import datetime
2+
from ennead.config import Config
3+
4+
from ennead.models.base import database
5+
from ennead.models.user import User, UserGroup
6+
from ennead.models.task import TaskSet, Task
7+
from ennead.models.thread import Thread, Post
8+
9+
config_path = 'ennead.json'
10+
if config_path:
11+
config = Config.from_filename(config_path)
12+
else:
13+
config = Config()
14+
15+
database.initialize(config.DB_CLASS(config.DB_NAME, **config.DB_PARAMS))
16+
database.create_tables([User, Task, TaskSet, Thread, Post])
17+
18+
student = User(
19+
username = 'test',
20+
email = 'test@test.com',
21+
registered_at = datetime.datetime.now(),
22+
first_name = 'Иван',
23+
surname = 'Петров',
24+
patronym = 'Иванович',
25+
group = UserGroup.student)
26+
student.set_password('password')
27+
student.save()
28+
29+
teacher = User(
30+
username = 'prep',
31+
email = 'prep@test.com',
32+
registered_at = datetime.datetime.now(),
33+
first_name = 'Препод',
34+
surname = 'Злой',
35+
patronym = '',
36+
group = UserGroup.teacher)
37+
teacher.set_password('password')
38+
teacher.save()
39+
40+
41+
prev_task_set = TaskSet.create(name='Старая заочка', active=True)
42+
task_set = TaskSet.create(name='Текущая заочка', active=True)
43+
44+
task_1_1 = Task.create(order_num=1, name='Очень старая задача #1', description='Когда трава была зеленее', base_score=1, task_set=prev_task_set)
45+
task_1_2 = Task.create(order_num=2, name='Очень старая задача #2', description='И задачи были забористей', base_score=1, task_set=prev_task_set)
46+
47+
task_2_1 = Task.create(order_num=1, name='Задача первая', description='Самая первая', base_score=1, task_set=task_set)
48+
task_2_2 = Task.create(order_num=3, name='Задача последняя', description='Хардкор', base_score=42, task_set=task_set)
49+
task_2_3 = Task.create(order_num=2, name='Задача два', description='Посложнее', base_score=5, task_set=task_set)
50+
51+
thread_1 = Thread.create(student=student, task=task_2_1)
52+
thread_2 = Thread.create(student=student, task=task_2_2)
53+
54+
post_1_1 = Post.create(thread=thread_1, text='Первый нах', date = datetime.datetime.now(), author=student)
55+
post_1_2 = Post.create(thread=thread_1, text='Так себе решение. Пока 0 баллов', date = datetime.datetime.now(), author=teacher)
56+
post_1_3 = Post.create(thread=thread_1, text='Ну ладно, 2+2=3', date = datetime.datetime.now(), author=student)
57+
post_1_3 = Post.create(thread=thread_1, text='Ой, 2+2=4', date = datetime.datetime.now(), author=student)
58+
post_1_4 = Post.create(thread=thread_1, text='Ок, угадал. 1 балл', date = datetime.datetime.now(), author=teacher)

0 commit comments

Comments
 (0)