Merge branch 'master' of edugit.org:enrichment-2024/qivip
This commit is contained in:
@@ -31,6 +31,7 @@ ALLOWED_HOSTS = ['127.0.0.1', 'localhost', '*']
|
|||||||
# Application definition
|
# Application definition
|
||||||
|
|
||||||
INSTALLED_APPS = [
|
INSTALLED_APPS = [
|
||||||
|
'library.apps.LibraryConfig',
|
||||||
'homepage.apps.HomepageConfig',
|
'homepage.apps.HomepageConfig',
|
||||||
'components.apps.ComponentsConfig',
|
'components.apps.ComponentsConfig',
|
||||||
'accounts.apps.AccountsConfig',
|
'accounts.apps.AccountsConfig',
|
||||||
|
|||||||
0
core/library/__init__.py
Normal file
0
core/library/__init__.py
Normal file
31
core/library/admin.py
Normal file
31
core/library/admin.py
Normal file
@@ -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)
|
||||||
6
core/library/apps.py
Normal file
6
core/library/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class LibraryConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'library'
|
||||||
60
core/library/migrations/0001_initial.py
Normal file
60
core/library/migrations/0001_initial.py
Normal file
@@ -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')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
0
core/library/migrations/__init__.py
Normal file
0
core/library/migrations/__init__.py
Normal file
55
core/library/models.py
Normal file
55
core/library/models.py
Normal file
@@ -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
|
||||||
15
core/library/templates/library/base.html
Normal file
15
core/library/templates/library/base.html
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{% load static %}
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link rel="stylesheet" href="{% static 'homepage/t-style.css' %}">
|
||||||
|
<title>qivip</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{% include 'homepage/partials/_nav.html' %}
|
||||||
|
{% block content%}{% endblock %}
|
||||||
|
{% include 'homepage/partials/_footer.html' %}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
3
core/library/tests.py
Normal file
3
core/library/tests.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
3
core/library/views.py
Normal file
3
core/library/views.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
# Create your views here.
|
||||||
Reference in New Issue
Block a user