Added document printing support
This commit is contained in:
@@ -119,6 +119,7 @@ register_diagnostic('documents', _(u'Documents'), document_missing_list)
|
||||
|
||||
register_tool(document_find_all_duplicates, namespace='documents', title=_(u'documents'))
|
||||
|
||||
|
||||
def document_exists(document):
|
||||
try:
|
||||
if document.exists():
|
||||
@@ -150,7 +151,7 @@ if ENABLE_SINGLE_DOCUMENT_UPLOAD:
|
||||
{'text': _(u'documents'), 'view': 'document_list_recent', 'links': [
|
||||
document_list_recent, document_list, document_create, \
|
||||
document_create_multiple
|
||||
|
||||
|
||||
], 'famfam': 'page', 'position': 1}])
|
||||
else:
|
||||
register_menu([
|
||||
|
||||
@@ -12,6 +12,9 @@ from django.conf import settings
|
||||
from tags.widgets import get_tags_inline_widget
|
||||
from common.wizard import BoundFormWizard
|
||||
from common.forms import DetailForm
|
||||
from common.literals import PAGE_SIZE_CHOICES, PAGE_ORIENTATION_CHOICES
|
||||
from common.conf.settings import DEFAULT_PAPER_SIZE
|
||||
from common.conf.settings import DEFAULT_PAGE_ORIENTATION
|
||||
|
||||
from documents.staging import StagingFile
|
||||
from documents.models import Document, DocumentType, DocumentTypeMetadataType, \
|
||||
@@ -42,8 +45,8 @@ class DocumentPageImageWidget(forms.widgets.Widget):
|
||||
<img class="lazy-load" data-href="%(img)s?page=%(page)d&zoom=%(zoom)d&rotation=%(rotation)d" src="%(media_url)s/images/ajax-loader.gif" alt="%(string)s" />
|
||||
<noscript>
|
||||
<img src="%(img)s?page=%(page)d&zoom=%(zoom)d&rotation=%(rotation)d" alt="%(string)s" />
|
||||
</noscript>
|
||||
</div>
|
||||
</noscript>
|
||||
</div>
|
||||
</div>''' % {
|
||||
'img': reverse('document_display', args=[value.document.id]),
|
||||
'page': value.page_number,
|
||||
@@ -366,7 +369,7 @@ class MetaDataImageWidget(forms.widgets.Widget):
|
||||
output.append(u'<div style="white-space:nowrap; overflow: auto;">')
|
||||
for document in value['group_data']:
|
||||
tags_template = get_tags_inline_widget(document)
|
||||
|
||||
|
||||
output.append(
|
||||
u'''<div style="display: inline-block; margin: 10px; %(current)s">
|
||||
<div class="tc">%(document_name)s</div>
|
||||
@@ -423,3 +426,11 @@ class MetaDataGroupForm(forms.Form):
|
||||
'links': links
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
class PrintForm(forms.Form):
|
||||
page_size = forms.ChoiceField(choices=PAGE_SIZE_CHOICES, initial=DEFAULT_PAPER_SIZE, label=_(u'Page size'), required=False)
|
||||
custom_page_width = forms.CharField(label=_(u'Custom page width'), required=False)
|
||||
custom_page_height = forms.CharField(label=_(u'Custom page height'), required=False)
|
||||
page_orientation = forms.ChoiceField(choices=PAGE_ORIENTATION_CHOICES, initial=DEFAULT_PAGE_ORIENTATION, label=_(u'Page orientation'), required=True)
|
||||
page_range = forms.CharField(label=_(u'Page range'), required=False)
|
||||
|
||||
@@ -2,23 +2,3 @@ PICTURE_ERROR_SMALL = u'picture_error.png'
|
||||
PICTURE_ERROR_MEDIUM = u'1297211435_error.png'
|
||||
PICTURE_UNKNOWN_SMALL = u'1299549572_unknown2.png'
|
||||
PICTURE_UNKNOWN_MEDIUM = u'1299549805_unknown.png'
|
||||
|
||||
PAGE_SIZE_A5 = u'a5'
|
||||
PAGE_SIZE_A4 = u'a4'
|
||||
PAGE_SIZE_A3 = u'a3'
|
||||
PAGE_SIZE_B5 = u'b5'
|
||||
PAGE_SIZE_B4 = u'b4'
|
||||
PAGE_SIZE_LETTER = u'letter'
|
||||
PAGE_SIZE_LEGAL = u'legal'
|
||||
PAGE_SIZE_LEDGER = u'ledger'
|
||||
|
||||
PAGE_SIZE_DIMENSIONS = (
|
||||
(PAGE_SIZE_A5, (u'148mm', u'210mm')),
|
||||
(PAGE_SIZE_A4, (u'210mm', u'297mm')),
|
||||
(PAGE_SIZE_A3, (u'297mm', u'420mm')),
|
||||
(PAGE_SIZE_B5, (u'176mm', u'250mm')),
|
||||
(PAGE_SIZE_B4, (u'250mm', u'353mm')),
|
||||
(PAGE_SIZE_LETTER, (u'8.5in', u'11in')),
|
||||
(PAGE_SIZE_LEGAL, (u'8.5in', u'14in')),
|
||||
(PAGE_SIZE_LEDGER, (u'11in', u'17in'))
|
||||
)
|
||||
|
||||
@@ -66,7 +66,7 @@ class Document(models.Model):
|
||||
description = models.TextField(blank=True, null=True, verbose_name=_(u'description'), db_index=True)
|
||||
|
||||
tags = TaggableManager()
|
||||
|
||||
|
||||
comments = generic.GenericRelation(
|
||||
Comment,
|
||||
content_type_field='content_type',
|
||||
@@ -332,7 +332,7 @@ class DocumentPage(models.Model):
|
||||
except Exception, e:
|
||||
warnings.append(e)
|
||||
|
||||
return ' '.join(transformation_list), warnings
|
||||
return ' '.join(transformation_list), warnings
|
||||
|
||||
|
||||
class MetadataGroupManager(models.Manager):
|
||||
|
||||
@@ -38,16 +38,16 @@
|
||||
.break { page-break-after: always; }
|
||||
img { border: 1px solid black; }
|
||||
@page {
|
||||
size: {{ page_size.0 }} {{ page_size.1 }};
|
||||
size: {{ page_width }} {{ page_height }};
|
||||
margin-top: 1cm;
|
||||
margin-bottom: 1cm;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
{% for page in object.documentpage_set.all %}
|
||||
{% for page in pages %}
|
||||
{% get_document_size object %}
|
||||
<div class="{% if forloop.counter > 1 %}break{% endif %}">
|
||||
<img src="{% url document_display_print object.id %}?page={{ page.page_number }}" {% if document_aspect > page_aspect %}width="97%"{% else %}height="97%"{% endif %} />
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from django.template import TemplateSyntaxError, Library, \
|
||||
VariableDoesNotExist, Node, Variable
|
||||
from django.template import Library, Node, Variable
|
||||
|
||||
from converter.api import get_document_dimensions, QUALITY_PRINT
|
||||
|
||||
from documents.views import calculate_converter_arguments
|
||||
from documents.conf.settings import PRINT_SIZE
|
||||
|
||||
@@ -18,7 +19,8 @@ class GetImageSizeNode(Node):
|
||||
context[u'document_width'], context['document_height'] = width, height
|
||||
context[u'document_aspect'] = float(width) / float(height)
|
||||
return u''
|
||||
|
||||
|
||||
|
||||
@register.tag
|
||||
def get_document_size(parser, token):
|
||||
tag_name, arg = token.contents.split(None, 1)
|
||||
|
||||
@@ -24,6 +24,7 @@ urlpatterns = patterns('documents.views',
|
||||
url(r'^document/(?P<document_id>\d+)/edit/metadata/$', 'document_edit_metadata', (), 'document_edit_metadata'),
|
||||
url(r'^document/multiple/edit/metadata/$', 'document_multiple_edit_metadata', (), 'document_multiple_edit_metadata'),
|
||||
url(r'^document/(?P<document_id>\d+)/print/$', 'document_print', (), 'document_print'),
|
||||
url(r'^document/(?P<document_id>\d+)/hard_copy/$', 'document_hard_copy', (), 'document_hard_copy'),
|
||||
|
||||
url(r'^document/(?P<document_id>\d+)/display/preview/$', 'get_document_image', {'size': PREVIEW_SIZE}, 'document_preview'),
|
||||
url(r'^document/(?P<document_id>\d+)/display/preview/multipage/$', 'get_document_image', {'size': MULTIPAGE_PREVIEW_SIZE}, 'document_preview_multipage'),
|
||||
|
||||
@@ -17,7 +17,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile
|
||||
from django.contrib.comments.models import Comment
|
||||
|
||||
import sendfile
|
||||
from common.utils import pretty_size
|
||||
from common.utils import pretty_size, parse_range, urlquote
|
||||
from converter.api import convert_document, QUALITY_DEFAULT
|
||||
from converter.exceptions import UnkownConvertError, UnknownFormat
|
||||
from filetransfers.api import serve_file
|
||||
@@ -28,8 +28,10 @@ from navigation.utils import resolve_to_name
|
||||
from tags.utils import get_tags_subtemplate
|
||||
from document_comments.utils import get_comments_subtemplate
|
||||
from converter.api import DEFAULT_ZOOM_LEVEL, DEFAULT_ROTATION, \
|
||||
DEFAULT_FILE_FORMAT
|
||||
from converter.api import QUALITY_PRINT
|
||||
DEFAULT_FILE_FORMAT, QUALITY_PRINT
|
||||
from common.literals import PAGE_SIZE_DIMENSIONS, \
|
||||
PAGE_ORIENTATION_PORTRAIT, PAGE_ORIENTATION_LANDSCAPE
|
||||
from common.conf.settings import DEFAULT_PAPER_SIZE
|
||||
|
||||
from documents.conf.settings import DELETE_STAGING_FILE_AFTER_UPLOAD
|
||||
from documents.conf.settings import USE_STAGING_DIRECTORY
|
||||
@@ -57,7 +59,7 @@ from documents.forms import DocumentTypeSelectForm, DocumentCreateWizard, \
|
||||
StagingDocumentForm, DocumentTypeMetadataType, DocumentPreviewForm, \
|
||||
MetadataFormSet, DocumentPageForm, DocumentPageTransformationForm, \
|
||||
DocumentContentForm, DocumentPageForm_edit, MetaDataGroupForm, \
|
||||
DocumentPageForm_text
|
||||
DocumentPageForm_text, PrintForm
|
||||
|
||||
from documents.metadata import save_metadata_list, \
|
||||
decode_metadata_from_url, metadata_repr_as_list
|
||||
@@ -66,8 +68,7 @@ from documents.models import Document, DocumentType, DocumentPage, \
|
||||
from documents.staging import StagingFile
|
||||
from documents import metadata_group_link
|
||||
from documents.literals import PICTURE_ERROR_SMALL, PICTURE_ERROR_MEDIUM, \
|
||||
PICTURE_UNKNOWN_SMALL, PICTURE_UNKNOWN_MEDIUM, PAGE_SIZE_DIMENSIONS, \
|
||||
PAGE_SIZE_LETTER, PAGE_SIZE_LEGAL
|
||||
PICTURE_UNKNOWN_SMALL, PICTURE_UNKNOWN_MEDIUM
|
||||
|
||||
|
||||
def document_list(request, object_list=None, title=None):
|
||||
@@ -297,7 +298,7 @@ def document_view(request, document_id):
|
||||
|
||||
if Comment.objects.for_model(document).count():
|
||||
subtemplates_list.append(get_comments_subtemplate(document))
|
||||
|
||||
|
||||
subtemplates_list.append(
|
||||
{
|
||||
'name': 'generic_list_subtemplate.html',
|
||||
@@ -546,10 +547,10 @@ def calculate_converter_arguments(document, *args, **kwargs):
|
||||
file_format = kwargs.pop('file_format', DEFAULT_FILE_FORMAT)
|
||||
zoom = kwargs.pop('zoom', DEFAULT_ZOOM_LEVEL)
|
||||
rotation = kwargs.pop('rotation', DEFAULT_ROTATION)
|
||||
|
||||
|
||||
document_page = DocumentPage.objects.get(document=document, page_number=page)
|
||||
transformation_string, warnings = document_page.get_transformation_string()
|
||||
|
||||
|
||||
arguments = {
|
||||
'size': size,
|
||||
'file_format': file_format,
|
||||
@@ -561,7 +562,7 @@ def calculate_converter_arguments(document, *args, **kwargs):
|
||||
}
|
||||
|
||||
return arguments, warnings
|
||||
|
||||
|
||||
|
||||
def get_document_image(request, document_id, size=PREVIEW_SIZE, quality=QUALITY_DEFAULT):
|
||||
check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW])
|
||||
@@ -579,9 +580,9 @@ def get_document_image(request, document_id, size=PREVIEW_SIZE, quality=QUALITY_
|
||||
zoom = ZOOM_MAX_LEVEL
|
||||
|
||||
rotation = int(request.GET.get('rotation', 0)) % 360
|
||||
|
||||
|
||||
arguments, warnings = calculate_converter_arguments(document, size=size, file_format=DEFAULT_FILE_FORMAT, quality=quality, page=page, zoom=zoom, rotation=rotation)
|
||||
|
||||
|
||||
if warnings and (request.user.is_staff or request.user.is_superuser):
|
||||
for warning in warnings:
|
||||
messages.warning(request, _(u'Page transformation error: %s') % warning)
|
||||
@@ -872,11 +873,11 @@ def document_view_simple(request, document_id):
|
||||
'object': document,
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
subtemplates_list = []
|
||||
if document.tags.count():
|
||||
subtemplates_list.append(get_tags_subtemplate(document))
|
||||
|
||||
|
||||
if Comment.objects.for_model(document).count():
|
||||
subtemplates_list.append(get_comments_subtemplate(document))
|
||||
|
||||
@@ -1154,36 +1155,96 @@ def metadatagroup_view(request, document_id, metadata_group_id):
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def document_print(request, document_id, page_size=PAGE_SIZE_LEGAL):
|
||||
def document_print(request, document_id):
|
||||
check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW])
|
||||
|
||||
document = get_object_or_404(Document.objects.select_related(), pk=document_id)
|
||||
document = get_object_or_404(Document, pk=document_id)
|
||||
|
||||
RecentDocument.objects.add_document_for_user(request.user, document)
|
||||
|
||||
#page = int(request.GET.get('page', 1))
|
||||
#zoom = int(request.GET.get('zoom', 100))
|
||||
#if zoom < ZOOM_MIN_LEVEL:
|
||||
# zoom = ZOOM_MIN_LEVEL
|
||||
#if zoom > ZOOM_MAX_LEVEL:
|
||||
# zoom = ZOOM_MAX_LEVEL
|
||||
#rotation = int(request.GET.get('rotation', 0)) % 360
|
||||
|
||||
arguments, warnings = calculate_converter_arguments(document, size=PRINT_SIZE, file_format=DEFAULT_FILE_FORMAT, quality=QUALITY_PRINT)
|
||||
#, page=page, zoom=zoom, rotation=rotation)
|
||||
|
||||
#Pre-generate
|
||||
output_file = convert_document(document, **arguments)
|
||||
post_redirect = None
|
||||
next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', post_redirect or document.get_absolute_url())))
|
||||
|
||||
new_window_url = None
|
||||
html_redirect = None
|
||||
|
||||
if request.method == 'POST':
|
||||
form = PrintForm(request.POST)
|
||||
if form.is_valid():
|
||||
hard_copy_arguments = {}
|
||||
# Get page range
|
||||
if form.cleaned_data['page_range']:
|
||||
hard_copy_arguments['page_range'] = form.cleaned_data['page_range']
|
||||
|
||||
# Compute page width and height
|
||||
if form.cleaned_data['custom_page_width'] and form.cleaned_data['custom_page_height']:
|
||||
page_width = form.cleaned_data['custom_page_width']
|
||||
page_height = form.cleaned_data['custom_page_height']
|
||||
elif form.cleaned_data['page_size']:
|
||||
page_width, page_height = dict(PAGE_SIZE_DIMENSIONS)[form.cleaned_data['page_size']]
|
||||
|
||||
# Page orientation
|
||||
if form.cleaned_data['page_orientation'] == PAGE_ORIENTATION_LANDSCAPE:
|
||||
page_width, page_height = page_height, page_width
|
||||
|
||||
hard_copy_arguments['page_width'] = page_width
|
||||
hard_copy_arguments['page_height'] = page_height
|
||||
|
||||
new_url = [reverse('document_hard_copy', args=[document_id])]
|
||||
if hard_copy_arguments:
|
||||
new_url.append(urlquote(hard_copy_arguments))
|
||||
|
||||
new_window_url = u'?'.join(new_url)
|
||||
#html_redirect = next
|
||||
#messages.success(request, _(u'Preparing document hardcopy.'))
|
||||
else:
|
||||
form = PrintForm()
|
||||
|
||||
return render_to_response('generic_form.html', {
|
||||
'form': form,
|
||||
'object': document,
|
||||
'title': _(u'print: %s') % document,
|
||||
'next': next,
|
||||
'html_redirect': html_redirect if html_redirect else html_redirect,
|
||||
'new_window_url': new_window_url if new_window_url else new_window_url
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def document_hard_copy(request, document_id):
|
||||
check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW])
|
||||
|
||||
document = get_object_or_404(Document, pk=document_id)
|
||||
|
||||
RecentDocument.objects.add_document_for_user(request.user, document)
|
||||
|
||||
arguments, warnings = calculate_converter_arguments(document, size=PRINT_SIZE, file_format=DEFAULT_FILE_FORMAT, quality=QUALITY_PRINT)
|
||||
|
||||
# Pre-generate
|
||||
convert_document(document, **arguments)
|
||||
|
||||
# Extract dimension values ignoring any unit
|
||||
page_width = request.GET.get('page_width', dict(PAGE_SIZE_DIMENSIONS)[DEFAULT_PAPER_SIZE][0])
|
||||
page_height = request.GET.get('page_height', dict(PAGE_SIZE_DIMENSIONS)[DEFAULT_PAPER_SIZE][1])
|
||||
|
||||
width = float(page_width.split('i')[0].split('c')[0].split('m')[0])
|
||||
height = float(page_height.split('i')[0].split('c')[0].split('m')[0])
|
||||
|
||||
page_range = request.GET.get('page_range', u'')
|
||||
if page_range:
|
||||
page_range = parse_range(page_range)
|
||||
|
||||
pages = document.documentpage_set.filter(page_number__in=page_range)
|
||||
else:
|
||||
pages = document.documentpage_set.all()
|
||||
|
||||
page_dimensions = dict(PAGE_SIZE_DIMENSIONS)[page_size]
|
||||
width = float(page_dimensions[0].split('i')[0].split('c')[0].split('m')[0])
|
||||
height = float(page_dimensions[1].split('i')[0].split('c')[0].split('m')[0])
|
||||
|
||||
return render_to_response('document_print.html', {
|
||||
'object': document,
|
||||
'page_size': page_dimensions,
|
||||
'page_aspect': width / height,
|
||||
'page_orientation': u'landscape' if width / height > 1 else u'portrait',
|
||||
'page_orientation': PAGE_ORIENTATION_LANDSCAPE if width / height > 1 else PAGE_ORIENTATION_PORTRAIT,
|
||||
'page_orientation_landscape': True if width / height > 1 else False,
|
||||
'page_orientation_portrait': False if width / height > 1 else True,
|
||||
'page_range': page_range,
|
||||
'page_width': page_width,
|
||||
'page_height': page_height,
|
||||
'pages': pages,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
Reference in New Issue
Block a user