310 lines
6.8 KiB
Python
310 lines
6.8 KiB
Python
from django.shortcuts import render, get_object_or_404, redirect
|
|
from django.contrib.auth.decorators import login_required
|
|
from accounts.decorators import permission_required
|
|
from .forms import ProjectForm, ProjectAddLocationForm, ProjectAddContactForm, ProjectAddForm, ProjectAddWorkerForm
|
|
|
|
from .models import (
|
|
Project,
|
|
ProjectMembership,
|
|
ProjectContact,
|
|
ProjectLocation,
|
|
)
|
|
|
|
from invoices.models import CustomerContact, CustomerLocation
|
|
|
|
|
|
|
|
@login_required
|
|
@permission_required("projects_add")
|
|
def project_add(request):
|
|
form = ProjectAddForm(request.POST or None,request.FILES or None,)
|
|
if request.method == "POST" and form.is_valid():
|
|
project = form.save()
|
|
ProjectMembership.objects.create(project=project,user=request.user,role=ProjectMembership.Role.OWNER,)
|
|
return redirect("projects:overview",project.id)
|
|
|
|
return render(request,"projects/add.html",{"form": form,})
|
|
|
|
|
|
|
|
@login_required
|
|
@permission_required("projects_archived_view")
|
|
def projects_archived(request):
|
|
memberships = ProjectMembership.objects.select_related("project").filter(user=request.user,project__active=False)
|
|
return render(request,"projects/archived.html",{"memberships": memberships,})
|
|
|
|
|
|
|
|
# ---------------------------
|
|
# OVERVIEW
|
|
# ---------------------------
|
|
@login_required
|
|
@permission_required("projects_view")
|
|
def project_overview(request, project_id):
|
|
|
|
membership = get_object_or_404(
|
|
ProjectMembership,
|
|
user=request.user,
|
|
project_id=project_id
|
|
)
|
|
|
|
project = membership.project
|
|
|
|
return render(request, "projects/overview.html", {
|
|
"project": project,
|
|
"role": membership.role
|
|
})
|
|
|
|
|
|
@login_required
|
|
@permission_required("projects_detail_view")
|
|
def project_info(request, project_id):
|
|
|
|
membership = get_object_or_404(
|
|
ProjectMembership,
|
|
user=request.user,
|
|
project_id=project_id
|
|
)
|
|
|
|
project = membership.project
|
|
|
|
form = ProjectForm(
|
|
instance=project
|
|
)
|
|
|
|
workers = project.memberships.select_related(
|
|
"user"
|
|
).all()
|
|
|
|
|
|
return render(
|
|
request,
|
|
"projects/info.html",
|
|
{
|
|
"project": project,
|
|
"form": form,
|
|
|
|
"locations": project.project_locations.select_related(
|
|
"location"
|
|
),
|
|
|
|
"contacts": project.project_contacts.select_related(
|
|
"contact"
|
|
),
|
|
|
|
"workers": workers,
|
|
}
|
|
)
|
|
|
|
|
|
@login_required
|
|
@permission_required("projects_edit")
|
|
def project_edit(request, project_id):
|
|
|
|
membership = get_object_or_404(
|
|
ProjectMembership,
|
|
user=request.user,
|
|
project_id=project_id
|
|
)
|
|
|
|
project = membership.project
|
|
|
|
|
|
if request.method != "POST":
|
|
return redirect(
|
|
"projects:info",
|
|
project.id
|
|
)
|
|
|
|
|
|
form = ProjectForm(
|
|
request.POST,
|
|
request.FILES,
|
|
instance=project
|
|
)
|
|
|
|
|
|
if form.is_valid():
|
|
form.save()
|
|
|
|
|
|
return redirect(
|
|
"projects:info",
|
|
project.id
|
|
)
|
|
|
|
# ---------------------------
|
|
# ADD CONTACT TO PROJECT
|
|
# ---------------------------
|
|
@login_required
|
|
@permission_required("projects_contact_add")
|
|
def project_contact_add(request, project_id):
|
|
|
|
project = get_object_or_404(Project, pk=project_id)
|
|
|
|
if request.method == "POST":
|
|
form = ProjectAddContactForm(
|
|
request.POST,
|
|
project=project,
|
|
)
|
|
|
|
if form.is_valid():
|
|
contact = form.cleaned_data["contact"]
|
|
|
|
ProjectContact.objects.get_or_create(
|
|
project=project,
|
|
contact=contact
|
|
)
|
|
|
|
return redirect("projects:info", project.id)
|
|
|
|
else:
|
|
form = ProjectAddContactForm(project=project)
|
|
|
|
return render(request, "projects/contact_add.html", {
|
|
"form": form,
|
|
"project": project,
|
|
})
|
|
|
|
@login_required
|
|
@permission_required("projects_contact_delete")
|
|
def project_contact_delete(request, project_id, contact_id):
|
|
|
|
membership = get_object_or_404(
|
|
ProjectMembership,
|
|
user=request.user,
|
|
project_id=project_id
|
|
)
|
|
|
|
project = membership.project
|
|
|
|
|
|
if request.method == "POST":
|
|
|
|
ProjectContact.objects.filter(
|
|
id=contact_id,
|
|
project=project
|
|
).delete()
|
|
|
|
|
|
return redirect(
|
|
"projects:info",
|
|
project.id
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ---------------------------
|
|
# ADD LOCATION TO PROJECT
|
|
# ---------------------------
|
|
@login_required
|
|
@permission_required("projects_location_add")
|
|
def project_location_add(request, project_id):
|
|
|
|
project = get_object_or_404(Project, pk=project_id)
|
|
|
|
if request.method == "POST":
|
|
form = ProjectAddLocationForm(
|
|
request.POST,
|
|
project=project,
|
|
)
|
|
|
|
if form.is_valid():
|
|
location = form.cleaned_data["location"]
|
|
|
|
ProjectLocation.objects.get_or_create(
|
|
project=project,
|
|
location=location
|
|
)
|
|
|
|
return redirect("projects:info", project.id)
|
|
|
|
else:
|
|
form = ProjectAddLocationForm(project=project)
|
|
|
|
return render(request, "projects/location_add.html", {
|
|
"form": form,
|
|
"project": project,
|
|
})
|
|
|
|
@login_required
|
|
@permission_required("projects_location_delete")
|
|
def project_location_delete(request, project_id, location_id):
|
|
|
|
membership = get_object_or_404(
|
|
ProjectMembership,
|
|
user=request.user,
|
|
project_id=project_id
|
|
)
|
|
|
|
project = membership.project
|
|
|
|
|
|
if request.method == "POST":
|
|
|
|
ProjectLocation.objects.filter(
|
|
id=location_id,
|
|
project=project
|
|
).delete()
|
|
|
|
|
|
return redirect(
|
|
"projects:info",
|
|
project.id
|
|
)
|
|
|
|
|
|
@login_required
|
|
@permission_required("projects_user_add")
|
|
def project_worker_add(request, project_id):
|
|
project = get_object_or_404(Project, pk=project_id)
|
|
get_object_or_404(ProjectMembership,project=project,user=request.user)
|
|
form = ProjectAddWorkerForm(request.POST or None,project=project)
|
|
|
|
if request.method == "POST" and form.is_valid():
|
|
membership = form.save(commit=False)
|
|
membership.project = project
|
|
membership.save()
|
|
return redirect("projects:info",project.id)
|
|
|
|
return render(request,"projects/worker_add.html",{"form": form,"project": project,})
|
|
|
|
|
|
@login_required
|
|
@permission_required("projects_user_delete")
|
|
def project_worker_delete(request, project_id, worker_id):
|
|
|
|
membership = get_object_or_404(
|
|
ProjectMembership,
|
|
user=request.user,
|
|
project_id=project_id
|
|
)
|
|
|
|
project = membership.project
|
|
|
|
|
|
worker = get_object_or_404(
|
|
ProjectMembership,
|
|
id=worker_id,
|
|
project=project
|
|
)
|
|
|
|
|
|
if request.method == "POST":
|
|
|
|
if worker.role != ProjectMembership.Role.OWNER:
|
|
worker.delete()
|
|
|
|
|
|
return redirect(
|
|
"projects:info",
|
|
project.id
|
|
) |