if self.signed_by_id and self.signed_by_id != self.id and not self.signed_by.get_metadata( ).is_trusted: raise ValidationError( "Devices must either be self-signed or signed by a trusted authority." ) super(Device, self).save(*args, **kwargs) if is_trusted: metadata = self.get_metadata() metadata.is_trusted = True metadata.save() def get_uuid(self): return uuid.uuid5(ROOT_UUID_NAMESPACE, str(self.public_key)).hex settings.add_syncing_models([Facility, FacilityGroup, FacilityUser, SyncedLog]) class ImportPurgatory(models.Model): timestamp = models.DateTimeField(auto_now_add=True) counter = models.IntegerField() retry_attempts = models.IntegerField(default=0) model_count = models.IntegerField(default=0) serialized_models = models.TextField() exceptions = models.TextField() def save(self, *args, **kwargs): self.counter = self.counter or Device.get_own_device().get_counter() super(ImportPurgatory, self).save(*args, **kwargs)
# TODO(jamalex): uncomment out the following, but allow for devices created on old versions somehow # if self.id and self.id != self.get_uuid(): # raise ValidationError("ID must match device's public key.") if self.signed_by_id and self.signed_by_id != self.id and not self.signed_by.get_metadata().is_trusted: raise ValidationError("Devices must either be self-signed or signed by a trusted authority.") super(Device, self).save(*args, **kwargs) if is_trusted: metadata = self.get_metadata() metadata.is_trusted = True metadata.save() def get_uuid(self): return uuid.uuid5(ROOT_UUID_NAMESPACE, str(self.public_key)).hex settings.add_syncing_models([Facility, FacilityGroup, FacilityUser, SyncedLog]) class ImportPurgatory(models.Model): timestamp = models.DateTimeField(auto_now_add=True) counter = models.IntegerField() retry_attempts = models.IntegerField(default=0) model_count = models.IntegerField(default=0) serialized_models = models.TextField() exceptions = models.TextField() def save(self, *args, **kwargs): self.counter = self.counter or Device.get_own_device().get_counter() super(ImportPurgatory, self).save(*args, **kwargs)
if not already_complete and self.complete: self.struggling = False self.completion_timestamp = datetime.now() self.completion_counter = Device.get_own_device().get_counter() self.attempts_before_completion = self.attempts super(ExerciseLog, self).save(*args, **kwargs) def get_uuid(self, *args, **kwargs): namespace = uuid.UUID(self.user.id) return uuid.uuid5(namespace, str(self.exercise_id)).hex @staticmethod def get_points_for_user(user): return ExerciseLog.objects.filter(user=user).aggregate(Sum("points")).get("points__sum", 0) or 0 settings.add_syncing_models([VideoLog, ExerciseLog]) class VideoFile(models.Model): youtube_id = models.CharField(max_length=20, primary_key=True) flagged_for_download = models.BooleanField(default=False) flagged_for_subtitle_download = models.BooleanField(default=False) download_in_progress = models.BooleanField(default=False) subtitle_download_in_progress = models.BooleanField(default=False) priority = models.IntegerField(default=0) percent_complete = models.IntegerField(default=0) subtitles_downloaded = models.BooleanField(default=False) cancel_download = models.BooleanField(default=False) class Meta: ordering = ["priority", "youtube_id"]