Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1from sqlalchemy.ext.hybrid import hybrid_property 

2from sqlalchemy.orm.session import object_session 

3from sqlalchemy import event 

4 

5from src import db 

6from .event import MovieAddedEvent, MovieDeletedEvent, ChangedEvent 

7 

8MovieAdditionalGenresModel = db.Table("movie_additional_genres", 

9 db.Column("movie_id", db.Integer, db.ForeignKey( 

10 "movie_additional.movie_id"), primary_key=True), 

11 db.Column("genre_id", db.Integer, db.ForeignKey( 

12 "genre.genre_id"), primary_key=True) 

13 ) 

14 

15 

16class MovieModel(db.Model): 

17 """ 

18 Movie Model for storing movie related details 

19 """ 

20 __tablename__ = "movie" 

21 

22 content_id = db.Column( 

23 db.Integer, 

24 db.ForeignKey('content.content_id', ondelete="CASCADE"), 

25 primary_key=True, index=True) 

26 title = db.Column(db.String(255), index=True) 

27 language = db.Column(db.String(255)) 

28 actors = db.Column(db.Text) 

29 year = db.Column(db.String(255)) 

30 producers = db.Column(db.Text) 

31 director = db.Column(db.Text) 

32 writer = db.Column(db.Text) 

33 imdbid = db.Column(db.String(255)) 

34 tmdbid = db.Column(db.String(255)) 

35 cover = db.Column(db.Text) 

36 plot_outline = db.Column(db.Text) 

37 

38 content = db.relationship( 

39 "ContentModel", backref=db.backref("movie", uselist=False)) 

40 

41 @hybrid_property 

42 def movie_id(self): 

43 return self.content_id 

44 

45 

46class MovieAdditionalModel(db.Model): 

47 """ 

48 Movie Model for storing movie related details added by a user 

49 """ 

50 __tablename__ = "movie_additional" 

51 

52 movie_id = db.Column(db.Integer, primary_key=True, index=True) 

53 title = db.Column(db.String(255), index=True) 

54 language = db.Column(db.String(255)) 

55 actors = db.Column(db.Text) 

56 year = db.Column(db.String(255)) 

57 producers = db.Column(db.Text) 

58 director = db.Column(db.Text) 

59 writer = db.Column(db.Text) 

60 imdbid = db.Column(db.String(255)) 

61 tmdbid = db.Column(db.String(255)) 

62 cover = db.Column(db.Text) 

63 plot_outline = db.Column(db.Text) 

64 

65 genres = db.relationship( 

66 "GenreModel", secondary=MovieAdditionalGenresModel, lazy="dynamic") 

67 

68 

69@event.listens_for(MovieModel, 'after_insert') 

70def receive_after_insert(mapper, connection, target): 

71 "listen for the 'after_insert' event" 

72 connection.execute(MovieAddedEvent.insert(target)) 

73 

74 

75@event.listens_for(MovieModel, 'after_delete') 

76def receive_after_delete(mapper, connection, target): 

77 "listen for the 'after_delete' event" 

78 event = MovieDeletedEvent(object_id=target.content_id) 

79 connection.execute(event.delete()) 

80 

81 

82@event.listens_for(MovieModel, 'after_update') 

83def receive_after_update(mapper, connection, target): 

84 "listen for the 'after_update' event" 

85 if not object_session(target).is_modified(target, include_collections=False): 

86 return 

87 

88 changes = {} 

89 for attr in db.inspect(target).attrs: 

90 hist = attr.load_history() 

91 

92 if not hist.has_changes(): 

93 continue 

94 

95 # hist.deleted holds old value 

96 # hist.added holds new value 

97 connection.execute(ChangedEvent.__table__.insert().values( 

98 object_id=target.content_id, 

99 model_name=MovieModel.__tablename__, 

100 attribute_name=attr.key, 

101 new_value=str(hist.added[0]) 

102 ))