diff --git a/core/core/settings.py b/core/core/settings.py index 4521f36..ec89534 100644 --- a/core/core/settings.py +++ b/core/core/settings.py @@ -31,6 +31,7 @@ ALLOWED_HOSTS = ['127.0.0.1', 'localhost', '*'] # Application definition INSTALLED_APPS = [ + 'library.apps.LibraryConfig', 'homepage.apps.HomepageConfig', 'components.apps.ComponentsConfig', 'accounts.apps.AccountsConfig', diff --git a/core/library/__init__.py b/core/library/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/library/admin.py b/core/library/admin.py new file mode 100644 index 0000000..14c0c5b --- /dev/null +++ b/core/library/admin.py @@ -0,0 +1,31 @@ +from django.contrib import admin +from .models import QivipQuiz, QivipQuestion, QuizCategory, Tag + +# Für das QivipQuiz Modell +class QivipQuizAdmin(admin.ModelAdmin): + list_display = ('name', 'user_id', 'status', 'category', 'creation_date', 'update_date') # Welche Felder sollen in der Übersicht angezeigt werden + search_fields = ('name', 'user_id__username', 'category__name') # Suchfelder + list_filter = ('status', 'category') # Filteroptionen + +# Für das QivipQuestion Modell +class QivipQuestionAdmin(admin.ModelAdmin): + list_display = ('quiz_id', 'data', 'creation_date', 'update_date') + search_fields = ('data',) + list_filter = ('quiz_id',) + +# Für das QuizCategory Modell +class QuizCategoryAdmin(admin.ModelAdmin): + list_display = ('name', 'slug', 'description') # Zeige Name, Slug und Beschreibung an + search_fields = ('name',) + prepopulated_fields = {'slug': ('name',)} # Erstelle automatisch den Slug basierend auf dem Namen + +# Für das Tag Modell +class TagAdmin(admin.ModelAdmin): + list_display = ('name',) # Zeige nur den Namen des Tags + search_fields = ('name',) + +# Registrierung der Modelle im Admin +admin.site.register(QivipQuiz, QivipQuizAdmin) +admin.site.register(QivipQuestion, QivipQuestionAdmin) +admin.site.register(QuizCategory, QuizCategoryAdmin) +admin.site.register(Tag, TagAdmin) diff --git a/core/library/apps.py b/core/library/apps.py new file mode 100644 index 0000000..c33ac9c --- /dev/null +++ b/core/library/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class LibraryConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'library' diff --git a/core/library/migrations/0001_initial.py b/core/library/migrations/0001_initial.py new file mode 100644 index 0000000..f00b60e --- /dev/null +++ b/core/library/migrations/0001_initial.py @@ -0,0 +1,60 @@ +# Generated by Django 5.1.6 on 2025-02-14 17:00 + +import django.db.models.deletion +import uuid +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='QuizCategory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100, unique=True)), + ('description', models.TextField(blank=True, null=True)), + ('slug', models.SlugField(blank=True, unique=True)), + ], + ), + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100, unique=True)), + ], + ), + migrations.CreateModel( + name='QivipQuiz', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('creation_date', models.DateTimeField(auto_now_add=True)), + ('update_date', models.DateTimeField(auto_now=True)), + ('status', models.CharField(choices=[('public', 'Öffentlich'), ('hidden', 'Versteckt'), ('private', 'Privat')], max_length=10)), + ('name', models.CharField(max_length=255)), + ('description', models.TextField(blank=True, null=True)), + ('user_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quiz', to=settings.AUTH_USER_MODEL)), + ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quiz', to='library.quizcategory')), + ('tags', models.ManyToManyField(blank=True, to='library.tag')), + ], + ), + migrations.CreateModel( + name='QivipQuestion', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('creation_date', models.DateTimeField(auto_now_add=True)), + ('update_date', models.DateTimeField(auto_now=True)), + ('data', models.TextField()), + ('quiz_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='question', to='library.qivipquiz')), + ], + ), + ] diff --git a/core/library/migrations/__init__.py b/core/library/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/library/models.py b/core/library/models.py new file mode 100644 index 0000000..837210b --- /dev/null +++ b/core/library/models.py @@ -0,0 +1,55 @@ +from django.db import models +from django.contrib.auth.models import User +from django.utils.text import slugify +import uuid + +class QivipQuiz(models.Model): + STATUS_VALUES = { + "public": "Öffentlich", + "hidden": "Versteckt", + "private": "Privat", + } + + uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) + user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quiz') + creation_date = models.DateTimeField(auto_now_add=True) + update_date = models.DateTimeField(auto_now=True) + status = models.CharField(max_length=10, choices=STATUS_VALUES.items()) + category = models.ForeignKey('QuizCategory', related_name='quiz', on_delete=models.CASCADE) + tags = models.ManyToManyField('Tag', blank=True) + name = models.CharField(max_length=255) + description = models.TextField(blank=True, null=True) + + def __str__(self): + return self.name + + +# Create your models here. +class QivipQuestion(models.Model): + uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) + quiz_id = models.ForeignKey(QivipQuiz, on_delete=models.CASCADE, related_name='question') + creation_date = models.DateTimeField(auto_now_add=True) + update_date = models.DateTimeField(auto_now=True) + data = models.TextField() + + def __str__(self): + return self.data[:50] + +class Tag(models.Model): + name = models.CharField(max_length=100, unique=True) + + def __str__(self): + return self.name + +class QuizCategory(models.Model): + name = models.CharField(max_length=100, unique=True) + description = models.TextField(blank=True, null=True) + slug = models.SlugField(unique=True, blank=True) + + def save(self, *args, **kwargs): + if not self.slug: + self.slug = slugify(self.name) + super().save(*args, **kwargs) + + def __str__(self): + return self.name \ No newline at end of file diff --git a/core/library/templates/library/base.html b/core/library/templates/library/base.html new file mode 100644 index 0000000..4dc5151 --- /dev/null +++ b/core/library/templates/library/base.html @@ -0,0 +1,15 @@ +{% load static %} + + + + + + + qivip + + + {% include 'homepage/partials/_nav.html' %} + {% block content%}{% endblock %} + {% include 'homepage/partials/_footer.html' %} + + \ No newline at end of file diff --git a/core/library/tests.py b/core/library/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/core/library/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/core/library/views.py b/core/library/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/core/library/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here.