Coverage for src/model/book_model.py : 77%
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 BookAddedEvent, BookDeletedEvent, ChangedEvent
9class BookModel(db.Model):
10 """
11 Book Model for storing book related details
12 """
13 __tablename__ = "book"
15 content_id = db.Column(
16 db.Integer,
17 db.ForeignKey('content.content_id', ondelete="CASCADE"),
18 primary_key=True, index=True)
19 isbn = db.Column(db.String(13), unique=True,
20 nullable=False, index=True)
21 title = db.Column(db.String(255), index=True)
22 author = db.Column(db.String(255), index=True)
23 year_of_publication = db.Column(db.Integer)
24 publisher = db.Column(db.String(255))
25 image_url_s = db.Column(db.Text)
26 image_url_m = db.Column(db.Text)
27 image_url_l = db.Column(db.Text)
29 content = db.relationship(
30 "ContentModel", backref=db.backref("book", uselist=False))
32 @hybrid_property
33 def book_id(self):
34 return self.content_id
37class BookAdditionalModel(db.Model):
38 """
39 Book Model for storing book related details added by a user
40 """
41 __tablename__ = "book_additional"
43 book_id = db.Column(db.Integer, primary_key=True, index=True)
44 isbn = db.Column(db.String(13), unique=True, nullable=False, index=True)
45 title = db.Column(db.String(255), index=True)
46 author = db.Column(db.String(255), index=True)
47 year_of_publication = db.Column(db.Integer)
48 publisher = db.Column(db.String(255))
49 image_url_s = db.Column(db.Text)
50 image_url_m = db.Column(db.Text)
51 image_url_l = db.Column(db.Text)
54@event.listens_for(BookModel, 'after_insert')
55def receive_after_insert(mapper, connection, target):
56 "listen for the 'after_insert' event"
57 connection.execute(BookAddedEvent.insert(target))
60@event.listens_for(BookModel, 'after_delete')
61def receive_after_delete(mapper, connection, target):
62 "listen for the 'after_delete' event"
63 event = BookDeletedEvent(object_id=target.content_id)
64 connection.execute(event.delete())
67@event.listens_for(BookModel, 'after_update')
68def receive_after_update(mapper, connection, target):
69 "listen for the 'after_update' event"
70 if not object_session(target).is_modified(target, include_collections=False):
71 return
73 changes = {}
74 for attr in db.inspect(target).attrs:
75 hist = attr.load_history()
77 if not hist.has_changes():
78 continue
80 # hist.deleted holds old value
81 # hist.added holds new value
82 connection.execute(ChangedEvent.__table__.insert().values(
83 object_id=target.content_id,
84 model_name=BookModel.__tablename__,
85 attribute_name=attr.key,
86 new_value=str(hist.added[0])
87 ))