Coverage for src/model/episode_model.py : 74%
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
5from src import db
6from .event import EpisodeAddedEvent, EpisodeDeletedEvent, ChangedEvent
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 )
16class EpisodeModel(db.Model):
17 """
18 Episode Model for storing episode related details
19 """
20 __tablename__ = "episode"
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"))
33 content = db.relationship(
34 "ContentModel", backref=db.backref("episode", uselist=False))
36 @hybrid_property
37 def episode_id(self):
38 return self.content_id
41class EpisodeAdditionalModel(db.Model):
42 """
43 Episode Model for storing episode related details added by a user
44 """
45 __tablename__ = "episode_additional"
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"))
56 genres = db.relationship(
57 "GenreModel", secondary=EpisodeAdditionalGenresModel, lazy="dynamic")
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))
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())
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
79 changes = {}
80 for attr in db.inspect(target).attrs:
81 hist = attr.load_history()
83 if not hist.has_changes():
84 continue
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 ))