mirror of
https://github.com/task-17-lct/backend.git
synced 2024-11-15 07:16:33 +03:00
136 lines
3.9 KiB
Python
136 lines
3.9 KiB
Python
from django.contrib.postgres.fields import ArrayField
|
|
from django.db import models
|
|
from location_field.models.plain import PlainLocationField
|
|
from polymorphic.models import PolymorphicModel
|
|
|
|
|
|
class OIDModel(models.Model):
|
|
oid = models.CharField(primary_key=True, max_length=24)
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
|
|
class Region(OIDModel):
|
|
title = models.CharField(max_length=250)
|
|
|
|
def __str__(self):
|
|
return self.title
|
|
|
|
|
|
class Country(OIDModel):
|
|
title = models.CharField(max_length=250)
|
|
|
|
def __str__(self):
|
|
return self.title
|
|
|
|
|
|
class City(OIDModel):
|
|
title = models.CharField(max_length=250)
|
|
region = models.ForeignKey(
|
|
"Region", related_name="cities", null=True, on_delete=models.SET_NULL
|
|
)
|
|
|
|
def __str__(self):
|
|
return self.title
|
|
|
|
|
|
class Place(OIDModel):
|
|
address = models.CharField(max_length=250)
|
|
parser_source = models.CharField(max_length=250)
|
|
city = models.ForeignKey(
|
|
"City", related_name="places", null=True, on_delete=models.SET_NULL
|
|
)
|
|
description = models.TextField()
|
|
location = PlainLocationField(zoom=6)
|
|
sites = ArrayField(models.CharField(max_length=250))
|
|
phones = ArrayField(models.CharField(max_length=250))
|
|
working_time = models.JSONField(null=True)
|
|
|
|
|
|
class Tag(OIDModel):
|
|
name = models.CharField(max_length=250)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
class BasePoint(OIDModel, PolymorphicModel):
|
|
title = models.CharField(max_length=250)
|
|
parser_source = models.CharField(max_length=250)
|
|
description = models.TextField()
|
|
city = models.ForeignKey(
|
|
"City", related_name="points", null=True, on_delete=models.SET_NULL
|
|
)
|
|
region = models.ForeignKey(
|
|
"Region", related_name="points", null=True, on_delete=models.SET_NULL
|
|
)
|
|
creator = models.CharField(max_length=250)
|
|
partner = models.CharField(max_length=250)
|
|
payment_method = models.CharField(max_length=250)
|
|
# tags = models.ManyToManyField("Tag", related_name="points")
|
|
|
|
def __str__(self):
|
|
return self.title
|
|
|
|
|
|
class PointMedia(OIDModel):
|
|
file = models.FileField(upload_to="uploads/")
|
|
type = models.CharField(max_length=200)
|
|
point = models.ForeignKey(
|
|
"BasePoint", related_name="media", on_delete=models.CASCADE
|
|
)
|
|
|
|
|
|
class Event(BasePoint):
|
|
ya_id = models.CharField(blank=True, max_length=24)
|
|
age = models.CharField("Возрастное ограничение", max_length=50)
|
|
booking_link = models.URLField()
|
|
discover_moscow_link = models.URLField()
|
|
duration = models.IntegerField(blank=True, null=True)
|
|
ticket_price = models.IntegerField(blank=True, null=True)
|
|
schedule = models.JSONField(null=True)
|
|
|
|
|
|
class Hotel(BasePoint):
|
|
address = models.CharField(max_length=250)
|
|
location = PlainLocationField(zoom=6)
|
|
rooms = models.JSONField(null=True)
|
|
email = models.CharField(max_length=250)
|
|
stars = models.IntegerField(null=True)
|
|
|
|
|
|
class HotelPhone(models.Model):
|
|
hotel = models.ForeignKey("Hotel", related_name="phones", on_delete=models.CASCADE)
|
|
name = models.CharField(max_length=50)
|
|
number = models.CharField(max_length=18)
|
|
|
|
|
|
class Museum(BasePoint):
|
|
# TODO
|
|
...
|
|
|
|
|
|
class Excursion(BasePoint):
|
|
duration_hours = models.IntegerField()
|
|
price = models.IntegerField()
|
|
minGroupCount = models.CharField(max_length=250)
|
|
program = models.TextField()
|
|
|
|
|
|
class ExcursionRoute(models.Model):
|
|
excursion = models.ForeignKey(
|
|
"Excursion", related_name="routes", on_delete=models.CASCADE
|
|
)
|
|
point = models.ForeignKey("Event", related_name="routes", on_delete=models.CASCADE)
|
|
active = models.BooleanField(default=True)
|
|
|
|
|
|
class Restaurant(BasePoint):
|
|
bill = models.IntegerField()
|
|
avg_time_visit = models.IntegerField()
|
|
can_reserve = models.BooleanField()
|
|
working_time = models.JSONField(null=True)
|
|
location = PlainLocationField(zoom=6)
|
|
phone = models.CharField(max_length=18)
|