Beispiel #1
0
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)
Beispiel #2
0
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'
Beispiel #4
0
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
Beispiel #5
0
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'
Beispiel #6
0
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()
Beispiel #7
0
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,
        }
Beispiel #8
0
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