diff --git a/addons/portal/__init__.py b/addons/portal/__init__.py index 5aea1cf958f..b0a7eb4ad50 100644 --- a/addons/portal/__init__.py +++ b/addons/portal/__init__.py @@ -2,7 +2,7 @@ ############################################################################## # # OpenERP, Open Source Management Solution -# Copyright (C) 2004-2011 Tiny SPRL (). +# Copyright (C) 2004-2011 OpenERP S.A (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -20,5 +20,4 @@ ############################################################################## import portal -import wizard - +import wizard \ No newline at end of file diff --git a/addons/portal/__openerp__.py b/addons/portal/__openerp__.py index 012403a1a52..318a3e42460 100644 --- a/addons/portal/__openerp__.py +++ b/addons/portal/__openerp__.py @@ -2,7 +2,7 @@ ############################################################################## # # OpenERP, Open Source Management Solution -# Copyright (C) 2004-2011 Tiny SPRL (). +# Copyright (C) 2004-2011 OpenERP S.A (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -22,8 +22,8 @@ { "name" : "Portal", - "version" : "0.2", - "depends" : ["base"], + "version" : "0.3", + "depends" : ["base", "share"], "author" : "OpenERP SA", "category": 'Tools', "description": """ @@ -37,8 +37,11 @@ users, etc). That feature is very handy when used in combination with the module 'share'. """, 'website': 'http://www.openerp.com', - 'demo_xml': [], - 'data': ['portal_view.xml', 'wizard_view.xml'], + 'data': ['security/portal_security.xml', + 'security/ir.model.access.csv', + 'portal_view.xml', + 'wizard_view.xml', + ], 'installable': True, 'certificate' : '', } diff --git a/addons/portal/wizard/__init__.py b/addons/portal/wizard/__init__.py new file mode 100644 index 00000000000..7bfb1d92c34 --- /dev/null +++ b/addons/portal/wizard/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2011 OpenERP S.A (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import share_wizard +import groups_wizard diff --git a/addons/portal/wizard.py b/addons/portal/wizard/groups_wizard.py similarity index 97% rename from addons/portal/wizard.py rename to addons/portal/wizard/groups_wizard.py index 410aa806c67..1c383eb7be4 100644 --- a/addons/portal/wizard.py +++ b/addons/portal/wizard/groups_wizard.py @@ -2,7 +2,7 @@ ############################################################################## # # OpenERP, Open Source Management Solution -# Copyright (C) 2004-2011 Tiny SPRL (). +# Copyright (C) 2004-2011 OpenERP S.A (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/addons/portal/wizard/share_wizard.py b/addons/portal/wizard/share_wizard.py new file mode 100644 index 00000000000..1ed28f4d692 --- /dev/null +++ b/addons/portal/wizard/share_wizard.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2011 OpenERP S.A (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import osv + +UID_ROOT = 1 +SHARED_DOCS_MENU = "Shared Documents" + +class share_wizard_portal(osv.osv_memory): + """Inherited share wizard to automatically create appropriate + menus in the selected portal upon sharing with a portal group.""" + _inherit = "share.wizard" + + def _sharing_root_menu_id(self, cr, uid, portal, context=None): + """Create or retrieve root ID of sharing menu in portal menu + + :param portal: browse_record of portal, constructed with a context WITHOUT language + """ + if not portal.parent_menu_id: + # no specific parent menu, cannot create the sharing menu at all. + return + # look for an existing SHARED_DOCS_MENU + sharing_root_menu_id = None + for child_menu in portal.parent_menu_id.child_id: + if child_menu.name == SHARED_DOCS_MENU: + sharing_root_menu_id = child_menu.id + break + if not sharing_root_menu_id: + # not found, create it + sharing_root_menu_id = self.pool.get('ir.ui.menu').create(cr, UID_ROOT, + {'name': SHARED_DOCS_MENU, + 'parent_id': portal.parent_menu_id.id, + 'sequence': 999, # at the bottom + }) + return sharing_root_menu + + def _create_shared_data_menu(self, cr, uid, wizard_data, portal, context=None): + """Create sharing menus in portal menu according to share wizard options. + + :param wizard_data: browse_record of share.wizard + :param portal: browse_record of portal, constructed with a context WITHOUT language + """ + root_menu_id = self._sharing_root_menu_id(cr, uid, portal, context=context) + if not root_menu_id: + # no specific parent menu, cannot create the sharing menu at all. + return + # Create the shared action and menu + action_def = self._shared_action_def(cr, uid, wizard_data, context=None) + action_id = self.pool.get('ir.actions.act_window').create(cr, UID_ROOT, action_def) + menu_data = {'name': action_def['name'], + 'sequence': 10, + 'action': 'ir.actions.act_window,'+str(action_id), + 'parent_id': root_menu_id, + 'icon': 'STOCK_JUSTIFY_FILL'} + menu_id = self.pool.get('ir.ui.menu').create(cr, UID_ROOT, menu_data) + return menu_id + + def _create_share_users_groups(self, cr, uid, wizard_data, context=None): + """Create sharing menus in portal menu after sharing""" + group_ids = super(share_wizard_portal,self)._create_share_users_groups(cr, uid, wizard_data, context=context) + if wizard_data.user_type == "groups": + # get the list of portals and the related groups + Portals = self.pool.get('res.portal') + all_portals = Portals.browse(cr, UID_ROOT, Portals.search(cr, UID_ROOT, [])) #no context! + all_portal_group_ids = [p.group_id.id for p in all_portals] + for group in wizard_data.group_ids: + if group.id in all_portal_group_ids: + portal = all_portals[all_portal_group_ids.index(group.id)] + self._create_shared_data_menu(cr, uid, wizard_data, portal, context=context) + return group_ids + +share_wizard_portal() \ No newline at end of file diff --git a/addons/share/wizard/share_wizard.py b/addons/share/wizard/share_wizard.py index 27d54e85d3b..a252ab7dca4 100644 --- a/addons/share/wizard/share_wizard.py +++ b/addons/share/wizard/share_wizard.py @@ -46,7 +46,6 @@ def generate_random_pass(): random.shuffle(pass_chars) return ''.join(pass_chars[0:10]) - class share_create(osv.osv_memory): __logger = logging.getLogger('share.wizard') _name = 'share.wizard' @@ -181,7 +180,6 @@ class share_create(osv.osv_memory): menu_obj._cache[key] = True return action_id - def _cleanup_action_context(self, context_str, user_id): """Returns a dict representing the context_str evaluated (literal_eval) as a dict where items that are not useful for shared actions @@ -207,21 +205,24 @@ class share_create(osv.osv_memory): result = context_str return result + def _shared_action_def(self, cr, uid, wizard_data, context=None): + return { + 'name': (_('%s (Shared)') % wizard_data.action_id.name)[:64], + 'domain': wizard_data.domain, + 'context': self._cleanup_action_context(wizard_data.action_id.context, uid), + 'res_model': wizard_data.action_id.res_model, + 'view_mode': wizard_data.action_id.view_mode, + 'view_type': wizard_data.action_id.view_type, + 'search_view_id': wizard_data.action_id.search_view_id.id, + } + def _setup_action_and_shortcut(self, cr, uid, wizard_data, user_ids, new_users, context=None): """Create a shortcut to reach the shared data, as well as the corresponding action, for each user in ``user_ids``, and assign it as their home action.""" user_obj = self.pool.get('res.users') menu_action_id = user_obj._get_menu(cr, uid, context=context) for user_id in user_ids: - values = { - 'name': (_('%s (Shared)') % wizard_data.action_id.name)[:64], - 'domain': wizard_data.domain, - 'context': self._cleanup_action_context(wizard_data.action_id.context, user_id), - 'res_model': wizard_data.action_id.res_model, - 'view_mode': wizard_data.action_id.view_mode, - 'view_type': wizard_data.action_id.view_type, - 'search_view_id': wizard_data.action_id.search_view_id.id, - } + values = self._shared_action_def(cr, uid, wizard_data, context=None) action_id = self._create_shortcut(cr, user_id, values) if new_users: user_obj.write(cr, UID_ROOT, [user_id], {'action_id': action_id})