Skip to content

Commit 8a41e38

Browse files
authored
feat: post delete and post save usercourse instances (#325)
* 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 - Added a constraint
1 parent 0e38fb9 commit 8a41e38

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

Diff for: lms/lmsdb/bootstrap.py

+12
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,15 @@ def _add_exercise_course_id_and_number_columns_constraint() -> bool:
287287
db_config.database.commit()
288288

289289

290+
def _add_user_course_constaint() -> bool:
291+
migrator = db_config.get_migrator_instance()
292+
with db_config.database.transaction():
293+
migrate(
294+
migrator.add_index('usercourse', ('user_id', 'course_id'), True),
295+
)
296+
db_config.database.commit()
297+
298+
290299
def _last_status_view_migration() -> bool:
291300
Solution = models.Solution
292301
_migrate_column_in_table_if_needed(Solution, Solution.last_status_view)
@@ -312,6 +321,9 @@ def main():
312321
_last_course_viewed_migration()
313322
_uuid_migration()
314323

324+
if models.database.table_exists(models.UserCourse.__name__.lower()):
325+
_add_user_course_constaint()
326+
315327
models.database.create_tables(models.ALL_MODELS, safe=True)
316328

317329
if models.Role.select().count() == 0:

Diff for: lms/lmsdb/models.py

+26-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
BooleanField, Case, CharField, Check, DateTimeField, ForeignKeyField,
1717
IntegerField, JOIN, ManyToManyField, TextField, UUIDField, fn,
1818
)
19-
from playhouse.signals import Model, post_save, pre_save # type: ignore
19+
from playhouse.signals import ( # type: ignore
20+
Model, post_delete, post_save, pre_save,
21+
)
2022
from werkzeug.security import (
2123
check_password_hash, generate_password_hash,
2224
)
@@ -252,6 +254,11 @@ class UserCourse(BaseModel):
252254
course = ForeignKeyField(Course, backref='usercourses')
253255
date = DateTimeField(default=datetime.now)
254256

257+
class Meta:
258+
indexes = (
259+
(('user_id', 'course_id'), True),
260+
)
261+
255262
@classmethod
256263
def is_user_registered(cls, user_id: int, course_id: int) -> bool:
257264
return (
@@ -265,6 +272,24 @@ def is_user_registered(cls, user_id: int, course_id: int) -> bool:
265272
)
266273

267274

275+
@post_save(sender=UserCourse)
276+
def on_save_user_course(model_class, instance, created):
277+
"""Changes user's last course viewed."""
278+
if instance.user.last_course_viewed is None:
279+
instance.user.last_course_viewed = instance.course
280+
instance.user.save()
281+
282+
283+
@post_delete(sender=UserCourse)
284+
def on_delete_user_course(model_class, instance):
285+
"""Changes user's last course viewed."""
286+
if instance.user.last_course_viewed == instance.course:
287+
instance.user.last_course_viewed = (
288+
Course.fetch(instance.user).limit(1).scalar()
289+
)
290+
instance.user.save()
291+
292+
268293
class Notification(BaseModel):
269294
ID_FIELD_NAME = 'id'
270295
MAX_PER_USER = 10

Diff for: tests/test_users.py

+19
Original file line numberDiff line numberDiff line change
@@ -185,3 +185,22 @@ def test_user_registered_to_course(student_user: User, course: Course):
185185
course2 = conftest.create_course(index=1)
186186
assert not course2.has_user(student_user)
187187

188+
@staticmethod
189+
def test_usercourse_on_delete(student_user: User, course: Course):
190+
usercourse = conftest.create_usercourse(student_user, course)
191+
assert student_user.last_course_viewed == course
192+
193+
usercourse.delete_instance()
194+
assert student_user.last_course_viewed is None
195+
196+
@staticmethod
197+
def test_usercourse_on_save(student_user: User, course: Course):
198+
course2 = conftest.create_course(index=1)
199+
usercourse = conftest.create_usercourse(student_user, course)
200+
assert student_user.last_course_viewed == course
201+
202+
conftest.create_usercourse(student_user, course2)
203+
assert student_user.last_course_viewed == course
204+
205+
usercourse.delete_instance()
206+
assert student_user.last_course_viewed == course2

0 commit comments

Comments
 (0)