From d8d141be0349911b34a1cd9f92a149ba6eefcb6c Mon Sep 17 00:00:00 2001 From: Alexander Burdeiny Date: Mon, 9 May 2016 19:09:18 +0300 Subject: [PATCH] =?UTF-8?q?fabfile=20created=201345:=20=D0=9F=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B0=20=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BC=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fabfile.py | 66 +++ ...fd758821e5ee79b8132feecaba10560f0123a.html | 1 + support/dev/.htpasswd | 1 + support/dev/hit.expomap.ru | 74 +++ support/dev/proj.com | 32 + support/dev/schema.xml | 201 +++++++ support/dev/settings.py | 557 ++++++++++++++++++ support/prod/hit.expomap.ru | 84 +++ support/prod/proj.com | 31 + support/prod/schema.xml | 201 +++++++ support/prod/settings.py | 552 +++++++++++++++++ 11 files changed, 1800 insertions(+) create mode 100644 fabfile.py create mode 100644 support/4885b11a73674eb6d54593c1d7efd758821e5ee79b8132feecaba10560f0123a.html create mode 100644 support/dev/.htpasswd create mode 100644 support/dev/hit.expomap.ru create mode 100644 support/dev/proj.com create mode 100644 support/dev/schema.xml create mode 100644 support/dev/settings.py create mode 100644 support/prod/hit.expomap.ru create mode 100644 support/prod/proj.com create mode 100644 support/prod/schema.xml create mode 100644 support/prod/settings.py diff --git a/fabfile.py b/fabfile.py new file mode 100644 index 00000000..c45e1bb0 --- /dev/null +++ b/fabfile.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +from os.path import join, basename + +from fabric.api import * + +env.roledefs = { + 'dev': ['root@176.121.11.165'], + 'prod': ['root@176.121.11.162'], +} +env.passwords = { + 'root@176.121.11.165:22': 'ue6R287QZfMc', + 'root@176.121.11.162:22': 'XcS2jx5e8k6n', +} + +REMOTE_HOME_DIR = '/home/www/expomap/' +LOCAL_HOME_DIR = '/home/alexander/projects/expomap/' + +nginx_conf = '/etc/nginx/sites-available/hit.expomap.ru' +apache2_conf = '/etc/apache2/sites-available/proj.com' +settings_conf = join(REMOTE_HOME_DIR, 'proj/settings.py') + + +def set_host(host): + env.hosts = env.roledefs.get(host) + env.role = host + + +def dev(): + set_host('dev') + + +def prod(): + set_host('prod') + + +def get_configs(): + localdir = join(LOCAL_HOME_DIR, 'support/', env.role) + get(nginx_conf, localdir) + get(apache2_conf, localdir) + get(join(REMOTE_HOME_DIR, 'schema.xml'), localdir) + get(settings_conf, localdir) + + +def put_configs(): + localdir = join(LOCAL_HOME_DIR, 'support/', env.role) + # nginx + put(join(localdir, basename(nginx_conf)), + nginx_conf) + # apache2 + put(join(localdir, basename(apache2_conf)), + apache2_conf) + # settings + # put(join(localdir, basename(settings_conf)), + # settings_conf) + + +def call_state(state): + run('service apache2 {state}'.format(state=state)) + run('service nginx {state}'.format(state=state)) + + +def put_1345(): + call_state('stop') + run('git pull') + put_configs() + call_state('start') diff --git a/support/4885b11a73674eb6d54593c1d7efd758821e5ee79b8132feecaba10560f0123a.html b/support/4885b11a73674eb6d54593c1d7efd758821e5ee79b8132feecaba10560f0123a.html new file mode 100644 index 00000000..9a8f4ead --- /dev/null +++ b/support/4885b11a73674eb6d54593c1d7efd758821e5ee79b8132feecaba10560f0123a.html @@ -0,0 +1 @@ +ostoffice-4885b11a73674eb6d54593c1d7efd758821e5ee79b8132feecaba10560f0123a diff --git a/support/dev/.htpasswd b/support/dev/.htpasswd new file mode 100644 index 00000000..fd5f1c22 --- /dev/null +++ b/support/dev/.htpasswd @@ -0,0 +1 @@ +dev:$apr1$51bqElVf$/.SfDBWGSjAauaw82Drbo1 diff --git a/support/dev/hit.expomap.ru b/support/dev/hit.expomap.ru new file mode 100644 index 00000000..5c782da5 --- /dev/null +++ b/support/dev/hit.expomap.ru @@ -0,0 +1,74 @@ +server { +# server_name 176.121.11.165 expomap.ru www.expomap.ru dev.expomap.ru; + listen 80; + return 301 https://$host$request_uri; +} + +server { + listen 443; + server_name 176.121.11.165 www.expomap.ru expomap.ru dev.expomap.ru; + #ssl_stapling on; + ssl on; + ssl_certificate /etc/nginx/ssl/expomap.ru.crt; + ssl_certificate_key /etc/nginx/ssl/expomap.ru.key; + ssl_dhparam /etc/nginx/ssl/dhparam.pem; + ssl_session_timeout 24h; + ssl_session_cache shared:SSL:25m; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2; + ssl_prefer_server_ciphers on; + add_header Strict-Transport-Security "max-age=31536000;"; + add_header Content-Security-Policy-Report-Only "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https: data:"; + + + + + client_header_timeout 360s; + location / { + auth_basic "Unauthorized"; + auth_basic_user_file /home/www/proj/.htpasswd; + proxy_pass http://127.0.0.1:8080/; + proxy_redirect off; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $remote_addr; + include /etc/nginx/geoip_proxy.conf; + client_max_body_size 100m; + client_body_buffer_size 128k; + + proxy_connect_timeout 90; + proxy_send_timeout 90; + proxy_read_timeout 90; + proxy_buffer_size 16k; + proxy_buffers 256 8k; + proxy_busy_buffers_size 2000k; + proxy_temp_file_write_size 2048k; + } + + + location /965E1EE7949FD639CA0124C8D8C57774.txt { + root /home/www/proj/; + } + + location /4885b11a73674eb6d54593c1d7efd758821e5ee79b8132feecaba10560f0123a.html { + root /home/www/proj/support; + } + + + location /static { + root /home/www/proj; + } + location /media { + root /home/www/proj; + } + + location /templates { + root /home/www/proj/static; + } + location /subdmn { + root /home/old_files; + } + + +} + diff --git a/support/dev/proj.com b/support/dev/proj.com new file mode 100644 index 00000000..cebee129 --- /dev/null +++ b/support/dev/proj.com @@ -0,0 +1,32 @@ + + WSGIDaemonProcess www-data display-name=%{GROUP} processes=2 threads=2 + WSGIProcessGroup www-data + WSGIScriptAlias / "/home/www/proj/project.wsgi" + ServerName 176.121.11.165 + + Order allow,deny + Options Indexes FollowSymLinks + Allow from all + IndexOptions FancyIndexing + + + Alias /media "/home/www/proj/media/" + Alias /static "/home/www/proj/static/" + + + + Order allow,deny + Options Indexes FollowSymLinks + Allow from all + IndexOptions FancyIndexing + + + Order allow,deny + Options Indexes FollowSymLinks + Allow from all + IndexOptions FancyIndexing + + + ErrorLog /var/log/apache2/expo.error.log + CustomLog /var/log/apache2/expo.access.log combined + diff --git a/support/dev/schema.xml b/support/dev/schema.xml new file mode 100644 index 00000000..6aaf5410 --- /dev/null +++ b/support/dev/schema.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + + + text + + + + + diff --git a/support/dev/settings.py b/support/dev/settings.py new file mode 100644 index 00000000..d2a8b78f --- /dev/null +++ b/support/dev/settings.py @@ -0,0 +1,557 @@ +# -*- coding: utf-8 -*- +# Django settings for proj project. +import os +import django +from django.utils.translation import ugettext_lazy as _ + + +DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__)) +SITE_ROOT = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0] + +DEBUG = True + + +ADMINS = ( + # ('Your Name', 'your_email@example.com'), +) + +MANAGERS = ADMINS + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'expomap', + 'USER': 'kotzilla', + 'PASSWORD': 'qazedc', + 'HOST': '', + 'PORT': '', + } +} + + +CACHES = { + "default": { + "BACKEND": "redis_cache.cache.RedisCache", + "LOCATION": "/tmp/redis.sock", + "OPTIONS": { + "CLIENT_CLASS": "redis_cache.client.DefaultClient", + }, + } +} + + + +# Hosts/domain names that are valid for this site; required if DEBUG is False +# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts +ALLOWED_HOSTS = ['hit.expomap.ru', '195.66.79.152', '195.66.79.145', 'expomap.ru', '195.66.79.148'] + +# 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 = 'ru' + +DEFAULT_LANGUAGE = 'ru' + +LANGUAGES = ( + ('ru', _('Russian')), + ('en', _('English')), +) + +LOCALE_PATHS = ( + os.path.join(SITE_ROOT, 'locale'), +) + +DEFAULT_CHARSET = 'utf-8' + +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 = False + +# If you set this to False, Django will not use timezone-aware datetimes. +USE_TZ = False + + +MEDIA_ROOT = os.path.join(SITE_ROOT, 'media/') +CKEDITOR_UPLOAD_PATH = os.path.join(SITE_ROOT, 'media/upload') + + +CKEDITOR_CONFIGS = { + 'default': { + 'toolbar': 'standart', + 'height': 200, + 'width': 565, + 'resize_enabled' : True, + 'autoGrow_onStartup' : False, + 'autoGrow_bottomSpace' : 300, + 'fillEmptyBlocks' : False, + 'autoParagraph' : False, + }, + 'newsletters': { + 'toolbar': 'standart', + 'height': 600, + 'width': 750, + 'resize_enabled' : True, + 'autoGrow_onStartup' : False, + 'autoGrow_bottomSpace' : 300, + 'fillEmptyBlocks' : False, + 'autoParagraph' : False, + }, + +} + +MEDIA_URL = '/media/' + +STATIC_ROOT = os.path.join(SITE_ROOT, 'collected_static') + +STATICFILES_DIRS = ( + (os.path.join(SITE_ROOT, 'static')), +) + +STATIC_URL = '/static/' + +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + #'django.contrib.staticfiles.finders.DefaultStorageFinder', +) + +# Make this unique, and don't share it with anybody. +SECRET_KEY = '=yz1@ko%1s8bmel)c84#s*xpxn%4(1e+smdnh*@rdm*5%v!mln' + + +TEMPLATE_CONTEXT_PROCESSORS = ( + "django.contrib.auth.context_processors.auth", + "django.core.context_processors.debug", + "django.core.context_processors.i18n", + "django.core.context_processors.media", + "django.core.context_processors.static", + "django.core.context_processors.tz", + "django.contrib.messages.context_processors.messages", + "django.core.context_processors.request", + 'social.apps.django_app.context_processors.backends', + 'social.apps.django_app.context_processors.login_redirect', + 'django_messages.context_processors.inbox', + "proj.views.expo_context" +) +#LOGIN_REDIRECT_URL = '/' + +MIDDLEWARE_CLASSES = ( +# 'django.middleware.cache.UpdateCacheMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'solid_i18n.middleware.SolidLocaleMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'social.apps.django_app.middleware.SocialAuthExceptionMiddleware', +# 'django.middleware.cache.FetchFromCacheMiddleware', + # Uncomment the next line for simple clickjacking protection: + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + + +) + + +ROOT_URLCONF = 'proj.urls' + +# Python dotted path to the WSGI application used by Django's runserver. +WSGI_APPLICATION = 'proj.wsgi.application' + +TEMPLATE_DIRS = ( + # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. + # os.path.join(SITE_ROOT, 'templates/debug_toolbar'), + os.path.join(SITE_ROOT, 'templates/admin'), + os.path.join(SITE_ROOT, 'templates/admin/accounts'), + os.path.join(SITE_ROOT, 'templates/admin/article'), + os.path.join(SITE_ROOT, 'templates/admin/country'), + os.path.join(SITE_ROOT, 'templates/admin/city'), + os.path.join(SITE_ROOT, 'templates/admin/company'), + os.path.join(SITE_ROOT, 'templates/admin/conference'), + os.path.join(SITE_ROOT, 'templates/admin/directories'), + os.path.join(SITE_ROOT, 'templates/admin/exposition'), + os.path.join(SITE_ROOT, 'templates/admin/forms'), + os.path.join(SITE_ROOT, 'templates/admin/import templates'), + os.path.join(SITE_ROOT, 'templates/admin/news'), + os.path.join(SITE_ROOT, 'templates/admin/organiser'), + os.path.join(SITE_ROOT, 'templates/admin/place_conference'), + os.path.join(SITE_ROOT, 'templates/admin/place_exposition'), + os.path.join(SITE_ROOT, 'templates/admin/page'), + os.path.join(SITE_ROOT, 'templates/admin/photoreport'), + os.path.join(SITE_ROOT, 'templates/admin/settings'), + os.path.join(SITE_ROOT, 'templates/admin/seminar'), + os.path.join(SITE_ROOT, 'templates/admin/service'), + os.path.join(SITE_ROOT, 'templates/admin/theme'), + os.path.join(SITE_ROOT, 'templates/admin/translator'), + os.path.join(SITE_ROOT, 'templates/admin/webinar'), + + os.path.join(SITE_ROOT, 'templates/client'), + os.path.join(SITE_ROOT, 'templates/client/exposition'), + os.path.join(SITE_ROOT, 'templates/client/photoreport'), + os.path.join(SITE_ROOT, 'templates/client/includes'), + os.path.join(SITE_ROOT, 'templates'), + #os.path.join(SITE_ROOT, 'templates/client/popups'), +) + +AUTH_USER_MODEL = 'accounts.User' +LOGIN_URL='/' +#registration info +ACCOUNT_ACTIVATION_DAYS=2 +# mail settings +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +EMAIL_HOST = 'localhost' +EMAIL_HOST_USER = '' +EMAIL_HOST_PASSWORD = '' +EMAIL_USE_TLS = True +EMAIL_PORT = 25 +DEFAULT_FROM_EMAIL = "expomap.ru" + + +AUTHENTICATION_BACKENDS = ( + 'social.backends.open_id.OpenIdAuth', + 'social.backends.vk.VKOAuth2', + 'social.backends.facebook.FacebookOAuth2', + 'social.backends.twitter.TwitterOAuth', + 'social.backends.google.GoogleOAuth', + 'social.backends.linkedin.LinkedinOAuth', + 'social.backends.odnoklassniki.OdnoklassnikiOAuth2', + 'social.backends.mailru.MailruOAuth2', + 'django.contrib.auth.backends.ModelBackend', +) + +SOCIAL_AUTH_LOGIN_URL = '/' +SOCIAL_AUTH_USER_MODEL = 'accounts.User' +SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/logged-in/' +# The user will be redirected to this URL when a social account is disconnected +SOCIAL_AUTH_INACTIVE_USER_URL = '/inactive-user/' +# #Used to redirect the user once the auth process ended successfully. The value of ?next=/foo is used if it was present +# SOCIAL_AUTH_LOGIN_ERROR_URL = '/login-error/' +# #URL where the user will be redirected in case of an error +# SOCIAL_AUTH_LOGIN_URL = '/login-url/' +# #Is used as a fallback for LOGIN_ERROR_URL +# SOCIAL_AUTH_NEW_USER_REDIRECT_URL = '/new-users-redirect-url/' +# # Used to redirect new registered users, will be used in place of SOCIAL_AUTH_LOGIN_REDIRECT_URL if defined. +# Note that ?next=/foo is appended if present, if you want new users to go to next, you’ll need to do it yourself. +# SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = '/new-association-redirect-url/' +# # Like SOCIAL_AUTH_NEW_USER_REDIRECT_URL but for new associated accounts (user is already logged in). +# Used in place of SOCIAL_AUTH_LOGIN_REDIRECT_URL +# SOCIAL_AUTH_DISCONNECT_REDIRECT_URL = '/account-disconnected-redirect-url/' + +# Inactive users can be redirected to this URL when trying to authenticate. +# SOCIAL_AUTH_UID_LENGTH = +# SOCIAL_AUTH_NONCE_SERVER_URL_LENGTH = +# SOCIAL_AUTH_ASSOCIATION_SERVER_URL_LENGTH = +# SOCIAL_AUTH_FORCE_EMAIL_VALIDATION = True + +SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL = True + +SOCIAL_AUTH_PIPELINE = ( + 'social.pipeline.social_auth.social_details', + 'social.pipeline.social_auth.social_uid', + 'functions.pipeline.load_user', + 'social.pipeline.social_auth.auth_allowed', + 'social.pipeline.social_auth.social_user', + 'social.pipeline.user.get_username', + 'functions.pipeline.require_email', + #'social.pipeline.mail.mail_validation', + 'functions.pipeline.create_user', + #'social.pipeline.user.create_user', + 'social.pipeline.social_auth.associate_by_email', + 'social.pipeline.social_auth.associate_user', + 'social.pipeline.social_auth.load_extra_data', + 'social.pipeline.user.user_details' + +) + +REQUIRES_EMAIL_VALIDATION = True +SOCIAL_AUTH_EMAIL_VALIDATION_FUNCTION = 'functions.pipeline.SendVerificationEmail' +SOCIAL_AUTH_EMAIL_VALIDATION_URL = '/email_verify_sent/' + + +SOCIAL_AUTH_VK_OAUTH2_KEY = '3393841' +SOCIAL_AUTH_VK_OAUTH2_SECRET = '2P19EBUEpLZifaabbREv' +SOCIAL_AUTH_VK_OAUTH2_SCOPE =['email'] +SOCIAL_AUTH_VK_OAUTH2_PROFILE_EXTRA_PARAMS = { + 'fields': 'email' +} + +SOCIAL_AUTH_FACEBOOK_KEY = '133775720059470' +SOCIAL_AUTH_FACEBOOK_SECRET = '434edf89c24a290497646a739df656c6' +SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', 'publish_actions'] + +SOCIAL_AUTH_TWITTER_KEY = 'S6NX33FazTcWuqnXQhlOdg' +SOCIAL_AUTH_TWITTER_SECRET = 'MxUGfySQmLI5kvqSoAtWsGje2eAHQL7Jo8mXuIZ4D0' +SOCIAL_AUTH_TWITTER_SCOPE = ['email'] + +SOCIAL_AUTH_GOOGLE_OAUTH_KEY = '1044044901114.apps.googleusercontent.com' +SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = 'j_McErlPPof88eNrmOXI-ZXI' +SOCIAL_AUTH_GOOGLE_OAUTH_SCOPE = ['email'] + +SOCIAL_AUTH_MAILRU_OAUTH2_KEY = '697945' +SOCIAL_AUTH_MAILRU_OAUTH2_SECRET = '343581b9e31961b334532cc1880066e8' +SOCIAL_AUTH_MAILRU_OAUTH2_SCOPE = ['email'] + +SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_KEY = 'CBAQDCKIABABABABA' +SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_SECRET = '814CDDCD3E2D2F278EF1591B' +SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_PUBLIC_NAME = '128007936' +SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_PUBLIC_SCOPE = ['email'] + +SOCIAL_AUTH_LINKEDIN_KEY = 'jt9xwquj1fkd' +SOCIAL_AUTH_LINKEDIN_SECRET = 'GvM2xQCNADaBfiMy' +SOCIAL_AUTH_LINKEDIN_SCOPE = ['email'] + + + +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django.contrib.humanize', + 'django.contrib.sitemaps', + 'haystack', + #custom modules + 'emencia.django.newsletter', + 'accounts', + 'article', + 'city', + 'company', + 'conference', + 'core', + 'country', + 'directories', + 'expobanner', + 'exposition', + 'file', + 'import_xls', + 'news', + 'note', + 'organiser', + 'place_conference', + 'place_exposition', + 'photoreport', + 'registration', + 'review', + 'seminar', + 'service', + 'settings', + 'theme', + 'translator', + 'webinar', + 'meta', + #django modules + 'django_crontab', + 'sorl.thumbnail', # for logos + 'photologue', # photogallery + 'sortedm2m', # photologue dependence + 'hvad', # + 'tinymce', # ??? + 'ckeditor', # wysiwig editor in admin + 'django_messages', # messages + 'bitfield', + 'djutils', # ?? + 'pytils', # ?? + 'pymorphy', # ?? + 'password_reset', # reset password + 'social.apps.django_app.default', # social auth + 'core', + 'specialist_catalog', + 'south', +) + +CRONJOBS = [ + ('8 * * * *', 'django.core.management.call_command', ['send_newsletter']), + + ('0 * * * *', 'django.core.management.call_command', ['update_index', 'conference', '--remove', '--age=6']), + ('5 * * * *', 'django.core.management.call_command', ['update_index', 'exposition', '--remove', '--age=6']), + ('0 1,13 * * *', 'django.core.management.call_command', ['update_index', 'place_exposition', '--remove', '--age=24']), + ('0 3 * * *', 'django.core.management.call_command', ['update_index', 'company', '--remove', '--age=48']), + ('0 4 * * *', 'django.core.management.call_command', ['update_index', 'theme', '--remove', '--age=48']), + ('0 5 * * * ', 'django.core.management.call_command', ['update_index', 'tag', '--remove', '--age=48']), + ('0 6 * * *', 'django.core.management.call_command', ['update_index', 'country', '--remove', '--age=48']), + ('0 7 * * *', 'django.core.management.call_command', ['update_index', 'city', '--remove', '--age=48']), + + ('10 * * * *', 'django.core.management.call_command', ['banner_log_update']), + ('20 2,14 * * *', 'django.core.management.call_command', ['banner_log_check_previous_day']), + ('*/5 * * * *', 'django.core.management.call_command', ['update_views_cache']), + + ('40 6 * * * ', 'django.core.management.call_command', ['newsletter_contacts_remove_notactivated']), + ('41 5 * * *', 'django.core.management.call_command', ['newsletter_create_announce']), + +] + +PYMORPHY_DICTS = { + 'ru': { 'dir': os.path.join(SITE_ROOT, 'settings/russian_dicts')} #'/home/www/proj/settings/russian_dicts' }, +} + +# search backend +HAYSTACK_CONNECTIONS = { + 'default': { + 'ENGINE': 'haystack.backends.solr_backend.SolrEngine', + 'URL': 'http://localhost:8983/solr' + # ...or for multicore... + # 'URL': 'http://127.0.0.1:8983/solr/mysite', + }, +} + + +# 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/dev/topics/logging for +# more details on how to customize your logging configuration. +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + } + }, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'filters': ['require_debug_false'], + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True, + }, + } +} + +# TODO automate crons +""" +# update search indexes +0 * * * * /usr/bin/python /var/www/proj/manage.py update_index conference --remove --age=6 +0 * * * * /usr/bin/python /var/www/proj/manage.py update_index exposition --remove --age=6 +0 1,13 * * * /usr/bin/python /var/www/proj/manage.py update_index place_exposition --remove --age=24 +0 3 * * * /usr/bin/python /var/www/proj/manage.py update_index company --remove --age=48 +0 4 * * * /usr/bin/python /var/www/proj/manage.py update_index theme --remove --age=48 +0 5 * * * /usr/bin/python /var/www/proj/manage.py update_index tag --remove --age=48 +0 6 * * * /usr/bin/python /var/www/proj/manage.py update_index country --remove --age=48 +0 7 * * * /usr/bin/python /var/www/proj/manage.py update_index city --remove --age=48 +# update banner logs +10 * * * * /usr/bin/python /var/www/proj/manage.py banner_log_update +20 2,14 * * * /usr/bin/python /var/www/proj/manage.py banner_log_check_previous_day +# update hotels prices +20 1 * * 6 /usr/bin/python /var/www/proj/manage.py update_hotels_price +# newsletter +20 * * * * /usr/bin/python /var/www/proj/manage.py send_newsletter +40 6 * * * /usr/bin/python /var/www/proj/manage.py newsletter_contacts_remove_notactivated + +""" + +THUMBNAIL_DEBUG = DEBUG + +CALLBACK_EMAIL = 'kotzilla@ukr.net' + +BOOKING_AID = '333667' +try: + from functions.overrides import SeoPaginator as Paginator +except ImportError: + from django.core.paginator import Paginator +DEFAULT_PAGINATOR = Paginator +ADMIN_PAGINATION = 20 +CLIENT_PAGINATION = 15 + +TEMPLATE_DEBUG = DEBUG +NO_LOGO = '/static/client/img/no-logo.png' + +# events settings +CURRENCY = ('RUB', 'USD', 'EUR', 'RMB', 'GBP', 'AED', 'SGD', 'TRY', 'CZK', 'CHF', 'SEK', 'LKR', 'UAH', 'IDR', 'PLN','JPY') +BIT_AUDIENCE = (('experts', _(u'Специалисты')), ('experts and consumers', _(u'Специалисты и потребители')), + ('general public', _(u'Широкая публика'))) + +MONTHES = {'jan': {'value': 1, 'name': _(u'Январь')}, 'feb': {'value': 2, 'name': _(u'Февраль')}, + 'mar': {'value': 3, 'name': _(u'Март')}, 'apr': {'value': 4, 'name': _(u'Апрель')}, + 'may': {'value': 5, 'name': _(u'Май')}, 'jun': {'value': 6, 'name': _(u'Июнь')}, + 'jul': {'value': 7, 'name': _(u'Июль')}, 'aug': {'value': 8, 'name': _(u'Август')}, + 'sep': {'value': 9, 'name': _(u'Сентябрь')}, 'oct': {'value': 10, 'name': _(u'Октябрь')}, + 'nov': {'value': 11, 'name': _(u'Ноябрь')}, 'dec': {'value': 12, 'name': _(u'Декабрь')}} + +SNG_COUNTRIES = [159, 186, 31, 6, 99, 13, 189, 64] + + +CLIENT_DATE_FORMAT = ["%d.%m.%Y"] + +# cache pages in random seconds. random in this range +CACHE_RANGE = [60, 120] + +DEFAULT_POPUP_COOKIE = 'expo_b_default_popup' + +try: + from local import * +except ImportError, e: + pass +try: + from dev_settings import * +except ImportError, e: + pass + +# save sessions in redis +SESSION_ENGINE = 'django.contrib.sessions.backends.cache' +if not DEBUG: + # cache template loading + TEMPLATE_LOADERS = ( + ('django.template.loaders.cached.Loader', ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + )), + ) +else: + TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + ) + +# debug_toolbar settings + +if DEBUG: + DEBUG_TOOLBAR_PATCH_SETTINGS = False + INTERNAL_IPS = ('127.0.0.1','176.121.5.82', '176.121.11.162', '77.123.47.46') + + MIDDLEWARE_CLASSES += ( + 'debug_toolbar.middleware.DebugToolbarMiddleware', + ) + + INSTALLED_APPS += ( + 'debug_toolbar', + ) + JQUERY_URL = os.path.join(SITE_ROOT, 'static/client/js/jquery-ui-1.10.4.custom.min.js'), + DEBUG_TOOLBAR_PANELS = [ + #'debug_toolbar.panels.versions.VersionsPanel', + 'debug_toolbar.panels.timer.TimerPanel', + 'debug_toolbar.panels.settings.SettingsPanel', + 'debug_toolbar.panels.headers.HeadersPanel', + 'debug_toolbar.panels.request.RequestPanel', + 'debug_toolbar.panels.sql.SQLPanel', + 'debug_toolbar.panels.staticfiles.StaticFilesPanel', + 'debug_toolbar.panels.templates.TemplatesPanel', + 'debug_toolbar.panels.cache.CachePanel', + 'debug_toolbar.panels.signals.SignalsPanel', + 'debug_toolbar.panels.logging.LoggingPanel', + 'debug_toolbar.panels.redirects.RedirectsPanel', +] + + + + diff --git a/support/prod/hit.expomap.ru b/support/prod/hit.expomap.ru new file mode 100644 index 00000000..86a7227e --- /dev/null +++ b/support/prod/hit.expomap.ru @@ -0,0 +1,84 @@ +server { + server_name expomap.ru www.expomap.ru; +# listen 80; + + return 301 https://expomap.ru$request_uri; +} + +server { + listen 176.121.11.162:443 ssl; + server_name www.expomap.ru; + +# ssl on; +# ssl_certificate /etc/nginx/ssl/expomap.ru.crt; +# ssl_certificate_key /etc/nginx/ssl/expomap.ru.key; + + return 301 https://expomap.ru$request_uri; +} + +server { + listen 176.121.11.162:443 ssl default_server ; + server_name expomap.ru ; +# ssl_stapling on; + ssl on; + ssl_certificate /etc/nginx/ssl/expomap.ru.crt; + ssl_certificate_key /etc/nginx/ssl/expomap.ru.key; + ssl_dhparam /etc/nginx/ssl/dhparam.pem; + ssl_session_timeout 24h; + ssl_session_cache shared:SSL:25m; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2; + ssl_prefer_server_ciphers on; + add_header Strict-Transport-Security "max-age=31536000;"; + add_header Content-Security-Policy-Report-Only "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https: data:"; + + + client_header_timeout 360s; + location / { +# auth_basic "Unauthorized"; +# auth_basic_user_file /home/www/proj/.htpasswd; + proxy_pass http://127.0.0.1:8080; + proxy_redirect off; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $remote_addr; + include /etc/nginx/geoip_proxy.conf; + + client_max_body_size 100m; + client_body_buffer_size 128k; + + proxy_connect_timeout 90; + proxy_send_timeout 90; + proxy_read_timeout 90; + proxy_buffer_size 16k; + proxy_buffers 256 8k; + proxy_busy_buffers_size 2000k; + proxy_temp_file_write_size 2048k; + } + + + location /965E1EE7949FD639CA0124C8D8C57774.txt { + root /home/www/proj/; + } + + location /4885b11a73674eb6d54593c1d7efd758821e5ee79b8132feecaba10560f0123a.html { + root /home/www/proj/support; + } + + location /static { + root /home/www/proj; + } + location /media { + root /home/www/proj; + } + + location /templates { + root /home/www/proj/static; + } + location /subdmn { + root /home/old_files; + } + + +} + diff --git a/support/prod/proj.com b/support/prod/proj.com new file mode 100644 index 00000000..3bf960e0 --- /dev/null +++ b/support/prod/proj.com @@ -0,0 +1,31 @@ + + WSGIDaemonProcess www-data display-name=%{GROUP} processes=8 threads=1 + WSGIProcessGroup www-data + WSGIScriptAlias / "/home/www/proj/project.wsgi" + ServerName hit.expomap.ru + + Order allow,deny + Options Indexes FollowSymLinks + Allow from all + IndexOptions FancyIndexing + + + Alias /media "/home/www/proj/media/" + Alias /static "/home/www/proj/static/" + + + + Order allow,deny + Options Indexes FollowSymLinks + Allow from all + IndexOptions FancyIndexing + + + Order allow,deny + Options Indexes FollowSymLinks + Allow from all + IndexOptions FancyIndexing + + + ErrorLog /var/log/apache2/expo.error.log + diff --git a/support/prod/schema.xml b/support/prod/schema.xml new file mode 100644 index 00000000..6aaf5410 --- /dev/null +++ b/support/prod/schema.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + + + text + + + + + diff --git a/support/prod/settings.py b/support/prod/settings.py new file mode 100644 index 00000000..2d9e18d4 --- /dev/null +++ b/support/prod/settings.py @@ -0,0 +1,552 @@ +# -*- coding: utf-8 -*- +# Django settings for proj project. +import os +import django +from django.utils.translation import ugettext_lazy as _ + + +DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__)) +SITE_ROOT = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0] + +DEBUG = False + + +ADMINS = ( + # ('Your Name', 'your_email@example.com'), +) + +MANAGERS = ADMINS + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'expomap', + 'USER': 'kotzilla', + 'PASSWORD': 'qazedc', + 'HOST': '', + 'PORT': '', + } +} + + +CACHES = { + "default": { + "BACKEND": "redis_cache.cache.RedisCache", + "LOCATION": "/tmp/redis.sock", + "OPTIONS": { + "CLIENT_CLASS": "redis_cache.client.DefaultClient", + }, + } +} + + + +# Hosts/domain names that are valid for this site; required if DEBUG is False +# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts +ALLOWED_HOSTS = ['hit.expomap.ru', '195.66.79.152', '195.66.79.145', 'expomap.ru', '195.66.79.148'] + +# 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 = 'ru' + +DEFAULT_LANGUAGE = 'ru' + +LANGUAGES = ( + ('ru', _('Russian')), + ('en', _('English')), +) + +LOCALE_PATHS = ( + os.path.join(SITE_ROOT, 'locale'), +) + +DEFAULT_CHARSET = 'utf-8' + +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 = False + +# If you set this to False, Django will not use timezone-aware datetimes. +USE_TZ = False + + +MEDIA_ROOT = os.path.join(SITE_ROOT, 'media/') +CKEDITOR_UPLOAD_PATH = os.path.join(SITE_ROOT, 'media/upload') + + +CKEDITOR_CONFIGS = { + 'default': { + 'toolbar': 'standart', + 'height': 200, + 'width': 565, + 'resize_enabled' : True, + 'autoGrow_onStartup' : False, + 'autoGrow_bottomSpace' : 300, + 'fillEmptyBlocks' : False, + 'autoParagraph' : False, + }, + 'newsletters': { + 'toolbar': 'standart', + 'height': 600, + 'width': 750, + 'resize_enabled' : True, + 'autoGrow_onStartup' : False, + 'autoGrow_bottomSpace' : 300, + 'fillEmptyBlocks' : False, + 'autoParagraph' : False, + }, + +} + +MEDIA_URL = '/media/' + +STATIC_ROOT = os.path.join(SITE_ROOT, 'static') + +#STATICFILES_DIRS = ( +# (os.path.join(SITE_ROOT, 'static')), +#) + +STATIC_URL = '/static/' + +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + #'django.contrib.staticfiles.finders.DefaultStorageFinder', +) + +# Make this unique, and don't share it with anybody. +SECRET_KEY = '=yz1@ko%1s8bmel)c84#s*xpxn%4(1e+smdnh*@rdm*5%v!mln' + + +TEMPLATE_CONTEXT_PROCESSORS = ( + "django.contrib.auth.context_processors.auth", + "django.core.context_processors.debug", + "django.core.context_processors.i18n", + "django.core.context_processors.media", + "django.core.context_processors.static", + "django.core.context_processors.tz", + "django.contrib.messages.context_processors.messages", + "django.core.context_processors.request", + 'social.apps.django_app.context_processors.backends', + 'social.apps.django_app.context_processors.login_redirect', + 'django_messages.context_processors.inbox', + "proj.views.expo_context" +) +#LOGIN_REDIRECT_URL = '/' + +MIDDLEWARE_CLASSES = ( +# 'django.middleware.cache.UpdateCacheMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'solid_i18n.middleware.SolidLocaleMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'social.apps.django_app.middleware.SocialAuthExceptionMiddleware', +# 'django.middleware.cache.FetchFromCacheMiddleware', + # Uncomment the next line for simple clickjacking protection: + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + + +) + + +ROOT_URLCONF = 'proj.urls' + +# Python dotted path to the WSGI application used by Django's runserver. +WSGI_APPLICATION = 'proj.wsgi.application' + +TEMPLATE_DIRS = ( + # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. + # os.path.join(SITE_ROOT, 'templates/debug_toolbar'), + os.path.join(SITE_ROOT, 'templates/admin'), + os.path.join(SITE_ROOT, 'templates/admin/accounts'), + os.path.join(SITE_ROOT, 'templates/admin/article'), + os.path.join(SITE_ROOT, 'templates/admin/country'), + os.path.join(SITE_ROOT, 'templates/admin/city'), + os.path.join(SITE_ROOT, 'templates/admin/company'), + os.path.join(SITE_ROOT, 'templates/admin/conference'), + os.path.join(SITE_ROOT, 'templates/admin/directories'), + os.path.join(SITE_ROOT, 'templates/admin/exposition'), + os.path.join(SITE_ROOT, 'templates/admin/forms'), + os.path.join(SITE_ROOT, 'templates/admin/import templates'), + os.path.join(SITE_ROOT, 'templates/admin/news'), + os.path.join(SITE_ROOT, 'templates/admin/organiser'), + os.path.join(SITE_ROOT, 'templates/admin/place_conference'), + os.path.join(SITE_ROOT, 'templates/admin/place_exposition'), + os.path.join(SITE_ROOT, 'templates/admin/page'), + os.path.join(SITE_ROOT, 'templates/admin/photoreport'), + os.path.join(SITE_ROOT, 'templates/admin/settings'), + os.path.join(SITE_ROOT, 'templates/admin/seminar'), + os.path.join(SITE_ROOT, 'templates/admin/service'), + os.path.join(SITE_ROOT, 'templates/admin/theme'), + os.path.join(SITE_ROOT, 'templates/admin/translator'), + os.path.join(SITE_ROOT, 'templates/admin/webinar'), + + os.path.join(SITE_ROOT, 'templates/client'), + os.path.join(SITE_ROOT, 'templates/client/exposition'), + os.path.join(SITE_ROOT, 'templates/client/photoreport'), + os.path.join(SITE_ROOT, 'templates/client/includes'), + os.path.join(SITE_ROOT, 'templates'), + #os.path.join(SITE_ROOT, 'templates/client/popups'), +) + +AUTH_USER_MODEL = 'accounts.User' +LOGIN_URL='/' +#registration info +ACCOUNT_ACTIVATION_DAYS=2 +# mail settings +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +EMAIL_HOST = 'localhost' +EMAIL_HOST_USER = '' +EMAIL_HOST_PASSWORD = '' +EMAIL_USE_TLS = True +EMAIL_PORT = 25 +DEFAULT_FROM_EMAIL = "expomap.ru" + + +AUTHENTICATION_BACKENDS = ( + 'social.backends.open_id.OpenIdAuth', + 'social.backends.vk.VKOAuth2', + 'social.backends.facebook.FacebookOAuth2', + 'social.backends.twitter.TwitterOAuth', + 'social.backends.google.GoogleOAuth', + 'social.backends.linkedin.LinkedinOAuth', + 'social.backends.odnoklassniki.OdnoklassnikiOAuth2', + 'social.backends.mailru.MailruOAuth2', + 'django.contrib.auth.backends.ModelBackend', +) + +SOCIAL_AUTH_LOGIN_URL = '/' +SOCIAL_AUTH_USER_MODEL = 'accounts.User' +SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/logged-in/' +# The user will be redirected to this URL when a social account is disconnected +SOCIAL_AUTH_INACTIVE_USER_URL = '/inactive-user/' +# #Used to redirect the user once the auth process ended successfully. The value of ?next=/foo is used if it was present +# SOCIAL_AUTH_LOGIN_ERROR_URL = '/login-error/' +# #URL where the user will be redirected in case of an error +# SOCIAL_AUTH_LOGIN_URL = '/login-url/' +# #Is used as a fallback for LOGIN_ERROR_URL +# SOCIAL_AUTH_NEW_USER_REDIRECT_URL = '/new-users-redirect-url/' +# # Used to redirect new registered users, will be used in place of SOCIAL_AUTH_LOGIN_REDIRECT_URL if defined. +# Note that ?next=/foo is appended if present, if you want new users to go to next, you’ll need to do it yourself. +# SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = '/new-association-redirect-url/' +# # Like SOCIAL_AUTH_NEW_USER_REDIRECT_URL but for new associated accounts (user is already logged in). +# Used in place of SOCIAL_AUTH_LOGIN_REDIRECT_URL +# SOCIAL_AUTH_DISCONNECT_REDIRECT_URL = '/account-disconnected-redirect-url/' + +# Inactive users can be redirected to this URL when trying to authenticate. +# SOCIAL_AUTH_UID_LENGTH = +# SOCIAL_AUTH_NONCE_SERVER_URL_LENGTH = +# SOCIAL_AUTH_ASSOCIATION_SERVER_URL_LENGTH = +# SOCIAL_AUTH_FORCE_EMAIL_VALIDATION = True + +SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL = True + +SOCIAL_AUTH_PIPELINE = ( + 'social.pipeline.social_auth.social_details', + 'social.pipeline.social_auth.social_uid', + 'functions.pipeline.load_user', + 'social.pipeline.social_auth.auth_allowed', + 'social.pipeline.social_auth.social_user', + 'social.pipeline.user.get_username', + 'functions.pipeline.require_email', + #'social.pipeline.mail.mail_validation', + 'functions.pipeline.create_user', + #'social.pipeline.user.create_user', + 'social.pipeline.social_auth.associate_by_email', + 'social.pipeline.social_auth.associate_user', + 'social.pipeline.social_auth.load_extra_data', + 'social.pipeline.user.user_details' + +) + +REQUIRES_EMAIL_VALIDATION = True +SOCIAL_AUTH_EMAIL_VALIDATION_FUNCTION = 'functions.pipeline.SendVerificationEmail' +SOCIAL_AUTH_EMAIL_VALIDATION_URL = '/email_verify_sent/' + + +SOCIAL_AUTH_VK_OAUTH2_KEY = '3393841' +SOCIAL_AUTH_VK_OAUTH2_SECRET = '2P19EBUEpLZifaabbREv' +SOCIAL_AUTH_VK_OAUTH2_SCOPE =['email'] +SOCIAL_AUTH_VK_OAUTH2_PROFILE_EXTRA_PARAMS = { + 'fields': 'email' +} + +SOCIAL_AUTH_FACEBOOK_KEY = '133775720059470' +SOCIAL_AUTH_FACEBOOK_SECRET = '434edf89c24a290497646a739df656c6' +SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', 'publish_actions'] + +SOCIAL_AUTH_TWITTER_KEY = 'S6NX33FazTcWuqnXQhlOdg' +SOCIAL_AUTH_TWITTER_SECRET = 'MxUGfySQmLI5kvqSoAtWsGje2eAHQL7Jo8mXuIZ4D0' +SOCIAL_AUTH_TWITTER_SCOPE = ['email'] + +SOCIAL_AUTH_GOOGLE_OAUTH_KEY = '1044044901114.apps.googleusercontent.com' +SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = 'j_McErlPPof88eNrmOXI-ZXI' +SOCIAL_AUTH_GOOGLE_OAUTH_SCOPE = ['email'] + +SOCIAL_AUTH_MAILRU_OAUTH2_KEY = '697945' +SOCIAL_AUTH_MAILRU_OAUTH2_SECRET = '343581b9e31961b334532cc1880066e8' +SOCIAL_AUTH_MAILRU_OAUTH2_SCOPE = ['email'] + +SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_KEY = 'CBAQDCKIABABABABA' +SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_SECRET = '814CDDCD3E2D2F278EF1591B' +SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_PUBLIC_NAME = '128007936' +SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_PUBLIC_SCOPE = ['email'] + +SOCIAL_AUTH_LINKEDIN_KEY = 'jt9xwquj1fkd' +SOCIAL_AUTH_LINKEDIN_SECRET = 'GvM2xQCNADaBfiMy' +SOCIAL_AUTH_LINKEDIN_SCOPE = ['email'] + + + +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django.contrib.humanize', + 'django.contrib.sitemaps', + 'haystack', + #custom modules + 'emencia.django.newsletter', + 'accounts', + 'article', + 'city', + 'company', + 'conference', + 'core', + 'country', + 'directories', + 'expobanner', + 'exposition', + 'file', + 'import_xls', + 'news', + 'note', + 'organiser', + 'place_conference', + 'place_exposition', + 'photoreport', + 'registration', + 'review', + 'seminar', + 'service', + 'settings', + 'theme', + 'translator', + 'webinar', + 'meta', + #django modules + 'django_crontab', + 'sorl.thumbnail', # for logos + 'photologue', # photogallery + 'sortedm2m', # photologue dependence + 'hvad', # + 'tinymce', # ??? + 'ckeditor', # wysiwig editor in admin + 'django_messages', # messages + 'bitfield', + 'djutils', # ?? + 'pytils', # ?? + 'pymorphy', # ?? + 'password_reset', # reset password + 'social.apps.django_app.default', # social auth + 'core', + 'specialist_catalog', + 'south', +) + +CRONJOBS = [ + ('8 * * * *', 'django.core.management.call_command', ['send_newsletter']), + + ('0 * * * *', 'django.core.management.call_command', ['update_index', 'conference', '--remove', '--age=6']), + ('5 * * * *', 'django.core.management.call_command', ['update_index', 'exposition', '--remove', '--age=6']), + ('0 1,13 * * *', 'django.core.management.call_command', ['update_index', 'place_exposition', '--remove', '--age=24']), + ('0 3 * * *', 'django.core.management.call_command', ['update_index', 'company', '--remove', '--age=48']), + ('0 4 * * *', 'django.core.management.call_command', ['update_index', 'theme', '--remove', '--age=48']), + ('0 5 * * * ', 'django.core.management.call_command', ['update_index', 'tag', '--remove', '--age=48']), + ('0 6 * * *', 'django.core.management.call_command', ['update_index', 'country', '--remove', '--age=48']), + ('0 7 * * *', 'django.core.management.call_command', ['update_index', 'city', '--remove', '--age=48']), + + ('10 * * * *', 'django.core.management.call_command', ['banner_log_update']), + ('20 2,14 * * *', 'django.core.management.call_command', ['banner_log_check_previous_day']), + ('*/5 * * * *', 'django.core.management.call_command', ['update_views_cache']), + + ('40 6 * * * ', 'django.core.management.call_command', ['newsletter_contacts_remove_notactivated']), + ('41 5 * * *', 'django.core.management.call_command', ['newsletter_create_announce']), + +] + +PYMORPHY_DICTS = { + 'ru': { 'dir': os.path.join(SITE_ROOT, 'settings/russian_dicts')} #'/home/www/proj/settings/russian_dicts' }, +} + +# search backend +HAYSTACK_CONNECTIONS = { + 'default': { + 'ENGINE': 'haystack.backends.solr_backend.SolrEngine', + 'URL': 'http://localhost:8983/solr' + # ...or for multicore... + # 'URL': 'http://127.0.0.1:8983/solr/mysite', + }, +} + + +# 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/dev/topics/logging for +# more details on how to customize your logging configuration. +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + } + }, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'filters': ['require_debug_false'], + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True, + }, + } +} + +# TODO automate crons +""" +# update search indexes +0 * * * * /usr/bin/python /var/www/proj/manage.py update_index conference --remove --age=6 +0 * * * * /usr/bin/python /var/www/proj/manage.py update_index exposition --remove --age=6 +0 1,13 * * * /usr/bin/python /var/www/proj/manage.py update_index place_exposition --remove --age=24 +0 3 * * * /usr/bin/python /var/www/proj/manage.py update_index company --remove --age=48 +0 4 * * * /usr/bin/python /var/www/proj/manage.py update_index theme --remove --age=48 +0 5 * * * /usr/bin/python /var/www/proj/manage.py update_index tag --remove --age=48 +0 6 * * * /usr/bin/python /var/www/proj/manage.py update_index country --remove --age=48 +0 7 * * * /usr/bin/python /var/www/proj/manage.py update_index city --remove --age=48 +# update banner logs +10 * * * * /usr/bin/python /var/www/proj/manage.py banner_log_update +20 2,14 * * * /usr/bin/python /var/www/proj/manage.py banner_log_check_previous_day +# update hotels prices +20 1 * * 6 /usr/bin/python /var/www/proj/manage.py update_hotels_price +# newsletter +20 * * * * /usr/bin/python /var/www/proj/manage.py send_newsletter +40 6 * * * /usr/bin/python /var/www/proj/manage.py newsletter_contacts_remove_notactivated + +""" + +THUMBNAIL_DEBUG = DEBUG + +CALLBACK_EMAIL = 'kotzilla@ukr.net' + +BOOKING_AID = '333667' +try: + from functions.overrides import SeoPaginator as Paginator +except ImportError: + from django.core.paginator import Paginator +DEFAULT_PAGINATOR = Paginator +ADMIN_PAGINATION = 20 +CLIENT_PAGINATION = 15 + +TEMPLATE_DEBUG = DEBUG +NO_LOGO = '/static/client/img/no-logo.png' + +# events settings +CURRENCY = ('RUB', 'USD', 'EUR', 'RMB', 'GBP', 'AED', 'SGD', 'TRY', 'CZK', 'CHF', 'SEK', 'LKR', 'UAH', 'IDR', 'PLN','JPY') +BIT_AUDIENCE = (('experts', _(u'Специалисты')), ('experts and consumers', _(u'Специалисты и потребители')), + ('general public', _(u'Широкая публика'))) + +MONTHES = {'jan': {'value': 1, 'name': _(u'Январь')}, 'feb': {'value': 2, 'name': _(u'Февраль')}, + 'mar': {'value': 3, 'name': _(u'Март')}, 'apr': {'value': 4, 'name': _(u'Апрель')}, + 'may': {'value': 5, 'name': _(u'Май')}, 'jun': {'value': 6, 'name': _(u'Июнь')}, + 'jul': {'value': 7, 'name': _(u'Июль')}, 'aug': {'value': 8, 'name': _(u'Август')}, + 'sep': {'value': 9, 'name': _(u'Сентябрь')}, 'oct': {'value': 10, 'name': _(u'Октябрь')}, + 'nov': {'value': 11, 'name': _(u'Ноябрь')}, 'dec': {'value': 12, 'name': _(u'Декабрь')}} + +SNG_COUNTRIES = [159, 186, 31, 6, 99, 13, 189, 64] + + +CLIENT_DATE_FORMAT = ["%d.%m.%Y"] + +# cache pages in random seconds. random in this range +CACHE_RANGE = [60, 120] + +DEFAULT_POPUP_COOKIE = 'expo_b_default_popup' + +try: + from local import * +except ImportError, e: + pass +# save sessions in redis +SESSION_ENGINE = 'django.contrib.sessions.backends.cache' +if not DEBUG: + # cache template loading + TEMPLATE_LOADERS = ( + ('django.template.loaders.cached.Loader', ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + )), + ) +else: + TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + ) + +# debug_toolbar settings + +if DEBUG: + DEBUG_TOOLBAR_PATCH_SETTINGS = False + INTERNAL_IPS = ('127.0.0.1','176.121.5.82', '176.121.11.162', '77.123.47.46') + + MIDDLEWARE_CLASSES += ( + 'debug_toolbar.middleware.DebugToolbarMiddleware', + ) + + INSTALLED_APPS += ( + 'debug_toolbar', + ) + JQUERY_URL = os.path.join(SITE_ROOT, 'static/client/js/jquery-ui-1.10.4.custom.min.js'), + DEBUG_TOOLBAR_PANELS = [ + #'debug_toolbar.panels.versions.VersionsPanel', + 'debug_toolbar.panels.timer.TimerPanel', + 'debug_toolbar.panels.settings.SettingsPanel', + 'debug_toolbar.panels.headers.HeadersPanel', + 'debug_toolbar.panels.request.RequestPanel', + 'debug_toolbar.panels.sql.SQLPanel', + 'debug_toolbar.panels.staticfiles.StaticFilesPanel', + 'debug_toolbar.panels.templates.TemplatesPanel', + 'debug_toolbar.panels.cache.CachePanel', + 'debug_toolbar.panels.signals.SignalsPanel', + 'debug_toolbar.panels.logging.LoggingPanel', + 'debug_toolbar.panels.redirects.RedirectsPanel', +] + + + +