Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
28 changes: 14 additions & 14 deletions aincrad/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
RegistrationContainerFactory,
StudentFactory,
StudentRegistrationFactory,
UnitInquiryFactory,
UnitPetitionFactory,
)
from roster.models import ApplyUUID, Invoice, Student, UnitInquiry
from roster.models import ApplyUUID, Invoice, Student, UnitPetition

EXAMPLE_PASSWORD = "take just the first 24"
TARGET_HASH = sha256(EXAMPLE_PASSWORD.encode("ascii")).hexdigest()
Expand Down Expand Up @@ -98,14 +98,14 @@ def aincrad_setup(db):
PSetFactory.create_batch(4, student=old_alice, status="A")
PSetFactory.create_batch(2, student=old_alice, status="P")

UnitInquiryFactory.create_batch(
5, student=alice, action_type="INQ_ACT_UNLOCK", status="INQ_ACC"
UnitPetitionFactory.create_batch(
5, student=alice, action_type="PET_ACT_UNLOCK", status="PET_ACC"
)
UnitInquiryFactory.create_batch(
2, student=alice, action_type="INQ_ACT_DROP", status="INQ_ACC"
UnitPetitionFactory.create_batch(
2, student=alice, action_type="PET_ACT_DROP", status="PET_ACC"
)
UnitInquiryFactory.create_batch(
3, student=alice, action_type="INQ_ACT_UNLOCK", status="INQ_NEW"
UnitPetitionFactory.create_batch(
3, student=alice, action_type="PET_ACT_UNLOCK", status="PET_NEW"
)

alice.curriculum.add(submitted_unit)
Expand Down Expand Up @@ -185,9 +185,9 @@ def test_init(otis, aincrad_setup):
else:
pytest.fail("Could not find a pset from Bôb B. in aincrad test")

inquiries = out["_children"][1]["inquiries"]
assert len(inquiries) == 3
assert inquiries[0]["unlock_inquiry_count"] == 8
petitions = out["_children"][1]["petitions"]
assert len(petitions) == 3
assert petitions[0]["unlock_petition_count"] == 8


@pytest.mark.django_db
Expand Down Expand Up @@ -293,17 +293,17 @@ def test_invoice(otis, aincrad_setup):

@pytest.mark.django_db
@override_settings(API_TARGET_HASH=TARGET_HASH)
def test_accept_inquiries(otis, aincrad_setup):
def test_accept_petitions(otis, aincrad_setup):
resp = otis.post_20x(
"api",
json={
"action": "accept_inquiries",
"action": "accept_petitions",
"token": EXAMPLE_PASSWORD,
},
)
assert resp.json()["result"] == "success"
assert resp.json()["count"] == 3
assert not UnitInquiry.objects.filter(status="INQ_NEW").exists()
assert not UnitPetition.objects.filter(status="PET_NEW").exists()


@pytest.mark.django_db
Expand Down
40 changes: 20 additions & 20 deletions aincrad/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
Invoice,
Student,
StudentRegistration,
UnitInquiry,
UnitPetition,
)
from suggestions.models import ProblemSuggestion

Expand Down Expand Up @@ -145,17 +145,17 @@ class JSONData(TypedDict):
"student__user__profile__email_on_pset_complete",
)

INQUIRY_VENUEQ_INIT_QUERYSET = UnitInquiry.objects.filter(
status="INQ_NEW",
PETITION_VENUEQ_INIT_QUERYSET = UnitPetition.objects.filter(
status="PET_NEW",
student__semester__active=True,
student__legit=True,
).annotate(
unlock_inquiry_count=SubqueryCount(
"student__unitinquiry",
filter=Q(action_type="INQ_ACT_UNLOCK"),
unlock_petition_count=SubqueryCount(
"student__unitpetition",
filter=Q(action_type="PET_ACT_UNLOCK"),
),
)
INQUIRY_VENUEQ_INIT_KEYS = (
PETITION_VENUEQ_INIT_KEYS = (
"action_type",
"unit__group__name",
"unit__code",
Expand All @@ -164,14 +164,14 @@ class JSONData(TypedDict):
"student__user__email",
"explanation",
"created_at",
"unlock_inquiry_count",
"student__user__profile__email_on_inquiry_complete",
"unlock_petition_count",
"student__user__profile__email_on_petition_complete",
)
INQUIRY_VENUEQ_AUTO_QUERYSET = UnitInquiry.objects.filter(
PETITION_VENUEQ_AUTO_QUERYSET = UnitPetition.objects.filter(
was_auto_processed=True,
created_at__gte=timezone.now() + timedelta(days=-2),
)
INQUIRY_VENUEQ_AUTO_KEYS = (
PETITION_VENUEQ_AUTO_KEYS = (
"action_type",
"unit__group__name",
"unit__code",
Expand Down Expand Up @@ -245,12 +245,12 @@ def venueq_handler(action: str, data: JSONData) -> JsonResponse:
),
},
{
"_name": "Inquiries",
"inquiries": list(
INQUIRY_VENUEQ_INIT_QUERYSET.values(*INQUIRY_VENUEQ_INIT_KEYS)
"_name": "Petitions",
"petitions": list(
PETITION_VENUEQ_INIT_QUERYSET.values(*PETITION_VENUEQ_INIT_KEYS)
),
"reading": list(
INQUIRY_VENUEQ_AUTO_QUERYSET.values(*INQUIRY_VENUEQ_AUTO_KEYS)
PETITION_VENUEQ_AUTO_QUERYSET.values(*PETITION_VENUEQ_AUTO_KEYS)
),
},
{
Expand All @@ -267,14 +267,14 @@ def venueq_handler(action: str, data: JSONData) -> JsonResponse:
},
]
return JsonResponse(output_data, status=200)
elif action == "accept_inquiries":
elif action == "accept_petitions":
n = 0
for inquiry in UnitInquiry.objects.filter(
status="INQ_NEW",
for petition in UnitPetition.objects.filter(
status="PET_NEW",
student__semester__active=True,
student__legit=True,
):
inquiry.run_accept()
petition.run_accept()
n += 1
if n > 0:
return JsonResponse({"result": "success", "count": n}, status=200)
Expand Down Expand Up @@ -814,7 +814,7 @@ def api(request: HttpRequest) -> JsonResponse:

if action in (
"grade_problem_set",
"accept_inquiries",
"accept_petitions",
"mark_suggestion",
"triage_job",
"init",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 6.0.8 on 2026-08-25 14:32

from django.db import migrations


class Migration(migrations.Migration):
dependencies = [
(
"core",
"0072_rename_first_payment_deadline_semester_half_payment_deadline_and_more",
),
]

operations = [
migrations.RenameField(
model_name="userprofile",
old_name="email_on_inquiry_complete",
new_name="email_on_petition_complete",
),
]
4 changes: 2 additions & 2 deletions core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ class UserProfile(models.Model):
help_text="Receive all-student announcements. If this is set to False, announcements will only appear on OTIS-WEB.",
default=True,
)
email_on_inquiry_complete = models.BooleanField(
email_on_petition_complete = models.BooleanField(
verbose_name="Receive email on petition processed",
help_text="Receive an email when your petition has been processed.",
default=False,
Expand Down Expand Up @@ -357,5 +357,5 @@ def __str__(self) -> str:
"email_on_announcement",
"email_on_pset_complete",
"email_on_suggestion_processed",
"email_on_inquiry_complete",
"email_on_petition_complete",
)
2 changes: 1 addition & 1 deletion core/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ class UserProfileUpdateView(
model = UserProfile
fields = (
"email_on_announcement",
"email_on_inquiry_complete",
"email_on_petition_complete",
"email_on_pset_complete",
"email_on_suggestion_processed",
"show_bars",
Expand Down
4 changes: 2 additions & 2 deletions dashboard/templates/dashboard/portal.html
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ <h3>Discord</h3>
<td valign="top" width="50%">
<h3 id="petitions">Petitions</h3>
{% if request.user.is_staff %}
<a href="{% url 'inquiry' student.pk %}" class="btn btn-warning">Manage units</a>
<a href="{% url 'petition' student.pk %}" class="btn btn-warning">Manage units</a>
<a href="{% url 'advance' student.pk %}" class="btn btn-dark">Edit units</a>
{% else %}
{% if not student.enabled %}
Expand All @@ -347,7 +347,7 @@ <h3 id="petitions">Petitions</h3>
{% elif student.newborn %}
<p class="text-muted fst-italic">Pick units first!</p>
{% else %}
<a href="{% url 'inquiry' student.pk %}" class="btn btn-warning">Manage units</a>
<a href="{% url 'petition' student.pk %}" class="btn btn-warning">Manage units</a>
{% if bonus_levels %}
<p data-testid="bonus-level-request">
You are also sufficiently high level to
Expand Down
2 changes: 1 addition & 1 deletion otisweb/templates/sidebar.html
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ <h3>Admin</h3>
<ul>
{% if not student.newborn and semester.active and student.enabled %}
<li>
<a href="{% url 'inquiry' student.pk %}">Manage units</a>
<a href="{% url 'petition' student.pk %}">Manage units</a>
</li>
{% endif %}
{% if student.semester.social_url %}
Expand Down
26 changes: 13 additions & 13 deletions roster/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
RegistrationContainer,
Student,
StudentRegistration,
UnitInquiry,
UnitPetition,
)


Expand Down Expand Up @@ -407,9 +407,9 @@ class StudentRegistrationAdmin(ImportExportModelAdmin):
inlines = (StudentRegistrationStudentInline,)


# INQUIRY
@admin.register(UnitInquiry)
class UnitInquiryAdmin(admin.ModelAdmin):
# PETITION
@admin.register(UnitPetition)
class UnitPetitionAdmin(admin.ModelAdmin):
readonly_fields = (
"created_at",
"updated_at",
Expand Down Expand Up @@ -442,22 +442,22 @@ class UnitInquiryAdmin(admin.ModelAdmin):

actions = ("hold_petition", "reject_petition", "accept_petition", "reset_petition")

def hold_petition(self, request: HttpRequest, queryset: QuerySet[UnitInquiry]):
def hold_petition(self, request: HttpRequest, queryset: QuerySet[UnitPetition]):
del request
queryset.update(status="INQ_HOLD")
queryset.update(status="PET_HOLD")

def reject_petition(self, request: HttpRequest, queryset: QuerySet[UnitInquiry]):
def reject_petition(self, request: HttpRequest, queryset: QuerySet[UnitPetition]):
del request
queryset.update(status="INQ_REJ")
queryset.update(status="PET_REJ")

def accept_petition(self, request: HttpRequest, queryset: QuerySet[UnitInquiry]):
def accept_petition(self, request: HttpRequest, queryset: QuerySet[UnitPetition]):
del request
for inquiry in queryset:
inquiry.run_accept()
for petition in queryset:
petition.run_accept()

def reset_petition(self, request: HttpRequest, queryset: QuerySet[UnitInquiry]):
def reset_petition(self, request: HttpRequest, queryset: QuerySet[UnitPetition]):
del request
queryset.update(status="INQ_NEW")
queryset.update(status="PET_NEW")


# REGISTRATION
Expand Down
8 changes: 4 additions & 4 deletions roster/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
RegistrationContainer,
Student,
StudentRegistration,
UnitInquiry,
UnitPetition,
)


Expand Down Expand Up @@ -67,11 +67,11 @@ class Meta:
preps_taught = 2


class UnitInquiryFactory(DjangoModelFactory):
class UnitPetitionFactory(DjangoModelFactory):
class Meta:
model = UnitInquiry
model = UnitPetition

student = SubFactory(StudentFactory)
unit = SubFactory(UnitFactory)
action_type = "INQ_ACT_UNLOCK"
action_type = "PET_ACT_UNLOCK"
explanation = Faker("sentence")
8 changes: 4 additions & 4 deletions roster/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from core.models import EMAIL_PREFERENCE_FIELDS, Semester, Unit
from dashboard.models import PSet
from roster.models import Student, StudentRegistration, UnitInquiry
from roster.models import Student, StudentRegistration, UnitPetition


class UnitChoiceBoundField(forms.BoundField):
Expand Down Expand Up @@ -126,7 +126,7 @@ def __init__(self, *args: Any, **kwargs: Any):
)


class InquiryForm(forms.ModelForm):
class PetitionForm(forms.ModelForm):
def __init__(self, *args: Any, **kwargs: Any):
student: Student = kwargs.pop("student")
super().__init__(*args, **kwargs)
Expand All @@ -139,7 +139,7 @@ def __init__(self, *args: Any, **kwargs: Any):
self.fields["unit"].empty_label = "Search for a unit..." # type: ignore

class Meta:
model = UnitInquiry
model = UnitPetition
fields = ("unit", "action_type", "explanation")
widgets: ClassVar[dict[str, forms.Widget]] = {
"explanation": forms.Textarea(attrs={"cols": 40, "rows": 3}),
Expand Down Expand Up @@ -176,7 +176,7 @@ class DecisionForm(forms.ModelForm):
help_text="Receive all-student announcements. If this is set to False, announcements will only appear on OTIS-WEB.",
required=False,
)
email_on_inquiry_complete = forms.BooleanField(
email_on_petition_complete = forms.BooleanField(
label="Receive email on petition processed",
help_text="Receive an email when your petition has been processed.",
required=False,
Expand Down
Loading
Loading