433 lines
18 KiB
Python
433 lines
18 KiB
Python
# Create your views here.
|
||
|
||
import datetime
|
||
|
||
from django.conf import settings
|
||
from django.contrib import messages
|
||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||
from django.contrib.messages.views import SuccessMessageMixin
|
||
from django.core.mail import send_mail
|
||
from django.http import HttpResponse
|
||
from django.views.generic import TemplateView, FormView, UpdateView, CreateView
|
||
from django.shortcuts import render, redirect
|
||
from .booking_functions.availability import check_availability, calculate_price
|
||
from .forms import ContactForm, AvailabilityForm, BookRequestForm, EditBooking
|
||
from .models import Room, Booking, Pricing
|
||
#from datetime import datetime
|
||
|
||
def date_range(start, end, intv):
|
||
diff = (end - start) / intv
|
||
for i in range(intv):
|
||
yield start + diff * i
|
||
yield end
|
||
|
||
|
||
def get_range_data(date_pre, date_post, data_dict, operation, partitions):
|
||
l_range = list(date_range(date_pre, date_post, partitions))
|
||
d_range = {}
|
||
for i in range(len(l_range)):
|
||
try:
|
||
d_range[l_range[i], l_range[i + 1]] = 0
|
||
except IndexError:
|
||
pass
|
||
|
||
for k in data_dict.keys():
|
||
for r in d_range.keys():
|
||
if r[0] <= data_dict[k].check_in <= r[1]:
|
||
if operation == 'bookings':
|
||
d_range[r] += 1
|
||
if operation == 'income':
|
||
d_range[r] += data_dict[k].final_price
|
||
return d_range
|
||
|
||
|
||
def get_statistics(stats_type):
|
||
date_look = datetime.date.today()
|
||
date_look_pre_week = date_look - datetime.timedelta(days=7)
|
||
date_look_pre_month = date_look - datetime.timedelta(days=31)
|
||
date_look_pre_3months = date_look - datetime.timedelta(days=93)
|
||
date_look_pre_6months = date_look - datetime.timedelta(days=186)
|
||
date_look_pre_year = date_look - datetime.timedelta(days=365)
|
||
bookings = Booking.objects.all()
|
||
|
||
bookings_week = {b.id: b for b in
|
||
bookings.filter(check_in__range=[date_look_pre_week, date_look]).filter(accept='NΑΙ')}
|
||
bookings_month = {b.id: b for b in
|
||
bookings.filter(check_in__range=[date_look_pre_month, date_look]).filter(accept='NΑΙ')}
|
||
bookings_3months = {b.id: b for b in
|
||
bookings.filter(check_in__range=[date_look_pre_3months, date_look]).filter(accept='NΑΙ')}
|
||
bookings_6months = {b.id: b for b in
|
||
bookings.filter(check_in__range=[date_look_pre_6months, date_look]).filter(accept='NΑΙ')}
|
||
bookings_year = {b.id: b for b in
|
||
bookings.filter(check_in__range=[date_look_pre_year, date_look]).filter(accept='NΑΙ')}
|
||
|
||
d_range_week = get_range_data(date_look_pre_week, date_look, bookings_week, operation=stats_type, partitions=7)
|
||
d_range_month = get_range_data(date_look_pre_month, date_look, bookings_month, operation=stats_type, partitions=10)
|
||
d_range_3months = get_range_data(date_look_pre_3months, date_look, bookings_3months, operation=stats_type,
|
||
partitions=6)
|
||
d_range_6months = get_range_data(date_look_pre_6months, date_look, bookings_6months, operation=stats_type,
|
||
partitions=6)
|
||
d_range_year = get_range_data(date_look_pre_year, date_look, bookings_year, operation=stats_type, partitions=12)
|
||
|
||
data = {}
|
||
data["week_labels"] = ','.join(
|
||
['{}-{}'.format(i[0].strftime("%d/%m"), i[1].strftime("%d/%m")) for i in d_range_week.keys()])
|
||
data["week_values"] = ','.join([str(i) for i in d_range_week.values()])
|
||
data["month_labels"] = ','.join(
|
||
['{}-{}'.format(i[0].strftime("%d/%m"), i[1].strftime("%d/%m")) for i in d_range_month.keys()])
|
||
data["month_values"] = ','.join([str(i) for i in d_range_month.values()])
|
||
data["three_months_labels"] = ','.join(
|
||
['{}-{}'.format(i[0].strftime("%d/%m"), i[1].strftime("%d/%m")) for i in d_range_3months.keys()])
|
||
data["three_months_values"] = ','.join([str(i) for i in d_range_3months.values()])
|
||
data["six_months_labels"] = ','.join(
|
||
['{}-{}'.format(i[0].strftime("%d/%m"), i[1].strftime("%d/%m")) for i in d_range_6months.keys()])
|
||
data["six_months_values"] = ','.join([str(i) for i in d_range_6months.values()])
|
||
data["year_labels"] = ','.join(
|
||
['{}-{}'.format(i[0].strftime("%d/%m"), i[1].strftime("%d/%m")) for i in d_range_year.keys()])
|
||
data["year_values"] = ','.join([str(i) for i in d_range_year.values()])
|
||
data["active_page"] = 'statistics'
|
||
return data
|
||
|
||
|
||
class IndexPageView(TemplateView):
|
||
template_name = "index.html"
|
||
# return HttpResponse(settings.LOCALE_PATHS)
|
||
|
||
|
||
class VillasPageView(TemplateView):
|
||
template_name = "villas.html"
|
||
|
||
def get_context_data(self, **kwargs):
|
||
context = super(VillasPageView, self).get_context_data(**kwargs)
|
||
m1_price = Pricing.objects.filter(season_start__lte=datetime.date.today(),
|
||
season_end__gte=datetime.date.today(), category__exact="ΜΕΖ1")
|
||
m2_price = Pricing.objects.filter(season_start__lte=datetime.date.today(),
|
||
season_end__gte=datetime.date.today(), category__exact="ΜΕΖ2")
|
||
context['m1_price'] = m1_price[0].price
|
||
context['m2_price'] = m2_price[0].price
|
||
return context
|
||
|
||
|
||
class RoomsPageView(TemplateView):
|
||
template_name = "rooms.html"
|
||
|
||
|
||
class DoubleRoomsPageView(TemplateView):
|
||
template_name = "double.html"
|
||
|
||
def get_context_data(self, **kwargs):
|
||
context = super(DoubleRoomsPageView, self).get_context_data(**kwargs)
|
||
curr_price = Pricing.objects.filter(season_start__lte=datetime.date.today(),
|
||
season_end__gte=datetime.date.today(), category__exact="ΔΙΚ")
|
||
try:
|
||
context['price'] = curr_price[0].price
|
||
except IndexError:
|
||
context['price'] = ''
|
||
return context
|
||
|
||
|
||
class TripleRoomsPageView(TemplateView):
|
||
template_name = "triple.html"
|
||
|
||
def get_context_data(self, **kwargs):
|
||
context = super(TripleRoomsPageView, self).get_context_data(**kwargs)
|
||
t1_price = Pricing.objects.filter(season_start__lte=datetime.date.today(),
|
||
season_end__gte=datetime.date.today(), category__exact="ΤΡΙ1")
|
||
t2_price = Pricing.objects.filter(season_start__lte=datetime.date.today(),
|
||
season_end__gte=datetime.date.today(), category__exact="ΤΡΙ2")
|
||
t3_price = Pricing.objects.filter(season_start__lte=datetime.date.today(),
|
||
season_end__gte=datetime.date.today(), category__exact="ΤΡΙ3")
|
||
try:
|
||
context['t1_price'] = t1_price[0].price
|
||
except IndexError:
|
||
context['t1_price'] = ''
|
||
try:
|
||
context['t2_price'] = t2_price[0].price
|
||
except IndexError:
|
||
context['t1_price'] = ''
|
||
try:
|
||
context['t3_price'] = t3_price[0].price
|
||
except IndexError:
|
||
context['t1_price'] = ''
|
||
return context
|
||
|
||
|
||
class AboutPageView(TemplateView):
|
||
template_name = "about.html"
|
||
|
||
|
||
class LocationPageView(TemplateView):
|
||
template_name = "location.html"
|
||
|
||
|
||
class ContactPageView(FormView):
|
||
form_class = ContactForm
|
||
template_name = "contact.html"
|
||
success_url = 'contact'
|
||
|
||
def form_valid(self, form):
|
||
message = "{name} / {email} said: ".format(
|
||
name=form.cleaned_data.get('name'),
|
||
email=form.cleaned_data.get('email'))
|
||
message += "\n\n{0}".format(form.cleaned_data.get('message'))
|
||
send_mail(
|
||
subject=form.cleaned_data.get('subject').strip(),
|
||
message=message,
|
||
from_email='contact-form@alion.gr',
|
||
recipient_list=[settings.LIST_OF_EMAIL_RECIPIENTS],
|
||
)
|
||
return super(ContactPageView, self).form_valid(form)
|
||
|
||
|
||
class FavailFormView(FormView):
|
||
form_class = AvailabilityForm
|
||
template_name = "book.html"
|
||
success_url = 'book_dates'
|
||
|
||
def get_context_data(self, **kwargs):
|
||
context = super().get_context_data(**kwargs)
|
||
return context
|
||
|
||
def post(self, request, context_dict={}, *args, **kwargs):
|
||
form = AvailabilityForm(request.POST)
|
||
if form.is_valid():
|
||
category = form.cleaned_data['room_category']
|
||
room_list = Room.objects.filter(category=category)
|
||
data = form.cleaned_data
|
||
available_rooms = []
|
||
for room in room_list:
|
||
if check_availability(room, data['check_in'], data['check_out']):
|
||
available_rooms.append(room)
|
||
if len(available_rooms) > 0:
|
||
total_price = calculate_price(data['check_in'], data['check_out'], category)
|
||
avail_msg = 'There are available rooms from {} to {}'.format(data['check_in'].strftime("%d/%m/%Y"), data['check_out'].strftime("%d/%m/%Y"))
|
||
context_dict.update({"available": True,
|
||
"booking": True,
|
||
'check_in': data['check_in'],
|
||
'check_out': data['check_out'],
|
||
'room_category': data['room_category'],
|
||
'anchor': 'fa',
|
||
'avail_msg': avail_msg,
|
||
})
|
||
request.session['check_in'] = str(data['check_in'])
|
||
request.session['check_out'] = str(data['check_out'])
|
||
request.session['room_category'] = str(data['room_category'])
|
||
request.session['anchor'] = 'fa'
|
||
request.session['avail_msg'] = avail_msg
|
||
request.session['total_price'] = total_price
|
||
return redirect('alion_app:book_dates')
|
||
else:
|
||
messages.error(request, 'No available rooms')
|
||
|
||
|
||
class BookingFormView(FormView):
|
||
form_class = BookRequestForm
|
||
template_name = "book_dates.html"
|
||
success_url = 'book_success'
|
||
|
||
def get(self, request, context_dict={}, *args, **kwargs):
|
||
context_dict.update({"available": True,
|
||
"booking": True,
|
||
'check_in': request.session['check_in'],
|
||
'check_out': request.session['check_out'],
|
||
'room_category': request.session['room_category'],
|
||
'anchor': request.session['anchor'],
|
||
'avail_msg': request.session['avail_msg'],
|
||
'total_price': request.session['total_price'],
|
||
'form': BookRequestForm()
|
||
})
|
||
return render(request, "book_dates.html", context_dict)
|
||
|
||
def post(self, request, context_dict={}, *args, **kwargs):
|
||
form = BookRequestForm(request.POST)
|
||
check_in = datetime.datetime.strptime(request.session['check_in'], '%Y-%m-%d')
|
||
check_out = datetime.datetime.strptime(request.session['check_out'], '%Y-%m-%d')
|
||
context_dict.update({'check_in': check_in,
|
||
'check_out': check_out,
|
||
'room_category': request.session['room_category'],
|
||
'anchor': request.session['anchor'],
|
||
'avail_msg': request.session['avail_msg'],
|
||
'total_price': request.session['total_price'],
|
||
'form': form
|
||
})
|
||
if form.is_valid():
|
||
data = form.cleaned_data
|
||
booking = Booking.objects.create(
|
||
name=data['name'],
|
||
surname=data['surname'],
|
||
telephone=data['telephone'],
|
||
email=data['email'],
|
||
category=context_dict['room_category'],
|
||
room=Room.objects.get(number='001'),
|
||
check_in=context_dict['check_in'],
|
||
check_out=context_dict['check_out'],
|
||
final_price=context_dict['total_price'],
|
||
info=data['info'],
|
||
accept='ΝΕΟ',
|
||
)
|
||
booking.save()
|
||
message = "{} - from {} until {}\n\nTotal Price {}\n\nInfo:{}\n{} {}\ntel:{}\nemail:{}\n\nAdmin Link: http://127.0.0.1:8000/dx/{}/update".format(context_dict['room_category'], context_dict['check_in'], context_dict['check_out'], context_dict['total_price'], data['info'], data['name'], data['surname'], data['telephone'], data['email'], booking.id)
|
||
send_mail(
|
||
subject="Booking Request {} {}".format(data['name'], data['surname']),
|
||
message=message,
|
||
from_email='booking-form@alion.gr',
|
||
recipient_list=[settings.LIST_OF_EMAIL_RECIPIENTS],
|
||
)
|
||
|
||
return render(request, "book_success.html", context=context_dict)
|
||
else:
|
||
messages.error(request, form.errors)
|
||
return render(request, "book_dates.html", context=context_dict)
|
||
|
||
|
||
class RoomAvailabilityFormView(FormView):
|
||
form_class = AvailabilityForm
|
||
template_name = "diaxeirisi/Dashboard.Rooms.Availability.html"
|
||
success_url = '/dx/room_availability'
|
||
|
||
def post(self, request, context_dict={}, *args, **kwargs):
|
||
form = AvailabilityForm(request.POST)
|
||
if form.is_valid():
|
||
category = form.cleaned_data['room_category']
|
||
room_list = Room.objects.filter(category=category)
|
||
data = form.cleaned_data
|
||
available_rooms = []
|
||
for room in room_list:
|
||
if check_availability(room, data['check_in'], data['check_out']):
|
||
available_rooms.append(room)
|
||
if len(available_rooms) > 0:
|
||
context_dict.update({"form": form,
|
||
'available_rooms': available_rooms,
|
||
'RoomObj': available_rooms
|
||
})
|
||
return render(request, "diaxeirisi/Dashboard.Rooms.Availability.html", context=context_dict)
|
||
|
||
|
||
class DashboardPageView(LoginRequiredMixin, TemplateView):
|
||
form_class = EditBooking
|
||
template_name = "diaxeirisi/Dashboard.Default.html"
|
||
|
||
def get_context_data(self, **kwargs):
|
||
context = super().get_context_data(**kwargs)
|
||
context["BookingObj"] = Booking.objects.all()
|
||
context["active_page"] = 'dashboard'
|
||
return context
|
||
|
||
|
||
class RoomsDXPageView(LoginRequiredMixin, TemplateView):
|
||
template_name = "diaxeirisi/Dashboard.Rooms.html"
|
||
|
||
def get_context_data(self, **kwargs):
|
||
context = super().get_context_data(**kwargs)
|
||
context["RoomObj"] = Room.objects.all()
|
||
date_look = datetime.date.today()
|
||
date_look_pre = date_look - datetime.timedelta(days=30)
|
||
booked = {}
|
||
for i in Booking.objects.filter(check_in__range=[date_look_pre, date_look]):
|
||
if i.check_in <= date_look < i.check_out:
|
||
booked[i.room.id] = {'b_id': i.id, 'b_name': i.name, 'b_surname': i.surname}
|
||
context["Booked"] = booked
|
||
context["active_page"] = 'rooms'
|
||
return context
|
||
|
||
|
||
class EditBookingView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
|
||
model = Booking
|
||
success_url = '/dx'
|
||
success_message = 'Οι αλλαγές αποθηκεύτηκαν.'
|
||
template_name = "diaxeirisi/edit_booking.html"
|
||
fields = [
|
||
"name",
|
||
"surname",
|
||
"telephone",
|
||
"email",
|
||
"category",
|
||
"room",
|
||
"check_in",
|
||
"check_out",
|
||
"final_price",
|
||
"country",
|
||
"info",
|
||
"accept"
|
||
]
|
||
|
||
def get_context_data(self, **kwargs):
|
||
context = super().get_context_data(**kwargs)
|
||
category = context["object"].category
|
||
room_list = Room.objects.filter(category=category)
|
||
available_rooms = []
|
||
for room in room_list:
|
||
if check_availability(room, context["object"].check_in, context["object"].check_out):
|
||
available_rooms.append(room)
|
||
context["AvailRooms"] = available_rooms
|
||
return context
|
||
|
||
|
||
class CreateBooking(LoginRequiredMixin, SuccessMessageMixin, CreateView):
|
||
model = Booking
|
||
success_url = '/dx'
|
||
success_message = 'H Κράτηση Δημιουργήθηκε.'
|
||
template_name = "diaxeirisi/create_booking.html"
|
||
fields = [
|
||
"name",
|
||
"surname",
|
||
"telephone",
|
||
"email",
|
||
"category",
|
||
"room",
|
||
"check_in",
|
||
"check_out",
|
||
"final_price",
|
||
"country",
|
||
"info",
|
||
"accept"
|
||
]
|
||
|
||
|
||
class EditRoomView(LoginRequiredMixin, UpdateView):
|
||
model = Room
|
||
template_name = "diaxeirisi/edit_room.html"
|
||
fields = [
|
||
"number",
|
||
"category",
|
||
"beds",
|
||
"capacity",
|
||
]
|
||
|
||
def get_context_data(self, **kwargs):
|
||
context = super().get_context_data(**kwargs)
|
||
return context
|
||
|
||
|
||
class CreateRoom(LoginRequiredMixin, SuccessMessageMixin, CreateView):
|
||
model = Room
|
||
success_url = '/dx/create_room'
|
||
success_message = 'Οι αλλαγές αποθηκεύτηκαν.'
|
||
template_name = "diaxeirisi/create_room.html"
|
||
fields = [
|
||
"number",
|
||
"category",
|
||
"beds",
|
||
"capacity",
|
||
]
|
||
|
||
|
||
class StatisticsPageView(LoginRequiredMixin, TemplateView):
|
||
template_name = "diaxeirisi/Dashboard.Statistics.html"
|
||
|
||
def get_context_data(self, **kwargs):
|
||
context = super().get_context_data(**kwargs)
|
||
stats = get_statistics('bookings')
|
||
context.update(stats)
|
||
return context
|
||
|
||
|
||
class StatisticsIncomePageView(LoginRequiredMixin, TemplateView):
|
||
template_name = "diaxeirisi/Dashboard.Statistics.Income.html"
|
||
|
||
def get_context_data(self, **kwargs):
|
||
context = super().get_context_data(**kwargs)
|
||
stats = get_statistics('income')
|
||
context.update(stats)
|
||
return context
|