import os, json # a massive hack to see if we're testing, in which case we use different settings import sys TESTING = 'test' in sys.argv # go through environment variables and override them def get_from_env(var, default): if not TESTING and os.environ.has_key(var): return os.environ[var] else: return default DEBUG = (get_from_env('DEBUG', '1') == '1') TEMPLATE_DEBUG = DEBUG # add admins of the form: # ('Ben Adida', 'ben@adida.net'), # if you want to be emailed about errors. ADMINS = ( ) MANAGERS = ADMINS # is this the master Helios web site? MASTER_HELIOS = (get_from_env('MASTER_HELIOS', '0') == '1') # show ability to log in? (for example, if the site is mostly used by voters) # if turned off, the admin will need to know to go to /auth/login manually SHOW_LOGIN_OPTIONS = (get_from_env('SHOW_LOGIN_OPTIONS', '1') == '1') # sometimes, when the site is not that social, it's not helpful # to display who created the election SHOW_USER_INFO = (get_from_env('SHOW_USER_INFO', '1') == '1') DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'helios' } } SOUTH_DATABASE_ADAPTERS = {'default':'south.db.postgresql_psycopg2'} # override if we have an env variable if get_from_env('DATABASE_URL', None): import dj_database_url DATABASES['default'] = dj_database_url.config() DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql_psycopg2' DATABASES['default']['CONN_MAX_AGE'] = 600 # require SSL DATABASES['default']['OPTIONS'] = {'sslmode': 'require'} # Local time zone for this installation. Choices can be found here: # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name # although not all choices may be available on all operating systems. # If running in a Windows environment this must be set to the same as your # system time zone. TIME_ZONE = 'America/Los_Angeles' # Language code for this installation. All choices can be found here: # http://www.i18nguy.com/unicode/language-identifiers.html LANGUAGE_CODE = 'en-us' SITE_ID = 1 # If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. USE_I18N = True # Absolute path to the directory that holds media. # Example: "/home/media/media.lawrence.com/" MEDIA_ROOT = '' # URL that handles the media served from MEDIA_ROOT. Make sure to use a # trailing slash if there is a path component (optional in other cases). # Examples: "http://media.lawrence.com", "http://example.com/media/" MEDIA_URL = '' # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a # trailing slash. # Examples: "http://foo.com/media/", "/media/". STATIC_URL = '/media/' # Make this unique, and don't share it with anybody. SECRET_KEY = get_from_env('SECRET_KEY', 'replaceme') # If debug is set to false and ALLOWED_HOSTS is not declared, django raises "CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False." # If in production, you got a bad request (400) error #More info: https://docs.djangoproject.com/en/1.7/ref/settings/#allowed-hosts (same for 1.6) ALLOWED_HOSTS = get_from_env('ALLOWED_HOSTS', 'localhost').split(",") # Secure Stuff if (get_from_env('SSL', '0') == '1'): SECURE_SSL_REDIRECT = True SESSION_COOKIE_SECURE = True # tuned for Heroku SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") SESSION_COOKIE_HTTPONLY = True # let's go with one year because that's the way to do it now STS = False if (get_from_env('HSTS', '0') == '1'): STS = True # we're using our own custom middleware now # SECURE_HSTS_SECONDS = 31536000 # not doing subdomains for now cause that is not likely to be necessary and can screw things up. # SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_BROWSER_XSS_FILTER = True SECURE_CONTENT_TYPE_NOSNIFF = True # List of callables that know how to import templates from various sources. TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader' ) MIDDLEWARE_CLASSES = ( # make all things SSL #'sslify.middleware.SSLifyMiddleware', # secure a bunch of things 'djangosecure.middleware.SecurityMiddleware', 'helios.security.HSTSMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware' ) ROOT_URLCONF = 'urls' ROOT_PATH = os.path.dirname(__file__) TEMPLATE_DIRS = ( ROOT_PATH, os.path.join(ROOT_PATH, 'templates') ) INSTALLED_APPS = ( # 'django.contrib.auth', # 'django.contrib.contenttypes', 'djangosecure', 'django.contrib.sessions', #'django.contrib.sites', ## needed for queues 'djcelery', 'kombu.transport.django', ## in Django 1.7 we now use built-in migrations, no more south ## 'south', ## HELIOS stuff 'helios_auth', 'helios', 'server_ui', ) ## ## HELIOS ## MEDIA_ROOT = ROOT_PATH + "media/" # a relative path where voter upload files are stored VOTER_UPLOAD_REL_PATH = "voters/%Y/%m/%d" # Change your email settings DEFAULT_FROM_EMAIL = get_from_env('DEFAULT_FROM_EMAIL', 'ben@adida.net') DEFAULT_FROM_NAME = get_from_env('DEFAULT_FROM_NAME', 'Ben for Helios') SERVER_EMAIL = '%s <%s>' % (DEFAULT_FROM_NAME, DEFAULT_FROM_EMAIL) LOGIN_URL = '/auth/' LOGOUT_ON_CONFIRMATION = False # The two hosts are here so the main site can be over plain HTTP # while the voting URLs are served over SSL. URL_HOST = get_from_env("URL_HOST", "http://localhost:8000").rstrip("/") # IMPORTANT: you should not change this setting once you've created # elections, as your elections' cast_url will then be incorrect. # SECURE_URL_HOST = "https://localhost:8443" SECURE_URL_HOST = get_from_env("SECURE_URL_HOST", URL_HOST).rstrip("/") # election stuff SITE_TITLE = get_from_env('SITE_TITLE', 'Helios Voting') MAIN_LOGO_URL = get_from_env('MAIN_LOGO_URL', '/static/logo.png') ALLOW_ELECTION_INFO_URL = (get_from_env('ALLOW_ELECTION_INFO_URL', '0') == '1') # FOOTER links FOOTER_LINKS = json.loads(get_from_env('FOOTER_LINKS', '[]')) FOOTER_LOGO_URL = get_from_env('FOOTER_LOGO_URL', None) WELCOME_MESSAGE = get_from_env('WELCOME_MESSAGE', "This is the default message") HELP_EMAIL_ADDRESS = get_from_env('HELP_EMAIL_ADDRESS', 'help@heliosvoting.org') AUTH_TEMPLATE_BASE = "server_ui/templates/base.html" HELIOS_TEMPLATE_BASE = "server_ui/templates/base.html" HELIOS_ADMIN_ONLY = False HELIOS_VOTERS_UPLOAD = True HELIOS_VOTERS_EMAIL = True # are elections private by default? HELIOS_PRIVATE_DEFAULT = False # authentication systems enabled #AUTH_ENABLED_AUTH_SYSTEMS = ['password','facebook','twitter', 'google', 'yahoo'] AUTH_ENABLED_AUTH_SYSTEMS = get_from_env('AUTH_ENABLED_AUTH_SYSTEMS', 'google').split(",") AUTH_DEFAULT_AUTH_SYSTEM = get_from_env('AUTH_DEFAULT_AUTH_SYSTEM', None) # google GOOGLE_CLIENT_ID = get_from_env('GOOGLE_CLIENT_ID', '') GOOGLE_CLIENT_SECRET = get_from_env('GOOGLE_CLIENT_SECRET', '') # facebook FACEBOOK_APP_ID = get_from_env('FACEBOOK_APP_ID','') FACEBOOK_API_KEY = get_from_env('FACEBOOK_API_KEY','') FACEBOOK_API_SECRET = get_from_env('FACEBOOK_API_SECRET','') # twitter TWITTER_API_KEY = '' TWITTER_API_SECRET = '' TWITTER_USER_TO_FOLLOW = 'heliosvoting' TWITTER_REASON_TO_FOLLOW = "we can direct-message you when the result has been computed in an election in which you participated" # the token for Helios to do direct messaging TWITTER_DM_TOKEN = {"oauth_token": "", "oauth_token_secret": "", "user_id": "", "screen_name": ""} # LinkedIn LINKEDIN_API_KEY = '' LINKEDIN_API_SECRET = '' # CAS (for universities) CAS_USERNAME = get_from_env('CAS_USERNAME', "") CAS_PASSWORD = get_from_env('CAS_PASSWORD', "") CAS_ELIGIBILITY_URL = get_from_env('CAS_ELIGIBILITY_URL', "") CAS_ELIGIBILITY_REALM = get_from_env('CAS_ELIGIBILITY_REALM', "") # Clever CLEVER_CLIENT_ID = get_from_env('CLEVER_CLIENT_ID', "") CLEVER_CLIENT_SECRET = get_from_env('CLEVER_CLIENT_SECRET', "") # email server EMAIL_HOST = get_from_env('EMAIL_HOST', 'localhost') EMAIL_PORT = int(get_from_env('EMAIL_PORT', "2525")) EMAIL_HOST_USER = get_from_env('EMAIL_HOST_USER', '') EMAIL_HOST_PASSWORD = get_from_env('EMAIL_HOST_PASSWORD', '') EMAIL_USE_TLS = (get_from_env('EMAIL_USE_TLS', '0') == '1') # to use AWS Simple Email Service # in which case environment should contain # AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY if get_from_env('EMAIL_USE_AWS', '0') == '1': EMAIL_BACKEND = 'django_ses.SESBackend' # set up logging import logging logging.basicConfig( level = logging.DEBUG, format = '%(asctime)s %(levelname)s %(message)s' ) # set up django-celery # BROKER_BACKEND = "kombu.transport.DatabaseTransport" BROKER_URL = "django://" CELERY_RESULT_DBURI = DATABASES['default'] import djcelery djcelery.setup_loader() # for testing TEST_RUNNER = 'djcelery.contrib.test_runner.CeleryTestSuiteRunner' # this effectively does CELERY_ALWAYS_EAGER = True # Rollbar Error Logging ROLLBAR_ACCESS_TOKEN = get_from_env('ROLLBAR_ACCESS_TOKEN', None) if ROLLBAR_ACCESS_TOKEN: print "setting up rollbar" MIDDLEWARE_CLASSES += ('rollbar.contrib.django.middleware.RollbarNotifierMiddleware',) ROLLBAR = { 'access_token': ROLLBAR_ACCESS_TOKEN, 'environment': 'development' if DEBUG else 'production', } # Tendenci # Add trailing slash to the URLs TENDENCI_CAS_URL = 'http://tendenci:9000/cas/' TENDENCI_GROUPS_URL = 'http://tendenci:9000/helios/groups/'