Files
tecvico-website/apps/projects/views.py
T
2026-07-19 14:31:28 +03:30

128 lines
4.3 KiB
Python

from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.shortcuts import redirect
from django.urls import reverse
from django.views.generic import CreateView, DetailView, ListView, UpdateView
from .forms import ProjectBriefForm, WIZARD_STEPS
from .models import ProjectBrief, ProjectBriefAttachment
class ClientBriefMixin(LoginRequiredMixin):
def get_queryset(self):
return ProjectBrief.objects.filter(client=self.request.user)
class DashboardView(ClientBriefMixin, ListView):
model = ProjectBrief
template_name = "projects/dashboard.html"
context_object_name = "briefs"
paginate_by = 10
class ProjectBriefCreateView(LoginRequiredMixin, CreateView):
model = ProjectBrief
form_class = ProjectBriefForm
template_name = "projects/brief_wizard.html"
def get_success_url(self):
messages.success(self.request, "Project brief submitted. We'll review it soon.")
return reverse("projects:detail", kwargs={"pk": self.object.pk})
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx["form_title"] = "Submit a Project Brief"
ctx["submit_label"] = "Submit brief"
ctx["wizard_steps"] = WIZARD_STEPS
ctx["initial_step"] = self._initial_step()
return ctx
def _initial_step(self):
form = self.get_form()
if form.is_bound and form.errors:
return form.first_error_step()
return 1
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
if self.request.method == "POST":
kwargs["file_list"] = self.request.FILES.getlist("attachments")
else:
kwargs["file_list"] = None
return kwargs
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.client = self.request.user
self.object.save()
self._save_attachments(form)
return redirect(self.get_success_url())
def _save_attachments(self, form):
for uploaded_file, original_name in form.cleaned_data.get("attachments", []):
attachment = ProjectBriefAttachment(
brief=self.object,
original_filename=original_name,
)
attachment.file.save(original_name, uploaded_file, save=True)
class ProjectBriefDetailView(ClientBriefMixin, DetailView):
model = ProjectBrief
template_name = "projects/brief_detail.html"
context_object_name = "brief"
class ProjectBriefUpdateView(ClientBriefMixin, UserPassesTestMixin, UpdateView):
model = ProjectBrief
form_class = ProjectBriefForm
template_name = "projects/brief_wizard.html"
def test_func(self):
brief = self.get_object()
return brief.is_editable_by_client
def handle_no_permission(self):
messages.error(self.request, "This brief can no longer be edited.")
return redirect("projects:detail", pk=self.kwargs["pk"])
def get_success_url(self):
messages.success(self.request, "Project brief updated.")
return reverse("projects:detail", kwargs={"pk": self.object.pk})
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx["form_title"] = "Edit Project Brief"
ctx["submit_label"] = "Save changes"
ctx["brief"] = self.object
ctx["wizard_steps"] = WIZARD_STEPS
ctx["initial_step"] = self._initial_step()
return ctx
def _initial_step(self):
form = self.get_form()
if form.is_bound and form.errors:
return form.first_error_step()
return 1
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
if self.request.method == "POST":
kwargs["file_list"] = self.request.FILES.getlist("attachments")
else:
kwargs["file_list"] = None
return kwargs
def form_valid(self, form):
response = super().form_valid(form)
self._save_attachments(form)
return response
def _save_attachments(self, form):
for uploaded_file, original_name in form.cleaned_data.get("attachments", []):
attachment = ProjectBriefAttachment(
brief=self.object,
original_filename=original_name,
)
attachment.file.save(original_name, uploaded_file, save=True)