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, null=True, blank=True) badge = models.ManyToManyField("tickets.BadgeModel", verbose_name=_("badge"), null=True, blank=True) visa_required = models.BooleanField(verbose_name=_("visa required")) 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): from core.apps.tickets.models.badge import BadgeModel 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, badge=BadgeModel._create_fake(), ) 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): from core.apps.tickets.models.extra_services import ExtraServicesModel, PaidServicesModel 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")