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 }
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})
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}
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)
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 })
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))