diff --git a/02-sahana.sh b/02-sahana.sh index bbc73d5..a9991c3 100755 --- a/02-sahana.sh +++ b/02-sahana.sh @@ -13,6 +13,13 @@ git -C /srv/sahana submodule update # Install Sahana git clone --depth 1 https://github.com/sahana/eden.git /srv/sahana/applications/eden +# Copy Czech language file +cp ${SOURCE_DIR}/sahana/srv/sahana/applications/eden/languages/cs.py /srv/sahana/applications/eden/languages/cs.py + +# Symlink fonts with Czech glyphs +ln -s /usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf /srv/sahana/applications/eden/static/fonts/DejaVuSerif-Bold.ttf +ln -s /usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf /srv/sahana/applications/eden/static/fonts/DejaVuSerif.ttf + # Create PostgreSQL user and database export SAHANA_PWD=$(head -c 18 /dev/urandom | base64) envsubst <${SOURCE_DIR}/sahana/tmp/sahana-createdb.sql >/tmp/sahana-createdb.sql @@ -31,15 +38,7 @@ mkdir -p /srv/sahana/applications/eden/static/cache/chart mkdir -p /srv/sahana/applications/eden/uploads/{gis_cache,images,tracks} export SAHANA_HMAC=$(head -c 18 /dev/urandom | base64) envsubst <${SOURCE_DIR}/sahana/srv/sahana/applications/eden/models/000_config.py >/srv/sahana/applications/eden/models/000_config.py - -# Copy Czech language file -cp ${SOURCE_DIR}/sahana/srv/sahana/applications/eden/languages/cs.py /srv/sahana/applications/eden/languages/cs.py - -# Symlink fonts with Czech glyphs -ln -s /usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf /srv/sahana/applications/eden/static/fonts/DejaVuSerif-Bold.ttf -ln -s /usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf /srv/sahana/applications/eden/static/fonts/DejaVuSerif.ttf - -# Prepare template +cp {SOURCE_DIR}/sahana/srv/sahana/applications/eden/models/00_settings.py /srv/sahana/applications/eden/models/00_settings.py export SAHANA_ADMIN_USER=admin@example.com export SAHANA_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) cp ${SOURCE_DIR}/sahana/srv/sahana/applications/eden/modules/templates/default/config.py /srv/sahana/applications/eden/modules/templates/default/config.py diff --git a/03-sambro.sh b/03-sambro.sh index 9ad1f92..10ef652 100755 --- a/03-sambro.sh +++ b/03-sambro.sh @@ -13,6 +13,13 @@ git -C /srv/sambro submodule update # Install Sahana git clone --depth 1 https://github.com/sahana/eden.git /srv/sambro/applications/eden +# Copy Czech language file +cp ${SOURCE_DIR}/sahana/srv/sahana/applications/eden/languages/cs.py /srv/sambro/applications/eden/languages/cs.py + +# Symlink fonts with Czech glyphs +ln -s /usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf /srv/sambro/applications/eden/static/fonts/DejaVuSerif-Bold.ttf +ln -s /usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf /srv/sambro/applications/eden/static/fonts/DejaVuSerif.ttf + # Create PostgreSQL user and database export SAMBRO_PWD=$(head -c 18 /dev/urandom | base64) envsubst <${SOURCE_DIR}/sambro/tmp/sambro-createdb.sql >/tmp/sambro-createdb.sql @@ -31,15 +38,7 @@ mkdir -p /srv/sambro/applications/eden/static/cache/chart mkdir -p /srv/sambro/applications/eden/uploads/{gis_cache,images,tracks} export SAMBRO_HMAC=$(head -c 18 /dev/urandom | base64) envsubst <${SOURCE_DIR}/sambro/srv/sambro/applications/eden/models/000_config.py >/srv/sambro/applications/eden/models/000_config.py - -# Copy Czech language file -cp ${SOURCE_DIR}/sahana/srv/sahana/applications/eden/languages/cs.py /srv/sambro/applications/eden/languages/cs.py - -# Symlink fonts with Czech glyphs -ln -s /usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf /srv/sambro/applications/eden/static/fonts/DejaVuSerif-Bold.ttf -ln -s /usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf /srv/sambro/applications/eden/static/fonts/DejaVuSerif.ttf - -# Prepare template +cp {SOURCE_DIR}/sahana/srv/sahana/applications/eden/models/00_settings.py /srv/sambro/applications/eden/models/00_settings.py export SAMBRO_ADMIN_USER=admin@example.com export SAMBRO_ADMIN_PWD=$(head -c 12 /dev/urandom | base64) cp ${SOURCE_DIR}/sambro/srv/sambro/applications/eden/modules/templates/SAMBRO/config.py /srv/sambro/applications/eden/modules/templates/SAMBRO/config.py diff --git a/sahana/srv/sahana/applications/eden/models/00_settings.py b/sahana/srv/sahana/applications/eden/models/00_settings.py new file mode 100644 index 0000000..e9a6634 --- /dev/null +++ b/sahana/srv/sahana/applications/eden/models/00_settings.py @@ -0,0 +1,313 @@ +# -*- coding: utf-8 -*- + +""" + Global settings: + + Those which are typically edited during a deployment are in + 000_config.py & their results parsed into here. Deployers + shouldn't typically need to edit any settings here. +""" + +# Keep all our configuration options off the main global variables + +# Use response.s3 for one-off variables which are visible in views without explicit passing +s3.formats = Storage() + +# Workaround for this Bug in Selenium with FF4: +# http://code.google.com/p/selenium/issues/detail?id=1604 +s3.interactive = settings.get_ui_confirm() + +s3.base_url = "%s/%s" % (settings.get_base_public_url(), + appname) +s3.download_url = "%s/default/download" % s3.base_url + +# ----------------------------------------------------------------------------- +# Client tests + +# Check whether browser is Mobile & store result in session +# - commented-out until we make use of it +#if session.s3.mobile is None: +# session.s3.mobile = s3base.s3_is_mobile_client(request) +#if session.s3.browser is None: +# session.s3.browser = s3base.s3_populate_browser_compatibility(request) + +# ----------------------------------------------------------------------------- +# Global variables + +# Strings to i18n +# Common Labels +#messages["BREADCRUMB"] = ">> " +messages["UNKNOWN_OPT"] = "Unknown" +messages["NONE"] = "" +messages["READ"] = settings.get_ui_label_read() +messages["UPDATE"] = settings.get_ui_label_update() +messages["DELETE"] = "Delete" +messages["COPY"] = "Copy" +messages["NOT_APPLICABLE"] = "N/A" +messages["ADD_PERSON"] = "Create a Person" +messages["ADD_LOCATION"] = "Create Location" +messages["SELECT_LOCATION"] = "Select a location" +messages["COUNTRY"] = "Country" +messages["ORGANISATION"] = "Organization" +messages["AUTOCOMPLETE_HELP"] = "Enter some characters to bring up a list of possible matches" + +for u in messages: + if isinstance(messages[u], str): + globals()[u] = T(messages[u]) + +# CRUD Labels +s3.crud_labels = Storage(READ=READ, + UPDATE=UPDATE, + DELETE=DELETE, + COPY=COPY, + NONE=NONE, + ) + +# Error Messages +ERROR["BAD_RECORD"] = "Record not found!" +ERROR["BAD_METHOD"] = "Unsupported method!" +ERROR["BAD_FORMAT"] = "Unsupported data format!" +ERROR["BAD_REQUEST"] = "Invalid request" +ERROR["BAD_SOURCE"] = "Invalid source" +ERROR["BAD_TEMPLATE"] = "XSLT stylesheet not found" +ERROR["BAD_RESOURCE"] = "Nonexistent or invalid resource" +ERROR["DATA_IMPORT_ERROR"] = "Data import error" +ERROR["INTEGRITY_ERROR"] = "Integrity error: record can not be deleted while it is referenced by other records" +ERROR["METHOD_DISABLED"] = "Method disabled" +ERROR["NO_MATCH"] = "No matching element found in the data source" +ERROR["NOT_IMPLEMENTED"] = "Not implemented" +ERROR["NOT_PERMITTED"] = "Operation not permitted" +ERROR["PARSE_ERROR"] = "XML parse error" +ERROR["TRANSFORMATION_ERROR"] = "XSLT transformation error" +ERROR["UNAUTHORISED"] = "Not Authorized" +ERROR["VALIDATION_ERROR"] = "Validation error" + +# To get included in +s3.stylesheets = [] +s3.external_stylesheets = [] +# To get included at the end of +s3.scripts = [] +s3.js_global = [] +s3.jquery_ready = [] + +# ----------------------------------------------------------------------------- +# Languages + +s3.l10n_languages = settings.get_L10n_languages() + +# Default strings are in US English +T.current_languages = ("en", "en-us") +# Check if user has selected a specific language +if get_vars._language: + language = get_vars._language + session.s3.language = language +elif session.s3.language: + # Use the last-selected language + language = session.s3.language +elif auth.is_logged_in(): + # Use user preference + language = auth.user.language +else: + # Use system default + language = settings.get_L10n_default_language() +#else: +# # Use what browser requests (default web2py behaviour) +# T.force(T.http_accept_language) + +# IE doesn't set request.env.http_accept_language +#if language != "en": +T.force(language) + +# Store for views (e.g. Ext) +if language.find("-") == -1: + # Ext peculiarities + if language == "vi": + s3.language = "vn" + elif language == "el": + s3.language = "el_GR" + else: + s3.language = language +else: + lang_parts = language.split("-") + s3.language = "%s_%s" % (lang_parts[0], lang_parts[1].upper()) + +# List of Languages which use a Right-to-Left script (Arabic, Hebrew, Farsi, Urdu) +if language in ("ar", "prs", "ps", "ur"): + s3.rtl = True +else: + s3.rtl = False + +# ----------------------------------------------------------------------------- +# Auth + +_settings = auth.settings +_settings.lock_keys = False + +_settings.expiration = 28800 # seconds + +if settings.get_auth_openid(): + # Requires http://pypi.python.org/pypi/python-openid/ + try: + from gluon.contrib.login_methods.openid_auth import OpenIDAuth + openid_login_form = OpenIDAuth(auth) + from gluon.contrib.login_methods.extended_login_form import ExtendedLoginForm + _settings.login_form = ExtendedLoginForm(auth, openid_login_form, + signals=["oid", "janrain_nonce"]) + except ImportError: + session.warning = "Library support not available for OpenID" + +# Allow use of LDAP accounts for login +# NB Currently this means that change password should be disabled: +#_settings.actions_disabled.append("change_password") +# (NB These are not automatically added to PR or to Authenticated role since they enter via the login() method not register()) +#from gluon.contrib.login_methods.ldap_auth import ldap_auth +# Require even alternate login methods to register users 1st +#_settings.alternate_requires_registration = True +# Active Directory +#_settings.login_methods.append(ldap_auth(mode="ad", server="dc.domain.org", base_dn="ou=Users,dc=domain,dc=org")) +# or if not wanting local users at all (no passwords saved within DB): +#_settings.login_methods = [ldap_auth(mode="ad", server="dc.domain.org", base_dn="ou=Users,dc=domain,dc=org")] +# Domino +#_settings.login_methods.append(ldap_auth(mode="domino", server="domino.domain.org")) +# OpenLDAP +#_settings.login_methods.append(ldap_auth(server="directory.sahanafoundation.org", base_dn="ou=users,dc=sahanafoundation,dc=org")) +# Allow use of Email accounts for login +#_settings.login_methods.append(email_auth("smtp.gmail.com:587", "@gmail.com")) + +# Require captcha verification for registration +#auth.settings.captcha = RECAPTCHA(request, public_key="PUBLIC_KEY", private_key="PRIVATE_KEY") +# Require Email Verification +_settings.registration_requires_verification = settings.get_auth_registration_requires_verification() +_settings.on_failed_authorization = URL(c="default", f="user", + args="not_authorized") +_settings.reset_password_requires_verification = True +_settings.verify_email_next = URL(c="default", f="index") + +# Require Admin approval for self-registered users +_settings.registration_requires_approval = settings.get_auth_registration_requires_approval() + +# We don't wish to clutter the groups list with 1 per user. +_settings.create_user_groups = False +# We need to allow basic logins for Webservices +_settings.allow_basic_login = True + +_settings.logout_onlogout = s3_auth_on_logout +_settings.login_onaccept = s3_auth_on_login +_settings.login_next = settings.get_auth_login_next() +if settings.has_module("vol") and \ + settings.get_auth_registration_volunteer(): + _settings.register_next = URL(c="vol", f="person") + +# Languages available in User Profiles +if len(s3.l10n_languages) > 1: + _settings.table_user.language.requires = IS_IN_SET(s3.l10n_languages, + zero=None) +else: + field = _settings.table_user.language + field.default = s3.l10n_languages.keys()[0] + field.readable = False + field.writable = False + +_settings.lock_keys = True + +# ----------------------------------------------------------------------------- +# Mail + +# These settings could be made configurable as part of the Messaging Module +# - however also need to be used by Auth (order issues) +sender = settings.get_mail_sender() +if sender: + mail.settings.sender = sender + mail.settings.server = settings.get_mail_server() + mail.settings.tls = settings.get_mail_server_tls() + mail_server_login = settings.get_mail_server_login() + if mail_server_login: + mail.settings.login = mail_server_login + # Email settings for registration verification and approval + _settings.mailer = mail + +# ----------------------------------------------------------------------------- +# Session + +# Custom Notifications +response.error = session.error +response.confirmation = session.confirmation +response.information = session.information +response.warning = session.warning +session.error = [] +session.confirmation = [] +session.information = [] +session.warning = [] + +# Shortcuts for system role IDs, see modules/s3aaa.py/AuthS3 +system_roles = auth.get_system_roles() +ADMIN = system_roles.ADMIN +AUTHENTICATED = system_roles.AUTHENTICATED +ANONYMOUS = system_roles.ANONYMOUS +EDITOR = system_roles.EDITOR +MAP_ADMIN = system_roles.MAP_ADMIN +ORG_ADMIN = system_roles.ORG_ADMIN +ORG_GROUP_ADMIN = system_roles.ORG_GROUP_ADMIN + +if s3.debug: + # Add the developer toolbar from modules/s3/s3utils.py + s3.toolbar = s3base.s3_dev_toolbar + +# ----------------------------------------------------------------------------- +# CRUD + +s3_formstyle = settings.get_ui_formstyle() +s3_formstyle_read = settings.get_ui_formstyle_read() +s3_formstyle_mobile = s3_formstyle +submit_button = T("Save") +_crud = s3.crud +_crud.formstyle = s3_formstyle +_crud.formstyle_read = s3_formstyle_read +_crud.submit_button = submit_button +# Optional class for Submit buttons +#_crud.submit_style = "submit-button" +_crud.confirm_delete = T("Do you really want to delete these records?") +_crud.archive_not_delete = settings.get_security_archive_not_delete() +_crud.navigate_away_confirm = settings.get_ui_navigate_away_confirm() + +# Content Type Headers, default is application/xml for XML formats +# and text/x-json for JSON formats, other content types must be +# specified here: +s3.content_type = Storage( + tc = "application/atom+xml", # TableCast feeds + rss = "application/rss+xml", # RSS + georss = "application/rss+xml", # GeoRSS + kml = "application/vnd.google-earth.kml+xml", # KML +) + +# JSON Formats +s3.json_formats = ["geojson", "s3json"] + +# CSV Formats +s3.csv_formats = ["hrf", "s3csv"] + +# Datatables default number of rows per page +s3.ROWSPERPAGE = 20 + +# Valid Extensions for Image Upload fields +s3.IMAGE_EXTENSIONS = ["png", "PNG", "jpg", "JPG", "jpeg", "JPEG"] + +# Default CRUD strings +s3.crud_strings = Storage( + label_create = T("Add Record"), + title_display = T("Record Details"), + title_list = T("Records"), + title_update = T("Edit Record"), + title_map = T("Map"), + title_report = T("Report"), + label_list_button = T("List Records"), + label_delete_button = T("Delete Record"), + msg_record_created = T("Record added"), + msg_record_modified = T("Record updated"), + msg_record_deleted = T("Record deleted"), + msg_list_empty = T("No Records currently available"), + msg_match = T("Matching Records"), + msg_no_match = T("No Matching Records"), + ) + +# END =========================================================================