Skip to content

Commit

Permalink
Allow to prohibit submissions to a task for selected users
Browse files Browse the repository at this point in the history
  • Loading branch information
hannesbraun committed Jan 30, 2025
1 parent a1ab07f commit af4c9b9
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 2 deletions.
9 changes: 7 additions & 2 deletions src/tasks/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.urls import reverse
from django.utils.html import format_html

from tasks.models import Task, MediaFile, HtmlInjector, DeadlineExtension
from tasks.models import Task, MediaFile, HtmlInjector, SubmissionBlacklistEntry, DeadlineExtension
from solutions.models import Solution, SolutionFile
from attestation.admin import RatingAdminInline

Expand All @@ -25,6 +25,11 @@ class HtmlInjectorInline(admin.StackedInline):
model = HtmlInjector
extra = 0

class SubmissionBlacklistInline(admin.TabularInline):
model = SubmissionBlacklistEntry
verbose_name_plural = "Submission Blacklist Entries"
extra = 0

class DeadlineExtensionInline(admin.TabularInline):
model = DeadlineExtension
extra = 0
Expand Down Expand Up @@ -54,7 +59,7 @@ class TaskAdmin(admin.ModelAdmin):
date_hierarchy = 'publication_date'
save_on_top = True

inlines = [DeadlineExtensionInline] + [MediaInline] + [HtmlInjectorInline] + CheckerInline.__subclasses__() + [ RatingAdminInline]
inlines = [SubmissionBlacklistInline] + [DeadlineExtensionInline] + [MediaInline] + [HtmlInjectorInline] + CheckerInline.__subclasses__() + [ RatingAdminInline]
actions = ['export_tasks', 'run_all_checkers', 'run_all_checkers_on_finals', 'run_all_checkers_on_latest_only_failed', 'check_unchecked_final_solutions', 'delete_attestations', 'unset_all_checker_finished', 'run_all_uploadtime_checkers_on_all']

class Media:
Expand Down
23 changes: 23 additions & 0 deletions src/tasks/migrations/0019_submissionblacklistentry.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 5.1.2 on 2025-01-30 01:53

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


class Migration(migrations.Migration):

dependencies = [
('accounts', '0008_accept_disclaimer'),
('tasks', '0018_task_custom_id'),
]

operations = [
migrations.CreateModel(
name='SubmissionBlacklistEntry',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tasks.task')),
('user', models.ForeignKey(limit_choices_to={'groups__name': 'User'}, on_delete=django.db.models.deletion.CASCADE, to='accounts.user')),
],
),
]
7 changes: 7 additions & 0 deletions src/tasks/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ def expired(self):

def expired_for_user(self, user):
"""returns whether the task has expired for a certain user"""
if SubmissionBlacklistEntry.objects.filter(task=self, user=user).exists():
return True
for deadline_extension in DeadlineExtension.objects.filter(task=self, user=user):
return deadline_extension.timestamp + get_settings().deadline_tolerance < datetime.now()
return self.expired()
Expand Down Expand Up @@ -419,6 +421,11 @@ class HtmlInjector(models.Model):
html_file = DeletingFileField(upload_to=get_htmlinjectorfile_storage_path, max_length=500)


class SubmissionBlacklistEntry(models.Model):
task = models.ForeignKey(Task, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE, limit_choices_to={"groups__name": "User"})


class DeadlineExtension(models.Model):
task = models.ForeignKey(Task, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE, limit_choices_to={"groups__name": "User"})
Expand Down

0 comments on commit af4c9b9

Please sign in to comment.