Changeset 505

Show
Ignore:
Timestamp:
08/04/07 00:28:41 (1 year ago)
Author:
brian
Message:

revision_mapper before_insert default bug fixed

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • pagoda/trunk/Pagoda/pagoda/models/revision_mapper.py

    r498 r505  
    22from sqlalchemy.ext.assignmapper import assign_mapper 
    33from turbogears.database import metadata, session 
    4 from pagoda.models.util import get_column_table, follow_foreign_key 
     4from pagoda.models.util import * 
    55from pagoda.models.content import content_table 
    66from pagoda.models.revision import revision_table 
     
    99from pagoda.models.template import Template 
    1010 
    11 __all__ = ['revisioned_table', 'RevisionableMapperExtension', 'revision_mapper'] 
     11__all__ = ['revisioned_table', 'RevisionableMapperExtension', 
     12           'revision_mapper'] 
    1213 
    1314class 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    """ 
    1519    pass 
    1620 
     
    8993        revisions = select( 
    9094            [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            ), 
    94100            from_obj=[revisioned_table, revision_alias], 
    95101            group_by=group_by, 
     
    190196         
    191197        """ 
    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        ) 
    213210         
    214211        if instance.content_type is None: 
     
    216213         
    217214        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() 
    219219            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) 
    229230         
    230231        instance.node_revision_id = instance.revision_id 
  • pagoda/trunk/Pagoda/pagoda/models/util.py

    r499 r505  
    22from datetime import datetime 
    33 
    4 __all__ = ['now', 'get_column_table', 'follow_foreign_key'] 
     4__all__ = ['now', 'get_column_table', 'follow_foreign_key', 
     5           'get_instance_values'] 
    56 
    67now = datetime.utcnow 
     
    1819            columns.add(column) 
    1920    return column 
     21 
     22def 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 

Log in as guest/pagoda to create tickets