Coverage for rfpy/model/tags.py: 100%

15 statements  

« prev     ^ index     » next       coverage.py v7.0.1, created at 2022-12-31 16:00 +0000

1from sqlalchemy import Column, ForeignKey, Table, UniqueConstraint, Integer 

2from sqlalchemy.orm import relationship, backref 

3from sqlalchemy.dialects import mysql 

4 

5 

6from .humans import Organisation 

7from .questionnaire import QuestionInstance 

8from .meta import Base 

9 

10 

11tags_qinstances_table = Table( 

12 "tags_qinstances", 

13 Base.metadata, 

14 Column("tag_id", Integer, ForeignKey('tags.id', ondelete="CASCADE"), index=True), 

15 Column( 

16 "question_instance_id", 

17 Integer, 

18 ForeignKey(QuestionInstance.id, ondelete="CASCADE"), 

19 index=True 

20 ), 

21 UniqueConstraint('tag_id', 'question_instance_id') 

22) 

23 

24 

25class Tag(Base): 

26 

27 __tablename__ = "tags" 

28 __table_args__ = ( 

29 UniqueConstraint("org_id", "name"), 

30 {"mysql_engine": "InnoDB", "mysql_charset": 'utf8mb4'} 

31 ) 

32 

33 org_id = Column( 

34 mysql.VARCHAR(length=50), 

35 ForeignKey("organisations.id", ondelete="CASCADE", onupdate="CASCADE") 

36 ) 

37 name = Column(mysql.VARCHAR(length=128), nullable=False) 

38 description = Column(mysql.VARCHAR(length=256)) 

39 

40 organisation = relationship( 

41 Organisation, 

42 primaryjoin=org_id == Organisation.id, 

43 backref=backref( 

44 "tags", 

45 lazy="dynamic", 

46 cascade="all,delete", 

47 passive_deletes=True, 

48 ), 

49 ) 

50 

51 question_instances = relationship( 

52 QuestionInstance, 

53 secondary=tags_qinstances_table, 

54 backref=backref('tags', passive_deletes=True), 

55 passive_deletes=True, 

56 lazy='dynamic' 

57 )