CIS Enhanced: FastAPI-App für LV-Plan, Studiengangs-Pläne und Namenslisten des FH-Burgenland-CIS
- Studentenplan (eigene/fremde Matrikelnummer) mit Wochenansicht, Semesterübersicht, iCal/CSV-Export - Studiengangs-Pläne nach StG/Semester/Verband mit Gruppen-Filter - Namenslisten mit Suche, Matrikel-Decode und CSV-Export - Studiennummer-Decoder auf der Startseite - Docker (Dockerfile, Compose) und Caddy-Beispiel für Deploy
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}{% if kind == 'student' %}Studentenplan{% else %}Studiengang-Plan{% endif %}{% endblock %}
|
||||
{% block content %}
|
||||
<h1 class="page-title">
|
||||
{% if kind == 'student' %}
|
||||
Studentenplan
|
||||
{% if person %}<span class="badge">{{ person.name }}</span>{% endif %}
|
||||
{% else %}
|
||||
Studiengang-Plan
|
||||
{% if stg %}<span class="badge">{{ stg.code }} - {{ stg.name }}</span>{% endif %}
|
||||
{% endif %}
|
||||
<span class="badge badge-muted">{{ semester }}</span>
|
||||
</h1>
|
||||
|
||||
<div class="card">
|
||||
<form class="form-row" method="get" action="/{{ kind if kind != 'student' else 'plan' }}">
|
||||
{% if kind == 'student' %}
|
||||
<div class="field">
|
||||
<label>Matrikelnummer</label>
|
||||
<input type="text" name="uid" value="{{ uid }}" placeholder="z.B. 2410640055" required>
|
||||
</div>
|
||||
{% if uid and uid | length >= 9 %}
|
||||
{% set dec = decode_matrikel(uid, meta.stgs) %}
|
||||
{% if dec %}
|
||||
<div class="field">
|
||||
<label> </label>
|
||||
<div class="badge badge-muted" style="margin-bottom:24px">
|
||||
Start: {{ dec.start }}
|
||||
{% if dec.stg_code %} · {{ dec.stg_code }} - {{ dec.stg_name }}{% endif %}
|
||||
· Nr. {{ dec.nr }}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="field">
|
||||
<label>Studiengang</label>
|
||||
<select name="kz" id="stg-select" required onchange="reloadVerbands()">
|
||||
{% for s in meta.stgs %}
|
||||
<option value="{{ s.kz }}" {{ 'selected' if s.kz == kz }}>{{ s.code }} - {{ s.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>Studien-Sem.</label>
|
||||
<select name="sem" id="sem-select" onchange="reloadVerbands()">
|
||||
{% for n in range(1, 9) %}
|
||||
<option value="{{ n }}" {{ 'selected' if (n | string) == sem }}>{{ n }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>Verband</label>
|
||||
<select name="ver" id="ver-select">
|
||||
{% for v in verbands %}
|
||||
<option value="{{ v }}" {{ 'selected' if v == ver }}>{{ v }}{{ verband_label(v) }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="field">
|
||||
<label>Semester</label>
|
||||
<select name="semester">
|
||||
{% for s in meta.semesters %}
|
||||
<option value="{{ s.label }}" {{ 'selected' if s.label == semester }}>{{ s.label }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<button class="btn btn-primary" type="submit">Laden</button>
|
||||
<a class="btn" href="/export/ical?kind={{ kind }}{% if kind == 'student' %}&uid={{ uid }}{% else %}&kz={{ kz }}&sem={{ sem }}&ver={{ ver }}{% endif %}&semester={{ semester }}"
|
||||
title="iCal-Download (Google, Outlook, Thunderbird, ...)">iCal export</a>
|
||||
<button class="btn" onclick="downloadCSV()" title="Termine als CSV herunterladen">CSV export</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
{% if kind == 'student' and person %}
|
||||
<div class="card">
|
||||
<div class="kv">
|
||||
<div class="item"><div class="k">Person</div><div class="v">{{ person.name }}</div></div>
|
||||
<div class="item"><div class="k">Matrikelnummer</div><div class="v mono">{{ person.uid }}</div></div>
|
||||
<div class="item"><div class="k">Studiengang</div><div class="v">{{ person.stg }}</div></div>
|
||||
<div class="item"><div class="k">Semester / Verband</div><div class="v">{{ person.semester }} / {{ person.verband }}{% if person.gruppe %} / Grp. {{ person.gruppe }}{% endif %}</div></div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="card">
|
||||
<div class="tabs">
|
||||
<button id="tab-week" class="active" onclick="switchTab('week')">Wochenansicht</button>
|
||||
<button id="tab-sem" onclick="switchTab('sem')">Semesterübersicht</button>
|
||||
</div>
|
||||
<div id="pane-week" class="tabpane active">
|
||||
<div class="weekbar">
|
||||
<div>
|
||||
<span class="week-label" id="week-label"></span>
|
||||
<span class="week-range" id="week-range"></span>
|
||||
</div>
|
||||
<div class="nav-btns">
|
||||
<select id="gruppe-filter" onchange="setGruppeFilter(this.value)" style="display:none;margin-right:4px;padding:5px 8px;border:1px solid var(--line);border-radius:8px;font-size:13px">
|
||||
<option value="">alle Gruppen</option>
|
||||
</select>
|
||||
<button class="btn btn-sm" onclick="shiftWeek(-1)">◀</button>
|
||||
<button class="btn btn-sm" onclick="goToday()">Heute</button>
|
||||
<button class="btn btn-sm" onclick="shiftWeek(1)">▶</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="week-scroll"><div class="week-grid" id="week-grid"></div></div>
|
||||
<div class="legend" id="legend"></div>
|
||||
</div>
|
||||
<div id="pane-sem" class="tabpane">
|
||||
<div id="sem-lv"></div>
|
||||
<h3>Alle Termine</h3>
|
||||
<div id="sem-events"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-back" id="detail-modal" onclick="if(event.target===this)closeDetail()">
|
||||
<div class="modal">
|
||||
<button class="close" onclick="closeDetail()">×</button>
|
||||
<h3>LV-Details</h3>
|
||||
<div id="detail-body"></div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
<script>
|
||||
window.__PLAN_DATA__ = {
|
||||
kind: "{{ kind }}",
|
||||
tab: "{{ tab }}",
|
||||
uid: "{{ uid }}",
|
||||
kz: "{{ kz }}",
|
||||
sem: "{{ sem }}",
|
||||
ver: "{{ ver }}",
|
||||
grp: "{{ grp }}",
|
||||
semester: "{{ semester }}",
|
||||
initWeek: "{{ init_week.isoformat() }}",
|
||||
slots: {{ slots | tojson }},
|
||||
events: {{ events_json | tojson }}
|
||||
};
|
||||
</script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user