Skip to content

Commit d7292c2

Browse files
committed
feat: replace is_admin and is_teacher with status and role enums
1 parent c29c3fe commit d7292c2

6 files changed

Lines changed: 39 additions & 21 deletions

File tree

asuschedule/enums.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from enum import StrEnum
2+
3+
4+
class UserRole(StrEnum):
5+
STUDENT = "student"
6+
TEACHER = "teacher"
7+
8+
9+
class UserStatus(StrEnum):
10+
USER = "user"
11+
ADMIN = "admin"
12+
13+
14+
__all__ = [
15+
"UserRole",
16+
"UserStatus",
17+
]

asuschedule/handlers/staff_handlers.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from telegram.ext import CommandHandler, ContextTypes
99

1010
from database import session
11+
from enums import UserStatus, UserRole
1112
from models import Schedule, User
1213
from utils import require_staff
1314

@@ -17,7 +18,7 @@
1718

1819
@require_staff
1920
async def users_list(update: Update, _):
20-
users = session.query(User).order_by(User.is_teacher).all()
21+
users = session.query(User).order_by(User.role).all()
2122
chunk_size = 15
2223
user_chunks = [users[i:i + chunk_size] for i in range(0, len(users), chunk_size)]
2324

@@ -35,7 +36,7 @@ async def users_stats(update: Update, _):
3536
await update.message.reply_text(
3637
f"📊 <b>Статистика пользователей:</b>\n\n"
3738
f"▪️ Всего пользователей: {len(users)}\n"
38-
f"▪️ Преподавателей: {len([i for i in users if i.is_teacher])}\n"
39+
f"▪️ Преподавателей: {len([i for i in users if i.role == UserRole.TEACHER])}\n"
3940
f"▪️ Включена ежедневная рассылка: {len([i for i in users if i.daily_notify])}",
4041
parse_mode=ParseMode.HTML,
4142
)
@@ -106,7 +107,7 @@ async def error_handler(update: object, context: ContextTypes.DEFAULT_TYPE) -> N
106107
f"<pre>{html.escape(tb_string)}</pre>"
107108
)
108109

109-
admin_user = session.query(User).filter_by(is_admin=True).first()
110+
admin_user = session.query(User).filter_by(status=UserStatus.ADMIN).first()
110111
if admin_user:
111112
await context.bot.send_message(
112113
chat_id=admin_user.id,

asuschedule/models.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
1+
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Enum
22
from sqlalchemy.orm import declarative_base, relationship
33

44
from consts import LESSON_TIMES
5+
from enums import UserRole, UserStatus
56

67
Base = declarative_base()
78

@@ -29,35 +30,32 @@ class User(Base):
2930
name = Column(String, nullable=False)
3031
subgroup = Column(Integer, nullable=True) # Подгруппа (1 или 2)
3132
group_id = Column(Integer, ForeignKey("groups.id"))
32-
is_teacher = Column(Boolean, default=False, nullable=True)
33-
is_admin = Column(Boolean, default=False, nullable=True)
33+
role = Column(Enum(UserRole), default=UserRole.STUDENT, nullable=False)
34+
status = Column(Enum(UserStatus), default=UserStatus.USER, nullable=False)
3435
daily_notify = Column(Boolean, default=False, nullable=True)
3536
notify_time = Column(Integer, default=8, nullable=False) # Время рассылки (8 или 20)
3637
teacher_name = Column(String, nullable=True)
3738

3839
group = relationship("Group", back_populates="users")
3940

40-
def is_staff(self) -> bool:
41-
return bool(self.is_admin)
42-
4341
def make_teacher(self, teacher_name: str) -> None:
4442
self.subgroup = None
4543
self.group_id = None
4644

47-
self.is_teacher = True
45+
self.role = UserRole.TEACHER
4846
self.teacher_name = teacher_name
4947

5048
def make_student(self, group_id: int, subgroup: int) -> None:
51-
self.is_teacher = False
49+
self.role = UserRole.STUDENT
5250
self.teacher_name = None
5351

5452
self.subgroup = subgroup
5553
self.group_id = group_id
5654

5755
def _get_status_str(self) -> str:
58-
if self.is_admin:
56+
if self.status == UserStatus.ADMIN:
5957
return "Администратор"
60-
if self.is_teacher:
58+
if self.role == UserRole.TEACHER:
6159
return "Преподаватель"
6260
return "Пользователь"
6361

@@ -66,7 +64,7 @@ def to_text(self) -> str:
6664
notify_status = "Включена" if self.daily_notify else "Выключена"
6765
notify_time_str = f"{self.notify_time}:00" if self.daily_notify else "-"
6866

69-
if self.is_teacher:
67+
if self.role == UserRole.TEACHER:
7068
return (
7169
f"👤 Имя пользователя: {self.name}\n"
7270
f"🧑‍🏫 Преподаватель: {self.teacher_name or 'Не указано'}\n"
@@ -107,14 +105,14 @@ class Schedule(Base):
107105

108106
group = relationship("Group", back_populates="schedules")
109107

110-
def to_text(self, is_requesting_teacher: bool = False) -> str:
108+
def to_text(self, requesting_role: UserRole) -> str:
111109
start_time, end_time = LESSON_TIMES.get(self.lesson_number, ("-", "-"))
112110
details = [
113111
f"Предмет: {self.subject or 'не указано'}",
114112
f"Формат: {self.lesson_type or 'не указано'}",
115113
f"Кабинет: {self.room or 'не указано'}",
116114
]
117-
if is_requesting_teacher:
115+
if requesting_role == UserRole.TEACHER:
118116
details.append(
119117
f"Группа: {self.group.get_short_name() if self.group else '??'}",
120118
)

asuschedule/schedules/schedules.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from sqlalchemy import or_
22

33
from database import session
4+
from enums import UserRole
45
from models import Schedule, User
56

67

@@ -14,7 +15,7 @@ def get_schedules(
1415
is_even_week=even_week,
1516
day_of_week=weekday,
1617
)
17-
if user.is_teacher:
18+
if user.role == UserRole.TEACHER:
1819
query = query.filter(
1920
Schedule.teacher.ilike(f"%{user.teacher_name}%"),
2021
)

asuschedule/schedules/schedules_text.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ def _build_schedule_text(
1515
if not schedules:
1616
schedule_text += "🎉 Занятий нет."
1717
for schedule in schedules:
18-
schedule_text += f"{schedule.to_text(user.is_teacher)}━━━━━━━━━━━━━━━━━━\n"
18+
schedule_text += f"{schedule.to_text(user.role)}━━━━━━━━━━━━━━━━━━\n"
1919
return schedule_text
2020

2121

2222
def get_next_lesson_text(user: User, schedule: Schedule) -> str:
23-
return f"<b>🔔 Следующая пара:</b>\n\n{schedule.to_text(user.is_teacher)}"
23+
return f"<b>🔔 Следующая пара:</b>\n\n{schedule.to_text(user.role)}"
2424

2525

2626
def get_schedule_text(

asuschedule/utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from config import INVERT_WEEK_PARITY
77
from database import session
8+
from enums import UserRole, UserStatus
89
from models import User
910

1011

@@ -26,7 +27,7 @@ async def wrapper(
2627
update: Update, context: ContextTypes.DEFAULT_TYPE, *args, **kwargs,
2728
):
2829
user = session.query(User).filter_by(id=update.effective_user.id).first()
29-
if user is None or (not user.is_teacher and user.group_id is None):
30+
if user is None or (not user.role == UserRole.TEACHER and user.group_id is None):
3031
await update.message.reply_text(
3132
"Вы не зарегистрированы или не завершили настройку. "
3233
"Пожалуйста, начните с команды /start.",
@@ -42,7 +43,7 @@ async def wrapper(
4243
update: Update, context: ContextTypes.DEFAULT_TYPE, *args, **kwargs,
4344
):
4445
user = session.query(User).filter_by(id=update.effective_user.id).first()
45-
if user is None or not user.is_staff():
46+
if user is None or not user.status == UserStatus.ADMIN:
4647
await update.message.reply_text(
4748
"⛔ У вас нет доступа к этой команде.",
4849
)

0 commit comments

Comments
 (0)