Beispiel #1
0
def add_artifact(request, job_number):
    """
    Adds an Artifact.
    """
    job = get_object_or_404(Job, number=int(job_number))
    if not job.is_accessible_to_user(request.user):
        return permission_denied(request)
    if request.method == 'POST':
        form = ArtifactForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            artifact = form.save(commit=False)
            artifact.job = job
            artifact.created_at = datetime.datetime.now()
            artifact.updated_at = artifact.created_at
            artifact.save()
            messages.success(request, 'The %s was added successfully.' \
                                      % Artifact._meta.verbose_name)
            return HttpResponseRedirect(
                reverse('artifact_list', args=(job_number, )))
    else:
        form = ArtifactForm()
    return render_to_response('artifacts/add_artifact.html', {
        'form': form,
        'job': job,
    }, RequestContext(request))
Beispiel #2
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))
Beispiel #3
0
def artifact_list(request, job_number):
    """
    Lists Artifacts for the Job with the given number.

    Only list Atrifacts which the logged-in user has access to, based on
    their role and the access type set on each Artifact.
    """
    job = get_object_or_404(Job, number=int(job_number))
    if not job.is_accessible_to_user(request.user):
        return permission_denied(request)
    user_profile = request.user.get_profile()
    queryset = Artifact.objects.accessible_to_user(
        request.user).filter(job=job)
    sort_headers = SortHeaders(request, LIST_HEADERS)
    return list_detail.object_list(
        request,
        queryset.order_by(sort_headers.get_order_by()),
        paginate_by=settings.ITEMS_PER_PAGE,
        allow_empty=True,
        template_object_name='artifact',
        template_name='artifacts/artifact_list.html',
        extra_context={
            'job': job,
            'headers': list(sort_headers.headers()),
        })
Beispiel #4
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))
Beispiel #5
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())
Beispiel #6
0
 def _checkuser(request, *args, **kwargs):
     if request.user.is_authenticated():
         if test_func(request.user):
             return view_func(request, *args, **kwargs)
         from djangoffice.views import permission_denied
         return permission_denied(request)
     return HttpResponseRedirect(
         '%s?%s=%s' % (settings.LOGIN_URL, REDIRECT_FIELD_NAME,
                       quote(request.get_full_path())))
Beispiel #7
0
 def _checkuser(request, *args, **kwargs):
     if request.user.is_authenticated():
         if test_func(request.user):
             return view_func(request, *args, **kwargs)
         from djangoffice.views import permission_denied
         return permission_denied(request)
     return HttpResponseRedirect('%s?%s=%s' % (settings.LOGIN_URL,
                                               REDIRECT_FIELD_NAME,
                                               quote(request.get_full_path())))
Beispiel #8
0
def artifact_detail(request, job_number, artifact_id):
    """
    Displays an Artifact's details.
    """
    job = get_object_or_404(Job, number=int(job_number))
    artifact = get_object_or_404(Artifact, job=job, pk=artifact_id)
    if not job.is_accessible_to_user(request.user) or not artifact.is_accessible_to_user(request.user):
        return permission_denied(request)
    return render_to_response(
        "artifacts/artifact_detail.html", {"artifact": artifact, "job": job}, RequestContext(request)
    )
Beispiel #9
0
def artifact_detail(request, job_number, artifact_id):
    """
    Displays an Artifact's details.
    """
    job = get_object_or_404(Job, number=int(job_number))
    artifact = get_object_or_404(Artifact, job=job, pk=artifact_id)
    if not job.is_accessible_to_user(request.user) or \
       not artifact.is_accessible_to_user(request.user):
        return permission_denied(request)
    return render_to_response('artifacts/artifact_detail.html', {
        'artifact': artifact,
        'job': job,
    }, RequestContext(request))
Beispiel #10
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())
Beispiel #11
0
def add_artifact(request, job_number):
    """
    Adds an Artifact.
    """
    job = get_object_or_404(Job, number=int(job_number))
    if not job.is_accessible_to_user(request.user):
        return permission_denied(request)
    if request.method == "POST":
        form = ArtifactForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            artifact = form.save(commit=False)
            artifact.job = job
            artifact.created_at = datetime.datetime.now()
            artifact.updated_at = artifact.created_at
            artifact.save()
            messages.success(request, "The %s was added successfully." % Artifact._meta.verbose_name)
            return HttpResponseRedirect(reverse("artifact_list", args=(job_number,)))
    else:
        form = ArtifactForm()
    return render_to_response("artifacts/add_artifact.html", {"form": form, "job": job}, RequestContext(request))
Beispiel #12
0
def artifact_list(request, job_number):
    """
    Lists Artifacts for the Job with the given number.

    Only list Atrifacts which the logged-in user has access to, based on
    their role and the access type set on each Artifact.
    """
    job = get_object_or_404(Job, number=int(job_number))
    if not job.is_accessible_to_user(request.user):
        return permission_denied(request)
    user_profile = request.user.get_profile()
    queryset = Artifact.objects.accessible_to_user(request.user).filter(job=job)
    sort_headers = SortHeaders(request, LIST_HEADERS)
    return list_detail.object_list(
        request,
        queryset.order_by(sort_headers.get_order_by()),
        paginate_by=settings.ITEMS_PER_PAGE,
        allow_empty=True,
        template_object_name="artifact",
        template_name="artifacts/artifact_list.html",
        extra_context={"job": job, "headers": list(sort_headers.headers())},
    )
Beispiel #13
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))
Beispiel #14
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))