From 83df16366941db89a57aae1999b88f996e67b17b Mon Sep 17 00:00:00 2001 From: Or Ronai Date: Tue, 5 Oct 2021 12:24:14 +0300 Subject: [PATCH 1/4] feat: post delete and post save usercourse - Change user`s last course viewed depending on the saving and deleting of usercourses instances - Added a test --- lms/lmsdb/models.py | 25 ++++++++++++++++++++++++- tests/test_users.py | 18 ++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/lms/lmsdb/models.py b/lms/lmsdb/models.py index cf3c8bc1..f2521917 100644 --- a/lms/lmsdb/models.py +++ b/lms/lmsdb/models.py @@ -16,7 +16,9 @@ BooleanField, Case, CharField, Check, DateTimeField, ForeignKeyField, IntegerField, JOIN, ManyToManyField, TextField, UUIDField, fn, ) -from playhouse.signals import Model, post_save, pre_save # type: ignore +from playhouse.signals import ( # type: ignore + Model, post_delete, post_save, pre_save, +) from werkzeug.security import ( check_password_hash, generate_password_hash, ) @@ -265,6 +267,27 @@ def is_user_registered(cls, user_id: int, course_id: int) -> bool: ) +@post_save(sender=UserCourse) +def on_save_user_course(model_class, instance, created): + """Changes user's last course viewed.""" + + if instance.user.last_course_viewed is None: + instance.user.last_course_viewed = instance.course + instance.user.save() + + +@post_delete(sender=UserCourse) +def on_delete_user_course(model_class, instance): + """Changes user's last course viewed.""" + + if instance.user.last_course_viewed == instance.course: + if new_last_course_viewed := Course.fetch(instance.user).limit(1): + instance.user.last_course_viewed = new_last_course_viewed + else: + instance.user.last_course_viewed = None + instance.user.save() + + class Notification(BaseModel): ID_FIELD_NAME = 'id' MAX_PER_USER = 10 diff --git a/tests/test_users.py b/tests/test_users.py index 18ae9c1c..8cf183a6 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -185,3 +185,21 @@ def test_user_registered_to_course(student_user: User, course: Course): course2 = conftest.create_course(index=1) assert not course2.has_user(student_user) + @staticmethod + def test_usercourse_on_save(student_user: User, course: Course): + course2 = conftest.create_course(index=1) + usercourse2 = conftest.create_usercourse(student_user, course2) + assert student_user.last_course_viewed == course2 + + usercourse2.delete_instance() + print(student_user.last_course_viewed) + assert student_user.last_course_viewed is None + + usercourse = conftest.create_usercourse(student_user, course) + assert student_user.last_course_viewed == course + + conftest.create_usercourse(student_user, course2) + assert student_user.last_course_viewed == course + + usercourse.delete_instance() + assert student_user.last_course_viewed == course2 From 7d51028cad79d1ca7ab4dccd9b69e2d1733ef141 Mon Sep 17 00:00:00 2001 From: Or Ronai Date: Tue, 5 Oct 2021 12:29:03 +0300 Subject: [PATCH 2/4] splitted a test --- tests/test_users.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/test_users.py b/tests/test_users.py index 8cf183a6..63823ee5 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -186,15 +186,16 @@ def test_user_registered_to_course(student_user: User, course: Course): assert not course2.has_user(student_user) @staticmethod - def test_usercourse_on_save(student_user: User, course: Course): - course2 = conftest.create_course(index=1) - usercourse2 = conftest.create_usercourse(student_user, course2) - assert student_user.last_course_viewed == course2 + def test_usercourse_on_delete(student_user: User, course: Course): + usercourse = conftest.create_usercourse(student_user, course) + assert student_user.last_course_viewed == course - usercourse2.delete_instance() - print(student_user.last_course_viewed) + usercourse.delete_instance() assert student_user.last_course_viewed is None + @staticmethod + def test_usercourse_on_save(student_user: User, course: Course): + course2 = conftest.create_course(index=1) usercourse = conftest.create_usercourse(student_user, course) assert student_user.last_course_viewed == course From bb224f2c839ccba0359c542c976bd9cb257fbce5 Mon Sep 17 00:00:00 2001 From: Or Ronai Date: Wed, 6 Oct 2021 10:01:43 +0300 Subject: [PATCH 3/4] Changed post-delete usercourse and added a constraint --- lms/lmsdb/bootstrap.py | 12 ++++++++++++ lms/lmsdb/models.py | 12 ++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lms/lmsdb/bootstrap.py b/lms/lmsdb/bootstrap.py index 740c1f20..9331ba52 100644 --- a/lms/lmsdb/bootstrap.py +++ b/lms/lmsdb/bootstrap.py @@ -287,6 +287,15 @@ def _add_exercise_course_id_and_number_columns_constraint() -> bool: db_config.database.commit() +def _add_user_course_constaint() -> bool: + migrator = db_config.get_migrator_instance() + with db_config.database.transaction(): + migrate( + migrator.add_index('usercourse', ('user_id', 'course_id'), True), + ) + db_config.database.commit() + + def _last_status_view_migration() -> bool: Solution = models.Solution _migrate_column_in_table_if_needed(Solution, Solution.last_status_view) @@ -312,6 +321,9 @@ def main(): _last_course_viewed_migration() _uuid_migration() + if models.database.table_exists(models.UserCourse.__name__.lower()): + _add_user_course_constaint() + models.database.create_tables(models.ALL_MODELS, safe=True) if models.Role.select().count() == 0: diff --git a/lms/lmsdb/models.py b/lms/lmsdb/models.py index f2521917..bb5acf3e 100644 --- a/lms/lmsdb/models.py +++ b/lms/lmsdb/models.py @@ -254,6 +254,11 @@ class UserCourse(BaseModel): course = ForeignKeyField(Course, backref='usercourses') date = DateTimeField(default=datetime.now) + class Meta: + indexes = ( + (('user_id', 'course_id'), True), + ) + @classmethod def is_user_registered(cls, user_id: int, course_id: int) -> bool: return ( @@ -270,7 +275,6 @@ def is_user_registered(cls, user_id: int, course_id: int) -> bool: @post_save(sender=UserCourse) def on_save_user_course(model_class, instance, created): """Changes user's last course viewed.""" - if instance.user.last_course_viewed is None: instance.user.last_course_viewed = instance.course instance.user.save() @@ -279,12 +283,8 @@ def on_save_user_course(model_class, instance, created): @post_delete(sender=UserCourse) def on_delete_user_course(model_class, instance): """Changes user's last course viewed.""" - if instance.user.last_course_viewed == instance.course: - if new_last_course_viewed := Course.fetch(instance.user).limit(1): - instance.user.last_course_viewed = new_last_course_viewed - else: - instance.user.last_course_viewed = None + instance.user.last_course_viewed = Course.fetch(instance.user).limit(1) instance.user.save() From 0405a24236902524eee1cc63d206ffbfd5026433 Mon Sep 17 00:00:00 2001 From: Or Ronai Date: Wed, 6 Oct 2021 10:55:08 +0300 Subject: [PATCH 4/4] fixed post-save usercourse instances --- lms/lmsdb/models.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lms/lmsdb/models.py b/lms/lmsdb/models.py index bb5acf3e..f7efa8b2 100644 --- a/lms/lmsdb/models.py +++ b/lms/lmsdb/models.py @@ -284,7 +284,9 @@ def on_save_user_course(model_class, instance, created): def on_delete_user_course(model_class, instance): """Changes user's last course viewed.""" if instance.user.last_course_viewed == instance.course: - instance.user.last_course_viewed = Course.fetch(instance.user).limit(1) + instance.user.last_course_viewed = ( + Course.fetch(instance.user).limit(1).scalar() + ) instance.user.save()