Пример #1
0
 def consolidate(self, items):
     assignment_ids = []
     for item in items:
         assignment_ids.extend(item["assignment_ids"])
     assignments = LessonAssignment.objects.filter(id__in=assignment_ids)
     assignments = annotate_array_aggregate(
         assignments, learner_ids="collection__membership__user__id")
     assignments = {
         a["id"]: a
         for a in assignments.values(
             "id",
             "collection",
             "learner_ids",
             "assigned_by",
             collection_kind=F("collection__kind"),
         )
     }
     for item in items:
         item_ids = item.pop("assignment_ids")
         item["lesson_assignments"] = [assignments[a] for a in item_ids]
         item["learner_ids"] = list(
             set(
                 chain.from_iterable(
                     a.pop("learner_ids")
                     for a in item["lesson_assignments"])))
     return items
Пример #2
0
    def consolidate(self, items, queryset):
        if items:
            lesson_ids = [l["id"] for l in items]
            adhoc_assignments = LessonAssignment.objects.filter(
                lesson_id__in=lesson_ids, collection__kind=ADHOCLEARNERSGROUP)
            adhoc_assignments = annotate_array_aggregate(
                adhoc_assignments,
                learner_ids="collection__membership__user_id")
            adhoc_assignments = {
                a["lesson"]: a
                for a in adhoc_assignments.values("collection", "lesson",
                                                  "learner_ids")
            }
            for item in items:
                if item["id"] in adhoc_assignments:
                    adhoc_assignment = adhoc_assignments[item["id"]]
                    item["learner_ids"] = adhoc_assignments[
                        item["id"]]["learner_ids"]
                    item["lesson_assignments"] = [
                        i for i in item["lesson_assignments"]
                        if i != adhoc_assignment["collection"]
                    ]
                else:
                    item["learner_ids"] = []
                item["resources"] = item["resources"] or []

        return items
Пример #3
0
    def consolidate(self, items, queryset):
        if items:
            exam_ids = [e["id"] for e in items]
            adhoc_assignments = models.ExamAssignment.objects.filter(
                exam_id__in=exam_ids, collection__kind=ADHOCLEARNERSGROUP
            )
            adhoc_assignments = annotate_array_aggregate(
                adhoc_assignments, learner_ids="collection__membership__user_id"
            )
            adhoc_assignments = {
                a["exam"]: a
                for a in adhoc_assignments.values("collection", "exam", "learner_ids")
            }
            for item in items:
                if item["id"] in adhoc_assignments:
                    adhoc_assignment = adhoc_assignments[item["id"]]
                    item["learner_ids"] = adhoc_assignments[item["id"]]["learner_ids"]
                    item["assignments"] = [
                        i
                        for i in item["assignments"]
                        if i != adhoc_assignment["collection"]
                    ]
                else:
                    item["learner_ids"] = []

        return items
Пример #4
0
def get_assignments(user, summarylog, attempt=False):
    """
    Returns all Lessons assigned to the user having the content_id
    """
    memberships = user.memberships.all()
    # If the user is not in any classroom nor group, nothing to notify
    if not memberships.exists():
        return []

    content_id = summarylog.content_id
    channel_id = summarylog.channel_id
    learner_collections = memberships.values_list("collection_id", flat=True)

    # Return only active Lessons that are assigned to the requesting user's groups
    filtered_lessons = (annotate_array_aggregate(
        Lesson.objects.filter(
            lesson_assignments__collection_id__in=learner_collections,
            is_active=True,
            resources__regex=r"" + content_id + "",
        ),
        assignment_collections="lesson_assignments__collection_id",
    ).distinct().values("id",
                        "resources",
                        "assignment_collections",
                        classroom_id=F("collection_id")))
    # get the contentnode_id for each lesson:
    lesson_contentnode_map = {
        lesson["id"]: r["contentnode_id"]
        for lesson in filtered_lessons for r in lesson["resources"]
        if (r["content_id"] == content_id and r["channel_id"] == channel_id)
    }
    if attempt:
        # This part is for the NeedsHelp event. These Events can only be triggered on Exercises:
        to_delete = []
        content_nodes = ContentNode.objects.filter(
            pk__in=lesson_contentnode_map.values()).in_bulk()
        for lesson_id, contentnode_id in lesson_contentnode_map.items():
            content_node = content_nodes[contentnode_id]
            if content_node.kind != content_kinds.EXERCISE:
                to_delete.append(lesson_id)
        for lesson_id in to_delete:
            del lesson_contentnode_map[lesson_id]
    # Returns all the affected lessons with the touched contentnode_id, Resource must be inside a lesson
    lesson_resources = [(lesson, lesson_contentnode_map[lesson["id"]])
                        for lesson in filtered_lessons
                        if lesson["id"] in lesson_contentnode_map]

    learner_collections_set = set(learner_collections)
    # Try to find out if the lesson is being executed assigned to a Classroom or to a LearnerGroup:
    for lesson, contentnode_id in lesson_resources:
        lesson["assignment_collections"] = list(
            set(lesson["assignment_collections"]).intersection(
                learner_collections_set))

    return lesson_resources
Пример #5
0
def serialize_lessons(queryset):
    queryset = annotate_array_aggregate(
        queryset, assignments="lesson_assignments__collection")
    return list(
        map(
            _map_lesson,
            queryset.values(
                "id",
                "title",
                "resources",
                "assignments",
                "description",
                "date_created",
                active=F("is_active"),
            ),
        ))
Пример #6
0
def serialize_exams(queryset):
    queryset = annotate_array_aggregate(
        queryset, exam_assignments="assignments__collection")
    return list(
        map(
            _map_exam,
            queryset.values(
                "id",
                "title",
                "active",
                "question_sources",
                "data_model_version",
                "question_count",
                "learners_see_fixed_order",
                "seed",
                "date_created",
                "date_archived",
                "date_activated",
                "archive",
                "exam_assignments",
            ),
        ))
Пример #7
0
 def annotate_queryset(self, queryset):
     return annotate_array_aggregate(queryset, user_ids="membership__user__id")
Пример #8
0
def serialize_groups(queryset):
    queryset = annotate_array_aggregate(queryset, member_ids="membership__user__id")
    return list(queryset.values("id", "name", "member_ids"))
Пример #9
0
 def annotate_queryset(self, queryset):
     return annotate_array_aggregate(
         queryset,
         lesson_assignment_collections="lesson_assignments__collection")
Пример #10
0
 def annotate_queryset(self, queryset):
     return annotate_array_aggregate(
         queryset, assignment_ids="lesson_assignments__id")