Skip to content
Snippets Groups Projects
Commit cb504b2c authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Introduce debug logs

parent c9e8a57c
No related branches found
No related tags found
No related merge requests found
Showing
with 315 additions and 7 deletions
from django.contrib import admin
# Register your models here.
from timetable.models import Hint
from timetable.models import Hint, DebugLog, DebugLogGroup
def refresh_cache(modeladmin, request, queryset):
......@@ -17,4 +17,14 @@ class HintAdmin(admin.ModelAdmin):
actions = [refresh_cache]
class DebugLogAdmin(admin.ModelAdmin):
readonly_fields = ["id", "group", "return_code", "filename", "updated_at"]
class DebugLogGroupAdmin(admin.ModelAdmin):
readonly_fields = ["id"]
admin.site.register(Hint, HintAdmin)
admin.site.register(DebugLogGroup)
admin.site.register(DebugLog, DebugLogAdmin)
......@@ -18,6 +18,7 @@ def convert_markdown_2_latex(s):
process = subprocess.Popen(bash_command.split(), stdout=subprocess.PIPE)
output = process.communicate()[0]
print("[MD TO LATEX]", output)
print("[RETURN CODE]", process.returncode)
# Read converted latex from file
tex_file = open(os.path.join(BASE_DIR, "latex", "m2l.tex"), "r", encoding="utf8")
......
# Generated by Django 2.2.1 on 2019-05-22 13:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('timetable', '0009_hint_classes_formatted'),
]
operations = [
migrations.CreateModel(
name='DebugLogGroup',
fields=[
('id', models.CharField(max_length=100, primary_key=True, serialize=False)),
('name', models.CharField(max_length=200)),
],
),
]
# Generated by Django 2.2.1 on 2019-05-22 14:03
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('timetable', '0010_debugloggroup'),
]
operations = [
migrations.CreateModel(
name='DebugLog',
fields=[
('id', models.CharField(max_length=100, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200, verbose_name='Name')),
('return_code', models.IntegerField(blank=True, null=True, verbose_name='UNIX-Rückgabecode')),
('filename', models.FilePathField(match='*.log', path='/home/wethjo/dev/school-apps/schoolapps/latex',
verbose_name='Dateiname zur Logdatei')),
('group',
models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL,
related_name='logs', to='timetable.DebugLogGroup', verbose_name='Gruppe')),
],
options={
'verbose_name': 'Debug-Log',
'verbose_name_plural': 'Debug-Logs',
},
),
]
# Generated by Django 2.2.1 on 2019-05-22 14:07
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('timetable', '0011_debuglog'),
]
operations = [
migrations.AddField(
model_name='debuglog',
name='updated_at',
field=models.DateTimeField(default=datetime.datetime(2019, 5, 22, 16, 7, 24, 453531)),
),
migrations.AlterField(
model_name='debuglog',
name='filename',
field=models.FilePathField(match='.*.log', path='/home/wethjo/dev/school-apps/schoolapps/latex',
verbose_name='Dateiname zur Logdatei'),
),
]
# Generated by Django 2.2.1 on 2019-05-22 14:08
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('timetable', '0012_auto_20190522_1607'),
]
operations = [
migrations.AlterField(
model_name='debuglog',
name='updated_at',
field=models.DateTimeField(default=datetime.datetime(2019, 5, 22, 16, 8, 10, 52079)),
),
]
# Generated by Django 2.2.1 on 2019-05-22 14:08
import datetime
from django.db import migrations, models
from django.utils.timezone import utc
class Migration(migrations.Migration):
dependencies = [
('timetable', '0013_auto_20190522_1608'),
]
operations = [
migrations.AlterField(
model_name='debuglog',
name='updated_at',
field=models.DateTimeField(default=datetime.datetime(2019, 5, 22, 14, 8, 34, 95310, tzinfo=utc)),
),
]
# Generated by Django 2.2.1 on 2019-05-22 14:08
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('timetable', '0014_auto_20190522_1608'),
]
operations = [
migrations.AlterField(
model_name='debuglog',
name='updated_at',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]
# Generated by Django 2.2.1 on 2019-05-22 14:12
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('timetable', '0015_auto_20190522_1608'),
]
operations = [
migrations.AlterModelOptions(
name='debugloggroup',
options={'verbose_name': 'Debug-Log-Gruppe', 'verbose_name_plural': 'Debug-Log-Gruppen'},
),
migrations.AlterField(
model_name='debuglog',
name='updated_at',
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Aktualisierungszeitpunkt'),
),
migrations.AlterField(
model_name='debugloggroup',
name='id',
field=models.CharField(max_length=100, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='debugloggroup',
name='name',
field=models.CharField(max_length=200, verbose_name='Name'),
),
]
import os
from datetime import date
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils import timezone
from martor.models import MartorField
from schoolapps.settings import BASE_DIR
from timetable.m2l import convert_markdown_2_latex
from untisconnect.api import get_all_classes, format_classes
from untisconnect.models import Class
......@@ -76,6 +77,53 @@ class Hint(models.Model):
update_fields=update_fields)
class DebugLogGroup(models.Model):
# Meta
id = models.CharField(primary_key=True, blank=False, max_length=100, verbose_name="ID")
name = models.CharField(blank=False, max_length=200, verbose_name="Name")
class Meta:
verbose_name = "Debug-Log-Gruppe"
verbose_name_plural = "Debug-Log-Gruppen"
def __str__(self):
return self.name or self.id
class DebugLog(models.Model):
# Meta
id = models.CharField(primary_key=True, blank=False, max_length=100, verbose_name="ID")
name = models.CharField(blank=False, max_length=200, verbose_name="Name")
group = models.ForeignKey(DebugLogGroup, on_delete=models.SET_NULL, default=None, null=True, blank=True,
related_name="logs", verbose_name="Gruppe") # If null, it wouldn't be displayed
# Data
return_code = models.IntegerField(blank=True, null=True, verbose_name="UNIX-Rückgabecode")
filename = models.FilePathField(path=os.path.join(BASE_DIR, "latex"), match=".*.log",
verbose_name="Dateiname zur Logdatei")
updated_at = models.DateTimeField(blank=False, default=timezone.now, verbose_name="Aktualisierungszeitpunkt")
class Meta:
verbose_name = "Debug-Log"
verbose_name_plural = "Debug-Logs"
def __str__(self):
return self.name or self.id
def get_log_group_by_id(id):
p, _ = DebugLogGroup.objects.get_or_create(id=id)
return p
def register_log_with_filename(id, group_id, filename, return_code):
p, _ = DebugLog.objects.get_or_create(id=id)
group = get_log_group_by_id(group_id)
p.group = group
p.return_code = return_code
p.filename = filename
p.save()
class Timetable(models.Model):
class Meta:
permissions = (
......
......@@ -4,6 +4,7 @@ import subprocess
from django.template.loader import render_to_string
from schoolapps.settings import BASE_DIR
from timetable.models import register_log_with_filename
LOGO_FILENAME = os.path.join(BASE_DIR, "static", "common", "logo.png")
......@@ -22,6 +23,8 @@ def generate_pdf(tex, filename):
filename))
process = subprocess.Popen(bash_command.split(), stdout=subprocess.PIPE)
output = process.communicate()[0]
register_log_with_filename("latex_{}".format(filename), "latex", "{}.log".format(filename), process.returncode)
print("[LATEX]", output)
......
{% include 'partials/header.html' %}
{% load material_form %}
{% load martortags %}
<link rel="stylesheet"
href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.6/styles/default.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.6/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<main>
<a class="btn-flat waves-effect waves-teal right btn-flat-medium" href="{% url "timetable_debugging_tool" %}"><i
class="material-icons refresh center">refresh</i></a>
<h4>Debuggingtool</h4>
{# <div class="row">#}
{# <div class="col s12 m4">#}
<div class="card">
<div class="card-content">
<i class="material-icons right green-text medium">check_circle</i>
<span class="card-title">LaTeX-Logs</span>
<pre>pdflatex</pre>
<h5>class0.log</h5>
<pre><code class="plaintext scroll-fix">
{{ latex_1 }}
</code></pre>
<h5>class1.log</h5>
<pre><code class="plaintext scroll-fix">
{{ latex_2 }}
</code></pre>
</div>
{# <div class="card-action">#}
{# <a href="#" class="primary-color-text">Generierung erneut anstoßen</a>#}
{# <a href="#">This is a link</a>#}
{# </div>#}
</div>
{# </div>#}
{# <div class="col s12 m4">#}
<div class="card">
<div class="card-content">
<i class="material-icons right red-text medium">close</i>
<span class="card-title">MD-zu-LaTeX-Konvertierung</span>
<pre>pandoc</pre>
<p>I am a very simple card. I am good at containing small bits of information.
I am convenient because I require little markup to use effectively.</p>
</div>
<div class="card-action">
<a href="#">This is a link</a>
<a href="#">This is a link</a>
</div>
</div>
{# </div>#}
{# <div class="col s12 m4">#}
<div class="card">
<div class="card-content">
<span class="card-title">PDF-Merge</span>
<p>I am a very simple card. I am good at containing small bits of information.
I am convenient because I require little markup to use effectively.</p>
</div>
<div class="card-action">
<a href="#">This is a link</a>
<a href="#">This is a link</a>
</div>
</div>
{# </div>#}
{# </div>#}
</main>
{% include 'partials/footer.html' %}
......@@ -3,7 +3,7 @@
{% load martortags %}
<main>
<h4>Hinweise</h4>
<h4>Hinweismanagement</h4>
{% if msg %}
<div class="alert success">
......@@ -60,12 +60,12 @@
</div>
<div class="collapsible-body row">
<div class="right">
<a class="btn-flat waves-effect waves-teal green-text"
<a class="btn-flat waves-effect waves-green green-text"
href="{% url "timetable_edit_hint" hint.id %}">
<i class="material-icons left">edit</i>
<span class="hide-on-small-only">Bearbeiten</span>
</a>
<a class="btn-flat waves-effect waves-teal red-text delete-button"
<a class="btn-flat waves-effect waves-red red-text delete-button"
href="{% url "timetable_delete_hint" hint.id %}">
<i class="material-icons left">delete</i>
<span class="hide-on-small-only">Löschen</span>
......
......@@ -18,5 +18,5 @@ urlpatterns = [
path('substitutions/', views.substitutions, name='timetable_substitutions'),
path('substitutions/<int:year>/<int:month>/<int:day>/', views.substitutions, name='timetable_substitutions_date'),
path('class.pdf', views.sub_pdf, name="timetable_substitutions_pdf"),
path("debug/", views.debugging_tool, name="timetable_debugging_tool")
]
......@@ -408,3 +408,17 @@ def delete_hint(request, id):
hint.delete()
request.session["msg"] = "success_delete"
return redirect('timetable_hints')
@login_required
# @permission_required("timetable.")
def debugging_tool(request):
f = open(os.path.join(BASE_DIR, "latex", "class0.log"), "r")
latex_1 = f.read()
f.close()
f = open(os.path.join(BASE_DIR, "latex", "class1.log"), "r")
latex_2 = f.read()
f.close()
return render(request, "timetable/debug.html", {"latex_1": latex_1, "latex_2": latex_2})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment