Exemple #1
0
    def post(self, request):
        project = Project.objects.create(author=request.user,
                                         course=request.course,
                                         title="Untitled")
        project.collaboration(request, sync_group=True)

        parent = request.POST.get("parent")
        if parent is not None:
            try:
                parent = Project.objects.get(pk=parent)

                parent_collab = parent.collaboration(request)
                if parent_collab.permission_to("add_child", request):
                    parent_collab.append_child(project)

            except Project.DoesNotExist:
                parent = None
                # @todo -- an error has occurred

        if not request.is_ajax():
            return HttpResponseRedirect(project.get_absolute_url())
        else:
            is_faculty = request.course.is_faculty(request.user)
            resource = ProjectResource(record_viewer=request.user,
                                       is_viewer_faculty=is_faculty,
                                       editable=project.can_edit(request))
            project_context = resource.render_one(request, project)
            project_context['editing'] = True

            data = {'panel_state': 'open',
                    'template': 'project',
                    'context': project_context}

            return self.render_to_json_response(data)
Exemple #2
0
    def get(self, *args, **kwargs):
        """
        A single panel read-only view of the specified project/version combo.
        No assignment, response or feedback access/links.
        Regular access conventions apply. For example, if the project is
        "private" an HTTPResponseForbidden will be returned.

        Used for reviewing old project versions and public project access.

        Keyword arguments:
        project_id -- the model id
        version_number -- a specific project version or
        None for the current version

        """

        attach_course_to_request(self.request, **kwargs)
        data = {'space_owner': self.request.user.username}
        version_number = self.kwargs.get('version_number', None)

        if not self.request.is_ajax():
            if version_number:
                # versioned view
                ctx = {
                    'course_pk': self.project.course.pk,
                    'project_id': self.project.id,
                    'version_number': version_number
                }
                project_url = reverse('project-view-readonly', kwargs=ctx)
            else:
                project_url = self.project.public_url()

            data['project'] = self.project
            data['version'] = version_number
            data['public_url'] = project_url
            data['readonly'] = True
            return self.render_to_response(data)

        # ajax view
        resource = ProjectResource(record_viewer=self.request.user,
                                   is_viewer_faculty=False,
                                   editable=False)

        if version_number:
            version = get_object_or_404(Version,
                                        object_id=str(self.project.id),
                                        revision_id=version_number)
            project_context = resource.render_one(
                self.request, version._object_version.object, version_number)
        else:
            project_context = resource.render_one(self.request, self.project)

        data['panels'] = [{
            'context': project_context,
            'template': 'project_readonly'
        }]

        return self.render_to_json_response(data)
Exemple #3
0
    def post(self, request):
        project_type = request.POST.get('project_type', 'composition')
        body = request.POST.get('body', '')
        response_policy = request.POST.get('response_view_policy', 'always')
        due_date = self.format_date(self.request.POST.get('due_date', None))
        instructions1 = self.request.POST.get('custom_instructions_1', None)
        instructions2 = self.request.POST.get('custom_instructions_2', None)
        summary = self.request.POST.get('summary', None)
        project = Project.objects.create(author=request.user,
                                         course=request.course,
                                         title=self.get_title(),
                                         project_type=project_type,
                                         response_view_policy=response_policy,
                                         body=body,
                                         due_date=due_date,
                                         custom_instructions_1=instructions1,
                                         custom_instructions_2=instructions2,
                                         summary=summary)

        project.participants.add(request.user)

        item_id = request.POST.get('item', None)
        project.create_or_update_item(item_id)

        policy = request.POST.get('publish', PUBLISH_DRAFT[0])
        collaboration = project.create_or_update_collaboration(policy)

        DiscussionIndex.update_class_references(project.body, None, None,
                                                collaboration, project.author)

        parent_id = request.POST.get('parent', None)
        project.set_parent(parent_id)

        if project_type == PROJECT_TYPE_SEQUENCE_ASSIGNMENT:
            messages.add_message(request, messages.SUCCESS,
                                 self.get_confirmation_message(policy))

        if not request.is_ajax():
            return HttpResponseRedirect(project.get_absolute_url())
        else:
            is_faculty = request.course.is_faculty(request.user)
            can_edit = project.can_edit(request.course, request.user)

            resource = ProjectResource(record_viewer=request.user,
                                       is_viewer_faculty=is_faculty,
                                       editable=can_edit)
            project_context = resource.render_one(request, project)
            project_context['editing'] = True

            data = {
                'panel_state': 'open',
                'template': 'project',
                'context': project_context
            }

            return self.render_to_json_response(data)
Exemple #4
0
    def get(self, request, project_id):
        project = get_object_or_404(Project, id=project_id)

        can_edit = project.can_edit(request.course, request.user)

        resource = ProjectResource(record_viewer=request.user,
                                   is_viewer_faculty=self.is_viewer_faculty,
                                   editable=can_edit)
        context = resource.render_one(request, project)
        return self.render_to_json_response(context)
Exemple #5
0
    def get(self, request, project_id):
        project = get_object_or_404(Project, id=project_id)
        if not project.visible(request):
            return HttpResponseForbidden("forbidden")

        resource = ProjectResource(record_viewer=request.user,
                                   is_viewer_faculty=self.is_viewer_faculty,
                                   editable=project.can_edit(request))
        context = resource.render_one(request, project)
        return self.render_to_json_response(context)
Exemple #6
0
    def get(self, request, project_id):
        project = get_object_or_404(Project, id=project_id)
        if not project.visible(request):
            return HttpResponseForbidden("forbidden")

        resource = ProjectResource(record_viewer=request.user,
                                   is_viewer_faculty=self.is_viewer_faculty,
                                   editable=project.can_edit(request))
        context = resource.render_one(request, project)
        return self.render_to_json_response(context)
Exemple #7
0
    def get(self, request, project_id):
        project = get_object_or_404(Project, id=project_id)

        can_edit = project.can_edit(request.course, request.user)

        resource = ProjectResource(record_viewer=request.user,
                                   is_viewer_faculty=self.is_viewer_faculty,
                                   editable=can_edit)
        context = resource.render_one(request, project)
        return self.render_to_json_response(context)
Exemple #8
0
    def post(self, request):
        project_type = request.POST.get('project_type', 'composition')
        body = request.POST.get('body', '')
        response_policy = request.POST.get('response_view_policy', 'always')
        due_date = self.format_date(self.request.POST.get('due_date', None))
        instructions1 = self.request.POST.get('custom_instructions_1', None)
        instructions2 = self.request.POST.get('custom_instructions_2', None)
        summary = self.request.POST.get('summary', None)
        project = Project.objects.create(
            author=request.user, course=request.course, title=self.get_title(),
            project_type=project_type, response_view_policy=response_policy,
            body=body, due_date=due_date, custom_instructions_1=instructions1,
            custom_instructions_2=instructions2, summary=summary)

        project.participants.add(request.user)

        item_id = request.POST.get('item', None)
        project.create_or_update_item(item_id)

        policy = request.POST.get('publish', PUBLISH_DRAFT[0])
        collaboration = project.create_or_update_collaboration(policy)

        DiscussionIndex.update_class_references(
            project.body, None, None, collaboration, project.author)

        parent_id = request.POST.get('parent', None)
        project.set_parent(parent_id)

        if project_type == PROJECT_TYPE_SEQUENCE_ASSIGNMENT:
            messages.add_message(request, messages.SUCCESS,
                                 self.get_confirmation_message(policy))

        if not request.is_ajax():
            return HttpResponseRedirect(project.get_absolute_url())
        else:
            is_faculty = request.course.is_faculty(request.user)
            can_edit = project.can_edit(request.course, request.user)

            resource = ProjectResource(record_viewer=request.user,
                                       is_viewer_faculty=is_faculty,
                                       editable=can_edit)
            project_context = resource.render_one(request, project)
            project_context['editing'] = True

            data = {'panel_state': 'open',
                    'template': 'project',
                    'context': project_context}

            return self.render_to_json_response(data)
Exemple #9
0
    def get(self, request):
        ures = UserResource()
        course_rez = CourseResource()
        pres = ProjectResource(editable=self.viewing_own_records,
                               record_viewer=self.record_viewer,
                               is_viewer_faculty=self.is_viewer_faculty)
        assignments = []

        ctx = {
            'space_viewer': ures.render_one(request, self.record_viewer),
            'editable': self.viewing_own_records,
            'course': course_rez.render_one(request, request.course),
            'is_faculty': self.is_viewer_faculty
        }

        if (self.record_owner):
            in_course_or_404(self.record_owner.username, request.course)

            projects = Project.objects.visible_by_course_and_user(
                request, request.course, self.record_owner)

            # Show unresponded assignments if viewing self & self is a student
            if not self.is_viewer_faculty and self.viewing_own_records:
                assignments = Project.objects.unresponded_assignments(
                    request, self.record_viewer)

            ctx['space_owner'] = ures.render_one(request, self.record_owner)
            ctx['assignments'] = pres.render_assignments(request, assignments)
        else:
            projects = Project.objects.visible_by_course(request,
                                                         request.course)

        #offset = int(request.GET.get("offset", 0))
        #limit = int(request.GET.get("limit", 20))

        ctx['projects'] = pres.render_projects(request, projects)
        ctx['compositions'] = len(projects) > 0 or len(assignments) > 0

        return self.render_to_json_response(ctx)
Exemple #10
0
    def get(self, request):
        ures = UserResource()
        course_rez = CourseResource()
        pres = ProjectResource(editable=self.viewing_own_records,
                               record_viewer=self.record_viewer,
                               is_viewer_faculty=self.is_viewer_faculty)
        assignments = []

        ctx = {
            'space_viewer': ures.render_one(request, self.record_viewer),
            'editable': self.viewing_own_records,
            'course': course_rez.render_one(request, request.course),
            'is_faculty': self.is_viewer_faculty
        }

        if (self.record_owner):
            in_course_or_404(self.record_owner.username, request.course)

            projects = Project.objects.visible_by_course_and_user(
                request, request.course, self.record_owner,
                self.viewing_faculty_records)

            # Show unresponded assignments if viewing self & self is a student
            if not self.is_viewer_faculty and self.viewing_own_records:
                assignments = Project.objects.unresponded_assignments(
                    request, self.record_viewer)

            ctx['space_owner'] = ures.render_one(request, self.record_owner)
            ctx['assignments'] = pres.render_assignments(request, assignments)
        else:
            projects = Project.objects.visible_by_course(
                request, request.course)

        ctx['projects'] = pres.render_projects(request, projects)
        ctx['compositions'] = len(projects) > 0 or len(assignments) > 0

        return self.render_to_json_response(ctx)
Exemple #11
0
    def post(self, request):
        project = Project.objects.create(author=request.user,
                                         course=request.course,
                                         title="Untitled")

        project.participants.add(request.user)

        policy_name = request.POST.get('publish', 'PrivateEditorsAreOwners')
        project.create_or_update_collaboration(policy_name)

        parent = request.POST.get("parent", None)
        if parent is not None:
            parent = get_object_or_404(Project, pk=parent)

            collab = parent.get_collaboration()
            if collab.permission_to("add_child", request.course,
                                    request.user):
                collab.append_child(project)

        if not request.is_ajax():
            return HttpResponseRedirect(project.get_absolute_url())
        else:
            is_faculty = request.course.is_faculty(request.user)
            can_edit = project.can_edit(request.course, request.user)

            resource = ProjectResource(record_viewer=request.user,
                                       is_viewer_faculty=is_faculty,
                                       editable=can_edit)
            project_context = resource.render_one(request, project)
            project_context['editing'] = True

            data = {'panel_state': 'open',
                    'template': 'project',
                    'context': project_context}

            return self.render_to_json_response(data)
Exemple #12
0
    def post(self, request):
        project = Project.objects.create(author=request.user,
                                         course=request.course,
                                         title="Untitled")
        project.collaboration(request, sync_group=True)

        parent = request.POST.get("parent")
        if parent is not None:
            try:
                parent = Project.objects.get(pk=parent)

                parent_collab = parent.collaboration(request)
                if parent_collab.permission_to("add_child", request):
                    parent_collab.append_child(project)

            except Project.DoesNotExist:
                parent = None
                # @todo -- an error has occurred

        if not request.is_ajax():
            return HttpResponseRedirect(project.get_absolute_url())
        else:
            is_faculty = request.course.is_faculty(request.user)
            resource = ProjectResource(record_viewer=request.user,
                                       is_viewer_faculty=is_faculty,
                                       editable=project.can_edit(request))
            project_context = resource.render_one(request, project)
            project_context['editing'] = True

            data = {
                'panel_state': 'open',
                'template': 'project',
                'context': project_context
            }

            return self.render_to_json_response(data)
Exemple #13
0
    def get(self, request, *args, **kwargs):
        course = get_object_or_404(Course, id=kwargs.pop('course_id', None))
        faculty = [user.id for user in course.faculty.all()]
        faculty_ctx = UserResource().render_list(request, course.faculty.all())

        # filter assets & notes by the faculty set
        assets = Asset.objects.by_course(course)
        if settings.SURELINK_URL:
            assets = assets.exclude(
                source__url__startswith=settings.SURELINK_URL)
        assets = assets.filter(sherdnote_set__author__id__in=faculty).exclude(
            source__label='flv_pseudo')

        notes = SherdNote.objects.get_related_notes(
            assets, None, faculty, True).exclude_primary_types(['flv_pseudo'])

        ares = AssetResource(include_annotations=False)
        asset_ctx = ares.render_list(request, None, None, assets, notes)

        projects = Project.objects.by_course_and_users(course, faculty)

        # filter private projects
        if projects.count() > 0:
            collabs = Collaboration.objects.get_for_object_list(projects)
            collabs = collabs.exclude(
                policy_record__policy_name='PrivateEditorsAreOwners')
            ids = collabs.values_list('object_pk', flat=True)
            projects = projects.filter(id__in=ids)

        info_ctx = CourseInfoResource().render_one(request, course)

        ctx = {
            'course': {
                'id': course.id,
                'title': course.title,
                'faculty': faculty_ctx,
                'info': info_ctx
            },
            'assets': asset_ctx,
            'projects': ProjectResource().render_list(request, projects)
        }

        return self.render_to_json_response(ctx)
Exemple #14
0
    def get(self, request):
        ures = UserResource()
        course_res = CourseResource()
        pres = ProjectResource(editable=self.viewing_own_records,
                               record_viewer=self.record_viewer,
                               is_viewer_faculty=self.is_viewer_faculty)
        assignments = []

        ctx = {
            'space_viewer': ures.render_one(request, self.record_viewer),
            'editable': self.viewing_own_records,
            'course': course_res.render_one(request, request.course),
            'is_faculty': self.is_viewer_faculty,
            'is_superuser': request.user.is_superuser,
        }

        if self.record_owner:
            ctx['space_owner'] = ures.render_one(request, self.record_owner)

            if not request.course.is_true_member(self.record_owner):
                return self.render_to_json_response(ctx)

            projects = Project.objects.visible_by_course_and_user(
                request.course, request.user, self.record_owner,
                self.viewing_faculty_records)

            # Show unresponded assignments if viewing self & self is a student
            if not self.is_viewer_faculty and self.viewing_own_records:
                assignments = list(
                    Project.objects.unresponded_assignments(
                        request.course, request.user))
        else:
            projects = Project.objects.visible_by_course(
                request.course, request.user)

        # update counts and paginate
        ctx['compositions'] = len(projects) > 0 or len(assignments) > 0
        ctx.update(self.paginate(pres, assignments, projects))
        return self.render_to_json_response(ctx)
Exemple #15
0
    def get(self, request, *args, **kwargs):
        course = get_object_or_404(Course, id=kwargs.pop('course_id', None))
        faculty = [user.id for user in course.faculty.all()]
        faculty_ctx = UserResource().render_list(request, course.faculty.all())

        # filter assets & notes by the faculty set
        assets = Asset.objects.by_course(course)
        assets = assets.filter(sherdnote_set__author__id__in=faculty)
        notes = SherdNote.objects.get_related_notes(assets, None, faculty)

        ares = AssetResource(include_annotations=False)
        asset_ctx = ares.render_list(request, None, assets, notes)

        projects = Project.objects.by_course_and_users(course, faculty)

        # filter private projects
        collabs = Collaboration.objects.get_for_object_list(projects)
        collabs = collabs.exclude(
            _policy__policy_name='PrivateEditorsAreOwners')
        ids = [int(c.object_pk) for c in collabs]
        projects = projects.filter(id__in=ids)

        info_ctx = CourseInfoResource().render_one(request, course)

        ctx = {
            'course': {
                'id': course.id,
                'title': course.title,
                'faculty': faculty_ctx,
                'info': info_ctx
            },
            'assets': asset_ctx,
            'projects': ProjectResource().render_list(request, projects)
        }

        return self.render_to_json_response(ctx)
Exemple #16
0
from django.contrib import admin
from django.contrib.auth.decorators import login_required
from django.views.generic.simple import direct_to_template
from djangosherd.api import SherdNoteResource
from mediathread.api import TagResource
from mediathread.assetmgr.api import AssetResource
from mediathread.main.api import CourseResource, CourseSummaryResource
from mediathread.projects.api import ProjectResource
from mediathread.taxonomy.api import TermResource, VocabularyResource
from tastypie.api import Api
import os.path

v1_api = Api(api_name='v1')
v1_api.register(SherdNoteResource())
v1_api.register(AssetResource())
v1_api.register(ProjectResource())
v1_api.register(CourseResource())
v1_api.register(CourseSummaryResource())
v1_api.register(TermResource())
v1_api.register(VocabularyResource())
v1_api.register(TagResource())

admin.autodiscover()

site_media_root = os.path.join(os.path.dirname(__file__), "../media")
bookmarklet_root = os.path.join(os.path.dirname(__file__), "../media/",
                                "bookmarklets")

redirect_after_logout = getattr(settings, 'LOGOUT_REDIRECT_URL', None)

auth_urls = (r'^accounts/', include('django.contrib.auth.urls'))
Exemple #17
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)
Exemple #18
0
    def get(self, request, *args, **kwargs):
        project = get_object_or_404(Project, pk=kwargs.get('project_id', None))
        data = {'space_owner': request.user.username}

        if not request.is_ajax():
            self.template_name = 'projects/composition.html'
            data['project'] = project
            return self.render_to_response(data)
        else:
            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)

            # 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'] = False

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

            panel = {
                'is_faculty': is_faculty,
                'context': project_context,
                'template': 'project',
                'owners': owners,
                'project_revisions_url': project_revisions_url,
                'vocabulary': vocabulary
            }
            panels.append(panel)

            data['panels'] = panels

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

            return self.render_to_json_response(data)
Exemple #19
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')
Exemple #20
0
def project_view_readonly(request, project_id, version_number=None):
    """
    A single panel read-only view of the specified project/version combination.
    No assignment, response or feedback access/links.
    Regular access conventions apply. For example, if the project is "private"
    an HTTPResponseForbidden will be returned.

    Used for reviewing old project versions and public project access.

    Keyword arguments:
    project_id -- the model id
    version_number -- a specific project version or
    None for the current version

    """

    project = get_object_or_404(Project, pk=project_id)

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

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

    course = request.course
    if not course:
        # public view
        course = request.collaboration_context.content_object
        public_url = project.public_url()
    else:
        # versioned view
        public_url = reverse('project-view-readonly',
                             kwargs={
                                 'project_id': project.id,
                                 'version_number': version_number
                             })

    if not request.is_ajax():
        data['project'] = project
        data['version'] = version_number
        data['public_url'] = public_url
        return render_to_response('projects/project.html',
                                  data,
                                  context_instance=RequestContext(request))
    else:
        ProjectVersion = get_model('projects', 'projectversion')

        if version_number:
            version = get_object_or_404(ProjectVersion,
                                        versioned_id=project_id,
                                        version_number=version_number)

            project = version.instance()

        panels = []

        # Requested project, either assignment or composition
        request.public = True

        resource = ProjectResource(record_viewer=request.user,
                                   is_viewer_faculty=False,
                                   editable=False)
        project_context = resource.render_one(request, project, version_number)
        panel = {
            'panel_state': 'open',
            'panel_state_label': "Version View",
            'context': project_context,
            'template': 'project'
        }
        panels.append(panel)

        data['panels'] = panels

        return HttpResponse(json.dumps(data, indent=2),
                            mimetype='application/json')
Exemple #21
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')
Exemple #22
0
def project_view_readonly(request, project_id, version_number=None):
    """
    A single panel read-only view of the specified project/version combination.
    No assignment, response or feedback access/links.
    Regular access conventions apply. For example, if the project is "private"
    an HTTPResponseForbidden will be returned.

    Used for reviewing old project versions and public project access.

    Keyword arguments:
    project_id -- the model id
    version_number -- a specific project version or
    None for the current version

    """

    project = get_object_or_404(Project, pk=project_id)

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

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

    course = request.course
    if not course:
        # public view
        course = request.collaboration_context.content_object
        public_url = project.public_url()
    else:
        # versioned view
        public_url = reverse('project-view-readonly',
                             kwargs={'project_id': project.id,
                                     'version_number': version_number})

    if not request.is_ajax():
        data['project'] = project
        data['version'] = version_number
        data['public_url'] = public_url
        return render_to_response('projects/project.html',
                                  data,
                                  context_instance=RequestContext(request))
    else:
        ProjectVersion = get_model('projects', 'projectversion')

        if version_number:
            version = get_object_or_404(ProjectVersion,
                                        versioned_id=project_id,
                                        version_number=version_number)

            project = version.instance()

        panels = []

        # Requested project, either assignment or composition
        request.public = True

        resource = ProjectResource(record_viewer=request.user,
                                   is_viewer_faculty=False,
                                   editable=False)
        project_context = resource.render_one(request, project, version_number)
        panel = {'panel_state': 'open',
                 'panel_state_label': "Version View",
                 'context': project_context,
                 'template': 'project'}
        panels.append(panel)

        data['panels'] = panels

        return HttpResponse(json.dumps(data, indent=2),
                            mimetype='application/json')
Exemple #23
0
    def get(self, request, project_id, version_number=None):
        """
        A single panel read-only view of the specified project/version combo.
        No assignment, response or feedback access/links.
        Regular access conventions apply. For example, if the project is
        "private" an HTTPResponseForbidden will be returned.

        Used for reviewing old project versions and public project access.

        Keyword arguments:
        project_id -- the model id
        version_number -- a specific project version or
        None for the current version

        """

        project = get_object_or_404(Project, pk=project_id)

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

        if not request.is_ajax():
            course = request.course
            if not course:
                public_url = project.public_url()
            else:
                # versioned view
                public_url = reverse('project-view-readonly',
                                     kwargs={'project_id': project.id,
                                             'version_number': version_number})

            data['project'] = project
            data['version'] = version_number
            data['public_url'] = public_url
            return self.render_to_response(data)
        else:
            if version_number:
                version = get_object_or_404(Version,
                                            object_id=str(project.id),
                                            revision_id=version_number)
                project = version._object_version.object

            panels = []

            is_faculty = (self.request.course and
                          self.request.course.is_faculty(request.user))

            # Requested project, either assignment or composition
            request.public = True

            resource = ProjectResource(record_viewer=request.user,
                                       is_viewer_faculty=False,
                                       editable=False)
            project_context = resource.render_one(request, project,
                                                  version_number)
            panel = {'panel_state': 'open',
                     'panel_state_label': "Version View",
                     'context': project_context,
                     'is_faculty': is_faculty,
                     'template': 'project'}
            panels.append(panel)

            data['panels'] = panels

            return self.render_to_json_response(data)
Exemple #24
0
    def get(self, request, project_id, version_number=None):
        """
        A single panel read-only view of the specified project/version combo.
        No assignment, response or feedback access/links.
        Regular access conventions apply. For example, if the project is
        "private" an HTTPResponseForbidden will be returned.

        Used for reviewing old project versions and public project access.

        Keyword arguments:
        project_id -- the model id
        version_number -- a specific project version or
        None for the current version

        """

        project = get_object_or_404(Project, pk=project_id)

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

        if not request.is_ajax():
            course = request.course
            if not course:
                public_url = project.public_url()
            else:
                # versioned view
                public_url = reverse('project-view-readonly',
                                     kwargs={'project_id': project.id,
                                             'version_number': version_number})

            data['project'] = project
            data['version'] = version_number
            data['public_url'] = public_url
            return self.render_to_response(data)
        else:
            if version_number:
                version = get_object_or_404(Version,
                                            object_id=str(project.id),
                                            revision_id=version_number)
                project = version.object_version.object

            panels = []

            is_faculty = (self.request.course and
                          self.request.course.is_faculty(request.user))

            # Requested project, either assignment or composition
            request.public = True

            resource = ProjectResource(record_viewer=request.user,
                                       is_viewer_faculty=False,
                                       editable=False)
            project_context = resource.render_one(request, project,
                                                  version_number)
            panel = {'panel_state': 'open',
                     'panel_state_label': "Version View",
                     'context': project_context,
                     'is_faculty': is_faculty,
                     'template': 'project'}
            panels.append(panel)

            data['panels'] = panels

            return self.render_to_json_response(data)