Пример #1
0
def _group_info(course, group, members):
    """
    Collect all info about a group we need for display
    """
    group_min = course.group_min() or 1
    group_max = course.group_max() or 50

    gmembers = members.filter(group=group)
    all_act = all_activities(gmembers)
    unique_members = []
    for s in set(m.student for m in gmembers):
        # confirmed in group?
        confirmed = False not in (m.confirmed for m in gmembers
                                  if m.student == s)
        # not a member for any activities?
        missing = all_act - set(m.activity for m in gmembers if m.student == s)
        missing = list(missing)
        missing.sort()
        unique_members.append({
            'member': s,
            'confirmed': confirmed,
            'missing': missing
        })
    all_act = list(all_act)
    all_act.sort()
    # other attributes for easy display
    email = ",".join([
        "%s <%s>" % (m['member'].person.name(), m['member'].person.email())
        for m in unique_members
    ])

    size_message = ''
    headcount = GroupMember.objects.filter(
        group=group).values('student').order_by().distinct().count()
    if group_min and headcount < group_min:
        # total size too small
        size_message = 'Only %i members.' % (headcount)
    elif group_max and headcount > group_max:
        # total size too large
        size_message = 'Has %i members.' % (headcount)
    elif group_min:
        # check size for each activity
        act_count = defaultdict(int)
        for m in group.groupmember_set.all().select_related('activity'):
            act_count[m.activity] += 1
        bad_act = [
            act.name for act, count in list(act_count.items())
            if count < group_min
        ]
        if bad_act:
            size_message = 'Too small for %s.' % (', '.join(bad_act))
    return {
        'group': group,
        'activities': all_act,
        'unique_members': unique_members,
        'memb': members,
        'email': email,
        'size_message': size_message
    }
Пример #2
0
def _groupmanage_student(request, course_slug):
    course = get_object_or_404(CourseOffering, slug=course_slug)
    group_min = course.group_min()

    groups = Group.objects.filter(courseoffering=course, groupmember__student__person__userid=request.user.username)
    groups = set(groups) # all groups student is a member of

    groupList = []
    my_membership = []
    for group in groups:
        members = group.groupmember_set.all().select_related('activity', 'student', 'student__person')
        need_conf = members.filter(student__person__userid=request.user.username, confirmed=False).count() != 0
        all_act = all_activities(members)
        unique_members = []
        for s in set(m.student for m in members):
            # confirmed in group?
            confirmed = False not in (m.confirmed for m in members if m.student==s)
            # not a member for any activities?
            missing = all_act - set(m.activity for m in members if m.student==s)
            missing = list(missing)
            missing.sort()
            unique_members.append( {'member': s, 'confirmed': confirmed, 'missing': missing} )

        # check minimum size problems
        size_message = ''
        headcount = GroupMember.objects.filter(group=group).values('student').order_by().distinct().count()
        if group_min and headcount < group_min:
            # total size too small
            size_message = 'Groups in this course must have at least %i members.' % (group_min)
        #elif group_max and headcount > group_max:
        #    # total size too large
        #    size_message = 'Groups in this course must have at most %i members.' % (group_max)
        else:
            # check size for each activity
            act_count = defaultdict(int)
            for m in members:
                act_count[m.activity] += 1
            bad_act = [act.name for act,count in act_count.items() if count < group_min]
            if bad_act:
                size_message = 'Groups in this course must have at least %i members: this group doesn\'t for %s.' % (group_min, ', '.join(bad_act))

        all_act = list(all_act)
        all_act.sort()
        groupList.append({'group': group, 'activities': all_act, 'unique_members': unique_members, 'memb': members,
                          'need_conf': need_conf, 'size_message': size_message})

    return render(request, 'groups/student.html', {'course':course, 'groupList':groupList})
Пример #3
0
def _group_info(course, group, members):
    """
    Collect all info about a group we need for display
    """
    group_min = course.group_min()
    group_max = course.group_max()

    gmembers = members.filter(group=group)
    all_act = all_activities(gmembers)
    unique_members = []
    for s in set(m.student for m in gmembers):
        # confirmed in group?
        confirmed = False not in (m.confirmed for m in gmembers if m.student==s)
        # not a member for any activities?
        missing = all_act - set(m.activity for m in gmembers if m.student==s)
        missing = list(missing)
        missing.sort()
        unique_members.append( {'member': s, 'confirmed': confirmed, 'missing': missing} )
    all_act = list(all_act)
    all_act.sort()
    # other attributes for easy display
    email = ",".join(["%s <%s>" % (m['member'].person.name(), m['member'].person.email()) for m in unique_members])

    size_message = ''
    headcount = GroupMember.objects.filter(group=group).values('student').order_by().distinct().count()
    if group_min and headcount < group_min:
        # total size too small
        size_message = 'Only %i members.' % (headcount)
    elif group_max and headcount > group_max:
        # total size too large
        size_message = 'Has %i members.' % (headcount)
    else:
        # check size for each activity
        act_count = defaultdict(int)
        for m in group.groupmember_set.all().select_related('activity'):
            act_count[m.activity] += 1
        bad_act = [act.name for act,count in act_count.items() if count < group_min]
        if bad_act:
            size_message = 'Too small for %s.' % (', '.join(bad_act))
    return {'group': group, 'activities': all_act, 'unique_members': unique_members, 'memb': members,
                          'email': email, 'size_message': size_message}
Пример #4
0
def invite(request, course_slug, group_slug):
    #TODO need to validate the student who is invited, cannot be the invitor him/herself.
    course = get_object_or_404(CourseOffering, slug=course_slug)
    group = get_object_or_404(Group, courseoffering=course, slug=group_slug)
    person = get_object_or_404(Person, userid=request.user.username)
    invitor = get_object_or_404(Member,
                                ~Q(role='DROP'),
                                person=person,
                                offering=course)
    error_info = None
    group_max = course.group_max()
    from django import forms

    class StudentReceiverForm(forms.Form):
        name = forms.CharField()

    if request.method == "POST":
        student_receiver_form = StudentReceiverForm(request.POST)
        #student_receiver_form.activate_addform_validation(course_slug,group_slug)
        if student_receiver_form.is_valid():
            name = student_receiver_form.cleaned_data['name']

            existing = GroupMember.objects.filter(
                group=group).values('student').order_by().distinct().count()
            if group_max and existing >= group_max:
                messages.add_message(
                    request, messages.ERROR,
                    'Group already has %s members, which is the maximum.' %
                    (group_max))
                return HttpResponseRedirect(
                    reverse('offering:groups:groupmanage',
                            kwargs={'course_slug': course_slug}))

            members = Member.objects.filter(person__userid=name,
                                            offering=course,
                                            role="STUD")
            if not members:
                messages.add_message(request, messages.ERROR,
                                     'Could not find userid "%s".' % (name))
                return HttpResponseRedirect(
                    reverse('offering:groups:groupmanage',
                            kwargs={'course_slug': course_slug}))
            member = members[0]

            # find out if this person is already in a group
            gms = group.groupmember_set.all()
            all_act = all_activities(gms)
            existing_memb = GroupMember.objects.filter(student=member,
                                                       activity__in=all_act)

            if GroupMember.objects.filter(student=member, group=group):
                messages.add_message(
                    request, messages.ERROR,
                    "%s is already in this group" % (member.person.userid))
            elif existing_memb:
                error = "%s is already in a group for %s" % (
                    member.person.userid, ", ".join(m.activity.name
                                                    for m in existing_memb))
                messages.add_message(request, messages.ERROR, error)
            else:
                #member = Member.objects.get(person = member.person, offering = course)
                for invitorMembership in GroupMember.objects.filter(
                        group=group, student=invitor):
                    newGroupMember = GroupMember(
                        group=group,
                        student=member,
                        activity=invitorMembership.activity,
                        confirmed=False)
                    newGroupMember.save(member.person)

                    #LOG EVENT#
                    l = LogEntry(
                        userid=request.user.username,
                        description=
                        "invited %s to join group %s for activity %s." %
                        (newGroupMember.student.person.userid, group.name,
                         newGroupMember.activity),
                        related_object=newGroupMember)
                    l.save()

                n = NewsItem(
                    user=member.person,
                    author=person,
                    course=group.courseoffering,
                    source_app="group",
                    title="Group Invitation",
                    content="You have been invited to join group %s." %
                    (group.name),
                    url=reverse('offering:groups:groupmanage',
                                kwargs={'course_slug': course.slug}))
                n.save()
                messages.add_message(
                    request, messages.SUCCESS,
                    'Your invitation to %s has been sent out.' %
                    (member.person.name()))

            return HttpResponseRedirect(
                reverse('offering:groups:groupmanage',
                        kwargs={'course_slug': course_slug}))
        else:
            messages.add_message(request, messages.ERROR, "Invalid userid.")
            return HttpResponseRedirect(
                reverse('offering:groups:groupmanage',
                        kwargs={'course_slug': course_slug}))
    else:
        student_receiver_form = StudentReceiverForm()
        context = {'course': course, 'form': student_receiver_form}
        return render(request, "groups/invite.html", context)
Пример #5
0
def _groupmanage_student(request, course_slug):
    course = get_object_or_404(CourseOffering, slug=course_slug)
    group_min = course.group_min()

    groups = Group.objects.filter(
        courseoffering=course,
        groupmember__student__person__userid=request.user.username)
    groups = set(groups)  # all groups student is a member of

    groupList = []
    my_membership = []
    for group in groups:
        members = group.groupmember_set.all().select_related(
            'activity', 'student', 'student__person')
        need_conf = members.filter(
            student__person__userid=request.user.username,
            confirmed=False).count() != 0
        all_act = all_activities(members)
        unique_members = []
        for s in set(m.student for m in members):
            # confirmed in group?
            confirmed = False not in (m.confirmed for m in members
                                      if m.student == s)
            # not a member for any activities?
            missing = all_act - set(m.activity
                                    for m in members if m.student == s)
            missing = list(missing)
            missing.sort()
            unique_members.append({
                'member': s,
                'confirmed': confirmed,
                'missing': missing
            })

        # check minimum size problems
        size_message = ''
        headcount = GroupMember.objects.filter(
            group=group).values('student').order_by().distinct().count()
        if group_min and headcount < group_min:
            # total size too small
            size_message = 'Groups in this course must have at least %i members.' % (
                group_min)
        else:
            # check size for each activity
            act_count = defaultdict(int)
            for m in members:
                act_count[m.activity] += 1
            bad_act = [
                act.name for act, count in act_count.items()
                if count < group_min
            ]
            if bad_act:
                size_message = 'Groups in this course must have at least %i members: this group doesn\'t for %s.' % (
                    group_min, ', '.join(bad_act))

        all_act = list(all_act)
        all_act.sort()
        groupList.append({
            'group': group,
            'activities': all_act,
            'unique_members': unique_members,
            'memb': members,
            'need_conf': need_conf,
            'size_message': size_message
        })

    return render(request, 'groups/student.html', {
        'course': course,
        'groupList': groupList
    })
Пример #6
0
def invite(request, course_slug, group_slug):
    #TODO need to validate the student who is invited, cannot be the invitor him/herself.
    course = get_object_or_404(CourseOffering, slug = course_slug)
    group = get_object_or_404(Group, courseoffering = course, slug = group_slug)
    person = get_object_or_404(Person, userid = request.user.username)
    invitor = get_object_or_404(Member, person = person, offering=course)
    error_info=None
    group_max = course.group_max()
    from django import forms
    class StudentReceiverForm(forms.Form):
        name = forms.CharField()

    if request.method == "POST":
        student_receiver_form = StudentReceiverForm(request.POST)
        #student_receiver_form.activate_addform_validation(course_slug,group_slug)
        if student_receiver_form.is_valid():
            name = student_receiver_form.cleaned_data['name']

            existing = GroupMember.objects.filter(group=group).values('student').order_by().distinct().count()
            if group_max and existing >= group_max:
                messages.add_message(request, messages.ERROR, 'Group already has %s members, which is the maximum.' % (group_max))
                return HttpResponseRedirect(reverse('groups.views.groupmanage', kwargs={'course_slug': course_slug}))

            members = Member.objects.filter(person__userid = name, offering = course, role="STUD")
            if not members:
                messages.add_message(request, messages.ERROR, 'Could not find userid "%s".' % (name))
                return HttpResponseRedirect(reverse('groups.views.groupmanage', kwargs={'course_slug': course_slug}))
            member = members[0]
            
            # find out if this person is already in a group
            gms = group.groupmember_set.all()
            all_act = all_activities(gms)
            existing_memb = GroupMember.objects.filter(student=member, activity__in=all_act)
            
            if GroupMember.objects.filter(student=member, group=group):
                messages.add_message(request, messages.ERROR, "%s is already in this group" % (member.person.userid))
            elif existing_memb:
                error="%s is already in a group for %s" % (member.person.userid, ", ".join(m.activity.name for m in existing_memb))
                messages.add_message(request, messages.ERROR, error)
            else:
                #member = Member.objects.get(person = member.person, offering = course)
                for invitorMembership in GroupMember.objects.filter(group = group, student = invitor):
                    newGroupMember = GroupMember(group = group, student = member,
                                          activity = invitorMembership.activity, confirmed = False)
                    newGroupMember.save(member.person)

                    #LOG EVENT#
                    l = LogEntry(userid=request.user.username,
                    description="invited %s to join group %s for activity %s." % (newGroupMember.student.person.userid,group.name, newGroupMember.activity),
                    related_object=newGroupMember )
                    l.save()
                    
                n = NewsItem(user=member.person, author=person, course=group.courseoffering,
                     source_app="group", title="Group Invitation",
                     content="You have been invited to join group %s." % (group.name),
                     url=reverse('groups.views.groupmanage', kwargs={'course_slug':course.slug})
                    )
                n.save()
                messages.add_message(request, messages.SUCCESS, 'Your invitation to %s has been sent out.' % (member.person.name()))

            return HttpResponseRedirect(reverse('groups.views.groupmanage', kwargs={'course_slug': course_slug}))
        else:
            messages.add_message(request, messages.ERROR, "Invalid userid.")
            return HttpResponseRedirect(reverse('groups.views.groupmanage', kwargs={'course_slug': course_slug}))
    else:
        student_receiver_form = StudentReceiverForm()
        context = {'course': course, 'form': student_receiver_form}
        return render_to_response("groups/invite.html", context, context_instance=RequestContext(request))