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 BookAddedEvent, BookDeletedEvent, ChangedEvent 

7 

8 

9class BookModel(db.Model): 

10 """ 

11 Book Model for storing book related details 

12 """ 

13 __tablename__ = "book" 

14 

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) 

28 

29 content = db.relationship( 

30 "ContentModel", backref=db.backref("book", uselist=False)) 

31 

32 @hybrid_property 

33 def book_id(self): 

34 return self.content_id 

35 

36 

37class BookAdditionalModel(db.Model): 

38 """ 

39 Book Model for storing book related details added by a user 

40 """ 

41 __tablename__ = "book_additional" 

42 

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) 

52 

53 

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)) 

58 

59 

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()) 

65 

66 

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 

72 

73 changes = {} 

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

75 hist = attr.load_history() 

76 

77 if not hist.has_changes(): 

78 continue 

79 

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 ))