class ContentSummaryLog(BaseLogModel): """ This model provides a summary of all interactions a user has had with a content item. """ # Morango syncing settings morango_model_name = "contentsummarylog" user = models.ForeignKey(FacilityUser) content_id = UUIDField(db_index=True) channel_id = UUIDField() start_timestamp = DateTimeTzField() end_timestamp = DateTimeTzField(blank=True, null=True) completion_timestamp = DateTimeTzField(blank=True, null=True) time_spent = models.FloatField(help_text="(in seconds)", default=0.0, validators=[MinValueValidator(0)]) progress = models.FloatField( default=0, validators=[MinValueValidator(0), MaxValueValidator(1.01)]) kind = models.CharField(max_length=200) extra_fields = JSONField(default={}, blank=True) def calculate_source_id(self): return self.content_id def save(self, *args, **kwargs): if self.progress < 0 or self.progress > 1.01: raise ValidationError( "Content summary progress out of range (0-1)") super(ContentSummaryLog, self).save(*args, **kwargs)
class ContentRatingLog(BaseLogModel): """ This model provides a record of user feedback on a content item. """ user = models.ForeignKey(FacilityUser, blank=True, null=True) content_id = UUIDField(db_index=True) channel_id = UUIDField() quality = models.IntegerField(blank=True, null=True, validators=[MinValueValidator(1), MaxValueValidator(5)]) ease = models.IntegerField(blank=True, null=True, validators=[MinValueValidator(1), MaxValueValidator(5)]) learning = models.IntegerField(blank=True, null=True, validators=[MinValueValidator(1), MaxValueValidator(5)]) feedback = models.TextField(blank=True)
class ContentSessionLog(BaseLogModel): """ This model provides a record of interactions with a content item within a single visit to that content page. """ user = models.ForeignKey(FacilityUser, blank=True, null=True) content_id = UUIDField(db_index=True) channel_id = UUIDField() start_timestamp = models.DateTimeField() end_timestamp = models.DateTimeField(blank=True, null=True) time_spent = models.FloatField(help_text="(in seconds)", default=0.0, validators=[MinValueValidator(0)]) progress = models.FloatField(default=0, validators=[MinValueValidator(0)]) kind = models.CharField(max_length=200) extra_fields = models.TextField(default="{}")
class ContentSummaryLog(BaseLogModel): """ This model provides a summary of all interactions a user has had with a content item. """ user = models.ForeignKey(FacilityUser) content_id = UUIDField(db_index=True) channel_id = UUIDField() start_timestamp = models.DateTimeField() end_timestamp = models.DateTimeField(blank=True, null=True) completion_timestamp = models.DateTimeField(blank=True, null=True) time_spent = models.FloatField(help_text="(in seconds)", default=0.0, validators=[MinValueValidator(0)]) progress = models.FloatField(default=0, validators=[MinValueValidator(0), MaxValueValidator(1)]) kind = models.CharField(max_length=200) extra_fields = models.TextField(default="{}")
class ReportsDataOffline(models.Model): """ The top layer of the contentDB schema, defines the most common properties that are shared across all different contents. Things it can represent are, for example, video, exercise, audio or document... """ class_id = UUIDField(db_index=True) student_id = UUIDField(db_index=True) number_of_attempt = models.IntegerField() course_id = UUIDField(db_index=True) unit_id = UUIDField(db_index=True) lesson_id = UUIDField(db_index=True) collection_id = UUIDField(db_index=True) collection_type = models.CharField(max_length=50, null=True, blank=True) content_id = UUIDField(db_index=True) #Collection/Assesment Id content_type = models.CharField(max_length=50, null=True, blank=True) time_spent = models.FloatField(help_text="(in seconds)", default=0.0, validators=[MinValueValidator(0)]) reaction = models.IntegerField(null=True, blank=True) student_response = JSONField(default=[], blank=True) attended = models.BooleanField(default=False) score = models.BooleanField(default=False) created_by = models.ForeignKey(FacilityUser, related_name='created_user', blank=False, null=False) created_date = DateTimeTzField(default=local_now, editable=False) modified_by = models.ForeignKey(FacilityUser, blank=False, null=False) modified_date = DateTimeTzField(default=local_now, editable=False)
class ExamAttemptLog(BaseAttemptLog): """ This model provides a summary of a user's engagement within a particular interaction with an item/question in an exam """ morango_model_name = 'examattemptlog' examlog = models.ForeignKey(ExamLog, related_name="attemptlogs", blank=False, null=False) # We have no session logs associated with ExamLogs, so we need to record the channel and content # ids here content_id = UUIDField() channel_id = UUIDField() def infer_dataset(self, *args, **kwargs): return self.examlog.dataset def calculate_partition(self): return self.dataset_id
class ContentSessionLog(BaseLogModel): """ This model provides a record of interactions with a content item within a single visit to that content page. """ # Morango syncing settings morango_model_name = "contentsessionlog" user = models.ForeignKey(FacilityUser, blank=True, null=True) content_id = UUIDField(db_index=True) channel_id = UUIDField() start_timestamp = DateTimeTzField() end_timestamp = DateTimeTzField(blank=True, null=True) time_spent = models.FloatField(help_text="(in seconds)", default=0.0, validators=[MinValueValidator(0)]) progress = models.FloatField(default=0, validators=[MinValueValidator(0)]) kind = models.CharField(max_length=200) extra_fields = JSONField(default={}, blank=True) def save(self, *args, **kwargs): if self.progress < 0: raise ValidationError("Progress out of range (<0)") super(ContentSessionLog, self).save(*args, **kwargs)