Example #1
0
def project_workspace(request, project_id, feedback=None):
    """
    A multi-panel editable view for the specified project
    Legacy note: Ideally, this function would be named project_view but
    StructuredCollaboration requires the view name
    to be  <class>-view to do a reverse lookup

    Panel 1: Parent Assignment (if applicable)
    Panel 2: Project
    Panel 3: Instructor Feedback (if applicable & exists)

    Keyword arguments:
    project_id -- the model id
    """
    project = get_object_or_404(Project, pk=project_id)

    if not project.can_read(request):
        return HttpResponseForbidden("forbidden")

    show_feedback = feedback == "feedback"
    data = {
        'space_owner': request.user.username,
        'show_feedback': show_feedback
    }

    if not request.is_ajax():
        data['project'] = project
        return render_to_response('projects/project.html',
                                  data,
                                  context_instance=RequestContext(request))
    else:
        panels = []

        vocabulary = VocabularyResource().render_list(
            request, Vocabulary.objects.get_for_object(request.course))

        owners = UserResource().render_list(request, request.course.members)

        is_faculty = request.course.is_faculty(request.user)
        can_edit = project.can_edit(request)
        feedback_discussion = project.feedback_discussion() \
            if is_faculty or can_edit else None

        # Project Parent (assignment) if exists
        parent_assignment = project.assignment()
        if parent_assignment:
            resource = ProjectResource(
                record_viewer=request.user,
                is_viewer_faculty=is_faculty,
                editable=parent_assignment.can_edit(request))
            assignment_ctx = resource.render_one(request, parent_assignment)

            panel = {
                'is_faculty':
                is_faculty,
                'panel_state':
                "open" if (project.title == "Untitled"
                           and len(project.body) == 0) else "closed",
                'subpanel_state':
                'closed',
                'context':
                assignment_ctx,
                'owners':
                owners,
                'vocabulary':
                vocabulary,
                'template':
                'project'
            }
            panels.append(panel)

        # Requested project, can be either an assignment or composition
        resource = ProjectResource(record_viewer=request.user,
                                   is_viewer_faculty=is_faculty,
                                   editable=can_edit)
        project_context = resource.render_one(request, project)

        # only editing if it's new
        project_context['editing'] = \
            True if can_edit and len(project.body) < 1 else False

        project_context['create_instructor_feedback'] = \
            is_faculty and parent_assignment and not feedback_discussion

        panel = {
            'is_faculty': is_faculty,
            'panel_state': 'closed' if show_feedback else 'open',
            'context': project_context,
            'template': 'project',
            'owners': owners,
            'vocabulary': vocabulary
        }
        panels.append(panel)

        # Project Response -- if the requested project is an assignment
        # This is primarily a student view. The student's response should
        # pop up automatically when the parent assignment is viewed.
        if project.is_assignment(request):
            responses = project.responses_by(request, request.user)
            if len(responses) > 0:
                response = responses[0]
                response_can_edit = response.can_edit(request)
                resource = ProjectResource(record_viewer=request.user,
                                           is_viewer_faculty=is_faculty,
                                           editable=response_can_edit)
                response_context = resource.render_one(request, response)

                panel = {
                    'is_faculty': is_faculty,
                    'panel_state': 'closed',
                    'context': response_context,
                    'template': 'project',
                    'owners': owners,
                    'vocabulary': vocabulary
                }
                panels.append(panel)

                if not feedback_discussion and response_can_edit:
                    feedback_discussion = response.feedback_discussion()

        data['panels'] = panels

        # If feedback exists for the requested project
        if feedback_discussion:
            # 3rd pane is the instructor feedback, if it exists
            panel = {
                'panel_state': 'open' if show_feedback else 'closed',
                'panel_state_label': "Instructor Feedback",
                'template': 'discussion',
                'owners': owners,
                'vocabulary': vocabulary,
                'context': threaded_comment_json(request, feedback_discussion)
            }
            panels.append(panel)

        # Create a place for asset editing
        panel = {
            'panel_state': 'closed',
            'panel_state_label': "Item Details",
            'template': 'asset_quick_edit',
            'update_history': False,
            'owners': owners,
            'vocabulary': vocabulary,
            'context': {
                'type': 'asset'
            }
        }
        panels.append(panel)

        return HttpResponse(json.dumps(data, indent=2),
                            mimetype='application/json')
Example #2
0
def project_workspace(request, project_id, feedback=None):
    """
    A multi-panel editable view for the specified project
    Legacy note: Ideally, this function would be named project_view but
    StructuredCollaboration requires the view name
    to be  <class>-view to do a reverse lookup

    Panel 1: Parent Assignment (if applicable)
    Panel 2: Project
    Panel 3: Instructor Feedback (if applicable & exists)

    Keyword arguments:
    project_id -- the model id
    """
    project = get_object_or_404(Project, pk=project_id)

    if not project.can_read(request):
        return HttpResponseForbidden("forbidden")

    show_feedback = feedback == "feedback"
    data = {"space_owner": request.user.username, "show_feedback": show_feedback}

    if not request.is_ajax():
        data["project"] = project
        return render_to_response("projects/project.html", data, context_instance=RequestContext(request))
    else:
        panels = []

        vocabulary = VocabularyResource().render_list(request, Vocabulary.objects.get_for_object(request.course))

        owners = UserResource().render_list(request, request.course.members)

        is_faculty = request.course.is_faculty(request.user)
        can_edit = project.can_edit(request)
        feedback_discussion = project.feedback_discussion() if is_faculty or can_edit else None

        # Project Parent (assignment) if exists
        parent_assignment = project.assignment()
        if parent_assignment:
            assignment_context = composition_project_json(
                request, parent_assignment, parent_assignment.can_edit(request)
            )

            assignment_context["create_selection"] = True

            panel = {
                "is_faculty": is_faculty,
                "panel_state": "open" if (project.title == "Untitled" and len(project.body) == 0) else "closed",
                "subpanel_state": "closed",
                "context": assignment_context,
                "owners": owners,
                "vocabulary": vocabulary,
                "template": "project",
            }
            panels.append(panel)

        # Requested project, can be either an assignment or composition
        project_context = composition_project_json(request, project, can_edit)

        # only editing if it's new
        project_context["editing"] = True if can_edit and len(project.body) < 1 else False

        project_context["create_instructor_feedback"] = is_faculty and parent_assignment and not feedback_discussion

        panel = {
            "is_faculty": is_faculty,
            "panel_state": "closed" if show_feedback else "open",
            "context": project_context,
            "template": "project",
            "owners": owners,
            "vocabulary": vocabulary,
        }
        panels.append(panel)

        # Project Response -- if the requested project is an assignment
        # This is primarily a student view. The student's response should
        # pop up automatically when the parent assignment is viewed.
        if project.is_assignment(request):
            responses = project.responses_by(request, request.user)
            if len(responses) > 0:
                response = responses[0]
                response_can_edit = response.can_edit(request)
                response_context = composition_project_json(request, response, response_can_edit)

                panel = {
                    "is_faculty": is_faculty,
                    "panel_state": "closed",
                    "context": response_context,
                    "template": "project",
                    "owners": owners,
                    "vocabulary": vocabulary,
                }
                panels.append(panel)

                if not feedback_discussion and response_can_edit:
                    feedback_discussion = response.feedback_discussion()

        data["panels"] = panels

        # If feedback exists for the requested project
        if feedback_discussion:
            # 3rd pane is the instructor feedback, if it exists
            panel = {
                "panel_state": "open" if show_feedback else "closed",
                "panel_state_label": "Instructor Feedback",
                "template": "discussion",
                "owners": owners,
                "vocabulary": vocabulary,
                "context": threaded_comment_json(request, feedback_discussion),
            }
            panels.append(panel)

        # Create a place for asset editing
        panel = {
            "panel_state": "closed",
            "panel_state_label": "Item Details",
            "template": "asset_quick_edit",
            "update_history": False,
            "owners": owners,
            "vocabulary": vocabulary,
            "context": {"type": "asset"},
        }
        panels.append(panel)

        return HttpResponse(simplejson.dumps(data, indent=2), mimetype="application/json")
Example #3
0
def project_workspace(request, project_id, feedback=None):
    """
    A multi-panel editable view for the specified project
    Legacy note: Ideally, this function would be named project_view but
    StructuredCollaboration requires the view name
    to be  <class>-view to do a reverse lookup

    Panel 1: Parent Assignment (if applicable)
    Panel 2: Project
    Panel 3: Instructor Feedback (if applicable & exists)

    Keyword arguments:
    project_id -- the model id
    """
    project = get_object_or_404(Project, pk=project_id)

    if not project.can_read(request):
        return HttpResponseForbidden("forbidden")

    show_feedback = feedback == "feedback"
    data = {'space_owner': request.user.username,
            'show_feedback': show_feedback}

    if not request.is_ajax():
        data['project'] = project
        return render_to_response('projects/project.html',
                                  data,
                                  context_instance=RequestContext(request))
    else:
        panels = []

        vocabulary = VocabularyResource().render_list(
            request, Vocabulary.objects.get_for_object(request.course))

        owners = UserResource().render_list(request, request.course.members)

        is_faculty = request.course.is_faculty(request.user)
        can_edit = project.can_edit(request)
        feedback_discussion = project.feedback_discussion() \
            if is_faculty or can_edit else None

        # Project Parent (assignment) if exists
        parent_assignment = project.assignment()
        if parent_assignment:
            resource = ProjectResource(
                record_viewer=request.user, is_viewer_faculty=is_faculty,
                editable=parent_assignment.can_edit(request))
            assignment_ctx = resource.render_one(request, parent_assignment)

            panel = {'is_faculty': is_faculty,
                     'panel_state': "open" if (project.title == "Untitled" and
                                               len(project.body) == 0)
                     else "closed",
                     'subpanel_state': 'closed',
                     'context': assignment_ctx,
                     'owners': owners,
                     'vocabulary': vocabulary,
                     'template': 'project'}
            panels.append(panel)

        # Requested project, can be either an assignment or composition
        resource = ProjectResource(record_viewer=request.user,
                                   is_viewer_faculty=is_faculty,
                                   editable=can_edit)
        project_context = resource.render_one(request, project)

        # only editing if it's new
        project_context['editing'] = \
            True if can_edit and len(project.body) < 1 else False

        project_context['create_instructor_feedback'] = \
            is_faculty and parent_assignment and not feedback_discussion

        panel = {'is_faculty': is_faculty,
                 'panel_state': 'closed' if show_feedback else 'open',
                 'context': project_context,
                 'template': 'project',
                 'owners': owners,
                 'vocabulary': vocabulary}
        panels.append(panel)

        # Project Response -- if the requested project is an assignment
        # This is primarily a student view. The student's response should
        # pop up automatically when the parent assignment is viewed.
        if project.is_assignment(request):
            responses = project.responses_by(request, request.user)
            if len(responses) > 0:
                response = responses[0]
                response_can_edit = response.can_edit(request)
                resource = ProjectResource(record_viewer=request.user,
                                           is_viewer_faculty=is_faculty,
                                           editable=response_can_edit)
                response_context = resource.render_one(request, response)

                panel = {'is_faculty': is_faculty,
                         'panel_state': 'closed',
                         'context': response_context,
                         'template': 'project',
                         'owners': owners,
                         'vocabulary': vocabulary}
                panels.append(panel)

                if not feedback_discussion and response_can_edit:
                    feedback_discussion = response.feedback_discussion()

        data['panels'] = panels

        # If feedback exists for the requested project
        if feedback_discussion:
            # 3rd pane is the instructor feedback, if it exists
            panel = {'panel_state': 'open' if show_feedback else 'closed',
                     'panel_state_label': "Instructor Feedback",
                     'template': 'discussion',
                     'owners': owners,
                     'vocabulary': vocabulary,
                     'context': threaded_comment_json(request,
                                                      feedback_discussion)}
            panels.append(panel)

        # Create a place for asset editing
        panel = {'panel_state': 'closed',
                 'panel_state_label': "Item Details",
                 'template': 'asset_quick_edit',
                 'update_history': False,
                 'owners': owners,
                 'vocabulary': vocabulary,
                 'context': {'type': 'asset'}}
        panels.append(panel)

        return HttpResponse(json.dumps(data, indent=2),
                            mimetype='application/json')
Example #4
0
    def get(self, request, *args, **kwargs):
        project = get_object_or_404(Project, pk=kwargs.get('project_id', None))
        assignment = project.assignment()
        if not assignment or not assignment.is_essay_assignment():
            return HttpResponseForbidden('')

        panels = []

        lst = Vocabulary.objects.filter(course=request.course)
        lst = lst.prefetch_related('term_set')
        vocabulary = VocabularyResource().render_list(request, lst)

        owners = UserResource().render_list(request, request.course.members)

        is_faculty = request.course.is_faculty(request.user)
        can_edit = project.can_edit(request.course, request.user)
        feedback_discussion = project.feedback_discussion() \
            if is_faculty or can_edit else None

        parent = project.assignment()

        # Requested project, can be either an assignment or composition
        resource = ProjectResource(record_viewer=request.user,
                                   is_viewer_faculty=is_faculty,
                                   editable=can_edit)
        project_context = resource.render_one(request, project)

        # only editing if it's new
        project_context['editing'] = \
            True if can_edit and len(project.body) < 1 else False

        project_context['create_instructor_feedback'] = \
            is_faculty and parent and not feedback_discussion

        project_revisions_url = reverse('project-revisions',
                                        args=[request.course.pk, project.id])

        panel = {
            'is_faculty':
            is_faculty,
            'show_feedback':
            feedback_discussion is not None,
            'create_feedback_url':
            reverse('discussion-create', args=[request.course.pk]),
            'project_revisions_url':
            project_revisions_url,
            'context':
            project_context,
            'template':
            'project_response',
            'owners':
            owners,
            'vocabulary':
            vocabulary
        }
        panels.append(panel)

        # If feedback exists for the requested project
        if feedback_discussion:
            # 3rd pane is the instructor feedback, if it exists
            panel = {
                'template': 'project_feedback',
                'owners': owners,
                'vocabulary': vocabulary,
                'context': threaded_comment_json(request, feedback_discussion)
            }
            panels.append(panel)

        # Create a place for asset editing
        panel = {
            'template': 'asset_quick_edit',
            'update_history': False,
            'owners': owners,
            'vocabulary': vocabulary,
            'context': {
                'type': 'asset'
            }
        }
        panels.append(panel)

        data = {'space_owner': request.user.username, 'panels': panels}

        return self.render_to_json_response(data)