Coverage for src/model/game_model.py : 81%
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 GameAddedEvent, GameDeletedEvent, ChangedEvent
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 )
16class GameModel(db.Model):
17 """
18 Game Model for storing game related details
19 """
20 __tablename__ = "game"
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))
37 content = db.relationship(
38 "ContentModel", backref=db.backref("game", uselist=False))
40 @hybrid_property
41 def game_id(self):
42 return self.content_id
45class GameAdditionalModel(db.Model):
46 """
47 Game Model for storing game related details added by a user
48 """
49 __tablename__ = "game_additional"
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))
62 genres = db.relationship(
63 "GenreModel", secondary=GameAdditionalGenresModel, lazy="dynamic")
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))
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())
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
85 changes = {}
86 for attr in db.inspect(target).attrs:
87 hist = attr.load_history()
89 if not hist.has_changes():
90 continue
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 ))