-
Notifications
You must be signed in to change notification settings - Fork 0
/
manage.py
138 lines (107 loc) · 3.56 KB
/
manage.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import argparse
import json
import typing
from api import create_app
from database.connection import get_session
from database.models import Actor, ActorMovie, Genre, GenreMovie, Movie
def _purge():
"""
Removing all data from the database.
"""
with get_session() as session:
session.begin()
session.query(ActorMovie).delete()
session.query(Actor).delete()
session.query(GenreMovie).delete()
session.query(Genre).delete()
session.query(Movie).delete()
session.commit()
def purge(_):
_purge()
def _reload(file: typing.TextIO):
"""
Removing all data from the database
and uploading movies data from the file to it.
"""
# Removing all data
_purge()
raw_movies = json.loads(file.read())
# Collecting the data from the file.
# Object ids are set here instead of
# using autogenerated database values
# as it allows to create relations between
# objects before their insert.
# The database is empty so it doesn't make collisions.
actors = {}
genres = {}
actor_movies = []
genre_movies = []
movies = []
for raw_movie in raw_movies:
movie = Movie()
movie.id = len(movies) + 1
movie.title = raw_movie["title"]
movie.year = raw_movie["year"]
movies.append(movie)
for actor_name in raw_movie["cast"]:
actor = actors.get(actor_name)
if actor is None:
actor = Actor()
actor.id = len(actors) + 1
actor.name = actor_name
actors[actor_name] = actor
actor_movie = ActorMovie()
actor_movie.actor_id = actor.id
actor_movie.movie_id = movie.id
actor_movies.append(actor_movie)
for genre_name in raw_movie["genres"]:
genre = genres.get(genre_name)
if genre is None:
genre = Genre()
genre.id = len(genres) + 1
genre.name = genre_name
genres[genre_name] = genre
genre_movie = GenreMovie()
genre_movie.genre_id = genre.id
genre_movie.movie_id = movie.id
genre_movies.append(genre_movie)
# Saving collected objects to the database
with get_session() as session:
session.begin()
session.bulk_save_objects(actors.values())
session.bulk_save_objects(genres.values())
session.bulk_save_objects(movies)
session.bulk_save_objects(actor_movies)
session.bulk_save_objects(genre_movies)
session.commit()
def reload(args: argparse.Namespace):
_reload(args.file)
def run(_):
"""
Running the main application.
"""
app = create_app()
app.run()
def main():
"""
Parsing the script options.
"""
parser = argparse.ArgumentParser(description="Scripts for managing the application")
subparsers = parser.add_subparsers()
purge_parser = subparsers.add_parser("purge", help="Remove all data from the database")
purge_parser.set_defaults(func=purge)
reload_parser = subparsers.add_parser(
"reload",
help="Remove all data and upload selected file to the database",
)
reload_parser.add_argument("file", type=argparse.FileType())
reload_parser.set_defaults(func=reload)
run_parser = subparsers.add_parser("run", help="Run the application")
run_parser.set_defaults(func=run)
args = parser.parse_args()
if hasattr(args, "func"):
args.func(args)
else:
parser.print_help()
if __name__ == '__main__':
main()