1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/weblate_ynh.git synced 2024-10-01 13:35:04 +02:00

Merge pull request #14 Upgrade to 3.2

Upgrade to 3.2
This commit is contained in:
Jean-Baptiste 2018-10-27 18:07:39 +02:00 committed by GitHub
commit 0867e8f043
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 1049 additions and 36 deletions

View file

@ -53,3 +53,29 @@ Carefull, this application install PostgreSQL and change the default configurati
## LDAP connexion ## LDAP connexion
It doesn't work yet, but while [it looks doable](https://docs.weblate.org/en/latest/admin/auth.html?highlight=LDAP#ldap-authentication), I'm unsure it is a good idea to connect this kind of tools to your LDAP. It doesn't work yet, but while [it looks doable](https://docs.weblate.org/en/latest/admin/auth.html?highlight=LDAP#ldap-authentication), I'm unsure it is a good idea to connect this kind of tools to your LDAP.
## State of this package
* works fine:
[x] install/remove/backup/remove/upgrade with x86_64
* to be confirmed:
[ ] ARM support
* to be added:
[ ] use jq instead of grep/sed
[ ] change URL script
[ ] use debian package for lxml (may unlock ARM support)
[ ] Add configuration options using the YunoHost interface (https://forum.yunohost.org/t/yunohost-3-1-minor-stable-release-version-stable-mineure/5445)
[ ] Add fail2ban script
[ ] Enable CHECK_LIST?
[ ] Enable AUTOFIX_LIST?
[ ] Enable Translation Memory?
## Links
* Report a bug about this package: https://github.com/YunoHost-Apps/weblate_ynh
* Report a bug about Weblate itself: https://github.com/WeblateOrg/weblate
* Documentation: https://docs.weblate.org/
* Weblate website: https://weblate.org/
* YunoHost website: https://yunohost.org/

View file

@ -19,7 +19,7 @@
setup_private=1 setup_private=1
setup_public=1 setup_public=1
upgrade=1 upgrade=1
# upgrade=1 from_commit=f2c1f14df484d727f1918821b6ade3887f77ec40 upgrade=1 from_commit=f14080cbe65c8b2a8e0cda1c34affe0123a6540d
backup_restore=1 backup_restore=1
multi_instance=1 multi_instance=1
incorrect_path=1 incorrect_path=1
@ -42,6 +42,6 @@
Email=jean-baptiste@holcroft.fr Email=jean-baptiste@holcroft.fr
Notification=all Notification=all
;;; Upgrade options ;;; Upgrade options
; commit=f2c1f14df484d727f1918821b6ade3887f77ec40 ; commit=f14080cbe65c8b2a8e0cda1c34affe0123a6540d
name=Upgrade from 2.20 name=Upgrade from 3.1.1
manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=1&github_account=fake&github_token=fake manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=1&github_account=fake&github_token=fake

24
conf/celery-weblate Normal file
View file

@ -0,0 +1,24 @@
# Name of nodes to start
# here we have a single node
CELERYD_NODES="w1"
# or we could have three nodes:
#CELERYD_NODES="w1 w2 w3"
# App instance to use
# comment out this line if you don't use an app
CELERY_APP="weblate"
# How to call manage.py
CELERYD_MULTI="multi"
# Extra command-line arguments to the worker
CELERYD_OPTS="--beat"
# - %n will be replaced with the first part of the nodename.
# - %I will be replaced with the current child process index
# and is important when using the prefork pool to avoid race conditions.
CELERYD_PID_FILE="/var/run/__APP__-celery/weblate-%n.pid"
CELERYD_LOG_FILE="/var/log/__APP__-celery/celery-%n%I.log"
CELERYD_LOG_LEVEL="INFO"
CELERY_WORKER_RUNNING="1"

View file

@ -0,0 +1,26 @@
[Unit]
Description=Celery Service for Weblate (__APP__)
After=network.target
[Service]
Type=forking
User=__APP__
Group=__APP__
PermissionsStartOnly=true
EnvironmentFile=__FINALPATH__/celery-weblate
WorkingDirectory=__FINALPATH__/
ExecStartPre=/bin/mkdir -p /var/run/__APP__-celery
ExecStartPre=/bin/chown -R __APP__ /var/run/__APP__-celery
ExecStartPre=/bin/mkdir -p /var/log/__APP__-celery
ExecStartPre=/bin/chown -R __APP__ /var/log/__APP__-celery
ExecStart=__FINALPATH__/venv/bin/celery multi start ${CELERYD_NODES} \
-A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
--logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}
ExecStop=__FINALPATH__/venv/bin/celery multi stopwait ${CELERYD_NODES} \
--pidfile=${CELERYD_PID_FILE}
ExecReload=__FINALPATH__/venv/bin/celery multi restart ${CELERYD_NODES} \
-A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
--logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}
[Install]
WantedBy=multi-user.target

View file

@ -0,0 +1,824 @@
# -*- coding: utf-8 -*-
#
# Copyright © 2012 - 2018 Michal Čihař <michal@cihar.com>
#
# This file is part of Weblate <https://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 <https://www.gnu.org/licenses/>.
#
from __future__ import unicode_literals
import platform
import os
from logging.handlers import SysLogHandler
#
# Django settings for Weblate project.
#
DEBUG = False
ADMINS = (
('__ADMIN__', '__ADMINMAIL__'),
)
MANAGERS = ADMINS
DATABASES = {
'default': {
# Database engine
'ENGINE': 'django.db.backends.postgresql_psycopg2',
# Database name
'NAME': '__NAME__',
# Database user
'USER': '__NAME__',
# Database password
'PASSWORD': '__DB_PWD__',
# Set to empty string for localhost
'HOST': 'localhost',
# Set to empty string for default
'PORT': '5432',
}
}
BASE_DIR = '__FINALPATH__'
# Data directory
DATA_DIR = os.path.join(BASE_DIR, 'data')
TTF_PATH = '__FINALPATH__/venv/lib/python3.5/site-packages/weblate/ttf/'
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'UTC'
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'
LANGUAGES = (
('ar', 'العربية'),
('az', 'Azərbaycan'),
('be', 'Беларуская'),
('be@latin', 'Biełaruskaja'),
('bg', 'Български'),
('br', 'Brezhoneg'),
('ca', 'Català'),
('cs', 'Čeština'),
('da', 'Dansk'),
('de', 'Deutsch'),
('en', 'English'),
('en-gb', 'English (United Kingdom)'),
('el', 'Ελληνικά'),
('es', 'Español'),
('fi', 'Suomi'),
('fr', 'Français'),
('fy', 'Frysk'),
('gl', 'Galego'),
('he', 'עברית'),
('hu', 'Magyar'),
('id', 'Indonesia'),
('it', 'Italiano'),
('ja', '日本語'),
('ko', '한국어'),
('ksh', 'Kölsch'),
('nb', 'Norsk bokmål'),
('nl', 'Nederlands'),
('pl', 'Polski'),
('pt', 'Português'),
('pt-br', 'Português brasileiro'),
('ru', 'Русский'),
('sk', 'Slovenčina'),
('sl', 'Slovenščina'),
('sr', 'Српски'),
('sv', 'Svenska'),
('tr', 'Türkçe'),
('uk', 'Українська'),
('zh-hans', '简体字'),
('zh-hant', '正體字'),
)
SITE_ID = 1
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True
# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True
# URL prefix to use, please see documentation for more details
URL_PREFIX = '__PATHURL__'
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = os.path.join(DATA_DIR, 'media')
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = '{0}/media/'.format(URL_PREFIX)
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = os.path.join(DATA_DIR, 'static')
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '{0}/static/'.format(URL_PREFIX)
# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'compressor.finders.CompressorFinder',
)
# Make this unique, and don't share it with anybody.
# You can generate it using examples/generate-secret-key
SECRET_KEY = '__KEY__' # noqa
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'weblate', 'templates'),
],
'OPTIONS': {
'context_processors': [
'django.contrib.auth.context_processors.auth',
'django.template.context_processors.debug',
'django.template.context_processors.i18n',
'django.template.context_processors.request',
'django.template.context_processors.csrf',
'django.contrib.messages.context_processors.messages',
'weblate.trans.context_processors.weblate_context',
],
'loaders': [
('django.template.loaders.cached.Loader', [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
]),
],
},
},
]
# GitHub username for sending pull requests.
# Please see the documentation for more details.
GITHUB_USERNAME = "__GITHUBUSER__"
# Authentication configuration
AUTHENTICATION_BACKENDS = (
'social_core.backends.email.EmailAuth',
# 'social_core.backends.google.GoogleOAuth2',
# 'social_core.backends.github.GithubOAuth2',
# 'social_core.backends.bitbucket.BitbucketOAuth',
'social_core.backends.suse.OpenSUSEOpenId',
'social_core.backends.ubuntu.UbuntuOpenId',
'social_core.backends.fedora.FedoraOpenId',
# 'social_core.backends.facebook.FacebookOAuth2',
'weblate.accounts.auth.WeblateUserBackend',
)
# Custom user model
AUTH_USER_MODEL = 'weblate_auth.User'
# Social auth backends setup
SOCIAL_AUTH_GITHUB_KEY = ''
SOCIAL_AUTH_GITHUB_SECRET = ''
SOCIAL_AUTH_GITHUB_SCOPE = ['user:email']
SOCIAL_AUTH_BITBUCKET_KEY = ''
SOCIAL_AUTH_BITBUCKET_SECRET = ''
SOCIAL_AUTH_BITBUCKET_VERIFIED_EMAILS_ONLY = True
SOCIAL_AUTH_FACEBOOK_KEY = ''
SOCIAL_AUTH_FACEBOOK_SECRET = ''
SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', 'public_profile']
SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {'fields': 'id,name,email'}
SOCIAL_AUTH_FACEBOOK_API_VERSION = '3.1'
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = ''
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = ''
# Social auth settings
SOCIAL_AUTH_PIPELINE = (
'social_core.pipeline.social_auth.social_details',
'social_core.pipeline.social_auth.social_uid',
'social_core.pipeline.social_auth.auth_allowed',
'social_core.pipeline.social_auth.social_user',
'weblate.accounts.pipeline.store_params',
'weblate.accounts.pipeline.verify_open',
'social_core.pipeline.user.get_username',
'weblate.accounts.pipeline.require_email',
'social_core.pipeline.mail.mail_validation',
'weblate.accounts.pipeline.revoke_mail_code',
'weblate.accounts.pipeline.ensure_valid',
'weblate.accounts.pipeline.remove_account',
'social_core.pipeline.social_auth.associate_by_email',
'weblate.accounts.pipeline.reauthenticate',
'weblate.accounts.pipeline.verify_username',
'social_core.pipeline.user.create_user',
'social_core.pipeline.social_auth.associate_user',
'social_core.pipeline.social_auth.load_extra_data',
'weblate.accounts.pipeline.cleanup_next',
'weblate.accounts.pipeline.user_full_name',
'weblate.accounts.pipeline.store_email',
'weblate.accounts.pipeline.notify_connect',
'weblate.accounts.pipeline.password_reset',
)
SOCIAL_AUTH_DISCONNECT_PIPELINE = (
'social_core.pipeline.disconnect.allowed_to_disconnect',
'social_core.pipeline.disconnect.get_entries',
'social_core.pipeline.disconnect.revoke_tokens',
'weblate.accounts.pipeline.cycle_session',
'weblate.accounts.pipeline.adjust_primary_mail',
'weblate.accounts.pipeline.notify_disconnect',
'social_core.pipeline.disconnect.disconnect',
'weblate.accounts.pipeline.cleanup_next',
)
# Custom authentication strategy
SOCIAL_AUTH_STRATEGY = 'weblate.accounts.strategy.WeblateStrategy'
# Raise exceptions so that we can handle them later
SOCIAL_AUTH_RAISE_EXCEPTIONS = True
SOCIAL_AUTH_EMAIL_VALIDATION_FUNCTION = \
'weblate.accounts.pipeline.send_validation'
SOCIAL_AUTH_EMAIL_VALIDATION_URL = \
'{0}/accounts/email-sent/'.format(URL_PREFIX)
SOCIAL_AUTH_LOGIN_ERROR_URL = \
'{0}/accounts/login/'.format(URL_PREFIX)
SOCIAL_AUTH_EMAIL_FORM_URL = \
'{0}/accounts/email/'.format(URL_PREFIX)
SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = \
'{0}/accounts/profile/#auth'.format(URL_PREFIX)
SOCIAL_AUTH_PROTECTED_USER_FIELDS = ('email',)
SOCIAL_AUTH_SLUGIFY_USERNAMES = True
SOCIAL_AUTH_SLUGIFY_FUNCTION = 'weblate.accounts.pipeline.slugify_username'
# Password validation configuration
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 6,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
{
'NAME': 'weblate.accounts.password_validation.CharsPasswordValidator',
},
{
'NAME': 'weblate.accounts.password_validation.PastPasswordsValidator',
},
# Optional password strength validation by django-zxcvbn-password
# {
# 'NAME': 'zxcvbn_password.ZXCVBNValidator',
# 'OPTIONS': {
# 'min_score': 3,
# 'user_attributes': ('username', 'email', 'full_name')
# }
# },
]
# Middleware
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'weblate.accounts.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'social_django.middleware.SocialAuthExceptionMiddleware',
'weblate.accounts.middleware.RequireLoginMiddleware',
'weblate.middleware.SecurityMiddleware',
]
ROOT_URLCONF = 'weblate.urls'
# Django and Weblate apps
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin.apps.SimpleAdminConfig',
'django.contrib.admindocs',
'django.contrib.sitemaps',
'social_django',
'crispy_forms',
'compressor',
'rest_framework',
'rest_framework.authtoken',
'weblate.addons',
'weblate.auth',
'weblate.checks',
'weblate.formats',
'weblate.machinery',
'weblate.trans',
'weblate.lang',
'weblate.langdata',
'weblate.memory',
'weblate.screenshots',
'weblate.accounts',
'weblate.utils',
'weblate.vcs',
'weblate.wladmin',
'weblate',
# Optional: Git exporter
# 'weblate.gitexport',
)
# Path to locales
LOCALE_PATHS = (os.path.join(BASE_DIR, 'weblate', 'locale'), )
# Custom exception reporter to include some details
DEFAULT_EXCEPTION_REPORTER_FILTER = \
'weblate.trans.debug.WeblateExceptionReporterFilter'
# Default logging of Weblate messages
# - to syslog in production (if available)
# - otherwise to console
# - you can also choose 'logfile' to log into separate file
# after configuring it below
# Detect if we can connect to syslog
HAVE_SYSLOG = False
if platform.system() != 'Windows':
try:
handler = SysLogHandler(
address='/dev/log', facility=SysLogHandler.LOG_LOCAL2
)
handler.close()
HAVE_SYSLOG = True
except IOError:
HAVE_SYSLOG = False
if DEBUG or not HAVE_SYSLOG:
DEFAULT_LOG = 'console'
else:
DEFAULT_LOG = 'syslog'
# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/stable/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'formatters': {
'syslog': {
'format': 'weblate[%(process)d]: %(levelname)s %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
'logfile': {
'format': '%(asctime)s %(levelname)s %(message)s'
},
'django.server': {
'()': 'django.utils.log.ServerFormatter',
'format': '[%(server_time)s] %(message)s',
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'django.server': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'django.server',
},
'syslog': {
'level': 'DEBUG',
'class': 'logging.handlers.SysLogHandler',
'formatter': 'syslog',
'address': '/dev/log',
'facility': SysLogHandler.LOG_LOCAL2,
},
# Logging to a file
# 'logfile': {
# 'level':'DEBUG',
# 'class':'logging.handlers.RotatingFileHandler',
# 'filename': "/var/log/weblate/weblate.log",
# 'maxBytes': 100000,
# 'backupCount': 3,
# 'formatter': 'logfile',
# },
},
'loggers': {
'django.request': {
'handlers': ['mail_admins', DEFAULT_LOG],
'level': 'ERROR',
'propagate': True,
},
'django.server': {
'handlers': ['django.server'],
'level': 'INFO',
'propagate': False,
},
# Logging database queries
# 'django.db.backends': {
# 'handlers': [DEFAULT_LOG],
# 'level': 'DEBUG',
# },
'weblate': {
'handlers': [DEFAULT_LOG],
'level': 'DEBUG',
},
# Logging VCS operations
# 'weblate-vcs': {
# 'handlers': [DEFAULT_LOG],
# 'level': 'DEBUG',
# },
# Python Social Auth logging
# 'social': {
# 'handlers': [DEFAULT_LOG],
# 'level': 'DEBUG',
# },
}
}
# Logging of management commands to console
if (os.environ.get('DJANGO_IS_MANAGEMENT_COMMAND', False) and
'console' not in LOGGING['loggers']['weblate']['handlers']):
LOGGING['loggers']['weblate']['handlers'].append('console')
# Remove syslog setup if it's not present
if not HAVE_SYSLOG:
del LOGGING['handlers']['syslog']
# List of machine translations
# MT_SERVICES = (
# 'weblate.machinery.apertium.ApertiumAPYTranslation',
# 'weblate.machinery.baidu.BaiduTranslation',
# 'weblate.machinery.deepl.DeepLTranslation',
# 'weblate.machinery.glosbe.GlosbeTranslation',
# 'weblate.machinery.google.GoogleTranslation',
# 'weblate.machinery.microsoft.MicrosoftCognitiveTranslation',
# 'weblate.machinery.microsoftterminology.MicrosoftTerminologyService',
# 'weblate.machinery.mymemory.MyMemoryTranslation',
# 'weblate.machinery.tmserver.AmagamaTranslation',
# 'weblate.machinery.tmserver.TMServerTranslation',
# 'weblate.machinery.yandex.YandexTranslation',
# 'weblate.machinery.weblatetm.WeblateTranslation',
# 'weblate.machinery.saptranslationhub.SAPTranslationHub',
# 'weblate.machinery.youdao.YoudaoTranslation',
# 'weblate.memory.machine.WeblateMemory',
# )
# Machine translation API keys
# URL of the Apertium APy server
MT_APERTIUM_APY = None
# DeepL API key
MT_DEEPL_KEY = None
# Microsoft Cognitive Services Translator API, register at
# https://portal.azure.com/
MT_MICROSOFT_COGNITIVE_KEY = None
# MyMemory identification email, see
# https://mymemory.translated.net/doc/spec.php
MT_MYMEMORY_EMAIL = None
# Optional MyMemory credentials to access private translation memory
MT_MYMEMORY_USER = None
MT_MYMEMORY_KEY = None
# Google API key for Google Translate API
MT_GOOGLE_KEY = None
# Baidu app key and secret
MT_BAIDU_ID = None
MT_BAIDU_SECRET = None
# Youdao Zhiyun app key and secret
MT_YOUDAO_ID = None
MT_YOUDAO_SECRET = None
# API key for Yandex Translate API
MT_YANDEX_KEY = None
# tmserver URL
MT_TMSERVER = None
# SAP Translation Hub
MT_SAP_BASE_URL = None
MT_SAP_SANDBOX_APIKEY = None
MT_SAP_USERNAME = None
MT_SAP_PASSWORD = None
MT_SAP_USE_MT = True
# Title of site to use
SITE_TITLE = 'Weblate'
# Whether site uses https
ENABLE_HTTPS = True
# Use HTTPS when creating redirect URLs for social authentication, see
# documentation for more details:
# http://python-social-auth-docs.readthedocs.io/en/latest/configuration/settings.html#processing-redirects-and-urlopen
SOCIAL_AUTH_REDIRECT_IS_HTTPS = ENABLE_HTTPS
# Make CSRF cookie HttpOnly, see documentation for more details:
# https://docs.djangoproject.com/en/1.11/ref/settings/#csrf-cookie-httponly
CSRF_COOKIE_HTTPONLY = True
CSRF_COOKIE_SECURE = ENABLE_HTTPS
# Store CSRF token in session (since Django 1.11)
CSRF_USE_SESSIONS = True
SESSION_COOKIE_SECURE = ENABLE_HTTPS
# SSL redirect
SECURE_SSL_REDIRECT = ENABLE_HTTPS
# Session cookie age (in seconds)
SESSION_COOKIE_AGE = 1209600
# Some security headers
SECURE_BROWSER_XSS_FILTER = True
X_FRAME_OPTIONS = 'DENY'
SECURE_CONTENT_TYPE_NOSNIFF = True
# Optionally enable HSTS
SECURE_HSTS_SECONDS = 0
SECURE_HSTS_PRELOAD = False
SECURE_HSTS_INCLUDE_SUBDOMAINS = False
# URL of login
LOGIN_URL = '{0}/accounts/login/'.format(URL_PREFIX)
# URL of logout
LOGOUT_URL = '{0}/accounts/logout/'.format(URL_PREFIX)
# Default location for login
LOGIN_REDIRECT_URL = '{0}/'.format(URL_PREFIX)
# Anonymous user name
ANONYMOUS_USER_NAME = 'anonymous'
# Reverse proxy settings
IP_BEHIND_REVERSE_PROXY = False
IP_PROXY_HEADER = 'HTTP_X_FORWARDED_FOR'
IP_PROXY_OFFSET = 0
# Sending HTML in mails
EMAIL_SEND_HTML = True
# Subject of emails includes site title
EMAIL_SUBJECT_PREFIX = '[{0}] '.format(SITE_TITLE)
EMAIL_BACKEND = 'django_sendmail_backend.backends.EmailBackend'
# Enable remote hooks
ENABLE_HOOKS = True
# Number of nearby messages to show in each direction
NEARBY_MESSAGES = 5
# Use simple language codes for default language/country combinations
SIMPLIFY_LANGUAGES = True
# Render forms using bootstrap
CRISPY_TEMPLATE_PACK = 'bootstrap3'
# List of quality checks
# CHECK_LIST = (
# 'weblate.checks.same.SameCheck',
# 'weblate.checks.chars.BeginNewlineCheck',
# 'weblate.checks.chars.EndNewlineCheck',
# 'weblate.checks.chars.BeginSpaceCheck',
# 'weblate.checks.chars.EndSpaceCheck',
# 'weblate.checks.chars.EndStopCheck',
# 'weblate.checks.chars.EndColonCheck',
# 'weblate.checks.chars.EndQuestionCheck',
# 'weblate.checks.chars.EndExclamationCheck',
# 'weblate.checks.chars.EndEllipsisCheck',
# 'weblate.checks.chars.EndSemicolonCheck',
# 'weblate.checks.chars.MaxLengthCheck',
# 'weblate.checks.format.PythonFormatCheck',
# 'weblate.checks.format.PythonBraceFormatCheck',
# 'weblate.checks.format.PHPFormatCheck',
# 'weblate.checks.format.CFormatCheck',
# 'weblate.checks.format.PerlFormatCheck',
# 'weblate.checks.format.JavascriptFormatCheck',
# 'weblate.checks.format.CSharpFormatCheck',
# 'weblate.checks.format.JavaFormatCheck',
# 'weblate.checks.format.JavaMessageFormatCheck',
# 'weblate.checks.angularjs.AngularJSInterpolationCheck',
# 'weblate.checks.consistency.PluralsCheck',
# 'weblate.checks.consistency.SamePluralsCheck',
# 'weblate.checks.consistency.ConsistencyCheck',
# 'weblate.checks.consistency.TranslatedCheck',
# 'weblate.checks.chars.NewlineCountingCheck',
# 'weblate.checks.markup.BBCodeCheck',
# 'weblate.checks.chars.ZeroWidthSpaceCheck',
# 'weblate.checks.markup.XMLValidityCheck',
# 'weblate.checks.markup.XMLTagsCheck',
# 'weblate.checks.source.OptionalPluralCheck',
# 'weblate.checks.source.EllipsisCheck',
# 'weblate.checks.source.MultipleFailingCheck',
# )
# List of automatic fixups
# AUTOFIX_LIST = (
# 'weblate.trans.autofixes.whitespace.SameBookendingWhitespace',
# 'weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis',
# 'weblate.trans.autofixes.chars.RemoveZeroSpace',
# 'weblate.trans.autofixes.chars.RemoveControlChars',
# )
# List of enabled addons
# WEBLATE_ADDONS = (
# 'weblate.addons.gettext.GenerateMoAddon',
# 'weblate.addons.gettext.UpdateLinguasAddon',
# 'weblate.addons.gettext.UpdateConfigureAddon',
# 'weblate.addons.gettext.MsgmergeAddon',
# 'weblate.addons.gettext.GettextCustomizeAddon',
# 'weblate.addons.gettext.GettextAuthorComments',
# 'weblate.addons.cleanup.CleanupAddon',
# 'weblate.addons.consistency.LangaugeConsistencyAddon',
# 'weblate.addons.discovery.DiscoveryAddon',
# 'weblate.addons.flags.SourceEditAddon',
# 'weblate.addons.flags.TargetEditAddon',
# 'weblate.addons.generate.GenerateFileAddon',
# 'weblate.addons.json.JSONCustomizeAddon',
# 'weblate.addons.properties.PropertiesSortAddon',
# )
# E-mail address that error messages come from.
SERVER_EMAIL = 'noreply@__DOMAIN__'
# Default email address to use for various automated correspondence from
# the site managers. Used for registration emails.
DEFAULT_FROM_EMAIL = '__ADMINMAIL__'
# List of URLs your site is supposed to serve
ALLOWED_HOSTS = ['__DOMAIN__']
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/__REDIS_DB__',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'PARSER_CLASS': 'redis.connection.HiredisParser',
}
},
'avatar': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': os.path.join(BASE_DIR, 'avatar-cache'),
'TIMEOUT': 3600,
'OPTIONS': {
'MAX_ENTRIES': 1000,
},
}
}
# Example configuration for caching
# CACHES = {
# Recommended redis + hiredis:
# 'default': {
# 'BACKEND': 'django_redis.cache.RedisCache',
# 'LOCATION': 'redis://127.0.0.1:6379/0',
# # If redis is running on same host as Weblate, you might
# # want to use unix sockets instead:
# # 'LOCATION': 'unix:///var/run/redis/redis.sock?db=0',
# 'OPTIONS': {
# 'CLIENT_CLASS': 'django_redis.client.DefaultClient',
# 'PARSER_CLASS': 'redis.connection.HiredisParser',
# }
# },
# Memcached alternative:
# 'default': {
# 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
# 'LOCATION': '127.0.0.1:11211',
# },
# 'avatar': {
# 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
# 'LOCATION': os.path.join(DATA_DIR, 'avatar-cache'),
# 'TIMEOUT': 3600,
# 'OPTIONS': {
# 'MAX_ENTRIES': 1000,
# },
# }
# }
# REST framework settings for API
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticatedOrReadOnly'
],
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'weblate.api.authentication.BearerAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
),
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/day'
},
'DEFAULT_PAGINATION_CLASS': (
'rest_framework.pagination.PageNumberPagination'
),
'PAGE_SIZE': 20,
'VIEW_DESCRIPTION_FUNCTION': 'weblate.api.views.get_view_description',
'UNAUTHENTICATED_USER': 'weblate.auth.models.get_anonymous',
}
# Example for restricting access to logged in users
# LOGIN_REQUIRED_URLS = (
# r'/(.*)$',
# )
# In such case you will want to include some of the exceptions
# LOGIN_REQUIRED_URLS_EXCEPTIONS = (
# r'/accounts/(.*)$', # Required for login
# r'/admin/login/(.*)$', # Required for admin login
# r'/static/(.*)$', # Required for development mode
# r'/widgets/(.*)$', # Allowing public access to widgets
# r'/data/(.*)$', # Allowing public access to data exports
# r'/hooks/(.*)$', # Allowing public access to notification hooks
# r'/healthz/$', # Allowing public access to health check
# r'/api/(.*)$', # Allowing access to API
# r'/js/i18n/$', # Javascript localization
# r'/contact/$', # Optional for contact form
# r'/legal/(.*)$', # Optional for legal app
# )
# Celery worker configuration for testing
# CELERY_TASK_ALWAYS_EAGER = True
# CELERY_BROKER_URL = 'memory://'
# Celery worker configuration for production
CELERY_TASK_ALWAYS_EAGER = False
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/__REDIS_DB__'
# Celery settings, it is not recommended to change these
CELERY_WORKER_PREFETCH_MULTIPLIER = 0
CELERY_BEAT_SCHEDULE_FILENAME = os.path.join(
DATA_DIR, 'celery', 'beat-schedule'
)

View file

@ -7,7 +7,8 @@ ExecStart=/usr/bin/uwsgi \
--ini /etc/uwsgi/apps-available/%i.ini \ --ini /etc/uwsgi/apps-available/%i.ini \
--socket /var/run/uwsgi/%i.socket \ --socket /var/run/uwsgi/%i.socket \
--chmod-socket=775 \ --chmod-socket=775 \
--logto /var/log/uwsgi/app/%i --logto /var/log/uwsgi/app/%i \
--processes 4
User=%i User=%i
Group=www-data Group=www-data
Restart=on-failure Restart=on-failure

View file

@ -1,12 +1,12 @@
[uwsgi] [uwsgi]
plugins = python plugins = python3
master = true master = true
protocol = uwsgi protocol = uwsgi
socket = /var/run/uwsgi/__APP__.socket socket = /var/run/uwsgi/__APP__.socket
virtualenv = __FINALPATH__/venv virtualenv = __FINALPATH__/venv
# http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#hosting-multiple-apps-in-the-same-process-aka-managing-script-name-and-path-info # http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html#hosting-multiple-apps-in-the-same-process-aka-managing-script-name-and-path-info
mount = __PATH__=__FINALPATH__/venv/lib/python2.7/site-packages/weblate/wsgi.py mount = __PATH__=__FINALPATH__/venv/lib/python3.5/site-packages/weblate/wsgi.py
manage-script-name = true manage-script-name = true
# Needed for OAuth/OpenID # Needed for OAuth/OpenID

View file

@ -3,12 +3,12 @@
"id": "weblate", "id": "weblate",
"packaging_format": 1, "packaging_format": 1,
"requirements": { "requirements": {
"yunohost": ">= 3.1.0" "yunohost": ">= 3.2.0"
}, },
"description": { "description": {
"en": "A translation platform using Git and Python" "en": "A translation platform using Git and Python"
}, },
"version": "3.1.1~ynh3", "version": "3.2.2~ynh1",
"url": "https://weblate.org", "url": "https://weblate.org",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"maintainer": { "maintainer": {

View file

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
current_version="3.1.1" current_version="3.2.2"
ynh_check_global_uwsgi_config () { ynh_check_global_uwsgi_config () {
uwsgi --version || ynh_die "You need to add uwsgi (and appropriate plugin) as a dependency" uwsgi --version || ynh_die "You need to add uwsgi (and appropriate plugin) as a dependency"
@ -91,8 +91,8 @@ weblate_fill_settings() {
ynh_replace_string "__DOMAIN__" "$domain" "$settings" ynh_replace_string "__DOMAIN__" "$domain" "$settings"
ynh_replace_string "__KEY__" "$key" "$settings" ynh_replace_string "__KEY__" "$key" "$settings"
ynh_replace_string "__FINALPATH__" "$final_path" "$settings" ynh_replace_string "__FINALPATH__" "$final_path" "$settings"
ynh_replace_string "__MEMCPORT__" "$memc_port" "$settings"
ynh_replace_string "__GITHUBUSER__" "$github_account" "$settings" ynh_replace_string "__GITHUBUSER__" "$github_account" "$settings"
ynh_replace_string "__REDIS_DB__" "$redis_db" "$settings"
# root install as an empty PATHURL to prevent '//static' # root install as an empty PATHURL to prevent '//static'
if [ "$path_url" == "/" ] if [ "$path_url" == "/" ]
@ -177,3 +177,48 @@ $(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')"
# Send the email to the recipients # Send the email to the recipients
echo "$mail_message" | $mail_bin -a "Content-Type: text/plain; charset=UTF-8" -s "$mail_subject" "$recipients" echo "$mail_message" | $mail_bin -a "Content-Type: text/plain; charset=UTF-8" -s "$mail_subject" "$recipients"
} }
#=================================================
#
# Redis HELPERS
#
# Point of contact : Jean-Baptiste Holcroft <jean-baptiste@holcroft.fr>
#=================================================
# get the first available redis database
#
# usage: ynh_redis_get_free_db
# | returns: the database number to use
ynh_redis_get_free_db() {
local result max db
result=$(redis-cli INFO keyspace)
# get the num
max=$(cat /etc/redis/redis.conf | grep ^databases | grep -Eow "[0-9]+")
db=0
# default Debian setting is 15 databases
for i in $(seq 0 "$max")
do
if ! echo "$result" | grep -q "db$i"
then
db=$i
break 1
fi
db=-1
done
test "$db" -eq -1 && ynh_die "No available Redis databases..."
echo "$db"
}
# Create a master password and set up global settings
# Please always call this script in install and restore scripts
#
# usage: ynh_redis_remove_db database
# | arg: database - the database to erase
ynh_redis_remove_db() {
local db=$1
redis-cli -n "$db" flushall
}

View file

@ -62,6 +62,7 @@ ynh_backup "/etc/cron.d/$app"
ynh_backup "/etc/uwsgi/apps-available/$app.ini" ynh_backup "/etc/uwsgi/apps-available/$app.ini"
ynh_backup "/etc/systemd/system/uwsgi-app@.service" ynh_backup "/etc/systemd/system/uwsgi-app@.service"
ynh_backup "/etc/systemd/system/$app-celery.service"
#================================================= #=================================================
# BACKUP THE hub binary file # BACKUP THE hub binary file

View file

@ -77,9 +77,9 @@ ynh_app_setting_set "$app" github_token "$github_token"
#================================================= #=================================================
ynh_install_app_dependencies libxml2-dev libxslt-dev libfreetype6-dev \ ynh_install_app_dependencies libxml2-dev libxslt-dev libfreetype6-dev \
libjpeg-dev libz-dev libyaml-dev python-dev python-pip python-virtualenv \ libjpeg-dev libz-dev libyaml-dev python3-dev python3-pip python3-virtualenv \
postgresql libpq-dev uwsgi uwsgi-plugin-python memcached \ postgresql libpq-dev uwsgi uwsgi-plugin-python3 \
mailutils mailutils python-celery-common virtualenv redis-server
#================================================= #=================================================
# CREATE A PostgreSQL DATABASE # CREATE A PostgreSQL DATABASE
@ -185,7 +185,7 @@ fi
#================================================= #=================================================
# PIP INSTALLATION # PIP INSTALLATION
#================================================= #=================================================
virtualenv "${final_path}/venv" virtualenv --python=python3 "${final_path}/venv"
#run source in a 'sub shell' #run source in a 'sub shell'
( (
set +o nounset set +o nounset
@ -195,11 +195,9 @@ virtualenv "${final_path}/venv"
# prevent error: "command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers" # prevent error: "command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers"
pip install --upgrade setuptools pip install --upgrade setuptools
pip install Weblate=="$current_version" pip install Weblate=="$current_version"
pip install pytz python-bidi PyYaML Babel pyuca pylibravatar pydns psycopg2-binary python-memcached phply pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis
# specific to YunoHost package: # specific to YunoHost package:
pip install django_sendmail_backend pip install django_sendmail_backend
# Fix ImportError: No module named backports
pip install backports.csv
) )
#================================================= #=================================================
@ -210,12 +208,13 @@ virtualenv "${final_path}/venv"
db_pwd=$(ynh_app_setting_get "$app" psqlpwd) db_pwd=$(ynh_app_setting_get "$app" psqlpwd)
admin_mail=$(ynh_user_get_info "$admin" mail) admin_mail=$(ynh_user_get_info "$admin" mail)
key=$(ynh_string_random 24)$(ynh_string_random 24)$(ynh_string_random 2) key=$(ynh_string_random 24)$(ynh_string_random 24)$(ynh_string_random 2)
memc_port=$(ynh_find_port 8080) redis_db=$(ynh_redis_get_free_db)
settings="$final_path/venv/lib/python2.7/site-packages/weblate/settings.py"
settings="$final_path/venv/lib/python3.5/site-packages/weblate/settings.py"
cp "../conf/settings_history/settings.$current_version.py" "$settings" cp "../conf/settings_history/settings.$current_version.py" "$settings"
weblate_fill_settings "$settings" weblate_fill_settings "$settings"
ynh_app_setting_set "$app" memc_port "$memc_port" ynh_app_setting_set "$app" redis_db "$redis_db"
#================================================= #=================================================
# SPECIFIC SETUP Filling up the database # SPECIFIC SETUP Filling up the database
@ -249,7 +248,19 @@ ynh_replace_string "__FINALPATH__" "$final_path/" "/etc/cron.d/$app"
#================================================= #=================================================
# Calculate and store the config file checksum into the app settings # Calculate and store the config file checksum into the app settings
ynh_store_file_checksum "$final_path/venv/lib/python2.7/site-packages/weblate/settings.py" ynh_store_file_checksum "$final_path/venv/lib/python3.5/site-packages/weblate/settings.py"
#=================================================
# ACTIVATE CELERY
#=================================================
celeryconf="$final_path/celery-weblate"
cp ../conf/celery-weblate "$celeryconf"
ynh_replace_string "__APP__" "$app" "$celeryconf"
ynh_replace_string "__FINALPATH__" "$final_path" "$celeryconf"
ynh_add_systemd_config "$app-celery" "celery-weblate.service"
#================================================= #=================================================
# GENERIC FINALIZATION # GENERIC FINALIZATION
@ -287,6 +298,7 @@ fi
# Start weblate # Start weblate
#================================================= #=================================================
systemctl start "$app-celery"
systemctl start "uwsgi-app@$app.service" systemctl start "uwsgi-app@$app.service"
#================================================= #=================================================

View file

@ -18,10 +18,11 @@ domain=$(ynh_app_setting_get "$app" domain)
db_name=$(ynh_app_setting_get "$app" db_name) db_name=$(ynh_app_setting_get "$app" db_name)
#================================================= #=================================================
# STOP WEBLATE'S SERVICE # STOP WEBLATE'S SERVICES
#================================================= #=================================================
systemctl stop "uwsgi-app@$app.service" systemctl stop "uwsgi-app@$app.service"
systemctl stop "$app-celery.service"
#================================================= #=================================================
# REMOVE THE PostgreSQL DATABASE # REMOVE THE PostgreSQL DATABASE
@ -60,11 +61,18 @@ ynh_remove_nginx_config
# Remove a cron file # Remove a cron file
ynh_secure_remove "/etc/cron.d/$app" ynh_secure_remove "/etc/cron.d/$app"
#=================================================
# REMOVE CELERY FILES
#=================================================
ynh_secure_remove "/var/run/$app-celery"
#================================================= #=================================================
# REMOVE uwsgi and systemd files # REMOVE uwsgi and systemd files
#================================================= #=================================================
ynh_remove_uwsgi_service ynh_remove_uwsgi_service
ynh_remove_systemd_config "$app-celery"
#================================================= #=================================================
# GENERIC FINALIZATION # GENERIC FINALIZATION

View file

@ -75,9 +75,9 @@ chown -R "$app": "$final_path"
#================================================= #=================================================
ynh_install_app_dependencies libxml2-dev libxslt-dev libfreetype6-dev \ ynh_install_app_dependencies libxml2-dev libxslt-dev libfreetype6-dev \
libjpeg-dev libz-dev libyaml-dev python-dev python-pip python-virtualenv \ libjpeg-dev libz-dev libyaml-dev python3-dev python3-pip python3-virtualenv \
postgresql libpq-dev uwsgi uwsgi-plugin-python memcached \ postgresql libpq-dev uwsgi uwsgi-plugin-python3 memcached \
mailutils mailutils python-celery-common virtualenv redis-server
#================================================= #=================================================
# RESTORE THE PostgreSQL DATABASE # RESTORE THE PostgreSQL DATABASE
@ -117,6 +117,8 @@ systemctl enable "uwsgi-app@$app.service"
# Add as a service # Add as a service
yunohost service add "uwsgi-app@$app.service" --log "/var/log/uwsgi/app/$app" yunohost service add "uwsgi-app@$app.service" --log "/var/log/uwsgi/app/$app"
ynh_restore_file "/etc/systemd/system/$app-celery.service"
#================================================= #=================================================
# RESTORE THE CRON FILE # RESTORE THE CRON FILE
#================================================= #=================================================
@ -135,10 +137,11 @@ ynh_restore_file "/usr/bin/hub"
# Start weblate # Start weblate
#================================================= #=================================================
systemctl start "$app-celery.service"
systemctl start "uwsgi-app@$app.service" systemctl start "uwsgi-app@$app.service"
#================================================= #=================================================
# RELOAD NGINX & uwsgi # RELOAD NGINX & uwsgi
#================================================= #=================================================
systemctl reload nginx systemctl reload nginx

View file

@ -26,6 +26,7 @@ memc_port=$(ynh_app_setting_get "$app" memc_port)
github_account=$(ynh_app_setting_get "$app" github_account) github_account=$(ynh_app_setting_get "$app" github_account)
migration311=$(ynh_app_setting_get "$app" migration311) migration311=$(ynh_app_setting_get "$app" migration311)
key=$(ynh_string_random 24)$(ynh_string_random 24)$(ynh_string_random 2) key=$(ynh_string_random 24)$(ynh_string_random 24)$(ynh_string_random 2)
redis_db=$(ynh_app_setting_get "$app" redis_db)
#================================================= #=================================================
# Get previous version number # Get previous version number
@ -63,7 +64,15 @@ if [ -z "$db_name" ]; then # If db_name doesn't exist, create it
ynh_app_setting_set "$app" db_name "$db_name" ynh_app_setting_set "$app" db_name "$db_name"
fi fi
settings="$final_path/venv/lib/python2.7/site-packages/weblate/settings.py" # (<3.2)
migrate_to_python3=0
if [ -e "$final_path/venv/lib/python2.7/site-packages/weblate/settings.py" ]; then
settings="$final_path/venv/lib/python2.7/site-packages/weblate/settings.py"
migrate_to_python3=1
cp "$settings" "$final_path/settings.py"
else
settings="$final_path/venv/lib/python3.5/site-packages/weblate/settings.py"
fi
# (<2.17) save memc_port if it doesn't exist # (<2.17) save memc_port if it doesn't exist
if [[ -z "$memc_port" ]] if [[ -z "$memc_port" ]]
@ -107,7 +116,7 @@ fi
# Weblate requires an update to 3.0 before 3.1 # Weblate requires an update to 3.0 before 3.1
# the upgrade hook will launch this script again to make sure it works # the upgrade hook will launch this script again to make sure it works
if [[ -z "$migration311" ]] if [[ -z "$migration311" && $previous_version = "2.20" ]]
then then
# $migration311 is not set, version is <3.0 # $migration311 is not set, version is <3.0
migration311="two_steps_upgrade_3.0to3.1-needed" migration311="two_steps_upgrade_3.0to3.1-needed"
@ -133,6 +142,17 @@ then
systemctl stop "uwsgi-app@$app.service" systemctl stop "uwsgi-app@$app.service"
fi fi
if [[ -e "/var/run/$app-celery/$app-w1.pid" ]]
then
systemctl stop "$app-celery.service"
fi
# (<3.2)
if [ -z "$redis_db" ]; then
redis_db=$(ynh_redis_get_free_db)
ynh_app_setting_set "$app" redis_db "$redis_db"
fi
#================================================= #=================================================
# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP
#================================================= #=================================================
@ -186,9 +206,9 @@ chsh --shell /bin/bash "$app"
#================================================= #=================================================
ynh_install_app_dependencies libxml2-dev libxslt-dev libfreetype6-dev \ ynh_install_app_dependencies libxml2-dev libxslt-dev libfreetype6-dev \
libjpeg-dev libz-dev libyaml-dev python-dev python-pip python-virtualenv \ libjpeg-dev libz-dev libyaml-dev python3-dev python3-pip python3-virtualenv \
postgresql libpq-dev uwsgi uwsgi-plugin-python memcached \ postgresql libpq-dev uwsgi uwsgi-plugin-python3 memcached \
mailutils mailutils python-celery-common virtualenv redis-server
#================================================= #=================================================
# SPECIFIC SETUP uwsgi # SPECIFIC SETUP uwsgi
@ -207,6 +227,12 @@ fi
# PIP INSTALLATION # PIP INSTALLATION
#================================================= #=================================================
if [ "$migrate_to_python3" -eq 1 ]
then
ynh_secure_remove "${final_path}/venv"
virtualenv --python=python3 "${final_path}/venv"
fi
( (
set +o nounset set +o nounset
source "${final_path}/venv/bin/activate" source "${final_path}/venv/bin/activate"
@ -215,13 +241,17 @@ fi
# prevent error: "command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers" # prevent error: "command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers"
pip install --upgrade setuptools pip install --upgrade setuptools
pip install Weblate=="$current_version" pip install Weblate=="$current_version"
pip install pytz python-bidi PyYaML Babel pyuca pylibravatar pydns psycopg2-binary python-memcached phply pip install pytz python-bidi PyYaML Babel pyuca pylibravatar py3dns psycopg2-binary phply django-redis hiredis
# specific to YunoHost package: # specific to YunoHost package:
pip install django_sendmail_backend pip install django_sendmail_backend
# Fix ImportError: No module named backports
pip install backports.csv
) )
if [ "$migrate_to_python3" -eq 1 ]
then
mv "$final_path/settings.py" "$final_path/venv/lib/python3.5/site-packages/weblate/settings.py"
settings="$final_path/venv/lib/python3.5/site-packages/weblate/settings.py"
fi
#================================================= #=================================================
# CONFIG FILE UPGRADE # CONFIG FILE UPGRADE
#================================================= #=================================================
@ -277,6 +307,18 @@ weblate_fill_settings "$settings"
ynh_secure_remove "$old_settings" ynh_secure_remove "$old_settings"
#=================================================
# ACTIVATE CELERY
#=================================================
celeryconf="$final_path/celery-weblate"
cp ../conf/celery-weblate "$celeryconf"
ynh_replace_string "__APP__" "$app" "$celeryconf"
ynh_replace_string "__FINALPATH__" "$final_path" "$celeryconf"
ynh_add_systemd_config "$app-celery" "celery-weblate.service"
#================================================= #=================================================
# Run migration scripts # Run migration scripts
#================================================= #=================================================
@ -322,7 +364,7 @@ ynh_secure_remove "$old_settings"
) )
# Recalculate and store the config file checksum into the app settings # Recalculate and store the config file checksum into the app settings
ynh_store_file_checksum "$final_path/venv/lib/python2.7/site-packages/weblate/settings.py" ynh_store_file_checksum "$final_path/venv/lib/python3.5/site-packages/weblate/settings.py"
#================================================= #=================================================
# SETUP CRON # SETUP CRON
@ -369,9 +411,10 @@ fi
#================================================= #=================================================
systemctl start "uwsgi-app@$app.service" systemctl start "uwsgi-app@$app.service"
systemctl start "$app-celery.service"
#================================================= #=================================================
# RELOAD NGINX # RELOAD NGINX
#================================================= #=================================================
systemctl reload nginx systemctl reload nginx