Coverage for src/model/movie_model.py : 82%
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 MovieAddedEvent, MovieDeletedEvent, ChangedEvent
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 )
16class MovieModel(db.Model):
17 """
18 Movie Model for storing movie related details
19 """
20 __tablename__ = "movie"
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)
38 content = db.relationship(
39 "ContentModel", backref=db.backref("movie", uselist=False))
41 @hybrid_property
42 def movie_id(self):
43 return self.content_id
46class MovieAdditionalModel(db.Model):
47 """
48 Movie Model for storing movie related details added by a user
49 """
50 __tablename__ = "movie_additional"
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)
65 genres = db.relationship(
66 "GenreModel", secondary=MovieAdditionalGenresModel, lazy="dynamic")
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))
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())
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
88 changes = {}
89 for attr in db.inspect(target).attrs:
90 hist = attr.load_history()
92 if not hist.has_changes():
93 continue
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 ))