Esempio n. 1
0
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()
Esempio n. 2
0
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})
Esempio n. 3
0
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()
Esempio n. 4
0
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()
Esempio n. 5
0
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()
Esempio n. 6
0
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);
Esempio n. 7
0
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()
Esempio n. 8
0
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
Esempio n. 9
0
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
Esempio n. 10
0
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))
Esempio n. 11
0
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)
Esempio n. 12
0
    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
Esempio n. 13
0
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()
Esempio n. 14
0
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()
Esempio n. 15
0
    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
Esempio n. 16
0
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})
Esempio n. 17
0
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()
Esempio n. 18
0
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()