Skip to content

Commit

Permalink
Simplify UI
Browse files Browse the repository at this point in the history
  • Loading branch information
JasonGrace2282 committed Jan 11, 2025
1 parent 88895da commit 6b79415
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 196 deletions.
51 changes: 26 additions & 25 deletions tin/apps/assignments/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
class AssignmentForm(forms.ModelForm):
due = forms.DateTimeInput()

submission_cap = forms.IntegerField(min_value=1)
submission_cap_after_due = forms.IntegerField(min_value=1, required=False)

def __init__(self, course, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["folder"].queryset = Folder.objects.filter(course=course)
Expand Down Expand Up @@ -136,6 +139,8 @@ class Meta:
"submission_limit_count",
"submission_limit_interval",
"submission_limit_cooldown",
"submission_cap",
"submission_cap_after_due",
),
"collapsed": True,
},
Expand All @@ -152,7 +157,8 @@ class Meta:
"seconds). This is not recommended unless necessary.",
"use_submission_cap": "This enables setting a limit on the number of submissions that can be made on assignments."
"It has no effect on quizzes",
"submission_cap": "The maximum number of submissions that can be made. It can be overridden on a per-student basis.",
"submission_cap": "The maximum number of submissions that can be made, or empty for unlimited.",
"submission_cap_after_due": "The maximum number of submissions that can be made after the due date, or empty for unlimited.",
"submission_limit_count": "",
"submission_limit_interval": "Tin sets rate limits on submissions. If a student tries "
"to submit too many submissions in a given interval, "
Expand Down Expand Up @@ -183,6 +189,21 @@ class Meta:
def __str__(self) -> str:
return f"AssignmentForm(\"{self['name'].value()}\")"

def save(self, **kwargs) -> Assignment:
assignment = super().save(**kwargs)
sub_cap = self.cleaned_data.get("submission_cap")
sub_cap_after_due = self.cleaned_data.get("submission_cap_after_due")
if sub_cap is not None or sub_cap_after_due is not None:
SubmissionCap.objects.update_or_create(
assignment=assignment,
student=None,
defaults={
"submission_cap": sub_cap,
"submission_cap_after_due": sub_cap_after_due,
},
)
return assignment


class GraderScriptUploadForm(forms.Form):
grader_file = forms.FileField(
Expand Down Expand Up @@ -247,38 +268,18 @@ class Meta:


class SubmissionCapForm(forms.ModelForm):
def __init__(self, assignment: Assignment, **kwargs) -> None:
def __init__(self, **kwargs) -> None:
super().__init__(**kwargs)

nonrequired = ("student", "submission_cap", "submission_cap_after_due")
nonrequired = ("submission_cap", "submission_cap_after_due")
for f in nonrequired:
self.fields[f].required = False

self._assignment = assignment

class Meta:
model = SubmissionCap
fields = ["submission_cap", "submission_cap_after_due", "student"]
fields = ["submission_cap", "submission_cap_after_due"]
help_texts = {
"submission_cap_after_due": "The submission cap after the due date (or empty for unlimited)",
"student": (
"The student to apply the cap to, or leave empty to apply to all students."
),
"student": "The student to apply the cap to.",
}
labels = {"submission_cap_after_due": "Submission cap after due date"}

# In Django 5.0+, this should be handled by django
# with the nulls_distinct=False argument to the student UniqueConstraint
def clean_student(self):
student = self.cleaned_data["student"]
if student is not None:
return student
default_cap = self._assignment.submission_caps.filter(student__isnull=True).first()
if default_cap is None:
return student

if self.instance.id != default_cap.id:
raise forms.ValidationError(
"To edit the submission cap for all students please use the existing default submission cap."
)
return student
11 changes: 0 additions & 11 deletions tin/apps/assignments/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,6 @@
path("<int:assignment_id>/delete", views.delete_view, name="delete"),
path("<int:assignment_id>/grader", views.manage_grader_view, name="manage_grader"),
path("<int:assignment_id>/grader/download", views.download_grader_view, name="download_grader"),
path("<int:assignment_id>/submission-cap", views.choose_submission_cap, name="submission_cap"),
path(
"<int:assignment_id>/submission-cap/create",
views.create_submission_cap,
name="create_submission_cap",
),
path(
"<int:assignment_id>/submission-cap/<int:submission_cap_id>",
views.create_submission_cap,
name="edit_submission_cap",
),
path("<int:assignment_id>/files", views.manage_files_view, name="manage_files"),
path(
"<int:assignment_id>/files/download/<int:file_id>",
Expand Down
51 changes: 10 additions & 41 deletions tin/apps/assignments/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,47 +301,6 @@ def delete_view(request, assignment_id):
return redirect(reverse("courses:show", args=(course.id,)))


@teacher_or_superuser_required
def choose_submission_cap(request, assignment_id):
assignment = get_object_or_404(Assignment, id=assignment_id)
caps = assignment.submission_caps.all()
return render(
request,
"assignments/choose_submission_cap.html",
{"assignment": assignment, "caps": caps},
)


@teacher_or_superuser_required
def create_submission_cap(request, assignment_id, submission_cap_id: int | None = None):
assignment = get_object_or_404(
Assignment.objects.prefetch_related("course__students"),
id=assignment_id,
)
cap = (
get_object_or_404(assignment.submission_caps, id=submission_cap_id)
if submission_cap_id is not None
else None
)

form = SubmissionCapForm(assignment, instance=cap)
if request.method == "POST":
form = SubmissionCapForm(assignment, data=request.POST, instance=cap)
if form.is_valid():
form.instance.assignment = assignment
form.save()
return redirect("assignments:show", assignment_id)
return render(
request,
"assignments/edit_create_submission_cap.html",
{
"form": form,
"assignment": assignment,
"cap": cap,
},
)


@teacher_or_superuser_required
def manage_grader_view(request, assignment_id):
"""Uploads a grader for an assignment
Expand Down Expand Up @@ -559,6 +518,15 @@ def student_submissions_view(request, assignment_id, student_id):
)
student = get_object_or_404(User, id=student_id)

cap = assignment.submission_caps.filter(student=student).first()
form = SubmissionCapForm(instance=cap)
if request.method == "POST":
form = SubmissionCapForm(data=request.POST, instance=cap)
if form.is_valid():
form.instance.assignment = assignment
form.instance.student = student
form.save()

submissions = Submission.objects.filter(student=student, assignment=assignment)
publishes = PublishedSubmission.objects.filter(student=student, assignment=assignment)
latest_submission = submissions.latest() if submissions else None
Expand All @@ -582,6 +550,7 @@ def student_submissions_view(request, assignment_id, student_id):
"latest_submission": latest_submission,
"published_submission": published_submission,
"log_messages": log_messages,
"form": form,
},
)

Expand Down
87 changes: 0 additions & 87 deletions tin/templates/assignments/choose_submission_cap.html

This file was deleted.

31 changes: 0 additions & 31 deletions tin/templates/assignments/edit_create_submission_cap.html

This file was deleted.

1 change: 0 additions & 1 deletion tin/templates/assignments/show.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ <h2 class="left">{% if assignment.is_quiz %}[QUIZ] {% endif %}{{ assignment.name
<a class="right tin-btn" href="{% url 'assignments:manage_grader' assignment.id %}" style="color:#EF1010;">Upload grader</a>
{% endif %}
<a class="right tin-btn" href="{% url 'assignments:manage_files' assignment.id %}">Manage files</a>
<a class="right tin-btn" href="{% url 'assignments:submission_cap' assignment.id %}">Submission cap</a>
{% if log_file_exists %}
<a class="right tin-btn" href="{% url 'assignments:download_log' assignment.id %}">Download log</a>
{% endif %}
Expand Down
25 changes: 25 additions & 0 deletions tin/templates/assignments/student_submissions.html
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,29 @@ <h2 style="border-top:1px solid lightgray;padding-top:15px;">All Submissions</h2
{% endif %}
</table>


<h2>Edit Submission Cap</h2>
To change the submission cap for this student, enter a new cap below.
<form method="POST">
{% csrf_token %}
{{ form.errors }}
<div class="tbl">
{% for field in form.visible_fields %}
<div class="tbl-row">
<span class="tbl-cell bold" style="padding-right:5px;min-width:200px;">{{ field.label }}</span>
<span class="tbl-cell form-input">
{{ field }}
{% if field.help_text %}
<br>{{ field.help_text }}
{% endif %}
</span>
</div>
{% endfor %}
{% for field in form.hidden_fields %}
{{ field }}
{% endfor %}
</div>
<input class="tin-btn" type="submit" value="Save">
</form>

{% endblock %}

0 comments on commit 6b79415

Please sign in to comment.