Coverage for src/model/track_model.py : 80%
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 src.utils import GUID
7from .event import TrackAddedEvent, TrackDeletedEvent, ChangedEvent
9TrackAdditionalGenresModel = db.Table("track_additional_genres",
10 db.Column("track_id", db.Integer, db.ForeignKey(
11 "track_additional.track_id"), primary_key=True),
12 db.Column("genre_id", db.Integer, db.ForeignKey(
13 "genre.genre_id"), primary_key=True)
14 )
17class TrackModel(db.Model):
18 """
19 Track Model for storing track related details
20 """
21 __tablename__ = "track"
23 content_id = db.Column(
24 db.Integer,
25 db.ForeignKey('content.content_id', ondelete="CASCADE"),
26 primary_key=True, index=True)
27 title = db.Column(db.String(255), index=True)
28 year = db.Column(db.SmallInteger)
29 artist_name = db.Column(db.String(255), index=True)
30 release = db.Column(db.String(255))
31 track_mmid = db.Column(db.String(45))
32 recording_mbid = db.Column(GUID())
33 spotify_id = db.Column(db.String(45))
34 covert_art_url = db.Column(db.Text)
36 content = db.relationship(
37 "ContentModel", backref=db.backref("track", uselist=False))
39 @hybrid_property
40 def track_id(self):
41 return self.content_id
44class TrackAdditionalModel(db.Model):
45 """
46 Track Model for storing track related details added by a user
47 """
48 __tablename__ = "track_additional"
50 track_id = db.Column(db.Integer, primary_key=True, index=True)
51 title = db.Column(db.String(255), index=True)
52 year = db.Column(db.SmallInteger)
53 artist_name = db.Column(db.String(255), index=True)
54 release = db.Column(db.String(255))
55 track_mmid = db.Column(db.String(45))
56 recording_mbid = db.Column(GUID())
57 spotify_id = db.Column(db.String(45))
58 covert_art_url = db.Column(db.Text)
60 genres = db.relationship(
61 "GenreModel", secondary=TrackAdditionalGenresModel, lazy="dynamic")
64@event.listens_for(TrackModel, 'after_insert')
65def receive_after_insert(mapper, connection, target):
66 "listen for the 'after_insert' event"
67 connection.execute(TrackAddedEvent.insert(target))
70@event.listens_for(TrackModel, 'after_delete')
71def receive_after_delete(mapper, connection, target):
72 "listen for the 'after_delete' event"
73 event = TrackDeletedEvent(object_id=target.content_id)
74 connection.execute(event.delete())
77@event.listens_for(TrackModel, 'after_update')
78def receive_after_update(mapper, connection, target):
79 "listen for the 'after_update' event"
80 if not object_session(target).is_modified(target, include_collections=False):
81 return
83 changes = {}
84 for attr in db.inspect(target).attrs:
85 hist = attr.load_history()
87 if not hist.has_changes():
88 continue
90 # hist.deleted holds old value
91 # hist.added holds new value
92 connection.execute(ChangedEvent.__table__.insert().values(
93 object_id=target.content_id,
94 model_name=TrackModel.__tablename__,
95 attribute_name=attr.key,
96 new_value=str(hist.added[0])
97 ))