class SmtpEmailMixin(_EmailMixin): """ Configure Django's email sending. The following environment variables must be externally set: * `DJANGO_EMAIL_URL`, as a URL for login to an STMP server, as parsed by `dj-email-url`. This typically will start with `submission:`. Special characters in passwords must be URL-encoded. See https://pypi.org/project/dj-email-url/ for full details. * `DJANGO_DEFAULT_FROM_EMAIL`, as the default From address for outgoing email. """ @staticmethod def mutate_configuration( configuration: Type[ComposedConfiguration]) -> None: email = cast( Dict[str, str], values.EmailURLValue( environ_name='EMAIL_URL', environ_prefix='DJANGO', environ_required=True, # Disable late_binding, to make this return a usable value (which is a simple dict) # immediately late_binding=False, ), ) for email_setting, email_setting_value in email.items(): setattr(configuration, email_setting, email_setting_value) # Set both settings from DJANGO_DEFAULT_FROM_EMAIL DEFAULT_FROM_EMAIL = values.EmailValue(environ_required=True) SERVER_EMAIL = values.EmailValue(environ_name='DEFAULT_FROM_EMAIL', environ_required=True)
class Prod(Base): DEBUG = False ALLOWED_HOSTS = values.ListValue(default=[".code4.ro"]) EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" EMAIL_USE_TLS = True EMAIL_HOST = values.Value(default="smtp.gmail.com") EMAIL_PORT = 587 EMAIL_HOST_USER = values.Value() EMAIL_HOST_PASSWORD = values.Value() DEFAULT_FROM_EMAIL = values.EmailValue(default="*****@*****.**")
class ProjectDefault(Configuration): """ The default settings from the Django project template. Django Configurations https://django-configurations.readthedocs.io """ # Build paths inside the project like this: BASE_DIR / "subdir". BASE_DIR = Path(__file__).resolve(strict=True).parent.parent # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/stable/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = values.SecretValue() # SECURITY WARNING: don't run with debug turned on in production! DEBUG = values.BooleanValue(True) ALLOWED_HOSTS = values.ListValue([]) # Application definition INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", ] MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "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.clickjacking.XFrameOptionsMiddleware", ] ROOT_URLCONF = "{{cookiecutter.project_slug}}.urls" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ] }, } ] WSGI_APPLICATION = "{{cookiecutter.project_slug}}.wsgi.application" # Database # https://docs.djangoproject.com/en/stable/ref/settings/#databases DATABASES = values.DatabaseURLValue() # Password validation # https://docs.djangoproject.com/en/stable/ref/settings/#auth-password-validators # fmt: off AUTH_PASSWORD_VALIDATORS = [ { "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", # noqa }, { "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", }, { "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", }, { "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", }, ] # fmt: on # Internationalization # https://docs.djangoproject.com/en/stable/topics/i18n/ LANGUAGE_CODE = "en-us" TIME_ZONE = "UTC" USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/stable/howto/static-files/ STATIC_URL = "/static/" STATIC_ROOT = BASE_DIR / "static" STATICFILES_STORAGE = ( "django.contrib.staticfiles.storage.ManifestStaticFilesStorage" ) # Stored files # https://docs.djangoproject.com/en/stable/topics/files/{% if cookiecutter.use_media_volume == "Yes" %} # noqa MEDIA_URL = "/media/" MEDIA_ROOT = BASE_DIR / "media" # noqa{% else %} # MEDIA_URL = "/media/" # MEDIA_ROOT = BASE_DIR / "media"{% endif %} # Email Settings # https://docs.djangoproject.com/en/stable/topics/email/ ADMINS = values.SingleNestedTupleValue( (("admin", "errors@{{cookiecutter.domain_url}}"),) ) DEFAULT_FROM_EMAIL = values.EmailValue("info@{{cookiecutter.domain_url}}") EMAIL_SUBJECT_PREFIX = "[{{cookiecutter.project_name}}] " EMAIL_USE_LOCALTIME = True SERVER_EMAIL = values.EmailValue("server@{{cookiecutter.domain_url}}") # Email URL # https://django-configurations.readthedocs.io/en/stable/values/ EMAIL = values.EmailURLValue("console://") # Translation # https://docs.djangoproject.com/en/stable/topics/i18n/translation/ # LANGUAGES = (("en", "English"), ("it", "Italiano")) # Clickjacking Protection # https://docs.djangoproject.com/en/stable/ref/clickjacking/ X_FRAME_OPTIONS = "SAMEORIGIN" # Default: 'SAMEORIGIN'
class Common(Configuration): """Common configuration base class.""" SECRET_KEY = '(_j4e0=pbe(b+b1$^ch_48be0=gszglcgfzz^dy=(gnx=@m*b7' DEBUG = values.BooleanValue(False) MAIL_ADMINS = values.BooleanValue(False) ADMINS = AdminsValue((('Max Brauer', '*****@*****.**'), )) MANAGERS = ADMINS LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse', }, 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', }, }, 'handlers': { 'console': { 'level': 'INFO', 'filters': ['require_debug_true'], 'class': 'logging.StreamHandler', }, 'null': { 'class': 'logging.NullHandler', }, 'mail_admins': { 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler' } }, 'loggers': { 'django': { 'handlers': ['console'], }, 'django.request': { 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': False, }, 'django.security': { 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': False, }, 'django.security.DisallowedHost': { 'handlers': ['null'], 'propagate': False, }, 'py.warnings': { 'handlers': ['console'], }, } } ALLOWED_HOSTS = values.ListValue(['www.example.com']) SITE_ID = values.IntegerValue(1) # Internationalization # https://docs.djangoproject.com/en/dev/topics/i18n/ LANGUAGE_CODE = values.Value('en-us') TIME_ZONE = values.Value('Europe/Berlin') USE_I18N = True USE_L10N = True USE_TZ = True # Absolute filesystem path to the directory that will hold user-uploaded files. # Example: "/var/www/example.com/media/" MEDIA_ROOT = values.PathValue(os.path.join(BaseDir.BASE_DIR, 'media')) # URL that handles the media served from MEDIA_ROOT. Make sure to use a # trailing slash. # Examples: "http://example.com/media/", "http://media.example.com/" MEDIA_URL = values.Value('/media/') # Absolute path to the directory static files should be collected to. # Don't put anything in this directory yourself; store your static files # in apps' "static/" subdirectories and in STATICFILES_DIRS. # Example: "/var/www/example.com/static/" STATIC_ROOT = values.PathValue( os.path.join(BaseDir.BASE_DIR, 'static_root')) # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/dev/howto/static-files/ STATIC_URL = values.Value('/static/') # Additional locations of static files STATICFILES_DIRS = ( # Put strings here, like "/home/html/static" or "C:/www/django/static". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. os.path.join(BaseDir.BASE_DIR, 'static'), os.path.join(os.path.dirname(BaseDir.BASE_DIR), 'node_modules', 'normalize.css'), ) STATICFILES_FINDERS = values.ListValue([ 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 'django.contrib.staticfiles.finders.FileSystemFinder', 'sass_processor.finders.CssFinder', # 'django.contrib.staticfiles.finders.DefaultStorageFinder', ]) MIDDLEWARE_CLASSES = values.ListValue([ 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', ]) ROOT_URLCONF = 'bureau.config.urls' WSGI_APPLICATION = 'bureau.config.wsgi.application' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [ os.path.join(BaseDir.BASE_DIR, 'templates'), ], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'bureau.context_processors.django_version', ], 'debug': values.BooleanValue( False, environ_name='DJANGO_TEMPLATES_TEMPLATE_DEBUG'), 'string_if_invalid': values.Value( '', environ_name='DJANGO_TEMPLATES_STRING_IF_INVALID'), }, }, ] # the following line is only necessary because django-template-debug uses it TEMPLATE_DEBUG = TEMPLATES[0]['OPTIONS'].get('debug', False) FIXTURE_DIRS = (os.path.join(BaseDir.BASE_DIR, 'fixtures'), ) INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.admin', 'django.contrib.admindocs', 'sass_processor', 'bureau.apps.core.apps.CoreConfig', ) CACHES = values.DictValue({ 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', } }) EMAIL_SUBJECT_PREFIX = '[bureau]' DEFAULT_FROM_EMAIL = values.EmailValue('*****@*****.**') SERVER_EMAIL = DEFAULT_FROM_EMAIL
class Base(Configuration): """ The are correct settings that are primarily targeted at the production system but allow (where appriate) easy overrides either via subclassing or environment variables. """ ########################################################################### # # General settings # PROJECT_NAME = 'pyconde' BASE_DIR = os.path.dirname(os.path.dirname(__file__)) ADMINS = values.ListValue([], converter=parseaddr) ALLOWED_HOSTS = values.ListValue(['localhost', '127.0.0.1']) @property def MANAGERS(self): return self.ADMINS EMAIL_HOST = values.Value() DEFAULT_FROM_EMAIL = values.EmailValue('*****@*****.**') SERVER_EMAIL = values.EmailValue('*****@*****.**') TIME_ZONE = 'Europe/Berlin' LANGUAGE_CODE = 'en' SECRET_KEY = values.SecretValue() EMAIL_SUBJECT_PREFIX = values.Value('[EuroPython 2014] ') USE_I18N = True USE_L10N = True SITE_ID = values.IntegerValue(1) CONFERENCE_ID = values.IntegerValue(1) LANGUAGES = ( ('de', ugettext('German')), ('en', ugettext('English')), ) INTERNAL_IPS = ('127.0.0.1', ) ROOT_URLCONF = '%s.urls' % PROJECT_NAME TEMPLATE_DIRS = ( os.path.join(BASE_DIR, 'skins', 'default'), os.path.join(BASE_DIR, 'skins', 'ep14'), ) INSTALLED_APPS = [ # Skins 'pyconde.skins.ep14', 'pyconde.skins.default', 'djangocms_admin_style', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.messages', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.staticfiles', 'django.contrib.markup', 'crispy_forms', 'south', 'easy_thumbnails', 'filer', 'compressor', 'djangocms_text_ckeditor', # must be before 'cms'! 'cms', 'cms.stacks', 'mptt', 'menus', 'sekizai', 'userprofiles', 'userprofiles.contrib.accountverification', 'userprofiles.contrib.emailverification', 'userprofiles.contrib.profiles', 'taggit', 'haystack', #'tinymce', # If you want tinymce, add it in the settings.py file. 'django_gravatar', 'social_auth', 'gunicorn', 'statici18n', 'cms.plugins.inherit', 'cms.plugins.googlemap', 'cms.plugins.link', 'cms.plugins.snippet', #'cms.plugins.twitter', #'cms.plugins.text', 'cmsplugin_filer_file', 'cmsplugin_filer_image', 'djangocms_style', #'cmsplugin_news', 'pyconde.testimonials', # Symposion apps 'pyconde.conference', 'pyconde.speakers', 'pyconde.proposals', 'pyconde.sponsorship', # Custom apps 'pyconde.core', 'pyconde.accounts', 'pyconde.attendees', 'pyconde.events', 'pyconde.reviews', 'pyconde.schedule', 'pyconde.search', 'pyconde.helpers', ] MIDDLEWARE_CLASSES = [ 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.locale.LocaleMiddleware', 'cms.middleware.page.CurrentPageMiddleware', 'cms.middleware.user.CurrentUserMiddleware', 'cms.middleware.toolbar.ToolbarMiddleware', 'cms.middleware.language.LanguageCookieMiddleware', 'social_auth.middleware.SocialAuthExceptionMiddleware', ] TEMPLATE_CONTEXT_PROCESSORS = Configuration.TEMPLATE_CONTEXT_PROCESSORS + ( 'django.core.context_processors.debug', 'django.core.context_processors.request', 'sekizai.context_processors.sekizai', 'pyconde.conference.context_processors.current_conference', 'pyconde.reviews.context_processors.review_roles', 'pyconde.context_processors.less_settings', 'social_auth.context_processors.social_auth_backends', ) DATABASES = values.DatabaseURLValue( 'sqlite:///{0}/djep.db'.format(BASE_DIR), environ_prefix='DJANGO') # Disable south migrations during unittests SOUTH_TESTS_MIGRATE = False FIXTURE_DIRS = (os.path.join(BASE_DIR, 'fixtures'), ) # TODO: As soon as we move to foundation use # https://pypi.python.org/pypi/crispy-forms-foundation CRISPY_TEMPLATE_PACK = 'bootstrap3' # If the project uses Less.js, use the inline-JavaScript renderer in # debug mode. LESS_USE_DYNAMIC_IN_DEBUG = True LOGGING = {'version': 1, 'disable_existing_loggers': True} ########################################################################### # # Debug settings # DEBUG = values.BooleanValue(False) DEBUG_TOOLBAR_CONFIG = {'INTERCEPT_REDIRECTS': False} @property def TEMPLATE_DEBUG(self): return self.DEBUG @property def THUMBNAIL_DEBUG(self): return self.DEBUG ########################################################################### # # File settings # MEDIA_ROOT = values.Value() STATIC_ROOT = values.Value() MEDIA_URL = values.Value('/site_media/') MEDIA_OPTIPNG_PATH = values.Value('optipng') MEDIA_JPEGOPTIM_PATH = values.Value('jpegoptim') STATIC_URL = values.Value('/static_media/') STATICFILES_FINDERS = Configuration.STATICFILES_FINDERS + ( 'pyconde.helpers.static.AppMediaDirectoriesFinder', 'compressor.finders.CompressorFinder', ) STATICFILES_DIRS = values.ListValue() STATICI18N_ROOT = os.path.join(BASE_DIR, PROJECT_NAME, "core", "static") COMPRESS_CSS_FILTERS = ( 'compressor.filters.css_default.CssAbsoluteFilter', 'compressor.filters.cssmin.CSSMinFilter', ) THUMBNAIL_PROCESSORS = ( 'easy_thumbnails.processors.colorspace', 'easy_thumbnails.processors.autocrop', 'filer.thumbnail_processors.scale_and_crop_with_subject_location', 'easy_thumbnails.processors.filters', ) THUMBNAIL_SIZE = 100 ########################################################################### # # Profile settings # Here we configure what profile module is used and other aspects of a # registered user's profile. # USERPROFILES_CHECK_UNIQUE_EMAIL = True USERPROFILES_DOUBLE_CHECK_EMAIL = False USERPROFILES_DOUBLE_CHECK_PASSWORD = True USERPROFILES_REGISTRATION_FULLNAME = True USERPROFILES_USE_ACCOUNT_VERIFICATION = True USERPROFILES_USE_EMAIL_VERIFICATION = True USERPROFILES_USE_PROFILE = True USERPROFILES_INLINE_PROFILE_ADMIN = True USERPROFILES_USE_PROFILE_VIEW = False USERPROFILES_REGISTRATION_FORM = 'pyconde.accounts.forms.ProfileRegistrationForm' USERPROFILES_PROFILE_FORM = 'pyconde.accounts.forms.ProfileForm' USERPROFILES_EMAIL_VERIFICATION_DONE_URL = 'userprofiles_profile_change' AUTH_PROFILE_MODULE = 'accounts.Profile' ACCOUNTS_FALLBACK_TO_GRAVATAR = False CHILDREN_DATA_DISABLED = True ########################################################################### # # CMS Settings # CMS_TEMPLATES = ( ('cms/default.html', ugettext('Default template')), ('cms/start.html', ugettext('Start page template')), ('cms/page_templates/fullpage.html', ugettext('Full page width (schedule, ...)')), ) # Docs at https://django-cms.readthedocs.org/en/develop/getting_started/configuration.html#cms-languages CMS_LANGUAGES = { 1: [ { 'code': 'en', 'name': ugettext('English'), 'public': True, }, { 'code': 'de', 'name': ugettext('German'), 'public': True, }, ], 'default': { 'fallbacks': ['en', 'de'], 'hide_untranslated': False, } } WYM_TOOLS = ",\n".join([ "{'name': 'Bold', 'title': 'Strong', 'css': 'wym_tools_strong'}", "{'name': 'Italic', 'title': 'Emphasis', 'css': 'wym_tools_emphasis'}", "{'name': 'Superscript', 'title': 'Superscript', 'css': 'wym_tools_superscript'}", "{'name': 'Subscript', 'title': 'Subscript', 'css': 'wym_tools_subscript'}", "{'name': 'InsertOrderedList', 'title': 'Ordered_List', 'css': 'wym_tools_ordered_list'}", "{'name': 'InsertUnorderedList', 'title': 'Unordered_List', 'css': 'wym_tools_unordered_list'}", "{'name': 'Indent', 'title': 'Indent', 'css': 'wym_tools_indent'}", "{'name': 'Outdent', 'title': 'Outdent', 'css': 'wym_tools_outdent'}", "{'name': 'Undo', 'title': 'Undo', 'css': 'wym_tools_undo'}", "{'name': 'Redo', 'title': 'Redo', 'css': 'wym_tools_redo'}", "{'name': 'Paste', 'title': 'Paste_From_Word', 'css': 'wym_tools_paste'}", "{'name': 'ToggleHtml', 'title': 'HTML', 'css': 'wym_tools_html'}", "{'name': 'CreateLink', 'title': 'Link', 'css': 'wym_tools_link'}", "{'name': 'Unlink', 'title': 'Unlink', 'css': 'wym_tools_unlink'}", "{'name': 'InsertImage', 'title': 'Image', 'css': 'wym_tools_image'}", "{'name': 'InsertTable', 'title': 'Table', 'css': 'wym_tools_table'}", "{'name': 'Preview', 'title': 'Preview', 'css': 'wym_tools_preview'}", ]) TINYMCE_DEFAULT_CONFIG = { 'theme': 'advanced', 'relative_urls': False, 'theme_advanced_resizing': True, 'theme_advanced_buttons1_add': 'forecolor,backcolor', 'style_formats': [ { 'title': u'Heading 2 (alternative)', 'block': 'h2', 'classes': 'alt' }, { 'title': u'Heading 3 (alternative)', 'block': 'h3', 'classes': 'alt' }, ] } CMSPLUGIN_NEWS_FEED_TITLE = u'EuroPython 2014 News' CMSPLUGIN_NEWS_FEED_DESCRIPTION = u'News from EuroPython 2014' SCHEDULE_CACHE_SCHEDULE = values.BooleanValue(True) ########################################################################### # # Account and profile settings # AVATAR_MIN_DIMENSION = values.TupleValue(converter=int) AVATAR_MAX_DIMENSION = values.TupleValue(converter=int) ########################################################################### # # Proposal and schedule settings # ATTENDEES_PRODUCT_NUMBER_START = 1000 PROPOSALS_SUPPORT_ADDITIONAL_SPEAKERS = True MAX_CHECKOUT_DURATION = 1800 # 30 minutes # This configures the form that is used for each proposal type identified # by their respective slug. PROPOSALS_TYPED_SUBMISSION_FORMS = { 'training': 'pyconde.proposals.forms.TrainingSubmissionForm', 'talk': 'pyconde.proposals.forms.TalkSubmissionForm', 'poster': 'pyconde.proposals.forms.PosterSubmissionForm', } # These languages should be available when making a session proposal. PROPOSAL_LANGUAGES = ( ('de', ugettext('German')), ('en', ugettext('English')), ) # This setting defines the language that should be pre-selected in the # proposal submission form. PROPOSAL_DEFAULT_LANGUAGE = 'en' ########################################################################### # # Review settings # REVIEWER_APPLICATION_OPEN = values.BooleanValue(False) ########################################################################### # # Search configuration # If no other search backend is specified, Whoosh is used to make the setup # as simple as possible. In production we will be using a Lucene-based # backend like SOLR or ElasticSearch. HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', 'PATH': os.path.join(BASE_DIR, 'whoosh_index'), 'STORAGE': 'file', 'INCLUDE_SPELLING': True, 'BATCH_SIZE': 100, } } ########################################################################### # # Auth settings # LOGIN_ERROR_URL = '/accounts/login/' LOGIN_REDIRECT_URL = '/accounts/welcome/' LOGOUT_REDIRECT_URL = '/' SOCIAL_AUTH_PIPELINE = ( 'social_auth.backends.pipeline.social.social_auth_user', 'social_auth.backends.pipeline.user.get_username', 'social_auth.backends.pipeline.user.create_user', 'social_auth.backends.pipeline.social.associate_user', 'social_auth.backends.pipeline.social.load_extra_data', 'social_auth.backends.pipeline.user.update_user_details', 'social_auth.backends.pipeline.misc.save_status_to_session', 'pyconde.accounts.pipeline.show_request_email_form', 'pyconde.accounts.pipeline.create_profile', ) GITHUB_APP_ID = values.Value() GITHUB_API_SECRET = values.Value() GITHUB_EXTENDED_PERMISSIONS = ['user:email'] TWITTER_CONSUMER_KEY = values.Value() TWITTER_CONSUMER_SECRET = values.Value() GOOGLE_OAUTH2_CLIENT_ID = values.Value() GOOGLE_OAUTH2_CLIENT_SECRET = values.Value() FACEBOOK_APP_ID = values.Value() FACEBOOK_API_SECRET = values.Value() @property def AUTHENTICATION_BACKENDS(self): backends = ['django.contrib.auth.backends.ModelBackend'] if self.GITHUB_APP_ID and self.GITHUB_API_SECRET: backends.insert( -1, 'social_auth.backends.contrib.github.GithubBackend') if self.TWITTER_CONSUMER_KEY and self.WITTER_CONSUMER_SECRET: backends.insert(-1, 'social_auth.backends.twitter.TwitterBackend') if self.FACEBOOK_API_SECRET and self.FACEBOOK_APP_ID: backends.insert(-1, 'social_auth.backends.facebook.FacebookBackend') if self.GOOGLE_OAUTH2_CLIENT_SECRET and self.GOOGLE_OAUTH2_CLIENT_ID: backends.insert(-1, 'social_auth.backends.google.GoogleOAuth2Backend') return backends ########################################################################### # # Payment settings # PAYMILL_PRIVATE_KEY = values.Value() PAYMILL_PUBLIC_KEY = values.Value() PAYMILL_TRANSACTION_DESCRIPTION = 'EuroPython 2014: Purchase ID {purchase_pk}' PAYMENT_METHODS = values.ListValue(['invoice', 'creditcard']) PURCHASE_TERMS_OF_USE_URL = values.Value( "https://ep2014.europython.eu/en/registration/terms-conditions/") PURCHASE_INVOICE_DISABLE_RENDERING = values.BooleanValue(True) # List of emails to be notified when a purchase has been made. PDF is send # to these addresses, too. PURCHASE_INVOICE_EXPORT_RECIPIENTS = values.ListValue([]) PURCHASE_INVOICE_FONT_CONFIG = values.DictValue({'de': {}, 'en': {}}) PURCHASE_INVOICE_FONT_ROOT = values.Value( ) # absolute path on the filesystem PURCHASE_INVOICE_NUMBER_FORMAT = values.Value('INVOICE-{0:d}') PURCHASE_INVOICE_ROOT = values.Value() # absolute path on the filesystem PURCHASE_INVOICE_TEMPLATE_PATH = values.Value( ) # absolute path to invoice template CACHES = values.DictValue({ 'default': { 'BACKEND': 'redis_cache.cache.RedisCache', 'LOCATION': 'localhost:6379:0', 'OPTIONS': { 'PARSER_CLASS': 'redis.connection.HiredisParser' }, }, }) BROKER_URL = values.Value('redis://localhost:6379/0') LOCALE_PATHS = (os.path.join(BASE_DIR, PROJECT_NAME, 'locale'), ) # Default settings for statici18n STATICI18N_OUTPUT_DIR = 'jsi18n' STATICI18N_DOMAIN = 'djangojs' STATICI18N_FILENAME_FUNCTION = 'statici18n.utils.default_filename'
class Base(Configuration): ''' All configurations should sublcass this base class. This contains all that is required, aside from custom endpoints that will vary per deployment and/or environment. Defaults have been set to err on the side of caution, so DEBUG, ADMIN, etc will have to be explictly turned on where necessary. ''' # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ # THIS IS JUST A DEFAULT THAT WAS GENERATED FOR LOCAL DEVELOPMENT # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = values.Value('abceasyas123') # SECURITY WARNING: don't run with debug turned on in production! DEBUG = values.BooleanValue(False) ADMIN_ENABLED = values.BooleanValue(False) SESSION_EXPIRE_AT_BROWSER_CLOSE = values.BooleanValue(True) AUTH_USER_MODEL = values.Value('users.User') MEMBERSHIP_ENCODE_KEY = values.Value('') MEMBERSHIP_RENEWAL_URL_BASE = values.URLValue('') SHARED_SESSION_SITES = values.ListValue([]) SESSION_COOKIE_DOMAIN = values.Value() SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') ALLOWED_HOSTS = values.ListValue([]) SITE_ID = values.IntegerValue(1) ADMINS = [('Sir Terence', '*****@*****.**')] SERVER_EMAIL = '*****@*****.**' # SESSION_COOKIE_AGE = 60*60*24 X_FRAME_OPTIONS = 'ALLOW' INSTALLED_APPS = values.ListValue([ # Django packages 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', 'django.contrib.sitemaps', # External packages 'captcha', 'debug_toolbar', 'django_jinja', 'raven.contrib.django.raven_compat', 'rest_framework_swagger', 'rest_framework.authtoken', 'rest_framework', 'rosetta', 'shared_session', 'storages', 'webpack_loader', 'cacheops', 'robots', 'import_export', # Application packages 'clublink.base', 'clublink.certificates', 'clublink.clubs', 'clublink.cms', 'clublink.corp', 'clublink.landings', 'clublink.users', 'clublink.emails', ]) MIDDLEWARE = values.ListValue([ 'debug_toolbar.middleware.DebugToolbarMiddleware', # Custom middleware 'clublink.base.middleware.HostnameRoutingMiddleware', 'clublink.base.middleware.ShortCircuitMiddleware', # Django middleware 'django.middleware.security.SecurityMiddleware', '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.clickjacking.XFrameOptionsMiddleware', # Sites middleware 'django.contrib.sites.middleware.CurrentSiteMiddleware', # Custom middleware 'clublink.base.middleware.SpoofedUserMiddleware', 'clublink.base.middleware.ScaffoldingMiddleware', 'clublink.base.middleware.LocaleMiddleware' ]) ROOT_URLCONF = values.Value('clublink.urls.common') TEMPLATES = values.ListValue([ { 'BACKEND': 'django_jinja.backend.Jinja2', 'DIRS': [ 'templates', ], 'APP_DIRS': True, 'OPTIONS': { 'match_regex': '.+(\.jinja|\.txt)', 'match_extension': None, 'extensions': DEFAULT_EXTENSIONS + [ 'webpack_loader.contrib.jinja2ext.WebpackExtension', 'jinja2.ext.i18n', 'cacheops.jinja2.cache', 'clublink.base.extensions.SharedSession', ], 'context_processors': [ '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.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', # Custom context processors 'clublink.base.context_processors.globals' ], } }, { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, } ]) WSGI_APPLICATION = values.Value('clublink.wsgi.application') CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': values.Value('redis://127.0.0.1:6379/1', environ_name='CACHES_DEFAULT_LOCATION'), 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } } } # Database # https://docs.djangoproject.com/en/1.11/ref/settings/# # As per: https://github.com/kennethreitz/dj-database-url#url-schema ### <-----------------------------------------------------------------> ### ### NOTE!!!! THIS IS THE ONE VALUE THAT IS NOT PREFIXED WITH DJANGO_ ### # DATABASE_DICT = values.DictValue() # LEGACY_DATABASE_DICT = values.DictValue() ### <-----------------------------------------------------------------> ### DATABASE_ENGINE = values.Value("django.db.backends.mysql") DATABASE_NAME = values.Value() DATABASE_USER = values.Value() DATABASE_PASSWORD = values.Value() DATABASE_HOST = values.Value() DATABASE_PORT = values.Value('3306') LEGACY_DATABASE_ENGINE = values.Value("django.db.backends.mysql") LEGACY_DATABASE_NAME = values.Value() LEGACY_DATABASE_USER = values.Value() LEGACY_DATABASE_PASSWORD = values.Value() LEGACY_DATABASE_HOST = values.Value() LEGACY_DATABASE_PORT = values.Value('3306') @property def DATABASES(self): DATABASES = { 'default': { 'ENGINE': self.DATABASE_ENGINE, 'NAME': self.DATABASE_NAME, 'USER': self.DATABASE_USER, 'PASSWORD': self.DATABASE_PASSWORD, 'HOST': self.DATABASE_HOST, 'PORT': self.DATABASE_PORT } } return DATABASES # Password validation # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = values.ListValue([ { '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.11/topics/i18n/ LANGUAGE_CODE = values.Value('en') LANGUAGES = values.SingleNestedTupleValue(( ('en', _('English')), ('fr', _('French')), )) LOCALE_PATHS = values.SingleNestedTupleValue( (os.path.join(BASE_DIR, 'locale'), )) TIME_ZONE = values.Value('America/Toronto') USE_I18N = values.BooleanValue(True) USE_L10N = values.BooleanValue(True) USE_TZ = values.BooleanValue(True) # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.11/howto/static-files/ DEFAULT_FILE_STORAGE = values.Value( 'django.contrib.staticfiles.storage.StaticFilesStorage') STATICFILES_DIRS = (os.path.join(BASE_DIR, 'assets'), ) # STATIC # STATIC_URL = values.Value('/static/') STATIC_ROOT = os.path.join(BASE_DIR, 'static') STATICFILES_LOCATION = values.Value('static') STATICFILES_STORAGE = values.Value( 'django.contrib.staticfiles.storage.StaticFilesStorage') # ASSETS # ASSETS_URL = values.Value('/asset_files/') ASSETS_ROOT = os.path.join(BASE_DIR, 'asset_files') ASSETS_LOCATION = values.Value('assets') ASSETS_FILE_STORAGE = values.Value( 'django.contrib.staticfiles.storage.StaticFilesStorage') # MEDIA # MEDIA_URL = values.Value('/media/') MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_LOCATION = values.Value('media') # WEBPACK # WEBPACK_LOADER = values.DictValue({ 'DEFAULT': { 'BUNDLE_DIR_NAME': 'bundles/', 'STATS_FILE': os.path.join(BASE_DIR, 'webpack-stats.json') }, }) SWAGGER_SETTINGS = values.DictValue({ 'DOC_EXPANSION': 'list', 'JSON_EDITOR': True, }) CSRF_COOKIE_HTTPONLY = values.BooleanValue(True) SECURE_REDIRECT_EXEMPT = values.ListValue([r'^__health__/$']) GIFT_CERTIFICATE_SITE_URL = values.URLValue() CORP_SITE_URL = values.URLValue() CLUB_SITE_URL = values.Value() ADMIN_SITE_URL = values.URLValue() ADMIN_HOSTNAME = values.RegexValue(r'^admin\.') CORP_HOSTNAME = values.RegexValue(r'^(www\.)?') API_HOSTNAME = values.RegexValue(r'^api\.') GIFT_CERTIFICATE_HOSTNAME = values.RegexValue(r'^giftcertificates\.') GIFT_CARDS_HOSTNAME = values.RegexValue(r'^giftcards\.') def HOSTNAME_URLCONFS(self): return ( (self.ADMIN_HOSTNAME, 'clublink.urls.admin'), (self.CORP_HOSTNAME, 'clublink.urls.corp'), (self.API_HOSTNAME, 'clublink.urls.api'), (self.GIFT_CERTIFICATE_HOSTNAME, 'clublink.urls.gc'), (self.GIFT_CARDS_HOSTNAME, 'clublink.urls.gift_cards'), ) def HOSTNAME_LANGUAGES(self): return ( (self.ADMIN_HOSTNAME, ('en', )), (self.GIFT_CERTIFICATE_HOSTNAME, ('en', )), ) VPN_PROTECTED_VIEWS_ENABLED = values.BooleanValue(True) VPN_IP_ADDRESS = values.Value('10.8.0.1') EMAIL_HOST = values.Value() EMAIL_PORT = values.IntegerValue(587) EMAIL_HOST_USER = values.Value() EMAIL_HOST_PASSWORD = values.Value() EMAIL_USE_TLS = values.BooleanValue(True) DEFAULT_FROM_EMAIL_ADDRESS = values.EmailValue('*****@*****.**') MEMBER_SERVICES_EMAIL_ADDRESS = values.EmailValue( '*****@*****.**') GIFT_CERTIFICATE_EMAIL_ADDRESS = values.EmailValue( '*****@*****.**') CORPORATE_EVENTS_EMAIL_ADDRESS = values.EmailValue( '*****@*****.**') MEMBERSHIP_SALES_EMAIL_ADDRESS = values.EmailValue( '*****@*****.**') EVENTS_EMAIL_ADDRESSES = values.ListValue([ '*****@*****.**', '*****@*****.**', '*****@*****.**', ]) IBS_API_WSDL = values.Value() IBS_API_USER = values.Value() IBS_API_PASSWORD = values.Value() IBS_WEBRES_API_ROOT = values.Value() IBS_WEBRES_API_USER = values.Value() IBS_WEBRES_API_PASSWORD = values.Value() GOOGLE_MAPS_API_KEY = values.Value() GOOGLE_ANALYTICS_TRACKING_ID = values.Value() DEFAULT_CERTIFICATE_EMPLOYEE_NUMBER = values.Value() DEFAULT_CERTIFICATE_MEMBERSHIP_NUMBER = values.Value('') CERTIFICATES_BATCH_LIMIT = values.IntegerValue(150) DATA_UPLOAD_MAX_NUMBER_FIELDS = values.IntegerValue(1000) GIFT_CERTIFICATE_IP_WHITELIST_ENABLED = values.BooleanValue(False) GIFT_CERTIFICATE_IP_WHITELIST = values.ListValue() AES_SHARED_KEY = values.Value() DYNAMICS_HOST = values.Value() DYNAMICS_USER = values.Value() DYNAMICS_PASSWORD = values.Value() DYNAMICS_DATABASE = values.Value() NOCAPTCHA = values.BooleanValue(True) RECAPTCHA_PUBLIC_KEY = values.Value() RECAPTCHA_PRIVATE_KEY = values.Value() PASSWORD_RESET_DEBUG = values.BooleanValue(True) PASSWORD_RESET_DEBUG_EMAIL_ADDRESSES = values.ListValue() ASSETS_FILE_STORAGE = values.Value( 'django.core.files.storage.FileSystemStorage') SEARCH_ENGINE_INDEXING_DISABLED = values.BooleanValue(False) SESSION_EXPIRE_AT_BROWSER_CLOSE = values.BooleanValue(True) REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_RENDERER_CLASSES': ('rest_framework.renderers.JSONRenderer', ), 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 50, 'EXCEPTION_HANDLER': 'clublink.base.api.handlers.logging_exception_handler', } CELERY_BROKER_URL = values.Value() CELERY_RESULT_BACKEND = values.Value()
class Base(Core): DOTENV_EXISTS = os.path.exists(os.path.join(Core.BASE_DIR, '.env')) DOTENV = os.path.join(Core.BASE_DIR, '.env') if DOTENV_EXISTS else None SECRET_KEY = values.SecretValue() DEBUG = values.BooleanValue(False) ADMIN_ENABLED = values.BooleanValue(DEBUG) ALLOWED_HOSTS = values.ListValue() # SESSION_COOKIE_NAME = 'clublink_session_id' SITE_ID = 1 def INSTALLED_APPS(self): return [ 'collectfast', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', 'captcha', #'ddtrace.contrib.django', 'django_jinja', 'raven.contrib.django.raven_compat', 'rest_framework', 'rest_framework.authtoken', 'rest_framework_swagger', 'rosetta', 'storages', 'webpack_loader', 'shared_session', 'clublink.base', 'clublink.users', 'clublink.certificates', 'clublink.clubs', 'clublink.corp', 'clublink.cms', 'clublink.landings', ] def MIDDLEWARE(self): return [ 'clublink.base.middleware.HostnameRoutingMiddleware', 'clublink.base.middleware.ShortCircuitMiddleware', #'ddtrace.contrib.django.TraceMiddleware', 'django.middleware.security.SecurityMiddleware', # THIS WON'T WORK # 'clublink.base.middleware.MultiDomainSessionMiddleware', '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.clickjacking.XFrameOptionsMiddleware', 'clublink.base.middleware.SpoofedUserMiddleware', 'clublink.base.middleware.ScaffoldingMiddleware', 'clublink.base.middleware.LocaleMiddleware', 'django.contrib.sites.middleware.CurrentSiteMiddleware', ] TIME_ZONE = values.Value('America/Toronto') GIFT_CERTIFICATE_SITE_URL = values.Value() CORP_SITE_URL = values.Value() CLUB_SITE_URL = values.Value() ADMIN_SITE_URL = values.Value() ADMIN_HOSTNAME = values.RegexValue(r'^admin\.') CORP_HOSTNAME = values.RegexValue(r'^www\.') API_HOSTNAME = values.RegexValue(r'^api\.') GIFT_CERTIFICATE_HOSTNAME = values.RegexValue(r'^gc\.') GIFT_CARDS_HOSTNAME = values.RegexValue(r'^giftcards\.') def HOSTNAME_URLCONFS(self): return ( (self.ADMIN_HOSTNAME, 'clublink.urls.admin'), (self.CORP_HOSTNAME, 'clublink.urls.corp'), (self.API_HOSTNAME, 'clublink.urls.api'), (self.GIFT_CERTIFICATE_HOSTNAME, 'clublink.urls.gc'), (self.GIFT_CARDS_HOSTNAME, 'clublink.urls.gift_cards'), ) LANGUAGES = Core.LANGUAGES def HOSTNAME_LANGUAGES(self): return ( (self.ADMIN_HOSTNAME, ('en', )), (self.GIFT_CERTIFICATE_HOSTNAME, ('en', )), ) DATABASES = values.DatabaseURLValue('mysql://mysql@localhost/clublink') VPN_PROTECTED_VIEWS_ENABLED = values.BooleanValue(True) VPN_IP_ADDRESS = values.Value('10.8.0.1') EMAIL_HOST = values.Value() EMAIL_PORT = values.IntegerValue(587) EMAIL_HOST_USER = values.Value() EMAIL_HOST_PASSWORD = values.Value() EMAIL_USE_TLS = values.BooleanValue(True) DEFAULT_FROM_EMAIL_ADDRESS = '*****@*****.**' MEMBER_SERVICES_EMAIL_ADDRESS = values.EmailValue( '*****@*****.**') GIFT_CERTIFICATE_EMAIL_ADDRESS = values.EmailValue( '*****@*****.**') CORPORATE_EVENTS_EMAIL_ADDRESS = values.EmailValue( '*****@*****.**') MEMBERSHIP_SALES_EMAIL_ADDRESS = values.EmailValue( '*****@*****.**') EVENTS_EMAIL_ADDRESSES = values.ListValue([ '*****@*****.**', '*****@*****.**', '*****@*****.**', ]) IBS_API_WSDL = values.Value() IBS_API_USER = values.Value() IBS_API_PASSWORD = values.Value() IBS_WEBRES_API_ROOT = values.Value() IBS_WEBRES_API_USER = values.Value() IBS_WEBRES_API_PASSWORD = values.Value() GOOGLE_MAPS_API_KEY = values.Value() GOOGLE_ANALYTICS_TRACKING_ID = values.Value() def REST_FRAMEWORK(self): return { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_RENDERER_CLASSES': ( 'rest_framework.renderers.JSONRenderer', values.ListValue( environ_name='REST_FRAMEWORK_DEFAULT_RENDERER_CLASSES'), ), 'DEFAULT_PAGINATION_CLASS': None, 'PAGE_SIZE': 50, 'EXCEPTION_HANDLER': 'clublink.base.api.handlers.logging_exception_handler', } def CACHES(self): return { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': values.Value('redis://127.0.0.1:6379/1', environ_name='CACHES_DEFAULT_LOCATION'), 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } }, 'collectfast': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': values.Value('redis://127.0.0.1:6379/3', environ_name='CACHES_COLLECTFAST_LOCATION'), 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'MAX_ENTRIES': 5000, }, 'TIMEOUT': 21600 }, } CACHEOPS_REDIS = values.Value('redis://127.0.0.1:6379/2') def OPBEAT(self): return { 'ORGANIZATION_ID': values.Value(None, environ_name='OPBEAT_ORGANIZATION_ID'), 'APP_ID': values.Value(None, environ_name='OPBEAT_APP_ID'), 'SECRET_TOKEN': values.Value(None, environ_name='OPBEAT_SECRET_TOKEN'), } def RAVEN_CONFIG(self): return { 'dsn': values.URLValue(None, environ_name='RAVEN_CONFIG_DSN'), 'string_max_length': values.IntegerValue(2000, environ_name='RAVEN_CONFIG_STRING_MAX_LENGTH') } RAVEN_LOG_API_ERRORS = values.BooleanValue(False) DEFAULT_CERTIFICATE_EMPLOYEE_NUMBER = values.Value() DEFAULT_CERTIFICATE_MEMBERSHIP_NUMBER = values.Value('') CERTIFICATES_BATCH_LIMIT = values.IntegerValue(110) DATA_UPLOAD_MAX_NUMBER_FIELDS = values.IntegerValue(1000) GIFT_CERTIFICATE_IP_WHITELIST_ENABLED = values.BooleanValue(False) GIFT_CERTIFICATE_IP_WHITELIST = values.ListValue() AES_SHARED_KEY = values.Value() DYNAMICS_HOST = values.Value() DYNAMICS_USER = values.Value() DYNAMICS_PASSWORD = values.Value() DYNAMICS_DATABASE = values.Value() NOCAPTCHA = values.BooleanValue(True) RECAPTCHA_PUBLIC_KEY = values.Value() RECAPTCHA_PRIVATE_KEY = values.Value() COLLECTFAST_CACHE = values.Value('collectfast') PASSWORD_RESET_DEBUG = values.BooleanValue(True) PASSWORD_RESET_DEBUG_EMAIL_ADDRESSES = values.ListValue() ASSETS_FILE_STORAGE = values.Value( 'django.core.files.storage.FileSystemStorage') SEARCH_ENGINE_INDEXING_DISABLED = values.BooleanValue(False) SESSION_EXPIRE_AT_BROWSER_CLOSE = values.BooleanValue(True) def DATADOG_TRACE(self): return { 'ENABLED': False, }
class Common(Configuration): VERSION = values.Value('0.0.0-x', environ_prefix='ID') SITE_NAME = values.Value('Investigative Dashboard', environ_prefix='ID') INSTALLED_APPS = ( 'django.contrib.contenttypes', 'django.contrib.auth', # Third party apps 'rest_framework', 'corsheaders', 'django_filters', 'social_django', 'activity', # Your apps 'api_v3', ) MIDDLEWARE = ( 'django.middleware.security.SecurityMiddleware', 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', ) ALLOWED_HOSTS = ["*"] ROOT_URLCONF = 'api_v3.urls' SECRET_KEY = values.SecretValue() WSGI_APPLICATION = 'api_v3.wsgi.application' USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') ROUTER_CLASS = 'rest_framework.routers.DefaultRouter' # Email EMAIL = values.EmailURLValue('console://') DEFAULT_FROM_EMAIL = values.EmailValue('', environ_prefix='ID', environ_required=True) DEFAULT_FROM = '{} <{}>'.format(SITE_NAME, DEFAULT_FROM_EMAIL) ADMINS = [] # Postgres DATABASES = values.DatabaseURLValue( 'postgres://postgres:@postgres:5432/postgres') # CORS CORS_ALLOW_CREDENTIALS = True CORS_ORIGIN_WHITELIST = values.ListValue(['localhost:8000']) CORS_ORIGIN_ALLOW_ALL = values.BooleanValue(False) # Sentry RAVEN_CONFIG = { 'dsn': values.Value('', environ_name='SENTRY_DSN', environ_prefix=''), 'release': VERSION, } # General APPEND_SLASH = False TIME_ZONE = 'UTC' LANGUAGE_CODE = 'en-us' # If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. USE_I18N = False USE_L10N = False USE_TZ = False # Media files: max. size of 500MB MEDIA_ROOT = values.Value(environ_name='MEDIA_ROOT', environ_prefix='', environ_required=True) MAX_UPLOAD_SIZE = 1024 * 1024 * 500 STATIC_URL = '/api/static/' DEBUG = values.BooleanValue(False) TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True, 'DIRS': [ os.path.abspath( os.path.join(os.path.dirname(__file__), '..', 'templates')), ], }, ] # Logging LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'filters': { 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', }, }, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { '': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': True, }, } } # Custom user app AUTH_USER_MODEL = 'api_v3.Profile' # Authentication AUTHENTICATION_BACKENDS = values.ListValue([ 'api_v3.misc.oauth2.KeycloakOAuth2', ]) SOCIAL_AUTH_KEYCLOAK_BASE = values.Value('', environ_prefix='') SOCIAL_AUTH_KEYCLOAK_KEY = values.Value('', environ_prefix='') SOCIAL_AUTH_KEYCLOAK_SECRET = values.Value('', environ_prefix='') SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = values.Value('', environ_prefix='') SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = values.Value('', environ_prefix='') # Username is not used. SOCIAL_AUTH_USER_FIELDS = ['email'] # See: http://python-social-auth.readthedocs.io/en/latest/pipeline.html SOCIAL_AUTH_PIPELINE = ( 'social_core.pipeline.social_auth.social_details', 'social_core.pipeline.social_auth.social_uid', '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.user.user_details', 'api_v3.misc.oauth2.activate_user', 'api_v3.misc.oauth2.map_email_to_subscriber', ) # Django Rest Framework REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ], 'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.SessionAuthentication', ) } # JSON API DRF JSON_API_FORMAT_KEYS = 'dasherize' JSON_API_FORMAT_TYPES = 'dasherize' JSON_API_PLURALIZE_TYPES = True
class ProjectDefault(Configuration): """ The default settings from the Django project template. Django Configurations https://django-configurations.readthedocs.io """ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/{{docs_version}}/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = values.SecretValue() # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = values.ListValue([]) # Application definition INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", ] MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "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.clickjacking.XFrameOptionsMiddleware", ] ROOT_URLCONF = "{{project_name}}.urls" TEMPLATES = [{ "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ] }, }] WSGI_APPLICATION = "{{project_name}}.wsgi.application" # Database # https://docs.djangoproject.com/en/{{docs_version}}/ref/settings/#databases DATABASES = values.DatabaseURLValue() # Password validation # https://docs.djangoproject.com/en/{{docs_version}}/ref/settings/#auth-password-validators # noqa # fmt: off AUTH_PASSWORD_VALIDATORS = [ { "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", # noqa }, { "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", }, { "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", }, { "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", }, ] # fmt: on # Internationalization # https://docs.djangoproject.com/en/{{docs_version}}/topics/i18n/ LANGUAGE_CODE = "en-us" TIME_ZONE = "UTC" USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/{{docs_version}}/howto/static-files/ STATIC_URL = "/static/" STATIC_ROOT = os.path.abspath(os.path.join(BASE_DIR, "static")) STATICFILES_STORAGE = ( "django.contrib.staticfiles.storage.ManifestStaticFilesStorage") # Stored files # https://docs.djangoproject.com/en/{{docs_version}}/topics/files/ # MEDIA_URL = "/media/" # MEDIA_ROOT = os.path.abspath(os.path.join(BASE_DIR, "media")) # Email Settings # https://docs.djangoproject.com/en/{{docs_version}}/topics/email/ SERVER_EMAIL = values.EmailValue() DEFAULT_NAME = "{{project_name}}" DEFAULT_FROM_EMAIL = f"{DEFAULT_NAME} <{SERVER_EMAIL}>" EMAIL_SUBJECT_PREFIX = f"[{DEFAULT_NAME}] " ERROR_EMAIL = SERVER_EMAIL EMAIL_SIGNATURE = f"\n-- \n{DEFAULT_FROM_EMAIL}" MANAGERS = ((DEFAULT_NAME, ERROR_EMAIL), ) ADMINS = MANAGERS EMAIL_USE_LOCALTIME = True