Skip to content

Commit

Permalink
feat: add default enrollment models
Browse files Browse the repository at this point in the history
Adds two models, `DefaultEnterpriseEnrollmentIntention` and
`DefaultEnterpriseEnrollmentRealization`. The former defines, for a customer,
a course/run that associated users should be automatically enrolled into.
The latter represents the relationship between that intention record
and a realized EnterpriseCourseEnrollment; persisting realized enrollments
in this way will help to make read operations related to default enrollments
much more efficient.
ENT-9577
  • Loading branch information
iloveagent57 committed Oct 9, 2024
1 parent 4ff2441 commit eb54fbe
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 0 deletions.
31 changes: 31 additions & 0 deletions enterprise/admin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
90 changes: 90 additions & 0 deletions enterprise/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit eb54fbe

Please sign in to comment.