21
21
from por .dashboard .reports .validators import validate_period
22
22
from por .dashboard .reports .favourites import render_saved_query_form
23
23
24
- from por .models import DBSession , Project , TimeEntry , User , CustomerRequest
24
+ from por .models import DBSession , Project , TimeEntry , User , CustomerRequest , Contract
25
25
from por .models .tickets import ticket_store
26
26
27
27
log = logging .getLogger (__name__ )
@@ -131,6 +131,7 @@ def search(self, customer_id, project_id, date_from, date_to,
131
131
'project' : te .project .name .strip (),
132
132
'user' : te .author .fullname .strip (),
133
133
'date' : te .date .strftime ('%Y-%m-%d' ),
134
+ 'contract' : te .contract ,
134
135
'description' : te .description ,
135
136
'hours_str' : te .hours_str ,
136
137
'workflow_state' : te .workflow_state ,
@@ -161,8 +162,9 @@ def search(self, customer_id, project_id, date_from, date_to,
161
162
162
163
163
164
164
- def state_change (self ):
165
+ def state_contract_change (self ):
165
166
new_state = self .request .POST ['new_state' ]
167
+ new_contract = self .request .POST ['new_contract' ]
166
168
invoice_number = self .request .POST ['invoice_number' ]
167
169
168
170
te_ids = set (int (s [3 :])
@@ -171,46 +173,44 @@ def state_change(self):
171
173
172
174
qry = DBSession .query (TimeEntry ).filter (TimeEntry .id .in_ (te_ids ))
173
175
174
- done = set ()
176
+ done_state = set ()
177
+ done_contract = set ()
175
178
errors = {}
176
179
177
180
for te in qry :
178
- try :
179
- workflow = get_workflow (te , te .__class__ .__name__ )
180
- workflow .transition_to_state (te , self .request , new_state , skip_same = True )
181
- done .add (te .id )
182
- if new_state == 'invoiced' and invoice_number :
183
- te .invoice_number = invoice_number
184
- except WorkflowError as msg :
185
- errors [te .id ] = msg
186
-
187
- return done , errors
188
-
189
-
181
+ if new_state :
182
+ try :
183
+ workflow = get_workflow (te , te .__class__ .__name__ )
184
+ workflow .transition_to_state (te , self .request , new_state , skip_same = True )
185
+ done_state .add (te .id )
186
+ if new_state == 'invoiced' and invoice_number :
187
+ te .invoice_number = invoice_number
188
+ except WorkflowError as msg :
189
+ errors [te .id ] = msg
190
+ if new_contract :
191
+ done_contract .add (te .id )
192
+ te .contract_id = new_contract
193
+
194
+ return done_state , done_contract , errors
190
195
191
196
192
197
@view_config (name = 'report_state_change' , route_name = 'reports' , renderer = 'skin' , permission = 'reports_state_change' )
193
198
def __call__ (self ):
194
199
195
- done = set ()
200
+ done_state = set ()
201
+ done_contract = set ()
196
202
errors = {}
197
203
if self .request .POST :
198
- done , errors = self .state_change ()
199
- if done :
200
- self .request .add_message ('State changed for %d time entries.' % len (done ))
201
- else :
202
- # TODO prevent submitting if there are no selected entries
203
- self .request .add_message ('No time entry was selected' )
204
- else :
205
- done = set ()
206
- errors = {}
204
+ done_state , done_contract , errors = self .state_contract_change ()
205
+ if done_state :
206
+ self .request .add_message ('State changed for %d time entries.' % len (done_state ))
207
+ if done_contract :
208
+ self .request .add_message ('Contract changed for %d time entries.' % len (done_contract ))
207
209
208
210
# GET parameters for the search form
209
211
210
212
fanstatic_resources .report_te_state_change .need ()
211
-
212
213
schema = self .StateChangeSchema (validator = validate_period ).clone ()
213
-
214
214
projects = self .request .filter_viewables (qry_active_projects ())
215
215
216
216
# select customers that have some active project
@@ -274,12 +274,16 @@ def __call__(self):
274
274
275
275
entries_detail = self .search (** appstruct )
276
276
277
+ all_contracts = DBSession ().query (Contract .id , Contract .name ).all ()
278
+
277
279
result_table = render ('por.dashboard:reports/templates/state_change.pt' ,
278
280
{
279
281
'entries_tree' : entries_detail ['entries_tree' ],
280
282
'all_wf_states' : all_wf_states ,
283
+ 'all_contracts' : all_contracts ,
281
284
'wf_state_names' : dict ((ws [0 ], ws [1 ]) for ws in all_wf_states ),
282
- 'done' : done ,
285
+ 'done_state' : done_state ,
286
+ 'done_contract' : done_contract ,
283
287
'errors' : errors ,
284
288
},
285
289
request = self .request )
0 commit comments