Merged in feature/bugfix-objective-snapshot-order (pull request #145)

Insert content block in correct location when migrating  snapshots
This commit is contained in:
Lorenz Padberg 2024-03-04 13:42:21 +00:00
commit 763b19a2f0
4 changed files with 36 additions and 22 deletions

View File

@ -24,11 +24,8 @@ class Command(BaseCommand):
- Verlagsinhalte - deafult content blocks are referced in the snapshot by foreign key
Man muss unterscheiden zwischen, snapshots die nur Verlagslernziele sichtbar und unsichtbar machen.
Und solchen die auch benutzerdefinierte Lernziele sichtbar und unsichtbar machen.
Es gibt keine custom objective groups!
Es gibt keine hidden custom objective_groups
Case1:
@ -113,7 +110,6 @@ def migrate_snapshots():
visible_objectives = visible_default_objectives + visible_custom_objectives
# filter for unique texts in objectives
# TODO: I don't know why there are duplicated objectives
objectives_by_texts = {}
for objective in visible_objectives:
if objective.text not in objectives_by_texts:
@ -203,7 +199,8 @@ def get_objectives_group_snapshots_in_specific_order(module: Module, snapshot: S
# https://stackoverflow.com/questions/5966462/sort-queryset-by-values-in-list
# https://docs.djangoproject.com/en/5.0/ref/models/conditional-expressions/
order_of_objective_groups = ["language_communication", "society", "interdisciplinary"]
_whens = [models.When(objective_group__title=value, then=sort_index) for sort_index, value in enumerate(order_of_objective_groups)]
_whens = [models.When(objective_group__title=value, then=sort_index) for sort_index, value in
enumerate(order_of_objective_groups)]
qs = snapshot.objective_groups.through.objects.filter(
objective_group__module=module,

View File

@ -237,16 +237,34 @@ def create_content_block_from_objective(objective_group, chapter, owner=None):
return content_block
def insert_content_block(chapter, content_block):
"" "Inserts the content block into the chapter."""
if chapter.title != "Lernziele":
return chapter
siblings = chapter.get_children()
siblings_titles = [sibling.title for sibling in siblings]
# get the index of the last occurrence of the title
target_position = len(siblings_titles) - 1 - siblings_titles[::-1].index(content_block.title)
target_child = siblings[target_position]
target_child.add_sibling(instance=content_block, pos="left")
return chapter
def create_content_block_snapshot_from_objective(objective_group, chapter, snapshot, owner=None):
content_block_snapshot = ContentBlockSnapshot(
title=f"{objective_group.get_title_display()}",
type="normal",
owner=owner,
#original_creator=owner,
user_created=owner is not None,
snapshot=snapshot
)
chapter.add_child(instance=content_block_snapshot)
insert_content_block(chapter, content_block_snapshot)
return content_block_snapshot

View File

@ -41,24 +41,23 @@ class TestSnapshotMigration(SkillboxTestCase):
ChapterFactory(parent=self.module, slug='some-other-chapter', owner=self.admin)
objective_group = ObjectiveGroupFactory(module=self.module, title='society')
second_objective_group = ObjectiveGroupFactory(module=self.module, title='language_communication')
self.visible_objective = ObjectiveFactory(text='visible-objective', group=objective_group)
self.visible_objective_2 = ObjectiveFactory(text='hidden-objective', group=objective_group)
self.custom_objective = ObjectiveFactory(text='custom-objective', group=objective_group, owner=self.teacher)
self.custom_hidden_objective = ObjectiveFactory(text='custom-hidden-objective', group=objective_group,
owner=self.teacher)
self.visible_objective = ObjectiveFactory(text='objective1', group=second_objective_group)
self.custom_objective.visible_for.add(self.skillbox_class)
self.custom_objective.save()
self.custom_hidden_objective = ObjectiveFactory(text='custom-hidden-objective', group=objective_group,
owner=self.teacher)
self.custom_hidden_objective.visible_for.remove(self.skillbox_class)
self.custom_hidden_objective.save()
second_objective_group = ObjectiveGroupFactory(module=self.module, title='language_communication')
self.visible_objective = ObjectiveFactory(text='objective1', group=second_objective_group)
second_objective_group.hidden_for.add(self.skillbox_class)
second_objective_group.save()
self.custom_hidden_objective.visible_for.remove(self.skillbox_class)
self.snapshot1 = Snapshot.objects.create_snapshot(self.module, self.skillbox_class, self.teacher)
migrate_objectives_to_content()
@ -67,10 +66,13 @@ class TestSnapshotMigration(SkillboxTestCase):
# Change visibility of objectives resp. content blocks, hide all
for content_block in ContentBlock.objects.all().descendant_of(self.chapter):
for content_block in ContentBlock.objects.all().descendant_of(self.module):
if content_block.owner is None:
print(f"Titel verlagsinhalt {content_block.title}")
content_block.hidden_for.add(self.skillbox_class)
else:
print(f"Titel Benutzerinhal {content_block.title}")
content_block.visible_for.remove(self.skillbox_class)
content_block.save()
@ -138,7 +140,6 @@ class TestSnapshotMigration(SkillboxTestCase):
self.assertEqual(default_content['hiddenFor'], [{'name': 'skillbox'}])
def test_snapshot_migration_hidden_custom_content_apply_snapshot(self):
# custom content from bevore the snapshot must be hidden (visible for nobody)
self.snapshot1.apply(self.teacher, self.school_class)
result = self.client.execute(MODULE_QUERY, variables={
@ -150,14 +151,13 @@ class TestSnapshotMigration(SkillboxTestCase):
self.assertEqual(custom['title'], 'Gesellschaft')
self.assertTrue(custom['userCreated'])
self.assertTrue(custom['originalCreator'] is not None)
self.assertTrue(custom['originalCreator'] is None)
self.assertEqual(custom['hiddenFor'], [])
self.assertEqual(custom['visibleFor'], [])
self.assertEqual(custom['visibleFor'], [{'name': 'skillbox'}])
self.assertEqual(custom['contents'][0]['value']['text'],
'<ul><li>visible-objective</li><li>hidden-objective</li><li>custom-objective</li></ul>')
def test_snapshot_migration_hidden_content_block_apply_snapshot_2(self):
# custom content from bevore the snapshot must be hidden (visible for nobody)
self.snapshot1.apply(self.teacher, self.school_class)
result = self.client.execute(MODULE_QUERY, variables={
@ -184,7 +184,7 @@ class TestSnapshotMigration(SkillboxTestCase):
})
module = result.data['module']
chapter1 = module['chapters'][0]
_, _, _, new_content_block = chapter1['contentBlocks']
_, _, new_content_block, _ = chapter1['contentBlocks']
self.assertEqual(new_content_block['title'], 'Gesellschaft')
self.assertTrue(new_content_block['userCreated'])

View File

@ -7,6 +7,5 @@ pg_dump -Fc --no-acl -h localhost -U skillbox skillbox > latest-migrated-objecti
python manage.py migrate_objective_snapshots
pg_dump -Fc --no-acl -h localhost -U skillbox skillbox > latest-migrated-objectives-and-snapshots.dump
#Use this command to restore the database from the dump:
#pg_restore --verbose --clean --no-acl --no-owner -h localhost -U skillbox -d skillbox latest-migrated-objectives.dump