first commit

This commit is contained in:
2025-09-19 15:19:32 +05:00
commit d160410cd9
305 changed files with 9509 additions and 0 deletions

View File

View File

@@ -0,0 +1,4 @@
from .extra_services import * # noqa
from .hotel import * # noqa
from .tariff import * # noqa
from .tickets import * # noqa

View 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__",
)

View 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,
)

View 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__",
)

View 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__",
)

View 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"

View File

@@ -0,0 +1,4 @@
from .extra_services import * # noqa
from .hotel import * # noqa
from .tariff import * # noqa
from .tickets import * # noqa

View 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",
]

View 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",
]

View 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",
]

View 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",
]

View File

@@ -0,0 +1,4 @@
from .extra_services import * # noqa
from .hotel import * # noqa
from .tariff import * # noqa
from .tickets import * # noqa

View 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__"

View 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__"

View 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__"

View 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__"

View 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__"

View 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'),
),
]

View File

View File

@@ -0,0 +1,4 @@
from .extra_services import * # noqa
from .hotel import * # noqa
from .tariff import * # noqa
from .tickets import * # noqa

View 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")

View 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")

View 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")

View 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 malumotlarni 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 bogliq 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 boyicha 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")

View File

@@ -0,0 +1,4 @@
from .extra_services import * # noqa
from .hotel import * # noqa
from .tariff import * # noqa
from .tickets import * # noqa

View 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

View 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

View 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

View 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

View File

@@ -0,0 +1,4 @@
from .extra_services import * # noqa
from .hotel import * # noqa
from .tariff import * # noqa
from .tickets import * # noqa

View File

@@ -0,0 +1,2 @@
from .extra_services import * # noqa
from .paid_services import * # noqa

View File

@@ -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",
]

View File

@@ -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",
]

View File

@@ -0,0 +1 @@
from .hotel import * # noqa

View 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",
]

View File

@@ -0,0 +1 @@
from .tariff import * # noqa

View 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",
]

View File

@@ -0,0 +1,2 @@
from .ticketorder import * # noqa
from .tickets import * # noqa

View 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",
]

View 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",
]

View File

@@ -0,0 +1,4 @@
from .extra_services import * # noqa
from .hotel import * # noqa
from .tariff import * # noqa
from .tickets import * # noqa

View 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): ...

View 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): ...

View 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): ...

View 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): ...

View 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

View 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)

View 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)

View 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)

View 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)

View File

@@ -0,0 +1,4 @@
from .extra_services import * # noqa
from .hotel import * # noqa
from .tariff import * # noqa
from .tickets import * # noqa

View 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 = []

View File

@@ -0,0 +1,8 @@
from modeltranslation.translator import TranslationOptions, register
from core.apps.tickets.models import HotelModel
@register(HotelModel)
class HotelTranslation(TranslationOptions):
fields = []

View File

@@ -0,0 +1,8 @@
from modeltranslation.translator import TranslationOptions, register
from core.apps.tickets.models import TariffModel
@register(TariffModel)
class TariffTranslation(TranslationOptions):
fields = []

View 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
View 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))]

View File

@@ -0,0 +1,4 @@
from .extra_services import * # noqa
from .hotel import * # noqa
from .tariff import * # noqa
from .tickets import * # noqa

View 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

View File

@@ -0,0 +1,8 @@
# from django.core.exceptions import ValidationError
class HotelValidator:
def __init__(self): ...
def __call__(self):
return True

View File

@@ -0,0 +1,8 @@
# from django.core.exceptions import ValidationError
class TariffValidator:
def __init__(self): ...
def __call__(self):
return True

View 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

View File

@@ -0,0 +1,4 @@
from .extra_services import * # noqa
from .hotel import * # noqa
from .tariff import * # noqa
from .tickets import * # noqa

View 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,
}

View 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,
}

View 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,
}

View 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,
}