import json import os from django.http import HttpResponse, Http404, FileResponse, HttpResponseRedirect from django.template import loader, RequestContext from django.contrib.auth.decorators import login_required from .models import * from django.conf import settings from GeneralApp.funcs import get_inter_http_respose from django.utils.translation import gettext_lazy as _ from django.urls import reverse from collections import OrderedDict from django.template.loader import render_to_string from urllib.parse import unquote def get_tree_arts(art, arts, sel_arts_ids): docs_tree = OrderedDict() docs_tree.update({ art_item.id: { 'url': art_item.url, 'name': art_item.name, # 'id': art_item.id, 'children': get_tree_arts(art_item, arts, sel_arts_ids), 'active': art_item.id in sel_arts_ids } for art_item in arts.filter(parent=art) }) return docs_tree def _response_pdf(path): filePDF = open(path, 'rb') content = filePDF.read() # content = str(content) filePDF.close() response = HttpResponse(content, content_type='application/pdf') response['Content-Disposition'] = 'filename="{fn}"'.format(fn=os.path.basename(path)) return response def pdf_render(request, template, context, file_name): from BaseModels.functions import url_translit from GeneralApp.funcs_options import get_options_by_opt_types filename = url_translit(file_name) html = render_to_string(template, context, request) sets = get_options_by_opt_types(['domain'], only_vals=True, w_prefix=True) if settings.DEBUG: sets['domain'] = 'http://127.0.0.1:8019' while 'src="/' in html: html = html.replace('src="/', f'src="{sets["domain"]}/') # html = unquote(html) f = open(f'{settings.PDF_FOLDER}/{filename}.html', 'w') f.write(html) f.close() os.system( '{wkhtmltopdf} ' # '--margin-top 20mm ' # '--encoding windows-1250 ' '--enable-local-file-access ' '--load-error-handling ignore ' '--enable-internal-links ' '--keep-relative-links ' '--print-media-type ' '--encoding UTF-8 ' # '--default-header ' # '--minimum-font-size 20mm ' '{pdf_folder}/{file_name}.html ' '{pdf_folder}/{file_name}.pdf'.format( wkhtmltopdf=settings.WKHTML_TO_PDF, pdf_folder=settings.PDF_FOLDER, file_name=filename) ) path = settings.PDF_FOLDER + '/' + filename + '.pdf' # os.system(u'{wkhtmltopdf} {print_folder}/order{filename}.html {print_folder}/order{filename}.pdf'.format(wkhtmltopdf=settings.WKHTML_TO_PDF, print_folder=settings.PRINT_FOLDER)) return _response_pdf(path) def DocsView(request, version=None, art_url=None): if art_url and version: generate_pdf = False if request.GET and 'pdf' in request.GET and request.GET['pdf'] == 'true': generate_pdf = True kwargs = { 'enable': True, 'url': art_url, 'versions__url': version, } try: art = DocArt.objects.get(**kwargs) try: vers_obj = DocVersion.objects.get(enable=True, url=version) except DocVersion.DoesNotExist: raise Http404 active_arts, active_arts_ids = art.get_parents_path() arts = DocArt.objects.filter(enable=True, versions=vers_obj).order_by('order') doc_tree = get_tree_arts(None, arts, active_arts_ids) versions = DocVersion.objects.exclude( rel_docArts_for_version=None ).filter( enable=True, ).order_by('order', 'name') breadcrumbs = OrderedDict({ 'Документация и техническая поддержка': reverse('docs_main'), f'Документация для версии {version}': reverse( 'docs_version_page', kwargs={'version': version}), }) breadcrumbs.update({ item.name: reverse( 'docs_art_page', kwargs={'version': version, 'art_url': item.url} ) for item in active_arts }) Dict = { 'cur_article': art, 'cur_version': vers_obj, 'doc_tree': doc_tree, 'allow_versions': versions, 'breadcrumbs': breadcrumbs, 'prev_article': art.get_prev_article(version=vers_obj), 'next_article': art.get_next_article(version=vers_obj), 'pdf_render': generate_pdf } if not generate_pdf: tpl = 'pages/p_documentation.html' t = loader.get_template(tpl) return get_inter_http_respose(t, Dict, request) else: tpl = 'blocks/b_documentation_article.html' # tpl = 'pages/p_documentation.html' return pdf_render(request, tpl, Dict, art.name) except DocArt.DoesNotExist: raise Http404 if version: try: vers_obj = DocVersion.objects.get(enable=True, url=version) if vers_obj: art = vers_obj.get_article() if art: url = reverse( 'docs_art_page', kwargs={'version': version, 'art_url': art.url} ) return HttpResponseRedirect(url) except DocVersion.DoesNotExist: raise Http404 art = DocArt.objects.exclude( versions=None ).filter( enable=True, parent=None ).order_by('-versions__order', '-versions__name', 'order').first() if art: url = reverse( 'docs_art_page', kwargs={'version': art.versions.order_by('-order').first().url, 'art_url': art.url} ) return HttpResponseRedirect(url) if not art: raise Http404