"""
Django settings for TravelGuide project.

Generated by 'django-admin startproject' using Django 1.10.3.

For more information on this file, see
https://docs.djangoproject.com/en/1.10/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.10/ref/settings/
"""
from __future__ import absolute_import
import os,sys
from celery.schedules import crontab
from django.utils.translation import ugettext_lazy as _
from decouple import config,Csv
import dj_database_url

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
APP_HOME=BASE_DIR

SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())
DATABASES = {
    'default': dj_database_url.config(default=config('DATABASE_URL')
    )
}
REDIS_URL = config('REDIS_URL')
MEDIA_URL = '/storage/'
MEDIA_ROOT = APP_HOME+'/static/storage/'
STATIC_ROOT = APP_HOME+'/static/static/'

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)

#Email configuration
DEFAULT_FROM_EMAIL = 'christophe@idevotion.fr'
SERVER_EMAIL = 'christophe@idevotion.fr'
EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'csurbier'
EMAIL_HOST_PASSWORD = 'V3wxvph752'
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
PASSWORD_RESET_TIMEOUT_DAYS=2
SENDGRID_API_KEY='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'
MESSAGE_TEMPLATE_ID="9cb92b23-cc26-4f45-9950-30e722c21dbf"


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!

# Application definition

INSTALLED_APPS = [
    'suit',
    'resetpassword',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
  
    'django.contrib.staticfiles',
    'django.contrib.gis',
    'django.contrib.sitemaps',
    'backoffice',
    'autofixture',
    'imagekit',
    'oauth2_provider',
    'rest_framework',
    'rest_framework_gis',
    'rest_framework_docs',
    'push_notifications',
    'drf_multiple_model',
    'cacheops',
    'corsheaders',
    'django_filters',
    'django_extensions',
    'fcm_django',
    'tinymce',
    'mapwidgets',
    ]

TINYMCE_DEFAULT_CONFIG = {
    'theme': "advanced",
    'width' : 758,
    'height' : 300,
}

MAP_WIDGETS = {
    "GOOGLE_MAP_API_KEY": "AIzaSyC2StTKAdCeCl2zUwzNhLxR8kWWyqOQjYQ"
}


SUIT_CONFIG = {
    # header
     'ADMIN_NAME': 'Agender Backoffice',
    # 'HEADER_DATE_FORMAT': 'l, j. F Y',
    # 'HEADER_TIME_FORMAT': 'H:i',

    # forms
    # 'SHOW_REQUIRED_ASTERISK': True,  # Default True
    # 'CONFIRM_UNSAVED_CHANGES': True, # Default True

    # menu
    # 'SEARCH_URL': '/admin/auth/user/',
     'MENU_ICONS': {
        'sites': 'icon-leaf',
        'auth': 'icon-lock',
     },
    'MENU_OPEN_FIRST_CHILD': True, # Default True
    'MENU_EXCLUDE': ('auth.group',),
    'MENU': (
         'sites',
         {'app': 'backoffice'},
         {'app': 'oauth2_provider'},
         {'app': 'push_notifications'},
         {'app': 'auth', 'icon':'icon-lock', 'models': ('user', 'group')},
         {'label': 'Import Events', 'url': '/batchimport', 'icon': 'icon-user'},
         {'label': 'Settings', 'icon':'icon-cog', 'models': ('auth.user', 'auth.group')},
        # {'label': 'Support', 'icon':'icon-question-sign', 'url': '/support/'},
     ),

    # misc
    'LIST_PER_PAGE': 100
}



######TODO CHANGE FOR PRODUCTION ######


FCM_DJANGO_SETTINGS = {
        "FCM_SERVER_KEY": "AAAAjYk0AmE:APA91bGy2yIMNycCtgyoL1fyxHIgFSvtYVCI0w7a6MfpQhQcxwon2qQLXbnqzpNMFYpLBYYvLgdohucLuk7kffywPYpNUmNLrOeYxi1xkQ1ZP_C0lw33TVhehT5LVrfD1pYS2GCejDsc",
         # true if you want to have only one active device per registered user at a time
         # default: False
        "ONE_DEVICE_PER_USER": False,
         # devices to which notifications cannot be sent,
         # are deleted upon receiving error response from FCM
         # default: False
        "DELETE_INACTIVE_DEVICES": False,
}

#Custom User

AUTH_USER_MODEL = 'backoffice.User'
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'backoffice.customAuthentification.customAuthentification',
)

LOGIN_REDIRECT_URL='/'


PASSWORD_HASHERS = (
    'backoffice.libs.hashers.SHA256PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher'
)


#oAuth2 expiration
OAUTH_ACCESS_TOKEN_MODEL = 'oauth2_provider.models.AccessToken'
OAUTH2_PROVIDER = {
    'ACCESS_TOKEN_EXPIRE_SECONDS' : 315360000,
    'SCOPES': {'read': 'Read scope', 'write': 'Write scope', 'groups': 'Access to your groups'}
}

#Rest

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.ext.rest_framework.OAuth2Authentication',
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
        'rest_framework.filters.OrderingFilter',
        'rest_framework_gis.filters.DistanceToPointFilter',
    ),
   # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 20,
}

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

  #  'django.middleware.cache.UpdateCacheMiddleware',
  #  'django.middleware.cache.FetchFromCacheMiddleware',
]
X_FRAME_OPTIONS = 'ALLOWALL'
CORS_ORIGIN_ALLOW_ALL=True
"""
CORS_ORIGIN_WHITELIST = (
    'https://api.agender.fr',
    'http://localhost:8000',
    'http://localhost:8080',
    'http://127.0.0.1:8000',
    'http://127.0.0.1:8080',
    'http://localhost:8100',
    'http://127.0.0.1:8100',
    'https://www.idevotion.fr',
    'https://idevotion.fr'
)
"""

#CACHE_MIDDLEWARE_SECONDS = 300
ROOT_URLCONF = 'Agender.urls'

WSGI_APPLICATION = 'Agender.wsgi.application'
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            BASE_DIR,
            os.path.join(BASE_DIR, 'templates')
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.i18n',
                'django.template.context_processors.request', # Make sure you have this line
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]



# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases


# Password validation
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/1.10/topics/i18n/

LANGUAGE_CODE = 'en-us' #Default

TIME_ZONE = 'Europe/Paris'

USE_I18N = True

USE_L10N = True

USE_TZ = True

"""
LANGUAGES = [
    ('fr', _('French')),
]

"""

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)

# Definitions
STATIC_URL = '/static/'

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    # 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)


#Logging
U_LOGFILE_SIZE = 10 * 1024 * 1024
U_LOGFILE_COUNT = 7
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt': "%d/%b/%Y %H:%M:%S"
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'file': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(MEDIA_ROOT, 'django.log'),
            'maxBytes': U_LOGFILE_SIZE,
            'backupCount': U_LOGFILE_COUNT,
            'formatter': 'verbose'
        },
        'celerybatch': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(MEDIA_ROOT, 'celerybatch.log'),
            'maxBytes': U_LOGFILE_SIZE,
            'backupCount': U_LOGFILE_COUNT,
            'formatter': 'verbose'
        },        
        'console': {
            'class': 'logging.StreamHandler',
        },
        'filebo': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(MEDIA_ROOT, 'backoffice.log'),
            'maxBytes': U_LOGFILE_SIZE,
            'backupCount': U_LOGFILE_COUNT,
            'formatter': 'verbose'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'propagate': True,
            'level': 'INFO',
        },
        'celerybatch': {
            'handlers': ['file'],
            'propagate': True,
            'level': 'INFO',
        },
        'backoffice': {
            'handlers': ['filebo'],
            'level': 'INFO',
        },
        'oauth2_provider': {
            'handlers': ['console'],
            'level': 'INFO',
        },
    }
}


##### CACHE #########

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": REDIS_URL,
        "TIMEOUT": 300,
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "SOCKET_CONNECT_TIMEOUT": 3,  # in seconds
            "SOCKET_TIMEOUT": 5,  # in seconds
            'PARSER_CLASS': 'redis.connection.HiredisParser',
            'CONNECTION_POOL_CLASS': 'redis.BlockingConnectionPool',
            'CONNECTION_POOL_CLASS_KWARGS': {
                'max_connections': 50,
                'timeout': 20,
            },
            'MAX_CONNECTIONS': 1000,

        }
    }
}
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
#CACHALOT_ENABLED=True
#CACHALOT_TIMEOUT=86400
#CACHALOT_ONLY_CACHABLE_TABLES=['backoffice_town','backoffice_category',]

##### CACHE ##########################
CACHEOPS_REDIS=REDIS_URL
CACHEOPS = {
    # Enable manual caching on all other models with default timeout of an hour
    # Use Post.objects.cache().get(...)
    #  or Tags.objects.filter(...).order_by(...).cache()
    # to cache particular ORM request.
    # Invalidation is still automatic
   # '*.*': {'ops': (), 'timeout': 60*60},
    'backoffice.event': {'ops': ('fetch', 'get'), 'timeout': 60*60*8},
    'backoffice.eventcategory': {'ops': ('fetch', 'get'), 'timeout': 60 * 60 * 8},
    'backoffice.town': {'ops': ('fetch', 'get'), 'timeout': 60 * 60*8},
    'backoffice.place': {'ops': ('fetch', 'get'), 'timeout': 60 * 60*8},
    'backoffice.category': {'ops': ('fetch', 'get'), 'timeout': 60 * 60 * 8},
    'backoffice.post': {'ops': ('fetch', 'get'), 'timeout': 60 * 60},
    'backoffice.article': {'ops': ('fetch', 'get'), 'timeout': 60 * 60*8},
}

################################### CELERY ###################################
#
# Gestion automatique (batchs) de certains traitements tels que l'envoi de
#
##############################################################################
BROKER_URL=REDIS_URL
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Europe/Paris'
from datetime import timedelta
CELERY_IMPORTS = (
    'backoffice.tasks',
)
CELERYBEAT_SCHEDULE = {
    'every-seconds': {
        'task': 'backoffice.tasks.task_check_notifications',
        'schedule': crontab(minute='*'),
        'args': ()
    },
    'add-at-six-hours': {
        'task': 'backoffice.tasks.task_deleteEvent',
        'schedule': crontab(minute='0', hour='3'),
        'args': ()
    },
    'add-resize': {
        'task': 'backoffice.tasks.task_checkResize',
        'schedule': crontab(minute='0', hour='4'),
        'args': ()
    },
    'check-url': {
        'task': 'backoffice.tasks.task_checkUrl',
        'schedule': crontab(minute='0', hour='4'),
        'args': ()
    },
}
