work
This commit is contained in:
parent
d2e6b65a12
commit
34f3367a08
13 changed files with 175 additions and 519 deletions
|
@ -2,7 +2,7 @@ import json
|
||||||
import base64
|
import base64
|
||||||
|
|
||||||
from core.models import Berichtsheft
|
from core.models import Berichtsheft
|
||||||
from core.report_templates import ReportTemplates
|
from core.reports import DailyReport, WeeklyReport
|
||||||
|
|
||||||
|
|
||||||
class AzureUser:
|
class AzureUser:
|
||||||
|
@ -35,6 +35,13 @@ class AzureUser:
|
||||||
def reports(self):
|
def reports(self):
|
||||||
return Berichtsheft.objects.filter(user=self.id)
|
return Berichtsheft.objects.filter(user=self.id)
|
||||||
|
|
||||||
def get_report_template(self):
|
def get_report_kind(self):
|
||||||
# TODO : Implement
|
# TODO : Implement
|
||||||
return ReportTemplates.get_template("weekly")
|
return "weekly"
|
||||||
|
|
||||||
|
def get_report_kind_form(self, request=None):
|
||||||
|
match self.get_report_kind():
|
||||||
|
case "weekly":
|
||||||
|
return WeeklyReport(request)
|
||||||
|
case "daily":
|
||||||
|
return DailyReport(request)
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
def extract_post_values(post, vars) -> dict:
|
|
||||||
res = {}
|
|
||||||
for var in vars:
|
|
||||||
res[var["name"]] = post.get(var["name"], "")
|
|
||||||
return res
|
|
22
core/migrations/0009_berichtsheft_kind.py
Executable file
22
core/migrations/0009_berichtsheft_kind.py
Executable file
|
@ -0,0 +1,22 @@
|
||||||
|
# Generated by Django 4.2.16 on 2024-12-03 14:24
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("core", "0008_berichtsheft_needs_rewrite"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="berichtsheft",
|
||||||
|
name="kind",
|
||||||
|
field=models.CharField(
|
||||||
|
choices=[("weekly", "Weekly"), ("daily", "Daily")],
|
||||||
|
default="weekly",
|
||||||
|
max_length=20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
18
core/migrations/0010_berichtsheft_department.py
Executable file
18
core/migrations/0010_berichtsheft_department.py
Executable file
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 4.2.16 on 2024-12-03 15:51
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("core", "0009_berichtsheft_kind"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="berichtsheft",
|
||||||
|
name="department",
|
||||||
|
field=models.CharField(default="", max_length=160),
|
||||||
|
),
|
||||||
|
]
|
|
@ -21,12 +21,21 @@ class Group(BuiltinGroup):
|
||||||
proxy = True
|
proxy = True
|
||||||
|
|
||||||
|
|
||||||
|
class ReportKind(models.TextChoices):
|
||||||
|
WEEKLY = "weekly"
|
||||||
|
DAILY = "daily"
|
||||||
|
|
||||||
|
|
||||||
class Berichtsheft(models.Model):
|
class Berichtsheft(models.Model):
|
||||||
id = models.AutoField(primary_key=True)
|
id = models.AutoField(primary_key=True)
|
||||||
user = models.TextField()
|
user = models.TextField()
|
||||||
|
kind = models.CharField(
|
||||||
|
max_length=20, choices=ReportKind.choices, default=ReportKind.WEEKLY
|
||||||
|
)
|
||||||
num = models.PositiveBigIntegerField(default=0)
|
num = models.PositiveBigIntegerField(default=0)
|
||||||
year = models.PositiveIntegerField()
|
year = models.PositiveIntegerField()
|
||||||
week = models.PositiveSmallIntegerField()
|
week = models.PositiveSmallIntegerField()
|
||||||
|
department = models.CharField(max_length=160, default="")
|
||||||
content = models.JSONField()
|
content = models.JSONField()
|
||||||
needs_rewrite = models.BooleanField(default=False)
|
needs_rewrite = models.BooleanField(default=False)
|
||||||
created = models.DateTimeField(auto_now_add=True)
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
class ReportTemplates:
|
|
||||||
report_global = {
|
|
||||||
"vars": [
|
|
||||||
{"name": "name", "display_name": "Name"},
|
|
||||||
{"name": "num_doc", "display_name": "Berichtsheft Nummer"},
|
|
||||||
{"name": "year", "display_name": "Jahr"},
|
|
||||||
{"name": "week", "display_name": "Kalenderwoche"},
|
|
||||||
{"name": "start_date", "display_name": "Von"},
|
|
||||||
{"name": "end_date", "display_name": "bis"},
|
|
||||||
{"name": "department", "display_name": "Abteilung"},
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
def get_template(id) -> dict:
|
|
||||||
match id:
|
|
||||||
case "weekly":
|
|
||||||
weekly = {
|
|
||||||
"vars": [
|
|
||||||
{
|
|
||||||
"name": "company_text",
|
|
||||||
"display_name": "Betriebliche Tätigkeiten",
|
|
||||||
},
|
|
||||||
{"name": "week_topic", "display_name": "Thema der Woche"},
|
|
||||||
{"name": "school_text", "display_name": "Berufsschule"},
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
weekly["vars"].extend(ReportTemplates.report_global["vars"])
|
|
||||||
return weekly
|
|
26
core/reports.py
Executable file
26
core/reports.py
Executable file
|
@ -0,0 +1,26 @@
|
||||||
|
from django import forms
|
||||||
|
|
||||||
|
|
||||||
|
class WeeklyReport(forms.Form):
|
||||||
|
department = forms.CharField(label="Abteilung", max_length=150)
|
||||||
|
company_text = forms.CharField(label="Betriebliche Tätigkeiten", max_length=300)
|
||||||
|
week_topic = forms.CharField(label="Thema der Woche", max_length=600)
|
||||||
|
school_text = forms.CharField(label="Berufsschule", max_length=300)
|
||||||
|
|
||||||
|
def content_values(self) -> dict:
|
||||||
|
if self.is_valid():
|
||||||
|
return {
|
||||||
|
"company_text": self.cleaned_data["company_text"],
|
||||||
|
"week_topic": self.cleaned_data["week_topic"],
|
||||||
|
"school_text": self.cleaned_data["school_text"],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class DailyReport:
|
||||||
|
department = forms.CharField(label="Abteilung", max_length=150)
|
||||||
|
week_topic = forms.CharField(label="Thema der Woche", max_length=600)
|
||||||
|
monday_text = forms.CharField(label="Berufsschule", max_length=300)
|
||||||
|
tuesday_text = forms.CharField(label="Dienstag", max_length=300)
|
||||||
|
wednesday_text = forms.CharField(label="Mittwoch", max_length=300)
|
||||||
|
thursday_text = forms.CharField(label="Donnerstag", max_length=300)
|
||||||
|
friday_text = forms.CharField(label="Freitag", max_length=300)
|
|
@ -2,5 +2,5 @@
|
||||||
|
|
||||||
STYLE = {
|
STYLE = {
|
||||||
"red_btn": "text-white bg-red-700 hover:bg-red-800 focus:outline-none focus:ring-4 focus:ring-red-300 font-medium rounded-full text-sm px-5 py-2.5 text-center me-2 mb-2 dark:bg-red-600 dark:hover:bg-red-700 dark:focus:ring-red-900",
|
"red_btn": "text-white bg-red-700 hover:bg-red-800 focus:outline-none focus:ring-4 focus:ring-red-300 font-medium rounded-full text-sm px-5 py-2.5 text-center me-2 mb-2 dark:bg-red-600 dark:hover:bg-red-700 dark:focus:ring-red-900",
|
||||||
"card": "a4-page bg-white shadow-lg p-6 mx-auto my-10",
|
"card": "bg-white drop-shadow-md p-6 mx-auto my-10 aspect-[2/3] hover:drop-shadow-xl hover:scale-[0.95] scale-[0.9] transition-all duration-50 transform ease-in-out",
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,28 +6,39 @@
|
||||||
<body>
|
<body>
|
||||||
{{ user.display_name }}
|
{{ user.display_name }}
|
||||||
|
|
||||||
<h1> Deine Berichtshefte </h1>
|
<div class="bg-gray-100">
|
||||||
|
<h1 class="text-2xl justify-center flex pt-5">Deine Berichtshefte</h1>
|
||||||
|
|
||||||
{% if reports|length == 0 %}
|
{% if reports|length == 0 %}
|
||||||
<button onclick="location = '/write'">
|
|
||||||
|
<h3>wau, such empty!</h3>
|
||||||
|
|
||||||
|
<button onclick="location = '/write'" class="{{ style.red_btn }}">
|
||||||
Füge dein erstes Berichtsheft hinzu!
|
Füge dein erstes Berichtsheft hinzu!
|
||||||
</button>
|
</button>
|
||||||
{% endif %}
|
{% else %}
|
||||||
|
|
||||||
<div class="min-h-screen bg-gray-100 flex items-center justify-center">
|
<div
|
||||||
|
class="min-h-screen flex items-center justify-center grid grid-cols-5"
|
||||||
|
>
|
||||||
{% for report in reports %}
|
{% for report in reports %}
|
||||||
<div class="{{ style.card }}">
|
|
||||||
<a href="/report/{{ report.id }}"> {{ report }} </a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if forloop.last %}
|
<a href="/report/{{ report.id }}" class="{{ style.card }}">
|
||||||
{% if report.week != week_now %}
|
{% if approved %}
|
||||||
|
<div
|
||||||
|
class="absolute top-0 right-0 translate-y-3 -translate-x-3 bg-green-500 text-white rounded-full w-6 h-6 flex items-center justify-center scale-[1.5]"
|
||||||
|
>
|
||||||
|
✓
|
||||||
</div>
|
</div>
|
||||||
<button onclick="location = '/write'" class="{{ style.red_btn }}"> Berichtsheft schreiben </button>
|
{% endif %} {{ report }}
|
||||||
{% endif %}
|
</a>
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% endfor %}
|
{% if forloop.last %} {% if report.week != week_now %}
|
||||||
|
<button onclick="location = '/write'" class="{{ style.red_btn }}">
|
||||||
|
Berichtsheft schreiben
|
||||||
|
</button>
|
||||||
|
{% endif %} {% endif %} {% endfor %} {% endif %}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
|
@ -1,384 +0,0 @@
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title> Test </title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
// Modal-Elemente holen
|
|
||||||
const modal = document.getElementById('berichtModal');
|
|
||||||
const btnNew = document.querySelector('.btn-new');
|
|
||||||
const btnClose = document.querySelector('.btn-close');
|
|
||||||
const btnSave = document.querySelector('.btn-save');
|
|
||||||
const titelInput = document.getElementById('titel');
|
|
||||||
const textInput = document.getElementById('text');
|
|
||||||
|
|
||||||
// Funktion, um Sterne zu erzeugen
|
|
||||||
function createStars() {
|
|
||||||
const starContainer = document.createElement('div');
|
|
||||||
starContainer.classList.add('stars'); // Container für Sterne
|
|
||||||
document.body.appendChild(starContainer); // Sterncontainer zum Body hinzufügen
|
|
||||||
|
|
||||||
// Anzahl der Sterne, die du erzeugen möchtest
|
|
||||||
const numStars = 50;
|
|
||||||
|
|
||||||
// Zufällige Sterne erzeugen
|
|
||||||
for (let i = 0; i < numStars; i++) {
|
|
||||||
const star = document.createElement('div');
|
|
||||||
star.classList.add('star');
|
|
||||||
|
|
||||||
// Zufällige Positionen und Größen für Sterne
|
|
||||||
const size = Math.random() * 3 + 1; // Größe zwischen 1 und 4px
|
|
||||||
star.style.width = `${size}px`;
|
|
||||||
star.style.height = `${size}px`;
|
|
||||||
|
|
||||||
// Zufällige Position
|
|
||||||
const x = Math.random() * window.innerWidth; // Zufällige horizontale Position
|
|
||||||
const y = Math.random() * window.innerHeight; // Zufällige vertikale Position
|
|
||||||
star.style.left = `${x}px`;
|
|
||||||
star.style.top = `${y}px`;
|
|
||||||
|
|
||||||
// Zufällige Verzögerung für den Twinkle-Effekt
|
|
||||||
const delay = Math.random() * 2; // Zufällige Verzögerung zwischen 0 und 2s
|
|
||||||
star.style.animationDelay = `${delay}s`;
|
|
||||||
|
|
||||||
starContainer.appendChild(star); // Stern zum Container hinzufügen
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Funktion zum Entfernen der Sterne
|
|
||||||
function removeStars() {
|
|
||||||
const starContainer = document.querySelector('.stars');
|
|
||||||
if (starContainer) {
|
|
||||||
starContainer.remove(); // Entfernt den Container mit den Sternen
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Funktion zum Öffnen des Modals
|
|
||||||
function openModal() {
|
|
||||||
modal.classList.add('show'); // Modal anzeigen mit 'show' Klasse
|
|
||||||
document.body.classList.add('modal-open'); // Hintergrund unscharf machen
|
|
||||||
createStars(); // Sterne erzeugen, wenn das Modal geöffnet wird
|
|
||||||
}
|
|
||||||
|
|
||||||
// Funktion zum Schließen des Modals
|
|
||||||
function closeModal() {
|
|
||||||
modal.classList.remove('show'); // Modal ausblenden durch Entfernen der 'show' Klasse
|
|
||||||
document.body.classList.remove('modal-open'); // Hintergrund zurücksetzen
|
|
||||||
removeStars(); // Sterne entfernen, wenn das Modal geschlossen wird
|
|
||||||
}
|
|
||||||
|
|
||||||
// Funktion zum Speichern eines neuen Berichtshefts
|
|
||||||
function saveReport() {
|
|
||||||
const titel = titelInput.value;
|
|
||||||
const text = textInput.value;
|
|
||||||
|
|
||||||
if (titel && text) {
|
|
||||||
// Hier kannst du das neue Berichtsheft speichern (z.B. in LocalStorage oder in einer Datenbank)
|
|
||||||
alert(`Berichtsheft gespeichert!\nTitel: ${titel}\nText: ${text}`);
|
|
||||||
|
|
||||||
// Modal schließen nach dem Speichern
|
|
||||||
closeModal();
|
|
||||||
|
|
||||||
// Eingabefelder zurücksetzen
|
|
||||||
titelInput.value = '';
|
|
||||||
textInput.value = '';
|
|
||||||
} else {
|
|
||||||
alert('Bitte fülle alle Felder aus!');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Event-Listener für das Öffnen des Modals
|
|
||||||
btnNew.addEventListener('click', openModal);
|
|
||||||
|
|
||||||
// Event-Listener für das Schließen des Modals
|
|
||||||
btnClose.addEventListener('click', closeModal);
|
|
||||||
|
|
||||||
// Event-Listener für das Speichern des Berichtshefts
|
|
||||||
btnSave.addEventListener('click', saveReport);
|
|
||||||
|
|
||||||
// Wenn der Benutzer außerhalb des Modals klickt, soll es ebenfalls geschlossen werden
|
|
||||||
window.addEventListener('click', function(event) {
|
|
||||||
if (event.target === modal) {
|
|
||||||
closeModal();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Mausbewegung über das Grid für 3D-Rotation
|
|
||||||
const reportElements = document.querySelectorAll('.bericht');
|
|
||||||
|
|
||||||
function handleMouseMove(event) {
|
|
||||||
reportElements.forEach((element) => {
|
|
||||||
const rect = element.getBoundingClientRect();
|
|
||||||
const centerX = rect.left + rect.width / 2;
|
|
||||||
const centerY = rect.top + rect.height / 2;
|
|
||||||
|
|
||||||
const deltaX = (event.clientX - centerX) / rect.width;
|
|
||||||
const deltaY = (event.clientY - centerY) / rect.height;
|
|
||||||
|
|
||||||
const rotateX = deltaY * 15;
|
|
||||||
const rotateY = deltaX * -25;
|
|
||||||
const moveX = deltaX * 40;
|
|
||||||
|
|
||||||
// Nur das angeklickte Element wird rotiert und skaliert
|
|
||||||
if (element.matches(':hover')) {
|
|
||||||
element.style.transform = `scale(1.05) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;
|
|
||||||
element.style.zIndex = 10; // Erhöht den Stapelwert des Elements, um es hervorzuheben
|
|
||||||
} else {
|
|
||||||
element.style.transform = 'scale(1)'; // Andere Elemente bleiben unverändert
|
|
||||||
element.style.zIndex = 1; // Standardstapelwert
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Event-Listener für Mausbewegung
|
|
||||||
document.querySelector('.container').addEventListener('mousemove', handleMouseMove);
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
font-family: Arial, sans-serif;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
box-sizing: border-box;
|
|
||||||
background-color: #f4f4f4;
|
|
||||||
}
|
|
||||||
|
|
||||||
header {
|
|
||||||
background-color: #333;
|
|
||||||
color: white;
|
|
||||||
padding: 10px 20px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
|
|
||||||
gap: 20px;
|
|
||||||
padding: 20px;
|
|
||||||
perspective: 1500px; /* 3D-Effekt */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Stil für die Berichtselemente */
|
|
||||||
.bericht {
|
|
||||||
background-color: white;
|
|
||||||
padding: 15px;
|
|
||||||
border-radius: 8px;
|
|
||||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
||||||
transition: transform 0.1s ease, box-shadow 0.1s ease;
|
|
||||||
position: relative;
|
|
||||||
will-change: transform;
|
|
||||||
}
|
|
||||||
|
|
||||||
.add-new {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-new {
|
|
||||||
width: 60px;
|
|
||||||
height: 60px;
|
|
||||||
background-color: #28a745;
|
|
||||||
color: white;
|
|
||||||
font-size: 30px;
|
|
||||||
border: none;
|
|
||||||
border-radius: 50%;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: background-color 0.3s, transform 0.2s;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-new:hover {
|
|
||||||
background-color: #218838;
|
|
||||||
transform: scale(1.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Modal für neues Berichtsheft */
|
|
||||||
.modal {
|
|
||||||
display: none;
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
transition: opacity 0.3s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal.show {
|
|
||||||
display: flex;
|
|
||||||
opacity: 1;
|
|
||||||
z-index: 1000; /* Modal über anderen Inhalten */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hintergrundunschärfe beim Öffnen des Modals */
|
|
||||||
.modal.show::before {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: rgba(0, 0, 0, 0.3);
|
|
||||||
filter: blur(10px); /* Hintergrund unscharf */
|
|
||||||
z-index: -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Modal-Inhalt */
|
|
||||||
.modal-content {
|
|
||||||
background-color: white;
|
|
||||||
padding: 40px;
|
|
||||||
border-radius: 8px;
|
|
||||||
width: 500px;
|
|
||||||
max-width: 90%;
|
|
||||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
||||||
transform: scale(1.05); /* Kleinere Zoom-Animation */
|
|
||||||
transition: transform 0.3s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
body.modal-open {
|
|
||||||
filter: blur(5px); /* Unschärfe des Hintergrunds */
|
|
||||||
transition: filter 0.3s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Modal bleibt scharf und im Vordergrund */
|
|
||||||
.modal.show {
|
|
||||||
z-index: 100; /* Stellt sicher, dass das Modal im Vordergrund ist */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Eingabefelder im Modal */
|
|
||||||
.modal input,
|
|
||||||
.modal textarea {
|
|
||||||
width: 100%;
|
|
||||||
padding: 10px;
|
|
||||||
margin: 10px 0;
|
|
||||||
border-radius: 5px;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Buttons im Modal */
|
|
||||||
.modal-buttons {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal button {
|
|
||||||
padding: 10px 15px;
|
|
||||||
background-color: #007bff;
|
|
||||||
color: white;
|
|
||||||
border: none;
|
|
||||||
border-radius: 5px;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: background-color 0.3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal button:hover {
|
|
||||||
background-color: #0056b3;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Schließen-Button im Modal */
|
|
||||||
.btn-close {
|
|
||||||
background-color: #dc3545;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-close:hover {
|
|
||||||
background-color: #c82333;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Speichern-Button im Modal */
|
|
||||||
.btn-save {
|
|
||||||
background-color: #28a745;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-save:hover {
|
|
||||||
background-color: #218838;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Animation für die Sterne */
|
|
||||||
.stars {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.star {
|
|
||||||
position: absolute;
|
|
||||||
width: 3px;
|
|
||||||
height: 3px;
|
|
||||||
background-color: #fff;
|
|
||||||
border-radius: 50%;
|
|
||||||
opacity: 0;
|
|
||||||
animation: star-animation 1s infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sterneffekt im Hintergrund */
|
|
||||||
body.modal-open .stars {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
z-index: 50; /* Überlagert den Hintergrund, aber unter dem Modal */
|
|
||||||
pointer-events: none; /* Verhindert Interaktionen mit den Sternen */
|
|
||||||
}
|
|
||||||
|
|
||||||
.star {
|
|
||||||
position: absolute;
|
|
||||||
background-color: white;
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: twinkle 2s infinite alternate;
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes twinkle {
|
|
||||||
0% {
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Modal-Styling */
|
|
||||||
#berichtModal {
|
|
||||||
position: fixed;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
z-index: 100; /* Modal ganz oben */
|
|
||||||
background-color: white;
|
|
||||||
padding: 20px;
|
|
||||||
border-radius: 8px;
|
|
||||||
width: 400px;
|
|
||||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-content {
|
|
||||||
background-color: white;
|
|
||||||
padding: 15px;
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal-open #berichtModal {
|
|
||||||
z-index: 1000; /* Sicherstellen, dass das Modal immer oben bleibt */
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<h1> Deine Berichtshefte </h1>
|
|
||||||
|
|
||||||
<div class="modal-content stars">
|
|
||||||
<p class="bericht" > Berichtsheft 1 </p>
|
|
||||||
</div>
|
|
||||||
<button class="modal"> Add new I guess </button>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -5,46 +5,16 @@
|
||||||
<body>
|
<body>
|
||||||
<h1>Neues Berichtsheft</h1>
|
<h1>Neues Berichtsheft</h1>
|
||||||
|
|
||||||
|
<p>{{ user.display_name }}</p>
|
||||||
<p>Berichtsheft {{ year }} / {{ week }}</p>
|
<p>Berichtsheft {{ year }} / {{ week }}</p>
|
||||||
|
<p>Von: {{ start_date|date:"d.m.Y" }} bis: {{ end_date|date:"d.m.Y" }}</p>
|
||||||
|
|
||||||
<form method="post">
|
<form method="post">
|
||||||
{% for var in definition.vars %}
|
{{ form }}
|
||||||
<div>
|
|
||||||
<label for="{{ var.name }}"> {{ var.display_name }}:</label>
|
|
||||||
<input type="text" id="{{ var.name }}" name="{{ var.name }}"
|
|
||||||
|
|
||||||
{% if var.name == "week" %}
|
|
||||||
value = "{{ week }}"
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if var.name == "year" %}
|
|
||||||
value = "{{ year }}"
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if var.name == "start_date" %}
|
|
||||||
value = "{{ start_date|date:"d.m.Y" }}"
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if var.name == "end_date" %}
|
|
||||||
value = "{{ end_date|date:"d.m.Y" }}"
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if var.name == "num_doc" %}
|
|
||||||
value = "{{ current_num }}"
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if var.name == "name" %}
|
|
||||||
value = "{{ user.display_name }}"
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<button>Submit</button>
|
<button>Submit</button>
|
||||||
|
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.shortcuts import get_object_or_404, redirect, render
|
from django.shortcuts import get_object_or_404, redirect, render
|
||||||
|
|
||||||
from core.forms import extract_post_values
|
|
||||||
from core.report_templates import ReportTemplates
|
|
||||||
from core.util import get_week_range, next_date
|
from core.util import get_week_range, next_date
|
||||||
from .azure_auth import AzureUser
|
from .azure_auth import AzureUser
|
||||||
from .models import Berichtsheft
|
from .models import Berichtsheft
|
||||||
|
@ -22,38 +20,30 @@ def write_new_report(request):
|
||||||
def write_new_report_post(request):
|
def write_new_report_post(request):
|
||||||
user = AzureUser(request)
|
user = AzureUser(request)
|
||||||
|
|
||||||
definition = user.get_report_template()
|
report_form = user.get_report_kind_form(request.POST)
|
||||||
|
|
||||||
values = extract_post_values(request.POST, definition["vars"])
|
# TODO : Implement values
|
||||||
|
|
||||||
# TODO : Input Validation
|
current_year, current_week, _, _, current_num = get_current_report_values(
|
||||||
|
user.reports().order_by("-year", "-week").first()
|
||||||
|
)
|
||||||
|
|
||||||
report = Berichtsheft(
|
report = Berichtsheft(
|
||||||
user=user.id,
|
user=user.id,
|
||||||
num=int(values.pop("num_doc", "")),
|
kind=user.get_report_kind(),
|
||||||
year=int(values.pop("year", "")),
|
num=int(current_num),
|
||||||
week=int(values.pop("week", "")),
|
year=int(current_year),
|
||||||
content=values,
|
week=int(current_week),
|
||||||
|
department=report_form.cleaned_data["department"],
|
||||||
|
content=report_form.content_values(),
|
||||||
)
|
)
|
||||||
report.save()
|
report.save()
|
||||||
return redirect("/")
|
return redirect("/")
|
||||||
|
|
||||||
|
|
||||||
def write_new_report_get(request):
|
def get_current_report_values(latest):
|
||||||
user = AzureUser(request)
|
|
||||||
|
|
||||||
definition = user.get_report_template()
|
|
||||||
|
|
||||||
# Get the latest year and week
|
|
||||||
latest = user.reports().order_by("-year", "-week").first()
|
|
||||||
|
|
||||||
year_now, week_now, _ = datetime.datetime.today().isocalendar()
|
year_now, week_now, _ = datetime.datetime.today().isocalendar()
|
||||||
|
|
||||||
# Report for this week already exists
|
|
||||||
if latest is not None:
|
|
||||||
if latest.year == year_now and latest.week == week_now:
|
|
||||||
return redirect(f"/report/{latest.id}")
|
|
||||||
|
|
||||||
if latest is not None:
|
if latest is not None:
|
||||||
current_year, current_week = next_date(latest.year, latest.week)
|
current_year, current_week = next_date(latest.year, latest.week)
|
||||||
else:
|
else:
|
||||||
|
@ -66,8 +56,32 @@ def write_new_report_get(request):
|
||||||
else:
|
else:
|
||||||
current_num = 1
|
current_num = 1
|
||||||
|
|
||||||
|
return current_year, current_week, start_date, end_date, current_num
|
||||||
|
|
||||||
|
|
||||||
|
def write_new_report_get(request):
|
||||||
|
user = AzureUser(request)
|
||||||
|
|
||||||
|
report_kind = user.get_report_kind()
|
||||||
|
|
||||||
|
# Get the latest year and week
|
||||||
|
latest = user.reports().order_by("-year", "-week").first()
|
||||||
|
|
||||||
|
year_now, week_now, _ = datetime.datetime.today().isocalendar()
|
||||||
|
|
||||||
|
# Report for this week already exists
|
||||||
|
if latest is not None:
|
||||||
|
if latest.year == year_now and latest.week == week_now:
|
||||||
|
return redirect(f"/report/{latest.id}")
|
||||||
|
|
||||||
|
current_year, current_week, start_date, end_date, current_num = (
|
||||||
|
get_current_report_values(latest)
|
||||||
|
)
|
||||||
|
|
||||||
# TODO : Cookies for persistent saves
|
# TODO : Cookies for persistent saves
|
||||||
|
|
||||||
|
form = user.get_report_kind_form()
|
||||||
|
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
"write.html",
|
"write.html",
|
||||||
|
@ -78,7 +92,8 @@ def write_new_report_get(request):
|
||||||
"start_date": start_date,
|
"start_date": start_date,
|
||||||
"end_date": end_date,
|
"end_date": end_date,
|
||||||
"current_num": current_num,
|
"current_num": current_num,
|
||||||
"definition": definition,
|
"report_kind": report_kind,
|
||||||
|
"form": form,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -109,7 +124,3 @@ def report_detail_page(request, report_id):
|
||||||
return render(
|
return render(
|
||||||
request, "report.html", {"report": report, "approved": report.is_approved()}
|
request, "report.html", {"report": report, "approved": report.is_approved()}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def test(request):
|
|
||||||
return render(request, "test.html", {})
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue