11from django import forms
22from django .conf import settings
3+ from django .forms .util import ErrorList
34from django .template .loader import render_to_string
45
56from ietf .liaisons .accounts import (can_add_outgoing_liaison , can_add_incoming_liaison ,
67 get_person_for_user )
78from ietf .liaisons .models import LiaisonDetail
89from ietf .liaisons .utils import IETFHierarchyManager
9- from ietf .liaisons .widgets import FromWidget , ReadOnlyWidget
10+ from ietf .liaisons .widgets import FromWidget , ReadOnlyWidget , ButtonWidget
1011
1112
1213class LiaisonForm (forms .ModelForm ):
1314
1415 from_field = forms .ChoiceField (widget = FromWidget , label = u'From' )
1516 replyto = forms .CharField (label = u'Reply to' )
1617 organization = forms .ChoiceField ()
17- to_poc = forms .CharField (widget = ReadOnlyWidget , label = "POC" )
18- cc1 = forms .CharField (widget = ReadOnlyWidget , label = "CC" )
18+ to_poc = forms .CharField (widget = ReadOnlyWidget , label = "POC" , required = False )
19+ cc1 = forms .CharField (widget = ReadOnlyWidget , label = "CC" , required = False )
1920 purpose_text = forms .CharField (widget = forms .Textarea , label = 'Other purpose' )
2021 deadline_date = forms .DateField (label = 'Deadline' )
22+ title = forms .CharField (label = u'Title' )
23+ attachments = forms .CharField (label = 'Attachments' , widget = ReadOnlyWidget , initial = 'No files attached' , required = False )
24+ attach_title = forms .CharField (label = 'Title' , required = False )
25+ attach_file = forms .FileField (label = 'File' , required = False )
26+ attach_button = forms .CharField (label = '' ,
27+ widget = ButtonWidget (label = 'Attach' , show_on = 'id_attachments' ,
28+ require = ['id_attach_title' , 'id_attach_file' ],
29+ required_label = 'title and file' ),
30+ required = False )
2131
2232 fieldsets = (('From' , ('from_field' , 'replyto' )),
2333 ('To' , ('organization' , 'to_poc' )),
2434 ('Other email addresses' , ('response_contact' , 'technical_contact' , 'cc1' )),
2535 ('Purpose' , ('purpose' , 'purpose_text' , 'deadline_date' )),
26- ('Body' , ('body' , )),
36+ ('Liaison Statement' , ('title' , 'body' , 'attachments' )),
37+ ('Add attachment' , ('attach_title' , 'attach_file' , 'attach_button' )),
2738 )
2839
2940 class Meta :
3041 model = LiaisonDetail
3142
3243 class Media :
3344 js = ("/js/jquery-1.4.2.min.js" ,
45+ "/js/jquery-ui-1.8.2.custom.min.js" ,
3446 "/js/liaisons.js" , )
3547
36- css = {'all' : ("/css/liaisons.css" , )}
48+ css = {'all' : ("/css/liaisons.css" ,
49+ "/css/jquery-ui-themes/jquery-ui-1.8.2.custom.css" )}
3750
3851 def __init__ (self , user , * args , ** kwargs ):
52+ self .person = get_person_for_user (user )
53+ if kwargs .get ('data' , None ):
54+ kwargs ['data' ].update ({'person' : self .person .pk })
3955 super (LiaisonForm , self ).__init__ (* args , ** kwargs )
4056 self .hm = IETFHierarchyManager ()
41- self .person = get_person_for_user (user )
4257 self .set_from_field ()
4358 self .set_replyto_field ()
4459 self .set_organization_field ()
4560
4661 def __unicode__ (self ):
4762 return self .as_div ()
4863
64+ def set_purpose_required_fields (self ):
65+ purpose = self .data .get ('purpose' , None )
66+ if purpose == '5' :
67+ self .fields ['purpose_text' ].required = True
68+ else :
69+ self .fields ['purpose_text' ].required = False
70+ if purpose in ['1' , '2' ]:
71+ self .fields ['deadline_date' ].required = True
72+ else :
73+ self .fields ['deadline_date' ].required = False
74+
75+ def reset_purpose_required_fields (self ):
76+ self .fields ['purpose_text' ].required = True
77+ self .fields ['deadline_date' ].required = True
78+
4979 def set_from_field (self ):
5080 assert NotImplemented
5181
@@ -73,6 +103,23 @@ def get_fieldsets(self):
73103 continue
74104 yield fieldset_dict
75105
106+ def full_clean (self ):
107+ self .set_purpose_required_fields ()
108+ super (LiaisonForm , self ).full_clean ()
109+ self .reset_purpose_required_fields ()
110+
111+ def has_attachments (self ):
112+ for key in self .files .keys ():
113+ if key .startswith ('attach_file_' ) and key .replace ('file' , 'title' ) in self .data .keys ():
114+ return True
115+ return False
116+
117+ def clean (self ):
118+ if not self .cleaned_data .get ('body' , None ) and not self .has_attachments ():
119+ self ._errors ['body' ] = ErrorList ([u'You must provide a body or attachment files' ])
120+ self ._errors ['attachments' ] = ErrorList ([u'You must provide a body or attachment files' ])
121+ return self .cleaned_data
122+
76123
77124class IncomingLiaisonForm (LiaisonForm ):
78125
@@ -96,10 +143,10 @@ def set_organization_field(self):
96143 pass
97144
98145
99- def liaison_form_factory (request ):
146+ def liaison_form_factory (request , ** kwargs ):
100147 user = request .user
101148 if can_add_incoming_liaison (user ):
102- return IncomingLiaisonForm (user )
149+ return IncomingLiaisonForm (user , ** kwargs )
103150 elif can_add_outgoing_liaison (user ):
104- return OutgoingLiaisonForm (user )
151+ return OutgoingLiaisonForm (user , ** kwargs )
105152 return None
0 commit comments