Files
ProjectApp/projects/views.py
T
Felix Baumann fb47c53d52 Initial commit
2026-06-27 17:07:34 +00:00

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
)