Exemple #1
0
    def dehydrate(self, bundle):
        try:
            bundle.data['is_global_annotation'] = \
                bundle.obj.is_global_annotation()
            bundle.data['asset_id'] = str(bundle.obj.asset.id)
            bundle.data['is_null'] = bundle.obj.is_null()
            bundle.data['annotation'] = bundle.obj.annotation()
            bundle.data['url'] = bundle.obj.get_absolute_url()

            modified = bundle.obj.modified.strftime("%m/%d/%y %I:%M %p") \
                if bundle.obj.modified else ''

            bundle.data['metadata'] = {
                'tags': TagResource().render_list(bundle.request,
                                                  bundle.obj.tags_split()),
                'body': bundle.obj.body.strip() if bundle.obj.body else '',
                'primary_type': bundle.obj.asset.primary.label,
                'modified': modified,
                'timecode': bundle.obj.range_as_timecode(),
                'title': bundle.obj.title
            }

            editable = (bundle.request.user.id ==
                        getattr(bundle.obj, 'author_id', -1))
            citable = bundle.request.GET.get('citable', '') == 'true'

            # assumed: there is only one ProjectNote per annotation
            reference = ProjectNote.objects.filter(
                annotation__id=bundle.obj.id).first()
            if reference:
                # notes in a submitted response are not editable
                editable = editable and not reference.project.is_submitted()

                if citable:
                    # this is a heavy operation. don't call it unless needed
                    citable = reference.project.can_cite(bundle.request.course,
                                                         bundle.request.user)

            bundle.data['editable'] = editable
            bundle.data['citable'] = citable

            termResource = TermResource()
            vocabulary = {}
            related = TermRelationship.objects.get_for_object(
                bundle.obj).prefetch_related('term__vocabulary')
            for rel in related:
                if rel.term.vocabulary.id not in vocabulary:
                    vocabulary[rel.term.vocabulary.id] = {
                        'id': rel.term.vocabulary.id,
                        'display_name': rel.term.vocabulary.display_name,
                        'terms': []
                    }
                vocabulary[rel.term.vocabulary.id]['terms'].append(
                    termResource.render_one(bundle.request, rel.term))
            bundle.data['vocabulary'] = vocabulary.values()
        except Asset.DoesNotExist:
            bundle.data['asset_id'] = ''
            bundle.data['metadata'] = {'title': 'Item Deleted'}
        return bundle
Exemple #2
0
 def render_related_terms(self, bundle):
     termResource = TermResource()
     vocabulary = {}
     for rel in bundle.obj.termrelationship_set.all():
         if rel.term.vocabulary.id not in vocabulary:
             vocabulary[rel.term.vocabulary.id] = {
                 'id': rel.term.vocabulary.id,
                 'display_name': rel.term.vocabulary.display_name,
                 'terms': []
             }
         vocabulary[rel.term.vocabulary.id]['terms'].append(
             termResource.render_one(bundle.request, rel.term))
     return sorted(list(vocabulary.values()), key=lambda x: x.get('id'))
Exemple #3
0
 def render_related_terms(self, bundle):
     termResource = TermResource()
     vocabulary = {}
     for rel in bundle.obj.termrelationship_set.all():
         if rel.term.vocabulary.id not in vocabulary:
             vocabulary[rel.term.vocabulary.id] = {
                 'id': rel.term.vocabulary.id,
                 'display_name': rel.term.vocabulary.display_name,
                 'terms': []
             }
         vocabulary[rel.term.vocabulary.id]['terms'].append(
             termResource.render_one(bundle.request, rel.term))
     return vocabulary.values()
Exemple #4
0
def render_assets(request, record_owner, assets):
    course = request.course
    logged_in_user = request.user

    # Is the current user faculty OR staff
    is_faculty = cached_course_is_faculty(course, logged_in_user)

    # Can the record_owner edit the records
    viewing_own_records = (record_owner == logged_in_user)
    viewing_faculty_records = record_owner and course.is_faculty(record_owner)

    # Allow the logged in user to add assets to his composition
    citable = request.GET.get('citable', '') == 'true'

    # Does the course allow viewing other user selections?
    owner_selections_are_visible = (
        course_details.all_selections_are_visible(course) or
        viewing_own_records or viewing_faculty_records or is_faculty)

    # Spew out json for the assets
    if request.GET.get('annotations', '') == 'true':
        resource = AssetResource(owner_selections_are_visible,
                                 record_owner,
                                 {'editable': viewing_own_records,
                                  'citable': citable})
    else:
        resource = AssetSummaryResource({'editable': viewing_own_records,
                                         'citable': citable})

    asset_json = resource.render_list(request, assets)

    active_filters = {}
    for k, val in request.GET.items():
        if (k == 'tag' or k == 'modified' or k.startswith('vocabulary-')):
            active_filters[k] = val

    user_resource = UserResource()

    # #todo -- figure out a cleaner way to do this. Ugli-ness
    # Collate tag set & vocabulary set for the result set.
    # Get all visible notes for the returned asset set
    # These notes may include global annotations for all users,
    # whereas the rendered set will not
    active_asset_ids = [a['id'] for a in asset_json]
    active_notes = []
    if record_owner:
        if owner_selections_are_visible:
            active_notes = SherdNote.objects.filter(
                asset__course=course, asset__id__in=active_asset_ids,
                author__id=record_owner.id)
    else:
        if all_selections_are_visible(course) or is_faculty:
            # Display all tags for the asset set including globals
            active_notes = SherdNote.objects.filter(
                asset__course=course, asset__id__in=active_asset_ids)
        else:
            whitelist = [f.id for f in course.faculty]
            whitelist.append(request.user.id)
            active_notes = SherdNote.objects.filter(
                asset__course=course,
                asset__id__in=active_asset_ids,
                author__id__in=whitelist)

    tags = []
    if len(active_notes) > 0:
        tags = Tag.objects.usage_for_queryset(active_notes)
        tags.sort(lambda a, b: cmp(a.name.lower(), b.name.lower()))

    active_vocabulary = []
    note_ids = [n.id for n in active_notes]
    content_type = ContentType.objects.get_for_model(SherdNote)
    term_resource = TermResource()
    for v in Vocabulary.objects.get_for_object(request.course):
        vocabulary = {
            'id': v.id,
            'display_name': v.display_name,
            'term_set': []
        }
        related = TermRelationship.objects.filter(term__vocabulary=v,
                                                  content_type=content_type,
                                                  object_id__in=note_ids)

        terms = []
        for r in related:
            if r.term.display_name not in terms:
                the_term = term_resource.render_one(request, r.term)
                vocabulary['term_set'].append(the_term)
                terms.append(r.term.display_name)

        active_vocabulary.append(vocabulary)

    # Assemble the context
    data = {'assets': asset_json,
            'active_tags': TagResource().render_list(request, tags),
            'active_filters': active_filters,
            'active_vocabulary': active_vocabulary,
            'space_viewer': user_resource.render_one(request, logged_in_user),
            'editable': viewing_own_records,
            'citable': citable,
            'is_faculty': is_faculty}

    if record_owner:
        data['space_owner'] = user_resource.render_one(request, record_owner)

    json_stream = simplejson.dumps(data, indent=2)
    return HttpResponse(json_stream, mimetype='application/json')
Exemple #5
0
def render_assets(request, record_owner, assets):
    course = request.course
    logged_in_user = request.user

    # Is the current user faculty OR staff
    is_faculty = cached_course_is_faculty(course, logged_in_user)

    # Can the record_owner edit the records
    viewing_own_records = (record_owner == logged_in_user)
    viewing_faculty_records = record_owner and course.is_faculty(record_owner)

    # Allow the logged in user to add assets to his composition
    citable = request.GET.get('citable', '') == 'true'

    # Does the course allow viewing other user selections?
    owner_selections_are_visible = (
        course_details.all_selections_are_visible(course)
        or viewing_own_records or viewing_faculty_records or is_faculty)

    # Spew out json for the assets
    if request.GET.get('annotations', '') == 'true':
        resource = AssetResource(owner_selections_are_visible, record_owner, {
            'editable': viewing_own_records,
            'citable': citable
        })
    else:
        resource = AssetSummaryResource({
            'editable': viewing_own_records,
            'citable': citable
        })

    asset_json = resource.render_list(request, assets)

    active_filters = {}
    for key, val in request.GET.items():
        if (key == 'tag' or key == 'modified'
                or key.startswith('vocabulary-')):
            active_filters[key] = val

    user_resource = UserResource()

    # #todo -- figure out a cleaner way to do this. Ugli-ness
    # Collate tag set & vocabulary set for the result set.
    # Get all visible notes for the returned asset set
    # These notes may include global annotations for all users,
    # whereas the rendered set will not
    active_asset_ids = [a['id'] for a in asset_json]
    active_notes = []
    if record_owner:
        if owner_selections_are_visible:
            active_notes = SherdNote.objects.filter(
                asset__course=course,
                asset__id__in=active_asset_ids,
                author__id=record_owner.id)
    else:
        if all_selections_are_visible(course) or is_faculty:
            # Display all tags for the asset set including globals
            active_notes = SherdNote.objects.filter(
                asset__course=course, asset__id__in=active_asset_ids)
        else:
            whitelist = [f.id for f in course.faculty]
            whitelist.append(request.user.id)
            active_notes = SherdNote.objects.filter(
                asset__course=course,
                asset__id__in=active_asset_ids,
                author__id__in=whitelist)

    tags = []
    if len(active_notes) > 0:
        tags = Tag.objects.usage_for_queryset(active_notes)
        tags.sort(lambda a, b: cmp(a.name.lower(), b.name.lower()))

    active_vocabulary = []
    note_ids = [n.id for n in active_notes]
    content_type = ContentType.objects.get_for_model(SherdNote)
    term_resource = TermResource()
    for vocab in Vocabulary.objects.get_for_object(request.course):
        vocabulary = {
            'id': vocab.id,
            'display_name': vocab.display_name,
            'term_set': []
        }
        related = TermRelationship.objects.filter(term__vocabulary=vocab,
                                                  content_type=content_type,
                                                  object_id__in=note_ids)

        terms = []
        for rel in related:
            if rel.term.display_name not in terms:
                the_term = term_resource.render_one(request, rel.term)
                vocabulary['term_set'].append(the_term)
                terms.append(rel.term.display_name)

        active_vocabulary.append(vocabulary)

    # Assemble the context
    data = {
        'assets': asset_json,
        'active_tags': TagResource().render_list(request, tags),
        'active_filters': active_filters,
        'active_vocabulary': active_vocabulary,
        'space_viewer': user_resource.render_one(request, logged_in_user),
        'editable': viewing_own_records,
        'citable': citable,
        'is_faculty': is_faculty
    }

    if record_owner:
        data['space_owner'] = user_resource.render_one(request, record_owner)

    json_stream = simplejson.dumps(data, indent=2)
    return HttpResponse(json_stream, mimetype='application/json')