Commit 8536a0f9 authored by Michal Čihař's avatar Michal Čihař

Provide default values for configuration (issue #198)

parent b09781d8
...@@ -269,7 +269,8 @@ LOGGING = { ...@@ -269,7 +269,8 @@ LOGGING = {
# Apertium Web Service, register at http://api.apertium.org/register.jsp # Apertium Web Service, register at http://api.apertium.org/register.jsp
MT_APERTIUM_KEY = None MT_APERTIUM_KEY = None
# Microsoft Translator service, register at http://www.bing.com/developers/createapp.aspx # Microsoft Translator service, register at
# http://www.bing.com/developers/createapp.aspx
MT_MICROSOFT_KEY = None MT_MICROSOFT_KEY = None
# Path where git repositories are stored, it needs to be writable # Path where git repositories are stored, it needs to be writable
...@@ -324,7 +325,7 @@ WHOOSH_INDEX = os.path.join(WEB_ROOT, 'whoosh-index') ...@@ -324,7 +325,7 @@ WHOOSH_INDEX = os.path.join(WEB_ROOT, 'whoosh-index')
# List of quality checks # List of quality checks
CHECK_LIST = ( CHECK_LIST = (
'weblate.trans.checks.same.SameCheck', 'weblate.trans.checks.same.SameCheck',
'weblate.trans.checks.chars.BeginNewlineCheck', 'weblate.trans.checks.chars.BeginNewlineCheck',
'weblate.trans.checks.chars.EndNewlineCheck', 'weblate.trans.checks.chars.EndNewlineCheck',
'weblate.trans.checks.chars.BeginSpaceCheck', 'weblate.trans.checks.chars.BeginSpaceCheck',
......
...@@ -26,6 +26,7 @@ from django.contrib.admin.views.decorators import staff_member_required ...@@ -26,6 +26,7 @@ from django.contrib.admin.views.decorators import staff_member_required
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.contrib import messages from django.contrib import messages
from django.conf import settings from django.conf import settings
from weblate.trans import appsettings
import weblate import weblate
import os import os
...@@ -75,7 +76,7 @@ def performance(request): ...@@ -75,7 +76,7 @@ def performance(request):
checks.append(( checks.append((
# Translators: Indexing is postponed to cron job # Translators: Indexing is postponed to cron job
_('Indexing offloading'), _('Indexing offloading'),
settings.OFFLOAD_INDEXING, appsettings.OFFLOAD_INDEXING,
'production-indexing', 'production-indexing',
)) ))
# Check for sane caching # Check for sane caching
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
from django.conf import settings from weblate.trans import appsettings
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.http import ( from django.http import (
HttpResponse, HttpResponseNotAllowed, HttpResponseBadRequest HttpResponse, HttpResponseNotAllowed, HttpResponseBadRequest
...@@ -40,7 +40,7 @@ def update_subproject(request, project, subproject): ...@@ -40,7 +40,7 @@ def update_subproject(request, project, subproject):
''' '''
API hook for updating git repos. API hook for updating git repos.
''' '''
if not settings.ENABLE_HOOKS: if not appsettings.ENABLE_HOOKS:
return HttpResponseNotAllowed([]) return HttpResponseNotAllowed([])
obj = get_object_or_404(SubProject, slug=subproject, project__slug=project) obj = get_object_or_404(SubProject, slug=subproject, project__slug=project)
thread = threading.Thread(target=obj.do_update) thread = threading.Thread(target=obj.do_update)
...@@ -53,7 +53,7 @@ def update_project(request, project): ...@@ -53,7 +53,7 @@ def update_project(request, project):
''' '''
API hook for updating git repos. API hook for updating git repos.
''' '''
if not settings.ENABLE_HOOKS: if not appsettings.ENABLE_HOOKS:
return HttpResponseNotAllowed([]) return HttpResponseNotAllowed([])
obj = get_object_or_404(Project, slug=project) obj = get_object_or_404(Project, slug=project)
thread = threading.Thread(target=obj.do_update) thread = threading.Thread(target=obj.do_update)
...@@ -66,7 +66,7 @@ def github_hook(request): ...@@ -66,7 +66,7 @@ def github_hook(request):
''' '''
API to handle commit hooks from Github. API to handle commit hooks from Github.
''' '''
if not settings.ENABLE_HOOKS: if not appsettings.ENABLE_HOOKS:
return HttpResponseNotAllowed([]) return HttpResponseNotAllowed([])
if request.method != 'POST': if request.method != 'POST':
return HttpResponseNotAllowed(['POST']) return HttpResponseNotAllowed(['POST'])
......
# -*- coding: utf-8 -*-
#
# Copyright © 2012 - 2013 Michal Čihař <michal@cihar.com>
#
# This file is part of Weblate <http://weblate.org/>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
from django.conf import settings
import os
def get(name, default):
'''
Returns setting from django settings with default value.
'''
return getattr(settings, name, default)
# Weblate installation root
WEB_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Machine translation API keys
# Apertium Web Service, register at http://api.apertium.org/register.jsp
MT_APERTIUM_KEY = get('MT_APERTIUM_KEY', None)
# Microsoft Translator service, register at
# http://www.bing.com/developers/createapp.aspx
MT_MICROSOFT_KEY = get('MT_MICROSOFT_KEY', None)
# Path where git repositories are stored, it needs to be writable
GIT_ROOT = get('GIT_ROOT', '%s/repos/' % WEB_ROOT)
# Title of site to use
SITE_TITLE = get('SITE_TITLE', 'Weblate')
# Enable remote hooks
ENABLE_HOOKS = get('ENABLE_HOOKS', True)
# Number of nearby messages to show in each direction
NEARBY_MESSAGES = get('NEARBY_MESSAGES', 5)
# Minimal number of similar messages to show
SIMILAR_MESSAGES = get('SIMILAR_MESSAGES', 5)
# Enable lazy commits
LAZY_COMMITS = get('LAZY_COMMITS', True)
# Offload indexing
OFFLOAD_INDEXING = get('OFFLOAD_INDEXING', False)
# Translation locking
AUTO_LOCK = get('AUTO_LOCK', True)
AUTO_LOCK_TIME = get('AUTO_LOCK_TIME', 60)
LOCK_TIME = get('LOCK_TIME', 15 * 60)
# Where to put Whoosh index
WHOOSH_INDEX = get('WHOOSH_INDEX', os.path.join(WEB_ROOT, 'whoosh-index'))
# List of quality checks
CHECK_LIST = (
'weblate.trans.checks.same.SameCheck',
'weblate.trans.checks.chars.BeginNewlineCheck',
'weblate.trans.checks.chars.EndNewlineCheck',
'weblate.trans.checks.chars.BeginSpaceCheck',
'weblate.trans.checks.chars.EndSpaceCheck',
'weblate.trans.checks.chars.EndStopCheck',
'weblate.trans.checks.chars.EndColonCheck',
'weblate.trans.checks.chars.EndQuestionCheck',
'weblate.trans.checks.chars.EndExclamationCheck',
'weblate.trans.checks.chars.EndEllipsisCheck',
'weblate.trans.checks.format.PythonFormatCheck',
'weblate.trans.checks.format.PHPFormatCheck',
'weblate.trans.checks.format.CFormatCheck',
'weblate.trans.checks.consistency.PluralsCheck',
'weblate.trans.checks.consistency.ConsistencyCheck',
'weblate.trans.checks.consistency.DirectionCheck',
'weblate.trans.checks.chars.NewlineCountingCheck',
'weblate.trans.checks.markup.BBCodeCheck',
'weblate.trans.checks.chars.ZeroWidthSpaceCheck',
'weblate.trans.checks.markup.XMLTagsCheck',
'weblate.trans.checks.source.OptionalPluralCheck',
'weblate.trans.checks.source.EllipsisCheck',
)
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
import weblate import weblate
from django.conf import settings from django.conf import settings
from weblate.trans import appsettings
from datetime import datetime from datetime import datetime
URL_BASE = 'http://weblate.org/?utm_source=weblate&utm_term=%s' URL_BASE = 'http://weblate.org/?utm_source=weblate&utm_term=%s'
...@@ -36,7 +37,7 @@ def weblate_url(request): ...@@ -36,7 +37,7 @@ def weblate_url(request):
def title(request): def title(request):
return {'site_title': settings.SITE_TITLE} return {'site_title': appsettings.SITE_TITLE}
def date(request): def date(request):
...@@ -55,8 +56,8 @@ def url(request): ...@@ -55,8 +56,8 @@ def url(request):
def mt(request): def mt(request):
return { return {
'apertium_api_key': settings.MT_APERTIUM_KEY, 'apertium_api_key': appsettings.MT_APERTIUM_KEY,
'microsoft_api_key': settings.MT_MICROSOFT_KEY, 'microsoft_api_key': appsettings.MT_MICROSOFT_KEY,
} }
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
from django.contrib.syndication.views import Feed from django.contrib.syndication.views import Feed
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.conf import settings from weblate.trans import appsettings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from weblate.trans.models import Change, Translation, SubProject, Project from weblate.trans.models import Change, Translation, SubProject, Project
...@@ -31,10 +31,10 @@ from weblate.lang.models import Language ...@@ -31,10 +31,10 @@ from weblate.lang.models import Language
class ChangesFeed(Feed): class ChangesFeed(Feed):
def title(self): def title(self):
return _('Recent changes in %s') % settings.SITE_TITLE return _('Recent changes in %s') % appsettings.SITE_TITLE
def description(self): def description(self):
return _('All recent changes made using Weblate in %s.') % settings.SITE_TITLE return _('All recent changes made using Weblate in %s.') % appsettings.SITE_TITLE
def link(self): def link(self):
return reverse('home') return reverse('home')
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
# #
from django.db import models from django.db import models
from django.conf import settings from weblate.trans import appsettings
from django.core.cache import cache from django.core.cache import cache
from django.db.models import Q from django.db.models import Q
import itertools import itertools
...@@ -350,7 +350,7 @@ class UnitManager(models.Manager): ...@@ -350,7 +350,7 @@ class UnitManager(models.Manager):
''' '''
Updates/Adds to all indices given unit. Updates/Adds to all indices given unit.
''' '''
if settings.OFFLOAD_INDEXING: if appsettings.OFFLOAD_INDEXING:
from weblate.trans.models import IndexUpdate from weblate.trans.models import IndexUpdate
IndexUpdate.objects.get_or_create(unit=unit, source=source) IndexUpdate.objects.get_or_create(unit=unit, source=source)
return return
...@@ -388,7 +388,7 @@ class UnitManager(models.Manager): ...@@ -388,7 +388,7 @@ class UnitManager(models.Manager):
''' '''
ret = set() ret = set()
if source or context: if source or context:
with FULLTEXT_INDEX.source_searcher(not settings.OFFLOAD_INDEXING) as searcher: with FULLTEXT_INDEX.source_searcher(not appsettings.OFFLOAD_INDEXING) as searcher:
if source: if source:
results = self.__search( results = self.__search(
searcher, searcher,
...@@ -408,7 +408,7 @@ class UnitManager(models.Manager): ...@@ -408,7 +408,7 @@ class UnitManager(models.Manager):
if translation: if translation:
sample = self.all()[0] sample = self.all()[0]
with FULLTEXT_INDEX.target_searcher(sample.translation.language.code, not settings.OFFLOAD_INDEXING) as searcher: with FULLTEXT_INDEX.target_searcher(sample.translation.language.code, not appsettings.OFFLOAD_INDEXING) as searcher:
results = self.__search( results = self.__search(
searcher, searcher,
'target', 'target',
...@@ -427,12 +427,12 @@ class UnitManager(models.Manager): ...@@ -427,12 +427,12 @@ class UnitManager(models.Manager):
Finds similar units to current unit. Finds similar units to current unit.
''' '''
ret = set([unit.checksum]) ret = set([unit.checksum])
with FULLTEXT_INDEX.source_searcher(not settings.OFFLOAD_INDEXING) as searcher: with FULLTEXT_INDEX.source_searcher(not appsettings.OFFLOAD_INDEXING) as searcher:
# Extract up to 10 terms from the source # Extract up to 10 terms from the source
terms = [kw for kw, score in searcher.key_terms_from_text('source', unit.source, numterms=10) if not kw in IGNORE_SIMILAR] terms = [kw for kw, score in searcher.key_terms_from_text('source', unit.source, numterms=10) if not kw in IGNORE_SIMILAR]
cnt = len(terms) cnt = len(terms)
# Try to find at least configured number of similar strings, remove up to 4 words # Try to find at least configured number of similar strings, remove up to 4 words
while len(ret) < settings.SIMILAR_MESSAGES and cnt > 0 and len(terms) - cnt < 4: while len(ret) < appsettings.SIMILAR_MESSAGES and cnt > 0 and len(terms) - cnt < 4:
for search in itertools.combinations(terms, cnt): for search in itertools.combinations(terms, cnt):
results = self.search( results = self.search(
' '.join(search), ' '.join(search),
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
from django.db import models from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.conf import settings from weblate.trans import appsettings
from django.db.models import Sum, Q from django.db.models import Sum, Q
from django.utils.translation import ugettext as _, ugettext_lazy from django.utils.translation import ugettext as _, ugettext_lazy
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
...@@ -263,7 +263,7 @@ class Project(models.Model): ...@@ -263,7 +263,7 @@ class Project(models.Model):
}) })
def get_path(self): def get_path(self):
return os.path.join(settings.GIT_ROOT, self.slug) return os.path.join(appsettings.GIT_ROOT, self.slug)
def __unicode__(self): def __unicode__(self):
return self.name return self.name
...@@ -1438,9 +1438,9 @@ class Translation(models.Model): ...@@ -1438,9 +1438,9 @@ class Translation(models.Model):
Sets lock timestamp. Sets lock timestamp.
''' '''
if explicit: if explicit:
seconds = settings.LOCK_TIME seconds = appsettings.LOCK_TIME
else: else:
seconds = settings.AUTO_LOCK_TIME seconds = appsettings.AUTO_LOCK_TIME
new_lock_time = datetime.now() + timedelta(seconds=seconds) new_lock_time = datetime.now() + timedelta(seconds=seconds)
...@@ -1459,7 +1459,7 @@ class Translation(models.Model): ...@@ -1459,7 +1459,7 @@ class Translation(models.Model):
return return
# Auto lock if we should # Auto lock if we should
if settings.AUTO_LOCK: if appsettings.AUTO_LOCK:
self.create_lock(request.user) self.create_lock(request.user)
return return
...@@ -1949,7 +1949,7 @@ class Translation(models.Model): ...@@ -1949,7 +1949,7 @@ class Translation(models.Model):
return False return False
# Can we delay commit? # Can we delay commit?
if not force_commit and settings.LAZY_COMMITS: if not force_commit and appsettings.LAZY_COMMITS:
logger.info( logger.info(
'Delaying commiting %s in %s as %s', 'Delaying commiting %s in %s as %s',
self.filename, self.filename,
...@@ -2807,8 +2807,8 @@ class Unit(models.Model): ...@@ -2807,8 +2807,8 @@ class Unit(models.Model):
''' '''
return Unit.objects.filter( return Unit.objects.filter(
translation=self.translation, translation=self.translation,
position__gte=self.position - settings.NEARBY_MESSAGES, position__gte=self.position - appsettings.NEARBY_MESSAGES,
position__lte=self.position + settings.NEARBY_MESSAGES, position__lte=self.position + appsettings.NEARBY_MESSAGES,
) )
......
...@@ -26,7 +26,7 @@ import whoosh ...@@ -26,7 +26,7 @@ import whoosh
import os import os
from whoosh.fields import Schema, TEXT, ID from whoosh.fields import Schema, TEXT, ID
from django.db.models.signals import post_syncdb from django.db.models.signals import post_syncdb
from django.conf import settings from weblate.trans import appsettings
from whoosh.index import create_in, open_dir from whoosh.index import create_in, open_dir
from whoosh.writing import BufferedWriter from whoosh.writing import BufferedWriter
...@@ -44,7 +44,7 @@ SOURCE_SCHEMA = Schema( ...@@ -44,7 +44,7 @@ SOURCE_SCHEMA = Schema(
def create_source_index(): def create_source_index():
return create_in( return create_in(
settings.WHOOSH_INDEX, appsettings.WHOOSH_INDEX,
schema=SOURCE_SCHEMA, schema=SOURCE_SCHEMA,
indexname='source' indexname='source'
) )
...@@ -52,15 +52,15 @@ def create_source_index(): ...@@ -52,15 +52,15 @@ def create_source_index():
def create_target_index(lang): def create_target_index(lang):
return create_in( return create_in(
settings.WHOOSH_INDEX, appsettings.WHOOSH_INDEX,
schema=TARGET_SCHEMA, schema=TARGET_SCHEMA,
indexname='target-%s' % lang indexname='target-%s' % lang
) )
def create_index(sender=None, **kwargs): def create_index(sender=None, **kwargs):
if not os.path.exists(settings.WHOOSH_INDEX): if not os.path.exists(appsettings.WHOOSH_INDEX):
os.mkdir(settings.WHOOSH_INDEX) os.mkdir(appsettings.WHOOSH_INDEX)
create_source_index() create_source_index()
post_syncdb.connect(create_index) post_syncdb.connect(create_index)
...@@ -83,7 +83,7 @@ class Index(object): ...@@ -83,7 +83,7 @@ class Index(object):
if self._source is None: if self._source is None:
try: try:
self._source = open_dir( self._source = open_dir(
settings.WHOOSH_INDEX, appsettings.WHOOSH_INDEX,
indexname='source' indexname='source'
) )
except whoosh.index.EmptyIndexError: except whoosh.index.EmptyIndexError:
...@@ -100,7 +100,7 @@ class Index(object): ...@@ -100,7 +100,7 @@ class Index(object):
if not lang in self._target: if not lang in self._target:
try: try:
self._target[lang] = open_dir( self._target[lang] = open_dir(
settings.WHOOSH_INDEX, appsettings.WHOOSH_INDEX,
indexname='target-%s' % lang indexname='target-%s' % lang
) )
except whoosh.index.EmptyIndexError: except whoosh.index.EmptyIndexError:
......
...@@ -27,7 +27,7 @@ from django.utils.translation import ugettext as _, ungettext ...@@ -27,7 +27,7 @@ from django.utils.translation import ugettext as _, ungettext
from django.utils.formats import date_format from django.utils.formats import date_format
from django.utils import timezone from django.utils import timezone
from django import template from django import template
from django.conf import settings from weblate.trans import appsettings
import re import re
...@@ -153,7 +153,7 @@ def site_title(value): ...@@ -153,7 +153,7 @@ def site_title(value):
''' '''
Returns site title Returns site title
''' '''
return settings.SITE_TITLE return appsettings.SITE_TITLE
@register.simple_tag @register.simple_tag
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
from django.shortcuts import render_to_response, get_object_or_404 from django.shortcuts import render_to_response, get_object_or_404
from django.views.decorators.cache import cache_page from django.views.decorators.cache import cache_page
from django.conf import settings from weblate.trans import appsettings
from django.core.servers.basehttp import FileWrapper from django.core.servers.basehttp import FileWrapper
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
import django.utils.translation import django.utils.translation
...@@ -1927,9 +1927,9 @@ def js_config(request): ...@@ -1927,9 +1927,9 @@ def js_config(request):
support. support.
''' '''
# Apertium support # Apertium support
if settings.MT_APERTIUM_KEY is not None and settings.MT_APERTIUM_KEY != '': if appsettings.MT_APERTIUM_KEY is not None and appsettings.MT_APERTIUM_KEY != '':
try: try:
listpairs = urllib2.urlopen('http://api.apertium.org/json/listPairs?key=%s' % settings.MT_APERTIUM_KEY) listpairs = urllib2.urlopen('http://api.apertium.org/json/listPairs?key=%s' % appsettings.MT_APERTIUM_KEY)
pairs = listpairs.read() pairs = listpairs.read()
parsed = json.loads(pairs) parsed = json.loads(pairs)
apertium_langs = [p['targetLanguage'] for p in parsed['responseData'] if p['sourceLanguage'] == 'en'] apertium_langs = [p['targetLanguage'] for p in parsed['responseData'] if p['sourceLanguage'] == 'en']
...@@ -1940,9 +1940,9 @@ def js_config(request): ...@@ -1940,9 +1940,9 @@ def js_config(request):
apertium_langs = None apertium_langs = None
# Microsoft translator support # Microsoft translator support
if settings.MT_MICROSOFT_KEY is not None and settings.MT_MICROSOFT_KEY != '': if appsettings.MT_MICROSOFT_KEY is not None and appsettings.MT_MICROSOFT_KEY != '':
try: try:
listpairs = urllib2.urlopen('http://api.microsofttranslator.com/V2/Http.svc/GetLanguagesForTranslate?appID=%s' % settings.MT_MICROSOFT_KEY) listpairs = urllib2.urlopen('http://api.microsofttranslator.com/V2/Http.svc/GetLanguagesForTranslate?appID=%s' % appsettings.MT_MICROSOFT_KEY)
data = listpairs.read() data = listpairs.read()
parsed = ElementTree.fromstring(data) parsed = ElementTree.fromstring(data)
microsoft_langs = [p.text for p in parsed.getchildren()] microsoft_langs = [p.text for p in parsed.getchildren()]
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
from django.conf import settings from weblate.trans import appsettings
from django.http import HttpResponse, Http404 from django.http import HttpResponse, Http404
from django.template import RequestContext from django.template import RequestContext
from django.shortcuts import render_to_response, get_object_or_404 from django.shortcuts import render_to_response, get_object_or_404
...@@ -258,7 +258,7 @@ def render(request, project, widget='287x66', color=None, lang=None): ...@@ -258,7 +258,7 @@ def render(request, project, widget='287x66', color=None, lang=None):
# Background 287 x 66, logo 64 px # Background 287 x 66, logo 64 px
surface = cairo.ImageSurface.create_from_png( surface = cairo.ImageSurface.create_from_png(
os.path.join(settings.WEB_ROOT, 'media', widget_data['name'] % { os.path.join(appsettings.WEB_ROOT, 'media', widget_data['name'] % {
'color': color, 'color': color,
'widget': widget, 'widget': widget,
}) })
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment