from django.db.models.signals import post_delete, post_save from django.dispatch import receiver from .models import Grade, Lesson, Node, Question, Subject, Unit, UserAnswer, UserLessonCompletion from .services import touch_node_progress_on_answer, update_node_progress_on_lesson_completion @receiver(post_save, sender=UserAnswer, dispatch_uid='content_touch_node_progress_on_answer') def _on_user_answer_created(sender, instance, created, raw=False, **kwargs): # raw=True: loaddata/dumpdata-انتقال؛ ردیفِ NodeProgress خودش در فایل است و ساختنش اینجا تکراری می‌شد. if raw or not created: return touch_node_progress_on_answer(instance.user_id, instance.question) @receiver(post_save, sender=UserLessonCompletion, dispatch_uid='content_update_node_progress_on_completion') def _on_lesson_completion_created(sender, instance, created, raw=False, **kwargs): # raw=True: loaddata/dumpdata-انتقال؛ ردیفِ NodeProgress خودش در فایل است و ساختنش اینجا تکراری می‌شد. if raw or not created: return update_node_progress_on_lesson_completion(instance.user_id, instance.lesson) # با هر تغییرِ برنامه‌ی درسی (از ادمین یا seed)، نسخه‌ی کشِ محتوا یک واحد جلو # می‌رود و همه‌ی کلیدهای content:grades / content:tree را یک‌جا باطل می‌کند. @receiver(post_save, sender=Grade, dispatch_uid='content_bump_curriculum_grade_save') @receiver(post_delete, sender=Grade, dispatch_uid='content_bump_curriculum_grade_delete') @receiver(post_save, sender=Subject, dispatch_uid='content_bump_curriculum_subject_save') @receiver(post_delete, sender=Subject, dispatch_uid='content_bump_curriculum_subject_delete') @receiver(post_save, sender=Unit, dispatch_uid='content_bump_curriculum_unit_save') @receiver(post_delete, sender=Unit, dispatch_uid='content_bump_curriculum_unit_delete') @receiver(post_save, sender=Node, dispatch_uid='content_bump_curriculum_node_save') @receiver(post_delete, sender=Node, dispatch_uid='content_bump_curriculum_node_delete') @receiver(post_save, sender=Lesson, dispatch_uid='content_bump_curriculum_lesson_save') @receiver(post_delete, sender=Lesson, dispatch_uid='content_bump_curriculum_lesson_delete') # سوال هم: نقشه فقط درس‌های سوال‌دار را برای تمام شدنِ جزیره می‌شمارد، پس # اولین سوالِ یک درس (از ادمین یا import) باید نقشه‌ی کش‌شده را باطل کند. @receiver(post_save, sender=Question, dispatch_uid='content_bump_curriculum_question_save') @receiver(post_delete, sender=Question, dispatch_uid='content_bump_curriculum_question_delete') def _bump_curriculum_cache_version(sender, **kwargs): from .views import bump_curriculum_version bump_curriculum_version()