VBV-459: Add flag for user course completion self toggle

This commit is contained in:
Daniel Egger 2023-06-26 17:57:05 +02:00
parent 3bd489d2ae
commit 1b7a3a401e
8 changed files with 165 additions and 2 deletions

View File

@ -138,6 +138,7 @@ const learningSequenceBorderClass = computed(() => {
value: learningContent.completion_status,
checked: learningContent.completion_status === 'SUCCESS',
}"
:disabled="!learningContent.can_user_self_toggle_course_completion"
:data-cy="`${learningContent.slug}-checkbox`"
@toggle="toggleCompleted(learningContent)"
/>

View File

@ -43,6 +43,7 @@ export interface LearningContentInterface extends BaseCourseWagtailPage {
readonly minutes: number;
readonly description: string;
readonly content_url: string;
readonly can_user_self_toggle_course_completion: boolean;
parentCircle: Circle;
parentLearningSequence?: LearningSequence;
parentLearningUnit?: LearningUnit;

View File

@ -0,0 +1,22 @@
# Generated by Django 3.2.13 on 2023-06-26 15:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("competence", "0002_performancecriteria_learning_unit"),
]
operations = [
migrations.AddField(
model_name="performancecriteria",
name="can_user_self_toggle_course_completion",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="performancecriteria",
name="has_course_completion_status",
field=models.BooleanField(default=True),
),
]

View File

@ -75,6 +75,8 @@ class PerformanceCriteria(CourseBasePage):
blank=True,
on_delete=models.SET_NULL,
)
has_course_completion_status = models.BooleanField(default=True)
can_user_self_toggle_course_completion = models.BooleanField(default=True)
content_panels = [
FieldPanel("title"),

View File

@ -10,7 +10,15 @@ def mark_course_completion(
f"Invalid value for CourseCompletionStatus: {completion_status}"
)
# TODO: check if this page can be "marked" by user
if not (
hasattr(page.specific, "has_course_completion_status")
and page.specific.has_course_completion_status
):
return ValueError(
f"Page {page.id} of type {get_wagtail_type(page)}"
f" cannot be marked as completed"
)
cc, created = CourseCompletion.objects.get_or_create(
user_id=user.id,
page_id=page.id,

View File

@ -0,0 +1,112 @@
# Generated by Django 3.2.13 on 2023-06-26 15:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("learnpath", "0007_learningunit_title_hidden"),
]
operations = [
migrations.AddField(
model_name="learningcontentassignment",
name="can_user_self_toggle_course_completion",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name="learningcontentassignment",
name="has_course_completion_status",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentattendancecourse",
name="can_user_self_toggle_course_completion",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name="learningcontentattendancecourse",
name="has_course_completion_status",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentdocumentlist",
name="can_user_self_toggle_course_completion",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentdocumentlist",
name="has_course_completion_status",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentfeedback",
name="can_user_self_toggle_course_completion",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentfeedback",
name="has_course_completion_status",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentlearningmodule",
name="can_user_self_toggle_course_completion",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentlearningmodule",
name="has_course_completion_status",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentmedialibrary",
name="can_user_self_toggle_course_completion",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentmedialibrary",
name="has_course_completion_status",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentplaceholder",
name="can_user_self_toggle_course_completion",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentplaceholder",
name="has_course_completion_status",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentrichtext",
name="can_user_self_toggle_course_completion",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentrichtext",
name="has_course_completion_status",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontenttest",
name="can_user_self_toggle_course_completion",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name="learningcontenttest",
name="has_course_completion_status",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentvideo",
name="can_user_self_toggle_course_completion",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="learningcontentvideo",
name="has_course_completion_status",
field=models.BooleanField(default=True),
),
]

View File

@ -234,17 +234,21 @@ class LearningContent(CourseBasePage):
"minutes",
"description",
"content_url",
"can_user_self_toggle_course_completion",
]
minutes = models.PositiveIntegerField(default=15)
description = RichTextField(blank=True)
content_url = models.TextField(blank=True)
has_course_completion_status = models.BooleanField(default=True)
can_user_self_toggle_course_completion = models.BooleanField(default=False)
content_panels = [
FieldPanel("title", classname="full title"),
FieldPanel("minutes"),
FieldPanel("content_url"),
FieldPanel("description"),
FieldPanel("can_user_self_toggle_course_completion"),
]
def get_admin_display_title(self):
@ -290,26 +294,31 @@ class LearningContentAttendanceCourse(LearningContent):
class LearningContentVideo(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
can_user_self_toggle_course_completion = models.BooleanField(default=True)
class LearningContentPlaceholder(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
can_user_self_toggle_course_completion = models.BooleanField(default=True)
class LearningContentFeedback(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
can_user_self_toggle_course_completion = models.BooleanField(default=True)
class LearningContentLearningModule(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
can_user_self_toggle_course_completion = models.BooleanField(default=True)
class LearningContentMediaLibrary(LearningContent):
parent_page_types = ["learnpath.Circle"]
subpage_types = []
can_user_self_toggle_course_completion = models.BooleanField(default=True)
class LearningContentTest(LearningContent):
@ -328,6 +337,7 @@ class LearningContentTest(LearningContent):
class LearningContentRichText(LearningContent):
text = RichTextField(blank=True, features=DEFAULT_RICH_TEXT_FEATURES_WITH_HEADER)
can_user_self_toggle_course_completion = models.BooleanField(default=True)
parent_page_types = ["learnpath.Circle"]
serialize_field_names = LearningContent.serialize_field_names + [
@ -368,6 +378,8 @@ class LearningContentAssignment(LearningContent):
class LearningContentDocumentList(LearningContent):
can_user_self_toggle_course_completion = models.BooleanField(default=True)
serialize_field_names = LearningContent.serialize_field_names + [
"documents",
]

View File

@ -10,7 +10,12 @@ from vbv_lernwelt.learnpath.models import LearningUnit
class LearningUnitSerializer(
get_course_serializer_class(
LearningUnit,
field_names=["evaluate_url", "course_category", "children", "title_hidden"],
field_names=[
"evaluate_url",
"course_category",
"children",
"title_hidden",
],
)
):
evaluate_url = SerializerMethodField()