11from django import forms
22from django .contrib .auth .models import User
3- from django .db .models import Q
43from django .forms import ValidationError
54from django .forms .widgets import HiddenInput
65from django .http import Http404
1110
1211
1312class CommitFestFilterForm (forms .Form ):
13+ selectize_fields = {
14+ "author" : "/lookups/user" ,
15+ "reviewer" : "/lookups/user" ,
16+ }
17+
1418 text = forms .CharField (max_length = 50 , required = False )
1519 status = forms .ChoiceField (required = False )
1620 targetversion = forms .ChoiceField (required = False )
17- author = forms .ChoiceField (required = False )
18- reviewer = forms .ChoiceField (required = False )
21+ author = forms .ChoiceField (required = False , label = "Author (type to search)" )
22+ reviewer = forms .ChoiceField (required = False , label = "Reviewer (type to search)" )
1923 sortkey = forms .IntegerField (required = False )
2024
21- def __init__ (self , cf , * args , ** kwargs ):
22- super (CommitFestFilterForm , self ).__init__ (* args , ** kwargs )
25+ def __init__ (self , data , * args , ** kwargs ):
26+ super (CommitFestFilterForm , self ).__init__ (data , * args , ** kwargs )
2327
2428 self .fields ["sortkey" ].widget = forms .HiddenInput ()
2529
2630 c = [(- 1 , "* All" )] + list (PatchOnCommitFest ._STATUS_CHOICES )
2731 self .fields ["status" ] = forms .ChoiceField (choices = c , required = False )
2832
29- q = Q (patch_author__commitfests = cf ) | Q (patch_reviewer__commitfests = cf )
30- userchoices = [(- 1 , "* All" ), (- 2 , "* None" ), (- 3 , "* Yourself" )] + [
31- (u .id , "%s %s (%s)" % (u .first_name , u .last_name , u .username ))
32- for u in User .objects .filter (q )
33- .distinct ()
34- .order_by ("first_name" , "last_name" )
35- ]
33+ userchoices = [(- 1 , "* All" ), (- 2 , "* None" ), (- 3 , "* Yourself" )]
34+
35+ selected_user_ids = set ()
36+ if data and "author" in data :
37+ try :
38+ selected_user_ids .add (int (data ["author" ]))
39+ except ValueError :
40+ pass
41+
42+ if data and "reviewer" in data :
43+ try :
44+ selected_user_ids .add (int (data ["reviewer" ]))
45+ except ValueError :
46+ pass
47+
48+ if selected_user_ids :
49+ userchoices .extend (
50+ (u .id , f"{ u .first_name } { u .last_name } ({ u .username } )" )
51+ for u in User .objects .filter (pk__in = selected_user_ids )
52+ )
53+
3654 self .fields ["targetversion" ] = forms .ChoiceField (
3755 choices = [("-1" , "* All" ), ("-2" , "* None" )]
3856 + [(v .id , v .version ) for v in TargetVersion .objects .all ()],
3957 required = False ,
4058 label = "Target version" ,
4159 )
42- self .fields ["author" ] = forms . ChoiceField ( choices = userchoices , required = False )
43- self .fields ["reviewer" ] = forms . ChoiceField ( choices = userchoices , required = False )
60+ self .fields ["author" ]. choices = userchoices
61+ self .fields ["reviewer" ]. choices = userchoices
4462
4563 for f in (
4664 "status" ,
@@ -51,7 +69,7 @@ def __init__(self, cf, *args, **kwargs):
5169
5270
5371class PatchForm (forms .ModelForm ):
54- selectize_multiple_fields = {
72+ selectize_fields = {
5573 "authors" : "/lookups/user" ,
5674 "reviewers" : "/lookups/user" ,
5775 }
@@ -77,7 +95,7 @@ def __init__(self, *args, **kwargs):
7795 )
7896
7997 # Selectize multiple fields -- don't pre-populate everything
80- for field , url in list (self .selectize_multiple_fields .items ()):
98+ for field , url in list (self .selectize_fields .items ()):
8199 # If this is a postback of a selectize field, it may contain ids that are not currently
82100 # stored in the field. They must still be among the *allowed* values of course, which
83101 # are handled by the existing queryset on the field.
@@ -94,8 +112,8 @@ def __init__(self, *args, **kwargs):
94112 self .fields [field ].queryset = self .fields [field ].queryset .filter (
95113 pk__in = set (vals )
96114 )
97- self .fields [field ].label_from_instance = lambda u : "{} ({})" . format (
98- u . username , u .get_full_name ()
115+ self .fields [field ].label_from_instance = (
116+ lambda u : f" { u .get_full_name ()} ( { u . username } )"
99117 )
100118
101119 # Only allow modifying reviewers and committers if the patch is closed.
0 commit comments