from datetime import datetime
from django.conf import settings
from rosetta.conf import settings as rosetta_settings
import django
import os
import inspect
from django.apps import AppConfig, apps
from django.utils import timezone
from django.core.cache import caches
cache = caches[rosetta_settings.ROSETTA_CACHE_NAME]
def timestamp_with_timezone(dt=None):
"""
Return a timestamp with a timezone for the configured locale. If all else
fails, consider localtime to be UTC.
"""
dt = dt or datetime.now()
19 ↛ 20line 19 didn't jump to line 20, because the condition on line 19 was never true if timezone is None:
return dt.strftime('%Y-%m-%d %H:%M%z')
21 ↛ 26line 21 didn't jump to line 26, because the condition on line 21 was never false if not dt.tzinfo:
tz = timezone.get_current_timezone()
23 ↛ 24line 23 didn't jump to line 24, because the condition on line 23 was never true if not tz:
tz = timezone.utc
dt = dt.replace(tzinfo=timezone.get_current_timezone())
return dt.strftime("%Y-%m-%d %H:%M%z")
def find_pos(lang, project_apps=True, django_apps=False, third_party_apps=False):
"""
scans a couple possible repositories of gettext catalogs for the given
language code
"""
paths = []
# project/locale
parts = settings.SETTINGS_MODULE.split('.')
project = __import__(parts[0], {}, {}, [])
abs_project_path = os.path.normpath(os.path.abspath(os.path.dirname(project.__file__)))
if project_apps:
43 ↛ 45line 43 didn't jump to line 45, because the condition on line 43 was never false if os.path.exists(os.path.abspath(os.path.join(os.path.dirname(project.__file__), 'locale'))):
paths.append(os.path.abspath(os.path.join(os.path.dirname(project.__file__), 'locale')))
45 ↛ 49line 45 didn't jump to line 49, because the condition on line 45 was never false if os.path.exists(os.path.abspath(os.path.join(os.path.dirname(project.__file__), '..', 'locale'))):
paths.append(os.path.abspath(os.path.join(os.path.dirname(project.__file__), '..', 'locale')))
# django/locale
if django_apps:
django_paths = cache.get('rosetta_django_paths')
51 ↛ 52line 51 didn't jump to line 52, because the condition on line 51 was never true if django_paths is None:
django_paths = []
for root, dirnames, filename in os.walk(os.path.abspath(os.path.dirname(django.__file__))):
if 'locale' in dirnames:
django_paths.append(os.path.join(root, 'locale'))
continue
cache.set('rosetta_django_paths', django_paths, 60 * 60)
paths = paths + django_paths
# settings
for localepath in settings.LOCALE_PATHS:
61 ↛ 60line 61 didn't jump to line 60, because the condition on line 61 was never false if os.path.isdir(localepath):
paths.append(localepath)
# project/app/locale
has_appconfig = False
for appname in settings.INSTALLED_APPS:
if rosetta_settings.EXCLUDED_APPLICATIONS and appname in rosetta_settings.EXCLUDED_APPLICATIONS:
continue
p = appname.rfind('.')
if p >= 0:
app = getattr(__import__(appname[:p], {}, {}, [str(appname[p + 1:])]), appname[p + 1:])
else:
app = __import__(appname, {}, {}, [])
# For django 1.7, an imported INSTALLED_APP can be an AppConfig instead
# of an app module. This code converts the AppConfig to its application
# module.
77 ↛ 82line 77 didn't jump to line 82, because the condition on line 77 was never false if django.VERSION[0:2] >= (1, 7):
if inspect.isclass(app) and issubclass(app, AppConfig):
has_appconfig = True
continue
app_path = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(app.__file__), 'locale')))
# django apps
if 'contrib' in app_path and 'django' in app_path and not django_apps:
continue
# third party external
if not third_party_apps and abs_project_path not in app_path:
continue
# local apps
93 ↛ 94line 93 didn't jump to line 94, because the condition on line 93 was never true if not project_apps and abs_project_path in app_path:
continue
96 ↛ 66line 96 didn't jump to line 66, because the condition on line 96 was never false if os.path.isdir(app_path):
paths.append(app_path)
# Handling with AppConfigs is a wee messy, but we can simply get all the
# app paths directly from apps object
101 ↛ 124line 101 didn't jump to line 124, because the condition on line 101 was never false if has_appconfig:
for app_ in apps.get_app_configs():
if rosetta_settings.EXCLUDED_APPLICATIONS and app_.name in rosetta_settings.EXCLUDED_APPLICATIONS:
continue
app_path = app_.path
# django apps
if 'contrib' in app_path and 'django' in app_path and not django_apps:
continue
# third party external
if not third_party_apps and abs_project_path not in app_path:
continue
# local apps
116 ↛ 117line 116 didn't jump to line 117, because the condition on line 116 was never true if not project_apps and abs_project_path in app_path:
continue
119 ↛ 121line 119 didn't jump to line 121, because the condition on line 119 was never false if os.path.exists(os.path.abspath(os.path.join(app_path, 'locale'))):
paths.append(os.path.abspath(os.path.join(app_path, 'locale')))
if os.path.exists(os.path.abspath(os.path.join(app_path, '..', 'locale'))):
paths.append(os.path.abspath(os.path.join(app_path, '..', 'locale')))
ret = set()
langs = [lang, ]
if u'-' in lang:
_l, _c = map(lambda x: x.lower(), lang.split(u'-', 1))
langs += [u'%s_%s' % (_l, _c), u'%s_%s' % (_l, _c.upper()), u'%s_%s' % (_l, _c.capitalize())]
elif u'_' in lang:
_l, _c = map(lambda x: x.lower(), lang.split(u'_', 1))
langs += [u'%s-%s' % (_l, _c), u'%s-%s' % (_l, _c.upper()), u'%s_%s' % (_l, _c.capitalize())]
paths = map(os.path.normpath, paths)
paths = list(set(paths))
for path in paths:
# Exclude paths
if path not in rosetta_settings.ROSETTA_EXCLUDED_PATHS:
for lang_ in langs:
dirname = os.path.join(path, lang_, 'LC_MESSAGES')
for fn in rosetta_settings.POFILENAMES:
filename = os.path.join(dirname, fn)
if os.path.isfile(filename):
ret.add(os.path.abspath(filename))
return list(sorted(ret))
def pagination_range(first, last, current):
r = []
r.append(first)
151 ↛ 154line 151 didn't jump to line 154, because the condition on line 151 was never false if first + 1 < last:
r.append(first + 1)
154 ↛ 155line 154 didn't jump to line 155, because the condition on line 154 was never true if current - 2 > first and current - 2 < last:
r.append(current - 2)
156 ↛ 157line 156 didn't jump to line 157, because the condition on line 156 was never true if current - 1 > first and current - 1 < last:
r.append(current - 1)
158 ↛ 159line 158 didn't jump to line 159, because the condition on line 158 was never true if current > first and current < last:
r.append(current)
160 ↛ 162line 160 didn't jump to line 162, because the condition on line 160 was never false if current + 1 < last and current + 1 > first:
r.append(current + 1)
162 ↛ 165line 162 didn't jump to line 165, because the condition on line 162 was never false if current + 2 < last and current + 2 > first:
r.append(current + 2)
165 ↛ 167line 165 didn't jump to line 167, because the condition on line 165 was never false if last - 1 > first:
r.append(last - 1)
r.append(last)
r = list(set(r))
r.sort()
prev = 10000
for e in r[:]:
if prev + 1 < e:
try:
r.insert(r.index(e), '...')
except ValueError:
pass
prev = e
return r
|