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))
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))
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()), })
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))
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())
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())))
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())))
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) )
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))
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())
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))
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())}, )
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))
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))