diff --git a/rating_api/routes/comment.py b/rating_api/routes/comment.py index a911c1a..44d9cc4 100644 --- a/rating_api/routes/comment.py +++ b/rating_api/routes/comment.py @@ -30,58 +30,25 @@ @comment.post("", response_model=CommentGet) async def create_comment(lecturer_id: int, comment_info: CommentPost, user=Depends(UnionAuth())) -> CommentGet: """ - Scopes: `["rating.comment.import"]` Создает комментарий к преподавателю в базе данных RatingAPI Для создания комментария нужно быть авторизованным - - Для возможности создания комментария с указанием времени создания и изменения необходим скоуп ["rating.comment.import"] """ lecturer = Lecturer.get(session=db.session, id=lecturer_id) now = datetime.datetime.now(tz=datetime.timezone.utc) if not lecturer: raise ObjectNotFound(Lecturer, lecturer_id) - - has_create_scope = "rating.comment.import" in [scope['name'] for scope in user.get('session_scopes')] - if (comment_info.create_ts or comment_info.update_ts) and not has_create_scope: - raise ForbiddenAction(Comment) - - if not has_create_scope: - # Определяем дату, до которой учитываем комментарии для проверки общего лимита. - date_count = datetime.datetime( - now.year + (now.month - settings.COMMENT_FREQUENCY_IN_MONTH) // 12, - (now.month - settings.COMMENT_FREQUENCY_IN_MONTH) % 12, - 1, - ) - user_comments_count = ( - LecturerUserComment.query(session=db.session) - .filter( - LecturerUserComment.user_id == user.get("id"), - LecturerUserComment.update_ts >= date_count, - ) - .count() - ) - if user_comments_count >= settings.COMMENT_LIMIT: - raise TooManyCommentRequests(settings.COMMENT_FREQUENCY_IN_MONTH, settings.COMMENT_LIMIT) - - # Дата, до которой учитываем комментарии для проверки лимита на комментарии конкретному лектору. - cutoff_date_lecturer = datetime.datetime( - now.year + (now.month - settings.COMMENT_LECTURER_FREQUENCE_IN_MONTH) // 12, - (now.month - settings.COMMENT_LECTURER_FREQUENCE_IN_MONTH) % 12, - 1, - ) - lecturer_comments_count = ( - LecturerUserComment.query(session=db.session) - .filter( - LecturerUserComment.user_id == user.get("id"), - LecturerUserComment.lecturer_id == lecturer_id, - LecturerUserComment.update_ts >= cutoff_date_lecturer, - ) - .count() - ) - if lecturer_comments_count >= settings.COMMENT_TO_LECTURER_LIMIT: - raise TooManyCommentsToLecturer( - settings.COMMENT_LECTURER_FREQUENCE_IN_MONTH, settings.COMMENT_TO_LECTURER_LIMIT + user_comments: list[LecturerUserComment] = ( + LecturerUserComment.query(session=db.session).filter(LecturerUserComment.user_id == user.get("id")).all() + ) + for user_comment in user_comments: + if datetime.datetime.utcnow() - user_comment.update_ts < datetime.timedelta( + minutes=settings.COMMENT_CREATE_FREQUENCY_IN_MINUTES + ): + raise TooManyCommentRequests( + dtime=user_comment.update_ts + + datetime.timedelta(minutes=settings.COMMENT_CREATE_FREQUENCY_IN_MINUTES) + - datetime.datetime.utcnow() ) if len(comment_info.text) > settings.MAX_COMMENT_LENGTH: @@ -149,7 +116,7 @@ async def import_comments( for comment_info in comments_info.comments: new_comment = Comment.create( session=db.session, - **comment_info.model_dump(exclude={"is_anonymous"}), + **comment_info.model_dump(), review_status=ReviewStatus.APPROVED, ) result.comments.append(new_comment) diff --git a/rating_api/schemas/models.py b/rating_api/schemas/models.py index e24dd53..e4d8427 100644 --- a/rating_api/schemas/models.py +++ b/rating_api/schemas/models.py @@ -54,9 +54,22 @@ def validate_mark(cls, value): return value -class CommentImport(CommentPost): +class CommentImport(Base): lecturer_id: int subject: str | None = None + text: str + create_ts: datetime.datetime | None = None + update_ts: datetime.datetime | None = None + mark_kindness: int + mark_freebie: int + mark_clarity: int + + @field_validator('mark_kindness', 'mark_freebie', 'mark_clarity') + @classmethod + def validate_mark(cls, value): + if value not in [-2, -1, 0, 1, 2]: + raise WrongMark() + return value class CommentImportAll(Base): diff --git a/tests/conftest.py b/tests/conftest.py index d02ef1e..f5f6378 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -117,7 +117,7 @@ def lecturers(dbsession): for fname, lname, mname, timetable_id in lecturers_data ] lecturers.append( - Lecturer(first_name='test_fname3', last_name='test_lname3', middle_name='test_mname3', timetable_id=3) + Lecturer(first_name='test_fname3', last_name='test_lname3', middle_name='test_mname3', timetable_id=9903) ) lecturers[-1].is_deleted = True for lecturer in lecturers: