from __future__ import unicode_literals from django import forms from django.urls 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 common.utils import index_or_default 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 width = None height = 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 } width = setting_thumbnail_size.value.split('x')[0] height = 150 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 } width = setting_preview_size.value.split('x')[0] height = index_or_default( instance=setting_preview_size.value.split('x'), index=1, default=setting_preview_size.value.split('x')[0] ) class DocumentThumbnailWidget(BaseDocumentThumbnailWidget): width = '100%' 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): width = '100%' def get_title(self, instance): return force_text(instance) class DocumentVersionThumbnailWidget(DocumentThumbnailWidget): width = '100%' def get_click_view_kwargs(self, instance): return { 'pk': instance.document.pk, 'version_pk': instance.pk, 'page_pk': instance.pages.first().pk } def get_click_view_url(self, instance): first_page = instance.pages.first() if first_page: return super(DocumentVersionThumbnailWidget, self).get_click_view_url( instance=instance ) else: return '#' def get_preview_view_kwargs(self, instance): return { 'pk': instance.document.pk, 'version_pk': instance.pk, 'page_pk': instance.pages.first().pk } def get_preview_view_url(self, instance): first_page = instance.pages.first() if first_page: return super(DocumentVersionThumbnailWidget, 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 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)