Coverage for src/model/application_model.py : 82%
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 ApplicationAddedEvent, ApplicationDeletedEvent, ChangedEvent
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 )
16class ApplicationModel(db.Model):
17 """
18 Application Model for storing application related details
19 """
20 __tablename__ = "application"
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)
37 content = db.relationship(
38 "ContentModel", backref=db.backref("application", uselist=False))
40 @hybrid_property
41 def app_id(self):
42 return self.content_id
44 @hybrid_property
45 def categorie(self):
46 return self.content.genres[0] if self.content.genres else None
49class ApplicationAdditionalModel(db.Model):
50 """
51 Application Model for storing application related details added by a user
52 """
53 __tablename__ = "application_additional"
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)
67 genres = db.relationship(
68 "GenreModel", secondary=ApplicationAdditionalGenresModel, lazy="dynamic")
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))
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())
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
90 changes = {}
91 for attr in db.inspect(target).attrs:
92 hist = attr.load_history()
94 if not hist.has_changes():
95 continue
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 ))