loaded all places, events

This commit is contained in:
Alexander Karpov 2023-05-20 16:47:08 +03:00
parent 2c793e71fa
commit 33f08b8191
39 changed files with 1463 additions and 45 deletions

1
data.json Normal file

File diff suppressed because one or more lines are too long

0
data.jspn Normal file
View File

1
data/bulvary.json Normal file
View File

@ -0,0 +1 @@
[{"_id": {"$oid": "61c07987c53ae811d6e6b829"}, "dictionary_data": {"youtube_videos": [], "russpass_recommendation": false, "aac_images": [], "disable_sessionids_autoupdate": false, "information_pages": [], "type_audio_guide": [], "sessionIds": [], "social_buttons": [], "images": [{"source": {"id": "63da16a3961d4400a3ac475f"}}, {"source": {"id": "63da16a6961d4400a3ac476b"}}], "image_explore_preview": [{"source": {"id": "63da16a0961d4400a3ac4757"}}], "image_detailed_page_main": [], "tags_main_screen": ["5e4aa3aca7edd0687c4688e1"], "aac_tags": [], "duration": "30", "purchase_method": "free", "ticket_price": "0", "is_can_buy": false, "galereya": [], "recommendation_prime": [], "timetable_by_place": [], "schedule": [], "without_schedule": false, "description": "\u0421\u0430\u043c\u0430\u044f \u0441\u0442\u0430\u0440\u0430\u044f \u0438 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0411\u0443\u043b\u044c\u0432\u0430\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u044c\u0446\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0434\u0432\u0435 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u2014 \u041d\u0438\u043a\u0438\u0442\u0441\u043a\u0438\u0445 \u0412\u043e\u0440\u043e\u0442 \u0438 \u041f\u0443\u0448\u043a\u0438\u043d\u0441\u043a\u0443\u044e. \u0422\u0432\u0435\u0440\u0441\u043a\u043e\u0439 \u0431\u0443\u043b\u044c\u0432\u0430\u0440 \u0437\u0430\u043b\u043e\u0436\u0438\u043b\u0438 \u0432 1796 \u0433\u043e\u0434\u0443: \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u0441\u043a\u043e\u0440\u043e \u0441\u0442\u0430\u043b \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u0441\u0432\u0435\u0442\u0441\u043a\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u043c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0438\u0445 \u0434\u0432\u043e\u0440\u044f\u043d. \u0411\u044b\u0432\u0430\u043b \u0437\u0434\u0435\u0441\u044c \u0438 \u041f\u0443\u0448\u043a\u0438\u043d: \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0422\u0432\u0435\u0440\u0441\u043a\u043e\u043c \u0431\u0443\u043b\u044c\u0432\u0430\u0440\u0435 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u044f\u043b \u043f\u0430\u043c\u044f\u0442\u043d\u0438\u043a \u043f\u043e\u044d\u0442\u0443, \u043f\u043e\u043a\u0430 \u0432 1950 \u0433\u043e\u0434\u0443 \u0435\u0433\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u043b\u0438 \u043d\u0430 \u0441\u043e\u0441\u0435\u0434\u043d\u044e\u044e \u041f\u0443\u0448\u043a\u0438\u043d\u0441\u043a\u0443\u044e \u043f\u043b\u043e\u0449\u0430\u0434\u044c. \n", "region": "5d08e36dad3a9a001701b95b", "is_priority": false, "sort": 60, "tags": ["6124b391020892001197dfcf"], "cg_recommendations": [], "place": ["61c079d3c53ae811d6e6b8db"], "restaurants": [], "city": "5bbe8a8a9e7fcb000f78a92d", "event_type": "5ebe69313740700019205cfe", "title": "\u0422\u0432\u0435\u0440\u0441\u043a\u043e\u0439 \u0431\u0443\u043b\u044c\u0432\u0430\u0440", "import_denied": false}}]

1
data/concerts.json Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

1
data/excursii.json Normal file

File diff suppressed because one or more lines are too long

1
data/images.json Normal file

File diff suppressed because one or more lines are too long

1
data/kino.json Normal file

File diff suppressed because one or more lines are too long

1
data/museum.json Normal file
View File

@ -0,0 +1 @@
[{"_id": {"$oid": "64107fe599c33f2daae19203"}, "dictionary_data": {"youtube_videos": [], "russpass_recommendation": false, "aac_images": [], "parser_source": "LKP", "disable_sessionids_autoupdate": false, "information_pages": [], "type_audio_guide": [], "sessionIds": [], "social_buttons": [], "partner": "63ff5a8fd40834b15998dcf9", "images": [], "image_explore_preview": [{"source": {"id": "6422a74bcfc508abfb3fe7e8"}}, {"source": {"id": "6422a750cfc508abfb3fe7f8"}}, {"source": {"id": "6422a758cfc508abfb3fe804"}}], "image_detailed_page_main": [], "tags_main_screen": [], "aac_tags": [], "duration": "60", "ticket_price": "500", "is_can_buy": true, "galereya": [], "recommendation_prime": [], "age": "0+", "timetable_by_place": [], "schedule": [], "without_schedule": false, "description": "\u0412 \u00ab\u041e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u043f\u0430\u0440\u0444\u044e\u043c\u0435\u0440\u043d\u043e\u0439 \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u0438\u0438\u00bb \u0434\u0443\u0445\u0438 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0438, \u043d\u043e \u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0430\u043c\u0438 \u0438 \u0433\u0435\u0440\u043e\u044f\u043c\u0438 \u0441\u043f\u0435\u043a\u0442\u0430\u043a\u043b\u0435\u0439. \u0422\u0430\u043a\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f - \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u0438\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0438\u0437\u043c\u0443 \u0430\u0440\u043e\u043c\u0430\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u0442\u0430\u0451\u043d\u043d\u044b\u0435 \u0437\u043e\u043d\u044b \u0434\u0443\u0448\u0438 \u0438 \u0442\u0435\u043b\u0430, \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0430\u044f \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u044e, \u043e\u0436\u0438\u0432\u043b\u044f\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u043e\u043d\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0435, \u0441\u043b\u0443\u0445\u043e\u0432\u044b\u0435 \u0438 \u0442\u0430\u043a\u0442\u0438\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b. \u041f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0444\u044e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044e \u043a\u0440\u0443\u0433\u043e\u0437\u043e\u0440\u0430 \u0438 \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043c\u0438\u0440\u043e\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c. ", "is_priority": false, "tags": [], "cg_recommendations": [], "place": ["641081162a94483af923a496"], "restaurants": [], "city": "5bbf0e5f729bd4000fe02d5e", "event_type": "63eb49a688c02c9c01208394", "title": "\u0422\u0435\u0430\u0442\u0440 \u0430\u0440\u043e\u043c\u0430\u0442\u043e\u0432", "import_denied": false}}]

1
data/spektatli.json Normal file

File diff suppressed because one or more lines are too long

1
data/teatr.json Normal file
View File

@ -0,0 +1 @@
[{"_id": {"$oid": "64107fe599c33f2daae19203"}, "dictionary_data": {"youtube_videos": [], "russpass_recommendation": false, "aac_images": [], "parser_source": "LKP", "disable_sessionids_autoupdate": false, "information_pages": [], "type_audio_guide": [], "sessionIds": [], "social_buttons": [], "partner": "63ff5a8fd40834b15998dcf9", "images": [], "image_explore_preview": [{"source": {"id": "6422a74bcfc508abfb3fe7e8"}}, {"source": {"id": "6422a750cfc508abfb3fe7f8"}}, {"source": {"id": "6422a758cfc508abfb3fe804"}}], "image_detailed_page_main": [], "tags_main_screen": [], "aac_tags": [], "duration": "60", "ticket_price": "500", "is_can_buy": true, "galereya": [], "recommendation_prime": [], "age": "0+", "timetable_by_place": [], "schedule": [], "without_schedule": false, "description": "\u0412 \u00ab\u041e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u043f\u0430\u0440\u0444\u044e\u043c\u0435\u0440\u043d\u043e\u0439 \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u0438\u0438\u00bb \u0434\u0443\u0445\u0438 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0438, \u043d\u043e \u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0430\u043c\u0438 \u0438 \u0433\u0435\u0440\u043e\u044f\u043c\u0438 \u0441\u043f\u0435\u043a\u0442\u0430\u043a\u043b\u0435\u0439. \u0422\u0430\u043a\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f - \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u0438\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0438\u0437\u043c\u0443 \u0430\u0440\u043e\u043c\u0430\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u0442\u0430\u0451\u043d\u043d\u044b\u0435 \u0437\u043e\u043d\u044b \u0434\u0443\u0448\u0438 \u0438 \u0442\u0435\u043b\u0430, \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0430\u044f \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u044e, \u043e\u0436\u0438\u0432\u043b\u044f\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u043e\u043d\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0435, \u0441\u043b\u0443\u0445\u043e\u0432\u044b\u0435 \u0438 \u0442\u0430\u043a\u0442\u0438\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b. \u041f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0444\u044e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044e \u043a\u0440\u0443\u0433\u043e\u0437\u043e\u0440\u0430 \u0438 \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043c\u0438\u0440\u043e\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c. ", "is_priority": false, "tags": [], "cg_recommendations": [], "place": ["641081162a94483af923a496"], "restaurants": [], "city": "5bbf0e5f729bd4000fe02d5e", "event_type": "63eb49a688c02c9c01208394", "title": "\u0422\u0435\u0430\u0442\u0440 \u0430\u0440\u043e\u043c\u0430\u0442\u043e\u0432", "import_denied": false}}]

1
data/yarmarki.json Normal file

File diff suppressed because one or more lines are too long

89
parsers/bulvari.py Normal file
View File

@ -0,0 +1,89 @@
import json
from pprint import pprint
from django.contrib.gis.geos import Point
from passfinder.events.models import City, Region, Place
with open("data/bulvary.json") as f:
data = json.load(f)
result = []
for r in data:
al = True
d = {}
info = r["dictionary_data"]
d["type"] = "boulevard"
d["oid"] = r["_id"]["$oid"]
d["title"] = info["title"]
d["description"] = info["description"]
if "parser_source" in info:
d["parser_source"] = info["parser_source"]
if "sort" in info:
d["sort"] = int(info["sort"])
if "is_can_buy" in info:
d["can_buy"] = info["is_can_buy"]
if "priority" in info:
d["priority"] = int(info["priority"])
if "duration" in info:
d["duration"] = int(info["duration"])
if "ticket_price" in info:
d["ticket_price"] = int(info["ticket_price"])
if "schedule" in info:
d["schedule"] = info["schedule"]
if "payment_method" in info:
d["payment_method"] = info["payment_method"]
elif "purchase_method" in info:
d["payment_method"] = info["purchase_method"]
if "age" in info:
d["age"] = info["age"]
if "booking_link" in info:
d["booking_link"] = info["booking_link"]
if "discover_moscow_link" in info:
d["discover_moscow_link"] = info["discover_moscow_link"]
if info["city"]:
try:
d["city"] = City.objects.get(oid=info["city"])
except City.DoesNotExist:
...
if info["region"]:
try:
d["region"] = Region.objects.get(oid=info["region"])
except Region.DoesNotExist:
...
if info["place"]:
try:
d["place"] = Place.objects.get(oid=info["place"][0])
except Place.DoesNotExist:
...
if "geo_data" in info and info["geo_data"]["coordinates"]:
d["location"] = Point(
info["geo_data"]["coordinates"][0], info["geo_data"]["coordinates"][1]
)
else:
if "place" in d:
d["location"] = d["place"].location
else:
al = False
media = []
for m in info["images"]:
media.append({"file": m["source"]["id"], "type": "image"})
for m in info["galereya"]:
media.append({"file": m["source"]["id"], "type": "image"})
if media:
d["media"] = media
if al:
result.append(d)
else:
print(d)
def get_bulvari():
return result

27
parsers/city.py Normal file
View File

@ -0,0 +1,27 @@
import json
from pprint import pprint
from django.contrib.gis.geos import Point
with open("data/cities.json") as f:
data = json.load(f)
result = []
for r in data:
d = {}
info = r["dictionary_data"]
d["id"] = r["_id"]["$oid"]
d["title"] = info["title"]
if "region" in info:
d["region"] = info["region"]
if "geo_data" in info and info["geo_data"]["coordinates"]:
d["location"] = Point(
info["geo_data"]["coordinates"][0], info["geo_data"]["coordinates"][1]
)
result.append(d)
def get_cities():
return result

89
parsers/concert.py Normal file
View File

@ -0,0 +1,89 @@
import json
from pprint import pprint
from django.contrib.gis.geos import Point
from passfinder.events.models import City, Region, Place
with open("data/concerts.json") as f:
data = json.load(f)
result = []
for r in data:
al = True
d = {}
d["type"] = "concert"
info = r["dictionary_data"]
d["oid"] = r["_id"]["$oid"]
d["title"] = info["title"]
d["description"] = info["description"]
if "parser_source" in info:
d["parser_source"] = info["parser_source"]
if "sort" in info:
d["sort"] = int(info["sort"])
if "is_can_buy" in info:
d["can_buy"] = info["is_can_buy"]
if "priority" in info:
d["priority"] = int(info["priority"])
if "duration" in info:
d["duration"] = int(info["duration"])
if "ticket_price" in info:
d["ticket_price"] = int(info["ticket_price"])
if "schedule" in info:
d["schedule"] = info["schedule"]
if "payment_method" in info:
d["payment_method"] = info["payment_method"]
elif "purchase_method" in info:
d["payment_method"] = info["purchase_method"]
if "age" in info:
d["age"] = info["age"]
if "booking_link" in info:
d["booking_link"] = info["booking_link"]
if "discover_moscow_link" in info:
d["discover_moscow_link"] = info["discover_moscow_link"]
if info["city"]:
try:
d["city"] = City.objects.get(oid=info["city"])
except City.DoesNotExist:
...
if "region" in info:
try:
d["region"] = Region.objects.get(oid=info["region"])
except Region.DoesNotExist:
...
if info["place"]:
try:
d["place"] = Place.objects.get(oid=info["place"][0])
except Place.DoesNotExist:
...
if "geo_data" in info and info["geo_data"]["coordinates"]:
d["location"] = Point(
info["geo_data"]["coordinates"][0], info["geo_data"]["coordinates"][1]
)
else:
if "place" in d:
d["location"] = d["place"].location
else:
al = False
media = []
for m in info["images"]:
media.append({"file": m["source"]["id"], "type": "image"})
for m in info["galereya"]:
media.append({"file": m["source"]["id"], "type": "image"})
if media:
d["media"] = media
if al:
result.append(d)
else:
pprint(d)
def get_concert():
return result

View File

@ -0,0 +1,89 @@
import json
from pprint import pprint
from django.contrib.gis.geos import Point
from passfinder.events.models import City, Region, Place
with open("data/dostoprimechatelnosti.json") as f:
data = json.load(f)
result = []
for r in data:
al = True
d = {}
d["type"] = "attraction"
info = r["dictionary_data"]
d["oid"] = r["_id"]["$oid"]
d["title"] = info["title"]
d["description"] = info["description"]
if "parser_source" in info:
d["parser_source"] = info["parser_source"]
if "sort" in info:
d["sort"] = int(info["sort"])
if "is_can_buy" in info:
d["can_buy"] = info["is_can_buy"]
if "priority" in info:
d["priority"] = int(info["priority"])
if "duration" in info:
d["duration"] = int(info["duration"])
if "ticket_price" in info:
d["ticket_price"] = int(info["ticket_price"])
if "schedule" in info:
d["schedule"] = info["schedule"]
if "payment_method" in info:
d["payment_method"] = info["payment_method"]
elif "purchase_method" in info:
d["payment_method"] = info["purchase_method"]
if "age" in info:
d["age"] = info["age"]
if "booking_link" in info:
d["booking_link"] = info["booking_link"]
if "discover_moscow_link" in info:
d["discover_moscow_link"] = info["discover_moscow_link"]
if info["city"]:
try:
d["city"] = City.objects.get(oid=info["city"])
except City.DoesNotExist:
...
if info["region"]:
try:
d["region"] = Region.objects.get(oid=info["region"])
except Region.DoesNotExist:
...
if info["place"]:
try:
d["place"] = Place.objects.get(oid=info["place"][0])
except Place.DoesNotExist:
...
if "geo_data" in info and info["geo_data"]["coordinates"]:
d["location"] = Point(
info["geo_data"]["coordinates"][0], info["geo_data"]["coordinates"][1]
)
else:
if "place" in d:
d["location"] = d["place"].location
else:
al = False
media = []
for m in info["images"]:
media.append({"file": m["source"]["id"], "type": "image"})
for m in info["galereya"]:
media.append({"file": m["source"]["id"], "type": "image"})
if media:
d["media"] = media
if al:
result.append(d)
else:
pprint(d)
def get_dostoprimechatelnost():
return result

89
parsers/excursii.py Normal file
View File

@ -0,0 +1,89 @@
import json
from pprint import pprint
from django.contrib.gis.geos import Point
from passfinder.events.models import City, Region, Place
with open("data/excursii.json") as f:
data = json.load(f)
result = []
for r in data:
al = True
d = {}
d["type"] = "excursion"
info = r["dictionary_data"]
d["oid"] = r["_id"]["$oid"]
d["title"] = info["title"]
d["description"] = info["description"]
if "parser_source" in info:
d["parser_source"] = info["parser_source"]
if "sort" in info:
d["sort"] = int(info["sort"])
if "is_can_buy" in info:
d["can_buy"] = info["is_can_buy"]
if "priority" in info:
d["priority"] = int(info["priority"])
if "duration" in info:
d["duration"] = int(info["duration"])
if "ticket_price" in info:
d["ticket_price"] = int(info["ticket_price"])
if "schedule" in info:
d["schedule"] = info["schedule"]
if "payment_method" in info:
d["payment_method"] = info["payment_method"]
elif "purchase_method" in info:
d["payment_method"] = info["purchase_method"]
if "age" in info:
d["age"] = info["age"]
if "booking_link" in info:
d["booking_link"] = info["booking_link"]
if "discover_moscow_link" in info:
d["discover_moscow_link"] = info["discover_moscow_link"]
if info["city"]:
try:
d["city"] = City.objects.get(oid=info["city"])
except City.DoesNotExist:
...
if "region" in info:
try:
d["region"] = Region.objects.get(oid=info["region"])
except Region.DoesNotExist:
...
if info["place"]:
try:
d["place"] = Place.objects.get(oid=info["place"][0])
except Place.DoesNotExist:
...
if "geo_data" in info and info["geo_data"]["coordinates"]:
d["location"] = Point(
info["geo_data"]["coordinates"][0], info["geo_data"]["coordinates"][1]
)
else:
if "place" in d:
d["location"] = d["place"].location
else:
al = False
media = []
for m in info["images"]:
media.append({"file": m["source"]["id"], "type": "image"})
for m in info["galereya"]:
media.append({"file": m["source"]["id"], "type": "image"})
if media:
d["media"] = media
if al:
result.append(d)
else:
pprint(d)
def get_excursion():
return result

89
parsers/movie.py Normal file
View File

@ -0,0 +1,89 @@
import json
from pprint import pprint
from django.contrib.gis.geos import Point
from passfinder.events.models import City, Region, Place
with open("data/kino.json") as f:
data = json.load(f)
result = []
for r in data:
al = True
d = {}
d["type"] = "movie"
info = r["dictionary_data"]
d["oid"] = r["_id"]["$oid"]
d["title"] = info["title"]
d["description"] = info["description"]
if "parser_source" in info:
d["parser_source"] = info["parser_source"]
if "sort" in info:
d["sort"] = int(info["sort"])
if "is_can_buy" in info:
d["can_buy"] = info["is_can_buy"]
if "priority" in info:
d["priority"] = int(info["priority"])
if "duration" in info:
d["duration"] = int(info["duration"])
if "ticket_price" in info:
d["ticket_price"] = int(info["ticket_price"])
if "schedule" in info:
d["schedule"] = info["schedule"]
if "payment_method" in info:
d["payment_method"] = info["payment_method"]
elif "purchase_method" in info:
d["payment_method"] = info["purchase_method"]
if "age" in info:
d["age"] = info["age"]
if "booking_link" in info:
d["booking_link"] = info["booking_link"]
if "discover_moscow_link" in info:
d["discover_moscow_link"] = info["discover_moscow_link"]
if info["city"]:
try:
d["city"] = City.objects.get(oid=info["city"])
except City.DoesNotExist:
...
if "region" in info:
try:
d["region"] = Region.objects.get(oid=info["region"])
except Region.DoesNotExist:
...
if info["place"]:
try:
d["place"] = Place.objects.get(oid=info["place"][0])
except Place.DoesNotExist:
...
if "geo_data" in info and info["geo_data"]["coordinates"]:
d["location"] = Point(
info["geo_data"]["coordinates"][0], info["geo_data"]["coordinates"][1]
)
else:
if "place" in d:
d["location"] = d["place"].location
else:
al = False
media = []
for m in info["images"]:
media.append({"file": m["source"]["id"], "type": "image"})
for m in info["galereya"]:
media.append({"file": m["source"]["id"], "type": "image"})
if media:
d["media"] = media
if al:
result.append(d)
else:
pprint(d)
def get_movie():
return result

89
parsers/museum.py Normal file
View File

@ -0,0 +1,89 @@
import json
from pprint import pprint
from django.contrib.gis.geos import Point
from passfinder.events.models import City, Region, Place
with open("data/museum.json") as f:
data = json.load(f)
result = []
for r in data:
al = True
d = {}
d["type"] = "museum"
info = r["dictionary_data"]
d["oid"] = r["_id"]["$oid"]
d["title"] = info["title"]
d["description"] = info["description"]
if "parser_source" in info:
d["parser_source"] = info["parser_source"]
if "sort" in info:
d["sort"] = int(info["sort"])
if "is_can_buy" in info:
d["can_buy"] = info["is_can_buy"]
if "priority" in info:
d["priority"] = int(info["priority"])
if "duration" in info:
d["duration"] = int(info["duration"])
if "ticket_price" in info:
d["ticket_price"] = int(info["ticket_price"])
if "schedule" in info:
d["schedule"] = info["schedule"]
if "payment_method" in info:
d["payment_method"] = info["payment_method"]
elif "purchase_method" in info:
d["payment_method"] = info["purchase_method"]
if "age" in info:
d["age"] = info["age"]
if "booking_link" in info:
d["booking_link"] = info["booking_link"]
if "discover_moscow_link" in info:
d["discover_moscow_link"] = info["discover_moscow_link"]
if info["city"]:
try:
d["city"] = City.objects.get(oid=info["city"])
except City.DoesNotExist:
...
if "region" in info:
try:
d["region"] = Region.objects.get(oid=info["region"])
except Region.DoesNotExist:
...
if info["place"]:
try:
d["place"] = Place.objects.get(oid=info["place"][0])
except Place.DoesNotExist:
...
if "geo_data" in info and info["geo_data"]["coordinates"]:
d["location"] = Point(
info["geo_data"]["coordinates"][0], info["geo_data"]["coordinates"][1]
)
else:
if "place" in d:
d["location"] = d["place"].location
else:
al = False
media = []
for m in info["images"]:
media.append({"file": m["source"]["id"], "type": "image"})
for m in info["galereya"]:
media.append({"file": m["source"]["id"], "type": "image"})
if media:
d["media"] = media
if al:
result.append(d)
else:
pprint(d)
def get_museum():
return result

50
parsers/place.py Normal file
View File

@ -0,0 +1,50 @@
import json
from pprint import pprint
from django.contrib.gis.geos import Point
from passfinder.events.models import City, Region
with open("data/places.json") as f:
data = json.load(f)
result = []
for r in data:
d = {}
info = r["dictionary_data"]
d["oid"] = r["_id"]["$oid"]
d["title"] = info["title"]
if "description" in info:
d["description"] = info["description"]
if "working_time" in info:
d["working_time"] = info["working_time"]
else:
d["description"] = ""
if "address" in info:
d["address"] = info["address"]
if "parser_source" in info:
d["parser_source"] = info["parser_source"]
if info["city"]:
try:
d["city"] = City.objects.get(oid=info["city"][0])
except City.DoesNotExist:
...
if "region" in info:
try:
d["region"] = Region.objects.get(oid=info["region"])
except Region.DoesNotExist:
...
if "geo_data" in info and info["geo_data"]["coordinates"]:
d["location"] = Point(
info["geo_data"]["coordinates"][0], info["geo_data"]["coordinates"][1]
)
if "sites" in info:
d["sites"] = info["sites"]
if "phones" in info:
d["phones"] = info["phones"]
result.append(d)
def get_places():
return result

89
parsers/plays.py Normal file
View File

@ -0,0 +1,89 @@
import json
from pprint import pprint
from django.contrib.gis.geos import Point
from passfinder.events.models import City, Region, Place
with open("data/spektatli.json") as f:
data = json.load(f)
result = []
for r in data:
al = True
d = {}
d["type"] = "plays"
info = r["dictionary_data"]
d["oid"] = r["_id"]["$oid"]
d["title"] = info["title"]
d["description"] = info["description"]
if "parser_source" in info:
d["parser_source"] = info["parser_source"]
if "sort" in info:
d["sort"] = int(info["sort"])
if "is_can_buy" in info:
d["can_buy"] = info["is_can_buy"]
if "priority" in info:
d["priority"] = int(info["priority"])
if "duration" in info:
d["duration"] = int(info["duration"])
if "ticket_price" in info:
d["ticket_price"] = int(info["ticket_price"])
if "schedule" in info:
d["schedule"] = info["schedule"]
if "payment_method" in info:
d["payment_method"] = info["payment_method"]
elif "purchase_method" in info:
d["payment_method"] = info["purchase_method"]
if "age" in info:
d["age"] = info["age"]
if "booking_link" in info:
d["booking_link"] = info["booking_link"]
if "discover_moscow_link" in info:
d["discover_moscow_link"] = info["discover_moscow_link"]
if info["city"]:
try:
d["city"] = City.objects.get(oid=info["city"])
except City.DoesNotExist:
...
if "region" in info:
try:
d["region"] = Region.objects.get(oid=info["region"])
except Region.DoesNotExist:
...
if info["place"]:
try:
d["place"] = Place.objects.get(oid=info["place"][0])
except Place.DoesNotExist:
...
if "geo_data" in info and info["geo_data"]["coordinates"]:
d["location"] = Point(
info["geo_data"]["coordinates"][0], info["geo_data"]["coordinates"][1]
)
else:
if "place" in d:
d["location"] = d["place"].location
else:
al = False
media = []
for m in info["images"]:
media.append({"file": m["source"]["id"], "type": "image"})
for m in info["galereya"]:
media.append({"file": m["source"]["id"], "type": "image"})
if media:
d["media"] = media
if al:
result.append(d)
else:
pprint(d)
def get_spektatli():
return result

39
parsers/regions.py Normal file
View File

@ -0,0 +1,39 @@
import json
from pprint import pprint
with open("data/regions.json") as f:
data = json.load(f)
result = []
for r in data:
reg = {}
region = r["dictionary_data"]
reg["id"] = r["_id"]["$oid"]
if region["city"]:
reg["city"] = region["city"][0]
reg["title"] = region["title"]
reg["url"] = region["url"]
reg["description"] = region["description"]
reg["description_title"] = region["description_title"]
reg["description_short"] = region["short_description"]
reg["showcase_cards"] = region["showcase_cards"]
media = []
for m in region["gallery"]:
media.append({"file": m["source"]["id"], "type": "image"})
for m in region["images"]:
media.append({"file": m["source"]["id"], "type": "image"})
for m in region["icon"]:
media.append({"file": m["source"]["id"], "type": "icon"})
if media:
reg["media"] = media
result.append(reg)
def get_regions():
return result

89
parsers/theatre.py Normal file
View File

@ -0,0 +1,89 @@
import json
from pprint import pprint
from django.contrib.gis.geos import Point
from passfinder.events.models import City, Region, Place
with open("data/teatr.json") as f:
data = json.load(f)
result = []
for r in data:
al = True
d = {}
d["type"] = "theatre"
info = r["dictionary_data"]
d["oid"] = r["_id"]["$oid"]
d["title"] = info["title"]
d["description"] = info["description"]
if "parser_source" in info:
d["parser_source"] = info["parser_source"]
if "sort" in info:
d["sort"] = int(info["sort"])
if "is_can_buy" in info:
d["can_buy"] = info["is_can_buy"]
if "priority" in info:
d["priority"] = int(info["priority"])
if "duration" in info:
d["duration"] = int(info["duration"])
if "ticket_price" in info:
d["ticket_price"] = int(info["ticket_price"])
if "schedule" in info:
d["schedule"] = info["schedule"]
if "payment_method" in info:
d["payment_method"] = info["payment_method"]
elif "purchase_method" in info:
d["payment_method"] = info["purchase_method"]
if "age" in info:
d["age"] = info["age"]
if "booking_link" in info:
d["booking_link"] = info["booking_link"]
if "discover_moscow_link" in info:
d["discover_moscow_link"] = info["discover_moscow_link"]
if info["city"]:
try:
d["city"] = City.objects.get(oid=info["city"])
except City.DoesNotExist:
...
if "region" in info:
try:
d["region"] = Region.objects.get(oid=info["region"])
except Region.DoesNotExist:
...
if info["place"]:
try:
d["place"] = Place.objects.get(oid=info["place"][0])
except Place.DoesNotExist:
...
if "geo_data" in info and info["geo_data"]["coordinates"]:
d["location"] = Point(
info["geo_data"]["coordinates"][0], info["geo_data"]["coordinates"][1]
)
else:
if "place" in d:
d["location"] = d["place"].location
else:
al = False
media = []
for m in info["images"]:
media.append({"file": m["source"]["id"], "type": "image"})
for m in info["galereya"]:
media.append({"file": m["source"]["id"], "type": "image"})
if media:
d["media"] = media
if al:
result.append(d)
else:
pprint(d)
def get_theatre():
return result

89
parsers/yarmarka.py Normal file
View File

@ -0,0 +1,89 @@
import json
from pprint import pprint
from django.contrib.gis.geos import Point
from passfinder.events.models import City, Region, Place
with open("data/yarmarki.json") as f:
data = json.load(f)
result = []
for r in data:
al = True
d = {}
d["type"] = "fair"
info = r["dictionary_data"]
d["oid"] = r["_id"]["$oid"]
d["title"] = info["title"]
d["description"] = info["description"]
if "parser_source" in info:
d["parser_source"] = info["parser_source"]
if "sort" in info:
d["sort"] = int(info["sort"])
if "is_can_buy" in info:
d["can_buy"] = info["is_can_buy"]
if "priority" in info:
d["priority"] = int(info["priority"])
if "duration" in info:
d["duration"] = int(info["duration"])
if "ticket_price" in info:
d["ticket_price"] = int(info["ticket_price"])
if "schedule" in info:
d["schedule"] = info["schedule"]
if "payment_method" in info:
d["payment_method"] = info["payment_method"]
elif "purchase_method" in info:
d["payment_method"] = info["purchase_method"]
if "age" in info:
d["age"] = info["age"]
if "booking_link" in info:
d["booking_link"] = info["booking_link"]
if "discover_moscow_link" in info:
d["discover_moscow_link"] = info["discover_moscow_link"]
if info["city"]:
try:
d["city"] = City.objects.get(oid=info["city"])
except City.DoesNotExist:
...
if info["region"]:
try:
d["region"] = Region.objects.get(oid=info["region"])
except Region.DoesNotExist:
...
if info["place"]:
try:
d["place"] = Place.objects.get(oid=info["place"][0])
except Place.DoesNotExist:
...
if "geo_data" in info and info["geo_data"]["coordinates"]:
d["location"] = Point(
info["geo_data"]["coordinates"][0], info["geo_data"]["coordinates"][1]
)
else:
if "place" in d:
d["location"] = d["place"].location
else:
al = False
media = []
for m in info["images"]:
media.append({"file": m["source"]["id"], "type": "image"})
for m in info["galereya"]:
media.append({"file": m["source"]["id"], "type": "image"})
if media:
d["media"] = media
if al:
result.append(d)
else:
print(d)
def get_yarmarka():
return result

View File

@ -1,16 +1,12 @@
import os import os
from passfinder.common.tasks import crop_model_image from passfinder.common.tasks import crop_model_image
{ % - if cookiecutter.use_celery != "y" %}
from passfinder.utils.files import crop_image
{ % - endif %}
def create_cropped_model_image(sender, instance, created, **kwargs): def create_cropped_model_image(sender, instance, created, **kwargs):
model = sender model = sender
if created: if created:
if instance.image: if instance.image:
{ % - if cookiecutter.use_celery == "y" %}
crop_model_image.apply_async( crop_model_image.apply_async(
kwargs={ kwargs={
"pk": instance.pk, "pk": instance.pk,
@ -19,14 +15,7 @@ def create_cropped_model_image(sender, instance, created, **kwargs):
}, },
countdown=2, countdown=2,
) )
{ % - else - %}
instance.image_cropped.save(
instance.image.path.split(".")[0].split("/")[-1] + ".png",
File(crop_image(instance.image.path, length=250)),
save=False,
)
instance.save(update_fields=["image_cropped"]) instance.save(update_fields=["image_cropped"])
{ % - endif %}
def update_cropped_model_image(sender, instance, **kwargs): def update_cropped_model_image(sender, instance, **kwargs):
@ -41,7 +30,6 @@ def update_cropped_model_image(sender, instance, **kwargs):
# run task to create new cropped image # run task to create new cropped image
if kwargs["update_fields"] != frozenset({"image_cropped"}) and instance: if kwargs["update_fields"] != frozenset({"image_cropped"}) and instance:
if instance.image: if instance.image:
{ % - if cookiecutter.use_celery == "y" %}
crop_model_image.apply_async( crop_model_image.apply_async(
kwargs={ kwargs={
"pk": instance.pk, "pk": instance.pk,
@ -50,14 +38,6 @@ def update_cropped_model_image(sender, instance, **kwargs):
}, },
countdown=2, countdown=2,
) )
{ % - else - %}
instance.image_cropped.save(
instance.image.path.split(".")[0].split("/")[-1] + ".png",
File(crop_image(instance.image.path, length=250)),
save=False,
)
instance.save(update_fields=["image_cropped"])
{ % - endif %}
else: else:
instance.image_cropped = None instance.image_cropped = None

View File

View File

@ -0,0 +1,31 @@
from rest_framework import serializers
from passfinder.events.models import Hotel, HotelPhone, City
class HotelPhoneSerializer(serializers.ModelSerializer):
class Meta:
model = HotelPhone
exclude = "hotel"
class CitySerializer(serializers.ModelSerializer):
class Meta:
model = City
class HotelSerializer(serializers.ModelSerializer):
phones = HotelPhoneSerializer(many=True)
source = serializers.CharField(source="parser_source")
class Meta:
model = Hotel
exclude = ("oid", "parser_source")
class MuseumSerializer(serializers.ModelSerializer):
phones = HotelPhoneSerializer(many=True)
class Meta:
model = Hotel
exclude = "oid"

View File

@ -0,0 +1,121 @@
# Generated by Django 4.2.1 on 2023-05-20 09:38
from django.db import migrations, models
import django.db.models.deletion
import location_field.models.plain
class Migration(migrations.Migration):
dependencies = [
("events", "0001_initial"),
]
operations = [
migrations.CreateModel(
name="RegionMedia",
fields=[
(
"oid",
models.CharField(max_length=24, primary_key=True, serialize=False),
),
("file", models.FileField(upload_to="uploads/")),
("type", models.CharField(max_length=200)),
],
options={
"abstract": False,
},
),
migrations.DeleteModel(
name="Country",
),
migrations.RemoveField(
model_name="hotel",
name="location",
),
migrations.RemoveField(
model_name="restaurant",
name="location",
),
migrations.AddField(
model_name="basepoint",
name="location",
field=location_field.models.plain.PlainLocationField(
default=0, max_length=63
),
preserve_default=False,
),
migrations.AddField(
model_name="event",
name="type",
field=models.CharField(
choices=[
("fair", "ярмарка"),
("boulevard", "бульвар"),
("attraction", "достопримечательность"),
("excursion", "экскурсия"),
("theatre", "театр"),
("museum", "музей"),
("movie", "кино"),
("concert", "концерт"),
("plays", "спектакли"),
],
db_index=True,
default="fair",
max_length=10,
),
preserve_default=False,
),
migrations.AddField(
model_name="region",
name="city",
field=models.ForeignKey(
default=1,
on_delete=django.db.models.deletion.CASCADE,
related_name="regions",
to="events.city",
),
preserve_default=False,
),
migrations.AddField(
model_name="region",
name="description",
field=models.TextField(default="dd"),
preserve_default=False,
),
migrations.AddField(
model_name="region",
name="description_short",
field=models.CharField(default="ewfew", max_length=500),
preserve_default=False,
),
migrations.AddField(
model_name="region",
name="description_title",
field=models.CharField(default="sdf", max_length=250),
preserve_default=False,
),
migrations.AddField(
model_name="region",
name="showcase_cards",
field=models.JSONField(null=True),
),
migrations.AddField(
model_name="region",
name="url",
field=models.URLField(default="f"),
preserve_default=False,
),
migrations.DeleteModel(
name="Museum",
),
migrations.AddField(
model_name="regionmedia",
name="region",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="media",
to="events.region",
),
),
]

View File

@ -0,0 +1,24 @@
# Generated by Django 4.2.1 on 2023-05-20 09:42
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("events", "0002_regionmedia_delete_country_remove_hotel_location_and_more"),
]
operations = [
migrations.AlterField(
model_name="region",
name="city",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="regions",
to="events.city",
),
),
]

View File

@ -0,0 +1,22 @@
# Generated by Django 4.2.1 on 2023-05-20 09:59
from django.db import migrations
import location_field.models.plain
class Migration(migrations.Migration):
dependencies = [
("events", "0003_alter_region_city"),
]
operations = [
migrations.AddField(
model_name="city",
name="location",
field=location_field.models.plain.PlainLocationField(
default=0, max_length=63
),
preserve_default=False,
),
]

View File

@ -0,0 +1,30 @@
# Generated by Django 4.2.1 on 2023-05-20 12:13
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("events", "0004_city_location"),
]
operations = [
migrations.AddField(
model_name="place",
name="region",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="places",
to="events.region",
),
),
migrations.AddField(
model_name="place",
name="title",
field=models.CharField(default="", max_length=250),
preserve_default=False,
),
]

View File

@ -0,0 +1,28 @@
# Generated by Django 4.2.1 on 2023-05-20 12:17
import django.contrib.postgres.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("events", "0005_place_region_place_title"),
]
operations = [
migrations.AlterField(
model_name="place",
name="phones",
field=django.contrib.postgres.fields.ArrayField(
base_field=models.CharField(max_length=250), null=True, size=None
),
),
migrations.AlterField(
model_name="place",
name="sites",
field=django.contrib.postgres.fields.ArrayField(
base_field=models.CharField(max_length=250), null=True, size=None
),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2023-05-20 12:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("events", "0006_alter_place_phones_alter_place_sites"),
]
operations = [
migrations.AlterField(
model_name="place",
name="address",
field=models.CharField(blank=True, max_length=250, null=True),
),
]

View File

@ -0,0 +1,72 @@
# Generated by Django 4.2.1 on 2023-05-20 12:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("events", "0007_alter_place_address"),
]
operations = [
migrations.AlterField(
model_name="basepoint",
name="oid",
field=models.CharField(
max_length=24, primary_key=True, serialize=False, unique=True
),
),
migrations.AlterField(
model_name="city",
name="oid",
field=models.CharField(
max_length=24, primary_key=True, serialize=False, unique=True
),
),
migrations.AlterField(
model_name="place",
name="oid",
field=models.CharField(
max_length=24, primary_key=True, serialize=False, unique=True
),
),
migrations.AlterField(
model_name="pointmedia",
name="oid",
field=models.CharField(
max_length=24, primary_key=True, serialize=False, unique=True
),
),
migrations.AlterField(
model_name="region",
name="description_title",
field=models.CharField(max_length=500),
),
migrations.AlterField(
model_name="region",
name="oid",
field=models.CharField(
max_length=24, primary_key=True, serialize=False, unique=True
),
),
migrations.AlterField(
model_name="region",
name="title",
field=models.CharField(max_length=500),
),
migrations.AlterField(
model_name="regionmedia",
name="oid",
field=models.CharField(
max_length=24, primary_key=True, serialize=False, unique=True
),
),
migrations.AlterField(
model_name="tag",
name="oid",
field=models.CharField(
max_length=24, primary_key=True, serialize=False, unique=True
),
),
]

View File

@ -0,0 +1,97 @@
# Generated by Django 4.2.1 on 2023-05-20 12:47
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("events", "0008_alter_basepoint_oid_alter_city_oid_alter_place_oid_and_more"),
]
operations = [
migrations.RemoveField(
model_name="basepoint",
name="creator",
),
migrations.RemoveField(
model_name="basepoint",
name="partner",
),
migrations.RemoveField(
model_name="basepoint",
name="payment_method",
),
migrations.RemoveField(
model_name="event",
name="ya_id",
),
migrations.AddField(
model_name="basepoint",
name="can_buy",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="basepoint",
name="place",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="points",
to="events.place",
),
),
migrations.AddField(
model_name="basepoint",
name="priority",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name="basepoint",
name="sort",
field=models.IntegerField(default=0),
),
migrations.AddField(
model_name="event",
name="payment_method",
field=models.CharField(default="", max_length=250),
preserve_default=False,
),
migrations.AddField(
model_name="event",
name="purchase_method",
field=models.CharField(default="", max_length=250),
preserve_default=False,
),
migrations.AlterField(
model_name="event",
name="age",
field=models.CharField(
blank=True,
max_length=50,
null=True,
verbose_name="Возрастное ограничение",
),
),
migrations.AlterField(
model_name="event",
name="booking_link",
field=models.URLField(blank=True, null=True),
),
migrations.AlterField(
model_name="event",
name="discover_moscow_link",
field=models.URLField(blank=True, null=True),
),
migrations.AlterField(
model_name="region",
name="description_title",
field=models.CharField(max_length=250),
),
migrations.AlterField(
model_name="region",
name="title",
field=models.CharField(max_length=250),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2023-05-20 12:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("events", "0009_remove_basepoint_creator_remove_basepoint_partner_and_more"),
]
operations = [
migrations.AlterField(
model_name="basepoint",
name="parser_source",
field=models.CharField(blank=True, max_length=250, null=True),
),
]

View File

@ -0,0 +1,22 @@
# Generated by Django 4.2.1 on 2023-05-20 12:58
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("events", "0010_alter_basepoint_parser_source"),
]
operations = [
migrations.RemoveField(
model_name="event",
name="purchase_method",
),
migrations.AlterField(
model_name="event",
name="payment_method",
field=models.CharField(blank=True, max_length=250, null=True),
),
]

View File

@ -2,27 +2,35 @@
from django.db import models from django.db import models
from location_field.models.plain import PlainLocationField from location_field.models.plain import PlainLocationField
from polymorphic.models import PolymorphicModel from polymorphic.models import PolymorphicModel
from passfinder.utils.choices import count_max_length
class OIDModel(models.Model): class OIDModel(models.Model):
oid = models.CharField(primary_key=True, max_length=24) oid = models.CharField(primary_key=True, max_length=24, unique=True)
class Meta: class Meta:
abstract = True abstract = True
class Region(OIDModel): class Region(OIDModel):
city = models.ForeignKey(
"City", null=True, related_name="regions", on_delete=models.CASCADE
)
title = models.CharField(max_length=250) title = models.CharField(max_length=250)
description = models.TextField()
description_title = models.CharField(max_length=250)
description_short = models.CharField(max_length=500)
url = models.URLField()
showcase_cards = models.JSONField(null=True)
def __str__(self): def __str__(self):
return self.title return self.title
class Country(OIDModel): class RegionMedia(OIDModel):
title = models.CharField(max_length=250) file = models.FileField(upload_to="uploads/")
type = models.CharField(max_length=200)
def __str__(self): region = models.ForeignKey("Region", related_name="media", on_delete=models.CASCADE)
return self.title
class City(OIDModel): class City(OIDModel):
@ -30,21 +38,26 @@ class City(OIDModel):
region = models.ForeignKey( region = models.ForeignKey(
"Region", related_name="cities", null=True, on_delete=models.SET_NULL "Region", related_name="cities", null=True, on_delete=models.SET_NULL
) )
location = PlainLocationField(zoom=6)
def __str__(self): def __str__(self):
return self.title return self.title
class Place(OIDModel): class Place(OIDModel):
address = models.CharField(max_length=250) address = models.CharField(max_length=250, null=True, blank=True)
parser_source = models.CharField(max_length=250) parser_source = models.CharField(max_length=250)
city = models.ForeignKey( city = models.ForeignKey(
"City", related_name="places", null=True, on_delete=models.SET_NULL "City", related_name="places", null=True, on_delete=models.SET_NULL
) )
region = models.ForeignKey(
"Region", related_name="places", null=True, on_delete=models.SET_NULL
)
title = models.CharField(max_length=250)
description = models.TextField() description = models.TextField()
location = PlainLocationField(zoom=6) location = PlainLocationField(zoom=6)
sites = ArrayField(models.CharField(max_length=250)) sites = ArrayField(models.CharField(max_length=250), null=True)
phones = ArrayField(models.CharField(max_length=250)) phones = ArrayField(models.CharField(max_length=250), null=True)
working_time = models.JSONField(null=True) working_time = models.JSONField(null=True)
@ -57,7 +70,7 @@ def __str__(self):
class BasePoint(OIDModel, PolymorphicModel): class BasePoint(OIDModel, PolymorphicModel):
title = models.CharField(max_length=250) title = models.CharField(max_length=250)
parser_source = models.CharField(max_length=250) parser_source = models.CharField(max_length=250, null=True, blank=True)
description = models.TextField() description = models.TextField()
city = models.ForeignKey( city = models.ForeignKey(
"City", related_name="points", null=True, on_delete=models.SET_NULL "City", related_name="points", null=True, on_delete=models.SET_NULL
@ -65,10 +78,13 @@ class BasePoint(OIDModel, PolymorphicModel):
region = models.ForeignKey( region = models.ForeignKey(
"Region", related_name="points", null=True, on_delete=models.SET_NULL "Region", related_name="points", null=True, on_delete=models.SET_NULL
) )
creator = models.CharField(max_length=250) place = models.ForeignKey(
partner = models.CharField(max_length=250) "Place", related_name="points", null=True, on_delete=models.SET_NULL
payment_method = models.CharField(max_length=250) )
# tags = models.ManyToManyField("Tag", related_name="points") sort = models.IntegerField(default=0)
location = PlainLocationField(zoom=6)
can_buy = models.BooleanField(default=True)
priority = models.BooleanField(default=False)
def __str__(self): def __str__(self):
return self.title return self.title
@ -83,10 +99,28 @@ class PointMedia(OIDModel):
class Event(BasePoint): class Event(BasePoint):
ya_id = models.CharField(blank=True, max_length=24) class EventType(models.TextChoices):
age = models.CharField("Возрастное ограничение", max_length=50) yarmarka = "fair", "ярмарка"
booking_link = models.URLField() bulvar = "boulevard", "бульвар"
discover_moscow_link = models.URLField() dostoprimechatelnost = "attraction", "достопримечательность"
excursii = "excursion", "экскурсия"
teatr = "theatre", "театр"
museum = "museum", "музей"
kino = "movie", "кино"
concert = "concert", "концерт"
spektatli = "plays", "спектакли"
payment_method = models.CharField(max_length=250, null=True, blank=True)
type = models.CharField(
db_index=True,
choices=EventType.choices,
max_length=count_max_length(EventType),
)
age = models.CharField(
"Возрастное ограничение", max_length=50, blank=True, null=True
)
booking_link = models.URLField(null=True, blank=True)
discover_moscow_link = models.URLField(null=True, blank=True)
duration = models.IntegerField(blank=True, null=True) duration = models.IntegerField(blank=True, null=True)
ticket_price = models.IntegerField(blank=True, null=True) ticket_price = models.IntegerField(blank=True, null=True)
schedule = models.JSONField(null=True) schedule = models.JSONField(null=True)
@ -94,7 +128,6 @@ class Event(BasePoint):
class Hotel(BasePoint): class Hotel(BasePoint):
address = models.CharField(max_length=250) address = models.CharField(max_length=250)
location = PlainLocationField(zoom=6)
rooms = models.JSONField(null=True) rooms = models.JSONField(null=True)
email = models.CharField(max_length=250) email = models.CharField(max_length=250)
stars = models.IntegerField(null=True) stars = models.IntegerField(null=True)
@ -106,11 +139,6 @@ class HotelPhone(models.Model):
number = models.CharField(max_length=18) number = models.CharField(max_length=18)
class Museum(BasePoint):
# TODO
...
class Excursion(BasePoint): class Excursion(BasePoint):
duration_hours = models.IntegerField() duration_hours = models.IntegerField()
price = models.IntegerField() price = models.IntegerField()
@ -131,5 +159,4 @@ class Restaurant(BasePoint):
avg_time_visit = models.IntegerField() avg_time_visit = models.IntegerField()
can_reserve = models.BooleanField() can_reserve = models.BooleanField()
working_time = models.JSONField(null=True) working_time = models.JSONField(null=True)
location = PlainLocationField(zoom=6)
phone = models.CharField(max_length=18) phone = models.CharField(max_length=18)