Example #1
0
def is_admin_or_manager(user):
    return auth.is_admin_or_manager(user)
Example #2
0
def is_admin_or_manager(user):
    return auth.is_admin_or_manager(user)
Example #3
0
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))