Coverage for src/model/serie_model.py : 81%
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 SerieAddedEvent, SerieDeletedEvent, ChangedEvent
8SerieAdditionalGenresModel = db.Table("serie_additional_genres",
9 db.Column("serie_id", db.Integer, db.ForeignKey(
10 "serie_additional.serie_id"), primary_key=True),
11 db.Column("genre_id", db.Integer, db.ForeignKey(
12 "genre.genre_id"), primary_key=True)
13 )
16class SerieModel(db.Model):
17 """
18 Serie Model for storing serie related details
19 """
20 __tablename__ = "serie"
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(255), index=True)
28 start_year = db.Column(db.Integer)
29 end_year = db.Column(db.Integer)
30 writers = db.Column(db.Text)
31 directors = db.Column(db.Text)
32 actors = db.Column(db.Text)
33 cover = db.Column(db.Text)
34 plot_outline = db.Column(db.Text)
36 episodes = db.relationship(
37 "EpisodeModel", backref="serie", lazy="dynamic")
39 content = db.relationship(
40 "ContentModel", backref=db.backref("serie", uselist=False))
42 @hybrid_property
43 def serie_id(self):
44 return self.content_id
47class SerieAdditionalModel(db.Model):
48 """
49 Serie Model for storing serie related details added by a user
50 """
51 __tablename__ = "serie_additional"
53 serie_id = db.Column(db.Integer, index=True, primary_key=True)
54 imdbid = db.Column(db.String(255))
55 title = db.Column(db.String(255), index=True)
56 start_year = db.Column(db.Integer)
57 end_year = db.Column(db.Integer)
58 writers = db.Column(db.Text)
59 directors = db.Column(db.Text)
60 actors = db.Column(db.Text)
61 cover = db.Column(db.Text)
62 plot_outline = db.Column(db.Text)
64 episodes = db.relationship(
65 "EpisodeAdditionalModel", backref="serie", lazy="dynamic")
67 genres = db.relationship(
68 "GenreModel", secondary=SerieAdditionalGenresModel, lazy="dynamic")
71@event.listens_for(SerieModel, 'after_insert')
72def receive_after_insert(mapper, connection, target):
73 "listen for the 'after_insert' event"
74 connection.execute(SerieAddedEvent.insert(target))
77@event.listens_for(SerieModel, 'after_delete')
78def receive_after_delete(mapper, connection, target):
79 "listen for the 'after_delete' event"
80 event = SerieDeletedEvent(object_id=target.content_id)
81 connection.execute(event.delete())
84@event.listens_for(SerieModel, 'after_update')
85def receive_after_update(mapper, connection, target):
86 "listen for the 'after_update' event"
87 if not object_session(target).is_modified(target, include_collections=False):
88 return
90 changes = {}
91 for attr in db.inspect(target).attrs:
92 hist = attr.load_history()
94 if not hist.has_changes():
95 continue
97 # hist.deleted holds old value
98 # hist.added holds new value
99 connection.execute(ChangedEvent.__table__.insert().values(
100 object_id=target.content_id,
101 model_name=SerieModel.__tablename__,
102 attribute_name=attr.key,
103 new_value=str(hist.added[0])
104 ))