This commit is contained in:
Argyrios Deligiannidis
2022-06-26 23:19:01 +03:00
parent 80ff869d66
commit e84cc555a2
1506 changed files with 877444 additions and 0 deletions
View File
+11
View File
@@ -0,0 +1,11 @@
from django.contrib import admin
from .models import Room, Booking
# Register your models here.
admin.site.register(Room)
@admin.register(Booking)
class BookingAdmin(admin.ModelAdmin):
list_display = ('accept','surname', 'name', 'category', 'room', 'check_in', 'check_out', 'telephone', 'email', 'final_price')
list_filter = ("category", "room")
search_fields = ("accept__startswith", "category__startswith" , "name__startswith", "surname__startswith", 'room__startswith')
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class AlionAppConfig(AppConfig):
name = 'alion_app'
@@ -0,0 +1,16 @@
import datetime
from alion_app.models import Room, Booking
def check_availability(room, check_in, check_out):
avail_list = []
reservations_list = Booking.objects.filter(room=room)
for reservation in reservations_list:
if reservation.check_in > check_out or reservation.check_out < check_in:
avail_list.append(True)
else:
avail_list.append(False)
return all(avail_list)
def get_number_of_bookings(start_date, end_date):
pass
+118
View File
@@ -0,0 +1,118 @@
from captcha.fields import CaptchaField
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout, Div, Field, HTML, ButtonHolder
import floppyforms as forms
from django.forms import HiddenInput
from alion_app.models import Room, Booking
class ContactForm(forms.Form):
name = forms.CharField(required=True)
email = forms.EmailField(required=True)
subject = forms.CharField(required=True)
message = forms.CharField(widget=forms.Textarea)
captcha = CaptchaField()
def __init__(self, *arg, **kwarg):
super(ContactForm, self).__init__(*arg, **kwarg)
self.helper = FormHelper()
self.fields['name'].label = ''
self.fields['email'].label = 'email'
self.fields['subject'].label = ''
self.fields['message'].label = ''
self.helper.layout = Layout(
Div(
HTML('{% load i18n %}{% trans "Όνομα:" %}'),
Field('name'),
Field('email'),
HTML('{% load i18n %}{% trans "Θέμα:" %}'),
Field('subject'),
HTML('{% load i18n %}{% trans "Μήνυμα:" %}'),
Field('message'),
Field('captcha'),
HTML("<br>"),
ButtonHolder(Submit('submit', '{% load i18n %}{% trans "Αποστολή" %}')),
)
)
class AvailabilityForm(forms.Form):
check_in = forms.DateField(
required=True,
input_formats=["%d-%m-%Y"],
widget=forms.DateTimeInput(attrs={'type': 'text', 'id': 'check_in', 'class': 'form-control text-left mr-2'}))
check_out = forms.DateField(
required=True,
input_formats=["%d-%m-%Y"],
widget=forms.DateTimeInput(attrs={'type': 'text', 'id': 'check_out', 'class': 'form-control text-left ml-2'}))
room_category = forms.ChoiceField(
required=True,
choices=Room.ROOM_CATEGORIES)
class BookRequestForm(forms.Form):
check_in = forms.DateField(
required=True,
input_formats=["%d-%m-%Y"],
widget=forms.DateTimeInput(attrs={'type': 'text', 'id': 'check_in', 'class': 'text-left mr-2', 'readonly': 'readonly' }))
check_out = forms.DateField(
required=True,
input_formats=["%d-%m-%Y"],
widget=forms.DateTimeInput(attrs={'type': 'text', 'id': 'check_out', 'class': 'text-left ml-2', 'readonly': 'readonly' }))
#room_category = forms.CheckboxInput(attrs={'type': 'text', 'readonly': 'readonly'})
room_category = forms.ChoiceField(
choices=Room.ROOM_CATEGORIES,)
name = forms.CharField()
surname = forms.CharField()
telephone = forms.CharField()
email = forms.EmailField(required=False)
info = forms.CharField(widget=forms.Textarea, required=False)
captcha = CaptchaField()
def __init__(self, *arg, **kwarg):
super(BookRequestForm, self).__init__(*arg, **kwarg)
self.helper = FormHelper()
self.fields['name'].label = ''
self.fields['surname'].label = ''
self.fields['telephone'].label = ''
self.fields['info'].label = ''
self.helper.layout = Layout(
Div(
HTML('{% load i18n %}{% trans "Όνομα:" %}'),
Field('name'),
HTML('{% load i18n %}{% trans "Επώνυμο:" %}'),
Field('surname'),
HTML('{% load i18n %}{% trans "Τηλέφωνο:" %}'),
Field('telephone'),
HTML('{% load i18n %}{% trans "Πληροφορίες:" %}'),
Field('info'),
Field('captcha'),
HTML("<br>"),
ButtonHolder(Submit('submit', '{% load i18n %}{% trans "Αποθήκευση" %}')),
)
)
class EditBooking(forms.Form):
name = forms.CharField()
surname = forms.CharField()
telephone = forms.CharField()
email = forms.EmailField(required=False)
room_category = forms.ChoiceField(
choices=Room.ROOM_CATEGORIES,)
check_in = forms.DateField(
required=True,
input_formats=["%d-%m-%Y"],
widget=forms.DateTimeInput(attrs={'type': 'text', 'id': 'check_in', 'class': 'text-left mr-2', 'readonly': 'readonly' }))
check_out = forms.DateField(
required=True,
input_formats=["%d-%m-%Y"],
widget=forms.DateTimeInput(attrs={'type': 'text', 'id': 'check_out', 'class': 'text-left ml-2', 'readonly': 'readonly' }))
final_price = forms.FloatField()
info = forms.CharField(widget=forms.Textarea, required=False)
accept = forms.ChoiceField(choices=Booking.ACCEPT_OPTION)
+31
View File
@@ -0,0 +1,31 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-04 17:37+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: alion_app/models.py:23
msgid "Δίκλινο"
msgstr ""
#: alion_app/models.py:24
msgid "Τρίκλινο"
msgstr ""
#: alion_app/models.py:25
msgid "Μεζονέτα"
msgstr ""
+32
View File
@@ -0,0 +1,32 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-04 17:10+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
#: alion_app/models.py:23
msgid "Δίκλινο"
msgstr ""
#: alion_app/models.py:24
msgid "Τρίκλινο"
msgstr ""
#: alion_app/models.py:25
msgid "Μεζονέτα"
msgstr ""
+33
View File
@@ -0,0 +1,33 @@
# Generated by Django 3.1.7 on 2021-03-21 07:37
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Reservation',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200)),
('start_date', models.CharField(max_length=20)),
('end_date', models.CharField(max_length=20)),
],
),
migrations.CreateModel(
name='Room',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('number', models.IntegerField()),
('category', models.CharField(choices=[('DBL', 'Double'), ('TRL', 'Triple'), ('VLA', 'Villa')], max_length=3)),
('beds', models.IntegerField()),
('capacity', models.IntegerField()),
],
),
]
@@ -0,0 +1,24 @@
# Generated by Django 3.1.7 on 2021-03-21 07:56
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='room',
name='price',
field=models.FloatField(default=99),
preserve_default=False,
),
migrations.AlterField(
model_name='room',
name='category',
field=models.CharField(choices=[('DBL', 'Δίκλινο'), ('TRL', 'Τρίκλινο'), ('VLA', 'Μεζονέτα')], max_length=3),
),
]
@@ -0,0 +1,30 @@
# Generated by Django 3.1.7 on 2021-03-21 08:40
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0002_auto_20210321_0956'),
]
operations = [
migrations.CreateModel(
name='Reservations',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=20)),
('surname', models.CharField(max_length=20)),
('telephone', models.IntegerField()),
('email', models.CharField(max_length=20)),
('check_in', models.DateTimeField()),
('check_out', models.DateTimeField()),
('room', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='alion_app.room')),
],
),
migrations.DeleteModel(
name='Reservation',
),
]
@@ -0,0 +1,24 @@
# Generated by Django 3.1.7 on 2021-03-21 08:54
from django.db import migrations, models
import phonenumber_field.modelfields
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0003_auto_20210321_1040'),
]
operations = [
migrations.AlterField(
model_name='reservations',
name='email',
field=models.EmailField(max_length=40),
),
migrations.AlterField(
model_name='reservations',
name='telephone',
field=phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, region=None),
),
]
@@ -0,0 +1,17 @@
# Generated by Django 3.1.7 on 2021-03-21 08:55
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0004_auto_20210321_1054'),
]
operations = [
migrations.RenameModel(
old_name='Reservations',
new_name='Reservation',
),
]
@@ -0,0 +1,18 @@
# Generated by Django 3.1.7 on 2021-03-21 09:05
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0005_auto_20210321_1055'),
]
operations = [
migrations.AlterField(
model_name='room',
name='category',
field=models.CharField(choices=[('ΔΙΚ', 'Δίκλινο'), ('ΤΡΙ', 'Τρίκλινο'), ('ΜΕΖ', 'Μεζονέτα')], max_length=3),
),
]
@@ -0,0 +1,25 @@
# Generated by Django 3.1.7 on 2021-03-21 11:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0006_auto_20210321_1105'),
]
operations = [
migrations.CreateModel(
name='RoomCategory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('category', models.CharField(max_length=50)),
('rate', models.FloatField()),
],
),
migrations.RenameModel(
old_name='Reservation',
new_name='Booking',
),
]
@@ -0,0 +1,37 @@
# Generated by Django 3.1.7 on 2021-03-22 16:34
from django.db import migrations, models
import phonenumber_field.modelfields
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0007_auto_20210321_1338'),
]
operations = [
migrations.CreateModel(
name='BookingRequest',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=20)),
('surname', models.CharField(max_length=20)),
('telephone', phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, region=None)),
('email', models.EmailField(max_length=40)),
('category', models.CharField(max_length=20)),
('check_in', models.DateTimeField()),
('check_out', models.DateTimeField()),
('info', models.CharField(max_length=256)),
],
),
migrations.DeleteModel(
name='RoomCategory',
),
migrations.AddField(
model_name='booking',
name='price',
field=models.FloatField(default=100),
preserve_default=False,
),
]
@@ -0,0 +1,34 @@
# Generated by Django 3.1.7 on 2021-03-22 16:46
from django.db import migrations, models
import phonenumber_field.modelfields
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0008_auto_20210322_1834'),
]
operations = [
migrations.RemoveField(
model_name='booking',
name='price',
),
migrations.AddField(
model_name='booking',
name='final_price',
field=models.FloatField(blank=True, default=165),
preserve_default=False,
),
migrations.AlterField(
model_name='bookingrequest',
name='info',
field=models.CharField(blank=True, max_length=256),
),
migrations.AlterField(
model_name='bookingrequest',
name='telephone',
field=phonenumber_field.modelfields.PhoneNumberField(max_length=128, region=None),
),
]
@@ -0,0 +1,37 @@
# Generated by Django 3.1.7 on 2021-03-23 08:22
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0009_auto_20210322_1846'),
]
operations = [
migrations.DeleteModel(
name='BookingRequest',
),
migrations.AddField(
model_name='booking',
name='category',
field=models.CharField(default=1, max_length=40, verbose_name=(('ΔΙΚ', 'Δίκλινο'), ('ΤΡΙ', 'Τρίκλινο'), ('ΜΕΖ', 'Μεζονέτα'))),
preserve_default=False,
),
migrations.AddField(
model_name='booking',
name='info',
field=models.CharField(blank=True, max_length=512),
),
migrations.AlterField(
model_name='booking',
name='check_in',
field=models.DateField(),
),
migrations.AlterField(
model_name='booking',
name='check_out',
field=models.DateField(),
),
]
@@ -0,0 +1,22 @@
# Generated by Django 3.1.7 on 2021-03-23 08:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0010_auto_20210323_1022'),
]
operations = [
migrations.RemoveField(
model_name='booking',
name='category',
),
migrations.AlterField(
model_name='booking',
name='info',
field=models.TextField(blank=True),
),
]
@@ -0,0 +1,25 @@
# Generated by Django 3.1.7 on 2021-03-23 08:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0011_auto_20210323_1042'),
]
operations = [
migrations.AddField(
model_name='booking',
name='accept',
field=models.CharField(choices=[('NΑΙ', 'ΝΑΙ'), ('ΟΧΙ', 'ΟΧΙ')], default='ΝΑΙ', max_length=3),
preserve_default=False,
),
migrations.AddField(
model_name='booking',
name='category',
field=models.CharField(choices=[('ΔΙΚ', 'Δίκλινο'), ('ΤΡΙ', 'Τρίκλινο'), ('ΜΕΖ', 'Μεζονέτα')], default='MEZ', max_length=3),
preserve_default=False,
),
]
@@ -0,0 +1,24 @@
# Generated by Django 3.1.7 on 2021-03-23 15:13
from django.db import migrations, models
import phonenumber_field.modelfields
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0012_auto_20210323_1043'),
]
operations = [
migrations.AlterField(
model_name='booking',
name='email',
field=models.EmailField(blank=True, max_length=40),
),
migrations.AlterField(
model_name='booking',
name='telephone',
field=phonenumber_field.modelfields.PhoneNumberField(max_length=128, region=None),
),
]
@@ -0,0 +1,23 @@
# Generated by Django 3.1.7 on 2021-03-24 07:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0013_auto_20210323_1713'),
]
operations = [
migrations.AlterField(
model_name='booking',
name='accept',
field=models.CharField(choices=[('NΑΙ', 'ΝΑΙ'), ('ΟΧΙ', 'ΟΧΙ')], default=None, max_length=3),
),
migrations.AlterField(
model_name='booking',
name='category',
field=models.CharField(choices=[('ΔΙΚ', 'Δίκλινο'), ('ΤΡΙ', 'Τρίκλινο'), ('ΜΕΖ', 'Μεζονέτα')], default=None, max_length=3),
),
]
@@ -0,0 +1,28 @@
# Generated by Django 3.1.7 on 2021-03-24 10:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0014_auto_20210324_0918'),
]
operations = [
migrations.AlterField(
model_name='booking',
name='email',
field=models.EmailField(blank=True, max_length=50),
),
migrations.AlterField(
model_name='booking',
name='name',
field=models.CharField(max_length=50),
),
migrations.AlterField(
model_name='booking',
name='surname',
field=models.CharField(max_length=50),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 3.1.7 on 2021-03-24 10:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0015_auto_20210324_1223'),
]
operations = [
migrations.AlterField(
model_name='booking',
name='accept',
field=models.CharField(choices=[('NΑΙ', 'ΝΑΙ'), ('ΟΧΙ', 'ΟΧΙ'), ('ΝΕΟ', 'ΝΕΟ')], default=None, max_length=3),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 3.1.7 on 2021-03-26 15:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0016_auto_20210324_1236'),
]
operations = [
migrations.AddField(
model_name='booking',
name='created_at',
field=models.DateTimeField(auto_now_add=True, default='2021-03-26 17:51'),
preserve_default=False,
),
]
@@ -0,0 +1,18 @@
# Generated by Django 3.1.7 on 2021-03-27 07:58
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0017_booking_created_at'),
]
operations = [
migrations.AddField(
model_name='booking',
name='country',
field=models.CharField(blank=True, choices=[('AUT', 'Αυστρία'), ('BEL', 'Βέλγιο'), ('BGR', 'Βουλγαρία'), ('CHN', 'Κίνα'), ('CYP', 'Κύπρος'), ('CZE', 'Τσεχία'), ('DEU', 'Γερμανία'), ('DNK', 'Δανία'), ('ESP', 'Ισπανία'), ('EST', 'Εστονία'), ('FIN', 'Φιλανδία'), ('FRA', 'Γαλλία'), ('GBR', 'Αγγλία'), ('GRC', 'Ελλάδα'), ('HRV', 'Κροατία'), ('HUN', 'Ουγγαρία'), ('IRL', 'Ιρλανδία'), ('ITA', 'Ιταλία'), ('LTU', 'Λιθουανία'), ('LUX', 'Λουξεμβούργο'), ('LVA', 'Λετονία'), ('MLT', 'Μάλτα'), ('NLD', 'Ολλανδία'), ('POL', 'Πολωνία'), ('PRT', 'Πορτογαλία'), ('ROU', 'Ρουμανία'), ('RUS', 'Ρωσία'), ('SVK', 'Σλοβακία'), ('SVN', 'Σλοβενία'), ('SWE', 'Σουηδία'), ('TUR', 'Τουρκία')], max_length=3),
),
]
@@ -0,0 +1,59 @@
# Generated by Django 3.1.7 on 2021-03-29 06:36
from django.db import migrations, models
import phonenumber_field.modelfields
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0018_booking_country'),
]
operations = [
migrations.AlterField(
model_name='booking',
name='accept',
field=models.CharField(choices=[('NΑΙ', 'ΝΑΙ'), ('ΟΧΙ', 'ΟΧΙ'), ('ΝΕΟ', 'ΝΕΟ')], default=None, max_length=3, verbose_name='Accept'),
),
migrations.AlterField(
model_name='booking',
name='category',
field=models.CharField(choices=[('ΔΙΚ', 'Δίκλινο'), ('ΤΡΙ', 'Τρίκλινο'), ('ΜΕΖ', 'Μεζονέτα')], default=None, max_length=3, verbose_name='Category'),
),
migrations.AlterField(
model_name='booking',
name='country',
field=models.CharField(blank=True, choices=[('AUT', 'Αυστρία'), ('BEL', 'Βέλγιο'), ('BGR', 'Βουλγαρία'), ('CHN', 'Κίνα'), ('CYP', 'Κύπρος'), ('CZE', 'Τσεχία'), ('DEU', 'Γερμανία'), ('DNK', 'Δανία'), ('ESP', 'Ισπανία'), ('EST', 'Εστονία'), ('FIN', 'Φιλανδία'), ('FRA', 'Γαλλία'), ('GBR', 'Αγγλία'), ('GRC', 'Ελλάδα'), ('HRV', 'Κροατία'), ('HUN', 'Ουγγαρία'), ('IRL', 'Ιρλανδία'), ('ITA', 'Ιταλία'), ('LTU', 'Λιθουανία'), ('LUX', 'Λουξεμβούργο'), ('LVA', 'Λετονία'), ('MLT', 'Μάλτα'), ('NLD', 'Ολλανδία'), ('POL', 'Πολωνία'), ('PRT', 'Πορτογαλία'), ('ROU', 'Ρουμανία'), ('RUS', 'Ρωσία'), ('SVK', 'Σλοβακία'), ('SVN', 'Σλοβενία'), ('SWE', 'Σουηδία'), ('TUR', 'Τουρκία')], max_length=3, verbose_name='Country'),
),
migrations.AlterField(
model_name='booking',
name='created_at',
field=models.DateTimeField(auto_now_add=True, verbose_name='Created At'),
),
migrations.AlterField(
model_name='booking',
name='final_price',
field=models.FloatField(blank=True, verbose_name='Final Price'),
),
migrations.AlterField(
model_name='booking',
name='info',
field=models.TextField(blank=True, verbose_name='Info'),
),
migrations.AlterField(
model_name='booking',
name='name',
field=models.CharField(max_length=50, verbose_name='Name'),
),
migrations.AlterField(
model_name='booking',
name='surname',
field=models.CharField(max_length=50, verbose_name='Surname'),
),
migrations.AlterField(
model_name='booking',
name='telephone',
field=phonenumber_field.modelfields.PhoneNumberField(max_length=128, region=None, verbose_name='Telephone'),
),
]
@@ -0,0 +1,38 @@
# Generated by Django 3.1.7 on 2021-03-29 06:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0019_auto_20210329_0936'),
]
operations = [
migrations.AlterField(
model_name='room',
name='beds',
field=models.IntegerField(verbose_name='Beds'),
),
migrations.AlterField(
model_name='room',
name='capacity',
field=models.IntegerField(verbose_name='Capacity'),
),
migrations.AlterField(
model_name='room',
name='category',
field=models.CharField(choices=[('ΔΙΚ', 'Δίκλινο'), ('ΤΡΙ', 'Τρίκλινο'), ('ΜΕΖ', 'Μεζονέτα')], max_length=3, verbose_name='Category'),
),
migrations.AlterField(
model_name='room',
name='number',
field=models.IntegerField(verbose_name='Number'),
),
migrations.AlterField(
model_name='room',
name='price',
field=models.FloatField(verbose_name='Price'),
),
]
@@ -0,0 +1,84 @@
# Generated by Django 3.1.7 on 2021-03-29 06:49
from django.db import migrations, models
import phonenumber_field.modelfields
class Migration(migrations.Migration):
dependencies = [
('alion_app', '0020_auto_20210329_0937'),
]
operations = [
migrations.AlterField(
model_name='booking',
name='accept',
field=models.CharField(choices=[('NΑΙ', 'ΝΑΙ'), ('ΟΧΙ', 'ΟΧΙ'), ('ΝΕΟ', 'ΝΕΟ')], default=None, max_length=3),
),
migrations.AlterField(
model_name='booking',
name='category',
field=models.CharField(choices=[('ΔΙΚ', 'Δίκλινο'), ('ΤΡΙ', 'Τρίκλινο'), ('ΜΕΖ', 'Μεζονέτα')], default=None, max_length=3),
),
migrations.AlterField(
model_name='booking',
name='country',
field=models.CharField(blank=True, choices=[('AUT', 'Αυστρία'), ('BEL', 'Βέλγιο'), ('BGR', 'Βουλγαρία'), ('CHN', 'Κίνα'), ('CYP', 'Κύπρος'), ('CZE', 'Τσεχία'), ('DEU', 'Γερμανία'), ('DNK', 'Δανία'), ('ESP', 'Ισπανία'), ('EST', 'Εστονία'), ('FIN', 'Φιλανδία'), ('FRA', 'Γαλλία'), ('GBR', 'Αγγλία'), ('GRC', 'Ελλάδα'), ('HRV', 'Κροατία'), ('HUN', 'Ουγγαρία'), ('IRL', 'Ιρλανδία'), ('ITA', 'Ιταλία'), ('LTU', 'Λιθουανία'), ('LUX', 'Λουξεμβούργο'), ('LVA', 'Λετονία'), ('MLT', 'Μάλτα'), ('NLD', 'Ολλανδία'), ('POL', 'Πολωνία'), ('PRT', 'Πορτογαλία'), ('ROU', 'Ρουμανία'), ('RUS', 'Ρωσία'), ('SVK', 'Σλοβακία'), ('SVN', 'Σλοβενία'), ('SWE', 'Σουηδία'), ('TUR', 'Τουρκία')], max_length=3),
),
migrations.AlterField(
model_name='booking',
name='created_at',
field=models.DateTimeField(auto_now_add=True),
),
migrations.AlterField(
model_name='booking',
name='final_price',
field=models.FloatField(blank=True),
),
migrations.AlterField(
model_name='booking',
name='info',
field=models.TextField(blank=True),
),
migrations.AlterField(
model_name='booking',
name='name',
field=models.CharField(max_length=50),
),
migrations.AlterField(
model_name='booking',
name='surname',
field=models.CharField(max_length=50),
),
migrations.AlterField(
model_name='booking',
name='telephone',
field=phonenumber_field.modelfields.PhoneNumberField(max_length=128, region=None),
),
migrations.AlterField(
model_name='room',
name='beds',
field=models.IntegerField(),
),
migrations.AlterField(
model_name='room',
name='capacity',
field=models.IntegerField(),
),
migrations.AlterField(
model_name='room',
name='category',
field=models.CharField(choices=[('ΔΙΚ', 'Δίκλινο'), ('ΤΡΙ', 'Τρίκλινο'), ('ΜΕΖ', 'Μεζονέτα')], max_length=3),
),
migrations.AlterField(
model_name='room',
name='number',
field=models.IntegerField(),
),
migrations.AlterField(
model_name='room',
name='price',
field=models.FloatField(),
),
]
View File
+78
View File
@@ -0,0 +1,78 @@
from django.db import models
from phonenumber_field.modelfields import PhoneNumberField
from django.utils.translation import gettext_lazy as _
class Room(models.Model):
ROOM_CATEGORIES = (
('ΔΙΚ', 'Δίκλινο'),
('ΤΡΙ', 'Τρίκλινο'),
('ΜΕΖ', 'Μεζονέτα'),
)
number = models.IntegerField()
category = models.CharField(max_length=3, choices=ROOM_CATEGORIES)
beds = models.IntegerField()
capacity = models.IntegerField()
price = models.FloatField()
def __str__(self):
return f'{self.number}-{self.category} με {self.beds} κρεβάτια για {self.capacity} άτομα.'
class Booking(models.Model):
ROOM_CATEGORIES = (
('ΔΙΚ', _('Δίκλινο')),
('ΤΡΙ', _('Τρίκλινο')),
('ΜΕΖ', _('Μεζονέτα')),
)
ACCEPT_OPTION = (
('NΑΙ', 'ΝΑΙ'),
('ΟΧΙ', 'ΟΧΙ'),
('ΝΕΟ', 'ΝΕΟ'),
)
COUNTRY = (
('AUT', 'Αυστρία'),
('BEL', 'Βέλγιο'),
('BGR', 'Βουλγαρία'),
('CHN', 'Κίνα'),
('CYP', 'Κύπρος'),
('CZE', 'Τσεχία'),
('DEU', 'Γερμανία'),
('DNK', 'Δανία'),
('ESP', 'Ισπανία'),
('EST', 'Εστονία'),
('FIN', 'Φιλανδία'),
('FRA', 'Γαλλία'),
('GBR', 'Αγγλία'),
('GRC', 'Ελλάδα'),
('HRV', 'Κροατία'),
('HUN', 'Ουγγαρία'),
('IRL', 'Ιρλανδία'),
('ITA', 'Ιταλία'),
('LTU', 'Λιθουανία'),
('LUX', 'Λουξεμβούργο'),
('LVA', 'Λετονία'),
('MLT', 'Μάλτα'),
('NLD', 'Ολλανδία'),
('POL', 'Πολωνία'),
('PRT', 'Πορτογαλία'),
('ROU', 'Ρουμανία'),
('RUS', 'Ρωσία'),
('SVK', 'Σλοβακία'),
('SVN', 'Σλοβενία'),
('SWE', 'Σουηδία'),
('TUR', 'Τουρκία'),
)
name = models.CharField(max_length=50)
surname = models.CharField(max_length=50)
telephone = PhoneNumberField()
email = models.EmailField(blank=True, max_length=50)
category = models.CharField(max_length=3, choices=ROOM_CATEGORIES, default=None)
room = models.ForeignKey(Room, on_delete=models.CASCADE)
check_in = models.DateField()
check_out = models.DateField()
final_price = models.FloatField(blank=True)
country = models.CharField(max_length=3, choices=COUNTRY, blank=True)
info = models.TextField(blank=True)
accept = models.CharField(max_length=3, choices=ACCEPT_OPTION, default=None)
created_at = models.DateTimeField(auto_now_add=True)
@@ -0,0 +1,6 @@
from django.template.defaulttags import register
@register.filter
def get_item(dictionary, key):
return dictionary.get(key)
@@ -0,0 +1,69 @@
from django import template
from django.utils import translation
from django.conf import settings
import flag
register = template.Library()
@register.filter
def get_language_info_list_ex(request):
"""
Sample result:
[{'bidi': False,
'code': 'en',
'flag': '🇬🇧',
'is_current': False,
'name': 'English',
'name_local': 'English',
'name_translated': 'Inglese'},
{'bidi': False,
'code': 'it',
'flag': '🇮🇹',
'is_current': True,
'name': 'Italian',
'name_local': 'italiano',
'name_translated': 'Italiano'},
{'bidi': False,
'code': 'es',
'flag': '🇪🇸',
'is_current': False,
'name': 'Spanish',
'name_local': 'español',
'name_translated': 'Spagnolo'}]
"""
data = []
# From django.templatetags.i18n.GetLanguageInfoListNode
def get_language_info(language):
# ``language`` is either a language code string or a sequence
# with the language code as its first item
if len(language[0]) > 1:
return translation.get_language_info(language[0])
else:
return translation.get_language_info(str(language))
flag_map = {
'en': 'gb',
}
# Es: 'es'
current_language = translation.get_language()
# Es: [('en', 'Inglés'), ('it', 'Italiano'), ('es', 'Español')]
#languages = [(k, translation.gettext(v)) for k, v in settings.LANGUAGES]
for language in settings.LANGUAGES:
# Es: {'bidi': False, 'code': 'es', 'name': 'Spanish', 'name_local': 'español', 'name_translated': 'Español'}
info = get_language_info(language)
code = info['code']
info['is_current'] = (code == current_language)
# This requires emoji-country-flag Python package
info['flag'] = flag.flag(flag_map.get(code, code))
data.append(info)
return data
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+23
View File
@@ -0,0 +1,23 @@
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import path
from django.views.generic import RedirectView
from .views import IndexPageView, AboutPageView, VillasPageView, RoomsPageView, ContactPageView, DoubleRoomsPageView, \
TripleRoomsPageView, BookingFormView, DashboardPageView, LocationPageView # , AvailFormView
app_name = 'alion_app'
urlpatterns = [
path('', IndexPageView.as_view(), name='index'),
path('villas', VillasPageView.as_view(), name='villas'),
path('rooms', RoomsPageView.as_view(), name='rooms'),
path('double', DoubleRoomsPageView.as_view(), name='double'),
path('triple', TripleRoomsPageView.as_view(), name='triple'),
path('about', AboutPageView.as_view(), name='about'),
path('contact', ContactPageView.as_view(), name='contact'),
path('location', LocationPageView.as_view(), name='location'),
#path('check', AvailFormView.as_view(), name='check'),
path('book', BookingFormView.as_view(), name='book'),
path('favicon.ico', RedirectView.as_view(url=staticfiles_storage.url('images/favicon.ico'))),
]
+432
View File
@@ -0,0 +1,432 @@
# 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