mirror of
https://github.com/rjNemo/villafleurie
synced 2026-06-12 13:26:47 +00:00
refactor models
This commit is contained in:
parent
40e4153ad8
commit
771e8b7627
15 changed files with 221 additions and 137 deletions
|
|
@ -1,10 +1,15 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from .models import Testimonial, Reservation, Guest, Place, Image, Contact
|
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
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(Contact)
|
admin.site.register(Booking)
|
||||||
admin.site.register(Guest)
|
admin.site.register(Guest)
|
||||||
admin.site.register(Image)
|
|
||||||
admin.site.register(Place)
|
admin.site.register(Place)
|
||||||
admin.site.register(Reservation)
|
admin.site.register(Contact)
|
||||||
|
admin.site.register(Picture)
|
||||||
admin.site.register(Testimonial)
|
admin.site.register(Testimonial)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,10 @@
|
||||||
from rental.pricing import get_reservation_price
|
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from rental.models import Reservation, Place, Guest
|
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 villafleurie.settings import BASE_DIR
|
from villafleurie.settings import BASE_DIR
|
||||||
import datetime
|
import datetime
|
||||||
from google.auth.transport.requests import Request
|
from google.auth.transport.requests import Request
|
||||||
|
|
@ -77,11 +81,14 @@ def synchronize_calendars(place):
|
||||||
|
|
||||||
reservation = get_calendar_reservations(place)
|
reservation = get_calendar_reservations(place)
|
||||||
place = get_object_or_404(Place, name=place.name)
|
place = get_object_or_404(Place, name=place.name)
|
||||||
price = get_reservation_price(
|
|
||||||
place,
|
# After refactoring models, Move this method to the Booking model and get price later by calling Booking method
|
||||||
reservation['start'],
|
# price = get_reservation_price(
|
||||||
reservation['end']
|
# place,
|
||||||
)
|
# reservation['start'],
|
||||||
|
# reservation['end']
|
||||||
|
# )
|
||||||
|
|
||||||
start = reservation['start']
|
start = reservation['start']
|
||||||
end = reservation['end']
|
end = reservation['end']
|
||||||
|
|
||||||
|
|
@ -90,23 +97,23 @@ def synchronize_calendars(place):
|
||||||
guest = Guest.objects.create(name=reservation['guest'])
|
guest = Guest.objects.create(name=reservation['guest'])
|
||||||
else:
|
else:
|
||||||
guest = guest.first()
|
guest = guest.first()
|
||||||
db_booking = Reservation.objects.filter(
|
db_booking = Booking.objects.filter(
|
||||||
guest=guest
|
guest=guest
|
||||||
)
|
)
|
||||||
if not db_booking.exists():
|
if not db_booking.exists():
|
||||||
Reservation.objects.create(
|
Booking.objects.create(
|
||||||
place=place,
|
place=place,
|
||||||
guest=guest,
|
guest=guest,
|
||||||
start=start,
|
start=start,
|
||||||
end=end,
|
end=end,
|
||||||
price=price
|
# price=price
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
db_booking.place = place,
|
db_booking.place = place,
|
||||||
db_booking.guest = guest,
|
db_booking.guest = guest,
|
||||||
db_booking.start = start,
|
db_booking.start = start,
|
||||||
db_booking.end = end,
|
db_booking.end = end,
|
||||||
db_booking.price = price
|
# db_booking.price = price
|
||||||
|
|
||||||
|
|
||||||
def get_bookings(place):
|
def get_bookings(place):
|
||||||
|
|
@ -114,7 +121,7 @@ def get_bookings(place):
|
||||||
Returns a list of all related place reservations """
|
Returns a list of all related place reservations """
|
||||||
|
|
||||||
synchronize_calendars(place)
|
synchronize_calendars(place)
|
||||||
booked_dates = Reservation.objects.filter(place=place)
|
booked_dates = Booking.objects.filter(place=place)
|
||||||
|
|
||||||
return [booking for booking in booked_dates]
|
return [booking for booking in booked_dates]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,11 @@
|
||||||
from django import forms
|
from django import forms
|
||||||
from .models import Reservation, Place, Guest
|
from rental.models.booking import Booking
|
||||||
from .enums import PlaceNames
|
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.enums import PlaceNames
|
||||||
|
|
||||||
|
|
||||||
class ReservationForm(forms.Form):
|
class ReservationForm(forms.Form):
|
||||||
|
|
|
||||||
21
rental/migrations/0031_auto_20200407_0520.py
Normal file
21
rental/migrations/0031_auto_20200407_0520.py
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Generated by Django 3.0.4 on 2020-04-07 09:20
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('rental', '0030_auto_20200331_0439'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name='Reservation',
|
||||||
|
new_name='Booking',
|
||||||
|
),
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name='Image',
|
||||||
|
new_name='Picture',
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -1,88 +0,0 @@
|
||||||
from django.db import models
|
|
||||||
|
|
||||||
|
|
||||||
class Image(models.Model):
|
|
||||||
def __str__(self):
|
|
||||||
return self.alt
|
|
||||||
|
|
||||||
img = models.ImageField(upload_to='img/', null=True, blank=True)
|
|
||||||
alt = models.CharField(max_length=100)
|
|
||||||
|
|
||||||
|
|
||||||
class Place(models.Model):
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Appartement"
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.name
|
|
||||||
|
|
||||||
name = models.CharField(max_length=10, unique=True)
|
|
||||||
description = models.TextField(blank=True)
|
|
||||||
info = models.TextField(blank=True)
|
|
||||||
subname = models.CharField(max_length=100, blank=True)
|
|
||||||
tagline = models.CharField(max_length=100, blank=True)
|
|
||||||
price = models.DecimalField(max_digits=6, decimal_places=2, null=True)
|
|
||||||
surface = models.IntegerField(null=True, blank=True)
|
|
||||||
beds = models.IntegerField(null=True, blank=True)
|
|
||||||
max_occupation = models.IntegerField(null=True, blank=True)
|
|
||||||
thumbnail = models.ForeignKey(
|
|
||||||
Image, on_delete=models.CASCADE, blank=True, null=True)
|
|
||||||
images = models.ManyToManyField(Image, related_name="places", blank=True)
|
|
||||||
calendar = models.CharField(max_length=350, blank=True, null=True)
|
|
||||||
|
|
||||||
|
|
||||||
class Guest(models.Model):
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Voyageur"
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.name
|
|
||||||
|
|
||||||
name = models.CharField(max_length=100)
|
|
||||||
email = models.EmailField(unique=False)
|
|
||||||
phone = models.CharField(max_length=30, blank=True)
|
|
||||||
|
|
||||||
|
|
||||||
class Reservation(models.Model):
|
|
||||||
class Meta:
|
|
||||||
verbose_name = 'Réservation'
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return "Réservation du {} par {}".format(self.place, self.guest)
|
|
||||||
|
|
||||||
place = models.ForeignKey(Place, on_delete=models.CASCADE)
|
|
||||||
guest = models.ForeignKey(Guest, on_delete=models.CASCADE)
|
|
||||||
message = models.TextField(blank=True)
|
|
||||||
start = models.DateField()
|
|
||||||
end = models.DateField()
|
|
||||||
price = models.DecimalField(max_digits=6, decimal_places=2, null=True)
|
|
||||||
|
|
||||||
|
|
||||||
class Testimonial(models.Model):
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Témoignage"
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f"Témoignage de {self.author}"
|
|
||||||
|
|
||||||
author = models.CharField(max_length=200)
|
|
||||||
text = models.TextField(max_length=1000)
|
|
||||||
picture = models.ImageField(
|
|
||||||
max_length=200, upload_to='img/', null=True, blank=True)
|
|
||||||
link = models.URLField(max_length=200, null=True, blank=True)
|
|
||||||
guest = models.OneToOneField(
|
|
||||||
Guest, on_delete=models.CASCADE, blank=True, null=True)
|
|
||||||
reservation = models.OneToOneField(
|
|
||||||
Reservation, on_delete=models.CASCADE, blank=True, null=True)
|
|
||||||
|
|
||||||
|
|
||||||
class Contact(models.Model):
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f"Message de {self.name}, le {self.date}"
|
|
||||||
|
|
||||||
name = models.CharField(max_length=50)
|
|
||||||
email = models.EmailField(max_length=50)
|
|
||||||
subject = models.EmailField(max_length=50)
|
|
||||||
message = models.TextField(max_length=50)
|
|
||||||
date = models.DateTimeField(auto_now_add=True)
|
|
||||||
30
rental/models/booking.py
Normal file
30
rental/models/booking.py
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
from datetime import datetime
|
||||||
|
from django.db import models
|
||||||
|
from rental.models.guest import Guest
|
||||||
|
from rental.models.place import Place
|
||||||
|
|
||||||
|
|
||||||
|
class Booking(models.Model):
|
||||||
|
class Meta:
|
||||||
|
verbose_name = 'Réservation'
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "Réservation du {} par {}".format(self.place, self.guest)
|
||||||
|
|
||||||
|
place = models.ForeignKey(Place, on_delete=models.CASCADE)
|
||||||
|
guest = models.ForeignKey(Guest, on_delete=models.CASCADE)
|
||||||
|
message = models.TextField(blank=True)
|
||||||
|
start = models.DateField()
|
||||||
|
end = models.DateField()
|
||||||
|
price = models.DecimalField(max_digits=6, decimal_places=2, null=True)
|
||||||
|
|
||||||
|
def get_reservation_price(place, start, end):
|
||||||
|
""" Compute booking price as a function of place and dates """
|
||||||
|
|
||||||
|
if type(start) == str:
|
||||||
|
start = datetime.strptime(start, '%Y-%m-%d')
|
||||||
|
if type(end) == str:
|
||||||
|
end = datetime.strptime(end, '%Y-%m-%d')
|
||||||
|
nights = (end - start).days
|
||||||
|
|
||||||
|
return place.price * nights
|
||||||
14
rental/models/contact.py
Normal file
14
rental/models/contact.py
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Contact(models.Model):
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"Message de {self.name}, le {self.date}"
|
||||||
|
|
||||||
|
name = models.CharField(max_length=50)
|
||||||
|
email = models.EmailField(max_length=50)
|
||||||
|
subject = models.EmailField(max_length=50)
|
||||||
|
message = models.TextField(max_length=50)
|
||||||
|
date = models.DateTimeField(auto_now_add=True)
|
||||||
14
rental/models/guest.py
Normal file
14
rental/models/guest.py
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Guest(models.Model):
|
||||||
|
class Meta:
|
||||||
|
verbose_name = "Voyageur"
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
name = models.CharField(max_length=100)
|
||||||
|
email = models.EmailField(unique=False)
|
||||||
|
phone = models.CharField(max_length=30, blank=True)
|
||||||
9
rental/models/picture.py
Normal file
9
rental/models/picture.py
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
class Picture(models.Model):
|
||||||
|
def __str__(self):
|
||||||
|
return self.alt
|
||||||
|
|
||||||
|
img = models.ImageField(upload_to='img/', null=True, blank=True)
|
||||||
|
alt = models.CharField(max_length=100)
|
||||||
24
rental/models/place.py
Normal file
24
rental/models/place.py
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
from django.db import models
|
||||||
|
from rental.models.picture import Picture
|
||||||
|
|
||||||
|
|
||||||
|
class Place(models.Model):
|
||||||
|
class Meta:
|
||||||
|
verbose_name = "Appartement"
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
name = models.CharField(max_length=10, unique=True)
|
||||||
|
description = models.TextField(blank=True)
|
||||||
|
info = models.TextField(blank=True)
|
||||||
|
subname = models.CharField(max_length=100, blank=True)
|
||||||
|
tagline = models.CharField(max_length=100, blank=True)
|
||||||
|
price = models.DecimalField(max_digits=6, decimal_places=2, null=True)
|
||||||
|
surface = models.IntegerField(null=True, blank=True)
|
||||||
|
beds = models.IntegerField(null=True, blank=True)
|
||||||
|
max_occupation = models.IntegerField(null=True, blank=True)
|
||||||
|
thumbnail = models.ForeignKey(
|
||||||
|
Picture, on_delete=models.CASCADE, blank=True, null=True)
|
||||||
|
images = models.ManyToManyField(Picture, related_name="places", blank=True)
|
||||||
|
calendar = models.CharField(max_length=350, blank=True, null=True)
|
||||||
21
rental/models/testimonial.py
Normal file
21
rental/models/testimonial.py
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
from django.db import models
|
||||||
|
from rental.models.booking import Booking
|
||||||
|
from rental.models.guest import Guest
|
||||||
|
|
||||||
|
|
||||||
|
class Testimonial(models.Model):
|
||||||
|
class Meta:
|
||||||
|
verbose_name = "Témoignage"
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"Témoignage de {self.author}"
|
||||||
|
|
||||||
|
author = models.CharField(max_length=200)
|
||||||
|
text = models.TextField(max_length=1000)
|
||||||
|
picture = models.ImageField(
|
||||||
|
max_length=200, upload_to='img/', null=True, blank=True)
|
||||||
|
link = models.URLField(max_length=200, null=True, blank=True)
|
||||||
|
guest = models.OneToOneField(
|
||||||
|
Guest, on_delete=models.CASCADE, blank=True, null=True)
|
||||||
|
reservation = models.OneToOneField(
|
||||||
|
Booking, on_delete=models.CASCADE, blank=True, null=True)
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
|
|
||||||
def get_reservation_price(place, start, end):
|
|
||||||
""" Compute booking price as a function of place and dates """
|
|
||||||
|
|
||||||
if type(start) == str:
|
|
||||||
start = datetime.strptime(start, '%Y-%m-%d')
|
|
||||||
if type(end) == str:
|
|
||||||
end = datetime.strptime(end, '%Y-%m-%d')
|
|
||||||
nights = (end - start).days
|
|
||||||
|
|
||||||
return place.price * nights
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
from rental.models import Place
|
|
||||||
from datetime import datetime
|
|
||||||
from django.shortcuts import get_object_or_404
|
|
||||||
place_name = 'T2'
|
|
||||||
place = get_object_or_404(Place, name=place_name)
|
|
||||||
start = datetime(2019, 11, 14)
|
|
||||||
end = datetime(2019, 11, 20)
|
|
||||||
x = get_reservation_price(place_name, start, end)
|
|
||||||
print(x)
|
|
||||||
|
|
@ -1,3 +1,40 @@
|
||||||
|
from datetime import datetime
|
||||||
|
from django.shortcuts import get_object_or_404
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
from rental.models.place import Place
|
||||||
|
from rental.models.booking import Booking
|
||||||
|
from rental.models.guest import Guest
|
||||||
|
|
||||||
# Create your tests here.
|
place_name = 'T2'
|
||||||
|
place = get_object_or_404(Place, name=place_name)
|
||||||
|
|
||||||
|
|
||||||
|
x = get_reservation_price(place_name, start, end)
|
||||||
|
print(x)
|
||||||
|
|
||||||
|
|
||||||
|
class TestBooking(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.place = Place.objects.create(
|
||||||
|
name='TX',
|
||||||
|
price=100
|
||||||
|
)
|
||||||
|
self.guest = Guest.objects.create(
|
||||||
|
name="Ruidy",
|
||||||
|
email="r@mail.com",
|
||||||
|
phone="1092198YE8939798"
|
||||||
|
)
|
||||||
|
|
||||||
|
self.start = datetime(2019, 11, 14)
|
||||||
|
self.end = datetime(2019, 11, 20)
|
||||||
|
|
||||||
|
def test_bookingPrice(self):
|
||||||
|
# place = Place.objects.get(name='TX')
|
||||||
|
booking = Booking.objects.create(
|
||||||
|
place=self.place,
|
||||||
|
start=self.start,
|
||||||
|
end=self.end,
|
||||||
|
guest=self.guest
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(booking.get_reservation_price())
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,12 @@
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
from . import views
|
from . import views
|
||||||
from villafleurie import settings
|
from villafleurie import settings
|
||||||
from .models import Testimonial, Reservation, Guest, Place
|
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 django.contrib.staticfiles.urls import static, staticfiles_urlpatterns
|
from django.contrib.staticfiles.urls import static, staticfiles_urlpatterns
|
||||||
|
|
||||||
app_name = 'rental'
|
app_name = 'rental'
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,13 @@ from django.shortcuts import render, get_object_or_404
|
||||||
from django.views.generic.base import TemplateView
|
from django.views.generic.base import TemplateView
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rental.forms import ReservationForm, ContactForm
|
from rental.forms import ReservationForm, ContactForm
|
||||||
from rental.models import Testimonial, Reservation, Guest, Place, Contact
|
from rental.models.booking import Booking
|
||||||
from rental.pricing import get_reservation_price
|
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.bookings import check_availability, synchronize_calendars, update_calendar
|
from rental.bookings import check_availability, synchronize_calendars, update_calendar
|
||||||
from rental.tasks.apiMailer import * # or gMailer
|
from rental.tasks.apiMailer import * # or gMailer
|
||||||
|
|
||||||
|
|
@ -78,7 +83,7 @@ def handle_reservation_form(request, context={}, init_template='rental/reservati
|
||||||
available = check_availability(place, start, end)
|
available = check_availability(place, start, end)
|
||||||
price = get_reservation_price(place, start, end)
|
price = get_reservation_price(place, start, end)
|
||||||
if available:
|
if available:
|
||||||
reservation = Reservation.objects.create(
|
reservation = Booking.objects.create(
|
||||||
guest=guest,
|
guest=guest,
|
||||||
place=place,
|
place=place,
|
||||||
message=message,
|
message=message,
|
||||||
|
|
@ -119,7 +124,7 @@ def calendar(request, place_name):
|
||||||
returns a list of all related place reservations
|
returns a list of all related place reservations
|
||||||
"""
|
"""
|
||||||
# synchronize_calendars()
|
# synchronize_calendars()
|
||||||
booked_dates = Reservation.objects.all()
|
booked_dates = Booking.objects.all()
|
||||||
bookings = [
|
bookings = [
|
||||||
booking for booking in booked_dates if booking.place.name == place_name]
|
booking for booking in booked_dates if booking.place.name == place_name]
|
||||||
context = {
|
context = {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue