/
page_xliff_import_view.py
131 lines (114 loc) · 4.24 KB
/
page_xliff_import_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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
from __future__ import annotations
import logging
import os
from typing import TYPE_CHECKING
from django.conf import settings
from django.contrib import messages
from django.shortcuts import redirect
from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _
from django.views.generic import TemplateView
from ....xliff.utils import get_xliff_import_diff, xliff_import_confirm
from ...decorators import permission_required
from .page_context_mixin import PageContextMixin
if TYPE_CHECKING:
from typing import Any
from django.http import HttpRequest, HttpResponse
from django.http.response import HttpResponseRedirect
logger = logging.getLogger(__name__)
@method_decorator(permission_required("cms.view_page"), name="dispatch")
class PageXliffImportView(TemplateView, PageContextMixin):
"""
View for importing uploaded XLIFF files
"""
#: Template for XLIFF import view
template_name = "pages/page_xliff_import_view.html"
# Custom attributes:
#: The region of this view
region = None
#: The language of this view
language = None
#: The upload directory of this import
xliff_dir = None
def get_context_data(self, **kwargs: Any) -> dict[str, Any]:
r"""
Returns a dictionary representing the template context
(see :meth:`~django.views.generic.base.ContextMixin.get_context_data`).
:param \**kwargs: The given keyword arguments
:return: The template context
"""
if TYPE_CHECKING:
assert self.xliff_dir
context = super().get_context_data(**kwargs)
context.update(
{
"current_menu_item": "pages",
"upload_dir": os.path.basename(self.xliff_dir),
"translation_diffs": get_xliff_import_diff(
self.request, self.xliff_dir
),
"language": self.language,
}
)
return context
def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
r"""
Redirect to page tree if XLIFF directory does not exist
:param request: The current request
:param \*args: The supplied arguments
:param \**kwargs: The supplied keyword arguments
:return: The rendered template response
"""
# Get current region and language
self.region = request.region
if TYPE_CHECKING:
assert self.region
self.language = self.region.get_language_or_404(
kwargs.get("language_slug"), only_active=True
)
# Get directory path of the uploaded XLIFF files
self.xliff_dir = os.path.join(
settings.XLIFF_UPLOAD_DIR, str(kwargs.get("xliff_dir"))
)
if not os.path.isdir(self.xliff_dir):
messages.error(
request,
_("This XLIFF import is no longer available."),
)
return redirect(
"pages",
**{
"region_slug": self.region.slug,
"language_slug": self.language.slug,
},
)
return super().dispatch(request, *args, **kwargs)
def post(
self, request: HttpRequest, *args: Any, **kwargs: Any
) -> HttpResponseRedirect:
r"""
Confirm the xliff import
:param request: The current request
:param \*args: The supplied arguments
:param \**kwargs: The supplied keyword arguments
:return: The rendered template response
"""
if TYPE_CHECKING:
assert self.region
assert self.language
assert self.xliff_dir
logger.info(
"XLIFF files of directory %r imported by %r",
self.xliff_dir,
request.user,
)
machine_translated = request.POST.get("machine_translated") == "on"
if xliff_import_confirm(request, self.xliff_dir, machine_translated):
return redirect(
"pages",
**{
"region_slug": self.region.slug,
"language_slug": self.language.slug,
},
)
return self.render_to_response(self.get_context_data(**kwargs))