-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
113 lines (89 loc) · 4.19 KB
/
main.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
import os
import json
import jinja2
import webapp2
import requests
from google.cloud import ndb
from models.movie import Movie
template_dir = os.path.join(os.path.dirname(__file__), 'templates') # setting the path for the templates
jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_dir)) # Jinja2 environment
class MainHandler(webapp2.RequestHandler):
def get(self):
client = ndb.Client()
with client.context(): # using the NDB client context to query all movies present in the database
data = Movie.query().fetch()
movies = data[0:3]
template = jinja_env.get_template('base.html')
self.response.write(template.render(movies=movies))
class SearchMoviesHandler(webapp2.RequestHandler):
def get(self):
template = jinja_env.get_template('movie_search.html')
self.response.write(template.render())
def post(self):
client = ndb.Client()
search_option = self.request.get('search_option')
query = self.request.get('search')
with client.context(): # using the NDB client context to query the database based on the search option
movies = Movie.query(getattr(Movie, search_option).IN([query])) if search_option in ['director', 'cast', 'genre'] else None
if movies != None :
template = jinja_env.get_template('movie_list.html')
self.response.write(template.render(movies=movies))
else:
template = jinja_env.get_template('404.html')
self.response.write(template.render())
class ListMoviesHandler(webapp2.RequestHandler):
def get(self):
client = ndb.Client()
with client.context(): # using the NDB client context to query all movies present in the database
movies = Movie.query()
template = jinja_env.get_template('movie_list.html')
self.response.write(template.render(movies=movies))
class AddMovieHandler(webapp2.RequestHandler):
def get(self):
template = jinja_env.get_template('movie_form.html')
self.response.write(template.render())
def post(self):
client = ndb.Client()
title = self.request.get("title")
response = requests.get(f"http://www.omdbapi.com/?apikey=<API_KEY>&t={title}") # OMDB OpenAPI for fetching data for a movie , use your own API KEY
data = json.loads(response.text)
if data["Response"] == "False":
template = jinja_env.get_template('404.html')
self.response.write(template.render())
else:
with client.context(): # using the NDB client context to create a new movie object in the database
movie = Movie(title=data["Title"],director=data["Director"],cast=data["Actors"],genre=data["Genre"],poster=data["Poster"])
movie.put()
self.redirect("/list")
class EditMovieHandler(webapp2.RequestHandler):
def get(self):
id = self.request.get('id')
client = ndb.Client()
with client.context():
movie = ndb.Key('Movie', int(id)).get()
template = jinja_env.get_template('movie_edit.html')
self.response.write(template.render(movie=movie))
def post(self):
id = self.request.get('id')
client = ndb.Client()
with client.context(): # using the NDB client context to edit movie object in the database
movie = ndb.Key('Movie', int(id)).get()
title = self.request.get('title') or movie.title
director = self.request.get('director') or movie.director
cast = self.request.get('cast') or movie.cast
genre = self.request.get('genre') or movie.genre
poster = self.request.get('poster') or movie.poster
movie.title = title
movie.director = director
movie.cast = cast
movie.genre = genre
movie.poster = poster
movie.put()
self.redirect('/list')
app = webapp2.WSGIApplication([
('/', MainHandler),
('/search', SearchMoviesHandler),
('/list', ListMoviesHandler),
('/add', AddMovieHandler),
('/edit', EditMovieHandler),
], debug=False)