diff --git a/biscuit/apps/chronos/pdf.py b/biscuit/apps/chronos/pdf.py index 4bc3902eac9e9dbd5e399f484ecc190a1656a232..b1060a5c3fba0d63d85535f7c1f5b57cdbbc5b30 100644 --- a/biscuit/apps/chronos/pdf.py +++ b/biscuit/apps/chronos/pdf.py @@ -21,16 +21,26 @@ def generate_pdf(tex, filename): # Execute pdflatex to generate the PDF bash_command = "pdflatex -halt-on-error -output-directory {} {}.tex".format(os.path.join(BASE_DIR, "latex"), os.path.join(BASE_DIR, "latex", - filename)) - process = subprocess.Popen(bash_command.split(), stdout=subprocess.PIPE) - output = process.communicate()[0] - del output + filename)) + run_args = list(bash_command.split()) + + # Execute two times to get number of last page + subprocess.run(run_args, stdout=None) + process = subprocess.run(run_args, stdout=None) # Register log file in debugging tool register_log_with_filename("latex_{}".format(filename), "latex", "{}.log".format(filename), process.returncode) +def generate_class_tex_header(): + """Generate LaTeX for a PDF by a substitution table""" + + context = { + "LOGO_FILENAME": LOGO_FILENAME, + } + return render_to_string("timetable/latex/header.tex", context) + -def generate_class_tex(subs, date, header_info, hints=None): +def generate_class_tex_body(subs, date, header_info, hints=None): """Generate LaTeX for a PDF by a substitution table""" context = { @@ -40,4 +50,4 @@ def generate_class_tex(subs, date, header_info, hints=None): "LOGO_FILENAME": LOGO_FILENAME, "hints": hints } - return render_to_string("timetable/latex/substitutions.tex", context) + return render_to_string("timetable/latex/substitutions.tex", context) \ No newline at end of file diff --git a/biscuit/apps/chronos/templates/timetable/latex/header.tex b/biscuit/apps/chronos/templates/timetable/latex/header.tex new file mode 100644 index 0000000000000000000000000000000000000000..1f80f9705ebe19e66fa906ece98adeafd577b666 --- /dev/null +++ b/biscuit/apps/chronos/templates/timetable/latex/header.tex @@ -0,0 +1,63 @@ +\documentclass[11pt]{article} +\usepackage[ngerman]{babel} +\usepackage[sfdefault]{cabin} +\usepackage[utf8]{inputenc} +\usepackage[a4paper,left=1cm,right=1cm,top=2cm,bottom=2.8cm,bindingoffset=0mm]{geometry} + +% Packages +\usepackage{fancyhdr} +\usepackage{lastpage} +\usepackage{graphicx} +\usepackage{longtable} +\usepackage{booktabs} +\usepackage{multirow} +\usepackage{color, colortbl} +\usepackage[colorlinks, linkcolor = black, citecolor = black, filecolor = black, urlcolor = black]{hyperref} + +\usepackage{ulem, xpatch} +\xpatchcmd{\sout} +{\bgroup} +{\bgroup\def\ULthickness{1.5pt}} +{}{} + +% Badge box +\usepackage{tcolorbox} +\newtcbox{\badge}{nobeforeafter,colframe=green,colback=green,boxrule=0.5pt,arc=4pt, +boxsep=0pt,left=4pt,right=4pt,top=4pt,bottom=4pt,tcbox raise base, +grow to left by=0pt, +grow to right by=-3pt, +enlarge top by=3pt, +enlarge bottom by=3pt,coltext=white} + +% Define colors +\definecolor{ grey }{RGB}{208, 208, 208} +\definecolor{ darkgrey }{rgb}{0.6,0.6,0.6} +\definecolor{ white }{rgb}{1,1,1} +\definecolor{ green }{RGB}{76,175,80} +\definecolor{green}{RGB}{76,175,80} +\definecolor{ blue }{RGB}{41,7,249} +\definecolor{ black }{RGB}{0,0,0} +\definecolor{ purple }{RGB}{156, 39, 176} + +% Define header +\pagestyle{fancy} + +% Left header: logo +\lhead{\includegraphics[width=5cm]{% templatetag openbrace %}{{LOGO_FILENAME}}{% templatetag closebrace %}} + +% Define footer +\lfoot{Katharineum zu Lübeck} +\cfoot{\thepage}%\ von \pageref{LastPage}} +\rfoot{\small Umsetzung: © 2018--2019 by Computer-AG} +\rhead{\textbf{ +Vertretungen }\\ +Stand: {% now "j. F Y H:i" %}\\ +} + +% Define own commands +%% tightlist from pandoc is missing in default.latex +%% see https://tex.stackexchange.com/questions/257418/error-tightlist-converting-md-file-into-pdf-using-pandoc +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + +\begin{document} diff --git a/biscuit/apps/chronos/templates/timetable/latex/substitutions.tex b/biscuit/apps/chronos/templates/timetable/latex/substitutions.tex index 05c7a1aef7388eeafe1486ba2f49451bf2fbf383..aaa879c0c2de31526a94a36c2dfcdfe8342f9c7f 100644 --- a/biscuit/apps/chronos/templates/timetable/latex/substitutions.tex +++ b/biscuit/apps/chronos/templates/timetable/latex/substitutions.tex @@ -1,136 +1,51 @@ {% load common %} {% load tex %} -\documentclass[11pt]{article} -\usepackage[ngerman]{babel} -\usepackage[sfdefault]{cabin} -\usepackage[utf8]{inputenc} -\usepackage[a4paper,left=1cm,right=1cm,top=1.5cm,bottom=1.5cm,bindingoffset=0mm]{geometry} - -% Packages -\usepackage{fancyhdr} -\usepackage{graphicx} -\usepackage{longtable} -\usepackage{booktabs} -\usepackage{multirow} -\usepackage{color, colortbl} -\usepackage[colorlinks, linkcolor = black, citecolor = black, filecolor = black, urlcolor = black]{hyperref} - -\usepackage{ulem, xpatch} -\xpatchcmd{\sout} -{\bgroup} -{\bgroup\def\ULthickness{1.5pt}} -{}{} - -% Badge box -\usepackage{tcolorbox} -\newtcbox{\badge}{nobeforeafter,colframe=green,colback=green,boxrule=0pt,arc=2pt, -boxsep=0pt,left=4pt,right=4pt,top=2pt,bottom=3pt,tcbox raise base, -grow to left by=0pt, -grow to right by=-3pt, -enlarge top by=1pt, -enlarge bottom by=1pt,coltext=white} - -% Define colors -\definecolor{grey}{RGB}{208, 208, 208} -\definecolor{darkgrey}{rgb}{0.6,0.6,0.6} -\definecolor{white}{rgb}{1,1,1} -\definecolor{ green }{RGB}{76,175,80} -\definecolor{green}{RGB}{76,175,80} -\definecolor{ black }{RGB}{0,0,0} -\definecolor{purple}{RGB}{156, 39, 176} - -% Define header -\pagestyle{fancy} - -% Left header: logo -\lhead{\includegraphics[width=5cm]{% templatetag openbrace %}{{LOGO_FILENAME}}{% templatetag closebrace %}} - -% Define footer -\lfoot{Katharineum zu Lübeck} -\cfoot{} -\rfoot{\small Umsetzung: © 2018--2019 by Computer-AG} -\rhead{\textbf{ -Vertretungen {{ date|date:"j. F Y, \\K\\W W"}}}\\ -Stand: {% now "j. F Y H:i" %}\\ -} - -\begin{document} - \large - \subsubsection*{} - - \section*{\Huge Vertretungen {{ date|date:"l, j. F Y"}}} - - {% include "timetable/latex/hints.tex" %} - - {% if header_info.is_box_needed %} - \begin{tabular}{@{\hspace{-1em}}p{0.22\linewidth}p{0.73\linewidth}} - {% for row in header_info.rows %} - \textbf{ {{ row.0 }} } & {{ row.1 }} \\ - {% endfor %} - \end{tabular} - {% endif %} - - % Init table - {% set color_background = 1 %} - {% set last_classes = "" %} - - \def\arraystretch{1.1} - \begin{longtable}{p{20mm}p{10mm}p{30mm}p{25mm}p{30mm}p{45mm}} - \textbf{Klassen} & - \textbf{Std.} & - \textbf{Lehrer} & - \textbf{Fach} & - \textbf{Raum} & - \textbf{Hinweis}\\ - \hline - \endhead - {% for sub in subs %} - - {# ------------------------------ #} +\large +\subsubsection*{} + +\section*{\Huge Vertretungen {{ date|date:"l, j. F Y"}}} + +{% include "timetable/latex/hints.tex" %} + +{% if header_info.is_box_needed %} +\begin{tabular}{@{\hspace{-1em}}p{0.22\linewidth}p{0.73\linewidth}} +{% for row in header_info.rows %} + \textbf{ {{ row.0 }} } & {{ row.1 }} \\ +{% endfor %} +\end{tabular} +{% endif %} + +% Init table +{% set color_background = 1 %} +{% set last_classes = "" %} + +\def\arraystretch{1.1} +\begin{longtable}{p{20mm}p{10mm}p{30mm}p{25mm}p{30mm}p{45mm}} + \textbf{Klassen} & \textbf{Std.} & \textbf{Lehrer} & \textbf{Fach} & \textbf{Raum} & \textbf{Hinweis}\\\hline + \endhead + {% for sub in subs %} {# Color groups of classes in grey/white #} {% if last_classes != sub.classes %} - - {% if color_background %} - {% set color_background = 0 %} - {% else %} - {% set color_background = 1 %} - {% endif %} - + {% if color_background %}{% set color_background = 0 %} + {% else %}{% set color_background = 1 %} + {% endif %} {% endif %} - {% set last_classes = sub.classes %} - - {# Background color #} - {% if color_background %} - \rowcolor{grey} - {% endif %} - - {# ------------------------------ #} - + {% if color_background %}\rowcolor{ grey }{% endif %} {% with c=sub.color %} - {# Display classes #} - \color{ {{c}}} - \textbf{ {{ sub.classes }} } & - - {# Display lesson number #} - \color{ {{c}}} - {{ sub.lesson }} & - - \color{ {{c}}} {% include "timetable/latex/teacher.tex" %} & - - \color{ {{c}}} {% include "timetable/latex/subject.tex" %} & - - \color{ {{c}}} {% include "timetable/latex/room.tex" %} & - - {# Display badge (for cancellations) #} {# Display notice and new line #} - {% if sub.badge %} - \footnotesize\badge{ {{ sub.badge }} } - {% endif %} \color{ {{c}}} \large\textit{ {{sub.text|default:""|safe|texify|safe}} } \\ - - {% endwith %} + {# Display classes #} + \color{ {{c}} }\textbf{ {{ sub.classes }} } & + {# Display lesson number #} + \color{ {{c}} } {{ sub.lesson }} & + \color{ {{c}} } {% include "timetable/latex/teacher.tex" %} & + \color{ {{c}} } {% include "timetable/latex/subject.tex" %} & + \color{ {{c}} } {% include "timetable/latex/room.tex" %} & + {# Display badge (for cancellations) #} {# Display notice and new line #} + {% if sub.badge %} \footnotesize\badge{ {{ sub.badge }} } {% endif %} + \color{ {{c}} } \large\textit{ {{sub.text|default:""|safe|texify|safe}} } \\ + {% endwith %} {% endfor %} - \end{longtable} +\end{longtable} -\end{document} diff --git a/biscuit/apps/chronos/templates/timetable/plan.html b/biscuit/apps/chronos/templates/timetable/plan.html index 481bdddfb07643b11ac37dfc3da315e3edabecb4..9874ea7b4aa8e2484a6a8c9b505af70a16d5562b 100755 --- a/biscuit/apps/chronos/templates/timetable/plan.html +++ b/biscuit/apps/chronos/templates/timetable/plan.html @@ -200,6 +200,10 @@ <span class="card-title"> {{ day.0.0 }} </span> + {% if day.1 %} + <span class="badge new blue center-align holiday-badge">{{ day.1.0 }}</span> + {% endif %} + </div> </div> {% for row, time in plan|deepcopy %} diff --git a/biscuit/apps/chronos/views.py b/biscuit/apps/chronos/views.py index 0cbc14b4777753dbef7e5f1b18f7fa8cb2a86088..4a1bdbefc95751d637cb16b14554891dae60a553 100755 --- a/biscuit/apps/chronos/views.py +++ b/biscuit/apps/chronos/views.py @@ -18,6 +18,10 @@ from timetable.forms import HintForm from timetable.hints import get_all_hints_by_time_period, get_all_hints_by_class_and_time_period, \ get_all_hints_for_teachers_by_time_period, get_all_hints_not_for_teachers_by_time_period from timetable.pdf import generate_class_tex, generate_pdf +from timetable.pdf import generate_class_tex_header, generate_class_tex_body, generate_pdf + +from untisconnect.plan import get_plan, TYPE_TEACHER, TYPE_CLASS, TYPE_ROOM, parse_lesson_times +from untisconnect.sub import get_substitutions_by_date, generate_sub_table, get_header_information, SubRow from untisconnect.api import * from untisconnect.datetimeutils import get_calendar_week, get_calendar_weeks, get_next_weekday, find_out_what_is_today, \ get_next_weekday_with_time @@ -137,8 +141,8 @@ def plan(request, plan_type, plan_id, regular="", year=None, calendar_week=None) "weeks": get_calendar_weeks(year=year), "selected_week": calendar_week, "selected_year": year, - "short_week_days": zip(SHORT_WEEK_DAYS, holidays), - "long_week_days": zip(LONG_WEEK_DAYS, holidays), + "short_week_days": zip(SHORT_WEEK_DAYS, holidays) if smart else zip(SHORT_WEEK_DAYS), + "long_week_days": zip(LONG_WEEK_DAYS, holidays) if smart else zip(LONG_WEEK_DAYS), "holidays": holidays, "hints": hints, "hints_b": hints_b, @@ -283,6 +287,7 @@ def sub_pdf(request, plan_date=None): first_day = get_next_weekday_with_time(today, today.time()) second_day = get_next_weekday(first_day + datetime.timedelta(days=1)) + tex = generate_class_tex_header() # Get subs and generate table for i, date in enumerate([first_day, second_day]): # Get subs and generate table @@ -299,29 +304,30 @@ def sub_pdf(request, plan_date=None): # latex = convert_markdown_2_latex(hints[0].text) # print(latex) # Generate LaTeX - tex = generate_class_tex(sub_table, date, header_info, hints) - - # Generate PDF - generate_pdf(tex, "aktuell{}".format(i)) - - # Merge PDFs - try: - merger = PdfFileMerger() - class0 = open(os.path.join(BASE_DIR, "latex", "aktuell0.pdf"), "rb") - class1 = open(os.path.join(BASE_DIR, "latex", "aktuell1.pdf"), "rb") - merger.append(fileobj=class0) - merger.append(fileobj=class1) - - # Write merged PDF to aktuell.pdf - output = open(os.path.join(BASE_DIR, "latex", "aktuell.pdf"), "wb") - merger.write(output) - output.close() - - # Register successful merge in debugging tool - register_return_0("merge_class", "pypdf2") - except Exception: - # Register exception in debugging tool - register_traceback("merge_class", "pypdf2") + tex += generate_class_tex_body(sub_table, date, header_info, hints) + + tex += "\end{document}" + # Generate PDF + generate_pdf(tex, "aktuell") + + # # Merge PDFs + # try: + # merger = PdfFileMerger() + # class0 = open(os.path.join(BASE_DIR, "latex", "aktuell0.pdf"), "rb") + # class1 = open(os.path.join(BASE_DIR, "latex", "aktuell1.pdf"), "rb") + # merger.append(fileobj=class0) + # merger.append(fileobj=class1) + # + # # Write merged PDF to aktuell.pdf + # output = open(os.path.join(BASE_DIR, "latex", "aktuell.pdf"), "wb") + # merger.write(output) + # output.close() + # + # # Register successful merge in debugging tool + # register_return_0("merge_class", "pypdf2") + # except Exception: + # # Register exception in debugging tool + # register_traceback("merge_class", "pypdf2") # Read and response PDF file = open(os.path.join(BASE_DIR, "latex", "aktuell.pdf"), "rb")