from __future__ import unicode_literals from django import forms from django.core.urlresolvers import reverse from django.utils.encoding import force_text from django.utils.html import strip_tags from django.utils.http import urlencode from django.utils.safestring import mark_safe from django.utils.translation import ugettext, ugettext_lazy as _ from .settings import ( setting_display_size, setting_preview_size, setting_thumbnail_size ) class DocumentPageImageWidget(forms.widgets.Widget): def render(self, name, value, attrs=None): final_attrs = self.build_attrs(attrs) zoom = final_attrs.get('zoom') rotation = final_attrs.get('rotation') html_widget = InteractiveDocumentPageWidget() if value: output = [] output.append( '
No pages to display
') output.append('Invalid image
' preview_view_name = None preview_query_dict = {} image_class = 'lazy-load' title = None # Click view def get_click_view_kwargs(self, instance): """ Determine if the view is a template or API view and vary the view keyword arguments """ if self.click_view_name.startswith('rest_api'): return { 'pk': instance.document.pk, 'version_pk': instance.document_version.pk, 'page_pk': instance.pk } else: return { 'pk': instance.pk, } def get_click_view_query_dict(self, instance): return self.click_view_query_dict def get_click_view_querystring(self, instance): return urlencode(self.get_click_view_query_dict(instance=instance)) def get_click_view_url(self, instance): return '{}?{}'.format( reverse( viewname=self.click_view_name, kwargs=self.get_click_view_kwargs(instance=instance) ), self.get_click_view_querystring(instance=instance) ) # Destination view def get_destination_view_querystring(self, instance): return urlencode(self.get_destination_view_query_dict(instance=instance)) def get_destination_url(self, instance): return '{}?{}'.format( reverse( viewname=self.destination_view_name, kwargs=self.get_destination_view_kwargs(instance=instance) ), self.get_destination_view_querystring(instance=instance) ) def get_destination_view_kwargs(self, instance): return { 'pk': instance.pk } # Preview view def get_preview_view_kwargs(self, instance): return { 'pk': instance.document.pk, 'version_pk': instance.document_version.pk, 'page_pk': instance.pk } def get_preview_view_query_dict(self, instance): return self.preview_view_query_dict def get_preview_view_querystring(self, instance): return urlencode(self.get_preview_view_query_dict(instance=instance)) def get_preview_view_url(self, instance): return '{}?{}'.format( reverse( viewname=self.preview_view_name, kwargs=self.get_preview_view_kwargs(instance=instance) ), self.get_preview_view_querystring(instance=instance) ) def get_title(self, instance): return self.title def is_valid(self, instance): return instance def render(self, instance): result = [] result.append('') return mark_safe(''.join(result)) class BaseDocumentThumbnailWidget(InstanceImageWidget): alt_text = _('Document page image') click_view_name = 'rest_api:documentpage-image' click_view_query_dict = { 'size': setting_preview_size.value } gallery_name = 'document_list' invalid_image_template = """ """ preview_view_name = 'rest_api:documentpage-image' preview_view_query_dict = { 'size': setting_thumbnail_size.value } def get_destination_url(self, instance): return instance.get_absolute_url() class CarouselDocumentPageThumbnailWidget(BaseDocumentThumbnailWidget): click_view_name = 'documents:document_page_view' fancybox_class = '' image_class = 'lazy-load-carousel' preview_view_query_dict = { 'size': setting_display_size.value } class DocumentThumbnailWidget(BaseDocumentThumbnailWidget): def get_click_view_kwargs(self, instance): return { 'pk': instance.pk, 'version_pk': instance.latest_version.pk, 'page_pk': instance.pages.first().pk } def get_click_view_url(self, instance): first_page = instance.pages.first() if first_page: return super(DocumentThumbnailWidget, self).get_click_view_url( instance=instance ) else: return '#' def get_preview_view_kwargs(self, instance): return { 'pk': instance.pk, 'version_pk': instance.latest_version.pk, 'page_pk': instance.pages.first().pk } def get_preview_view_url(self, instance): first_page = instance.pages.first() if first_page: return super(DocumentThumbnailWidget, self).get_preview_view_url( instance=instance ) else: return '' def get_title(self, instance): return getattr(instance, 'label', None) def is_valid(self, instance): return instance.pages class DocumentPageThumbnailWidget(BaseDocumentThumbnailWidget): def get_title(self, instance): return force_text(instance) class InteractiveDocumentPageWidget(BaseDocumentThumbnailWidget): click_view_name = None def get_preview_view_query_dict(self, instance): return { 'zoom': self.zoom, 'rotation': self.rotation, 'size': setting_display_size.value, } def render(self, instance, *args, **kwargs): self.zoom = kwargs.pop('zoom') self.rotation = kwargs.pop('rotation') return super( InteractiveDocumentPageWidget, self ).render(instance=instance, *args, **kwargs)