1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 from camelot.model import metadata
28 from elixir.entity import Entity
29 from elixir.options import using_options
30 from elixir.fields import Field
31 from sqlalchemy.types import Unicode, INT
32 """Classes to support the loading of required datasets into the
33 database"""
34
35
36 __metadata__ = metadata
39 """Keep track of static data loaded into the database"""
40 using_options( tablename = 'fixture' )
41 model = Field( Unicode( 256 ), index = True, required = True )
42 primary_key = Field( INT(), index = True, required = True )
43 fixture_key = Field( Unicode( 256 ), index = True, required = True )
44 fixture_class = Field( Unicode( 256 ), index = True, required = False )
45
46 @classmethod
48 entity_name = unicode( entity.__name__ )
49 return cls.query.filter_by( model = unicode( entity_name ), fixture_key = fixture_key, fixture_class = fixture_class ).first()
50
51 @classmethod
52 - def findFixture( cls, entity, fixture_key, fixture_class = None ):
53 """Find a registered fixture, return None if no fixture is found"""
54 reference = cls.findFixtureReference( entity, fixture_key, fixture_class )
55 if reference:
56 return entity.get( reference.primary_key )
57
58 @classmethod
60 """Find the fixture key and class of an object
61 @param obj: the object we are looking for
62 @return: (fixture_key, fixture_class) if the object is a registered fixture, (None, None) otherwise
63 """
64 entity_name = unicode( obj.__class__.__name__ )
65 fixture = cls.query.filter_by( model = entity_name, primary_key = obj.id ).first()
66 if fixture:
67 return ( fixture.fixture_key, fixture.fixture_class )
68 else:
69 return ( None, None )
70
71 @classmethod
73 """Load all fixture keys of a certain entity in batch
74 :param entity: the model class for which the fixtures should be found
75 :return: a dictionary mapping the primary key of a on object of type entity to its (fixture key, fixture class)
76 """
77 entity_name = unicode( entity.__name__ )
78 return dict((fixture.primary_key, (fixture.fixture_key, fixture.fixture_class)) for fixture in cls.query.filter_by( model = entity_name ).all())
79
80 @classmethod
82 from sqlalchemy.orm.session import Session
83 obj = cls.findFixture( entity, fixture_key, fixture_class )
84 store_fixture = False
85 if not obj:
86 obj = entity()
87 store_fixture = True
88 obj.from_dict( values )
89 Session.object_session( obj ).flush( [obj] )
90 if store_fixture:
91
92
93
94
95 reference = cls.findFixtureReference( entity, fixture_key, fixture_class )
96 if not reference:
97 reference = cls( model = unicode( entity.__name__ ), primary_key = obj.id, fixture_key = fixture_key, fixture_class = fixture_class )
98 else:
99 reference.primary_key = obj.id
100 Session.object_session( reference ).flush( [reference] )
101 return obj
102
104 """Keep track of the version the fixtures have in the current database, the subversion
105 revision number is a good candidate to be used as a fixture version.
106
107 :return: an integer representing the current version, 0 if no version found
108 """
109 using_options( tablename = 'fixture_version' )
110 fixture_version = Field( INT(), index = True, required = True, default=0 )
111 fixture_class = Field( Unicode( 256 ), index = True, required = False, unique=True )
112
113 @classmethod
115 """Get the current version of the fixtures in the database for a certain
116 fixture class.
117
118 :param fixture_class: the fixture class for which to get the version
119 """
120 obj = cls.query.filter_by( fixture_class = fixture_class ).first()
121 if obj:
122 return obj.fixture_version
123 return 0
124
125 @classmethod
127 """Set the current version of the fixtures in the database for a certain
128 fixture class.
129
130 :param fixture_class: the fixture class for which to get the version
131 :param fixture_version: the version number to which to set the fixture version
132 """
133 from sqlalchemy.orm.session import Session
134 obj = cls.query.filter_by( fixture_class = fixture_class ).first()
135 if not obj:
136 obj = FixtureVersion( fixture_class = fixture_class )
137 obj.fixture_version = fixture_version
138 Session.object_session( obj ).flush( [obj] )
139