Changeset 505
- Timestamp:
- 08/04/07 00:28:41 (1 year ago)
- Files:
-
- pagoda/trunk/Pagoda/pagoda/models/revision_mapper.py (modified) (5 diffs)
- pagoda/trunk/Pagoda/pagoda/models/util.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
pagoda/trunk/Pagoda/pagoda/models/revision_mapper.py
r498 r505 2 2 from sqlalchemy.ext.assignmapper import assign_mapper 3 3 from turbogears.database import metadata, session 4 from pagoda.models.util import get_column_table, follow_foreign_key4 from pagoda.models.util import * 5 5 from pagoda.models.content import content_table 6 6 from pagoda.models.revision import revision_table … … 9 9 from pagoda.models.template import Template 10 10 11 __all__ = ['revisioned_table', 'RevisionableMapperExtension', 'revision_mapper'] 11 __all__ = ['revisioned_table', 'RevisionableMapperExtension', 12 'revision_mapper'] 12 13 13 14 class ContentModifiedWarning(UserWarning): 14 """Warn about content updates when a new revision may have been intended.""" 15 """ 16 Warn about content updates when a new revision may have been intended. 17 18 """ 15 19 pass 16 20 … … 89 93 revisions = select( 90 94 [max_revision_id], 91 and_(revisioned_table.c.revision_id <= revision_table.c.revision_id, 92 revisioned_table.c.revision_id == revision_alias.c.revision_id, 93 revision_table.c.content_id == revision_alias.c.content_id), 95 and_( 96 revisioned_table.c.revision_id <= revision_table.c.revision_id, 97 revisioned_table.c.revision_id == revision_alias.c.revision_id, 98 revision_table.c.content_id == revision_alias.c.content_id 99 ), 94 100 from_obj=[revisioned_table, revision_alias], 95 101 group_by=group_by, … … 190 196 191 197 """ 192 content_table = get_column_table(mapper.c.content_id) 193 revision_table = get_column_table(mapper.c.revision_id) 194 node_table = get_column_table(mapper.c.node_revision_id) 195 generic_table = get_column_table(mapper.c.generic_revision_id) 196 localized_table = get_column_table(mapper.c.localized_revision_id) 197 198 insert_tables = [content_table, revision_table, node_table, 199 generic_table, localized_table] 200 201 key_columns = ['revision_id', 'node_revision_id', 202 'generic_revision_id', 'localized_revision_id'] 203 204 # Ensure that no `key_columns` were set on `instance`. 205 for column_name in key_columns: 206 value = getattr(instance, column_name, None) 207 if value is not None: 208 raise ValueError( 209 "%s was %s, but inserting a new revision " 210 "requires no explicit revision_id! Use " 211 "None instead." % (column_name, value) 212 ) 198 # Order of `key_columns` is important due to dependencies! 199 key_columns = [ 200 mapper.c.content_id, 201 mapper.c.revision_id, 202 mapper.c.node_revision_id, 203 mapper.c.generic_revision_id, 204 mapper.c.localized_revision_id 205 ] 206 207 insert_tables = util.OrderedSet( 208 [get_column_table(col) for col in key_columns] 209 ) 213 210 214 211 if instance.content_type is None: … … 216 213 217 214 for insert_table in insert_tables: 218 columns = [c for c in instance.c if insert_table.c.has_key(c.name)] 215 values = get_instance_values(instance, columns=insert_table.c) 216 insert_result = insert_table.insert(values).execute() 217 inserted_params = insert_result.last_inserted_params() 218 param_values = inserted_params.get_original_dict() 219 219 primary_keys = list(insert_table.primary_key) 220 values = dict( 221 [(c.name, getattr(instance, c.name, None)) for c in columns] 222 ) 223 insert_result = insert_table.insert(values).execute() 224 inserted_keys = dict( 225 zip(primary_keys, insert_result.last_inserted_ids()) 226 ) 227 for key, value in inserted_keys.iteritems(): 228 setattr(instance, key.name, value) 220 inserted_ids = insert_result.last_inserted_ids() 221 id_values = dict(zip(primary_keys, inserted_ids)) 222 223 for column_name, value in param_values.iteritems(): 224 if mapper.c.has_key(column_name): 225 setattr(instance, column_name, value) 226 227 for column, value in id_values.iteritems(): 228 if mapper.c.has_key(column.name): 229 setattr(instance, column.name, value) 229 230 230 231 instance.node_revision_id = instance.revision_id pagoda/trunk/Pagoda/pagoda/models/util.py
r499 r505 2 2 from datetime import datetime 3 3 4 __all__ = ['now', 'get_column_table', 'follow_foreign_key'] 4 __all__ = ['now', 'get_column_table', 'follow_foreign_key', 5 'get_instance_values'] 5 6 6 7 now = datetime.utcnow … … 18 19 columns.add(column) 19 20 return column 21 22 def get_instance_values(instance, columns=None): 23 if columns is None: 24 columns = instance.c 25 values = {} 26 for column_name in columns: 27 if not isinstance(column_name, basestring): 28 column_name = column_name.name 29 values[column_name] = getattr(instance, column_name, None) 30 return values
