return decorator def image_get_extra_context(image): return dict( image=image, source=image.source, ) def source_get_extra_context(source): return dict( source=source, ) # @image_annotation_area_must_be_editable('image_id') image_annotation_area_must_be_editable = ModelViewDecorator( model_class=Image, meets_requirements=lambda image, request: image_annotation_area_is_editable(image), template='annotations/annotation_area_not_editable.html', get_extra_context=image_get_extra_context, default_message="This image's annotation area is not editable, because re-generating points " "would result in loss of data (such as annotations made in the annotation tool, " "or points imported from outside the site)." ) # @image_labelset_required('image_id') image_labelset_required = ModelViewDecorator( model_class=Image, meets_requirements=lambda image, request: not image.source.labelset.isEmptyLabelset(), template='annotations/labelset_required.html', get_extra_context=image_get_extra_context, default_message="You need to create a labelset before you can use this page." )
def image_detail(request, image_id): """ View for seeing an image's full size and details/metadata. """ image = get_object_or_404(Image, id=image_id) source = image.source metadata = image.metadata # Get the metadata fields (including the right no. of keys for the source) # and organize into fieldsets. The image detail form already has this # logic, so let's just borrow the form's functionality... imageDetailForm = ImageDetailForm(source=source, initial=model_to_dict(metadata)) fieldsets = imageDetailForm.fieldsets # ...But we don't need the form's "Other" value fields. # (Code note: [:] creates a copy of the list, so we're not iterating over the same list we're removing things from) for field in fieldsets['keys'][:]: if field.name.endswith('_other'): fieldsets['keys'].remove(field) detailsets = dict() for key, fieldset in fieldsets.items(): detailsets[key] = [dict(label=field.label, name=field.name, value=getattr(metadata, field.name)) for field in fieldset] # Feel free to change this constant according to the page layout. MAX_SCALED_WIDTH = 800 if image.original_width > MAX_SCALED_WIDTH: # Parameters into the easy_thumbnails template tag: # (specific width, height that keeps the aspect ratio) thumbnail_dimensions = (MAX_SCALED_WIDTH, 0) else: # No thumbnail needed thumbnail_dimensions = False # Next and previous image links next_image = get_next_image(image) prev_image = get_prev_image(image) # Annotation status if image.status.annotatedByHuman: annotation_status = "Complete" elif image_has_any_human_annotations(image): annotation_status = "Partially annotated" else: annotation_status = "Not started" # Should we include a link to the annotation area edit page? annotation_area_editable = image_annotation_area_is_editable(image) return render_to_response('images/image_detail.html', { 'source': source, 'image': image, 'next_image': next_image, 'prev_image': prev_image, 'metadata': metadata, 'detailsets': detailsets, 'has_thumbnail': bool(thumbnail_dimensions), 'thumbnail_dimensions': thumbnail_dimensions, 'annotation_status': annotation_status, 'annotation_area_editable': annotation_area_editable, }, context_instance=RequestContext(request) )