Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
E
erp5_workflow
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wenjie.zheng
erp5_workflow
Commits
2eb560f6
Commit
2eb560f6
authored
Sep 11, 2014
by
Julien Muchembled
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch to remove 'bt/revision' files
parents
c727c78a
db6a2d07
Changes
291
Hide whitespace changes
Inline
Side-by-side
Showing
291 changed files
with
607 additions
and
1209 deletions
+607
-1209
bt5/cloudooo_data/bt/revision
bt5/cloudooo_data/bt/revision
+0
-1
bt5/cloudooo_web/bt/revision
bt5/cloudooo_web/bt/revision
+0
-1
bt5/erp5_access_token/bt/revision
bt5/erp5_access_token/bt/revision
+0
-1
bt5/erp5_accounting/bt/revision
bt5/erp5_accounting/bt/revision
+0
-1
bt5/erp5_accounting_l10n_br_extend/bt/revision
bt5/erp5_accounting_l10n_br_extend/bt/revision
+0
-1
bt5/erp5_accounting_l10n_br_sme/bt/revision
bt5/erp5_accounting_l10n_br_sme/bt/revision
+0
-1
bt5/erp5_accounting_l10n_cn_basic/bt/revision
bt5/erp5_accounting_l10n_cn_basic/bt/revision
+0
-1
bt5/erp5_accounting_l10n_de_skr04/bt/revision
bt5/erp5_accounting_l10n_de_skr04/bt/revision
+0
-1
bt5/erp5_accounting_l10n_fr/bt/revision
bt5/erp5_accounting_l10n_fr/bt/revision
+0
-1
bt5/erp5_accounting_l10n_fr_m14/bt/revision
bt5/erp5_accounting_l10n_fr_m14/bt/revision
+0
-1
bt5/erp5_accounting_l10n_fr_m4/bt/revision
bt5/erp5_accounting_l10n_fr_m4/bt/revision
+0
-1
bt5/erp5_accounting_l10n_fr_pca/bt/revision
bt5/erp5_accounting_l10n_fr_pca/bt/revision
+0
-1
bt5/erp5_accounting_l10n_ifrs/bt/revision
bt5/erp5_accounting_l10n_ifrs/bt/revision
+0
-1
bt5/erp5_accounting_l10n_in/bt/revision
bt5/erp5_accounting_l10n_in/bt/revision
+0
-1
bt5/erp5_accounting_l10n_lu/bt/revision
bt5/erp5_accounting_l10n_lu/bt/revision
+0
-1
bt5/erp5_accounting_l10n_mt/bt/revision
bt5/erp5_accounting_l10n_mt/bt/revision
+0
-1
bt5/erp5_accounting_l10n_pl/bt/revision
bt5/erp5_accounting_l10n_pl/bt/revision
+0
-1
bt5/erp5_accounting_l10n_pl_default_gap/bt/revision
bt5/erp5_accounting_l10n_pl_default_gap/bt/revision
+0
-1
bt5/erp5_accounting_l10n_ru/bt/revision
bt5/erp5_accounting_l10n_ru/bt/revision
+0
-1
bt5/erp5_accounting_l10n_sn/bt/revision
bt5/erp5_accounting_l10n_sn/bt/revision
+0
-1
bt5/erp5_accounting_ui_test/bt/revision
bt5/erp5_accounting_ui_test/bt/revision
+0
-1
bt5/erp5_ace_editor/bt/revision
bt5/erp5_ace_editor/bt/revision
+0
-1
bt5/erp5_administration/bt/revision
bt5/erp5_administration/bt/revision
+0
-1
bt5/erp5_advanced_invoicing/bt/revision
bt5/erp5_advanced_invoicing/bt/revision
+0
-1
bt5/erp5_apparel/bt/revision
bt5/erp5_apparel/bt/revision
+0
-1
bt5/erp5_archive/bt/revision
bt5/erp5_archive/bt/revision
+0
-1
bt5/erp5_authentication_policy/bt/revision
bt5/erp5_authentication_policy/bt/revision
+0
-1
bt5/erp5_auto_logout/bt/revision
bt5/erp5_auto_logout/bt/revision
+0
-1
bt5/erp5_autocompletion_ui/bt/revision
bt5/erp5_autocompletion_ui/bt/revision
+0
-1
bt5/erp5_banking_cash/bt/revision
bt5/erp5_banking_cash/bt/revision
+0
-1
bt5/erp5_banking_check/bt/revision
bt5/erp5_banking_check/bt/revision
+0
-1
bt5/erp5_banking_core/bt/revision
bt5/erp5_banking_core/bt/revision
+0
-1
bt5/erp5_banking_inventory/bt/revision
bt5/erp5_banking_inventory/bt/revision
+0
-1
bt5/erp5_barcode/bt/revision
bt5/erp5_barcode/bt/revision
+0
-1
bt5/erp5_base/bt/revision
bt5/erp5_base/bt/revision
+0
-1
bt5/erp5_bearer_token/bt/revision
bt5/erp5_bearer_token/bt/revision
+0
-1
bt5/erp5_bespin/bt/revision
bt5/erp5_bespin/bt/revision
+0
-1
bt5/erp5_big_file/bt/revision
bt5/erp5_big_file/bt/revision
+0
-1
bt5/erp5_budget/bt/revision
bt5/erp5_budget/bt/revision
+0
-1
bt5/erp5_calendar/bt/revision
bt5/erp5_calendar/bt/revision
+0
-1
bt5/erp5_certificate_authority/bt/revision
bt5/erp5_certificate_authority/bt/revision
+0
-1
bt5/erp5_code_mirror/bt/revision
bt5/erp5_code_mirror/bt/revision
+0
-1
bt5/erp5_commerce/bt/revision
bt5/erp5_commerce/bt/revision
+0
-1
bt5/erp5_computer_immobilisation/bt/revision
bt5/erp5_computer_immobilisation/bt/revision
+0
-1
bt5/erp5_configurator/bt/revision
bt5/erp5_configurator/bt/revision
+0
-1
bt5/erp5_configurator_maxma_demo/bt/revision
bt5/erp5_configurator_maxma_demo/bt/revision
+0
-1
bt5/erp5_configurator_run_my_doc/bt/revision
bt5/erp5_configurator_run_my_doc/bt/revision
+0
-1
bt5/erp5_configurator_standard/bt/revision
bt5/erp5_configurator_standard/bt/revision
+0
-1
bt5/erp5_configurator_standard_accounting_template/bt/revision
...rp5_configurator_standard_accounting_template/bt/revision
+0
-1
bt5/erp5_configurator_standard_categories/bt/revision
bt5/erp5_configurator_standard_categories/bt/revision
+0
-1
bt5/erp5_configurator_standard_invoicing_template/bt/revision
...erp5_configurator_standard_invoicing_template/bt/revision
+0
-1
bt5/erp5_configurator_standard_solver/bt/revision
bt5/erp5_configurator_standard_solver/bt/revision
+0
-1
bt5/erp5_configurator_standard_trade_template/bt/revision
bt5/erp5_configurator_standard_trade_template/bt/revision
+0
-1
bt5/erp5_configurator_standard_ui_test/bt/revision
bt5/erp5_configurator_standard_ui_test/bt/revision
+0
-1
bt5/erp5_configurator_ung/bt/revision
bt5/erp5_configurator_ung/bt/revision
+0
-1
bt5/erp5_consulting/bt/revision
bt5/erp5_consulting/bt/revision
+0
-1
bt5/erp5_content_translation/bt/revision
bt5/erp5_content_translation/bt/revision
+0
-1
bt5/erp5_core_proxy_field_legacy/bt/revision
bt5/erp5_core_proxy_field_legacy/bt/revision
+0
-1
bt5/erp5_credential/bt/revision
bt5/erp5_credential/bt/revision
+0
-1
bt5/erp5_credential_oauth2/bt/revision
bt5/erp5_credential_oauth2/bt/revision
+0
-1
bt5/erp5_crm/bt/revision
bt5/erp5_crm/bt/revision
+0
-1
bt5/erp5_crm_knowledge_pad/bt/revision
bt5/erp5_crm_knowledge_pad/bt/revision
+0
-1
bt5/erp5_csv_style/bt/revision
bt5/erp5_csv_style/bt/revision
+0
-1
bt5/erp5_data_protection/bt/revision
bt5/erp5_data_protection/bt/revision
+0
-1
bt5/erp5_data_set/bt/revision
bt5/erp5_data_set/bt/revision
+0
-1
bt5/erp5_deferred_style/bt/revision
bt5/erp5_deferred_style/bt/revision
+0
-1
bt5/erp5_demo_maxma_rule/bt/revision
bt5/erp5_demo_maxma_rule/bt/revision
+0
-1
bt5/erp5_demo_maxma_sample/bt/revision
bt5/erp5_demo_maxma_sample/bt/revision
+0
-1
bt5/erp5_demo_smb/bt/revision
bt5/erp5_demo_smb/bt/revision
+0
-1
bt5/erp5_demo_ung/bt/revision
bt5/erp5_demo_ung/bt/revision
+0
-1
bt5/erp5_development_wizard/bt/revision
bt5/erp5_development_wizard/bt/revision
+0
-1
bt5/erp5_dhtml_style/bt/revision
bt5/erp5_dhtml_style/bt/revision
+0
-1
bt5/erp5_dhtml_ui_test/bt/revision
bt5/erp5_dhtml_ui_test/bt/revision
+0
-1
bt5/erp5_direct_debit_payment/bt/revision
bt5/erp5_direct_debit_payment/bt/revision
+0
-1
bt5/erp5_discount_resource/bt/revision
bt5/erp5_discount_resource/bt/revision
+0
-1
bt5/erp5_discussion/bt/revision
bt5/erp5_discussion/bt/revision
+0
-1
bt5/erp5_dms/bt/revision
bt5/erp5_dms/bt/revision
+0
-1
bt5/erp5_dms_conversion_catalog/bt/revision
bt5/erp5_dms_conversion_catalog/bt/revision
+0
-1
bt5/erp5_dms_ui_test/bt/revision
bt5/erp5_dms_ui_test/bt/revision
+0
-1
bt5/erp5_dummy_movement/bt/revision
bt5/erp5_dummy_movement/bt/revision
+0
-1
bt5/erp5_egov/bt/revision
bt5/erp5_egov/bt/revision
+0
-1
bt5/erp5_egov_l10n_fr/bt/revision
bt5/erp5_egov_l10n_fr/bt/revision
+0
-1
bt5/erp5_egov_mysql_innodb_catalog/bt/revision
bt5/erp5_egov_mysql_innodb_catalog/bt/revision
+0
-1
bt5/erp5_email_reader/bt/revision
bt5/erp5_email_reader/bt/revision
+0
-1
bt5/erp5_external_account/bt/revision
bt5/erp5_external_account/bt/revision
+0
-1
bt5/erp5_forge/bt/revision
bt5/erp5_forge/bt/revision
+0
-1
bt5/erp5_forum_tutorial/bt/revision
bt5/erp5_forum_tutorial/bt/revision
+0
-1
bt5/erp5_full_text_mroonga_catalog/bt/revision
bt5/erp5_full_text_mroonga_catalog/bt/revision
+0
-1
bt5/erp5_full_text_myisam_catalog/bt/revision
bt5/erp5_full_text_myisam_catalog/bt/revision
+0
-1
bt5/erp5_full_text_sphinxse_catalog/bt/revision
bt5/erp5_full_text_sphinxse_catalog/bt/revision
+0
-1
bt5/erp5_hal_json_style/bt/revision
bt5/erp5_hal_json_style/bt/revision
+0
-1
bt5/erp5_hr/bt/revision
bt5/erp5_hr/bt/revision
+0
-1
bt5/erp5_ical_style/bt/revision
bt5/erp5_ical_style/bt/revision
+0
-1
bt5/erp5_immobilisation/bt/revision
bt5/erp5_immobilisation/bt/revision
+0
-1
bt5/erp5_ingestion/bt/revision
bt5/erp5_ingestion/bt/revision
+0
-1
bt5/erp5_ingestion_mysql_innodb_catalog/bt/revision
bt5/erp5_ingestion_mysql_innodb_catalog/bt/revision
+0
-1
bt5/erp5_inotify/bt/revision
bt5/erp5_inotify/bt/revision
+0
-1
bt5/erp5_interfaces/bt/revision
bt5/erp5_interfaces/bt/revision
+0
-1
bt5/erp5_invoicing/bt/revision
bt5/erp5_invoicing/bt/revision
+0
-1
bt5/erp5_item/bt/revision
bt5/erp5_item/bt/revision
+0
-1
bt5/erp5_javascript_openlayers/bt/revision
bt5/erp5_javascript_openlayers/bt/revision
+0
-1
bt5/erp5_jio/bt/revision
bt5/erp5_jio/bt/revision
+0
-1
bt5/erp5_jquery_legacy/bt/revision
bt5/erp5_jquery_legacy/bt/revision
+0
-1
bt5/erp5_jquery_plugin_bbq/bt/revision
bt5/erp5_jquery_plugin_bbq/bt/revision
+0
-1
bt5/erp5_jquery_plugin_colorpicker/bt/revision
bt5/erp5_jquery_plugin_colorpicker/bt/revision
+0
-1
bt5/erp5_jquery_plugin_cookie/bt/revision
bt5/erp5_jquery_plugin_cookie/bt/revision
+0
-1
bt5/erp5_jquery_plugin_elastic/bt/revision
bt5/erp5_jquery_plugin_elastic/bt/revision
+0
-1
bt5/erp5_jquery_plugin_formplugin/bt/revision
bt5/erp5_jquery_plugin_formplugin/bt/revision
+0
-1
bt5/erp5_jquery_plugin_formwizard/bt/revision
bt5/erp5_jquery_plugin_formwizard/bt/revision
+0
-1
bt5/erp5_jquery_plugin_hotkey/bt/revision
bt5/erp5_jquery_plugin_hotkey/bt/revision
+0
-1
bt5/erp5_jquery_plugin_jcarousel/bt/revision
bt5/erp5_jquery_plugin_jcarousel/bt/revision
+0
-1
bt5/erp5_jquery_plugin_jgraduate/bt/revision
bt5/erp5_jquery_plugin_jgraduate/bt/revision
+0
-1
bt5/erp5_jquery_plugin_jqchart/bt/revision
bt5/erp5_jquery_plugin_jqchart/bt/revision
+0
-1
bt5/erp5_jquery_plugin_jqgrid/bt/revision
bt5/erp5_jquery_plugin_jqgrid/bt/revision
+0
-1
bt5/erp5_jquery_plugin_jquerybbq/bt/revision
bt5/erp5_jquery_plugin_jquerybbq/bt/revision
+0
-1
bt5/erp5_jquery_plugin_jqzoom/bt/revision
bt5/erp5_jquery_plugin_jqzoom/bt/revision
+0
-1
bt5/erp5_jquery_plugin_json/bt/revision
bt5/erp5_jquery_plugin_json/bt/revision
+0
-1
bt5/erp5_jquery_plugin_jstorage/bt/revision
bt5/erp5_jquery_plugin_jstorage/bt/revision
+0
-1
bt5/erp5_jquery_plugin_lightbox/bt/revision
bt5/erp5_jquery_plugin_lightbox/bt/revision
+0
-1
bt5/erp5_jquery_plugin_mbmenu/bt/revision
bt5/erp5_jquery_plugin_mbmenu/bt/revision
+0
-1
bt5/erp5_jquery_plugin_qunit/bt/revision
bt5/erp5_jquery_plugin_qunit/bt/revision
+0
-1
bt5/erp5_jquery_plugin_renderjs/bt/revision
bt5/erp5_jquery_plugin_renderjs/bt/revision
+0
-1
bt5/erp5_jquery_plugin_scrollto/bt/revision
bt5/erp5_jquery_plugin_scrollto/bt/revision
+0
-1
bt5/erp5_jquery_plugin_selectbox/bt/revision
bt5/erp5_jquery_plugin_selectbox/bt/revision
+0
-1
bt5/erp5_jquery_plugin_sheet/bt/revision
bt5/erp5_jquery_plugin_sheet/bt/revision
+0
-1
bt5/erp5_jquery_plugin_spinbtn/bt/revision
bt5/erp5_jquery_plugin_spinbtn/bt/revision
+0
-1
bt5/erp5_jquery_plugin_svg_editor/bt/revision
bt5/erp5_jquery_plugin_svg_editor/bt/revision
+0
-1
bt5/erp5_jquery_plugin_svgicon/bt/revision
bt5/erp5_jquery_plugin_svgicon/bt/revision
+0
-1
bt5/erp5_jquery_plugin_urlparser/bt/revision
bt5/erp5_jquery_plugin_urlparser/bt/revision
+0
-1
bt5/erp5_jquery_plugin_validation/bt/revision
bt5/erp5_jquery_plugin_validation/bt/revision
+0
-1
bt5/erp5_jquery_plugin_wdcalendar/bt/revision
bt5/erp5_jquery_plugin_wdcalendar/bt/revision
+0
-1
bt5/erp5_jquery_sheet_editor/bt/revision
bt5/erp5_jquery_sheet_editor/bt/revision
+0
-1
bt5/erp5_jquery_ui/bt/revision
bt5/erp5_jquery_ui/bt/revision
+0
-1
bt5/erp5_json_style/bt/revision
bt5/erp5_json_style/bt/revision
+0
-1
bt5/erp5_km/bt/revision
bt5/erp5_km/bt/revision
+0
-1
bt5/erp5_km_sphinxse_full_text_search/bt/revision
bt5/erp5_km_sphinxse_full_text_search/bt/revision
+0
-1
bt5/erp5_km_ui_test/bt/revision
bt5/erp5_km_ui_test/bt/revision
+0
-1
bt5/erp5_km_ui_test_data/bt/revision
bt5/erp5_km_ui_test_data/bt/revision
+0
-1
bt5/erp5_knowledge_pad/bt/revision
bt5/erp5_knowledge_pad/bt/revision
+0
-1
bt5/erp5_knowledge_pad_ui_test/bt/revision
bt5/erp5_knowledge_pad_ui_test/bt/revision
+0
-1
bt5/erp5_l10n_fr/bt/revision
bt5/erp5_l10n_fr/bt/revision
+0
-1
bt5/erp5_l10n_ja/bt/revision
bt5/erp5_l10n_ja/bt/revision
+0
-1
bt5/erp5_l10n_ko/bt/revision
bt5/erp5_l10n_ko/bt/revision
+0
-1
bt5/erp5_l10n_pl_PL/bt/revision
bt5/erp5_l10n_pl_PL/bt/revision
+0
-1
bt5/erp5_l10n_pt-BR/bt/revision
bt5/erp5_l10n_pt-BR/bt/revision
+0
-1
bt5/erp5_l10n_ru/bt/revision
bt5/erp5_l10n_ru/bt/revision
+0
-1
bt5/erp5_l10n_zh/bt/revision
bt5/erp5_l10n_zh/bt/revision
+0
-1
bt5/erp5_ldap_catalog/bt/revision
bt5/erp5_ldap_catalog/bt/revision
+0
-1
bt5/erp5_log/bt/revision
bt5/erp5_log/bt/revision
+0
-1
bt5/erp5_mobile/bt/revision
bt5/erp5_mobile/bt/revision
+0
-1
bt5/erp5_mobile_ui_test/bt/revision
bt5/erp5_mobile_ui_test/bt/revision
+0
-1
bt5/erp5_movement_table_catalog/bt/revision
bt5/erp5_movement_table_catalog/bt/revision
+0
-1
bt5/erp5_mrp/bt/revision
bt5/erp5_mrp/bt/revision
+0
-1
bt5/erp5_oauth/bt/revision
bt5/erp5_oauth/bt/revision
+0
-1
bt5/erp5_ods_style/bt/revision
bt5/erp5_ods_style/bt/revision
+0
-1
bt5/erp5_odt_style/bt/revision
bt5/erp5_odt_style/bt/revision
+0
-1
bt5/erp5_ooo_import/bt/revision
bt5/erp5_ooo_import/bt/revision
+0
-1
bt5/erp5_open_trade/bt/revision
bt5/erp5_open_trade/bt/revision
+0
-1
bt5/erp5_open_trade_periodicity_line/bt/revision
bt5/erp5_open_trade_periodicity_line/bt/revision
+0
-1
bt5/erp5_payment_mean/bt/revision
bt5/erp5_payment_mean/bt/revision
+0
-1
bt5/erp5_paypal_secure_payment/bt/revision
bt5/erp5_paypal_secure_payment/bt/revision
+0
-1
bt5/erp5_payroll/bt/revision
bt5/erp5_payroll/bt/revision
+0
-1
bt5/erp5_payroll_l10n_fr/bt/revision
bt5/erp5_payroll_l10n_fr/bt/revision
+0
-1
bt5/erp5_payroll_ui_test/bt/revision
bt5/erp5_payroll_ui_test/bt/revision
+0
-1
bt5/erp5_payzen_secure_payment/bt/revision
bt5/erp5_payzen_secure_payment/bt/revision
+0
-1
bt5/erp5_pdf_editor/bt/revision
bt5/erp5_pdf_editor/bt/revision
+0
-1
bt5/erp5_pdf_merge/bt/revision
bt5/erp5_pdf_merge/bt/revision
+0
-1
bt5/erp5_pdm/bt/revision
bt5/erp5_pdm/bt/revision
+0
-1
bt5/erp5_pdm_ui_test/bt/revision
bt5/erp5_pdm_ui_test/bt/revision
+0
-1
bt5/erp5_periodicity_test/bt/revision
bt5/erp5_periodicity_test/bt/revision
+0
-1
bt5/erp5_popup_ui/bt/revision
bt5/erp5_popup_ui/bt/revision
+0
-1
bt5/erp5_printer/bt/revision
bt5/erp5_printer/bt/revision
+0
-1
bt5/erp5_project/bt/revision
bt5/erp5_project/bt/revision
+0
-1
bt5/erp5_project_mysql_innodb_catalog/bt/revision
bt5/erp5_project_mysql_innodb_catalog/bt/revision
+0
-1
bt5/erp5_project_ui_test/bt/revision
bt5/erp5_project_ui_test/bt/revision
+0
-1
bt5/erp5_promise/bt/revision
bt5/erp5_promise/bt/revision
+0
-1
bt5/erp5_public_accounting_budget/bt/revision
bt5/erp5_public_accounting_budget/bt/revision
+0
-1
bt5/erp5_publication/bt/revision
bt5/erp5_publication/bt/revision
+0
-1
bt5/erp5_registry_ohada/bt/revision
bt5/erp5_registry_ohada/bt/revision
+0
-1
bt5/erp5_registry_ohada_l10n_fr/bt/revision
bt5/erp5_registry_ohada_l10n_fr/bt/revision
+0
-1
bt5/erp5_research_item/bt/revision
bt5/erp5_research_item/bt/revision
+0
-1
bt5/erp5_rss_reader/bt/revision
bt5/erp5_rss_reader/bt/revision
+0
-1
bt5/erp5_rss_style/bt/revision
bt5/erp5_rss_style/bt/revision
+0
-1
bt5/erp5_run_my_doc/bt/revision
bt5/erp5_run_my_doc/bt/revision
+0
-1
bt5/erp5_run_my_doc_role/bt/revision
bt5/erp5_run_my_doc_role/bt/revision
+0
-1
bt5/erp5_safeimage/bt/revision
bt5/erp5_safeimage/bt/revision
+0
-1
bt5/erp5_scalability_data/bt/revision
bt5/erp5_scalability_data/bt/revision
+0
-1
bt5/erp5_secure_payment/bt/revision
bt5/erp5_secure_payment/bt/revision
+0
-1
bt5/erp5_security_uid_innodb_catalog/bt/revision
bt5/erp5_security_uid_innodb_catalog/bt/revision
+0
-1
bt5/erp5_short_message/bt/revision
bt5/erp5_short_message/bt/revision
+0
-1
bt5/erp5_simplified_invoicing/bt/revision
bt5/erp5_simplified_invoicing/bt/revision
+0
-1
bt5/erp5_simulation/bt/revision
bt5/erp5_simulation/bt/revision
+0
-1
bt5/erp5_simulation_performance_test/bt/revision
bt5/erp5_simulation_performance_test/bt/revision
+0
-1
bt5/erp5_simulation_test/bt/revision
bt5/erp5_simulation_test/bt/revision
+0
-1
bt5/erp5_slideshow_style/bt/revision
bt5/erp5_slideshow_style/bt/revision
+0
-1
bt5/erp5_social_contracts/bt/revision
bt5/erp5_social_contracts/bt/revision
+0
-1
bt5/erp5_software_pdm/bt/revision
bt5/erp5_software_pdm/bt/revision
+0
-1
bt5/erp5_sso_openam/bt/revision
bt5/erp5_sso_openam/bt/revision
+0
-1
bt5/erp5_stock_cache/bt/revision
bt5/erp5_stock_cache/bt/revision
+0
-1
bt5/erp5_svg_editor/bt/revision
bt5/erp5_svg_editor/bt/revision
+0
-1
bt5/erp5_syncml/bt/revision
bt5/erp5_syncml/bt/revision
+0
-1
bt5/erp5_syncml_test_data/bt/revision
bt5/erp5_syncml_test_data/bt/revision
+0
-1
bt5/erp5_system_event/bt/revision
bt5/erp5_system_event/bt/revision
+0
-1
bt5/erp5_tax_resource/bt/revision
bt5/erp5_tax_resource/bt/revision
+0
-1
bt5/erp5_test_result/bt/revision
bt5/erp5_test_result/bt/revision
+0
-1
bt5/erp5_tiosafe_accounting/bt/revision
bt5/erp5_tiosafe_accounting/bt/revision
+0
-1
bt5/erp5_tiosafe_core/bt/revision
bt5/erp5_tiosafe_core/bt/revision
+0
-1
bt5/erp5_tiosafe_document/bt/revision
bt5/erp5_tiosafe_document/bt/revision
+0
-1
bt5/erp5_tiosafe_document_cic/bt/revision
bt5/erp5_tiosafe_document_cic/bt/revision
+0
-1
bt5/erp5_tiosafe_document_cyberplus/bt/revision
bt5/erp5_tiosafe_document_cyberplus/bt/revision
+0
-1
bt5/erp5_tiosafe_document_paybox/bt/revision
bt5/erp5_tiosafe_document_paybox/bt/revision
+0
-1
bt5/erp5_tiosafe_document_paypal/bt/revision
bt5/erp5_tiosafe_document_paypal/bt/revision
+0
-1
bt5/erp5_tiosafe_magento/bt/revision
bt5/erp5_tiosafe_magento/bt/revision
+0
-1
bt5/erp5_tiosafe_magento_test/bt/revision
bt5/erp5_tiosafe_magento_test/bt/revision
+0
-1
bt5/erp5_tiosafe_oscommerce/bt/revision
bt5/erp5_tiosafe_oscommerce/bt/revision
+0
-1
bt5/erp5_tiosafe_oxatis/bt/revision
bt5/erp5_tiosafe_oxatis/bt/revision
+0
-1
bt5/erp5_tiosafe_oxatis_test/bt/revision
bt5/erp5_tiosafe_oxatis_test/bt/revision
+0
-1
bt5/erp5_tiosafe_pdm/bt/revision
bt5/erp5_tiosafe_pdm/bt/revision
+0
-1
bt5/erp5_tiosafe_prestashop/bt/revision
bt5/erp5_tiosafe_prestashop/bt/revision
+0
-1
bt5/erp5_tiosafe_salesforce/bt/revision
bt5/erp5_tiosafe_salesforce/bt/revision
+0
-1
bt5/erp5_tiosafe_test/bt/revision
bt5/erp5_tiosafe_test/bt/revision
+0
-1
bt5/erp5_tiosafe_ubercart/bt/revision
bt5/erp5_tiosafe_ubercart/bt/revision
+0
-1
bt5/erp5_tiosafe_ubercart_test/bt/revision
bt5/erp5_tiosafe_ubercart_test/bt/revision
+0
-1
bt5/erp5_tiosafe_virtuemart/bt/revision
bt5/erp5_tiosafe_virtuemart/bt/revision
+0
-1
bt5/erp5_tiosafe_virtuemart_test/bt/revision
bt5/erp5_tiosafe_virtuemart_test/bt/revision
+0
-1
bt5/erp5_tiosafe_zencart/bt/revision
bt5/erp5_tiosafe_zencart/bt/revision
+0
-1
bt5/erp5_trade/bt/revision
bt5/erp5_trade/bt/revision
+0
-1
bt5/erp5_trade_knowledge_pad/bt/revision
bt5/erp5_trade_knowledge_pad/bt/revision
+0
-1
bt5/erp5_trade_proxy_field_legacy/bt/revision
bt5/erp5_trade_proxy_field_legacy/bt/revision
+0
-1
bt5/erp5_trade_ui_test/bt/revision
bt5/erp5_trade_ui_test/bt/revision
+0
-1
bt5/erp5_ui_test/bt/revision
bt5/erp5_ui_test/bt/revision
+0
-1
bt5/erp5_ui_test_core/bt/revision
bt5/erp5_ui_test_core/bt/revision
+0
-1
bt5/erp5_upgrader/bt/revision
bt5/erp5_upgrader/bt/revision
+0
-1
bt5/erp5_upgrader_test/bt/revision
bt5/erp5_upgrader_test/bt/revision
+0
-1
bt5/erp5_user_tutorial/bt/revision
bt5/erp5_user_tutorial/bt/revision
+0
-1
bt5/erp5_user_tutorial_ui_test/bt/revision
bt5/erp5_user_tutorial_ui_test/bt/revision
+0
-1
bt5/erp5_utils/bt/revision
bt5/erp5_utils/bt/revision
+0
-1
bt5/erp5_video/bt/revision
bt5/erp5_video/bt/revision
+0
-1
bt5/erp5_web/bt/revision
bt5/erp5_web/bt/revision
+0
-1
bt5/erp5_web_blog/bt/revision
bt5/erp5_web_blog/bt/revision
+0
-1
bt5/erp5_web_download_theme/bt/revision
bt5/erp5_web_download_theme/bt/revision
+0
-1
bt5/erp5_web_multiflex5_theme/bt/revision
bt5/erp5_web_multiflex5_theme/bt/revision
+0
-1
bt5/erp5_web_renderjs_ui/bt/revision
bt5/erp5_web_renderjs_ui/bt/revision
+0
-1
bt5/erp5_web_service/bt/revision
bt5/erp5_web_service/bt/revision
+0
-1
bt5/erp5_web_shacache/bt/revision
bt5/erp5_web_shacache/bt/revision
+0
-1
bt5/erp5_web_shadir/bt/revision
bt5/erp5_web_shadir/bt/revision
+0
-1
bt5/erp5_web_ui_test/bt/revision
bt5/erp5_web_ui_test/bt/revision
+0
-1
bt5/erp5_web_ung_core/bt/revision
bt5/erp5_web_ung_core/bt/revision
+0
-1
bt5/erp5_web_ung_role/bt/revision
bt5/erp5_web_ung_role/bt/revision
+0
-1
bt5/erp5_web_ung_theme/bt/revision
bt5/erp5_web_ung_theme/bt/revision
+0
-1
bt5/erp5_web_ung_ui_test/bt/revision
bt5/erp5_web_ung_ui_test/bt/revision
+0
-1
bt5/erp5_wizard/bt/revision
bt5/erp5_wizard/bt/revision
+0
-1
bt5/erp5_workflow/bt/revision
bt5/erp5_workflow/bt/revision
+0
-1
bt5/erp5_worklist_sql/bt/revision
bt5/erp5_worklist_sql/bt/revision
+0
-1
bt5/erp5_xhtml_gadget_style/bt/revision
bt5/erp5_xhtml_gadget_style/bt/revision
+0
-1
bt5/erp5_xinha_editor/bt/revision
bt5/erp5_xinha_editor/bt/revision
+0
-1
bt5/networkcache_erp5/bt/revision
bt5/networkcache_erp5/bt/revision
+0
-1
bt5/test_accounting/bt/revision
bt5/test_accounting/bt/revision
+0
-1
bt5/test_accounting_fr/bt/revision
bt5/test_accounting_fr/bt/revision
+0
-1
bt5/test_accounting_in/bt/revision
bt5/test_accounting_in/bt/revision
+0
-1
bt5/test_accounting_pl/bt/revision
bt5/test_accounting_pl/bt/revision
+0
-1
bt5/test_conflict_resolution/bt/revision
bt5/test_conflict_resolution/bt/revision
+0
-1
bt5/test_core/bt/revision
bt5/test_core/bt/revision
+0
-1
bt5/test_html_style/bt/revision
bt5/test_html_style/bt/revision
+0
-1
bt5/test_web/bt/revision
bt5/test_web/bt/revision
+0
-1
bt5/test_xhtml_style/bt/revision
bt5/test_xhtml_style/bt/revision
+0
-1
bt5/tiolive_base/bt/revision
bt5/tiolive_base/bt/revision
+0
-1
bt5/tiolive_decouple_instance/bt/revision
bt5/tiolive_decouple_instance/bt/revision
+0
-1
product/ERP5/Document/BusinessTemplate.py
product/ERP5/Document/BusinessTemplate.py
+129
-160
product/ERP5/Tool/TemplateTool.py
product/ERP5/Tool/TemplateTool.py
+78
-212
product/ERP5/bin/genbt5list
product/ERP5/bin/genbt5list
+165
-95
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BusinessTemplate_view.xml
...lateItem/portal_skins/erp5_core/BusinessTemplate_view.xml
+1
-1
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BusinessTemplate_view/my_revision.xml
...tal_skins/erp5_core/BusinessTemplate_view/my_revision.xml
+0
-260
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BusinessTemplate_view/my_short_revision.xml
...ins/erp5_core/BusinessTemplate_view/my_short_revision.xml
+106
-0
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TemplateTool_viewBusinessTemplateList/listbox.xml
...p5_core/TemplateTool_viewBusinessTemplateList/listbox.xml
+1
-1
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TemplateTool_viewInstallRepositoryBusinessTemplateListDialog/listbox.xml
...ewInstallRepositoryBusinessTemplateListDialog/listbox.xml
+1
-1
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TemplateTool_viewUpgradeRepositoryBusinessTemplateListDialog/listbox.xml
...ewUpgradeRepositoryBusinessTemplateListDialog/listbox.xml
+4
-8
product/ERP5/bootstrap/erp5_core/bt/revision
product/ERP5/bootstrap/erp5_core/bt/revision
+0
-1
product/ERP5/bootstrap/erp5_jquery/bt/revision
product/ERP5/bootstrap/erp5_jquery/bt/revision
+0
-1
product/ERP5/bootstrap/erp5_mysql_innodb_catalog/bt/revision
product/ERP5/bootstrap/erp5_mysql_innodb_catalog/bt/revision
+0
-1
product/ERP5/bootstrap/erp5_mysql_ndb_catalog/bt/revision
product/ERP5/bootstrap/erp5_mysql_ndb_catalog/bt/revision
+0
-1
product/ERP5/bootstrap/erp5_property_sheets/bt/revision
product/ERP5/bootstrap/erp5_property_sheets/bt/revision
+0
-1
product/ERP5/bootstrap/erp5_xhtml_style/bt/revision
product/ERP5/bootstrap/erp5_xhtml_style/bt/revision
+0
-1
product/ERP5/genbt5list.py
product/ERP5/genbt5list.py
+1
-0
product/ERP5/tests/testBusinessTemplate.py
product/ERP5/tests/testBusinessTemplate.py
+0
-38
product/ERP5/tests/testTemplateTool.py
product/ERP5/tests/testTemplateTool.py
+74
-94
product/ERP5/tests/test_data/test_167_InstanceAndRelatedClassDefinedInSameBT/bt/revision
...st_167_InstanceAndRelatedClassDefinedInSameBT/bt/revision
+0
-1
product/ERP5Type/tests/ERP5TypeTestCase.py
product/ERP5Type/tests/ERP5TypeTestCase.py
+9
-37
product/ERP5VCS/Git.py
product/ERP5VCS/Git.py
+5
-0
product/ERP5VCS/Subversion.py
product/ERP5VCS/Subversion.py
+17
-4
product/ERP5VCS/WorkingCopy.py
product/ERP5VCS/WorkingCopy.py
+16
-23
No files found.
bt5/cloudooo_data/bt/revision
deleted
100644 → 0
View file @
c727c78a
10
\ No newline at end of file
bt5/cloudooo_web/bt/revision
deleted
100644 → 0
View file @
c727c78a
7
\ No newline at end of file
bt5/erp5_access_token/bt/revision
deleted
100644 → 0
View file @
c727c78a
7
\ No newline at end of file
bt5/erp5_accounting/bt/revision
deleted
100644 → 0
View file @
c727c78a
1581
\ No newline at end of file
bt5/erp5_accounting_l10n_br_extend/bt/revision
deleted
100644 → 0
View file @
c727c78a
22
\ No newline at end of file
bt5/erp5_accounting_l10n_br_sme/bt/revision
deleted
100644 → 0
View file @
c727c78a
18
\ No newline at end of file
bt5/erp5_accounting_l10n_cn_basic/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_accounting_l10n_de_skr04/bt/revision
deleted
100644 → 0
View file @
c727c78a
5
\ No newline at end of file
bt5/erp5_accounting_l10n_fr/bt/revision
deleted
100644 → 0
View file @
c727c78a
34
bt5/erp5_accounting_l10n_fr_m14/bt/revision
deleted
100644 → 0
View file @
c727c78a
8
\ No newline at end of file
bt5/erp5_accounting_l10n_fr_m4/bt/revision
deleted
100644 → 0
View file @
c727c78a
19
\ No newline at end of file
bt5/erp5_accounting_l10n_fr_pca/bt/revision
deleted
100644 → 0
View file @
c727c78a
10
\ No newline at end of file
bt5/erp5_accounting_l10n_ifrs/bt/revision
deleted
100644 → 0
View file @
c727c78a
11
\ No newline at end of file
bt5/erp5_accounting_l10n_in/bt/revision
deleted
100644 → 0
View file @
c727c78a
21
\ No newline at end of file
bt5/erp5_accounting_l10n_lu/bt/revision
deleted
100644 → 0
View file @
c727c78a
17
\ No newline at end of file
bt5/erp5_accounting_l10n_mt/bt/revision
deleted
100644 → 0
View file @
c727c78a
21
\ No newline at end of file
bt5/erp5_accounting_l10n_pl/bt/revision
deleted
100644 → 0
View file @
c727c78a
59
\ No newline at end of file
bt5/erp5_accounting_l10n_pl_default_gap/bt/revision
deleted
100644 → 0
View file @
c727c78a
25
\ No newline at end of file
bt5/erp5_accounting_l10n_ru/bt/revision
deleted
100644 → 0
View file @
c727c78a
1
\ No newline at end of file
bt5/erp5_accounting_l10n_sn/bt/revision
deleted
100644 → 0
View file @
c727c78a
11
\ No newline at end of file
bt5/erp5_accounting_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
202
\ No newline at end of file
bt5/erp5_ace_editor/bt/revision
deleted
100644 → 0
View file @
c727c78a
22
\ No newline at end of file
bt5/erp5_administration/bt/revision
deleted
100644 → 0
View file @
c727c78a
167
bt5/erp5_advanced_invoicing/bt/revision
deleted
100644 → 0
View file @
c727c78a
110
\ No newline at end of file
bt5/erp5_apparel/bt/revision
deleted
100644 → 0
View file @
c727c78a
280
\ No newline at end of file
bt5/erp5_archive/bt/revision
deleted
100644 → 0
View file @
c727c78a
98
\ No newline at end of file
bt5/erp5_authentication_policy/bt/revision
deleted
100644 → 0
View file @
c727c78a
24
\ No newline at end of file
bt5/erp5_auto_logout/bt/revision
deleted
100644 → 0
View file @
c727c78a
12
\ No newline at end of file
bt5/erp5_autocompletion_ui/bt/revision
deleted
100644 → 0
View file @
c727c78a
20
\ No newline at end of file
bt5/erp5_banking_cash/bt/revision
deleted
100644 → 0
View file @
c727c78a
709
\ No newline at end of file
bt5/erp5_banking_check/bt/revision
deleted
100644 → 0
View file @
c727c78a
503
\ No newline at end of file
bt5/erp5_banking_core/bt/revision
deleted
100644 → 0
View file @
c727c78a
591
\ No newline at end of file
bt5/erp5_banking_inventory/bt/revision
deleted
100644 → 0
View file @
c727c78a
32
\ No newline at end of file
bt5/erp5_barcode/bt/revision
deleted
100644 → 0
View file @
c727c78a
25
\ No newline at end of file
bt5/erp5_base/bt/revision
deleted
100644 → 0
View file @
c727c78a
1069
bt5/erp5_bearer_token/bt/revision
deleted
100644 → 0
View file @
c727c78a
14
\ No newline at end of file
bt5/erp5_bespin/bt/revision
deleted
100644 → 0
View file @
c727c78a
15
\ No newline at end of file
bt5/erp5_big_file/bt/revision
deleted
100644 → 0
View file @
c727c78a
1
\ No newline at end of file
bt5/erp5_budget/bt/revision
deleted
100644 → 0
View file @
c727c78a
380
\ No newline at end of file
bt5/erp5_calendar/bt/revision
deleted
100644 → 0
View file @
c727c78a
392
\ No newline at end of file
bt5/erp5_certificate_authority/bt/revision
deleted
100644 → 0
View file @
c727c78a
5
\ No newline at end of file
bt5/erp5_code_mirror/bt/revision
deleted
100644 → 0
View file @
c727c78a
1
\ No newline at end of file
bt5/erp5_commerce/bt/revision
deleted
100644 → 0
View file @
c727c78a
290
bt5/erp5_computer_immobilisation/bt/revision
deleted
100644 → 0
View file @
c727c78a
60
\ No newline at end of file
bt5/erp5_configurator/bt/revision
deleted
100644 → 0
View file @
c727c78a
552
\ No newline at end of file
bt5/erp5_configurator_maxma_demo/bt/revision
deleted
100644 → 0
View file @
c727c78a
31
\ No newline at end of file
bt5/erp5_configurator_run_my_doc/bt/revision
deleted
100644 → 0
View file @
c727c78a
13
\ No newline at end of file
bt5/erp5_configurator_standard/bt/revision
deleted
100644 → 0
View file @
c727c78a
671
\ No newline at end of file
bt5/erp5_configurator_standard_accounting_template/bt/revision
deleted
100644 → 0
View file @
c727c78a
1
\ No newline at end of file
bt5/erp5_configurator_standard_categories/bt/revision
deleted
100644 → 0
View file @
c727c78a
90
\ No newline at end of file
bt5/erp5_configurator_standard_invoicing_template/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_configurator_standard_solver/bt/revision
deleted
100644 → 0
View file @
c727c78a
5
\ No newline at end of file
bt5/erp5_configurator_standard_trade_template/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_configurator_standard_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
682
\ No newline at end of file
bt5/erp5_configurator_ung/bt/revision
deleted
100644 → 0
View file @
c727c78a
63
\ No newline at end of file
bt5/erp5_consulting/bt/revision
deleted
100644 → 0
View file @
c727c78a
65
\ No newline at end of file
bt5/erp5_content_translation/bt/revision
deleted
100644 → 0
View file @
c727c78a
48
\ No newline at end of file
bt5/erp5_core_proxy_field_legacy/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
\ No newline at end of file
bt5/erp5_credential/bt/revision
deleted
100644 → 0
View file @
c727c78a
438
\ No newline at end of file
bt5/erp5_credential_oauth2/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_crm/bt/revision
deleted
100644 → 0
View file @
c727c78a
705
\ No newline at end of file
bt5/erp5_crm_knowledge_pad/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
\ No newline at end of file
bt5/erp5_csv_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
17
\ No newline at end of file
bt5/erp5_data_protection/bt/revision
deleted
100644 → 0
View file @
c727c78a
45
\ No newline at end of file
bt5/erp5_data_set/bt/revision
deleted
100644 → 0
View file @
c727c78a
11
\ No newline at end of file
bt5/erp5_deferred_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
111
\ No newline at end of file
bt5/erp5_demo_maxma_rule/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
\ No newline at end of file
bt5/erp5_demo_maxma_sample/bt/revision
deleted
100644 → 0
View file @
c727c78a
22
\ No newline at end of file
bt5/erp5_demo_smb/bt/revision
deleted
100644 → 0
View file @
c727c78a
27
\ No newline at end of file
bt5/erp5_demo_ung/bt/revision
deleted
100644 → 0
View file @
c727c78a
16
\ No newline at end of file
bt5/erp5_development_wizard/bt/revision
deleted
100644 → 0
View file @
c727c78a
75
\ No newline at end of file
bt5/erp5_dhtml_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
14
\ No newline at end of file
bt5/erp5_dhtml_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
625
\ No newline at end of file
bt5/erp5_direct_debit_payment/bt/revision
deleted
100644 → 0
View file @
c727c78a
11
\ No newline at end of file
bt5/erp5_discount_resource/bt/revision
deleted
100644 → 0
View file @
c727c78a
18
\ No newline at end of file
bt5/erp5_discussion/bt/revision
deleted
100644 → 0
View file @
c727c78a
153
\ No newline at end of file
bt5/erp5_dms/bt/revision
deleted
100644 → 0
View file @
c727c78a
1283
\ No newline at end of file
bt5/erp5_dms_conversion_catalog/bt/revision
deleted
100644 → 0
View file @
c727c78a
25
\ No newline at end of file
bt5/erp5_dms_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
30
\ No newline at end of file
bt5/erp5_dummy_movement/bt/revision
deleted
100644 → 0
View file @
c727c78a
24
\ No newline at end of file
bt5/erp5_egov/bt/revision
deleted
100644 → 0
View file @
c727c78a
766
\ No newline at end of file
bt5/erp5_egov_l10n_fr/bt/revision
deleted
100644 → 0
View file @
c727c78a
15
\ No newline at end of file
bt5/erp5_egov_mysql_innodb_catalog/bt/revision
deleted
100644 → 0
View file @
c727c78a
36
\ No newline at end of file
bt5/erp5_email_reader/bt/revision
deleted
100644 → 0
View file @
c727c78a
34
\ No newline at end of file
bt5/erp5_external_account/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_forge/bt/revision
deleted
100644 → 0
View file @
c727c78a
681
\ No newline at end of file
bt5/erp5_forum_tutorial/bt/revision
deleted
100644 → 0
View file @
c727c78a
10
\ No newline at end of file
bt5/erp5_full_text_mroonga_catalog/bt/revision
deleted
100644 → 0
View file @
c727c78a
8
\ No newline at end of file
bt5/erp5_full_text_myisam_catalog/bt/revision
deleted
100644 → 0
View file @
c727c78a
10
\ No newline at end of file
bt5/erp5_full_text_sphinxse_catalog/bt/revision
deleted
100644 → 0
View file @
c727c78a
24
\ No newline at end of file
bt5/erp5_hal_json_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
27
\ No newline at end of file
bt5/erp5_hr/bt/revision
deleted
100644 → 0
View file @
c727c78a
19
\ No newline at end of file
bt5/erp5_ical_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
24
\ No newline at end of file
bt5/erp5_immobilisation/bt/revision
deleted
100644 → 0
View file @
c727c78a
185
\ No newline at end of file
bt5/erp5_ingestion/bt/revision
deleted
100644 → 0
View file @
c727c78a
154
\ No newline at end of file
bt5/erp5_ingestion_mysql_innodb_catalog/bt/revision
deleted
100644 → 0
View file @
c727c78a
29
\ No newline at end of file
bt5/erp5_inotify/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
\ No newline at end of file
bt5/erp5_interfaces/bt/revision
deleted
100644 → 0
View file @
c727c78a
5
\ No newline at end of file
bt5/erp5_invoicing/bt/revision
deleted
100644 → 0
View file @
c727c78a
396
\ No newline at end of file
bt5/erp5_item/bt/revision
deleted
100644 → 0
View file @
c727c78a
294
\ No newline at end of file
bt5/erp5_javascript_openlayers/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_jio/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_legacy/bt/revision
deleted
100644 → 0
View file @
c727c78a
20
\ No newline at end of file
bt5/erp5_jquery_plugin_bbq/bt/revision
deleted
100644 → 0
View file @
c727c78a
5
\ No newline at end of file
bt5/erp5_jquery_plugin_colorpicker/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_plugin_cookie/bt/revision
deleted
100644 → 0
View file @
c727c78a
1
\ No newline at end of file
bt5/erp5_jquery_plugin_elastic/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_plugin_formplugin/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_jquery_plugin_formwizard/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_jquery_plugin_hotkey/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_plugin_jcarousel/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
\ No newline at end of file
bt5/erp5_jquery_plugin_jgraduate/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_plugin_jqchart/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_plugin_jqgrid/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_plugin_jquerybbq/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_plugin_jqzoom/bt/revision
deleted
100644 → 0
View file @
c727c78a
1
\ No newline at end of file
bt5/erp5_jquery_plugin_json/bt/revision
deleted
100644 → 0
View file @
c727c78a
1
\ No newline at end of file
bt5/erp5_jquery_plugin_jstorage/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
\ No newline at end of file
bt5/erp5_jquery_plugin_lightbox/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
\ No newline at end of file
bt5/erp5_jquery_plugin_mbmenu/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_plugin_qunit/bt/revision
deleted
100644 → 0
View file @
c727c78a
1
\ No newline at end of file
bt5/erp5_jquery_plugin_renderjs/bt/revision
deleted
100644 → 0
View file @
c727c78a
24
\ No newline at end of file
bt5/erp5_jquery_plugin_scrollto/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_plugin_selectbox/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_plugin_sheet/bt/revision
deleted
100644 → 0
View file @
c727c78a
10
\ No newline at end of file
bt5/erp5_jquery_plugin_spinbtn/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_plugin_svg_editor/bt/revision
deleted
100644 → 0
View file @
c727c78a
10
\ No newline at end of file
bt5/erp5_jquery_plugin_svgicon/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_jquery_plugin_urlparser/bt/revision
deleted
100644 → 0
View file @
c727c78a
1
\ No newline at end of file
bt5/erp5_jquery_plugin_validation/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
\ No newline at end of file
bt5/erp5_jquery_plugin_wdcalendar/bt/revision
deleted
100644 → 0
View file @
c727c78a
14
\ No newline at end of file
bt5/erp5_jquery_sheet_editor/bt/revision
deleted
100644 → 0
View file @
c727c78a
39
\ No newline at end of file
bt5/erp5_jquery_ui/bt/revision
deleted
100644 → 0
View file @
c727c78a
23
\ No newline at end of file
bt5/erp5_json_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_km/bt/revision
deleted
100644 → 0
View file @
c727c78a
1885
\ No newline at end of file
bt5/erp5_km_sphinxse_full_text_search/bt/revision
deleted
100644 → 0
View file @
c727c78a
16
\ No newline at end of file
bt5/erp5_km_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
170
\ No newline at end of file
bt5/erp5_km_ui_test_data/bt/revision
deleted
100644 → 0
View file @
c727c78a
10
\ No newline at end of file
bt5/erp5_knowledge_pad/bt/revision
deleted
100644 → 0
View file @
c727c78a
768
\ No newline at end of file
bt5/erp5_knowledge_pad_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
32
\ No newline at end of file
bt5/erp5_l10n_fr/bt/revision
deleted
100644 → 0
View file @
c727c78a
213
bt5/erp5_l10n_ja/bt/revision
deleted
100644 → 0
View file @
c727c78a
42
\ No newline at end of file
bt5/erp5_l10n_ko/bt/revision
deleted
100644 → 0
View file @
c727c78a
20
\ No newline at end of file
bt5/erp5_l10n_pl_PL/bt/revision
deleted
100644 → 0
View file @
c727c78a
41
\ No newline at end of file
bt5/erp5_l10n_pt-BR/bt/revision
deleted
100644 → 0
View file @
c727c78a
36
\ No newline at end of file
bt5/erp5_l10n_ru/bt/revision
deleted
100644 → 0
View file @
c727c78a
7
\ No newline at end of file
bt5/erp5_l10n_zh/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
bt5/erp5_ldap_catalog/bt/revision
deleted
100644 → 0
View file @
c727c78a
11
\ No newline at end of file
bt5/erp5_log/bt/revision
deleted
100644 → 0
View file @
c727c78a
1
\ No newline at end of file
bt5/erp5_mobile/bt/revision
deleted
100644 → 0
View file @
c727c78a
72
\ No newline at end of file
bt5/erp5_mobile_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
13
\ No newline at end of file
bt5/erp5_movement_table_catalog/bt/revision
deleted
100644 → 0
View file @
c727c78a
5
\ No newline at end of file
bt5/erp5_mrp/bt/revision
deleted
100644 → 0
View file @
c727c78a
481
\ No newline at end of file
bt5/erp5_oauth/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
\ No newline at end of file
bt5/erp5_ods_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
260
\ No newline at end of file
bt5/erp5_odt_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
123
\ No newline at end of file
bt5/erp5_ooo_import/bt/revision
deleted
100644 → 0
View file @
c727c78a
416
\ No newline at end of file
bt5/erp5_open_trade/bt/revision
deleted
100644 → 0
View file @
c727c78a
112
\ No newline at end of file
bt5/erp5_open_trade_periodicity_line/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_payment_mean/bt/revision
deleted
100644 → 0
View file @
c727c78a
29
\ No newline at end of file
bt5/erp5_paypal_secure_payment/bt/revision
deleted
100644 → 0
View file @
c727c78a
11
\ No newline at end of file
bt5/erp5_payroll/bt/revision
deleted
100644 → 0
View file @
c727c78a
595
\ No newline at end of file
bt5/erp5_payroll_l10n_fr/bt/revision
deleted
100644 → 0
View file @
c727c78a
142
\ No newline at end of file
bt5/erp5_payroll_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
18
\ No newline at end of file
bt5/erp5_payzen_secure_payment/bt/revision
deleted
100644 → 0
View file @
c727c78a
53
\ No newline at end of file
bt5/erp5_pdf_editor/bt/revision
deleted
100644 → 0
View file @
c727c78a
36
\ No newline at end of file
bt5/erp5_pdf_merge/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
\ No newline at end of file
bt5/erp5_pdm/bt/revision
deleted
100644 → 0
View file @
c727c78a
582
\ No newline at end of file
bt5/erp5_pdm_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
35
\ No newline at end of file
bt5/erp5_periodicity_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_popup_ui/bt/revision
deleted
100644 → 0
View file @
c727c78a
24
\ No newline at end of file
bt5/erp5_printer/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
\ No newline at end of file
bt5/erp5_project/bt/revision
deleted
100644 → 0
View file @
c727c78a
838
\ No newline at end of file
bt5/erp5_project_mysql_innodb_catalog/bt/revision
deleted
100644 → 0
View file @
c727c78a
23
\ No newline at end of file
bt5/erp5_project_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
11
\ No newline at end of file
bt5/erp5_promise/bt/revision
deleted
100644 → 0
View file @
c727c78a
28
\ No newline at end of file
bt5/erp5_public_accounting_budget/bt/revision
deleted
100644 → 0
View file @
c727c78a
11
\ No newline at end of file
bt5/erp5_publication/bt/revision
deleted
100644 → 0
View file @
c727c78a
12
\ No newline at end of file
bt5/erp5_registry_ohada/bt/revision
deleted
100644 → 0
View file @
c727c78a
943
\ No newline at end of file
bt5/erp5_registry_ohada_l10n_fr/bt/revision
deleted
100644 → 0
View file @
c727c78a
8
\ No newline at end of file
bt5/erp5_research_item/bt/revision
deleted
100644 → 0
View file @
c727c78a
9
\ No newline at end of file
bt5/erp5_rss_reader/bt/revision
deleted
100644 → 0
View file @
c727c78a
223
\ No newline at end of file
bt5/erp5_rss_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
55
\ No newline at end of file
bt5/erp5_run_my_doc/bt/revision
deleted
100644 → 0
View file @
c727c78a
70
\ No newline at end of file
bt5/erp5_run_my_doc_role/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
\ No newline at end of file
bt5/erp5_safeimage/bt/revision
deleted
100644 → 0
View file @
c727c78a
18
\ No newline at end of file
bt5/erp5_scalability_data/bt/revision
deleted
100644 → 0
View file @
c727c78a
23
\ No newline at end of file
bt5/erp5_secure_payment/bt/revision
deleted
100644 → 0
View file @
c727c78a
16
\ No newline at end of file
bt5/erp5_security_uid_innodb_catalog/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_short_message/bt/revision
deleted
100644 → 0
View file @
c727c78a
14
\ No newline at end of file
bt5/erp5_simplified_invoicing/bt/revision
deleted
100644 → 0
View file @
c727c78a
58
\ No newline at end of file
bt5/erp5_simulation/bt/revision
deleted
100644 → 0
View file @
c727c78a
177
\ No newline at end of file
bt5/erp5_simulation_performance_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
25
\ No newline at end of file
bt5/erp5_simulation_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
39
\ No newline at end of file
bt5/erp5_slideshow_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_social_contracts/bt/revision
deleted
100644 → 0
View file @
c727c78a
30
\ No newline at end of file
bt5/erp5_software_pdm/bt/revision
deleted
100644 → 0
View file @
c727c78a
95
\ No newline at end of file
bt5/erp5_sso_openam/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
\ No newline at end of file
bt5/erp5_stock_cache/bt/revision
deleted
100644 → 0
View file @
c727c78a
14
\ No newline at end of file
bt5/erp5_svg_editor/bt/revision
deleted
100644 → 0
View file @
c727c78a
31
\ No newline at end of file
bt5/erp5_syncml/bt/revision
deleted
100644 → 0
View file @
c727c78a
122
\ No newline at end of file
bt5/erp5_syncml_test_data/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
bt5/erp5_system_event/bt/revision
deleted
100644 → 0
View file @
c727c78a
7
\ No newline at end of file
bt5/erp5_tax_resource/bt/revision
deleted
100644 → 0
View file @
c727c78a
17
\ No newline at end of file
bt5/erp5_test_result/bt/revision
deleted
100644 → 0
View file @
c727c78a
269
\ No newline at end of file
bt5/erp5_tiosafe_accounting/bt/revision
deleted
100644 → 0
View file @
c727c78a
167
\ No newline at end of file
bt5/erp5_tiosafe_core/bt/revision
deleted
100644 → 0
View file @
c727c78a
639
\ No newline at end of file
bt5/erp5_tiosafe_document/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_tiosafe_document_cic/bt/revision
deleted
100644 → 0
View file @
c727c78a
24
\ No newline at end of file
bt5/erp5_tiosafe_document_cyberplus/bt/revision
deleted
100644 → 0
View file @
c727c78a
25
\ No newline at end of file
bt5/erp5_tiosafe_document_paybox/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
\ No newline at end of file
bt5/erp5_tiosafe_document_paypal/bt/revision
deleted
100644 → 0
View file @
c727c78a
3
\ No newline at end of file
bt5/erp5_tiosafe_magento/bt/revision
deleted
100644 → 0
View file @
c727c78a
292
\ No newline at end of file
bt5/erp5_tiosafe_magento_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
292
\ No newline at end of file
bt5/erp5_tiosafe_oscommerce/bt/revision
deleted
100644 → 0
View file @
c727c78a
293
\ No newline at end of file
bt5/erp5_tiosafe_oxatis/bt/revision
deleted
100644 → 0
View file @
c727c78a
96
\ No newline at end of file
bt5/erp5_tiosafe_oxatis_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
74
\ No newline at end of file
bt5/erp5_tiosafe_pdm/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
\ No newline at end of file
bt5/erp5_tiosafe_prestashop/bt/revision
deleted
100644 → 0
View file @
c727c78a
335
\ No newline at end of file
bt5/erp5_tiosafe_salesforce/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
\ No newline at end of file
bt5/erp5_tiosafe_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
400
\ No newline at end of file
bt5/erp5_tiosafe_ubercart/bt/revision
deleted
100644 → 0
View file @
c727c78a
33
\ No newline at end of file
bt5/erp5_tiosafe_ubercart_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
34
\ No newline at end of file
bt5/erp5_tiosafe_virtuemart/bt/revision
deleted
100644 → 0
View file @
c727c78a
40
\ No newline at end of file
bt5/erp5_tiosafe_virtuemart_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
21
\ No newline at end of file
bt5/erp5_tiosafe_zencart/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_trade/bt/revision
deleted
100644 → 0
View file @
c727c78a
1184
bt5/erp5_trade_knowledge_pad/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_trade_proxy_field_legacy/bt/revision
deleted
100644 → 0
View file @
c727c78a
19
\ No newline at end of file
bt5/erp5_trade_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
\ No newline at end of file
bt5/erp5_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
722
bt5/erp5_ui_test_core/bt/revision
deleted
100644 → 0
View file @
c727c78a
67
\ No newline at end of file
bt5/erp5_upgrader/bt/revision
deleted
100644 → 0
View file @
c727c78a
613
\ No newline at end of file
bt5/erp5_upgrader_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_user_tutorial/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
\ No newline at end of file
bt5/erp5_user_tutorial_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
791
\ No newline at end of file
bt5/erp5_utils/bt/revision
deleted
100644 → 0
View file @
c727c78a
13
\ No newline at end of file
bt5/erp5_video/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/erp5_web/bt/revision
deleted
100644 → 0
View file @
c727c78a
1118
\ No newline at end of file
bt5/erp5_web_blog/bt/revision
deleted
100644 → 0
View file @
c727c78a
93
\ No newline at end of file
bt5/erp5_web_download_theme/bt/revision
deleted
100644 → 0
View file @
c727c78a
29
\ No newline at end of file
bt5/erp5_web_multiflex5_theme/bt/revision
deleted
100644 → 0
View file @
c727c78a
200
\ No newline at end of file
bt5/erp5_web_renderjs_ui/bt/revision
deleted
100644 → 0
View file @
c727c78a
64
\ No newline at end of file
bt5/erp5_web_service/bt/revision
deleted
100644 → 0
View file @
c727c78a
10
\ No newline at end of file
bt5/erp5_web_shacache/bt/revision
deleted
100644 → 0
View file @
c727c78a
71
\ No newline at end of file
bt5/erp5_web_shadir/bt/revision
deleted
100644 → 0
View file @
c727c78a
77
\ No newline at end of file
bt5/erp5_web_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
40
\ No newline at end of file
bt5/erp5_web_ung_core/bt/revision
deleted
100644 → 0
View file @
c727c78a
54
\ No newline at end of file
bt5/erp5_web_ung_role/bt/revision
deleted
100644 → 0
View file @
c727c78a
38
\ No newline at end of file
bt5/erp5_web_ung_theme/bt/revision
deleted
100644 → 0
View file @
c727c78a
417
\ No newline at end of file
bt5/erp5_web_ung_ui_test/bt/revision
deleted
100644 → 0
View file @
c727c78a
62
\ No newline at end of file
bt5/erp5_wizard/bt/revision
deleted
100644 → 0
View file @
c727c78a
175
\ No newline at end of file
bt5/erp5_workflow/bt/revision
deleted
100644 → 0
View file @
c727c78a
38
\ No newline at end of file
bt5/erp5_worklist_sql/bt/revision
deleted
100644 → 0
View file @
c727c78a
39
\ No newline at end of file
bt5/erp5_xhtml_gadget_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
29
\ No newline at end of file
bt5/erp5_xinha_editor/bt/revision
deleted
100644 → 0
View file @
c727c78a
10
\ No newline at end of file
bt5/networkcache_erp5/bt/revision
deleted
100644 → 0
View file @
c727c78a
33
\ No newline at end of file
bt5/test_accounting/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
\ No newline at end of file
bt5/test_accounting_fr/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
\ No newline at end of file
bt5/test_accounting_in/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
\ No newline at end of file
bt5/test_accounting_pl/bt/revision
deleted
100644 → 0
View file @
c727c78a
4
\ No newline at end of file
bt5/test_conflict_resolution/bt/revision
deleted
100644 → 0
View file @
c727c78a
8
\ No newline at end of file
bt5/test_core/bt/revision
deleted
100644 → 0
View file @
c727c78a
8
\ No newline at end of file
bt5/test_html_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
\ No newline at end of file
bt5/test_web/bt/revision
deleted
100644 → 0
View file @
c727c78a
8
\ No newline at end of file
bt5/test_xhtml_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
6
\ No newline at end of file
bt5/tiolive_base/bt/revision
deleted
100644 → 0
View file @
c727c78a
80
\ No newline at end of file
bt5/tiolive_decouple_instance/bt/revision
deleted
100644 → 0
View file @
c727c78a
18
\ No newline at end of file
product/ERP5/Document/BusinessTemplate.py
View file @
2eb560f6
...
...
@@ -40,6 +40,7 @@ from Products.CMFCore.utils import getToolByName
from
Products.PythonScripts.PythonScript
import
PythonScript
from
Products.ERP5Type.Accessor.Constant
import
PropertyGetter
as
ConstantGetter
from
Products.ERP5Type.Cache
import
transactional_cached
from
Products.ERP5Type.Message
import
translateString
from
Products.ERP5Type.Utils
import
readLocalDocument
,
\
writeLocalDocument
,
\
importLocalDocument
,
\
...
...
@@ -77,7 +78,6 @@ customImporters={
from
Products.ERP5Type.patches.WorkflowTool
import
WorkflowHistoryList
from
zLOG
import
LOG
,
WARNING
,
INFO
from
warnings
import
warn
from
gzip
import
GzipFile
from
lxml.etree
import
parse
from
xml.sax.saxutils
import
escape
from
Products.CMFCore.Expression
import
Expression
...
...
@@ -88,6 +88,8 @@ import transaction
import
threading
from
ZODB.broken
import
Broken
from
Products.ERP5.genbt5list
import
BusinessTemplateRevision
,
\
item_name_list
,
item_set
CACHE_DATABASE_PATH
=
None
try
:
...
...
@@ -303,18 +305,13 @@ def unregisterSkinFolderId(skin_tool, skin_folder_id, skin_selection_list):
deleteSkinSelection
(
skin_tool
,
skin_selection
)
skin_tool
.
getPortalObject
().
changeSkin
(
None
)
class
BusinessTemplateArchive
:
class
BusinessTemplateArchive
(
object
)
:
"""
This is the base class for all Business Template archives
"""
def
_
initCreation
(
self
,
path
,
**
kw
):
def
_
_init__
(
self
,
path
,
**
kw
):
self
.
path
=
path
def
__init__
(
self
,
creation
=
0
,
importing
=
0
,
file
=
None
,
path
=
None
,
**
kw
):
if
creation
:
self
.
_initCreation
(
path
=
path
,
**
kw
)
elif
importing
:
self
.
_initImport
(
file
=
file
,
path
=
path
,
**
kw
)
self
.
revision
=
BusinessTemplateRevision
()
def
addObject
(
self
,
obj
,
name
,
path
=
None
,
ext
=
'.xml'
):
if
path
:
...
...
@@ -329,15 +326,23 @@ class BusinessTemplateArchive:
if
not
isinstance
(
obj
,
str
):
obj
.
seek
(
0
)
obj
=
obj
.
read
()
self
.
revision
.
hash
(
path
,
obj
)
self
.
_writeString
(
obj
,
path
)
else
:
if
isinstance
(
obj
,
str
):
self
.
revision
.
hash
(
path
,
obj
)
obj
=
StringIO
(
obj
)
else
:
obj
.
seek
(
0
)
self
.
revision
.
hash
(
path
,
obj
.
read
())
write
(
obj
,
path
)
def
finishCreation
(
self
):
pass
def
getRevision
(
self
):
return
self
.
revision
.
digest
()
class
BusinessTemplateFolder
(
BusinessTemplateArchive
):
"""
Class archiving business template into a folder tree
...
...
@@ -352,39 +357,32 @@ class BusinessTemplateFolder(BusinessTemplateArchive):
finally
:
f
.
close
()
def
_initImport
(
self
,
file
,
path
,
**
kw
):
root_path_len
=
len
(
os
.
path
.
normpath
(
os
.
path
.
join
(
path
,
'_'
)))
-
1
self
.
root_path_len
=
root_path_len
d
=
{}
for
f
in
file
:
f
=
os
.
path
.
normpath
(
f
)
klass
=
f
[
root_path_len
:].
split
(
os
.
sep
,
1
)[
0
]
d
.
setdefault
(
klass
,
[]).
append
(
f
)
self
.
file_list_dict
=
d
def
importFiles
(
self
,
item
,
**
kw
):
def
importFiles
(
self
,
item
):
"""
Import file from a local folder
"""
class_name
=
item
.
__class__
.
__name__
root_path_len
=
self
.
root_path_len
prefix_len
=
root_path_len
+
len
(
class_name
)
+
len
(
os
.
sep
)
join
=
os
.
path
.
join
item_name
=
item
.
__class__
.
__name__
root
=
join
(
os
.
path
.
normpath
(
self
.
path
),
item_name
,
''
)
root_path_len
=
len
(
root
)
if
CACHE_DATABASE_PATH
:
try
:
cache_database
.
db
=
gdbm
.
open
(
CACHE_DATABASE_PATH
,
'cf'
)
except
gdbm
.
error
:
cache_database
.
db
=
gdbm
.
open
(
CACHE_DATABASE_PATH
,
'nf'
)
try
:
for
file_path
in
self
.
file_list_dict
.
get
(
class_name
,
()
):
if
os
.
path
.
isfile
(
file_path
)
:
file
=
open
(
file_path
,
'rb'
)
try
:
file_name
=
file_path
[
prefix_len
:]
for
root
,
dirs
,
files
in
os
.
walk
(
root
):
for
file_name
in
files
:
file
_name
=
join
(
root
,
file_name
)
with
open
(
file_name
,
'rb'
)
as
f
:
file_name
=
posixpath
.
normpath
(
file_name
[
root_path_len
:])
if
'%'
in
file_name
:
file_name
=
unquote
(
file_name
)
item
.
_importFile
(
file_name
,
file
)
finally
:
file
.
close
()
elif
item_name
==
'bt'
and
file_name
==
'revision'
:
continue
self
.
revision
.
hash
(
item_name
+
'/'
+
file_name
,
f
.
read
())
f
.
seek
(
0
)
item
.
_importFile
(
file_name
,
f
)
finally
:
if
hasattr
(
cache_database
,
'db'
):
cache_database
.
db
.
close
()
...
...
@@ -395,12 +393,21 @@ class BusinessTemplateTarball(BusinessTemplateArchive):
Class archiving businnes template into a tarball file
"""
def
_initCreation
(
self
,
**
kw
):
BusinessTemplateArchive
.
_initCreation
(
self
,
**
kw
)
# init tarfile obj
self
.
fobj
=
StringIO
()
self
.
tar
=
tarfile
.
open
(
''
,
'w:gz'
,
self
.
fobj
)
self
.
time
=
time
.
time
()
def
__init__
(
self
,
path
,
creation
=
0
,
importing
=
0
,
**
kw
):
super
(
BusinessTemplateTarball
,
self
).
__init__
(
path
,
**
kw
)
if
creation
:
self
.
fobj
=
StringIO
()
self
.
tar
=
tarfile
.
open
(
''
,
'w:gz'
,
self
.
fobj
)
self
.
time
=
time
.
time
()
elif
importing
:
self
.
tar
=
tarfile
.
open
(
path
,
'r:gz'
)
self
.
item_dict
=
item_dict
=
defaultdict
(
list
)
for
info
in
self
.
tar
.
getmembers
():
if
info
.
isreg
():
path
=
info
.
name
.
split
(
'/'
)
if
path
[
0
]
==
'.'
:
del
path
[
0
]
item_dict
[
path
[
1
]].
append
((
'/'
.
join
(
path
[
2
:]),
info
))
def
_writeFile
(
self
,
obj
,
path
):
if
self
.
path
:
...
...
@@ -416,27 +423,21 @@ class BusinessTemplateTarball(BusinessTemplateArchive):
self
.
tar
.
close
()
return
self
.
fobj
def
_initImport
(
self
,
file
,
**
kw
):
self
.
tar
=
tarfile
.
TarFile
(
fileobj
=
StringIO
(
GzipFile
(
fileobj
=
file
).
read
()))
self
.
item_dict
=
{}
setdefault
=
self
.
item_dict
.
setdefault
for
info
in
self
.
tar
.
getmembers
():
if
info
.
isreg
():
path
=
info
.
name
.
split
(
'/'
)
if
path
[
0
]
==
'.'
:
del
path
[
0
]
file_name
=
'/'
.
join
(
path
[
2
:])
if
'%'
in
file_name
:
file_name
=
unquote
(
file_name
)
setdefault
(
path
[
1
],
[]).
append
((
file_name
,
info
))
def
importFiles
(
self
,
item
,
**
kw
):
def
importFiles
(
self
,
item
):
"""
Import all file from the archive to the site
"""
extractfile
=
self
.
tar
.
extractfile
for
file_name
,
info
in
self
.
item_dict
.
get
(
item
.
__class__
.
__name__
,
()):
item
.
_importFile
(
file_name
,
extractfile
(
info
))
item_name
=
item
.
__class__
.
__name__
for
file_name
,
info
in
self
.
item_dict
.
get
(
item_name
,
()):
if
'%'
in
file_name
:
file_name
=
unquote
(
file_name
)
elif
item_name
==
'bt'
and
file_name
==
'revision'
:
continue
f
=
extractfile
(
info
)
self
.
revision
.
hash
(
item_name
+
'/'
+
file_name
,
f
.
read
())
f
.
seek
(
0
)
item
.
_importFile
(
file_name
,
f
)
class
TemplateConditionError
(
Exception
):
pass
class
TemplateConflictError
(
Exception
):
pass
...
...
@@ -535,7 +536,7 @@ class BaseTemplateItem(Implicit, Persistent):
return
self
.
_objects
.
keys
()
def
importFile
(
self
,
bta
,
**
kw
):
bta
.
importFiles
(
item
=
self
)
bta
.
importFiles
(
self
)
def
_removeAllButLastWorkflowHistory
(
self
,
obj
):
workflow_history
=
getattr
(
obj
,
'workflow_history'
,
None
)
...
...
@@ -4677,6 +4678,13 @@ class LocalRolesTemplateItem(BaseTemplateItem):
delattr
(
obj
,
'__ac_local_roles_group_id_dict__'
)
obj
.
reindexObject
()
class
bt
(
dict
):
"""Fake 'bt' item to read bt/* files through BusinessTemplateArchive"""
def
_importFile
(
self
,
file_name
,
file
):
self
[
file_name
]
=
file
.
read
()
class
BusinessTemplate
(
XMLObject
):
"""
A business template allows to construct ERP5 modules
...
...
@@ -4768,64 +4776,6 @@ Business Template is a set of definitions, such as skins, portal types and categ
,
'filter_content_types'
:
1
}
# This is a global variable
# Order is important for installation
# We want to have:
# * workflow and portal_type* before ZODB Component {Document,Extension...}
# * path after module, because path can be module content
# * path after categories, because path can be categories content
# * path after portal types roles so that roles in the current bt can be used
# * path before workflow chain, because path can be a portal type
# (until chains are set on portal types with categories)
# * skin after paths, because we can install a custom connection string as
# path and use it with SQLMethods in a skin.
# ( and more )
_item_name_list
=
[
'_registered_version_priority_selection_item'
,
'_workflow_item'
,
'_product_item'
,
'_document_item'
,
'_property_sheet_item'
,
'_constraint_item'
,
'_extension_item'
,
'_test_item'
,
'_role_item'
,
'_tool_item'
,
'_message_translation_item'
,
'_site_property_item'
,
'_portal_type_item'
,
#'_portal_type_workflow_chain_item',
'_portal_type_allowed_content_type_item'
,
'_portal_type_hidden_content_type_item'
,
'_portal_type_property_sheet_item'
,
'_portal_type_base_category_item'
,
'_category_item'
,
'_module_item'
,
'_portal_type_roles_item'
,
'_path_item'
,
'_skin_item'
,
'_registered_skin_selection_item'
,
'_preference_item'
,
'_action_item'
,
'_local_roles_item'
,
'_portal_type_workflow_chain_item'
,
'_catalog_method_item'
,
'_catalog_result_key_item'
,
'_catalog_related_key_item'
,
'_catalog_result_table_item'
,
'_catalog_search_key_item'
,
'_catalog_keyword_key_item'
,
'_catalog_datetime_key_item'
,
'_catalog_full_text_key_item'
,
'_catalog_request_key_item'
,
'_catalog_multivalue_key_item'
,
'_catalog_topic_key_item'
,
'_catalog_scriptable_key_item'
,
'_catalog_role_key_item'
,
'_catalog_local_role_key_item'
,
'_catalog_security_uid_column_item'
,
]
def
__init__
(
self
,
*
args
,
**
kw
):
XMLObject
.
__init__
(
self
,
*
args
,
**
kw
)
self
.
_clean
()
...
...
@@ -4845,23 +4795,10 @@ Business Template is a set of definitions, such as skins, portal types and categ
self
.
workflow_history
[
'business_template_installation_workflow'
]
=
None
security
.
declareProtected
(
Permissions
.
AccessContentsInformation
,
'getRevision'
)
def
getRevision
(
self
):
"""returns the revision property.
This is a workaround for #461.
"""
return
self
.
_baseGetRevision
()
def
updateRevisionNumber
(
self
):
"""Increment bt revision number.
"""
revision_number
=
self
.
getRevision
()
if
revision_number
is
None
or
revision_number
.
strip
()
==
''
:
revision_number
=
1
else
:
revision_number
=
int
(
revision_number
)
+
1
self
.
setRevision
(
revision_number
)
def
getShortRevision
(
self
):
"""Returned a shortened revision"""
r
=
self
.
getRevision
()
return
r
and
r
[:
5
]
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'storeTemplateItemData'
)
def
storeTemplateItemData
(
self
):
...
...
@@ -4984,7 +4921,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
pass
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'build'
)
def
build
(
self
,
no_action
=
0
):
def
build
(
self
,
no_action
=
0
,
update_revision
=
True
):
"""
Copy existing portal objects to self
"""
...
...
@@ -4993,19 +4930,11 @@ Business Template is a set of definitions, such as skins, portal types and categ
# Make sure that everything is sane.
self
.
clean
()
try
:
from
Products.ERP5VCS.WorkingCopy
import
NotAWorkingCopyError
try
:
self
.
setRevision
(
self
.
getVcsTool
().
newRevision
())
except
(
NotAWorkingCopyError
,
IOError
):
raise
ImportError
except
ImportError
:
self
.
updateRevisionNumber
()
self
.
_setTemplateFormatVersion
(
1
)
self
.
storeTemplateItemData
()
# Build each part
for
item_name
in
self
.
_
item_name_list
:
for
item_name
in
item_name_list
:
item
=
getattr
(
self
,
item_name
)
if
item
is
None
:
continue
...
...
@@ -5014,6 +4943,8 @@ Business Template is a set of definitions, such as skins, portal types and categ
item
.
build
(
self
)
# update _p_jar property of objects cleaned by removeProperties
transaction
.
savepoint
(
optimistic
=
True
)
if
update_revision
:
self
.
_export
()
def
publish
(
self
,
url
,
username
=
None
,
password
=
None
):
"""
...
...
@@ -5083,7 +5014,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
else
:
installed_bt
=
self
.
portal_templates
.
_getOb
(
INSTALLED_BT_FOR_DIFF
)
for
item_name
in
self
.
_
item_name_list
:
for
item_name
in
item_name_list
:
new_item
=
getattr
(
self
,
item_name
,
None
)
installed_item
=
getattr
(
installed_bt
,
item_name
,
None
)
if
new_item
is
not
None
:
...
...
@@ -5138,7 +5069,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
# Install everything
if
len
(
object_to_update
)
or
force
:
for
item_name
in
self
.
_
item_name_list
:
for
item_name
in
item_name_list
:
item
=
getattr
(
self
,
item_name
,
None
)
if
item
is
not
None
:
item
.
install
(
self
,
force
=
force
,
object_to_update
=
object_to_update
,
...
...
@@ -5163,7 +5094,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
# remove object from old business template
if
len
(
remove_object_dict
):
# XXX: this code assumes that there is an installed_bt
for
item_name
in
reversed
(
i
nstalled_bt
.
_i
tem_name_list
):
for
item_name
in
reversed
(
item_name_list
):
item
=
getattr
(
installed_bt
,
item_name
,
None
)
if
item
is
not
None
:
item
.
remove
(
self
,
remove_object_dict
=
remove_object_dict
,
trashbin
=
trashbin
)
...
...
@@ -5207,7 +5138,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
not remove all items.
"""
# Trash everything
for
item_name
in
self
.
_item_name_list
[::
-
1
]
:
for
item_name
in
reversed
(
item_name_list
)
:
item
=
getattr
(
self
,
item_name
,
None
)
if
item
is
not
None
:
item
.
trash
(
...
...
@@ -5220,7 +5151,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
"""
# Uninstall everything
# Trash everything
for
item_name
in
self
.
_item_name_list
[::
-
1
]
:
for
item_name
in
reversed
(
item_name_list
)
:
item
=
getattr
(
self
,
item_name
,
None
)
if
item
is
not
None
:
item
.
uninstall
(
self
,
**
kw
)
...
...
@@ -5248,7 +5179,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
if
hasattr
(
self
,
attr
):
delattr
(
self
,
attr
)
# Secondly, make attributes empty.
for
item_name
in
self
.
_
item_name_list
:
for
item_name
in
item_name_list
:
setattr
(
self
,
item_name
,
None
)
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'clean'
)
...
...
@@ -5490,12 +5421,16 @@ Business Template is a set of definitions, such as skins, portal types and categ
if
os
.
path
.
isdir
(
bt_path
):
return
bt_path
@
transactional_cached
(
lambda
self
,
vcs
=
None
,
path
=
None
:
(
self
,
vcs
,
path
))
def
getVcsTool
(
self
,
vcs
=
None
,
path
=
None
):
@
transactional_cached
(
lambda
self
,
vcs
=
None
,
path
=
None
,
restricted
=
False
:
(
self
,
vcs
,
path
,
restricted
))
def
_getVcsTool
(
self
,
vcs
=
None
,
path
=
None
,
restricted
=
False
):
from
Products.ERP5VCS.WorkingCopy
import
getVcsTool
if
not
(
path
or
vcs
):
path
=
self
.
getExportPath
()
return
getVcsTool
(
vcs
=
vcs
,
path
=
path
).
__of__
(
self
)
return
getVcsTool
(
vcs
,
path
,
restricted
).
__of__
(
self
)
def
getVcsTool
(
self
,
vcs
=
None
,
path
=
None
):
return
self
.
_getVcsTool
(
vcs
,
path
,
True
)
def
isVcsType
(
self
,
*
vcs
):
# could be moved to Products.ERP5.Base.Base
...
...
@@ -5513,22 +5448,24 @@ Business Template is a set of definitions, such as skins, portal types and categ
if
self
.
getBuildingState
()
!=
'built'
:
raise
TemplateConditionError
,
\
'Business Template must be built before export'
return
self
.
_export
(
path
,
local
,
bta
)
def
_export
(
self
,
path
=
None
,
local
=
0
,
bta
=
None
):
if
bta
is
None
:
if
local
:
# we export into a folder tree
bta
=
BusinessTemplateFolder
(
creation
=
1
,
path
=
path
)
bta
=
BusinessTemplateFolder
(
path
,
creation
=
1
)
else
:
# We export BT into a tarball file
if
path
is
None
:
path
=
self
.
getTitle
()
bta
=
BusinessTemplateTarball
(
creation
=
1
,
path
=
path
)
bta
=
BusinessTemplateTarball
(
path
,
creation
=
1
)
# export bt
for
prop
in
self
.
propertyMap
():
prop_type
=
prop
[
'type'
]
id
=
prop
[
'id'
]
if
id
in
(
'id'
,
'uid'
,
'rid'
,
'sid'
,
'id_group'
,
'last_id'
,
if
id
in
(
'id'
,
'uid'
,
'rid'
,
'sid'
,
'id_group'
,
'last_id'
,
'revision'
,
'install_object_list_list'
,
'id_generator'
,
'bt_for_diff'
):
continue
value
=
self
.
getProperty
(
id
)
...
...
@@ -5540,22 +5477,50 @@ Business Template is a set of definitions, such as skins, portal types and categ
bta
.
addObject
(
'
\
n
'
.
join
(
value
),
name
=
id
,
path
=
'bt'
,
ext
=
''
)
# Export each part
for
item_name
in
self
.
_
item_name_list
:
for
item_name
in
item_name_list
:
item
=
getattr
(
self
,
item_name
,
None
)
if
item
is
not
None
:
item
.
export
(
context
=
self
,
bta
=
bta
)
self
.
_setRevision
(
bta
.
getRevision
())
return
bta
.
finishCreation
()
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'importFile'
)
def
importFile
(
self
,
dir
=
0
,
file
=
None
,
root_path
=
None
):
def
importFile
(
self
,
path
):
"""
Import all xml files in Business Template
"""
if
dir
:
bta
=
BusinessTemplateFolder
(
importing
=
1
,
file
=
file
,
path
=
root_path
)
bta
=
(
BusinessTemplateFolder
if
os
.
path
.
isdir
(
path
)
else
BusinessTemplateTarball
)(
path
,
importing
=
1
)
bt_item
=
bt
()
bta
.
importFiles
(
bt_item
)
prop_dict
=
{}
for
prop
in
self
.
propertyMap
():
pid
=
prop
[
'id'
]
if
pid
!=
'id'
:
prop_type
=
prop
[
'type'
]
value
=
bt_item
.
get
(
pid
)
if
prop_type
in
(
'text'
,
'string'
):
prop_dict
[
pid
]
=
value
or
''
elif
prop_type
in
(
'int'
,
'boolean'
):
prop_dict
[
pid
]
=
value
or
0
elif
prop_type
in
(
'lines'
,
'tokens'
):
prop_dict
[
pid
[:
-
5
]]
=
(
value
or
''
).
splitlines
()
self
.
_edit
(
**
prop_dict
)
from
Products.ERP5VCS.WorkingCopy
import
NotAWorkingCopyError
try
:
vcs_tool
=
self
.
_getVcsTool
(
path
=
path
)
except
NotAWorkingCopyError
:
pass
else
:
bta
=
BusinessTemplateTarball
(
importing
=
1
,
file
=
file
)
comment
=
translateString
(
'Downloaded from ${type} repository at revision ${revision}'
,
mapping
=
{
'type'
:
vcs_tool
.
title
,
'revision'
:
vcs_tool
.
getRevision
(
True
)})
workflow_tool
=
self
.
getPortalObject
().
portal_workflow
workflow_tool
.
business_template_building_workflow
.
notifyWorkflowMethod
(
self
,
'edit'
,
kw
=
{
'comment'
:
comment
})
self
.
storeTemplateItemData
()
...
...
@@ -5572,7 +5537,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
setattr
(
module
,
template_id
,
type
(
template_id
,
(
SimpleItem
.
SimpleItem
,),
{
'__module__'
:
module_id
}))
for
item_name
in
self
.
_
item_name_list
:
for
item_name
in
item_name_list
:
item_object
=
getattr
(
self
,
item_name
,
None
)
# this check is due to backwards compatability when there can be a
# difference between install erp5_property_sheets (esp. BusinessTemplate
...
...
@@ -5585,11 +5550,13 @@ Business Template is a set of definitions, such as skins, portal types and categ
for
module_id
in
module_id_list
:
del
sys
.
modules
[
module_id
]
self
.
_setRevision
(
bta
.
getRevision
())
def
getItemsList
(
self
):
"""Return list of items in business template
"""
items_list
=
[]
for
item_name
in
self
.
_
item_name_list
:
for
item_name
in
item_name_list
:
item
=
getattr
(
self
,
item_name
,
None
)
if
item
is
not
None
:
items_list
.
extend
(
item
.
getKeys
())
...
...
@@ -6054,5 +6021,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
# Block acquisition on all _item_name_list properties by setting
# a default class value to None
for
key
in
BusinessTemplate
.
_
item_name_list
:
for
key
in
item_name_list
:
setattr
(
BusinessTemplate
,
key
,
None
)
# Check naming convention of items.
assert
item_set
.
issubset
(
globals
()),
item_set
.
difference
(
globals
())
product/ERP5/Tool/TemplateTool.py
View file @
2eb560f6
...
...
@@ -33,7 +33,6 @@ from App.config import getConfiguration
import
os
import
shutil
import
sys
import
tarfile
from
Acquisition
import
Implicit
,
Explicit
from
AccessControl
import
ClassSecurityInfo
...
...
@@ -45,6 +44,7 @@ from Products.ERP5Type.Tool.BaseTool import BaseTool
from
Products.ERP5Type.Cache
import
transactional_cached
from
Products.ERP5Type
import
Permissions
from
Products.ERP5.Document.BusinessTemplate
import
BusinessTemplateMissingDependency
from
Products.ERP5.genbt5list
import
generateInformation
from
Acquisition
import
aq_base
from
tempfile
import
mkstemp
,
mkdtemp
from
Products.ERP5
import
_dtmldir
...
...
@@ -56,7 +56,6 @@ from xml.dom.minidom import parse
from
xml.parsers.expat
import
ExpatError
import
struct
import
cPickle
import
posixpath
from
base64
import
b64encode
,
b64decode
from
Products.ERP5Type.Message
import
translateString
from
zLOG
import
LOG
,
INFO
,
WARNING
...
...
@@ -126,23 +125,19 @@ class TemplateTool (BaseTool):
# However, that unlikely happens, and using a Z SQL Method has a
# potential danger because business templates may exchange catalog
# methods, so the database could be broken temporarily.
latest_bt
=
None
latest_revision
=
0
for
bt
in
self
.
contentValues
(
filter
=
{
'portal_type'
:
'Business Template'
}):
last_bt
=
last_time
=
None
for
bt
in
self
.
objectValues
(
portal_type
=
'Business Template'
):
if
bt
.
getTitle
()
==
title
or
title
in
bt
.
getProvisionList
():
installation_state
=
bt
.
getInstallationState
()
if
installation_state
==
'installed'
:
latest_bt
=
bt
break
elif
strict
is
False
and
installation_state
==
'replaced'
:
revision
=
bt
.
getRevision
()
try
:
revision
=
int
(
revision
)
except
ValueError
:
continue
if
revision
>
latest_revision
:
latest_bt
=
bt
return
latest_bt
state
=
bt
.
getInstallationState
()
if
state
==
'installed'
:
return
bt
if
state
==
'replaced'
and
not
strict
:
t
=
bt
.
workflow_history
\
[
'business_template_installation_workflow'
][
-
1
][
'time'
]
if
last_time
<
t
:
last_bt
=
bt
last_time
=
t
return
last_bt
def
getInstalledBusinessTemplatesList
(
self
):
"""Deprecated.
...
...
@@ -182,20 +177,12 @@ class TemplateTool (BaseTool):
return
bt
.
getRevision
()
return
None
def
getBuiltBusinessTemplatesList
(
self
):
"""Deprecated.
"""
DeprecationWarning
(
'getBuiltBusinessTemplatesList is deprecated; Use getBuiltBusinessTemplateList instead.'
,
DeprecationWarning
)
return
self
.
getBuiltBusinessTemplateList
()
def
getBuiltBusinessTemplateList
(
self
):
"""Get the list of built and not installed business templates.
"""
built_bts
=
[]
for
bt
in
self
.
contentValues
(
portal_type
=
'Business Template'
):
if
bt
.
getInstallationState
()
==
'not_installed'
and
bt
.
getBuildingState
()
==
'built'
:
built_bts
.
append
(
bt
)
return
built_bts
return
[
bt
for
bt
in
self
.
objectValues
(
portal_type
=
'Business Template'
)
if
bt
.
getInstallationState
()
==
'not_installed'
and
bt
.
getBuildingState
()
==
'built'
]
@
property
def
asRepository
(
self
):
...
...
@@ -203,7 +190,7 @@ class TemplateTool (BaseTool):
"""Export business template by their title
Provides a view of template tool allowing a user to download the last
revision of a
business template with a URL like:
edited
business template with a URL like:
http://.../erp5/portal_templates/asRepository/erp5_core
"""
def
__before_publishing_traverse__
(
self
,
self2
,
request
):
...
...
@@ -215,9 +202,9 @@ class TemplateTool (BaseTool):
last_bt
=
None
,
None
for
bt
in
self
.
aq_parent
.
searchFolder
(
title
=
title
):
bt
=
bt
.
getObject
()
revision
=
int
(
bt
.
getRevision
()
)
if
last_bt
[
0
]
<
revision
and
bt
.
getInstallationState
()
!=
'deleted'
:
last_bt
=
revision
,
bt
modified
=
bt
.
getModificationDate
(
)
if
last_bt
[
0
]
<
modified
and
bt
.
getInstallationState
()
!=
'deleted'
:
last_bt
=
modified
,
bt
if
last_bt
[
1
]
is
None
:
return
RESPONSE
.
notFoundError
(
title
)
RESPONSE
.
setHeader
(
'Content-type'
,
'application/data'
)
...
...
@@ -298,52 +285,6 @@ class TemplateTool (BaseTool):
self
.
deleteContent
(
id
)
self
.
_importObjectFromFile
(
StringIO
(
export_string
),
id
=
id
)
def
_importBT
(
self
,
path
=
None
,
id
=
id
):
"""
Import template from a temp file (as uploaded by the user)
"""
with
open
(
path
,
'rb'
)
as
file
:
# read magic key to determine wich kind of bt we use
file
.
seek
(
0
)
magic
=
file
.
read
(
5
)
# XXX: should really check for a magic and offer a falback if it
# doens't correspond to anything handled.
tar
=
tarfile
.
open
(
path
,
'r:gz'
)
dir_name
=
tar
.
members
[
0
].
name
.
split
(
posixpath
.
sep
,
1
)[
0
]
try
:
# create bt object
bt
=
self
.
newContent
(
portal_type
=
'Business Template'
,
id
=
id
)
prop_dict
=
{}
for
prop
in
bt
.
propertyMap
():
prop_type
=
prop
[
'type'
]
pid
=
prop
[
'id'
]
prop_path
=
posixpath
.
join
(
dir_name
,
'bt'
,
pid
)
try
:
info
=
tar
.
getmember
(
prop_path
)
value
=
tar
.
extractfile
(
info
).
read
()
except
KeyError
:
value
=
None
if
value
is
'None'
:
# At export time, we used to export non-existent properties:
# str(obj.getProperty('non-existing')) == 'None'
# Discard them
continue
if
prop_type
in
(
'text'
,
'string'
):
prop_dict
[
pid
]
=
value
or
''
elif
prop_type
in
(
'int'
,
'boolean'
):
prop_dict
[
pid
]
=
value
or
0
elif
prop_type
in
(
'lines'
,
'tokens'
):
prop_dict
[
pid
[:
-
5
]]
=
(
value
or
''
).
splitlines
()
prop_dict
.
pop
(
'id'
,
''
)
bt
.
edit
(
**
prop_dict
)
# import all other files from bt
with
open
(
path
,
'rb'
)
as
fobj
:
bt
.
importFile
(
file
=
fobj
)
finally
:
tar
.
close
()
return
bt
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'manage_download'
)
def
manage_download
(
self
,
url
,
id
=
None
,
REQUEST
=
None
):
"""The management interface for download.
...
...
@@ -362,56 +303,9 @@ class TemplateTool (BaseTool):
def
_download_local
(
self
,
path
,
bt_id
):
"""Download Business Template from local directory or file
"""
if
os
.
path
.
isdir
(
os
.
path
.
normpath
(
path
)):
path
=
os
.
path
.
normpath
(
path
)
def
callback
(
file_list
,
directory
,
files
):
for
excluded_directory
in
(
'CVS'
,
'.svn'
):
try
:
files
.
remove
(
excluded_directory
)
except
ValueError
:
pass
for
file
in
files
:
absolute_path
=
os
.
path
.
join
(
directory
,
file
)
if
os
.
path
.
isfile
(
absolute_path
):
file_list
.
append
(
absolute_path
)
file_list
=
[]
os
.
path
.
walk
(
path
,
callback
,
file_list
)
file_list
.
sort
()
# import bt object
bt
=
self
.
newContent
(
portal_type
=
'Business Template'
,
id
=
bt_id
)
bt_path
=
os
.
path
.
join
(
path
,
'bt'
)
# import properties
prop_dict
=
{}
for
prop
in
bt
.
propertyMap
():
prop_type
=
prop
[
'type'
]
pid
=
prop
[
'id'
]
prop_path
=
os
.
path
.
join
(
'.'
,
bt_path
,
pid
)
if
not
os
.
path
.
exists
(
prop_path
):
value
=
None
else
:
with
open
(
prop_path
,
'rb'
)
as
f
:
value
=
f
.
read
()
if
value
is
'None'
:
# At export time, we used to export non-existent properties:
# str(obj.getProperty('non-existing')) == 'None'
# Discard them
value
=
None
if
prop_type
in
(
'text'
,
'string'
):
prop_dict
[
pid
]
=
value
or
''
elif
prop_type
in
(
'int'
,
'boolean'
):
prop_dict
[
pid
]
=
value
or
0
elif
prop_type
in
(
'lines'
,
'tokens'
):
prop_dict
[
pid
[:
-
5
]]
=
(
value
or
''
).
splitlines
()
prop_dict
.
pop
(
'id'
,
''
)
bt
.
edit
(
**
prop_dict
)
# import all others objects
bt
.
importFile
(
dir
=
True
,
file
=
file_list
,
root_path
=
path
)
return
bt
else
:
# this should be a file
return
self
.
_importBT
(
path
,
bt_id
)
bt
=
self
.
newContent
(
bt_id
,
'Business Template'
)
bt
.
importFile
(
path
)
return
bt
def
_download_url
(
self
,
url
,
bt_id
):
tempid
,
temppath
=
mkstemp
()
...
...
@@ -437,18 +331,6 @@ class TemplateTool (BaseTool):
finally:
shutil.rmtree(svn_checkout_tmp_dir)
def assertBtPathExists(self, url):
"""
Check if bt is present on the system
"""
urltype, name = splittype(url)
# Windows compatibility
if WIN:
if os.path.isdir(os.path.normpath(url)) or
\
os.path.isfile(os.path.normpath(url)):
name = os.path.normpath(url)
return os.path.exists(os.path.normpath(name))
security.declareProtected( '
Import
/
Export
objects
', '
download
' )
def download(self, url, id=None, REQUEST=None):
"""
...
...
@@ -463,13 +345,9 @@ class TemplateTool (BaseTool):
id = self.generateNewId()
urltype, name = splittype(url)
# Windows compatibility
if WIN:
if os.path.isdir(os.path.normpath(url)) or
\
os.path.isfile(os.path.normpath(url)):
urltype = '
file
'
name = os.path.normpath(url)
if WIN and urltype and '
\\
' in name:
urltype = None
name = url
if urltype and urltype != '
file
':
if '
/
portal_templates
/
asRepository
/
' in url:
# In this case, the downloaded BT is already built.
...
...
@@ -479,7 +357,7 @@ class TemplateTool (BaseTool):
return self[self._setObject(id, bt)]
bt = self._download_url(url, id)
else:
bt = self._download_local(
name
, id)
bt = self._download_local(
os.path.normpath(name)
, id)
bt.build(no_action=True)
return bt
...
...
@@ -687,9 +565,12 @@ class TemplateTool (BaseTool):
'
updateRepositoryBusinessTemplateList
' )
def updateRepositoryBusinessTemplateList(self, repository_list,
REQUEST=None, RESPONSE=None
, **kw):
REQUEST=None, RESPONSE=None, genbt5list=0
, **kw):
"""
Update the information on Business Templates from repositories.
For local repositories, if bt5list is missing or if genbt5list > 1,
bt5list is automatically generated (but not saved on disk).
"""
self.repository_dict = PersistentMapping()
property_list = ('
title
', '
version
', '
revision
', '
description
', '
license
',
...
...
@@ -697,9 +578,19 @@ class TemplateTool (BaseTool):
#LOG('
updateRepositoryBusiessTemplateList
', 0,
# '
repository_list
=
%
r' % (repository_list,))
for repository in repository_list:
url = '
/
'.join([repository, '
bt5list
'])
f = urlopen(url)
property_dict_list = []
urltype, url = splittype(repository)
if WIN and urltype and '
\\
' in url:
urltype = None
url = repository
if urltype and urltype != '
file
':
f = urlopen(repository + '
/
bt5list
')
else:
bt5list = os.path.join(url, '
bt5list
')
if genbt5list > os.path.exists(bt5list):
f = generateInformation(url)
f.seek(0)
else:
f = open(bt5list, 'rb')
try:
try:
doc = parse(f)
...
...
@@ -713,6 +604,7 @@ class TemplateTool (BaseTool):
else:
raise RuntimeError, '
Invalid
repository
:
%
s
' % repository
try:
property_dict_list = []
root = doc.documentElement
for template in root.getElementsByTagName("template"):
id = template.getAttribute('
id
')
...
...
@@ -1060,9 +952,6 @@ class TemplateTool (BaseTool):
update_only: return only bt that needs to be updated
template_list: only returns bt within the given list
"""
version_state_title_dict = { '
new
' : '
New
', '
present
' : '
Present
',
'
old
' : '
Old
' }
from Products.ERP5Type.Document import newTempBusinessTemplate
result_list = []
template_set = None
...
...
@@ -1089,15 +978,9 @@ class TemplateTool (BaseTool):
# if this business template is newer.
previous_repository, previous_property_dict =
\
template_item_dict[title]
diff_version = self.compareVersions(previous_property_dict['
version
'],
property_dict['
version
'])
if diff_version < 0:
if self.compareVersions(previous_property_dict['
version
'],
property_dict['
version
']) < 0:
template_item_dict[title] = (repository, property_dict)
elif diff_version == 0
\
and previous_property_dict['
revision
']
\
and property_dict['
revision
']
\
and int(previous_property_dict['
revision
']) < int(property_dict['
revision
']):
template_item_dict[title] = (repository, property_dict)
# Next, select only updated business templates.
if update_only:
for repository, property_dict in template_item_dict.values():
...
...
@@ -1109,9 +992,8 @@ class TemplateTool (BaseTool):
if diff_version < 0:
template_item_list.append((repository, property_dict))
elif diff_version == 0
\
and installed_bt.getRevision()
\
and property_dict['
revision
']
\
and in
t(installed_bt.getRevision()) < int(property_dict['
revision
'])
:
and in
stalled_bt.getRevision() != property_dict['
revision
']
:
template_item_list.append((repository, property_dict))
elif template_list is not None:
template_item_list.append((repository, property_dict))
...
...
@@ -1119,29 +1001,24 @@ class TemplateTool (BaseTool):
# Create temporary Business Template objects for displaying.
for repository, property_dict in template_item_list:
property_dict = property_dict.copy()
id = property_dict['
id
']
filename = property_dict['
id
']
del property_dict['
id
']
revision = property_dict['
revision
']
version_state = '
new
'
id = filename = property_dict.pop('
id
')
installed_bt =
\
self.getInstalledBusinessTemplate(property_dict['
title
'])
if installed_bt is not None:
installed_version = installed_bt.getVersion()
installed_revision = installed_bt.getRevision()
result = self.compareVersions(installed_revision, revision)
if result == 0:
installed_revision = installed_bt.getShortRevision()
if installed_bt.getRevision() == property_dict['
revision
']:
version_state = '
present
'
el
if result < 0
:
version_state = '
old
'
el
se
:
version_state = '
different
'
else:
installed_version = ''
installed_revision = ''
version_state_title = version_state_title_dict[version_state]
version_state = '
new
'
uid = self.encodeRepositoryBusinessTemplateUid(repository, id)
obj = newTempBusinessTemplate(self, '
temp_
' + uid,
version_state = version_state,
version_state_title
= version_state_title
,
version_state_title
=version_state.title()
,
filename = filename,
installed_version = installed_version,
installed_revision = installed_revision,
...
...
@@ -1206,10 +1083,9 @@ class TemplateTool (BaseTool):
return 0
def _getBusinessTemplateUrlDict(self
, newest_only=False
):
def _getBusinessTemplateUrlDict(self):
business_template_url_dict = {}
for bt in self.getRepositoryBusinessTemplateList(
\
newest_only=newest_only):
for bt in self.getRepositoryBusinessTemplateList():
url, name = self.decodeRepositoryBusinessTemplateUid(bt.getUid())
if name.endswith('
.
bt5
'):
name = name[:-4]
...
...
@@ -1221,14 +1097,11 @@ class TemplateTool (BaseTool):
security.declareProtected(Permissions.ManagePortal,
'
installBusinessTemplatesFromRepositories
')
def installBusinessTemplatesFromRepositories(self, template_list,
only_newer=True, update_catalog=_MARKER, activate=False,
install_dependency=False):
def installBusinessTemplatesFromRepositories(self, *args, **kw):
"""Deprecated.
"""
DeprecationWarning('
installBusinessTemplatesFromRepositories
is
deprecated
;
Use
self
.
installBusinessTemplateListFromRepository
instead
.
', DeprecationWarning)
return self.installBusinessTemplateListFromRepository(template_list,
only_newer, update_catalog, activate, install_dependency)
return self.installBusinessTemplateListFromRepository(*args, **kw)
security.declareProtected(Permissions.ManagePortal,
'
resolveBusinessTemplateListDependency
')
...
...
@@ -1293,7 +1166,7 @@ class TemplateTool (BaseTool):
security.declareProtected(Permissions.ManagePortal,
'
installBusinessTemplateListFromRepository
')
def installBusinessTemplateListFromRepository(self, template_list,
only_
newer
=True, update_catalog=_MARKER, activate=False,
only_
different
=True, update_catalog=_MARKER, activate=False,
install_dependency=False):
"""Installs template_list from configured repositories by default only newest"""
# XXX-Luke: This method could replace
...
...
@@ -1303,12 +1176,13 @@ class TemplateTool (BaseTool):
operation_log = []
resolved_template_list = self.resolveBusinessTemplateListDependency(
template_list)
installed_bt5_set = set([x.title
for x in self.getInstalledBusinessTemplatesList()])
installed_bt5_dict = dict((x.getTitle(), x.getRevision())
for x in self.getInstalledBusinessTemplateList())
if only_different:
template_url_dict = self._getBusinessTemplateUrlDict()
def checkAvailability(bt_title):
return bt_title in template_list or bt_title in installed_bt5_
se
t
return bt_title in template_list or bt_title in installed_bt5_
dic
t
missing_dependency_list = [i for i in resolved_template_list
if not checkAvailability(i[1].replace(".bt5", ""))]
...
...
@@ -1317,17 +1191,14 @@ class TemplateTool (BaseTool):
"Impossible to install, please install the following dependencies before: %s"
\
% [x[1] for x in missing_dependency_list]
template_url_dict = self._getBusinessTemplateUrlDict()
activate_kw = dict(activity="SQLQueue", tag="start_%s" % (time.time()))
for repository, bt_id in resolved_template_list:
bt = template_url_dict.get(bt_id)
if bt is not None and bt_id in installed_bt5_set:
revision = int(bt['
revision
'])
installed_bt5 = self.getInstalledBusinessTemplate(bt_id)
if int(installed_bt5.getRevision()) <= revision and only_newer:
if only_different:
bt = template_url_dict.get(bt_id)
if bt is not None and bt['
revision
'] == installed_bt5_dict.get(bt_id):
continue
bt_url = '
%
s
/%
s
' % (repository, bt_id)
param_dict = dict(download_url=bt_url, only_
newer=only_newer
)
param_dict = dict(download_url=bt_url, only_
different=only_different
)
if update_catalog is not _MARKER:
param_dict["update_catalog"] = update_catalog
...
...
@@ -1340,7 +1211,7 @@ class TemplateTool (BaseTool):
else:
document = self.updateBusinessTemplateFromUrl(**param_dict)
operation_log.append('
Installed
%
s
with
revision
%
s
' % (
document.getTitle(), document.getRevision()))
document.getTitle(), document.get
Short
Revision()))
return operation_log
...
...
@@ -1354,7 +1225,7 @@ class TemplateTool (BaseTool):
reinstall=False,
active_process=None,
force_keep_list=None,
only_
newer
=True):
only_
different
=True):
"""
This method download and install a bt5, from a URL.
...
...
@@ -1390,18 +1261,13 @@ class TemplateTool (BaseTool):
if reinstall:
install_kw = None
else:
previous_bt5 = self.getInstalledBusinessTemplate(bt_title)
if (previous_bt5 is not None) and only_newer:
try:
imported_revision = int(imported_bt5.getRevision())
previous_revision = int(previous_bt5.getRevision())
if imported_revision <= previous_revision:
log("%s is already installed with revision %i, which is same or "
"newer revision than new revision %i." % (bt_title,
previous_revision, imported_revision))
return imported_bt5
except ValueError:
pass
if only_different:
previous_bt5 = self.getInstalledBusinessTemplate(bt_title)
if previous_bt5 and
\
imported_bt5.getRevision() == previous_bt5.getRevision():
log("%s is already installed with revision %s"
% (bt_title, imported_bt5.getShortRevision()))
return imported_bt5
install_kw = {}
for listbox_line in imported_bt5.BusinessTemplate_getModifiedObject():
...
...
product/ERP5/bin/genbt5list
View file @
2eb560f6
...
...
@@ -31,130 +31,200 @@
"""Generate repository information on Business Templates.
"""
import
posixpath
import
tarfile
import
os
import
sys
import
tempfile
import
shutil
import
cgi
property_list
=
'''
from
base64
import
b64encode
from
cStringIO
import
StringIO
from
hashlib
import
sha1
from
urllib
import
unquote
# Order is important for installation
# We want to have:
# * workflow and portal_type* before ZODB Component {Document,Extension...}
# * path after module, because path can be module content
# * path after categories, because path can be categories content
# * path after portal types roles so that roles in the current bt can be used
# * path before workflow chain, because path can be a portal type
# (until chains are set on portal types with categories)
# * skin after paths, because we can install a custom connection string as
# path and use it with SQLMethods in a skin.
# ( and more )
item_name_list
=
(
'registered_version_priority_selection'
,
'workflow'
,
'product'
,
'document'
,
'property_sheet'
,
'constraint'
,
'extension'
,
'test'
,
'role'
,
'tool'
,
'message_translation'
,
'site_property'
,
'portal_type'
,
'portal_type_allowed_content_type'
,
'portal_type_hidden_content_type'
,
'portal_type_property_sheet'
,
'portal_type_base_category'
,
'category'
,
'module'
,
'portal_type_roles'
,
'path'
,
'skin'
,
'registered_skin_selection'
,
'preference'
,
'action'
,
'local_roles'
,
'portal_type_workflow_chain'
,
'catalog_method'
,
'catalog_result_key'
,
'catalog_related_key'
,
'catalog_result_table'
,
'catalog_search_key'
,
'catalog_keyword_key'
,
'catalog_datetime_key'
,
'catalog_full_text_key'
,
'catalog_request_key'
,
'catalog_multivalue_key'
,
'catalog_topic_key'
,
'catalog_scriptable_key'
,
'catalog_role_key'
,
'catalog_local_role_key'
,
'catalog_security_uid_column'
,
)
item_set
=
set
((
'CatalogDateTimeKey'
if
x
==
'catalog_datetime_key'
else
''
.
join
(
map
(
str
.
title
,
x
.
split
(
'_'
))))
+
'TemplateItem'
for
x
in
item_name_list
)
item_set
.
add
(
'bt'
)
item_name_list
=
tuple
(
'_%s_item'
%
x
for
x
in
item_name_list
)
class
BusinessTemplateRevision
(
list
):
def
hash
(
self
,
path
,
text
):
self
.
append
((
path
,
sha1
(
text
).
digest
()))
def
digest
(
self
):
self
.
sort
()
return
b64encode
(
sha1
(
'
\
0
'
.
join
(
h
+
p
for
(
h
,
p
)
in
self
)).
digest
())
class
BusinessTemplate
(
dict
):
property_list
=
frozenset
(
'''
title
version
revision
description
license
dependency_list
test_dependency_list
provision_list
copyright_list
'''
.
strip
().
splitlines
()
bt_title_path
=
os
.
path
.
join
(
'bt'
,
'title'
)
def
info
(
message
):
"""Print a message to stdout.
"""
sys
.
stdout
.
write
(
message
)
'''
.
split
())
def
err
(
message
):
"""Print a message to stderr.
"""
sys
.
stderr
.
write
(
message
)
def
__init__
(
self
):
self
.
revision
=
BusinessTemplateRevision
()
def
readProperty
(
property_dict
,
property_name
,
property_
file
):
def
_read
(
self
,
path
,
file
):
try
:
text
=
property_file
.
read
()
if
property_name
.
endswith
(
'_list'
):
property_dict
[
property_name
[:
-
5
]]
=
text
.
splitlines
()
else
:
property_dict
[
property_name
]
=
text
text
=
file
.
read
()
finally
:
property_file
.
close
()
def
readBusinessTemplate
(
tar
):
"""Read an archived Business Template info.
"""
property_dict
=
{}
for
info
in
tar
:
name_list
=
info
.
name
.
split
(
'/'
)
if
len
(
name_list
)
==
3
and
name_list
[
1
]
==
'bt'
and
name_list
[
2
]
in
property_list
:
property_file
=
tar
.
extractfile
(
info
)
property_name
=
name_list
[
2
]
readProperty
(
property_dict
,
property_name
,
property_file
)
return
property_dict
def
readBusinessTemplateDirectory
(
dir
):
"""Read Business Template Directory info.
"""
property_dict
=
{}
for
property_name
in
property_list
:
filename
=
os
.
path
.
join
(
dir
,
'bt'
,
property_name
)
if
os
.
path
.
isfile
(
filename
):
property_file
=
open
(
filename
,
'rb'
)
readProperty
(
property_dict
,
property_name
,
property_file
)
return
property_dict
def
generateInformation
(
fd
):
os
.
write
(
fd
,
'<?xml version="1.0"?>
\
n
'
)
os
.
write
(
fd
,
'<repository>
\
n
'
)
for
file
in
sorted
(
os
.
listdir
(
os
.
getcwd
())):
if
file
.
endswith
(
'.bt5'
):
info
(
'Reading %s... '
%
(
file
,))
file
.
close
()
if
path
.
startswith
(
'bt/'
):
name
=
path
[
3
:]
if
name
in
self
.
property_list
:
if
name
.
endswith
(
'_list'
):
self
[
name
[:
-
5
]]
=
text
.
splitlines
()
else
:
self
[
name
]
=
text
elif
name
==
'revision'
:
return
self
.
revision
.
hash
(
unquote
(
path
)
if
'%'
in
path
else
path
,
text
)
def
__iter__
(
self
):
self
[
'revision'
]
=
self
.
revision
.
digest
()
return
iter
(
sorted
(
self
.
iteritems
()))
@
classmethod
def
fromTar
(
cls
,
tar
):
"""Read an archived Business Template info"""
self
=
cls
()
for
info
in
tar
:
if
not
info
.
isdir
():
name
=
info
.
name
.
split
(
'/'
,
1
)[
1
]
if
name
.
split
(
'/'
,
1
)[
0
]
in
item_set
:
self
.
_read
(
name
,
tar
.
extractfile
(
info
))
return
iter
(
self
)
@
classmethod
def
fromDir
(
cls
,
dir
):
"""Read Business Template Directory info"""
self
=
cls
()
lstrip_len
=
len
(
dir
+
os
.
sep
)
for
root
,
dirs
,
files
in
os
.
walk
(
dir
):
if
root
:
for
path
in
files
:
path
=
os
.
path
.
join
(
root
,
path
)
self
.
_read
(
posixpath
.
normpath
(
path
[
lstrip_len
:]),
open
(
path
,
'rb'
))
else
:
dirs
[:]
=
item_set
.
intersection
(
dirs
)
return
iter
(
self
)
def
generateInformation
(
dir
,
info
=
id
,
err
=
None
):
xml
=
StringIO
()
xml
.
write
(
'<?xml version="1.0"?>
\
n
<repository>
\
n
'
)
for
name
in
sorted
(
os
.
listdir
(
dir
)):
path
=
os
.
path
.
join
(
dir
,
name
)
if
name
.
endswith
(
'.bt5'
):
info
(
'Reading %s... '
%
name
)
try
:
tar
=
tarfile
.
open
(
file
,
'r:gz'
)
tar
=
tarfile
.
open
(
path
,
'r:gz'
)
except
tarfile
.
TarError
:
err
(
'An error happened in %s; skipping
\
n
'
%
(
file
,))
continue
if
err
:
err
(
'An error happened in %s; skipping
\
n
'
%
name
)
continue
raise
try
:
property_
dict
=
readBusinessTemplate
(
tar
)
property_
list
=
BusinessTemplate
.
fromTar
(
tar
)
finally
:
tar
.
close
()
elif
os
.
path
.
isfile
(
os
.
path
.
join
(
file
,
bt_title_path
)):
info
(
'Reading Directory %s... '
%
(
file
,)
)
property_
dict
=
readBusinessTemplateDirectory
(
file
)
elif
os
.
path
.
isfile
(
os
.
path
.
join
(
path
,
'bt'
,
'title'
)):
info
(
'Reading Directory %s... '
%
name
)
property_
list
=
BusinessTemplate
.
fromDir
(
path
)
else
:
continue
os
.
write
(
fd
,
' <template id="%s">
\
n
'
%
(
file
,))
for
property_id
,
property_value
in
sorted
(
property_dict
.
items
()):
if
type
(
property_value
)
is
str
:
os
.
write
(
fd
,
' <%s>%s</%s>
\
n
'
%
(
property_id
,
cgi
.
escape
(
property_value
),
property_id
))
else
:
for
value
in
property_value
:
os
.
write
(
fd
,
' <%s>%s</%s>
\
n
'
%
(
property_id
,
cgi
.
escape
(
value
),
property_id
))
os
.
write
(
fd
,
' </template>
\
n
'
)
xml
.
write
(
' <template id="%s">
\
n
'
%
name
)
for
k
,
v
in
property_list
:
for
v
in
(
v
,)
if
type
(
v
)
is
str
else
v
:
xml
.
write
(
' <%s>%s</%s>
\
n
'
%
(
k
,
cgi
.
escape
(
v
),
k
))
xml
.
write
(
' </template>
\
n
'
)
info
(
'done
\
n
'
)
os
.
write
(
fd
,
'</repository>
\
n
'
)
xml
.
write
(
'</repository>
\
n
'
)
return
xml
def
main
():
if
len
(
sys
.
argv
)
<
2
:
dir_list
=
[
'.'
]
else
:
dir_list
=
sys
.
argv
[
1
:]
def
main
(
dir_list
=
None
,
**
kw
):
if
dir_list
is
None
:
kw
.
setdefault
(
'info'
,
sys
.
stdout
.
write
)
kw
.
setdefault
(
'err'
,
sys
.
stderr
.
write
)
dir_list
=
sys
.
argv
[
1
:]
or
'.'
cur_umask
=
os
.
umask
(
0666
)
os
.
umask
(
cur_umask
)
cwd
=
os
.
getcwd
()
for
d
in
dir_list
:
os
.
chdir
(
d
)
bt5list
=
generateInformation
(
d
,
**
kw
).
getvalue
()
d
=
os
.
path
.
join
(
d
,
'bt5list.new'
)
try
:
fd
,
path
=
tempfile
.
mkstemp
(
dir
=
'.'
)
try
:
generateInformation
(
fd
)
os
.
fchmod
(
fd
,
0666
&
~
cur_umask
)
os
.
rename
(
path
,
'bt5list'
)
except
:
os
.
remove
(
path
)
raise
finally
:
os
.
close
(
fd
)
with
open
(
d
,
'wb'
)
as
f
:
f
.
write
(
bt5list
)
os
.
rename
(
d
,
d
[:
-
4
])
finally
:
os
.
chdir
(
cwd
)
try
:
os
.
remove
(
d
)
except
OSError
:
pass
if
__name__
==
"__main__"
:
main
()
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BusinessTemplate_view.xml
View file @
2eb560f6
...
...
@@ -109,7 +109,7 @@
<string>
my_id
</string>
<string>
my_title
</string>
<string>
my_version
</string>
<string>
my_revision
</string>
<string>
my_
short_
revision
</string>
<string>
my_translated_building_state_title
</string>
<string>
my_translated_installation_state_title
</string>
<string>
my_description
</string>
...
...
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BusinessTemplate_view/my_revision.xml
deleted
100644 → 0
View file @
c727c78a
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"StringField"
module=
"Products.Formulator.StandardFields"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
my_revision
</string>
</value>
</item>
<item>
<key>
<string>
message_values
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
external_validator_failed
</string>
</key>
<value>
<string>
The input failed the external validator.
</string>
</value>
</item>
<item>
<key>
<string>
required_not_found
</string>
</key>
<value>
<string>
Input is required but no input given.
</string>
</value>
</item>
<item>
<key>
<string>
too_long
</string>
</key>
<value>
<string>
Too much input was given.
</string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
overrides
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
alternate_name
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
css_class
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
default
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
display_maxwidth
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
display_width
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
editable
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_validator
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
extra
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
max_length
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
required
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
truncate
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
unicode
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
whitespace_preserve
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
tales
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
alternate_name
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
css_class
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
default
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
display_maxwidth
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
display_width
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
editable
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_validator
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
extra
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
max_length
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
required
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
truncate
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
unicode
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
whitespace_preserve
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
values
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
alternate_name
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
css_class
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
default
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string>
the number of revision used by the business template. This number increases each time we commit a modification
</string>
</value>
</item>
<item>
<key>
<string>
display_maxwidth
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
display_width
</string>
</key>
<value>
<int>
20
</int>
</value>
</item>
<item>
<key>
<string>
editable
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
external_validator
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
extra
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
max_length
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
required
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Revision Number
</string>
</value>
</item>
<item>
<key>
<string>
truncate
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
unicode
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
whitespace_preserve
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/BusinessTemplate_view/my_short_revision.xml
0 → 100644
View file @
2eb560f6
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"ProxyField"
module=
"Products.ERP5Form.ProxyField"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
delegated_list
</string>
</key>
<value>
<list>
<string>
description
</string>
<string>
editable
</string>
<string>
title
</string>
</list>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
my_short_revision
</string>
</value>
</item>
<item>
<key>
<string>
message_values
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
external_validator_failed
</string>
</key>
<value>
<string>
The input failed the external validator.
</string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
overrides
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
field_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
form_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
target
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
tales
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
field_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
form_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
target
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
values
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string>
A shortened hash of the contents of the Business Template. The hash is computed at download, build and export.
</string>
</value>
</item>
<item>
<key>
<string>
editable
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
field_id
</string>
</key>
<value>
<string>
my_string_field
</string>
</value>
</item>
<item>
<key>
<string>
form_id
</string>
</key>
<value>
<string>
Base_viewFieldLibrary
</string>
</value>
</item>
<item>
<key>
<string>
target
</string>
</key>
<value>
<string>
Click to edit the target
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Revision Number
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TemplateTool_viewBusinessTemplateList/listbox.xml
View file @
2eb560f6
...
...
@@ -349,7 +349,7 @@
<string>
Version
</string>
</tuple>
<tuple>
<string>
revision
</string>
<string>
short_
revision
</string>
<string>
Revision
</string>
</tuple>
<tuple>
...
...
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TemplateTool_viewInstallRepositoryBusinessTemplateListDialog/listbox.xml
View file @
2eb560f6
...
...
@@ -340,7 +340,7 @@
<string>
Version
</string>
</tuple>
<tuple>
<string>
revision
</string>
<string>
short_
revision
</string>
<string>
Revision
</string>
</tuple>
<tuple>
...
...
product/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/TemplateTool_viewUpgradeRepositoryBusinessTemplateListDialog/listbox.xml
View file @
2eb560f6
...
...
@@ -343,14 +343,14 @@
<string>
version
</string>
<string>
Version
</string>
</tuple>
<tuple>
<string>
revision
</string>
<string>
Revision
</string>
</tuple>
<tuple>
<string>
installed_version
</string>
<string>
Installed Version
</string>
</tuple>
<tuple>
<string>
short_revision
</string>
<string>
Revision
</string>
</tuple>
<tuple>
<string>
installed_revision
</string>
<string>
Installed Revision
</string>
...
...
@@ -367,10 +367,6 @@
<string>
license
</string>
<string>
License
</string>
</tuple>
<tuple>
<string>
version_state_title
</string>
<string>
State
</string>
</tuple>
</list>
</value>
</item>
...
...
product/ERP5/bootstrap/erp5_core/bt/revision
deleted
100644 → 0
View file @
c727c78a
41173
\ No newline at end of file
product/ERP5/bootstrap/erp5_jquery/bt/revision
deleted
100644 → 0
View file @
c727c78a
16
\ No newline at end of file
product/ERP5/bootstrap/erp5_mysql_innodb_catalog/bt/revision
deleted
100644 → 0
View file @
c727c78a
263
\ No newline at end of file
product/ERP5/bootstrap/erp5_mysql_ndb_catalog/bt/revision
deleted
100644 → 0
View file @
c727c78a
35
\ No newline at end of file
product/ERP5/bootstrap/erp5_property_sheets/bt/revision
deleted
100644 → 0
View file @
c727c78a
81
product/ERP5/bootstrap/erp5_xhtml_style/bt/revision
deleted
100644 → 0
View file @
c727c78a
1119
\ No newline at end of file
product/ERP5/genbt5list.py
0 → 120000
View file @
2eb560f6
bin
/
genbt5list
\ No newline at end of file
product/ERP5/tests/testBusinessTemplate.py
View file @
2eb560f6
...
...
@@ -2847,24 +2847,6 @@ class BusinessTemplateMixin(ERP5TypeTestCase, LogInterceptor):
self
.
assertTrue
(
base_category_obj
is
not
None
)
self
.
assertEqual
(
len
(
base_category_obj
.
objectIds
()),
0
)
def
stepCheckInitialRevision
(
self
,
sequence
=
None
,
**
kw
):
""" Check if revision of a new bt is an empty string
"""
bt
=
sequence
.
get
(
'current_bt'
)
self
.
assertEqual
(
bt
.
getRevision
(),
''
)
def
stepCheckFirstRevision
(
self
,
sequence
=
None
,
**
kw
):
""" Check if revision of the bt is 1
"""
bt
=
sequence
.
get
(
'current_bt'
)
self
.
assertEqual
(
bt
.
getRevision
(),
'1'
)
def
stepCheckSecondRevision
(
self
,
sequence
=
None
,
**
kw
):
""" Check if revision of the bt is 2
"""
bt
=
sequence
.
get
(
'current_bt'
)
self
.
assertEqual
(
bt
.
getRevision
(),
'2'
)
def
stepCheckNoMissingDependencies
(
self
,
sequence
=
None
,
**
kw
):
""" Check if bt has no missing dependency
"""
...
...
@@ -5149,26 +5131,6 @@ class TestBusinessTemplate(BusinessTemplateMixin):
sequence_list
.
addSequenceString
(
sequence_string
)
sequence_list
.
play
(
self
)
# test of portal types
def
test_22_RevisionNumberIsIncremented
(
self
):
"""Test is revision number is incremented with the bt is built"""
sequence_list
=
SequenceList
()
sequence_string
=
'
\
CreatePortalType
\
CreateNewBusinessTemplate
\
UseExportBusinessTemplate
\
CheckInitialRevision
\
BuildBusinessTemplate
\
CheckBuiltBuildingState
\
stepCheckFirstRevision
\
BuildBusinessTemplate
\
stepCheckSecondRevision
\
RemoveBusinessTemplate
\
RemovePortalType
\
'
sequence_list
.
addSequenceString
(
sequence_string
)
sequence_list
.
play
(
self
)
def
test_23_CheckNoDependencies
(
self
):
"""Test if a new Business Template has no dependencies"""
sequence_list
=
SequenceList
()
...
...
product/ERP5/tests/testTemplateTool.py
View file @
2eb560f6
...
...
@@ -31,7 +31,7 @@ import os
import
shutil
import
unittest
import
random
import
t
ransaction
import
t
empfile
from
App.config
import
getConfiguration
from
Products.ERP5VCS.WorkingCopy
import
getVcsTool
...
...
@@ -99,32 +99,23 @@ class TestTemplateTool(ERP5TypeTestCase):
def
testUpdateBT5FromRepository
(
self
,
quiet
=
quiet
,
run
=
run_all_test
):
""" Test the list of bt5 returned for upgrade """
# edit bt5 revision so that it will be marked as updatable
bt_list
=
self
.
templates_tool
.
searchFolder
(
title
=
'erp5_base'
)
self
.
assertEqual
(
len
(
bt_list
),
1
)
erp5_base
=
bt_list
[
0
].
getObject
()
try
:
erp5_base
.
edit
(
revision
=
0
)
updatable_bt_list
=
\
self
.
templates_tool
.
getRepositoryBusinessTemplateList
(
update_only
=
True
)
self
.
assertEqual
(
[
i
.
title
for
i
in
updatable_bt_list
if
i
.
title
==
"erp5_base"
],
[
"erp5_base"
])
erp5_base
.
replace
()
updatable_bt_list
=
\
self
.
templates_tool
.
getRepositoryBusinessTemplateList
(
update_only
=
True
)
self
.
assertEqual
(
[
i
.
title
for
i
in
updatable_bt_list
if
i
.
title
==
"erp5_base"
],
[])
finally
:
erp5_base
.
edit
(
revision
=
int
(
erp5_base
.
getRevision
())
+
10
)
erp5_base
=
self
.
templates_tool
.
getInstalledBusinessTemplate
(
'erp5_base'
,
strict
=
True
)
erp5_base
.
_setRevision
(
''
)
self
.
assertTrue
(
"erp5_base"
in
(
bt
.
getTitle
()
for
bt
in
self
.
templates_tool
.
getRepositoryBusinessTemplateList
(
update_only
=
True
)))
erp5_base
.
replace
()
self
.
assertFalse
(
"erp5_base"
in
(
bt
.
getTitle
()
for
bt
in
self
.
templates_tool
.
getRepositoryBusinessTemplateList
(
update_only
=
True
)))
self
.
abort
()
def
test_download_http
(
self
):
test_web
=
self
.
portal
.
portal_templates
.
download
(
'http://www.erp5.org/dists/snapshot/test_bt5/test_web.bt5'
)
self
.
assertEqual
(
test_web
.
getPortalType
(),
'Business Template'
)
self
.
assertEqual
(
test_web
.
getTitle
(),
'test_web'
)
self
.
assert
True
(
test_web
.
getRevision
()
)
self
.
assert
Equal
(
len
(
test_web
.
getRevision
()),
28
)
def
_svn_setup_ssl
(
self
):
"""
...
...
@@ -148,20 +139,20 @@ class TestTemplateTool(ERP5TypeTestCase):
test_web
=
self
.
portal
.
portal_templates
.
download
(
bt5_url
)
self
.
assertEqual
(
test_web
.
getPortalType
(),
'Business Template'
)
self
.
assertEqual
(
test_web
.
getTitle
(),
'test_web'
)
self
.
assert
True
(
test_web
.
getRevision
()
)
self
.
assert
Equal
(
len
(
test_web
.
getRevision
()),
28
)
def
test_updateBusinessTemplateFromUrl_simple
(
self
):
"""
Test updateBusinessTemplateFromUrl method
By default if a new business template has revision
>
= previous one
By default if a new business template has revision
!
= previous one
the new bt5 is not installed, only imported.
"""
self
.
_svn_setup_ssl
()
template_tool
=
self
.
portal
.
portal_templates
old_bt
=
template_tool
.
getInstalledBusinessTemplate
(
'erp5_csv_style'
)
#
change revision to an old
revision
old_bt
.
setRevision
(
0.0001
)
#
fake different
revision
old_bt
.
setRevision
(
''
)
url
=
'https://svn.erp5.org/repos/public/erp5/trunk/bt5/erp5_csv_style'
template_tool
.
updateBusinessTemplateFromUrl
(
url
)
new_bt
=
template_tool
.
getInstalledBusinessTemplate
(
'erp5_csv_style'
)
...
...
@@ -170,7 +161,7 @@ class TestTemplateTool(ERP5TypeTestCase):
# Test Another time with definning an ID
old_bt
=
new_bt
old_bt
.
setRevision
(
0.0002
)
old_bt
.
setRevision
(
''
)
template_tool
.
updateBusinessTemplateFromUrl
(
url
,
id
=
"new_erp5_csv_style"
)
new_bt
=
template_tool
.
getInstalledBusinessTemplate
(
'erp5_csv_style'
)
self
.
assertNotEquals
(
old_bt
,
new_bt
)
...
...
@@ -184,8 +175,7 @@ class TestTemplateTool(ERP5TypeTestCase):
self
.
assertEqual
(
old_bt
,
new_bt
)
self
.
assertEqual
(
'erp5_csv_style'
,
new_bt
.
getTitle
())
self
.
assertEqual
(
'new_erp5_csv_style'
,
new_bt
.
getId
())
not_installed_bt5
=
getattr
(
template_tool
,
"not_installed_bt5"
,
None
)
self
.
assertNotEquals
(
not_installed_bt5
,
None
)
not_installed_bt5
=
template_tool
[
'not_installed_bt5'
]
self
.
assertEqual
(
'erp5_csv_style'
,
not_installed_bt5
.
getTitle
())
self
.
assertEqual
(
not_installed_bt5
.
getInstallationState
(),
"not_installed"
)
...
...
@@ -204,10 +194,8 @@ class TestTemplateTool(ERP5TypeTestCase):
keep_original_list
=
keep_original_list
)
bt
=
template_tool
.
getInstalledBusinessTemplate
(
'test_core'
)
self
.
assertNotEquals
(
None
,
bt
)
erp5_test
=
getattr
(
self
.
portal
.
portal_skins
,
'erp5_test'
,
None
)
self
.
assertNotEquals
(
None
,
erp5_test
)
test_file
=
getattr
(
erp5_test
,
'test_file'
,
None
)
self
.
assertEqual
(
None
,
test_file
)
erp5_test
=
self
.
portal
.
portal_skins
[
'erp5_test'
]
self
.
assertFalse
(
erp5_test
.
hasObject
(
'test_file'
))
def
test_updateBusinessTemplateFromUrl_after_before_script
(
self
):
"""
...
...
@@ -248,48 +236,6 @@ class TestTemplateTool(ERP5TypeTestCase):
self
.
assertEqual
(
bt
.
getChangeLog
(),
'MODIFIED'
)
self
.
assertEqual
(
portal
.
getTitle
(),
'MODIFIED'
)
def
test_updateBusinessTemplateFromUrl_stringCastingBug
(
self
):
pt
=
self
.
getTemplateTool
()
template
=
pt
.
newContent
(
portal_type
=
'Business Template'
)
self
.
assertTrue
(
template
.
getBuildingState
()
==
'draft'
)
self
.
assertTrue
(
template
.
getInstallationState
()
==
'not_installed'
)
title
=
'install_casting_to_int_bug_check'
template
.
edit
(
title
=
title
,
version
=
'1.0'
,
description
=
'bt for unit_test'
)
self
.
commit
()
template
.
build
()
self
.
commit
()
cfg
=
getConfiguration
()
template_path
=
os
.
path
.
join
(
cfg
.
instancehome
,
'tests'
,
'%s'
%
(
title
,))
# remove previous version of bt it exists
if
os
.
path
.
exists
(
template_path
):
shutil
.
rmtree
(
template_path
)
template
.
export
(
path
=
template_path
,
local
=
1
)
self
.
assertTrue
(
os
.
path
.
exists
(
template_path
))
# setup version '9'
first_revision
=
'9'
open
(
os
.
path
.
join
(
template_path
,
'bt'
,
'revision'
),
'w'
).
write
(
first_revision
)
pt
.
updateBusinessTemplateFromUrl
(
template_path
)
new_bt
=
pt
.
getInstalledBusinessTemplate
(
title
)
self
.
assertEqual
(
new_bt
.
getRevision
(),
first_revision
)
# setup revision '11', becasue: '11' < '9' (string comp), but 11 > 9 (int comp)
second_revision
=
'11'
self
.
assertTrue
(
second_revision
<
first_revision
)
self
.
assertTrue
(
int
(
second_revision
)
>
int
(
first_revision
))
open
(
os
.
path
.
join
(
template_path
,
'bt'
,
'revision'
),
'w'
).
write
(
second_revision
)
pt
.
updateBusinessTemplateFromUrl
(
template_path
)
newer_bt
=
pt
.
getInstalledBusinessTemplate
(
title
)
self
.
assertNotEqual
(
new_bt
,
newer_bt
)
self
.
assertEqual
(
newer_bt
.
getRevision
(),
second_revision
)
def
test_CompareVersions
(
self
):
"""Tests compare version on template tool. """
compareVersions
=
self
.
getPortal
().
portal_templates
.
compareVersions
...
...
@@ -320,12 +266,45 @@ class TestTemplateTool(ERP5TypeTestCase):
self
.
assertEqual
(
None
,
self
.
getPortal
()
\
.
portal_templates
.
getInstalledBusinessTemplate
(
'erp5_toto'
))
def
test_getInstalledBusinessTemplateRevision
(
self
):
self
.
assertTrue
(
300
<
self
.
getPortal
()
\
.
portal_templates
.
getInstalledBusinessTemplateRevision
(
'erp5_core'
))
self
.
assertEqual
(
None
,
self
.
getPortal
()
\
.
portal_templates
.
getInstalledBusinessTemplateRevision
(
'erp5_toto'
))
def
test_revision
(
self
):
template_tool
=
self
.
portal
.
portal_templates
getInstalledRevision
=
template_tool
.
getInstalledBusinessTemplateRevision
self
.
assertEqual
(
None
,
getInstalledRevision
(
'erp5_toto'
))
available_bt
,
=
template_tool
.
getRepositoryBusinessTemplateList
(
template_list
=
(
'test_core'
,))
revision
=
available_bt
.
getRevision
()
self
.
assertEqual
(
'PN8VPt52MbdHtxfjKvL+MBsNbzM='
,
revision
)
installed_bt
=
template_tool
.
download
(
"%s/%s"
%
(
available_bt
.
repository
,
available_bt
.
filename
))
self
.
assertEqual
(
revision
,
installed_bt
.
getRevision
())
installed_bt
.
install
()
self
.
assertEqual
(
revision
,
getInstalledRevision
(
'test_core'
))
bt
=
installed_bt
.
Base_createCloneDocument
(
batch_mode
=
1
)
bt
.
build
(
update_revision
=
False
)
root
=
tempfile
.
mkdtemp
()
try
:
bt
.
export
(
root
,
local
=
1
)
with
open
(
os
.
path
.
join
(
root
,
'bt'
,
'title'
))
as
f
:
self
.
assertTrue
(
'test_core'
,
f
.
read
())
# We don't export revision anymore.
self
.
assertFalse
(
os
.
path
.
exists
(
os
.
path
.
join
(
root
,
'bt'
,
'revision'
)))
# Computed at download ...
self
.
assertEqual
(
revision
,
template_tool
.
download
(
root
).
getRevision
())
finally
:
shutil
.
rmtree
(
root
)
bt
.
_setVersion
(
"2.0"
)
# ... at building by default ...
bt
.
build
()
revision
=
bt
.
getRevision
()
self
.
assertEqual
(
'tPNr/gGXaa0fYCsFUWe8nqzSNLc='
,
revision
)
self
.
portal
.
portal_skins
.
erp5_test
.
manage_renameObject
(
'test_file'
,
'test_file2'
)
bt
.
build
(
update_revision
=
False
)
self
.
assertEqual
(
revision
,
bt
.
getRevision
())
# ... and at export.
bt
.
export
(
str
(
random
.
random
()))
self
.
assertEqual
(
'Nup/xsO1xpsmdJ5GTdknuVJyOr8='
,
bt
.
getRevision
())
self
.
abort
()
def
test_getInstalledBusinessTemplateList
(
self
):
templates_tool
=
self
.
getPortal
().
portal_templates
...
...
@@ -479,9 +458,9 @@ class TestTemplateTool(ERP5TypeTestCase):
bt_old
=
self
.
templates_tool
.
getInstalledBusinessTemplate
(
bt5_name
,
strict
=
True
)
self
.
assertEqual
(
bt
.
getId
(),
bt_old
.
getId
())
# Repeat operation, new bt5 should be inslalled due only_
newer
= False
# Repeat operation, new bt5 should be inslalled due only_
different
= False
operation_log
=
self
.
templates_tool
.
installBusinessTemplateListFromRepository
(
[
bt5_name
],
only_
newer
=
False
)
[
bt5_name
],
only_
different
=
False
)
self
.
assertTrue
(
"Installed %s with"
%
bt5_name
in
operation_log
[
-
1
])
bt_new
=
self
.
templates_tool
.
getInstalledBusinessTemplate
(
bt5_name
,
...
...
@@ -498,7 +477,7 @@ class TestTemplateTool(ERP5TypeTestCase):
bt
=
template_tool
.
getInstalledBusinessTemplate
(
bt5_name
)
self
.
assertEqual
(
bt
,
None
)
operation_log
=
template_tool
.
installBusinessTemplateListFromRepository
([
bt5_name
],
only_
newer
=
False
,
update_catalog
=
0
)
only_
different
=
False
,
update_catalog
=
0
)
self
.
assertTrue
(
"Installed %s with"
%
bt5_name
in
operation_log
[
0
])
bt
=
template_tool
.
getInstalledBusinessTemplate
(
bt5_name
)
...
...
@@ -514,7 +493,7 @@ class TestTemplateTool(ERP5TypeTestCase):
bt5_name
=
'erp5_odt_style'
operation_log
=
template_tool
.
installBusinessTemplateListFromRepository
([
bt5_name
],
only_
newer
=
False
,
update_catalog
=
1
)
only_
different
=
False
,
update_catalog
=
1
)
self
.
assertTrue
(
"Installed %s with"
%
bt5_name
in
operation_log
[
-
1
])
bt
=
template_tool
.
getInstalledBusinessTemplate
(
bt5_name
)
self
.
assertEqual
(
bt
.
getTitle
(),
bt5_name
)
...
...
@@ -524,7 +503,7 @@ class TestTemplateTool(ERP5TypeTestCase):
# Install again should not force catalog to be updated
operation_log
=
template_tool
.
installBusinessTemplateListFromRepository
(
[
bt5_name
],
only_
newer
=
False
)
[
bt5_name
],
only_
different
=
False
)
self
.
assertTrue
(
"Installed %s with"
%
bt5_name
in
operation_log
[
-
1
])
bt
=
template_tool
.
getInstalledBusinessTemplate
(
bt5_name
)
self
.
assertNotEquals
(
bt
,
None
)
...
...
@@ -609,7 +588,7 @@ class TestTemplateTool(ERP5TypeTestCase):
self
.
assertNotEquals
(
bt
,
None
)
bt
=
template_tool
.
getInstalledBusinessTemplate
(
"erp5_workflow"
)
self
.
assertNotEquals
(
bt
,
None
)
transaction
.
abort
()
self
.
abort
()
# Same as above but also check that dependencies are properly resolved if
# one of the dependency is explicitly added to the list of bt5 to be
...
...
@@ -625,22 +604,23 @@ class TestTemplateTool(ERP5TypeTestCase):
self
.
assertNotEquals
(
bt
,
None
)
bt
=
template_tool
.
getInstalledBusinessTemplate
(
"erp5_workflow"
)
self
.
assertNotEquals
(
bt
,
None
)
transaction
.
abort
()
self
.
abort
()
def
test_installBusinessTemplateListFromRepository_ignore_when_installed
(
self
):
"""Check that install one business template, this method does not download
many business templates that are already installed
"""
template_tool
=
self
.
portal
.
portal_templates
# Delete not installed bt5 to check easily if more not installed was
# created
for
bt5
in
template_tool
.
getBuiltBusinessTemplateList
():
bt5
.
delete
()
bt5_name_list
=
[
'erp5_calendar'
]
template_tool
.
installBusinessTemplateListFromRepository
(
bt5_name_list
,
before
=
dict
((
bt
.
getTitle
(),
bt
.
getId
())
for
bt
in
template_tool
.
getInstalledBusinessTemplateList
())
bt_title
=
'erp5_calendar'
template_tool
.
installBusinessTemplateListFromRepository
([
bt_title
],
install_dependency
=
True
)
self
.
tic
()
self
.
assertEquals
(
template_tool
.
getBuiltBusinessTemplateList
(),
[])
after
=
dict
((
bt
.
getTitle
(),
bt
.
getId
())
for
bt
in
template_tool
.
getInstalledBusinessTemplateList
())
del
after
[
bt_title
]
self
.
assertEqual
(
before
,
after
)
def
test_sortBusinessTemplateList
(
self
):
"""Check sorting of a list of business template by their dependencies
...
...
product/ERP5/tests/test_data/test_167_InstanceAndRelatedClassDefinedInSameBT/bt/revision
deleted
100644 → 0
View file @
c727c78a
2
\ No newline at end of file
product/ERP5Type/tests/ERP5TypeTestCase.py
View file @
2eb560f6
...
...
@@ -492,43 +492,15 @@ class ERP5TypeTestCaseMixin(ProcessingNodeTestCase, PortalTestCase):
%
', '
.
join
(
not_found_list
))
return
new_template_list
def
setupAutomaticBusinessTemplateRepository
(
self
,
accept_public
=
True
,
searchable_business_template_list
=
None
):
# Try to setup some valid Repository List by reusing ERP5TypeTestCase API.
# if accept_public we can accept public repository can be set, otherwise
# we let failure happens.
if
searchable_business_template_list
is
None
:
searchable_business_template_list
=
[
"erp5_base"
]
# Assume that the public official repository is a valid repository
public_bt5_repository_list
=
[
'http://www.erp5.org/dists/snapshot/bt5/'
]
template_list
=
[]
for
bt_id
in
searchable_business_template_list
:
bt_template_list
=
self
.
_getBTPathAndIdList
([
bt_id
])
if
len
(
bt_template_list
):
template_list
.
append
(
bt_template_list
[
0
])
if
len
(
template_list
)
>
0
:
bt5_repository_path_list
=
[
"/"
.
join
(
x
[
0
].
split
(
"/"
)[:
-
1
])
for
x
in
template_list
]
if
accept_public
:
try
:
self
.
portal
.
portal_templates
.
updateRepositoryBusinessTemplateList
(
bt5_repository_path_list
,
None
)
except
(
RuntimeError
,
IOError
),
e
:
# If bt5 repository is not a repository use public one.
self
.
portal
.
portal_templates
.
updateRepositoryBusinessTemplateList
(
public_bt5_repository_list
)
else
:
self
.
portal
.
portal_templates
.
updateRepositoryBusinessTemplateList
(
bt5_repository_path_list
,
None
)
elif
accept_public
:
self
.
portal
.
portal_templates
.
updateRepositoryBusinessTemplateList
(
public_bt5_repository_list
)
else
:
raise
ValueError
(
"ERP5 was unable to determinate a valid local "
+
\
"repository, please check your environment or "
+
\
"use accept_public as True"
)
def
setupAutomaticBusinessTemplateRepository
(
self
,
searchable_business_template_list
=
(
"erp5_base"
,)):
template_tool
=
self
.
portal
.
portal_templates
bt_set
=
set
(
searchable_business_template_list
).
difference
(
x
[
'title'
]
for
x
in
template_tool
.
repository_dict
.
itervalues
()
for
x
in
x
)
if
bt_set
:
template_tool
.
updateRepositoryBusinessTemplateList
(
set
(
os
.
path
.
dirname
(
x
[
0
])
for
x
in
self
.
_getBTPathAndIdList
(
bt_set
)),
genbt5list
=
1
)
def
failIfDifferentSet
(
self
,
a
,
b
,
msg
=
""
):
if
not
msg
:
...
...
product/ERP5VCS/Git.py
View file @
2eb560f6
...
...
@@ -316,6 +316,11 @@ class Git(WorkingCopy):
#except AttributeError:
# pass
def
getRevision
(
self
,
dirty
=
False
):
if
dirty
and
self
.
_git
(
'diff-index'
,
'--quiet'
,
'HEAD'
).
wait
():
return
self
.
git
(
'rev-parse'
,
'--short'
,
'HEAD'
)
+
'+'
return
self
.
git
(
'rev-parse'
,
'HEAD'
)
def
commit
(
self
,
changelog
,
added
=
(),
modified
=
(),
removed
=
()):
context
=
self
.
aq_parent
request
=
context
.
REQUEST
...
...
product/ERP5VCS/Subversion.py
View file @
2eb560f6
...
...
@@ -65,10 +65,17 @@ class Subversion(WorkingCopy):
_login_cookie_name
=
'erp5_subversion_login'
_ssl_trust_cookie_name
=
'erp5_subversion_ssl_trust'
def
__init__
(
self
,
path
):
WorkingCopy
.
__init__
(
self
,
path
)
if
path
and
not
os
.
path
.
exists
(
os
.
path
.
join
(
self
.
working_copy
,
'.svn'
)):
raise
NotAWorkingCopyError
(
self
.
working_copy
)
def
__init__
(
self
,
*
args
,
**
kw
):
WorkingCopy
.
__init__
(
self
,
*
args
,
**
kw
)
try
:
path
=
self
.
working_copy
except
AttributeError
:
return
from
pysvn
import
ClientError
try
:
self
.
getRevision
()
except
(
ClientError
,
KeyError
):
raise
NotAWorkingCopyError
(
path
)
def
setLogin
(
self
,
realm
,
user
,
password
):
"""Set login information.
...
...
@@ -159,6 +166,12 @@ class Subversion(WorkingCopy):
def
getRemoteComment
(
self
):
return
'r%s'
%
self
.
info
()[
'revision'
]
def
getRevision
(
self
,
dirty
=
False
):
r
=
self
.
info
()[
'commit_revision'
]
if
dirty
and
self
.
_getClient
().
status
(
self
.
working_copy
,
get_all
=
False
):
return
"%s+"
%
r
return
r
def
export
(
self
,
path
,
url
):
return
self
.
_getClient
().
export
(
path
,
url
)
...
...
product/ERP5VCS/WorkingCopy.py
View file @
2eb560f6
...
...
@@ -89,9 +89,9 @@ class WorkingCopy(Implicit):
if
cls
.
reference
:
cls
.
_registry
.
append
((
cls
.
reference
,
cls
))
def
__init__
(
self
,
path
=
None
):
def
__init__
(
self
,
path
=
None
,
restricted
=
False
):
if
path
:
self
.
working_copy
=
self
.
checkWorkingPath
(
path
)
self
.
working_copy
=
self
.
checkWorkingPath
(
path
,
restricted
)
def
getWorkingCopyList
(
self
):
working_copy_list
=
[]
...
...
@@ -111,7 +111,7 @@ class WorkingCopy(Implicit):
os
.
mkdir
(
path
)
self
.
working_copy
=
path
def
checkWorkingPath
(
self
,
path
):
def
checkWorkingPath
(
self
,
path
,
restricted
):
# First remove any '..' to prevent escaping.
# Note that 'normpath' ignore symlinks so it would not do it correctly.
parts
=
path
.
split
(
os
.
sep
)
...
...
@@ -124,11 +124,14 @@ class WorkingCopy(Implicit):
# Allow symlinks inside instance home.
path
=
os
.
path
.
normpath
(
path
)
real_path
=
os
.
path
.
realpath
(
path
)
for
allowed
in
getConfiguration
().
instancehome
,
gettempdir
():
if
issubdir
(
allowed
,
path
)
or
issubdir
(
allowed
,
real_path
):
return
real_path
raise
Unauthorized
(
"Unauthorized access to path %r."
" It is NOT in your Zope home instance."
%
path
)
if
restricted
and
not
any
(
issubdir
(
allowed
,
path
)
or
issubdir
(
allowed
,
real_path
)
for
allowed
in
(
getConfiguration
().
instancehome
,
gettempdir
())):
raise
Unauthorized
(
"Unauthorized access to path %r."
" It is NOT in your Zope home instance."
%
path
)
if
os
.
path
.
isdir
(
real_path
):
return
real_path
raise
NotAWorkingCopyError
(
real_path
)
def
_getCookie
(
self
,
name
,
default
=
None
):
try
:
...
...
@@ -186,7 +189,7 @@ class WorkingCopy(Implicit):
"""
if
business_template
.
getBuildingState
()
==
'draft'
:
business_template
.
edit
()
business_template
.
build
()
business_template
.
build
(
update_revision
=
False
)
self
.
_export
(
business_template
)
def
_export
(
self
,
business_template
):
...
...
@@ -199,16 +202,6 @@ class WorkingCopy(Implicit):
def
update
(
self
,
keep
=
False
):
raise
NotAWorkingCopyError
def
newRevision
(
self
):
path
=
os
.
path
.
join
(
'bt'
,
'revision'
)
try
:
revision
=
int
(
self
.
showOld
(
path
))
+
1
except
NotVersionedError
:
return
1
with
open
(
os
.
path
.
join
(
self
.
working_copy
,
path
),
'w'
)
as
file
:
file
.
write
(
str
(
revision
))
return
revision
def
hasDiff
(
self
,
path
):
try
:
hasDiff
=
aq_base
(
self
).
__hasDiff
...
...
@@ -328,7 +321,7 @@ class WorkingCopy(Implicit):
title
=
'tmp_bt_revert'
,
template_path_list
=
path_added_list
)
tmp_bt
.
edit
()
tmp_bt
.
build
()
tmp_bt
.
build
(
update_revision
=
False
)
# Install then uninstall it to remove objects from ZODB
tmp_bt
.
install
()
tmp_bt
.
uninstall
()
...
...
@@ -338,16 +331,16 @@ class WorkingCopy(Implicit):
installed_bt
.
reinstall
(
object_to_update
=
object_to_update
,
force
=
0
)
def
getVcsTool
(
vcs
=
None
,
path
=
None
):
def
getVcsTool
(
vcs
=
None
,
path
=
None
,
restricted
=
False
):
if
vcs
:
for
x
in
WorkingCopy
.
_registry
:
if
x
[
0
]
==
vcs
:
return
x
[
1
](
path
)
return
x
[
1
](
path
,
restricted
)
raise
ValueError
(
"Unsupported Version Control System: %s"
%
vcs
)
elif
path
:
for
x
in
WorkingCopy
.
_registry
:
try
:
return
x
[
1
](
path
)
return
x
[
1
](
path
,
restricted
)
except
NotAWorkingCopyError
:
pass
raise
NotAWorkingCopyError
(
path
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment