text: from __future__ import unicode_literals
  
  import ast
  import os.path
  
  import dj_database_url
  import dj_email_url
  from django.contrib.messages import constants as messages
  import django_cache_url
  from django.utils.translation import ugettext_lazy as _
  
  
  DEBUG = ast.literal_eval(os.environ.get('DEBUG', 'True'))
  
  SITE_ID = 1
  
  PROJECT_ROOT = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
  
  ROOT_URLCONF = 'saleor.urls'
  
  WSGI_APPLICATION = 'saleor.wsgi.application'
  
  ADMINS = (
      # ('Your Name', 'your_email@example.com'),
  )
  MANAGERS = ADMINS
  INTERNAL_IPS = os.environ.get('INTERNAL_IPS', '127.0.0.1').split()
  
  CACHES = {'default': django_cache_url.config()}
  
  if os.environ.get('REDIS_URL'):
      CACHES['default'] = {
          'BACKEND': 'django_redis.cache.RedisCache',
          'LOCATION': os.environ.get('REDIS_URL')}
  
  DATABASES = {
      'default': dj_database_url.config(
          default=os.environ.get('DATABASE_URL', 'postgres://saleor:saleor@db/saleor'),
          conn_max_age=600)}
  
  
  TIME_ZONE = 'Asia/Ho_Chi_Minh'
  LANGUAGE_CODE = 'vi'
  LANGUAGES = [
      ('vi', _('Vietnamese')),
  ]
  LOCALE_PATHS = [os.path.join(PROJECT_ROOT, 'locale')]
  USE_I18N = True
  USE_L10N = True
  USE_TZ = True
  
  FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
  
  EMAIL_URL = os.environ.get('EMAIL_URL')
  SENDGRID_USERNAME = os.environ.get('SENDGRID_USERNAME')
  SENDGRID_PASSWORD = os.environ.get('SENDGRID_PASSWORD')
  if not EMAIL_URL and SENDGRID_USERNAME and SENDGRID_PASSWORD:
      EMAIL_URL = 'smtp://%s:%s@smtp.sendgrid.net:587/?tls=True' % (
          SENDGRID_USERNAME, SENDGRID_PASSWORD)
  email_config = dj_email_url.parse(EMAIL_URL or 'console://')
  
  EMAIL_FILE_PATH = email_config['EMAIL_FILE_PATH']
  EMAIL_HOST_USER = email_config['EMAIL_HOST_USER']
  EMAIL_HOST_PASSWORD = email_config['EMAIL_HOST_PASSWORD']
  EMAIL_HOST = email_config['EMAIL_HOST']
  EMAIL_PORT = email_config['EMAIL_PORT']
  EMAIL_BACKEND = email_config['EMAIL_BACKEND']
  EMAIL_USE_TLS = email_config['EMAIL_USE_TLS']
  EMAIL_USE_SSL = email_config['EMAIL_USE_SSL']
  
  DEFAULT_FROM_EMAIL = os.environ.get('DEFAULT_FROM_EMAIL')
  ORDER_FROM_EMAIL = os.getenv('ORDER_FROM_EMAIL', DEFAULT_FROM_EMAIL)
  
  MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media')
  MEDIA_URL = '/media/'
  
  STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
  STATIC_URL = '/static/'
  STATICFILES_DIRS = [
      ('assets', os.path.join(PROJECT_ROOT, 'saleor', 'static', 'assets')),
      ('images', os.path.join(PROJECT_ROOT, 'saleor', 'static', 'images')),
      ('dashboard', os.path.join(PROJECT_ROOT, 'saleor', 'static', 'dashboard')),
      ('invoices', os.path.join(PROJECT_ROOT, 'saleor', 'static', 'invoices')),
  ]
  STATICFILES_FINDERS = [
      'django.contrib.staticfiles.finders.FileSystemFinder',
      'django.contrib.staticfiles.finders.AppDirectoriesFinder'
  ]
  
  context_processors = [
      'django.contrib.auth.context_processors.auth',
      'django.template.context_processors.debug',
      'django.template.context_processors.i18n',
      'django.template.context_processors.media',
      'django.template.context_processors.static',
      'django.template.context_processors.tz',
      'django.contrib.messages.context_processors.messages',
      'django.template.context_processors.request',
      'saleor.core.context_processors.default_currency',
      'saleor.core.context_processors.categories',
      'saleor.cart.context_processors.cart_counter',
      'saleor.core.context_processors.search_enabled',
      'saleor.site.context_processors.settings',
      'saleor.core.context_processors.webpage_schema',
      'social_django.context_processors.backends',
      'social_django.context_processors.login_redirect',
  ]
  
  loaders = [
      'django.template.loaders.filesystem.Loader',
      'django.template.loaders.app_directories.Loader',
      # TODO: this one is slow, but for now need for mptt?
      'django.template.loaders.eggs.Loader']
  
  if not DEBUG:
      loaders = [('django.template.loaders.cached.Loader', loaders)]
  
  TEMPLATES = [{
      'BACKEND': 'django.template.backends.django.DjangoTemplates',
      'DIRS': [os.path.join(PROJECT_ROOT, 'templates')],
      'OPTIONS': {
          'debug': DEBUG,
          'context_processors': context_processors,
          'loaders': loaders,
          'string_if_invalid': '<< MISSING VARIABLE "%s" >>' if DEBUG else ''}}]
  
  # Make this unique, and don't share it with anybody.
  SECRET_KEY = os.environ.get('SECRET_KEY', 'Hngnouhp27!!!@')
  
  MIDDLEWARE_CLASSES = [
      'django.contrib.sessions.middleware.SessionMiddleware',
      'django.middleware.common.CommonMiddleware',
      'django.middleware.csrf.CsrfViewMiddleware',
      'django.contrib.auth.middleware.AuthenticationMiddleware',
      'django.contrib.messages.middleware.MessageMiddleware',
      'django.middleware.locale.LocaleMiddleware',
      'babeldjango.middleware.LocaleMiddleware',
      'saleor.core.middleware.DiscountMiddleware',
      'saleor.core.middleware.GoogleAnalytics',
      'saleor.core.middleware.CountryMiddleware',
      'saleor.core.middleware.CurrencyMiddleware',
      'social_django.middleware.SocialAuthExceptionMiddleware',
  ]
  
  INSTALLED_APPS = [
      # External apps that need to go before django's
      'storages',
  
      # Django modules
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.sitemaps',
      'django.contrib.sites',
      'django.contrib.staticfiles',
      'django.contrib.auth',
      'django.contrib.postgres',
      'django.forms',
  
      # Local apps
      'saleor.userprofile',
      'saleor.discount',
      'saleor.product',
      'saleor.cart',
      'saleor.checkout',
      'saleor.core',
      'saleor.graphql',
      'saleor.order',
      'saleor.dashboard',
      'saleor.shipping',
      'saleor.search',
      'saleor.site',
      'saleor.data_feeds',
      'saleor.bid',
      'saleor.lazada',
  
      # External apps
      'versatileimagefield',
      'babeldjango',
      'bootstrap3',
      'django_prices',
      'django_prices_openexchangerates',
      'graphene_django',
      'mptt',
      'payments',
      'rest_framework',
      'webpack_loader',
      'social_django',
      'django_countries',
      'ckeditor'
  ]
  
  LOGGING = {
      'version': 1,
      'disable_existing_loggers': False,
      'formatters': {
          'verbose': {
              'format': '%(levelname)s %(asctime)s %(module)s '
                        '%(process)d %(thread)d %(message)s'
          },
          'simple': {
              'format': '%(levelname)s %(message)s'
          },
      },
      'filters': {
          'require_debug_false': {
              '()': 'django.utils.log.RequireDebugFalse'
          },
          'require_debug_true': {
              '()': 'django.utils.log.RequireDebugTrue'
          }
      },
      'handlers': {
          'mail_admins': {
              'level': 'ERROR',
              'filters': ['require_debug_false'],
              'class': 'django.utils.log.AdminEmailHandler'
          },
          'console': {
              'level': 'DEBUG',
              'class': 'logging.StreamHandler',
              'filters': ['require_debug_true'],
              'formatter': 'simple'
          },
      },
      'loggers': {
          'django.request': {
              'handlers': ['mail_admins'],
              'level': 'ERROR',
              'propagate': True
          },
          'saleor': {
              'handlers': ['console'],
              'level': 'DEBUG',
              'propagate': True
          }
      }
  }
  
  AUTH_USER_MODEL = 'userprofile.User'
  
  LOGIN_URL = '/account/login/'
  
  DEFAULT_COUNTRY = 'VN'
  DEFAULT_CURRENCY = 'VND'
  AVAILABLE_CURRENCIES = [DEFAULT_CURRENCY]
  
  OPENEXCHANGERATES_API_KEY = os.environ.get('OPENEXCHANGERATES_API_KEY')
  
  ACCOUNT_ACTIVATION_DAYS = 3
  
  LOGIN_REDIRECT_URL = 'home'
  
  GOOGLE_ANALYTICS_TRACKING_ID = os.environ.get('GOOGLE_ANALYTICS_TRACKING_ID')
  
  
  def get_host():
      from saleor.site.utils import get_domain
      return get_domain()
  
  PAYMENT_HOST = get_host
  
  PAYMENT_MODEL = 'order.Payment'
  
  PAYMENT_VARIANTS = {
      'default': ('payments.dummy.DummyProvider', {})}
  
  SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
  SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
  
  CHECKOUT_PAYMENT_CHOICES = [
      ('default', 'Dummy provider')]
  
  MESSAGE_TAGS = {
      messages.ERROR: 'danger'}
  
  LOW_STOCK_THRESHOLD = 10
  MAX_CART_LINE_QUANTITY = os.environ.get('MAX_CART_LINE_QUANTITY', 50)
  
  PAGINATE_BY = 16
  
  BOOTSTRAP3 = {
      'set_placeholder': False,
      'set_required': False,
      'success_css_class': '',
      'form_renderers': {
          'default': 'saleor.core.utils.form_renderer.FormRenderer',
      },
  }
  
  TEST_RUNNER = ''
  ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', 'localhost').split()
  
  
  SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
  
  # Amazon S3 configuration
  AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
  AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
  AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
  AWS_MEDIA_BUCKET_NAME = os.environ.get('AWS_MEDIA_BUCKET_NAME')
  AWS_QUERYSTRING_AUTH = ast.literal_eval(
      os.environ.get('AWS_QUERYSTRING_AUTH', 'False'))
  
  if AWS_STORAGE_BUCKET_NAME:
      STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
  
  if AWS_MEDIA_BUCKET_NAME:
      DEFAULT_FILE_STORAGE = 'saleor.core.storages.S3MediaStorage'
      THUMBNAIL_DEFAULT_STORAGE = DEFAULT_FILE_STORAGE
  
  MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
  
  VERSATILEIMAGEFIELD_RENDITION_KEY_SETS = {
      'defaults': [
          ('product_gallery', 'crop__540x540'),
          ('product_gallery_2x', 'crop__1080x1080'),
          ('product_small', 'crop__60x60'),
          ('product_small_2x', 'crop__120x120'),
          ('product_list', 'crop__255x255'),
          ('product_list_2x', 'crop__510x510')]}
  
  VERSATILEIMAGEFIELD_SETTINGS = {
      # Images should be pre-generated on Production environment
      'create_images_on_demand': ast.literal_eval(
          os.environ.get('CREATE_IMAGES_ON_DEMAND', 'True')),
  }
  
  PLACEHOLDER_IMAGES = {
      60: 'images/placeholder60x60.png',
      120: 'images/placeholder120x120.png',
      255: 'images/placeholder255x255.png',
      540: 'images/placeholder540x540.png',
      1080: 'images/placeholder1080x1080.png'
  }
  
  DEFAULT_PLACEHOLDER = 'images/placeholder255x255.png'
  
  WEBPACK_LOADER = {
      'DEFAULT': {
          'CACHE': not DEBUG,
          'BUNDLE_DIR_NAME': 'assets/',
          'STATS_FILE': os.path.join(PROJECT_ROOT, 'webpack-bundle.json'),
          'POLL_INTERVAL': 0.1,
          'IGNORE': [
              r'.+\.hot-update\.js',
              r'.+\.map']}}
  
  
  LOGOUT_ON_PASSWORD_CHANGE = False
  
  
  ELASTICSEARCH_URL = os.environ.get('ELASTICSEARCH_URL')
  SEARCHBOX_URL = os.environ.get('SEARCHBOX_URL')
  BONSAI_URL = os.environ.get('BONSAI_URL')
  # We'll support couple of elasticsearch add-ons, but finally we'll use single
  # variable
  ES_URL = ELASTICSEARCH_URL or SEARCHBOX_URL or BONSAI_URL or ''
  if ES_URL:
      SEARCH_BACKENDS = {
          'default': {
              'BACKEND': 'saleor.search.backends.elasticsearch2',
              'URLS': [ES_URL],
              'INDEX': os.environ.get('ELASTICSEARCH_INDEX_NAME', 'storefront'),
              'TIMEOUT': 5,
              'AUTO_UPDATE': True},
          'dashboard': {
              'BACKEND': 'saleor.search.backends.dashboard',
              'URLS': [ES_URL],
              'INDEX': os.environ.get('ELASTICSEARCH_INDEX_NAME', 'storefront'),
              'TIMEOUT': 5,
              'AUTO_UPDATE': False}
      }
  else:
      SEARCH_BACKENDS = {}
  
  
  GRAPHENE = {
      'MIDDLEWARE': [
          'graphene_django.debug.DjangoDebugMiddleware'
      ],
      'SCHEMA': 'saleor.graphql.api.schema',
      'SCHEMA_OUTPUT': os.path.join(
          PROJECT_ROOT, 'saleor', 'static', 'schema.json')
  }
  
  SITE_SETTINGS_ID = 1
  
  AUTHENTICATION_BACKENDS = [
      'saleor.registration.backends.facebook.CustomFacebookOAuth2',
      'saleor.registration.backends.google.CustomGoogleOAuth2',
      'django.contrib.auth.backends.ModelBackend',
  ]
  
  SOCIAL_AUTH_PIPELINE = [
      'social_core.pipeline.social_auth.social_details',
      'social_core.pipeline.social_auth.social_uid',
      'social_core.pipeline.social_auth.auth_allowed',
      'social_core.pipeline.social_auth.social_user',
      'social_core.pipeline.social_auth.associate_by_email',
      'social_core.pipeline.user.create_user',
      'social_core.pipeline.social_auth.associate_user',
      'social_core.pipeline.social_auth.load_extra_data',
      'social_core.pipeline.user.user_details',
  ]
  
  SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL = True
  SOCIAL_AUTH_USER_MODEL = AUTH_USER_MODEL
  SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']
  SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {
      'fields': 'id, email'}
  
  CKEDITOR_UPLOAD_PATH = "uploads/"
  CKEDITOR_BROWSE_SHOW_DIRS = True
  CKEDITOR_CONFIGS = {
      'default': {
          'skin': 'moono',
          # 'skin': 'office2013',
          'toolbar_Basic': [
              ['Bold', 'Italic', 'Underline'],
              ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'],
              ['Link', 'Unlink'],
              ['RemoveFormat', 'Source']
          ],
          'toolbar_advance': [
              {'name': 'document', 'items': ['Source', '-', 'Save', 'Preview', '-', 'Templates']},
              {'name': 'editing', 'items': ['Find', 'Replace', '-', 'SelectAll']},
  
              '/',
              {'name': 'basicstyles',
               'items': ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat']},
              {'name': 'paragraph',
               'items': ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv', '-',
                         'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'BidiLtr', 'BidiRtl',
                         'Language']},
              {'name': 'links', 'items': ['Link', 'Unlink', 'Anchor']},
              {'name': 'insert',
               'items': ['Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak', 'Iframe']},
              '/',
              {'name': 'styles', 'items': ['Styles', 'Format', 'Font', 'FontSize']},
              {'name': 'colors', 'items': ['TextColor', 'BGColor']},
              {'name': 'tools', 'items': ['Maximize', 'ShowBlocks']},
              {'name': 'about', 'items': ['About']},
              '/',  # put this to force next toolbar on new line
              {'name': 'yourcustomtools', 'items': [
                  # put the name of your editor.ui.addButton here
                  'Preview',
                  'Maximize',
  
              ]},
          ],
          'toolbar': 'toolbar_advance',  # put selected toolbar config here
          # 'toolbarGroups': [{ 'name': 'document', 'groups': [ 'mode', 'document', 'doctools' ] }],
          # 'height': 291,
          # 'width': '100%',
          # 'filebrowserWindowHeight': 725,
          # 'filebrowserWindowWidth': 940,
          # 'toolbarCanCollapse': True,
          # 'mathJaxLib': '//cdn.mathjax.org/mathjax/2.2-latest/MathJax.js?config=TeX-AMS_HTML',
          'tabSpaces': 4,
          'extraPlugins': ','.join([
              'uploadimage', # the upload image feature
              # your extra plugins here
              'div',
              'autolink',
              'autoembed',
              'embedsemantic',
              'autogrow',
              # 'devtools',
              'widget',
              'lineutils',
              'clipboard',
              'dialog',
              'dialogui',
              'elementspath'
          ]),
      }
  }
  
  LAZADA_ENDPOINT_URI = 'https://api.sellercenter.lazada.vn/'
  LAZADA_USER_ID = os.environ.get('LAZADA_USER_ID')
  LAZADA_API_KEY = os.environ.get('LAZADA_API_KEY')
  
  from celery.schedules import crontab
  CELERY_BROKER_URL = os.environ.get('CELERY_REDIS_URL')
  CELERY_RESULT_BACKEND = os.environ.get('CELERY_REDIS_URL')
  CELERY_ACCEPT_CONTENT = ['application/json']
  CELERY_RESULT_SERIALIZER = 'json'
  CELERY_TASK_SERIALIZER = 'json'
  CELERY_TIMEZONE = 'Asia/Ho_Chi_Minh'
  CELERY_BEAT_SCHEDULE = {
      'task_sync_lazada_orders': {
          'task': 'saleor.lazada.tasks.task_sync_lazada_orders',
          'schedule': crontab(minute='*/10')
      }
  }