dirty, ugly but workable
[prawokultury.git] / migdal / helpers.py
1 # -*- coding: utf-8 -*-
2 # This file is part of PrawoKultury, licensed under GNU Affero GPLv3 or later.
3 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
4 #
5 from collections import namedtuple
6 from copy import copy
7 import re
8 from django.conf import settings
9 from django.conf.urls import patterns
10 from django.core.urlresolvers import LocaleRegexURLResolver
11 from django.utils.translation import get_language, string_concat
12
13
14 class EntryType(namedtuple('EntryType', 'db slug commentable on_main')):
15     def __unicode__(self):
16         return unicode(self.slug)
17
18
19 def field_getter(name):
20     @property
21     def getter(self):
22         val = getattr(self, "%s_%s" % (name, get_language()))
23         if not val:
24             val = getattr(self, "%s_%s" % (name, settings.LANGUAGE_CODE))
25         return val
26     return getter
27
28
29 def add_translatable(model, fields, languages=None):
30     """Adds some translatable fields to a model, and a getter."""
31     if languages is None:
32         languages = settings.LANGUAGES
33     for name, field in fields.items():
34         for lang_code, lang_name in languages:
35             new_field = copy(field)
36             if field.verbose_name:
37                 new_field.verbose_name = string_concat(field.verbose_name, ' [%s]' % lang_code)
38             new_field.contribute_to_class(model, "%s_%s" % (name, lang_code))
39         setattr(model, name, field_getter(name))
40         # add setter?
41
42
43 class MyLocaleRegexURLResolver(LocaleRegexURLResolver):
44     """
45     A URL resolver that always matches the active language code as URL prefix.
46
47     Rather than taking a regex argument, we just override the ``regex``
48     function to always return the active language-code as regex.
49     """
50     @property
51     def regex(self):
52         language_code = get_language()
53         if language_code == settings.LANGUAGE_CODE:
54             return re.compile('')
55         if language_code not in self._regex_dict:
56             regex_compiled = re.compile('^%s/' % language_code, re.UNICODE)
57             self._regex_dict[language_code] = regex_compiled
58         return self._regex_dict[language_code]
59
60
61 def i18n_patterns(prefix, *args):
62     """
63     Adds the language code prefix to every URL pattern within this
64     function. This may only be used in the root URLconf, not in an included
65     URLconf.
66
67     """
68     pattern_list = patterns(prefix, *args)
69     if not settings.USE_I18N:
70         return pattern_list
71     return pattern_list + [MyLocaleRegexURLResolver(pattern_list)]
72