Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
ab9fef9
feat: add SharedFolder model
WiktorGruszczynski Feb 8, 2026
01cfd17
feat: add library endpoints
WiktorGruszczynski Feb 8, 2026
5cd1571
feat: add tests
WiktorGruszczynski Feb 8, 2026
149b73e
fix: optimize code
WiktorGruszczynski Feb 8, 2026
59c3f12
Merge remote-tracking branch 'origin/feat/117-quiz-library-endpoint' …
DominikDab341 Feb 20, 2026
e8d66f8
refactor: Library endpoints logic
DominikDab341 Feb 20, 2026
bcb8ffd
feat: add root folder per user, rename maintainer to creator
DominikDab341 Feb 20, 2026
9ea2115
tests: add folder architecture tests and fix bugs
DominikDab341 Feb 20, 2026
7355210
tests: add folder crud tests
DominikDab341 Feb 20, 2026
309b4f9
fix: resolve User delete problem and update tests
DominikDab341 Feb 21, 2026
8ed69ef
refactor: change quiz edit permissions from creator to folder owner
DominikDab341 Mar 1, 2026
53bf45a
fix: protect root folder is from being moved and split folder tests
DominikDab341 Mar 3, 2026
ac52c07
refacor: squash selected quizz migrations
DominikDab341 Mar 3, 2026
a474c96
fix: LastUsedQuizzesView queryset
DominikDab341 Mar 3, 2026
50bb035
Merge branch 'master' into feat/155-change-of-folder-architecture
DominikDab341 Mar 3, 2026
d0b99a5
fix: resolve merge conflicts and update question tests
DominikDab341 Mar 3, 2026
0280aad
chore: trigger tests
DominikDab341 Mar 4, 2026
ac0398a
refactor: create new folders inside users root folder
DominikDab341 Mar 8, 2026
178bc9d
fix: incorporating Copilot suggestions
DominikDab341 Mar 8, 2026
3a51491
Merge branch 'dev' into feat/155-change-of-folder-architecture
DominikDab341 Mar 8, 2026
6bd2239
fix: Adjust tests from dev to current branch
DominikDab341 Mar 8, 2026
d859a02
fix: Resolve conflicts
DominikDab341 Mar 10, 2026
0a873aa
Potential fix for pull request finding 'Variable defined multiple times'
DominikDab341 Mar 10, 2026
b68815d
feat: add folder creation validation and change sharing logic
DominikDab341 Mar 18, 2026
1861ea3
Merge branch 'feat/155-change-of-folder-architecture' of https://gith…
DominikDab341 Mar 18, 2026
ce8e68f
Merge branch 'dev' into feat/155-change-of-folder-architecture
DominikDab341 Mar 22, 2026
4a10763
chore: merge migrations
DominikDab341 Mar 22, 2026
952408d
refactor: change maintainer to creator
DominikDab341 Mar 23, 2026
673f229
Merge branch 'dev' into feat/155-change-of-folder-architecture
DominikDab341 Mar 30, 2026
d0a60e1
refactor: address PR review feedback
DominikDab341 Mar 30, 2026
808496d
refactor: address PR review feedback
DominikDab341 Apr 1, 2026
40ad3a4
Potential fix for pull request finding 'Explicit returns mixed with i…
DominikDab341 Apr 1, 2026
1903f06
refactor: address copilot review feedback
DominikDab341 Apr 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 0 additions & 68 deletions id_to_uuid_script.py

This file was deleted.

12 changes: 6 additions & 6 deletions quizzes/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ def render_change_form(self, request, context, add=False, change=False, form_url

list_display = [
"title",
"maintainer",
"creator",
"visibility",
"is_anonymous",
"version",
Expand All @@ -118,13 +118,13 @@ def render_change_form(self, request, context, add=False, change=False, form_url
search_fields = [
"title",
"description",
"maintainer__first_name",
"maintainer__last_name",
"maintainer__email",
"maintainer__student_number",
"creator__first_name",
"creator__last_name",
"creator__email",
"creator__student_number",
]
readonly_fields = ["version", "created_at", "updated_at", "view_questions_link", "view_sessions_link"]
autocomplete_fields = ["maintainer", "folder"]
autocomplete_fields = ["creator", "folder"]
date_hierarchy = "created_at"

def view_questions_link(self, obj):
Expand Down
5 changes: 5 additions & 0 deletions quizzes/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,8 @@
class QuizzesConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "quizzes"

def ready(self):
from .signals import register_signals

register_signals()
56 changes: 46 additions & 10 deletions quizzes/migrations/0004_folder_quiz_folder.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,67 @@
# Generated by Django 6.0 on 2025-12-26 14:18

import uuid

import django.db.models.deletion
import django.utils.timezone
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('quizzes', '0003_sharedquiz_allow_edit'),
("quizzes", "0003_sharedquiz_allow_edit"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name='Folder',
name="Folder",
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('name', models.CharField(max_length=128)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='folders', to=settings.AUTH_USER_MODEL)),
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
("name", models.CharField(max_length=128)),
(
"created_at",
models.DateTimeField(
auto_now_add=True, default=django.utils.timezone.now
),
),
("updated_at", models.DateTimeField(auto_now=True)),
(
"owner",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="folders",
to=settings.AUTH_USER_MODEL,
),
),
(
"parent",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to="quizzes.folder",
),
),
],
),
migrations.AddField(
model_name='quiz',
name='folder',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='quizzes', to='quizzes.folder'),
model_name="quiz",
name="folder",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="quizzes",
to="quizzes.folder",
),
),
]
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# Generated by Django 6.0 on 2025-12-29 20:16
# Originally: rename user->owner, add created_at, updated_at
# These changes were squashed into 0004_folder_quiz_folder on this branch.
# This migration is kept as a no-op for backwards compatibility with
# environments that already applied it.

import django.utils.timezone
from django.db import migrations, models
from django.db import migrations


class Migration(migrations.Migration):
Expand All @@ -10,21 +12,4 @@ class Migration(migrations.Migration):
('quizzes', '0004_folder_quiz_folder'),
]

operations = [
migrations.RenameField(
model_name='folder',
old_name='user',
new_name='owner',
),
migrations.AddField(
model_name='folder',
name='created_at',
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
preserve_default=False,
),
migrations.AddField(
model_name='folder',
name='updated_at',
field=models.DateTimeField(auto_now=True),
),
]
operations = []
16 changes: 6 additions & 10 deletions quizzes/migrations/0006_folder_parent.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# Generated by Django 6.0 on 2025-12-31 13:00
# Originally: add parent field to Folder
# This change was squashed into 0004_folder_quiz_folder on this branch.
# This migration is kept as a no-op for backwards compatibility with
# environments that already applied it.

import django.db.models.deletion
from django.db import migrations, models
from django.db import migrations


class Migration(migrations.Migration):
Expand All @@ -10,10 +12,4 @@ class Migration(migrations.Migration):
('quizzes', '0005_rename_user_folder_owner_folder_created_at_and_more'),
]

operations = [
migrations.AddField(
model_name='folder',
name='parent',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='quizzes.folder'),
),
]
operations = []
75 changes: 75 additions & 0 deletions quizzes/migrations/0023_folder_architecture.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import uuid

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


def create_root_folders(apps, schema_editor):
User = apps.get_model("users", "User")
Folder = apps.get_model("quizzes", "Folder")
Quiz = apps.get_model("quizzes", "Quiz")

for user in User.objects.all().iterator():
if user.root_folder_id:
folder = Folder.objects.get(pk=user.root_folder_id)
else:
folder = Folder.objects.create(
id=uuid.uuid4(),
name="Moje quizy",
owner=user,
parent=None,
)
User.objects.filter(pk=user.pk).update(root_folder=folder)
Quiz.objects.filter(creator=user, folder__isnull=True).update(folder=folder)


class Migration(migrations.Migration):

dependencies = [
("quizzes", "0022_question_is_markdown_enabled"),
("users", "0009_user_root_folder"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name="SharedFolder",
fields=[
("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
("allow_edit", models.BooleanField(default=False)),
("folder", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="shares", to="quizzes.folder")),
("study_group", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="shared_folders", to="users.studygroup")),
("user", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="shared_folders", to=settings.AUTH_USER_MODEL)),
],
),
migrations.RenameField(
model_name="quiz",
old_name="maintainer",
new_name="creator",
),
migrations.AlterField(
model_name="quiz",
name="creator",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="created_quizzes",
to=settings.AUTH_USER_MODEL,
),
),
migrations.RunPython(create_root_folders, migrations.RunPython.noop),
migrations.AlterField(
model_name="quiz",
name="folder",
field=models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
related_name="quizzes",
to="quizzes.folder",
),
),
migrations.AlterField(
model_name="folder",
name="created_at",
field=models.DateTimeField(auto_now_add=True),
),
]
28 changes: 28 additions & 0 deletions quizzes/migrations/0024_sharedfolder_constraints.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated by Django 6.0.1 on 2026-04-02 10:37

from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('quizzes', '0023_folder_architecture'),
('users', '0009_user_root_folder'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.AddConstraint(
model_name='sharedfolder',
constraint=models.CheckConstraint(condition=models.Q(models.Q(('study_group__isnull', True), ('user__isnull', False)), models.Q(('study_group__isnull', False), ('user__isnull', True)), _connector='OR'), name='sharedfolder_exactly_one_target'),
),
migrations.AddConstraint(
model_name='sharedfolder',
constraint=models.UniqueConstraint(fields=('folder', 'user'), name='unique_sharedfolder_folder_user'),
),
migrations.AddConstraint(
model_name='sharedfolder',
constraint=models.UniqueConstraint(fields=('folder', 'study_group'), name='unique_sharedfolder_folder_study_group'),
),
]
Loading
Loading