first commit
This commit is contained in:
0
core/apps/tickets/__init__.py
Normal file
0
core/apps/tickets/__init__.py
Normal file
4
core/apps/tickets/admin/__init__.py
Normal file
4
core/apps/tickets/admin/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from .extra_services import * # noqa
|
||||
from .hotel import * # noqa
|
||||
from .tariff import * # noqa
|
||||
from .tickets import * # noqa
|
||||
23
core/apps/tickets/admin/extra_services.py
Normal file
23
core/apps/tickets/admin/extra_services.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from django.contrib import admin
|
||||
from unfold.admin import ModelAdmin
|
||||
|
||||
from core.apps.tickets.models import ExtraServicesModel, PaidServicesModel
|
||||
|
||||
|
||||
@admin.register(ExtraServicesModel)
|
||||
class ExtraServocesAdmin(ModelAdmin):
|
||||
list_display = (
|
||||
"id",
|
||||
"__str__",
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@admin.register(PaidServicesModel)
|
||||
class PaidServicesAdmin(ModelAdmin):
|
||||
list_display = (
|
||||
"id",
|
||||
"__str__",
|
||||
)
|
||||
20
core/apps/tickets/admin/hotel.py
Normal file
20
core/apps/tickets/admin/hotel.py
Normal file
@@ -0,0 +1,20 @@
|
||||
from django.contrib import admin
|
||||
from unfold.admin import ModelAdmin
|
||||
|
||||
from core.apps.tickets.models import HotelModel, HotelImagesModel
|
||||
|
||||
|
||||
class HotelImagesInline(admin.TabularInline):
|
||||
model = HotelImagesModel
|
||||
extra = 1
|
||||
|
||||
|
||||
@admin.register(HotelModel)
|
||||
class HotelAdmin(ModelAdmin):
|
||||
list_display = (
|
||||
"id",
|
||||
"__str__",
|
||||
)
|
||||
inlines = (
|
||||
HotelImagesInline,
|
||||
)
|
||||
12
core/apps/tickets/admin/tariff.py
Normal file
12
core/apps/tickets/admin/tariff.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from django.contrib import admin
|
||||
from unfold.admin import ModelAdmin
|
||||
|
||||
from core.apps.tickets.models import TariffModel
|
||||
|
||||
|
||||
@admin.register(TariffModel)
|
||||
class TariffAdmin(ModelAdmin):
|
||||
list_display = (
|
||||
"id",
|
||||
"__str__",
|
||||
)
|
||||
80
core/apps/tickets/admin/tickets.py
Normal file
80
core/apps/tickets/admin/tickets.py
Normal file
@@ -0,0 +1,80 @@
|
||||
from django.contrib import admin
|
||||
from unfold.admin import ModelAdmin
|
||||
|
||||
from core.apps.tickets.models import (
|
||||
TicketorderModel,
|
||||
TicketsAmenitiesModel,
|
||||
TicketsCommentsModel,
|
||||
TicketsHotelMealsModel,
|
||||
TicketsImagesModel,
|
||||
TicketsIncludedServicesModel,
|
||||
TicketsItineraryDestinationsModel,
|
||||
TicketsItineraryImagesModel,
|
||||
TicketsItineraryModel,
|
||||
TicketsModel,
|
||||
)
|
||||
|
||||
|
||||
class TicketsImagesInline(admin.TabularInline):
|
||||
model = TicketsImagesModel
|
||||
extra = 1
|
||||
|
||||
|
||||
class TicketsAmenitiesInline(admin.TabularInline):
|
||||
model = TicketsAmenitiesModel
|
||||
extra = 1
|
||||
|
||||
|
||||
class TicketsIncludedServicesInline(admin.TabularInline):
|
||||
model = TicketsIncludedServicesModel
|
||||
extra = 1
|
||||
|
||||
|
||||
class TicketsHotelMealsInline(admin.TabularInline):
|
||||
model = TicketsHotelMealsModel
|
||||
extra = 1
|
||||
|
||||
|
||||
@admin.register(TicketsModel)
|
||||
class TicketsAdmin(ModelAdmin):
|
||||
list_display = ("id", "title", "price", "departure_date", "destination", "passenger_count", "rating")
|
||||
inlines = [
|
||||
TicketsImagesInline,
|
||||
TicketsAmenitiesInline,
|
||||
TicketsIncludedServicesInline,
|
||||
TicketsHotelMealsInline,
|
||||
]
|
||||
|
||||
|
||||
class TicketsItineraryImagesInline(admin.TabularInline):
|
||||
model = TicketsItineraryImagesModel
|
||||
extra = 1
|
||||
|
||||
|
||||
class TicketsItineraryDestinationsInline(admin.TabularInline):
|
||||
model = TicketsItineraryDestinationsModel
|
||||
extra = 1
|
||||
|
||||
|
||||
@admin.register(TicketsItineraryModel)
|
||||
class TicketsItineraryAdmin(ModelAdmin):
|
||||
list_display = ("id", "ticket", "title", "duration")
|
||||
inlines = [TicketsItineraryImagesInline, TicketsItineraryDestinationsInline]
|
||||
|
||||
|
||||
@admin.register(TicketsCommentsModel)
|
||||
class TicketsCommentsAdmin(ModelAdmin):
|
||||
list_display = (
|
||||
"user",
|
||||
"text",
|
||||
"rating",
|
||||
"ticket",
|
||||
)
|
||||
|
||||
|
||||
@admin.register(TicketorderModel)
|
||||
class TicketorderAdmin(ModelAdmin):
|
||||
list_display = (
|
||||
"id",
|
||||
"__str__",
|
||||
)
|
||||
7
core/apps/tickets/apps.py
Normal file
7
core/apps/tickets/apps.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class ModuleConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "core.apps.tickets"
|
||||
label = "tickets"
|
||||
4
core/apps/tickets/filters/__init__.py
Normal file
4
core/apps/tickets/filters/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from .extra_services import * # noqa
|
||||
from .hotel import * # noqa
|
||||
from .tariff import * # noqa
|
||||
from .tickets import * # noqa
|
||||
23
core/apps/tickets/filters/extra_services.py
Normal file
23
core/apps/tickets/filters/extra_services.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from django_filters import rest_framework as filters
|
||||
|
||||
from core.apps.tickets.models import ExtraServicesModel, PaidServicesModel
|
||||
|
||||
|
||||
class ExtraServicesFilter(filters.FilterSet):
|
||||
# name = filters.CharFilter(field_name="name", lookup_expr="icontains")
|
||||
|
||||
class Meta:
|
||||
model = ExtraServicesModel
|
||||
fields = [
|
||||
"name",
|
||||
]
|
||||
|
||||
|
||||
class PaidServicesFilter(filters.FilterSet):
|
||||
# name = filters.CharFilter(field_name="name", lookup_expr="icontains")
|
||||
|
||||
class Meta:
|
||||
model = PaidServicesModel
|
||||
fields = [
|
||||
"name",
|
||||
]
|
||||
14
core/apps/tickets/filters/hotel.py
Normal file
14
core/apps/tickets/filters/hotel.py
Normal file
@@ -0,0 +1,14 @@
|
||||
from django_filters import rest_framework as filters
|
||||
|
||||
from core.apps.tickets.models import HotelModel, HotelImagesModel
|
||||
|
||||
|
||||
class HotelFilter(filters.FilterSet):
|
||||
# name = filters.CharFilter(field_name="name", lookup_expr="icontains")
|
||||
|
||||
class Meta:
|
||||
model = HotelModel
|
||||
fields = [
|
||||
"name",
|
||||
]
|
||||
|
||||
13
core/apps/tickets/filters/tariff.py
Normal file
13
core/apps/tickets/filters/tariff.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from django_filters import rest_framework as filters
|
||||
|
||||
from core.apps.tickets.models import TariffModel
|
||||
|
||||
|
||||
class TariffFilter(filters.FilterSet):
|
||||
# name = filters.CharFilter(field_name="name", lookup_expr="icontains")
|
||||
|
||||
class Meta:
|
||||
model = TariffModel
|
||||
fields = [
|
||||
"name",
|
||||
]
|
||||
23
core/apps/tickets/filters/tickets.py
Normal file
23
core/apps/tickets/filters/tickets.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from django_filters import rest_framework as filters
|
||||
|
||||
from core.apps.tickets.models import TicketorderModel, TicketsModel
|
||||
|
||||
|
||||
class TicketsFilter(filters.FilterSet):
|
||||
# name = filters.CharFilter(field_name="name", lookup_expr="icontains")
|
||||
|
||||
class Meta:
|
||||
model = TicketsModel
|
||||
fields = [
|
||||
"name",
|
||||
]
|
||||
|
||||
|
||||
class TicketorderFilter(filters.FilterSet):
|
||||
# name = filters.CharFilter(field_name="name", lookup_expr="icontains")
|
||||
|
||||
class Meta:
|
||||
model = TicketorderModel
|
||||
fields = [
|
||||
"name",
|
||||
]
|
||||
4
core/apps/tickets/forms/__init__.py
Normal file
4
core/apps/tickets/forms/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from .extra_services import * # noqa
|
||||
from .hotel import * # noqa
|
||||
from .tariff import * # noqa
|
||||
from .tickets import * # noqa
|
||||
17
core/apps/tickets/forms/extra_services.py
Normal file
17
core/apps/tickets/forms/extra_services.py
Normal file
@@ -0,0 +1,17 @@
|
||||
from django import forms
|
||||
|
||||
from core.apps.tickets.models import ExtraServicesModel, PaidServicesModel
|
||||
|
||||
|
||||
class ExtraServicesForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = ExtraServicesModel
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class PaidServicesForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = PaidServicesModel
|
||||
fields = "__all__"
|
||||
10
core/apps/tickets/forms/hotel.py
Normal file
10
core/apps/tickets/forms/hotel.py
Normal file
@@ -0,0 +1,10 @@
|
||||
from django import forms
|
||||
|
||||
from core.apps.tickets.models import HotelModel
|
||||
|
||||
|
||||
class HotelForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = HotelModel
|
||||
fields = "__all__"
|
||||
10
core/apps/tickets/forms/paid_services.py
Normal file
10
core/apps/tickets/forms/paid_services.py
Normal file
@@ -0,0 +1,10 @@
|
||||
from django import forms
|
||||
|
||||
from core.apps.tickets.models import PaidServicesModel
|
||||
|
||||
|
||||
class PaidServicesForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = PaidServicesModel
|
||||
fields = "__all__"
|
||||
10
core/apps/tickets/forms/tariff.py
Normal file
10
core/apps/tickets/forms/tariff.py
Normal file
@@ -0,0 +1,10 @@
|
||||
from django import forms
|
||||
|
||||
from core.apps.tickets.models import TariffModel
|
||||
|
||||
|
||||
class TariffForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = TariffModel
|
||||
fields = "__all__"
|
||||
17
core/apps/tickets/forms/tickets.py
Normal file
17
core/apps/tickets/forms/tickets.py
Normal file
@@ -0,0 +1,17 @@
|
||||
from django import forms
|
||||
|
||||
from core.apps.tickets.models import TicketorderModel, TicketsModel
|
||||
|
||||
|
||||
class TicketsForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = TicketsModel
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class TicketorderForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = TicketorderModel
|
||||
fields = "__all__"
|
||||
298
core/apps/tickets/migrations/0001_initial.py
Normal file
298
core/apps/tickets/migrations/0001_initial.py
Normal file
@@ -0,0 +1,298 @@
|
||||
# Generated by Django 5.1.3 on 2025-09-19 10:19
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('accounts', '0001_initial'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='ExtraServicesModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('name', models.CharField(max_length=255, verbose_name='name')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'ExtraServicesModel',
|
||||
'verbose_name_plural': 'ExtraServicesModels',
|
||||
'db_table': 'extra_services',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='HotelModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255, verbose_name='name')),
|
||||
('address', models.TextField(verbose_name='address')),
|
||||
('city', models.CharField(max_length=100, verbose_name='city')),
|
||||
('country', models.CharField(max_length=100, verbose_name='city')),
|
||||
('desc', models.TextField(blank=True, null=True, verbose_name='description')),
|
||||
('phone', models.CharField(blank=True, max_length=50, null=True, verbose_name='phone number')),
|
||||
('website', models.URLField(blank=True, null=True, verbose_name='hotel website')),
|
||||
('rating', models.FloatField(blank=True, null=True, verbose_name='rating')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'HotelModel',
|
||||
'verbose_name_plural': 'HotelModels',
|
||||
'db_table': 'hotel',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='PaidServicesModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('name', models.CharField(max_length=255, verbose_name='name')),
|
||||
('price', models.IntegerField(verbose_name='price')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'PaidServicesModel',
|
||||
'verbose_name_plural': 'PaidServicesModels',
|
||||
'db_table': 'paid_services',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TariffModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('name', models.CharField(choices=[('3', 'Standart'), ('4', 'Comfort'), ('5', 'Luxury')], default=('3', 'Standart'), max_length=255)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'TariffModel',
|
||||
'verbose_name_plural': 'TariffModels',
|
||||
'db_table': 'tariff',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TicketsItineraryModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('title', models.CharField(max_length=255, verbose_name='title')),
|
||||
('duration', models.IntegerField(verbose_name='duration')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'TicketsItineraryModel',
|
||||
'verbose_name_plural': 'TicketsItineraryModel',
|
||||
'db_table': 'tickets_itinerary',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='HotelImagesModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('image', models.ImageField(upload_to='hotel_images/', verbose_name='image')),
|
||||
('hotel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tickets.hotelmodel', verbose_name='hotel')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'HotelImagesModel',
|
||||
'verbose_name_plural': 'HotelImagesModels',
|
||||
'db_table': 'hotel_images',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TicketsItineraryImagesModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('image', models.ImageField(upload_to='ticket-included-services-images/', verbose_name='image')),
|
||||
('tickets_itinerary', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_itinerary_image', to='tickets.ticketsitinerarymodel', verbose_name='tickets_itinerary')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'TicketsItineraryImagesModel',
|
||||
'verbose_name_plural': 'TicketsItineraryImagesModel',
|
||||
'db_table': 'tickets_itinerary_images',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TicketsItineraryDestinationsModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('name', models.CharField(max_length=255, verbose_name='name')),
|
||||
('tickets_itinerary', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_itinerary_destinations', to='tickets.ticketsitinerarymodel', verbose_name='tickets_itinerary')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'TicketsItineraryDestinationsModel',
|
||||
'verbose_name_plural': 'TicketsItineraryDestinationsModel',
|
||||
'db_table': 'tickets_itinerary_destinations',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TicketsModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=255, verbose_name='title')),
|
||||
('price', models.BigIntegerField(verbose_name='price')),
|
||||
('departure_date', models.DateField(verbose_name='departure date')),
|
||||
('departure', models.CharField(max_length=255, verbose_name='departure')),
|
||||
('destination', models.CharField(max_length=255, verbose_name='destination')),
|
||||
('departure_time', models.DateTimeField(verbose_name='departure time')),
|
||||
('travel_time', models.DateTimeField(verbose_name='travel time')),
|
||||
('passenger_count', models.IntegerField(verbose_name='passenger count')),
|
||||
('languages', models.CharField(max_length=255, verbose_name='languages')),
|
||||
('rating', models.FloatField(verbose_name='rating')),
|
||||
('hotel_info', models.TextField(verbose_name='hotel info')),
|
||||
('duration_days', models.IntegerField(verbose_name='duration days')),
|
||||
('hotel_meals', models.TextField(blank=True, null=True, verbose_name='hotel meals')),
|
||||
('slug', models.SlugField(max_length=255, unique=True, verbose_name='slug')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')),
|
||||
('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')),
|
||||
('tariff', models.ManyToManyField(related_name='ticket_tariffs', to='tickets.tariffmodel', verbose_name='tariff')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'TicketsModel',
|
||||
'verbose_name_plural': 'TicketsModels',
|
||||
'db_table': 'tickets',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='ticketsitinerarymodel',
|
||||
name='ticket',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_itinerary', to='tickets.ticketsmodel', verbose_name='ticket'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TicketsIncludedServicesModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('image', models.ImageField(upload_to='ticket-included-services-images/', verbose_name='image')),
|
||||
('title', models.CharField(max_length=255, verbose_name='title')),
|
||||
('desc', models.TextField(verbose_name='description')),
|
||||
('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_included_services', to='tickets.ticketsmodel', verbose_name='ticket')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'TicketsIncludedServicesModel',
|
||||
'verbose_name_plural': 'TicketsIncludedServicesModel',
|
||||
'db_table': 'tickets_included_services',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TicketsImagesModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('image', models.ImageField(upload_to='ticket-images/', verbose_name='image')),
|
||||
('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_images', to='tickets.ticketsmodel', verbose_name='ticket')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'TicketsImagesModel',
|
||||
'verbose_name_plural': 'TicketsImagesModel',
|
||||
'db_table': 'tickets_images',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TicketsHotelMealsModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('image', models.ImageField(upload_to='ticket-hotel-meals/', verbose_name='image')),
|
||||
('name', models.CharField(max_length=255, verbose_name='name')),
|
||||
('desc', models.TextField(verbose_name='description')),
|
||||
('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_hotel_meals', to='tickets.ticketsmodel', verbose_name='ticket')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'TicketsHotelMealsModel',
|
||||
'verbose_name_plural': 'TicketsHotelMealsModel',
|
||||
'db_table': 'tickets_hotel_meals',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TicketsCommentsModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('text', models.TextField(verbose_name='text')),
|
||||
('rating', models.FloatField(verbose_name='rating')),
|
||||
('created', models.DateTimeField(auto_now_add=True, verbose_name='created')),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')),
|
||||
('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_comments', to='tickets.ticketsmodel', verbose_name='ticket')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'TicketsCommentsModel',
|
||||
'verbose_name_plural': 'TicketsCommentsModel',
|
||||
'db_table': 'tickets_comments',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TicketsAmenitiesModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('name', models.CharField(max_length=255, verbose_name='name')),
|
||||
('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_amenities', to='tickets.ticketsmodel', verbose_name='ticket')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'TicketsAmenitiesModel',
|
||||
'verbose_name_plural': 'TicketsAmenitiesModel',
|
||||
'db_table': 'tickets_amenities',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TicketorderModel',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('departure', models.CharField(max_length=255, verbose_name='departure')),
|
||||
('destination', models.CharField(max_length=255, verbose_name='destination')),
|
||||
('departure_date', models.DateField(verbose_name='departure date')),
|
||||
('arrival_time', models.DateField(verbose_name='arrival time')),
|
||||
('tariff', models.CharField(max_length=255, verbose_name='tariff')),
|
||||
('transport', models.CharField(max_length=255, verbose_name='transport')),
|
||||
('order_status', models.CharField(choices=[('pending_payment', 'Pending Payment'), ('pending_confirmation', 'Pending Confirmation'), ('cancelled', 'Cancelled'), ('confirmed', 'Confirmed'), ('completed', 'Completed')], default='pending_payment', max_length=255, verbose_name='order status')),
|
||||
('total_price', models.BigIntegerField(verbose_name='total price')),
|
||||
('extra_paid_service', models.ManyToManyField(to='tickets.paidservicesmodel', verbose_name='extra paid services')),
|
||||
('extra_service', models.ManyToManyField(to='tickets.extraservicesmodel', verbose_name='extra services')),
|
||||
('participant', models.ManyToManyField(blank=True, null=True, to='accounts.participantmodel', verbose_name='participant')),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')),
|
||||
('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tickets.ticketsmodel', verbose_name='ticket')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'TicketorderModel',
|
||||
'verbose_name_plural': 'TicketorderModels',
|
||||
'db_table': 'ticketorder',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='paidservicesmodel',
|
||||
name='ticket',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_extra_paid_service', to='tickets.ticketsmodel', verbose_name='ticket'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='hotelmodel',
|
||||
name='ticket',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_hotel', to='tickets.ticketsmodel', verbose_name='ticket'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='extraservicesmodel',
|
||||
name='ticket',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_extra_service', to='tickets.ticketsmodel', verbose_name='ticket'),
|
||||
),
|
||||
]
|
||||
0
core/apps/tickets/migrations/__init__.py
Normal file
0
core/apps/tickets/migrations/__init__.py
Normal file
4
core/apps/tickets/models/__init__.py
Normal file
4
core/apps/tickets/models/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from .extra_services import * # noqa
|
||||
from .hotel import * # noqa
|
||||
from .tariff import * # noqa
|
||||
from .tickets import * # noqa
|
||||
49
core/apps/tickets/models/extra_services.py
Normal file
49
core/apps/tickets/models/extra_services.py
Normal file
@@ -0,0 +1,49 @@
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django_core.models import AbstractBaseModel
|
||||
from ..models.tickets import TicketsModel
|
||||
|
||||
|
||||
class ExtraServicesModel(AbstractBaseModel):
|
||||
name = models.CharField(verbose_name=_("name"), max_length=255)
|
||||
ticket = models.ForeignKey(TicketsModel, verbose_name=_("ticket"), related_name="ticket_extra_service",
|
||||
on_delete=models.CASCADE)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
name="mock",
|
||||
ticket=TicketsModel._create_fake(),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "extra_services"
|
||||
verbose_name = _("ExtraServicesModel")
|
||||
verbose_name_plural = _("ExtraServicesModels")
|
||||
|
||||
|
||||
class PaidServicesModel(AbstractBaseModel):
|
||||
name = models.CharField(verbose_name=_("name"), max_length=255)
|
||||
price = models.IntegerField(verbose_name=_("price"))
|
||||
ticket = models.ForeignKey(TicketsModel, verbose_name=_("ticket"), related_name="ticket_extra_paid_service",
|
||||
on_delete=models.CASCADE)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
name="mock",
|
||||
price=40,
|
||||
ticket=TicketsModel._create_fake(),
|
||||
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "paid_services"
|
||||
verbose_name = _("PaidServicesModel")
|
||||
verbose_name_plural = _("PaidServicesModels")
|
||||
60
core/apps/tickets/models/hotel.py
Normal file
60
core/apps/tickets/models/hotel.py
Normal file
@@ -0,0 +1,60 @@
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django_core.models import AbstractBaseModel
|
||||
from .tickets import TicketsModel
|
||||
|
||||
|
||||
class HotelModel(AbstractBaseModel):
|
||||
ticket = models.ForeignKey(TicketsModel, related_name="ticket_hotel", verbose_name=_("ticket"),
|
||||
on_delete=models.CASCADE)
|
||||
name = models.CharField(verbose_name=_("name"), max_length=255)
|
||||
address = models.TextField(verbose_name=_("address"))
|
||||
city = models.CharField(verbose_name=_("city"), max_length=100)
|
||||
country = models.CharField(verbose_name=_("city"), max_length=100)
|
||||
desc = models.TextField(verbose_name=_("description"), blank=True, null=True)
|
||||
phone = models.CharField(verbose_name=_("phone number"), max_length=50, blank=True, null=True)
|
||||
website = models.URLField(verbose_name=_("hotel website"), blank=True, null=True)
|
||||
rating = models.FloatField(verbose_name=_("rating"), blank=True, null=True)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
name="mock",
|
||||
address="mock",
|
||||
city="mock",
|
||||
country="mock",
|
||||
desc="mock",
|
||||
phone="mock",
|
||||
website="https://www.default.com/",
|
||||
rating=4.5,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "hotel"
|
||||
verbose_name = _("HotelModel")
|
||||
verbose_name_plural = _("HotelModels")
|
||||
|
||||
|
||||
class HotelImagesModel(AbstractBaseModel):
|
||||
image = models.ImageField(verbose_name=_("image"), upload_to="hotel_images/")
|
||||
hotel = models.ForeignKey(HotelModel, verbose_name=_("hotel"), on_delete=models.CASCADE)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
image="resources/static/images/logo.png",
|
||||
hotel=HotelModel._create_fake(),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "hotel_images"
|
||||
verbose_name = _("HotelImagesModel")
|
||||
verbose_name_plural = _("HotelImagesModels")
|
||||
27
core/apps/tickets/models/tariff.py
Normal file
27
core/apps/tickets/models/tariff.py
Normal file
@@ -0,0 +1,27 @@
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django_core.models import AbstractBaseModel
|
||||
|
||||
|
||||
class TariffModel(AbstractBaseModel):
|
||||
Tariff_Choise = (
|
||||
("3", "Standart"),
|
||||
("4", "Comfort"),
|
||||
("5", "Luxury"),
|
||||
)
|
||||
|
||||
name = models.CharField(choices=Tariff_Choise, max_length=255, default=Tariff_Choise[0])
|
||||
|
||||
def __str__(self):
|
||||
return str(self.name)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
name="mock",
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "tariff"
|
||||
verbose_name = _("TariffModel")
|
||||
verbose_name_plural = _("TariffModels")
|
||||
322
core/apps/tickets/models/tickets.py
Normal file
322
core/apps/tickets/models/tickets.py
Normal file
@@ -0,0 +1,322 @@
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django_core.models import AbstractBaseModel
|
||||
|
||||
from core.apps.accounts.models import User
|
||||
from core.apps.accounts.models.participant import ParticipantModel
|
||||
|
||||
from .tariff import TariffModel
|
||||
from django.utils.text import slugify
|
||||
|
||||
|
||||
class TicketsModel(AbstractBaseModel):
|
||||
"""Chiptalar haqidagi asosiy ma’lumotlarni saqlaydi."""
|
||||
|
||||
title = models.CharField(verbose_name=_("title"), max_length=255)
|
||||
price = models.BigIntegerField(verbose_name=_("price"))
|
||||
departure_date = models.DateField(verbose_name=_("departure date"))
|
||||
departure = models.CharField(verbose_name=_("departure"), max_length=255)
|
||||
destination = models.CharField(verbose_name=_("destination"), max_length=255)
|
||||
#############
|
||||
# Bu ikkisi aniq bo'lgandan keyin yo olib tashlanadi yoki qoladi !
|
||||
departure_time = models.DateTimeField(verbose_name=_("departure time"))
|
||||
travel_time = models.DateTimeField(verbose_name=_("travel time"))
|
||||
##############
|
||||
passenger_count = models.IntegerField(verbose_name=_("passenger count"))
|
||||
languages = models.CharField(verbose_name=_("languages"), max_length=255)
|
||||
rating = models.FloatField(verbose_name=_("rating"))
|
||||
hotel_info = models.TextField(verbose_name=_("hotel info"))
|
||||
duration_days = models.IntegerField(verbose_name=_("duration days"))
|
||||
hotel_meals = models.TextField(verbose_name=_("hotel meals"), null=True, blank=True)
|
||||
tariff = models.ManyToManyField(TariffModel, related_name="ticket_tariffs", verbose_name=_("tariff"))
|
||||
slug = models.SlugField(verbose_name=_("slug"), max_length=255, unique=True)
|
||||
created_at = models.DateTimeField(verbose_name=_("created at"), auto_now_add=True)
|
||||
updated_at = models.DateTimeField(verbose_name=_("updated at"), auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if not self.slug:
|
||||
self.slug = slugify(self.title)
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
name="mock",
|
||||
price=150000,
|
||||
departure_date="2025-10-01",
|
||||
destination="mock",
|
||||
departure="mock",
|
||||
passenger_count=4,
|
||||
rating=4.5,
|
||||
hotel_info="mock",
|
||||
duration_days=15,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "tickets"
|
||||
verbose_name = _("TicketsModel")
|
||||
verbose_name_plural = _("TicketsModels")
|
||||
|
||||
|
||||
class TicketsImagesModel(AbstractBaseModel):
|
||||
"""Chipta bilan bog‘liq rasmlarni saqlaydi."""
|
||||
|
||||
image = models.ImageField(verbose_name=_("image"), upload_to="ticket-images/")
|
||||
ticket = models.ForeignKey(
|
||||
TicketsModel, verbose_name=_("ticket"), related_name="ticket_images", on_delete=models.CASCADE
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
image="resources/static/images/logo.png",
|
||||
ticket=TicketsModel._create_fake(),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "tickets_images"
|
||||
verbose_name = _("TicketsImagesModel")
|
||||
verbose_name_plural = _("TicketsImagesModel")
|
||||
|
||||
|
||||
class TicketsAmenitiesModel(AbstractBaseModel):
|
||||
"""Chipta ichidagi qulayliklarni saqlaydi."""
|
||||
|
||||
name = models.CharField(verbose_name=_("name"), max_length=255)
|
||||
ticket = models.ForeignKey(
|
||||
TicketsModel, verbose_name=_("ticket"), related_name="ticket_amenities", on_delete=models.CASCADE
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
name="mock",
|
||||
ticket=TicketsModel._create_fake(),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "tickets_amenities"
|
||||
verbose_name = _("TicketsAmenitiesModel")
|
||||
verbose_name_plural = _("TicketsAmenitiesModel")
|
||||
|
||||
|
||||
class TicketsIncludedServicesModel(AbstractBaseModel):
|
||||
"""Chipta narxiga kiradigan xizmatlarni saqlaydi."""
|
||||
|
||||
image = models.ImageField(verbose_name=_("image"), upload_to="ticket-included-services-images/")
|
||||
title = models.CharField(verbose_name=_("title"), max_length=255)
|
||||
desc = models.TextField(verbose_name=_("description"))
|
||||
ticket = models.ForeignKey(
|
||||
TicketsModel, verbose_name=_("ticket"), related_name="ticket_included_services", on_delete=models.CASCADE
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
image="resources/static/images/logo.png",
|
||||
title="mock",
|
||||
desc="mock",
|
||||
ticket=TicketsModel._create_fake(),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "tickets_included_services"
|
||||
verbose_name = _("TicketsIncludedServicesModel")
|
||||
verbose_name_plural = _("TicketsIncludedServicesModel")
|
||||
|
||||
|
||||
class TicketsItineraryModel(AbstractBaseModel):
|
||||
"""Chipta bo‘yicha safar rejasini saqlaydi."""
|
||||
|
||||
title = models.CharField(verbose_name=_("title"), max_length=255)
|
||||
duration = models.IntegerField(verbose_name=_("duration"))
|
||||
ticket = models.ForeignKey(
|
||||
TicketsModel, verbose_name=_("ticket"), related_name="ticket_itinerary", on_delete=models.CASCADE
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
title="mock",
|
||||
duration=4,
|
||||
ticket=TicketsModel._create_fake(),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "tickets_itinerary"
|
||||
verbose_name = _("TicketsItineraryModel")
|
||||
verbose_name_plural = _("TicketsItineraryModel")
|
||||
|
||||
|
||||
class TicketsItineraryImagesModel(AbstractBaseModel):
|
||||
"""Safar rejasiga oid rasmlarni saqlaydi."""
|
||||
|
||||
image = models.ImageField(verbose_name=_("image"), upload_to="ticket-included-services-images/")
|
||||
tickets_itinerary = models.ForeignKey(
|
||||
TicketsItineraryModel,
|
||||
verbose_name=_("tickets_itinerary"),
|
||||
related_name="ticket_itinerary_image",
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
image="resources/static/images/logo.png",
|
||||
tickets_itinerary=TicketsItineraryModel._create_fake(),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "tickets_itinerary_images"
|
||||
verbose_name = _("TicketsItineraryImagesModel")
|
||||
verbose_name_plural = _("TicketsItineraryImagesModel")
|
||||
|
||||
|
||||
class TicketsItineraryDestinationsModel(AbstractBaseModel):
|
||||
"""Safar davomida boriladigan manzillarni saqlaydi."""
|
||||
|
||||
name = models.CharField(verbose_name=_("name"), max_length=255)
|
||||
tickets_itinerary = models.ForeignKey(
|
||||
TicketsItineraryModel,
|
||||
verbose_name=_("tickets_itinerary"),
|
||||
related_name="ticket_itinerary_destinations",
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
name="mock",
|
||||
tickets_itinerary=TicketsItineraryModel._create_fake(),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "tickets_itinerary_destinations"
|
||||
verbose_name = _("TicketsItineraryDestinationsModel")
|
||||
verbose_name_plural = _("TicketsItineraryDestinationsModel")
|
||||
|
||||
|
||||
class TicketsHotelMealsModel(AbstractBaseModel):
|
||||
"""Mehmonxonada beriladigan taomlarni saqlaydi."""
|
||||
|
||||
image = models.ImageField(verbose_name=_("image"), upload_to="ticket-hotel-meals/")
|
||||
name = models.CharField(verbose_name=_("name"), max_length=255)
|
||||
desc = models.TextField(verbose_name=_("description"))
|
||||
ticket = models.ForeignKey(
|
||||
TicketsModel, verbose_name=_("ticket"), related_name="ticket_hotel_meals", on_delete=models.CASCADE
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
name="mock",
|
||||
desc="mock",
|
||||
ticket=TicketsModel._create_fake(),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "tickets_hotel_meals"
|
||||
verbose_name = _("TicketsHotelMealsModel")
|
||||
verbose_name_plural = _("TicketsHotelMealsModel")
|
||||
|
||||
|
||||
class TicketsCommentsModel(AbstractBaseModel):
|
||||
"""Chiptaga yozilgan sharh va baholarni saqlaydi."""
|
||||
|
||||
user = models.ForeignKey(User, verbose_name=_("user"), on_delete=models.CASCADE)
|
||||
text = models.TextField(verbose_name=_("text"))
|
||||
rating = models.FloatField(verbose_name=_("rating"))
|
||||
ticket = models.ForeignKey(
|
||||
TicketsModel, verbose_name=_("ticket"), related_name="ticket_comments", on_delete=models.CASCADE
|
||||
)
|
||||
created = models.DateTimeField(verbose_name=_("created"), auto_now_add=True)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
user=User._create_fake(),
|
||||
text="mock",
|
||||
rating=4.5,
|
||||
tickets_itinerary=TicketsModel._create_fake(),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "tickets_comments"
|
||||
verbose_name = _("TicketsCommentsModel")
|
||||
verbose_name_plural = _("TicketsCommentsModel")
|
||||
|
||||
|
||||
class TicketorderModel(AbstractBaseModel):
|
||||
STATUS_CHOICES = [
|
||||
("pending_payment", "Pending Payment"),
|
||||
("pending_confirmation", "Pending Confirmation"),
|
||||
("cancelled", "Cancelled"),
|
||||
("confirmed", "Confirmed"),
|
||||
("completed", "Completed"),
|
||||
]
|
||||
user = models.ForeignKey(User, verbose_name=_("user"), on_delete=models.CASCADE)
|
||||
departure = models.CharField(verbose_name=_("departure"), max_length=255)
|
||||
destination = models.CharField(verbose_name=_("destination"), max_length=255)
|
||||
departure_date = models.DateField(verbose_name=_("departure date"))
|
||||
arrival_time = models.DateField(verbose_name=_("arrival time"))
|
||||
participant = models.ManyToManyField(ParticipantModel, verbose_name=_("participant"), null=True, blank=True)
|
||||
ticket = models.ForeignKey(TicketsModel, verbose_name=_("ticket"), on_delete=models.CASCADE)
|
||||
tariff = models.CharField(verbose_name=_("tariff"), max_length=255)
|
||||
transport = models.CharField(verbose_name=_("transport"), max_length=255)
|
||||
extra_service = models.ManyToManyField("tickets.ExtraServicesModel", verbose_name=_("extra services"))
|
||||
extra_paid_service = models.ManyToManyField("tickets.PaidServicesModel", verbose_name=_("extra paid services"))
|
||||
order_status = models.CharField(verbose_name=_("order status"), max_length=255, choices=STATUS_CHOICES,
|
||||
default="pending_payment")
|
||||
total_price = models.BigIntegerField(verbose_name=_("total price"))
|
||||
|
||||
def __str__(self):
|
||||
return str(self.pk)
|
||||
|
||||
@classmethod
|
||||
def _create_fake(self):
|
||||
return self.objects.create(
|
||||
user=User._create_fake(),
|
||||
departure="mock",
|
||||
destination="mock",
|
||||
departure_date="2025-12-01",
|
||||
arrival_time="2025-12-01",
|
||||
participant=ParticipantModel._create_fake(),
|
||||
ticket=TicketsModel._create_fake(),
|
||||
tariff="mock",
|
||||
transport="mock",
|
||||
extra_service=ExtraServicesModel._create_fake(),
|
||||
extra_paid_service=PaidServicesModel._create_fake(),
|
||||
total_price=40,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = "ticketorder"
|
||||
verbose_name = _("TicketorderModel")
|
||||
verbose_name_plural = _("TicketorderModels")
|
||||
4
core/apps/tickets/permissions/__init__.py
Normal file
4
core/apps/tickets/permissions/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from .extra_services import * # noqa
|
||||
from .hotel import * # noqa
|
||||
from .tariff import * # noqa
|
||||
from .tickets import * # noqa
|
||||
23
core/apps/tickets/permissions/extra_services.py
Normal file
23
core/apps/tickets/permissions/extra_services.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from rest_framework import permissions
|
||||
|
||||
|
||||
class ExtraServicesPermission(permissions.BasePermission):
|
||||
|
||||
def __init__(self) -> None: ...
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
return self
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return True
|
||||
|
||||
|
||||
class PaidServicesPermission(permissions.BasePermission):
|
||||
|
||||
def __init__(self) -> None: ...
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
return self
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return True
|
||||
12
core/apps/tickets/permissions/hotel.py
Normal file
12
core/apps/tickets/permissions/hotel.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from rest_framework import permissions
|
||||
|
||||
|
||||
class HotelPermission(permissions.BasePermission):
|
||||
|
||||
def __init__(self) -> None: ...
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
return self
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return True
|
||||
12
core/apps/tickets/permissions/tariff.py
Normal file
12
core/apps/tickets/permissions/tariff.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from rest_framework import permissions
|
||||
|
||||
|
||||
class TariffPermission(permissions.BasePermission):
|
||||
|
||||
def __init__(self) -> None: ...
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
return self
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return True
|
||||
23
core/apps/tickets/permissions/tickets.py
Normal file
23
core/apps/tickets/permissions/tickets.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from rest_framework import permissions
|
||||
|
||||
|
||||
class TicketsPermission(permissions.BasePermission):
|
||||
|
||||
def __init__(self) -> None: ...
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
return self
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return True
|
||||
|
||||
|
||||
class TicketorderPermission(permissions.BasePermission):
|
||||
|
||||
def __init__(self) -> None: ...
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
return self
|
||||
|
||||
def has_permission(self, request, view):
|
||||
return True
|
||||
4
core/apps/tickets/serializers/__init__.py
Normal file
4
core/apps/tickets/serializers/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from .extra_services import * # noqa
|
||||
from .hotel import * # noqa
|
||||
from .tariff import * # noqa
|
||||
from .tickets import * # noqa
|
||||
2
core/apps/tickets/serializers/extra_services/__init__.py
Normal file
2
core/apps/tickets/serializers/extra_services/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from .extra_services import * # noqa
|
||||
from .paid_services import * # noqa
|
||||
@@ -0,0 +1,28 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from core.apps.tickets.models import ExtraServicesModel
|
||||
|
||||
|
||||
class BaseExtraServicesSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = ExtraServicesModel
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
]
|
||||
|
||||
|
||||
class ListExtraServicesSerializer(BaseExtraServicesSerializer):
|
||||
class Meta(BaseExtraServicesSerializer.Meta): ...
|
||||
|
||||
|
||||
class RetrieveExtraServicesSerializer(BaseExtraServicesSerializer):
|
||||
class Meta(BaseExtraServicesSerializer.Meta): ...
|
||||
|
||||
|
||||
class CreateExtraServicesSerializer(BaseExtraServicesSerializer):
|
||||
class Meta(BaseExtraServicesSerializer.Meta):
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
]
|
||||
@@ -0,0 +1,28 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from core.apps.tickets.models import PaidServicesModel
|
||||
|
||||
|
||||
class BasePaidServicesSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = PaidServicesModel
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
]
|
||||
|
||||
|
||||
class ListPaidServicesSerializer(BasePaidServicesSerializer):
|
||||
class Meta(BasePaidServicesSerializer.Meta): ...
|
||||
|
||||
|
||||
class RetrievePaidServicesSerializer(BasePaidServicesSerializer):
|
||||
class Meta(BasePaidServicesSerializer.Meta): ...
|
||||
|
||||
|
||||
class CreatePaidServicesSerializer(BasePaidServicesSerializer):
|
||||
class Meta(BasePaidServicesSerializer.Meta):
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
]
|
||||
1
core/apps/tickets/serializers/hotel/__init__.py
Normal file
1
core/apps/tickets/serializers/hotel/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .hotel import * # noqa
|
||||
28
core/apps/tickets/serializers/hotel/hotel.py
Normal file
28
core/apps/tickets/serializers/hotel/hotel.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from core.apps.tickets.models import HotelModel
|
||||
|
||||
|
||||
class BaseHotelSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = HotelModel
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
]
|
||||
|
||||
|
||||
class ListHotelSerializer(BaseHotelSerializer):
|
||||
class Meta(BaseHotelSerializer.Meta): ...
|
||||
|
||||
|
||||
class RetrieveHotelSerializer(BaseHotelSerializer):
|
||||
class Meta(BaseHotelSerializer.Meta): ...
|
||||
|
||||
|
||||
class CreateHotelSerializer(BaseHotelSerializer):
|
||||
class Meta(BaseHotelSerializer.Meta):
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
]
|
||||
1
core/apps/tickets/serializers/tariff/__init__.py
Normal file
1
core/apps/tickets/serializers/tariff/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .tariff import * # noqa
|
||||
28
core/apps/tickets/serializers/tariff/tariff.py
Normal file
28
core/apps/tickets/serializers/tariff/tariff.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from core.apps.tickets.models import TariffModel
|
||||
|
||||
|
||||
class BaseTariffSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = TariffModel
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
]
|
||||
|
||||
|
||||
class ListTariffSerializer(BaseTariffSerializer):
|
||||
class Meta(BaseTariffSerializer.Meta): ...
|
||||
|
||||
|
||||
class RetrieveTariffSerializer(BaseTariffSerializer):
|
||||
class Meta(BaseTariffSerializer.Meta): ...
|
||||
|
||||
|
||||
class CreateTariffSerializer(BaseTariffSerializer):
|
||||
class Meta(BaseTariffSerializer.Meta):
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
]
|
||||
2
core/apps/tickets/serializers/tickets/__init__.py
Normal file
2
core/apps/tickets/serializers/tickets/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from .ticketorder import * # noqa
|
||||
from .tickets import * # noqa
|
||||
28
core/apps/tickets/serializers/tickets/ticketorder.py
Normal file
28
core/apps/tickets/serializers/tickets/ticketorder.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from core.apps.tickets.models import TicketorderModel
|
||||
|
||||
|
||||
class BaseTicketorderSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = TicketorderModel
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
]
|
||||
|
||||
|
||||
class ListTicketorderSerializer(BaseTicketorderSerializer):
|
||||
class Meta(BaseTicketorderSerializer.Meta): ...
|
||||
|
||||
|
||||
class RetrieveTicketorderSerializer(BaseTicketorderSerializer):
|
||||
class Meta(BaseTicketorderSerializer.Meta): ...
|
||||
|
||||
|
||||
class CreateTicketorderSerializer(BaseTicketorderSerializer):
|
||||
class Meta(BaseTicketorderSerializer.Meta):
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
]
|
||||
132
core/apps/tickets/serializers/tickets/tickets.py
Normal file
132
core/apps/tickets/serializers/tickets/tickets.py
Normal file
@@ -0,0 +1,132 @@
|
||||
from rest_framework import serializers
|
||||
from core.apps.tickets.models import TicketsModel, TicketsImagesModel, TicketsAmenitiesModel, \
|
||||
TicketsIncludedServicesModel, TicketsItineraryModel, TicketsItineraryImagesModel, TicketsItineraryDestinationsModel, \
|
||||
TicketsHotelMealsModel, TicketsCommentsModel
|
||||
from core.apps.accounts.models import User
|
||||
|
||||
from core.apps.accounts.serializers.user import UserSerializer
|
||||
from core.apps.tickets.models.tariff import TariffModel
|
||||
|
||||
|
||||
class TicketsTariffSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = TariffModel
|
||||
fields = ['name']
|
||||
|
||||
|
||||
class CommentUserSerializer(UserSerializer):
|
||||
class Meta:
|
||||
model = User
|
||||
fields = ["id", "username"]
|
||||
|
||||
|
||||
class TicketsCommentsSerializer(serializers.ModelSerializer):
|
||||
user = CommentUserSerializer(read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = TicketsCommentsModel
|
||||
fields = ["user", "text", "rating"]
|
||||
|
||||
|
||||
class TicketsHotelMealsSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = TicketsHotelMealsModel
|
||||
fields = ["image", "name", "desc"]
|
||||
|
||||
|
||||
class TicketsItineraryDestinationsSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = TicketsItineraryDestinationsModel
|
||||
fields = ['name']
|
||||
|
||||
|
||||
class TicketsItineraryImagesSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = TicketsItineraryImagesModel
|
||||
fields = ['image']
|
||||
|
||||
|
||||
class TicketsItinerarySerializer(serializers.ModelSerializer):
|
||||
ticket_itinerary_image = TicketsItineraryImagesSerializer(many=True, read_only=True)
|
||||
ticket_itinerary_destinations = TicketsItineraryDestinationsSerializer(many=True, read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = TicketsItineraryModel
|
||||
fields = ["title", "duration", "ticket_itinerary_image", "ticket_itinerary_destinations"]
|
||||
|
||||
|
||||
class TicketsIncludedServicesSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = TicketsIncludedServicesModel
|
||||
fields = ["image", "title", "desc", ]
|
||||
|
||||
|
||||
class TicketsAmenitiesSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = TicketsAmenitiesModel
|
||||
fields = ["name"]
|
||||
|
||||
|
||||
class TicketsImageSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = TicketsImagesModel
|
||||
fields = ["image"]
|
||||
|
||||
|
||||
class BaseTicketsSerializer(serializers.ModelSerializer):
|
||||
ticket_images = TicketsImageSerializer(many=True, read_only=True)
|
||||
ticket_amenities = TicketsAmenitiesSerializer(many=True, read_only=True)
|
||||
ticket_included_services = TicketsIncludedServicesSerializer(many=True, read_only=True)
|
||||
ticket_itinerary = TicketsItinerarySerializer(many=True, read_only=True)
|
||||
ticket_hotel_meals = TicketsHotelMealsSerializer(many=True, read_only=True)
|
||||
ticket_comments = TicketsCommentsSerializer(many=True, read_only=True)
|
||||
tariff = TicketsTariffSerializer(many=True, read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = TicketsModel
|
||||
fields = [
|
||||
"id",
|
||||
"title",
|
||||
"price",
|
||||
"departure_date",
|
||||
"departure",
|
||||
"destination",
|
||||
"passenger_count",
|
||||
"rating",
|
||||
"hotel_info",
|
||||
"duration_days",
|
||||
"hotel_meals",
|
||||
"ticket_images",
|
||||
"ticket_amenities",
|
||||
"ticket_included_services",
|
||||
"ticket_itinerary",
|
||||
"ticket_hotel_meals",
|
||||
"ticket_comments",
|
||||
"tariff",
|
||||
|
||||
]
|
||||
|
||||
|
||||
class ListTicketsSerializer(BaseTicketsSerializer):
|
||||
class Meta(BaseTicketsSerializer.Meta): ...
|
||||
|
||||
|
||||
class RetrieveTicketsSerializer(BaseTicketsSerializer):
|
||||
class Meta(BaseTicketsSerializer.Meta): ...
|
||||
|
||||
|
||||
class CreateTicketsSerializer(BaseTicketsSerializer):
|
||||
class Meta(BaseTicketsSerializer.Meta):
|
||||
fields = [
|
||||
"id",
|
||||
"title",
|
||||
"price",
|
||||
"departure_date",
|
||||
"departure",
|
||||
"destination",
|
||||
"passenger_count",
|
||||
"rating",
|
||||
"hotel_info",
|
||||
"duration_days",
|
||||
"hotel_meals",
|
||||
]
|
||||
4
core/apps/tickets/signals/__init__.py
Normal file
4
core/apps/tickets/signals/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from .extra_services import * # noqa
|
||||
from .hotel import * # noqa
|
||||
from .tariff import * # noqa
|
||||
from .tickets import * # noqa
|
||||
12
core/apps/tickets/signals/extra_services.py
Normal file
12
core/apps/tickets/signals/extra_services.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from django.db.models.signals import post_save
|
||||
from django.dispatch import receiver
|
||||
|
||||
from core.apps.tickets.models import ExtraServicesModel, PaidServicesModel
|
||||
|
||||
|
||||
@receiver(post_save, sender=ExtraServicesModel)
|
||||
def ExtraServicesSignal(sender, instance, created, **kwargs): ...
|
||||
|
||||
|
||||
@receiver(post_save, sender=PaidServicesModel)
|
||||
def PaidServicesSignal(sender, instance, created, **kwargs): ...
|
||||
8
core/apps/tickets/signals/hotel.py
Normal file
8
core/apps/tickets/signals/hotel.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from django.db.models.signals import post_save
|
||||
from django.dispatch import receiver
|
||||
|
||||
from core.apps.tickets.models import HotelModel
|
||||
|
||||
|
||||
@receiver(post_save, sender=HotelModel)
|
||||
def HotelSignal(sender, instance, created, **kwargs): ...
|
||||
8
core/apps/tickets/signals/tariff.py
Normal file
8
core/apps/tickets/signals/tariff.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from django.db.models.signals import post_save
|
||||
from django.dispatch import receiver
|
||||
|
||||
from core.apps.tickets.models import TariffModel
|
||||
|
||||
|
||||
@receiver(post_save, sender=TariffModel)
|
||||
def TariffSignal(sender, instance, created, **kwargs): ...
|
||||
12
core/apps/tickets/signals/tickets.py
Normal file
12
core/apps/tickets/signals/tickets.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from django.db.models.signals import post_save
|
||||
from django.dispatch import receiver
|
||||
|
||||
from core.apps.tickets.models import TicketorderModel, TicketsModel
|
||||
|
||||
|
||||
@receiver(post_save, sender=TicketsModel)
|
||||
def TicketsSignal(sender, instance, created, **kwargs): ...
|
||||
|
||||
|
||||
@receiver(post_save, sender=TicketorderModel)
|
||||
def TicketorderSignal(sender, instance, created, **kwargs): ...
|
||||
5
core/apps/tickets/tests/__init__.py
Normal file
5
core/apps/tickets/tests/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from .test_extra_services import * # noqa
|
||||
from .test_hotel import * # noqa
|
||||
from .test_paid_services import * # noqa
|
||||
from .test_tariff import * # noqa
|
||||
from .test_tickets import * # noqa
|
||||
89
core/apps/tickets/tests/test_extra_services.py
Normal file
89
core/apps/tickets/tests/test_extra_services.py
Normal file
@@ -0,0 +1,89 @@
|
||||
from django.test import TestCase
|
||||
from django.urls import reverse
|
||||
from rest_framework.test import APIClient
|
||||
|
||||
from core.apps.tickets.models import ExtraServicesModel, PaidServicesModel
|
||||
|
||||
|
||||
class ExtraServicesTest(TestCase):
|
||||
|
||||
def _create_data(self):
|
||||
return ExtraServicesModel._create_fake()
|
||||
|
||||
def setUp(self):
|
||||
self.client = APIClient()
|
||||
self.instance = self._create_data()
|
||||
self.urls = {
|
||||
"list": reverse("extra_servoces-list"),
|
||||
"retrieve": reverse("extra_servoces-detail", kwargs={"pk": self.instance.pk}),
|
||||
"retrieve-not-found": reverse("extra_servoces-detail", kwargs={"pk": 1000}),
|
||||
}
|
||||
|
||||
def test_create(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_update(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_partial_update(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_destroy(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_list(self):
|
||||
response = self.client.get(self.urls["list"])
|
||||
self.assertTrue(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_retrieve(self):
|
||||
response = self.client.get(self.urls["retrieve"])
|
||||
self.assertTrue(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_retrieve_not_found(self):
|
||||
response = self.client.get(self.urls["retrieve-not-found"])
|
||||
self.assertFalse(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 404)
|
||||
|
||||
|
||||
class PaidServicesTest(TestCase):
|
||||
|
||||
def _create_data(self):
|
||||
return PaidServicesModel._create_fake()
|
||||
|
||||
def setUp(self):
|
||||
self.client = APIClient()
|
||||
self.instance = self._create_data()
|
||||
self.urls = {
|
||||
"list": reverse("paid_services-list"),
|
||||
"retrieve": reverse("paid_services-detail", kwargs={"pk": self.instance.pk}),
|
||||
"retrieve-not-found": reverse("paid_services-detail", kwargs={"pk": 1000}),
|
||||
}
|
||||
|
||||
def test_create(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_update(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_partial_update(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_destroy(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_list(self):
|
||||
response = self.client.get(self.urls["list"])
|
||||
self.assertTrue(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_retrieve(self):
|
||||
response = self.client.get(self.urls["retrieve"])
|
||||
self.assertTrue(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_retrieve_not_found(self):
|
||||
response = self.client.get(self.urls["retrieve-not-found"])
|
||||
self.assertFalse(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 404)
|
||||
47
core/apps/tickets/tests/test_hotel.py
Normal file
47
core/apps/tickets/tests/test_hotel.py
Normal file
@@ -0,0 +1,47 @@
|
||||
from django.test import TestCase
|
||||
from django.urls import reverse
|
||||
from rest_framework.test import APIClient
|
||||
|
||||
from core.apps.tickets.models import HotelModel
|
||||
|
||||
|
||||
class HotelTest(TestCase):
|
||||
|
||||
def _create_data(self):
|
||||
return HotelModel._create_fake()
|
||||
|
||||
def setUp(self):
|
||||
self.client = APIClient()
|
||||
self.instance = self._create_data()
|
||||
self.urls = {
|
||||
"list": reverse("hotel-list"),
|
||||
"retrieve": reverse("hotel-detail", kwargs={"pk": self.instance.pk}),
|
||||
"retrieve-not-found": reverse("hotel-detail", kwargs={"pk": 1000}),
|
||||
}
|
||||
|
||||
def test_create(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_update(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_partial_update(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_destroy(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_list(self):
|
||||
response = self.client.get(self.urls["list"])
|
||||
self.assertTrue(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_retrieve(self):
|
||||
response = self.client.get(self.urls["retrieve"])
|
||||
self.assertTrue(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_retrieve_not_found(self):
|
||||
response = self.client.get(self.urls["retrieve-not-found"])
|
||||
self.assertFalse(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 404)
|
||||
47
core/apps/tickets/tests/test_tariff.py
Normal file
47
core/apps/tickets/tests/test_tariff.py
Normal file
@@ -0,0 +1,47 @@
|
||||
from django.test import TestCase
|
||||
from django.urls import reverse
|
||||
from rest_framework.test import APIClient
|
||||
|
||||
from core.apps.tickets.models import TariffModel
|
||||
|
||||
|
||||
class TariffTest(TestCase):
|
||||
|
||||
def _create_data(self):
|
||||
return TariffModel._create_fake()
|
||||
|
||||
def setUp(self):
|
||||
self.client = APIClient()
|
||||
self.instance = self._create_data()
|
||||
self.urls = {
|
||||
"list": reverse("tariff-list"),
|
||||
"retrieve": reverse("tariff-detail", kwargs={"pk": self.instance.pk}),
|
||||
"retrieve-not-found": reverse("tariff-detail", kwargs={"pk": 1000}),
|
||||
}
|
||||
|
||||
def test_create(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_update(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_partial_update(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_destroy(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_list(self):
|
||||
response = self.client.get(self.urls["list"])
|
||||
self.assertTrue(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_retrieve(self):
|
||||
response = self.client.get(self.urls["retrieve"])
|
||||
self.assertTrue(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_retrieve_not_found(self):
|
||||
response = self.client.get(self.urls["retrieve-not-found"])
|
||||
self.assertFalse(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 404)
|
||||
89
core/apps/tickets/tests/test_tickets.py
Normal file
89
core/apps/tickets/tests/test_tickets.py
Normal file
@@ -0,0 +1,89 @@
|
||||
from django.test import TestCase
|
||||
from django.urls import reverse
|
||||
from rest_framework.test import APIClient
|
||||
|
||||
from core.apps.tickets.models import TicketorderModel, TicketsModel
|
||||
|
||||
|
||||
class TicketsTest(TestCase):
|
||||
|
||||
def _create_data(self):
|
||||
return TicketsModel._create_fake()
|
||||
|
||||
def setUp(self):
|
||||
self.client = APIClient()
|
||||
self.instance = self._create_data()
|
||||
self.urls = {
|
||||
"list": reverse("tickets-list"),
|
||||
"retrieve": reverse("tickets-detail", kwargs={"pk": self.instance.pk}),
|
||||
"retrieve-not-found": reverse("tickets-detail", kwargs={"pk": 1000}),
|
||||
}
|
||||
|
||||
def test_create(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_update(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_partial_update(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_destroy(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_list(self):
|
||||
response = self.client.get(self.urls["list"])
|
||||
self.assertTrue(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_retrieve(self):
|
||||
response = self.client.get(self.urls["retrieve"])
|
||||
self.assertTrue(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_retrieve_not_found(self):
|
||||
response = self.client.get(self.urls["retrieve-not-found"])
|
||||
self.assertFalse(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 404)
|
||||
|
||||
|
||||
class TicketorderTest(TestCase):
|
||||
|
||||
def _create_data(self):
|
||||
return TicketorderModel._create_fake()
|
||||
|
||||
def setUp(self):
|
||||
self.client = APIClient()
|
||||
self.instance = self._create_data()
|
||||
self.urls = {
|
||||
"list": reverse("ticketorder-list"),
|
||||
"retrieve": reverse("ticketorder-detail", kwargs={"pk": self.instance.pk}),
|
||||
"retrieve-not-found": reverse("ticketorder-detail", kwargs={"pk": 1000}),
|
||||
}
|
||||
|
||||
def test_create(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_update(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_partial_update(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_destroy(self):
|
||||
self.assertTrue(True)
|
||||
|
||||
def test_list(self):
|
||||
response = self.client.get(self.urls["list"])
|
||||
self.assertTrue(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_retrieve(self):
|
||||
response = self.client.get(self.urls["retrieve"])
|
||||
self.assertTrue(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_retrieve_not_found(self):
|
||||
response = self.client.get(self.urls["retrieve-not-found"])
|
||||
self.assertFalse(response.json()["status"])
|
||||
self.assertEqual(response.status_code, 404)
|
||||
4
core/apps/tickets/translation/__init__.py
Normal file
4
core/apps/tickets/translation/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from .extra_services import * # noqa
|
||||
from .hotel import * # noqa
|
||||
from .tariff import * # noqa
|
||||
from .tickets import * # noqa
|
||||
13
core/apps/tickets/translation/extra_services.py
Normal file
13
core/apps/tickets/translation/extra_services.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from modeltranslation.translator import TranslationOptions, register
|
||||
|
||||
from core.apps.tickets.models import ExtraServicesModel, PaidServicesModel
|
||||
|
||||
|
||||
@register(ExtraServicesModel)
|
||||
class ExtraServicesTranslation(TranslationOptions):
|
||||
fields = []
|
||||
|
||||
|
||||
@register(PaidServicesModel)
|
||||
class PaidServicesTranslation(TranslationOptions):
|
||||
fields = []
|
||||
8
core/apps/tickets/translation/hotel.py
Normal file
8
core/apps/tickets/translation/hotel.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from modeltranslation.translator import TranslationOptions, register
|
||||
|
||||
from core.apps.tickets.models import HotelModel
|
||||
|
||||
|
||||
@register(HotelModel)
|
||||
class HotelTranslation(TranslationOptions):
|
||||
fields = []
|
||||
8
core/apps/tickets/translation/tariff.py
Normal file
8
core/apps/tickets/translation/tariff.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from modeltranslation.translator import TranslationOptions, register
|
||||
|
||||
from core.apps.tickets.models import TariffModel
|
||||
|
||||
|
||||
@register(TariffModel)
|
||||
class TariffTranslation(TranslationOptions):
|
||||
fields = []
|
||||
13
core/apps/tickets/translation/tickets.py
Normal file
13
core/apps/tickets/translation/tickets.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from modeltranslation.translator import TranslationOptions, register
|
||||
|
||||
from core.apps.tickets.models import TicketorderModel, TicketsModel
|
||||
|
||||
|
||||
@register(TicketsModel)
|
||||
class TicketsTranslation(TranslationOptions):
|
||||
fields = []
|
||||
|
||||
|
||||
@register(TicketorderModel)
|
||||
class TicketorderTranslation(TranslationOptions):
|
||||
fields = []
|
||||
15
core/apps/tickets/urls.py
Normal file
15
core/apps/tickets/urls.py
Normal file
@@ -0,0 +1,15 @@
|
||||
from django.urls import include, path
|
||||
from rest_framework.routers import DefaultRouter
|
||||
|
||||
from .views import ExtraServicesView, PaidServicesView, TariffView, TicketorderView
|
||||
from .views.hotel import HotelView
|
||||
from .views.tickets import TicketsView
|
||||
|
||||
router = DefaultRouter()
|
||||
router.register("ticketorder", TicketorderView, basename="ticketorder")
|
||||
router.register("paid_services", PaidServicesView, basename="paid_services")
|
||||
router.register("extra_services", ExtraServicesView, basename="extra_services")
|
||||
router.register("tariff", TariffView, basename="tariff")
|
||||
router.register("tickets", TicketsView, basename="tickets")
|
||||
router.register("hotels", HotelView, basename="hotel")
|
||||
urlpatterns = [path("", include(router.urls))]
|
||||
4
core/apps/tickets/validators/__init__.py
Normal file
4
core/apps/tickets/validators/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from .extra_services import * # noqa
|
||||
from .hotel import * # noqa
|
||||
from .tariff import * # noqa
|
||||
from .tickets import * # noqa
|
||||
15
core/apps/tickets/validators/extra_services.py
Normal file
15
core/apps/tickets/validators/extra_services.py
Normal file
@@ -0,0 +1,15 @@
|
||||
# from django.core.exceptions import ValidationError
|
||||
|
||||
|
||||
class ExtraServicesValidator:
|
||||
def __init__(self): ...
|
||||
|
||||
def __call__(self):
|
||||
return True
|
||||
|
||||
|
||||
class PaidServicesValidator:
|
||||
def __init__(self): ...
|
||||
|
||||
def __call__(self):
|
||||
return True
|
||||
8
core/apps/tickets/validators/hotel.py
Normal file
8
core/apps/tickets/validators/hotel.py
Normal file
@@ -0,0 +1,8 @@
|
||||
# from django.core.exceptions import ValidationError
|
||||
|
||||
|
||||
class HotelValidator:
|
||||
def __init__(self): ...
|
||||
|
||||
def __call__(self):
|
||||
return True
|
||||
8
core/apps/tickets/validators/tariff.py
Normal file
8
core/apps/tickets/validators/tariff.py
Normal file
@@ -0,0 +1,8 @@
|
||||
# from django.core.exceptions import ValidationError
|
||||
|
||||
|
||||
class TariffValidator:
|
||||
def __init__(self): ...
|
||||
|
||||
def __call__(self):
|
||||
return True
|
||||
15
core/apps/tickets/validators/tickets.py
Normal file
15
core/apps/tickets/validators/tickets.py
Normal file
@@ -0,0 +1,15 @@
|
||||
# from django.core.exceptions import ValidationError
|
||||
|
||||
|
||||
class TicketsValidator:
|
||||
def __init__(self): ...
|
||||
|
||||
def __call__(self):
|
||||
return True
|
||||
|
||||
|
||||
class TicketorderValidator:
|
||||
def __init__(self): ...
|
||||
|
||||
def __call__(self):
|
||||
return True
|
||||
4
core/apps/tickets/views/__init__.py
Normal file
4
core/apps/tickets/views/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from .extra_services import * # noqa
|
||||
from .hotel import * # noqa
|
||||
from .tariff import * # noqa
|
||||
from .tickets import * # noqa
|
||||
42
core/apps/tickets/views/extra_services.py
Normal file
42
core/apps/tickets/views/extra_services.py
Normal file
@@ -0,0 +1,42 @@
|
||||
from django_core.mixins import BaseViewSetMixin
|
||||
from drf_spectacular.utils import extend_schema
|
||||
from rest_framework.permissions import AllowAny
|
||||
from rest_framework.viewsets import ReadOnlyModelViewSet
|
||||
|
||||
from core.apps.tickets.models import ExtraServicesModel, PaidServicesModel
|
||||
from core.apps.tickets.serializers.extra_services import (
|
||||
CreateExtraServicesSerializer,
|
||||
CreatePaidServicesSerializer,
|
||||
ListExtraServicesSerializer,
|
||||
ListPaidServicesSerializer,
|
||||
RetrieveExtraServicesSerializer,
|
||||
RetrievePaidServicesSerializer,
|
||||
)
|
||||
|
||||
|
||||
@extend_schema(tags=["extra_servoces"])
|
||||
class ExtraServicesView(BaseViewSetMixin, ReadOnlyModelViewSet):
|
||||
queryset = ExtraServicesModel.objects.all()
|
||||
serializer_class = ListExtraServicesSerializer
|
||||
permission_classes = [AllowAny]
|
||||
|
||||
action_permission_classes = {}
|
||||
action_serializer_class = {
|
||||
"list": ListExtraServicesSerializer,
|
||||
"retrieve": RetrieveExtraServicesSerializer,
|
||||
"create": CreateExtraServicesSerializer,
|
||||
}
|
||||
|
||||
|
||||
@extend_schema(tags=["paid_services"])
|
||||
class PaidServicesView(BaseViewSetMixin, ReadOnlyModelViewSet):
|
||||
queryset = PaidServicesModel.objects.all()
|
||||
serializer_class = ListPaidServicesSerializer
|
||||
permission_classes = [AllowAny]
|
||||
|
||||
action_permission_classes = {}
|
||||
action_serializer_class = {
|
||||
"list": ListPaidServicesSerializer,
|
||||
"retrieve": RetrievePaidServicesSerializer,
|
||||
"create": CreatePaidServicesSerializer,
|
||||
}
|
||||
21
core/apps/tickets/views/hotel.py
Normal file
21
core/apps/tickets/views/hotel.py
Normal file
@@ -0,0 +1,21 @@
|
||||
from django_core.mixins import BaseViewSetMixin
|
||||
from drf_spectacular.utils import extend_schema
|
||||
from rest_framework.permissions import AllowAny
|
||||
from rest_framework.viewsets import ReadOnlyModelViewSet
|
||||
|
||||
from core.apps.tickets.models import HotelModel
|
||||
from core.apps.tickets.serializers.hotel import CreateHotelSerializer, ListHotelSerializer, RetrieveHotelSerializer
|
||||
|
||||
|
||||
@extend_schema(tags=["hotel"])
|
||||
class HotelView(BaseViewSetMixin, ReadOnlyModelViewSet):
|
||||
queryset = HotelModel.objects.all()
|
||||
serializer_class = ListHotelSerializer
|
||||
permission_classes = [AllowAny]
|
||||
|
||||
action_permission_classes = {}
|
||||
action_serializer_class = {
|
||||
"list": ListHotelSerializer,
|
||||
"retrieve": RetrieveHotelSerializer,
|
||||
"create": CreateHotelSerializer,
|
||||
}
|
||||
21
core/apps/tickets/views/tariff.py
Normal file
21
core/apps/tickets/views/tariff.py
Normal file
@@ -0,0 +1,21 @@
|
||||
from django_core.mixins import BaseViewSetMixin
|
||||
from drf_spectacular.utils import extend_schema
|
||||
from rest_framework.permissions import AllowAny
|
||||
from rest_framework.viewsets import ReadOnlyModelViewSet
|
||||
|
||||
from core.apps.tickets.models import TariffModel
|
||||
from core.apps.tickets.serializers.tariff import CreateTariffSerializer, ListTariffSerializer, RetrieveTariffSerializer
|
||||
|
||||
|
||||
@extend_schema(tags=["tariff"])
|
||||
class TariffView(BaseViewSetMixin, ReadOnlyModelViewSet):
|
||||
queryset = TariffModel.objects.all()
|
||||
serializer_class = ListTariffSerializer
|
||||
permission_classes = [AllowAny]
|
||||
|
||||
action_permission_classes = {}
|
||||
action_serializer_class = {
|
||||
"list": ListTariffSerializer,
|
||||
"retrieve": RetrieveTariffSerializer,
|
||||
"create": CreateTariffSerializer,
|
||||
}
|
||||
42
core/apps/tickets/views/tickets.py
Normal file
42
core/apps/tickets/views/tickets.py
Normal file
@@ -0,0 +1,42 @@
|
||||
from django_core.mixins import BaseViewSetMixin
|
||||
from drf_spectacular.utils import extend_schema
|
||||
from rest_framework.permissions import AllowAny
|
||||
from rest_framework.viewsets import ReadOnlyModelViewSet
|
||||
|
||||
from core.apps.tickets.models import TicketorderModel, TicketsModel
|
||||
from core.apps.tickets.serializers.tickets import (
|
||||
CreateTicketorderSerializer,
|
||||
CreateTicketsSerializer,
|
||||
ListTicketorderSerializer,
|
||||
ListTicketsSerializer,
|
||||
RetrieveTicketorderSerializer,
|
||||
RetrieveTicketsSerializer,
|
||||
)
|
||||
|
||||
|
||||
@extend_schema(tags=["tickets"])
|
||||
class TicketsView(BaseViewSetMixin, ReadOnlyModelViewSet):
|
||||
queryset = TicketsModel.objects.all()
|
||||
serializer_class = ListTicketsSerializer
|
||||
permission_classes = [AllowAny]
|
||||
|
||||
action_permission_classes = {}
|
||||
action_serializer_class = {
|
||||
"list": ListTicketsSerializer,
|
||||
"retrieve": RetrieveTicketsSerializer,
|
||||
"create": CreateTicketsSerializer,
|
||||
}
|
||||
|
||||
|
||||
@extend_schema(tags=["ticketorder"])
|
||||
class TicketorderView(BaseViewSetMixin, ReadOnlyModelViewSet):
|
||||
queryset = TicketorderModel.objects.all()
|
||||
serializer_class = ListTicketorderSerializer
|
||||
permission_classes = [AllowAny]
|
||||
|
||||
action_permission_classes = {}
|
||||
action_serializer_class = {
|
||||
"list": ListTicketorderSerializer,
|
||||
"retrieve": RetrieveTicketorderSerializer,
|
||||
"create": CreateTicketorderSerializer,
|
||||
}
|
||||
Reference in New Issue
Block a user