@@ -1099,6 +1099,7 @@
|
||||
<page string="Python Code" attrs="{'invisible':[('state','!=','python')]}">
|
||||
<separator colspan="4" string="Python code"/>
|
||||
<field name="code" colspan="4" nolabel="1" />
|
||||
<button string="Create Action" name="%(wizard_server_action_create)d" type="action"/>
|
||||
</page>
|
||||
|
||||
<page string="Trigger" attrs="{'invisible':[('state','!=','trigger')]}">
|
||||
|
||||
@@ -251,7 +251,8 @@ class act_wizard(osv.osv):
|
||||
'type': fields.char('Action type', size=32, required=True),
|
||||
'wiz_name': fields.char('Wizard name', size=64, required=True),
|
||||
'multi': fields.boolean('Action on multiple doc.', help="If set to true, the wizard will not be displayed on the right toolbar of a form views."),
|
||||
'groups_id': fields.many2many('res.groups', 'res_groups_wizard_rel', 'uid', 'gid', 'Groups')
|
||||
'groups_id': fields.many2many('res.groups', 'res_groups_wizard_rel', 'uid', 'gid', 'Groups'),
|
||||
'model': fields.char('Object', size=64),
|
||||
}
|
||||
_defaults = {
|
||||
'type': lambda *a: 'ir.actions.wizard',
|
||||
@@ -708,3 +709,5 @@ class ir_actions_configuration_wizard(osv.osv_memory):
|
||||
return {'type':'ir.actions.act_window_close' }
|
||||
ir_actions_configuration_wizard()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
from osv import fields,osv
|
||||
import ir, re
|
||||
import netsvc
|
||||
from osv.orm import except_orm
|
||||
from osv.orm import except_orm, browse_record
|
||||
|
||||
import time
|
||||
import tools
|
||||
@@ -282,13 +282,19 @@ class ir_model_access(osv.osv):
|
||||
cr.execute("select 1 from res_groups_users_rel where uid=%i and gid=%i", (uid, group_id,))
|
||||
return bool(cr.fetchone())
|
||||
|
||||
def check(self, cr, uid, model_name, mode='read', raise_exception=True):
|
||||
def check(self, cr, uid, model, mode='read', raise_exception=True):
|
||||
# Users root have all access (Todo: exclude xml-rpc requests)
|
||||
if uid==1:
|
||||
return True
|
||||
|
||||
assert mode in ['read','write','create','unlink'], 'Invalid access mode'
|
||||
|
||||
if isinstance(model, browse_record):
|
||||
assert model._table_name == 'ir.model', 'Invalid model object'
|
||||
model_name = model.name
|
||||
else:
|
||||
model_name = model
|
||||
|
||||
# We check if a specific rule exists
|
||||
cr.execute('SELECT MAX(CASE WHEN perm_' + mode + ' THEN 1 ELSE 0 END) '
|
||||
' FROM ir_model_access a '
|
||||
|
||||
@@ -28,6 +28,6 @@
|
||||
#
|
||||
##############################################################################
|
||||
import wizard_menu
|
||||
|
||||
import create_action
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Copyright (c) 2004-2008 TINY SPRL. (http://tiny.be) All Rights Reserved.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# WARNING: This program as such is intended to be used by professional
|
||||
# programmers who take the whole responsability of assessing all potential
|
||||
# consequences resulting from its eventual inadequacies and bugs
|
||||
# End users who are looking for a ready-to-use solution with commercial
|
||||
# garantees and support are strongly adviced to contract a Free Software
|
||||
# Service Company
|
||||
#
|
||||
# This program is Free Software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# 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 General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import wizard
|
||||
import pooler
|
||||
import time
|
||||
|
||||
action_type = '''<?xml version="1.0"?>
|
||||
<form string="Select Action Type">
|
||||
<field name="type"/>
|
||||
</form>'''
|
||||
|
||||
action_type_fields = {
|
||||
'type': {'string':"Start date",'type':'selection','required':True ,'selection':[('ir.actions.report.xml','Open Report')]},
|
||||
}
|
||||
|
||||
report_action = '''<?xml version="1.0"?>
|
||||
<form string="Select Report">
|
||||
<field name="report" colspan="4"/>
|
||||
</form>'''
|
||||
|
||||
report_action_fields = {
|
||||
'report': {'string':"Select Report",'type':'many2one','relation':'ir.actions.report.xml', 'required':True},
|
||||
}
|
||||
|
||||
class create_action(wizard.interface):
|
||||
|
||||
def _create_report_action(self, cr, uid, data, context={}):
|
||||
pool = pooler.get_pool(cr.dbname)
|
||||
|
||||
reports = pool.get('ir.actions.report.xml')
|
||||
form = data['form']
|
||||
|
||||
rpt = reports.browse(cr, uid, form['report'])
|
||||
|
||||
action = """
|
||||
action = {
|
||||
'type': 'ir.actions.report.xml',
|
||||
'model':'%s',
|
||||
'report_name': '%s',
|
||||
'ids': context['active_ids'],
|
||||
}""" % (rpt.model, rpt.report_name)
|
||||
|
||||
obj = pool.get('ir.actions.server')
|
||||
obj.write(cr, uid, data['ids'], {'code':action})
|
||||
|
||||
return {}
|
||||
|
||||
states = {
|
||||
'init': {
|
||||
'actions': [],
|
||||
'result': {'type':'form', 'arch':action_type,'fields':action_type_fields, 'state':[('step_1','Next'),('end','Close')]}
|
||||
},
|
||||
'step_1': {
|
||||
'actions': [],
|
||||
'result': {'type':'form', 'arch':report_action,'fields':report_action_fields, 'state':[('create','Create'),('end','Close')]}
|
||||
},
|
||||
'create': {
|
||||
'actions': [_create_report_action],
|
||||
'result': {'type':'state', 'state':'end'}
|
||||
},
|
||||
}
|
||||
create_action('server.action.create')
|
||||
|
||||
|
||||
@@ -28,6 +28,12 @@
|
||||
</field>
|
||||
</record>
|
||||
<act_window context="{'model_id': active_id}" id="act_menu_create" name="Create Menu" res_model="wizard.ir.model.menu.create" target="new" view_mode="form"/>
|
||||
|
||||
<wizard
|
||||
id="wizard_server_action_create"
|
||||
model="ir.actions.server"
|
||||
name="server.action.create"
|
||||
string="Create Action"
|
||||
menu="False"
|
||||
/>
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
<!--<data noupdate="0">-->
|
||||
<data>
|
||||
<data noupdate="0">
|
||||
|
||||
<!--
|
||||
Users Groups
|
||||
@@ -37,9 +36,20 @@
|
||||
<field name="menu_id" ref="action_menu_admin"/>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Set access to menu -->
|
||||
<record model="ir.ui.menu" id="base.menu_administration">
|
||||
<field name="groups_id" eval="[(6,0, [ref('group_system'), ref('group_erp_manager')])]"/>
|
||||
</record>
|
||||
|
||||
<record id="base.menu_security" model="ir.ui.menu">
|
||||
<field eval="[(6,0,[ref('base.group_erp_manager')])]" name="groups_id"/>
|
||||
</record>
|
||||
|
||||
<record id="base.menu_users" model="ir.ui.menu">
|
||||
<field eval="[(6,0,[ref('base.group_erp_manager')])]" name="groups_id"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
|
||||
@@ -1,97 +1,107 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_ir_attachment_group_user,"ir_attachment group_system_user",model_ir_attachment,group_user,1,1,1,1
|
||||
access_ir_attachment_group_system,"ir_attachment group_system",model_ir_attachment,,1,0,0,0
|
||||
access_ir_cron_group_cron,"ir_cron group_cron",model_ir_cron,group_system,1,1,1,1
|
||||
access_ir_default_group_system,"ir_default group_system",model_ir_default,,1,1,1,1
|
||||
access_ir_exports_group_system,"ir_exports group_system",model_ir_exports,,1,1,1,1
|
||||
access_ir_exports_line_group_system,"ir_exports_line group_system",model_ir_exports_line,,1,1,1,1
|
||||
access_ir_model_group_system,"ir_model group_system",model_ir_model,,1,0,0,0
|
||||
access_ir_model_access_group_system,"ir_model_access group_system",model_ir_model_access,,1,0,0,0
|
||||
access_ir_model_grid_group_system,ir_model_access_grid_group_system,model_ir_model_grid,,1,0,0,0
|
||||
access_ir_model_config_group_system,"ir_model_config group_system",model_ir_model_config,,1,0,0,0
|
||||
access_ir_model_data_group_user,"ir_model_data group_user",model_ir_model_data,,1,0,0,0
|
||||
access_ir_model_fields_group_user,"ir_model_fields group_user",model_ir_model_fields,,1,0,0,0
|
||||
access_ir_module_category_group_user,"ir_module_category group_user",model_ir_module_category,group_system,1,0,0,0
|
||||
access_ir_module_module_group_user,"ir_module_module group_user",model_ir_module_module,group_system,1,1,1,1
|
||||
access_ir_module_module_dependency_group_system,"ir_module_module_dependency group_system",model_ir_module_module_dependency,group_system,1,1,1,1
|
||||
access_ir_module_repository_group_system,"ir_module_repository group_system",model_ir_module_repository,group_system,1,1,1,1
|
||||
access_ir_property_group_user,"ir_property group_user",model_ir_property,,1,0,0,0
|
||||
access_ir_report_custom_group_system,"ir_report_custom group_system",model_ir_report_custom,,1,0,0,0
|
||||
access_ir_report_custom_fields_group_system,"ir_report_custom_fields group_system",model_ir_report_custom_fields,,1,0,0,0
|
||||
access_ir_rule_group_user,"ir_rule group_user",model_ir_rule,,1,0,0,0
|
||||
access_ir_rule_group_group_user,"ir_rule_group group_user",model_ir_rule_group,,1,0,0,0
|
||||
access_ir_sequence_group_user,"ir_sequence group_user",model_ir_sequence,,1,1,1,1
|
||||
access_ir_sequence_type_group_user,"ir_sequence_type group_user",model_ir_sequence_type,,1,0,0,0
|
||||
access_ir_translation_group_system,"ir_translation group_system",model_ir_translation,,1,1,1,1
|
||||
access_ir_ui_menu_group_user,"ir_ui_menu group_user",model_ir_ui_menu,,1,0,0,0
|
||||
access_ir_ui_view_group_user,"ir_ui_view group_user",model_ir_ui_view,,1,0,0,0
|
||||
access_ir_ui_view_custom_group_user,ir_ui_view_custom_group_user,model_ir_ui_view_custom,,1,0,0,0
|
||||
access_ir_ui_view_sc_group_user,"ir_ui_view_sc group_user",model_ir_ui_view_sc,,1,1,1,1
|
||||
access_ir_values_group_erp_manager,"ir_values group_erp_manager",model_ir_values,,1,1,1,1
|
||||
access_wizard_ir_model_menu_create_group_system,"wizard_ir_model_menu_create group_system",model_wizard_ir_model_menu_create,group_system,1,1,1,1
|
||||
access_wizard_ir_model_menu_create_line_group_system,"wizard_ir_model_menu_create_line group_system",model_wizard_ir_model_menu_create_line,group_system,1,1,1,1
|
||||
access_wizard_module_lang_export_group_system,"wizard_module_lang_export group_system",model_wizard_module_lang_export,group_system,1,1,1,1
|
||||
access_res_company_group_erp_manager,"res_company group_erp_manager",model_res_company,group_erp_manager,1,1,1,1
|
||||
access_res_company_group_user,"res_company group_user",model_res_company,,1,0,0,0
|
||||
access_res_country_group_all,"res_country group_user_all",model_res_country,,1,0,0,0
|
||||
access_res_country_state_group_all,"res_country_state group_user_all",model_res_country_state,,1,0,0,0
|
||||
access_res_country_group_user,"res_country group_user",model_res_country,group_partner_manager,1,1,1,1
|
||||
access_res_country_state_group_user,"res_country_state group_user",model_res_country_state,group_partner_manager,1,1,1,1
|
||||
access_res_currency_group_all,"res_currency group_all",model_res_currency,,1,0,0,0
|
||||
access_res_currency_rate_group_all,"res_currency_rate group_all",model_res_currency_rate,,1,0,0,0
|
||||
access_res_currency_group_user,"res_currency group_user",model_res_currency,group_user,1,1,1,1
|
||||
access_res_currency_rate_group_user,"res_currency_rate group_user",model_res_currency_rate,group_user,1,1,1,1
|
||||
access_res_groups_group_erp_manager,"res_groups group_erp_manager",model_res_groups,group_erp_manager,1,1,1,1
|
||||
access_res_groups_group_user,"res_groups group_user",model_res_groups,,1,0,0,0
|
||||
access_res_lang_group_all,"res_lang group_all",model_res_lang,,1,0,0,0
|
||||
access_res_lang_group_user,"res_lang group_user",model_res_lang,group_system,1,1,1,1
|
||||
access_res_partner_group_partner_manager,"res_partner group_partner_manager",model_res_partner,group_partner_manager,1,1,1,1
|
||||
access_res_partner_group_user,"res_partner group_user",model_res_partner,,1,0,0,0
|
||||
access_res_partner_address_group_partner_manager,"res_partner_address group_partner_manager",model_res_partner_address,group_partner_manager,1,1,1,1
|
||||
access_res_partner_address_group_user,"res_partner_address group_user",model_res_partner_address,,1,0,0,0
|
||||
access_res_partner_bank_group_user,"res_partner_bank group_user",model_res_partner_bank,,1,0,0,0
|
||||
access_res_partner_bank_group_partner_manager,"res_partner_bank group_partner_manager",model_res_partner_bank,group_partner_manager,1,1,1,1
|
||||
access_res_partner_bank_type_group_partner_manager,"res_partner_bank_type group_partner_manager",model_res_partner_bank_type,group_partner_manager,1,1,1,1
|
||||
access_res_partner_bank_type_group_user,"res_partner_bank_type group_user",model_res_partner_bank_type,,1,0,0,0
|
||||
access_res_partner_bank_type_field_group_partner_manager,"res_partner_bank_type_field group_partner_manager",model_res_partner_bank_type_field,group_partner_manager,1,1,1,1
|
||||
access_res_partner_bank_type_field_group_user,"res_partner_bank_type_field group_user",model_res_partner_bank_type_field,,1,0,0,0
|
||||
access_res_partner_canal_group_user,"res_partner_canal group_user",model_res_partner_canal,,1,0,0,0
|
||||
access_res_partner_canal_group_partner_manager,"res_partner_canal group_partner_manager",model_res_partner_canal,group_partner_manager,1,1,1,1
|
||||
access_res_partner_category_group_user,"res_partner_category group_user",model_res_partner_category,group_partner_manager,1,1,1,0
|
||||
access_res_partner_category_group_partner_manager,"res_partner_category group_partner_manager",model_res_partner_category,,1,0,0,1
|
||||
access_res_partner_event_group_user,"res_partner_event group_user",model_res_partner_event,,1,1,1,1
|
||||
access_res_partner_event_type_group_partner_manager,"res_partner_event_type group_partner_manager",model_res_partner_event_type,group_partner_manager,1,1,1,1
|
||||
access_res_partner_event_type_group_user,"res_partner_event_type group_user",model_res_partner_event_type,,1,0,0,0
|
||||
access_res_partner_function_group_user,"res_partner_function group_user",model_res_partner_function,group_partner_manager,1,1,1,1
|
||||
access_res_partner_function_group_partner_manager,"res_partner_function group_partner_manager",model_res_partner_function,,1,0,0,0
|
||||
access_res_partner_som_group_user,"res_partner_som group_user",model_res_partner_som,group_partner_manager,1,1,1,1
|
||||
access_res_partner_som_group_partner_manager,"res_partner_som group_partner_manager",model_res_partner_som,,1,0,0,0
|
||||
access_res_partner_title_group_user,"res_partner_title group_user",model_res_partner_title,group_partner_manager,1,1,1,1
|
||||
access_res_partner_title_group_partner_manager,"res_partner_title group_partner_manager",model_res_partner_title,,1,0,0,0
|
||||
access_res_request_group_user,"res_request group_user",model_res_request,,1,1,1,1
|
||||
access_res_request_history_group_user,"res_request_history group_user",model_res_request_history,,1,1,1,1
|
||||
access_res_request_link_group_system,"res_request_link group_system",model_res_request_link,group_system,1,1,1,1
|
||||
access_res_request_link_group_user,"res_request_link group_user",model_res_request_link,,1,0,0,0
|
||||
access_res_users_group_user,"res_users group_user",model_res_users,,1,0,0,0
|
||||
access_res_users_group_erp_manager,"res_users group_erp_manager",model_res_users,group_erp_manager,1,1,1,1
|
||||
access_ir_actions_employee,ir_actions_employee,model_ir_actions_actions,group_user,1,0,0,0
|
||||
access_ir_actions_act_window_employee,ir_actions_act_window_employee,model_ir_actions_act_window,group_user,1,0,0,0
|
||||
access_ir_actions_act_window_close_group_system,ir_actions_act_window_close_system,model_ir_actions_act_window_close,group_system,1,0,0,0
|
||||
access_ir_actions_report_xml_group_system,ir_actions_report_xml_system,model_ir_actions_report_xml,group_system,1,0,0,0
|
||||
access_ir_actions_wizard_group_system,ir_actions_wizard,model_ir_actions_wizard,group_system,1,0,0,0
|
||||
access_workflow_group_system,workflow_group_system,model_workflow,group_system,1,0,0,0
|
||||
access_workflow_activity_group_system,workflow_activity_group_system,model_workflow_activity,group_system,1,0,0,0
|
||||
access_workflow_instance_group_system,workflow_instance_group_system,model_workflow_instance,group_system,1,0,0,0
|
||||
access_workflow_transition_group_system,workflow_transition_group_system,model_workflow_transition,group_system,1,0,0,0
|
||||
access_workflow_triggers_group_system,workflow_triggers_group_system,model_workflow_triggers,group_system,1,0,0,0
|
||||
access_workflow_workitem_group_system,workflow_workitem_group_system,model_workflow_workitem,group_system,1,0,0,0
|
||||
access_actions_report_custom_group_system,ir_actions_report_custom_group_system,model_ir_actions_report_custom,group_system,1,0,0,0
|
||||
access_ir_actions_act_window_view_group_employee,ir_actions_act_window_view_group_employee,model_ir_actions_act_window_view,group_user,1,0,0,0
|
||||
access_ir_actions_url_group_user,ir_actions_url_group_user,model_ir_actions_url,group_user,1,0,0,0
|
||||
access_ir_server_object_lines_group_user,ir_server_object_lines_group_user,model_ir_server_object_lines,group_user,1,0,0,0
|
||||
access_ir_actions_server_group_user,ir_actions_server_group_user,model_ir_actions_server,group_user,1,0,0,0
|
||||
access_module_update_translations_group_user,wizard_update_translations_group_user,model_wizard_module_update_translations,group_user,1,1,1,1
|
||||
access_res_bank_group_system,res_bank_group_system,model_res_bank,group_system,1,1,1,1
|
||||
access_res_payterm_group_system,res_payterm_group_system,model_res_payterm,group_system,1,1,1,1
|
||||
access_res_roles_group_erpmanager,res_roles_group_erp_manager,model_res_roles,group_erp_manager,1,1,1,1
|
||||
access_res_config_view_group_erpmanager,res_config_view_erp_manager,model_res_config_view,group_erp_manager,1,1,1,1
|
||||
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
||||
"access_ir_attachment_group_user","ir_attachment group_system_user","model_ir_attachment","group_user",1,1,1,1
|
||||
"access_ir_attachment_group_system","ir_attachment group_system","model_ir_attachment",,1,0,0,0
|
||||
"access_ir_cron_group_cron","ir_cron group_cron","model_ir_cron","group_system",1,1,1,1
|
||||
"access_ir_default_group_system","ir_default group_system","model_ir_default",,1,1,1,1
|
||||
"access_ir_exports_group_system","ir_exports group_system","model_ir_exports",,1,1,1,1
|
||||
"access_ir_exports_line_group_system","ir_exports_line group_system","model_ir_exports_line",,1,1,1,1
|
||||
"access_ir_model_group_erp_manager","ir_model group_erp_manager","model_ir_model","group_erp_manager",1,1,1,1
|
||||
"access_ir_model_access_group_erp_manager","ir_model_access_group_erp_manager","model_ir_model_access","group_erp_manager",1,1,1,1
|
||||
"access_ir_model_grid_group_erp_manager","ir_model_access_grid_group_erp_manager","model_ir_model_grid","group_erp_manager",1,1,1,1
|
||||
"access_ir_model_config_group_erp_manager","ir_model_config group_erp_manager","model_ir_model_config","group_erp_manager",1,1,1,1
|
||||
"access_ir_model_data_group_erp_manager","ir_model_data group_erp_manager","model_ir_model_data","group_erp_manager",1,1,1,1
|
||||
"access_ir_model_fields_group_erp_manager","ir_model_fields group_erp_manager","model_ir_model_fields","group_erp_manager",1,1,1,1
|
||||
"access_ir_model_all","ir_model_all","model_ir_model",,1,0,0,0
|
||||
"access_ir_model_access_all","ir_model_access_all","model_ir_model_access",,1,0,0,0
|
||||
"access_ir_model_grid_all","ir_model_access_grid_all","model_ir_model_grid",,0,0,0,0
|
||||
"access_ir_model_config_all","ir_model_config_all","model_ir_model_config",,1,0,0,0
|
||||
"access_ir_model_data_all","ir_model_data all","model_ir_model_data",,1,0,0,0
|
||||
"access_ir_model_fields_all","ir_model_fields all","model_ir_model_fields",,1,0,0,0
|
||||
"access_ir_module_category_group_user","ir_module_category group_user","model_ir_module_category","group_system",1,0,0,0
|
||||
"access_ir_module_module_group_user","ir_module_module group_user","model_ir_module_module","group_system",1,1,1,1
|
||||
"access_ir_module_module_dependency_group_system","ir_module_module_dependency group_system","model_ir_module_module_dependency","group_system",1,1,1,1
|
||||
"access_ir_module_repository_group_system","ir_module_repository group_system","model_ir_module_repository","group_system",1,1,1,1
|
||||
"access_ir_property_group_user","ir_property group_user","model_ir_property",,1,0,0,0
|
||||
"access_ir_report_custom_group_system","ir_report_custom group_system","model_ir_report_custom",,1,0,0,0
|
||||
"access_ir_report_custom_fields_group_system","ir_report_custom_fields group_system","model_ir_report_custom_fields",,1,0,0,0
|
||||
"access_ir_rule_group_user","ir_rule group_user","model_ir_rule",,1,0,0,0
|
||||
"access_ir_rule_group_group_user","ir_rule_group group_user","model_ir_rule_group",,1,0,0,0
|
||||
"access_ir_rule_group_erp_manager","ir_rule group_erp_manager","model_ir_rule","group_erp_manager",1,1,1,1
|
||||
"access_ir_rule_group_group_erp_manager","ir_rule_group group_erp_manager","model_ir_rule_group","group_erp_manager",1,1,1,1
|
||||
"access_ir_sequence_group_user","ir_sequence group_user","model_ir_sequence",,1,1,1,1
|
||||
"access_ir_sequence_type_group_user","ir_sequence_type group_user","model_ir_sequence_type",,1,0,0,0
|
||||
"access_ir_translation_group_system","ir_translation group_system","model_ir_translation",,1,1,1,1
|
||||
"access_ir_ui_menu_group_user","ir_ui_menu group_user","model_ir_ui_menu",,1,0,0,0
|
||||
"access_ir_ui_view_group_user","ir_ui_view group_user","model_ir_ui_view",,1,0,0,0
|
||||
"access_ir_ui_view_custom_group_user","ir_ui_view_custom_group_user","model_ir_ui_view_custom",,1,0,0,0
|
||||
"access_ir_ui_view_sc_group_user","ir_ui_view_sc group_user","model_ir_ui_view_sc",,1,1,1,1
|
||||
"access_ir_values_group_erp_manager","ir_values group_erp_manager","model_ir_values",,1,1,1,1
|
||||
"access_wizard_ir_model_menu_create_group_system","wizard_ir_model_menu_create group_system","model_wizard_ir_model_menu_create","group_system",1,1,1,1
|
||||
"access_wizard_ir_model_menu_create_line_group_system","wizard_ir_model_menu_create_line group_system","model_wizard_ir_model_menu_create_line","group_system",1,1,1,1
|
||||
"access_wizard_module_lang_export_group_system","wizard_module_lang_export group_system","model_wizard_module_lang_export","group_system",1,1,1,1
|
||||
"access_res_company_group_erp_manager","res_company group_erp_manager","model_res_company","group_erp_manager",1,1,1,1
|
||||
"access_res_company_group_user","res_company group_user","model_res_company",,1,0,0,0
|
||||
"access_res_country_group_all","res_country group_user_all","model_res_country",,1,0,0,0
|
||||
"access_res_country_state_group_all","res_country_state group_user_all","model_res_country_state",,1,0,0,0
|
||||
"access_res_country_group_user","res_country group_user","model_res_country","group_partner_manager",1,1,1,1
|
||||
"access_res_country_state_group_user","res_country_state group_user","model_res_country_state","group_partner_manager",1,1,1,1
|
||||
"access_res_currency_group_all","res_currency group_all","model_res_currency",,1,0,0,0
|
||||
"access_res_currency_rate_group_all","res_currency_rate group_all","model_res_currency_rate",,1,0,0,0
|
||||
"access_res_currency_group_user","res_currency group_user","model_res_currency","group_user",1,1,1,1
|
||||
"access_res_currency_rate_group_user","res_currency_rate group_user","model_res_currency_rate","group_user",1,1,1,1
|
||||
"access_res_groups_group_erp_manager","res_groups group_erp_manager","model_res_groups","group_erp_manager",1,1,1,1
|
||||
"access_res_groups_group_user","res_groups group_user","model_res_groups",,1,0,0,0
|
||||
"access_res_lang_group_all","res_lang group_all","model_res_lang",,1,0,0,0
|
||||
"access_res_lang_group_user","res_lang group_user","model_res_lang","group_system",1,1,1,1
|
||||
"access_res_partner_group_partner_manager","res_partner group_partner_manager","model_res_partner","group_partner_manager",1,1,1,1
|
||||
"access_res_partner_group_user","res_partner group_user","model_res_partner",,1,0,0,0
|
||||
"access_res_partner_address_group_partner_manager","res_partner_address group_partner_manager","model_res_partner_address","group_partner_manager",1,1,1,1
|
||||
"access_res_partner_address_group_user","res_partner_address group_user","model_res_partner_address",,1,0,0,0
|
||||
"access_res_partner_bank_group_user","res_partner_bank group_user","model_res_partner_bank",,1,0,0,0
|
||||
"access_res_partner_bank_group_partner_manager","res_partner_bank group_partner_manager","model_res_partner_bank","group_partner_manager",1,1,1,1
|
||||
"access_res_partner_bank_type_group_partner_manager","res_partner_bank_type group_partner_manager","model_res_partner_bank_type","group_partner_manager",1,1,1,1
|
||||
"access_res_partner_bank_type_group_user","res_partner_bank_type group_user","model_res_partner_bank_type",,1,0,0,0
|
||||
"access_res_partner_bank_type_field_group_partner_manager","res_partner_bank_type_field group_partner_manager","model_res_partner_bank_type_field","group_partner_manager",1,1,1,1
|
||||
"access_res_partner_bank_type_field_group_user","res_partner_bank_type_field group_user","model_res_partner_bank_type_field",,1,0,0,0
|
||||
"access_res_partner_canal_group_user","res_partner_canal group_user","model_res_partner_canal",,1,0,0,0
|
||||
"access_res_partner_canal_group_partner_manager","res_partner_canal group_partner_manager","model_res_partner_canal","group_partner_manager",1,1,1,1
|
||||
"access_res_partner_category_group_user","res_partner_category group_user","model_res_partner_category","group_partner_manager",1,1,1,0
|
||||
"access_res_partner_category_group_partner_manager","res_partner_category group_partner_manager","model_res_partner_category",,1,0,0,1
|
||||
"access_res_partner_event_group_user","res_partner_event group_user","model_res_partner_event",,1,1,1,1
|
||||
"access_res_partner_event_type_group_partner_manager","res_partner_event_type group_partner_manager","model_res_partner_event_type","group_partner_manager",1,1,1,1
|
||||
"access_res_partner_event_type_group_user","res_partner_event_type group_user","model_res_partner_event_type",,1,0,0,0
|
||||
"access_res_partner_function_group_user","res_partner_function group_user","model_res_partner_function","group_partner_manager",1,1,1,1
|
||||
"access_res_partner_function_group_partner_manager","res_partner_function group_partner_manager","model_res_partner_function",,1,0,0,0
|
||||
"access_res_partner_som_group_user","res_partner_som group_user","model_res_partner_som","group_partner_manager",1,1,1,1
|
||||
"access_res_partner_som_group_partner_manager","res_partner_som group_partner_manager","model_res_partner_som",,1,0,0,0
|
||||
"access_res_partner_title_group_user","res_partner_title group_user","model_res_partner_title","group_partner_manager",1,1,1,1
|
||||
"access_res_partner_title_group_partner_manager","res_partner_title group_partner_manager","model_res_partner_title",,1,0,0,0
|
||||
"access_res_request_group_user","res_request group_user","model_res_request",,1,1,1,1
|
||||
"access_res_request_history_group_user","res_request_history group_user","model_res_request_history",,1,1,1,1
|
||||
"access_res_request_link_group_system","res_request_link group_system","model_res_request_link","group_system",1,1,1,1
|
||||
"access_res_request_link_group_user","res_request_link group_user","model_res_request_link",,1,0,0,0
|
||||
"access_res_users_group_user","res_users group_user","model_res_users",,1,0,0,0
|
||||
"access_res_users_group_erp_manager","res_users group_erp_manager","model_res_users","group_erp_manager",1,1,1,1
|
||||
"access_ir_actions_all","ir_actions_all","model_ir_actions_actions",,1,0,0,0
|
||||
"access_ir_actions_act_window_all","ir_actions_act_window_all","model_ir_actions_act_window",,1,0,0,0
|
||||
"access_ir_actions_act_window_close_group_all","ir_actions_act_window_close_all","model_ir_actions_act_window_close",,1,0,0,0
|
||||
"access_ir_actions_report_xml_all","ir_actions_report_xml","model_ir_actions_report_xml",,1,0,0,0
|
||||
"access_ir_actions_wizard_all","ir_actions_wizard","model_ir_actions_wizard",,1,0,0,0
|
||||
"access_workflow_group_system","workflow_group_system","model_workflow","group_system",1,0,0,0
|
||||
"access_workflow_activity_group_system","workflow_activity_group_system","model_workflow_activity","group_system",1,0,0,0
|
||||
"access_workflow_instance_group_system","workflow_instance_group_system","model_workflow_instance","group_system",1,0,0,0
|
||||
"access_workflow_transition_group_system","workflow_transition_group_system","model_workflow_transition","group_system",1,0,0,0
|
||||
"access_workflow_triggers_group_system","workflow_triggers_group_system","model_workflow_triggers","group_system",1,0,0,0
|
||||
"access_workflow_workitem_group_system","workflow_workitem_group_system","model_workflow_workitem","group_system",1,0,0,0
|
||||
"access_actions_report_custom_group_system","ir_actions_report_custom_group_system","model_ir_actions_report_custom","group_system",1,0,0,0
|
||||
"access_ir_actions_act_window_view_group_employee","ir_actions_act_window_view_group_employee","model_ir_actions_act_window_view","group_system",1,0,0,0
|
||||
"access_ir_actions_url_group_user","ir_actions_url_group_user","model_ir_actions_url","group_system",1,0,0,0
|
||||
"access_ir_server_object_lines_group_user","ir_server_object_lines_group_user","model_ir_server_object_lines","group_system",1,0,0,0
|
||||
"access_ir_actions_server_group_user","ir_actions_server_group_user","model_ir_actions_server","group_system",1,0,0,0
|
||||
"access_module_update_translations_group_user","wizard_update_translations_group_user","model_wizard_module_update_translations","group_system",1,1,1,1
|
||||
"access_res_bank_group_system","res_bank_group_system","model_res_bank","group_system",1,1,1,1
|
||||
"access_res_payterm_group_system","res_payterm_group_system","model_res_payterm","group_system",1,1,1,1
|
||||
"access_res_roles_group_erpmanager","res_roles_group_erp_manager","model_res_roles","group_erp_manager",1,1,1,1
|
||||
"access_res_config_view_group_erpmanager","res_config_view_erp_manager","model_res_config_view","group_erp_manager",1,1,1,1
|
||||
"access_res_roles_all","res_roles_all","model_res_roles",,1,0,0,0
|
||||
"access_res_config_view_all","res_config_view_all","model_res_config_view",,1,0,0,0
|
||||
|
||||
|
@@ -308,7 +308,7 @@ form: module.record_id""" % (xml_id,)
|
||||
xml_id = rec.getAttribute('id').encode('utf8')
|
||||
self._test_xml_id(xml_id)
|
||||
multi = rec.hasAttribute('multi') and eval(rec.getAttribute('multi'))
|
||||
res = {'name': string, 'wiz_name': name, 'multi':multi}
|
||||
res = {'name': string, 'wiz_name': name, 'multi': multi, 'model': model}
|
||||
|
||||
if rec.hasAttribute('groups'):
|
||||
g_names = rec.getAttribute('groups').split(',')
|
||||
|
||||
+110
-67
@@ -56,7 +56,7 @@ class graph(object):
|
||||
"""
|
||||
self.edge_wt = {}
|
||||
for link in self.links:
|
||||
self.edge_wt[link] = self.result[link[1]]['y'] - self.result[link[0]]['y']
|
||||
self.edge_wt[link] = self.result[link[1]]['x'] - self.result[link[0]]['x']
|
||||
|
||||
tot_node = self.partial_order.__len__()
|
||||
#do until all the nodes in the component are searched
|
||||
@@ -88,10 +88,10 @@ class graph(object):
|
||||
|
||||
for node in self.result:
|
||||
if node in self.reachable_nodes:
|
||||
self.result[node]['y'] += delta
|
||||
self.result[node]['x'] += delta
|
||||
|
||||
for edge in self.edge_wt:
|
||||
self.edge_wt[edge] = self.result[edge[1]]['y'] - self.result[edge[0]]['y']
|
||||
self.edge_wt[edge] = self.result[edge[1]]['x'] - self.result[edge[0]]['x']
|
||||
|
||||
self.init_cutvalues()
|
||||
|
||||
@@ -164,10 +164,10 @@ class graph(object):
|
||||
"""
|
||||
|
||||
if node not in self.result:
|
||||
self.result[node] = {'x': None, 'y':level, 'mark':0}
|
||||
self.result[node] = {'y': None, 'x':level, 'mark':0}
|
||||
else:
|
||||
if level > self.result[node]['y']:
|
||||
self.result[node]['y'] = level
|
||||
if level > self.result[node]['x']:
|
||||
self.result[node]['x'] = level
|
||||
|
||||
if self.result[node]['mark']==0:
|
||||
self.result[node]['mark'] = 1
|
||||
@@ -272,7 +272,7 @@ class graph(object):
|
||||
|
||||
|
||||
def finalize_rank(self, node, level):
|
||||
self.result[node]['y'] = level
|
||||
self.result[node]['x'] = level
|
||||
for destination in self.optimal_edges.get(node, []):
|
||||
self.finalize_rank(destination, level+1)
|
||||
|
||||
@@ -281,15 +281,11 @@ class graph(object):
|
||||
"""The ranks are normalized by setting the least rank to zero.
|
||||
"""
|
||||
|
||||
least_rank=100
|
||||
|
||||
for node in self.result:
|
||||
if least_rank>self.result[node]['y']:
|
||||
least_rank = self.result[node]['y']
|
||||
least_rank = min(map(lambda x: x['x'], self.result.values()))
|
||||
|
||||
if(least_rank!=0):
|
||||
for node in self.result:
|
||||
self.result[node]['y']-=least_rank
|
||||
self.result[node]['x']-=least_rank
|
||||
|
||||
|
||||
def make_chain(self):
|
||||
@@ -300,12 +296,12 @@ class graph(object):
|
||||
for edge in self.edge_wt:
|
||||
if self.edge_wt[edge]>1:
|
||||
self.transitions[edge[0]].remove(edge[1])
|
||||
start = self.result[edge[0]]['y']
|
||||
end = self.result[edge[1]]['y']
|
||||
start = self.result[edge[0]]['x']
|
||||
end = self.result[edge[1]]['x']
|
||||
|
||||
for rank in range(start+1, end):
|
||||
if not self.result.get((rank, 'temp'), False):
|
||||
self.result[(rank, 'temp')] = {'x': None, 'y': rank, 'mark': 0}
|
||||
self.result[(rank, 'temp')] = {'y': None, 'x': rank, 'mark': 0}
|
||||
|
||||
for rank in range(start, end):
|
||||
if start==rank:
|
||||
@@ -319,12 +315,12 @@ class graph(object):
|
||||
def init_order(self, node, level):
|
||||
"""Initialize orders the nodes in each rank with depth-first search
|
||||
"""
|
||||
if not self.result[node]['x']:
|
||||
self.result[node]['x'] = self.order[level]
|
||||
if not self.result[node]['y']:
|
||||
self.result[node]['y'] = self.order[level]
|
||||
self.order[level] = self.order[level]+1
|
||||
|
||||
for sec_end in self.transitions.get(node, []):
|
||||
self.init_order(sec_end, self.result[sec_end]['y'])
|
||||
self.init_order(sec_end, self.result[sec_end]['x'])
|
||||
|
||||
|
||||
def order_heuristic(self):
|
||||
@@ -349,10 +345,8 @@ class graph(object):
|
||||
self.levels[level] = new_list
|
||||
order = 0
|
||||
for node in nodes:
|
||||
self.result[node]['x'] = order
|
||||
order +=1
|
||||
|
||||
|
||||
self.result[node]['y'] = order
|
||||
order +=1
|
||||
|
||||
|
||||
def median_value(self, node, adj_rank):
|
||||
@@ -390,7 +384,7 @@ class graph(object):
|
||||
if pre_level_nodes:
|
||||
for src in pre_level_nodes:
|
||||
if (self.transitions.get(src) and self.transitions[src].__contains__(node)):
|
||||
adj_nodes.append(self.result[src]['x'])
|
||||
adj_nodes.append(self.result[src]['y'])
|
||||
|
||||
return adj_nodes
|
||||
|
||||
@@ -399,7 +393,7 @@ class graph(object):
|
||||
levels = {}
|
||||
|
||||
for r in self.partial_order:
|
||||
l = self.result[r]['y']
|
||||
l = self.result[r]['x']
|
||||
levels.setdefault(l,[])
|
||||
levels[l].append(r)
|
||||
|
||||
@@ -425,28 +419,28 @@ class graph(object):
|
||||
else:
|
||||
first_half = list[no/2+1:]
|
||||
if max_level==1:#for the case when horizontal graph is there
|
||||
self.result[list[no/2]]['x'] = mid_pos + (self.result[list[no/2]]['y']%2 * 0.5)
|
||||
self.result[list[no/2]]['y'] = mid_pos + (self.result[list[no/2]]['x']%2 * 0.5)
|
||||
else:
|
||||
self.result[list[no/2]]['x'] = mid_pos + factor
|
||||
self.result[list[no/2]]['y'] = mid_pos + factor
|
||||
|
||||
last_half = list[:no/2]
|
||||
|
||||
i=1
|
||||
for node in first_half:
|
||||
self.result[node]['x'] = mid_pos - (i + factor)
|
||||
self.result[node]['y'] = mid_pos - (i + factor)
|
||||
i += 1
|
||||
|
||||
i=1
|
||||
for node in last_half:
|
||||
self.result[node]['x'] = mid_pos + (i + factor)
|
||||
self.result[node]['y'] = mid_pos + (i + factor)
|
||||
i += 1
|
||||
else:
|
||||
self.max_order += max_level+1
|
||||
mid_pos = self.result[self.start]['x']
|
||||
mid_pos = self.result[self.start]['y']
|
||||
|
||||
|
||||
def tree_order(self, node, last=0):
|
||||
mid_pos = self.result[node]['x']
|
||||
mid_pos = self.result[node]['y']
|
||||
l = self.transitions.get(node, [])
|
||||
l.reverse()
|
||||
no = len(l)
|
||||
@@ -462,41 +456,41 @@ class graph(object):
|
||||
|
||||
i=1
|
||||
for child in first_half:
|
||||
self.result[child]['x'] = mid_pos - (i - (factor * 0.5))
|
||||
self.result[child]['y'] = mid_pos - (i - (factor * 0.5))
|
||||
i += 1
|
||||
|
||||
if self.transitions.get(child, False):
|
||||
if last:
|
||||
self.result[child]['x'] = last + len(self.transitions[child])/2 + 1
|
||||
self.result[child]['y'] = last + len(self.transitions[child])/2 + 1
|
||||
last = self.tree_order(child, last)
|
||||
|
||||
if no%2:
|
||||
mid_node = l[no/2]
|
||||
self.result[mid_node]['x'] = mid_pos
|
||||
self.result[mid_node]['y'] = mid_pos
|
||||
|
||||
if self.transitions.get((mid_node), False):
|
||||
if last:
|
||||
self.result[mid_node]['x'] = last + len(self.transitions[mid_node])/2 + 1
|
||||
self.result[mid_node]['y'] = last + len(self.transitions[mid_node])/2 + 1
|
||||
last = self.tree_order(mid_node)
|
||||
else:
|
||||
if last:
|
||||
self.result[mid_node]['x'] = last + 1
|
||||
self.result[node]['x'] = self.result[mid_node]['x']
|
||||
mid_pos = self.result[node]['x']
|
||||
self.result[mid_node]['y'] = last + 1
|
||||
self.result[node]['y'] = self.result[mid_node]['y']
|
||||
mid_pos = self.result[node]['y']
|
||||
|
||||
i=1
|
||||
last_child = None
|
||||
for child in last_half:
|
||||
self.result[child]['x'] = mid_pos + (i - (factor * 0.5))
|
||||
self.result[child]['y'] = mid_pos + (i - (factor * 0.5))
|
||||
last_child = child
|
||||
i += 1
|
||||
if self.transitions.get(child, False):
|
||||
if last:
|
||||
self.result[child]['x'] = last + len(self.transitions[child])/2 + 1
|
||||
self.result[child]['y'] = last + len(self.transitions[child])/2 + 1
|
||||
last = self.tree_order(child, last)
|
||||
|
||||
if last_child:
|
||||
last = self.result[last_child]['x']
|
||||
last = self.result[last_child]['y']
|
||||
|
||||
return last
|
||||
|
||||
@@ -504,27 +498,75 @@ class graph(object):
|
||||
def process_order(self):
|
||||
"""Finds actual-order of the nodes with respect to maximum number of nodes in a rank in component
|
||||
"""
|
||||
max_level = max(map(lambda x: len(x), self.levels.values()))
|
||||
|
||||
if max_level%2:
|
||||
self.result[self.start]['x'] = (max_level+1)/2 + self.max_order +1
|
||||
else:
|
||||
self.result[self.start]['x'] = (max_level)/2 + self.max_order + 1
|
||||
|
||||
if self.Is_Cyclic:
|
||||
max_level = max(map(lambda x: len(x), self.levels.values()))
|
||||
|
||||
if max_level%2:
|
||||
self.result[self.start]['y'] = (max_level+1)/2 + self.max_order + (self.max_order and 1)
|
||||
else:
|
||||
self.result[self.start]['y'] = (max_level)/2 + self.max_order + (self.max_order and 1)
|
||||
|
||||
self.graph_order()
|
||||
|
||||
else:
|
||||
self.result[self.start]['x'] = 0
|
||||
self.result[self.start]['y'] = 0
|
||||
self.tree_order(self.start, 0)
|
||||
min_order = math.fabs(min(map(lambda x: x['x'], self.result.values())))
|
||||
min_order += self.max_order + 1
|
||||
min_order = math.fabs(min(map(lambda x: x['y'], self.result.values())))
|
||||
|
||||
index = self.start_nodes.index(self.start)
|
||||
same = False
|
||||
|
||||
roots = []
|
||||
if index>0:
|
||||
for start in self.start_nodes[:index]:
|
||||
same = True
|
||||
for edge in self.tree_list[start][1:]:
|
||||
if self.tree_list[self.start].__contains__(edge):
|
||||
continue
|
||||
else:
|
||||
same = False
|
||||
break
|
||||
if same:
|
||||
roots.append(start)
|
||||
|
||||
if roots:
|
||||
min_order += self.max_order
|
||||
else:
|
||||
min_order += self.max_order + 1
|
||||
|
||||
for level in self.levels:
|
||||
for node in self.levels[level]:
|
||||
self.result[node]['x'] += min_order
|
||||
|
||||
self.max_order = max(map(lambda x: x['x'], self.result.values()))
|
||||
self.result[node]['y'] += min_order
|
||||
|
||||
if roots:
|
||||
roots.append(self.start)
|
||||
one_level_el = self.tree_list[self.start][0][1]
|
||||
base = self.result[one_level_el]['y']# * 2 / (index + 2)
|
||||
|
||||
|
||||
no = len(roots)
|
||||
first_half = roots[:no/2]
|
||||
|
||||
if no%2==0:
|
||||
last_half = roots[no/2:]
|
||||
else:
|
||||
last_half = roots[no/2+1:]
|
||||
|
||||
factor = -math.floor(no/2)
|
||||
for start in first_half:
|
||||
self.result[start]['y'] = base + factor
|
||||
factor += 1
|
||||
|
||||
if no%2:
|
||||
self.result[roots[no/2]]['y'] = base + factor
|
||||
factor +=1
|
||||
|
||||
for start in last_half:
|
||||
self.result[start]['y'] = base + factor
|
||||
factor += 1
|
||||
|
||||
self.max_order = max(map(lambda x: x['y'], self.result.values()))
|
||||
|
||||
def find_starts(self):
|
||||
"""Finds other start nodes of the graph in the case when graph is disconneted
|
||||
@@ -579,8 +621,8 @@ class graph(object):
|
||||
self.links = []
|
||||
self.Is_Cyclic = False
|
||||
|
||||
tree = self.make_acyclic(None, self.start, 0, [])
|
||||
self.Is_Cyclic = self.rev_edges(tree)
|
||||
self.tree_list[self.start] = self.make_acyclic(None, self.start, 0, [])
|
||||
self.Is_Cyclic = self.rev_edges(self.tree_list[self.start])
|
||||
self.process_ranking(self.start)
|
||||
self.init_rank()
|
||||
|
||||
@@ -606,7 +648,7 @@ class graph(object):
|
||||
#normalization
|
||||
self.normalize()
|
||||
for edge in self.edge_wt:
|
||||
self.edge_wt[edge] = self.result[edge[1]]['y'] - self.result[edge[0]]['y']
|
||||
self.edge_wt[edge] = self.result[edge[1]]['x'] - self.result[edge[0]]['x']
|
||||
|
||||
def order_in_rank(self):
|
||||
"""Finds optimized order of the nodes within their ranks using median heuristic
|
||||
@@ -622,10 +664,10 @@ class graph(object):
|
||||
for i in range(max_rank+1):
|
||||
self.order[i] = 0
|
||||
|
||||
self.init_order(self.start, self.result[self.start]['y'])
|
||||
self.init_order(self.start, self.result[self.start]['x'])
|
||||
|
||||
for level in self.levels:
|
||||
self.levels[level].sort(lambda x, y: cmp(self.result[x]['x'], self.result[y]['x']))
|
||||
self.levels[level].sort(lambda x, y: cmp(self.result[x]['y'], self.result[y]['y']))
|
||||
|
||||
self.order_heuristic()
|
||||
self.process_order()
|
||||
@@ -639,6 +681,7 @@ class graph(object):
|
||||
self.start_nodes = starting_node or []
|
||||
self.partial_order = {}
|
||||
self.links = []
|
||||
self.tree_list = {}
|
||||
|
||||
if self.nodes:
|
||||
if self.start_nodes:
|
||||
@@ -673,7 +716,7 @@ class graph(object):
|
||||
for l in self.levels:
|
||||
result += 'PosY: ' + str(l) + '\n'
|
||||
for node in self.levels[l]:
|
||||
result += '\tPosX: '+ str(self.result[node]['x']) + ' - Node:' + node + "\n"
|
||||
result += '\tPosX: '+ str(self.result[node]['y']) + ' - Node:' + node + "\n"
|
||||
return result
|
||||
|
||||
|
||||
@@ -684,16 +727,16 @@ class graph(object):
|
||||
#for flat edges ie. source an destination nodes are on the same rank
|
||||
for src in self.transitions:
|
||||
for des in self.transitions[src]:
|
||||
if (self.result[des]['y'] - self.result[src]['y'] == 0):
|
||||
self.result[src]['y'] += 0.08
|
||||
self.result[des]['y'] -= 0.08
|
||||
if (self.result[des]['x'] - self.result[src]['x'] == 0):
|
||||
self.result[src]['x'] += 0.08
|
||||
self.result[des]['x'] -= 0.08
|
||||
|
||||
factorX = maxx + nheight
|
||||
factorY = maxy + nwidth
|
||||
|
||||
for node in self.result:
|
||||
self.result[node]['x'] = (self.result[node]['x']) * factorX + margin
|
||||
self.result[node]['y'] = (self.result[node]['y']) * factorY + margin
|
||||
self.result[node]['y'] = (self.result[node]['y']) * factorX + margin
|
||||
self.result[node]['x'] = (self.result[node]['x']) * factorY + margin
|
||||
|
||||
|
||||
def result_get(self):
|
||||
@@ -731,13 +774,13 @@ if __name__=='__main__':
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
for name,node in g.result.items():
|
||||
draw.arc( (int(node['x']-radius), int(node['y']-radius),int(node['x']+radius), int(node['y']+radius) ), 0, 360, (128,128,128))
|
||||
draw.text( (int(node['x']), int(node['y'])), name, (128,128,128))
|
||||
draw.arc( (int(node['y']-radius), int(node['x']-radius),int(node['y']+radius), int(node['x']+radius) ), 0, 360, (128,128,128))
|
||||
draw.text( (int(node['y']), int(node['x'])), name, (128,128,128))
|
||||
|
||||
|
||||
for nodefrom in g.transitions:
|
||||
for nodeto in g.transitions[nodefrom]:
|
||||
draw.line( (int(g.result[nodefrom]['x']), int(g.result[nodefrom]['y']),int(g.result[nodeto]['x']),int(g.result[nodeto]['y'])),(128,128,128) )
|
||||
draw.line( (int(g.result[nodefrom]['y']), int(g.result[nodefrom]['x']),int(g.result[nodeto]['y']),int(g.result[nodeto]['x'])),(128,128,128) )
|
||||
|
||||
img.save("graph.png", "PNG")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user