added celery task queue

This commit is contained in:
Ruidy Nemausat 2020-01-03 13:10:06 +01:00
parent 5f6a3f752e
commit eea16b3eb0
11 changed files with 187 additions and 70 deletions

View file

@ -29,15 +29,17 @@ Le visiteur doit pouvoir :
### Back-end
- `Django 3.0`
- `PostgreSQL`
- `Django 3.0` python based web application
- `PostgreSQL` object-relational database
- `Celery` asynchronous task queue
- `RabbitMQ` messaging broker
- `NginX` reverse-proxy & static files server
- `Docker`
- `NginX`
- Google Calendar API
### Hébergement
- Virtual Private Server
- VPS on [Vultr](https://my.vultr.com/subs/?SUBID=32140017)
## Pages
@ -98,8 +100,8 @@ Le visiteur doit pouvoir :
## TO DO
- Gestion du calendrier
..\_ Tester la synchro avec Google calendar
..\_ Ajouter un date picker dans le formulaire de réservation, changer les placeholders (j'ai pas envie de jouer avec JQuery)
- Tester la synchro avec Google calendar
- Ajouter un date picker dans le formulaire de réservation, changer les placeholders (j'ai pas envie de jouer avec JQuery)
- Envoyer devis réservation par mail et notification aux hôtes (put it in a background process, personnaliser les htmails : contact, admin et réservation)
- Ajout page/module de paiement
- ajouter les témoignages depuis Booking, AirBnb, ajouter le lien
@ -117,8 +119,10 @@ Le visiteur doit pouvoir :
- Système de facturation: CRUD Réservations et envoi. Automatisation si possible
- Réservation page : Ajouter des photos. Renvoyer vers la page Location onClick sur Réserver TX. Proposer Upsells : navette + location voiture.
- Vider le contenu du folder root ?
- Confirmation message contact envoyé
- Page confirmation message contact envoyé
- SSL certificate
## BUGS
- La synchro ne gère pas les heures dans le calendriers
- Bouton réserver dans la Navbar …

View file

@ -7,7 +7,7 @@ volumes:
services:
db:
image: postgres
image: postgres:alpine
environment:
POSTGRES_USER: villafleurie
POSTGRES_DB: villafleurie
@ -16,7 +16,8 @@ services:
- dbdata:/var/lib/postgresql/data
ports:
- 5432:5432
web:
web: &web
build: .
# command: bash -c "python manage.py migrate && python manage.py loaddata villafleurie.json && gunicorn -w 4 villafleurie.wsgi -b 0.0.0.0:8000"
command: bash -c "python manage.py migrate && gunicorn -w 4 villafleurie.wsgi -b 0.0.0.0:8000"
@ -28,7 +29,10 @@ services:
- "8000:8000"
depends_on:
- db
- rabbitmq
- celery
env_file: prod.env
nginx:
build:
context: .
@ -40,3 +44,14 @@ services:
- media:/media
depends_on:
- web
celery:
<<: *web
command: celery -A villafleurie worker --loglevel=info
ports: []
depends_on:
- rabbitmq
- db
rabbitmq:
image: rabbitmq:alpine

View file

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -1,12 +1,11 @@
from __future__ import absolute_import, unicode_literals
from celery import shared_task
from django.core.mail import send_mail, mail_admins
from villafleurie.settings import EMAIL_HOST_USER, BASE_DIR
import os
# from celery import Celery
# app = Celery('mailing', brocker='amqp://localhost/')
# @app.task
@shared_task
def send_confirmation_mail(name, email, template="ticket"):
""" Send confirmation message to customer """
subject = "Nous avons reçu votre message"
@ -25,6 +24,7 @@ def send_confirmation_mail(name, email, template="ticket"):
)
@shared_task
def send_notification(subject, name, message, template="activation"):
""" Send notification to admins """
html_path = os.path.join(BASE_DIR, 'rental/templates/rental/html/')
@ -38,6 +38,7 @@ def send_notification(subject, name, message, template="activation"):
)
@shared_task
def send_quotation(reservation):
""" Send quotation to customer """
name = reservation.guest.name

View file

@ -0,0 +1,43 @@
{% extends 'rental/base.html' %} {% load static %} {% block content %}
<section class="intro-single">
<div class="container">
<div class="row">
<div class="col-md-12 col-lg-8">
<div class="title-single-box">
<h1 class="title-single">Oups ! Il n'y a rien ici …</h1>
<span class="color-text-a">Merci pour votre visite </span>
</div>
</div>
<div class="col-md-12 col-lg-4">
<nav
aria-label="breadcrumb"
class="breadcrumb-box d-flex justify-content-lg-end"
>
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{% url 'rental:index' %}">Accueil</a>
</li>
<li class="breadcrumb-item active" aria-current="page">
Non trouvé
</li>
</ol>
</nav>
</div>
</div>
<div class="property-summary">
<div class="row">
<div class="col-sm-12">
<div class="col-md-12 mb-1">
<img src="{% static 'rental/img/plan2.jpg' %}" alt="404 image" />
<a href="{% url 'rental:index' %}"
><button class="btn btn-a">Retour à l'accueil</button></a
>
</div>
</div>
</div>
</div>
</div>
</section>
{% endblock %}

View file

@ -72,7 +72,7 @@
</div>
<div class="icon-box-content">
<p class="mb-1">
Email :
✉️ Email :
<span class="color-a"
><a href="mailto:location.villafleurie@gmail.com"
>location.villafleurie@gmail.com</a
@ -80,7 +80,7 @@
>
</p>
<p class="mb-1">
📞Téléphone :
📞 Téléphone :
<span class="color-a"
><a href="tel:0698267634">06 98 26 76 34</a></span
>

View file

@ -1,83 +1,118 @@
{% extends 'rental/base.html'%}
{% load static %}
{% extends 'rental/base.html'%} {% load static %} {% block content %}
{% block content %}
<!--/ Intro Single star /-->
<section class="intro-single">
<div class="container">
<div class="row">
<div class="col-md-12 col-lg-8">
<div class="title-single-box">
<h1 class="title-single">Réservation</h1>
<span class="color-text-a">Vous souhaiter effectuer une demande de réservation ?
Vous avez des questions, des suggestions damélioration ou des commentaires ?
<br>Laissez-nous un message !</span>
</div>
</div>
<div class="col-md-12 col-lg-4">
<nav aria-label="breadcrumb" class="breadcrumb-box d-flex justify-content-lg-end">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{% url 'rental:index' %}">Accueil</a>
</li>
<li class="breadcrumb-item active" aria-current="page">
Réservation
</li>
</ol>
</nav>
<section class="intro-single">
<div class="container">
<div class="row">
<div class="col-md-12 col-lg-8">
<div class="title-single-box">
<h1 class="title-single">Réservation</h1>
<span class="color-text-a"
>Vous souhaiter effectuer une demande de réservation ? Vous avez des
questions, des suggestions damélioration ou des commentaires ?
<br />Laissez-nous un message !</span
>
</div>
</div>
<div class="col-md-12 col-lg-4">
<nav
aria-label="breadcrumb"
class="breadcrumb-box d-flex justify-content-lg-end"
>
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{% url 'rental:index' %}">Accueil</a>
</li>
<li class="breadcrumb-item active" aria-current="page">
Réservation
</li>
</ol>
</nav>
</div>
</div>
</section>
<!--/ Intro Single End /-->
<section class="property-single nav-arrow-b">
<div class="container">
<div class="col-md-12">
<p><strong>Réservez</strong>&nbsp;votre séjour au coeur de la station balnéaire du Gosier à deux pas des plages à un tarif sympa<strong>.</strong></p>
<p >Notre établissement propose à la location un <strong><a href="/T2/">cosy T2</a></strong> et un <strong><a href="/T3/">spacieux T3</a></strong>. Il est <strong>idéalement situé</strong> dans le bourg du Gosier. Ainsi profitez des <strong>plages et activités</strong> de la dynamique et chaleureuse ville du Gosier tout en bénéficiant du <strong>calme</strong> nécessaire à vos séances de&nbsp;<i>farniente.</i></p>
<p ><strong>Excellent rapport qualité/prix</strong> et une situation géographique qui convient parfaitement aux <strong>séjours touristiques et daffaires</strong>.<br>Possibilité de location mensuelle de moins de 4 mois à tarifs dégressifs.</p>
</div>
</section>
<section class="property-single nav-arrow-b">
<div class="container">
<div class="col-md-12">
<p>
<strong>Réservez</strong>&nbsp;votre séjour au coeur de la station
balnéaire du Gosier à deux pas des plages à un tarif sympa<strong
>.</strong
>
</p>
<p>
Notre établissement propose à la location un
<strong><a href="/T2/">cosy T2</a></strong> et un
<strong><a href="/T3/">spacieux T3</a></strong
>. Il est <strong>idéalement situé</strong> dans le bourg du Gosier.
Ainsi profitez des <strong>plages et activités</strong> de la dynamique
et chaleureuse ville du Gosier tout en bénéficiant du
<strong>calme</strong> nécessaire à vos séances de&nbsp;<i
>farniente.</i
>
</p>
<p>
<strong>Excellent rapport qualité/prix</strong> et une situation
géographique qui convient parfaitement aux
<strong>séjours touristiques et daffaires</strong>.<br />Possibilité de
location mensuelle de moins de 4 mois à tarifs dégressifs.
</p>
<div class="row">
<div class="col-md-6 col-lg-6">
<div class="title-box-d">
<h2 class="title-d">Tarifs T2</h2>
</div>
<ul >
<ul>
<li>55 € la nuit</li>
<li>350 € la semaine (au lieu de 385 €)</li>
<li>645 € pour 2 semaines (au lieu de 825 €)</li>
<li>960 € le mois (au lieu de 1650 €)</li>
</ul>
<p><a href="#reservation"><button class="btn btn-a">Réserver le Cosy T2</button></a></p>
<p>
<a href="#reservation"
><button class="btn btn-a">Réserver le Cosy T2</button></a
>
</p>
</div>
<div class="col-md-6 col-lg-6">
<div class="title-box-d">
<h2 class="title-d">Tarifs T3</h2>
</div>
<ul >
<ul>
<li>60 € la nuit</li>
<li>385 € la semaine (au lieu de 420 €)</li>
<li>705 € pour 2 semaines (au lieu de 900 €)</li>
<li>1050 € le mois (au lieu de 1800 €)</li>
</ul>
<p><a href="#reservation"><button class="btn btn-a">Réserver le Spacieux T3</button></a></p>
<p>
<a href="#reservation"
><button class="btn btn-a">Réserver le Spacieux T3</button></a
>
</p>
</div>
</div>
<p>Vous êtes intéressés ? <br/>Vérifiez les disponibilités à l'aide du calendrier ci-contre et en bas de page.</p>
<p>
Vous êtes intéressés ? <br />Vérifiez les disponibilités à l'aide du
calendrier ci-contre et en bas de page.
</p>
<hr>
<p ><em>Les tarifs ci-dessus concernent une réservation pour <strong>2 personnes</strong>. <br/> Prévoir un coût additionnel de <strong>15 € par personnes</strong> au-delà de 2 personnes. <br/>Les enfant bénéficient d'un tarif préférentiel, <strong>5 €</strong> seulement par <strong>enfant de moins de 10 ans</strong>.</em></p>
<hr />
<p>
<em
>Les tarifs ci-dessus concernent une réservation pour
<strong>2 personnes</strong>. <br />
Prévoir un coût additionnel de
<strong>15 € par personnes</strong> au-delà de 2 personnes. <br />Les
enfant bénéficient d'un tarif préférentiel,
<strong>5 €</strong> seulement par
<strong>enfant de moins de 10 ans</strong>.</em
>
</p>
</div>
</div>
</section>
{% include 'rental/reservation_form.html' %}
{% endblock %}
{% include 'rental/reservation_form.html' %} {% endblock %}

View file

@ -7,7 +7,7 @@ from .forms import ReservationForm, ContactForm
from django.db import IntegrityError
from rental.pricing import get_reservation_price
from rental.bookings import check_availability, synchronize_calendars, update_calendar
from rental.mailing import send_confirmation_mail, send_notification, send_quotation
from rental.tasks import send_confirmation_mail, send_notification, send_quotation
def index(request):
@ -123,8 +123,8 @@ def reservation(request):
end=end,
price=price
)
send_quotation(reservation)
update_calendar(reservation)
send_quotation.delay(reservation)
update_calendar(reservation) # add to celery tasks too
context = {
'reservation': reservation
}
@ -166,8 +166,8 @@ def contact(request):
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
send_confirmation_mail(name, email)
send_notification(subject, name, message)
send_confirmation_mail.delay(name, email)
send_notification.delay(subject, name, message)
else:
form = ContactForm()
context = {'form': form}

View file

@ -0,0 +1,4 @@
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ('celery_app',)

14
villafleurie/celery.py Normal file
View file

@ -0,0 +1,14 @@
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'villafleurie.settings')
app = Celery('villafleurie')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))

View file

@ -137,7 +137,6 @@ USE_TZ = True
STATIC_URL = '/static/'
STATIC_ROOT = "/static_files/"
# MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = '/media/'
MEDIA_ROOT = '/media/'
@ -148,3 +147,5 @@ EMAIL_SUBJECT_PREFIX = "[VillaFleurieGuadeloupe] "
DEFAULT_FROM_EMAIL = "'Nilka, VillaFleurie' <location.villaFleurie@gmail.com>"
EMAIL_HOST_USER = "location.villafleurie@gmail.com"
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD')
CELERY_BROKER_URL = "amqp://rabbitmq"