Ejemplo n.º 1
0
    def get(self, request, *args, **kwargs):
        self.object = self.get_object(queryset=self.model.objects.filter(
            course__code=self.kwargs["course_code"]))
        self.assessment = self.object


        # Determine if user has permission to view assessment or solution.
        # Only users with administer privileges can view solution this way.
        # All others can view solution only through injecting 
        # solution of individual questions via the "show solution" button
        # (where solution views are tracked).

        has_permission=False
        if  user_can_administer_assessment(request.user, 
                                           course=self.object.course):
            has_permission=True
        elif not self.solution and self.object.user_can_view(
                request.user, solution=False):
            has_permission=True
        if not has_permission:
            return redirect("mi-forbidden")

        try:
            self.number_in_thread=int(request.GET.get('n',1))
        except TypeError:
            self.number_in_thread=1

        try:
            self.determine_version_attempt(
                user=request.user,seed=request.GET.get('seed'),
                content_attempt_id = request.GET.get('content_attempt'),
                question_attempt_ids = request.GET.get('question_attempts'),
            )
        except ValueError as e:
            from django.template import Template, Context
            template_string = "{% extends 'base.html' %}{% block content %}"
            template_string += "<p>%s</p>" % e
            template_string += "{% endblock %}"
            context = Context({'STATIC_URL': settings.STATIC_URL})
            return HttpResponse(Template(template_string).render(context))

        # update selected course for course users
        # self.course_enrollment set by determine_version_attempt
        if self.course_enrollment \
           and self.course_enrollment != \
                    request.user.courseuser.selected_course_enrollment:
            request.user.courseuser.selected_course_enrollment =\
                                                    self.course_enrollment
            with transaction.atomic():
                request.user.courseuser.save()

        # update session with last course viewed
        request.session['last_course_viewed'] = self.object.course.id

        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)
Ejemplo n.º 2
0
    def get(self, request, *args, **kwargs):

        self.get_object_thread_content()
        try:
            self.number_in_thread=int(request.GET.get('n',1))
        except TypeError:
            self.number_in_thread=1

        # determine if user has instructor or designer access
        if not user_can_administer_assessment(request.user, course=self.course):
            return redirect("mi-forbidden")

        self.coursewide_attempts_include = []
        self.coursewide_attempts_avoid = []

        form = self.get_form()

        context = self.get_context_data(form=form)
        return self.render_to_response(context)
Ejemplo n.º 3
0
    def post(self, request, *args, **kwargs):
        self.get_object_thread_content()
        try:
            self.number_in_thread=int(request.GET.get('n',1))
        except TypeError:
            self.number_in_thread=1

        # determine if user has instructor or designer access
        if not user_can_administer_assessment(request.user, course=self.course):
            return redirect("mi-forbidden")

        form = self.get_form()

        self.coursewide_attempts_include = request.POST.getlist(
            "include_cca_ids")
        self.coursewide_attempts_avoid = request.POST.getlist("avoid_cca_ids")

        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)
Ejemplo n.º 4
0
    def get_context_data(self, **kwargs):
        context = super(AssessmentView, self).get_context_data(**kwargs)


        from midocs.functions import return_new_auxiliary_data
        auxiliary_data =  return_new_auxiliary_data()
        context['_auxiliary_data_'] = auxiliary_data

        import random
        rng=random.Random()

        # show post user response errors only if instructor permissions
        if user_has_given_assessment_permission_level(
                self.request.user, 2):
            show_post_user_errors=True
        else:
            show_post_user_errors=False

        from micourses.render_assessments import render_question_list
        rendered_list=render_question_list(
            self.assessment, self.question_list, rng=rng, 
            assessment_seed=self.assessment_seed, 
            user=self.request.user, 
            solution=self.solution,
            auxiliary_data = auxiliary_data,
            show_post_user_errors=show_post_user_errors)

        # if question_only is set, then view only that question
        if self.kwargs.get('question_only'):
            question_only = int(self.kwargs['question_only'])
            rendered_list=rendered_list[question_only-1:question_only]
            context['question_only'] = question_only
        context['rendered_list'] = rendered_list

        context['seed'] = self.assessment_seed

        # determine if there were any errors
        success=True
        question_errors=[]
        for (ind,q) in enumerate(rendered_list):
            if not q["question_data"]["success"]:
                success=False
                question_errors.append(str(ind+1))
        if not success:
            context['error_message'] = \
                "Errors occurred in the following questions: %s" %\
                ", ".join(question_errors)

        context['success'] = success
        
        context['generate_course_attempt_link'] = False
        context['show_solution_link'] = False

        course = self.assessment.course
        context['course'] = course
        
        if user_can_administer_assessment(self.request.user, course=course):
            if self.thread_content:
                context['generate_course_attempt_link'] = True
            if not self.solution:
                context['show_solution_link'] = True

        if self.thread_content:
            context['assessment_name'] = self.thread_content.get_title()
        else:
            context['assessment_name'] = self.assessment.name
        if self.solution:
            context['assessment_name'] += " solution"
        context['assessment_short_name'] = self.assessment.return_short_name()
        if self.solution:
            context['assessment_short_name'] += " sol."

        if self.version:
            context['version'] =  self.version
            context['assessment_name_with_version'] = "%s, version %s" % \
                        (context['assessment_name'], context['version'])
            context['assessment_short_name_with_version'] = "%s, version %s" % \
                        (context['assessment_short_name'], context['version'])
        else:
            context['version'] = ''
            context['assessment_name_with_version'] = context['assessment_name']
            context['assessment_short_name_with_version'] \
                = context['assessment_short_name']

        if self.course_enrollment and self.thread_content:
            if self.course_enrollment.role == STUDENT_ROLE and self.current_attempt:
                due = self.thread_content.get_adjusted_due(
                    self.current_attempt.record)

                if course.adjust_due_attendance and due:
                    due_date_url = reverse(
                        'micourses:adjusted_due_calculation',
                        kwargs={'course_code': course.code,
                                'content_id': self.thread_content.id }
                    )
                    from micourses.utils import format_datetime
                    current_tz = timezone.get_current_timezone()
                    due_string = format_datetime(current_tz.normalize(
                        due.astimezone(current_tz)))
                    due = mark_safe('<a href="%s">%s</a>' % \
                                               (due_date_url, due_string))
                context['due'] = due
            else:
                context['due'] = self.thread_content.get_adjusted_due()

        context['thread_content'] = self.thread_content
        context['number_in_thread'] = self.number_in_thread
        context['current_attempt'] = self.current_attempt

        context['users attempt'] = False
        context['multiple_attempts'] = False
        context['attempt_url']=None
        context['record_url']=None


        # set date from current_attempt, else as now
        if self.current_attempt:
            context['assessment_date'] = self.current_attempt.attempt_began
        else:
            context['assessment_date'] = timezone.now()


        # Check if have current attempt that belongs to user
        # (so can show score)
        # Create links to record and attempts (if valid)

        if self.current_attempt and \
           self.current_attempt.record.enrollment == self.course_enrollment:

            context['users_attempt'] = True

            valid_attempt_list = list(
                self.current_attempt.record.attempts.filter(valid=True))
            context['multiple_attempts'] = len(valid_attempt_list)>1

            context['record_url'] = reverse(
                'micourses:content_record',
                kwargs={'course_code': course.code,
                        'content_id': self.thread_content.id})

            if self.current_attempt.valid:
                attempt_number = valid_attempt_list.index(self.current_attempt)\
                                 +1
                context['attempt_url'] = reverse(
                    'micourses:content_attempt', 
                    kwargs={'course_code': course.code,
                            'content_id': self.thread_content.id,
                            'attempt_number': attempt_number})

                # add question attempt urls to rendered_list question_data
                for (ind,q) in enumerate(rendered_list):
                    q["question_data"]["attempt_url"] = reverse(
                        'micourses:question_attempts', 
                        kwargs={'course_code': course.code, 
                                'content_id': self.thread_content.id, 
                                'attempt_number': attempt_number, 
                                'question_number': ind+1} )



        from mitesting.utils import round_and_int
        if self.thread_content:
            context['thread_content_points'] = round_and_int(
                self.thread_content.points)
        if self.current_attempt is None or self.current_attempt.score is None:
            context['attempt_score']=0
        else:
            context['attempt_score']=round_and_int(
                self.current_attempt.score,1)
        
        if self.current_attempt is None or \
           self.current_attempt.record.score is None:
            context['content_score']=0
        else:
            context['content_score']=round_and_int(
                self.current_attempt.record.score,1)


        # get list of the question numbers in assessment
        # if instructor or designer in course
        # if also staff, include links to admin pages
        if user_can_administer_assessment(self.request.user, course=course):
            question_numbers=[]
            if self.request.user.is_staff:
                context['assessment_admin_link'] = mark_safe(
                    "<p><a href='%s'>%s</a></p>" % (
                        reverse('admin:micourses_assessment_change',
                                args=(self.assessment.id,)),
                        'Admin link'))
            for q in rendered_list:
                # if staff, add link to admin page for quesiton
                if self.request.user.is_staff:
                    question_numbers.append(
                        "<a href='%s'>%s</a>" % (
                            reverse('admin:mitesting_question_change',
                                    args=(q['question'].id,)),
                            q['question'].id)
                    )
                else:
                    question_numbers.append(str(q['question'].id))
            question_numbers = ", ".join(question_numbers)
            question_numbers = mark_safe(question_numbers)
        else:
            question_numbers=None
        context['question_numbers']=question_numbers

        # turn off Google analytics for localhost/development site
        context['noanalytics']=(settings.SITE_ID <= 2)

        from mitesting.utils import get_new_seed
        context['new_seed']=get_new_seed(rng)

        return context
Ejemplo n.º 5
0
    def get_context_data(self, **kwargs):
        context = super(AssessmentOverview, self).get_context_data(**kwargs)

        # thread_content will be None
        # if assessment is not in thread and number in thread is 1
        try:
            thread_content = self.assessment.determine_thread_content(
                self.number_in_thread)
        except ObjectDoesNotExist:
            raise Http404("No assessment found") 
            
        context['thread_content']=thread_content
        context['number_in_thread'] = self.number_in_thread
        course = self.assessment.course
        context['course'] = course
        
        if thread_content:
            context['assessment_name'] = thread_content.get_title()
        else:
            context['assessment_name'] = self.assessment.name

        from mitesting.utils import round_and_int
        if thread_content:
            context['thread_content_points'] = round_and_int(
                thread_content.points)

            try: 
                student = self.request.user.courseuser
            except AttributeError:
                student = None

            if student:
                try:
                    cr= thread_content.contentrecord_set.get(
                        enrollment__student=student)
                except ObjectDoesNotExist:
                    cr = None

                if cr:
                    student_score = cr.score
                    if student_score is not None:
                        context['content_score']=round_and_int(student_score,1)
                    else:
                        context['content_score'] = '--'
                    context['have_user_score'] = True
                    context['record_url'] = reverse(
                        'micourses:content_record',
                        kwargs={'course_code': course.code,
                                'content_id': thread_content.id})
                    
            context['assigned'] = thread_content.assigned
            due = thread_content.get_adjusted_due(student=student)
            
            if student and course.adjust_due_attendance and due:
                due_date_url = reverse(
                    'micourses:adjusted_due_calculation',
                    kwargs={'course_code': course.code,
                            'content_id' :thread_content.id }
                )

                from micourses.utils import format_datetime
                current_tz = timezone.get_current_timezone()
                due_string = format_datetime(current_tz.normalize(
                    due.astimezone(current_tz)))
                due = mark_safe('<a href="%s">%s</a>' % \
                                (due_date_url, due_string))
            context['due']=due

        # user has permission to view the assessment, given privacy level
        if self.assessment.user_can_view(self.user, solution=False):
            if self.number_in_thread > 1:
                get_string = "n=%s" % self.number_in_thread
            else:
                get_string=""

            if thread_content and thread_content.substitute_title:
                context['assessment_link'] = self.assessment.return_direct_link(
                    link_text=thread_content.substitute_title,
                    get_string=get_string)
            else:
                context['assessment_link'] = self.assessment.return_direct_link(
                    get_string=get_string)
        else:
            context['assessment_link'] = None

        # generate assessment link if can administer and thread content exists
        if thread_content and user_can_administer_assessment(
                self.user, course=course):
            context['generate_course_attempt_link'] = True
        else:
            context['generate_course_attempt_link'] = False


        # turn off Google analytics for localhost/development site
        context['noanalytics']=(settings.SITE_ID <= 2)
            
        return context