Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 9 additions & 11 deletions openedx_learning/apps/authoring/containers/models_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,6 @@
from django.db import models

from openedx_learning.apps.authoring.containers.models import Container, ContainerVersion
from openedx_learning.apps.authoring.publishing.model_mixins import (
PublishableEntityMixin,
PublishableEntityVersionMixin,
)
from openedx_learning.lib.managers import WithRelationsManager

__all__ = [
Expand All @@ -20,17 +16,20 @@
]


class ContainerMixin(PublishableEntityMixin):
class ContainerMixin(models.Model):
"""
Convenience mixin to link your models against Container.

Please see docstring for Container for more details.

If you use this class, you *MUST* also use ContainerVersionMixin
"""

# select these related entities by default for all queries
objects: ClassVar[WithRelationsManager[Self]] = WithRelationsManager("container") # type: ignore[assignment]
objects: ClassVar[WithRelationsManager[Self]] = WithRelationsManager( # type: ignore[assignment]
"container",
"container__publishable_entity",
"container__publishable_entity__published",
"container__publishable_entity__draft",
)

container = models.OneToOneField(
Container,
Expand All @@ -49,18 +48,17 @@ class Meta:
abstract = True


class ContainerVersionMixin(PublishableEntityVersionMixin):
class ContainerVersionMixin(models.Model):
"""
Convenience mixin to link your models against ContainerVersion.

Please see docstring for ContainerVersion for more details.

If you use this class, you *MUST* also use ContainerMixin
"""

# select these related entities by default for all queries
objects: ClassVar[WithRelationsManager[Self]] = WithRelationsManager( # type: ignore[assignment]
"container_version",
"container_version__publishable_entity_version",
)

container_version = models.OneToOneField(
Expand Down
15 changes: 4 additions & 11 deletions openedx_learning/apps/authoring/units/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,7 @@ def create_unit(
container = container_api.create_container(
learning_package_id, key, created, created_by
)
unit = Unit.objects.create(
container=container,
publishable_entity=container.publishable_entity,
)
unit = Unit.objects.create(container=container)
return unit


Expand Down Expand Up @@ -86,9 +83,7 @@ def create_unit_version(
created_by=created_by,
)
unit_version = UnitVersion.objects.create(
unit=unit,
container_version=container_version,
publishable_entity_version=container_version.publishable_entity_version,
)
return unit_version

Expand Down Expand Up @@ -138,9 +133,7 @@ def create_next_unit_version(
created_by=created_by,
)
unit_version = UnitVersion.objects.create(
unit=unit,
container_version=container_version,
publishable_entity_version=container_version.publishable_entity_version,
)
return unit_version

Expand Down Expand Up @@ -279,13 +272,13 @@ def get_components_in_published_unit_as_of(
ancestors of every modified PublishableEntity in the publish.
"""
assert isinstance(unit, Unit)
unit_pub_entity_version = get_published_version_as_of(unit.publishable_entity_id, publish_log_id)
unit_pub_entity_version = get_published_version_as_of(unit.container.publishable_entity_id, publish_log_id)
if unit_pub_entity_version is None:
return None # This unit was not published as of the given PublishLog ID.
unit_version = unit_pub_entity_version.unitversion # type: ignore[attr-defined]
container_version = unit_pub_entity_version.containerversion

entity_list = []
rows = unit_version.container_version.entity_list.entitylistrow_set.order_by("order_num")
rows = container_version.entity_list.entitylistrow_set.order_by("order_num")
for row in rows:
if row.entity_version is not None:
component_version = row.entity_version.componentversion
Expand Down
9 changes: 0 additions & 9 deletions openedx_learning/apps/authoring/units/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,3 @@ class UnitsConfig(AppConfig):
verbose_name = "Learning Core > Authoring > Units"
default_auto_field = "django.db.models.BigAutoField"
label = "oel_units"

def ready(self):
"""
Register Unit and UnitVersion.
"""
from ..publishing.api import register_content_models # pylint: disable=import-outside-toplevel
from .models import Unit, UnitVersion # pylint: disable=import-outside-toplevel

register_content_models(Unit, UnitVersion)
14 changes: 6 additions & 8 deletions openedx_learning/apps/authoring/units/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,24 @@ class Migration(migrations.Migration):

dependencies = [
('oel_containers', '0001_initial'),
('oel_publishing', '0002_alter_learningpackage_key_and_more'),
]

operations = [
migrations.CreateModel(
name='Unit',
name='UnitVersion',
fields=[
('publishable_entity', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='oel_publishing.publishableentity')),
('container', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='oel_containers.container')),
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('container_version', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='oel_containers.containerversion')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='UnitVersion',
name='Unit',
fields=[
('publishable_entity_version', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='oel_publishing.publishableentityversion')),
('container_version', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='oel_containers.containerversion')),
('unit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='versions', to='oel_units.unit')),
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('container', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='oel_containers.container')),
],
options={
'abstract': False,
Expand Down
16 changes: 9 additions & 7 deletions openedx_learning/apps/authoring/units/models.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
"""
Models that implement units
"""
from django.db import models

from ..containers.models_mixin import ContainerMixin, ContainerVersionMixin

Expand All @@ -14,18 +13,21 @@
class Unit(ContainerMixin):
"""
A Unit is Container, which is a PublishableEntity.

The only purpose of this table at the moment is to distinguish units from
other container types at the database level, and to provide a target for
foreign keys that need to apply only to units (if any?).
"""


class UnitVersion(ContainerVersionMixin):
"""
A UnitVersion is a ContainerVersion, which is a PublishableEntityVersion.
A UnitVersion has a ContainerVersion, which is a PublishableEntityVersion.
"""

# Not sure what other metadata goes here, but we want to try to separate things
# like scheduling information and such into different models.
unit = models.ForeignKey(
Unit,
on_delete=models.CASCADE,
related_name="versions",
)

@property
def unit(self):
return self.container_version.container.unit # pylint: disable=no-member
Loading
Loading