Exemplo n.º 1
0
def delete_expense(request, username, year, month, day, expense_id):
    """
    Deletes an Expense from a User's Timesheet.
    """
    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 = get_object_or_404(Timesheet, user=user,
                                  week_commencing=week_commencing)
    expense = get_object_or_404(Expense.objects.for_timesheet(timesheet),
                                pk=expense_id)
    if not expense.is_editable():
        return HttpResponseForbidden(u'The selected %s is not deleteable.' \
                                     % Expense._meta.verbose_name)

    if request.method == 'POST':
        expense.delete()
        messages.success(request, 'The %s was deleted successfully.' \
                                  % Expense._meta.verbose_name)
        return HttpResponseRedirect(timesheet.get_absolute_url())
    else:
        expense.job_display = u'%05d - %s' % (expense.job_number,
                                              expense.job_name)
        return render_to_response('timesheets/delete_expense.html', {
                'user_': user,
                'timesheet': timesheet,
                'expense': expense,
            }, RequestContext(request))
Exemplo n.º 2
0
def add_expense(request, username, year, month, day):
    """
    Adds an Expense to a User's Timesheet.
    """
    user = get_object_or_404(User, username=username)
    if not user_can_access_user(request.user, user):
        return permission_denied(request)
    jobs, tasks_by_job = get_jobs_and_tasks_for_user(user)
    week_commencing = week_commencing_date_or_404(year, month, day)
    timesheet, created = \
        Timesheet.objects.get_or_create(user=user,
                                        week_commencing=week_commencing)

    if request.method == 'POST':
        form = AddExpenseForm(jobs, week_commencing, data=request.POST)
        if form.is_valid():
            expense = form.save(timesheet=timesheet)
            messages.success(request, 'The %s was added successfully' \
                                      % Expense._meta.verbose_name)
            return HttpResponseRedirect(reverse('edit_timesheet',
                                                args=(username, year, month,
                                                      day)))
    else:
        form = AddExpenseForm(jobs, week_commencing)
    return render_to_response('timesheets/add_expense.html', {
            'user_': user,
            'timesheet': timesheet,
            'form': form,
        }, RequestContext(request))
Exemplo n.º 3
0
def prepopulate_timesheet(request, username, year, month, day):
    """
    Prepopulates a Timesheet with empty Time Entries for the Tasks the
    User booked Time Entries against in the previous week's Timesheet.
    """
    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)
    try:
        previous_week_commencing = week_commencing - datetime.timedelta(days=7)
        previous_timesheet = \
            Timesheet.objects.get(user=user,
                                  week_commencing=previous_week_commencing)
        task_types = TaskType.objects \
                      .filter(tasks__timeentries__timesheet=previous_timesheet) \
                       .distinct()
        for task_type in task_types:
            TimeEntry.objects.create(timesheet=timesheet, task_type=task_type)
        messages.success(request,
                         "Successfully prepopulated Time Entries from the previous week's Timesheet.")
    except Timesheet.DoesNotExist:
        messages.warning('Cannot prepopulate as there is no Timesheet for the previous week.')
    return HttpResponseRedirect(timesheet.get_absolute_url())
Exemplo n.º 4
0
def approve_timesheet(request, username, year, month, day):
    """
    Approves all Time Entries and Expenses in a User's Timesheet for a
    particular week.
    """
    if request.method != 'POST':
        raise Http404
    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)
    entries, expenses = timesheet.approve(request.user)
    messages.success(requset, '%s time entr%s and %s expense%s were approved.' \
                              % (entries, pluralize(entries, u'y,ies'),
                                 expenses, pluralize(expenses)))
    return HttpResponseRedirect(timsheet.get_absolute_url())
Exemplo n.º 5
0
def add_time_entry(request, username, year, month, day):
    """
    Adds a Time Entry to a User's Timesheet.
    """
    user = get_object_or_404(User, username=username)
    if user.get_profile().is_admin():
        return HttpResponseBadRequest(
            u'Time Entries may not be created for administration accounts.')
    if not user_can_access_user(request.user, user):
        return permission_denied(request)
    jobs, tasks_by_job = get_jobs_and_tasks_for_user(user)
    week_commencing = week_commencing_date_or_404(year, month, day)
    timesheet, created = \
        Timesheet.objects.get_or_create(user=user,
                                        week_commencing=week_commencing)

    if request.method == 'POST':
        try:
            form_tasks = tasks_by_job[int(request.POST['job'])]
        except:
            form_tasks = None
        form = AddTimeEntryForm(jobs, tasks=form_tasks, data=request.POST)
        if form.is_valid():
            entry = form.save(timesheet=timesheet)
            messages.success(request, 'The %s was added successfully' \
                                      % TimeEntry._meta.verbose_name)
            return HttpResponseRedirect(reverse('edit_timesheet',
                                                args=(username, year, month,
                                                      day)))
    else:
        form = AddTimeEntryForm(jobs)
    return render_to_response('timesheets/add_time_entry.html', {
            'user_': user,
            'timesheet': timesheet,
            'form': form,
            'task_json': mark_safe(create_task_json(tasks_by_job)),
        }, RequestContext(request))
Exemplo n.º 6
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))