Compare commits

...

23 Commits

Author SHA1 Message Date
266cf4dbba Merge branch 'master' of edugit.org:enrichment-2024/qivip 2025-03-08 15:16:19 +01:00
5a63584a17 Blue logout button 2025-03-08 15:16:17 +01:00
nik8
37ffbebc67 Registrierfehler behoben 2025-03-08 15:14:07 +01:00
9fdbaf7b23 Remove junk 'accounts/static' 2025-03-08 15:05:32 +01:00
e09410d38a Fixed Style 2025-03-08 14:59:24 +01:00
ben8
9e510fa090 Merge branch 'master' of edugit.org:enrichment-2024/qivip 2025-03-08 14:52:31 +01:00
ben8
c0ade602b5 feature #13 2025-03-08 14:52:27 +01:00
9e3317274f Merge branch 'master' of edugit.org:enrichment-2024/qivip 2025-03-08 14:48:56 +01:00
16f489c91b Footer Funktionen 2025-03-08 14:48:54 +01:00
Ben
fa260ee4ff Merge branch 'master' of edugit.org:enrichment-2024/qivip 2025-03-08 14:44:36 +01:00
Ben
cc6ace3798 Quiz Detail Seite verschönern 2025-03-08 14:36:38 +01:00
Ben
4d213db5c9 Quiz Detail Seite verschönern 2025-03-08 14:33:58 +01:00
ben8
44822b9a11 Merge branch 'master' of edugit.org:enrichment-2024/qivip 2025-03-08 13:46:52 +01:00
ben8
7a59998cff fix #7 2025-03-08 13:46:48 +01:00
nik8
83335fd07a mini Fabänderung 2025-03-08 13:44:20 +01:00
7113cc197f Add favicon 2025-03-08 13:14:59 +01:00
d8fcfeb0c0 Add favicon 2025-03-08 13:13:02 +01:00
ben8
31cc63250c Merge branch 'master' of edugit.org:enrichment-2024/qivip 2025-03-08 13:04:03 +01:00
ben8
53c2a13923 feature #4 2025-03-08 13:03:18 +01:00
4afeb40dca Merge branch '8-weiterleitung-zur-anmeldeseite-fixen' into 'master'
Resolve "Weiterleitung zur Anmeldeseite fixen"

Closes #8

See merge request enrichment-2024/qivip!2
2025-03-08 11:39:44 +00:00
27274582c5 Weiterleitung Bibliothek 2025-03-08 12:39:05 +01:00
7f4b2f2e87 Merge branch 'fix_2_Button_'Moderieren'' into 'master'
Replace button 'Eröffnen' with 'Moderieren'

See merge request enrichment-2024/qivip!1
2025-03-08 10:54:21 +00:00
d1ef6e0dd3 Replace button 'Eröffnen' with 'Moderieren' 2025-03-08 11:47:46 +01:00
34 changed files with 445 additions and 240 deletions

1
.gitignore vendored
View File

@@ -2,3 +2,4 @@ __pycache__
.venv .venv
db.sqlite3 db.sqlite3
tailwindcss.exe tailwindcss.exe
t-style.css

View File

@@ -1,21 +0,0 @@
/*color vars*/
:root {
--main_bg: #1e1e1e;
--main_text_color: #d3d3d3;
--main_color: #3399cc;
--hover_main_color: #3399ccb0;
}
body {
background-color: var(--main_bg);
color: var(--main_text_color);
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}

View File

@@ -1,128 +0,0 @@
.register_link {
color:var(--main_text_color);
background-color: #2e2e2e;
}
.register_button {
color:var(--main_text_color);
background-color: #2e2e2e;
border-radius: 5px;
border:none;
margin-top: 10px;
}
.login-container {
background-color: #2e2e2e;
padding: 30px;
border-radius: 15px;
width: 400px;
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.5);
text-align: center;
border: 2px solid var(--main_color);
}
.login-header {
color: var(--main_text_color);
font-size: 24px;
margin-bottom: 20px;
}
.input-group {
width: 350px;
margin-bottom: 15px;
display: flex;
flex-direction: column;
align-items: center;
padding-left: 25px;
padding-right: 25px;
}
.input-group input {
width: 100%;
padding: 10px;
border: 1px solid #555;
border-radius: 15px;
background-color: #4a4a4a;
color: var(--main_text_color);
outline: none;
transition: transform 0.2s ease;
}
.input-group input:focus {
transform: scale(1.06);
border-color: var(--main_color);
}
.login-button {
width: 50%;
padding: 13px;
background-color: var(--main_color);
color: var(--main_text_color);
border: none;
border-radius: 15px;
cursor: pointer;
transition: background-color 0.3s ease;
font-size: 20px;
font-weight: bold;
margin-top: 10px;
transition: transform 0.2s ease;
}
.login-button:hover {
background-color: var(--hover_main_color);
transform: scale(1.06);
}
.login-logo {
width: 400px;
height: auto;
margin-bottom: 20px;
display: flex;
justify-content: center;
align-items: center;
border-radius: 10px;
}
.login-logo-mobile {
width: 150px;
}
.login-container {
text-align: center;
}
/* MOBILE DEVICES */
@media (max-width: 768px) {
.login-container {
width: 250px;
padding: 10px;
}
.input-group {
width: 200px;
}
.login-logo {
display:none;
}
.login-button {
height: auto;
}
.login-form {
padding-bottom: 12px;
}
}
/* DESKTOP DEVICES*/
@media (min-width: 768px) {
.login-logo-mobile {
display: none;
}
}

View File

@@ -1,11 +1,25 @@
{% extends 'accounts/base.html'%} {% extends 'accounts/base.html'%}
{% block title %}Home{% endblock %} {% block title %}Home{% endblock %}
{% block content %} {% block content %}
<div class="max-w-screen-lg mx-auto mt-12">
<div class="input-group p-4 m-2 border-blue-600 border-2 rounded-xl shadow-md">
<div class="grid place-content-center h-120"> <div class="grid place-content-center h-120">
<h1 class="text-center m-4 text-6xl">Moin moin!</h1>
<h1 class="text-center m-4 text-3xl lg:text-6xl">Willkommen, <b>{{ request.user.username }}</b>!</h1>
<form action="{% url 'accounts:logout' %}" method="post"> <form action="{% url 'accounts:logout' %}" method="post">
{% csrf_token %} {% csrf_token %}
<button class="bg-red-600 text-white p-3 rounded-full font-black" type="submit">Abmelden</button> <button class="bg-blue-600 text-white p-3 rounded-full font-black" type="submit">Abmelden</button>
</form> </form>
</div> </div>
<div class="flex justify-end">
<span class="text-[clamp(0.6rem,5vw,1rem)] font-black overflow-x-auto mt-1 ml-0.75 text-blue-600 p-0.75 bg-white">qivip
</span>
</div>
</div>
</div>
{% endblock %} {% endblock %}

View File

@@ -2,12 +2,12 @@
{% load static %} {% load static %}
{% block title %}Anmeldung{% endblock %} {% block title %}Anmeldung{% endblock %}
{% block content %} {% block content %}
<div class="grid place-content-center h-120"> <div class="grid place-content-center h-120 mt-12 mb-12 ">
<div class="p-4 m-2 border-blue-600 border-2 rounded-xl shadow-md"> <div class="w-80 p-4 m-2 border-blue-600 border-2 rounded-xl shadow-md lg:w-90">
<h2 class="text-2xl text-center p-4 font-black">Anmeldung</h2> <h2 class="text-2xl text-center p-4 font-black">Anmeldung</h2>
<form class="space-y-4" method="post"> <form class="space-y-4" method="post">
{% if form.errors %} {% if form.errors %}
<div class="text-red-600 font-black overflow-x-auto break-words text-center"> <div class=" items-center text-red-600 font-black overflow-x-auto break-words text-center">
<ul> <ul>
{% for field, errors in form.errors.items %} {% for field, errors in form.errors.items %}
{% for error in errors %} {% for error in errors %}
@@ -18,11 +18,11 @@
</div> </div>
{% endif %} {% endif %}
{% csrf_token %} {% csrf_token %}
<div class=""> <div class="items-center w-full">
<input class="p-3 rounded-full bg-gray-200 focus:scale-105 transition duration-200 font-black" type="text" name="username" id="username" required placeholder="BENUTZERNAME"> <input class=" w-full p-3 rounded-full bg-gray-200 focus:scale-105 transition duration-200 font-black" type="text" name="username" id="username" required placeholder="BENUTZERNAME">
</div> </div>
<div class=""> <div class="items-center w-full">
<input class="p-3 rounded-full bg-gray-200 focus:scale-105 transition duration-200 font-black" type="password" name="password" id="password" required placeholder="PASSWORT"> <input class=" w-full p-3 rounded-full bg-gray-200 focus:scale-105 transition duration-200 font-black" type="password" name="password" id="password" required placeholder="PASSWORT">
</div> </div>
<button class="w-full p-3 rounded-full bg-blue-600 text-white font-black hover:scale-105 transition duration-200" type="submit" class="login-button">Anmelden</button> <button class="w-full p-3 rounded-full bg-blue-600 text-white font-black hover:scale-105 transition duration-200" type="submit" class="login-button">Anmelden</button>
</form> </form>

View File

@@ -1,8 +1,9 @@
{% extends 'accounts/base.html' %} {% extends 'accounts/base.html' %}
{% block title %}Registrierung{% endblock %} {% block title %}Registrierung{% endblock %}
{% block content %} {% block content %}
<div class="grid place-content-center h-120"> <div class="grid place-content-center h-120 mt-12 mb-12">
<div class=" p-4 m-2 border-blue-600 border-2 rounded-xl shadow-md">
<div class="w-80 p-4 m-2 border-blue-600 border-2 rounded-xl shadow-md lg:w-90">
<h2 class="text-2xl text-center p-4 font-black">Registrieren</h2> <h2 class="text-2xl text-center p-4 font-black">Registrieren</h2>
<form class=" space-y-4" method="post"> <form class=" space-y-4" method="post">

View File

@@ -127,4 +127,4 @@ BASE_DIR='static' #von ben8 hinzugefügt
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
LOGIN_URL = '/login/' LOGIN_URL = '/account/login/'

View File

@@ -7,7 +7,10 @@ nav div ul.qp-nav-list li {
a.qp-a-button { a.qp-a-button {
@apply p-6 rounded-md font-extrabold hover:scale-105 transition duration-300 shadow-md; @apply p-6 rounded-md font-extrabold hover:scale-105 transition duration-300 shadow-md;
} }
.register input{@apply p-3 rounded-full bg-gray-200 focus:scale-105 transition duration-200 font-black;} a.qp-a-button-small {
@apply p-1 rounded-md hover:scale-105 transition duration-300 shadow-md;
}
.register input{@apply p-3 rounded-full bg-gray-200 focus:scale-105 transition duration-200 font-black w-full;}
.input-group { .input-group {
@apply flex flex-col gap-4 max-w-md mx-auto p-6 bg-white rounded-xl shadow-lg; @apply flex flex-col gap-4 max-w-md mx-auto p-6 bg-white rounded-xl shadow-lg;

View File

@@ -1,11 +1,11 @@
/*! tailwindcss v4.0.9 | MIT License | https://tailwindcss.com */ /*! tailwindcss v4.0.12 | MIT License | https://tailwindcss.com */
@layer theme, base, components, utilities; @layer theme, base, components, utilities;
@layer theme { @layer theme {
:root, :host { :root, :host {
--font-sans: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
'Noto Color Emoji'; "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
monospace; "Courier New", monospace;
--color-red-500: oklch(0.637 0.237 25.331); --color-red-500: oklch(0.637 0.237 25.331);
--color-red-600: oklch(0.577 0.245 27.325); --color-red-600: oklch(0.577 0.245 27.325);
--color-yellow-500: oklch(0.795 0.184 86.047); --color-yellow-500: oklch(0.795 0.184 86.047);
@@ -34,6 +34,8 @@
--text-xl--line-height: calc(1.75 / 1.25); --text-xl--line-height: calc(1.75 / 1.25);
--text-2xl: 1.5rem; --text-2xl: 1.5rem;
--text-2xl--line-height: calc(2 / 1.5); --text-2xl--line-height: calc(2 / 1.5);
--text-3xl: 1.875rem;
--text-3xl--line-height: calc(2.25 / 1.875);
--text-6xl: 3.75rem; --text-6xl: 3.75rem;
--text-6xl--line-height: 1; --text-6xl--line-height: 1;
--text-8xl: 6rem; --text-8xl: 6rem;
@@ -52,10 +54,16 @@
--default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
--default-font-family: var(--font-sans); --default-font-family: var(--font-sans);
--default-font-feature-settings: var(--font-sans--font-feature-settings); --default-font-feature-settings: var(--font-sans--font-feature-settings);
--default-font-variation-settings: var(--font-sans--font-variation-settings); --default-font-variation-settings: var(
--font-sans--font-variation-settings
);
--default-mono-font-family: var(--font-mono); --default-mono-font-family: var(--font-mono);
--default-mono-font-feature-settings: var(--font-mono--font-feature-settings); --default-mono-font-feature-settings: var(
--default-mono-font-variation-settings: var(--font-mono--font-variation-settings); --font-mono--font-feature-settings
);
--default-mono-font-variation-settings: var(
--font-mono--font-variation-settings
);
} }
} }
@layer base { @layer base {
@@ -69,7 +77,7 @@
line-height: 1.5; line-height: 1.5;
-webkit-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;
tab-size: 4; tab-size: 4;
font-family: var( --default-font-family, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji' ); font-family: var( --default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" );
font-feature-settings: var(--default-font-feature-settings, normal); font-feature-settings: var(--default-font-feature-settings, normal);
font-variation-settings: var( --default-font-variation-settings, normal ); font-variation-settings: var( --default-font-variation-settings, normal );
-webkit-tap-highlight-color: transparent; -webkit-tap-highlight-color: transparent;
@@ -99,7 +107,7 @@
font-weight: bolder; font-weight: bolder;
} }
code, kbd, samp, pre { code, kbd, samp, pre {
font-family: var( --default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace ); font-family: var( --default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace );
font-feature-settings: var( --default-mono-font-feature-settings, normal ); font-feature-settings: var( --default-mono-font-feature-settings, normal );
font-variation-settings: var( --default-mono-font-variation-settings, normal ); font-variation-settings: var( --default-mono-font-variation-settings, normal );
font-size: 1em; font-size: 1em;
@@ -189,13 +197,13 @@
:-moz-ui-invalid { :-moz-ui-invalid {
box-shadow: none; box-shadow: none;
} }
button, input:where([type='button'], [type='reset'], [type='submit']), ::file-selector-button { button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button {
appearance: button; appearance: button;
} }
::-webkit-inner-spin-button, ::-webkit-outer-spin-button { ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {
height: auto; height: auto;
} }
[hidden]:where(:not([hidden='until-found'])) { [hidden]:where(:not([hidden="until-found"])) {
display: none !important; display: none !important;
} }
} }
@@ -239,6 +247,9 @@
.mx-auto { .mx-auto {
margin-inline: auto; margin-inline: auto;
} }
.my-8 {
margin-block: calc(var(--spacing) * 8);
}
.mt-1 { .mt-1 {
margin-top: calc(var(--spacing) * 1); margin-top: calc(var(--spacing) * 1);
} }
@@ -254,12 +265,18 @@
.mt-8 { .mt-8 {
margin-top: calc(var(--spacing) * 8); margin-top: calc(var(--spacing) * 8);
} }
.mt-12 {
margin-top: calc(var(--spacing) * 12);
}
.mr-0\.75 { .mr-0\.75 {
margin-right: calc(var(--spacing) * 0.75); margin-right: calc(var(--spacing) * 0.75);
} }
.mb-6 { .mb-6 {
margin-bottom: calc(var(--spacing) * 6); margin-bottom: calc(var(--spacing) * 6);
} }
.mb-12 {
margin-bottom: calc(var(--spacing) * 12);
}
.ml-0\.75 { .ml-0\.75 {
margin-left: calc(var(--spacing) * 0.75); margin-left: calc(var(--spacing) * 0.75);
} }
@@ -290,6 +307,9 @@
.h-full { .h-full {
height: 100%; height: 100%;
} }
.w-80 {
width: calc(var(--spacing) * 80);
}
.w-full { .w-full {
width: 100%; width: 100%;
} }
@@ -422,9 +442,6 @@
.bg-red-500 { .bg-red-500 {
background-color: var(--color-red-500); background-color: var(--color-red-500);
} }
.bg-red-600 {
background-color: var(--color-red-600);
}
.bg-white { .bg-white {
background-color: var(--color-white); background-color: var(--color-white);
} }
@@ -465,6 +482,10 @@
font-size: var(--text-2xl); font-size: var(--text-2xl);
line-height: var(--tw-leading, var(--text-2xl--line-height)); line-height: var(--tw-leading, var(--text-2xl--line-height));
} }
.text-3xl {
font-size: var(--text-3xl);
line-height: var(--tw-leading, var(--text-3xl--line-height));
}
.text-6xl { .text-6xl {
font-size: var(--text-6xl); font-size: var(--text-6xl);
line-height: var(--tw-leading, var(--text-6xl--line-height)); line-height: var(--tw-leading, var(--text-6xl--line-height));
@@ -545,9 +566,6 @@
--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
} }
.filter {
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
}
.transition { .transition {
transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter; transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter;
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
@@ -622,6 +640,11 @@
line-height: var(--tw-leading, var(--text-8xl--line-height)); line-height: var(--tw-leading, var(--text-8xl--line-height));
} }
} }
.lg\:w-90 {
@media (width >= 64rem) {
width: calc(var(--spacing) * 90);
}
}
.lg\:grid-cols-3 { .lg\:grid-cols-3 {
@media (width >= 64rem) { @media (width >= 64rem) {
grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-columns: repeat(3, minmax(0, 1fr));
@@ -632,6 +655,12 @@
padding-inline: calc(var(--spacing) * 8); padding-inline: calc(var(--spacing) * 8);
} }
} }
.lg\:text-6xl {
@media (width >= 64rem) {
font-size: var(--text-6xl);
line-height: var(--tw-leading, var(--text-6xl--line-height));
}
}
.dark\:bg-gray-900 { .dark\:bg-gray-900 {
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
background-color: var(--color-gray-900); background-color: var(--color-gray-900);
@@ -686,6 +715,25 @@ a.qp-a-button {
} }
} }
} }
a.qp-a-button-small {
border-radius: var(--radius-md);
padding: calc(var(--spacing) * 1);
--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter;
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
transition-duration: var(--tw-duration, var(--default-transition-duration));
--tw-duration: 300ms;
transition-duration: 300ms;
&:hover {
@media (hover: hover) {
--tw-scale-x: 105%;
--tw-scale-y: 105%;
--tw-scale-z: 105%;
scale: var(--tw-scale-x) var(--tw-scale-y);
}
}
}
.register input { .register input {
border-radius: calc(infinity * 1px); border-radius: calc(infinity * 1px);
background-color: var(--color-gray-200); background-color: var(--color-gray-200);
@@ -936,46 +984,6 @@ a.qp-a-button {
inherits: false; inherits: false;
initial-value: 0 0 #0000; initial-value: 0 0 #0000;
} }
@property --tw-blur {
syntax: "*";
inherits: false;
}
@property --tw-brightness {
syntax: "*";
inherits: false;
}
@property --tw-contrast {
syntax: "*";
inherits: false;
}
@property --tw-grayscale {
syntax: "*";
inherits: false;
}
@property --tw-hue-rotate {
syntax: "*";
inherits: false;
}
@property --tw-invert {
syntax: "*";
inherits: false;
}
@property --tw-opacity {
syntax: "*";
inherits: false;
}
@property --tw-saturate {
syntax: "*";
inherits: false;
}
@property --tw-sepia {
syntax: "*";
inherits: false;
}
@property --tw-drop-shadow {
syntax: "*";
inherits: false;
}
@property --tw-duration { @property --tw-duration {
syntax: "*"; syntax: "*";
inherits: false; inherits: false;

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -2,6 +2,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="de"> <html lang="de">
<head> <head>
<link rel="icon" type="image/png" href="{% static 'icons/favicon.png' %}">
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="{% static 'homepage/t-style.css' %}"> <link rel="stylesheet" href="{% static 'homepage/t-style.css' %}">

View File

@@ -8,7 +8,7 @@
</div> </div>
<div class="grid sm:grid-cols-3 place-items-stretch text-center mt-8 gap-4 p-4 border-3 bg-blue-100 border-blue-100 rounded-md"> <div class="grid sm:grid-cols-3 place-items-stretch text-center mt-8 gap-4 p-4 border-3 bg-blue-100 border-blue-100 rounded-md">
<a class="qp-a-button bg-green-500 text-white" href="#">Teilnehmen</a> <a class="qp-a-button bg-green-500 text-white" href="#">Teilnehmen</a>
<a class="qp-a-button bg-indigo-500 text-white" href="#">Eröffnen</a> <a class="qp-a-button bg-indigo-500 text-white" href="#">Moderieren</a>
<a class="qp-a-button bg-purple-500 text-white" href="#">Verwalten</a> <a class="qp-a-button bg-purple-500 text-white" href="#">Verwalten</a>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,34 @@
{% load static %}
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Impressum</title>
<link rel="icon" type="image/png" href="{% static 'icons/favicon.png' %}">
<link rel="stylesheet" href="{% static 'homepage/t-style.css' %}">
</head>
<body>
{% include 'homepage/partials/_nav.html' %}
<div class="max-w-screen-lg mx-auto">
{% block content%}{% endblock %}
</div>
<div>
<div>
<h1>Impressum</h1>
</div>
<div>
<dvi>
<p>
Katharineum zu Lübeck
</p>
<p>
Königsstraße 27-31
</p>
<p>
23552 Lübeck
</p>
</div>
{% include 'homepage/partials/_footer.html' %}
</body>
</html>

View File

@@ -1,7 +1,7 @@
<div class="grid place-content-center gap-2 w-full mt-4"> <div class="grid place-content-center gap-2 w-full mt-4">
<div class="flex space-x-2 pb-4"> <div class="flex space-x-2 pb-4">
<p class="text-sm font-extralight"><a href="#">Impressum</a></p> <p class="text-sm font-extralight"><a href="/impress">Impressum</a></p>
<p class="text-sm font-extralight"><a href="#">Datenschutz</a></p> <p class="text-sm font-extralight"><a href="/privacy">Datenschutz</a></p>
<p class="text-sm font-extralight"><a href="#">Repository</a></p> <p class="text-sm font-extralight"><a href="https://edugit.org/enrichment-2024/qivip">Repository</a></p>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,23 @@
{% load static %}
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Impressum</title>
<link rel="icon" type="image/png" href="{% static 'icons/favicon.png' %}">
<link rel="stylesheet" href="{% static 'homepage/t-style.css' %}">
</head>
<body>
{% include 'homepage/partials/_nav.html' %}
<div class="max-w-screen-lg mx-auto">
{% block content%}{% endblock %}
<div>
<p>
Hallo, ich bin die Datenschutzerklärung!
</p>
</div>
</div>
{% include 'homepage/partials/_footer.html' %}
</body>
</html>

View File

@@ -5,4 +5,6 @@ app_name = 'homepage' # Verhindert Konflikt mit anderen Apps
urlpatterns = [ urlpatterns = [
path('', views.home, name="home"), path('', views.home, name="home"),
path('impress', views.impress, name="impress"),
path('privacy', views.privacy, name="privacy"),
] ]

View File

@@ -2,3 +2,8 @@ from django.shortcuts import render, redirect
def home(request): def home(request):
return render(request, 'homepage/home.html') return render(request, 'homepage/home.html')
def impress(request):
return render(request, 'homepage/impress.html')
def privacy(request):
return render(request, 'homepage/privacy.html')

View File

@@ -4,7 +4,7 @@ from .models import QivipQuiz, QivipQuestion
class QuizForm(forms.ModelForm): class QuizForm(forms.ModelForm):
class Meta: class Meta:
model = QivipQuiz model = QivipQuiz
fields = ['name', 'description', 'status', 'category', 'tags'] fields = ['name', 'description', 'status', 'category', 'tags',"difficulty"]
class QuestionForm(forms.ModelForm): class QuestionForm(forms.ModelForm):
class Meta: class Meta:

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='status',
field=models.CharField(choices=[('public', 'Öffentlich'), ('hidden', 'Versteckt'), ('private', 'Privat')], default='private', max_length=10),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0002_alter_qivipquiz_status'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='status',
field=models.CharField(choices=[('public', 'Öffentlich'), ('hidden', 'Versteckt'), ('private', 'Privat')], default='Privat', max_length=10),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0003_alter_qivipquiz_status'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='status',
field=models.CharField(choices=[('public', 'Öffentlich'), ('hidden', 'Versteckt'), ('private', 'Privat')], default='private', max_length=10),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0004_alter_qivipquiz_status'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='status',
field=models.CharField(choices=[('public', 'Öffentlich'), ('hidden', 'Versteckt'), ('private', 'Privat')], default='public', max_length=10),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0005_alter_qivipquiz_status'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='description',
field=models.TextField(blank=True, default='In dem Quiz geht es um ...', null=True),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0006_alter_qivipquiz_description'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='description',
field=models.TextField(blank=True, default='Das Quiz ist ein ... Quiz. In dem Quiz geht es um ...', null=True),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0007_alter_qivipquiz_description'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='description',
field=models.TextField(blank=True, default='Das Quiz ist ein ... Quiz. \n In dem Quiz geht es um ...', null=True),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0008_alter_qivipquiz_description'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='description',
field=models.TextField(blank=True, default='Das Quiz ist ein ... Quiz. \nIn dem Quiz geht es um ...', null=True),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0009_alter_qivipquiz_description'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='description',
field=models.TextField(blank=True, default='In dem Quiz geht es um ...', null=True),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0010_alter_qivipquiz_description'),
]
operations = [
migrations.AddField(
model_name='qivipquiz',
name='difficulty',
field=models.CharField(choices=[('public', 'Öffentlich'), ('hidden', 'Versteckt'), ('private', 'Privat')], default='public', max_length=10),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:39
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0011_qivipquiz_difficulty'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='difficulty',
field=models.CharField(choices=[('public', 'Öffentlich'), ('hidden', 'Versteckt'), ('private', 'Privat')], default='not defined', max_length=10),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0012_alter_qivipquiz_difficulty'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='difficulty',
field=models.CharField(choices=[('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('not defined', 'nicht gesetzt')], default='not defined', max_length=11),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0013_alter_qivipquiz_difficulty'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='difficulty',
field=models.CharField(choices=[('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('not defined', 'nicht gesetzt')], default='not defined', help_text='1: niedrigste Schwierigkeit, 2: höchste Schwierigkeit', max_length=11),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.3 on 2025-03-08 13:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0014_alter_qivipquiz_difficulty'),
]
operations = [
migrations.AlterField(
model_name='qivipquiz',
name='difficulty',
field=models.CharField(choices=[('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('not defined', 'nicht gesetzt')], default='not defined', help_text='1: niedrigste Schwierigkeit und 5: höchste Schwierigkeit', max_length=11),
),
]

View File

@@ -9,16 +9,26 @@ class QivipQuiz(models.Model):
"hidden": "Versteckt", "hidden": "Versteckt",
"private": "Privat", "private": "Privat",
} }
DIFFICULTY_VALUES = {
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"not defined":"nicht gesetzt",
}
uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quiz') user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quiz')
creation_date = models.DateTimeField(auto_now_add=True) creation_date = models.DateTimeField(auto_now_add=True)
update_date = models.DateTimeField(auto_now=True) update_date = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10, choices=STATUS_VALUES.items()) status = models.CharField(max_length=10, choices=list(STATUS_VALUES.items()), default="public")
category = models.ForeignKey('QuizCategory', related_name='quiz', on_delete=models.CASCADE) category = models.ForeignKey('QuizCategory', related_name='quiz', on_delete=models.CASCADE)
tags = models.ManyToManyField('Tag', blank=True) tags = models.ManyToManyField('Tag', blank=True)
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True) description = models.TextField(blank=True, null=True, default="In dem Quiz geht es um ...")
difficulty= models.CharField(max_length=11, choices=list(DIFFICULTY_VALUES.items()), default="not defined", help_text="1: niedrigste Schwierigkeit und 5: höchste Schwierigkeit")
def __str__(self): def __str__(self):
return self.name return self.name

View File

@@ -9,10 +9,10 @@
{% for quiz in quizzes %} {% for quiz in quizzes %}
<div class="bg-white rounded-lg p-4 shadow-md"> <div class="bg-white rounded-lg p-4 shadow-md">
<h2 class="text-lg font-bold"><a href="{% url 'library:detail_quiz' quiz.id %}">{{ quiz.name }}</a></h2> <h2 class="text-lg font-bold"><a href="{% url 'library:detail_quiz' quiz.id %}">{{ quiz.name }}</a></h2>
<p class="text-sm text-gray-600">{{ quiz.description }}</p> <p class="text-sm text-gray-600 my-8">{{ quiz.description }}</p>
<a href="#">Spiel starten</a> <a href="#"class="qp-a-button-small bg-green-500">Spiel starten</a>
<a href="{% url 'library:edit_quiz' quiz.id %}">Bearbeiten</a> <button><a href="{% url 'library:edit_quiz' quiz.id %}"class="qp-a-button-small bg-indigo-500">Bearbeiten</a></button>
<a href="{% url 'library:delete_quiz' quiz.id %}">Löschen</a> <a href="{% url 'library:delete_quiz' quiz.id %}" class="qp-a-button-small bg-purple-500">Löschen</a>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>