Skip to content

Commit 9a3df95

Browse files
committed
update state_change report to allow user change contract
1 parent 0abe970 commit 9a3df95

File tree

2 files changed

+48
-30
lines changed

2 files changed

+48
-30
lines changed

por/dashboard/reports/state_change.py

+32-28
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from por.dashboard.reports.validators import validate_period
2222
from por.dashboard.reports.favourites import render_saved_query_form
2323

24-
from por.models import DBSession, Project, TimeEntry, User, CustomerRequest
24+
from por.models import DBSession, Project, TimeEntry, User, CustomerRequest, Contract
2525
from por.models.tickets import ticket_store
2626

2727
log = logging.getLogger(__name__)
@@ -131,6 +131,7 @@ def search(self, customer_id, project_id, date_from, date_to,
131131
'project': te.project.name.strip(),
132132
'user': te.author.fullname.strip(),
133133
'date': te.date.strftime('%Y-%m-%d'),
134+
'contract': te.contract,
134135
'description': te.description,
135136
'hours_str': te.hours_str,
136137
'workflow_state': te.workflow_state,
@@ -161,8 +162,9 @@ def search(self, customer_id, project_id, date_from, date_to,
161162

162163

163164

164-
def state_change(self):
165+
def state_contract_change(self):
165166
new_state = self.request.POST['new_state']
167+
new_contract = self.request.POST['new_contract']
166168
invoice_number = self.request.POST['invoice_number']
167169

168170
te_ids = set(int(s[3:])
@@ -171,46 +173,44 @@ def state_change(self):
171173

172174
qry = DBSession.query(TimeEntry).filter(TimeEntry.id.in_(te_ids))
173175

174-
done = set()
176+
done_state = set()
177+
done_contract = set()
175178
errors = {}
176179

177180
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
190195

191196

192197
@view_config(name='report_state_change', route_name='reports', renderer='skin', permission='reports_state_change')
193198
def __call__(self):
194199

195-
done = set()
200+
done_state = set()
201+
done_contract = set()
196202
errors = {}
197203
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))
207209

208210
# GET parameters for the search form
209211

210212
fanstatic_resources.report_te_state_change.need()
211-
212213
schema = self.StateChangeSchema(validator=validate_period).clone()
213-
214214
projects = self.request.filter_viewables(qry_active_projects())
215215

216216
# select customers that have some active project
@@ -274,12 +274,16 @@ def __call__(self):
274274

275275
entries_detail = self.search(**appstruct)
276276

277+
all_contracts = DBSession().query(Contract.id, Contract.name).all()
278+
277279
result_table = render('por.dashboard:reports/templates/state_change.pt',
278280
{
279281
'entries_tree': entries_detail['entries_tree'],
280282
'all_wf_states': all_wf_states,
283+
'all_contracts': all_contracts,
281284
'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,
283287
'errors': errors,
284288
},
285289
request=self.request)

por/dashboard/reports/templates/state_change.pt

+16-2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
<th>description</th>
4949
<th>location</th>
5050
<th>invoice</th>
51+
<th>contract</th>
5152
<th>type</th>
5253
</tr>
5354
</thead>
@@ -58,7 +59,7 @@
5859
<input type="checkbox" name="te_${row['id']}" />
5960
</td>
6061
<td>
61-
<span class="${'statechange-done' if row['id'] in done else 'statechange-error' if row['id'] in errors else nothing}">
62+
<span class="${'statechange-done' if row['id'] in done_state else 'statechange-error' if row['id'] in errors else nothing}">
6263
${wf_state_names[row['workflow_state']] if row['workflow_state'] else nothing}
6364
</span>
6465
</td>
@@ -76,6 +77,11 @@
7677
<td>
7778
${row['invoice_number']}
7879
</td>
80+
<td>
81+
<span class="${'statechange-done' if row['id'] in done_contract else 'statechange-error' if row['id'] in errors else nothing}">
82+
${row['contract']}
83+
</span>
84+
</td>
7985
<td>
8086
${row['tickettype']}
8187
</td>
@@ -93,10 +99,18 @@
9399
Select all&nbsp;
94100
</label>
95101

96-
<select name="new_state">
102+
<select id="new_state" name="new_state" class="i-can-haz-chzn-select">
103+
<option value="">Choose a new state...</option>
97104
<option tal:repeat="ws all_wf_states"
98105
value="${ws[0]}">${ws[1]}</option>
99106
</select>
107+
<script>$('#new_state').chosen()</script>
108+
<select id="new_contract" name="new_contract" class="i-can-haz-chzn-select">
109+
<option value="">Choose a new contract...</option>
110+
<option tal:repeat="contract all_contracts"
111+
value="${contract[0]}">${contract[1]}</option>
112+
</select>
113+
<script>$('#new_contract').chosen()</script>
100114

101115
<input type="text"
102116
name="invoice_number"

0 commit comments

Comments
 (0)