diff --git a/tin/apps/assignments/admin.py b/tin/apps/assignments/admin.py index 3d4a62f6..4d1ab169 100644 --- a/tin/apps/assignments/admin.py +++ b/tin/apps/assignments/admin.py @@ -145,5 +145,5 @@ def match(self, obj): @admin.register(SubmissionCap) class SubmissionCapAdmin(admin.ModelAdmin): - list_display = ("assignment", "submission_cap", "student") + list_display = ("assignment", "submission_cap", "submission_cap_after_due", "student") save_as = True diff --git a/tin/apps/assignments/forms.py b/tin/apps/assignments/forms.py index 69fa8cfd..5f68b288 100644 --- a/tin/apps/assignments/forms.py +++ b/tin/apps/assignments/forms.py @@ -30,6 +30,11 @@ def __init__(self, course, *args, **kwargs): "issues." ) + cap = instance.submission_caps.filter(student__isnull=True).first() + if cap is not None: + self.fields["submission_cap"].initial = cap.submission_cap + self.fields["submission_cap_after_due"].initial = cap.submission_cap_after_due + # prevent description from getting too big self.fields["description"].widget.attrs.update({"id": "description"}) @@ -266,13 +271,6 @@ class Meta: class SubmissionCapForm(forms.ModelForm): - def __init__(self, **kwargs) -> None: - super().__init__(**kwargs) - - nonrequired = ("submission_cap", "submission_cap_after_due") - for f in nonrequired: - self.fields[f].required = False - class Meta: model = SubmissionCap fields = ["submission_cap", "submission_cap_after_due"] diff --git a/tin/apps/assignments/migrations/0033_submissioncap_submissioncap_unique_type_and_more.py b/tin/apps/assignments/migrations/0033_submissioncap_submissioncap_unique_type_and_more.py index 794473ca..a74a0e37 100644 --- a/tin/apps/assignments/migrations/0033_submissioncap_submissioncap_unique_type_and_more.py +++ b/tin/apps/assignments/migrations/0033_submissioncap_submissioncap_unique_type_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.16 on 2025-01-10 01:57 +# Generated by Django 4.2.15 on 2025-02-21 01:04 from django.conf import settings import django.core.validators @@ -18,10 +18,10 @@ class Migration(migrations.Migration): name='SubmissionCap', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('submission_cap', models.PositiveSmallIntegerField(null=True, validators=[django.core.validators.MinValueValidator(1)])), - ('submission_cap_after_due', models.PositiveSmallIntegerField(null=True)), + ('submission_cap', models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(1)])), + ('submission_cap_after_due', models.PositiveSmallIntegerField(blank=True, null=True)), ('assignment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submission_caps', to='assignments.assignment')), - ('student', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('student', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.AddConstraint( diff --git a/tin/apps/assignments/models.py b/tin/apps/assignments/models.py index 6c164cf8..ef9c5671 100644 --- a/tin/apps/assignments/models.py +++ b/tin/apps/assignments/models.py @@ -434,6 +434,7 @@ class SubmissionCap(models.Model): settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, + blank=True, ) assignment = models.ForeignKey( @@ -442,8 +443,12 @@ class SubmissionCap(models.Model): related_name="submission_caps", ) - submission_cap = models.PositiveSmallIntegerField(null=True, validators=[MinValueValidator(1)]) - submission_cap_after_due = models.PositiveSmallIntegerField(null=True) + submission_cap = models.PositiveSmallIntegerField( + null=True, + blank=True, + validators=[MinValueValidator(1)], + ) + submission_cap_after_due = models.PositiveSmallIntegerField(null=True, blank=True) class Meta: constraints = [ diff --git a/tin/apps/assignments/views.py b/tin/apps/assignments/views.py index 37ddf927..1e245249 100644 --- a/tin/apps/assignments/views.py +++ b/tin/apps/assignments/views.py @@ -556,6 +556,10 @@ def student_submissions_view(request, assignment_id, student_id): else None ) + submission_cap = cap.calculate_submission_cap() if cap is not None else None + if submission_cap == float("inf"): + submission_cap = None + return render( request, "assignments/student_submissions.html", @@ -569,6 +573,7 @@ def student_submissions_view(request, assignment_id, student_id): "published_submission": published_submission, "log_messages": log_messages, "form": form, + "submission_cap": submission_cap, }, ) diff --git a/tin/templates/assignments/student_submissions.html b/tin/templates/assignments/student_submissions.html index aecdc3e6..06d1ce15 100644 --- a/tin/templates/assignments/student_submissions.html +++ b/tin/templates/assignments/student_submissions.html @@ -113,7 +113,14 @@

All Submissions

Edit Submission Cap - To change the submission cap for this student, enter a new cap below. +

+ To change the submission cap for this student, enter a new cap below. +
+ {% with sub_count=submissions.count %} + This student has {{ sub_count }} {% if cap is not None %} / {{ cap }} {% endif %} + submission{{ sub_count|pluralize }} on this assignment. + {% endwith %} +

{% csrf_token %} {{ form.errors }}