Added mail handling
removed tests routes for production
This commit is contained in:
+22
-4
@@ -4,11 +4,29 @@ JM2L README
|
|||||||
Getting Started
|
Getting Started
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
- cd <directory containing this file>
|
Let's install JM2L event website :
|
||||||
|
|
||||||
- $VENV/bin/python setup.py develop
|
First we create a virtualenv
|
||||||
|
|
||||||
- $VENV/bin/initialize_JM2L_db development.ini
|
virtualenv --no-site-packages jm2l_venv
|
||||||
|
|
||||||
|
source jm2l_venv/bin/activate
|
||||||
|
|
||||||
- $VENV/bin/pserve development.ini
|
git clone http://git.style-python.fr/jm2l/
|
||||||
|
|
||||||
|
cd jm2l
|
||||||
|
|
||||||
|
python setup.py develop
|
||||||
|
|
||||||
|
initialize_JM2L_db development.ini
|
||||||
|
|
||||||
|
pserve development.ini
|
||||||
|
|
||||||
|
If no error occurs, the webserver should be available on http://localhost:8080/
|
||||||
|
|
||||||
|
|
||||||
|
source jm2l_venv/bin/activate
|
||||||
|
cd jm2l
|
||||||
|
pserve development.ini
|
||||||
|
|
||||||
|
Enjoy !
|
||||||
@@ -6,12 +6,16 @@
|
|||||||
[app:main]
|
[app:main]
|
||||||
use = egg:JM2L
|
use = egg:JM2L
|
||||||
|
|
||||||
|
mail.host = localhost
|
||||||
|
mail.port = 25
|
||||||
|
|
||||||
pyramid.reload_templates = true
|
pyramid.reload_templates = true
|
||||||
pyramid.debug_authorization = false
|
pyramid.debug_authorization = false
|
||||||
pyramid.debug_notfound = false
|
pyramid.debug_notfound = false
|
||||||
pyramid.debug_routematch = false
|
pyramid.debug_routematch = false
|
||||||
pyramid.default_locale_name = en
|
pyramid.default_locale_name = en
|
||||||
pyramid.includes =
|
pyramid.includes =
|
||||||
|
pyramid_mailer.testing
|
||||||
pyramid_debugtoolbar
|
pyramid_debugtoolbar
|
||||||
pyramid_tm
|
pyramid_tm
|
||||||
pyramid_mako
|
pyramid_mako
|
||||||
|
|||||||
+3
-19
@@ -7,6 +7,7 @@ from sqlalchemy import engine_from_config
|
|||||||
from pyramid.renderers import render_to_response
|
from pyramid.renderers import render_to_response
|
||||||
from .models import DBSession, get_user
|
from .models import DBSession, get_user
|
||||||
from .security import EntryFactory, groupfinder
|
from .security import EntryFactory, groupfinder
|
||||||
|
from pyramid_mailer import mailer_factory_from_settings
|
||||||
import locale
|
import locale
|
||||||
|
|
||||||
def main(global_config, **settings):
|
def main(global_config, **settings):
|
||||||
@@ -28,6 +29,7 @@ def main(global_config, **settings):
|
|||||||
authentication_policy=authentication_policy,
|
authentication_policy=authentication_policy,
|
||||||
authorization_policy=authorization_policy
|
authorization_policy=authorization_policy
|
||||||
)
|
)
|
||||||
|
config.registry['mailer'] = mailer_factory_from_settings(settings)
|
||||||
config.add_renderer('json', JSON(indent=4))
|
config.add_renderer('json', JSON(indent=4))
|
||||||
config.add_renderer('jsonp', JSONP(param_name='callback'))
|
config.add_renderer('jsonp', JSONP(param_name='callback'))
|
||||||
config.set_session_factory(my_session_factory)
|
config.set_session_factory(my_session_factory)
|
||||||
@@ -38,9 +40,7 @@ def main(global_config, **settings):
|
|||||||
config.add_static_view('js', 'static/js', cache_max_age=3600)
|
config.add_static_view('js', 'static/js', cache_max_age=3600)
|
||||||
config.add_static_view('vendor', 'static/vendor', cache_max_age=3600)
|
config.add_static_view('vendor', 'static/vendor', cache_max_age=3600)
|
||||||
config.add_static_view('upload', 'upload', cache_max_age=3600)
|
config.add_static_view('upload', 'upload', cache_max_age=3600)
|
||||||
|
|
||||||
config.add_route('tester', '/tester')
|
|
||||||
|
|
||||||
# ICal Routes
|
# ICal Routes
|
||||||
config.add_route('progr_iCal', '/{year:\d+}/JM2L.ics')
|
config.add_route('progr_iCal', '/{year:\d+}/JM2L.ics')
|
||||||
|
|
||||||
@@ -99,25 +99,9 @@ def main(global_config, **settings):
|
|||||||
config.add_route('bymail', '/sign/jm2l/{hash}')
|
config.add_route('bymail', '/sign/jm2l/{hash}')
|
||||||
|
|
||||||
# Handle Multimedia and Uploads
|
# Handle Multimedia and Uploads
|
||||||
config.add_route('media_uploadform', '/test2')
|
|
||||||
config.add_route('media_view', '/image/{media_table:\w+}/{uid:\d+}/{name:.+}')
|
config.add_route('media_view', '/image/{media_table:\w+}/{uid:\d+}/{name:.+}')
|
||||||
config.add_route('media_upload', '/uploader/{media_table:\w+}/{uid:\d+}/proceed{sep:/*}{name:.*}')
|
config.add_route('media_upload', '/uploader/{media_table:\w+}/{uid:\d+}/proceed{sep:/*}{name:.*}')
|
||||||
|
|
||||||
# To Trash routes
|
|
||||||
config.add_route('test', '/test')
|
|
||||||
config.add_route('test2', '/toast{sep:/*}{uid:(\d+)?}')
|
|
||||||
|
|
||||||
#config.add_route('link_user_entity', '/entity/{uid:(\d+)}/{year:\d+}/user/{user_id:(\d+)}')
|
|
||||||
#config.add_route('link_role_entity', '/entity/{uid:(\d+)}/{year:\d+}/role/{role_id:(\d+)}')
|
|
||||||
|
|
||||||
|
|
||||||
config.add_route('IntAdd', '/IntAdd/{modtype:\w+}')
|
|
||||||
config.add_route('IntProp', '/IntProp/{modtype:\w+}')
|
|
||||||
|
|
||||||
config.add_route('blog', '/blog/{id:\d+}/{slug}')
|
|
||||||
config.add_route('blog_action', '/blog/{action}',
|
|
||||||
factory='jm2l.security.EntryFactory')
|
|
||||||
|
|
||||||
config.scan()
|
config.scan()
|
||||||
return config.make_wsgi_app()
|
return config.make_wsgi_app()
|
||||||
|
|
||||||
|
|||||||
+5
-1
@@ -2,7 +2,7 @@
|
|||||||
from pyramid.view import view_config
|
from pyramid.view import view_config
|
||||||
from pyramid.security import remember, forget
|
from pyramid.security import remember, forget
|
||||||
from pyramid.httpexceptions import HTTPFound
|
from pyramid.httpexceptions import HTTPFound
|
||||||
from .models import User
|
from .models import User, DBSession
|
||||||
|
|
||||||
@view_config(route_name='auth', match_param="action=login", renderer="jm2l:templates/login.mako")
|
@view_config(route_name='auth', match_param="action=login", renderer="jm2l:templates/login.mako")
|
||||||
def login(request):
|
def login(request):
|
||||||
@@ -13,6 +13,8 @@ def bymail(request):
|
|||||||
myhash = request.matchdict.get('hash', "")
|
myhash = request.matchdict.get('hash', "")
|
||||||
user = User.by_hash(myhash)
|
user = User.by_hash(myhash)
|
||||||
if user:
|
if user:
|
||||||
|
user.last_logged=datetime.datetime.now()
|
||||||
|
DBSession.merge(user)
|
||||||
headers = remember(request, user.uid)
|
headers = remember(request, user.uid)
|
||||||
return HTTPFound(location=request.route_url('jm2l'),
|
return HTTPFound(location=request.route_url('jm2l'),
|
||||||
headers=headers)
|
headers=headers)
|
||||||
@@ -29,6 +31,8 @@ def sign_in_out(request):
|
|||||||
if username:
|
if username:
|
||||||
user = User.by_name(username)
|
user = User.by_name(username)
|
||||||
if user and user.verify_password(request.POST.get('password')):
|
if user and user.verify_password(request.POST.get('password')):
|
||||||
|
user.last_logged=datetime.datetime.now()
|
||||||
|
DBSession.merge(user)
|
||||||
headers = remember(request, user.uid)
|
headers = remember(request, user.uid)
|
||||||
return HTTPFound(location=request.route_url('jm2l'),
|
return HTTPFound(location=request.route_url('jm2l'),
|
||||||
headers=headers)
|
headers=headers)
|
||||||
|
|||||||
+28
-28
@@ -87,10 +87,10 @@ class JM2L_Year(Base):
|
|||||||
description = Column(UnicodeText)
|
description = Column(UnicodeText)
|
||||||
doss_presse = Column(UnicodeText)
|
doss_presse = Column(UnicodeText)
|
||||||
state = Column(Enum('Archived', 'Cancelled', 'Ongoing'))
|
state = Column(Enum('Archived', 'Cancelled', 'Ongoing'))
|
||||||
start_time = Column(DateTime, default=datetime.datetime.utcnow)
|
start_time = Column(DateTime, default=datetime.datetime.now)
|
||||||
end_time = Column(DateTime, default=datetime.datetime.utcnow)
|
end_time = Column(DateTime, default=datetime.datetime.now)
|
||||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
created = Column(DateTime, default=datetime.datetime.now)
|
||||||
last_change = Column(DateTime, default=datetime.datetime.utcnow)
|
last_change = Column(DateTime, default=datetime.datetime.now)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def AvailableTimeSlots(self, TimeStep=30):
|
def AvailableTimeSlots(self, TimeStep=30):
|
||||||
@@ -121,9 +121,9 @@ class User(Base):
|
|||||||
fonction = Column(Unicode(80))
|
fonction = Column(Unicode(80))
|
||||||
website = Column(Unicode(100))
|
website = Column(Unicode(100))
|
||||||
phone = Column(Unicode(10))
|
phone = Column(Unicode(10))
|
||||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
created = Column(DateTime, default=datetime.datetime.now)
|
||||||
last_logged = Column(DateTime, default=datetime.datetime.utcnow)
|
last_logged = Column(DateTime, default=datetime.datetime.now)
|
||||||
last_change = Column(DateTime, default=datetime.datetime.utcnow)
|
last_change = Column(DateTime, default=datetime.datetime.now)
|
||||||
active = Column(Integer, default=1)
|
active = Column(Integer, default=1)
|
||||||
bio = Column(UnicodeText)
|
bio = Column(UnicodeText)
|
||||||
gpg_key = Column(UnicodeText)
|
gpg_key = Column(UnicodeText)
|
||||||
@@ -231,8 +231,8 @@ class Tiers(Base):
|
|||||||
description = Column(UnicodeText)
|
description = Column(UnicodeText)
|
||||||
website = Column(Unicode(100))
|
website = Column(Unicode(100))
|
||||||
tiers_type = Column(Integer, ForeignKey('tiers_opt.uid'), default=1)
|
tiers_type = Column(Integer, ForeignKey('tiers_opt.uid'), default=1)
|
||||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
created = Column(DateTime, default=datetime.datetime.now)
|
||||||
last_change = Column(DateTime, default=datetime.datetime.utcnow)
|
last_change = Column(DateTime, default=datetime.datetime.now)
|
||||||
# relations
|
# relations
|
||||||
ent_type = relationship('TiersOpt')
|
ent_type = relationship('TiersOpt')
|
||||||
#members = relationship('User', secondary='user_tiers_link' )
|
#members = relationship('User', secondary='user_tiers_link' )
|
||||||
@@ -307,7 +307,7 @@ class Media(Base):
|
|||||||
height = Column(Integer)
|
height = Column(Integer)
|
||||||
length = Column(Integer)
|
length = Column(Integer)
|
||||||
filename = Column(UnicodeText)
|
filename = Column(UnicodeText)
|
||||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
created = Column(DateTime, default=datetime.datetime.now)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def get_path(self):
|
def get_path(self):
|
||||||
@@ -334,8 +334,8 @@ class Salles(Base):
|
|||||||
name = Column(Unicode(40))
|
name = Column(Unicode(40))
|
||||||
place_type = Column(Enum('Conference', 'Stand', 'Ateliers', 'Autres'))
|
place_type = Column(Enum('Conference', 'Stand', 'Ateliers', 'Autres'))
|
||||||
description = Column(UnicodeText) # Description du matériel disponible
|
description = Column(UnicodeText) # Description du matériel disponible
|
||||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
created = Column(DateTime, default=datetime.datetime.now)
|
||||||
last_change = Column(DateTime, default=datetime.datetime.utcnow)
|
last_change = Column(DateTime, default=datetime.datetime.now)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def by_id(cls, uid):
|
def by_id(cls, uid):
|
||||||
@@ -358,8 +358,8 @@ class Place(Base):
|
|||||||
website = Column(Unicode(100))
|
website = Column(Unicode(100))
|
||||||
description = Column(UnicodeText)
|
description = Column(UnicodeText)
|
||||||
created_by = Column(Integer, ForeignKey('users.user_id'))
|
created_by = Column(Integer, ForeignKey('users.user_id'))
|
||||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
created = Column(DateTime, default=datetime.datetime.now)
|
||||||
last_change = Column(DateTime, default=datetime.datetime.utcnow)
|
last_change = Column(DateTime, default=datetime.datetime.now)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def by_id(cls, uid):
|
def by_id(cls, uid):
|
||||||
@@ -389,8 +389,8 @@ class Itineraire(Base):
|
|||||||
tr_avion = Column(Boolean, default=False)
|
tr_avion = Column(Boolean, default=False)
|
||||||
description = Column(UnicodeText)
|
description = Column(UnicodeText)
|
||||||
created_by = Column(Integer, ForeignKey('users.user_id')) # User link
|
created_by = Column(Integer, ForeignKey('users.user_id')) # User link
|
||||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
created = Column(DateTime, default=datetime.datetime.now)
|
||||||
last_change = Column(DateTime, default=datetime.datetime.utcnow)
|
last_change = Column(DateTime, default=datetime.datetime.now)
|
||||||
# relations
|
# relations
|
||||||
start = relationship(Place, foreign_keys=[start_place])
|
start = relationship(Place, foreign_keys=[start_place])
|
||||||
arrival = relationship(Place, foreign_keys=[arrival_place])
|
arrival = relationship(Place, foreign_keys=[arrival_place])
|
||||||
@@ -413,8 +413,8 @@ class Exchange(Base):
|
|||||||
# Users
|
# Users
|
||||||
asker_id = Column(Integer, ForeignKey('users.uid')) # User link
|
asker_id = Column(Integer, ForeignKey('users.uid')) # User link
|
||||||
provider_id = Column(Integer, ForeignKey('users.uid')) # User link
|
provider_id = Column(Integer, ForeignKey('users.uid')) # User link
|
||||||
start_time = Column(DateTime, default=datetime.datetime.utcnow)
|
start_time = Column(DateTime, default=datetime.datetime.now)
|
||||||
end_time = Column(DateTime, default=datetime.datetime.utcnow)
|
end_time = Column(DateTime, default=datetime.datetime.now)
|
||||||
# Co-voiturage
|
# Co-voiturage
|
||||||
itin_id = Column(Integer, ForeignKey('itineraire.itin_id')) # Itineraire link
|
itin_id = Column(Integer, ForeignKey('itineraire.itin_id')) # Itineraire link
|
||||||
# Hebergement
|
# Hebergement
|
||||||
@@ -424,8 +424,8 @@ class Exchange(Base):
|
|||||||
description = Column(UnicodeText)
|
description = Column(UnicodeText)
|
||||||
pictures = Column(Unicode(80))
|
pictures = Column(Unicode(80))
|
||||||
created_by = Column(Integer) # User link
|
created_by = Column(Integer) # User link
|
||||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
created = Column(DateTime, default=datetime.datetime.now)
|
||||||
last_change = Column(DateTime, default=datetime.datetime.utcnow)
|
last_change = Column(DateTime, default=datetime.datetime.now)
|
||||||
# relations
|
# relations
|
||||||
Category = relationship(Exchange_Cat, backref="exchanges")
|
Category = relationship(Exchange_Cat, backref="exchanges")
|
||||||
Itin = relationship(Itineraire, backref="exchanged")
|
Itin = relationship(Itineraire, backref="exchanged")
|
||||||
@@ -517,8 +517,8 @@ class Sejour(Base):
|
|||||||
arrival_place = Column(Integer, ForeignKey('place.place_id')) # Place link
|
arrival_place = Column(Integer, ForeignKey('place.place_id')) # Place link
|
||||||
depart_time = Column(DateTime)
|
depart_time = Column(DateTime)
|
||||||
depart_place = Column(Integer, ForeignKey('place.place_id')) # Place link
|
depart_place = Column(Integer, ForeignKey('place.place_id')) # Place link
|
||||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
created = Column(DateTime, default=datetime.datetime.now)
|
||||||
last_change = Column(DateTime, default=datetime.datetime.utcnow)
|
last_change = Column(DateTime, default=datetime.datetime.now)
|
||||||
|
|
||||||
class Event(Base):
|
class Event(Base):
|
||||||
__tablename__ = 'events'
|
__tablename__ = 'events'
|
||||||
@@ -529,11 +529,11 @@ class Event(Base):
|
|||||||
name = Column(Unicode(100), nullable=False)
|
name = Column(Unicode(100), nullable=False)
|
||||||
slug = Column(Unicode(100))
|
slug = Column(Unicode(100))
|
||||||
event_type = Column(Enum('Stand', 'Table ronde', 'Atelier', 'Concert', 'Conference', 'Repas'))
|
event_type = Column(Enum('Stand', 'Table ronde', 'Atelier', 'Concert', 'Conference', 'Repas'))
|
||||||
start_time = Column(DateTime, default=datetime.datetime.utcnow)
|
start_time = Column(DateTime, default=datetime.datetime.now)
|
||||||
end_time = Column(DateTime, default=datetime.datetime.utcnow)
|
end_time = Column(DateTime, default=datetime.datetime.now)
|
||||||
description = Column(UnicodeText)
|
description = Column(UnicodeText)
|
||||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
created = Column(DateTime, default=datetime.datetime.now)
|
||||||
last_change = Column(DateTime, default=datetime.datetime.utcnow)
|
last_change = Column(DateTime, default=datetime.datetime.now)
|
||||||
intervenants = relationship(User,
|
intervenants = relationship(User,
|
||||||
secondary='user_event_link',
|
secondary='user_event_link',
|
||||||
backref=backref('participate', uselist=False),
|
backref=backref('participate', uselist=False),
|
||||||
@@ -581,8 +581,8 @@ class Entry(Base):
|
|||||||
active = Column(Integer, default=True)
|
active = Column(Integer, default=True)
|
||||||
title = Column(Unicode(255), unique=True, nullable=False)
|
title = Column(Unicode(255), unique=True, nullable=False)
|
||||||
body = Column(UnicodeText, default=u'')
|
body = Column(UnicodeText, default=u'')
|
||||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
created = Column(DateTime, default=datetime.datetime.now)
|
||||||
edited = Column(DateTime, default=datetime.datetime.utcnow)
|
edited = Column(DateTime, default=datetime.datetime.now)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def all(cls):
|
def all(cls):
|
||||||
|
|||||||
@@ -11,4 +11,42 @@
|
|||||||
<!-- The default timeline stylesheet -->
|
<!-- The default timeline stylesheet -->
|
||||||
<link rel="stylesheet" href="/vendor/timeline/css/timeline.css" />
|
<link rel="stylesheet" href="/vendor/timeline/css/timeline.css" />
|
||||||
</%def>
|
</%def>
|
||||||
<div id="timeline" style="margin-left: -50px;"></div>
|
<div id="timeline" style="margin-left: -50px;display:block;"></div>
|
||||||
|
<div class="clearfix"> </div>
|
||||||
|
<div style="top:500px;position: relative">
|
||||||
|
<p>
|
||||||
|
Le 28 Novembre 2015 aura lieu la 9e édition des Journées Méditerranéennes du Logiciel Libre (JM2LL) à
|
||||||
|
Sophia-Antipolis destinées tout public (http://jm2l.linux-azur.org/).
|
||||||
|
<br>
|
||||||
|
Le thème de cette année sera « Do It Yourself » ou « Faîtes le vous-même » :
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>Migration vers les logiciels libres</li>
|
||||||
|
<li>Libres enfants du numérique : jeux et loisirs pour les juniors.</li>
|
||||||
|
<li>Gérer ses données personnelles</li>
|
||||||
|
<li>Do It Yourself (jeux vidéos, fablabs…)</li>
|
||||||
|
<li>Culture libre</li>
|
||||||
|
<li>Communautés du libre</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Nous faisons appel aux acteurs du numérique libre pour alimenter le programme des conférences/ateliers :
|
||||||
|
si vous souhaitez échanger avec le public et partager un bon moment avec la communauté, inscrivez-vous !
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Nous vous proposons cinq formats de contribution :
|
||||||
|
<ul>
|
||||||
|
<li>Stands au sein du village associatif</li>
|
||||||
|
<li>Conférences de 20 ou 40 minutes suivies d’un échange</li>
|
||||||
|
<li>Ateliers de 45 minutes ou 1h15</li>
|
||||||
|
<li>Démos de vos matériels, logiciels ou projets libres</li>
|
||||||
|
<li>Animations ouvertes</li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Il sera bien sûr possible de combiner plusieurs formats (par exemple, une démo ou une conférence suivie
|
||||||
|
d’un atelier).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Vous pouvez nous faire parvenir vos propositions directement via le menu participer.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<div id="Photos">
|
<div id="Photos">
|
||||||
${helpers.show_my_pictures(uprofil)}
|
${helpers.show_my_pictures(uprofil)}
|
||||||
</div>
|
</div>
|
||||||
<a href="/sign/jm2l/${uprofil.my_hash}">Mon lien</a>
|
<a href="/sign/jm2l/${uprofil.my_hash}">Mon lien</a>
|
||||||
<h3>${profil_form.prenom.data} ${profil_form.nom.data}</h3>
|
<h3>${profil_form.prenom.data} ${profil_form.nom.data}</h3>
|
||||||
|
|
||||||
##<form id="ProfilForm" action="javascript:DoPost('/2015/modal/Place/${form.place_id.data}');">
|
##<form id="ProfilForm" action="javascript:DoPost('/2015/modal/Place/${form.place_id.data}');">
|
||||||
|
|||||||
@@ -6,12 +6,16 @@
|
|||||||
[app:main]
|
[app:main]
|
||||||
use = egg:JM2L
|
use = egg:JM2L
|
||||||
|
|
||||||
|
mail.host = localhost
|
||||||
|
mail.port = 25
|
||||||
|
|
||||||
pyramid.reload_templates = false
|
pyramid.reload_templates = false
|
||||||
pyramid.debug_authorization = false
|
pyramid.debug_authorization = false
|
||||||
pyramid.debug_notfound = false
|
pyramid.debug_notfound = false
|
||||||
pyramid.debug_routematch = false
|
pyramid.debug_routematch = false
|
||||||
pyramid.default_locale_name = fr
|
pyramid.default_locale_name = fr
|
||||||
pyramid.includes =
|
pyramid.includes =
|
||||||
|
pyramid_mailer
|
||||||
pyramid_tm
|
pyramid_tm
|
||||||
pyramid_mako
|
pyramid_mako
|
||||||
pyramid_exclog
|
pyramid_exclog
|
||||||
|
|||||||
Reference in New Issue
Block a user