1- from operator import attrgetter
2-
31from django import forms
42from django .contrib import admin
53from django .db import transaction
108from django .utils .translation import gettext , gettext_lazy as _ , ngettext
119from reversion .admin import VersionAdmin
1210
13- from judge .models import LanguageLimit , Problem , ProblemClarification , ProblemTranslation , Profile , Solution
11+ from judge .models import LanguageLimit , Problem , ProblemClarification , ProblemTranslation , Solution
12+ from judge .models .role import ProblemRole , ROLE_AUTHOR
1413from judge .utils .views import NoBatchDeleteMixin
1514from judge .widgets import AdminHeavySelect2MultipleWidget , AdminHeavySelect2Widget , AdminMartorWidget , \
1615 AdminSelect2MultipleWidget , AdminSelect2Widget , CheckboxSelectMultipleWithSelectAll
@@ -21,21 +20,15 @@ class ProblemForm(ModelForm):
2120
2221 def __init__ (self , * args , ** kwargs ):
2322 super (ProblemForm , self ).__init__ (* args , ** kwargs )
24- self .fields ['authors' ].widget .can_add_related = False
25- self .fields ['curators' ].widget .can_add_related = False
2623 self .fields ['suggester' ].widget .can_add_related = False
27- self .fields ['testers' ].widget .can_add_related = False
2824 self .fields ['banned_users' ].widget .can_add_related = False
2925 self .fields ['change_message' ].widget .attrs .update ({
3026 'placeholder' : gettext ('Describe the changes you made (optional)' ),
3127 })
3228
3329 class Meta :
3430 widgets = {
35- 'authors' : AdminHeavySelect2MultipleWidget (data_view = 'profile_select2' ),
36- 'curators' : AdminHeavySelect2MultipleWidget (data_view = 'profile_select2' ),
3731 'suggester' : AdminHeavySelect2Widget (data_view = 'profile_select2' ),
38- 'testers' : AdminHeavySelect2MultipleWidget (data_view = 'profile_select2' ),
3932 'banned_users' : AdminHeavySelect2MultipleWidget (data_view = 'profile_select2' ),
4033 'organization' : AdminHeavySelect2Widget (data_view = 'organization_select2' ),
4134 'types' : AdminSelect2MultipleWidget ,
@@ -48,13 +41,18 @@ class ProblemCreatorListFilter(admin.SimpleListFilter):
4841 title = parameter_name = 'creator'
4942
5043 def lookups (self , request , model_admin ):
51- queryset = Profile .objects .exclude (authored_problems = None ).values_list ('user__username' , flat = True )
44+ queryset = ProblemRole .objects .filter (
45+ role = ROLE_AUTHOR ,
46+ ).values_list ('user__user__username' , flat = True ).distinct ()
5247 return [(name , name ) for name in queryset ]
5348
5449 def queryset (self , request , queryset ):
5550 if self .value () is None :
5651 return queryset
57- return queryset .filter (authors__user__username = self .value ())
52+ return queryset .filter (
53+ problem_roles__role = ROLE_AUTHOR ,
54+ problem_roles__user__user__username = self .value (),
55+ )
5856
5957
6058class LanguageLimitInlineForm (ModelForm ):
@@ -118,12 +116,26 @@ def has_permission_full_markup(self, request, obj=None):
118116 has_add_permission = has_change_permission = has_delete_permission = has_permission_full_markup
119117
120118
119+ class ProblemRoleInlineForm (ModelForm ):
120+ class Meta :
121+ model = ProblemRole
122+ fields = ('user' , 'role' )
123+ widgets = {'user' : AdminHeavySelect2Widget (data_view = 'profile_select2' )}
124+
125+
126+ class ProblemRoleInline (admin .TabularInline ):
127+ model = ProblemRole
128+ fields = ('user' , 'role' )
129+ extra = 0
130+ form = ProblemRoleInlineForm
131+
132+
121133class ProblemAdmin (NoBatchDeleteMixin , VersionAdmin ):
122134 fieldsets = (
123135 (None , {
124136 'fields' : (
125- 'code' , 'name' , 'suggester' , 'is_public' , 'is_manually_managed' , 'date' , 'authors' ,
126- 'curators' , 'testers' , ' is_organization_private' , 'organization' , 'submission_source_visibility_mode' ,
137+ 'code' , 'name' , 'suggester' , 'is_public' , 'is_manually_managed' , 'date' ,
138+ 'is_organization_private' , 'organization' , 'submission_source_visibility_mode' ,
127139 'testcase_visibility_mode' , 'testcase_result_visibility_mode' , 'allow_view_feedback' ,
128140 'is_full_markup' , 'pdf_url' , 'source' , 'description' , 'license' ,
129141 ),
@@ -138,8 +150,9 @@ class ProblemAdmin(NoBatchDeleteMixin, VersionAdmin):
138150 )
139151 list_display = ['code' , 'name' , 'show_authors' , 'points' , 'is_public' , 'show_public' ]
140152 ordering = ['code' ]
141- search_fields = ('code' , 'name' , 'authors__user__username' , 'curators__user__username' )
142- inlines = [LanguageLimitInline , ProblemClarificationInline , ProblemSolutionInline , ProblemTranslationInline ]
153+ search_fields = ('code' , 'name' , 'problem_roles__user__user__username' )
154+ inlines = [ProblemRoleInline , LanguageLimitInline , ProblemClarificationInline ,
155+ ProblemSolutionInline , ProblemTranslationInline ]
143156 list_max_show_all = 1000
144157 actions_on_top = True
145158 actions_on_bottom = True
@@ -173,7 +186,10 @@ def get_readonly_fields(self, request, obj=None):
173186
174187 @admin .display (description = _ ('authors' ))
175188 def show_authors (self , obj ):
176- return ', ' .join (map (attrgetter ('user.username' ), obj .authors .all ()))
189+ return ', ' .join (
190+ ProblemRole .objects .filter (problem = obj , role = ROLE_AUTHOR )
191+ .values_list ('user__user__username' , flat = True ),
192+ )
177193
178194 @admin .display (description = '' )
179195 def show_public (self , obj ):
@@ -203,7 +219,9 @@ def make_private(self, request, queryset):
203219 count ) % count )
204220
205221 def get_queryset (self , request ):
206- return Problem .get_editable_problems (request .user ).prefetch_related ('authors__user' ).distinct ()
222+ return Problem .get_editable_problems (request .user ).prefetch_related (
223+ 'problem_roles__user__user' ,
224+ ).distinct ()
207225
208226 def has_change_permission (self , request , obj = None ):
209227 if obj is None :
@@ -216,9 +234,7 @@ def formfield_for_manytomany(self, db_field, request=None, **kwargs):
216234 return super (ProblemAdmin , self ).formfield_for_manytomany (db_field , request , ** kwargs )
217235
218236 def get_form (self , * args , ** kwargs ):
219- form = super (ProblemAdmin , self ).get_form (* args , ** kwargs )
220- form .base_fields ['authors' ].queryset = Profile .objects .all ()
221- return form
237+ return super (ProblemAdmin , self ).get_form (* args , ** kwargs )
222238
223239 def save_model (self , request , obj , form , change ):
224240 super (ProblemAdmin , self ).save_model (request , obj , form , change )
0 commit comments