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 src.utils import GUID 

7from .event import TrackAddedEvent, TrackDeletedEvent, ChangedEvent 

8 

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 ) 

15 

16 

17class TrackModel(db.Model): 

18 """ 

19 Track Model for storing track related details 

20 """ 

21 __tablename__ = "track" 

22 

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) 

35 

36 content = db.relationship( 

37 "ContentModel", backref=db.backref("track", uselist=False)) 

38 

39 @hybrid_property 

40 def track_id(self): 

41 return self.content_id 

42 

43 

44class TrackAdditionalModel(db.Model): 

45 """ 

46 Track Model for storing track related details added by a user 

47 """ 

48 __tablename__ = "track_additional" 

49 

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) 

59 

60 genres = db.relationship( 

61 "GenreModel", secondary=TrackAdditionalGenresModel, lazy="dynamic") 

62 

63 

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)) 

68 

69 

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()) 

75 

76 

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 

82 

83 changes = {} 

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

85 hist = attr.load_history() 

86 

87 if not hist.has_changes(): 

88 continue 

89 

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 ))