Exemple #1
0
    def render_one(self, request, asset, notes=None):
        self.request = request
        try:
            bundle = self.build_bundle(obj=asset, request=request)
            dehydrated = self.full_dehydrate(bundle)
            the_json = self._meta.serializer.to_simple(dehydrated, None)

            try:
                metadata = json.loads(bundle.obj.metadata_blob)
                metadata = [{
                    'key': k,
                    'value': v
                } for k, v in metadata.items()]
                the_json['metadata'] = metadata
            except ValueError:
                pass

            if notes:
                note_resource = SherdNoteResource()
                for note in notes:
                    note_ctx = note_resource.render_one(request, note, "")
                    the_json = add_note_ctx_to_json(note_ctx, the_json)
            return the_json

        except Source.DoesNotExist:
            return None
Exemple #2
0
    def render_list(self, request, me, assets, notes):
        note_resource = SherdNoteResource()
        ctx = {}
        for note in notes.all():
            if note.asset.id not in ctx:
                abundle = self.build_bundle(obj=note.asset, request=request)
                dehydrated = self.full_dehydrate(abundle)
                asset_ctx = self._meta.serializer.to_simple(dehydrated, None)
                ctx[note.asset.id] = asset_ctx

            is_global = note.is_global_annotation()
            if not is_global:
                ctx[note.asset.id]['annotation_count'] += 1
                if note.author == me:
                    ctx[note.asset.id]['my_annotation_count'] += 1

            if note.modified > note.asset.modified:
                ctx[note.asset.id]['modified'] = \
                    self.format_time(note.modified)

            if self.include_annotations:
                note_ctx = note_resource.render_one(request, note, "")

                if is_global:
                    ctx[note.asset.id]['global_annotation'] = note_ctx
                else:
                    ctx[note.asset.id]['annotations'].append(note_ctx)

        values = ctx.values()
        return sorted(values,
                      key=lambda value: self.to_time(value['modified']),
                      reverse=True)
Exemple #3
0
    def render_list(self, request, me, assets, notes):
        note_resource = SherdNoteResource()
        ctx = {}
        for note in notes.all():
            if note.asset.id not in ctx:
                abundle = self.build_bundle(obj=note.asset, request=request)
                dehydrated = self.full_dehydrate(abundle)
                asset_ctx = self._meta.serializer.to_simple(dehydrated, None)
                ctx[note.asset.id] = asset_ctx

            is_global = note.is_global_annotation()
            if not is_global:
                ctx[note.asset.id]["annotation_count"] += 1
                if note.author == me:
                    ctx[note.asset.id]["my_annotation_count"] += 1

            if note.modified > note.asset.modified:
                ctx[note.asset.id]["modified"] = self.format_time(note.modified)

            if self.include_annotations:
                note_ctx = note_resource.render_one(request, note, "")

                if is_global:
                    ctx[note.asset.id]["global_annotation"] = note_ctx
                else:
                    ctx[note.asset.id]["annotations"].append(note_ctx)

        values = ctx.values()
        return sorted(values, key=lambda value: self.to_time(value["modified"]), reverse=True)
Exemple #4
0
    def render_one(self, request, asset, notes=None):
        try:
            bundle = Bundle(request=request)
            bundle = self.build_bundle(obj=asset, request=request)
            dehydrated = self.full_dehydrate(bundle)
            the_json = self._meta.serializer.to_simple(dehydrated, None)

            try:
                metadata = json.loads(bundle.obj.metadata_blob)
                metadata = [{"key": k, "value": v} for k, v in metadata.items()]
                the_json["metadata"] = metadata
            except ValueError:
                pass

            if notes:
                note_resource = SherdNoteResource()
                for note in notes:
                    note_ctx = note_resource.render_one(request, note, "")

                    if note.is_global_annotation():
                        the_json["global_annotation"] = note_ctx

                        the_json["global_annotation_analysis"] = (
                            len(note_ctx["vocabulary"]) > 0
                            or len(note_ctx["metadata"]["body"]) > 0
                            or len(note_ctx["metadata"]["tags"]) > 0
                        )
                    else:
                        the_json["annotations"].append(note_ctx)

            return the_json

        except Source.DoesNotExist:
            return None
Exemple #5
0
def threaded_comment_json(request, comment):
    viewer = request.user
    coll = ContentType.objects.get_for_model(Collaboration)
    all_comments = ThreadedComment.objects.filter(
        content_type=coll,
        object_pk=comment.content_object.pk,
        site__pk=settings.SITE_ID)
    all_comments = fill_tree(all_comments)
    all_comments = list(annotate_tree_properties(all_comments))

    rand = ''.join([choice(letters) for i in range(5)])
    citations = threaded_comment_citations(all_comments, viewer)

    asset_resource = AssetResource()
    sherd_resource = SherdNoteResource()

    return {
        'type':
        'discussion',
        'form':
        comments.get_form()(comment.content_object).__unicode__(),
        'editing':
        True,
        'can_edit':
        True,
        'discussion': {
            'id':
            comment.id,
            'max_length':
            COMMENT_MAX_LENGTH,
            'thread': [{
                'open':
                obj.open if hasattr(obj, "open") else None,
                'close':
                [i for i in obj.close] if hasattr(obj, "close") else None,
                'id':
                obj.id,
                'author':
                obj.name,
                'author_username':
                obj.user.username,
                'submit_date':
                pretty_date(obj.submit_date),
                'title':
                obj.title,
                'content':
                obj.comment,
                'can_edit':
                True if obj.user == viewer else False
            } for obj in all_comments]
        },
        'assets':
        dict([('%s_%s' % (rand, ann.asset.pk),
               asset_resource.render_one(request, ann.asset))
              for ann in citations if (ann.title != "Annotation Deleted"
                                       and ann.title != 'Asset Deleted')]),
        'annotations':
        [sherd_resource.render_one(request, ann, rand) for ann in citations],
    }
Exemple #6
0
    def test_dehydrate(self):
        res = SherdNoteResource()
        request = RequestFactory().get('/?citable=true')
        request.user = self.student_one
        bundle = SherdNoteResource().build_bundle(
            obj=self.note1, request=request)

        res.dehydrate(bundle)
        self.assertEquals(bundle.data['vocabulary'], [])
        self.assertEquals(bundle.data['is_null'], False)
        self.assertEquals(bundle.data['editable'], True)
        self.assertEquals(bundle.data['is_global_annotation'], False)
        self.assertEquals(bundle.data['citable'], True)
Exemple #7
0
    def test_dehydrate(self):
        res = SherdNoteResource()
        request = RequestFactory().get('/?citable=true')
        request.user = self.student_one
        bundle = SherdNoteResource().build_bundle(obj=self.note1,
                                                  request=request)

        res.dehydrate(bundle)
        self.assertEquals(bundle.data['vocabulary'], [])
        self.assertEquals(bundle.data['is_null'], False)
        self.assertEquals(bundle.data['editable'], True)
        self.assertEquals(bundle.data['is_global_annotation'], False)
        self.assertEquals(bundle.data['citable'], True)
Exemple #8
0
    def apply_limits(self, request, object_list):
        # Exclude archives from these lists
        archives = object_list.filter(source__primary=True,
                                      source__label='archive')
        object_list = object_list.exclude(id__in=[a.id for a in archives])

        tag_string = request.GET.get('tag', '')
        modified = request.GET.get('modified', '')
        vocabulary = dict((key[len('vocabulary-'):], val.split(","))
                          for key, val in request.GET.items()
                          if key.startswith('vocabulary-'))
        invisible = []
        for asset in object_list:
            # Hack -- call the authorization layer directly
            notes = SherdNoteResource()._meta.authorization.apply_limits(
                request, asset.sherdnote_set, False)

            if not cached_course_is_member(asset.course, request.user):
                invisible.append(asset.id)
            elif len(tag_string) > 0 and not self.is_tagged(notes, tag_string):
                invisible.append(asset.id)
            elif len(modified) > 0 and not self.in_date_range(notes, modified):
                invisible.append(asset.id)
            elif (len(vocabulary) > 0 and
                  not self.has_vocabulary(notes, vocabulary)):
                invisible.append(asset.id)

        return object_list.exclude(id__in=invisible).order_by('id')
Exemple #9
0
    def test_in_selection_assignment_response(self):
        res = SherdNoteResource()
        self.assertFalse(res.in_selection_assignment_response(self.note1))

        pn = ProjectNoteFactory(annotation=self.note1)
        pn.project.date_submitted = datetime.today()
        pn.project.save()
        self.assertTrue(res.in_selection_assignment_response(self.note1))

        request = RequestFactory().get('/?citable=true')
        request.user = self.student_one
        request.course = self.sample_course
        bundle = SherdNoteResource().build_bundle(
            obj=self.note1, request=request)
        res.dehydrate(bundle)
        self.assertEquals(bundle.data['editable'], False)
        self.assertEquals(bundle.data['citable'], True)
Exemple #10
0
    def related_assets_notes(self, request, project):

        asset_resource = AssetResource()
        sherd_resource = SherdNoteResource()

        rand = ''.join([choice(letters) for i in range(5)])

        assets = {}
        notes = []
        for note in project.citations():
            notes.append(sherd_resource.render_one(request, note, rand))
            if (note.title not in ["Annotation Deleted", 'Asset Deleted']):
                key = '%s_%s' % (rand, note.asset.pk)
                if key not in assets.keys():
                    assets[key] = \
                        asset_resource.render_one(request, note.asset)

        return assets, notes
Exemple #11
0
    def related_assets_notes(self, request, project):

        asset_resource = AssetResource()
        sherd_resource = SherdNoteResource()

        rand = ''.join([choice(ascii_letters) for i in range(5)])  # nosec

        assets = {}
        notes = []
        for note in project.citations():
            notes.append(sherd_resource.render_one(request, note, rand))
            if (note.title not in ["Annotation Deleted", 'Asset Deleted']):
                key = '%s_%s' % (rand, note.asset.pk)
                if key not in assets.keys():
                    assets[key] = \
                        asset_resource.render_one(request, note.asset)

        return assets, notes
Exemple #12
0
def threaded_comment_json(request, comment):
    viewer = request.user
    coll = ContentType.objects.get_for_model(Collaboration)
    all_comments = ThreadedComment.objects.filter(
        content_type=coll, object_pk=comment.content_object.pk,
        site__pk=settings.SITE_ID)
    all_comments = fill_tree(all_comments)
    all_comments = list(annotate_tree_properties(all_comments))

    rand = ''.join([choice(letters) for i in range(5)])
    citations = threaded_comment_citations(all_comments, viewer)

    asset_resource = AssetResource()
    sherd_resource = SherdNoteResource()

    return {
        'type': 'discussion',
        'form': django_comments.get_form()(
            comment.content_object).__unicode__(),
        'editing': True,
        'can_edit': True,
        'discussion': {
            'id': comment.id,
            'max_length': COMMENT_MAX_LENGTH,
            'thread': [{'open': obj.open if hasattr(obj, "open") else None,
                        'close': [i for i in obj.close]
                        if hasattr(obj, "close") else None,
                        'id': obj.id,
                        'author': obj.name,
                        'author_username': obj.user.username,
                        'submit_date': pretty_date(obj.submit_date),
                        'title': obj.title,
                        'content': obj.comment,
                        'can_edit': True if obj.user == viewer else False}
                       for obj in all_comments]
        },
        'assets': dict([('%s_%s' % (rand, ann.asset.pk),
                        asset_resource.render_one(request, ann.asset))
                        for ann in citations
                        if (ann.title != "Annotation Deleted" and
                            ann.title != 'Asset Deleted')]),
        'annotations': [sherd_resource.render_one(request, ann, rand)
                        for ann in citations],
    }
Exemple #13
0
    def render_one(self, request, asset, notes=None):
        try:
            bundle = Bundle(request=request)
            bundle = self.build_bundle(obj=asset, request=request)
            dehydrated = self.full_dehydrate(bundle)
            the_json = self._meta.serializer.to_simple(dehydrated, None)

            try:
                metadata = json.loads(bundle.obj.metadata_blob)
                metadata = [{'key': k, 'value': v}
                            for k, v in metadata.items()]
                the_json['metadata'] = metadata
            except ValueError:
                pass

            if notes:
                note_resource = SherdNoteResource()
                for note in notes:
                    note_ctx = note_resource.render_one(request, note, "")
                    the_json = add_note_ctx_to_json(note_ctx, the_json)
            return the_json

        except Source.DoesNotExist:
            return None
Exemple #14
0
    def render_one(self, request, asset, notes=None):
        try:
            bundle = Bundle(request=request)
            bundle = self.build_bundle(obj=asset, request=request)
            dehydrated = self.full_dehydrate(bundle)
            the_json = self._meta.serializer.to_simple(dehydrated, None)

            try:
                metadata = json.loads(bundle.obj.metadata_blob)
                metadata = [{
                    'key': k,
                    'value': v
                } for k, v in metadata.items()]
                the_json['metadata'] = metadata
            except ValueError:
                pass

            if notes:
                note_resource = SherdNoteResource()
                for note in notes:
                    note_ctx = note_resource.render_one(request, note, "")

                    if note.is_global_annotation():
                        the_json['global_annotation'] = note_ctx

                        the_json['global_annotation_analysis'] = (
                            len(note_ctx['vocabulary']) > 0
                            or len(note_ctx['metadata']['body']) > 0
                            or len(note_ctx['metadata']['tags']) > 0)
                    else:
                        the_json['annotations'].append(note_ctx)

            return the_json

        except Source.DoesNotExist:
            return None
Exemple #15
0
    def test_render_related_terms(self):
        taxonomy = {
            'Shapes': ['Square', 'Triangle'],
            'Colors': ['Red', 'Blue', 'Green']
        }
        self.create_vocabularies(self.sample_course, taxonomy)

        term = Term.objects.get(name='square')
        self.create_term_relationship(self.note1, term)
        term = Term.objects.get(name='triangle')
        self.create_term_relationship(self.note1, term)
        term = Term.objects.get(name='red')
        self.create_term_relationship(self.note1, term)

        res = SherdNoteResource()
        request = RequestFactory().get('')
        bundle = SherdNoteResource().build_bundle(
            obj=self.note1, request=request)

        values = res.render_related_terms(bundle)
        self.assertEquals(len(values), 2)
        self.assertEquals(values[0]['terms'][0]['display_name'], 'Square')
        self.assertEquals(values[0]['terms'][1]['display_name'], 'Triangle')
        self.assertEquals(values[1]['terms'][0]['display_name'], 'Red')
Exemple #16
0
    def test_render_related_terms(self):
        taxonomy = {
            'Shapes': ['Square', 'Triangle'],
            'Colors': ['Red', 'Blue', 'Green']
        }
        self.create_vocabularies(self.sample_course, taxonomy)

        term = Term.objects.get(name='square')
        self.create_term_relationship(self.note1, term)
        term = Term.objects.get(name='triangle')
        self.create_term_relationship(self.note1, term)
        term = Term.objects.get(name='red')
        self.create_term_relationship(self.note1, term)

        res = SherdNoteResource()
        request = RequestFactory().get('')
        bundle = SherdNoteResource().build_bundle(obj=self.note1,
                                                  request=request)

        values = res.render_related_terms(bundle)
        self.assertEquals(len(values), 2)
        self.assertEquals(values[0]['terms'][0]['display_name'], 'Square')
        self.assertEquals(values[0]['terms'][1]['display_name'], 'Triangle')
        self.assertEquals(values[1]['terms'][0]['display_name'], 'Red')
Exemple #17
0
    def test_in_selection_assignment_response(self):
        res = SherdNoteResource()
        self.assertFalse(res.in_selection_assignment_response(self.note1))

        pn = ProjectNoteFactory(annotation=self.note1)
        pn.project.date_submitted = datetime.today()
        pn.project.save()
        self.assertTrue(res.in_selection_assignment_response(self.note1))

        request = RequestFactory().get('/?citable=true')
        request.user = self.student_one
        request.course = self.sample_course
        bundle = SherdNoteResource().build_bundle(obj=self.note1,
                                                  request=request)
        res.dehydrate(bundle)
        self.assertEquals(bundle.data['editable'], False)
        self.assertEquals(bundle.data['citable'], True)
Exemple #18
0
    def test_in_sequence_assignment_response(self):
        res = SherdNoteResource()
        self.assertFalse(res.in_sequence_assignment_response(self.note1))
        self.assertFalse(res.in_sequence_assignment_response(self.note2))

        sa = SequenceAssetFactory(spine=self.note1)
        psa = ProjectSequenceAssetFactory(sequence_asset=sa)
        self.assertFalse(res.in_sequence_assignment_response(self.note1))

        psa.project.date_submitted = datetime.today()
        psa.project.save()
        self.assertTrue(res.in_sequence_assignment_response(self.note1))

        SequenceMediaElementFactory(sequence_asset=sa, media=self.note2)
        self.assertTrue(res.in_sequence_assignment_response(self.note2))

        request = RequestFactory().get('/?citable=true')
        request.user = self.student_one
        request.course = self.sample_course
        bundle = SherdNoteResource().build_bundle(obj=self.note1,
                                                  request=request)
        res.dehydrate(bundle)
        self.assertEquals(bundle.data['editable'], False)
        self.assertEquals(bundle.data['citable'], True)
Exemple #19
0
    def render_list(self, request, record_owner, record_viewer, assets, notes):
        self.request = request
        note_resource = SherdNoteResource()
        ctx = {}

        for asset in assets.all():
            self.update_asset_context(request, ctx, asset)

        for note in notes.all():
            try:
                note.asset.primary

                self.update_note_context(request, ctx, note_resource, note,
                                         record_owner, record_viewer)

            except Source.DoesNotExist:
                pass  # don't break in this situation

        values = ctx.values()
        return list(values)
Exemple #20
0
    def render_list(self, request, record_owner, record_viewer, assets, notes):
        self.request = request
        note_resource = SherdNoteResource()
        ctx = {}
        for note in notes.all():
            try:
                note.asset.primary

                self.update_asset_context(request, ctx, note)

                self.update_note_context(request, ctx, note_resource, note,
                                         record_owner, record_viewer)

            except Source.DoesNotExist:
                pass  # don't break in this situation

        values = ctx.values()
        return sorted(values,
                      key=lambda value: self.to_time(value['modified']),
                      reverse=True)
Exemple #21
0
    def test_in_sequence_assignment_response(self):
        res = SherdNoteResource()
        self.assertFalse(res.in_sequence_assignment_response(self.note1))
        self.assertFalse(res.in_sequence_assignment_response(self.note2))

        sa = SequenceAssetFactory(spine=self.note1)
        psa = ProjectSequenceAssetFactory(sequence_asset=sa)
        self.assertFalse(res.in_sequence_assignment_response(self.note1))

        psa.project.date_submitted = datetime.today()
        psa.project.save()
        self.assertTrue(res.in_sequence_assignment_response(self.note1))

        SequenceMediaElementFactory(sequence_asset=sa, media=self.note2)
        self.assertTrue(res.in_sequence_assignment_response(self.note2))

        request = RequestFactory().get('/?citable=true')
        request.user = self.student_one
        request.course = self.sample_course
        bundle = SherdNoteResource().build_bundle(
            obj=self.note1, request=request)
        res.dehydrate(bundle)
        self.assertEquals(bundle.data['editable'], False)
        self.assertEquals(bundle.data['citable'], True)
Exemple #22
0
    def dehydrate(self, bundle):
        bundle.data['thumb_url'] = bundle.obj.thumb_url
        bundle.data['primary_type'] = bundle.obj.primary.label
        bundle.data['local_url'] = bundle.obj.get_absolute_url()
        bundle.data['media_type_label'] = bundle.obj.media_type()
        bundle.data['editable_title'] = (
            bundle.request.user.is_staff or
            bundle.obj.author == bundle.request.user)

        try:
            metadata = simplejson.loads(bundle.obj.metadata_blob)
            metadata = [{'key': k, 'value': v}
                        for k, v in metadata.items()]
            bundle.data['metadata'] = metadata
        except ValueError:
            pass

        sources = {}
        for s in bundle.obj.source_set.all():
            sources[s.label] = {'label': s.label,
                                'url': s.url_processed(bundle.request,
                                                       bundle.obj),
                                'width': s.width,
                                'height': s.height,
                                'primary': s.primary}
        bundle.data['sources'] = sources

        bundle.data['annotations'] = []
        bundle.data['annotation_count'] = 0
        bundle.data['my_annotation_count'] = 0

        # the sherdnote_set authorization has been applied
        # I'm filtering here rather than directly on the sherdnote resource
        # As counts need to be displayed for all, then the user subset
        # and global annotation display logic is a bit intricate
        modified = bundle.obj.modified
        for note in bundle.data['sherdnote_set']:
            if (not note.data['is_global_annotation']):
                if self.options['record_owner']:
                    if note.obj.author == self.options['record_owner']:
                        bundle.data['annotations'].append(note.data)
                else:
                    bundle.data['annotations'].append(note.data)
            if note.obj.modified > modified:
                modified = note.obj.modified

        bundle.data['modified'] = modified

        # include the global_annotation for the user as well
        if (self.options['record_owner'] and
                self.options['owner_selections_are_visible']):
            gann = bundle.obj.global_annotation(
                self.options['record_owner'], auto_create=False)
        else:
            gann = bundle.obj.global_annotation(bundle.request.user,
                                                auto_create=False)

        if gann:
            bundle.data['global_annotation'] = \
                SherdNoteResource().render_one(bundle.request, gann, '')
            bundle.data['global_annotation_analysis'] = (
                (gann.tags is not None and len(gann.tags) > 0) or
                (gann.body is not None and len(gann.body) > 0) or
                len(bundle.data['global_annotation']['vocabulary']) > 0)
        else:
            bundle.data['global_annotation_analysis'] = False

        for key, value in self.extras.items():
            bundle.data[key] = value

        bundle.data.pop('sherdnote_set')
        return bundle
Exemple #23
0
    def render_one(self, request, project, version_number=None):
        bundle = self.build_bundle(obj=project, request=request)
        dehydrated = self.full_dehydrate(bundle)
        project_ctx = self._meta.serializer.to_simple(dehydrated, None)
        project_ctx["body"] = project.body
        project_ctx["public_url"] = project.public_url()
        project_ctx["current_version"] = version_number
        project_ctx["visibility"] = project.visibility_short()
        project_ctx["type"] = "assignment" if project.is_assignment(request) else "composition"

        rand = "".join([choice(letters) for i in range(5)])

        asset_resource = AssetResource()
        sherd_resource = SherdNoteResource()

        assets = {}
        notes = []
        for note in project.citations():
            notes.append(sherd_resource.render_one(request, note, rand))
            if note.title not in ["Annotation Deleted", "Asset Deleted"]:
                key = "%s_%s" % (rand, note.asset.pk)
                if key not in assets.keys():
                    assets[key] = asset_resource.render_one(request, note.asset)

        data = {
            "project": project_ctx,
            "type": "project",
            "can_edit": self.editable,
            "annotations": notes,
            "assets": assets,
        }

        data["responses"] = []
        for response in project.responses(request):
            if response.can_read(request):
                obj = {
                    "url": response.get_absolute_url(),
                    "title": response.title,
                    "modified": response.modified.strftime(self.date_fmt),
                    "attribution_list": [],
                }

                last = len(response.attribution_list()) - 1
                for idx, author in enumerate(response.attribution_list()):
                    obj["attribution_list"].append({"name": get_public_name(author, request), "last": idx == last})

                data["responses"].append(obj)
        data["response_count"] = len(data["responses"])

        my_responses = []
        for response in project.responses_by(request, request.user):
            obj = {
                "url": response.get_absolute_url(),
                "title": response.title,
                "modified": response.modified.strftime(self.date_fmt),
                "attribution_list": [],
            }

            last = len(response.attribution_list()) - 1
            for idx, author in enumerate(response.attribution_list()):
                obj["attribution_list"].append({"name": get_public_name(author, request), "last": idx == last})

            my_responses.append(obj)

        if len(my_responses) == 1:
            data["my_response"] = my_responses[0]
        elif len(my_responses) > 1:
            data["my_responses"] = my_responses
            data["my_responses_count"] = len(my_responses)

        if project.is_participant(request.user):
            data["revisions"] = [
                {
                    "version_number": v.version_number,
                    "versioned_id": v.versioned_id,
                    "author": get_public_name(v.instance().author, request),
                    "modified": v.modified.strftime("%m/%d/%y %I:%M %p"),
                }
                for v in project.versions.order_by("-change_time")
            ]

        if self.editable:
            projectform = ProjectForm(request, instance=project)
            data["form"] = {
                "participants": projectform["participants"].__unicode__(),
                "publish": projectform["publish"].__unicode__(),
            }

        return data
Exemple #24
0
def composition_project_json(request, project, can_edit, version_number=None):
    '''
        JSON representation for a project. Includes:
        * basic project information
        * assets
        * annotations
        * responses (if applicable & permissable)
        * revisions (if permissable)
        * a project participant form (if permissable)
    '''

    rand = ''.join([choice(letters) for i in range(5)])

    versions = project.versions.order_by('-change_time')
    participants = project.attribution_list()
    is_assignment = project.is_assignment(request)

    course = request.course if request.course \
        else request.collaboration_context.content_object

    asset_resource = AssetSummaryResource()
    sherd_resource = SherdNoteResource()
    citations = project.citations()

    data = {
        'project': {
            'id': project.pk,
            'title': project.title,
            'url': project.get_absolute_url(),
            'due_date': project.get_due_date(),
            'body': project.body,
            'participants': [{
                'name': p.get_full_name(),
                'username': p.username,
                'public_name': get_public_name(p, request),
                'is_viewer': request.user.username == p.username,
                'last': idx == (len(participants) - 1)
            } for idx, p in enumerate(participants)],
            'public_url': project.public_url(),
            'visibility': project.visibility_short(),
            'username': request.user.username,
            'type': 'assignment' if is_assignment else 'composition',
            'description': project.description(),
            'current_version': version_number if version_number else None,
            'create_selection': is_assignment,
            'is_assignment': is_assignment,
            'course_title': course.title
        },
        'type': 'project',
        'can_edit': can_edit,
        'annotations': [sherd_resource.render_one(request, ann, rand)
                        for ann in citations],
    }

    assets = {}
    for ann in citations:
        if ann.title != "Annotation Deleted" and ann.title != 'Asset Deleted':
            key = '%s_%s' % (rand, ann.asset.pk)
            if key not in assets:
                assets[key] = asset_resource.render_one(request, ann.asset)
    data['assets'] = assets

    data['responses'] = []
    for r in project.responses(request):
        if r.can_read(request):
            obj = {'url': r.get_absolute_url(),
                   'title': r.title,
                   'modified': r.modified.strftime("%m/%d/%y %I:%M %p"),
                   'attribution_list': []}

            x = len(r.attribution_list()) - 1
            for idx, author in enumerate(r.attribution_list()):
                obj['attribution_list'].append({
                    'name': get_public_name(author, request),
                    'last': idx == x})

            data['responses'].append(obj)
    data['response_count'] = len(data['responses'])

    my_responses = []
    for r in project.responses_by(request, request.user):
        obj = {'url': r.get_absolute_url(),
               'title': r.title,
               'modified': r.modified.strftime("%m/%d/%y %I:%M %p"),
               'attribution_list': []}

        x = len(r.attribution_list()) - 1
        for idx, author in enumerate(r.attribution_list()):
            obj['attribution_list'].append({'name': get_public_name(author,
                                                                    request),
                                            'last': idx == x})

        my_responses.append(obj)

    if len(my_responses) == 1:
        data['my_response'] = my_responses[0]
    elif len(my_responses) > 1:
        data['my_responses'] = my_responses
        data['my_responses_count'] = len(my_responses)

    if project.is_participant(request.user):
        data['revisions'] = [{
            'version_number': v.version_number,
            'versioned_id': v.versioned_id,
            'author': get_public_name(v.instance().author, request),
            'modified': v.modified.strftime("%m/%d/%y %I:%M %p")}
            for v in versions]

    if can_edit:
        projectform = ProjectForm(request, instance=project)
        data['form'] = {
            'participants': projectform['participants'].__unicode__(),
            'publish': projectform['publish'].__unicode__()
        }

    return data
Exemple #25
0
def composition_project_json(request, project, can_edit, version_number=None):
    '''
        JSON representation for a project. Includes:
        * basic project information
        * assets
        * annotations
        * responses (if applicable & permissable)
        * revisions (if permissable)
        * a project participant form (if permissable)
    '''

    rand = ''.join([choice(letters) for i in range(5)])

    participants = project.attribution_list()
    is_assignment = project.is_assignment(request)

    course = request.course if request.course \
        else request.collaboration_context.content_object

    asset_resource = AssetSummaryResource()
    sherd_resource = SherdNoteResource()
    citations = project.citations()

    data = {
        'project': {
            'id':
            project.pk,
            'title':
            project.title,
            'url':
            project.get_absolute_url(),
            'due_date':
            project.get_due_date(),
            'body':
            project.body,
            'participants': [{
                'name': p.get_full_name(),
                'username': p.username,
                'public_name': get_public_name(p, request),
                'is_viewer': request.user.username == p.username,
                'last': idx == (len(participants) - 1)
            } for idx, p in enumerate(participants)],
            'public_url':
            project.public_url(),
            'visibility':
            project.visibility_short(),
            'username':
            request.user.username,
            'type':
            'assignment' if is_assignment else 'composition',
            'description':
            project.description(),
            'current_version':
            version_number if version_number else None,
            'create_selection':
            is_assignment,
            'is_assignment':
            is_assignment,
            'course_title':
            course.title
        },
        'type':
        'project',
        'can_edit':
        can_edit,
        'annotations':
        [sherd_resource.render_one(request, ann, rand) for ann in citations],
    }

    assets = {}
    for ann in citations:
        if ann.title != "Annotation Deleted" and ann.title != 'Asset Deleted':
            key = '%s_%s' % (rand, ann.asset.pk)
            if key not in assets:
                assets[key] = asset_resource.render_one(request, ann.asset)
    data['assets'] = assets

    data['responses'] = []
    for response in project.responses(request):
        if response.can_read(request):
            obj = {
                'url': response.get_absolute_url(),
                'title': response.title,
                'modified': response.modified.strftime("%m/%d/%y %I:%M %p"),
                'attribution_list': []
            }

            last = len(response.attribution_list()) - 1
            for idx, author in enumerate(response.attribution_list()):
                obj['attribution_list'].append({
                    'name':
                    get_public_name(author, request),
                    'last':
                    idx == last
                })

            data['responses'].append(obj)
    data['response_count'] = len(data['responses'])

    my_responses = []
    for response in project.responses_by(request, request.user):
        obj = {
            'url': response.get_absolute_url(),
            'title': response.title,
            'modified': response.modified.strftime("%m/%d/%y %I:%M %p"),
            'attribution_list': []
        }

        last = len(response.attribution_list()) - 1
        for idx, author in enumerate(response.attribution_list()):
            obj['attribution_list'].append({
                'name':
                get_public_name(author, request),
                'last':
                idx == last
            })

        my_responses.append(obj)

    if len(my_responses) == 1:
        data['my_response'] = my_responses[0]
    elif len(my_responses) > 1:
        data['my_responses'] = my_responses
        data['my_responses_count'] = len(my_responses)

    if project.is_participant(request.user):
        data['revisions'] = [{
            'version_number':
            v.version_number,
            'versioned_id':
            v.versioned_id,
            'author':
            get_public_name(v.instance().author, request),
            'modified':
            v.modified.strftime("%m/%d/%y %I:%M %p")
        } for v in project.versions.order_by('-change_time')]

    if can_edit:
        projectform = ProjectForm(request, instance=project)
        data['form'] = {
            'participants': projectform['participants'].__unicode__(),
            'publish': projectform['publish'].__unicode__()
        }

    return data
Exemple #26
0
    def render_one(self, request, project, version_number=None):
        bundle = self.build_bundle(obj=project, request=request)
        dehydrated = self.full_dehydrate(bundle)
        project_ctx = self._meta.serializer.to_simple(dehydrated, None)
        project_ctx['body'] = project.body
        project_ctx['public_url'] = project.public_url()
        project_ctx['current_version'] = version_number
        project_ctx['visibility'] = project.visibility_short()
        project_ctx['type'] = ('assignment' if project.is_assignment(request)
                               else 'composition')

        rand = ''.join([choice(letters) for i in range(5)])

        asset_resource = AssetResource()
        sherd_resource = SherdNoteResource()

        assets = {}
        notes = []
        for note in project.citations():
            notes.append(sherd_resource.render_one(request, note, rand))
            if (note.title not in ["Annotation Deleted", 'Asset Deleted']):
                key = '%s_%s' % (rand, note.asset.pk)
                if key not in assets.keys():
                    assets[key] = \
                        asset_resource.render_one(request, note.asset)

        data = {
            'project': project_ctx,
            'type': 'project',
            'can_edit': self.editable,
            'annotations': notes,
            'assets': assets
        }

        data['responses'] = []
        for response in project.responses(request):
            if response.can_read(request):
                obj = {
                    'url': response.get_absolute_url(),
                    'title': response.title,
                    'modified': response.modified.strftime(self.date_fmt),
                    'attribution_list': []
                }

                last = len(response.attribution_list()) - 1
                for idx, author in enumerate(response.attribution_list()):
                    obj['attribution_list'].append({
                        'name':
                        get_public_name(author, request),
                        'last':
                        idx == last
                    })

                data['responses'].append(obj)
        data['response_count'] = len(data['responses'])

        my_responses = []
        for response in project.responses_by(request, request.user):
            obj = {
                'url': response.get_absolute_url(),
                'title': response.title,
                'modified': response.modified.strftime(self.date_fmt),
                'attribution_list': []
            }

            last = len(response.attribution_list()) - 1
            for idx, author in enumerate(response.attribution_list()):
                obj['attribution_list'].append({
                    'name':
                    get_public_name(author, request),
                    'last':
                    idx == last
                })

            my_responses.append(obj)

        if len(my_responses) == 1:
            data['my_response'] = my_responses[0]
        elif len(my_responses) > 1:
            data['my_responses'] = my_responses
            data['my_responses_count'] = len(my_responses)

        if project.is_participant(request.user):
            data['revisions'] = [{
                'version_number':
                v.version_number,
                'versioned_id':
                v.versioned_id,
                'author':
                get_public_name(v.instance().author, request),
                'modified':
                v.modified.strftime("%m/%d/%y %I:%M %p")
            } for v in project.versions.order_by('-change_time')]

        if self.editable:
            projectform = ProjectForm(request, instance=project)
            data['form'] = {
                'participants': projectform['participants'].__unicode__(),
                'publish': projectform['publish'].__unicode__()
            }

        return data