示例#1
0
文件: views.py 项目: BooleT37/anytask
def tasks_list_one_tasks_many_group(request, course):
    user = request.user
    user_is_attended = False
    user_is_attended_special_course = False
    course.can_edit = course.user_can_edit_course(user)
    students_x_tasks = OrderedDict()
    tasks = list(Task.objects.filter(course=course).order_by('weight'))
    students = []
    for group in course.groups.all().order_by('name'):
        for student in group.students.filter(is_active=True):
            if student == user:
                user_is_attended = True
            elif not course.user_can_see_transcript(user, student):
                continue
            student.group_for_this_course = group
            students.append(student)

    user_is_attended = user in students

    for student in course.students.all():
        if course.user_can_see_transcript(user, student):
            students.extend([student])

    if not user_is_attended and user in students:
        user_is_attended = True
        user_is_attended_special_course = True

    students = sorted(students, key=lambda x:(x.last_name, x.first_name))

    score_max = 0
    for task in tasks:
        score_max += task.score_max
        task.add_user_properties(user)

    for student in students:
        student_task_takens = TaskTaken.objects.filter(task__in=tasks).filter(user=student)
        task_x_task_takens = _group_task_takens_by_task(student_task_takens)

        students_x_tasks.setdefault(student, OrderedDict())
        score_sum = 0
        for task in tasks:
            task_taken = task_x_task_takens.get(task, [TaskTaken()])[0]
            score_sum += task_taken.score
            students_x_tasks[student][task] = task_taken
        student.score_sum = score_sum

    context = {
        'tasks' : tasks,
        'students_x_tasks' : students_x_tasks,
        'score_max' : score_max,

        'course' : course,
        'user_is_attended' : user_is_attended,
        'user_is_attended_special_course' : user_is_attended_special_course,
    }

    return render_to_response('course_tasks_one_tasks_many_group.html', context, context_instance=RequestContext(request))
示例#2
0
def attendance_list(request, course, group=None):
    user = request.user
    user_is_attended = False
    user_is_attended_special_course = False
    show_academ_users = request.session.get("%s_%s_show_academ_users" % (request.user.id, course.id), True)
    msk_time = convert_datetime(localtime(now()), user.get_profile().time_zone)

    course.can_edit = course.user_can_edit_course(user)
    if course.can_be_chosen_by_extern:
        course.groups.add(course.group_with_extern)

    if group:
        groups = [group]
    else:
        groups = course.groups.all().order_by('name')

    group_x_student_x_lessons = OrderedDict()
    group_x_lesson_list = {}
    group_inactive_lessons = {}
    default_teacher = {}

    academ_students = []

    for group in groups:
        group_x_lesson_list[group] = Lesson.objects.filter(course=course, group=group).order_by('position')
        group_inactive_lessons[group] = Lesson.objects.filter(course=course,
                                                              group=group,
                                                              date_starttime__gt=msk_time
                                                              ).order_by('position')
        active_lessons_count = len(group_x_lesson_list[group]) - len(group_inactive_lessons[group])

        students = group.students.filter(is_active=True)
        not_active_students = UserProfile.objects.filter(Q(user__in=group.students.filter(is_active=True)) &
                                                         (Q(user_status__tag='not_active') | Q(
                                                             user_status__tag='academic')))
        academ_students += [x.user for x in not_active_students]
        if not show_academ_users:
            students = set(students) - set(academ_students)

        students_x_lessons = {}

        for student in students:
            if user == student:
                user_is_attended = True
                user_is_attended_special_course = True

            not_visited_lessons = []
            for lssn in group_x_lesson_list[group][:active_lessons_count]:
                if student in lssn.not_visited_students.all():
                    not_visited_lessons.append(lssn)
            students_x_lessons[student] = not_visited_lessons, active_lessons_count - len(not_visited_lessons)

        group_x_student_x_lessons[group] = students_x_lessons

        try:
            default_teacher[group] = DefaultTeacher.objects.get(course=course, group=group).teacher
        except DefaultTeacher.DoesNotExist:
            default_teacher[group] = None
    group_x_student_information = OrderedDict()
    for group, students_x_lessons in group_x_student_x_lessons.iteritems():
        group_x_student_information.setdefault(group, [])

        for student in sorted(students_x_lessons.keys(),
                              key=lambda x: u"{0} {1}".format(x.last_name, x.first_name)):
            if user == student:
                user_is_attended = True
            elif not course.user_can_see_transcript(user, student):
                continue

            group_x_student_information[group].append((student,
                                                       students_x_lessons[student][0], students_x_lessons[student][1]))
    context = {
        'course': course,
        'group_information': group_x_student_information,
        'group_lessons': group_x_lesson_list,
        'group_inactive_lessons': group_inactive_lessons,
        'default_teacher': default_teacher,
        'user': user,
        'user_is_attended': user_is_attended,
        'user_is_attended_special_course': user_is_attended_special_course,
        'user_is_teacher': course.user_is_teacher(user),
        'visible_hide_button_users': len(academ_students),
        'show_academ_students': show_academ_users
    }

    return context
示例#3
0
def tasklist_shad_cpp(request, course, seminar=None, group=None):
    user = request.user
    user_is_attended = False
    user_is_attended_special_course = False

    if seminar:
        groups = seminar.groups.all().order_by('name')
    else:
        groups = course.groups.all().order_by('name')

    course.can_edit = course.user_can_edit_course(user)
    if course.can_be_chosen_by_extern:
        course.groups.add(course.group_with_extern)

    if group:
        groups = [group]

    group_x_student_x_task_takens = OrderedDict()
    group_x_task_list = {}
    group_x_max_score = {}
    default_teacher = {}
    show_hidden_tasks = request.session.get(str(request.user.id) + '_' + str(course.id) + '_show_hidden_tasks', False)
    show_academ_users = request.session.get(str(request.user.id) + '_' + str(course.id) + '_show_academ_users', True)

    academ_students = []

    for group in groups:
        student_x_task_x_task_takens = {}

        tasks_for_groups = TaskGroupRelations.objects \
            .filter(task__course=course, group=group, deleted=False, task__parent_task=seminar) \
            .exclude(task__type=Task.TYPE_MATERIAL) \
            .distinct() \
            .order_by('position') \
            .prefetch_related('task__groups') \
            .select_related('task')

        if show_hidden_tasks:
            group_x_task_list[group] = [x.task for x in tasks_for_groups]
        else:
            group_x_task_list[group] = [x.task for x in tasks_for_groups if not x.task.is_hidden]

        group_x_max_score.setdefault(group, 0)

        for task in group_x_task_list[group]:

            if not task.is_hidden:
                if task.type == task.TYPE_SEMINAR:
                    group_x_max_score[group] += sum([x.score_max for x in task.children.all()])
                else:
                    group_x_max_score[group] += task.score_max
            if task.task_text is None:
                task.task_text = ''

        issues_students_in_group = Issue.objects \
            .filter(task__in=group_x_task_list[group], student__group__in=[group]) \
            .order_by('student')\
            .select_related("task")\
            .prefetch_related('task__groups', 'task')

        issues_x_student = defaultdict(list)
        for issue in issues_students_in_group.all():
            student_id = issue.student.id
            issues_x_student[student_id].append(issue)

        students = group.students.filter(is_active=True)
        not_active_students = UserProfile.objects.filter(
            Q(user__in=group.students.filter(is_active=True)) &
            (
                Q(user_status__tag='not_active') |
                Q(user_status__tag='academic')
            )
        )
        academ_students += [x.user for x in not_active_students]
        if not show_academ_users:
            students = set(students) - set(academ_students)

        for student in students:
            if user == student:
                user_is_attended = True
                user_is_attended_special_course = True

            student_task_takens = issues_x_student[student.id]

            task_x_task_taken = {}
            student_summ_scores = 0
            for task_taken in student_task_takens:
                task_x_task_taken[task_taken.task.id] = task_taken
                if not task_taken.task.is_hidden:
                    if task_taken.task.type == Task.TYPE_SEMINAR or \
                            task_taken.task.score_after_deadline or \
                            not (not task_taken.task.score_after_deadline and
                                 task_taken.is_status_accepted_after_deadline()):
                        student_summ_scores += task_taken.mark

            student_x_task_x_task_takens[student] = (task_x_task_taken, student_summ_scores)

        group_x_student_x_task_takens[group] = student_x_task_x_task_takens

        try:
            default_teacher[group] = DefaultTeacher.objects.get(course=course, group=group).teacher
        except DefaultTeacher.DoesNotExist:
            default_teacher[group] = None

    group_x_student_information = OrderedDict()
    for group, student_x_task_x_task_takens in group_x_student_x_task_takens.iteritems():
        group_x_student_information.setdefault(group, [])

        for student in sorted(student_x_task_x_task_takens.keys(),
                              key=lambda x: u"{0} {1}".format(x.last_name, x.first_name)):
            if user == student:
                user_is_attended = True
            elif not course.user_can_see_transcript(user, student):
                continue

            mark_id, course_mark, course_mark_int = get_course_mark(course, student)

            group_x_student_information[group].append((student,
                                                       student_x_task_x_task_takens[student][0],
                                                       student_x_task_x_task_takens[student][1],
                                                       mark_id,
                                                       course_mark,
                                                       course_mark_int))

    context = {
        'course': course,
        'course_mark_system_vals': course.mark_system.marks.all() if course.mark_system else None,
        'group_information': group_x_student_information,
        'group_tasks': group_x_task_list,
        'group_x_max_score': group_x_max_score,
        'default_teacher': default_teacher,

        'user': user,
        'user_is_attended': user_is_attended,
        'user_is_attended_special_course': user_is_attended_special_course,
        'user_is_teacher': course.user_is_teacher(user),

        'seminar': seminar,
        'visible_queue': course.user_can_see_queue(user),
        'visible_attendance_log': course.user_can_see_attendance_log(request.user),
        'visible_hide_button': Task.objects.filter(Q(course=course) & Q(is_hidden=True)).exists(),
        'show_hidden_tasks': show_hidden_tasks,
        'visible_hide_button_users': len(academ_students),
        'show_academ_users': show_academ_users

    }

    return context
示例#4
0
文件: views.py 项目: znick/anytask
def attendance_list(request, course, group=None):
    user = request.user
    user_is_attended = False
    user_is_attended_special_course = False
    show_academ_users = request.session.get("%s_%s_show_academ_users" % (request.user.id, course.id), True)
    msk_time = convert_datetime(localtime(now()), user.get_profile().time_zone)

    course.can_edit = course.user_can_edit_course(user)
    if course.can_be_chosen_by_extern:
        course.groups.add(course.group_with_extern)

    if group:
        groups = [group]
    else:
        groups = course.groups.all().order_by('name')

    group_x_student_x_lessons = OrderedDict()
    group_x_lesson_list = {}
    group_inactive_lessons = {}
    default_teacher = {}

    academ_students = []

    for group in groups:
        group_x_lesson_list[group] = Lesson.objects.filter(course=course, group=group).order_by('position')
        group_inactive_lessons[group] = Lesson.objects.filter(course=course,
                                                              group=group,
                                                              date_starttime__gt=msk_time
                                                              ).order_by('position')
        active_lessons_count = len(group_x_lesson_list[group]) - len(group_inactive_lessons[group])

        students = group.students.filter(is_active=True)
        not_active_students = UserProfile.objects.filter(Q(user__in=group.students.filter(is_active=True))
                                                         & (Q(user_status__tag='not_active') | Q(
                                                             user_status__tag='academic')))
        academ_students += [x.user for x in not_active_students]
        if not show_academ_users:
            students = set(students) - set(academ_students)

        students_x_lessons = {}

        for student in students:
            if user == student:
                user_is_attended = True
                user_is_attended_special_course = True

            not_visited_lessons = []
            for lssn in group_x_lesson_list[group][:active_lessons_count]:
                if student in lssn.not_visited_students.all():
                    not_visited_lessons.append(lssn)
            students_x_lessons[student] = not_visited_lessons, active_lessons_count - len(not_visited_lessons)

        group_x_student_x_lessons[group] = students_x_lessons

        try:
            default_teacher[group] = DefaultTeacher.objects.get(course=course, group=group).teacher
        except DefaultTeacher.DoesNotExist:
            default_teacher[group] = None
    group_x_student_information = OrderedDict()
    for group, students_x_lessons in group_x_student_x_lessons.iteritems():
        group_x_student_information.setdefault(group, [])

        for student in sorted(students_x_lessons.keys(),
                              key=lambda x: u"{0} {1}".format(x.last_name, x.first_name)):
            if user == student:
                user_is_attended = True
            elif not course.user_can_see_transcript(user, student):
                continue

            group_x_student_information[group].append((student,
                                                       students_x_lessons[student][0], students_x_lessons[student][1]))
    context = {
        'course': course,
        'group_information': group_x_student_information,
        'group_lessons': group_x_lesson_list,
        'group_inactive_lessons': group_inactive_lessons,
        'default_teacher': default_teacher,
        'user': user,
        'user_is_attended': user_is_attended,
        'user_is_attended_special_course': user_is_attended_special_course,
        'user_is_teacher': course.user_is_teacher(user),
        'visible_hide_button_users': len(academ_students),
        'show_academ_students': show_academ_users
    }

    return context
示例#5
0
文件: views.py 项目: znick/anytask
def tasklist_shad_cpp(request, course, seminar=None, group=None):
    user = request.user
    user_is_attended = False
    user_is_attended_special_course = False

    if seminar:
        groups = seminar.groups.all().order_by('name')
    else:
        groups = course.groups.all().order_by('name')

    course.can_edit = course.user_can_edit_course(user)
    if course.can_be_chosen_by_extern:
        course.groups.add(course.group_with_extern)

    if group:
        groups = [group]

    group_x_student_x_task_takens = OrderedDict()
    group_x_task_list = {}
    group_x_max_score = {}
    default_teacher = {}
    show_hidden_tasks = request.session.get(str(request.user.id) + '_' + str(course.id) + '_show_hidden_tasks', False)
    show_academ_users = request.session.get(str(request.user.id) + '_' + str(course.id) + '_show_academ_users', True)

    academ_students = []

    for group in groups:
        student_x_task_x_task_takens = {}

        tasks_for_groups = TaskGroupRelations.objects \
            .filter(task__course=course, group=group, deleted=False, task__parent_task=seminar) \
            .exclude(task__type=Task.TYPE_MATERIAL) \
            .distinct() \
            .order_by('position') \
            .prefetch_related('task__groups') \
            .select_related('task')

        if show_hidden_tasks:
            group_x_task_list[group] = [x.task for x in tasks_for_groups]
        else:
            group_x_task_list[group] = [x.task for x in tasks_for_groups if not x.task.is_hidden]

        group_x_max_score.setdefault(group, 0)

        for task in group_x_task_list[group]:

            if not task.is_hidden:
                if task.type == task.TYPE_SEMINAR:
                    group_x_max_score[group] += sum([x.score_max for x in task.children.all()])
                else:
                    group_x_max_score[group] += task.score_max
            if task.task_text is None:
                task.task_text = ''

        issues_students_in_group = Issue.objects \
            .filter(task__in=group_x_task_list[group], student__group__in=[group]) \
            .order_by('student')\
            .select_related("task")\
            .prefetch_related('task__groups', 'task')

        issues_x_student = defaultdict(list)
        for issue in issues_students_in_group.all():
            student_id = issue.student.id
            issues_x_student[student_id].append(issue)

        students = group.students.filter(is_active=True)
        not_active_students = UserProfile.objects.filter(
            Q(user__in=group.students.filter(is_active=True))
            & (
                Q(user_status__tag='not_active')
                | Q(user_status__tag='academic')
            )
        )
        academ_students += [x.user for x in not_active_students]
        if not show_academ_users:
            students = set(students) - set(academ_students)

        for student in students:
            if user == student:
                user_is_attended = True
                user_is_attended_special_course = True

            student_task_takens = issues_x_student[student.id]

            task_x_task_taken = {}
            student_summ_scores = 0
            for task_taken in student_task_takens:
                task_x_task_taken[task_taken.task.id] = task_taken
                if not task_taken.task.is_hidden:
                    if task_taken.task.type == Task.TYPE_SEMINAR or \
                            task_taken.task.score_after_deadline or \
                            not (not task_taken.task.score_after_deadline
                                 and task_taken.is_status_accepted_after_deadline()):
                        student_summ_scores += task_taken.mark

            student_x_task_x_task_takens[student] = (task_x_task_taken, student_summ_scores)

        group_x_student_x_task_takens[group] = student_x_task_x_task_takens

        try:
            default_teacher[group] = DefaultTeacher.objects.get(course=course, group=group).teacher
        except DefaultTeacher.DoesNotExist:
            default_teacher[group] = None

    group_x_student_information = OrderedDict()
    for group, student_x_task_x_task_takens in group_x_student_x_task_takens.iteritems():
        group_x_student_information.setdefault(group, [])

        for student in sorted(student_x_task_x_task_takens.keys(),
                              key=lambda x: u"{0} {1}".format(x.last_name, x.first_name)):
            if user == student:
                user_is_attended = True
            elif not course.user_can_see_transcript(user, student):
                continue

            mark_id, course_mark, course_mark_int = get_course_mark(course, student)

            group_x_student_information[group].append((student,
                                                       student_x_task_x_task_takens[student][0],
                                                       student_x_task_x_task_takens[student][1],
                                                       mark_id,
                                                       course_mark,
                                                       course_mark_int))

    context = {
        'course': course,
        'course_mark_system_vals': course.mark_system.marks.all() if course.mark_system else None,
        'group_information': group_x_student_information,
        'group_tasks': group_x_task_list,
        'group_x_max_score': group_x_max_score,
        'default_teacher': default_teacher,

        'user': user,
        'user_is_attended': user_is_attended,
        'user_is_attended_special_course': user_is_attended_special_course,
        'user_is_teacher': course.user_is_teacher(user),

        'seminar': seminar,
        'visible_queue': course.user_can_see_queue(user),
        'visible_attendance_log': course.user_can_see_attendance_log(request.user),
        'visible_hide_button': Task.objects.filter(Q(course=course) & Q(is_hidden=True)).exists(),
        'show_hidden_tasks': show_hidden_tasks,
        'visible_hide_button_users': len(academ_students),
        'show_academ_users': show_academ_users

    }

    return context
示例#6
0
文件: views.py 项目: BooleT37/anytask
def tasks_list_many_task_many_group(request, course, get_context=False):
    user = request.user
    user_is_attended = False
    user_is_attended_special_course = False

    course.can_edit = course.user_can_edit_course(user)

    group_x_student_x_task_takens = OrderedDict()
    group_x_task_list = {}
    group_x_max_score = {}

    task = Task()
    task.is_shown = None
    task.is_hidden = None

    for group in course.groups.all().order_by('name'):
        student_x_task_x_task_takens = {}

        group_x_task_list[group] = Task.objects.filter(course=course).filter(group=group).order_by('weight')
        group_x_max_score.setdefault(group, 0)

        for task in group_x_task_list[group]:
            task.add_user_properties(user)

            if not task.is_hidden:
                group_x_max_score[group] += task.score_max
            if task.task_text is None:
                task.task_text = ''

        for student in group.students.filter(is_active=True):
            if user == student:
                user_is_attended = True

            task_list = group_x_task_list[group]

            student_task_takens = TaskTaken.objects.filter(task__in=group_x_task_list[group]).filter(user=student)

            task_x_task_taken = {}
            student_summ_scores = 0
            for task_taken in student_task_takens:
                task_x_task_taken[task_taken.task.id] = task_taken
                if not task_taken.task.is_hidden:
                    student_summ_scores += task_taken.score

            student_x_task_x_task_takens[student] = (task_x_task_taken, student_summ_scores)

        group_x_student_x_task_takens[group] = student_x_task_x_task_takens

    group_x_student_information = OrderedDict()
    for group,student_x_task_x_task_takens in group_x_student_x_task_takens.iteritems():
        group_x_student_information.setdefault(group, [])

        for student in sorted(student_x_task_x_task_takens.keys(), key=lambda x: u"{0} {1}".format(x.last_name, x.first_name)):
            if user == student:
                user_is_attended = True
            elif not course.user_can_see_transcript(user, student):
                continue

            group_x_student_information[group].append((student, student_x_task_x_task_takens[student][0], student_x_task_x_task_takens[student][1]))


    extern_max_score = 0
    extern_student_x_task_takens = {}

    extern_tasks = Task.objects.filter(course=course).filter(group=None).order_by('weight')
    for task in extern_tasks:
        task.add_user_properties(user)

        if not task.is_hidden:
            extern_max_score += task.score_max
        if task.task_text is None:
            task.task_text = ''


    task_takens = TaskTaken.objects.filter(task__in=extern_tasks)
    for student in course.students.all():
        if user == student:
            user_is_attended = True
            user_is_attended_special_course = True
        elif not course.user_can_see_transcript(user, student):
            continue

        task_x_task_taken = {}

        student_summ_scores = 0
        student_task_takens = filter(lambda x: x.user == student, task_takens)

        for task_taken in student_task_takens:
            task_x_task_taken[task_taken.task.id] = task_taken
            if not task_taken.task.is_hidden:
                student_summ_scores += task_taken.score

        extern_student_x_task_takens[student] = (task_x_task_taken, student_summ_scores)

    extern_student_information = []
    for student in sorted(extern_student_x_task_takens.keys(), key=lambda x: u"{0} {1}".format(x.last_name, x.first_name)):
        if user == student:
            user_is_attended = True

        extern_student_information.append((student, extern_student_x_task_takens[student][0], extern_student_x_task_takens[student][1]))

    context = {
        'course'        : course,
        'group_information'   : group_x_student_information,
        'group_tasks'   : group_x_task_list,
        'group_x_max_score' : group_x_max_score,

        'extern_max_score' : extern_max_score,
        'extern_tasks'  : extern_tasks,
        'extern_student_information' : extern_student_information,

        'user' : user,
        'user_is_attended' : user_is_attended,
        'user_is_attended_special_course' : user_is_attended_special_course,

        'visible_queue' : course.user_can_see_queue(user),
    }

    if get_context:
        return context
    else:
        return render_to_response('courses/course_page.html', context, context_instance=RequestContext(request))
示例#7
0
文件: views.py 项目: BooleT37/anytask
def tasklist_shad_cpp(request, course):

    user = request.user
    user_is_attended = False
    user_is_attended_special_course = False

    course.can_edit = course.user_can_edit_course(user)
    if course.can_be_chosen_by_extern:
        course.groups.add(course.group_with_extern)

    group_x_student_x_task_takens = OrderedDict()
    group_x_task_list = {}
    group_x_max_score = {}

    task = Task()
    task.is_shown = None
    task.is_hidden = None

    events_with_mark = Event.objects.filter(field_id=8).filter(author__in=course.teachers.all()).order_by('issue','timestamp')
    marks_for_issues = {}
    for event in events_with_mark:
        marks_for_issues[event.issue.id] = event.value
    
    for group in course.groups.all().order_by('name'):
        student_x_task_x_task_takens = {}

        group_x_task_list[group] = Task.objects.filter(Q(course=course) & (Q(group=group) | Q(group=None))).order_by('weight')
        group_x_max_score.setdefault(group, 0)

        for task in group_x_task_list[group]:
            task.add_user_properties(user)

            if not task.is_hidden:
                group_x_max_score[group] += task.score_max
            if task.task_text is None:
                task.task_text = ''

        issues_students_in_group = Issue.objects.filter(task__in=group_x_task_list[group]).filter(student__group__in=[group]).order_by('student')

        from collections import defaultdict
        issues_x_student = defaultdict(list)
        for issue in issues_students_in_group.all():
            student_id = issue.student.id
            issues_x_student[student_id].append(issue)

        for student in group.students.filter(is_active=True):
            if user == student:
                user_is_attended = True
                user_is_attended_special_course = True

            task_list = group_x_task_list[group]

            student_task_takens = issues_x_student[student.id]

            task_x_task_taken = {}
            student_summ_scores = 0
            for task_taken in student_task_takens:
                task_x_task_taken[task_taken.task.id] = task_taken
                if not task_taken.task.is_hidden:
                    student_summ_scores += marks_for_issues[task_taken.id]

            student_x_task_x_task_takens[student] = (task_x_task_taken, student_summ_scores)

        group_x_student_x_task_takens[group] = student_x_task_x_task_takens

    group_x_student_information = OrderedDict()
    for group,student_x_task_x_task_takens in group_x_student_x_task_takens.iteritems():
        group_x_student_information.setdefault(group, [])

        for student in sorted(student_x_task_x_task_takens.keys(), key=lambda x: u"{0} {1}".format(x.last_name, x.first_name)):
            if user == student:
                user_is_attended = True
            elif not course.user_can_see_transcript(user, student):
                continue

            group_x_student_information[group].append((student, student_x_task_x_task_takens[student][0], student_x_task_x_task_takens[student][1]))


    extern_max_score = 0
    extern_student_x_task_takens = {}

    extern_tasks = Task.objects.filter(course=course).filter(group=None).order_by('weight')
    for task in extern_tasks:
        task.add_user_properties(user)

        if not task.is_hidden:
            extern_max_score += task.score_max
        if task.task_text is None:
            task.task_text = ''


    task_takens = TaskTaken.objects.filter(task__in=extern_tasks)
    for student in course.students.all():
        if user == student:
            user_is_attended = True
            user_is_attended_special_course = True
        elif not course.user_can_see_transcript(user, student):
            continue

        task_x_task_taken = {}

        student_summ_scores = 0
        student_task_takens = filter(lambda x: x.user == student, task_takens)

        for task_taken in student_task_takens:
            task_x_task_taken[task_taken.task.id] = task_taken
            if not task_taken.task.is_hidden:
                student_summ_scores += task_taken.score

        extern_student_x_task_takens[student] = (task_x_task_taken, student_summ_scores)

    extern_student_information = []
    for student in sorted(extern_student_x_task_takens.keys(), key=lambda x: u"{0} {1}".format(x.last_name, x.first_name)):
        if user == student:
            user_is_attended = True

        extern_student_information.append((student, extern_student_x_task_takens[student][0], extern_student_x_task_takens[student][1]))

    context = {
        'course'        : course,
        'group_information'   : group_x_student_information,
        'group_tasks'   : group_x_task_list,
        'group_x_max_score' : group_x_max_score,

        'extern_max_score' : extern_max_score,
        'extern_tasks'  : extern_tasks,
        'extern_student_information' : extern_student_information,

        'user' : user,
        'user_is_attended' : user_is_attended,
        'user_is_attended_special_course' : user_is_attended_special_course,
        'user_is_teacher': course.user_is_teacher(user),
        
        'visible_queue' : course.user_can_see_queue(user),
    }

    return context