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 EpisodeAddedEvent, EpisodeDeletedEvent, ChangedEvent 

7 

8EpisodeAdditionalGenresModel = db.Table("episode_additional_genres", 

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

10 "episode_additional.episode_id"), primary_key=True), 

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

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

13 ) 

14 

15 

16class EpisodeModel(db.Model): 

17 """ 

18 Episode Model for storing episode related details 

19 """ 

20 __tablename__ = "episode" 

21 

22 content_id = db.Column( 

23 db.Integer, 

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

25 primary_key=True, index=True) 

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

27 title = db.Column(db.String(512), index=True) 

28 year = db.Column(db.Integer) 

29 season_number = db.Column(db.Integer) 

30 episode_number = db.Column(db.Integer) 

31 serie_id = db.Column(db.Integer, db.ForeignKey("serie.content_id")) 

32 

33 content = db.relationship( 

34 "ContentModel", backref=db.backref("episode", uselist=False)) 

35 

36 @hybrid_property 

37 def episode_id(self): 

38 return self.content_id 

39 

40 

41class EpisodeAdditionalModel(db.Model): 

42 """ 

43 Episode Model for storing episode related details added by a user 

44 """ 

45 __tablename__ = "episode_additional" 

46 

47 episode_id = db.Column(db.Integer, index=True, primary_key=True) 

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

49 title = db.Column(db.String(512), index=True) 

50 year = db.Column(db.Integer) 

51 season_number = db.Column(db.Integer) 

52 episode_number = db.Column(db.Integer) 

53 serie_id = db.Column(db.Integer, db.ForeignKey( 

54 "serie_additional.serie_id")) 

55 

56 genres = db.relationship( 

57 "GenreModel", secondary=EpisodeAdditionalGenresModel, lazy="dynamic") 

58 

59 

60@event.listens_for(EpisodeModel, 'after_insert') 

61def receive_after_insert(mapper, connection, target): 

62 "listen for the 'after_insert' event" 

63 connection.execute(EpisodeAddedEvent.insert(target)) 

64 

65 

66@event.listens_for(EpisodeModel, 'after_delete') 

67def receive_after_delete(mapper, connection, target): 

68 "listen for the 'after_delete' event" 

69 event = EpisodeDeletedEvent(object_id=target.content_id) 

70 connection.execute(event.delete()) 

71 

72 

73@event.listens_for(EpisodeModel, 'after_update') 

74def receive_after_update(mapper, connection, target): 

75 "listen for the 'after_update' event" 

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

77 return 

78 

79 changes = {} 

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

81 hist = attr.load_history() 

82 

83 if not hist.has_changes(): 

84 continue 

85 

86 # hist.deleted holds old value 

87 # hist.added holds new value 

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

89 object_id=target.content_id, 

90 model_name=EpisodeModel.__tablename__, 

91 attribute_name=attr.key, 

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

93 ))