added pyramid_mailer to send contact form

This commit is contained in:
2022-05-04 11:29:45 +02:00
parent e7bebbe5e4
commit 58cea3a3a9
9 changed files with 76 additions and 24 deletions

Binary file not shown.

View File

@@ -2,6 +2,7 @@ from pyramid.config import Configurator
from pyramid.authentication import AuthTktAuthenticationPolicy from pyramid.authentication import AuthTktAuthenticationPolicy
from pyramid.authorization import ACLAuthorizationPolicy from pyramid.authorization import ACLAuthorizationPolicy
from pyramid.session import SignedCookieSessionFactory from pyramid.session import SignedCookieSessionFactory
from pyramid_mailer import mailer_factory_from_settings
from .services.user import groupfinder from .services.user import groupfinder
@@ -11,14 +12,15 @@ def main(global_config, **settings):
""" """
# session factory # session factory
my_session_factory = SignedCookieSessionFactory('mGcAJn2HmNH6Hc') my_session_factory = SignedCookieSessionFactory('mGcAJn2HmNH6Hc')
authentication_policy = AuthTktAuthenticationPolicy('wMWvAWMZnp6Lch', authentication_policy = AuthTktAuthenticationPolicy('wMWvAWMZnp6Lch',
callback=groupfinder, hashalg='sha512', timeout=36000) callback=groupfinder, hashalg='sha512', timeout=36000)
authorization_policy = ACLAuthorizationPolicy() authorization_policy = ACLAuthorizationPolicy()
with Configurator(settings=settings, with Configurator(settings=settings,
root_factory='cao_blogr.security.RootFactory', root_factory='cao_blogr.security.RootFactory',
authentication_policy=authentication_policy, authentication_policy=authentication_policy,
authorization_policy=authorization_policy) as config: authorization_policy=authorization_policy) as config:
config.registry['mailer'] = mailer_factory_from_settings(settings)
config.include('pyramid_jinja2') config.include('pyramid_jinja2')
config.include('.models') config.include('.models')
config.include('.routes') config.include('.routes')

View File

@@ -1,6 +1,6 @@
from wtforms import Form, StringField, TextAreaField, SelectField from wtforms import Form, StringField, TextAreaField, SelectField
from wtforms import IntegerField, PasswordField from wtforms import IntegerField, PasswordField
from wtforms.validators import InputRequired, Length from wtforms.validators import InputRequired, Length, Email
from wtforms.widgets import HiddenInput from wtforms.widgets import HiddenInput
strip_filter = lambda x: x.strip() if x else None strip_filter = lambda x: x.strip() if x else None
@@ -25,3 +25,10 @@ class UserCreateForm(Form):
filters=[strip_filter]) filters=[strip_filter])
password = PasswordField('Mot de passe', validators=[InputRequired(), Length(min=6)]) password = PasswordField('Mot de passe', validators=[InputRequired(), Length(min=6)])
class ContactForm(Form):
name = StringField('Nom', validators=[InputRequired(), Length(min=1, max=255)],
filters=[strip_filter])
email = StringField('Email', validators=[InputRequired(), Length(min=1, max=255), Email()],
filters=[strip_filter])
comments = TextAreaField('Message', validators=[InputRequired(), Length(min=1)],
filters=[strip_filter])

View File

@@ -31,7 +31,7 @@ class BlogRecordService(object):
@classmethod @classmethod
def get_last_five(cls, request): def get_last_five(cls, request):
# gest the last 5 items modified # gest the last 5 items modified
query = request.dbsession.query(BlogRecord) query = request.dbsession.query(BlogRecord).filter(BlogRecord.topic_id != 'ADM')
query = query.order_by(sa.desc(BlogRecord.edited)).limit(5).all() query = query.order_by(sa.desc(BlogRecord.edited)).limit(5).all()
return query return query

View File

@@ -78,7 +78,7 @@
<img src="{{ request.static_url('cao_blogr:static/ni-su.jpg') }}" class="img-circle person" alt="Médiation Sunyata" width="255" height="255"> <img src="{{ request.static_url('cao_blogr:static/ni-su.jpg') }}" class="img-circle person" alt="Médiation Sunyata" width="255" height="255">
</a> </a>
<p><b>La Méditation SUNYATA</p></b> <p><b>La Méditation SUNYATA</p></b>
<p>développée par le maître zen Thích Thông Triệt, combine les enseignements essentiels du <b>processus de réalisation et d'illumination du Bouddha</b>, les <b>pratiques des 3 traditions du bouddhisme</b> (Theravāda, Mahayana, le Zen), et les <b>découvertes de la neuro-sciences</b>.</p> <p>développée par le maître zen Thích Thông Triệt, combine les enseignements essentiels du <b>processus de réalisation et d'illumination du Bouddha</b>, les <b>pratiques des 3 traditions du bouddhisme</b> (Theravāda, Mahayana et Zen), et les <b>découvertes de la neuro-sciences</b>.</p>
</div> </div>
<div class="col-xs-4"> <div class="col-xs-4">
<a href="#demo2"> <a href="#demo2">
@@ -169,7 +169,6 @@
<div id="contact"> <div id="contact">
<br > <br >
<h2 class="text-center">CONTACT</h2> <h2 class="text-center">CONTACT</h2>
<p class="text-center"><em>Laissez nous un message!</em></p>
<div class="row"> <div class="row">
<div class="col-xs-4"> <div class="col-xs-4">
@@ -179,22 +178,23 @@
</p> </p>
</div> </div>
<div class="col-xs-8"> <div class="col-xs-8">
<p><em>Laissez nous un message!</em></p>
<div class="row"> <div class="row">
<div class="col-xs-6 form-group"> <form action="{{ request.route_url('home') }}" method="POST" class="form">
<input class="form-control" id="name" name="name" placeholder="Nom et prénom" type="text" required> <div class="col-xs-6 form-group">
</div> <input class="form-control" id="name" name="name" placeholder="Nom et prénom" required
<div class="col-xs-6 form-group"> type="text" value="{{name}}">
<input class="form-control" id="email" name="email" placeholder="Email" type="email" required> </div>
</div> <div class="col-xs-6 form-group">
<input class="form-control" id="email" name="email" placeholder="Email" required
type="email" value="{{email}} ">
</div>
</div>
<textarea class="form-control" id="comments" name="comments" placeholder="Message" required rows="5"></textarea>
<br>
<button class="btn btn-primary" type="submit" name="form.submitted">Envoyer</button>
</form>
</div> </div>
<textarea class="form-control" id="comments" name="comments" placeholder="Message" rows="5"></textarea>
<br>
<div class="row">
<div class="col-xs-12 form-group">
<button class="btn pull-right" type="submit">Envoyer</button>
</div>
</div>
</div>
</div> </div>
</div> </div>

View File

@@ -1,9 +1,11 @@
from pyramid.view import view_config from pyramid.view import view_config
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
from pyramid.security import remember, forget from pyramid.security import remember, forget
from pyramid_mailer.message import Message
from ..services.user import UserService from ..services.user import UserService
from ..services.blog_record import BlogRecordService from ..services.blog_record import BlogRecordService
from ..forms import UserCreateForm from ..forms import UserCreateForm, ContactForm
from ..models.user import User from ..models.user import User
@@ -22,14 +24,46 @@ def home(request):
dir + '/S18.jpg', dir + '/S18.jpg',
dir + '/S21.jpg', dir + '/S21.jpg',
dir + '/S25.jpg'] dir + '/S25.jpg']
page = int(request.params.get('page', 1))
# get the 5 last modified posts # get the 5 last modified posts
last_five = BlogRecordService.get_last_five(request) last_five = BlogRecordService.get_last_five(request)
name = ''
email = ''
comments = ''
if 'form.submitted' in request.params :
name = request.params['name']
email = request.params['email']
comments = request.params['comments']
body = """
Bonjour,
L' expéditeur : {0} ( {1} )
a envoyé le message suivant du site "meditation-sunyata.paris"
----- Début du message -----
{2}
----- Fin du message -----
Le site "meditation-sunyata.paris"
""".format(name, email, comments)
message = Message(subject="[MSParis] Message de contact",
sender=request.registry.settings['cao_blogr.admin_email'],
body=body)
message.add_recipient('phuoc@caotek.fr')
mailer = request.registry['mailer']
mailer.send_immediately(message)
message = "Votre message a bien été envoyé au webmestre. Merci de votre intérêt pour notre site"
return { return {
'page_title': "", 'page_title': "",
'last_five': last_five, 'last_five': last_five,
'car_images': car_images, 'car_images': car_images,
'name': name,
'email': email,
'comments': comments,
} }

View File

@@ -16,6 +16,11 @@ pyramid.includes =
sqlalchemy.url = sqlite:///%(here)s/cao_blogr.sqlite sqlalchemy.url = sqlite:///%(here)s/cao_blogr.sqlite
cao_blogr.admin_email = cao.thien-phuoc@orange.fr
# Mailer configuration
mail.host = smtp.orange.fr
mail.port = 25
retry.attempts = 3 retry.attempts = 3
# By default, the toolbar only appears for clients from IP addresses # By default, the toolbar only appears for clients from IP addresses

View File

@@ -14,6 +14,11 @@ pyramid.default_locale_name = en
sqlalchemy.url = sqlite:///%(here)s/cao_blogr.sqlite sqlalchemy.url = sqlite:///%(here)s/cao_blogr.sqlite
cao_blogr.admin_email = phuoc@caotek.fr
# Mailer configuration
mail.host = localhost
mail.port = 25
retry.attempts = 3 retry.attempts = 3
[pshell] [pshell]

View File

@@ -15,6 +15,7 @@ requires = [
'pyramid_debugtoolbar', 'pyramid_debugtoolbar',
'waitress', 'waitress',
'alembic', 'alembic',
'pyramid_mailer',
'pyramid_retry', 'pyramid_retry',
'pyramid_tm', 'pyramid_tm',
'SQLAlchemy', 'SQLAlchemy',
@@ -22,8 +23,6 @@ requires = [
'zope.sqlalchemy', 'zope.sqlalchemy',
'wtforms==2.2.1', # form library 'wtforms==2.2.1', # form library
'webhelpers2==2.0', # various web building related helpers 'webhelpers2==2.0', # various web building related helpers
'paginate==0.5.6', # pagination helpers
'paginate_sqlalchemy==0.3.0',
'passlib', 'passlib',
] ]