Wizard RST Technical Guide moved from server trunk
authorOlivier Laurent <olt@tinyerp.com>
Mon, 26 Jan 2009 11:43:50 +0000 (12:43 +0100)
committerOlivier Laurent <olt@tinyerp.com>
Mon, 26 Jan 2009 11:43:50 +0000 (12:43 +0100)
bzr revid: olt@tinyerp.com-20090126114350-a83042jvdkxi66gz

addons/base_module_doc_rst/__init__.py [new file with mode: 0644]
addons/base_module_doc_rst/__terp__.py [new file with mode: 0644]
addons/base_module_doc_rst/base_module_doc_rst_wizard.xml [new file with mode: 0644]
addons/base_module_doc_rst/security/base_security.xml [new file with mode: 0644]
addons/base_module_doc_rst/security/ir.model.access.csv [new file with mode: 0644]
addons/base_module_doc_rst/wizard/__init__.py [new file with mode: 0644]
addons/base_module_doc_rst/wizard/wizard_tech_guide_rst.py [new file with mode: 0644]

diff --git a/addons/base_module_doc_rst/__init__.py b/addons/base_module_doc_rst/__init__.py
new file mode 100644 (file)
index 0000000..d7f0613
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution  
+#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+#    $Id$
+#
+#    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 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 General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import wizard
+
diff --git a/addons/base_module_doc_rst/__terp__.py b/addons/base_module_doc_rst/__terp__.py
new file mode 100644 (file)
index 0000000..5a2bc8a
--- /dev/null
@@ -0,0 +1,39 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+#    $Id$
+#
+#    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 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 General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+{
+    'name': 'Module Technical Guide in Restructured Text ',
+    'version': '1.0',
+    'category': 'Generic Modules/Base',
+    'description': """
+    * This module generate the Technical Guides of selected modules in Restructured Text format.
+    """,
+    'author': 'Tiny',
+    'website': 'http://www.openerp.com',
+    'depends': ['base'],
+    'init_xml': [],
+    'update_xml': ['base_module_doc_rst_wizard.xml'],
+    'demo_xml': [],
+    'installable': True,
+    'certificate': '',
+}
+
diff --git a/addons/base_module_doc_rst/base_module_doc_rst_wizard.xml b/addons/base_module_doc_rst/base_module_doc_rst_wizard.xml
new file mode 100644 (file)
index 0000000..bc7b493
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<openerp>
+    <data>
+        <wizard
+                                 id="wiz_tech_guide_rst"
+                                       model="ir.module.module"
+                                       name="tech.guide.rst"
+                                       string="Create RST Technical Guide"
+          keyword="client_action_multi"
+          multi="True"
+                               />
+
+    </data>
+</openerp>
diff --git a/addons/base_module_doc_rst/security/base_security.xml b/addons/base_module_doc_rst/security/base_security.xml
new file mode 100644 (file)
index 0000000..e952e9f
--- /dev/null
@@ -0,0 +1,72 @@
+<?xml version="1.0"?>
+<openerp>
+       <data noupdate="0">
+
+<!--
+ Users Groups
+-->
+    <record model="res.groups" id="group_system">
+        <field name="name">Administrator / Configuration</field>
+    </record>
+    
+    <record model="res.groups" id="group_erp_manager">
+        <field name="name">Administrator / Access Rights</field>
+    </record>
+    
+    <record model="res.groups" id="group_user">
+        <field name="name">Employee</field>
+    </record>
+
+    <record model="res.groups" id="group_extended">
+        <field name="name">Useability / Extended View</field>
+    </record>
+    
+    <record model="res.groups" id="group_no_one">
+        <field name="name">Useability / No One</field>
+    </record>
+
+<!--
+ Users
+-->
+    <record model="res.users" id="base.user_root">
+        <field name="signature">Administrator</field>
+        <field name="address_id" ref="main_address"/>
+        <field name="company_id" ref="main_company"/>
+        <field name="action_id" ref="action_menu_admin"/>
+        <field name="menu_id" ref="action_menu_admin"/>
+    </record>
+
+
+       <!-- Set accesses 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>
+       
+       <record id="base.menu_action_currency_form" model="ir.ui.menu">
+               <field eval="[(6,0,[ref('base.group_system')])]" name="groups_id"/>
+       </record>
+
+       <record id="base.menu_custom" model="ir.ui.menu">
+               <field eval="[(6,0,[ref('base.group_system')])]" name="groups_id"/>
+       </record>
+
+       <record id="base.menu_translation" model="ir.ui.menu">
+               <!-- FIXME: a "Usability / Translations" group ?? -->
+               <field eval="[(6,0,[ref('base.group_system')])]" name="groups_id"/>
+       </record>
+
+       <record id="base.menu_management" model="ir.ui.menu">
+               <field eval="[(6,0,[ref('base.group_system')])]" name="groups_id"/>
+       </record>
+
+</data>
+</openerp>
+
diff --git a/addons/base_module_doc_rst/security/ir.model.access.csv b/addons/base_module_doc_rst/security/ir.model.access.csv
new file mode 100644 (file)
index 0000000..3455272
--- /dev/null
@@ -0,0 +1,134 @@
+"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
+"access_ir_attachment_group_system","ir_attachment group_system","model_ir_attachment",,1,1,1,1
+"access_ir_cron_group_cron","ir_cron group_cron","model_ir_cron","group_system",1,1,1,1
+"access_ir_cron_user","ir_cron user","model_ir_cron","group_user",1,0,0,0
+"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_property_group_user_manager","ir_property group_manager","model_ir_property",base.group_partner_manager,1,1,1,1
+"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_menu_group_system","ir_ui_menu group_system","model_ir_ui_menu","group_system",1,1,1,1
+"access_ir_ui_view_group_user","ir_ui_view group_user","model_ir_ui_view",,1,0,0,0
+"access_ir_ui_view_group_system","ir_ui_view group_system","model_ir_ui_view","group_system",1,1,1,1
+"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_custom_group_system","ir_ui_view_custom_group_system","model_ir_ui_view_custom","group_system",1,1,1,1
+"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",group_erp_manager,1,1,1,1
+"access_ir_values_group_all","ir_values group_all","model_ir_values",,1,0,0,0
+"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_system","res_currency group_system","model_res_currency","group_system",1,1,1,1
+"access_res_currency_rate_group_system","res_currency_rate group_system","model_res_currency_rate","group_system",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",group_user,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",group_user,1,0,0,0
+"access_res_partner_bank_group_user","res_partner_bank group_user","model_res_partner_bank",group_user,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",group_user,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",group_user,1,0,0,0
+"access_res_partner_canal_group_user","res_partner_canal group_user","model_res_partner_canal",group_user,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_user,1,0,0,0
+"access_res_partner_category_group_partner_manager","res_partner_category group_partner_manager","model_res_partner_category","group_partner_manager",1,1,1,1
+"access_res_partner_event_group_user","res_partner_event group_user","model_res_partner_event",group_user,1,1,1,1
+"access_res_partner_event_group_partner_manager","res_partner_event group_partner_manager","model_res_partner_event","group_partner_manager",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",group_user,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",group_user,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",group_user,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",group_user,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_all","res_users all","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_group_system","ir_actions_group_system","model_ir_actions_actions","group_system",1,1,1,1
+"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_system","ir_actions_act_window_system","model_ir_actions_act_window","group_system",1,1,1,1
+"access_ir_actions_act_window_close_all","ir_actions_act_window_close_all","model_ir_actions_act_window_close",,1,0,0,0
+"access_ir_actions_act_window_close_group_system","ir_actions_act_window_close_group_system","model_ir_actions_act_window_close","group_system",1,1,1,1
+"access_ir_actions_report_xml_all","ir_actions_report_xml","model_ir_actions_report_xml",,1,0,0,0
+"access_ir_actions_report_xml_group_system","ir_actions_report_xml_group_system","model_ir_actions_report_xml","group_system",1,1,1,1
+"access_ir_actions_wizard_all","ir_actions_wizard","model_ir_actions_wizard",,1,0,0,0
+"access_ir_actions_wizard_group_system","ir_actions_wizard_group_system","model_ir_actions_wizard","group_system",1,1,1,1
+"access_ir_actions_todo_group_system","ir_actions_todo group system","model_ir_actions_todo","group_system",1,1,1,1
+"access_ir_actions_config_wiz_group_system","ir_actions_configuration_wizard group system","model_ir_actions_configuration_wizard","group_system",1,1,1,1
+"access_workflow_all","workflow_all","model_workflow",,1,0,0,0
+"access_workflow_group_system","workflow_group_system","model_workflow","group_system",1,1,1,1
+"access_workflow_activity_all","workflow_activity_all","model_workflow_activity",,1,0,0,0
+"access_workflow_activity_group_system","workflow_activity_group_system","model_workflow_activity","group_system",1,1,1,1
+"access_workflow_instance_all","workflow_instance_all","model_workflow_instance",,1,1,1,1
+"access_workflow_transition_all","workflow_transition_all","model_workflow_transition",,1,0,0,0
+"access_workflow_transition_group_system","workflow_transition_group_system","model_workflow_transition","group_system",1,1,1,1
+"access_workflow_triggers_all","workflow_triggers_all","model_workflow_triggers",,1,0,0,0
+"access_workflow_triggers_group_system","workflow_triggers_group_system","model_workflow_triggers","group_system",1,1,1,1
+"access_workflow_workitem_all","workflow_workitem_all","model_workflow_workitem",,1,1,1,1
+"access_actions_report_custom_all","ir_actions_report_custom_all","model_ir_actions_report_custom",,1,0,0,0
+"access_actions_report_custom_group_system","ir_actions_report_custom_group_system","model_ir_actions_report_custom","group_system",1,1,1,1
+"access_ir_actions_act_window_view_all","ir_actions_act_window_view_all","model_ir_actions_act_window_view",,1,0,0,0
+"access_ir_actions_act_window_view_group_system","ir_actions_act_window_view_group_system","model_ir_actions_act_window_view","group_system",1,1,1,1
+"access_ir_actions_url_all","ir_actions_url_all","model_ir_actions_url",,1,0,0,0
+"access_ir_actions_url_group_system","ir_actions_url_group_system","model_ir_actions_url","group_system",1,1,1,1
+"access_ir_server_object_lines_all","ir_server_object_lines_all","model_ir_server_object_lines",,1,0,0,0
+"access_ir_server_object_lines_group_system","ir_server_object_lines_group_system","model_ir_server_object_lines","group_system",1,1,1,1
+"access_ir_actions_server_all","ir_actions_server_all","model_ir_actions_server",,1,0,0,0
+"access_ir_actions_server_group_system","ir_actions_server_group_system","model_ir_actions_server","group_system",1,1,1,1
+"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
+"access_res_bank_group_partner_manager","res_bank_group_partner_manager","model_res_bank","group_partner_manager",1,1,1,1
+"access_res_bank_user","res_bank user","model_res_bank","group_user",1,0,0,0
+"access_maintenance_group_user","maintenance_contract group_user","model_maintenance_contract","group_maintenance_manager",1,1,1,1
+"access_maintenance_contract_module","maintenance.contract.module","model_maintenance_contract_module","group_maintenance_manager",1,1,1,1
+"access_maintenance_contract_wizard","maintenance.contract.wizard","model_maintenance_contract_wizard","group_maintenance_manager",1,1,1,1
diff --git a/addons/base_module_doc_rst/wizard/__init__.py b/addons/base_module_doc_rst/wizard/__init__.py
new file mode 100644 (file)
index 0000000..a714ad2
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution  
+#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+#    $Id$
+#
+#    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 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 General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import wizard_tech_guide_rst
+
diff --git a/addons/base_module_doc_rst/wizard/wizard_tech_guide_rst.py b/addons/base_module_doc_rst/wizard/wizard_tech_guide_rst.py
new file mode 100644 (file)
index 0000000..46b44a8
--- /dev/null
@@ -0,0 +1,314 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+#    $Id$
+#
+#    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 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 General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import netsvc
+import wizard
+import pooler
+import os
+
+import base64
+import tempfile
+import tarfile
+
+
+
+choose_file_form = '''<?xml version="1.0"?>
+<form string="Create Technical Guide in rst format">
+    <separator string="Technical Guide in rst format" colspan="4"/>
+    <label string="Please choose a file where the Technical Guide will be written." colspan="4"/>
+    <field name="rst_file" />
+    <field name="name" invisible="1"/>
+</form>
+'''
+
+choose_file_fields = {
+    'rst_file': {'string': 'file', 'type': 'binary', 'required': True, 'readonly': True},
+    'name': {'string': 'filename', 'type': 'char', 'required': True, 'readonly': True},
+}
+
+
+class RstDoc(object):
+    def __init__(self, module, objects):
+        self.dico = {
+            'name': module.name,
+            'shortdesc': module.shortdesc,
+            'latest_version': module.latest_version,
+            'website': module.website,
+            'description': self._handle_text(module.description or 'None'),
+            'report_list': self._handle_list_items(module.reports_by_module),
+            'menu_list': self._handle_list_items(module.menus_by_module),
+            'view_list': self._handle_list_items(module.views_by_module),
+            'depends': module.dependencies_id,
+        }
+        self.objects = objects
+
+    def _handle_list_items(self, list_item_as_string):
+        return [item.replace('*', '\*') for item in list_item_as_string.split('\n')]
+
+    def _handle_text(self, txt):
+        lst = ['  %s' % line for line in txt.split('\n')]
+        return '\n'.join(lst)
+
+    def _write_header(self):
+        dico = self.dico
+        title = "Module %s (*%s*)" % (dico['shortdesc'], dico['name'])
+        title_underline = "=" * len(title)
+        dico['title'] = title
+        dico['title_underline'] = title_underline
+        sl = [
+            "",
+            "%(title)s",
+            "%(title_underline)s",
+            ":Module: %(name)s",
+            ":Name: %(shortdesc)s",
+            ":Version: %(latest_version)s",
+            ":Directory: %(name)s",
+            ":Web: %(website)s",
+            "",
+            "Description",
+            "-----------",
+            "",
+            "::",
+            "  ",
+            "  %(description)s",
+            ""]
+        return '\n'.join(sl) % (dico)
+
+    def _write_reports(self):
+        sl = ["",
+              "Reports",
+              "-------"]
+        for report in self.dico['report_list']:
+            if report:
+                sl.append("")
+                sl.append(" * %s" % report)
+        sl.append("")
+        return '\n'.join(sl)
+
+    def _write_menus(self):
+        sl = ["",
+              "Menus",
+              "-------"]
+        for menu in self.dico['menu_list']:
+            if menu:
+                sl.append("")
+                sl.append(" * %s" % menu)
+
+        sl.append("")
+        return '\n'.join(sl)
+
+    def _write_views(self):
+        sl = ["",
+              "Views",
+              "-----"]
+        for view in self.dico['view_list']:
+            if view:
+                sl.append("")
+                sl.append(" * %s" % view)
+        sl.append("")
+        return '\n'.join(sl)
+
+    def _write_depends(self):
+        sl = ["",
+              "Dependencies",
+              "------------"]
+        for dependency in self.dico['depends']:
+            sl.append("")
+            sl.append(" * %s - %s" % (dependency.name, dependency.state))
+        return '\n'.join(sl)
+
+    def _write_objects(self):
+        def write_field(field_def):
+            field_name = field_def[0]
+            field_dict = field_def[1]
+            field_required = field_dict.get('required', '') and ', required'
+            field_readonly = field_dict.get('readonly', '') and ', readonly'
+
+            field_help_s = field_dict.get('help', '').strip()
+            if field_help_s:
+                field_help_s = "*%s*" % (field_help_s)
+                field_help = '\n'.join(['    %s' % line.strip() for line in field_help_s.split('\n')])
+            else:
+                field_help = ''
+
+            s = ""
+            s += ":%s: " % (field_name)
+            s += field_dict.get('string', 'Unknown')
+            s += ", " + field_dict['type']
+            s += field_required
+            s += field_readonly
+            s += "\n\n%s" % (field_help)
+            return s
+
+        sl = ["",
+              "",
+              "Objects",
+              "-------"]
+        for obj in self.objects:
+            title = obj['object'].name
+            sl.append("")
+            sl.append(title)
+            sl.append('#' * len(title))
+            sl.append("")
+
+            for field in obj['fields']:
+                sl.append("")
+                sl.append(write_field(field))
+                sl.append("")
+
+        return '\n'.join(sl)
+
+    def write(self):
+        s = ''
+        s += self._write_header()
+        s += self._write_reports()
+        s += self._write_menus()
+        s += self._write_views()
+        s += self._write_depends()
+        s += self._write_objects()
+
+        return s
+
+
+class wizard_tech_guide_rst(wizard.interface):
+
+    def _generate(self, cr, uid, data, context):
+        pool = pooler.get_pool(cr.dbname)
+        module_model = pool.get('ir.module.module')
+        module_ids = data['ids']
+
+        module_index = []
+
+        # create a temporary gzipped tarfile:
+        tgz_tmp_filename = tempfile.mktemp('_rst_module_doc.tgz')
+        try:
+            tarf = tarfile.open(tgz_tmp_filename, 'w:gz')
+
+            modules = module_model.browse(cr, uid, module_ids)
+            for module in modules:
+                index_dict = {
+                    'name': module.name,
+                    'shortdesc': module.shortdesc,
+                }
+                module_index.append(index_dict )
+
+                objects = self._get_objects(cr, uid, module)
+                rstdoc = RstDoc(module, objects)
+                out = rstdoc.write()
+
+                try:
+                    tmp_file = tempfile.NamedTemporaryFile()
+                    tmp_file.write(out.encode('utf8'))
+                    tmp_file.file.flush() # write content to file
+                    tarf.add(tmp_file.name, arcname=module.name + '.rst')
+                finally:
+                    tmp_file.close()
+
+            # write index file:
+            tmp_file = tempfile.NamedTemporaryFile()
+            out = self._create_index(module_index)
+            tmp_file.write(out.encode('utf8'))
+            tmp_file.file.flush()
+            tarf.add(tmp_file.name, arcname='index.rst')
+
+        finally:
+            tarf.close()
+
+        try:
+            os.unlink(tmp_file)
+        except Exception, e:
+            logger = netsvc.Logger()
+            logger.notifyChannel("warning", netsvc.LOG_WARNING,
+                "Temporary file %s could not be deleted. (%s)" % (tmp_file.name, e))
+
+        f = open(tgz_tmp_filename, 'rb')
+        out = f.read()
+        f.close()
+
+        return {
+            'rst_file': base64.encodestring(out),
+            'name': 'modules_technical_guide_rst.tgz'
+        }
+
+    def _create_index(self, module_index):
+        sl = ["",
+              ".. _module-technical-guide-link:",
+              "",
+              "Module Technical Guide: Introspection report on objects",
+              "=======================================================",
+              "",
+              ".. toctree::",
+              "    :maxdepth: 1",
+              "",
+              ]
+        for mod in module_index:
+            sl.append("    %s" % mod['name'])
+        sl.append("")
+        return '\n'.join(sl)
+
+    def _get_objects(self, cr, uid, module):
+        res = []
+        objects = self._object_find(cr, uid, module)
+        for obj in objects:
+            dico = {
+                'object': obj,
+                'fields': self._fields_find(cr, uid, obj.model)
+            }
+            res.append(dico)
+        return res
+
+    def _object_find(self, cr, uid, module):
+        pool = pooler.get_pool(cr.dbname)
+        ids2 = pool.get('ir.model.data').search(cr, uid, [('module', '=', module.name), ('model', '=', 'ir.model')])
+        ids = []
+        for mod in pool.get('ir.model.data').browse(cr, uid, ids2):
+            ids.append(mod.res_id)
+        modobj = pool.get('ir.model')
+        return modobj.browse(cr, uid, ids)
+
+    def _fields_find(self, cr, uid, obj):
+        pool = pooler.get_pool(cr.dbname)
+        modobj = pool.get(obj)
+        res = modobj.fields_get(cr, uid).items()
+        return res
+
+##     def _object_doc(self, cr, uid, obj):
+##         pool = pooler.get_pool(cr.dbname)
+##         modobj = pool.get(obj)
+##         return modobj.__doc__
+
+    states = {
+        'init': {
+            'actions': [_generate],
+            'result': {
+                'type': 'form',
+                'arch': choose_file_form,
+                'fields': choose_file_fields,
+                'state': [
+                    ('end', 'Close', 'gtk-close'),
+                ]
+            }
+        },
+    }
+
+wizard_tech_guide_rst('tech.guide.rst')
+