settings.py 15.2 KB
Newer Older
1 2 3 4 5
# -*- coding: utf-8 -*-
# Django settings for intranet project.

import os
import sys
6
import socket
7
from django.utils.translation import ugettext_lazy as _
Daniel Stan's avatar
Daniel Stan committed
8 9 10

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

11 12 13 14 15
import django
import gestion.secrets_new as secrets
import conn_pool

""" Liste d'applications désactivées """
Daniel Stan's avatar
Daniel Stan committed
16
DISABLED_APPS = ['dummy', ]
17

18
# TODO Section d'insultes pour obsolescence
19
try:
20 21
    import settings_local
    raise Exception("Présence d'un settings_local, merci de relire le README "
22
        '(section "Vieille installation de test")')
23
except ImportError:
24
    pass
25

26 27
if not os.getenv('DBG_INTRANET'):
    if socket.gethostname() != 'o2':
28
        raise Exception("DBG_INTRANET absent et nous ne sommes pas en prod "
29
            "sur o2. Qu'est-ce que ça veut dire ?")
30 31
    # L'url de l'intranet
    ROOT_URL = "https://intranet.crans.org/"
32 33 34 35 36 37 38
    DEBUG = False
    BASE_LDAP_TEST = False
else:
    ROOT_URL = os.getenv('DBG_INTRANET')
    DEBUG = True
    # TODO Virer mention de la base de test
    BASE_LDAP_TEST = True
39

40
# Faut-il utiliser le CAS pour s'authentifier
41
CAS_ENABLED = os.getenv('DBG_CAS') not in ['', '0']
42

43 44
# À qui faut-il envoyer les mails de câblage
CABLAGE_MAIL_DEST = ['respbats@crans.org', ]
45

Daniel Stan's avatar
Daniel Stan committed
46 47 48
if not DEBUG:
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

49
# Où stocker les fichiers static collectés
Daniel Stan's avatar
Daniel Stan committed
50
STATIC_ROOT = os.path.abspath(os.path.join(BASE_DIR, 'var/static'))
51

52
SESSION_COOKIE_AGE = 900
53 54 55 56 57

SESSION_SAVE_EVERY_REQUEST = True

EMAIL_SUBJECT_PREFIX = "[Intranet2 Cr@ns] "

58 59 60
# Nécessaire pour timezone.now() renvoie un datetime timezoné
USE_TZ = True

61 62 63 64 65 66 67 68 69
ADMINS = (
    ('Intranet', 'root@crans.org'),
)

ALLOWED_HOSTS = [
    'intranet2.crans.org',
    'intranet.crans.org',
    'intranet-dev.crans.org',
    'intranet-apprentis.crans.org',
70
    'vo.crans.org',
71 72
]

73

74 75 76 77
ATOMIC_REQUESTS = True

MANAGERS = ADMINS

Daniel Stan's avatar
Daniel Stan committed
78
FIXTURE_DIRS=(os.path.join(BASE_DIR, 'fixtures/'),)
79

80 81
DB_HOST = os.getenv('DBG_DJANGO_DB', 'pgsql.v4.adm.crans.org')
# NB: DBG_DJANGO_DB peut être défini mais vide (base SQLite)
82 83 84 85 86
if DB_HOST:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'django',
87
            'HOST': DB_HOST,
88 89 90 91 92 93 94
            'USER': 'crans',
        },
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
Daniel Stan's avatar
Daniel Stan committed
95
            'NAME': os.path.join(BASE_DIR, "default.sqlite"),
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
        },
    }


STATIC_URL = '/static/'

# 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 = 'Europe/Paris'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'fr-fr'

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

119 120 121
LANGUAGES = [
    ('fr', _(u'Français')),
    ('en', _(u'Anglais')),
122
    ('es', _(u'Espagnol')),
123 124 125
]
DEFAULT_LANGUAGE = 1

126 127 128 129 130
# Formate les dates en fonction de la localisation
USE_L10N = True

# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
Daniel Stan's avatar
Daniel Stan committed
131 132
# TODO: deprecated ?
MEDIA_ROOT = BASE_DIR
133 134 135 136 137 138 139

# 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 = ROOT_URL + 'media/'

# Make this unique, and don't share it with anybody.
140
if DEBUG:
141 142 143 144 145 146
    SECRET_KEY = "sYjlDBZUBSMnk"
else: # Ne marchera que sur o2
    SECRET_KEY = secrets.get('django_secret_key')

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
147
    'django.middleware.common.CommonMiddleware',
148 149 150 151
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
152
    'django.middleware.locale.LocaleMiddleware',
153
    'reversion.middleware.RevisionMiddleware',
154
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
155 156
)

157
TPL_CONTEXT_PROCESSORS = (
158
    "django.contrib.auth.context_processors.auth",
159 160 161
    "django.template.context_processors.debug",
    "django.template.context_processors.i18n",
    "django.template.context_processors.media",
162
    "django.contrib.messages.context_processors.messages",
163
    "django.template.context_processors.request",
164 165
)

166
TPL_CONTEXT_PROCESSORS += (
167
    'intranet.custom_context_processor.app_list',
168
    'intranet.custom_context_processor.global_message',
169
)
170
if os.getenv('DBG_LDAP'):
171
    TPL_CONTEXT_PROCESSORS += (
172 173
        'intranet.custom_context_processor.password_hint',
    )
174

175 176 177 178 179 180 181

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR,'templates')],
    'APP_DIRS': True,
    'OPTIONS': {
182 183 184
        'context_processors': TPL_CONTEXT_PROCESSORS,
        'debug' : DEBUG,
        },
185 186
},]

187 188 189 190 191 192 193 194 195
ROOT_URLCONF = 'intranet.urls'

LOGIN_URL = "/login"
LOGIN_REDIRECT_URL = "/"

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
]

196
CAS_SERVER_URL = 'https://cas.crans.org/'
197 198 199 200 201 202
CAS_VERSION = '3'

# En dehors d'un usage personnel, on se permet d'activer le backend LDAP
# (reste à voir si on se connecte à la vraie ou à la base de test)
if CAS_ENABLED:
    AUTHENTICATION_BACKENDS.append('django_cas_ng.backends.CASBackend')
Daniel Stan's avatar
Daniel Stan committed
203
AUTHENTICATION_BACKENDS.append('intranet.login.LDAPUserBackend')
204 205 206 207 208 209 210 211

# Le nom de l'appli prises est utilisé pour les reverse URL.
#  Si jamais on a envie de le changer, pour que ce soit plus simple,
#  on le place dans une variable ici.
APP_PRISES_NAME = "prises"

CABLAGE_MAIL_FROM = u'"L\'intranet du Cr@ns" <intranet-bugreport@lists.crans.org>'

212 213 214 215 216 217
CATEGORY_LABELS = {
  'Administration': _(u'Administration'),
  'Services': _(u'Services'),
  'Divers': _(u'Divers'),
}

218 219
INTRANET_APPS = (
    {
220 221 222
        'name': 'dummy',
        'title': _(u'Application factice vide pour tests'),
        'category' :'Beta',
223 224 225 226 227
        'test': lambda u: u.groups.filter(name='crans_nounou') or u.groups.filter(name='crans_apprenti'),
    },
    {
        'name': APP_PRISES_NAME,
        'category':'Administration',
228
        'label': _(u'Prises réseau'),
229
        'test': lambda u: u.has_perm('prises.can_view') or u.groups.filter(name='crans_nounou') or u.groups.filter(name='crans_cableur'),
230 231
    },
    {
232
        'name': 'impressions',
233
        'category': 'Services',
234
        'label': _(u'Impressions'),
235
        'help':'https://wiki.crans.org/VieCrans/ImpressionReseau',
236
        'title': _(u"Service d'impression sur l'imprimante Crans"),
237 238
    },
    {
239
        'name': 'digicode',
240
        'category': 'Services',
241 242
        'label': _(u'Gestion des digicodes'),
        'title': _(u"Gestion des codes d'accès au local d'impression (4J)"),
243 244
    },
    {
245 246 247 248
        'name': 'wifimap',
        'title': _(u'Carte des positions et état des bornes wifi Cr@ns'),
        'category': 'Services',
        'label': _(u'Carte WiFi'),
249 250 251
    },
    {
        'name': 'tv',
252
        'module': 'stream',
253
        'title': _(u'Télévison et radio'),
254
        'category':'Services',
255
        'label': _(u'TV'),
256 257 258 259
        'help':'https://wiki.crans.org/TvReseau',
    },
    {
        'name': 'wiki',
260
        'module': 'association_wiki',
261
        'category': 'Administration',
262 263
        'label': _(u'Compte WiKi'),
        'title': _(u'Associer son compte crans avec le wiki du crans'),
264 265 266
        'help':'https://wiki.crans.org'
    },
    {
267 268 269 270
        'name': 'compte',
        'title': _(u'Gestion de compte'),
        'category': 'Administration',
        'label': _(u'Mon Compte'),
271 272
        'help': 'https://wiki.crans.org/VieCrans/GestionCompte/'
    },
273 274 275
    {
        'name': 'cablage',
        'category': 'Administration',
276
        'label': _(u'Câblage'),
277 278
        'test': lambda u: u.groups.filter(name='crans_nounou') or u.groups.filter(name='crans_cableur'),
    },
279
    {
280 281
        'name': 'pageperso',
        'title': _(u'Gestion page perso'),
282
        'category': 'Administration',
283
        'label': _(u'Page Perso'),
284 285 286 287
        'help':'https://wiki.crans.org/VieCrans/GestionCompte/#Comment_cr.2BAOk-er_sa_page_personnelle_.3F',
    },
    {
        'name' : 'solde',
288
        'title' : _(u'Consulter son solde et recharger son compte Crans'),
289
        'category' : 'Administration',
290
        'label' : _(u'Mon Solde'),
291 292 293
        'help': 'https://wiki.crans.org/CransPratique/SoldeImpression',
    },
    {
294 295 296 297
        'name': 'quota',
        'title': _(u'Gestion des Quotas (upload, dossier)'),
        'category': 'Administration',
        'label': _(u'Quotas'),
298 299 300 301 302
        'help':'https://wiki.crans.org/VieCrans/GestionCompte/GestionQuota',
    },
    {
        'name': 'machines',
        'category': 'Administration',
303
        'label': _(u'Gestion des machines'),
304
        'test': lambda u: (u.groups.filter(name='crans_paiement_ok') or conn_pool.get_user(u).machines()),
305
        'title': _(u'Créer, modifier ou supprimer des machines'),
306 307 308 309
    },
    {
        'name': 'factures',
        'category': 'Administration',
310 311
        'label': _(u'Mes factures'),
        'title': _(u"Affichage des factures"),
312 313 314 315
    },
    {
        'name': 'validation',
        'category': 'Administration',
316
        'label': _(u'Validation'),
317
        'test': lambda u: u.groups.filter(name='crans_nounou') or u.groups.filter(name='crans_cableur'),
318 319 320 321 322 323 324 325 326 327
    },
    {
        'name': 'autoconf',
        'category': 'Administration',
        'label': 'autoconf',
        'test': lambda _: False, # Personne n'a besoin de voir cette appli
    },
    {
        'name': 'club',
        'category': 'Administration',
328
        'label': _(u'Gestion des clubs'),
329 330
        'test': lambda u: u.groups.filter(name='crans_respo_club'),
    },
331 332 333 334 335 336 337
    {
        'name': 'user_settings',
        'label': _(u'Préférences'),
        'category' :'Administration',
        'title' : _(u'Réglages des préférences'),
        'test': lambda u: True,
    },
338 339 340 341 342 343 344
    {
        'name': 'fpr',
        'label': _(u'Empreintes SSH'),
        'category' :'Services',
        'title' : _(u'Affichage des empreintes SSH des serveurs'),
        'test': lambda u: True,
    },
345 346 347 348 349 350 351
    {
        'name': 'password_reset',
        'label': _(u'password_reset'),
        'category' :'Administration',
        'title' : _(u'password_reset'),
        'test': lambda _: False,
    },
352 353 354 355 356 357 358 359 360
)

INTRANET_APPS = tuple([ i for i in INTRANET_APPS if i['name'] not in
    DISABLED_APPS])

REDIRECT_SERVICES = (
    {
        'url': 'https://gitlab.crans.org/',
        'category': 'Divers',
361
        'label': _(u'GitLab'),
362 363
        'pic' : 'icone_gitlab',
        'test': lambda _: True,
364
        'title': _(u'Interface web pour gérer des dépôts Git'),
365 366 367 368 369
        'help':'https://wiki.crans.org/CransTechnique/GitLab',
    },
    {
        'url': 'https://roundcube.crans.org',
        'category': 'Services',
370
        'label': _(u'Webmail'),
371 372
        'pic' : 'icone_roundcube',
        'test': lambda u: u.groups.filter(name='crans_adherent') or u.groups.filter(name='crans_club'),
373
        'title': _(u'Interface web pour vos mails crans'),
374 375 376 377 378
        'help':'https://wiki.crans.org/VieCrans/LesMails',
    },
    {
        'url': 'https://news.crans.org/newsgroups.php?cas=crans.org',
        'category': 'Services',
379
        'label': _(u'Webnews'),
380
        'pic' : 'icone_webnews',
381
        'title': _(u'Interface web pour les newsgroups (les forums) crans'),
382 383 384 385 386
        'help':'https://wiki.crans.org/VieCrans/ForumNews',
    },
    {
        'url': 'http://irc.crans.org/web/',
        'category': 'Services',
387
        'label': _(u'Webirc'),
388 389
        'pic' : 'icone_irc',
        'test': lambda _: True,
390 391
        'title': _(u'Interface web pour les canaux de discussion du crans'),
        'help': 'https://wiki.crans.org/VieCrans/UtiliserIrc',
392 393 394 395
    },
    {
        'url': 'https://owncloud.crans.org/index.php?app=user_cas',
        'category': 'Services',
396 397
        'label': _(u'ownCloud'),
        'pic': 'icone_owncloud',
398
        'test': lambda u: u.groups.filter(name='crans_adherent') or u.groups.filter(name='crans_club'),
399 400
        'title': _(u'Interface web pour stocker des fichiers à la dropbox'),
        'help': 'https://wiki.crans.org/VieCrans/Owncloud',
401 402 403 404
    },
    {
        'url': 'https://pad.crans.org/',
        'category': 'Divers',
405
        'label': _(u'Etherpad'),
406
        'test': lambda _: True,
407 408
        'pic': 'icone_etherpad',
        'title': _(u"Une interface web pour faire de l'édition collaborative de texte"),
409 410 411 412
    },
    {
        'url': 'https://zero.crans.org/',
        'category': 'Divers',
413
        'label': _(u'ZeroBin'),
414
        'test': lambda _: True,
415 416 417 418 419 420 421 422 423
        'pic': 'icone_zerobin',
        'title': _(u"Un outil minimaliste pour partager du texte"),
    },
    {
        'url': 'https://phabricator.crans.org',
        'category': 'Divers',
        'label': _(u'Phabricator'),
        'test': lambda _: True,
        'pic': 'icone_phabricator',
424
        'title': _(u"Un gestionnaire de tâches ouvert à tous"),
425
    },
426 427 428 429 430 431 432 433
    {
        'url': 'https://ethercalc.crans.org/',
        'category': 'Divers',
        'label': _(u'Ethercalc'),
        'test': lambda _: True,
        'pic': 'icone_ethercalc',
        'title': _(u"Une interface web pour faire de l'édition collaborative de tableur"),
    },
434 435 436 437 438 439 440 441
    {
        'url': 'https://discourse.crans.org/',
        'category': 'Services',
        'label': _(u'Discourse'),
        'test': lambda _: True,
        'pic': 'icone_discourse',
        'title': _(u"Forum Discourse"),
    },
442 443 444 445 446 447 448 449
    {
        'url': 'https://limesurvey.crans.org/',
        'category': 'Services',
        'label': _(u'Limesurvey'),
        'test': lambda _: True,
        'pic': 'icone_limesurvey',
        'title': _(u"Une interface web pour l'élaboration d'enquêtes et questionnaire"),
    },
450 451 452 453 454 455 456 457 458 459 460 461 462
)

#REDIRECT_SERVICES = tuple([i.update({'name' : 'redirect/%s' % i['url']}) or i for i in REDIRECT_SERVICES ])
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.sites',
    'django.contrib.admin',
    'django.contrib.staticfiles',
    #'south',
    'reversion',
463
    'custom_shortcuts',
464
    'printer',
465
    'intranet',
466
) + tuple( app.get('module', app['name']) for app in INTRANET_APPS )
467

468 469 470
if CAS_ENABLED:
    INSTALLED_APPS = INSTALLED_APPS + ('django_cas_ng',)

471
# Config de l'app d'impressions
472
MAX_PRINTFILE_SIZE=150 * 1024 * 1024 # 25Mio
473 474 475 476 477 478 479 480 481 482 483 484 485

###############################################################################
# Django >= 1.6
###############################################################################
CSRF_HTTP_ONLY = True


###############################################################################
# Django >= 1.7
###############################################################################
SESSION_COOKIE_SECURE = not DEBUG

SILENCED_SYSTEM_CHECKS = ["1_6.W001"]
486 487 488 489 490 491

###############################################################################
# Performance
###############################################################################
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

492 493
#Message global à afficher sur le site
GLOBAL_MESSAGES = None