mirror of
https://github.com/koloideal/Quizzi.git
synced 2026-06-10 18:35:28 +03:00
commit
This commit is contained in:
@@ -78,3 +78,10 @@ class TestAttemptDAO:
|
||||
await self.session.delete(attempt)
|
||||
await self.session.flush()
|
||||
return True
|
||||
|
||||
async def get_by_user_id(self, user_id: int) -> list[DomainTestAttempt]:
|
||||
result = await self.session.execute(
|
||||
select(TestAttempt).where(TestAttempt.user_id == user_id)
|
||||
)
|
||||
models = list(result.scalars().all())
|
||||
return [TestAttemptDTO(model).to_domain() for model in models]
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
@@ -55,6 +57,8 @@ class UserDAO:
|
||||
name: str | None = None,
|
||||
group: int | None = None,
|
||||
is_admin: bool | None = None,
|
||||
name_updated_at: datetime | None = None,
|
||||
group_updated_at: datetime | None = None,
|
||||
) -> DomainUser | None:
|
||||
result = await self.session.execute(
|
||||
select(User).where(User.id == user_id)
|
||||
@@ -75,6 +79,10 @@ class UserDAO:
|
||||
user.group = group
|
||||
if is_admin is not None:
|
||||
user.is_admin = is_admin
|
||||
if name_updated_at is not None:
|
||||
user.name_updated_at = name_updated_at
|
||||
if group_updated_at is not None:
|
||||
user.group_updated_at = group_updated_at
|
||||
|
||||
await self.session.flush()
|
||||
await self.session.refresh(user)
|
||||
|
||||
@@ -15,6 +15,8 @@ class UserDTO:
|
||||
name=self.model.name,
|
||||
group=self.model.group,
|
||||
is_admin=self.model.is_admin,
|
||||
name_updated_at=self.model.name_updated_at,
|
||||
group_updated_at=self.model.group_updated_at,
|
||||
created_at=self.model.created_at,
|
||||
updated_at=self.model.updated_at,
|
||||
)
|
||||
|
||||
@@ -22,6 +22,8 @@ class User(Base):
|
||||
name: Mapped[str | None] = mapped_column(String(128))
|
||||
group: Mapped[int | None] = mapped_column(CheckConstraint("group >= 1000 AND group <= 9999"))
|
||||
is_admin: Mapped[bool] = mapped_column(default=False)
|
||||
name_updated_at: Mapped[datetime | None] = mapped_column(default=None)
|
||||
group_updated_at: Mapped[datetime | None] = mapped_column(default=None)
|
||||
created_at: Mapped[datetime] = mapped_column(server_default=func.now())
|
||||
updated_at: Mapped[datetime] = mapped_column(server_default=func.now(), onupdate=func.now())
|
||||
|
||||
|
||||
@@ -195,3 +195,19 @@ class TestAttemptRepository:
|
||||
|
||||
rows = result.all()
|
||||
return [(row.question_id, row.correct / row.total if row.total > 0 else 0.0) for row in rows]
|
||||
|
||||
async def get_user_stats(self, user_id: int) -> dict:
|
||||
result = await self.session.execute(
|
||||
select(
|
||||
func.count(TestAttemptModel.id).label("total_attempts"),
|
||||
func.avg(TestAttemptModel.score).label("avg_score"),
|
||||
).where(
|
||||
TestAttemptModel.user_id == user_id,
|
||||
TestAttemptModel.finished_at.isnot(None)
|
||||
)
|
||||
)
|
||||
row = result.one()
|
||||
return {
|
||||
"total_attempts": row.total_attempts or 0,
|
||||
"avg_score": round(row.avg_score, 1) if row.avg_score else 0,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user