class CourseCertificate(AbstractCertificate): """ Configuration for Course Certificates. """ course_id = models.CharField(max_length=255, validators=[validate_course_key]) certificate_type = models.CharField( max_length=255, choices=_choices( constants.CertificateType.HONOR, constants.CertificateType.PROFESSIONAL, constants.CertificateType.VERIFIED, constants.CertificateType.NO_ID_PROFESSIONAL, )) user_credentials = GenericRelation( UserCredential, content_type_field='credential_content_type', object_id_field='credential_id', related_query_name='course_credentials') class Meta(object): unique_together = (('course_id', 'certificate_type', 'site'), ) verbose_name = "Course certificate configuration" @cached_property def course_key(self): return CourseKey.from_string(self.course_id)
class CourseCertificate(AbstractCertificate): """ Configuration for Course Certificates. .. no_pii: This model has no PII. """ course_id = models.CharField(max_length=255, validators=[validate_course_key]) course_run = models.OneToOneField(CourseRun, null=True, on_delete=models.PROTECT) certificate_type = models.CharField( max_length=255, choices=_choices( constants.CertificateType.HONOR, constants.CertificateType.PROFESSIONAL, constants.CertificateType.VERIFIED, constants.CertificateType.NO_ID_PROFESSIONAL, ), ) user_credentials = GenericRelation( UserCredential, content_type_field="credential_content_type", object_id_field="credential_id", related_query_name="course_credentials", ) class Meta: unique_together = (("course_id", "certificate_type", "site"),) verbose_name = "Course certificate configuration" @cached_property def course_key(self): return CourseKey.from_string(self.course_id)
class UserCredential(TimeStampedModel): """ Credentials issued to a learner. .. pii: Stores username for a user. pii values: username .. pii_types: username .. pii_retirement: retained """ AWARDED, REVOKED = ( "awarded", "revoked", ) STATUSES_CHOICES = ( (AWARDED, _("awarded")), (REVOKED, _("revoked")), ) credential_content_type = models.ForeignKey( ContentType, limit_choices_to={ "model__in": ("coursecertificate", "programcertificate") }, on_delete=models.CASCADE, ) credential_id = models.PositiveIntegerField() credential = GenericForeignKey("credential_content_type", "credential_id") username = models.CharField(max_length=255, db_index=True) status = models.CharField( max_length=255, choices=_choices(constants.UserCredentialStatus.AWARDED, constants.UserCredentialStatus.REVOKED), default=constants.UserCredentialStatus.AWARDED, ) download_url = models.CharField( max_length=255, blank=True, null=True, help_text=_("URL at which the credential can be downloaded")) uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) class Meta: unique_together = (("username", "credential_content_type", "credential_id"), ) def get_absolute_url(self): return reverse("credentials:render", kwargs={"uuid": self.uuid.hex}) def revoke(self): """ Sets the status to revoked, and saves this instance. """ self.status = UserCredential.REVOKED self.save()
class UserCredential(TimeStampedModel): """ Credentials issued to a learner. """ AWARDED, REVOKED = ( 'awarded', 'revoked', ) STATUSES_CHOICES = ( (AWARDED, _('awarded')), (REVOKED, _('revoked')), ) credential_content_type = models.ForeignKey(ContentType, limit_choices_to={ 'model__in': ('coursecertificate', 'programcertificate') }, on_delete=models.CASCADE) credential_id = models.PositiveIntegerField() credential = GenericForeignKey('credential_content_type', 'credential_id') username = models.CharField(max_length=255, db_index=True) status = models.CharField(max_length=255, choices=_choices( constants.UserCredentialStatus.AWARDED, constants.UserCredentialStatus.REVOKED), default=constants.UserCredentialStatus.AWARDED) download_url = models.CharField( max_length=255, blank=True, null=True, help_text=_('URL at which the credential can be downloaded')) uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) class Meta(object): unique_together = (('username', 'credential_content_type', 'credential_id'), ) def get_absolute_url(self): return reverse('credentials:render', kwargs={'uuid': self.uuid.hex}) def revoke(self): """ Sets the status to revoked, and saves this instance. """ self.status = UserCredential.REVOKED self.save()