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',
+]
+
+
+
+