diff --git a/enterprise/admin/__init__.py b/enterprise/admin/__init__.py index 0376f0e9b..70058ffb5 100644 --- a/enterprise/admin/__init__.py +++ b/enterprise/admin/__init__.py @@ -1316,3 +1316,34 @@ class LearnerCreditEnterpriseCourseEnrollmentAdmin(admin.ModelAdmin): class Meta: fields = '__all__' model = models.LearnerCreditEnterpriseCourseEnrollment + + +@admin.register(models.DefaultEnterpriseEnrollmentIntention) +class DefaultEnterpriseEnrollmentIntentionAdmin(admin.ModelAdmin): + """ + Django admin model for DefaultEnterpriseEnrollmentIntentions. + """ + list_display = ( + 'uuid', + 'enterprise_customer', + 'content_type', + 'content_key', + ) + + readonly_fields = ( + 'current_course_run_key', + 'current_course_run_enrollable', + 'current_course_run_enroll_by_date', + ) + + search_fields = ( + 'uuid', + 'enterprise_customer__uuid', + 'content_key', + ) + + ordering = ('-modified',) + + class Meta: + fields = '__all__' + model = models.DefaultEnterpriseEnrollmentIntention diff --git a/enterprise/models.py b/enterprise/models.py index 014f8eaf2..8d0853380 100644 --- a/enterprise/models.py +++ b/enterprise/models.py @@ -2461,6 +2461,96 @@ class LicensedEnterpriseCourseEnrollment(EnterpriseFulfillmentSource): ) +class DefaultEnterpriseEnrollmentIntention(TimeStampedModel, SoftDeletableModel): + """ + Specific to an enterprise customer, this model defines a course or course run + that should be auto-enrolled for any enterprise customer user linked to the customer. + """ + DEFAULT_ENROLLMENT_CONTENT_TYPE_CHOICES = [ + ('Course', 'course'), + ('Course Run', 'course_run'), + ] + uuid = models.UUIDField( + primary_key=True, + editable=False, + ) + enterprise_customer = models.ForeignKey( + EnterpriseCustomer, + blank=False, + null=False, + related_name="default_course_enrollments", + on_delete=models.deletion.CASCADE, + help_text=_( + "The customer for which this default enrollment will be realized.", + ) + ) + content_type = models.CharField( + max_length=127, + blank=False, + null=False, + choices=DEFAULT_ENROLLMENT_CONTENT_TYPE_CHOICES, + help_text=_( + "The type of content (e.g. a course vs. a course run)." + ), + ) + content_key = models.CharField( + max_length=255, + blank=False, + null=False, + help_text=_( + "A course or course run that related users should be automatically enrolled into." + ), + ) + realized_enrollments = models.ManyToManyField( + EnterpriseCourseEnrollment, + through='RealizedDefaultEnterpriseEnrollment', + through_fields=("intended_enrollment", "realized_enrollment"), + ) + + @cached_property + def current_course_run(self): # pragma: no cover + """ + Metadata describing the current course run for this default enrollment intention. + """ + return {} + + @property + def current_course_run_key(self): # pragma: no cover + """ + The current course run key to use for realized course enrollments. + """ + return self.current_course_run.get('key') + + @property + def current_course_run_enrollable(self): # pragma: no cover + """ + Whether the current course run is enrollable. + """ + return False + + @property + def current_course_run_enroll_by_date(self): # pragma: no cover + """ + The enrollment deadline for this course. + """ + return datetime.datetime.min + + +class DefaultEnterpriseEnrollmentRealization(TimeStampedModel): + """ + Represents the relationship between a `DefaultEnterpriseEnrollmentIntention` + and a realized course enrollment that exists because of that intention record. + """ + intended_enrollment = models.ForeignKey( + DefaultEnterpriseEnrollmentIntention, + on_delete=models.CASCADE, + ) + realized_enrollment = models.ForignKey( + EnterpriseCourseEnrollment, + on_delete=models.CASCADE, + ) + + class EnterpriseCatalogQuery(TimeStampedModel): """ Stores a re-usable catalog query.