mirror of
https://github.com/rjNemo/villafleurie
synced 2026-06-06 02:16:47 +00:00
added celery task queue
This commit is contained in:
parent
5f6a3f752e
commit
eea16b3eb0
11 changed files with 187 additions and 70 deletions
18
README.md
18
README.md
|
|
@ -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 …
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
|
@ -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
|
||||
|
|
@ -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 %}
|
||||
|
|
@ -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
|
||||
>
|
||||
|
|
|
|||
|
|
@ -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 d’amé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 d’amé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> 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 <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 d’affaires</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> 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 <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 d’affaires</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 %}
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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
14
villafleurie/celery.py
Normal 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))
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Reference in a new issue