villafleurie/rental/views.py

185 lines
5.6 KiB
Python

from django.core.exceptions import ValidationError
from django.db import IntegrityError
from django.shortcuts import render, get_object_or_404
from django.views.generic.base import TemplateView
from django.utils.translation import gettext_lazy as _
from rental.forms import ReservationForm, ContactForm
from rental.models.booking import Booking
from rental.models.contact import Contact
from rental.models.guest import Guest
from rental.models.picture import Picture
from rental.models.place import Place
from rental.models.testimonial import Testimonial
from rental.services.calendar import check_availability, synchronize_calendars, update_calendar
from rental.tasks.apiMailer import * # or gMailer
def index(request):
places = Place.objects.all()
temoignages = Testimonial.objects.all()
context = {
'places': places,
'temoignages': temoignages
}
return render(request, 'rental/index.html', context)
def liste_location(request):
places = Place.objects.all()
context = {'places': places}
return render(request, 'rental/list_place.html', context)
def location(request, place_name='T2'):
place = get_object_or_404(Place, name=place_name)
images = place.images.all()
context = {
'place': place,
'images': images
}
context, template = handle_reservation_form(
request, context, init_template='rental/detail_place.html')
return render(request, template, context)
def reservation(request):
context, template = handle_reservation_form(request)
return render(request, template, context)
def handle_reservation_form(request, context={}, init_template='rental/reservation.html'):
if request.method == 'POST':
form = ReservationForm(request.POST)
if form.is_valid():
name = form.cleaned_data['name']
email = form.cleaned_data['email']
phone = form.cleaned_data['phone']
message = form.cleaned_data['message']
place_name = form.cleaned_data['place']
start = form.cleaned_data['start']
end = form.cleaned_data['end']
try:
guest = Guest.objects.filter(email=email)
if not guest.exists():
guest = Guest.objects.create(
email=email,
name=name,
phone=phone
)
else:
guest = guest.first()
place = get_object_or_404(Place, name=place_name)
# available = check_availability(place, )
if place.is_available(start, end):
reservation = Booking.objects.create_booking(
guest=guest,
place=place,
message=message,
start=start,
end=end
)
send_quotation.delay(name, email)
update_calendar(reservation)
context = {
'reservation': reservation
}
template = 'rental/merci.html'
return context, template
else:
form.add_error(None, ValidationError(
_("Cet hébergement n'est pas disponible aux dates indiquées."),
code='invalid'
))
context = {'form': form}
template = 'rental/reservation.html'
return context, template
except IntegrityError:
form.errors['internal'] = "Une erreur interne est apparue. Merci de recommencer votre requête."
else:
form = ReservationForm()
context['form'] = form
context['errors'] = form.errors.items()
template = init_template
return context, template
def calendar(request, place_name):
"""
returns a list of all related place reservations
"""
# synchronize_calendars()
booked_dates = Booking.objects.all()
bookings = [
booking for booking in booked_dates if booking.place.name == place_name]
context = {
'place_name': place_name,
'bookings': bookings
}
return render(request, 'rental/calendar.html', context)
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
contact = Contact.objects.create(
name=form.cleaned_data['name'],
email=form.cleaned_data['email'],
subject=form.cleaned_data['subject'],
message=form.cleaned_data['message']
)
send_confirmation.delay(contact.name, contact.email)
send_notification.delay(
contact.name,
contact.email,
contact.subject,
contact.message,
contact.date
)
return render(request, 'rental/contact_merci.html', {})
else:
form = ContactForm()
context = {'form': form}
return render(request, 'rental/contact.html', context)
class Legal(TemplateView):
template_name = 'rental/legal.html'
class About(TemplateView):
template_name = 'rental/about.html'
class Partners(TemplateView):
template_name = 'rental/partners.html'
class Services(TemplateView):
template_name = 'rental/service.html'
def handler404(request, exception):
return render(request, 'rental/404.html', status=404)
def handler500(request):
return render(request, 'rental/500.html', status=500)