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 .event import ApplicationAddedEvent, ApplicationDeletedEvent, ChangedEvent 

7 

8ApplicationAdditionalGenresModel = db.Table("application_additional_genres", 

9 db.Column("app_id", db.Integer, db.ForeignKey( 

10 "application_additional.app_id"), primary_key=True), 

11 db.Column("genre_id", db.Integer, db.ForeignKey( 

12 "genre.genre_id"), primary_key=True) 

13 ) 

14 

15 

16class ApplicationModel(db.Model): 

17 """ 

18 Application Model for storing application related details 

19 """ 

20 __tablename__ = "application" 

21 

22 content_id = db.Column( 

23 db.Integer, 

24 db.ForeignKey('content.content_id', ondelete="CASCADE"), 

25 primary_key=True, index=True) 

26 name = db.Column(db.String(255), unique=True, index=True) 

27 size = db.Column(db.String(255)) 

28 installs = db.Column(db.String(255)) 

29 type = db.Column(db.String(45)) 

30 price = db.Column(db.String(45)) 

31 content_rating = db.Column(db.String(255)) 

32 last_updated = db.Column(db.String(255)) 

33 current_version = db.Column(db.String(255)) 

34 android_version = db.Column(db.String(255)) 

35 cover = db.Column(db.Text) 

36 

37 content = db.relationship( 

38 "ContentModel", backref=db.backref("application", uselist=False)) 

39 

40 @hybrid_property 

41 def app_id(self): 

42 return self.content_id 

43 

44 @hybrid_property 

45 def categorie(self): 

46 return self.content.genres[0] if self.content.genres else None 

47 

48 

49class ApplicationAdditionalModel(db.Model): 

50 """ 

51 Application Model for storing application related details added by a user 

52 """ 

53 __tablename__ = "application_additional" 

54 

55 app_id = db.Column(db.Integer, primary_key=True, index=True) 

56 name = db.Column(db.String(255), unique=True, index=True) 

57 size = db.Column(db.String(255)) 

58 installs = db.Column(db.String(255)) 

59 type = db.Column(db.String(45)) 

60 price = db.Column(db.String(45)) 

61 content_rating = db.Column(db.String(255)) 

62 last_updated = db.Column(db.String(255)) 

63 current_version = db.Column(db.String(255)) 

64 android_version = db.Column(db.String(255)) 

65 cover = db.Column(db.Text) 

66 

67 genres = db.relationship( 

68 "GenreModel", secondary=ApplicationAdditionalGenresModel, lazy="dynamic") 

69 

70 

71@event.listens_for(ApplicationModel, 'after_insert') 

72def receive_after_insert(mapper, connection, target): 

73 "listen for the 'after_insert' event" 

74 connection.execute(ApplicationAddedEvent.insert(target)) 

75 

76 

77@event.listens_for(ApplicationModel, 'after_delete') 

78def receive_after_delete(mapper, connection, target): 

79 "listen for the 'after_delete' event" 

80 event = ApplicationDeletedEvent(object_id=target.content_id) 

81 connection.execute(event.delete()) 

82 

83 

84@event.listens_for(ApplicationModel, '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 

89 

90 changes = {} 

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

92 hist = attr.load_history() 

93 

94 if not hist.has_changes(): 

95 continue 

96 

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=ApplicationModel.__tablename__, 

102 attribute_name=attr.key, 

103 new_value=str(hist.added[0]) 

104 ))