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
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
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
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
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"), ), ))
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", ), ))
def annotate_queryset(self, queryset): return annotate_array_aggregate(queryset, user_ids="membership__user__id")
def serialize_groups(queryset): queryset = annotate_array_aggregate(queryset, member_ids="membership__user__id") return list(queryset.values("id", "name", "member_ids"))
def annotate_queryset(self, queryset): return annotate_array_aggregate( queryset, lesson_assignment_collections="lesson_assignments__collection")
def annotate_queryset(self, queryset): return annotate_array_aggregate( queryset, assignment_ids="lesson_assignments__id")