def groupmanage(request, course_slug, activity_slug=None): if is_course_staff_by_slug(request, course_slug): return _groupmanage_staff(request, course_slug, activity_slug) elif is_course_student_by_slug(request, course_slug): return _groupmanage_student(request, course_slug) else: return HttpResponseForbidden()
def show_components_submission_history(request, course_slug, activity_slug, userid=None): if userid is None: userid = request.GET.get('userid') course = get_object_or_404(CourseOffering, slug=course_slug) activity = get_object_or_404(course.activity_set,slug = activity_slug, deleted=False) staff = False if userid is None: # can always see your own submissions userid = request.user.username else: # specifying a userid: must be course staff if is_course_staff_by_slug(request, course.slug): staff = True else: return ForbiddenResponse(request) member = get_object_or_404(Member, find_member(userid), offering=course) if activity.group: messages.add_message(request, messages.INFO, "This is a group submission. This history is based on submissions from all your group members.") gms = GroupMember.objects.filter(student=member, confirmed=True, activity=activity) submissions = GroupSubmission.objects.filter(activity=activity, group__groupmember__in=gms) else: submissions = StudentSubmission.objects.filter(activity=activity, member=member) # get all submission components component_list = select_all_components(activity, include_deleted=staff) all_submitted_components = [] for submission in submissions: c = get_submission_components(submission, activity, component_list) all_submitted_components.append({'sub':submission, 'comp':c}) return render(request, "submission/submission_history_view.html", {"course":course, "activity":activity,'userid':userid,'submitted_components': all_submitted_components})
def create(request, course_slug): person = get_object_or_404(Person, userid=request.user.username) course = get_object_or_404(CourseOffering, slug=course_slug) group_manager = Member.objects.exclude(role="DROP").get(person=person, offering=course) groupForSemesterForm = GroupForSemesterForm() activities = Activity.objects.exclude(status='INVI').filter( offering=course, group=True, deleted=False) activityList = [] for activity in activities: activityForm = ActivityForm(prefix=activity.slug) activityList.append({'activityForm': activityForm, 'name' : activity.name,\ 'percent' : activity.percent, 'due_date' : activity.due_date}) if is_course_student_by_slug(request, course_slug): return render_to_response('groups/create_student.html', \ {'manager':group_manager, 'course':course, 'groupForSemester':groupForSemesterForm, 'activityList':activityList},\ context_instance = RequestContext(request)) elif is_course_staff_by_slug(request, course_slug): #For instructor page, there is a student table for him/her to choose the students who belong to the new group students = Member.objects.select_related('person').filter( offering=course, role='STUD') studentList = [] for student in students: studentForm = StudentForm(prefix=student.person.userid) studentList.append({'studentForm': studentForm, 'first_name' : student.person.first_name,\ 'last_name' : student.person.last_name, 'userid' : student.person.userid,\ 'emplid' : student.person.emplid}) return render_to_response('groups/create_instructor.html', \ {'manager':group_manager, 'course':course,'groupForSemester':groupForSemesterForm, 'activityList':activityList, \ 'studentList':studentList}, context_instance = RequestContext(request)) else: return HttpResponseForbidden()
def create(request, course_slug): person = get_object_or_404(Person, userid=request.user.username) course = get_object_or_404(CourseOffering, slug=course_slug) span = course.group_span_activities() # allow 'activity=foo' in query string to suggest default selected for the form if 'activity' in request.GET: selected_activity = get_object_or_404(Activity, offering=course, slug=request.GET['activity'], status__in=['RLS', 'URLS']) else: selected_activity = None group_manager = Member.objects.exclude(role="DROP").get(person=person, offering=course) groupForSemesterForm = GroupForSemesterForm() activities = Activity.objects.exclude(status='INVI').filter( offering=course, group=True, deleted=False) activityList = [] for activity in activities: default = (span and not selected_activity) or ( selected_activity and activity == selected_activity) activityForm = ActivityForm(prefix=activity.slug, initial={'selected': default}) activityList.append({ 'activityForm': activityForm, 'name': activity.name, 'percent': activity.percent, 'due_date': activity.due_date }) if is_course_student_by_slug(request, course_slug): return render( request, 'groups/create_student.html', { 'manager': group_manager, 'course': course, 'groupForSemester': groupForSemesterForm, 'activityList': activityList }) elif is_course_staff_by_slug(request, course_slug): #For instructor page, there is a student table for him/her to choose the students who belong to the new group students = Member.objects.select_related('person').filter( offering=course, role='STUD') studentList = [] for student in students: studentForm = StudentForm(prefix=student.person.userid) studentList.append({'studentForm': studentForm, 'first_name' : student.person.first_name,\ 'last_name' : student.person.last_name, 'userid' : student.person.userid,\ 'emplid' : student.person.emplid}) return render(request, 'groups/create_instructor.html', {'manager':group_manager, 'course':course,'groupForSemester':groupForSemesterForm, 'activityList':activityList, \ 'studentList':studentList}) else: return HttpResponseForbidden()
def show_components(request, course_slug, activity_slug): #if course staff if is_course_staff_by_slug(request, course_slug): return _show_components_staff(request, course_slug, activity_slug) #else course member elif is_course_member_by_slug(request, course_slug): return _show_components_student(request, course_slug, activity_slug) #else not found, return 403 else: return ForbiddenResponse(request);
def download_file(request, course_slug, activity_slug, component_slug=None, submission_id=None, userid=None): course = get_object_or_404(CourseOffering, slug=course_slug) activity = get_object_or_404(course.activity_set, slug=activity_slug, deleted=False) staff = False if is_course_staff_by_slug(request, course_slug): staff = True # find the appropriate submission object if submission_id: # explicit request: get that one. try: submission_info = SubmissionInfo.from_submission_id(submission_id) except ValueError: return NotFoundResponse(request) elif userid: # userid specified: get their most recent submission student = get_object_or_404(Person, find_userid_or_emplid(userid)) submission_info = SubmissionInfo(student=student, activity=activity, include_deleted=staff) else: return NotFoundResponse(request) if not submission_info.have_submitted( ) or submission_info.activity != activity: return NotFoundResponse(request) if not submission_info.accessible_by(request): return ForbiddenResponse(request) # create the result if component_slug: # download single component if specified submission_info.get_most_recent_components() submitted_components = [ subcomp for comp, subcomp in submission_info.components_and_submitted() if subcomp and comp.slug == component_slug ] if not submitted_components: return NotFoundResponse(request) submitted_component = submitted_components[0] return submitted_component.download_response( slug=submission_info.submissions[0].file_slug()) else: # no component specified: give back the full ZIP file. return submission_info.generate_student_zip()
def _get_course_and_view(request, course_slug): """ Validates the request and returns the course object and view perspective ('student', 'staff') """ course = get_object_or_404(CourseOffering, slug=course_slug) if not course.discussion(): raise Http404 if is_course_student_by_slug(request, course_slug): return course, 'student' elif is_course_staff_by_slug(request, course_slug): return course, 'staff' else: return HttpResponseForbidden(), None
def remove_student(request, course_slug, group_slug): course = get_object_or_404(CourseOffering, slug = course_slug) group = get_object_or_404(Group, courseoffering = course, slug = group_slug) members = GroupMember.objects.filter(group = group).select_related('group', 'student', 'student__person', 'activity') # check permissions if is_course_staff_by_slug(request, course_slug): is_staff = True elif is_course_student_by_slug(request, course_slug): is_staff = False memberships = [m for m in members if m.student.person.userid == request.user.username] if not memberships: # student must be in this group return HttpResponseForbidden() else: return HttpResponseForbidden() if request.method == "POST": for m in members: f = StudentForm(request.POST, prefix=unicode(m.student.person.userid_or_emplid()) + '_' + m.activity.slug) if (is_staff or m.student_editable(request.user.username)=="") \ and f.is_valid() and f.cleaned_data['selected'] == True: m.delete() #LOG EVENT# l = LogEntry(userid=request.user.username, description="deleted %s in group %s for %s." % (m.student.person.userid, group.name, m.activity), related_object=m.group) l.save() if is_staff: return HttpResponseRedirect(reverse('groups.views.view_group', kwargs={'course_slug': course_slug, 'group_slug': group.slug})) else: return HttpResponseRedirect(reverse('groups.views.groupmanage', kwargs={'course_slug': course_slug})) else: data = [] for m in members: editable = m.student_editable(request.user.username) if is_staff or editable == "": f = StudentForm(prefix=unicode(m.student.person.userid_or_emplid()) + '_' + m.activity.slug) data.append({'form': f, 'member': m}) else: data.append({'form': None, 'member': m, 'reason': editable}) return render_to_response('groups/remove_student.html', \ {'course':course, 'group' : group, 'data':data, 'is_staff':is_staff}, \ context_instance = RequestContext(request))
def download_file(request, course_slug, activity_slug, component_slug=None, submission_id=None, userid=None): course = get_object_or_404(CourseOffering, slug=course_slug) activity = get_object_or_404(course.activity_set, slug = activity_slug, deleted=False) staff = False if is_course_staff_by_slug(request, course_slug): staff = True # find the appropriate submission object if submission_id: # explicit request: get that one. submission = get_submission(submission_id) if not submission or submission.activity!=activity: return NotFoundResponse(request) submitted_components = get_submission_components(submission, activity, include_deleted=staff) elif userid: # userid specified: get their most recent submission student = get_object_or_404(Person, find_userid_or_emplid(userid)) submission, submitted_components = get_current_submission(student, activity, include_deleted=staff) if not submission: return NotFoundResponse(request) else: return NotFoundResponse(request) # make sure this user is allowed to see the file if staff: pass elif isinstance(submission, GroupSubmission): membership = submission.group.groupmember_set.filter(student__person__userid=request.user.username, activity=activity, confirmed=True) if not membership: return ForbiddenResponse(request) elif isinstance(submission, StudentSubmission): if submission.member.person.userid != request.user.username: return ForbiddenResponse(request) # create the result if component_slug: # download single component if specified # get the actual component: already did the searching above, so just look in that list components = [sub for comp,sub in submitted_components if sub and sub.component.slug==component_slug] if not components: return NotFoundResponse(request) return components[0].download_response() else: # no component specified: give back the full ZIP file. return generate_zip_file(submission, submitted_components)
def accessible_by(self, request): """ Can we show this info the the user? """ assert self.submissions is not None from courselib.auth import is_course_staff_by_slug if request.user.is_anonymous: return False elif is_course_staff_by_slug(request, self.activity.offering.slug): return True elif self.is_group: membership = self.group.groupmember_set.filter( student__person__userid=request.user.username, activity=self.activity, confirmed=True) return membership.exists() else: return self.student.userid == request.user.username
def create(request, course_slug): person = get_object_or_404(Person,userid=request.user.username) course = get_object_or_404(CourseOffering, slug = course_slug) # allow 'activity=foo' in query string to suggest default selected for the form if 'activity' in request.GET: selected_activity = get_object_or_404(Activity, offering=course, slug=request.GET['activity'], status__in=['RLS','URLS']) else: selected_activity = None group_manager = Member.objects.exclude(role="DROP").get(person = person, offering = course) groupForSemesterForm = GroupForSemesterForm() activities = Activity.objects.exclude(status='INVI').filter(offering=course, group=True, deleted=False) activityList = [] for activity in activities: default = (not selected_activity) or (selected_activity and activity == selected_activity) activityForm = ActivityForm(prefix=activity.slug, initial={'selected': default}) activityList.append({'activityForm': activityForm, 'name': activity.name, 'percent': activity.percent, 'due_date': activity.due_date}) if is_course_student_by_slug(request, course_slug): return render_to_response('groups/create_student.html', {'manager':group_manager, 'course':course, 'groupForSemester':groupForSemesterForm, 'activityList':activityList},\ context_instance = RequestContext(request)) elif is_course_staff_by_slug(request, course_slug): #For instructor page, there is a student table for him/her to choose the students who belong to the new group students = Member.objects.select_related('person').filter(offering = course, role = 'STUD') studentList = [] for student in students: studentForm = StudentForm(prefix = student.person.userid) studentList.append({'studentForm': studentForm, 'first_name' : student.person.first_name,\ 'last_name' : student.person.last_name, 'userid' : student.person.userid,\ 'emplid' : student.person.emplid}) return render_to_response('groups/create_instructor.html', {'manager':group_manager, 'course':course,'groupForSemester':groupForSemesterForm, 'activityList':activityList, \ 'studentList':studentList}, context_instance = RequestContext(request)) else: return HttpResponseForbidden()
def download_file(request, course_slug, activity_slug, component_slug=None, submission_id=None, userid=None): course = get_object_or_404(CourseOffering, slug=course_slug) activity = get_object_or_404(course.activity_set, slug = activity_slug, deleted=False) staff = False if is_course_staff_by_slug(request, course_slug): staff = True # find the appropriate submission object if submission_id: # explicit request: get that one. try: submission_info = SubmissionInfo.from_submission_id(submission_id) except ValueError: return NotFoundResponse(request) elif userid: # userid specified: get their most recent submission student = get_object_or_404(Person, find_userid_or_emplid(userid)) submission_info = SubmissionInfo(student=student, activity=activity, include_deleted=staff) else: return NotFoundResponse(request) if not submission_info.have_submitted() or submission_info.activity != activity: return NotFoundResponse(request) if not submission_info.accessible_by(request): return ForbiddenResponse(request) # create the result if component_slug: # download single component if specified submission_info.get_most_recent_components() submitted_components = [subcomp for comp, subcomp in submission_info.components_and_submitted() if subcomp and comp.slug == component_slug] if not submitted_components: return NotFoundResponse(request) submitted_component = submitted_components[0] return submitted_component.download_response(slug=submission_info.submissions[0].file_slug()) else: # no component specified: give back the full ZIP file. return submission_info.generate_student_zip()
def remove_student(request, course_slug, group_slug): course = get_object_or_404(CourseOffering, slug=course_slug) group = get_object_or_404(Group, courseoffering=course, slug=group_slug) members = GroupMember.objects.filter(group=group).select_related( 'group', 'student', 'student__person', 'activity') # check permissions if is_course_staff_by_slug(request, course_slug): is_staff = True elif is_course_student_by_slug(request, course_slug): is_staff = False memberships = [ m for m in members if m.student.person.userid == request.user.username ] if not memberships: # student must be in this group return HttpResponseForbidden() else: return HttpResponseForbidden() if request.method == "POST": for m in members: f = StudentForm( request.POST, prefix=unicode(m.student.person.userid_or_emplid()) + '_' + m.activity.slug) if (is_staff or m.student_editable(request.user.username)=="") \ and f.is_valid() and f.cleaned_data['selected'] == True: m.delete() #LOG EVENT# l = LogEntry(userid=request.user.username, description="deleted %s in group %s for %s." % (m.student.person.userid, group.name, m.activity), related_object=m.group) l.save() if is_staff: return HttpResponseRedirect( reverse('offering:groups:view_group', kwargs={ 'course_slug': course_slug, 'group_slug': group.slug })) else: return HttpResponseRedirect( reverse('offering:groups:groupmanage', kwargs={'course_slug': course_slug})) else: data = [] for m in members: editable = m.student_editable(request.user.username) if is_staff or editable == "": f = StudentForm( prefix=unicode(m.student.person.userid_or_emplid()) + '_' + m.activity.slug) data.append({'form': f, 'member': m}) else: data.append({'form': None, 'member': m, 'reason': editable}) return render(request, 'groups/remove_student.html', \ {'course':course, 'group' : group, 'data':data, 'is_staff':is_staff})
def submit(request, course_slug): person = get_object_or_404(Person, userid=request.user.username) course = get_object_or_404(CourseOffering, slug=course_slug) member = Member.objects.exclude(role='DROP').get(person=person, offering=course) is_staff = is_course_staff_by_slug(request, course_slug) span = course.group_span_activities() error_info = None name = request.POST.get('GroupName') if name: name = name[:30] #Check if group has a unique name if Group.objects.filter(name=name, courseoffering=course): error_info = "A group named \"%s\" already exists" % (name) messages.add_message(request, messages.ERROR, error_info) return HttpResponseRedirect( reverse('offering:groups:groupmanage', kwargs={'course_slug': course_slug})) #Check if the group name is empty, these two checks may need to be moved to forms later. if name == "": error_info = "Group name cannot be empty: please enter a group name." messages.add_message(request, messages.ERROR, error_info) return HttpResponseRedirect( reverse('offering:groups:groupmanage', kwargs={'course_slug': course_slug})) else: # find selected activities selected_act = [] activities = Activity.objects.filter(offering=course, group=True, deleted=False) if not is_staff: activities = activities.exclude(status='INVI') for activity in activities: activityForm = ActivityForm(request.POST, prefix=activity.slug) if activityForm.is_valid( ) and activityForm.cleaned_data['selected'] == True: selected_act.append(activity) # no selected activities: fail. if not selected_act: messages.add_message(request, messages.ERROR, "Group not created: no activities selected.") return HttpResponseRedirect( reverse('offering:groups:groupmanage', kwargs={'course_slug': course_slug})) # check groups_span_activities restriction if it's set if not span and not is_staff and len(selected_act) > 1: # students cannot violate groups_span_activities restriction, but instructors can messages.add_message( request, messages.ERROR, "Group not created: groups cannot last for more than one activity in this course." ) return HttpResponseRedirect( reverse('offering:groups:groupmanage', kwargs={'course_slug': course_slug})) groupForSemester = False #validate database integrity before saving anything. #If one student is in a group for an activity, he/she cannot be in another group for the same activity. if is_course_student_by_slug(request, course_slug): isStudentCreatedGroup = True studentList = [] studentList.append(member) elif is_course_staff_by_slug(request, course_slug): isStudentCreatedGroup = False studentList = [] students = Member.objects.select_related('person').filter( offering=course, role='STUD') for student in students: studentForm = StudentForm(request.POST, prefix=student.person.userid) if studentForm.is_valid( ) and studentForm.cleaned_data['selected'] == True: studentList.append(student) #Check if students has already in a group if _validateIntegrity(request, isStudentCreatedGroup, groupForSemester, course, studentList, selected_act) == False: return HttpResponseRedirect( reverse('offering:groups:groupmanage', kwargs={'course_slug': course_slug})) #No selected members,group creating will fail. if not studentList: messages.add_message(request, messages.ERROR, "Group not created: no members selected.") return HttpResponseRedirect( reverse('offering:groups:groupmanage', kwargs={'course_slug': course_slug})) group = Group(name=name, manager=member, courseoffering=course, groupForSemester=groupForSemester) group.save() #LOG EVENT# l = LogEntry(userid=request.user.username, description="created a new group %s for %s." % (group.name, course), related_object=group) l.save() if is_course_student_by_slug(request, course_slug): for activity in selected_act: groupMember = GroupMember(group=group, student=member, confirmed=True, activity_id=activity.id) groupMember.save() #LOG EVENT# l = LogEntry( userid=request.user.username, description= "automatically became a group member of %s for activity %s." % (group.name, groupMember.activity), related_object=groupMember) l.save() messages.add_message(request, messages.SUCCESS, 'Group Created') return HttpResponseRedirect( reverse('offering:groups:groupmanage', kwargs={'course_slug': course_slug})) elif is_course_staff_by_slug(request, course_slug): students = Member.objects.select_related('person').filter( offering=course, role='STUD') for student in students: studentForm = StudentForm(request.POST, prefix=student.person.userid) if studentForm.is_valid( ) and studentForm.cleaned_data['selected'] == True: for activity in selected_act: groupMember = GroupMember(group=group, student=student, confirmed=True, activity_id=activity.id) groupMember.save() #LOG EVENT# l = LogEntry( userid=request.user.username, description= "added %s as a group member to %s for activity %s." % (student.person.userid, group.name, groupMember.activity), related_object=groupMember) l.save() n = NewsItem(user=student.person, author=member.person, course=group.courseoffering, source_app="group", title="Added to Group", content="You have been added the group %s." % (group.name), url=reverse( 'offering:groups:groupmanage', kwargs={'course_slug': course.slug})) n.save() messages.add_message(request, messages.SUCCESS, 'Group Created') return HttpResponseRedirect( reverse('offering:groups:view_group', kwargs={ 'course_slug': course_slug, 'group_slug': group.slug })) else: return HttpResponseForbidden()
def submit(request, course_slug): person = get_object_or_404(Person,userid=request.user.username) course = get_object_or_404(CourseOffering, slug = course_slug) member = Member.objects.exclude(role='DROP').get(person=person, offering=course) error_info=None name = request.POST.get('GroupName') if name: name = name[:30] #Check if group has a unique name if Group.objects.filter(name=name,courseoffering=course): error_info="A group named \"%s\" already exists" % (name) messages.add_message(request, messages.ERROR, error_info) return HttpResponseRedirect(reverse('groups.views.groupmanage', kwargs={'course_slug': course_slug})) #Check if the group name is empty, these two checks may need to be moved to forms later. if name == "": error_info = "Group name cannot be empty: please enter a group name." messages.add_message(request, messages.ERROR, error_info) return HttpResponseRedirect(reverse('groups.views.groupmanage', kwargs={'course_slug': course_slug})) else: # find selected activities selected_act = [] activities = Activity.objects.filter(offering=course, group=True, deleted=False) if not is_course_staff_by_slug(request, course_slug): activities = activities.exclude(status='INVI') for activity in activities: activityForm = ActivityForm(request.POST, prefix=activity.slug) if activityForm.is_valid() and activityForm.cleaned_data['selected'] == True: selected_act.append(activity) # no selected activities: fail. if not selected_act: messages.add_message(request, messages.ERROR, "Group not created: no activities selected.") return HttpResponseRedirect(reverse('groups.views.groupmanage', kwargs={'course_slug': course_slug})) #groupForSemesterForm = GroupForSemesterForm(request.POST) #if groupForSemesterForm.is_valid(): # groupForSemester = groupForSemesterForm.cleaned_data['selected'] groupForSemester = False #validate database integrity before saving anything. #If one student is in a group for an activity, he/she cannot be in another group for the same activity. if is_course_student_by_slug(request, course_slug): isStudentCreatedGroup = True studentList = [] studentList.append(member) elif is_course_staff_by_slug(request, course_slug): isStudentCreatedGroup = False studentList = [] students = Member.objects.select_related('person').filter(offering = course, role = 'STUD') for student in students: studentForm = StudentForm(request.POST, prefix = student.person.userid) if studentForm.is_valid() and studentForm.cleaned_data['selected'] == True: studentList.append(student) #Check if students has already in a group if _validateIntegrity(request,isStudentCreatedGroup, groupForSemester, course, studentList, selected_act) == False: return HttpResponseRedirect(reverse('groups.views.groupmanage', kwargs={'course_slug': course_slug})) #No selected members,group creating will fail. if not studentList: messages.add_message(request, messages.ERROR, "Group not created: no members selected.") return HttpResponseRedirect(reverse('groups.views.groupmanage', kwargs={'course_slug': course_slug})) group = Group(name=name, manager=member, courseoffering=course, groupForSemester = groupForSemester) group.save() #LOG EVENT# l = LogEntry(userid=request.user.username, description="created a new group %s for %s." % (group.name, course), related_object=group ) l.save() if is_course_student_by_slug(request, course_slug): for activity in selected_act: groupMember = GroupMember(group=group, student=member, confirmed=True, activity=activity) groupMember.save() #LOG EVENT# l = LogEntry(userid=request.user.username, description="automatically became a group member of %s for activity %s." % (group.name, groupMember.activity), related_object=groupMember ) l.save() messages.add_message(request, messages.SUCCESS, 'Group Created') return HttpResponseRedirect(reverse('groups.views.groupmanage', kwargs={'course_slug': course_slug})) elif is_course_staff_by_slug(request, course_slug): students = Member.objects.select_related('person').filter(offering = course, role = 'STUD') for student in students: studentForm = StudentForm(request.POST, prefix = student.person.userid) if studentForm.is_valid() and studentForm.cleaned_data['selected'] == True: for activity in selected_act: groupMember = GroupMember(group=group, student=student, confirmed=True, activity=activity) groupMember.save() #LOG EVENT# l = LogEntry(userid=request.user.username, description="added %s as a group member to %s for activity %s." % (student.person.userid,group.name, groupMember.activity), related_object=groupMember ) l.save() n = NewsItem(user=student.person, author=member.person, course=group.courseoffering, source_app="group", title="Added to Group", content="You have been added the group %s." % (group.name), url=reverse('groups.views.groupmanage', kwargs={'course_slug':course.slug}) ) n.save() messages.add_message(request, messages.SUCCESS, 'Group Created') return HttpResponseRedirect(reverse('groups.views.view_group', kwargs={'course_slug': course_slug, 'group_slug': group.slug})) else: return HttpResponseForbidden()