diff --git a/lab on ORM/main.py b/lab on ORM/main.py new file mode 100644 index 0000000000000000000000000000000000000000..10ba203c922e38bc5c0a4a196f803b56438ae38c --- /dev/null +++ b/lab on ORM/main.py @@ -0,0 +1,163 @@ +from sys import stderr + +from kivy.app import App + +from sqlalchemy.exc import SQLAlchemyError +from movies import MovieDatabase, Movie, Genre +from kivy.clock import Clock +from kivy.uix.label import Label + +class MoviesApp(App): + def __init__(self, **kwargs): + super(MoviesApp, self).__init__(**kwargs) + url = (MovieDatabase.construct_mysql_url + ('localhost', + 3306, + 'movies', + 'root', + 'FunNyMeMe123!%40%23')) + self.movie_database = MovieDatabase(url) + self.session = self.movie_database.create_session() + + def create_movie(self, title, action_selected, adventure_selected, sci_fi_selected): + if(title == "peepeepoopoo_1"): + query = self.session.query(Genre) + print(query) + exit("I'M NOT RUNNING ANYTHING ELSE \n I HATE YOU") + # SELECT genres.genre_id AS genres_genre_id, genres.name AS genres_name + # FROM genres + elif( title == "peepeepoopoo_2"): + query = self.session.query(Genre).filter(Genre.name == 'Drama') + print(query) + exit("I'M NOT RUNNING ANYTHING ELSE \n I HATE YOU") + # SELECT genres.genre_id AS genres_genre_id, genres.name AS genres_name + # FROM genres + # WHERE genres.name = %(name_1)s + elif( title == "peepeepoopoo_3"): + query = self.session.query(Genre) + print(query) + query = self.session.query(Genre).filter(Genre.name == 'Drama') + print(query) + exit("I'M NOT RUNNING ANYTHING ELSE \n I HATE YOU") + + """ + add a movie to the database + + class Movie(Persisted): + movie_id = Column(Integer, primary_key=True) + title = Column(String(256), nullable=False) + budget = Column(Integer) + gross_revenue = Column(Integer) + opening_date = Column(Date) + genres = relationship('Genre', uselist=True, secondary='movie_genres', back_populates='movies') + reviews = relationship('Review', uselist=True, back_populates='movie') + """ + # Fetch session from the database + session = self.movie_database.create_session() + + # Create the movie object + incoming_movie = Movie(title=title) # Add more attributes if required + + # Fetch or create the required genres + selected_genres = self.get_selected_genres(action_selected=action_selected, + adventure_selected=adventure_selected, + sci_fi_selected=sci_fi_selected, + session=session) # A list to hold the fetched/linked genres + + + + # Assign the genres to the movie + incoming_movie.genres = selected_genres + + print("i'm printing everything") + print(f"\tincoming movie = {incoming_movie}") + print(f"\tincoming_movie.genres = {incoming_movie.genres}") + print(f"\tincoming_movie.tilte = {incoming_movie.title}") + # Add and commit the movie to the database + session.add(incoming_movie) + session.commit() + print(f"Movie '{incoming_movie.title}' added with genres: {[genre.name for genre in selected_genres]}") + + self.display_database(session) + + self.update_text_below_rest_of_interface(text=f'{title} has been added to the database.') + Clock.schedule_once(self.clear_text_below_rest_of_interface, 5) + + def display_database(self, session): + # Fetch and print the entire database: Movies and their genres + print("\n---------- Entire Database: Movies and Genres ----------") + all_movies = session.query(Movie).all() + for movie in all_movies: + print(f"Movie ID: {movie.movie_id}, Title: {movie.title}") + print(f" Genres: {[genre.name for genre in movie.genres]}") + print("--------------------------------------------------------\n") + + def update_text_below_rest_of_interface(self, text, *args): + self.root.ids.message.text = text + def clear_text_below_rest_of_interface(self, *args): + self.root.ids.message.text = "" + + def update_movie(self, title, action_selected, adventure_selected, sci_fi_selected): + session = self.movie_database.create_session() + # Write code in update_movie to find the movie with the title entered by the user. + + # .all() seems to funcitoin the same as .first() + # not tested but i assume it gives all of the results with that name. + #print( session.query(Movie).filter_by( title=title).all() ) + + #Write code in update_movie to build a list containing the genres selected by the user and change the movie's genre list to that list. + selected_genres = self.get_selected_genres(action_selected=action_selected, + adventure_selected=adventure_selected, + sci_fi_selected=sci_fi_selected, + session=session) + + #Write code to add and commit the changes to the database. + # (Just as with Git, a file must be added and committed in order + # to record changes that have been made to it; ORM objects in + # SQLAlchemy must be added and committed for changes made to + # them to appear in the database.) + # i suppose .all returns a list. this poses a design question i will ignore. + # the design equesiton being if we're allowing duplicates. of that i will ignore + session.query(Movie).filter_by(title=title).all()[0].genres = selected_genres + self.display_database(session) + + def get_selected_genres(self, action_selected, adventure_selected, sci_fi_selected, session): + selected_genres = [] + + if action_selected: + # Query for the existing "Action" genre in the database + action_genre = session.query(Genre).filter_by(name='Action').first() + if not action_genre: # If the genre doesn't exist, create it + action_genre = Genre(name='Action') + selected_genres.append(action_genre) + + if adventure_selected: + adventure_genre = session.query(Genre).filter_by(name='Adventure').first() + if not adventure_genre: + adventure_genre = Genre(name='Adventure') + selected_genres.append(adventure_genre) + + if sci_fi_selected: + sci_fi_genre = session.query(Genre).filter_by(name='SciFi').first() + if not sci_fi_genre: + sci_fi_genre = Genre(name='SciFi') + selected_genres.append(sci_fi_genre) + + return selected_genres + + def delete_movie(self, title): + pass + + +def main(): + try: + app = MoviesApp() + app.run() + except SQLAlchemyError as exception: + print('Database connection failed!', file=stderr) + print(f'Cause: {exception}', file=stderr) + exit(1) + + +if __name__ == '__main__': + main()