Skip to content

Commit 5d94bf3

Browse files
committed
fixes
1 parent cc209c9 commit 5d94bf3

File tree

5 files changed

+109
-25
lines changed

5 files changed

+109
-25
lines changed

backend/custom_admin/admin.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.db.models import F
12
from django.contrib import messages
23
from functools import wraps
34

@@ -52,3 +53,19 @@ def wrapper(modeladmin, request, queryset):
5253
return func(modeladmin, request, queryset)
5354

5455
return wrapper
56+
57+
58+
@admin.action(description="Confirm pending status change")
59+
@validate_single_conference_selection
60+
def confirm_pending_status(modeladmin, request, queryset):
61+
queryset.update(
62+
status=F("pending_status"),
63+
)
64+
65+
66+
@admin.action(description="Reset pending status to status")
67+
@validate_single_conference_selection
68+
def reset_pending_status_back_to_status(modeladmin, request, queryset):
69+
queryset.update(
70+
pending_status=F("status"),
71+
)

backend/grants/admin.py

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
)
66
from conferences.models.conference_voucher import ConferenceVoucher
77
from pycon.constants import UTC
8-
from custom_admin.admin import validate_single_conference_selection
8+
from custom_admin.admin import (
9+
confirm_pending_status,
10+
reset_pending_status_back_to_status,
11+
validate_single_conference_selection,
12+
)
913
from import_export.resources import ModelResource
1014
from datetime import timedelta
1115
from typing import Dict, List, Optional
@@ -579,22 +583,6 @@ class Media:
579583
js = ["admin/js/jquery.init.js"]
580584

581585

582-
@admin.action(description="Confirm pending status change")
583-
@validate_single_conference_selection
584-
def confirm_pending_status(modeladmin, request, queryset):
585-
Grant.objects.filter(id__in=queryset.values_list("id", flat=True)).update(
586-
status=F("pending_status"),
587-
)
588-
589-
590-
@admin.action(description="Reset pending status")
591-
@validate_single_conference_selection
592-
def reset_pending_status_back_to_status(modeladmin, request, queryset):
593-
Grant.objects.filter(id__in=queryset.values_list("id", flat=True)).update(
594-
pending_status=F("status"),
595-
)
596-
597-
598586
@admin.register(GrantConfirmPendingStatusProxy)
599587
class GrantConfirmPendingStatusProxyAdmin(admin.ModelAdmin):
600588
list_display = (

backend/grants/tests/test_admin.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,16 +466,27 @@ def test_confirm_pending_status_action(rf):
466466
conference=grant_1.conference,
467467
)
468468

469+
grant_4 = GrantFactory(
470+
status=Grant.Status.waiting_list_maybe,
471+
pending_status=Grant.Status.confirmed,
472+
conference=grant_1.conference,
473+
)
474+
469475
request = rf.get("/")
470-
confirm_pending_status(None, request, Grant.objects.all())
476+
confirm_pending_status(
477+
None, request, Grant.objects.filter(id__in=[grant_1.id, grant_2.id, grant_3.id])
478+
)
471479

472480
grant_1.refresh_from_db()
473481
grant_2.refresh_from_db()
474482
grant_3.refresh_from_db()
483+
grant_4.refresh_from_db()
475484

476485
assert grant_1.status == Grant.Status.confirmed
477486
assert grant_2.status == Grant.Status.waiting_list
478487
assert grant_3.status == Grant.Status.waiting_list_maybe
488+
# Left out from the action
489+
assert grant_4.status == Grant.Status.waiting_list_maybe
479490

480491

481492
def test_reset_pending_status_back_to_status_action(rf):
@@ -496,13 +507,31 @@ def test_reset_pending_status_back_to_status_action(rf):
496507
conference=grant_1.conference,
497508
)
498509

510+
grant_4 = GrantFactory(
511+
status=Grant.Status.waiting_list_maybe,
512+
pending_status=Grant.Status.confirmed,
513+
conference=grant_1.conference,
514+
)
515+
499516
request = rf.get("/")
500-
reset_pending_status_back_to_status(None, request, Grant.objects.all())
517+
reset_pending_status_back_to_status(
518+
None, request, Grant.objects.filter(id__in=[grant_1.id, grant_2.id, grant_3.id])
519+
)
501520

502521
grant_1.refresh_from_db()
503522
grant_2.refresh_from_db()
504523
grant_3.refresh_from_db()
524+
grant_4.refresh_from_db()
505525

506526
assert grant_1.status == Grant.Status.pending
527+
assert grant_1.pending_status == Grant.Status.pending
528+
507529
assert grant_2.status == Grant.Status.rejected
530+
assert grant_2.pending_status == Grant.Status.rejected
531+
508532
assert grant_3.status == Grant.Status.waiting_list
533+
assert grant_3.pending_status == Grant.Status.waiting_list
534+
535+
# Left out from the action
536+
assert grant_4.status == Grant.Status.waiting_list_maybe
537+
assert grant_4.pending_status == Grant.Status.confirmed

backend/reviews/templates/proposals-recap.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ <h3>Show proposals with pending status:</h3>
401401
numOfVotes: {{item.userreview_set.count}},
402402
};
403403
</script>
404-
<tr class="proposal-item" id="submission-{{item.id}}" data-original-status="{{ item.status }}">
404+
<tr class="proposal-item" id="submission-{{item.id}}" data-original-status="{{ item.pending_status }}">
405405
<td>{{forloop.counter}}</td>
406406
<td class="results-title">
407407
<a
@@ -496,7 +496,7 @@ <h3>Show proposals with pending status:</h3>
496496
<td class="decision-input-wrapper">
497497
<label>
498498
<input
499-
{% if item.status == 'accepted' %}checked{% endif %}
499+
{% if item.pending_status == 'accepted' %}checked{% endif %}
500500
type="radio"
501501
name="decision-{{item.id}}"
502502
value="accepted"
@@ -505,7 +505,7 @@ <h3>Show proposals with pending status:</h3>
505505
</label>
506506
<label>
507507
<input
508-
{% if item.status == 'rejected' %}checked{% endif %}
508+
{% if item.pending_status == 'rejected' %}checked{% endif %}
509509
type="radio"
510510
name="decision-{{item.id}}"
511511
value="rejected"
@@ -514,7 +514,7 @@ <h3>Show proposals with pending status:</h3>
514514
</label>
515515
<label>
516516
<input
517-
{% if item.status == 'waiting_list' %}checked{% endif %}
517+
{% if item.pending_status == 'waiting_list' %}checked{% endif %}
518518
type="radio"
519519
name="decision-{{item.id}}"
520520
value="waiting_list"

backend/submissions/admin.py

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
from custom_admin.admin import validate_single_conference_selection
1+
from django.urls import reverse
2+
from custom_admin.admin import (
3+
confirm_pending_status,
4+
reset_pending_status_back_to_status,
5+
validate_single_conference_selection,
6+
)
27
from import_export.resources import ModelResource
38

49
from django import forms
10+
from django.db.models import F
511
from django.contrib import admin, messages
612
from django.utils.html import mark_safe
713
from django.utils.translation import gettext_lazy as _
@@ -316,4 +322,48 @@ class SubmissionCommentAdmin(admin.ModelAdmin):
316322

317323
@admin.register(SubmissionConfirmPendingStatusProxy)
318324
class SubmissionConfirmPendingStatusProxyAdmin(admin.ModelAdmin):
319-
...
325+
list_display = (
326+
"id",
327+
"title",
328+
"speaker_name",
329+
"status",
330+
"to",
331+
"pending_status",
332+
"open_submission",
333+
"conference",
334+
)
335+
list_filter = ("status", "pending_status", "conference")
336+
search_fields = ("speaker__full_name", "speaker__email", "title")
337+
list_display_links = None
338+
actions = [
339+
confirm_pending_status,
340+
reset_pending_status_back_to_status,
341+
]
342+
343+
def speaker_name(self, obj):
344+
return obj.speaker.display_name
345+
346+
def to(self, obj):
347+
return "➡️"
348+
349+
def has_delete_permission(self, request, obj=None):
350+
return False
351+
352+
def has_add_permission(self, request):
353+
return False
354+
355+
def has_change_permission(self, request, obj=None):
356+
return False
357+
358+
def get_queryset(self, request):
359+
return (
360+
super()
361+
.get_queryset(request)
362+
.exclude(
363+
pending_status=F("status"),
364+
)
365+
)
366+
367+
def open_submission(self, obj):
368+
url = reverse("admin:submissions_submission_change", args=[obj.id])
369+
return mark_safe(f'<a href="{url}">Open Submission</a>')

0 commit comments

Comments
 (0)