Files
Aerbim/DocsApp/views.py
2024-07-17 01:50:03 +03:00

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