# -*- coding: utf-8 -*-
from django.contrib.auth.decorators import permission_required
from django.http import HttpResponsePermanentRedirect, HttpResponseRedirect
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _
from django.views.generic import DetailView
from django.views.generic.base import TemplateView
from django.views.generic.edit import CreateView, FormView, UpdateView
from guardian.decorators import permission_required as object_permission_required
from uuslug import slugify
from tcms.core.forms import SimpleCommentForm
from tcms.management.models import Priority
from tcms.testcases.models import TestCaseStatus
from tcms.testplans.forms import (
ClonePlanForm,
NewPlanForm,
PlanNotifyFormSet,
SearchPlanForm,
)
from tcms.testplans.models import TestPlan
from tcms.testruns.models import TestRun
[docs]
@method_decorator(permission_required("testplans.add_testplan"), name="dispatch")
class NewTestPlanView(CreateView):
model = TestPlan
form_class = NewPlanForm
template_name = "testplans/mutable.html"
[docs]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["notify_formset"] = kwargs.get("notify_formset") or PlanNotifyFormSet()
return context
[docs]
@method_decorator(
object_permission_required(
"testplans.change_testplan", (TestPlan, "pk", "pk"), accept_global_perms=True
),
name="dispatch",
)
class Edit(UpdateView):
model = TestPlan
form_class = NewPlanForm
template_name = "testplans/mutable.html"
[docs]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["notify_formset"] = kwargs.get("notify_formset") or PlanNotifyFormSet(
instance=self.object
)
return context
[docs]
@method_decorator(permission_required("testplans.view_testplan"), name="dispatch")
class SearchTestPlanView(TemplateView):
template_name = "testplans/search.html"
[docs]
def get_context_data(self, **kwargs):
form = SearchPlanForm(self.request.GET)
form.populate(product_id=self.request.GET.get("product"))
context_data = {
"form": form,
}
return context_data
[docs]
@method_decorator(
object_permission_required(
"testplans.view_testplan", (TestPlan, "pk", "pk"), accept_global_perms=True
),
name="dispatch",
)
class TestPlanGetView(DetailView):
template_name = "testplans/get.html"
http_method_names = ["get"]
model = TestPlan
[docs]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["statuses"] = TestCaseStatus.objects.all()
context["priorities"] = Priority.objects.filter(is_active=True)
context["comment_form"] = SimpleCommentForm()
context["test_runs"] = TestRun.objects.filter(
plan_id=self.object.pk, stop_date__isnull=True
).order_by("-id")[:5]
context["OBJECT_MENU_ITEMS"] = [
(
"...",
[
(_("Edit"), reverse("plan-edit", args=[self.object.pk])),
(_("Clone"), reverse("plans-clone", args=[self.object.pk])),
(
_("History"),
f"/admin/testplans/testplan/{self.object.pk}/history/",
),
("-", "-"),
(
_("Object permissions"),
reverse(
"admin:testplans_testplan_permissions",
args=[self.object.pk],
),
),
("-", "-"),
(
_("Delete"),
reverse(
"admin:testplans_testplan_delete",
args=[self.object.pk],
),
),
],
)
]
return context
[docs]
@method_decorator(
object_permission_required(
"testplans.view_testplan", (TestPlan, "pk", "pk"), accept_global_perms=True
),
name="dispatch",
)
class GetTestPlanRedirectView(DetailView):
http_method_names = ["get"]
model = TestPlan
[docs]
def get(self, request, *args, **kwargs):
test_plan = self.get_object()
return HttpResponsePermanentRedirect(
reverse("test_plan_url", args=[test_plan.pk, slugify(test_plan.name)])
)
[docs]
@method_decorator(permission_required("testplans.add_testplan"), name="dispatch")
class Clone(FormView):
template_name = "testplans/clone.html"
form_class = ClonePlanForm
object = None
[docs]
def get(self, request, *args, **kwargs):
self.object = TestPlan.objects.get(pk=kwargs["pk"])
return super().get(request, *args, **kwargs)
[docs]
def post(self, request, *args, **kwargs):
self.object = TestPlan.objects.get(pk=kwargs["pk"])
return super().post(request, *args, **kwargs)
[docs]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["object"] = self.object
return context