/
language_tree_node_form_view.py
77 lines (59 loc) · 2.47 KB
/
language_tree_node_form_view.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
from __future__ import annotations
import logging
from typing import TYPE_CHECKING
from django.urls import reverse
from ...forms import LanguageTreeNodeForm
from ...models import EventTranslation, PageTranslation, POITranslation
from ..form_views import CustomCreateView, CustomUpdateView
if TYPE_CHECKING:
from typing import Any
from django.http.response import HttpResponseRedirect
logger = logging.getLogger(__name__)
class LanguageTreeNodeCreateView(CustomCreateView):
"""
Class that handles creating language tree nodes.
This view is available within regions.
"""
#: The form class of this form view
form_class = LanguageTreeNodeForm
def get_success_url(self) -> str:
"""
Determine the URL to redirect to when the form is successfully validated
:return: The url to redirect on success
"""
if "submit_add_new" in self.request.POST:
# If the "Create and add more" button was clicked, redirect to the new creation form
return reverse(
"new_languagetreenode",
kwargs={"region_slug": self.request.region.slug},
)
return super().get_success_url()
def get_form_kwargs(self) -> dict[str, Any]:
"""
Return the keyword arguments for instantiating the form
:return: The form kwargs
"""
kwargs = super().get_form_kwargs()
kwargs["region"] = self.request.region
return kwargs
class LanguageTreeNodeUpdateView(CustomUpdateView):
"""
Class that handles activating/deactivating of a language tree node
"""
def form_valid(self, form: LanguageTreeNodeForm) -> HttpResponseRedirect:
response = super().form_valid(form)
language_tree_node = self.get_object()
if "active" in form.changed_data:
models = [PageTranslation, EventTranslation, POITranslation]
for model in models:
filters = {
f"{model.foreign_field()}__region": language_tree_node.region,
"language": language_tree_node.language,
}
distinct = [f"{model.foreign_field()}__pk", "language__pk"]
for translation in model.objects.filter(**filters).distinct(*distinct):
if language_tree_node.active:
translation.save(update_timestamp=False)
else:
translation.links.all().delete()
return response