def is_admin_or_manager(user): return auth.is_admin_or_manager(user)
def edit_timesheet(request, username, year, month, day): """ Edits a User's complete Timesheet for a particular week. """ user = get_object_or_404(User, username=username) if not user_can_access_user(request.user, user): return permission_denied(request) week_commencing = week_commencing_date_or_404(year, month, day) timesheet, created = \ Timesheet.objects.get_or_create(user=user, week_commencing=week_commencing) can_approve = is_admin_or_manager(request.user) jobs, tasks_by_job = get_jobs_and_tasks_for_user(user) expense_types = ExpenseType.objects.all() # Get Timesheet contents timesheet_time_entries = list(TimeEntry.objects.for_timesheet(timesheet)) booked = TimeEntry.objects.hours_booked_for_tasks( [te.task_id for te in timesheet_time_entries]) for time_entry in timesheet_time_entries: time_entry.task_hours_booked = booked[time_entry.task_id] time_entry.job_display = u'%05d - %s' % (time_entry.job_number, time_entry.job_name) timesheet_expenses = list(Expense.objects.for_timesheet(timesheet)) for expense in timesheet_expenses: expense.job_display = u'%05d - %s' % (expense.job_number, expense.job_name) # Create forms for timesheet contents, where necessary time_entries = [] expenses = [] if request.method == 'POST': # Create forms with POSTed data for time_entry in timesheet_time_entries: if time_entry.is_editable(): time_entries.append((time_entry, EditTimeEntryForm(time_entry, jobs, tasks_by_job[time_entry.job_id], can_approve, prefix='entry%s' % time_entry.id, data=request.POST))) elif time_entry.is_approved(): time_entries.append((time_entry, ApprovedTimeEntryForm(time_entry, can_approve, prefix='entry%s' % time_entry.id, data=request.POST))) else: time_entries.append((time_entry, None)) for expense in timesheet_expenses: if expense.is_editable(): expenses.append((expense, EditExpenseForm(expense, jobs, expense_types, week_commencing, can_approve, prefix='expense%s' % expense.id, data=request.POST))) elif expense.is_approved(): expenses.append((expense, ApprovedExpenseForm(expense, can_approve, prefix='expense%s' % expense.id, data=request.POST))) else: expenses.append((expense, None)) # Validate all forms all_valid = True for time_entry, form in time_entries: if form is not None and not form.is_valid(): all_valid = False break for expense, form in expenses: if form is not None and not form.is_valid(): all_valid = False break # Save if all forms are valid if all_valid: for time_entry, form in time_entries: if form: form.save(request.user, commit=True) for expense, form in expenses: if form: form.save(request.user, commit=True) messages.success(request, 'The %s was successfully saved.' \ % Timesheet._meta.verbose_name) return HttpResponseRedirect(timesheet.get_absolute_url()) else: # Create forms for time_entry in timesheet_time_entries: if time_entry.is_editable(): time_entries.append((time_entry, EditTimeEntryForm(time_entry, jobs, tasks_by_job[time_entry.job_id], can_approve, prefix='entry%s' % time_entry.id))) elif time_entry.is_approved(): time_entries.append((time_entry, ApprovedTimeEntryForm(time_entry, can_approve, prefix='entry%s' % time_entry.id))) else: time_entries.append((time_entry, None)) for expense in timesheet_expenses: if expense.is_editable(): expenses.append((expense, EditExpenseForm(expense, jobs, expense_types, week_commencing, can_approve, prefix='expense%s' % expense.id))) elif expense.is_approved(): expenses.append((expense, ApprovedExpenseForm(expense, can_approve, prefix='expense%s' % expense.id))) else: expenses.append((expense, None)) return render_to_response('timesheets/edit_timesheet.html', { 'user_': user, 'timesheet': timesheet, 'time_entries': time_entries, 'expenses': expenses, 'task_json': mark_safe(create_task_json(tasks_by_job)), 'can_approve': can_approve, }, RequestContext(request))