Passed
Pull Request — master (#1)
by
unknown
01:37
created

AdminLocalizedFieldWidget.render()   D

Complexity

Conditions 8

Size

Total Lines 26

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 62.4227

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 8
c 1
b 0
f 1
dl 0
loc 26
rs 4
ccs 1
cts 19
cp 0.0526
crap 62.4227
1 1
from typing import List
2
3 1
from django import forms
4 1
from django.conf import settings
5 1
from django.forms import MultiWidget
6 1
from django.template.loader import render_to_string
7
8 1
from .fields.localized_value import LocalizedValue
9
10
11 1
class LocalizedFieldWidget(MultiWidget):
12
    """Widget that has an input box for every language."""
13 1
    widget = forms.Textarea
14
15 1
    def __init__(self, *args, **kwargs):
16
        """Initializes a new instance of :see:LocalizedFieldWidget."""
17
18 1
        widgets = []
19
20 1
        for _ in settings.LANGUAGES:
21 1
            widgets.append(self.widget)
22
23 1
        super(LocalizedFieldWidget, self).__init__(widgets, *args, **kwargs)
24
25 1
    def decompress(self, value: LocalizedValue) -> List[str]:
26
        """Decompresses the specified value so
27
        it can be spread over the internal widgets.
28
29
        Arguments:
30
            value:
31
                The :see:LocalizedValue to display in this
32
                widget.
33
34
        Returns:
35
            All values to display in the inner widgets.
36
        """
37
38 1
        result = []
39
40 1
        for lang_code, _ in settings.LANGUAGES:
41 1
            if value:
42 1
                result.append(value.get(lang_code))
43
            else:
44 1
                result.append(None)
45
46 1
        return result
47
48
49 1
class AdminLocalizedFieldWidget(LocalizedFieldWidget):
50 1
    widget = forms.Textarea
51 1
    template = 'localized_fields/admin/widget.html'
52
53 1
    def render(self, name, value, attrs=None):
54
        if self.is_localized:
55
            for widget in self.widgets:
56
                widget.is_localized = self.is_localized
57
        # value is a list of values, each corresponding to a widget
58
        # in self.widgets.
59
        if not isinstance(value, list):
60
            value = self.decompress(value)
61
        output = []
62
        final_attrs = self.build_attrs(attrs)
63
        id_ = final_attrs.get('id')
64
        for i, widget in enumerate(self.widgets):
65
            try:
66
                widget_value = value[i]
67
            except IndexError:
68
                widget_value = None
69
            if id_:
70
                final_attrs = dict(final_attrs, id='%s_%s' % (id_, i))
71
            output.append(widget.render(name + '_%s' % i, widget_value, final_attrs))
72
        context = {
73
            'id': final_attrs.get('id'),
74
            'name': name,
75
            'widgets': zip([code for code, lang in settings.LANGUAGES], output),
76
            'available_languages': settings.LANGUAGES
77
        }
78
        return render_to_string(self.template, context)
79