# Copyright (c) 2004 Guido Wesdorp. All rights reserved.
# Copyright (c) 2005, 2006 Roman Joost
# See also LICENSE.txt
# $Id$
"""Install for Silva Blog
"""
# Zope
from Products.Silva.install import add_fss_directory_view

# sibling
from Products.SilvaBlog import SilvaBlog
from Products.SilvaBlog import SilvaBlogArticle
from Products.SilvaBlog import SilvaBlogEntry
from Products.SilvaBlog import SilvaBlogComment

def install(root):
    # create the core views from filesystem
    add_fss_directory_view(root.service_views,
                           'SilvaBlog', __file__, 'views')
    # also register views
    registerViews(root.service_view_registry)
    
    # security
    root.manage_permission('Add Silva Blogs',
                           ['Author', 'Editor', 'ChiefEditor', 'Manager'])
    root.manage_permission('Add Silva Blog Articles',
                           ['Author', 'Editor', 'ChiefEditor', 'Manager'])
    root.manage_permission('Add Silva Blog Entrys',
                           ['Author', 'Editor', 'ChiefEditor', 'Manager'])
    root.manage_permission('Add Silva Blog Entry Versions',
                           ['Author', 'Editor', 'ChiefEditor', 'Manager'])
    root.manage_permission('Add Silva Blog Comments',
                           ['Anonymous', 'Authenticated'])

    mapping = root.service_metadata.getTypeMapping()
    mapping.editMappings('', [
        {'type': 'Silva Blog',
        'chain': 'silva-content, silva-extra'},
        {'type': 'Silva Blog Article',
        'chain': 'silva-content, silva-extra'},
        {'type': 'Silva Blog Entry',
        'chain': 'silva-content, silva-extra'},
        {'type': 'Silva Blog Entry Version',
        'chain': 'silva-content, silva-extra'},
        {'type': 'Silva Blog Comment',
        'chain': 'silva-content, silva-extra'},
        ])
    
    configureAddables(root)

def uninstall(root):
    unregisterViews(root.service_view_registry)
    root.service_views.manage_delObjects(['SilvaBlog'])
    
def is_installed(root):
    return hasattr(root.service_views, 'SilvaBlog')

def registerViews(reg):
    """Register core views on registry.
    """
    # edit
    reg.register('edit', 'Silva Blog', 
                    ['edit', 'Container', 'SilvaBlog'])
    reg.register('edit', 'Silva Blog Article', 
                    ['edit', 'Container', 'SilvaBlogArticle'])
    reg.register('edit', 'Silva Blog Entry', 
                    ['edit', 'VersionedContent', 'SilvaBlogEntry'])
    reg.register('edit', 'Silva Blog Comment',
                    ['edit', 'Content', 'SilvaBlogComment'])

    # public
    reg.register('public', 'Silva Blog Comment',
                    ['public', 'SilvaBlogComment'])
    
    # add
    reg.register('add', 'Silva Blog', 
                    ['add', 'SilvaBlog'])
    reg.register('add', 'Silva Blog Article', 
                    ['add', 'SilvaBlogArticle'])
    reg.register('add', 'Silva Blog Comment',
                    ['add', 'SilvaBlogComment'])
    # preview
    reg.register('preview', 'Silva Blog Article',
                    ['preview', 'SilvaBlogArticle'])

    # rss
    reg.register('rss', 'Silva Blog Article',
                    ['rss', 'SilvaBlogArticle'])
    
def unregisterViews(reg):
    types = ['Silva Blog',
             'Silva Blog Entry',
             'Silva Blog Article',
             'Silva Blog Comment']
    for meta_type in types:
        reg.unregister('edit', meta_type)
        reg.unregister('public', meta_type)
        reg.unregister('add', meta_type)

def configureAddables(root):
    """Make sure the articles aren't addable in the root"""
    current_addables = root.get_silva_addables_allowed_in_publication()
    new_addables = []
    for a in current_addables:
        if a not in ['Silva Blog Article', 'Silva Blog Comment']:
            new_addables.append(a)
    
    if 'Silva Blog' not in current_addables:
        new_addables.append('Silva Blog')
        
    root.set_silva_addables_allowed_in_publication(new_addables)


