get_language_tabs()   D
last analyzed

Complexity

Conditions 8

Size

Total Lines 42

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 42
c 1
b 0
f 0
rs 4
cc 8
1
"""
2
Internal DRY functions.
3
"""
4
from django.conf import settings
5
from parler import appsettings
6
from parler.utils import normalize_language_code, is_multilingual_project, get_language_title
7
8
9
def get_language_parameter(request, query_language_key='language', object=None, default=None):
10
    """
11
    Get the language parameter from the current request.
12
    """
13
    # This is the same logic as the django-admin uses.
14
    # The only difference is the origin of the request parameter.
15
    if not is_multilingual_project():
16
        # By default, the objects are stored in a single static language.
17
        # This makes the transition to multilingual easier as well.
18
        # The default language can operate as fallback language too.
19
        return default or appsettings.PARLER_LANGUAGES.get_default_language()
20
    else:
21
        # In multilingual mode, take the provided language of the request.
22
        code = request.GET.get(query_language_key)
23
24
        if not code:
25
            # forms: show first tab by default
26
            code = default or appsettings.PARLER_LANGUAGES.get_first_language()
27
28
        return normalize_language_code(code)
29
30
31
def get_language_tabs(request, current_language, available_languages, css_class=None):
32
    """
33
    Determine the language tabs to show.
34
    """
35
    tabs = TabsList(css_class=css_class)
36
    get = request.GET.copy()  # QueryDict object
37
    tab_languages = []
38
39
    site_id = getattr(settings, 'SITE_ID', None)
40
    for lang_dict in appsettings.PARLER_LANGUAGES.get(site_id, ()):
41
        code = lang_dict['code']
42
        title = get_language_title(code)
43
        get['language'] = code
44
        url = '?{0}'.format(get.urlencode())
45
46
        if code == current_language:
47
            status = 'current'
48
        elif code in available_languages:
49
            status = 'available'
50
        else:
51
            status = 'empty'
52
53
        tabs.append((url, title, code, status))
54
        tab_languages.append(code)
55
56
    # Additional stale translations in the database?
57
    if appsettings.PARLER_SHOW_EXCLUDED_LANGUAGE_TABS:
58
        for code in available_languages:
59
            if code not in tab_languages:
60
                get['language'] = code
61
                url = '?{0}'.format(get.urlencode())
62
63
                if code == current_language:
64
                    status = 'current'
65
                else:
66
                    status = 'available'
67
68
                tabs.append((url, get_language_title(code), code, status))
69
70
    tabs.current_is_translated = current_language in available_languages
71
    tabs.allow_deletion = len(available_languages) > 1
72
    return tabs
73
74
75
class TabsList(list):
76
77
    def __init__(self, seq=(), css_class=None):
78
        self.css_class = css_class
79
        self.current_is_translated = False
80
        self.allow_deletion = False
81
        super(TabsList, self).__init__(seq)
82