192 lines
5.9 KiB
Python
192 lines
5.9 KiB
Python
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
|
|
|
|
|
|
|