Changeset 551
- Timestamp:
- 09/12/07 20:56:29 (1 year ago)
- Files:
-
- pagoda/trunk/Pagoda/pagoda/controllers/admin.py (modified) (3 diffs)
- pagoda/trunk/Pagoda/pagoda/models/node.py (modified) (3 diffs)
- pagoda/trunk/Pagoda/pagoda/models/revision.py (modified) (3 diffs)
- pagoda/trunk/Pagoda/pagoda/models/revision_mapper.py (modified) (2 diffs)
- pagoda/trunk/Pagoda/pagoda/models/util.py (modified) (1 diff)
- pagoda/trunk/Pagoda/pagoda/plugins/page/models.py (modified) (1 diff)
- pagoda/trunk/Pagoda/pagoda/templates/admin/live.html (modified) (1 diff)
- pagoda/trunk/TestProject/testproject/model.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
pagoda/trunk/Pagoda/pagoda/controllers/admin.py
r541 r551 93 93 return continue_with_controller(content_controller, *args, **kwargs) 94 94 95 class PublicationScheduleController(Controller , identity.SecureResource):96 require = identity.has_permission('pagoda_admin')95 class PublicationScheduleController(Controller): 96 # require = identity.has_permission('pagoda_admin') 97 97 98 98 @expose(template="genshi:pagoda.templates.admin.schedule", format="html") … … 141 141 @expose(allow_json=True) 142 142 @validate(validators=validators.PublishPendingSchema()) 143 @identity.require(identity.has_permission('pagoda_publish'))143 # @identity.require(identity.has_permission('pagoda_publish')) 144 144 def pending(self, **kwargs): 145 145 """Approve or dismiss pending content. … … 180 180 @expose(allow_json=True) 181 181 @validate(validators=validators.PublishScheduledSchema()) 182 @identity.require(identity.has_permission('pagoda_publish'))182 # @identity.require(identity.has_permission('pagoda_publish')) 183 183 def scheduled(self, **kwargs): 184 184 """Release, expire, or cancel scheduled content. pagoda/trunk/Pagoda/pagoda/models/node.py
r542 r551 3 3 from turbogears.database import metadata, session 4 4 from pagoda.models import Revision, Content, Template 5 from pagoda.models.revision_mapper import * 5 6 from pagoda.models.util import follow_foreign_key 6 7 from pagoda import workflow 7 8 8 __all__ = ['node_table', ' Node']9 __all__ = ['node_table', 'node_generic_table', 'node_localized_table', 'Node'] 9 10 10 node_ table = Table('node', metadata,11 node_generic_table = Table('node_generic', metadata, 11 12 Column('revision_id', None, primary_key=True), 12 13 Column('content_id', None, nullable=False), 13 14 Column('url', String(255), nullable=True), 14 Column('parent_id', None, ForeignKey('node.content_id'), nullable=True), 15 Column('parent_id', None, ForeignKey('node_generic.content_id'), 16 nullable=True 17 ), 15 18 Column('is_deleted', Boolean, default=False, nullable=False), 16 19 Column('template_id', None, ForeignKey(Template.c.template_id), 17 20 nullable=True 18 21 ), 22 Column('nav_show', Boolean, default=True, nullable=False), 19 23 ForeignKeyConstraint( 20 24 ['revision_id', 'content_id'], … … 22 26 ) 23 27 ) 28 29 node_localized_table = Table('node_localized', metadata, 30 Column('revision_id', None, ForeignKey(Revision.c.revision_id), 31 primary_key=True 32 ), 33 Column('content_locale', String(8), nullable=False), 34 Column('node_title', Unicode(255), nullable=False), 35 Column('nav_title', Integer, nullable=False) 36 ) 37 38 node_selectable = RevisionSelectable() 39 node_selectable.add_table( 40 node_generic_table, 'node_generic_revision_id' 41 ) 42 node_selectable.add_table( 43 node_localized_table, 'node_localized_revision_id', True 44 ) 45 46 node_table = node_selectable.get_selectable('node') 24 47 25 48 class Node(Revision): … … 54 77 assign_mapper(session.context, Node, node_table, 55 78 inherits=Revision.mapper, 79 extension=RevisionMapperExtension(), 80 concrete=True, 56 81 properties={ 57 'template': relation(Template )82 'template': relation(Template, lazy=True) 58 83 } 59 84 ) pagoda/trunk/Pagoda/pagoda/models/revision.py
r545 r551 76 76 return cls.query().filter_by( 77 77 cls.c.revision_release_time != None, 78 cls.c.revision_release_time >= now ,78 cls.c.revision_release_time >= now(), 79 79 revision_status=workflow.APPROVED 80 80 ).order_by([ … … 86 86 return cls.query().filter_by( 87 87 cls.c.revision_expire_time != None, 88 cls.c.revision_expire_time >= now ,88 cls.c.revision_expire_time >= now(), 89 89 revision_status=workflow.APPROVED 90 90 ).order_by([ … … 135 135 update_tables.add(update_table) 136 136 137 node_table = get_column_table(cls.c.node_revision_id) 138 generic_table = get_column_table(cls.c.generic_revision_id) 139 localized_table = get_column_table(cls.c.localized_revision_id) 137 values = get_instance_values(self) 140 138 141 values = get_instance_values(self) 142 if node_table in update_tables: 143 values['node_revision_id'] = None 144 if generic_table in update_tables: 145 values['generic_revision_id'] = None 146 if localized_table in update_tables: 147 values['localized_revision_id'] = None 139 # Determine which revisioned tables should get records inserted, 140 # resulting in new revision IDs. By setting a key column to 141 # None, `RevisionMapperExtension` knows to INSERT into the 142 # corresponding table. 143 revision_id = get_original_column(cls.c.revision_id) 144 revision_columns = filter_foreign_columns(self.c, revision_id) 145 for column in revision_columns: 146 column_table = get_column_table(column) 147 if column_table in update_tables: 148 values[column.name] = None 148 149 149 reset_columns = ['revision_id', 'revision_time', 'revision_status', 150 'revision_comment'] 151 150 # Specify columns that should not be copied from `self` to the new 151 # revision. They will be populated with default values unless 152 # specified in the `kwargs` for this method. 153 reset_columns = [ 154 'revision_id', 155 'revision_time', 156 'revision_status', 157 'revision_comment' 158 ] 152 159 for column_name in reset_columns: 153 160 values[column_name] = None pagoda/trunk/Pagoda/pagoda/models/revision_mapper.py
r549 r551 5 5 from pagoda.models.content import content_table 6 6 from pagoda.models.revision import revision_table 7 from pagoda.models.node import node_table7 #from pagoda.models.node import node_table 8 8 from pagoda.models.identity import User 9 9 from pagoda.models.template import Template 10 10 11 __all__ = ['RevisionMapperBuilder', 'RevisionMapperExtension'] 12 13 class RevisionMapperBuilder(object): 14 def __init__(self, class_, revision_table=revision_table, 15 content_table=content_table, select_alias=None): 16 self.class_ = class_ 17 self.select_alias = select_alias or class_.pagoda_content_type 11 __all__ = ['RevisionSelectable', 'RevisionMapperExtension'] 12 13 LOCALE_COLUMN = 'content_locale' 14 15 class ContentModifiedWarning(UserWarning): 16 """ 17 Warn about content updates when a new revision may have been intended. 18 19 """ 20 pass 21 22 class KeyModifiedError(ValueError): 23 """Error indicating that a key column was changed in an update.""" 24 pass 25 26 class RevisionSelectable(object): 27 def __init__(self, revision_table=revision_table, 28 content_table=content_table): 18 29 self.revision_table = revision_table 19 30 self.content_table = content_table … … 67 78 return revisions 68 79 69 def add_table(self, table, id_label=None, local e_column=None,80 def add_table(self, table, id_label=None, localized=False, 70 81 join_alias=None): 71 82 if id_label is None: 72 83 id_label = '%s_revision_id' % table.name 73 84 74 75 76 if isinstance(locale_column, basestring):77 locale_column = table.c[locale_column]78 85 if localized: 86 locale_column = table.c[LOCALE_COLUMN] 87 else: 88 locale_column = None 89 79 90 subselect = self.revision_subselect(table, locale_column, join_alias) 80 91 pagoda/trunk/Pagoda/pagoda/models/util.py
r542 r551 32 32 values[column_name] = getattr(instance, column_name, None) 33 33 return values 34 35 def get_foreign_tables(columns, foreign_key): 36 """ 37 Find the columns in `columns` that are a foreign key referencing 38 `foreign_key`, and return a `Set` of the `Table` objects in which they 39 are defined. 40 41 """ 42 foreign_tables = util.Set() 43 for column in filter_foreign_columns(columns, foreign_key): 44 column_table = get_column_table(column) 45 foreign_tables.add(column_table) 46 return foreign_tables 47 48 def filter_columns(columns, predicate): 49 """ 50 Return a `Set` of columns from `columns` for which `predicate(column)` 51 is True. 52 53 """ 54 columns = util.Set() 55 for column in columns: 56 if predicate(column): 57 columns.add(column) 58 return columns 59 60 def filter_foreign_columns(columns, foreign_key): 61 """ 62 Return a `Set` of columns from `columns` that are foreign keys 63 referencing `foreign_key`. 64 65 """ 66 return filter_columns( 67 columns, 68 lambda col: col.foreign_key and follow_foreign_key(col) is foreign_key 69 ) 70 pagoda/trunk/Pagoda/pagoda/plugins/page/models.py
r548 r551 2 2 from sqlalchemy.ext.assignmapper import assign_mapper 3 3 from turbogears.database import metadata, session 4 from pagoda.models import node_table, Content, Revision, Node 4 from pagoda.models.node import node_generic_table, node_localized_table 5 from pagoda.models import Content, Revision, Node 5 6 from pagoda.models.revision_mapper import * 6 7 7 __all__ = ['page_generic_table', 'page_ localized_table', 'Page']8 __all__ = ['page_generic_table', 'page_table', 'Page'] 8 9 9 10 page_generic_table = Table('page_generic', metadata, 10 11 Column('revision_id', None, ForeignKey(Revision.c.revision_id), 11 12 primary_key=True 12 ), 13 Column('nav_show', Boolean, nullable=False, default=True), 13 ) 14 14 ) 15 15 16 page_localized_table = Table('page_localized', metadata, 17 Column('revision_id', None, ForeignKey(Revision.c.revision_id), 18 primary_key=True 19 ), 20 Column('content_locale', String(8), nullable=False), 21 Column('title', Unicode(200), nullable=True), 22 ) 16 page_selectable = RevisionSelectable() 17 page_selectable.add_table(node_generic_table, 'node_generic_revision_id') 18 page_selectable.add_table(node_localized_table, 'node_localized_revision_id') 19 page_selectable.add_table(page_generic_table, 'page_generic_revision_id') 20 page_table = page_selectable.get_selectable('page') 23 21 24 22 class Page(Node): 25 23 pagoda_content_type = 'page' 26 24 27 revision_builder = RevisionMapperBuilder(Page) 28 revision_builder.add_table(node_table) 29 revision_builder.add_table(page_generic_table, 'generic_revision_id') 30 revision_builder.add_table( 31 page_localized_table, 'localized_revision_id', 'content_locale' 25 assign_mapper(session.context, Page, page_table, 26 select_table=page_table, 27 inherits=Node.mapper, 28 concrete=True, 29 extension=RevisionMapperExtension(), 30 polymorphic_on=page_table.c.content_type, 31 polymorphic_identity='page' 32 32 ) 33 mapper_options = revision_builder.get_options()34 35 assign_mapper(session.context, Page, **mapper_options)pagoda/trunk/Pagoda/pagoda/templates/admin/live.html
r528 r551 19 19 20 20 <div id="body"> 21 <iframe id="iframe" name="iframe" src="${tg.url('/content/ live/%s/%s/' % (content.content_type, content.revision_id))}"></iframe>21 <iframe id="iframe" name="iframe" src="${tg.url('/content/%s/%s/' % (content.content_type, content.revision_id))}"></iframe> 22 22 </div> 23 23 pagoda/trunk/TestProject/testproject/model.py
r542 r551 58 58 revision_author_id=brian.user_id, content_type='page', 59 59 revision_status=workflow.PENDING, 60 revision_release_time=datetime(2007, 8, 20)60 revision_release_time=datetime(2007, 9, 20) 61 61 ) 62 62
