Changeset 286
- Timestamp:
- 01/07/08 18:35:12 (5 years ago)
- Location:
- elixir/trunk
- Files:
-
- 2 modified
-
elixir/ext/versioned.py (modified) (5 diffs)
-
tests/test_versioning.py (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
elixir/trunk/elixir/ext/versioned.py
r267 r286 88 88 instance.timestamp = datetime.now() 89 89 return EXT_PASS 90 91 def after_insert(self, mapper, connection, instance): 92 colvalues = dict([(key, getattr(instance, key)) 93 for key in instance.c.keys()]) 94 instance.__class__.__history_table__.insert().execute(colvalues) 95 return EXT_PASS 96 90 97 91 def before_update(self, mapper, connection, instance): 98 colvalues = dict([(key, getattr(instance, key)) 99 for key in instance.c.keys()]) 100 history = instance.__class__.__history_table__ 101 102 values = history.select(get_history_where(instance), 103 order_by=[desc(history.c.timestamp)], 104 limit=1).execute().fetchone() 105 # In case the data was dumped into the db, the initial version might 106 # be missing so we put this version in as the original. 107 if not values: 108 instance.version = colvalues['version'] = 1 109 instance.timestamp = colvalues['timestamp'] = datetime.now() 110 history.insert().execute(colvalues) 111 return EXT_PASS 112 92 values = instance.table.select(get_entity_where(instance)).execute().fetchone() 93 113 94 # SA might've flagged this for an update even though it didn't change. 114 95 # This occurs when a relation is updated, thus marking this instance … … 122 103 if getattr(instance, key) != values[key]: 123 104 # the instance was really updated, so we create a new version 124 instance.version = colvalues['version'] = instance.version + 1 125 instance.timestamp = colvalues['timestamp'] = datetime.now() 126 history.insert().execute(colvalues) 105 colvalues = dict(values.items()) 106 instance.__class__.__history_table__.insert().execute(colvalues) 107 instance.version = instance.version + 1 108 instance.timestamp = datetime.now() 127 109 break 128 110 … … 190 172 # attach utility methods and properties to the entity 191 173 def get_versions(self): 192 return object_session(self).query(Version) \ 193 .filter(get_history_where(self)) \ 194 .all() 174 v = object_session(self).query(Version) \ 175 .filter(get_history_where(self)) \ 176 .order_by(Version.c.version) \ 177 .all() 178 # history contains all the previous records. 179 # Add the current one to the list to get all the versions 180 v.append(self) 181 return v 195 182 196 183 def get_as_of(self, dt): … … 209 196 210 197 def revert_to(self, to_version): 198 if isinstance(to_version, Version): 199 to_version = to_version.version 200 211 201 hist = entity.__history_table__ 212 202 old_version = hist.select(and_( … … 221 211 hist.delete(and_(get_history_where(self), 222 212 hist.c.version >= to_version)).execute() 213 self.expire() 223 214 for event in after_revert_events: 224 215 event(self) -
elixir/trunk/tests/test_versioning.py
r271 r286 5 5 import time 6 6 7 nextOneValue = 0 8 def nextOne(): 9 global nextOneValue 10 nextOneValue += 2 11 return nextOneValue 7 12 8 13 def setup(): … … 21 26 releasedate = Field(DateTime) 22 27 ignoreme = Field(Integer, default=0) 28 autoupd = Field(Integer, default=nextOne, onupdate=nextOne) 23 29 director = ManyToOne('Director', inverse='movies') 24 30 actors = ManyToMany('Actor', inverse='movies', tablename='movie_casting') 25 31 using_options(tablename='movies') 26 acts_as_versioned(ignore=['ignoreme' ])32 acts_as_versioned(ignore=['ignoreme', 'autoupd']) 27 33 28 34 … … 62 68 assert movie.title == '12 Monkeys' 63 69 assert movie.director.name == 'Terry Gilliam' 70 assert movie.autoupd == 2, movie.autoupd 64 71 movie.description = 'description two' 65 72 session.flush(); session.clear() … … 72 79 movie.description = 'description three' 73 80 session.flush(); session.clear() 74 81 75 82 # Edit the ignored field, this shouldn't change the version 76 83 monkeys = Movie.get_by(title='12 Monkeys') … … 83 90 84 91 movie = Movie.get_by(title='12 Monkeys') 92 assert movie.autoupd == 8, movie.autoupd 85 93 oldest_version = movie.get_as_of(after_create) 86 94 middle_version = movie.get_as_of(after_update_one) … … 92 100 assert oldest_version.description == 'draft description' 93 101 assert oldest_version.ignoreme == 0 102 assert oldest_version.autoupd is not None 103 assert oldest_version.autoupd > 0 94 104 95 105 assert middle_version.version == 2 96 106 assert middle_version.description == 'description two' 107 assert middle_version.autoupd > oldest_version.autoupd 97 108 98 assert latest_version.version == 3 109 assert latest_version.version == 3, 'version=%i' % latest_version.version 99 110 assert latest_version.description == 'description three' 100 111 assert latest_version.ignoreme == 1 112 assert latest_version.autoupd > middle_version.autoupd 101 113 102 114 differences = latest_version.compare_with(oldest_version) … … 106 118 assert movie.versions[0] == oldest_version 107 119 assert movie.versions[1] == middle_version 108 109 movie.revert_to(1) 120 assert [v.version for v in movie.versions] == [1, 2, 3] 121 122 movie.description = 'description four' 123 124 movie.revert_to(2) 110 125 session.flush(); session.clear() 111 126 112 127 movie = Movie.get_by(title='12 Monkeys') 113 assert movie.version == 1 114 assert movie.timestamp == initial_timestamp 115 assert movie.title == '12 Monkeys' 116 assert movie.director.name == 'Terry Gilliam' 128 assert movie.version == 2, "version=%i, should be 2" % movie.version 129 assert movie.description == 'description two', movie.description 130 131 movie.description = "description 3" 132 session.flush(); session.clear(); 133 134 movie = Movie.get_by(title='12 Monkeys') 135 movie.description = "description 4" 136 session.flush(); session.clear(); 137 138 movie = Movie.get_by(title='12 Monkeys') 139 assert movie.version == 4 140 movie.revert_to(movie.versions[-2]) 141 movie.description = "description 5" 142 session.flush(); session.clear(); 143 144 movie = Movie.get_by(title='12 Monkeys') 145 assert movie.version == 4 146 assert movie.versions[-2].description == "description 3"
