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 GameAddedEvent, GameDeletedEvent, ChangedEvent 

7 

8GameAdditionalGenresModel = db.Table("game_additional_genres", 

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

10 "game_additional.game_id"), primary_key=True), 

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

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

13 ) 

14 

15 

16class GameModel(db.Model): 

17 """ 

18 Game Model for storing game related details 

19 """ 

20 __tablename__ = "game" 

21 

22 content_id = db.Column( 

23 db.Integer, 

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

25 primary_key=True, index=True) 

26 steamid = db.Column(db.Integer, nullable=True) 

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

28 short_description = db.Column(db.Text) 

29 header_image = db.Column(db.String(255)) 

30 website = db.Column(db.String(255)) 

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

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

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

34 recommendations = db.Column(db.Integer) 

35 release_date = db.Column(db.String(255)) 

36 

37 content = db.relationship( 

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

39 

40 @hybrid_property 

41 def game_id(self): 

42 return self.content_id 

43 

44 

45class GameAdditionalModel(db.Model): 

46 """ 

47 Game Model for storing game related details added by a user 

48 """ 

49 __tablename__ = "game_additional" 

50 

51 game_id = db.Column(db.Integer, primary_key=True, index=True) 

52 steamid = db.Column(db.Integer, nullable=True) 

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

54 short_description = db.Column(db.Text) 

55 header_image = db.Column(db.String(255)) 

56 website = db.Column(db.String(255)) 

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

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

59 price = db.Column(db.String(255)) 

60 release_date = db.Column(db.String(255)) 

61 

62 genres = db.relationship( 

63 "GenreModel", secondary=GameAdditionalGenresModel, lazy="dynamic") 

64 

65 

66@event.listens_for(GameModel, 'after_insert') 

67def receive_after_insert(mapper, connection, target): 

68 "listen for the 'after_insert' event" 

69 connection.execute(GameAddedEvent.insert(target)) 

70 

71 

72@event.listens_for(GameModel, 'after_delete') 

73def receive_after_delete(mapper, connection, target): 

74 "listen for the 'after_delete' event" 

75 event = GameDeletedEvent(object_id=target.content_id) 

76 connection.execute(event.delete()) 

77 

78 

79@event.listens_for(GameModel, 'after_update') 

80def receive_after_update(mapper, connection, target): 

81 "listen for the 'after_update' event" 

82 if not object_session(target).is_modified(target, include_collections=False): 

83 return 

84 

85 changes = {} 

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

87 hist = attr.load_history() 

88 

89 if not hist.has_changes(): 

90 continue 

91 

92 # hist.deleted holds old value 

93 # hist.added holds new value 

94 connection.execute(ChangedEvent.__table__.insert().values( 

95 object_id=target.content_id, 

96 model_name=GameModel.__tablename__, 

97 attribute_name=attr.key, 

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

99 ))