summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--addons/account/account.py44
-rw-r--r--addons/account/account_analytic_line.py2
-rw-r--r--addons/account/account_bank_statement.py4
-rw-r--r--addons/account/account_cash_statement.py4
-rw-r--r--addons/account/account_financial_report.py2
-rw-r--r--addons/account/account_invoice.py36
-rw-r--r--addons/account/account_invoice_view.xml16
-rw-r--r--addons/account/account_move_line.py40
-rw-r--r--addons/account/account_report.xml2
-rw-r--r--addons/account/account_view.xml30
-rw-r--r--addons/account/company.py1
-rw-r--r--addons/account/i18n/nl_BE.po264
-rw-r--r--addons/account/i18n/pt_BR.po25
-rw-r--r--addons/account/i18n/zh_CN.po10
-rw-r--r--addons/account/installer.py59
-rw-r--r--addons/account/ir_sequence.py2
-rw-r--r--addons/account/partner.py9
-rw-r--r--addons/account/partner_view.xml42
-rw-r--r--addons/account/product.py2
-rw-r--r--addons/account/project/project.py2
-rw-r--r--addons/account/project/project_view.xml2
-rw-r--r--addons/account/project/wizard/account_analytic_balance_report.py1
-rw-r--r--addons/account/project/wizard/account_analytic_chart.py1
-rw-r--r--addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py1
-rw-r--r--addons/account/project/wizard/account_analytic_cost_ledger_report.py1
-rw-r--r--addons/account/project/wizard/account_analytic_inverted_balance_report.py1
-rw-r--r--addons/account/project/wizard/account_analytic_journal_report.py1
-rw-r--r--addons/account/project/wizard/project_account_analytic_line.py1
-rw-r--r--addons/account/report/account_analytic_entries_report.py1
-rw-r--r--addons/account/report/account_entries_report.py5
-rw-r--r--addons/account/report/account_invoice_report.py13
-rw-r--r--addons/account/report/account_invoice_report_view.xml4
-rw-r--r--addons/account/report/account_print_invoice.rml2
-rw-r--r--addons/account/report/account_print_overdue.py3
-rw-r--r--addons/account/report/account_report.py6
-rw-r--r--addons/account/report/account_treasury_report.py1
-rw-r--r--addons/account/res_currency.py1
-rw-r--r--addons/account/static/src/js/account_move_reconciliation.js2
-rw-r--r--addons/account/test/account_report.yml10
-rw-r--r--addons/account/wizard/account_automatic_reconcile.py1
-rw-r--r--addons/account/wizard/account_change_currency.py1
-rw-r--r--addons/account/wizard/account_chart.py1
-rw-r--r--addons/account/wizard/account_financial_report.py1
-rw-r--r--addons/account/wizard/account_fiscalyear_close.py1
-rw-r--r--addons/account/wizard/account_fiscalyear_close_state.py1
-rw-r--r--addons/account/wizard/account_invoice_refund.py5
-rw-r--r--addons/account/wizard/account_invoice_state.py2
-rw-r--r--addons/account/wizard/account_journal_select.py1
-rw-r--r--addons/account/wizard/account_move_bank_reconcile.py1
-rw-r--r--addons/account/wizard/account_move_line_reconcile_select.py1
-rw-r--r--addons/account/wizard/account_move_line_select.py1
-rw-r--r--addons/account/wizard/account_move_line_unreconcile_select.py1
-rw-r--r--addons/account/wizard/account_open_closed_fiscalyear.py1
-rw-r--r--addons/account/wizard/account_period_close.py1
-rw-r--r--addons/account/wizard/account_reconcile.py3
-rw-r--r--addons/account/wizard/account_reconcile_partner_process.py1
-rw-r--r--addons/account/wizard/account_report_account_balance.py1
-rw-r--r--addons/account/wizard/account_report_aged_partner_balance.py1
-rw-r--r--addons/account/wizard/account_report_central_journal.py1
-rw-r--r--addons/account/wizard/account_report_common.py1
-rw-r--r--addons/account/wizard/account_report_common_account.py1
-rw-r--r--addons/account/wizard/account_report_common_journal.py1
-rw-r--r--addons/account/wizard/account_report_common_partner.py1
-rw-r--r--addons/account/wizard/account_report_general_journal.py1
-rw-r--r--addons/account/wizard/account_report_general_ledger.py1
-rw-r--r--addons/account/wizard/account_report_partner_balance.py1
-rw-r--r--addons/account/wizard/account_report_partner_ledger.py1
-rw-r--r--addons/account/wizard/account_report_print_journal.py1
-rw-r--r--addons/account/wizard/account_state_open.py2
-rw-r--r--addons/account/wizard/account_subscription_generate.py1
-rw-r--r--addons/account/wizard/account_tax_chart.py3
-rw-r--r--addons/account/wizard/account_unreconcile.py2
-rw-r--r--addons/account/wizard/account_use_model.py1
-rw-r--r--addons/account/wizard/account_validate_account_move.py2
-rw-r--r--addons/account/wizard/account_vat.py1
-rw-r--r--addons/account/wizard/pos_box.py6
-rw-r--r--addons/account_analytic_analysis/account_analytic_analysis.py9
-rw-r--r--addons/account_analytic_analysis/account_analytic_analysis_view.xml4
-rw-r--r--addons/account_analytic_default/account_analytic_default.py4
-rw-r--r--addons/account_analytic_default/i18n/nl_BE.po15
-rw-r--r--addons/account_analytic_plans/account_analytic_plans.py20
-rw-r--r--addons/account_analytic_plans/account_analytic_plans_view.xml24
-rw-r--r--addons/account_analytic_plans/test/acount_analytic_plans_report.yml7
-rw-r--r--addons/account_analytic_plans/wizard/account_crossovered_analytic.py1
-rw-r--r--addons/account_analytic_plans/wizard/analytic_plan_create_model.py1
-rw-r--r--addons/account_anglo_saxon/product.py2
-rw-r--r--addons/account_anglo_saxon/purchase.py1
-rw-r--r--addons/account_anglo_saxon/stock.py1
-rw-r--r--addons/account_asset/account_asset.py9
-rw-r--r--addons/account_asset/account_asset_invoice.py2
-rw-r--r--addons/account_asset/account_asset_view.xml2
-rw-r--r--addons/account_asset/i18n/nl_BE.po19
-rw-r--r--addons/account_asset/report/account_asset_report.py1
-rw-r--r--addons/account_asset/report/account_asset_report_view.xml2
-rwxr-xr-xaddons/account_asset/wizard/account_asset_change_duration.py1
-rwxr-xr-xaddons/account_asset/wizard/wizard_asset_compute.py3
-rw-r--r--addons/account_bank_statement_extensions/account_bank_statement.py3
-rw-r--r--addons/account_bank_statement_extensions/i18n/cs.po357
-rw-r--r--addons/account_bank_statement_extensions/i18n/hu.po362
-rw-r--r--addons/account_bank_statement_extensions/res_partner_bank.py1
-rw-r--r--addons/account_bank_statement_extensions/wizard/cancel_statement_line.py1
-rw-r--r--addons/account_bank_statement_extensions/wizard/confirm_statement_line.py1
-rw-r--r--addons/account_budget/account_budget.py4
-rw-r--r--addons/account_budget/wizard/account_budget_analytic.py1
-rw-r--r--addons/account_budget/wizard/account_budget_crossovered_report.py1
-rw-r--r--addons/account_budget/wizard/account_budget_crossovered_summary_report.py1
-rw-r--r--addons/account_budget/wizard/account_budget_report.py1
-rw-r--r--addons/account_cancel/i18n/hu.po10
-rw-r--r--addons/account_check_writing/account.py2
-rw-r--r--addons/account_check_writing/account_voucher.py1
-rw-r--r--addons/account_check_writing/i18n/hu.po247
-rw-r--r--addons/account_check_writing/wizard/account_check_batch_printing.py1
-rw-r--r--addons/account_followup/account_followup_customers.xml4
-rw-r--r--addons/account_followup/i18n/hu.po453
-rw-r--r--addons/account_followup/i18n/nl_BE.po508
-rw-r--r--addons/account_followup/report/account_followup_report.py1
-rw-r--r--addons/account_followup/tests/test_account_followup.py2
-rw-r--r--addons/account_followup/wizard/account_followup_print.py3
-rw-r--r--addons/account_payment/account_invoice.py1
-rw-r--r--addons/account_payment/account_move_line.py1
-rw-r--r--addons/account_payment/account_payment.py3
-rw-r--r--addons/account_payment/report/order.rml4
-rw-r--r--addons/account_payment/test/account_payment_report.yml5
-rw-r--r--addons/account_payment/wizard/account_payment_order.py1
-rw-r--r--addons/account_payment/wizard/account_payment_pay.py1
-rw-r--r--addons/account_payment/wizard/account_payment_populate_statement.py1
-rw-r--r--addons/account_sequence/account_sequence.py3
-rw-r--r--addons/account_sequence/account_sequence_installer.py1
-rw-r--r--addons/account_sequence/i18n/cs.po150
-rw-r--r--addons/account_test/account_test.py1
-rw-r--r--addons/account_test/i18n/cs.po241
-rw-r--r--addons/account_test/i18n/hu.po241
-rw-r--r--addons/account_voucher/account_voucher.py6
-rw-r--r--addons/account_voucher/account_voucher_view.xml2
-rw-r--r--addons/account_voucher/i18n/hu.po238
-rw-r--r--addons/account_voucher/i18n/nl_BE.po28
-rw-r--r--addons/account_voucher/invoice.py1
-rw-r--r--addons/account_voucher/report/account_voucher_sales_receipt.py1
-rw-r--r--addons/account_voucher/test/account_voucher_report.yml5
-rw-r--r--addons/account_voucher/test/case5_suppl_usd_usd.yml1
-rw-r--r--addons/account_voucher/test/sales_payment.yml1
-rw-r--r--addons/account_voucher/test/sales_receipt.yml1
-rw-r--r--addons/account_voucher/voucher_payment_receipt_view.xml4
-rw-r--r--addons/account_voucher/voucher_sales_purchase_view.xml4
-rw-r--r--addons/account_voucher/wizard/account_statement_from_invoice.py1
-rw-r--r--addons/analytic/analytic.py10
-rw-r--r--addons/analytic/i18n/lt.po388
-rw-r--r--addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py1
-rw-r--r--addons/analytic_contract_hr_expense/i18n/cs.po72
-rw-r--r--addons/analytic_contract_hr_expense/i18n/nl_BE.po72
-rw-r--r--addons/anonymization/anonymization.py4
-rw-r--r--addons/anonymization/i18n/cs.po331
-rw-r--r--addons/audittrail/audittrail.py17
-rw-r--r--addons/audittrail/wizard/audittrail_view_log.py1
-rw-r--r--addons/auth_crypt/i18n/cs.po41
-rw-r--r--addons/auth_crypt/i18n/lt.po28
-rw-r--r--addons/auth_crypt/i18n/nl_BE.po44
-rw-r--r--addons/auth_ldap/i18n/cs.po159
-rw-r--r--addons/auth_ldap/users_ldap.py3
-rw-r--r--addons/auth_oauth/i18n/cs.po135
-rw-r--r--addons/auth_oauth/static/src/js/auth_oauth.js6
-rw-r--r--addons/auth_oauth_signup/i18n/cs.po23
-rw-r--r--addons/auth_oauth_signup/i18n/lt.po23
-rw-r--r--addons/auth_oauth_signup/i18n/nl_BE.po23
-rw-r--r--addons/auth_openid/i18n/cs.po97
-rw-r--r--addons/auth_openid/res_users.py1
-rw-r--r--addons/auth_signup/i18n/cs.po279
-rw-r--r--addons/auth_signup/i18n/lt.po279
-rw-r--r--addons/auth_signup/i18n/zh_CN.po10
-rw-r--r--addons/auth_signup/res_users.py3
-rw-r--r--addons/base_action_rule/base_action_rule.py8
-rw-r--r--addons/base_calendar/base_calendar.py19
-rw-r--r--addons/base_calendar/base_calendar_data.xml2
-rw-r--r--addons/base_calendar/crm_meeting.py2
-rw-r--r--addons/base_calendar/i18n/es_MX.po1424
-rw-r--r--addons/base_crypt/i18n/nl_BE.po10
-rw-r--r--addons/base_gengo/i18n/cs.po249
-rw-r--r--addons/base_iban/base_iban.py1
-rw-r--r--addons/base_import/i18n/cs.po1164
-rw-r--r--addons/base_import/i18n/hu.po274
-rw-r--r--addons/base_report_designer/base_report_designer.py21
-rw-r--r--addons/base_report_designer/base_report_designer_installer.xml2
-rw-r--r--addons/base_report_designer/installer.py8
-rw-r--r--addons/base_report_designer/openerp_sxw2rml/normalized_odt2rml.xsl2
-rw-r--r--addons/base_report_designer/openerp_sxw2rml/normalized_oo2rml.xsl2
-rw-r--r--addons/base_report_designer/static/base-report-designer-plugin/openerp_report_designer.zip (renamed from addons/base_report_designer/plugin/openerp_report_designer.zip)bin116477 -> 116477 bytes
-rw-r--r--addons/base_report_designer/wizard/base_report_designer_modify.py3
-rw-r--r--addons/base_setup/i18n/nl_BE.po116
-rw-r--r--addons/base_status/i18n/cs.po76
-rw-r--r--addons/base_status/i18n/lt.po76
-rw-r--r--addons/base_status/i18n/nl_BE.po80
-rw-r--r--addons/base_vat/base_vat.py4
-rw-r--r--addons/base_vat/i18n/nl_BE.po10
-rw-r--r--addons/board/static/src/js/dashboard.js6
-rw-r--r--addons/claim_from_delivery/i18n/nl_BE.po12
-rw-r--r--addons/contacts/i18n/lt.po45
-rw-r--r--addons/contacts/i18n/nl_BE.po46
-rw-r--r--addons/crm/__init__.py1
-rw-r--r--addons/crm/__openerp__.py42
-rw-r--r--addons/crm/base_partner_merge.py760
-rw-r--r--addons/crm/base_partner_merge_view.xml138
-rw-r--r--addons/crm/crm.py31
-rw-r--r--addons/crm/crm_case_section_view.xml294
-rw-r--r--addons/crm/crm_data.xml10
-rw-r--r--addons/crm/crm_lead.py47
-rw-r--r--addons/crm/crm_lead_data.xml49
-rw-r--r--addons/crm/crm_lead_menu.xml78
-rw-r--r--addons/crm/crm_lead_view.xml34
-rw-r--r--addons/crm/crm_meeting.py7
-rw-r--r--addons/crm/crm_phonecall_view.xml8
-rw-r--r--addons/crm/crm_report_view.xml35
-rw-r--r--addons/crm/crm_segmentation.py2
-rw-r--r--addons/crm/crm_view.xml122
-rw-r--r--addons/crm/i18n/es_MX.po4307
-rw-r--r--addons/crm/i18n/hu.po12
-rw-r--r--addons/crm/i18n/nl_BE.po289
-rw-r--r--addons/crm/report/crm_lead_report.py1
-rw-r--r--addons/crm/report/crm_lead_report_view.xml11
-rw-r--r--addons/crm/report/crm_phonecall_report.py1
-rw-r--r--addons/crm/report/crm_phonecall_report_view.xml8
-rw-r--r--addons/crm/report/report_businessopp.py1
-rw-r--r--addons/crm/res_config.py47
-rw-r--r--addons/crm/res_config_view.xml15
-rw-r--r--addons/crm/res_partner.py1
-rw-r--r--addons/crm/res_partner_view.xml9
-rw-r--r--addons/crm/security/crm_security.xml13
-rw-r--r--addons/crm/security/ir.model.access.csv4
-rw-r--r--addons/crm/static/src/css/crm.css42
-rw-r--r--addons/crm/static/src/js/crm.js11
-rw-r--r--addons/crm/test/crm_lead_cancel.yml (renamed from addons/crm/test/process/cancel_lead.yml)0
-rw-r--r--addons/crm/test/crm_lead_copy.yml (renamed from addons/crm/test/ui/duplicate_lead.yml)0
-rw-r--r--addons/crm/test/crm_lead_merge.yml (renamed from addons/crm/test/process/merge_opportunity.yml)9
-rw-r--r--addons/crm/test/crm_lead_message.yml (renamed from addons/crm/test/process/communication_with_customer.yml)3
-rw-r--r--addons/crm/test/crm_lead_onchange.yml (renamed from addons/crm/test/ui/crm_demo.yml)0
-rw-r--r--addons/crm/test/crm_lead_unlink.yml (renamed from addons/crm/test/ui/delete_lead.yml)0
-rw-r--r--addons/crm/test/lead2opportunity2win.yml (renamed from addons/crm/test/process/lead2opportunity2win.yml)0
-rw-r--r--addons/crm/test/lead2opportunity_assign_salesmen.yml (renamed from addons/crm/test/process/lead2opportunity_assign_salesmen.yml)0
-rw-r--r--addons/crm/test/phonecalls.yml (renamed from addons/crm/test/process/phonecalls.yml)0
-rw-r--r--addons/crm/test/segmentation.yml (renamed from addons/crm/test/process/segmentation.yml)0
-rw-r--r--addons/crm/validate_email.py123
-rw-r--r--addons/crm/wizard/crm_lead_to_opportunity_view.xml6
-rw-r--r--addons/crm/wizard/crm_merge_opportunities_view.xml2
-rw-r--r--addons/crm/wizard/crm_opportunity_to_phonecall.py1
-rw-r--r--addons/crm/wizard/crm_opportunity_to_phonecall_view.xml2
-rw-r--r--addons/crm/wizard/crm_phonecall_to_meeting.py1
-rw-r--r--addons/crm/wizard/crm_phonecall_to_phonecall.py1
-rw-r--r--addons/crm/wizard/crm_phonecall_to_phonecall_view.xml2
-rw-r--r--addons/crm_claim/__init__.py1
-rw-r--r--addons/crm_claim/__openerp__.py1
-rw-r--r--addons/crm_claim/crm_claim_view.xml4
-rw-r--r--addons/crm_claim/i18n/cs.po881
-rw-r--r--addons/crm_claim/i18n/ko.po906
-rw-r--r--addons/crm_claim/report/crm_claim_report.py1
-rw-r--r--addons/crm_claim/report/crm_claim_report_view.xml8
-rw-r--r--addons/crm_claim/res_config_view.xml23
-rw-r--r--addons/crm_claim/test/process/claim.yml3
-rw-r--r--addons/crm_helpdesk/crm_helpdesk_view.xml8
-rw-r--r--addons/crm_helpdesk/i18n/cs.po708
-rw-r--r--addons/crm_helpdesk/i18n/ko.po726
-rw-r--r--addons/crm_helpdesk/report/crm_helpdesk_report.py1
-rw-r--r--addons/crm_helpdesk/report/crm_helpdesk_report_view.xml5
-rw-r--r--addons/crm_helpdesk/test/process/help-desk.yml3
-rw-r--r--addons/crm_partner_assign/i18n/cs.po931
-rw-r--r--addons/crm_partner_assign/i18n/ko.po932
-rw-r--r--addons/crm_partner_assign/report/crm_lead_report.py1
-rw-r--r--addons/crm_partner_assign/report/crm_lead_report_view.xml4
-rw-r--r--addons/crm_partner_assign/report/crm_partner_report.py1
-rw-r--r--addons/crm_partner_assign/report/crm_partner_report_view.xml4
-rw-r--r--addons/crm_partner_assign/res_partner_view.xml31
-rw-r--r--addons/crm_partner_assign/wizard/crm_forward_to_partner.py4
-rw-r--r--addons/crm_profiling/crm_profiling.py5
-rw-r--r--addons/crm_profiling/wizard/open_questionnaire.py4
-rw-r--r--addons/crm_todo/crm_todo_view.xml9
-rw-r--r--addons/crm_todo/i18n/cs.po85
-rw-r--r--addons/crm_todo/i18n/ko.po85
-rw-r--r--addons/decimal_precision/decimal_precision.py1
-rw-r--r--addons/delivery/delivery.py3
-rw-r--r--addons/delivery/partner.py1
-rw-r--r--addons/delivery/sale.py1
-rw-r--r--addons/delivery/stock.py4
-rw-r--r--addons/delivery/test/delivery_cost.yml5
-rw-r--r--addons/document/document.py13
-rw-r--r--addons/document/document_view.xml4
-rw-r--r--addons/document/wizard/document_configuration.py1
-rw-r--r--addons/document_ftp/ftpserver/abstracted_fs.py2
-rw-r--r--addons/document_ftp/wizard/ftp_browse.py1
-rw-r--r--addons/document_ftp/wizard/ftp_configuration.py1
-rw-r--r--addons/document_webdav/dav_fs.py2
-rw-r--r--addons/document_webdav/nodes.py6
-rw-r--r--addons/document_webdav/test/webdav_test1.yml5
-rw-r--r--addons/document_webdav/webdav_server.py3
-rw-r--r--addons/edi/i18n/cs.po87
-rw-r--r--addons/edi/i18n/lt.po87
-rw-r--r--addons/edi/i18n/nl_BE.po18
-rw-r--r--addons/edi/models/edi.py21
-rw-r--r--addons/email_template/email_template.py46
-rw-r--r--addons/email_template/email_template_view.xml57
-rw-r--r--addons/email_template/i18n/lt.po488
-rw-r--r--addons/email_template/i18n/nl_BE.po489
-rw-r--r--addons/email_template/tests/test_mail.py22
-rw-r--r--addons/email_template/wizard/email_template_preview.py18
-rw-r--r--addons/email_template/wizard/email_template_preview_view.xml28
-rw-r--r--addons/email_template/wizard/mail_compose_message.py63
-rw-r--r--addons/email_template/wizard/mail_compose_message_view.xml7
-rw-r--r--addons/event/event.py1
-rw-r--r--addons/event/report/report_event_registration.py1
-rw-r--r--addons/event/res_partner.py1
-rw-r--r--addons/event/wizard/event_confirm.py1
-rw-r--r--addons/event_moodle/event_moodle.py3
-rw-r--r--addons/event_moodle/i18n/cs.po185
-rw-r--r--addons/event_sale/event_sale.py1
-rw-r--r--addons/event_sale/i18n/cs.po90
-rw-r--r--addons/fetchmail/fetchmail.py28
-rw-r--r--addons/fetchmail/fetchmail_data.xml2
-rw-r--r--addons/fetchmail/i18n/cs.po335
-rw-r--r--addons/fleet/i18n/nl_BE.po1912
-rw-r--r--addons/google_base_account/google_base_account.py1
-rw-r--r--addons/google_base_account/i18n/cs.po109
-rw-r--r--addons/google_base_account/wizard/google_login.py1
-rw-r--r--addons/google_docs/google_docs.py1
-rw-r--r--addons/google_docs/i18n/cs.po188
-rw-r--r--addons/hr/hr.py12
-rw-r--r--addons/hr/hr_demo.xml94
-rw-r--r--addons/hr/hr_department.py2
-rw-r--r--addons/hr/hr_view.xml3
-rw-r--r--addons/hr_attendance/hr_attendance.py3
-rw-r--r--addons/hr_attendance/wizard/hr_attendance_bymonth.py1
-rw-r--r--addons/hr_attendance/wizard/hr_attendance_byweek.py1
-rw-r--r--addons/hr_attendance/wizard/hr_attendance_error.py1
-rw-r--r--addons/hr_contract/hr_contract.py3
-rw-r--r--addons/hr_evaluation/hr_evaluation.py5
-rw-r--r--addons/hr_evaluation/i18n/cs.po910
-rw-r--r--addons/hr_evaluation/report/hr_evaluation_report.py1
-rw-r--r--addons/hr_evaluation/test/test_hr_evaluation.yml4
-rw-r--r--addons/hr_expense/hr_expense.py17
-rw-r--r--addons/hr_expense/hr_expense_view.xml4
-rw-r--r--addons/hr_expense/report/hr_expense_report.py1
-rw-r--r--addons/hr_expense/test/expense_process.yml9
-rw-r--r--addons/hr_holidays/hr_holidays.py21
-rw-r--r--addons/hr_holidays/report/hr_holidays_report.py1
-rw-r--r--addons/hr_holidays/wizard/hr_holidays_summary_department.py1
-rw-r--r--addons/hr_holidays/wizard/hr_holidays_summary_employees.py1
-rw-r--r--addons/hr_payroll/hr_payroll.py17
-rw-r--r--addons/hr_payroll/test/hr_payroll_report.yml7
-rw-r--r--addons/hr_payroll/wizard/hr_payroll_contribution_register_report.py1
-rw-r--r--addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py1
-rw-r--r--addons/hr_payroll_account/hr_payroll_account.py5
-rw-r--r--addons/hr_payroll_account/i18n/cs.po126
-rw-r--r--addons/hr_payroll_account/i18n/lt.po126
-rw-r--r--addons/hr_payroll_account/wizard/hr_payroll_payslips_by_employees.py1
-rw-r--r--addons/hr_recruitment/hr_recruitment.py9
-rw-r--r--addons/hr_recruitment/hr_recruitment_menu.xml12
-rw-r--r--addons/hr_recruitment/hr_recruitment_view.xml20
-rw-r--r--addons/hr_recruitment/i18n/cs.po1261
-rw-r--r--addons/hr_recruitment/report/hr_recruitment_report.py1
-rw-r--r--addons/hr_recruitment/test/recruitment_process.yml3
-rw-r--r--addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py1
-rw-r--r--addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py1
-rw-r--r--addons/hr_timesheet/hr_timesheet.py1
-rw-r--r--addons/hr_timesheet/wizard/hr_timesheet_print_employee.py1
-rw-r--r--addons/hr_timesheet/wizard/hr_timesheet_print_users.py1
-rw-r--r--addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py2
-rw-r--r--addons/hr_timesheet_invoice/hr_timesheet_invoice.py5
-rw-r--r--addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report.py5
-rw-r--r--addons/hr_timesheet_invoice/report/report_analytic.py2
-rw-r--r--addons/hr_timesheet_invoice/test/hr_timesheet_invoice_report.yml5
-rw-r--r--addons/hr_timesheet_invoice/wizard/hr_timesheet_analytic_profit.py1
-rw-r--r--addons/hr_timesheet_invoice/wizard/hr_timesheet_final_invoice_create.py1
-rw-r--r--addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py1
-rw-r--r--addons/hr_timesheet_sheet/hr_timesheet_sheet.py5
-rw-r--r--addons/hr_timesheet_sheet/report/hr_timesheet_report.py1
-rw-r--r--addons/hr_timesheet_sheet/report/timesheet_report.py1
-rw-r--r--addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml1
-rw-r--r--addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py1
-rw-r--r--addons/im/__init__.py2
-rw-r--r--addons/im/__openerp__.py27
-rw-r--r--addons/im/im.py351
-rw-r--r--addons/im/security/im_security.xml26
-rw-r--r--addons/im/security/ir.model.access.csv3
-rw-r--r--addons/im/static/src/audio/Ting.mp3bin0 -> 17087 bytes
-rw-r--r--addons/im/static/src/audio/Ting.oggbin0 -> 12568 bytes
-rw-r--r--addons/im/static/src/audio/purr.mp3bin0 -> 85262 bytes
-rw-r--r--addons/im/static/src/audio/purr.oggbin0 -> 47390 bytes
-rw-r--r--addons/im/static/src/css/im.css258
-rw-r--r--addons/im/static/src/img/avatar/avatar.jpegbin0 -> 6462 bytes
-rwxr-xr-xaddons/im/static/src/img/button-gloss.pngbin0 -> 74 bytes
-rwxr-xr-xaddons/im/static/src/img/glyphicons-halflings-white.pngbin0 -> 8777 bytes
-rwxr-xr-xaddons/im/static/src/img/glyphicons-halflings.pngbin0 -> 12799 bytes
-rw-r--r--addons/im/static/src/img/green.pngbin0 -> 830 bytes
-rw-r--r--addons/im/static/src/img/icon.pngbin0 -> 16237 bytes
-rw-r--r--addons/im/static/src/img/logo.pngbin0 -> 3600 bytes
-rw-r--r--addons/im/static/src/img/wood.pngbin0 -> 102184 bytes
-rw-r--r--addons/im/static/src/js/im.js463
-rw-r--r--addons/im/static/src/xml/im.xml63
-rw-r--r--addons/im_livechat/__init__.py2
-rw-r--r--addons/im_livechat/__openerp__.py29
-rw-r--r--addons/im_livechat/im_livechat.py245
-rw-r--r--addons/im_livechat/im_livechat_demo.xml15
-rw-r--r--addons/im_livechat/im_livechat_view.xml146
-rw-r--r--addons/im_livechat/include.html2
-rw-r--r--addons/im_livechat/loader.js24
-rw-r--r--addons/im_livechat/security/im_livechat_security.xml36
-rw-r--r--addons/im_livechat/security/ir.model.access.csv6
-rw-r--r--addons/im_livechat/static/ext/Makefile3
-rw-r--r--addons/im_livechat/static/ext/static/audio/Ting.mp3bin0 -> 17087 bytes
-rw-r--r--addons/im_livechat/static/ext/static/audio/Ting.oggbin0 -> 12568 bytes
-rw-r--r--addons/im_livechat/static/ext/static/css/livesupport.css190
-rw-r--r--addons/im_livechat/static/ext/static/img/avatar/avatar.jpegbin0 -> 6462 bytes
-rwxr-xr-xaddons/im_livechat/static/ext/static/img/button-gloss.pngbin0 -> 74 bytes
-rwxr-xr-xaddons/im_livechat/static/ext/static/img/glyphicons-halflings-white.pngbin0 -> 8777 bytes
-rwxr-xr-xaddons/im_livechat/static/ext/static/img/glyphicons-halflings.pngbin0 -> 12799 bytes
-rw-r--r--addons/im_livechat/static/ext/static/img/green.pngbin0 -> 830 bytes
-rw-r--r--addons/im_livechat/static/ext/static/img/logo.pngbin0 -> 3600 bytes
-rw-r--r--addons/im_livechat/static/ext/static/img/wood.pngbin0 -> 102184 bytes
-rw-r--r--addons/im_livechat/static/ext/static/js/jquery.achtung.css306
-rw-r--r--addons/im_livechat/static/ext/static/js/jquery.achtung.js273
-rw-r--r--addons/im_livechat/static/ext/static/js/jquery.js9555
-rw-r--r--addons/im_livechat/static/ext/static/js/livesupport.js446
-rw-r--r--addons/im_livechat/static/ext/static/js/livesupport_templates.html36
-rw-r--r--addons/im_livechat/static/ext/static/js/livesupport_templates.js1
-rw-r--r--addons/im_livechat/static/ext/static/js/nova.js988
-rw-r--r--addons/im_livechat/static/ext/static/js/oeclient.js362
-rw-r--r--addons/im_livechat/static/ext/static/js/require.js1993
-rw-r--r--addons/im_livechat/static/ext/static/js/to_jsonp.py12
-rw-r--r--addons/im_livechat/static/ext/static/js/underscore.js1221
-rw-r--r--addons/im_livechat/static/ext/test.html10
-rw-r--r--addons/im_livechat/static/src/img/default.pngbin0 -> 16237 bytes
-rw-r--r--addons/im_livechat/static/src/img/icon.pngbin0 -> 16237 bytes
-rw-r--r--addons/im_livechat/web_page.html61
-rw-r--r--addons/l10n_at/account_wizard.py1
-rw-r--r--addons/l10n_be/fiscal_templates.xml6
-rw-r--r--addons/l10n_be/wizard/l10n_be_account_vat_declaration.py1
-rw-r--r--addons/l10n_be/wizard/l10n_be_partner_vat_listing.py3
-rw-r--r--addons/l10n_be/wizard/l10n_be_vat_intra.py1
-rw-r--r--addons/l10n_be_coda/wizard/account_coda_import.py4
-rw-r--r--addons/l10n_be_hr_payroll/l10n_be_hr_payroll.py2
-rw-r--r--addons/l10n_be_invoice_bba/partner.py6
-rw-r--r--addons/l10n_fr/l10n_fr.py3
-rw-r--r--addons/l10n_fr/test/l10n_fr_report.yml10
-rw-r--r--addons/l10n_fr/wizard/fr_report_bilan.py1
-rw-r--r--addons/l10n_fr/wizard/fr_report_compute_resultant.py1
-rw-r--r--addons/l10n_fr_hr_payroll/l10n_fr_hr_payroll.py3
-rw-r--r--addons/l10n_fr_rib/bank.py3
-rw-r--r--addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py6
-rw-r--r--addons/l10n_in_hr_payroll/report/payment_advice_report.py1
-rw-r--r--addons/l10n_in_hr_payroll/report/payslip_report.py1
-rw-r--r--addons/l10n_in_hr_payroll/test/payment_advice.yml7
-rw-r--r--addons/l10n_in_hr_payroll/wizard/hr_salary_employee_bymonth.py1
-rw-r--r--addons/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail.py1
-rw-r--r--addons/l10n_lu/test/l10n_lu_report.yml5
-rw-r--r--addons/l10n_lu/wizard/print_vat.py5
-rw-r--r--addons/l10n_ma/l10n_ma.py2
-rw-r--r--addons/l10n_multilang/account.py11
-rw-r--r--addons/l10n_multilang/l10n_multilang.py3
-rwxr-xr-xaddons/l10n_ro/res_partner.py28
-rw-r--r--addons/lunch/lunch.py109
-rw-r--r--addons/lunch/report/report_lunch_order.py1
-rw-r--r--addons/mail/data/mail_data.xml13
-rw-r--r--addons/mail/mail_alias.py15
-rw-r--r--addons/mail/mail_followers.py6
-rw-r--r--addons/mail/mail_group.py14
-rw-r--r--addons/mail/mail_group_view.xml59
-rw-r--r--addons/mail/mail_mail.py22
-rw-r--r--addons/mail/mail_message.py23
-rw-r--r--addons/mail/mail_thread.py182
-rw-r--r--addons/mail/res_users.py3
-rw-r--r--addons/mail/static/src/css/mail.css6
-rw-r--r--addons/mail/static/src/css/mail_group.css6
-rw-r--r--addons/mail/static/src/js/mail.js20
-rw-r--r--addons/mail/static/src/js/mail_followers.js2
-rw-r--r--addons/mail/static/src/xml/mail.xml27
-rw-r--r--addons/mail/static/src/xml/mail_followers.xml2
-rw-r--r--addons/mail/tests/test_mail_features.py6
-rw-r--r--addons/mail/tests/test_mail_gateway.py178
-rw-r--r--addons/mail/wizard/invite.py6
-rw-r--r--addons/mail/wizard/mail_compose_message.py40
-rw-r--r--addons/marketing_campaign/marketing_campaign.py20
-rw-r--r--addons/marketing_campaign/report/campaign_analysis.py1
-rw-r--r--addons/marketing_campaign/res_partner.py1
-rw-r--r--addons/membership/membership.py5
-rw-r--r--addons/membership/report/report_membership.py1
-rw-r--r--addons/membership/wizard/membership_invoice.py1
-rw-r--r--addons/mrp/company.py1
-rw-r--r--addons/mrp/mrp.py3
-rw-r--r--addons/mrp/procurement.py1
-rw-r--r--addons/mrp/product.py1
-rw-r--r--addons/mrp/report/mrp_report.py2
-rw-r--r--addons/mrp/stock.py5
-rw-r--r--addons/mrp/test/order_process.yml10
-rw-r--r--addons/mrp/wizard/change_production_qty.py1
-rw-r--r--addons/mrp/wizard/mrp_price.py1
-rw-r--r--addons/mrp/wizard/mrp_product_produce.py1
-rw-r--r--addons/mrp/wizard/mrp_workcenter_load.py1
-rw-r--r--addons/mrp_byproduct/mrp_byproduct.py3
-rw-r--r--addons/mrp_operations/mrp_operations.py5
-rw-r--r--addons/mrp_operations/report/mrp_workorder_analysis.py1
-rw-r--r--addons/mrp_repair/mrp_repair.py2
-rw-r--r--addons/mrp_repair/mrp_repair_view.xml2
-rw-r--r--addons/mrp_repair/test/mrp_repair_report.yml5
-rw-r--r--addons/mrp_repair/wizard/cancel_repair.py1
-rw-r--r--addons/mrp_repair/wizard/make_invoice.py1
-rw-r--r--addons/note/i18n/cs.po284
-rw-r--r--addons/note/i18n/lt.po284
-rw-r--r--addons/note_pad/i18n/cs.po28
-rw-r--r--addons/note_pad/i18n/lt.po28
-rw-r--r--addons/pad/pad.py2
-rw-r--r--addons/pad/static/src/js/pad.js72
-rw-r--r--addons/pad/static/src/xml/pad.xml35
-rw-r--r--addons/pad_project/i18n/lt.po39
-rw-r--r--addons/plugin/i18n/lt.po23
-rw-r--r--addons/plugin/plugin_handler.py51
-rw-r--r--addons/plugin_outlook/i18n/cs.po89
-rw-r--r--addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPClient/OpenERPClient.csproj11
-rw-r--r--addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin.sln4
-rw-r--r--addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin/Connect.cs1
-rw-r--r--addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin/OpenERPOutlookPlugin.cs12
-rw-r--r--addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPluginSetup32.msibin387072 -> 937984 bytes
-rw-r--r--addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPluginSetup64.msibin961536 -> 941056 bytes
-rw-r--r--addons/point_of_sale/account_bank_statement.py2
-rw-r--r--addons/point_of_sale/i18n/pt_BR.po184
-rw-r--r--addons/point_of_sale/i18n/zh_CN.po16
-rw-r--r--addons/point_of_sale/point_of_sale.py50
-rw-r--r--addons/point_of_sale/point_of_sale_demo.xml3
-rw-r--r--addons/point_of_sale/report/pos_order_report.py1
-rw-r--r--addons/point_of_sale/report/pos_report.py6
-rw-r--r--addons/point_of_sale/static/src/js/models.js27
-rw-r--r--addons/point_of_sale/static/src/js/screens.js2
-rw-r--r--addons/point_of_sale/static/src/js/widgets.js4
-rw-r--r--addons/point_of_sale/test/point_of_sale_report.yml35
-rw-r--r--addons/point_of_sale/wizard/pos_box.py6
-rw-r--r--addons/point_of_sale/wizard/pos_box_entries.py1
-rw-r--r--addons/point_of_sale/wizard/pos_box_out.py1
-rw-r--r--addons/point_of_sale/wizard/pos_confirm.py1
-rw-r--r--addons/point_of_sale/wizard/pos_details.py1
-rw-r--r--addons/point_of_sale/wizard/pos_discount.py1
-rw-r--r--addons/point_of_sale/wizard/pos_open_statement.py1
-rw-r--r--addons/point_of_sale/wizard/pos_payment.py1
-rw-r--r--addons/point_of_sale/wizard/pos_payment_report.py1
-rw-r--r--addons/point_of_sale/wizard/pos_payment_report_user.py1
-rw-r--r--addons/point_of_sale/wizard/pos_receipt.py1
-rw-r--r--addons/point_of_sale/wizard/pos_return.py2
-rw-r--r--addons/point_of_sale/wizard/pos_sales_user.py1
-rw-r--r--addons/point_of_sale/wizard/pos_sales_user_current_user.py1
-rw-r--r--addons/point_of_sale/wizard/pos_sales_user_today.py1
-rw-r--r--addons/point_of_sale/wizard/pos_session_opening.py1
-rw-r--r--addons/portal/mail_mail.py2
-rw-r--r--addons/portal/portal_view.xml10
-rw-r--r--addons/portal/wizard/share_wizard.py1
-rw-r--r--addons/portal_anonymous/i18n/lt.po25
-rw-r--r--addons/portal_anonymous/i18n/ru.po25
-rw-r--r--addons/portal_crm/i18n/cs.po546
-rw-r--r--addons/portal_crm/i18n/lt.po546
-rw-r--r--addons/portal_hr_employees/i18n/cs.po95
-rw-r--r--addons/portal_hr_employees/i18n/lt.po95
-rw-r--r--addons/portal_project/__init__.py1
-rw-r--r--addons/portal_project/project.py38
-rw-r--r--addons/portal_project/security/ir.model.access.csv6
-rw-r--r--addons/portal_project/security/portal_security.xml61
-rw-r--r--addons/portal_project/tests/__init__.py (renamed from addons/crm_claim/res_config.py)16
-rw-r--r--addons/portal_project/tests/test_access_rights.py300
-rw-r--r--addons/portal_project_issue/security/ir.model.access.csv1
-rw-r--r--addons/portal_project_issue/security/portal_security.xml36
-rw-r--r--addons/portal_project_issue/tests/__init__.py28
-rw-r--r--addons/portal_project_issue/tests/test_access_rights.py185
-rw-r--r--addons/portal_project_long_term/security/ir.model.access.csv1
-rw-r--r--addons/portal_project_long_term/security/portal_security.xml24
-rw-r--r--addons/portal_sale/i18n/lt.po344
-rw-r--r--addons/portal_sale/portal_sale.py11
-rw-r--r--addons/portal_stock/security/portal_security.xml14
-rw-r--r--addons/process/process.py5
-rw-r--r--addons/procurement/company.py1
-rw-r--r--addons/procurement/i18n/lt.po1005
-rw-r--r--addons/procurement/i18n/pt_BR.po17
-rw-r--r--addons/procurement/schedulers.py2
-rw-r--r--addons/procurement/wizard/make_procurement_product.py1
-rw-r--r--addons/procurement/wizard/mrp_procurement.py1
-rw-r--r--addons/procurement/wizard/orderpoint_procurement.py1
-rw-r--r--addons/procurement/wizard/schedulers_all.py1
-rw-r--r--addons/product/partner.py4
-rw-r--r--addons/product/partner_view.xml5
-rw-r--r--addons/product/pricelist.py12
-rw-r--r--addons/product/product.py29
-rw-r--r--addons/product/product_report.xml3
-rw-r--r--addons/product/product_view.xml1
-rw-r--r--addons/product/report/product_pricelist.py2
-rw-r--r--addons/product/wizard/product_price.py1
-rw-r--r--addons/product_expiry/product_expiry.py2
-rw-r--r--addons/product_manufacturer/product_manufacturer.py2
-rw-r--r--addons/product_margin/product_margin.py1
-rw-r--r--addons/product_margin/wizard/product_margin.py1
-rw-r--r--addons/product_visible_discount/product_visible_discount.py3
-rw-r--r--addons/project/company.py1
-rw-r--r--addons/project/project.py24
-rw-r--r--addons/project/project_data.xml1
-rw-r--r--addons/project/project_view.xml54
-rw-r--r--addons/project/report/project_report.py1
-rw-r--r--addons/project/report/project_report_view.xml2
-rw-r--r--addons/project/res_partner.py1
-rw-r--r--addons/project/security/project_security.xml49
-rw-r--r--addons/project/wizard/project_task_delegate.py3
-rw-r--r--addons/project/wizard/project_task_reevaluate.py1
-rw-r--r--addons/project_gtd/project_gtd.py3
-rw-r--r--addons/project_gtd/wizard/project_gtd_empty.py1
-rw-r--r--addons/project_gtd/wizard/project_gtd_fill.py1
-rw-r--r--addons/project_issue/i18n/cs.po984
-rw-r--r--addons/project_issue/project_issue.py89
-rw-r--r--addons/project_issue/project_issue_menu.xml12
-rw-r--r--addons/project_issue/project_issue_view.xml33
-rw-r--r--addons/project_issue/report/project_issue_report.py9
-rw-r--r--addons/project_issue/report/project_issue_report_view.xml4
-rw-r--r--addons/project_issue/security/project_issue_security.xml22
-rw-r--r--addons/project_issue/test/subscribe_issue.yml5
-rw-r--r--addons/project_issue_sheet/i18n/cs.po72
-rw-r--r--addons/project_issue_sheet/project_issue_sheet.py3
-rw-r--r--addons/project_long_term/i18n/cs.po502
-rw-r--r--addons/project_long_term/project_long_term.py11
-rw-r--r--addons/project_long_term/wizard/project_compute_phases.py1
-rw-r--r--addons/project_long_term/wizard/project_compute_tasks.py1
-rw-r--r--addons/project_mrp/project_mrp.py3
-rw-r--r--addons/project_mrp/project_procurement.py1
-rw-r--r--addons/project_mrp/test/project_task_procurement.yml2
-rw-r--r--addons/project_timesheet/project_timesheet.py5
-rw-r--r--addons/project_timesheet/report/task_report.py1
-rw-r--r--addons/purchase/company.py9
-rw-r--r--addons/purchase/partner.py4
-rw-r--r--addons/purchase/purchase.py35
-rw-r--r--addons/purchase/purchase_view.xml8
-rw-r--r--addons/purchase/report/purchase_report.py1
-rw-r--r--addons/purchase/res_config.py7
-rw-r--r--addons/purchase/res_config_view.xml4
-rw-r--r--addons/purchase/stock.py1
-rw-r--r--addons/purchase/test/ui/print_report.yml5
-rw-r--r--addons/purchase/wizard/purchase_line_invoice.py1
-rw-r--r--addons/purchase/wizard/purchase_order_group.py2
-rw-r--r--addons/purchase_analytic_plans/purchase_analytic_plans.py2
-rw-r--r--addons/purchase_analytic_plans/purchase_analytic_plans_view.xml17
-rw-r--r--addons/purchase_double_validation/i18n/cs.po49
-rw-r--r--addons/purchase_double_validation/i18n/lt.po49
-rw-r--r--addons/purchase_requisition/i18n/cs.po473
-rw-r--r--addons/purchase_requisition/purchase_requisition.py4
-rw-r--r--addons/purchase_requisition/test/purchase_requisition.yml5
-rw-r--r--addons/purchase_requisition/wizard/purchase_requisition_partner.py1
-rw-r--r--addons/report_intrastat/report_intrastat.py4
-rw-r--r--addons/report_intrastat/test/report_intrastat_report.yml5
-rw-r--r--addons/report_webkit/header.py2
-rw-r--r--addons/report_webkit/i18n/cs.po517
-rw-r--r--addons/report_webkit/ir_report.py150
-rw-r--r--addons/report_webkit/webkit_report.py14
-rw-r--r--addons/report_webkit/wizard/report_webkit_actions.py1
-rw-r--r--addons/resource/resource.py143
-rw-r--r--addons/resource/test/resource.yml9
-rw-r--r--addons/sale/report/sale_report.py1
-rw-r--r--addons/sale/res_config.py4
-rw-r--r--addons/sale/res_partner_view.xml26
-rw-r--r--addons/sale/sale.py23
-rw-r--r--addons/sale/sale_view.xml38
-rw-r--r--addons/sale/wizard/sale_line_invoice.py27
-rw-r--r--addons/sale/wizard/sale_make_invoice.py13
-rw-r--r--addons/sale/wizard/sale_make_invoice.xml10
-rw-r--r--addons/sale/wizard/sale_make_invoice_advance.py1
-rw-r--r--addons/sale_analytic_plans/sale_analytic_plans.py1
-rw-r--r--addons/sale_analytic_plans/sale_analytic_plans_view.xml14
-rw-r--r--addons/sale_crm/report/sale_crm_account_invoice_report_view.xml2
-rw-r--r--addons/sale_crm/sale_crm.py49
-rw-r--r--addons/sale_crm/sale_crm_view.xml141
-rw-r--r--addons/sale_crm/wizard/crm_make_sale.py1
-rw-r--r--addons/sale_journal/sale_journal.py10
-rw-r--r--addons/sale_journal/sale_journal_view.xml2
-rw-r--r--addons/sale_margin/i18n/cs.po46
-rw-r--r--addons/sale_margin/sale_margin.py2
-rw-r--r--addons/sale_mrp/i18n/cs.po43
-rw-r--r--addons/sale_mrp/i18n/lt.po43
-rw-r--r--addons/sale_mrp/sale_mrp.py1
-rw-r--r--addons/sale_order_dates/i18n/cs.po58
-rw-r--r--addons/sale_order_dates/sale_order_dates.py1
-rw-r--r--addons/sale_stock/company.py10
-rw-r--r--addons/sale_stock/process/sale_stock_process.xml13
-rw-r--r--addons/sale_stock/report/sale_report.py1
-rw-r--r--addons/sale_stock/sale_stock.py36
-rw-r--r--addons/sale_stock/stock.py2
-rw-r--r--addons/sale_stock/test/picking_order_policy.yml21
-rw-r--r--addons/share/i18n/lt.po617
-rw-r--r--addons/share/res_users.py2
-rw-r--r--addons/share/wizard/share_wizard.py15
-rw-r--r--addons/stock/partner.py1
-rw-r--r--addons/stock/product.py3
-rw-r--r--addons/stock/report/product_stock.py8
-rw-r--r--addons/stock/report/report_stock.py3
-rw-r--r--addons/stock/report/report_stock_move.py4
-rw-r--r--addons/stock/report/report_stock_move_view.xml2
-rw-r--r--addons/stock/stock.py22
-rw-r--r--addons/stock/stock_view.xml6
-rw-r--r--addons/stock/test/stock_report.yml25
-rw-r--r--addons/stock/wizard/stock_change_standard_price.py1
-rw-r--r--addons/stock/wizard/stock_fill_inventory.py1
-rw-r--r--addons/stock/wizard/stock_inventory_merge.py1
-rw-r--r--addons/stock/wizard/stock_invoice_onshipping.py5
-rw-r--r--addons/stock/wizard/stock_location_product.py1
-rw-r--r--addons/stock/wizard/stock_move.py3
-rw-r--r--addons/stock/wizard/stock_return_picking.py3
-rw-r--r--addons/stock/wizard/stock_splitinto.py1
-rw-r--r--addons/stock/wizard/stock_traceability.py2
-rw-r--r--addons/stock_invoice_directly/wizard/stock_invoice.py1
-rw-r--r--addons/stock_location/procurement_pull.py1
-rw-r--r--addons/stock_location/stock_location.py5
-rw-r--r--addons/stock_no_autopicking/stock_no_autopicking.py2
-rw-r--r--addons/subscription/subscription.py8
-rw-r--r--addons/survey/survey.py15
-rw-r--r--addons/survey/wizard/survey_answer.py27
-rw-r--r--addons/survey/wizard/survey_browse_answer.py1
-rw-r--r--addons/survey/wizard/survey_print.py1
-rw-r--r--addons/survey/wizard/survey_print_answer.py1
-rw-r--r--addons/survey/wizard/survey_print_statistics.py1
-rw-r--r--addons/survey/wizard/survey_send_invitation.py15
-rw-r--r--addons/warning/warning.py8
-rw-r--r--addons/web_linkedin/i18n/cs.po137
-rw-r--r--addons/web_shortcuts/i18n/lt.po25
717 files changed, 49729 insertions, 6701 deletions
diff --git a/addons/account/account.py b/addons/account/account.py
index bb24aec1748..3959799f1bb 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -132,7 +132,6 @@ class account_payment_term_line(osv.osv):
(_check_percent, 'Percentages for Payment Term Line must be between 0 and 1, Example: 0.02 for 2%.', ['value_amount']),
]
-account_payment_term_line()
class account_account_type(osv.osv):
_name = "account.account.type"
@@ -198,7 +197,6 @@ class account_account_type(osv.osv):
}
_order = "code"
-account_account_type()
def _code_get(self, cr, uid, context=None):
acc_type_obj = self.pool.get('account.account.type')
@@ -212,7 +210,6 @@ def _code_get(self, cr, uid, context=None):
class account_tax(osv.osv):
_name = 'account.tax'
-account_tax()
class account_account(osv.osv):
_order = "parent_left"
@@ -697,7 +694,6 @@ class account_account(osv.osv):
self._check_moves(cr, uid, ids, "unlink", context=context)
return super(account_account, self).unlink(cr, uid, ids, context=context)
-account_account()
class account_journal(osv.osv):
_name = "account.journal"
@@ -849,7 +845,6 @@ class account_journal(osv.osv):
return self.name_get(cr, user, ids, context=context)
-account_journal()
class account_fiscalyear(osv.osv):
_name = "account.fiscalyear"
@@ -945,7 +940,6 @@ class account_fiscalyear(osv.osv):
ids = self.search(cr, user, [('name', operator, name)]+ args, limit=limit)
return self.name_get(cr, user, ids, context=context)
-account_fiscalyear()
class account_period(osv.osv):
_name = "account.period"
@@ -1007,8 +1001,7 @@ class account_period(osv.osv):
def find(self, cr, uid, dt=None, context=None):
if context is None: context = {}
if not dt:
- dt = fields.date.context_today(self,cr,uid,context=context)
-#CHECKME: shouldn't we check the state of the period?
+ dt = fields.date.context_today(self, cr, uid, context=context)
args = [('date_start', '<=' ,dt), ('date_stop', '>=', dt)]
if context.get('company_id', False):
args.append(('company_id', '=', context['company_id']))
@@ -1016,7 +1009,7 @@ class account_period(osv.osv):
company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id
args.append(('company_id', '=', company_id))
result = []
- if context.get('account_period_prefer_normal'):
+ if context.get('account_period_prefer_normal', True):
# look for non-special periods first, and fallback to all if no result is found
result = self.search(cr, uid, args + [('special', '=', False)], context=context)
if not result:
@@ -1027,6 +1020,9 @@ class account_period(osv.osv):
def action_draft(self, cr, uid, ids, *args):
mode = 'draft'
+ for period in self.browse(cr, uid, ids):
+ if period.fiscalyear_id.state == 'done':
+ raise osv.except_osv(_('Warning !'), _('You can not re-open a period which belongs to closed fiscal year'))
cr.execute('update account_journal_period set state=%s where period_id in %s', (mode, tuple(ids),))
cr.execute('update account_period set state=%s where id in %s', (mode, tuple(ids),))
return True
@@ -1068,7 +1064,6 @@ class account_period(osv.osv):
return self.search(cr, uid, [('date_start', '>=', period_date_start), ('date_stop', '<=', period_date_stop), ('company_id', '=', company1_id)])
return self.search(cr, uid, [('date_start', '>=', period_date_start), ('date_stop', '<=', period_date_stop), ('company_id', '=', company1_id), ('special', '=', False)])
-account_period()
class account_journal_period(osv.osv):
_name = "account.journal.period"
@@ -1125,7 +1120,6 @@ class account_journal_period(osv.osv):
}
_order = "period_id"
-account_journal_period()
class account_fiscalyear(osv.osv):
_inherit = "account.fiscalyear"
@@ -1142,7 +1136,6 @@ class account_fiscalyear(osv.osv):
})
return super(account_fiscalyear, self).copy(cr, uid, id, default=default, context=context)
-account_fiscalyear()
#----------------------------------------------------------
# Entries
#----------------------------------------------------------
@@ -1220,7 +1213,7 @@ class account_move(osv.osv):
return res
def _get_period(self, cr, uid, context=None):
- ctx = dict(context or {}, account_period_prefer_normal=True)
+ ctx = dict(context or {})
period_ids = self.pool.get('account.period').find(cr, uid, context=ctx)
return period_ids[0]
@@ -1381,6 +1374,7 @@ class account_move(osv.osv):
'ref':False,
'balance':False,
'account_tax_id':False,
+ 'statement_id': False,
})
if 'journal_id' in vals and vals.get('journal_id', False):
@@ -1417,6 +1411,7 @@ class account_move(osv.osv):
context = {} if context is None else context.copy()
default.update({
'state':'draft',
+ 'ref': False,
'name':'/',
})
context.update({
@@ -1638,7 +1633,6 @@ class account_move(osv.osv):
valid_moves = [move.id for move in valid_moves]
return len(valid_moves) > 0 and valid_moves or False
-account_move()
class account_move_reconcile(osv.osv):
_name = "account.move.reconcile"
@@ -1712,7 +1706,6 @@ class account_move_reconcile(osv.osv):
result.append((r.id,r.name))
return result
-account_move_reconcile()
#----------------------------------------------------------
# Tax
@@ -1792,7 +1785,7 @@ class account_tax_code(osv.osv):
if context.get('period_id', False):
period_id = context['period_id']
else:
- period_id = self.pool.get('account.period').find(cr, uid)
+ period_id = self.pool.get('account.period').find(cr, uid, context=context)
if not period_id:
return dict.fromkeys(ids, 0.0)
period_id = period_id[0]
@@ -1860,7 +1853,6 @@ class account_tax_code(osv.osv):
]
_order = 'code'
-account_tax_code()
class account_tax(osv.osv):
"""
@@ -2268,7 +2260,6 @@ class account_tax(osv.osv):
total += r['amount']
return res
-account_tax()
# ---------------------------------------------------------
# Account Entries Models
@@ -2380,7 +2371,6 @@ class account_model(osv.osv):
return {'value': {'company_id': company_id}}
-account_model()
class account_model_line(osv.osv):
_name = "account.model.line"
@@ -2404,7 +2394,6 @@ class account_model_line(osv.osv):
('credit_debit1', 'CHECK (credit*debit=0)', 'Wrong credit or debit value in model, they must be positive!'),
('credit_debit2', 'CHECK (credit+debit>=0)', 'Wrong credit or debit value in model, they must be positive!'),
]
-account_model_line()
# ---------------------------------------------------------
# Account Subscription
@@ -2478,7 +2467,6 @@ class account_subscription(osv.osv):
self.write(cr, uid, ids, {'state':'running'})
return True
-account_subscription()
class account_subscription_line(osv.osv):
_name = "account.subscription.line"
@@ -2507,7 +2495,6 @@ class account_subscription_line(osv.osv):
_rec_name = 'date'
-account_subscription_line()
# ---------------------------------------------------------------
# Account Templates: Account, Tax, Tax Code and chart. + Wizard
@@ -2515,7 +2502,6 @@ account_subscription_line()
class account_tax_template(osv.osv):
_name = 'account.tax.template'
-account_tax_template()
class account_account_template(osv.osv):
_order = "code"
@@ -2643,7 +2629,6 @@ class account_account_template(osv.osv):
obj_acc._parent_store_compute(cr)
return acc_template_ref
-account_account_template()
class account_add_tmpl_wizard(osv.osv_memory):
"""Add one more account from the template.
@@ -2697,7 +2682,6 @@ class account_add_tmpl_wizard(osv.osv_memory):
def action_cancel(self, cr, uid, ids, context=None):
return { 'type': 'state', 'state': 'end' }
-account_add_tmpl_wizard()
class account_tax_code_template(osv.osv):
@@ -2769,7 +2753,6 @@ class account_tax_code_template(osv.osv):
(_check_recursion, 'Error!\nYou cannot create recursive Tax Codes.', ['parent_id'])
]
_order = 'code,name'
-account_tax_code_template()
class account_chart_template(osv.osv):
@@ -2802,7 +2785,6 @@ class account_chart_template(osv.osv):
'complete_tax_set': True,
}
-account_chart_template()
class account_tax_template(osv.osv):
@@ -2932,7 +2914,6 @@ class account_tax_template(osv.osv):
res.update({'tax_template_to_tax': tax_template_to_tax, 'account_dict': todo_dict})
return res
-account_tax_template()
# Fiscal Position Templates
@@ -2980,7 +2961,6 @@ class account_fiscal_position_template(osv.osv):
})
return True
-account_fiscal_position_template()
class account_fiscal_position_tax_template(osv.osv):
_name = 'account.fiscal.position.tax.template'
@@ -2993,7 +2973,6 @@ class account_fiscal_position_tax_template(osv.osv):
'tax_dest_id': fields.many2one('account.tax.template', 'Replacement Tax')
}
-account_fiscal_position_tax_template()
class account_fiscal_position_account_template(osv.osv):
_name = 'account.fiscal.position.account.template'
@@ -3005,7 +2984,6 @@ class account_fiscal_position_account_template(osv.osv):
'account_dest_id': fields.many2one('account.account.template', 'Account Destination', domain=[('type','<>','view')], required=True)
}
-account_fiscal_position_account_template()
# ---------------------------------------------------------
# Account generation from template wizards
@@ -3398,7 +3376,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
try:
tmp2 = obj_data.get_object_reference(cr, uid, *ref)
if tmp2:
- self.pool.get(tmp2[0]).write(cr, uid, tmp2[1], {
+ self.pool[tmp2[0]].write(cr, uid, tmp2[1], {
'currency_id': obj_wizard.currency_id.id
})
except ValueError, e:
@@ -3545,7 +3523,6 @@ class wizard_multi_charts_accounts(osv.osv_memory):
current_num += 1
return True
-wizard_multi_charts_accounts()
class account_bank_accounts_wizard(osv.osv_memory):
_name='account.bank.accounts.wizard'
@@ -3557,6 +3534,5 @@ class account_bank_accounts_wizard(osv.osv_memory):
'account_type': fields.selection([('cash','Cash'), ('check','Check'), ('bank','Bank')], 'Account Type', size=32),
}
-account_bank_accounts_wizard()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/account_analytic_line.py b/addons/account/account_analytic_line.py
index f3617106f28..e141f33b9d1 100644
--- a/addons/account/account_analytic_line.py
+++ b/addons/account/account_analytic_line.py
@@ -143,7 +143,6 @@ class account_analytic_line(osv.osv):
return res
return False
-account_analytic_line()
class res_partner(osv.osv):
""" Inherits partner and adds contract information in the partner form """
@@ -154,6 +153,5 @@ class res_partner(osv.osv):
'partner_id', 'Contracts', readonly=True),
}
-res_partner()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py
index 8e1a5dd26c6..023765d73f0 100644
--- a/addons/account/account_bank_statement.py
+++ b/addons/account/account_bank_statement.py
@@ -61,7 +61,7 @@ class account_bank_statement(osv.osv):
return res
def _get_period(self, cr, uid, context=None):
- periods = self.pool.get('account.period').find(cr, uid,context=context)
+ periods = self.pool.get('account.period').find(cr, uid, context=context)
if periods:
return periods[0]
return False
@@ -500,7 +500,6 @@ class account_bank_statement(osv.osv):
'context':ctx,
}
-account_bank_statement()
class account_bank_statement_line(osv.osv):
@@ -576,6 +575,5 @@ class account_bank_statement_line(osv.osv):
'type': 'general',
}
-account_bank_statement_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/account_cash_statement.py b/addons/account/account_cash_statement.py
index 86d3b0d24de..40f0ca80738 100644
--- a/addons/account/account_cash_statement.py
+++ b/addons/account/account_cash_statement.py
@@ -66,7 +66,6 @@ class account_cashbox_line(osv.osv):
'bank_statement_id' : fields.many2one('account.bank.statement', ondelete='cascade'),
}
-account_cashbox_line()
class account_cash_statement(osv.osv):
@@ -316,7 +315,6 @@ class account_cash_statement(osv.osv):
return self.write(cr, uid, ids, {'closing_date': time.strftime("%Y-%m-%d %H:%M:%S")}, context=context)
-account_cash_statement()
class account_journal(osv.osv):
_inherit = 'account.journal'
@@ -336,7 +334,6 @@ class account_journal(osv.osv):
'cashbox_line_ids' : _default_cashbox_line_ids,
}
-account_journal()
class account_journal_cashbox_line(osv.osv):
_name = 'account.journal.cashbox.line'
@@ -348,6 +345,5 @@ class account_journal_cashbox_line(osv.osv):
_order = 'pieces asc'
-account_journal_cashbox_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/account_financial_report.py b/addons/account/account_financial_report.py
index 6a2b1bd5e8f..0c2e5845b89 100644
--- a/addons/account/account_financial_report.py
+++ b/addons/account/account_financial_report.py
@@ -24,7 +24,6 @@ from datetime import datetime
from dateutil.relativedelta import relativedelta
from operator import itemgetter
-from openerp import netsvc
from openerp.osv import fields, osv
import openerp.addons.decimal_precision as dp
from openerp.tools.translate import _
@@ -139,6 +138,5 @@ class account_financial_report(osv.osv):
'style_overwrite': 0,
}
-account_financial_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py
index 30bdc2eedac..c47cf70b673 100644
--- a/addons/account/account_invoice.py
+++ b/addons/account/account_invoice.py
@@ -286,7 +286,10 @@ class account_invoice(osv.osv):
'payment_ids': fields.function(_compute_lines, relation='account.move.line', type="many2many", string='Payments'),
'move_name': fields.char('Journal Entry', size=64, readonly=True, states={'draft':[('readonly',False)]}),
'user_id': fields.many2one('res.users', 'Salesperson', readonly=True, track_visibility='onchange', states={'draft':[('readonly',False)]}),
- 'fiscal_position': fields.many2one('account.fiscal.position', 'Fiscal Position', readonly=True, states={'draft':[('readonly',False)]})
+ 'fiscal_position': fields.many2one('account.fiscal.position', 'Fiscal Position', readonly=True, states={'draft':[('readonly',False)]}),
+ 'commercial_partner_id': fields.related('partner_id', 'commercial_partner_id', string='Commercial Entity', type='many2one',
+ relation='res.partner', store=True, readonly=True,
+ help="The commercial entity that will be used on Journal Entries for this invoice")
}
_defaults = {
'type': _get_type,
@@ -313,7 +316,7 @@ class account_invoice(osv.osv):
context = {}
if context.get('active_model', '') in ['res.partner'] and context.get('active_ids', False) and context['active_ids']:
- partner = self.pool.get(context['active_model']).read(cr, uid, context['active_ids'], ['supplier','customer'])[0]
+ partner = self.pool[context['active_model']].read(cr, uid, context['active_ids'], ['supplier','customer'])[0]
if not view_type:
view_id = self.pool.get('ir.ui.view').search(cr, uid, [('name', '=', 'account.invoice.tree')])
view_type = 'tree'
@@ -367,18 +370,6 @@ class account_invoice(osv.osv):
context['view_id'] = view_id
return context
- def create(self, cr, uid, vals, context=None):
- if context is None:
- context = {}
- try:
- return super(account_invoice, self).create(cr, uid, vals, context)
- except Exception, e:
- if '"journal_id" viol' in e.args[0]:
- raise orm.except_orm(_('Configuration Error!'),
- _('There is no Sale/Purchase Journal(s) defined.'))
- else:
- raise orm.except_orm(_('Unknown Error!'), str(e))
-
def invoice_print(self, cr, uid, ids, context=None):
'''
This function prints the invoice and mark it as sent, so that we can see more easily the next step of the workflow
@@ -421,6 +412,7 @@ class account_invoice(osv.osv):
'mark_invoice_as_sent': True,
})
return {
+ 'name': _('Compose Email'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
@@ -996,8 +988,7 @@ class account_invoice(osv.osv):
'narration':inv.comment
}
period_id = inv.period_id and inv.period_id.id or False
- ctx.update(company_id=inv.company_id.id,
- account_period_prefer_normal=True)
+ ctx.update(company_id=inv.company_id.id)
if not period_id:
period_ids = period_obj.find(cr, uid, inv.date_invoice, context=ctx)
period_id = period_ids and period_ids[0] or False
@@ -1273,9 +1264,7 @@ class account_invoice(osv.osv):
ref = invoice.reference
else:
ref = self._convert_ref(cr, uid, invoice.number)
- partner = invoice.partner_id
- if partner.parent_id and not partner.is_company:
- partner = partner.parent_id
+ partner = self.pool['res.partner']._find_accounting_partner(invoice.partner_id)
# Pay attention to the sign for both debit/credit AND amount_currency
l1 = {
'debit': direction * pay_amount>0 and direction * pay_amount,
@@ -1595,7 +1584,6 @@ class account_invoice_line(osv.osv):
unique_tax_ids = product_change_result['value']['invoice_line_tax_id']
return {'value':{'invoice_line_tax_id': unique_tax_ids}}
-account_invoice_line()
class account_invoice_tax(osv.osv):
_name = "account.invoice.tax"
@@ -1746,15 +1734,11 @@ class res_partner(osv.osv):
'invoice_ids': fields.one2many('account.invoice.line', 'partner_id', 'Invoices', readonly=True),
}
- def _find_accounting_partner(self, part):
+ def _find_accounting_partner(self, partner):
'''
Find the partner for which the accounting entries will be created
'''
- #if the chosen partner is not a company and has a parent company, use the parent for the journal entries
- #because you want to invoice 'Agrolait, accounting department' but the journal items are for 'Agrolait'
- if part.parent_id and not part.is_company:
- part = part.parent_id
- return part
+ return partner.commercial_partner_id
def copy(self, cr, uid, id, default=None, context=None):
default = default or {}
diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml
index 8c0854bd6c6..7469c38decb 100644
--- a/addons/account/account_invoice_view.xml
+++ b/addons/account/account_invoice_view.xml
@@ -117,6 +117,7 @@
<field name="arch" type="xml">
<tree colors="blue:state == 'draft';black:state in ('proforma','proforma2','open');gray:state == 'cancel'" string="Invoice">
<field name="partner_id" groups="base.group_user"/>
+ <field name="commercial_partner_id" invisible="1"/>
<field name="date_invoice"/>
<field name="number"/>
<field name="reference" invisible="1"/>
@@ -320,7 +321,8 @@
<field string="Customer" name="partner_id"
on_change="onchange_partner_id(type,partner_id,date_invoice,payment_term, partner_bank_id,company_id)"
groups="base.group_user" context="{'search_default_customer':1, 'show_address': 1}"
- options='{"always_reload": True}'/>
+ options='{"always_reload": True}'
+ domain="[('customer', '=', True)]"/>
<field name="fiscal_position" widget="selection" />
</group>
<group>
@@ -447,18 +449,20 @@
<field name="model">account.invoice</field>
<field name="arch" type="xml">
<search string="Search Invoice">
- <field name="number" string="Invoice" filter_domain="['|','|','|', ('number','ilike',self), ('origin','ilike',self), ('supplier_invoice_number', 'ilike', self), ('partner_id', 'ilike', self)]"/>
+ <field name="number" string="Invoice" filter_domain="['|','|','|', ('number','ilike',self), ('origin','ilike',self), ('supplier_invoice_number', 'ilike', self), ('partner_id', 'child_of', self)]"/>
<filter name="draft" string="Draft" domain="[('state','=','draft')]" help="Draft Invoices"/>
<filter name="proforma" string="Proforma" domain="[('state','=','proforma2')]" help="Proforma Invoices" groups="account.group_proforma_invoices"/>
<filter name="invoices" string="Invoices" domain="[('state','not in',['draft','cancel'])]" help="Proforma/Open/Paid Invoices"/>
<filter name="unpaid" string="Unpaid" domain="[('state','=','open')]" help="Unpaid Invoices"/>
<separator/>
- <filter domain="[('user_id','=',uid)]" help="My Invoices" icon="terp-personal"/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/>
<field name="user_id" string="Salesperson"/>
<field name="period_id" string="Period"/>
+ <separator/>
+ <filter domain="[('user_id','=',uid)]" help="My Invoices"/>
<group expand="0" string="Group By...">
- <filter string="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
+ <filter name="partner_id" string="Partner" domain="[]" context="{'group_by':'partner_id'}"/>
+ <filter name="commercial_partner_id" string="Commercial Partner" domain="[]" context="{'group_by':'commercial_partner_id'}"/>
<filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
<filter string="Journal" icon="terp-folder-orange" domain="[]" context="{'group_by':'journal_id'}"/>
<filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
@@ -621,8 +625,6 @@
</record>
<menuitem action="action_invoice_tree4" id="menu_action_invoice_tree4" parent="menu_finance_payables"/>
- <act_window context="{'search_default_partner_id':[active_id], 'default_partner_id': active_id}" id="act_res_partner_2_account_invoice_opened" name="Invoices" res_model="account.invoice" src_model="res.partner"/>
-
<act_window
id="act_account_journal_2_account_invoice_opened"
name="Unpaid Invoices"
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py
index 36d211c11d2..006e2c55f5f 100644
--- a/addons/account/account_move_line.py
+++ b/addons/account/account_move_line.py
@@ -559,10 +559,11 @@ class account_move_line(osv.osv):
]
def _auto_init(self, cr, context=None):
- super(account_move_line, self)._auto_init(cr, context=context)
+ res = super(account_move_line, self)._auto_init(cr, context=context)
cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = \'account_move_line_journal_id_period_id_index\'')
if not cr.fetchone():
cr.execute('CREATE INDEX account_move_line_journal_id_period_id_index ON account_move_line (journal_id, period_id)')
+ return res
def _check_no_view(self, cr, uid, ids, context=None):
lines = self.browse(cr, uid, ids, context=context)
@@ -654,13 +655,7 @@ class account_move_line(osv.osv):
}
return result
- def onchange_account_id(self, cr, uid, ids, account_id, context=None):
- res = {'value': {}}
- if account_id:
- res['value']['account_tax_id'] = [x.id for x in self.pool.get('account.account').browse(cr, uid, account_id, context=context).tax_ids]
- return res
-
- def onchange_partner_id(self, cr, uid, ids, move_id, partner_id, account_id=None, debit=0, credit=0, date=False, journal=False):
+ def onchange_partner_id(self, cr, uid, ids, move_id, partner_id, account_id=None, debit=0, credit=0, date=False, journal=False, context=None):
partner_obj = self.pool.get('res.partner')
payment_term_obj = self.pool.get('account.payment.term')
journal_obj = self.pool.get('account.journal')
@@ -674,8 +669,8 @@ class account_move_line(osv.osv):
date = datetime.now().strftime('%Y-%m-%d')
jt = False
if journal:
- jt = journal_obj.browse(cr, uid, journal).type
- part = partner_obj.browse(cr, uid, partner_id)
+ jt = journal_obj.browse(cr, uid, journal, context=context).type
+ part = partner_obj.browse(cr, uid, partner_id, context=context)
payment_term_id = False
if jt and jt in ('purchase', 'purchase_refund') and part.property_supplier_payment_term:
@@ -700,20 +695,20 @@ class account_move_line(osv.osv):
elif part.supplier:
val['account_id'] = fiscal_pos_obj.map_account(cr, uid, part and part.property_account_position or False, id1)
if val.get('account_id', False):
- d = self.onchange_account_id(cr, uid, ids, val['account_id'])
+ d = self.onchange_account_id(cr, uid, ids, account_id=val['account_id'], partner_id=part.id, context=context)
val.update(d['value'])
return {'value':val}
- def onchange_account_id(self, cr, uid, ids, account_id=False, partner_id=False):
+ def onchange_account_id(self, cr, uid, ids, account_id=False, partner_id=False, context=None):
account_obj = self.pool.get('account.account')
partner_obj = self.pool.get('res.partner')
fiscal_pos_obj = self.pool.get('account.fiscal.position')
val = {}
if account_id:
- res = account_obj.browse(cr, uid, account_id)
+ res = account_obj.browse(cr, uid, account_id, context=context)
tax_ids = res.tax_ids
if tax_ids and partner_id:
- part = partner_obj.browse(cr, uid, partner_id)
+ part = partner_obj.browse(cr, uid, partner_id, context=context)
tax_id = fiscal_pos_obj.map_tax(cr, uid, part and part.property_account_position or False, tax_ids)[0]
else:
tax_id = tax_ids and tax_ids[0].id or False
@@ -742,7 +737,7 @@ class account_move_line(osv.osv):
def list_partners_to_reconcile(self, cr, uid, context=None):
cr.execute(
"""SELECT partner_id FROM (
- SELECT l.partner_id, p.last_reconciliation_date, SUM(l.debit) AS debit, SUM(l.credit) AS credit, MAX(l.date) AS max_date
+ SELECT l.partner_id, p.last_reconciliation_date, SUM(l.debit) AS debit, SUM(l.credit) AS credit, MAX(l.create_date) AS max_date
FROM account_move_line l
RIGHT JOIN account_account a ON (a.id = l.account_id)
RIGHT JOIN res_partner p ON (l.partner_id = p.id)
@@ -753,9 +748,14 @@ class account_move_line(osv.osv):
) AS s
WHERE debit > 0 AND credit > 0 AND (last_reconciliation_date IS NULL OR max_date > last_reconciliation_date)
ORDER BY last_reconciliation_date""")
- ids = cr.fetchall()
- ids = len(ids) and [x[0] for x in ids] or []
- return self.pool.get('res.partner').name_get(cr, uid, ids, context=context)
+ ids = [x[0] for x in cr.fetchall()]
+ if not ids:
+ return []
+
+ # To apply the ir_rules
+ partner_obj = self.pool.get('res.partner')
+ ids = partner_obj.search(cr, uid, [('id', 'in', ids)], context=context)
+ return partner_obj.name_get(cr, uid, ids, context=context)
def reconcile_partial(self, cr, uid, ids, type='auto', context=None, writeoff_acc_id=False, writeoff_period_id=False, writeoff_journal_id=False):
move_rec_obj = self.pool.get('account.move.reconcile')
@@ -980,8 +980,7 @@ class account_move_line(osv.osv):
if context is None:
context = {}
period_pool = self.pool.get('account.period')
- ctx = dict(context, account_period_prefer_normal=True)
- pids = period_pool.find(cr, user, date, context=ctx)
+ pids = period_pool.find(cr, user, date, context=context)
if pids:
res.update({
'period_id':pids[0]
@@ -1303,6 +1302,5 @@ class account_move_line(osv.osv):
bool(journal.currency),bool(journal.analytic_journal_id)))
return result
-account_move_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/account_report.xml b/addons/account/account_report.xml
index 0017409f416..6e121c9f5a5 100644
--- a/addons/account/account_report.xml
+++ b/addons/account/account_report.xml
@@ -11,7 +11,7 @@
<report auto="False" id="account_general_journal" model="account.journal.period" name="account.general.journal" rml="account/report/account_general_journal.rml" string="General Journal" header="False"/>
<report auto="False" id="account_journal" model="account.journal.period" name="account.journal.period.print" rml="account/report/account_journal.rml" string="Journal" header="False"/>
<report auto="False" id="account_journal_sale_purchase" model="account.journal.period" name="account.journal.period.print.sale.purchase" rml="account/report/account_journal_sale_purchase.rml" string="Sale/Purchase Journal" header="False"/>
- <report auto="False" id="account_overdue" model="res.partner" name="account.overdue" rml="account/report/account_print_overdue.rml" string="Overdue Payments"/>
+ <report id="account_overdue" model="res.partner" name="account.overdue" rml="account/report/account_print_overdue.rml" string="Overdue Payments" parser="account.report.account_print_overdue.Overdue"/>
<report
auto="False"
id="account_invoices"
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index b8dcefdd3a4..13bc694a1cc 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -1112,7 +1112,7 @@
<field name="ref"/>
<field name="statement_id" invisible="1"/>
<field name="partner_id" on_change="onchange_partner_id(move_id, partner_id, account_id, debit, credit, date, journal_id)"/>
- <field name="account_id" options='{"no_open":True}' domain="[('journal_id','=',journal_id), ('company_id', '=', company_id)]" on_change="onchange_account_id(account_id)"/>
+ <field name="account_id" options='{"no_open":True}' domain="[('journal_id','=',journal_id), ('company_id', '=', company_id)]" on_change="onchange_account_id(account_id, partner_id, context)"/>
<field name="account_tax_id" options='{"no_open":True}' invisible="context.get('journal_type', False) not in ['sale','sale_refund','purchase','purchase_refund','general']"/>
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('type','not in',['view','template'])]" invisible="not context.get('analytic_journal_id',False)"/>
<field name="move_id" required="0"/>
@@ -1194,7 +1194,12 @@
sequence="1"
groups="group_account_user"
/>
-
+ <record id="action_account_moves_all_tree" model="ir.actions.act_window">
+ <field name="name">Journal Items</field>
+ <field name="res_model">account.move.line</field>
+ <field name="context">{'search_default_partner_id': [active_id], 'default_partner_id': active_id}</field>
+ <field name="view_id" ref="view_move_line_tree"/>
+ </record>
<record id="view_move_line_tree_reconcile" model="ir.ui.view">
<field name="model">account.move.line</field>
<field eval="24" name="priority"/>
@@ -1288,7 +1293,7 @@
<group col="6" colspan="4">
<field name="name"/>
<field name="ref"/>
- <field name="partner_id" on_change="onchange_partner_id(False,partner_id,account_id,debit,credit,date)"/>
+ <field name="partner_id" on_change="onchange_partner_id(False, partner_id, account_id, debit, credit, date, journal_id, context)"/>
<field name="journal_id"/>
<field name="period_id"/>
@@ -1352,7 +1357,7 @@
<tree colors="blue:state == 'draft';black:state == 'posted'" editable="top" string="Journal Items">
<field name="invoice"/>
<field name="name"/>
- <field name="partner_id" on_change="onchange_partner_id(False,partner_id,account_id,debit,credit,parent.date,parent.journal_id)"/>
+ <field name="partner_id" on_change="onchange_partner_id(False, partner_id, account_id, debit, credit, parent.date, parent.journal_id, context)"/>
<field name="account_id" domain="[('journal_id','=',parent.journal_id),('company_id', '=', parent.company_id)]"/>
<field name="date_maturity"/>
<field name="debit" sum="Total Debit"/>
@@ -1771,23 +1776,6 @@
</field>
</record>
- <!-- res.partner links -->
- <act_window
- context="{'search_default_unreconciled':True, 'search_default_partner_id':[active_id], 'default_partner_id': active_id}"
- domain="[('account_id.reconcile', '=', True),('account_id.type', 'in', ['receivable', 'payable'])]"
- id="act_account_partner_account_move_all"
- name="Receivables &amp; Payables"
- res_model="account.move.line"
- src_model="res.partner"/>
-
- <act_window
- context="{'search_default_partner_id':[active_id], 'default_partner_id': active_id}"
- id="act_account_partner_account_move"
- name="Journal Items"
- res_model="account.move.line"
- src_model="res.partner"
- groups="account.group_account_user"/>
-
<!-- Account Templates -->
<menuitem
id="account_template_folder"
diff --git a/addons/account/company.py b/addons/account/company.py
index a4624ae5ad5..3f2db1b98b8 100644
--- a/addons/account/company.py
+++ b/addons/account/company.py
@@ -47,6 +47,5 @@ Thank you in advance for your cooperation.
Best Regards,'''
}
-res_company()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/i18n/nl_BE.po b/addons/account/i18n/nl_BE.po
index 172dea460df..139807ab49b 100644
--- a/addons/account/i18n/nl_BE.po
+++ b/addons/account/i18n/nl_BE.po
@@ -1,20 +1,20 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * account
-# Els Van Vossel <evv@agaplan.eu>, 2012.
+# Els Van Vossel <evv@agaplan.eu>, 2012, 2013.
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2012-12-19 18:03+0000\n"
+"PO-Revision-Date: 2013-04-15 23:02+0000\n"
"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: Els Van Vossel\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:20+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-17 05:15+0000\n"
+"X-Generator: Launchpad (build 16567)\n"
"Language: nl\n"
#. module: account
@@ -258,7 +258,7 @@ msgstr "Belgische rapporten"
#. module: account
#: model:mail.message.subtype,name:account.mt_invoice_validated
msgid "Validated"
-msgstr ""
+msgstr "Goedgekeurd"
#. module: account
#: model:account.account.type,name:account.account_type_income_view1
@@ -473,14 +473,14 @@ msgstr ""
#. module: account
#: help:account.bank.statement.line,name:0
msgid "Originator to Beneficiary Information"
-msgstr ""
+msgstr "Informatie Afzender naar Begunstigde"
#. module: account
#. openerp-web
#: code:addons/account/static/src/xml/account_move_line_quickadd.xml:8
#, python-format
msgid "Period :"
-msgstr ""
+msgstr "Periode:"
#. module: account
#: field:account.account.template,chart_template_id:0
@@ -494,6 +494,7 @@ msgstr "Boekhoudplansjabloon"
#: selection:account.invoice.refund,filter_refund:0
msgid "Modify: create refund, reconcile and create a new draft invoice"
msgstr ""
+"Wijzigen: factuur crediteren, afpunten en een nieuwe conceptfactuur maken"
#. module: account
#: help:account.config.settings,tax_calculation_rounding_method:0
@@ -803,7 +804,7 @@ msgstr "Stel de bankrekeningen van uw bedrijf in"
#. module: account
#: view:account.invoice.refund:0
msgid "Create Refund"
-msgstr ""
+msgstr "Creditnota maken"
#. module: account
#: constraint:account.move.line:0
@@ -833,7 +834,7 @@ msgstr "Bent u zeker dat u de boeking wilt uitvoeren?"
#: code:addons/account/account_invoice.py:1330
#, python-format
msgid "Invoice partially paid: %s%s of %s%s (%s%s remaining)."
-msgstr ""
+msgstr "Factuur is gedeeltelijk betaald: %s%s of %s%s (%s%s blijft open)"
#. module: account
#: view:account.invoice:0
@@ -1010,6 +1011,8 @@ msgid ""
" opening/closing fiscal "
"year process."
msgstr ""
+"U kunt geen afpunting ongedaan maken als deze afpunting voortkomt uit een "
+"heropening."
#. module: account
#: model:ir.actions.act_window,name:account.action_subscription_form_new
@@ -1052,7 +1055,7 @@ msgstr "Aankoopjournaal"
#. module: account
#: model:mail.message.subtype,description:account.mt_invoice_paid
msgid "Invoice paid"
-msgstr ""
+msgstr "Factuur betaald"
#. module: account
#: view:validate.account.move:0
@@ -1375,6 +1378,8 @@ msgid ""
"The amount expressed in the secondary currency must be positif when journal "
"item are debit and negatif when journal item are credit."
msgstr ""
+"Het bedrag in secundaire munt moet positief zijn als de boekingslijn debet "
+"is en negatief bij een creditbedrag."
#. module: account
#: view:account.invoice.cancel:0
@@ -1940,7 +1945,7 @@ msgstr "Verkopen per rekeningtype"
#: model:account.payment.term,name:account.account_payment_term_15days
#: model:account.payment.term,note:account.account_payment_term_15days
msgid "15 Days"
-msgstr ""
+msgstr "15 dagen"
#. module: account
#: model:ir.ui.menu,name:account.periodical_processing_invoicing
@@ -2084,7 +2089,7 @@ msgstr "Voorlopig rekeninguittreksel"
#. module: account
#: model:mail.message.subtype,description:account.mt_invoice_validated
msgid "Invoice validated"
-msgstr ""
+msgstr "Factuur goedgekeurd"
#. module: account
#: field:account.config.settings,module_account_check_writing:0
@@ -2342,6 +2347,7 @@ msgid ""
"You cannot change the type of account to '%s' type as it contains journal "
"items!"
msgstr ""
+"U kunt het rekeningtype niet wijzigen in '%s' omdat er al boekingen zijn."
#. module: account
#: model:ir.model,name:account.model_account_aged_trial_balance
@@ -2358,7 +2364,7 @@ msgstr "Boekjaar afsluiten"
#: code:addons/account/static/src/xml/account_move_line_quickadd.xml:14
#, python-format
msgid "Journal :"
-msgstr ""
+msgstr "Journaal:"
#. module: account
#: sql_constraint:account.fiscal.position.tax:0
@@ -2718,6 +2724,8 @@ msgid ""
"You cannot change the type of account from 'Closed' to any other type as it "
"contains journal items!"
msgstr ""
+"U kunt het rekeningtype niet wijzigen van 'Afgesloten' in een ander type als "
+"er boekingen zijn."
#. module: account
#: field:account.invoice.report,account_line_id:0
@@ -2811,7 +2819,7 @@ msgstr "Rekeningeigenschappen"
#. module: account
#: selection:account.invoice.refund,filter_refund:0
msgid "Create a draft refund"
-msgstr ""
+msgstr "Maak een voorlopige creditnota"
#. module: account
#: view:account.partner.reconcile.process:0
@@ -3360,7 +3368,7 @@ msgstr ""
#: view:account.unreconcile:0
#: view:account.unreconcile.reconcile:0
msgid "Unreconcile Transactions"
-msgstr ""
+msgstr "Afpuntingen ongedaan maken"
#. module: account
#: field:wizard.multi.charts.accounts,only_one_chart_template:0
@@ -3558,7 +3566,7 @@ msgstr "Aantal cijfers voor de rekeningcode"
#. module: account
#: field:res.partner,property_supplier_payment_term:0
msgid "Supplier Payment Term"
-msgstr ""
+msgstr "Betaaltermijn leverancier"
#. module: account
#: view:account.fiscalyear:0
@@ -3633,7 +3641,7 @@ msgstr "Elektronisch bestand"
#. module: account
#: field:account.move.line,reconcile:0
msgid "Reconcile Ref"
-msgstr ""
+msgstr "Afpuntingsreferentie"
#. module: account
#: field:account.config.settings,has_chart_of_accounts:0
@@ -3734,6 +3742,88 @@ msgid ""
"</div>\n"
" "
msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; \">\n"
+"\n"
+" <p>Hallo ${object.partner_id.name},</p>\n"
+"\n"
+" <p>Er is een nieuwe factuur voor u: </p>\n"
+" \n"
+" <p style=\"border-left: 1px solid #8e0000; margin-left: 30px;\">\n"
+" &nbsp;&nbsp;<strong>REFERENTIE</strong><br />\n"
+" &nbsp;&nbsp;Factuurnummer: <strong>${object.number}</strong><br />\n"
+" &nbsp;&nbsp;Totaal: <strong>${object.amount_total} "
+"${object.currency_id.name}</strong><br />\n"
+" &nbsp;&nbsp;Datum: ${object.date_invoice}<br />\n"
+" % if object.origin:\n"
+" &nbsp;&nbsp;Referentie: ${object.origin}<br />\n"
+" % endif\n"
+" % if object.user_id:\n"
+" &nbsp;&nbsp;Uw contactpersoon: <a "
+"href=\"mailto:${object.user_id.email or "
+"''}?subject=Factuur%20${object.number}\">${object.user_id.name}</a>\n"
+" % endif\n"
+" </p> \n"
+" \n"
+" % if object.paypal_url:\n"
+" <br/>\n"
+" <p>U kunt ook onmiddellijk betalen via Paypal:</p>\n"
+" <a style=\"margin-left: 120px;\" href=\"${object.paypal_url}\">\n"
+" <img class=\"oe_edi_paypal_button\" "
+"src=\"https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif\"/>\n"
+" </a>\n"
+" % endif\n"
+" \n"
+" <br/>\n"
+" <p>Neem gerust contact met ons op als u vragen heeft.</p>\n"
+" <p>Bedankt dat u hebt gekozen voor ${object.company_id.name or "
+"'ons'}!</p>\n"
+" <br/>\n"
+" <br/>\n"
+" <div style=\"width: 375px; margin: 0px; padding: 0px; background-color: "
+"#8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; "
+"background-repeat: repeat no-repeat;\">\n"
+" <h3 style=\"margin: 0px; padding: 2px 14px; font-size: 12px; color: "
+"#DDD;\">\n"
+" <strong style=\"text-"
+"transform:uppercase;\">${object.company_id.name}</strong></h3>\n"
+" </div>\n"
+" <div style=\"width: 347px; margin: 0px; padding: 5px 14px; line-height: "
+"16px; background-color: #F2F2F2;\">\n"
+" <span style=\"color: #222; margin-bottom: 5px; display: block; \">\n"
+" % if object.company_id.street:\n"
+" ${object.company_id.street}<br/>\n"
+" % endif\n"
+" % if object.company_id.street2:\n"
+" ${object.company_id.street2}<br/>\n"
+" % endif\n"
+" % if object.company_id.city or object.company_id.zip:\n"
+" ${object.company_id.zip} ${object.company_id.city}<br/>\n"
+" % endif\n"
+" % if object.company_id.country_id:\n"
+" ${object.company_id.state_id and ('%s, ' % "
+"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name "
+"or ''}<br/>\n"
+" % endif\n"
+" </span>\n"
+" % if object.company_id.phone:\n"
+" <div style=\"margin-top: 0px; margin-right: 0px; margin-bottom: "
+"0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: "
+"0px; padding-left: 0px; \">\n"
+" Tel.:&nbsp; ${object.company_id.phone}\n"
+" </div>\n"
+" % endif\n"
+" % if object.company_id.website:\n"
+" <div>\n"
+" Web:&nbsp;<a "
+"href=\"${object.company_id.website}\">${object.company_id.website}</a>\n"
+" </div>\n"
+" %endif\n"
+" <p></p>\n"
+" </div>\n"
+"</div>\n"
+" "
#. module: account
#: view:account.period:0
@@ -3922,6 +4012,8 @@ msgid ""
"You cannot create journal items with a secondary currency without recording "
"both 'currency' and 'amount currency' field."
msgstr ""
+"U kunt geen boekingslijnen in een secundaire munt maken zonder beide velden "
+"'valuta' en 'bedrag valuta' in te vullen."
#. module: account
#: field:account.financial.report,display_detail:0
@@ -4224,7 +4316,7 @@ msgstr ""
#. module: account
#: model:ir.model,name:account.model_account_journal_cashbox_line
msgid "account.journal.cashbox.line"
-msgstr ""
+msgstr "account.journal.cashbox.line"
#. module: account
#: model:ir.model,name:account.model_account_partner_reconcile_process
@@ -4498,7 +4590,7 @@ msgstr "Uw bankrekeningen instellen"
#. module: account
#: xsl:account.transfer:0
msgid "Partner ID"
-msgstr ""
+msgstr "Relatie-ID"
#. module: account
#: help:account.bank.statement,message_ids:0
@@ -4704,6 +4796,8 @@ msgid ""
"This payment term will be used instead of the default one for sale orders "
"and customer invoices"
msgstr ""
+"Deze betalingsvoorwaarde vervangt de standaardvoorwaarde van de huidige "
+"relatie."
#. module: account
#: view:account.config.settings:0
@@ -4731,7 +4825,7 @@ msgstr "Geboekte lijnen"
#. module: account
#: field:account.move.line,blocked:0
msgid "No Follow-up"
-msgstr ""
+msgstr "Geen aanmaning"
#. module: account
#: view:account.tax.template:0
@@ -4858,6 +4952,7 @@ msgstr "Maand"
#, python-format
msgid "You cannot change the code of account which contains journal items!"
msgstr ""
+"U kunt de code van een rekening niet wijzigen als er al boekingen zijn."
#. module: account
#: field:account.config.settings,purchase_sequence_prefix:0
@@ -4895,7 +4990,7 @@ msgstr "Rek.type"
#. module: account
#: selection:account.journal,type:0
msgid "Bank and Checks"
-msgstr ""
+msgstr "Bank en cheques"
#. module: account
#: field:account.account.template,note:0
@@ -4977,7 +5072,7 @@ msgstr "Schakel dit in als u ook rekeningen met een nulsaldo wilt weergeven."
#. module: account
#: field:account.move.reconcile,opening_reconciliation:0
msgid "Opening Entries Reconciliation"
-msgstr ""
+msgstr "Afpunting openingsboekingen"
#. module: account
#. openerp-web
@@ -5018,7 +5113,7 @@ msgstr "Boekhoudplan"
#. module: account
#: field:account.invoice,reference_type:0
msgid "Payment Reference"
-msgstr ""
+msgstr "Betaalreferentie"
#. module: account
#: selection:account.financial.report,style_overwrite:0
@@ -5092,7 +5187,7 @@ msgstr "Af te punten boekingen"
#. module: account
#: model:ir.model,name:account.model_account_tax_template
msgid "Templates for Taxes"
-msgstr ""
+msgstr "Btw-sjablonen"
#. module: account
#: sql_constraint:account.period:0
@@ -5667,6 +5762,8 @@ msgstr "Doelbewegingen"
msgid ""
"Move cannot be deleted if linked to an invoice. (Invoice: %s - Move ID:%s)"
msgstr ""
+"Boeking kan niet worden verwijderd als deze is gekoppeld aan een factuur "
+"(Factuur: %s - boeking: %s)"
#. module: account
#: view:account.bank.statement:0
@@ -6225,6 +6322,8 @@ msgid ""
"This payment term will be used instead of the default one for purchase "
"orders and supplier invoices"
msgstr ""
+"Deze betalingsvoorwaarde vervangt de standaardvoorwaarde van de huidige "
+"relatie voor aankooporders en aankoopfacturen."
#. module: account
#: help:account.automatic.reconcile,power:0
@@ -6734,7 +6833,7 @@ msgstr "Analytische lijn"
#. module: account
#: model:ir.ui.menu,name:account.menu_action_model_form
msgid "Models"
-msgstr ""
+msgstr "Modellen"
#. module: account
#: code:addons/account/account_invoice.py:1091
@@ -7055,6 +7154,12 @@ msgid ""
"due date, make sure that the payment term is not set on the invoice. If you "
"keep the payment term and the due date empty, it means direct payment."
msgstr ""
+"Als u betalingstermijnen gebruikt, wordt de vervaldatum automatisch berekend "
+"bij het maken van de boekingen. De betalingsvoorwaarde kan verschillende "
+"vervaldatums berekenen, vb. 50% nu en 50% binnen een maand. Als u een "
+"specifieke vervaldatum wilt instellen, gebruikt u beter geen "
+"betalingstermijn. Als u zowel betalingstermijn als vervaldatum leeglaat, "
+"gaat het om een contante betaling."
#. module: account
#: code:addons/account/account.py:414
@@ -7296,6 +7401,8 @@ msgid ""
"If you unreconcile transactions, you must also verify all the actions that "
"are linked to those transactions because they will not be disabled"
msgstr ""
+"Als u afgepunte transacties ongedaan maakt, moet u alle gekoppelde acties "
+"nakijken, want deze worden niet ongedaan gemaakt."
#. module: account
#: view:account.account.template:0
@@ -7330,6 +7437,7 @@ msgid ""
"You cannot provide a secondary currency if it is the same than the company "
"one."
msgstr ""
+"U kunt geen secundaire munt ingeven die identiek is aan de firmamunt."
#. module: account
#: selection:account.tax.template,applicable_type:0
@@ -7467,7 +7575,7 @@ msgstr "Manueel"
#. module: account
#: selection:account.invoice.refund,filter_refund:0
msgid "Cancel: create refund and reconcile"
-msgstr ""
+msgstr "Annuleren: maak een creditnota en punt af"
#. module: account
#: code:addons/account/wizard/account_report_aged_partner_balance.py:58
@@ -7564,7 +7672,7 @@ msgstr "Alle boekingen"
#. module: account
#: constraint:account.move.reconcile:0
msgid "You can only reconcile journal items with the same partner."
-msgstr ""
+msgstr "U kunt enkel boekingen met dezelfde relatie afpunten."
#. module: account
#: view:account.journal.select:0
@@ -7682,7 +7790,7 @@ msgstr ""
#. module: account
#: field:account.invoice,paypal_url:0
msgid "Paypal Url"
-msgstr ""
+msgstr "Paypal-url"
#. module: account
#: field:account.config.settings,module_account_voucher:0
@@ -8390,7 +8498,7 @@ msgstr ""
#. module: account
#: field:account.move.line,amount_residual_currency:0
msgid "Residual Amount in Currency"
-msgstr ""
+msgstr "Restbedrag in valuta"
#. module: account
#: field:account.config.settings,sale_refund_sequence_prefix:0
@@ -8444,6 +8552,8 @@ msgid ""
"Refund base on this type. You can not Modify and Cancel if the invoice is "
"already reconciled"
msgstr ""
+"Creditnota voor dit type. U kunt niet wijzigen of annuleren als de factuur "
+"al is afgepunt."
#. module: account
#: field:account.bank.statement.line,sequence:0
@@ -8461,7 +8571,7 @@ msgstr "Volgorde"
#. module: account
#: field:account.config.settings,paypal_account:0
msgid "Paypal account"
-msgstr ""
+msgstr "Paypal-rekening"
#. module: account
#: selection:account.print.journal,sort_selection:0
@@ -8730,7 +8840,7 @@ msgstr "Omgekeerde analytische balans -"
#: help:account.move.reconcile,opening_reconciliation:0
msgid ""
"Is this reconciliation produced by the opening of a new fiscal year ?."
-msgstr ""
+msgstr "Komt deze afpunting van een openingsboeking?"
#. module: account
#: view:account.analytic.line:0
@@ -9011,7 +9121,7 @@ msgstr "Eindbalans"
#. module: account
#: field:account.journal,centralisation:0
msgid "Centralized Counterpart"
-msgstr ""
+msgstr "Gecentraliseerde tegenboeking"
#. module: account
#: help:account.move.line,blocked:0
@@ -9047,6 +9157,12 @@ msgid ""
"invoice will be created \n"
" so that you can edit it."
msgstr ""
+"Gebruik deze optie als u een factuur wilt annuleren en een nieuwe maken.\n"
+" De creditnota wordt gemaakt, goedgekeurd "
+"en afgepunt\n"
+" met de huidige factuur. Een nieuwe, "
+"voorlopige factuur wordt gemaakt\n"
+" die u kunt bewerken."
#. module: account
#: model:process.transition,name:account.process_transition_filestatement0
@@ -9079,7 +9195,7 @@ msgstr "Rekeningtypen"
#. module: account
#: model:email.template,subject:account.email_template_edi_invoice
msgid "${object.company_id.name} Invoice (Ref ${object.number or 'n/a'})"
-msgstr ""
+msgstr "${object.company_id.name} Factuur (Ref. ${object.number or 'nvt' })"
#. module: account
#: code:addons/account/account_move_line.py:1213
@@ -9149,6 +9265,19 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik om een journaal toe te voegen.\n"
+" </p><p>\n"
+" Een journaal groepeert boekingen in functie\n"
+" van de dagelijkse bezigheden.\n"
+" </p><p>\n"
+" Een firma geruikt doorgaans een journaal per betaalmethode "
+"(kas,\n"
+" bankrekeningen, cheques), een aankoopdagboek, een "
+"verkoopdagboek\n"
+" en een diversendagboek.\n"
+" </p>\n"
+" "
#. module: account
#: model:ir.model,name:account.model_account_fiscalyear_close_state
@@ -9276,6 +9405,9 @@ msgid ""
"computed. Because it is space consuming, we do not allow to use it while "
"doing a comparison."
msgstr ""
+"Met deze optie krijgt u meer details over de manier waarop de saldi worden "
+"berekend. Omdat dit ruimte inneemt, is deze optie niet mogelijk bij "
+"vergelijkingen."
#. module: account
#: model:ir.model,name:account.model_account_fiscalyear_close
@@ -9292,6 +9424,8 @@ msgstr "De code van de rekening moet uniek zijn per firma."
#: help:product.template,property_account_expense:0
msgid "This account will be used to value outgoing stock using cost price."
msgstr ""
+"Deze rekening dient voor de voorraadwaardering van de uitgaande voorraad op "
+"basis van de kostprijs."
#. module: account
#: view:account.invoice:0
@@ -9354,6 +9488,17 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik als u een nieuwe recurrente boeking wilt maken.\n"
+" </p><p>\n"
+" Een terugkerende boeking wordt regelmatig op een bepaald "
+"tijdstip herhaald,\n"
+" vb. bij vervallen van een contract of overeenkomst met een\n"
+" klant of een leverancier. U kunt dergelijke boekingen "
+"voorbereiden\n"
+" zodat deze automatisch worden geboekt.\n"
+" </p>\n"
+" "
#. module: account
#: view:account.journal:0
@@ -9396,6 +9541,8 @@ msgid ""
"This allows you to check writing and printing.\n"
" This installs the module account_check_writing."
msgstr ""
+"Hiermee kunt u cheques schrijven en afdrukken.\n"
+" Hiermee wordt de module account_check_writing geïnstalleerd."
#. module: account
#: model:res.groups,name:account.group_account_invoice
@@ -9681,6 +9828,9 @@ msgid ""
"chart\n"
" of accounts."
msgstr ""
+"Bevestigde facturen kunnen niet meer\n"
+" worden gewijzigd. Facturen krijgen een uniek nummer\n"
+" en de boekingen worden gemaakt."
#. module: account
#: model:process.node,note:account.process_node_bankstatement0
@@ -9906,11 +10056,15 @@ msgid ""
"payments.\n"
" This installs the module account_payment."
msgstr ""
+"Hiermee kunt u betaalopdrachten maken\n"
+" * die als basis dienen voor verdere automatisering,\n"
+" * om efficiënter betalingen te kunnen uitvoeren.\n"
+" Hiermee wordt de module account_payment geïnstalleerd."
#. module: account
#: xsl:account.transfer:0
msgid "Document"
-msgstr ""
+msgstr "Document"
#. module: account
#: view:account.chart.template:0
@@ -10132,7 +10286,7 @@ msgstr "Kan geen boekingen maken tussen verschillende firma's."
#. module: account
#: model:ir.ui.menu,name:account.menu_finance_periodical_processing
msgid "Periodic Processing"
-msgstr ""
+msgstr "Periodieke verwerking"
#. module: account
#: view:account.invoice.report:0
@@ -10212,7 +10366,7 @@ msgstr "Vervaldatum"
#: model:account.payment.term,name:account.account_payment_term_immediate
#: model:account.payment.term,note:account.account_payment_term_immediate
msgid "Immediate Payment"
-msgstr ""
+msgstr "Contante betaling"
#. module: account
#: code:addons/account/account.py:1464
@@ -10424,11 +10578,16 @@ msgid ""
"analytic account.\n"
" This installs the module account_budget."
msgstr ""
+"Hiermee kunnen accountants budgetten beheren.\n"
+" Als de hoofdbudgetten zijn ingesteld, kunnen de "
+"projectleiders\n"
+" het geplande bedrag instellen per analytische rekening.\n"
+" Hiermee wordt de module account_budget geïnstalleerd."
#. module: account
#: field:account.bank.statement.line,name:0
msgid "OBI"
-msgstr ""
+msgstr "Omschrijving"
#. module: account
#: help:res.partner,property_account_payable:0
@@ -10915,6 +11074,8 @@ msgid ""
"If you unreconcile transactions, you must also verify all the actions that "
"are linked to those transactions because they will not be disable"
msgstr ""
+"Als u afgepunte transacties ongedaan maakt, moet u alle gekoppelde acties "
+"nakijken, want deze worden niet ongedaan gemaakt."
#. module: account
#: code:addons/account/account_move_line.py:1059
@@ -10949,6 +11110,9 @@ msgid ""
"customer. The tool search can also be used to personalise your Invoices "
"reports and so, match this analysis to your needs."
msgstr ""
+"Dit rapport biedt een overzicht van het bedrag gefactureerd aan uw klant. De "
+"zoekfunctie kan worden aangepast om het overzicht van uw facturen te "
+"personaliseren, zodat u de gewenste analyse krijgt."
#. module: account
#: view:account.partner.reconcile.process:0
@@ -11207,6 +11371,16 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik als u een nieuw btw-vak wilt toevoegen.\n"
+" </p><p>\n"
+" Afhankelijk van uw land, dient een btw-vak om uw btw-"
+"aangifte in te vullen.\n"
+" In OpenERP kunt u een btw-structuur instellen en elke btw-"
+"berekening\n"
+" kan in een of meer btw-vakken worden opgenomen.\n"
+" </p>\n"
+" "
#. module: account
#: selection:account.entries.report,month:0
@@ -11233,6 +11407,18 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Selecteer de periode en het journaal.\n"
+" </p><p>\n"
+" Hiermee kan de boekhouder in een sneltempo boekingen "
+"invoeren in\n"
+" OpenERP. Als u een aankoopfactuur wilt inboeken,\n"
+" begint u met de kostenrekening. OpenERP stelt automatisch\n"
+" de betrokken btw voor die is gekoppeld aan deze rekening, "
+"net\n"
+" als de centralisatierekening.\n"
+" </p>\n"
+" "
#. module: account
#: help:account.invoice.line,account_id:0
@@ -11403,7 +11589,7 @@ msgstr "Rekeningmodel"
#: code:addons/account/account_cash_statement.py:292
#, python-format
msgid "Loss"
-msgstr ""
+msgstr "Verlies"
#. module: account
#: selection:account.entries.report,month:0
@@ -11475,7 +11661,7 @@ msgstr "Kostenrekening van productsjabloon"
#. module: account
#: field:res.partner,property_payment_term:0
msgid "Customer Payment Term"
-msgstr ""
+msgstr "Betaaltermijn klant"
#. module: account
#: help:accounting.report,label_filter:0
diff --git a/addons/account/i18n/pt_BR.po b/addons/account/i18n/pt_BR.po
index ba985c5e0a8..d1816589139 100644
--- a/addons/account/i18n/pt_BR.po
+++ b/addons/account/i18n/pt_BR.po
@@ -7,15 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2012-12-22 23:17+0000\n"
-"Last-Translator: Fábio Martinelli - http://zupy.com.br "
-"<webmaster@guaru.net>\n"
+"PO-Revision-Date: 2013-04-18 17:44+0000\n"
+"Last-Translator: Thiago Tognoli <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:19+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-19 05:24+0000\n"
+"X-Generator: Launchpad (build 16567)\n"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
@@ -431,7 +430,7 @@ msgstr "Data de criação"
#. module: account
#: selection:account.journal,type:0
msgid "Purchase Refund"
-msgstr "Devolução da Venda"
+msgstr "Devolução de Compra"
#. module: account
#: selection:account.journal,type:0
@@ -12678,13 +12677,6 @@ msgstr ""
#~ msgid "This period is already closed !"
#~ msgstr "Este período já está fechado"
-#, python-format
-#~ msgid ""
-#~ "Selected Move lines does not have any account move enties in draft state"
-#~ msgstr ""
-#~ "As linhas do movimento selecionado nao tem nenhuma conta a ser movida para o "
-#~ "estado de esboço"
-
#~ msgid "Unpaid Customer Refunds"
#~ msgstr "Reembolsos a clientes não pagos"
@@ -13233,6 +13225,13 @@ msgstr ""
#~ msgstr "Não pode %s provisório/proforma/cancelar fatura."
#, python-format
+#~ msgid ""
+#~ "Selected Move lines does not have any account move enties in draft state"
+#~ msgstr ""
+#~ "As linhas de movimento selecionadas não tem nenhum movimento nesta conta no "
+#~ "modo provisório"
+
+#, python-format
#~ msgid "Can not pay draft/proforma/cancel invoice."
#~ msgstr "Não se pode pagar uma fatura provisória/proforma/cancelada"
diff --git a/addons/account/i18n/zh_CN.po b/addons/account/i18n/zh_CN.po
index ff84dd866e8..0e216ddb68f 100644
--- a/addons/account/i18n/zh_CN.po
+++ b/addons/account/i18n/zh_CN.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2013-01-30 03:58+0000\n"
-"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\n"
+"PO-Revision-Date: 2013-04-25 09:04+0000\n"
+"Last-Translator: Oliver Yuan <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:20+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-26 05:34+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
#. module: account
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
@@ -10748,7 +10748,7 @@ msgstr "手动的发票税(非主营业务纳税)"
#: code:addons/account/account_invoice.py:550
#, python-format
msgid "The payment term of supplier does not have a payment term line."
-msgstr ""
+msgstr "供应商付款条件没有包含付款条件行"
#. module: account
#: field:account.account,parent_right:0
diff --git a/addons/account/installer.py b/addons/account/installer.py
index d02e7196d4d..537371d0f64 100644
--- a/addons/account/installer.py
+++ b/addons/account/installer.py
@@ -23,10 +23,16 @@ import datetime
from dateutil.relativedelta import relativedelta
import logging
from operator import itemgetter
-from os.path import join as opj
import time
+import urllib2
+import urlparse
-from openerp import netsvc, tools
+try:
+ import simplejson as json
+except ImportError:
+ import json # noqa
+
+from openerp.release import serie
from openerp.tools.translate import _
from openerp.osv import fields, osv
@@ -38,13 +44,28 @@ class account_installer(osv.osv_memory):
def _get_charts(self, cr, uid, context=None):
modules = self.pool.get('ir.module.module')
+
+ # try get the list on apps server
+ try:
+ apps_server = self.pool.get('ir.config_parameter').get_param(cr, uid, 'apps.server', 'https://apps.openerp.com')
+
+ up = urlparse.urlparse(apps_server)
+ url = '{0.scheme}://{0.netloc}/apps/charts?serie={1}'.format(up, serie)
+
+ j = urllib2.urlopen(url, timeout=3).read()
+ apps_charts = json.loads(j)
+
+ charts = dict(apps_charts)
+ except Exception:
+ charts = dict()
+
# Looking for the module with the 'Account Charts' category
category_name, category_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base', 'module_category_localization_account_charts')
ids = modules.search(cr, uid, [('category_id', '=', category_id)], context=context)
- charts = list(
- sorted(((m.name, m.shortdesc)
- for m in modules.browse(cr, uid, ids, context=context)),
- key=itemgetter(1)))
+ if ids:
+ charts.update((m.name, m.shortdesc) for m in modules.browse(cr, uid, ids, context=context))
+
+ charts = sorted(charts.items(), key=itemgetter(1))
charts.insert(0, ('configurable', _('Custom')))
return charts
@@ -57,9 +78,9 @@ class account_installer(osv.osv_memory):
"country."),
'date_start': fields.date('Start Date', required=True),
'date_stop': fields.date('End Date', required=True),
- 'period': fields.selection([('month', 'Monthly'), ('3months','3 Monthly')], 'Periods', required=True),
+ 'period': fields.selection([('month', 'Monthly'), ('3months', '3 Monthly')], 'Periods', required=True),
'company_id': fields.many2one('res.company', 'Company', required=True),
- 'has_default_company' : fields.boolean('Has Default Company', readonly=True),
+ 'has_default_company': fields.boolean('Has Default Company', readonly=True),
}
def _default_company(self, cr, uid, context=None):
@@ -78,30 +99,29 @@ class account_installer(osv.osv_memory):
'has_default_company': _default_has_default_company,
'charts': 'configurable'
}
-
+
def get_unconfigured_cmp(self, cr, uid, context=None):
""" get the list of companies that have not been configured yet
but don't care about the demo chart of accounts """
- cmp_select = []
company_ids = self.pool.get('res.company').search(cr, uid, [], context=context)
cr.execute("SELECT company_id FROM account_account WHERE active = 't' AND account_account.parent_id IS NULL AND name != %s", ("Chart For Automated Tests",))
configured_cmp = [r[0] for r in cr.fetchall()]
return list(set(company_ids)-set(configured_cmp))
-
+
def check_unconfigured_cmp(self, cr, uid, context=None):
""" check if there are still unconfigured companies """
if not self.get_unconfigured_cmp(cr, uid, context=context):
raise osv.except_osv(_('No unconfigured company !'), _("There is currently no company without chart of account. The wizard will therefore not be executed."))
-
+
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
- if context is None:context = {}
- res = super(account_installer, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar,submenu=False)
+ if context is None: context = {}
+ res = super(account_installer, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=False)
cmp_select = []
# display in the widget selection only the companies that haven't been configured yet
unconfigured_cmp = self.get_unconfigured_cmp(cr, uid, context=context)
for field in res['fields']:
if field == 'company_id':
- res['fields'][field]['domain'] = [('id','in',unconfigured_cmp)]
+ res['fields'][field]['domain'] = [('id', 'in', unconfigured_cmp)]
res['fields'][field]['selection'] = [('', '')]
if unconfigured_cmp:
cmp_select = [(line.id, line.name) for line in self.pool.get('res.company').browse(cr, uid, unconfigured_cmp)]
@@ -117,7 +137,7 @@ class account_installer(osv.osv_memory):
def execute(self, cr, uid, ids, context=None):
self.execute_simple(cr, uid, ids, context)
- super(account_installer, self).execute(cr, uid, ids, context=context)
+ return super(account_installer, self).execute(cr, uid, ids, context=context)
def execute_simple(self, cr, uid, ids, context=None):
if context is None:
@@ -129,8 +149,8 @@ class account_installer(osv.osv_memory):
if not f_ids:
name = code = res['date_start'][:4]
if int(name) != int(res['date_stop'][:4]):
- name = res['date_start'][:4] +'-'+ res['date_stop'][:4]
- code = res['date_start'][2:4] +'-'+ res['date_stop'][2:4]
+ name = res['date_start'][:4] + '-' + res['date_stop'][:4]
+ code = res['date_start'][2:4] + '-' + res['date_stop'][2:4]
vals = {
'name': name,
'code': code,
@@ -150,8 +170,7 @@ class account_installer(osv.osv_memory):
chart = self.read(cr, uid, ids, ['charts'],
context=context)[0]['charts']
_logger.debug('Installing chart of accounts %s', chart)
- return modules | set([chart])
+ return (modules | set([chart])) - set(['has_default_company', 'configurable'])
-account_installer()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/ir_sequence.py b/addons/account/ir_sequence.py
index 56e1a4d0367..d3615a847b7 100644
--- a/addons/account/ir_sequence.py
+++ b/addons/account/ir_sequence.py
@@ -38,7 +38,6 @@ class ir_sequence_fiscalyear(osv.osv):
'Main Sequence must be different from current !'),
]
-ir_sequence_fiscalyear()
class ir_sequence(osv.osv):
_inherit = 'ir.sequence'
@@ -56,6 +55,5 @@ class ir_sequence(osv.osv):
return super(ir_sequence, self)._next(cr, uid, [line.sequence_id.id], context)
return super(ir_sequence, self)._next(cr, uid, seq_ids, context)
-ir_sequence()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/partner.py b/addons/account/partner.py
index ae8d2fc1871..f582da6b765 100644
--- a/addons/account/partner.py
+++ b/addons/account/partner.py
@@ -66,7 +66,6 @@ class account_fiscal_position(osv.osv):
break
return account_id
-account_fiscal_position()
class account_fiscal_position_tax(osv.osv):
_name = 'account.fiscal.position.tax'
@@ -84,7 +83,6 @@ class account_fiscal_position_tax(osv.osv):
'A tax fiscal position could be defined only once time on same taxes.')
]
-account_fiscal_position_tax()
class account_fiscal_position_account(osv.osv):
_name = 'account.fiscal.position.account'
@@ -102,7 +100,6 @@ class account_fiscal_position_account(osv.osv):
'An account fiscal position could be defined only once time on same accounts.')
]
-account_fiscal_position_account()
class res_partner(osv.osv):
_name = 'res.partner'
@@ -236,6 +233,10 @@ class res_partner(osv.osv):
'last_reconciliation_date': fields.datetime('Latest Full Reconciliation Date', help='Date on which the partner accounting entries were fully reconciled last time. It differs from the last date where a reconciliation has been made for this partner, as here we depict the fact that nothing more was to be reconciled at this date. This can be achieved in 2 different ways: either the last unreconciled debit/credit entry of this partner was reconciled, either the user pressed the button "Nothing more to reconcile" during the manual reconciliation process.')
}
-res_partner()
+ def _commercial_fields(self, cr, uid, context=None):
+ return super(res_partner, self)._commercial_fields(cr, uid, context=context) + \
+ ['debit_limit', 'property_account_payable', 'property_account_receivable', 'property_account_position',
+ 'property_payment_term', 'property_supplier_payment_term', 'last_reconciliation_date']
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml
index 1267e20165b..b6fae3140b5 100644
--- a/addons/account/partner_view.xml
+++ b/addons/account/partner_view.xml
@@ -50,6 +50,29 @@
</field>
</record>
+ <record id="action_account_analytic_account_form" model="ir.actions.act_window">
+ <field name="context">{'search_default_partner_id': [active_id], 'default_partner_id': active_id}</field>
+ <field name="name">Contracts/Analytic Accounts</field>
+ <field name="res_model">account.analytic.account</field>
+ <field name="view_mode">tree,form</field>
+ </record>
+ <record model="ir.ui.view" id="partner_view_buttons">
+ <field name="name">partner.view.buttons</field>
+ <field name="model">res.partner</field>
+ <field name="inherit_id" ref="base.view_partner_form" />
+ <field name="priority" eval="10"/>
+ <field name="arch" type="xml">
+ <xpath expr="//div[@name='buttons']" position="inside">
+ <button type="action" string="Invoices"
+ name="%(account.action_invoice_tree)d"
+ context="{'search_default_partner_id': active_id,'default_partner_id': active_id}" groups="account.group_account_invoice"/>
+ <button type="action" string="Journal Items" name="%(account.action_account_moves_all_tree)d" groups="account.group_account_user"/>
+ <button type="action" string="Contracts/Analytic Accounts" name="%(account.action_account_analytic_account_form)d"
+ groups="analytic.group_analytic_accounting"/>
+ </xpath>
+ </field>
+ </record>
+
<record id="action_account_fiscal_position_form" model="ir.actions.act_window">
<field name="name">Fiscal Positions</field>
<field name="res_model">account.fiscal.position</field>
@@ -73,7 +96,7 @@
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<page string="History" position="before" version="7.0">
- <page string="Accounting" col="4">
+ <page string="Accounting" col="4" name="accounting" attrs="{'invisible': [('is_company','=',False),('parent_id','!=',False)]}">
<group>
<group>
<field name="property_account_position" widget="selection"/>
@@ -103,20 +126,13 @@
</tree>
</field>
</page>
+ <page string="Accounting" name="accounting_disabled" attrs="{'invisible': ['|',('is_company','=',True),('parent_id','=',False)]}">
+ <div>
+ <p>Accounting-related settings are managed on <button name="open_commercial_entity" type="object" string="the parent company" class="oe_link"/></p>
+ </div>
+ </page>
</page>
</field>
</record>
-
- <!-- Partners info tab view-->
-
- <act_window
- id="action_analytic_open"
- name="Contracts/Analytic Accounts"
- res_model="account.analytic.account"
- context="{'search_default_partner_id':[active_id], 'default_partner_id': active_id}"
- src_model="res.partner"
- view_type="form"
- view_mode="tree,form"/>
-
</data>
</openerp>
diff --git a/addons/account/product.py b/addons/account/product.py
index ce1ac83d6dd..3df3ad9bd17 100644
--- a/addons/account/product.py
+++ b/addons/account/product.py
@@ -39,7 +39,6 @@ class product_category(osv.osv):
view_load=True,
help="This account will be used for invoices to value expenses."),
}
-product_category()
#----------------------------------------------------------
# Products
@@ -70,6 +69,5 @@ class product_template(osv.osv):
help="This account will be used for invoices instead of the default one to value expenses for the current product."),
}
-product_template()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/project/project.py b/addons/account/project/project.py
index f4927331ca8..b4dcdde2d30 100644
--- a/addons/account/project/project.py
+++ b/addons/account/project/project.py
@@ -38,7 +38,6 @@ class account_analytic_journal(osv.osv):
'company_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id,
}
-account_analytic_journal()
class account_journal(osv.osv):
_inherit="account.journal"
@@ -47,6 +46,5 @@ class account_journal(osv.osv):
'analytic_journal_id':fields.many2one('account.analytic.journal','Analytic Journal', help="Journal for analytic entries"),
}
-account_journal()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/project/project_view.xml b/addons/account/project/project_view.xml
index aa567d2fc79..79a1e76c7e7 100644
--- a/addons/account/project/project_view.xml
+++ b/addons/account/project/project_view.xml
@@ -31,7 +31,7 @@
<search string="Analytic Account">
<field name="name" filter_domain="['|', ('name','ilike',self), ('code','ilike',self)]" string="Analytic Account"/>
<field name="date"/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="manager_id"/>
<field name="parent_id"/>
<field name="user_id"/>
diff --git a/addons/account/project/wizard/account_analytic_balance_report.py b/addons/account/project/wizard/account_analytic_balance_report.py
index 81d6c192962..02b2eb6e95d 100644
--- a/addons/account/project/wizard/account_analytic_balance_report.py
+++ b/addons/account/project/wizard/account_analytic_balance_report.py
@@ -52,7 +52,6 @@ class account_analytic_balance(osv.osv_memory):
'datas': datas,
}
-account_analytic_balance()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/project/wizard/account_analytic_chart.py b/addons/account/project/wizard/account_analytic_chart.py
index 01c606d5f08..4a26eec7c95 100644
--- a/addons/account/project/wizard/account_analytic_chart.py
+++ b/addons/account/project/wizard/account_analytic_chart.py
@@ -46,5 +46,4 @@ class account_analytic_chart(osv.osv_memory):
result['context'] = str(result_context)
return result
-account_analytic_chart()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py b/addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py
index fdb8eafb402..814cbb8cacc 100644
--- a/addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py
+++ b/addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py
@@ -52,5 +52,4 @@ class account_analytic_cost_ledger_journal_report(osv.osv_memory):
'datas': datas,
}
-account_analytic_cost_ledger_journal_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/project/wizard/account_analytic_cost_ledger_report.py b/addons/account/project/wizard/account_analytic_cost_ledger_report.py
index 1c74c61e31f..ffd56352382 100644
--- a/addons/account/project/wizard/account_analytic_cost_ledger_report.py
+++ b/addons/account/project/wizard/account_analytic_cost_ledger_report.py
@@ -52,5 +52,4 @@ class account_analytic_cost_ledger(osv.osv_memory):
'datas': datas,
}
-account_analytic_cost_ledger()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/project/wizard/account_analytic_inverted_balance_report.py b/addons/account/project/wizard/account_analytic_inverted_balance_report.py
index 10f97baf755..9e54f4f848d 100644
--- a/addons/account/project/wizard/account_analytic_inverted_balance_report.py
+++ b/addons/account/project/wizard/account_analytic_inverted_balance_report.py
@@ -51,5 +51,4 @@ class account_analytic_inverted_balance(osv.osv_memory):
'datas': datas,
}
-account_analytic_inverted_balance()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/project/wizard/account_analytic_journal_report.py b/addons/account/project/wizard/account_analytic_journal_report.py
index e70649cd406..61fe2cd318a 100644
--- a/addons/account/project/wizard/account_analytic_journal_report.py
+++ b/addons/account/project/wizard/account_analytic_journal_report.py
@@ -71,5 +71,4 @@ class account_analytic_journal_report(osv.osv_memory):
res.update({'analytic_account_journal_id': journal_ids})
return res
-account_analytic_journal_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/project/wizard/project_account_analytic_line.py b/addons/account/project/wizard/project_account_analytic_line.py
index c5a496527c1..40777f73e7d 100644
--- a/addons/account/project/wizard/project_account_analytic_line.py
+++ b/addons/account/project/wizard/project_account_analytic_line.py
@@ -53,6 +53,5 @@ class project_account_analytic_line(osv.osv_memory):
'search_view_id': id['res_id'],
}
-project_account_analytic_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/report/account_analytic_entries_report.py b/addons/account/report/account_analytic_entries_report.py
index dad0dedc9fc..f7d1177e3b0 100644
--- a/addons/account/report/account_analytic_entries_report.py
+++ b/addons/account/report/account_analytic_entries_report.py
@@ -81,6 +81,5 @@ class analytic_entries_report(osv.osv):
a.move_id,a.product_id,a.product_uom_id
)
""")
-analytic_entries_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/report/account_entries_report.py b/addons/account/report/account_entries_report.py
index d53e6153981..6060d97c182 100644
--- a/addons/account/report/account_entries_report.py
+++ b/addons/account/report/account_entries_report.py
@@ -81,7 +81,7 @@ class account_entries_report(osv.osv):
period_obj = self.pool.get('account.period')
for arg in args:
if arg[0] == 'period_id' and arg[2] == 'current_period':
- current_period = period_obj.find(cr, uid)[0]
+ current_period = period_obj.find(cr, uid, context=context)[0]
args.append(['period_id','in',[current_period]])
break
elif arg[0] == 'period_id' and arg[2] == 'current_year':
@@ -100,7 +100,7 @@ class account_entries_report(osv.osv):
fiscalyear_obj = self.pool.get('account.fiscalyear')
period_obj = self.pool.get('account.period')
if context.get('period', False) == 'current_period':
- current_period = period_obj.find(cr, uid)[0]
+ current_period = period_obj.find(cr, uid, context=context)[0]
domain.append(['period_id','in',[current_period]])
elif context.get('year', False) == 'current_year':
current_year = fiscalyear_obj.find(cr, uid)
@@ -152,6 +152,5 @@ class account_entries_report(osv.osv):
where l.state != 'draft'
)
""")
-account_entries_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/report/account_invoice_report.py b/addons/account/report/account_invoice_report.py
index af6ae1eede7..799b9b1c9fb 100644
--- a/addons/account/report/account_invoice_report.py
+++ b/addons/account/report/account_invoice_report.py
@@ -70,6 +70,7 @@ class account_invoice_report(osv.osv):
'categ_id': fields.many2one('product.category','Category of Product', readonly=True),
'journal_id': fields.many2one('account.journal', 'Journal', readonly=True),
'partner_id': fields.many2one('res.partner', 'Partner', readonly=True),
+ 'commercial_partner_id': fields.many2one('res.partner', 'Partner Company', help="Commercial Entity"),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
'user_id': fields.many2one('res.users', 'Salesperson', readonly=True),
'price_total': fields.float('Total Without Tax', readonly=True),
@@ -108,7 +109,7 @@ class account_invoice_report(osv.osv):
sub.fiscal_position, sub.user_id, sub.company_id, sub.nbr, sub.type, sub.state,
sub.categ_id, sub.date_due, sub.account_id, sub.account_line_id, sub.partner_bank_id,
sub.product_qty, sub.price_total / cr.rate as price_total, sub.price_average /cr.rate as price_average,
- cr.rate as currency_rate, sub.residual / cr.rate as residual
+ cr.rate as currency_rate, sub.residual / cr.rate as residual, sub.commercial_partner_id as commercial_partner_id
"""
return select_str
@@ -170,7 +171,8 @@ class account_invoice_report(osv.osv):
LEFT JOIN account_invoice a ON a.id = l.invoice_id
WHERE a.id = ai.id)
ELSE 1::bigint
- END::numeric AS residual
+ END::numeric AS residual,
+ ai.commercial_partner_id as commercial_partner_id
"""
return select_str
@@ -193,7 +195,7 @@ class account_invoice_report(osv.osv):
ai.partner_id, ai.payment_term, ai.period_id, u.name, ai.currency_id, ai.journal_id,
ai.fiscal_position, ai.user_id, ai.company_id, ai.type, ai.state, pt.categ_id,
ai.date_due, ai.account_id, ail.account_id, ai.partner_bank_id, ai.residual,
- ai.amount_total, u.uom_type, u.category_id
+ ai.amount_total, u.uom_type, u.category_id, ai.commercial_partner_id
"""
return group_by_str
@@ -210,13 +212,12 @@ class account_invoice_report(osv.osv):
cr.id IN (SELECT id
FROM res_currency_rate cr2
WHERE (cr2.currency_id = sub.currency_id)
- AND ((sub.date IS NOT NULL AND cr.name <= sub.date)
- OR (sub.date IS NULL AND cr.name <= NOW()))
+ AND ((sub.date IS NOT NULL AND cr2.name <= sub.date)
+ OR (sub.date IS NULL AND cr2.name <= NOW()))
ORDER BY name DESC LIMIT 1)
)""" % (
self._table,
self._select(), self._sub_select(), self._from(), self._group_by()))
-account_invoice_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml
index dad70f695dc..96dc948b09a 100644
--- a/addons/account/report/account_invoice_report_view.xml
+++ b/addons/account/report/account_invoice_report_view.xml
@@ -14,6 +14,7 @@
<field name="type" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="partner_id" invisible="1"/>
+ <field name="commercial_partner_id" invisible="1"/>
<field name="product_id" invisible="1"/>
<field name="uom_name" invisible="not context.get('set_visible',False)"/>
<field name="categ_id" invisible="1"/>
@@ -65,7 +66,8 @@
<field name="user_id" />
<field name="categ_id" filter_domain="[('categ_id', 'child_of', self)]"/>
<group expand="1" string="Group By...">
- <filter string="Partner" name="partner" icon="terp-partner" context="{'group_by':'partner_id','residual_visible':True}"/>
+ <filter string="Partner" name="partner_id" context="{'group_by':'partner_id','residual_visible':True}"/>
+ <filter string="Commercial Partner" name="commercial_partner_id" context="{'group_by':'commercial_partner_id','residual_visible':True}"/>
<filter string="Salesperson" name='user' icon="terp-personal" context="{'group_by':'user_id'}"/>
<filter string="Due Date" icon="terp-go-today" context="{'group_by':'date_due'}"/>
<filter string="Period" icon="terp-go-month" context="{'group_by':'period_id'}" name="period"/>
diff --git a/addons/account/report/account_print_invoice.rml b/addons/account/report/account_print_invoice.rml
index 4ffa7a33f9d..9268c94d4c7 100644
--- a/addons/account/report/account_print_invoice.rml
+++ b/addons/account/report/account_print_invoice.rml
@@ -168,7 +168,7 @@
</para>
<para style="terp_default_8">Tel. : [[ (o.partner_id.phone) or removeParentNode('para') ]]</para>
<para style="terp_default_8">Fax : [[ (o.partner_id.fax) or removeParentNode('para') ]]</para>
- <para style="terp_default_8">VAT : [[ (o.partner_id.vat) or removeParentNode('para') ]]</para>
+ <para style="terp_default_8">TIN : [[ (o.partner_id.vat) or removeParentNode('para') ]]</para>
</td>
</tr>
</blockTable>
diff --git a/addons/account/report/account_print_overdue.py b/addons/account/report/account_print_overdue.py
index d030c136964..e135f41309d 100644
--- a/addons/account/report/account_print_overdue.py
+++ b/addons/account/report/account_print_overdue.py
@@ -61,9 +61,6 @@ class Overdue(report_sxw.rml_parse):
message = company_pool.browse(self.cr, self.uid, company.id, {'lang':obj.lang}).overdue_msg
return message.split('\n')
-report_sxw.report_sxw('report.account.overdue', 'res.partner',
- 'addons/account/report/account_print_overdue.rml', parser=Overdue)
-
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/report/account_report.py b/addons/account/report/account_report.py
index 11a6374b24e..60b994dad07 100644
--- a/addons/account/report/account_report.py
+++ b/addons/account/report/account_report.py
@@ -66,7 +66,6 @@ class report_account_receivable(osv.osv):
group by
to_char(date,'YYYY:IW'), a.type
)""")
-report_account_receivable()
#a.type in ('receivable','payable')
class temp_range(osv.osv):
@@ -77,7 +76,6 @@ class temp_range(osv.osv):
'name': fields.char('Range',size=64)
}
-temp_range()
class report_aged_receivable(osv.osv):
_name = "report.aged.receivable"
@@ -147,7 +145,6 @@ class report_aged_receivable(osv.osv):
select id,name from temp_range
)""")
-report_aged_receivable()
class report_invoice_created(osv.osv):
_name = "report.invoice.created"
@@ -200,7 +197,6 @@ class report_invoice_created(osv.osv):
AND
(to_date(to_char(inv.create_date, 'YYYY-MM-dd'),'YYYY-MM-dd') > (CURRENT_DATE-15))
)""")
-report_invoice_created()
class report_account_type_sales(osv.osv):
_name = "report.account_type.sales"
@@ -241,7 +237,6 @@ class report_account_type_sales(osv.osv):
group by
to_char(inv.date_invoice, 'YYYY'),to_char(inv.date_invoice,'MM'),inv.currency_id, inv.period_id, inv_line.product_id, account.user_type
)""")
-report_account_type_sales()
class report_account_sales(osv.osv):
@@ -283,6 +278,5 @@ class report_account_sales(osv.osv):
group by
to_char(inv.date_invoice, 'YYYY'),to_char(inv.date_invoice,'MM'),inv.currency_id, inv.period_id, inv_line.product_id, account.id
)""")
-report_account_sales()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/report/account_treasury_report.py b/addons/account/report/account_treasury_report.py
index 1ee411708c7..f7785d0827b 100644
--- a/addons/account/report/account_treasury_report.py
+++ b/addons/account/report/account_treasury_report.py
@@ -78,6 +78,5 @@ class account_treasury_report(osv.osv):
group by p.id, p.fiscalyear_id, p.date_start, am.company_id
)
""")
-account_treasury_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/res_currency.py b/addons/account/res_currency.py
index 9564b4e57c6..a7d3e5bc345 100644
--- a/addons/account/res_currency.py
+++ b/addons/account/res_currency.py
@@ -43,6 +43,5 @@ class res_currency_account(osv.osv):
rate = float(tot2)/float(tot1)
return rate
-res_currency_account()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/static/src/js/account_move_reconciliation.js b/addons/account/static/src/js/account_move_reconciliation.js
index dbbfe3cc069..cbc0abc4f4d 100644
--- a/addons/account/static/src/js/account_move_reconciliation.js
+++ b/addons/account/static/src/js/account_move_reconciliation.js
@@ -26,7 +26,7 @@ openerp.account = function (instance) {
if (this.partners) {
this.$el.prepend(QWeb.render("AccountReconciliation", {widget: this}));
this.$(".oe_account_recon_previous").click(function() {
- self.current_partner = (self.current_partner - 1) % self.partners.length;
+ self.current_partner = (((self.current_partner - 1) % self.partners.length) + self.partners.length) % self.partners.length;
self.search_by_partner();
});
this.$(".oe_account_recon_next").click(function() {
diff --git a/addons/account/test/account_report.yml b/addons/account/test/account_report.yml
index 0064a1d2556..7a2d09486e4 100644
--- a/addons/account/test/account_report.yml
+++ b/addons/account/test/account_report.yml
@@ -14,8 +14,9 @@
-
!python {model: account.invoice}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.account.invoice').create(cr, uid, [ref('account.account_invoice_customer0')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('account.account_invoice_customer0')], 'account.invoice', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'account-invoice.'+format), 'wb+').write(data)
@@ -24,8 +25,9 @@
-
!python {model: res.partner}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.account.overdue').create(cr, uid, [ref('base.res_partner_1'),ref('base.res_partner_2'),ref('base.res_partner_12')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('base.res_partner_1'),ref('base.res_partner_2'),ref('base.res_partner_12')], 'account.overdue', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'account-report_overdue.'+format), 'wb+').write(data)
-
diff --git a/addons/account/wizard/account_automatic_reconcile.py b/addons/account/wizard/account_automatic_reconcile.py
index 88d31b5b6c5..f6f0c90b1e2 100644
--- a/addons/account/wizard/account_automatic_reconcile.py
+++ b/addons/account/wizard/account_automatic_reconcile.py
@@ -246,6 +246,5 @@ class account_automatic_reconcile(osv.osv_memory):
'context': context,
}
-account_automatic_reconcile()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_change_currency.py b/addons/account/wizard/account_change_currency.py
index 73fd52b3fcb..c3726ece676 100644
--- a/addons/account/wizard/account_change_currency.py
+++ b/addons/account/wizard/account_change_currency.py
@@ -73,6 +73,5 @@ class account_change_currency(osv.osv_memory):
obj_inv.write(cr, uid, [invoice.id], {'currency_id': new_currency}, context=context)
return {'type': 'ir.actions.act_window_close'}
-account_change_currency()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_chart.py b/addons/account/wizard/account_chart.py
index 32b83a0a670..38df2f7484d 100644
--- a/addons/account/wizard/account_chart.py
+++ b/addons/account/wizard/account_chart.py
@@ -105,6 +105,5 @@ class account_chart(osv.osv_memory):
'fiscalyear': _get_fiscalyear,
}
-account_chart()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_financial_report.py b/addons/account/wizard/account_financial_report.py
index dde07eb7034..2ce7118335a 100644
--- a/addons/account/wizard/account_financial_report.py
+++ b/addons/account/wizard/account_financial_report.py
@@ -93,6 +93,5 @@ class accounting_report(osv.osv_memory):
'datas': data,
}
-accounting_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_fiscalyear_close.py b/addons/account/wizard/account_fiscalyear_close.py
index d4f7b3e6654..6ceb833816b 100644
--- a/addons/account/wizard/account_fiscalyear_close.py
+++ b/addons/account/wizard/account_fiscalyear_close.py
@@ -278,6 +278,5 @@ class account_fiscalyear_close(osv.osv_memory):
return {'type': 'ir.actions.act_window_close'}
-account_fiscalyear_close()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_fiscalyear_close_state.py b/addons/account/wizard/account_fiscalyear_close_state.py
index 746f1c47976..ed84ab65184 100644
--- a/addons/account/wizard/account_fiscalyear_close_state.py
+++ b/addons/account/wizard/account_fiscalyear_close_state.py
@@ -56,6 +56,5 @@ class account_fiscalyear_close_state(osv.osv_memory):
return {'type': 'ir.actions.act_window_close'}
-account_fiscalyear_close_state()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_invoice_refund.py b/addons/account/wizard/account_invoice_refund.py
index df4ad3494d2..5be9ebc5c80 100644
--- a/addons/account/wizard/account_invoice_refund.py
+++ b/addons/account/wizard/account_invoice_refund.py
@@ -181,9 +181,9 @@ class account_invoice_refund(osv.osv_memory):
invoice = invoice[0]
del invoice['id']
invoice_lines = inv_line_obj.browse(cr, uid, invoice['invoice_line'], context=context)
- invoice_lines = inv_obj._refund_cleanup_lines(cr, uid, invoice_lines)
+ invoice_lines = inv_obj._refund_cleanup_lines(cr, uid, invoice_lines, context=context)
tax_lines = inv_tax_obj.browse(cr, uid, invoice['tax_line'], context=context)
- tax_lines = inv_obj._refund_cleanup_lines(cr, uid, tax_lines)
+ tax_lines = inv_obj._refund_cleanup_lines(cr, uid, tax_lines, context=context)
invoice.update({
'type': inv.type,
'date_invoice': date,
@@ -220,6 +220,5 @@ class account_invoice_refund(osv.osv_memory):
return self.compute_refund(cr, uid, ids, data_refund, context=context)
-account_invoice_refund()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_invoice_state.py b/addons/account/wizard/account_invoice_state.py
index 70d2984cef0..1aed2c6c477 100644
--- a/addons/account/wizard/account_invoice_state.py
+++ b/addons/account/wizard/account_invoice_state.py
@@ -42,7 +42,6 @@ class account_invoice_confirm(osv.osv_memory):
return {'type': 'ir.actions.act_window_close'}
-account_invoice_confirm()
class account_invoice_cancel(osv.osv_memory):
"""
@@ -64,6 +63,5 @@ class account_invoice_cancel(osv.osv_memory):
account_invoice_obj.signal_invoice_cancel(cr , uid, [record['id']])
return {'type': 'ir.actions.act_window_close'}
-account_invoice_cancel()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_journal_select.py b/addons/account/wizard/account_journal_select.py
index 7edd7923f4c..a4a1d4a6a9f 100644
--- a/addons/account/wizard/account_journal_select.py
+++ b/addons/account/wizard/account_journal_select.py
@@ -45,6 +45,5 @@ class account_journal_select(osv.osv_memory):
result['context'] = str({'journal_id': journal_id, 'period_id': period_id})
return result
-account_journal_select()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_move_bank_reconcile.py b/addons/account/wizard/account_move_bank_reconcile.py
index 283068ae693..0fb4633163b 100644
--- a/addons/account/wizard/account_move_bank_reconcile.py
+++ b/addons/account/wizard/account_move_bank_reconcile.py
@@ -59,6 +59,5 @@ the bank account\nin the journal definition for reconciliation.'))
'type': 'ir.actions.act_window'
}
-account_move_bank_reconcile()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_move_line_reconcile_select.py b/addons/account/wizard/account_move_line_reconcile_select.py
index 76af8538e05..658a6c5d503 100644
--- a/addons/account/wizard/account_move_line_reconcile_select.py
+++ b/addons/account/wizard/account_move_line_reconcile_select.py
@@ -50,6 +50,5 @@ class account_move_line_reconcile_select(osv.osv_memory):
'type': 'ir.actions.act_window'
}
-account_move_line_reconcile_select()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_move_line_select.py b/addons/account/wizard/account_move_line_select.py
index b56621f2114..630db9fd1d6 100644
--- a/addons/account/wizard/account_move_line_select.py
+++ b/addons/account/wizard/account_move_line_select.py
@@ -67,6 +67,5 @@ class account_move_line_select(osv.osv_memory):
result['domain']=result['domain'][0:-1]+','+domain+result['domain'][-1]
return result
-account_move_line_select()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_move_line_unreconcile_select.py b/addons/account/wizard/account_move_line_unreconcile_select.py
index f9009fc8199..31fbeddeea8 100644
--- a/addons/account/wizard/account_move_line_unreconcile_select.py
+++ b/addons/account/wizard/account_move_line_unreconcile_select.py
@@ -39,6 +39,5 @@ class account_move_line_unreconcile_select(osv.osv_memory):
'type': 'ir.actions.act_window'
}
-account_move_line_unreconcile_select()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_open_closed_fiscalyear.py b/addons/account/wizard/account_open_closed_fiscalyear.py
index 3b5d956d381..f4e90ae9f2f 100644
--- a/addons/account/wizard/account_open_closed_fiscalyear.py
+++ b/addons/account/wizard/account_open_closed_fiscalyear.py
@@ -43,6 +43,5 @@ class account_open_closed_fiscalyear(osv.osv_memory):
cr.execute('delete from account_move where id IN %s', (tuple(ids_move),))
return {'type': 'ir.actions.act_window_close'}
-account_open_closed_fiscalyear()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_period_close.py b/addons/account/wizard/account_period_close.py
index fad757c0ff9..a50861c65ef 100644
--- a/addons/account/wizard/account_period_close.py
+++ b/addons/account/wizard/account_period_close.py
@@ -55,6 +55,5 @@ class account_period_close(osv.osv_memory):
return {'type': 'ir.actions.act_window_close'}
-account_period_close()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_reconcile.py b/addons/account/wizard/account_reconcile.py
index 81609249fd7..0d5a3525af4 100644
--- a/addons/account/wizard/account_reconcile.py
+++ b/addons/account/wizard/account_reconcile.py
@@ -91,7 +91,6 @@ class account_move_line_reconcile(osv.osv_memory):
period_id, journal_id, context=context)
return {'type': 'ir.actions.act_window_close'}
-account_move_line_reconcile()
class account_move_line_reconcile_writeoff(osv.osv_memory):
"""
@@ -149,7 +148,6 @@ class account_move_line_reconcile_writeoff(osv.osv_memory):
context['analytic_id'] = data['analytic_id'][0]
if context['date_p']:
date = context['date_p']
-
ids = period_obj.find(cr, uid, dt=date, context=context)
if ids:
period_id = ids[0]
@@ -158,6 +156,5 @@ class account_move_line_reconcile_writeoff(osv.osv_memory):
period_id, journal_id, context=context)
return {'type': 'ir.actions.act_window_close'}
-account_move_line_reconcile_writeoff()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_reconcile_partner_process.py b/addons/account/wizard/account_reconcile_partner_process.py
index 1c317111888..bcbdb3fb5db 100644
--- a/addons/account/wizard/account_reconcile_partner_process.py
+++ b/addons/account/wizard/account_reconcile_partner_process.py
@@ -98,6 +98,5 @@ class account_partner_reconcile_process(osv.osv_memory):
'next_partner_id': _get_partner,
}
-account_partner_reconcile_process()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_report_account_balance.py b/addons/account/wizard/account_report_account_balance.py
index e883a59c102..fd3c966e306 100644
--- a/addons/account/wizard/account_report_account_balance.py
+++ b/addons/account/wizard/account_report_account_balance.py
@@ -38,6 +38,5 @@ class account_balance_report(osv.osv_memory):
data = self.pre_print_report(cr, uid, ids, data, context=context)
return {'type': 'ir.actions.report.xml', 'report_name': 'account.account.balance', 'datas': data}
-account_balance_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_report_aged_partner_balance.py b/addons/account/wizard/account_report_aged_partner_balance.py
index 1054e7fa285..c483487b78f 100644
--- a/addons/account/wizard/account_report_aged_partner_balance.py
+++ b/addons/account/wizard/account_report_aged_partner_balance.py
@@ -86,6 +86,5 @@ class account_aged_trial_balance(osv.osv_memory):
'datas': data
}
-account_aged_trial_balance()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_report_central_journal.py b/addons/account/wizard/account_report_central_journal.py
index da8be6d4735..a6bc111fa35 100644
--- a/addons/account/wizard/account_report_central_journal.py
+++ b/addons/account/wizard/account_report_central_journal.py
@@ -38,7 +38,6 @@ class account_central_journal(osv.osv_memory):
'datas': data,
}
-account_central_journal()
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_report_common.py b/addons/account/wizard/account_report_common.py
index 52a35327845..c457140684a 100644
--- a/addons/account/wizard/account_report_common.py
+++ b/addons/account/wizard/account_report_common.py
@@ -178,6 +178,5 @@ class account_common_report(osv.osv_memory):
data['form']['used_context'] = used_context
return self._print_report(cr, uid, ids, data, context=context)
-account_common_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_report_common_account.py b/addons/account/wizard/account_report_common_account.py
index 7cedf427386..13b83c32958 100644
--- a/addons/account/wizard/account_report_common_account.py
+++ b/addons/account/wizard/account_report_common_account.py
@@ -41,7 +41,6 @@ class account_common_account_report(osv.osv_memory):
data['form'].update(self.read(cr, uid, ids, ['display_account'], context=context)[0])
return data
-account_common_account_report()
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_report_common_journal.py b/addons/account/wizard/account_report_common_journal.py
index 609c2840ca6..a03315ecf7c 100644
--- a/addons/account/wizard/account_report_common_journal.py
+++ b/addons/account/wizard/account_report_common_journal.py
@@ -50,6 +50,5 @@ class account_common_journal_report(osv.osv_memory):
data['form']['active_ids'] = self.pool.get('account.journal.period').search(cr, uid, [('journal_id', 'in', data['form']['journal_ids']), ('period_id', 'in', period_list)], context=context)
return data
-account_common_journal_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_report_common_partner.py b/addons/account/wizard/account_report_common_partner.py
index 9779005b0de..d50a54ef32c 100644
--- a/addons/account/wizard/account_report_common_partner.py
+++ b/addons/account/wizard/account_report_common_partner.py
@@ -42,7 +42,6 @@ class account_common_partner_report(osv.osv_memory):
data['form'].update(self.read(cr, uid, ids, ['result_selection'], context=context)[0])
return data
-account_common_partner_report()
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_report_general_journal.py b/addons/account/wizard/account_report_general_journal.py
index 4a170a84db1..e5e516b1f38 100644
--- a/addons/account/wizard/account_report_general_journal.py
+++ b/addons/account/wizard/account_report_general_journal.py
@@ -34,7 +34,6 @@ class account_general_journal(osv.osv_memory):
data = self.pre_print_report(cr, uid, ids, data, context=context)
return {'type': 'ir.actions.report.xml', 'report_name': 'account.general.journal', 'datas': data}
-account_general_journal()
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_report_general_ledger.py b/addons/account/wizard/account_report_general_ledger.py
index a10ff624fee..fae60df63fb 100644
--- a/addons/account/wizard/account_report_general_ledger.py
+++ b/addons/account/wizard/account_report_general_ledger.py
@@ -58,6 +58,5 @@ class account_report_general_ledger(osv.osv_memory):
return { 'type': 'ir.actions.report.xml', 'report_name': 'account.general.ledger_landscape', 'datas': data}
return { 'type': 'ir.actions.report.xml', 'report_name': 'account.general.ledger', 'datas': data}
-account_report_general_ledger()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_report_partner_balance.py b/addons/account/wizard/account_report_partner_balance.py
index 33a7a42072c..fbe18f27d69 100644
--- a/addons/account/wizard/account_report_partner_balance.py
+++ b/addons/account/wizard/account_report_partner_balance.py
@@ -50,6 +50,5 @@ class account_partner_balance(osv.osv_memory):
'datas': data,
}
-account_partner_balance()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_report_partner_ledger.py b/addons/account/wizard/account_report_partner_ledger.py
index d1e6dd9809e..fdabe49ff17 100644
--- a/addons/account/wizard/account_report_partner_ledger.py
+++ b/addons/account/wizard/account_report_partner_ledger.py
@@ -67,6 +67,5 @@ class account_partner_ledger(osv.osv_memory):
'datas': data,
}
-account_partner_ledger()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_report_print_journal.py b/addons/account/wizard/account_report_print_journal.py
index b91fe04660a..3ad45268248 100644
--- a/addons/account/wizard/account_report_print_journal.py
+++ b/addons/account/wizard/account_report_print_journal.py
@@ -72,7 +72,6 @@ class account_print_journal(osv.osv_memory):
report_name = 'account.journal.period.print'
return {'type': 'ir.actions.report.xml', 'report_name': report_name, 'datas': data}
-account_print_journal()
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_state_open.py b/addons/account/wizard/account_state_open.py
index 5d0ae6b66bd..1950a139983 100644
--- a/addons/account/wizard/account_state_open.py
+++ b/addons/account/wizard/account_state_open.py
@@ -20,7 +20,6 @@
##############################################################################
from openerp.osv import osv
-from openerp import netsvc
from openerp.tools.translate import _
class account_state_open(osv.osv_memory):
@@ -38,6 +37,5 @@ class account_state_open(osv.osv_memory):
obj_invoice.signal_open_test(cr, uid, context['active_ids'][0])
return {'type': 'ir.actions.act_window_close'}
-account_state_open()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_subscription_generate.py b/addons/account/wizard/account_subscription_generate.py
index f5babc4fd87..a61f3eee252 100644
--- a/addons/account/wizard/account_subscription_generate.py
+++ b/addons/account/wizard/account_subscription_generate.py
@@ -48,6 +48,5 @@ class account_subscription_generate(osv.osv_memory):
result['domain'] = str([('id','in',moves_created)])
return result
-account_subscription_generate()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_tax_chart.py b/addons/account/wizard/account_tax_chart.py
index 84859e2077c..3283d2ba6d1 100644
--- a/addons/account/wizard/account_tax_chart.py
+++ b/addons/account/wizard/account_tax_chart.py
@@ -38,7 +38,7 @@ class account_tax_chart(osv.osv_memory):
def _get_period(self, cr, uid, context=None):
"""Return default period value"""
- period_ids = self.pool.get('account.period').find(cr, uid)
+ period_ids = self.pool.get('account.period').find(cr, uid, context=context)
return period_ids and period_ids[0] or False
def account_tax_chart_open_window(self, cr, uid, ids, context=None):
@@ -73,6 +73,5 @@ class account_tax_chart(osv.osv_memory):
'target_move': 'posted'
}
-account_tax_chart()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_unreconcile.py b/addons/account/wizard/account_unreconcile.py
index ff592a329c7..425e549fec2 100644
--- a/addons/account/wizard/account_unreconcile.py
+++ b/addons/account/wizard/account_unreconcile.py
@@ -33,7 +33,6 @@ class account_unreconcile(osv.osv_memory):
obj_move_line._remove_move_reconcile(cr, uid, context['active_ids'], context=context)
return {'type': 'ir.actions.act_window_close'}
-account_unreconcile()
class account_unreconcile_reconcile(osv.osv_memory):
_name = "account.unreconcile.reconcile"
@@ -48,6 +47,5 @@ class account_unreconcile_reconcile(osv.osv_memory):
obj_move_reconcile.unlink(cr, uid, rec_ids, context=context)
return {'type': 'ir.actions.act_window_close'}
-account_unreconcile_reconcile()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_use_model.py b/addons/account/wizard/account_use_model.py
index 795284c8fef..06f02719065 100644
--- a/addons/account/wizard/account_use_model.py
+++ b/addons/account/wizard/account_use_model.py
@@ -71,6 +71,5 @@ class account_use_model(osv.osv_memory):
'type': 'ir.actions.act_window',
}
-account_use_model()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_validate_account_move.py b/addons/account/wizard/account_validate_account_move.py
index faf7f8e2ccd..324248284f1 100644
--- a/addons/account/wizard/account_validate_account_move.py
+++ b/addons/account/wizard/account_validate_account_move.py
@@ -40,7 +40,6 @@ class validate_account_move(osv.osv_memory):
obj_move.button_validate(cr, uid, ids_move, context=context)
return {'type': 'ir.actions.act_window_close'}
-validate_account_move()
class validate_account_move_lines(osv.osv_memory):
_name = "validate.account.move.lines"
@@ -61,7 +60,6 @@ class validate_account_move_lines(osv.osv_memory):
raise osv.except_osv(_('Warning!'), _('Selected Entry Lines does not have any account move enties in draft state.'))
obj_move.button_validate(cr, uid, move_ids, context)
return {'type': 'ir.actions.act_window_close'}
-validate_account_move_lines()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_vat.py b/addons/account/wizard/account_vat.py
index a60a7906e28..37bf4b029a6 100644
--- a/addons/account/wizard/account_vat.py
+++ b/addons/account/wizard/account_vat.py
@@ -59,6 +59,5 @@ class account_vat_declaration(osv.osv_memory):
'datas': datas,
}
-account_vat_declaration()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/pos_box.py b/addons/account/wizard/pos_box.py
index 49178dfd3ea..874a8e3b7c9 100644
--- a/addons/account/wizard/pos_box.py
+++ b/addons/account/wizard/pos_box.py
@@ -21,7 +21,7 @@ class CashBox(osv.osv_memory):
active_model = context.get('active_model', False) or False
active_ids = context.get('active_ids', []) or []
- records = self.pool.get(active_model).browse(cr, uid, active_ids, context=context)
+ records = self.pool[active_model].browse(cr, uid, active_ids, context=context)
return self._run(cr, uid, ids, records, context=None)
@@ -63,11 +63,12 @@ class CashBoxIn(CashBox):
'name' : box.name,
}
-CashBoxIn()
class CashBoxOut(CashBox):
_name = 'cash.box.out'
+ _columns = CashBox._columns.copy()
+
def _compute_values_for_statement_line(self, cr, uid, box, record, context=None):
amount = box.amount or 0.0
return {
@@ -78,4 +79,3 @@ class CashBoxOut(CashBox):
'name' : box.name,
}
-CashBoxOut()
diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/account_analytic_analysis/account_analytic_analysis.py
index 0a56c80766b..33ab3be209c 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis.py
+++ b/addons/account_analytic_analysis/account_analytic_analysis.py
@@ -352,11 +352,10 @@ class account_analytic_account(osv.osv):
res[account.id] = 0.0
sale_ids = sale_obj.search(cr, uid, [('project_id','=', account.id), ('state', '=', 'manual')], context=context)
for sale in sale_obj.browse(cr, uid, sale_ids, context=context):
- if not sale.invoiced:
- res[account.id] += sale.amount_untaxed
- for invoice in sale.invoice_ids:
- if invoice.state not in ('draft', 'cancel'):
- res[account.id] -= invoice.amount_untaxed
+ res[account.id] += sale.amount_untaxed
+ for invoice in sale.invoice_ids:
+ if invoice.state != 'cancel':
+ res[account.id] -= invoice.amount_untaxed
return res
def _timesheet_ca_invoiced_calc(self, cr, uid, ids, name, arg, context=None):
diff --git a/addons/account_analytic_analysis/account_analytic_analysis_view.xml b/addons/account_analytic_analysis/account_analytic_analysis_view.xml
index 6f670b2c6b9..d31746e7e70 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis_view.xml
+++ b/addons/account_analytic_analysis/account_analytic_analysis_view.xml
@@ -213,7 +213,7 @@
<search string="Contracts">
<field name="name" filter_domain="['|', ('name','ilike',self),('code','ilike',self)]" string="Contract"/>
<field name="date"/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="manager_id"/>
<field name="parent_id"/>
<filter name="open" string="In Progress" domain="[('state','in',('open','draft'))]" help="Contracts in progress (open, draft)"/>
@@ -267,7 +267,7 @@
</field>
</record>
<menuitem id="base.menu_sales" name="Sales" parent="base.menu_base_partner" sequence="1"/>
- <menuitem action="action_account_analytic_overdue_all" id="menu_action_account_analytic_overdue_all" sequence="7" parent="base.menu_sales"/>
+ <menuitem action="action_account_analytic_overdue_all" id="menu_action_account_analytic_overdue_all" sequence="8" parent="base.menu_sales"/>
<!-- Action Sales/Invoicing/Time and Material to Invoice -->
<record id="action_hr_tree_invoiced_all" model="ir.actions.act_window">
diff --git a/addons/account_analytic_default/account_analytic_default.py b/addons/account_analytic_default/account_analytic_default.py
index 9d7df0aa010..1696874f0f5 100644
--- a/addons/account_analytic_default/account_analytic_default.py
+++ b/addons/account_analytic_default/account_analytic_default.py
@@ -67,7 +67,6 @@ class account_analytic_default(osv.osv):
best_index = index
return res
-account_analytic_default()
class account_invoice_line(osv.osv):
_inherit = "account.invoice.line"
@@ -82,7 +81,6 @@ class account_invoice_line(osv.osv):
res_prod['value'].update({'account_analytic_id': False})
return res_prod
-account_invoice_line()
class stock_picking(osv.osv):
@@ -97,7 +95,6 @@ class stock_picking(osv.osv):
return super(stock_picking, self)._get_account_analytic_invoice(cursor, user, picking, move_line)
-stock_picking()
class sale_order_line(osv.osv):
_inherit = "sale.order.line"
@@ -118,6 +115,5 @@ class sale_order_line(osv.osv):
inv_line_obj.write(cr, uid, [line.id], {'account_analytic_id': rec.analytic_id.id}, context=context)
return create_ids
-sale_order_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_analytic_default/i18n/nl_BE.po b/addons/account_analytic_default/i18n/nl_BE.po
index 4d7b5295f16..86fed1b535a 100644
--- a/addons/account_analytic_default/i18n/nl_BE.po
+++ b/addons/account_analytic_default/i18n/nl_BE.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2012-11-27 13:19+0000\n"
+"PO-Revision-Date: 2013-04-15 15:56+0000\n"
"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:28+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
#. module: account_analytic_default
#: model:ir.actions.act_window,name:account_analytic_default.analytic_rule_action_partner
@@ -40,6 +40,9 @@ msgid ""
"default (e.g. create new customer invoice or Sales order if we select this "
"product, it will automatically take this as an analytic account)"
msgstr ""
+"Kies een product voor de analytische rekening in analytische "
+"standaardrekening (vb. maak een nieuwe verkoopfactuur of verkooporder: als "
+"we dit product kiezen, wordt de analytische rekening voorgesteld)."
#. module: account_analytic_default
#: model:ir.model,name:account_analytic_default.model_stock_picking
@@ -64,6 +67,9 @@ msgid ""
"default (e.g. create new customer invoice or Sales order if we select this "
"partner, it will automatically take this as an analytic account)"
msgstr ""
+"Kies een relatie voor de analytische rekening in analytische "
+"standaardrekening (vb. maak een nieuwe verkoopfactuur of verkooporder: als "
+"we deze relatie kiezen, wordt de analytische rekening voorgesteld)."
#. module: account_analytic_default
#: view:account.analytic.default:0
@@ -118,6 +124,9 @@ msgid ""
"default (e.g. create new customer invoice or Sales order if we select this "
"company, it will automatically take this as an analytic account)"
msgstr ""
+"Kies een firma voor de analytische rekening in analytische standaardrekening "
+"(vb. maak een nieuwe verkoopfactuur of verkooporder: als we deze firma "
+"kiezen, wordt de analytische rekening voorgesteld)."
#. module: account_analytic_default
#: view:account.analytic.default:0
diff --git a/addons/account_analytic_plans/account_analytic_plans.py b/addons/account_analytic_plans/account_analytic_plans.py
index 5834db99cd3..54b15ad565b 100644
--- a/addons/account_analytic_plans/account_analytic_plans.py
+++ b/addons/account_analytic_plans/account_analytic_plans.py
@@ -40,10 +40,10 @@ class one2many_mod2(fields.one2many):
plan = journal.plan_id
if plan and len(plan.plan_ids) > pnum:
acc_id = plan.plan_ids[pnum].root_analytic_id.id
- ids2 = obj.pool.get(self._obj).search(cr, user, [(self._fields_id,'in',ids),('analytic_account_id','child_of',[acc_id])], limit=self._limit)
+ ids2 = obj.pool[self._obj].search(cr, user, [(self._fields_id,'in',ids),('analytic_account_id','child_of',[acc_id])], limit=self._limit)
if ids2 is None:
- ids2 = obj.pool.get(self._obj).search(cr, user, [(self._fields_id,'in',ids)], limit=self._limit)
- for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'):
+ ids2 = obj.pool[self._obj].search(cr, user, [(self._fields_id,'in',ids)], limit=self._limit)
+ for r in obj.pool[self._obj]._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'):
res[r[self._fields_id]].append( r['id'] )
return res
@@ -65,7 +65,6 @@ class account_analytic_line(osv.osv):
'percentage': fields.float('Percentage')
}
-account_analytic_line()
class account_analytic_plan(osv.osv):
_name = "account.analytic.plan"
@@ -75,7 +74,6 @@ class account_analytic_plan(osv.osv):
'plan_ids': fields.one2many('account.analytic.plan.line', 'plan_id', 'Analytic Plans'),
}
-account_analytic_plan()
class account_analytic_plan_line(osv.osv):
_name = "account.analytic.plan.line"
@@ -94,7 +92,6 @@ class account_analytic_plan_line(osv.osv):
'max_required': 100.0,
}
-account_analytic_plan_line()
class account_analytic_plan_instance(osv.osv):
_name = "account.analytic.plan.instance"
@@ -257,7 +254,6 @@ class account_analytic_plan_instance(osv.osv):
vals['code'] = this.code and (str(this.code)+'*') or "*"
return super(account_analytic_plan_instance, self).write(cr, uid, ids, vals, context=context)
-account_analytic_plan_instance()
class account_analytic_plan_instance_line(osv.osv):
_name = "account.analytic.plan.instance.line"
@@ -280,7 +276,6 @@ class account_analytic_plan_instance_line(osv.osv):
res.append((record['id'], record['analytic_account_id']))
return res
-account_analytic_plan_instance_line()
class account_journal(osv.osv):
_inherit = "account.journal"
@@ -289,7 +284,6 @@ class account_journal(osv.osv):
'plan_id': fields.many2one('account.analytic.plan', 'Analytic Plans'),
}
-account_journal()
class account_invoice_line(osv.osv):
_inherit = "account.invoice.line"
@@ -315,7 +309,6 @@ class account_invoice_line(osv.osv):
res_prod['value'].update({'analytics_id': rec.analytics_id.id})
return res_prod
-account_invoice_line()
class account_move_line(osv.osv):
@@ -370,7 +363,6 @@ class account_move_line(osv.osv):
result = super(account_move_line, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
return result
-account_move_line()
class account_invoice(osv.osv):
_name = "account.invoice"
@@ -425,14 +417,12 @@ class account_invoice(osv.osv):
il['analytic_lines'].append((0, 0, al_vals))
return iml
-account_invoice()
class account_analytic_plan(osv.osv):
_inherit = "account.analytic.plan"
_columns = {
'default_instance_id': fields.many2one('account.analytic.plan.instance', 'Default Entries'),
}
-account_analytic_plan()
class analytic_default(osv.osv):
_inherit = "account.analytic.default"
@@ -440,7 +430,6 @@ class analytic_default(osv.osv):
'analytics_id': fields.many2one('account.analytic.plan.instance', 'Analytic Distribution'),
}
-analytic_default()
class sale_order_line(osv.osv):
_inherit = "sale.order.line"
@@ -459,7 +448,6 @@ class sale_order_line(osv.osv):
inv_line_obj.write(cr, uid, [line.id], {'analytics_id': rec.analytics_id.id}, context=context)
return create_ids
-sale_order_line()
class account_bank_statement(osv.osv):
@@ -488,7 +476,6 @@ class account_bank_statement(osv.osv):
continue
return True
-account_bank_statement()
class account_bank_statement_line(osv.osv):
@@ -497,6 +484,5 @@ class account_bank_statement_line(osv.osv):
_columns = {
'analytics_id': fields.many2one('account.analytic.plan.instance', 'Analytic Distribution'),
}
-account_bank_statement_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_analytic_plans/account_analytic_plans_view.xml b/addons/account_analytic_plans/account_analytic_plans_view.xml
index 3dcbcda6952..be46b9a6923 100644
--- a/addons/account_analytic_plans/account_analytic_plans_view.xml
+++ b/addons/account_analytic_plans/account_analytic_plans_view.xml
@@ -64,30 +64,6 @@
</field>
</record>
-<!-- Replace analytic_id with analytics_id in account.invoice.line -->
-
- <record model="ir.ui.view" id="view_invoice_line_form_inherit">
- <field name="name">account.invoice.line.form.inherit</field>
- <field name="model">account.invoice.line</field>
- <field name="inherit_id" ref="account.view_invoice_line_form"/>
- <field name="arch" type="xml">
- <field name="account_analytic_id" position="replace">
- <field name="analytics_id" context="{'journal_id':parent.journal_id}" domain="[('plan_id','&lt;&gt;',False)]" groups="analytic.group_analytic_accounting"/>
- </field>
- </field>
- </record>
-
- <record model="ir.ui.view" id="invoice_supplier_form_inherit">
- <field name="name">account.invoice.supplier.form.inherit</field>
- <field name="model">account.invoice</field>
- <field name="inherit_id" ref="account.invoice_supplier_form"/>
- <field name="priority">2</field>
- <field name="arch" type="xml">
- <field name="account_analytic_id" position="replace">
- <field name="analytics_id" domain="[('plan_id','&lt;&gt;',False)]" context="{'journal_id':parent.journal_id}" groups="analytic.group_analytic_accounting"/>
- </field>
- </field>
- </record>
<!-- views for account.analytic.plan.instance -->
<record model="ir.ui.view" id="account_analytic_plan_instance_form">
diff --git a/addons/account_analytic_plans/test/acount_analytic_plans_report.yml b/addons/account_analytic_plans/test/acount_analytic_plans_report.yml
index 7f891332aeb..6aa67a3052a 100644
--- a/addons/account_analytic_plans/test/acount_analytic_plans_report.yml
+++ b/addons/account_analytic_plans/test/acount_analytic_plans_report.yml
@@ -3,8 +3,9 @@
-
!python {model: account.analytic.account}: |
import os, time
- from openerp import netsvc, tools
+ import openerp.report
+ from openerp import tools
data_dict = {'model': 'account.analytic.account', 'form': {'date1':time.strftime("%Y-01-01"),'date2':time.strftime('%Y-%m-%d'),'journal_ids':[6,0,(ref('account.cose_journal_sale'))],'ref':ref('account.analytic_root'),'empty_line':True,'id':ref('account.analytic_root'),'context':{}}}
- (data, format) = netsvc.LocalService('report.account.analytic.account.crossovered.analytic').create(cr, uid, [ref('account.analytic_root')], data_dict, {})
+ data, format = openerp.report.render_report(cr, uid, [ref('account.analytic_root')], 'account.analytic.account.crossovered.analytic', data_dict, {})
if tools.config['test_report_directory']:
- file(os.path.join(tools.config['test_report_directory'], 'account_analytic_plans-crossovered_analyitic.'+format), 'wb+').write(data) \ No newline at end of file
+ file(os.path.join(tools.config['test_report_directory'], 'account_analytic_plans-crossovered_analyitic.'+format), 'wb+').write(data)
diff --git a/addons/account_analytic_plans/wizard/account_crossovered_analytic.py b/addons/account_analytic_plans/wizard/account_crossovered_analytic.py
index 640443c8a0b..d3581d6c457 100644
--- a/addons/account_analytic_plans/wizard/account_crossovered_analytic.py
+++ b/addons/account_analytic_plans/wizard/account_crossovered_analytic.py
@@ -71,6 +71,5 @@ class account_crossovered_analytic(osv.osv_memory):
'datas': datas,
}
-account_crossovered_analytic()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_analytic_plans/wizard/analytic_plan_create_model.py b/addons/account_analytic_plans/wizard/analytic_plan_create_model.py
index 7038a6f1025..3a206aa227e 100644
--- a/addons/account_analytic_plans/wizard/analytic_plan_create_model.py
+++ b/addons/account_analytic_plans/wizard/analytic_plan_create_model.py
@@ -55,6 +55,5 @@ class analytic_plan_create_model(osv.osv_memory):
else:
return {'type': 'ir.actions.act_window_close'}
-analytic_plan_create_model()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_anglo_saxon/product.py b/addons/account_anglo_saxon/product.py
index 443642d048b..b52d9ed3bbd 100644
--- a/addons/account_anglo_saxon/product.py
+++ b/addons/account_anglo_saxon/product.py
@@ -48,7 +48,6 @@ class product_category(osv.osv):
help="This account will be used to value outgoing stock using cost price."),
}
-product_category()
class product_template(osv.osv):
_inherit = "product.template"
@@ -78,7 +77,6 @@ class product_template(osv.osv):
help="This account will be used to value outgoing stock using cost price."),
}
-product_template()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_anglo_saxon/purchase.py b/addons/account_anglo_saxon/purchase.py
index 959f8b7eb49..c10a2a97d80 100644
--- a/addons/account_anglo_saxon/purchase.py
+++ b/addons/account_anglo_saxon/purchase.py
@@ -37,6 +37,5 @@ class purchase_order(osv.osv):
new_account_id = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, acc_id)
line.update({'account_id': new_account_id})
return line
-purchase_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_anglo_saxon/stock.py b/addons/account_anglo_saxon/stock.py
index 191249a6640..1cf3ecf21ef 100644
--- a/addons/account_anglo_saxon/stock.py
+++ b/addons/account_anglo_saxon/stock.py
@@ -57,7 +57,6 @@ class stock_picking(osv.osv):
self.pool.get('account.invoice.line').write(cr, uid, [ol.id], {'account_id': a})
return res
-stock_picking()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_asset/account_asset.py b/addons/account_asset/account_asset.py
index 5a22a888772..5c019155fdc 100644
--- a/addons/account_asset/account_asset.py
+++ b/addons/account_asset/account_asset.py
@@ -70,7 +70,6 @@ class account_asset_category(osv.osv):
res['value'] = {'account_depreciation_id': account_asset_id}
return res
-account_asset_category()
class account_asset_asset(osv.osv):
_name = 'account.asset.asset'
@@ -80,10 +79,10 @@ class account_asset_asset(osv.osv):
for asset in self.browse(cr, uid, ids, context=context):
if asset.account_move_line_ids:
raise osv.except_osv(_('Error!'), _('You cannot delete an asset that contains posted depreciation lines.'))
- return super(account_account, self).unlink(cr, uid, ids, context=context)
+ return super(account_asset_asset, self).unlink(cr, uid, ids, context=context)
def _get_period(self, cr, uid, context=None):
- periods = self.pool.get('account.period').find(cr, uid)
+ periods = self.pool.get('account.period').find(cr, uid, context=context)
if periods:
return periods[0]
else:
@@ -361,7 +360,6 @@ class account_asset_asset(osv.osv):
'context': context,
}
-account_asset_asset()
class account_asset_depreciation_line(osv.osv):
_name = 'account.asset.depreciation.line'
@@ -456,7 +454,6 @@ class account_asset_depreciation_line(osv.osv):
asset.write({'state': 'close'})
return created_move_ids
-account_asset_depreciation_line()
class account_move_line(osv.osv):
_inherit = 'account.move.line'
@@ -465,7 +462,6 @@ class account_move_line(osv.osv):
'entry_ids': fields.one2many('account.move.line', 'asset_id', 'Entries', readonly=True, states={'draft':[('readonly',False)]}),
}
-account_move_line()
class account_asset_history(osv.osv):
_name = 'account.asset.history'
@@ -490,6 +486,5 @@ class account_asset_history(osv.osv):
'user_id': lambda self, cr, uid, ctx: uid
}
-account_asset_history()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_asset/account_asset_invoice.py b/addons/account_asset/account_asset_invoice.py
index 7e2f24f0d0a..d5b1c298c0b 100644
--- a/addons/account_asset/account_asset_invoice.py
+++ b/addons/account_asset/account_asset_invoice.py
@@ -35,7 +35,6 @@ class account_invoice(osv.osv):
res['asset_id'] = x.get('asset_id', False)
return res
-account_invoice()
class account_invoice_line(osv.osv):
@@ -66,6 +65,5 @@ class account_invoice_line(osv.osv):
asset_obj.validate(cr, uid, [asset_id], context=context)
return True
-account_invoice_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_asset/account_asset_view.xml b/addons/account_asset/account_asset_view.xml
index c4cb17bded3..fe1fcf473ba 100644
--- a/addons/account_asset/account_asset_view.xml
+++ b/addons/account_asset/account_asset_view.xml
@@ -223,7 +223,7 @@
<filter icon="terp-check" string="Current" domain="[('state','in', ('draft','open'))]" help="Assets in draft and open states"/>
<filter icon="terp-dialog-close" string="Closed" domain="[('state','=', 'close')]" help="Assets in closed state"/>
<field name="category_id"/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
</search>
</field>
</record>
diff --git a/addons/account_asset/i18n/nl_BE.po b/addons/account_asset/i18n/nl_BE.po
index 5bee5f9bfd9..3413cf38ac8 100644
--- a/addons/account_asset/i18n/nl_BE.po
+++ b/addons/account_asset/i18n/nl_BE.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2012-11-27 13:35+0000\n"
+"PO-Revision-Date: 2013-04-15 15:59+0000\n"
"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:50+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
#. module: account_asset
#: view:account.asset.asset:0
@@ -148,7 +148,7 @@ msgstr "Dit is het bedrag dat u niet kunt afschrijven."
#. module: account_asset
#: help:account.asset.asset,method_period:0
msgid "The amount of time between two depreciations, in months"
-msgstr ""
+msgstr "De tijd tussen twee afschrijvingen, in maanden"
#. module: account_asset
#: field:account.asset.depreciation.line,depreciation_date:0
@@ -265,7 +265,7 @@ msgstr "Duur wijzigen"
#: help:account.asset.category,method_number:0
#: help:account.asset.history,method_number:0
msgid "The number of depreciations needed to depreciate your asset"
-msgstr ""
+msgstr "Het aantal keer dat er moet worden afgeschreven."
#. module: account_asset
#: view:account.asset.category:0
@@ -295,7 +295,7 @@ msgstr ""
#. module: account_asset
#: field:account.asset.depreciation.line,remaining_value:0
msgid "Next Period Depreciation"
-msgstr ""
+msgstr "Volgende afschrijvingsperiode"
#. module: account_asset
#: help:account.asset.history,method_period:0
@@ -346,7 +346,7 @@ msgstr "Investeringscategorie zoeken"
#. module: account_asset
#: view:asset.modify:0
msgid "months"
-msgstr ""
+msgstr "maanden"
#. module: account_asset
#: model:ir.model,name:account_asset.model_account_invoice_line
@@ -608,7 +608,7 @@ msgstr "Afschrijvingsmethode"
#. module: account_asset
#: field:account.asset.depreciation.line,amount:0
msgid "Current Depreciation"
-msgstr ""
+msgstr "Huidige afschrijving"
#. module: account_asset
#: field:account.asset.asset,name:0
@@ -653,6 +653,9 @@ msgid ""
" * Linear: Calculated on basis of: Gross Value / Number of Depreciations\n"
" * Degressive: Calculated on basis of: Residual Value * Degressive Factor"
msgstr ""
+"Kies de methode om het aantal afschrijvingsregels te berekenen.\n"
+" * Lineair: op basis van: brutowaarde / aantal afschrijvingen\n"
+" * Degressief: op basis van: restwaarde * degressieve factor"
#. module: account_asset
#: field:account.asset.depreciation.line,move_check:0
diff --git a/addons/account_asset/report/account_asset_report.py b/addons/account_asset/report/account_asset_report.py
index 1554880ac38..40ab1c778f0 100644
--- a/addons/account_asset/report/account_asset_report.py
+++ b/addons/account_asset/report/account_asset_report.py
@@ -82,6 +82,5 @@ class asset_asset_report(osv.osv):
a.purchase_value, a.id, a.salvage_value
)""")
-asset_asset_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_asset/report/account_asset_report_view.xml b/addons/account_asset/report/account_asset_report_view.xml
index 4865196c4a8..c772c6e4103 100644
--- a/addons/account_asset/report/account_asset_report_view.xml
+++ b/addons/account_asset/report/account_asset_report_view.xml
@@ -49,7 +49,7 @@
<field name="asset_id"/>
<field name="asset_category_id"/>
<group expand="0" string="Extended Filters...">
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
<group expand="1" string="Group By...">
diff --git a/addons/account_asset/wizard/account_asset_change_duration.py b/addons/account_asset/wizard/account_asset_change_duration.py
index 19782c76367..f27507ac2b3 100755
--- a/addons/account_asset/wizard/account_asset_change_duration.py
+++ b/addons/account_asset/wizard/account_asset_change_duration.py
@@ -127,6 +127,5 @@ class asset_modify(osv.osv_memory):
asset_obj.compute_depreciation_board(cr, uid, [asset_id], context=context)
return {'type': 'ir.actions.act_window_close'}
-asset_modify()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_asset/wizard/wizard_asset_compute.py b/addons/account_asset/wizard/wizard_asset_compute.py
index cc870329840..f7cc6cf89c0 100755
--- a/addons/account_asset/wizard/wizard_asset_compute.py
+++ b/addons/account_asset/wizard/wizard_asset_compute.py
@@ -30,7 +30,7 @@ class asset_depreciation_confirmation_wizard(osv.osv_memory):
}
def _get_period(self, cr, uid, context=None):
- periods = self.pool.get('account.period').find(cr, uid)
+ periods = self.pool.get('account.period').find(cr, uid, context=context)
if periods:
return periods[0]
return False
@@ -55,6 +55,5 @@ class asset_depreciation_confirmation_wizard(osv.osv_memory):
'type': 'ir.actions.act_window',
}
-asset_depreciation_confirmation_wizard()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_bank_statement_extensions/account_bank_statement.py b/addons/account_bank_statement_extensions/account_bank_statement.py
index 60dcc6dfa25..b9e44ee8f9c 100644
--- a/addons/account_bank_statement_extensions/account_bank_statement.py
+++ b/addons/account_bank_statement_extensions/account_bank_statement.py
@@ -56,7 +56,6 @@ class account_bank_statement(osv.osv):
(tuple([x.id for x in st.line_ids]),))
return True
-account_bank_statement()
class account_bank_statement_line_global(osv.osv):
_name = 'account.bank.statement.line.global'
@@ -100,7 +99,6 @@ class account_bank_statement_line_global(osv.osv):
ids = self.search(cr, user, args, context=context, limit=limit)
return self.name_get(cr, user, ids, context=context)
-account_bank_statement_line_global()
class account_bank_statement_line(osv.osv):
_inherit = 'account.bank.statement.line'
@@ -130,6 +128,5 @@ class account_bank_statement_line(osv.osv):
Please go to the associated bank statement in order to delete and/or modify bank statement line.'))
return super(account_bank_statement_line, self).unlink(cr, uid, ids, context=context)
-account_bank_statement_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_bank_statement_extensions/i18n/cs.po b/addons/account_bank_statement_extensions/i18n/cs.po
new file mode 100644
index 00000000000..4eef2acf03b
--- /dev/null
+++ b/addons/account_bank_statement_extensions/i18n/cs.po
@@ -0,0 +1,357 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:42+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: account_bank_statement_extensions
+#: help:account.bank.statement.line.global,name:0
+msgid "Originator to Beneficiary Information"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+#: selection:account.bank.statement.line,state:0
+msgid "Confirmed"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement:0
+#: view:account.bank.statement.line:0
+msgid "Glob. Id"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: selection:account.bank.statement.line.global,type:0
+msgid "CODA"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,parent_id:0
+msgid "Parent Code"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Debit"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:cancel.statement.line:0
+#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_cancel_statement_line
+#: model:ir.model,name:account_bank_statement_extensions.model_cancel_statement_line
+msgid "Cancel selected statement lines"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,val_date:0
+msgid "Value Date"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Group By..."
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+#: selection:account.bank.statement.line,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Statement"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:confirm.statement.line:0
+#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_confirm_statement_line
+#: model:ir.model,name:account_bank_statement_extensions.model_confirm_statement_line
+msgid "Confirm selected statement lines"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: report:bank.statement.balance.report:0
+#: model:ir.actions.report.xml,name:account_bank_statement_extensions.bank_statement_balance_report
+msgid "Bank Statement Balances Report"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:cancel.statement.line:0
+msgid "Cancel Lines"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line.global:0
+#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement_line_global
+msgid "Batch Payment Info"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,state:0
+msgid "Status"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: code:addons/account_bank_statement_extensions/account_bank_statement.py:129
+#, python-format
+msgid ""
+"Delete operation not allowed. Please go to the associated bank "
+"statement in order to delete and/or modify bank statement line."
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:confirm.statement.line:0
+msgid "or"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:confirm.statement.line:0
+msgid "Confirm Lines"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line.global:0
+msgid "Transactions"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,type:0
+msgid "Type"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+#: report:bank.statement.balance.report:0
+msgid "Journal"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Confirmed Statement Lines."
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Credit Transactions."
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: model:ir.actions.act_window,help:account_bank_statement_extensions.action_cancel_statement_line
+msgid "cancel selected statement lines."
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,counterparty_number:0
+msgid "Counterparty Number"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: report:bank.statement.balance.report:0
+msgid "Closing Balance"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: report:bank.statement.balance.report:0
+msgid "Date"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+#: field:account.bank.statement.line,globalisation_amount:0
+msgid "Glob. Amount"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Debit Transactions."
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Extended Filters..."
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:confirm.statement.line:0
+msgid "Confirmed lines cannot be changed anymore."
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:cancel.statement.line:0
+msgid "Are you sure you want to cancel the selected Bank Statement lines ?"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: report:bank.statement.balance.report:0
+msgid "Name"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,name:0
+msgid "OBI"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: selection:account.bank.statement.line.global,type:0
+msgid "ISO 20022"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Notes"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: selection:account.bank.statement.line.global,type:0
+msgid "Manual"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Bank Transaction"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Credit"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,amount:0
+msgid "Amount"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Fin.Account"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,counterparty_currency:0
+msgid "Counterparty Currency"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,counterparty_bic:0
+msgid "Counterparty BIC"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,child_ids:0
+msgid "Child Codes"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Search Bank Transactions"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:confirm.statement.line:0
+msgid "Are you sure you want to confirm the selected Bank Statement lines ?"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: help:account.bank.statement.line,globalisation_id:0
+msgid ""
+"Code to identify transactions belonging to the same globalisation level "
+"within a batch payment"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Draft Statement Lines."
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Glob. Am."
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement_line
+msgid "Bank Statement Line"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,code:0
+msgid "Code"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,counterparty_name:0
+msgid "Counterparty Name"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: model:ir.model,name:account_bank_statement_extensions.model_res_partner_bank
+msgid "Bank Accounts"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement
+msgid "Bank Statement"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Statement Line"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: sql_constraint:account.bank.statement.line.global:0
+msgid "The code must be unique !"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,bank_statement_line_ids:0
+#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_bank_statement_line
+#: model:ir.ui.menu,name:account_bank_statement_extensions.bank_statement_line
+msgid "Bank Statement Lines"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: code:addons/account_bank_statement_extensions/account_bank_statement.py:129
+#, python-format
+msgid "Warning!"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line.global:0
+msgid "Child Batch Payments"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:confirm.statement.line:0
+msgid "Cancel"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Statement Lines"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Total Amount"
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,globalisation_id:0
+msgid "Globalisation ID"
+msgstr ""
diff --git a/addons/account_bank_statement_extensions/i18n/hu.po b/addons/account_bank_statement_extensions/i18n/hu.po
new file mode 100644
index 00000000000..a631c43ade0
--- /dev/null
+++ b/addons/account_bank_statement_extensions/i18n/hu.po
@@ -0,0 +1,362 @@
+# Hungarian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-05-05 23:08+0000\n"
+"Last-Translator: krnkris <Unknown>\n"
+"Language-Team: Hungarian <hu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-05-06 05:40+0000\n"
+"X-Generator: Launchpad (build 16598)\n"
+
+#. module: account_bank_statement_extensions
+#: help:account.bank.statement.line.global,name:0
+msgid "Originator to Beneficiary Information"
+msgstr "Kezdeményezőtől a kedvezményezetthez intézett információ"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+#: selection:account.bank.statement.line,state:0
+msgid "Confirmed"
+msgstr "Jóváhagyott"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement:0
+#: view:account.bank.statement.line:0
+msgid "Glob. Id"
+msgstr "Globális ID azonosító"
+
+#. module: account_bank_statement_extensions
+#: selection:account.bank.statement.line.global,type:0
+msgid "CODA"
+msgstr "CODA"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,parent_id:0
+msgid "Parent Code"
+msgstr "Szülő kód"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Debit"
+msgstr "Tartozik"
+
+#. module: account_bank_statement_extensions
+#: view:cancel.statement.line:0
+#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_cancel_statement_line
+#: model:ir.model,name:account_bank_statement_extensions.model_cancel_statement_line
+msgid "Cancel selected statement lines"
+msgstr "Kiválasztott számlakivonat sorok visszavonása"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,val_date:0
+msgid "Value Date"
+msgstr "Értéknap"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Group By..."
+msgstr "Csoportosítás ezzel..."
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+#: selection:account.bank.statement.line,state:0
+msgid "Draft"
+msgstr "Tervezet"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Statement"
+msgstr "Kivonat"
+
+#. module: account_bank_statement_extensions
+#: view:confirm.statement.line:0
+#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_confirm_statement_line
+#: model:ir.model,name:account_bank_statement_extensions.model_confirm_statement_line
+msgid "Confirm selected statement lines"
+msgstr "Kiválasztott bankszámla kivonat sorok jóváhagyása"
+
+#. module: account_bank_statement_extensions
+#: report:bank.statement.balance.report:0
+#: model:ir.actions.report.xml,name:account_bank_statement_extensions.bank_statement_balance_report
+msgid "Bank Statement Balances Report"
+msgstr "Bank kivonat egyenleg kimutatás"
+
+#. module: account_bank_statement_extensions
+#: view:cancel.statement.line:0
+msgid "Cancel Lines"
+msgstr "Sorok elvetése"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line.global:0
+#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement_line_global
+msgid "Batch Payment Info"
+msgstr "Köptegelt fizetés információ"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,state:0
+msgid "Status"
+msgstr "Állapot"
+
+#. module: account_bank_statement_extensions
+#: code:addons/account_bank_statement_extensions/account_bank_statement.py:129
+#, python-format
+msgid ""
+"Delete operation not allowed. Please go to the associated bank "
+"statement in order to delete and/or modify bank statement line."
+msgstr ""
+"A törlés végrehajtás nem engedélyezett. Kérem menjen az ide vonatkozó banki "
+"kivonathoz, hogy azt törölhesse és/vagy módosíthassa."
+
+#. module: account_bank_statement_extensions
+#: view:confirm.statement.line:0
+msgid "or"
+msgstr "vagy"
+
+#. module: account_bank_statement_extensions
+#: view:confirm.statement.line:0
+msgid "Confirm Lines"
+msgstr "Jóváhagyott sorok5"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line.global:0
+msgid "Transactions"
+msgstr "Tranzakciók"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,type:0
+msgid "Type"
+msgstr "Típus"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+#: report:bank.statement.balance.report:0
+msgid "Journal"
+msgstr "Napló"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Confirmed Statement Lines."
+msgstr "Jóváhagyott kivonat sorok"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Credit Transactions."
+msgstr "Jóváírási tranzakció"
+
+#. module: account_bank_statement_extensions
+#: model:ir.actions.act_window,help:account_bank_statement_extensions.action_cancel_statement_line
+msgid "cancel selected statement lines."
+msgstr "kiválasztott kivonat sorok visszavonása"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,counterparty_number:0
+msgid "Counterparty Number"
+msgstr "Ellanoldali szám"
+
+#. module: account_bank_statement_extensions
+#: report:bank.statement.balance.report:0
+msgid "Closing Balance"
+msgstr "Záró egyenleg"
+
+#. module: account_bank_statement_extensions
+#: report:bank.statement.balance.report:0
+msgid "Date"
+msgstr "Dátum"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+#: field:account.bank.statement.line,globalisation_amount:0
+msgid "Glob. Amount"
+msgstr "Globális összeg"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Debit Transactions."
+msgstr "Terhelés tranzakciók"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Extended Filters..."
+msgstr "Kiterjesztett szűrők…"
+
+#. module: account_bank_statement_extensions
+#: view:confirm.statement.line:0
+msgid "Confirmed lines cannot be changed anymore."
+msgstr "Jóváhagyott sorokat enm lehet többé megváltoztatni."
+
+#. module: account_bank_statement_extensions
+#: view:cancel.statement.line:0
+msgid "Are you sure you want to cancel the selected Bank Statement lines ?"
+msgstr ""
+"Biztos benne, hogy vissza akarja vonni a kijelölt banki kivonat sorokat?"
+
+#. module: account_bank_statement_extensions
+#: report:bank.statement.balance.report:0
+msgid "Name"
+msgstr "Név"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,name:0
+msgid "OBI"
+msgstr "OBI"
+
+#. module: account_bank_statement_extensions
+#: selection:account.bank.statement.line.global,type:0
+msgid "ISO 20022"
+msgstr "ISO 20022"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Notes"
+msgstr "Jegyzetek"
+
+#. module: account_bank_statement_extensions
+#: selection:account.bank.statement.line.global,type:0
+msgid "Manual"
+msgstr "Kézi"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Bank Transaction"
+msgstr "Banki tranzakciók"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Credit"
+msgstr "Jóváírás"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,amount:0
+msgid "Amount"
+msgstr "Összeg"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Fin.Account"
+msgstr "Főkönyvi számla"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,counterparty_currency:0
+msgid "Counterparty Currency"
+msgstr "Ellenoldal pénzneme"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,counterparty_bic:0
+msgid "Counterparty BIC"
+msgstr "Ellenoldali BIC"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,child_ids:0
+msgid "Child Codes"
+msgstr "Alárendelt kódok"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Search Bank Transactions"
+msgstr "Banki tranzakciók keresése"
+
+#. module: account_bank_statement_extensions
+#: view:confirm.statement.line:0
+msgid "Are you sure you want to confirm the selected Bank Statement lines ?"
+msgstr "Biztos, hogy jóvá akarja hagyni a kiválasztott banki kivonat sorait?"
+
+#. module: account_bank_statement_extensions
+#: help:account.bank.statement.line,globalisation_id:0
+msgid ""
+"Code to identify transactions belonging to the same globalisation level "
+"within a batch payment"
+msgstr ""
+"Ugynahhoz, a kötegelt utaláson belüli, globalizált szinthez tartozó "
+"tranzakció azonosító kód"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Draft Statement Lines."
+msgstr "Tervezet kivonat sorok."
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Glob. Am."
+msgstr ""
+
+#. module: account_bank_statement_extensions
+#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement_line
+msgid "Bank Statement Line"
+msgstr "Bankkivonat sor"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,code:0
+msgid "Code"
+msgstr "Kód"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,counterparty_name:0
+msgid "Counterparty Name"
+msgstr "Ellenoldal megnevezése"
+
+#. module: account_bank_statement_extensions
+#: model:ir.model,name:account_bank_statement_extensions.model_res_partner_bank
+msgid "Bank Accounts"
+msgstr "Bankszámlák"
+
+#. module: account_bank_statement_extensions
+#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement
+msgid "Bank Statement"
+msgstr "Bankszámlakivonat"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Statement Line"
+msgstr "Kivonat sor"
+
+#. module: account_bank_statement_extensions
+#: sql_constraint:account.bank.statement.line.global:0
+msgid "The code must be unique !"
+msgstr "A kódnak egyedinek kell lennie !"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line.global,bank_statement_line_ids:0
+#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_bank_statement_line
+#: model:ir.ui.menu,name:account_bank_statement_extensions.bank_statement_line
+msgid "Bank Statement Lines"
+msgstr "Bankkivonat sorai"
+
+#. module: account_bank_statement_extensions
+#: code:addons/account_bank_statement_extensions/account_bank_statement.py:129
+#, python-format
+msgid "Warning!"
+msgstr "Figyelem!"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line.global:0
+msgid "Child Batch Payments"
+msgstr "Alárendelt kötegelt utalások"
+
+#. module: account_bank_statement_extensions
+#: view:confirm.statement.line:0
+msgid "Cancel"
+msgstr "Mégse"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Statement Lines"
+msgstr "Kivonat sorai"
+
+#. module: account_bank_statement_extensions
+#: view:account.bank.statement.line:0
+msgid "Total Amount"
+msgstr "Teljes érték"
+
+#. module: account_bank_statement_extensions
+#: field:account.bank.statement.line,globalisation_id:0
+msgid "Globalisation ID"
+msgstr "Globalizált ID azonosító"
diff --git a/addons/account_bank_statement_extensions/res_partner_bank.py b/addons/account_bank_statement_extensions/res_partner_bank.py
index f866634a08c..22baa78d39f 100644
--- a/addons/account_bank_statement_extensions/res_partner_bank.py
+++ b/addons/account_bank_statement_extensions/res_partner_bank.py
@@ -35,5 +35,4 @@ class res_partner_bank(osv.osv):
ids = self.search(cr, user, args, context=context, limit=limit)
return self.name_get(cr, user, ids, context=context)
-res_partner_bank()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_bank_statement_extensions/wizard/cancel_statement_line.py b/addons/account_bank_statement_extensions/wizard/cancel_statement_line.py
index 46d71354d4b..15c242e9c33 100644
--- a/addons/account_bank_statement_extensions/wizard/cancel_statement_line.py
+++ b/addons/account_bank_statement_extensions/wizard/cancel_statement_line.py
@@ -32,6 +32,5 @@ class cancel_statement_line(osv.osv_memory):
line_obj.write(cr, uid, line_ids, {'state': 'draft'}, context=context)
return {}
-cancel_statement_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_bank_statement_extensions/wizard/confirm_statement_line.py b/addons/account_bank_statement_extensions/wizard/confirm_statement_line.py
index 3a887a52441..c330a2cc359 100644
--- a/addons/account_bank_statement_extensions/wizard/confirm_statement_line.py
+++ b/addons/account_bank_statement_extensions/wizard/confirm_statement_line.py
@@ -32,6 +32,5 @@ class confirm_statement_line(osv.osv_memory):
line_obj.write(cr, uid, line_ids, {'state': 'confirm'}, context=context)
return {}
-confirm_statement_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_budget/account_budget.py b/addons/account_budget/account_budget.py
index a88c468fff1..e6fc3a29668 100644
--- a/addons/account_budget/account_budget.py
+++ b/addons/account_budget/account_budget.py
@@ -48,7 +48,6 @@ class account_budget_post(osv.osv):
}
_order = "name"
-account_budget_post()
class crossovered_budget(osv.osv):
@@ -104,7 +103,6 @@ class crossovered_budget(osv.osv):
})
return True
-crossovered_budget()
class crossovered_budget_lines(osv.osv):
@@ -202,7 +200,6 @@ class crossovered_budget_lines(osv.osv):
'company_id': fields.related('crossovered_budget_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True)
}
-crossovered_budget_lines()
class account_analytic_account(osv.osv):
_inherit = "account.analytic.account"
@@ -211,6 +208,5 @@ class account_analytic_account(osv.osv):
'crossovered_budget_line': fields.one2many('crossovered.budget.lines', 'analytic_account_id', 'Budget Lines'),
}
-account_analytic_account()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_budget/wizard/account_budget_analytic.py b/addons/account_budget/wizard/account_budget_analytic.py
index 0cdb7504f75..90285b90d1e 100644
--- a/addons/account_budget/wizard/account_budget_analytic.py
+++ b/addons/account_budget/wizard/account_budget_analytic.py
@@ -50,6 +50,5 @@ class account_budget_analytic(osv.osv_memory):
'datas': datas,
}
-account_budget_analytic()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_budget/wizard/account_budget_crossovered_report.py b/addons/account_budget/wizard/account_budget_crossovered_report.py
index 97fc43c8e9d..6f89a3cd95c 100644
--- a/addons/account_budget/wizard/account_budget_crossovered_report.py
+++ b/addons/account_budget/wizard/account_budget_crossovered_report.py
@@ -51,6 +51,5 @@ class account_budget_crossvered_report(osv.osv_memory):
'datas': datas,
}
-account_budget_crossvered_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_budget/wizard/account_budget_crossovered_summary_report.py b/addons/account_budget/wizard/account_budget_crossovered_summary_report.py
index f42c39ec6ac..6e3131b584c 100644
--- a/addons/account_budget/wizard/account_budget_crossovered_summary_report.py
+++ b/addons/account_budget/wizard/account_budget_crossovered_summary_report.py
@@ -53,7 +53,6 @@ class account_budget_crossvered_summary_report(osv.osv_memory):
'datas': datas,
}
-account_budget_crossvered_summary_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_budget/wizard/account_budget_report.py b/addons/account_budget/wizard/account_budget_report.py
index 5db6c68d508..54c3180ee0d 100644
--- a/addons/account_budget/wizard/account_budget_report.py
+++ b/addons/account_budget/wizard/account_budget_report.py
@@ -52,6 +52,5 @@ class account_budget_report(osv.osv_memory):
'datas': datas,
}
-account_budget_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_cancel/i18n/hu.po b/addons/account_cancel/i18n/hu.po
index 6b63bb37bb2..bab8304030f 100644
--- a/addons/account_cancel/i18n/hu.po
+++ b/addons/account_cancel/i18n/hu.po
@@ -7,19 +7,19 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2011-01-30 16:46+0000\n"
-"Last-Translator: Krisztian Eyssen <krisz@eyssen.hu>\n"
+"PO-Revision-Date: 2013-04-04 13:17+0000\n"
+"Last-Translator: krnkris <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:42+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-05 05:37+0000\n"
+"X-Generator: Launchpad (build 16550)\n"
#. module: account_cancel
#: view:account.invoice:0
msgid "Cancel"
-msgstr ""
+msgstr "Sztornó"
#~ msgid "Account Cancel"
#~ msgstr "Érvénytelenítés"
diff --git a/addons/account_check_writing/account.py b/addons/account_check_writing/account.py
index 62b7336dc5f..035e3a710b0 100644
--- a/addons/account_check_writing/account.py
+++ b/addons/account_check_writing/account.py
@@ -29,7 +29,6 @@ class account_journal(osv.osv):
'use_preprint_check': fields.boolean('Use Preprinted Check'),
}
-account_journal()
class res_company(osv.osv):
_inherit = "res.company"
@@ -46,5 +45,4 @@ class res_company(osv.osv):
'check_layout' : lambda *a: 'top',
}
-res_company()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_check_writing/account_voucher.py b/addons/account_check_writing/account_voucher.py
index 7a5d12f5cff..8e1ad2e1fbf 100644
--- a/addons/account_check_writing/account_voucher.py
+++ b/addons/account_check_writing/account_voucher.py
@@ -97,4 +97,3 @@ class account_voucher(osv.osv):
res['arch'] = etree.tostring(doc)
return res
-account_voucher()
diff --git a/addons/account_check_writing/i18n/hu.po b/addons/account_check_writing/i18n/hu.po
new file mode 100644
index 00000000000..528cb4fed60
--- /dev/null
+++ b/addons/account_check_writing/i18n/hu.po
@@ -0,0 +1,247 @@
+# Hungarian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-11 22:57+0000\n"
+"Last-Translator: krnkris <Unknown>\n"
+"Language-Team: Hungarian <hu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-12 05:21+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
+
+#. module: account_check_writing
+#: selection:res.company,check_layout:0
+msgid "Check on Top"
+msgstr "Fennt lévő csekk"
+
+#. module: account_check_writing
+#: report:account.print.check.top:0
+msgid "Open Balance"
+msgstr "Nyitó egyenleg"
+
+#. module: account_check_writing
+#: view:account.check.write:0
+#: view:account.voucher:0
+msgid "Print Check"
+msgstr "Csekk nyomtatása"
+
+#. module: account_check_writing
+#: selection:res.company,check_layout:0
+msgid "Check in middle"
+msgstr "Középen lévő csekk"
+
+#. module: account_check_writing
+#: help:res.company,check_layout:0
+msgid ""
+"Check on top is compatible with Quicken, QuickBooks and Microsoft Money. "
+"Check in middle is compatible with Peachtree, ACCPAC and DacEasy. Check on "
+"bottom is compatible with Peachtree, ACCPAC and DacEasy only"
+msgstr ""
+"Fennt lévő csekk kompatibilis a Quicken, QuickBooks és Microsoft Money "
+"csekkekekl. A középen lévő csekkek kompatibilisek a Peachtree, ACCPAC és "
+"DacEasy csekkekel. Az alul lévő csekkek kompatibilisek a Peachtree, ACCPAC "
+"és DacEasy only csekkekel."
+
+#. module: account_check_writing
+#: selection:res.company,check_layout:0
+msgid "Check on bottom"
+msgstr "Alul lévő csekkek"
+
+#. module: account_check_writing
+#: model:ir.actions.act_window,name:account_check_writing.action_account_check_write
+msgid "Print Check in Batch"
+msgstr "Csekkek kötegelt nyomtatása"
+
+#. module: account_check_writing
+#: code:addons/account_check_writing/wizard/account_check_batch_printing.py:59
+#, python-format
+msgid "One of the printed check already got a number."
+msgstr "Egyik, már kinyomtatott csekk már el van látva számmal."
+
+#. module: account_check_writing
+#: help:account.journal,allow_check_writing:0
+msgid "Check this if the journal is to be used for writing checks."
+msgstr "Jelölje be ezt, ha naplót csekkírásra használja."
+
+#. module: account_check_writing
+#: field:account.journal,allow_check_writing:0
+msgid "Allow Check writing"
+msgstr "Csekk írás engedélyezése."
+
+#. module: account_check_writing
+#: report:account.print.check.bottom:0
+#: report:account.print.check.middle:0
+#: report:account.print.check.top:0
+msgid "Description"
+msgstr "Leírás"
+
+#. module: account_check_writing
+#: model:ir.model,name:account_check_writing.model_account_journal
+msgid "Journal"
+msgstr "Napló"
+
+#. module: account_check_writing
+#: model:ir.actions.act_window,name:account_check_writing.action_write_check
+#: model:ir.ui.menu,name:account_check_writing.menu_action_write_check
+msgid "Write Checks"
+msgstr "Csekkek írása"
+
+#. module: account_check_writing
+#: report:account.print.check.bottom:0
+#: report:account.print.check.middle:0
+#: report:account.print.check.top:0
+msgid "Discount"
+msgstr "Kedvezmény"
+
+#. module: account_check_writing
+#: report:account.print.check.bottom:0
+#: report:account.print.check.middle:0
+#: report:account.print.check.top:0
+msgid "Original Amount"
+msgstr "Eredeti összeg"
+
+#. module: account_check_writing
+#: field:res.company,check_layout:0
+msgid "Check Layout"
+msgstr "Csekk elrendezése"
+
+#. module: account_check_writing
+#: field:account.voucher,allow_check:0
+msgid "Allow Check Writing"
+msgstr "Csekk írás engedélyezése"
+
+#. module: account_check_writing
+#: report:account.print.check.bottom:0
+#: report:account.print.check.middle:0
+#: report:account.print.check.top:0
+msgid "Payment"
+msgstr "Kifizetés"
+
+#. module: account_check_writing
+#: field:account.journal,use_preprint_check:0
+msgid "Use Preprinted Check"
+msgstr "Előre nyomtatott csekk használata"
+
+#. module: account_check_writing
+#: model:ir.actions.report.xml,name:account_check_writing.account_print_check_bottom
+msgid "Print Check (Bottom)"
+msgstr "Csekk nyomtatás (Alsó)"
+
+#. module: account_check_writing
+#: model:ir.actions.act_window,help:account_check_writing.action_write_check
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new check. \n"
+" </p><p>\n"
+" The check payment form allows you to track the payment you "
+"do\n"
+" to your suppliers using checks. When you select a supplier, "
+"the\n"
+" payment method and an amount for the payment, OpenERP will\n"
+" propose to reconcile your payment with the open supplier\n"
+" invoices or bills.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Kattintson új csekk létrehozásához. \n"
+" </p><p>\n"
+" A csekk kifizetési lap lehetővé teszi a beszállítókhoz "
+"történt \n"
+" csekken történt kifizetések nyomon követését. Ha kiválaszt "
+"egy beszállítót,\n"
+" a fizetési módot és az összeget, OpenERP javasolni fogja \n"
+" a fizetés összeegyeztetését a még nyitott beszállítói "
+"számlákkal és\n"
+" fizetésekkel.\n"
+" </p>\n"
+" "
+
+#. module: account_check_writing
+#: report:account.print.check.bottom:0
+#: report:account.print.check.middle:0
+#: report:account.print.check.top:0
+msgid "Due Date"
+msgstr "Fizetési határidő"
+
+#. module: account_check_writing
+#: model:ir.actions.report.xml,name:account_check_writing.account_print_check_middle
+msgid "Print Check (Middle)"
+msgstr "Csekk nyomtatás (Középső)"
+
+#. module: account_check_writing
+#: model:ir.model,name:account_check_writing.model_res_company
+msgid "Companies"
+msgstr "Vállalatok"
+
+#. module: account_check_writing
+#: code:addons/account_check_writing/wizard/account_check_batch_printing.py:59
+#, python-format
+msgid "Error!"
+msgstr "Hiba!"
+
+#. module: account_check_writing
+#: help:account.check.write,check_number:0
+msgid "The number of the next check number to be printed."
+msgstr "A következő csekkszám nyomtatása"
+
+#. module: account_check_writing
+#: report:account.print.check.bottom:0
+#: report:account.print.check.middle:0
+msgid "Balance Due"
+msgstr "Esedékes egyenleg"
+
+#. module: account_check_writing
+#: model:ir.actions.report.xml,name:account_check_writing.account_print_check_top
+msgid "Print Check (Top)"
+msgstr "Csekk nyomtatás (Felső)"
+
+#. module: account_check_writing
+#: report:account.print.check.bottom:0
+#: report:account.print.check.middle:0
+#: report:account.print.check.top:0
+msgid "Check Amount"
+msgstr "Csekk végösszege"
+
+#. module: account_check_writing
+#: model:ir.model,name:account_check_writing.model_account_voucher
+msgid "Accounting Voucher"
+msgstr "Könyvelési bizonylat"
+
+#. module: account_check_writing
+#: view:account.check.write:0
+msgid "or"
+msgstr "vagy"
+
+#. module: account_check_writing
+#: field:account.voucher,amount_in_word:0
+msgid "Amount in Word"
+msgstr "Összeg szavakkal"
+
+#. module: account_check_writing
+#: model:ir.model,name:account_check_writing.model_account_check_write
+msgid "Prin Check in Batch"
+msgstr "Csekk kötegelt nyomtatása"
+
+#. module: account_check_writing
+#: view:account.check.write:0
+msgid "Cancel"
+msgstr "Mégse"
+
+#. module: account_check_writing
+#: field:account.check.write,check_number:0
+msgid "Next Check Number"
+msgstr "Következő csekk száma"
+
+#. module: account_check_writing
+#: view:account.check.write:0
+msgid "Check"
+msgstr "Csekk"
diff --git a/addons/account_check_writing/wizard/account_check_batch_printing.py b/addons/account_check_writing/wizard/account_check_batch_printing.py
index afeb5de6445..c3a13e2c687 100644
--- a/addons/account_check_writing/wizard/account_check_batch_printing.py
+++ b/addons/account_check_writing/wizard/account_check_batch_printing.py
@@ -83,5 +83,4 @@ class account_check_write(osv.osv_memory):
'nodestroy': True
}
-account_check_write()
diff --git a/addons/account_followup/account_followup_customers.xml b/addons/account_followup/account_followup_customers.xml
index 6be11399b68..6893abe012e 100644
--- a/addons/account_followup/account_followup_customers.xml
+++ b/addons/account_followup/account_followup_customers.xml
@@ -10,7 +10,7 @@
<field name="priority" eval="20"/>
<field name="arch" type="xml">
<tree string="Customer Followup">
- <field name="name"/>
+ <field name="display_name"/>
<field name="payment_next_action_date"/>
<field name="payment_next_action"/>
<field name="user_id" invisible="1"/>
@@ -29,7 +29,7 @@
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_tree"/>
<field name="arch" type="xml">
- <field name="name" position="after">
+ <field name="display_name" position="after">
<field name="payment_responsible_id" invisible="1"/>
</field>
</field>
diff --git a/addons/account_followup/i18n/hu.po b/addons/account_followup/i18n/hu.po
index a8fc4f8963c..e69bb7b38c0 100644
--- a/addons/account_followup/i18n/hu.po
+++ b/addons/account_followup/i18n/hu.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2011-11-11 15:21+0000\n"
-"Last-Translator: Krisztian Eyssen <krisz@eyssen.hu>\n"
+"PO-Revision-Date: 2013-04-04 13:15+0000\n"
+"Last-Translator: krnkris <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:11+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-05 05:37+0000\n"
+"X-Generator: Launchpad (build 16550)\n"
#. module: account_followup
#: model:email.template,subject:account_followup.email_template_account_followup_default
@@ -22,12 +22,12 @@ msgstr ""
#: model:email.template,subject:account_followup.email_template_account_followup_level1
#: model:email.template,subject:account_followup.email_template_account_followup_level2
msgid "${user.company_id.name} Payment Reminder"
-msgstr ""
+msgstr "${user.company_id.name} Fizetési felszólítás"
#. module: account_followup
#: help:res.partner,latest_followup_level_id:0
msgid "The maximum follow-up level"
-msgstr ""
+msgstr "Fizetési-emlékeztető szint maximuma"
#. module: account_followup
#: view:account_followup.stat:0
@@ -43,33 +43,33 @@ msgstr "Fizetési emlékeztető"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "%(date)s"
-msgstr ""
+msgstr "%(date)s"
#. module: account_followup
#: field:res.partner,payment_next_action_date:0
msgid "Next Action Date"
-msgstr ""
+msgstr "Következő művelet időpontja"
#. module: account_followup
#: view:account_followup.followup.line:0
#: field:account_followup.followup.line,manual_action:0
msgid "Manual Action"
-msgstr ""
+msgstr "Kézi művelet"
#. module: account_followup
#: field:account_followup.sending.results,needprinting:0
msgid "Needs Printing"
-msgstr ""
+msgstr "Nyomtatás szükséges"
#. module: account_followup
#: view:res.partner:0
msgid "⇾ Mark as Done"
-msgstr ""
+msgstr "⇾ Jelölje elvégzettnek"
#. module: account_followup
#: field:account_followup.followup.line,manual_action_note:0
msgid "Action To Do"
-msgstr ""
+msgstr "Elvégzendő művelet"
#. module: account_followup
#: field:account_followup.followup,company_id:0
@@ -94,34 +94,34 @@ msgstr "E-mail tárgya"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "%(user_signature)s"
-msgstr ""
+msgstr "%(user_signature)s"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "days overdue, do the following actions:"
-msgstr ""
+msgstr "a határidő napján, a következő műveleteket hajtsa végre:"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "Follow-up Steps"
-msgstr ""
+msgstr "Fizetési-emlékezetető lépései"
#. module: account_followup
#: field:account_followup.print,email_body:0
msgid "Email Body"
-msgstr ""
+msgstr "E-mail szövege"
#. module: account_followup
#: model:ir.actions.act_window,name:account_followup.action_account_followup_print
msgid "Send Follow-Ups"
-msgstr ""
+msgstr "Fizetési-emlékezető küldése"
#. module: account_followup
#: report:account_followup.followup.print:0
#: code:addons/account_followup/account_followup.py:263
#, python-format
msgid "Amount"
-msgstr ""
+msgstr "Összeg"
#. module: account_followup
#: help:res.partner,payment_next_action:0
@@ -129,11 +129,14 @@ msgid ""
"This is the next action to be taken. It will automatically be set when the "
"partner gets a follow-up level that requires a manual action. "
msgstr ""
+"Ez a következő elvégezni kívánt művelet. Ez automatikusan beállított amint "
+"a partner elér egy olyan fizetési-emlékeztető szintet, ami kézi beavatkozást "
+"igényel. "
#. module: account_followup
#: view:res.partner:0
msgid "No Responsible"
-msgstr ""
+msgstr "Nincs felelős"
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line2
@@ -158,6 +161,24 @@ msgid ""
"\n"
"Best Regards,\n"
msgstr ""
+"\n"
+"Tisztelt %(partner_name)s,\n"
+"\n"
+"Csalódottan vettük tudomásul, és ezért fizetési-emlékeztetőt vagyunk "
+"kénytelenek küldeni, mivel a számlája már régebben esedékessé vált.\n"
+"\n"
+"Fontos, hogy azonnal fizessenek, egyéb esetben kénytelenek vagyunk elbírálni "
+"a számlájuk lezárását, ami azzal jár, hogy nem leszünk képesek időben "
+"szállítani az Önök vállalakozásának (termékeket/szolgáltatásokat).\n"
+"Kérjük Önöket a fizetés 8 napon belüli pontos teljesítésére.\n"
+"\n"
+"Ha a fizetéssel kapcsolatban probléma merült fel, amit mi nem vettünk "
+"figyelembe, akkor kérjük vegyék fel a könyvelési csoportunkkal a "
+"kapcsolatot, hogy elháríthassuk azt amilyen gyorsan csak lehet.\n"
+"\n"
+"A lejárt számlák részleteit lentebb találják.\n"
+"\n"
+"Üdvözlettel,\n"
#. module: account_followup
#: model:email.template,body_html:account_followup.email_template_account_followup_level0
@@ -195,6 +216,39 @@ msgid ""
"</div>\n"
" "
msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+"\n"
+" <p>Tisztelt ${object.name},</p>\n"
+" <p>\n"
+" Ha időközben kiegyenlítésre került, vagy a mi hibánkból adódóan téves, "
+"akkor tárgytalan, \n"
+"de adataink szerint a következő tétel kifizetés nélkül maradt. \n"
+"Kérjük Önöket a fizetés 8 napon belüli pontos teljesítésére.\n"
+"\n"
+"Ha a levél elküldése előtt a fizetés már megtörtént akkor kérjük tekintsék "
+"ezt tárgytalannak. Kérjük vegyék fel a kapcsolatot könyvelési "
+"csoportunkkal. \n"
+"\n"
+" </p>\n"
+"<br/>\n"
+"Üdvözlettel,\n"
+"<br/>\n"
+" <br/>\n"
+"${user.name}\n"
+"\n"
+"<br/>\n"
+"<br/>\n"
+"\n"
+"\n"
+"${object.get_followup_table_html() | safe}\n"
+"\n"
+" <br/>\n"
+"\n"
+"</div>\n"
+" "
#. module: account_followup
#: view:account_followup.stat.by.partner:0
@@ -209,17 +263,17 @@ msgstr "Tartozik összesen"
#. module: account_followup
#: field:res.partner,payment_next_action:0
msgid "Next Action"
-msgstr ""
+msgstr "Következő művelet"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid ": Partner Name"
-msgstr ""
+msgstr ": Partner neve"
#. module: account_followup
#: field:account_followup.followup.line,manual_action_responsible_id:0
msgid "Assign a Responsible"
-msgstr ""
+msgstr "Jelöljön ki egy felelőst"
#. module: account_followup
#: view:account_followup.followup:0
@@ -255,6 +309,16 @@ msgid ""
" same customer, the actions of the most \n"
" overdue invoice will be executed."
msgstr ""
+"Egy vevő kifizetetlen számlájának emlékeztetésére,\n"
+" meghatározhat különböző műveleteket a vevő késedel-\n"
+" métől függően. Ezek a műveletek fizetési-emlékeztető "
+"szintekbe\n"
+" csoportosítottak, melyek a számla fizetési határidő "
+"dátumától\n"
+" számított bizonyos napokon lesznek kapcsolva.\n"
+" Ha több lejárt számlája is van ugyanannak a \n"
+" vevőnek, akkor a leghosszabb nappal lejárt művelet \n"
+" lesz elvégezve."
#. module: account_followup
#: report:account_followup.followup.print:0
@@ -269,7 +333,7 @@ msgstr "Partnerek"
#. module: account_followup
#: sql_constraint:account_followup.followup:0
msgid "Only one follow-up per company is allowed"
-msgstr ""
+msgstr "Vállalatonként csak egy fizetési-emlékeztető engedélyezett"
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:254
@@ -280,12 +344,12 @@ msgstr "Fizetési emlékeztető"
#. module: account_followup
#: help:account_followup.followup.line,send_letter:0
msgid "When processing, it will print a letter"
-msgstr ""
+msgstr "Ha el lesz végeve, akkor levelet fog nyomtatni"
#. module: account_followup
#: field:res.partner,payment_earliest_due_date:0
msgid "Worst Due Date"
-msgstr ""
+msgstr "Legroszabb leghoszabb lejárati idő"
#. module: account_followup
#: view:account_followup.stat:0
@@ -295,17 +359,17 @@ msgstr "Nem peresített"
#. module: account_followup
#: view:account_followup.print:0
msgid "Send emails and generate letters"
-msgstr ""
+msgstr "Küldjön e-mail-t és hozzon létre levelet"
#. module: account_followup
#: model:ir.actions.act_window,name:account_followup.action_customer_followup
msgid "Manual Follow-Ups"
-msgstr ""
+msgstr "Kézi fizetési-emlékeztető"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "%(partner_name)s"
-msgstr ""
+msgstr "%(partner_name)s"
#. module: account_followup
#: model:email.template,body_html:account_followup.email_template_account_followup_level1
@@ -347,6 +411,40 @@ msgid ""
"</div>\n"
" "
msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+" \n"
+" <p>Dear ${object.name},</p>\n"
+" <p>\n"
+" Csalódottan vettük tudomásul, és ezért fizetési-emlékeztetőt vagyunk "
+"kénytelenek küldeni, mivel a számlája már régebben esedékessé vált.Fontos, "
+"hogy azonnal fizessenek, egyéb esetben kénytelenek vagyunk elbírálni a "
+"számlájuk lezárását, ami azzal jár, hogy nem leszünk képesek időben "
+"szállítani az Önök vállalakozásának (termékeket/szolgáltatásokat).\n"
+"Kérjük Önöket a fizetés 8 napon belüli pontos teljesítésére.\n"
+"Ha a fizetéssel kapcsolatban probléma merült fel, amit mi nem vettünk "
+"figyelembe, akkor kérjük vegyék fel a könyvelési csoportunkkal a "
+"kapcsolatot, hogy elháríthassuk azt amilyen gyorsan csak lehet.\n"
+"A lejárt számlák részleteit lentebb találják.\n"
+" </p>\n"
+"<br/>\n"
+"Üdvözlettel,\n"
+" \n"
+"<br/>\n"
+"<br/>\n"
+"${user.name}\n"
+" \n"
+"<br/>\n"
+"<br/>\n"
+"\n"
+"${object.get_followup_table_html() | safe}\n"
+"\n"
+" <br/>\n"
+"\n"
+"</div>\n"
+" "
#. module: account_followup
#: field:account_followup.stat,debit:0
@@ -356,49 +454,49 @@ msgstr "Tartozik"
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_stat
msgid "Follow-up Statistics"
-msgstr ""
+msgstr "Fizetési-emlékeztető statisztikák"
#. module: account_followup
#: view:res.partner:0
msgid "Send Overdue Email"
-msgstr ""
+msgstr "Lejárt dátumú fizetésről e-mail emlékeztető küldése"
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_followup_line
msgid "Follow-up Criteria"
-msgstr ""
+msgstr "Fizetési-emlékeztető kritériom"
#. module: account_followup
#: help:account_followup.followup.line,sequence:0
msgid "Gives the sequence order when displaying a list of follow-up lines."
-msgstr "Megadja a fizetési emlékeztető sorok listázási sorrendjét."
+msgstr "Megadja a fizetési-emlékeztető sorok listázási sorrendjét."
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:166
#, python-format
msgid " will be sent"
-msgstr ""
+msgstr " el lesz küldve"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid ": User's Company Name"
-msgstr ""
+msgstr ": Felhasználó vállalata neve"
#. module: account_followup
#: view:account_followup.followup.line:0
#: field:account_followup.followup.line,send_letter:0
msgid "Send a Letter"
-msgstr ""
+msgstr "Levél küldése"
#. module: account_followup
#: model:ir.actions.act_window,name:account_followup.action_account_followup_definition_form
msgid "Payment Follow-ups"
-msgstr ""
+msgstr "fizetési-emlékeztetők kifizetése"
#. module: account_followup
#: field:account_followup.followup.line,delay:0
msgid "Due Days"
-msgstr ""
+msgstr "Határidő túllépése napokban"
#. module: account_followup
#: field:account.move.line,followup_line_id:0
@@ -414,12 +512,12 @@ msgstr "Legutolsó fizetési emlékeztető"
#. module: account_followup
#: model:ir.ui.menu,name:account_followup.menu_manual_reconcile_followup
msgid "Reconcile Invoices & Payments"
-msgstr ""
+msgstr "Számlák & Fizetések párosítása"
#. module: account_followup
#: model:ir.ui.menu,name:account_followup.account_followup_s
msgid "Do Manual Follow-Ups"
-msgstr ""
+msgstr "Kézi fizetési-emlékeztető elvégzése"
#. module: account_followup
#: report:account_followup.followup.print:0
@@ -429,17 +527,17 @@ msgstr "P."
#. module: account_followup
#: field:account_followup.print,email_conf:0
msgid "Send Email Confirmation"
-msgstr ""
+msgstr "E-mail megerősítés küldése"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Follow-up Entries with period in current year"
-msgstr ""
+msgstr "Fizetési-emlékeztető bejegyzések a tárgyi évben"
#. module: account_followup
#: field:account_followup.stat.by.partner,date_followup:0
msgid "Latest follow-up"
-msgstr ""
+msgstr "Legutóbbi fizetési-emlékeztető"
#. module: account_followup
#: field:account_followup.print,partner_lang:0
@@ -450,12 +548,12 @@ msgstr "E-mail küldése a partner nyelvén"
#: code:addons/account_followup/wizard/account_followup_print.py:169
#, python-format
msgid " email(s) sent"
-msgstr ""
+msgstr " e-mail(ek) elküldve"
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_print
msgid "Print Follow-up & Send Mail to Customers"
-msgstr ""
+msgstr "Fizetési-emlékeztető nyomtatása & E-mail küldése a vevők részére"
#. module: account_followup
#: field:account_followup.followup.line,description:0
@@ -466,12 +564,12 @@ msgstr "Kinyomtatott üzenet"
#: code:addons/account_followup/wizard/account_followup_print.py:155
#, python-format
msgid "Anybody"
-msgstr ""
+msgstr "Bárki"
#. module: account_followup
#: help:account_followup.followup.line,send_email:0
msgid "When processing, it will send an email"
-msgstr ""
+msgstr "végrehajtáskor egy e-mailt fog küldeni"
#. module: account_followup
#: view:account_followup.stat.by.partner:0
@@ -481,7 +579,7 @@ msgstr "Emlékeztetendő partner"
#. module: account_followup
#: view:res.partner:0
msgid "Print Overdue Payments"
-msgstr ""
+msgstr "Határidőn túli fizetések nyomtatása"
#. module: account_followup
#: field:account_followup.followup.line,followup_id:0
@@ -494,11 +592,12 @@ msgstr "Fizetési emlékeztetők"
#, python-format
msgid "Email not sent because of email address of partner not filled in"
msgstr ""
+"E-mail nem lett elküldve, mert a partner e-mail címe nem lett kitöltve"
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_followup
msgid "Account Follow-up"
-msgstr ""
+msgstr "Fizetési-emlékeztető könyvelés"
#. module: account_followup
#: help:res.partner,payment_responsible_id:0
@@ -506,11 +605,13 @@ msgid ""
"Optionally you can assign a user to this field, which will make him "
"responsible for the action."
msgstr ""
+"Választhat felhasználót is erre a mezőre, ami felelőssé teszi erre a "
+"műveletre."
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_sending_results
msgid "Results from the sending of the different letters and emails"
-msgstr ""
+msgstr "A különböző levelek és e-mailek küldéséből származó eredmény"
#. module: account_followup
#: constraint:account_followup.followup.line:0
@@ -518,27 +619,29 @@ msgid ""
"Your description is invalid, use the right legend or %% if you want to use "
"the percent character."
msgstr ""
+"A leírása érvénytelen, használja a jobb oldali feliratot vagy %% ha akarja a "
+"százalék karaktert használja."
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:172
#, python-format
msgid " manual action(s) assigned:"
-msgstr ""
+msgstr " kézi művelet(ek) hozzárendelve:"
#. module: account_followup
#: view:res.partner:0
msgid "Search Partner"
-msgstr ""
+msgstr "Partner keresés"
#. module: account_followup
#: model:ir.ui.menu,name:account_followup.account_followup_print_menu
msgid "Send Letters and Emails"
-msgstr ""
+msgstr "Levelek és E-mailek küldése"
#. module: account_followup
#: view:account_followup.followup:0
msgid "Search Follow-up"
-msgstr ""
+msgstr "Fizetési-emlékeztető keresése"
#. module: account_followup
#: view:res.partner:0
@@ -549,12 +652,12 @@ msgstr ""
#: code:addons/account_followup/wizard/account_followup_print.py:237
#, python-format
msgid "Send Letters and Emails: Actions Summary"
-msgstr ""
+msgstr "Levelek és E-mailek küldése: Műveletek összegzése"
#. module: account_followup
#: view:account_followup.print:0
msgid "or"
-msgstr ""
+msgstr "vagy"
#. module: account_followup
#: view:res.partner:0
@@ -562,21 +665,23 @@ msgid ""
"If not specified by the latest follow-up level, it will send from the "
"default email template"
msgstr ""
+"Ha nincs meghatározva a legutóbbi fizetési-emlékeztető szinttel, akkor az "
+"alapértelmezett e-mail sablonnal lesz elküldve"
#. module: account_followup
#: sql_constraint:account_followup.followup.line:0
msgid "Days of the follow-up levels must be different"
-msgstr ""
+msgstr "A fizetési-emlékeztető szintek napjainak különbözőeknek kell lenniük"
#. module: account_followup
#: view:res.partner:0
msgid "Click to mark the action as done."
-msgstr ""
+msgstr "Kattintson a művelet elvégzésének jelülésére."
#. module: account_followup
#: model:ir.ui.menu,name:account_followup.menu_action_followup_stat_follow
msgid "Follow-Ups Analysis"
-msgstr ""
+msgstr "Fizetési-emlékeztető elemzések"
#. module: account_followup
#: help:res.partner,payment_next_action_date:0
@@ -586,11 +691,16 @@ msgid ""
"action. Can be practical to set manually e.g. to see if he keeps his "
"promises."
msgstr ""
+"Ez az amikor kézi fizetési-emlékeztető szükséges. A mai nap lesz beállítva, "
+"ha a partner egy olyan fizetési-emlékeztető szintet kap ami kézi "
+"beavatkozást igényel. Praktikus lehet kézire állítani pl. megfigyelni, hogy "
+"betartja-e a szavát."
#. module: account_followup
#: view:res.partner:0
msgid "Print overdue payments report independent of follow-up line"
msgstr ""
+"fizetési-emlékeztető soroktól független lejárt fizetési tételek nyomtatása"
#. module: account_followup
#: help:account_followup.print,date:0
@@ -609,7 +719,7 @@ msgstr "Fizetési emlékeztető küldés időpontja"
#: view:res.partner:0
#: field:res.partner,payment_responsible_id:0
msgid "Follow-up Responsible"
-msgstr ""
+msgstr "Fizetési-emlékeztető felelőse"
#. module: account_followup
#: model:email.template,body_html:account_followup.email_template_account_followup_level2
@@ -646,6 +756,37 @@ msgid ""
"</div>\n"
" "
msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+" \n"
+" <p>Dear ${object.name},</p>\n"
+" <p>\n"
+" A többszörös fizetési-emlékeztető ellenére, még mindig nem történt meg a "
+"számla kiegyenlítése.\n"
+"Ha nem történik meg a kiegyenlítés 8 napon belül, törvényes úton vagyunk "
+"kénytelenek az adósságot behajtani, minden további felszólítás nélkül.\n"
+"Úgy gondoljuk, hogy ez nem lesz szükséges lépés a lenti részletekkel "
+"kapcsolatban.\n"
+"Az üggyel kapcsolatban felmerült kérdésekben, kérjük vegyék fel a "
+"kapcsolatot a könyvelési csoportunkkal.\n"
+"</p>\n"
+"<br/>\n"
+"Tisztelttel,\n"
+"<br/>\n"
+"<br/>\n"
+"${user.name}\n"
+"<br/>\n"
+"<br/>\n"
+"\n"
+"\n"
+"${object.get_followup_table_html() | safe}\n"
+"\n"
+" <br/>\n"
+"\n"
+"</div>\n"
+" "
#. module: account_followup
#: report:account_followup.followup.print:0
@@ -655,7 +796,7 @@ msgstr "Bizonylat: vevő folyószámla kivonat"
#. module: account_followup
#: model:ir.ui.menu,name:account_followup.account_followup_menu
msgid "Follow-up Levels"
-msgstr ""
+msgstr "Fizetési-emlékeztető szintek"
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line4
@@ -678,40 +819,54 @@ msgid ""
"Best Regards,\n"
" "
msgstr ""
+"\n"
+"Tisztelt %(partner_name)s,\n"
+"\n"
+"A többszörös fizetési-emlékeztető ellenére, még mindig nem történt meg a "
+"számla kiegyenlítése.\n"
+"Ha nem történik meg a kiegyenlítés 8 napon belül, törvényes úton vagyunk "
+"kénytelenek az adósságot behajtani, minden további felszólítás nélkül.\n"
+"Úgy gondoljuk, hogy ez nem lesz szükséges lépés a lenti részletekkel "
+"kapcsolatban.\n"
+"Az üggyel kapcsolatban felmerült kérdésekben, kérjük vegyék fel a "
+"kapcsolatot a könyvelési csoportunkkal.\n"
+"\n"
+"Üdvözlettel,\n"
+" "
#. module: account_followup
#: field:res.partner,payment_amount_due:0
msgid "Amount Due"
-msgstr ""
+msgstr "Esedékes összeg"
#. module: account_followup
#: field:account.move.line,followup_date:0
msgid "Latest Follow-up"
-msgstr "Legutolsó fizetési emlékeztető"
+msgstr "Legutobbi fizetési emlékeztető"
#. module: account_followup
#: view:account_followup.sending.results:0
msgid "Download Letters"
-msgstr ""
+msgstr "Levelek letöltése"
#. module: account_followup
#: field:account_followup.print,company_id:0
#: field:res.partner,unreconciled_aml_ids:0
msgid "unknown"
-msgstr ""
+msgstr "ismeretlen"
#. module: account_followup
#: code:addons/account_followup/account_followup.py:314
#, python-format
msgid "Printed overdue payments report"
-msgstr ""
+msgstr "Lejárt fizetési tételek jelentésének nyomtatása"
#. module: account_followup
#: help:account_followup.followup.line,manual_action:0
msgid ""
"When processing, it will set the manual action to be taken for that "
"customer. "
-msgstr ""
+msgstr "Végrehajtáskor, a vevőhöz a kézi műveletet fogja beállítani. "
#. module: account_followup
#: view:res.partner:0
@@ -721,18 +876,25 @@ msgid ""
" order to exclude it from the next follow-up "
"actions."
msgstr ""
+"Alább a vevő ügyleteinek története.\n"
+" Ellenőrizheti a \"Nincs fizetési-emlékeztető\" "
+"soron\n"
+" a következő fizetési-emlékeztető műveletekből "
+"való kizárását."
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:171
#, python-format
msgid " email(s) should have been sent, but "
-msgstr ""
+msgstr " ki kellett volna küldeni az e-mail(ek)t, de "
#. module: account_followup
#: help:account_followup.print,test_print:0
msgid ""
"Check if you want to print follow-ups without changing follow-ups level."
msgstr ""
+"Ellenőrizze, hogy a fizetési-emlékeztető szintek változtatása nélkül "
+"szeretné a fizetési-emlékeztetők nyomtatást."
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_move_line
@@ -742,12 +904,12 @@ msgstr "Könyvelési tételsorok"
#. module: account_followup
#: report:account_followup.followup.print:0
msgid "Total:"
-msgstr ""
+msgstr "Összesen:"
#. module: account_followup
#: field:account_followup.followup.line,email_template_id:0
msgid "Email Template"
-msgstr ""
+msgstr "E-mail sablon"
#. module: account_followup
#: field:account_followup.print,summary:0
@@ -758,7 +920,7 @@ msgstr "Összegzés"
#: view:account_followup.followup.line:0
#: field:account_followup.followup.line,send_email:0
msgid "Send an Email"
-msgstr ""
+msgstr "Egy E-amil küldése"
#. module: account_followup
#: field:account_followup.stat,credit:0
@@ -768,7 +930,7 @@ msgstr "Követel"
#. module: account_followup
#: field:res.partner,payment_amount_overdue:0
msgid "Amount Overdue"
-msgstr ""
+msgstr "Lejárt összeg"
#. module: account_followup
#: help:res.partner,latest_followup_level_id_without_lit:0
@@ -776,12 +938,14 @@ msgid ""
"The maximum follow-up level without taking into account the account move "
"lines with litigation"
msgstr ""
+"A maximum fizetési-emlékeztető szint ami megtehető anélkül, hogy az ne "
+"kerüljön peres eléjárásra"
#. module: account_followup
#: view:account_followup.stat:0
#: field:res.partner,latest_followup_date:0
msgid "Latest Follow-up Date"
-msgstr ""
+msgstr "Legutóbbi fizetési-emlékeztető dátuma."
#. module: account_followup
#: model:email.template,body_html:account_followup.email_template_account_followup_default
@@ -814,6 +978,34 @@ msgid ""
"</div>\n"
" "
msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+" \n"
+" <p>Tisztelt ${object.name},</p>\n"
+" <p>\n"
+" Ha időközben kiegyenlítésre került, vagy a mi hibánkból adódóan téves, "
+"akkor tárgytalan, \n"
+"de adataink szerint a következő tétel kifizetés nélkül maradt. \n"
+"Kérjük Önöket a fizetés 8 napon belüli pontos teljesítésére.\n"
+"Ha a levél elküldése előtt a fizetés már megtörtént akkor kérjük tekintsék "
+"ezt tárgytalannak. Kérjük vegyék fel a kapcsolatot könyvelési "
+"csoportunkkal. \n"
+" </p>\n"
+"<br/>\n"
+"Üdvözlettel,\n"
+"<br/>\n"
+"<br/>\n"
+"${user.name}\n"
+"<br/>\n"
+"<br/>\n"
+"\n"
+"${object.get_followup_table_html() | safe}\n"
+"\n"
+"<br/>\n"
+"</div>\n"
+" "
#. module: account_followup
#: field:account.move.line,result:0
@@ -826,17 +1018,17 @@ msgstr "Egyenleg"
#. module: account_followup
#: help:res.partner,payment_note:0
msgid "Payment Note"
-msgstr ""
+msgstr "Megjegyzés a fizetéshez"
#. module: account_followup
#: view:res.partner:0
msgid "My Follow-ups"
-msgstr ""
+msgstr "Fizetési-emlékeztetőim"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "%(company_name)s"
-msgstr ""
+msgstr "%(company_name)s"
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line1
@@ -854,6 +1046,18 @@ msgid ""
"\n"
"Best Regards,\n"
msgstr ""
+"\n"
+"Dear %(partner_name)s,\n"
+"\n"
+" Ha időközben kiegyenlítésre került, vagy a mi hibánkból adódóan téves, "
+"akkor tárgytalan, de adataink szerint a következő tétel kifizetés nélkül "
+"maradt. Kérjük Önöket a fizetés 8 napon belüli pontos teljesítésére.\n"
+"\n"
+"Ha a levél elküldése előtt a fizetés már megtörtént akkor kérjük tekintsék "
+"ezt tárgytalannak. Kérjük vegyék fel a kapcsolatot könyvelési "
+"csoportunkkal. \n"
+"\n"
+"Üdvözlettel,\n"
#. module: account_followup
#: field:account_followup.stat,date_move_last:0
@@ -870,12 +1074,12 @@ msgstr "Időszak"
#: code:addons/account_followup/wizard/account_followup_print.py:228
#, python-format
msgid "%s partners have no credits and as such the action is cleared"
-msgstr ""
+msgstr "%s a partnernek nincs hitele azért a művelet törölve lett"
#. module: account_followup
#: model:ir.actions.report.xml,name:account_followup.account_followup_followup_report
msgid "Follow-up Report"
-msgstr ""
+msgstr "Fizetési-emlékeztető jelentés"
#. module: account_followup
#: view:res.partner:0
@@ -883,6 +1087,8 @@ msgid ""
", the latest payment follow-up\n"
" was:"
msgstr ""
+", a legutóbbi fizetési-emlékeztető kifizetés\n"
+" ez volt:"
#. module: account_followup
#: view:account_followup.print:0
@@ -892,7 +1098,7 @@ msgstr "Mégse"
#. module: account_followup
#: view:account_followup.sending.results:0
msgid "Close"
-msgstr ""
+msgstr "Lezár"
#. module: account_followup
#: view:account_followup.stat:0
@@ -908,23 +1114,23 @@ msgstr "Maximális fizetési emlékeztető szint"
#: code:addons/account_followup/wizard/account_followup_print.py:171
#, python-format
msgid " had unknown email address(es)"
-msgstr ""
+msgstr " ismeretlen e-mail címe(i) van(nak)"
#. module: account_followup
#: view:res.partner:0
msgid "Responsible"
-msgstr ""
+msgstr "Felelős"
#. module: account_followup
#: model:ir.ui.menu,name:account_followup.menu_finance_followup
#: view:res.partner:0
msgid "Payment Follow-up"
-msgstr ""
+msgstr "Fizetési-emlékeztető kifizetés"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid ": Current Date"
-msgstr ""
+msgstr ": Jelenlegi dátum"
#. module: account_followup
#: view:account_followup.print:0
@@ -933,16 +1139,20 @@ msgid ""
" set the manual actions per customer, according to "
"the follow-up levels defined."
msgstr ""
+"Ez a művelet fizetési-emlékeztető e-mail küldéseket indít, levelet nyomtat "
+"és\n"
+" beállítja a vevőnkénti kézi műveletet, a fizetési-"
+"emlékeztető szintek beállításának megfelelően."
#. module: account_followup
#: field:account_followup.followup.line,name:0
msgid "Follow-Up Action"
-msgstr ""
+msgstr "Fizetési-emlékeztető művelet"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Including journal entries marked as a litigation"
-msgstr ""
+msgstr "Beleértve a peres megjelölésű jelentés bejegyzéseket"
#. module: account_followup
#: report:account_followup.followup.print:0
@@ -955,7 +1165,7 @@ msgstr "Megjegyzés"
#. module: account_followup
#: view:account_followup.sending.results:0
msgid "Summary of actions"
-msgstr ""
+msgstr "Műveletek összegzése"
#. module: account_followup
#: report:account_followup.followup.print:0
@@ -965,7 +1175,7 @@ msgstr "Hiv."
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "After"
-msgstr ""
+msgstr "Utána"
#. module: account_followup
#: view:account_followup.stat:0
@@ -975,7 +1185,7 @@ msgstr "Tárgyév"
#. module: account_followup
#: field:res.partner,latest_followup_level_id_without_lit:0
msgid "Latest Follow-up Level without litigation"
-msgstr ""
+msgstr "Legitóbbi per nélküli fizetési-emlékeztetőt szint"
#. module: account_followup
#: model:ir.actions.act_window,help:account_followup.action_account_manual_reconcile_receivable
@@ -985,6 +1195,10 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p>\n"
+" Nem talált jelentés tartalmat.\n"
+" </p>\n"
+" "
#. module: account_followup
#: view:account.move.line:0
@@ -994,7 +1208,7 @@ msgstr "Partner tételek"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Follow-up lines"
-msgstr ""
+msgstr "Fizetési emlékeztető sorok"
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line3
@@ -1015,6 +1229,21 @@ msgid ""
"\n"
"Best Regards,\n"
msgstr ""
+"\n"
+"Tisztelt %(partner_name)s,\n"
+"\n"
+" A többszörös fizetési-emlékeztető ellenére, még mindig nem történt meg a "
+"számla kiegyenlítése.\n"
+"Ha nem történik meg a kiegyenlítés 8 napon belül, törvényes úton vagyunk "
+"kénytelenek az adósságot behajtani, minden további felszólítás nélkül.\n"
+"\n"
+"Úgy gondoljuk, hogy ez nem lesz szükséges lépés a lenti részletekkel "
+"kapcsolatban.\n"
+"\n"
+"Az üggyel kapcsolatban felmerült kérdésekben, kérjük vegyék fel a "
+"kapcsolatot a könyvelési csoportunkkal.\n"
+"\n"
+"Üdvözlettel,\n"
#. module: account_followup
#: help:account_followup.print,partner_lang:0
@@ -1036,6 +1265,13 @@ msgid ""
"installed\n"
" using to top right icon."
msgstr ""
+"Írja ide ennek a levélnek a levél bemutatását,\n"
+" a fizetési-emlékeztető szint szerint. "
+"Használhatóak a\n"
+" következő kulcsszavak a szövegben. Meg kell "
+"lennie\n"
+" az összes jobb felső ikon szerinti nyelv "
+"fordításban is!"
#. module: account_followup
#: view:account_followup.stat:0
@@ -1051,7 +1287,7 @@ msgstr "Név"
#. module: account_followup
#: field:res.partner,latest_followup_level_id:0
msgid "Latest Follow-up Level"
-msgstr ""
+msgstr "Legitóbbi fizetési-emlékeztető szint"
#. module: account_followup
#: field:account_followup.stat,date_move:0
@@ -1062,23 +1298,23 @@ msgstr "Első tétel"
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_stat_by_partner
msgid "Follow-up Statistics by Partner"
-msgstr ""
+msgstr "Fizetési-emlékeztető partnerenkénti statisztika"
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:172
#, python-format
msgid " letter(s) in report"
-msgstr ""
+msgstr " level(ek) a jelentésben"
#. module: account_followup
#: view:res.partner:0
msgid "Partners with Overdue Credits"
-msgstr ""
+msgstr "Lejárt fizetési hitelekkel rendelkező partnerek"
#. module: account_followup
#: view:res.partner:0
msgid "Customer Followup"
-msgstr ""
+msgstr "Vevői fizetési-emlékeztető"
#. module: account_followup
#: model:ir.actions.act_window,help:account_followup.action_account_followup_definition_form
@@ -1094,22 +1330,33 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Kattintson a fizetési-emlékeztető szint és műveletének "
+"létrehozásához.\n"
+" </p><p>\n"
+" Minden lépéshez, határozza meg a műveletet amit a lejárat "
+"után annyi nappal el fog végezni.\n"
+" Lehetséges nyomtatás és e-mail sablon használatával egy "
+"üzenet eljuttatása a vevő\n"
+" részére.\n"
+" </p>\n"
+" "
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:166
#, python-format
msgid "Follow-up letter of "
-msgstr ""
+msgstr "Fizetési-emlékeztető levél ide "
#. module: account_followup
#: view:res.partner:0
msgid "The"
-msgstr ""
+msgstr "A"
#. module: account_followup
#: view:account_followup.print:0
msgid "Send follow-ups"
-msgstr ""
+msgstr "Fizetési-emlékeztető küldése"
#. module: account_followup
#: view:account.move.line:0
@@ -1124,7 +1371,7 @@ msgstr "Sorszám"
#. module: account_followup
#: view:res.partner:0
msgid "Follow-ups To Do"
-msgstr ""
+msgstr "Még végrehejtandó fizetési-emlékeztető"
#. module: account_followup
#: report:account_followup.followup.print:0
@@ -1143,26 +1390,30 @@ msgid ""
"the reminder. Could be negative if you want to send a polite alert "
"beforehand."
msgstr ""
+"A számla lejárati dátuma utáni napok száma, amíg várakozik a felszólítás "
+"küldése előtt. Negatív is lehet, ha egy udvarias levelet szeretne küldeni a "
+"lejárati dátumra vonatkozólag."
#. module: account_followup
#: help:res.partner,latest_followup_date:0
msgid "Latest date that the follow-up level of the partner was changed"
msgstr ""
+"Legutóbbi dátum amikor a vevőnek a fizetési-emlékeztető szintje változott"
#. module: account_followup
#: field:account_followup.print,test_print:0
msgid "Test Print"
-msgstr ""
+msgstr "Nyomtatás teszt"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid ": User Name"
-msgstr ""
+msgstr ": Felhasználó neve"
#. module: account_followup
#: view:res.partner:0
msgid "Accounting"
-msgstr ""
+msgstr "Könyvelés"
#. module: account_followup
#: field:account_followup.stat,blocked:0
@@ -1172,7 +1423,7 @@ msgstr "Zárolt"
#. module: account_followup
#: field:res.partner,payment_note:0
msgid "Customer Payment Promise"
-msgstr ""
+msgstr "Vevő fizetésre vonatkozó igérete"
#, python-format
#~ msgid "Follwoup Summary"
diff --git a/addons/account_followup/i18n/nl_BE.po b/addons/account_followup/i18n/nl_BE.po
index 1a92e60dfc9..64a73d776ef 100644
--- a/addons/account_followup/i18n/nl_BE.po
+++ b/addons/account_followup/i18n/nl_BE.po
@@ -1,20 +1,21 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
-# * account_followup
-#
+# * account_followup
+# Els Van Vossel <evv@agaplan.eu>, 2013.
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2010-12-17 09:57+0000\n"
-"Last-Translator: Niels Huylebroeck <Unknown>\n"
-"Language-Team: \n"
+"PO-Revision-Date: 2013-04-15 23:02+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
+"Language-Team: Els Van Vossel\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:11+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-17 05:15+0000\n"
+"X-Generator: Launchpad (build 16567)\n"
+"Language: nl\n"
#. module: account_followup
#: model:email.template,subject:account_followup.email_template_account_followup_default
@@ -22,12 +23,12 @@ msgstr ""
#: model:email.template,subject:account_followup.email_template_account_followup_level1
#: model:email.template,subject:account_followup.email_template_account_followup_level2
msgid "${user.company_id.name} Payment Reminder"
-msgstr ""
+msgstr "${user.company_id.name} Aanmaning"
#. module: account_followup
#: help:res.partner,latest_followup_level_id:0
msgid "The maximum follow-up level"
-msgstr ""
+msgstr "Het maximale aanmaningsniveau"
#. module: account_followup
#: view:account_followup.stat:0
@@ -43,33 +44,33 @@ msgstr "Aanmanen"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "%(date)s"
-msgstr ""
+msgstr "%(date)s"
#. module: account_followup
#: field:res.partner,payment_next_action_date:0
msgid "Next Action Date"
-msgstr ""
+msgstr "Volgende actiedatum"
#. module: account_followup
#: view:account_followup.followup.line:0
#: field:account_followup.followup.line,manual_action:0
msgid "Manual Action"
-msgstr ""
+msgstr "Manuele actie"
#. module: account_followup
#: field:account_followup.sending.results,needprinting:0
msgid "Needs Printing"
-msgstr ""
+msgstr "Moet worden afgedrukt"
#. module: account_followup
#: view:res.partner:0
msgid "⇾ Mark as Done"
-msgstr ""
+msgstr "⇾ Als Gedaan markeren"
#. module: account_followup
#: field:account_followup.followup.line,manual_action_note:0
msgid "Action To Do"
-msgstr ""
+msgstr "Uit te voeren actie"
#. module: account_followup
#: field:account_followup.followup,company_id:0
@@ -89,39 +90,39 @@ msgstr "Factuurdatum"
#. module: account_followup
#: field:account_followup.print,email_subject:0
msgid "Email Subject"
-msgstr "E-mail onderwerp"
+msgstr "E-mailonderwerp"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "%(user_signature)s"
-msgstr ""
+msgstr "%(user_signature)s"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "days overdue, do the following actions:"
-msgstr ""
+msgstr "dagen vervallen, voer volgende acties uit:"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "Follow-up Steps"
-msgstr ""
+msgstr "Aanmaningsstappen"
#. module: account_followup
#: field:account_followup.print,email_body:0
msgid "Email Body"
-msgstr ""
+msgstr "E-mailbericht"
#. module: account_followup
#: model:ir.actions.act_window,name:account_followup.action_account_followup_print
msgid "Send Follow-Ups"
-msgstr ""
+msgstr "Aanmaningen versturen"
#. module: account_followup
#: report:account_followup.followup.print:0
#: code:addons/account_followup/account_followup.py:263
#, python-format
msgid "Amount"
-msgstr ""
+msgstr "Bedrag"
#. module: account_followup
#: help:res.partner,payment_next_action:0
@@ -129,11 +130,14 @@ msgid ""
"This is the next action to be taken. It will automatically be set when the "
"partner gets a follow-up level that requires a manual action. "
msgstr ""
+"Dit is de volgende actie die moet worden ondernomen. Deze wordt automatisch "
+"ingesteld als de relatie een aanmaningsniveau bereikt waarvoor een manuele "
+"actie is vereist. "
#. module: account_followup
#: view:res.partner:0
msgid "No Responsible"
-msgstr ""
+msgstr "Niemand verantwoordelijk"
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line2
@@ -158,6 +162,24 @@ msgid ""
"\n"
"Best Regards,\n"
msgstr ""
+"\n"
+"Beste %(partner_name)s,\n"
+"\n"
+"Het spijt ons te moeten vaststellen dat, ondanks een eerdere aanmaning, u "
+"nog steeds een openstaand saldo hebt.\n"
+"\n"
+"Wij verzoeken u dringend het openstaande saldo te betalen. Bij gebrek aan "
+"betaling, zijn wij genoodzaakt de verdere levering van goederen en diensten "
+"stop te zetten.\n"
+"Gelieve de betalingen uit te voeren binnen de 8 dagen.\n"
+"\n"
+"Als er een probleem is rond de betaling waarvan wij niet op de hoogte zijn, "
+"kunt u steeds contact opnemen met onze boekhouding, zodat dit snel kan "
+"worden opgelost.\n"
+"\n"
+"Hierna vindt u een overzicht van de vervallen documenten.\n"
+"\n"
+"Hoogachtend,\n"
#. module: account_followup
#: model:email.template,body_html:account_followup.email_template_account_followup_level0
@@ -195,6 +217,38 @@ msgid ""
"</div>\n"
" "
msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+"\n"
+" <p>Beste ${object.name},</p>\n"
+" <p>\n"
+" Volgens onze informatie, heeft u nog een openstaand saldo. Wij verzoeken "
+"u het nodige te doen om deze betaling binnen de 8 dagen over te schrijven op "
+"onze rekening.\n"
+"\n"
+"Indien uw betaling deze e-mail heeft gekruist, mag u dit bericht als "
+"onbestaand beschouwen. Neem gerust contact op met onze boekhouding mocht u "
+"nog vragen hebben.\n"
+"\n"
+" </p>\n"
+"<br/>\n"
+"Met vriendelijke groeten,\n"
+"<br/>\n"
+" <br/>\n"
+"${user.name}\n"
+"\n"
+"<br/>\n"
+"<br/>\n"
+"\n"
+"\n"
+"${object.get_followup_table_html() | safe}\n"
+"\n"
+" <br/>\n"
+"\n"
+"</div>\n"
+" "
#. module: account_followup
#: view:account_followup.stat.by.partner:0
@@ -209,17 +263,17 @@ msgstr "Totaal debet"
#. module: account_followup
#: field:res.partner,payment_next_action:0
msgid "Next Action"
-msgstr ""
+msgstr "Volgende actie"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid ": Partner Name"
-msgstr ""
+msgstr "Relatienaam"
#. module: account_followup
#: field:account_followup.followup.line,manual_action_responsible_id:0
msgid "Assign a Responsible"
-msgstr ""
+msgstr "Duid iemand aan die verantwoordelijk is"
#. module: account_followup
#: view:account_followup.followup:0
@@ -231,7 +285,7 @@ msgstr "Aanmaning"
#. module: account_followup
#: report:account_followup.followup.print:0
msgid "VAT:"
-msgstr "BTW:"
+msgstr "Btw:"
#. module: account_followup
#: view:account_followup.stat:0
@@ -255,11 +309,24 @@ msgid ""
" same customer, the actions of the most \n"
" overdue invoice will be executed."
msgstr ""
+"Om klanten aan te manen tot betaling, kunt u\n"
+" verschillende acties instellen in functie van de "
+"grootte\n"
+" van het openstaand bedrag. Deze acties worden "
+"samengevoegd\n"
+" in aanmaningsniveaus die worden aangesproken als de\n"
+" vervaldatum van een factuur een ingesteld aantal "
+"dagen\n"
+" overschrijdt. Als de klant ook andere openstaande "
+"facturen heeft,\n"
+" worden de acties uitgevoerd in functie van het "
+"langst \n"
+" openstaande document."
#. module: account_followup
#: report:account_followup.followup.print:0
msgid "Date :"
-msgstr "Datum :"
+msgstr "Datum:"
#. module: account_followup
#: field:account_followup.print,partner_ids:0
@@ -269,43 +336,43 @@ msgstr "Relaties"
#. module: account_followup
#: sql_constraint:account_followup.followup:0
msgid "Only one follow-up per company is allowed"
-msgstr ""
+msgstr "Per bedrijf is maar een aanmaningsniveau toegelaten."
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:254
#, python-format
msgid "Invoices Reminder"
-msgstr "Facturen aanmaning"
+msgstr "Aanmaning facturen"
#. module: account_followup
#: help:account_followup.followup.line,send_letter:0
msgid "When processing, it will print a letter"
-msgstr ""
+msgstr "Bij verwerking wordt een brief gemaakt"
#. module: account_followup
#: field:res.partner,payment_earliest_due_date:0
msgid "Worst Due Date"
-msgstr ""
+msgstr "Slechtste vervaldatum"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Not Litigation"
-msgstr ""
+msgstr "Geen betwisting"
#. module: account_followup
#: view:account_followup.print:0
msgid "Send emails and generate letters"
-msgstr ""
+msgstr "Verstuur e-mails en maak brieven"
#. module: account_followup
#: model:ir.actions.act_window,name:account_followup.action_customer_followup
msgid "Manual Follow-Ups"
-msgstr ""
+msgstr "Manuele aanmaningen"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "%(partner_name)s"
-msgstr ""
+msgstr "%(partner_name)s"
#. module: account_followup
#: model:email.template,body_html:account_followup.email_template_account_followup_level1
@@ -347,6 +414,42 @@ msgid ""
"</div>\n"
" "
msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+" \n"
+" <p>Beste ${object.name},</p>\n"
+" <p>\n"
+" Het spijt ons te moeten vaststellen dat, ondanks een eerdere aanmaning, "
+"u nog steeds een openstaand saldo hebt.\n"
+"Wij verzoeken u dringend het openstaande saldo te betalen. Bij gebrek aan "
+"betaling, zijn wij genoodzaakt de verdere levering van goederen en diensten "
+"stop te zetten.\n"
+"Gelieve de betalingen uit te voeren binnen de 8 dagen.\n"
+"\n"
+"Als er een probleem is rond de betaling waarvan wij niet op de hoogte zijn, "
+"kunt u steeds contact opnemen met onze boekhouding, zodat dit snel kan "
+"worden opgelost.\n"
+"\n"
+"Hierna vindt u een overzicht van de vervallen documenten.\n"
+" </p>\n"
+"<br/>\n"
+"Hoogachtend,\n"
+" \n"
+"<br/>\n"
+"<br/>\n"
+"${user.name}\n"
+" \n"
+"<br/>\n"
+"<br/>\n"
+"\n"
+"${object.get_followup_table_html() | safe}\n"
+"\n"
+" <br/>\n"
+"\n"
+"</div>\n"
+" "
#. module: account_followup
#: field:account_followup.stat,debit:0
@@ -356,49 +459,49 @@ msgstr "Debet"
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_stat
msgid "Follow-up Statistics"
-msgstr ""
+msgstr "Aanmaningsstatistieken"
#. module: account_followup
#: view:res.partner:0
msgid "Send Overdue Email"
-msgstr ""
+msgstr "Aanmaningsmail sturen"
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_followup_line
msgid "Follow-up Criteria"
-msgstr ""
+msgstr "Aanmaningscriteria"
#. module: account_followup
#: help:account_followup.followup.line,sequence:0
msgid "Gives the sequence order when displaying a list of follow-up lines."
-msgstr "Bepaalt de volgorde bij het afbeelden van de aanmaningregels"
+msgstr "Bepaalt de volgorde bij het weergeven van de aanmaningslijnen."
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:166
#, python-format
msgid " will be sent"
-msgstr ""
+msgstr " wordt verstuurd"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid ": User's Company Name"
-msgstr ""
+msgstr "Bedrijfsnaam van gebruiker"
#. module: account_followup
#: view:account_followup.followup.line:0
#: field:account_followup.followup.line,send_letter:0
msgid "Send a Letter"
-msgstr ""
+msgstr "Brief sturen"
#. module: account_followup
#: model:ir.actions.act_window,name:account_followup.action_account_followup_definition_form
msgid "Payment Follow-ups"
-msgstr ""
+msgstr "Aanmaningen"
#. module: account_followup
#: field:account_followup.followup.line,delay:0
msgid "Due Days"
-msgstr ""
+msgstr "Dagen vervallen"
#. module: account_followup
#: field:account.move.line,followup_line_id:0
@@ -414,48 +517,48 @@ msgstr "Laatste aanmaning"
#. module: account_followup
#: model:ir.ui.menu,name:account_followup.menu_manual_reconcile_followup
msgid "Reconcile Invoices & Payments"
-msgstr ""
+msgstr "Facturen en betalingen afpunten"
#. module: account_followup
#: model:ir.ui.menu,name:account_followup.account_followup_s
msgid "Do Manual Follow-Ups"
-msgstr ""
+msgstr "Manuele aanmaningen uitvoeren"
#. module: account_followup
#: report:account_followup.followup.print:0
msgid "Li."
-msgstr ""
+msgstr "Bt."
#. module: account_followup
#: field:account_followup.print,email_conf:0
msgid "Send Email Confirmation"
-msgstr ""
+msgstr "Bevestiging per e-mail sturen"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Follow-up Entries with period in current year"
-msgstr ""
+msgstr "Aanmaningen met periode in huidig jaar"
#. module: account_followup
#: field:account_followup.stat.by.partner,date_followup:0
msgid "Latest follow-up"
-msgstr ""
+msgstr "Laatste aanmaning"
#. module: account_followup
#: field:account_followup.print,partner_lang:0
msgid "Send Email in Partner Language"
-msgstr "Stuur email-bericht in taal relatie"
+msgstr "Stuur e-mail in taal relatie"
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:169
#, python-format
msgid " email(s) sent"
-msgstr ""
+msgstr " e-mail(s) verstuurd"
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_print
msgid "Print Follow-up & Send Mail to Customers"
-msgstr ""
+msgstr "Aanmaningen afdrukken & mail sturen naar klanten"
#. module: account_followup
#: field:account_followup.followup.line,description:0
@@ -466,12 +569,12 @@ msgstr "Afgedrukt bericht"
#: code:addons/account_followup/wizard/account_followup_print.py:155
#, python-format
msgid "Anybody"
-msgstr ""
+msgstr "Iedereen"
#. module: account_followup
#: help:account_followup.followup.line,send_email:0
msgid "When processing, it will send an email"
-msgstr ""
+msgstr "Bij verwerking wordt een e-mail verstuurd"
#. module: account_followup
#: view:account_followup.stat.by.partner:0
@@ -481,7 +584,7 @@ msgstr "Relatie voor aanmaning"
#. module: account_followup
#: view:res.partner:0
msgid "Print Overdue Payments"
-msgstr ""
+msgstr "Vervallen documenten afdrukken"
#. module: account_followup
#: field:account_followup.followup.line,followup_id:0
@@ -494,11 +597,13 @@ msgstr "Aanmaningen"
#, python-format
msgid "Email not sent because of email address of partner not filled in"
msgstr ""
+"E-mail is niet verstuurd, omdat er voor de relatie geen e-mailadres is "
+"ingevuld."
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_followup
msgid "Account Follow-up"
-msgstr ""
+msgstr "Aanmaningen"
#. module: account_followup
#: help:res.partner,payment_responsible_id:0
@@ -506,11 +611,13 @@ msgid ""
"Optionally you can assign a user to this field, which will make him "
"responsible for the action."
msgstr ""
+"U kunt eventueel een gebruiker toewijzen aan dit veld. Dit betekent dat hij "
+"verantwoordelijk is voor deze actie."
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_sending_results
msgid "Results from the sending of the different letters and emails"
-msgstr ""
+msgstr "Resultaten van het versturen van brieven en e-mails"
#. module: account_followup
#: constraint:account_followup.followup.line:0
@@ -518,43 +625,45 @@ msgid ""
"Your description is invalid, use the right legend or %% if you want to use "
"the percent character."
msgstr ""
+"Uw beschrijving is niet geldig. Gebruik de juiste parameter of %% als u het "
+"percentageteken wilt gebruiken."
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:172
#, python-format
msgid " manual action(s) assigned:"
-msgstr ""
+msgstr " manuele actie(s) toegewezen"
#. module: account_followup
#: view:res.partner:0
msgid "Search Partner"
-msgstr ""
+msgstr "Relatie zoeken"
#. module: account_followup
#: model:ir.ui.menu,name:account_followup.account_followup_print_menu
msgid "Send Letters and Emails"
-msgstr ""
+msgstr "Brieven en e-mails sturen"
#. module: account_followup
#: view:account_followup.followup:0
msgid "Search Follow-up"
-msgstr ""
+msgstr "Aanmaningen zoeken"
#. module: account_followup
#: view:res.partner:0
msgid "Account Move line"
-msgstr ""
+msgstr "Boeking"
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:237
#, python-format
msgid "Send Letters and Emails: Actions Summary"
-msgstr ""
+msgstr "Brieven en e-mails sturen: overzicht acties"
#. module: account_followup
#: view:account_followup.print:0
msgid "or"
-msgstr ""
+msgstr "of"
#. module: account_followup
#: view:res.partner:0
@@ -562,21 +671,23 @@ msgid ""
"If not specified by the latest follow-up level, it will send from the "
"default email template"
msgstr ""
+"Indien dit niet is ingesteld via de laatste aanmaning, dan wordt de "
+"standaard e-mailsjabloon gebruikt."
#. module: account_followup
#: sql_constraint:account_followup.followup.line:0
msgid "Days of the follow-up levels must be different"
-msgstr ""
+msgstr "De dagen moeten verschillen per aanmaningsniveau."
#. module: account_followup
#: view:res.partner:0
msgid "Click to mark the action as done."
-msgstr ""
+msgstr "Klik om de actie als Gedaan te markeren."
#. module: account_followup
#: model:ir.ui.menu,name:account_followup.menu_action_followup_stat_follow
msgid "Follow-Ups Analysis"
-msgstr ""
+msgstr "Aanmaningsanalyse"
#. module: account_followup
#: help:res.partner,payment_next_action_date:0
@@ -586,11 +697,15 @@ msgid ""
"action. Can be practical to set manually e.g. to see if he keeps his "
"promises."
msgstr ""
+"Dit is als er manuele opvolging nodig is. De datum wordt ingesteld op de "
+"huidige datum als de relatie een aanmaningsniveau bereikt waarvoor een "
+"manuele handeling nodig is. Kan handig zijn om dit als manueel in te "
+"stellen, vb. om na te gaan of beloften worden nagekomen."
#. module: account_followup
#: view:res.partner:0
msgid "Print overdue payments report independent of follow-up line"
-msgstr ""
+msgstr "Aanmaningen afdrukken onafgezien van de aanmaningslijn."
#. module: account_followup
#: help:account_followup.print,date:0
@@ -609,7 +724,7 @@ msgstr "Verzenddatum aanmaning"
#: view:res.partner:0
#: field:res.partner,payment_responsible_id:0
msgid "Follow-up Responsible"
-msgstr ""
+msgstr "Verantwoordelijk voor aanmaning"
#. module: account_followup
#: model:email.template,body_html:account_followup.email_template_account_followup_level2
@@ -646,16 +761,48 @@ msgid ""
"</div>\n"
" "
msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+" \n"
+" <p>Beste ${object.name},</p>\n"
+" <p>\n"
+" Ondanks het feit dat wij u meerdere aanmaningen hebben gestuurd, is uw "
+"openstaand saldo nog steeds niet betaald.\n"
+"Indien de betaling ervan niet binnen de 8 dagen op onze rekening staat, "
+"schakelen wij een advocaat in om het verschuldigde saldo bij u te innen. U "
+"ontvangt hierover geen verdere communicatie.\n"
+"Wij gaan ervan uit dat deze stap niet nodig zal zijn. De details van de "
+"openstaande betalingen vindt u hierna.\n"
+"Aarzel niet contact op te nemen met onze boekhouding als u nog vragen "
+"heeft.\n"
+"</p>\n"
+"<br/>\n"
+"Hoogachtend,\n"
+"<br/>\n"
+"<br/>\n"
+"${user.name}\n"
+"<br/>\n"
+"<br/>\n"
+"\n"
+"\n"
+"${object.get_followup_table_html() | safe}\n"
+"\n"
+" <br/>\n"
+"\n"
+"</div>\n"
+" "
#. module: account_followup
#: report:account_followup.followup.print:0
msgid "Document : Customer account statement"
-msgstr ""
+msgstr "Document: Rekeninguittreksel"
#. module: account_followup
#: model:ir.ui.menu,name:account_followup.account_followup_menu
msgid "Follow-up Levels"
-msgstr ""
+msgstr "Aanmaningsniveaus"
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line4
@@ -678,11 +825,27 @@ msgid ""
"Best Regards,\n"
" "
msgstr ""
+"\n"
+"Beste %(partner_name)s,\n"
+"\n"
+"Ondanks meerdere aanmaningen, merken wij dat uw saldo nog steeds openstaat.\n"
+"\n"
+"Indien het openstaande saldo niet binnen 8 dagen op onze rekening is gestort "
+", zullen wij een advocaat inschakelen. Wij sturen in dat verband geen "
+"bericht meer.\n"
+"\n"
+"Wij gaan ervan uit dat deze actie niet nodig zal zijn. Details van de "
+"openstaande documenten vindt u hierbij.\n"
+"\n"
+"Aarzel niet contact op te nemen met de boekhouding als u nog vragen heeft.\n"
+"\n"
+"Hoogachtend,\n"
+" "
#. module: account_followup
#: field:res.partner,payment_amount_due:0
msgid "Amount Due"
-msgstr ""
+msgstr "Vervallen bedrag"
#. module: account_followup
#: field:account.move.line,followup_date:0
@@ -692,19 +855,19 @@ msgstr "Laatste aanmaning"
#. module: account_followup
#: view:account_followup.sending.results:0
msgid "Download Letters"
-msgstr ""
+msgstr "Brieven downloaden"
#. module: account_followup
#: field:account_followup.print,company_id:0
#: field:res.partner,unreconciled_aml_ids:0
msgid "unknown"
-msgstr ""
+msgstr "onbekend"
#. module: account_followup
#: code:addons/account_followup/account_followup.py:314
#, python-format
msgid "Printed overdue payments report"
-msgstr ""
+msgstr "Afgedrukt aanmaningsrapport"
#. module: account_followup
#: help:account_followup.followup.line,manual_action:0
@@ -712,6 +875,7 @@ msgid ""
"When processing, it will set the manual action to be taken for that "
"customer. "
msgstr ""
+"Bij verwerking zal de manuele actie voor die klant worden ingesteld. "
#. module: account_followup
#: view:res.partner:0
@@ -721,18 +885,25 @@ msgid ""
" order to exclude it from the next follow-up "
"actions."
msgstr ""
+"Hieronder vindt u een overzicht van de transacties voor deze\n"
+" klant. U kunt \"Stuur geen aanmaning\" kiezen "
+"om\n"
+" de factuur uit te sluiten van volgende "
+"aanmaningsacties."
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:171
#, python-format
msgid " email(s) should have been sent, but "
-msgstr ""
+msgstr " e-mail(s) zouden moeten zijn verstuurd, maar "
#. module: account_followup
#: help:account_followup.print,test_print:0
msgid ""
"Check if you want to print follow-ups without changing follow-ups level."
msgstr ""
+"Schakel dit veld in als u aanmaningen wilt afdrukken zonder het niveau te "
+"veranderen."
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_move_line
@@ -742,23 +913,23 @@ msgstr "Boekingen"
#. module: account_followup
#: report:account_followup.followup.print:0
msgid "Total:"
-msgstr ""
+msgstr "Totaal:"
#. module: account_followup
#: field:account_followup.followup.line,email_template_id:0
msgid "Email Template"
-msgstr ""
+msgstr "E-mailsjabloon"
#. module: account_followup
#: field:account_followup.print,summary:0
msgid "Summary"
-msgstr ""
+msgstr "Overzicht"
#. module: account_followup
#: view:account_followup.followup.line:0
#: field:account_followup.followup.line,send_email:0
msgid "Send an Email"
-msgstr ""
+msgstr "E-mail versturen"
#. module: account_followup
#: field:account_followup.stat,credit:0
@@ -768,7 +939,7 @@ msgstr "Krediet"
#. module: account_followup
#: field:res.partner,payment_amount_overdue:0
msgid "Amount Overdue"
-msgstr ""
+msgstr "Vervallen bedrag"
#. module: account_followup
#: help:res.partner,latest_followup_level_id_without_lit:0
@@ -776,12 +947,14 @@ msgid ""
"The maximum follow-up level without taking into account the account move "
"lines with litigation"
msgstr ""
+"Het maximale aanmaningsniveau, zonder rekening te houden met boekingen die "
+"worden betwist."
#. module: account_followup
#: view:account_followup.stat:0
#: field:res.partner,latest_followup_date:0
msgid "Latest Follow-up Date"
-msgstr ""
+msgstr "Datum laatste aanmaning"
#. module: account_followup
#: model:email.template,body_html:account_followup.email_template_account_followup_default
@@ -814,6 +987,33 @@ msgid ""
"</div>\n"
" "
msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+" \n"
+" <p>Beste ${object.name},</p>\n"
+" <p>\n"
+" Volgens onze administratie hebben wij het onderstaande bedrag nog niet "
+"ontvangen. Wij verzoeken\n"
+"u het verschuldigde bedrag uiterlijk binnen 8 dagen over te maken.\n"
+"Indien dit schrijven uw betaling heeft gekruist, kunt u deze herinnering als "
+"niet verzonden beschouwen.\n"
+"Voor meer info kunt u steeds contact opnemen met onze boekhouding.\n"
+" </p>\n"
+"<br/>\n"
+"Hoogachtend,\n"
+"<br/>\n"
+"<br/>\n"
+"${user.name}\n"
+"<br/>\n"
+"<br/>\n"
+"\n"
+"${object.get_followup_table_html() | safe}\n"
+"\n"
+"<br/>\n"
+"</div>\n"
+" "
#. module: account_followup
#: field:account.move.line,result:0
@@ -826,17 +1026,17 @@ msgstr "Saldo"
#. module: account_followup
#: help:res.partner,payment_note:0
msgid "Payment Note"
-msgstr ""
+msgstr "Betalingsbewijs"
#. module: account_followup
#: view:res.partner:0
msgid "My Follow-ups"
-msgstr ""
+msgstr "Mijn aanmaningen"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "%(company_name)s"
-msgstr ""
+msgstr "%(company_name)s"
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line1
@@ -854,28 +1054,40 @@ msgid ""
"\n"
"Best Regards,\n"
msgstr ""
+"\n"
+"Beste %(partner_name)s,\n"
+"\n"
+"Volgens onze administratie hebben wij het onderstaande bedrag nog niet "
+"ontvangen. Wij verzoeken u het verschuldigde bedrag binnen 8 dagen over te "
+"maken.\n"
+"\n"
+"Indien dit schrijven uw betaling heeft gekruist, kunt u deze herinnering als "
+"niet verzonden beschouwen.\n"
+"Voor meer info kunt u steeds contact opnemen met onze boekhouding.\n"
+"\n"
+"Hoogachtend,\n"
#. module: account_followup
#: field:account_followup.stat,date_move_last:0
#: field:account_followup.stat.by.partner,date_move_last:0
msgid "Last move"
-msgstr ""
+msgstr "Laatste boeking"
#. module: account_followup
#: field:account_followup.stat,period_id:0
msgid "Period"
-msgstr ""
+msgstr "Periode"
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:228
#, python-format
msgid "%s partners have no credits and as such the action is cleared"
-msgstr ""
+msgstr "%s relaties hebben geen schulden en de actie wordt gewist"
#. module: account_followup
#: model:ir.actions.report.xml,name:account_followup.account_followup_followup_report
msgid "Follow-up Report"
-msgstr ""
+msgstr "Aanmaningsrapport"
#. module: account_followup
#: view:res.partner:0
@@ -883,48 +1095,50 @@ msgid ""
", the latest payment follow-up\n"
" was:"
msgstr ""
+", het laatste aanmaningsniveau\n"
+" was:"
#. module: account_followup
#: view:account_followup.print:0
msgid "Cancel"
-msgstr ""
+msgstr "Annuleren"
#. module: account_followup
#: view:account_followup.sending.results:0
msgid "Close"
-msgstr ""
+msgstr "Afsluiten"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Litigation"
-msgstr ""
+msgstr "Betwist"
#. module: account_followup
#: field:account_followup.stat.by.partner,max_followup_id:0
msgid "Max Follow Up Level"
-msgstr ""
+msgstr "Max. aanmaningsniveau"
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:171
#, python-format
msgid " had unknown email address(es)"
-msgstr ""
+msgstr " had een onbekend e-mailadres"
#. module: account_followup
#: view:res.partner:0
msgid "Responsible"
-msgstr ""
+msgstr "Verantwoordelijke"
#. module: account_followup
#: model:ir.ui.menu,name:account_followup.menu_finance_followup
#: view:res.partner:0
msgid "Payment Follow-up"
-msgstr ""
+msgstr "Aanmaningen"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid ": Current Date"
-msgstr ""
+msgstr ": Huidige datum"
#. module: account_followup
#: view:account_followup.print:0
@@ -933,16 +1147,19 @@ msgid ""
" set the manual actions per customer, according to "
"the follow-up levels defined."
msgstr ""
+"Met deze actie stuurt u aanmaningsmails, kunt u brieven afdrukken en\n"
+" manuele acties instellen per klant, in functie van "
+"de ingestelde aanmaningsniveaus."
#. module: account_followup
#: field:account_followup.followup.line,name:0
msgid "Follow-Up Action"
-msgstr ""
+msgstr "Aanmaningsactie"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Including journal entries marked as a litigation"
-msgstr ""
+msgstr "Inclusief betwiste boekingen"
#. module: account_followup
#: report:account_followup.followup.print:0
@@ -955,7 +1172,7 @@ msgstr "Omschrijving"
#. module: account_followup
#: view:account_followup.sending.results:0
msgid "Summary of actions"
-msgstr ""
+msgstr "Overzicht van acties"
#. module: account_followup
#: report:account_followup.followup.print:0
@@ -965,17 +1182,17 @@ msgstr "Ref"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "After"
-msgstr ""
+msgstr "Na"
#. module: account_followup
#: view:account_followup.stat:0
msgid "This Fiscal year"
-msgstr ""
+msgstr "Dit boekjaar"
#. module: account_followup
#: field:res.partner,latest_followup_level_id_without_lit:0
msgid "Latest Follow-up Level without litigation"
-msgstr ""
+msgstr "Laatste aanmaningsniveau met betwisting"
#. module: account_followup
#: model:ir.actions.act_window,help:account_followup.action_account_manual_reconcile_receivable
@@ -985,16 +1202,20 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p>\n"
+" Geen boekingen gevonden.\n"
+" </p>\n"
+" "
#. module: account_followup
#: view:account.move.line:0
msgid "Partner entries"
-msgstr ""
+msgstr "Relatieboekingen"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Follow-up lines"
-msgstr ""
+msgstr "Aanmaningsregels"
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line3
@@ -1015,6 +1236,21 @@ msgid ""
"\n"
"Best Regards,\n"
msgstr ""
+"\n"
+"Beste %(partner_name)s,\n"
+"\n"
+"Ondanks eerdere aanmaningen, heeft u nog steeds een openstaand saldo.\n"
+"\n"
+"Als uw betaling binnen de 8 dagen opnieuw uitblijft, zijn wij genoodzaakt de "
+"vordering definitief uit handen te geven.\n"
+"\n"
+"Wij vertrouwen erop dat u het niet zover zult laten komen. Details van hety "
+"openstaande saldo vindt u hierna.\n"
+"\n"
+"Indien u nog vragen heeft, kunt u steeds contact opnemen met onze "
+"boekhouding.\n"
+"\n"
+"Hoogachtend,\n"
#. module: account_followup
#: help:account_followup.print,partner_lang:0
@@ -1022,6 +1258,8 @@ msgid ""
"Do not change message text, if you want to send email in partner language, "
"or configure from company"
msgstr ""
+"Wijzig de tekst niet als u de e-mail in de taal van de relatie wilt sturen, "
+"of stel de tekst in op firma."
#. module: account_followup
#: view:account_followup.followup.line:0
@@ -1034,12 +1272,18 @@ msgid ""
"installed\n"
" using to top right icon."
msgstr ""
+"Schrijf hier de inleiding van uw brief,\n"
+" in functie van het aanmaningsniveau. U kunt\n"
+" de volgende parameters in de tekst gebruiken. "
+"Vergeet\n"
+" niet all geïnstalleerde talen te vertalen via "
+"het pictogram in de rechterbovenhoek."
#. module: account_followup
#: view:account_followup.stat:0
#: model:ir.actions.act_window,name:account_followup.action_followup_stat
msgid "Follow-ups Sent"
-msgstr ""
+msgstr "Verstuurde aanmaningen"
#. module: account_followup
#: field:account_followup.followup,name:0
@@ -1049,34 +1293,34 @@ msgstr "Naam:"
#. module: account_followup
#: field:res.partner,latest_followup_level_id:0
msgid "Latest Follow-up Level"
-msgstr ""
+msgstr "Laatste aanmaningsniveau"
#. module: account_followup
#: field:account_followup.stat,date_move:0
#: field:account_followup.stat.by.partner,date_move:0
msgid "First move"
-msgstr ""
+msgstr "Eerste boeking"
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_stat_by_partner
msgid "Follow-up Statistics by Partner"
-msgstr ""
+msgstr "Aanmaningsstatistieken per relatie"
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:172
#, python-format
msgid " letter(s) in report"
-msgstr ""
+msgstr " brieven in rapport"
#. module: account_followup
#: view:res.partner:0
msgid "Partners with Overdue Credits"
-msgstr ""
+msgstr "Klanten met openstaande facturen"
#. module: account_followup
#: view:res.partner:0
msgid "Customer Followup"
-msgstr ""
+msgstr "Aanmaningen"
#. module: account_followup
#: model:ir.actions.act_window,help:account_followup.action_account_followup_definition_form
@@ -1092,42 +1336,52 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik als u de aanmaningsniveaus wilt instellen met de "
+"daaraan gekoppelde acties.\n"
+" </p><p>\n"
+" Per stap kunt u de acties opgeven en ook de dagen vervallen. "
+"U kunt\n"
+" brieven en e-mailsjablonen maken om specifieke berichten "
+"naar de klant te sturen.\n"
+" </p>\n"
+" "
#. module: account_followup
#: code:addons/account_followup/wizard/account_followup_print.py:166
#, python-format
msgid "Follow-up letter of "
-msgstr ""
+msgstr "Aanmaningsbrief van "
#. module: account_followup
#: view:res.partner:0
msgid "The"
-msgstr ""
+msgstr "De"
#. module: account_followup
#: view:account_followup.print:0
msgid "Send follow-ups"
-msgstr ""
+msgstr "Aanmaningen versturen"
#. module: account_followup
#: view:account.move.line:0
msgid "Total credit"
-msgstr ""
+msgstr "Totaal credit"
#. module: account_followup
#: field:account_followup.followup.line,sequence:0
msgid "Sequence"
-msgstr ""
+msgstr "Volgorde"
#. module: account_followup
#: view:res.partner:0
msgid "Follow-ups To Do"
-msgstr ""
+msgstr "Te versturen aanmaningen"
#. module: account_followup
#: report:account_followup.followup.print:0
msgid "Customer Ref :"
-msgstr ""
+msgstr "Klantenref.:"
#. module: account_followup
#: report:account_followup.followup.print:0
@@ -1141,26 +1395,30 @@ msgid ""
"the reminder. Could be negative if you want to send a polite alert "
"beforehand."
msgstr ""
+"Het aantal dagen dat de vervaldatum van de factuur moet zijn overschreden "
+"voordat een aanmaning wordt verstuurd. Kan negatief zijn als u vooraf een "
+"vriendelijk bericht wilt sturen."
#. module: account_followup
#: help:res.partner,latest_followup_date:0
msgid "Latest date that the follow-up level of the partner was changed"
msgstr ""
+"Laatste datum waarop het aanmaningsniveau van de relatie is gewijzigd."
#. module: account_followup
#: field:account_followup.print,test_print:0
msgid "Test Print"
-msgstr ""
+msgstr "Testafdruk"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid ": User Name"
-msgstr ""
+msgstr ": Gberuikersnaam"
#. module: account_followup
#: view:res.partner:0
msgid "Accounting"
-msgstr ""
+msgstr "Boekhouding"
#. module: account_followup
#: field:account_followup.stat,blocked:0
@@ -1170,7 +1428,7 @@ msgstr "Geblokkeerd"
#. module: account_followup
#: field:res.partner,payment_note:0
msgid "Customer Payment Promise"
-msgstr ""
+msgstr "Betalingsbelofte klant"
#~ msgid "All payable entries"
#~ msgstr "Alle crediteuren"
diff --git a/addons/account_followup/report/account_followup_report.py b/addons/account_followup/report/account_followup_report.py
index 9ca8d3c2332..8d120cb88ba 100644
--- a/addons/account_followup/report/account_followup_report.py
+++ b/addons/account_followup/report/account_followup_report.py
@@ -91,6 +91,5 @@ class account_followup_stat(osv.osv):
GROUP BY
l.id, l.partner_id, l.company_id, l.blocked, l.period_id
)""")
-account_followup_stat()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_followup/tests/test_account_followup.py b/addons/account_followup/tests/test_account_followup.py
index a421931665a..9e70430c518 100644
--- a/addons/account_followup/tests/test_account_followup.py
+++ b/addons/account_followup/tests/test_account_followup.py
@@ -5,8 +5,6 @@ import datetime
from openerp import tools
from openerp.tests.common import TransactionCase
-from openerp import netsvc
-
class TestAccountFollowup(TransactionCase):
def setUp(self):
""" setUp ***"""
diff --git a/addons/account_followup/wizard/account_followup_print.py b/addons/account_followup/wizard/account_followup_print.py
index 37b4300b03f..c14b5c071f6 100644
--- a/addons/account_followup/wizard/account_followup_print.py
+++ b/addons/account_followup/wizard/account_followup_print.py
@@ -72,7 +72,6 @@ class account_followup_stat_by_partner(osv.osv):
GROUP BY
l.partner_id, l.company_id
)""") #Blocked is to take into account litigation
-account_followup_stat_by_partner()
class account_followup_sending_results(osv.osv_memory):
@@ -106,7 +105,6 @@ class account_followup_sending_results(osv.osv_memory):
'description':_get_description,
}
-account_followup_sending_results()
class account_followup_print(osv.osv_memory):
@@ -315,6 +313,5 @@ class account_followup_print(osv.osv_memory):
to_update[str(id)]= {'level': fups[followup_line_id][1], 'partner_id': stat_line_id}
return {'partner_ids': partner_list, 'to_update': to_update}
-account_followup_print()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_payment/account_invoice.py b/addons/account_payment/account_invoice.py
index bcce77a54ce..8fa98780c83 100644
--- a/addons/account_payment/account_invoice.py
+++ b/addons/account_payment/account_invoice.py
@@ -42,6 +42,5 @@ class Invoice(osv.osv):
raise osv.except_osv(_('Error!'), _("You cannot cancel an invoice which has already been imported in a payment order. Remove it from the following payment order : %s."%(payment_order_name)))
return super(Invoice, self).action_cancel(cr, uid, ids, context=context)
-Invoice()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_payment/account_move_line.py b/addons/account_payment/account_move_line.py
index c601d9e8da3..266876db95f 100644
--- a/addons/account_payment/account_move_line.py
+++ b/addons/account_payment/account_move_line.py
@@ -57,6 +57,5 @@ class account_move_line(osv.osv):
raise osv.except_osv(_('Error!'), _('There is no partner defined on the entry line.'))
return line2bank
-account_move_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_payment/account_payment.py b/addons/account_payment/account_payment.py
index 2b0fe1271d2..dc001e2e2a3 100644
--- a/addons/account_payment/account_payment.py
+++ b/addons/account_payment/account_payment.py
@@ -62,7 +62,6 @@ class payment_mode(osv.osv):
return {'value': result}
-payment_mode()
class payment_order(osv.osv):
_name = 'payment.order'
@@ -170,7 +169,6 @@ class payment_order(osv.osv):
payment_line_obj.write(cr, uid, payment_line_ids, {'date': False}, context=context)
return super(payment_order, self).write(cr, uid, ids, vals, context=context)
-payment_order()
class payment_line(osv.osv):
_name = 'payment.line'
@@ -417,6 +415,5 @@ class payment_line(osv.osv):
res['communication2']['states']['normal'] = [('readonly', False)]
return res
-payment_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_payment/report/order.rml b/addons/account_payment/report/order.rml
index ca2315d81b1..02675baf0b2 100644
--- a/addons/account_payment/report/order.rml
+++ b/addons/account_payment/report/order.rml
@@ -253,10 +253,10 @@
<para style="terp_default_Centre_9">[[ get_invoice_name(line.ml_inv_ref.id) or '-' ]]</para>
</td>
<td>
- <para style="terp_default_Centre_9">[[line.date=='False' and '-' or formatLang(line.date,date=True) ]]</para>
+ <para style="terp_default_Centre_9">[[not line.date and '-' or formatLang(line.date,date=True) ]]</para>
</td>
<td>
- <para style="terp_default_Right_9">[[ formatLang(line.amount or '-', currency_obj=line.company_currency) ]] </para>
+ <para style="terp_default_Right_9">[[ formatLang(line.amount or 0.0, currency_obj=line.company_currency) ]] </para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang(line.amount_currency, currency_obj=line.currency) ]] </para>
diff --git a/addons/account_payment/test/account_payment_report.yml b/addons/account_payment/test/account_payment_report.yml
index 055e2804ee3..3def62de429 100644
--- a/addons/account_payment/test/account_payment_report.yml
+++ b/addons/account_payment/test/account_payment_report.yml
@@ -3,7 +3,8 @@
-
!python {model: payment.order}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.payment.order').create(cr, uid, [ref('payment_order_1')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('payment_order_1')], 'payment.order', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'account_payment-payment_order_report.'+format), 'wb+').write(data)
diff --git a/addons/account_payment/wizard/account_payment_order.py b/addons/account_payment/wizard/account_payment_order.py
index 4bd969726fe..08d36c45eff 100644
--- a/addons/account_payment/wizard/account_payment_order.py
+++ b/addons/account_payment/wizard/account_payment_order.py
@@ -118,6 +118,5 @@ class payment_order_create(osv.osv_memory):
'target': 'new',
}
-payment_order_create()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_payment/wizard/account_payment_pay.py b/addons/account_payment/wizard/account_payment_pay.py
index 03ff46125f5..5e2dc652068 100644
--- a/addons/account_payment/wizard/account_payment_pay.py
+++ b/addons/account_payment/wizard/account_payment_pay.py
@@ -54,6 +54,5 @@ class account_payment_make_payment(osv.osv_memory):
# id = obj_model.read(cr, uid, [result], ['res_id'])[0]['res_id']
# return obj_act.read(cr, uid, [id])[0]
-account_payment_make_payment()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_payment/wizard/account_payment_populate_statement.py b/addons/account_payment/wizard/account_payment_populate_statement.py
index edd47065e3a..92b1b1452f5 100644
--- a/addons/account_payment/wizard/account_payment_populate_statement.py
+++ b/addons/account_payment/wizard/account_payment_populate_statement.py
@@ -118,6 +118,5 @@ class account_payment_populate_statement(osv.osv_memory):
line_obj.write(cr, uid, [line.id], {'bank_statement_line_id': st_line_id})
return {'type': 'ir.actions.act_window_close'}
-account_payment_populate_statement()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_sequence/account_sequence.py b/addons/account_sequence/account_sequence.py
index 5b344600599..3b8b2335068 100644
--- a/addons/account_sequence/account_sequence.py
+++ b/addons/account_sequence/account_sequence.py
@@ -40,7 +40,6 @@ class account_move(osv.osv):
self.write(cr, uid, [move.id], {'internal_sequence_number': seq_no})
return res
-account_move()
class account_journal(osv.osv):
_inherit = "account.journal"
@@ -49,7 +48,6 @@ class account_journal(osv.osv):
'internal_sequence_id': fields.many2one('ir.sequence', 'Internal Sequence', help="This sequence will be used to maintain the internal number for the journal entries related to this journal."),
}
-account_journal()
class account_move_line(osv.osv):
_inherit = "account.move.line"
@@ -58,6 +56,5 @@ class account_move_line(osv.osv):
'internal_sequence_number': fields.related('move_id','internal_sequence_number', type='char', relation='account.move', help='Internal Sequence Number', string='Internal Number'),
}
-account_move_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_sequence/account_sequence_installer.py b/addons/account_sequence/account_sequence_installer.py
index e800bbad7ee..91316a61962 100644
--- a/addons/account_sequence/account_sequence_installer.py
+++ b/addons/account_sequence/account_sequence_installer.py
@@ -79,6 +79,5 @@ class account_sequence_installer(osv.osv_memory):
ir_values_obj.set(cr, uid, key='default', key2=False, name='internal_sequence_id', models =[('account.journal', False)], value=ir_seq)
return res
-account_sequence_installer()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_sequence/i18n/cs.po b/addons/account_sequence/i18n/cs.po
new file mode 100644
index 00000000000..480e6f5ff6b
--- /dev/null
+++ b/addons/account_sequence/i18n/cs.po
@@ -0,0 +1,150 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:43+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+#: model:ir.actions.act_window,name:account_sequence.action_account_seq_installer
+msgid "Account Sequence Application Configuration"
+msgstr ""
+
+#. module: account_sequence
+#: help:account.move,internal_sequence_number:0
+#: help:account.move.line,internal_sequence_number:0
+msgid "Internal Sequence Number"
+msgstr ""
+
+#. module: account_sequence
+#: help:account.sequence.installer,number_next:0
+msgid "Next number of this sequence"
+msgstr ""
+
+#. module: account_sequence
+#: field:account.sequence.installer,number_next:0
+msgid "Next Number"
+msgstr ""
+
+#. module: account_sequence
+#: field:account.sequence.installer,number_increment:0
+msgid "Increment Number"
+msgstr ""
+
+#. module: account_sequence
+#: help:account.sequence.installer,number_increment:0
+msgid "The next number of the sequence will be incremented by this number"
+msgstr ""
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+msgid "Configure Your Account Sequence Application"
+msgstr ""
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+msgid "Configure"
+msgstr ""
+
+#. module: account_sequence
+#: help:account.sequence.installer,suffix:0
+msgid "Suffix value of the record for the sequence"
+msgstr ""
+
+#. module: account_sequence
+#: field:account.sequence.installer,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: account_sequence
+#: field:account.sequence.installer,padding:0
+msgid "Number padding"
+msgstr ""
+
+#. module: account_sequence
+#: model:ir.model,name:account_sequence.model_account_move_line
+msgid "Journal Items"
+msgstr ""
+
+#. module: account_sequence
+#: field:account.move,internal_sequence_number:0
+#: field:account.move.line,internal_sequence_number:0
+msgid "Internal Number"
+msgstr ""
+
+#. module: account_sequence
+#: help:account.sequence.installer,padding:0
+msgid ""
+"OpenERP will automatically adds some '0' on the left of the 'Next Number' to "
+"get the required padding size."
+msgstr ""
+
+#. module: account_sequence
+#: field:account.sequence.installer,name:0
+msgid "Name"
+msgstr ""
+
+#. module: account_sequence
+#: field:account.journal,internal_sequence_id:0
+msgid "Internal Sequence"
+msgstr ""
+
+#. module: account_sequence
+#: help:account.sequence.installer,prefix:0
+msgid "Prefix value of the record for the sequence"
+msgstr ""
+
+#. module: account_sequence
+#: model:ir.model,name:account_sequence.model_account_move
+msgid "Account Entry"
+msgstr ""
+
+#. module: account_sequence
+#: field:account.sequence.installer,suffix:0
+msgid "Suffix"
+msgstr ""
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+msgid "title"
+msgstr ""
+
+#. module: account_sequence
+#: field:account.sequence.installer,prefix:0
+msgid "Prefix"
+msgstr ""
+
+#. module: account_sequence
+#: help:account.journal,internal_sequence_id:0
+msgid ""
+"This sequence will be used to maintain the internal number for the journal "
+"entries related to this journal."
+msgstr ""
+
+#. module: account_sequence
+#: model:ir.model,name:account_sequence.model_account_sequence_installer
+msgid "account.sequence.installer"
+msgstr ""
+
+#. module: account_sequence
+#: model:ir.model,name:account_sequence.model_account_journal
+msgid "Journal"
+msgstr ""
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+msgid "You can enhance the Account Sequence Application by installing ."
+msgstr ""
diff --git a/addons/account_test/account_test.py b/addons/account_test/account_test.py
index da7bb8e308d..98e27380837 100644
--- a/addons/account_test/account_test.py
+++ b/addons/account_test/account_test.py
@@ -56,5 +56,4 @@ class accounting_assert_test(osv.osv):
'sequence': 10,
}
-accounting_assert_test()
diff --git a/addons/account_test/i18n/cs.po b/addons/account_test/i18n/cs.po
new file mode 100644
index 00000000000..82c85a734dd
--- /dev/null
+++ b/addons/account_test/i18n/cs.po
@@ -0,0 +1,241 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:43+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid ""
+"Code should always set a variable named `result` with the result of your "
+"test, that can be a list or\n"
+"a dictionary. If `result` is an empty list, it means that the test was "
+"succesful. Otherwise it will\n"
+"try to translate and print what is inside `result`.\n"
+"\n"
+"If the result of your test is a dictionary, you can set a variable named "
+"`column_order` to choose in\n"
+"what order you want to print `result`'s content.\n"
+"\n"
+"Should you need them, you can also use the following variables into your "
+"code:\n"
+" * cr: cursor to the database\n"
+" * uid: ID of the current user\n"
+"\n"
+"In any ways, the code must be legal python statements with correct "
+"indentation (if needed).\n"
+"\n"
+"Example: \n"
+" sql = '''SELECT id, name, ref, date\n"
+" FROM account_move_line \n"
+" WHERE account_id IN (SELECT id FROM account_account WHERE type "
+"= 'view')\n"
+" '''\n"
+" cr.execute(sql)\n"
+" result = cr.dictfetchall()"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_02
+msgid "Test 2: Opening a fiscal year"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_05
+msgid ""
+"Check that reconciled invoice for Sales/Purchases has reconciled entries for "
+"Payable and Receivable Accounts"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_03
+msgid ""
+"Check if movement lines are balanced and have the same date and period"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,name:0
+msgid "Test Name"
+msgstr ""
+
+#. module: account_test
+#: report:account.test.assert.print:0
+msgid "Accouting tests on"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_01
+msgid "Test 1: General balance"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_06
+msgid "Check that paid/reconciled invoices are not in 'Open' state"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_05_2
+msgid ""
+"Check that reconciled account moves, that define Payable and Receivable "
+"accounts, are belonging to reconciled invoices"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Tests"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,desc:0
+msgid "Test Description"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Description"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_06_1
+msgid "Check that there's no move for any account with « View » account type"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_08
+msgid "Test 9 : Accounts and partners on account moves"
+msgstr ""
+
+#. module: account_test
+#: model:ir.actions.act_window,name:account_test.action_accounting_assert
+#: model:ir.actions.report.xml,name:account_test.account_assert_test_report
+#: model:ir.ui.menu,name:account_test.menu_action_license
+msgid "Accounting Tests"
+msgstr ""
+
+#. module: account_test
+#: code:addons/account_test/report/account_test_report.py:74
+#, python-format
+msgid "The test was passed successfully"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,active:0
+msgid "Active"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_06
+msgid "Test 6 : Invoices status"
+msgstr ""
+
+#. module: account_test
+#: model:ir.model,name:account_test.model_accounting_assert_test
+msgid "accounting.assert.test"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_05
+msgid ""
+"Test 5.1 : Payable and Receivable accountant lines of reconciled invoices"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,code_exec:0
+msgid "Python code"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_07
+msgid ""
+"Check on bank statement that the Closing Balance = Starting Balance + sum of "
+"statement lines"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_07
+msgid "Test 8 : Closing balance on bank statements"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_03
+msgid "Test 3: Movement lines"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_05_2
+msgid "Test 5.2 : Reconcilied invoices and Payable/Receivable accounts"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Expression"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_04
+msgid "Test 4: Totally reconciled mouvements"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_04
+msgid "Check if the totally reconciled movements are balanced"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_02
+msgid ""
+"Check if the balance of the new opened fiscal year matches with last year's "
+"balance"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Python Code"
+msgstr ""
+
+#. module: account_test
+#: model:ir.actions.act_window,help:account_test.action_accounting_assert
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create Accounting Test.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_01
+msgid "Check the balance: Debit sum = Credit sum"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_08
+msgid "Check that general accounts and partners on account moves are active"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_06_1
+msgid "Test 7: « View  » account type"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Code Help"
+msgstr ""
diff --git a/addons/account_test/i18n/hu.po b/addons/account_test/i18n/hu.po
new file mode 100644
index 00000000000..b2d8eb81feb
--- /dev/null
+++ b/addons/account_test/i18n/hu.po
@@ -0,0 +1,241 @@
+# Hungarian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-02 12:44+0000\n"
+"Last-Translator: krnkris <Unknown>\n"
+"Language-Team: Hungarian <hu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-03 05:26+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid ""
+"Code should always set a variable named `result` with the result of your "
+"test, that can be a list or\n"
+"a dictionary. If `result` is an empty list, it means that the test was "
+"succesful. Otherwise it will\n"
+"try to translate and print what is inside `result`.\n"
+"\n"
+"If the result of your test is a dictionary, you can set a variable named "
+"`column_order` to choose in\n"
+"what order you want to print `result`'s content.\n"
+"\n"
+"Should you need them, you can also use the following variables into your "
+"code:\n"
+" * cr: cursor to the database\n"
+" * uid: ID of the current user\n"
+"\n"
+"In any ways, the code must be legal python statements with correct "
+"indentation (if needed).\n"
+"\n"
+"Example: \n"
+" sql = '''SELECT id, name, ref, date\n"
+" FROM account_move_line \n"
+" WHERE account_id IN (SELECT id FROM account_account WHERE type "
+"= 'view')\n"
+" '''\n"
+" cr.execute(sql)\n"
+" result = cr.dictfetchall()"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_02
+msgid "Test 2: Opening a fiscal year"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_05
+msgid ""
+"Check that reconciled invoice for Sales/Purchases has reconciled entries for "
+"Payable and Receivable Accounts"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_03
+msgid ""
+"Check if movement lines are balanced and have the same date and period"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,name:0
+msgid "Test Name"
+msgstr "Teszt név"
+
+#. module: account_test
+#: report:account.test.assert.print:0
+msgid "Accouting tests on"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_01
+msgid "Test 1: General balance"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_06
+msgid "Check that paid/reconciled invoices are not in 'Open' state"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_05_2
+msgid ""
+"Check that reconciled account moves, that define Payable and Receivable "
+"accounts, are belonging to reconciled invoices"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Tests"
+msgstr "Tesztek"
+
+#. module: account_test
+#: field:accounting.assert.test,desc:0
+msgid "Test Description"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Description"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_06_1
+msgid "Check that there's no move for any account with « View » account type"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_08
+msgid "Test 9 : Accounts and partners on account moves"
+msgstr ""
+
+#. module: account_test
+#: model:ir.actions.act_window,name:account_test.action_accounting_assert
+#: model:ir.actions.report.xml,name:account_test.account_assert_test_report
+#: model:ir.ui.menu,name:account_test.menu_action_license
+msgid "Accounting Tests"
+msgstr ""
+
+#. module: account_test
+#: code:addons/account_test/report/account_test_report.py:74
+#, python-format
+msgid "The test was passed successfully"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,active:0
+msgid "Active"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_06
+msgid "Test 6 : Invoices status"
+msgstr ""
+
+#. module: account_test
+#: model:ir.model,name:account_test.model_accounting_assert_test
+msgid "accounting.assert.test"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_05
+msgid ""
+"Test 5.1 : Payable and Receivable accountant lines of reconciled invoices"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,code_exec:0
+msgid "Python code"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_07
+msgid ""
+"Check on bank statement that the Closing Balance = Starting Balance + sum of "
+"statement lines"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_07
+msgid "Test 8 : Closing balance on bank statements"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_03
+msgid "Test 3: Movement lines"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_05_2
+msgid "Test 5.2 : Reconcilied invoices and Payable/Receivable accounts"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Expression"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_04
+msgid "Test 4: Totally reconciled mouvements"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_04
+msgid "Check if the totally reconciled movements are balanced"
+msgstr ""
+
+#. module: account_test
+#: field:accounting.assert.test,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_02
+msgid ""
+"Check if the balance of the new opened fiscal year matches with last year's "
+"balance"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Python Code"
+msgstr ""
+
+#. module: account_test
+#: model:ir.actions.act_window,help:account_test.action_accounting_assert
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create Accounting Test.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_01
+msgid "Check the balance: Debit sum = Credit sum"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,desc:account_test.account_test_08
+msgid "Check that general accounts and partners on account moves are active"
+msgstr ""
+
+#. module: account_test
+#: model:accounting.assert.test,name:account_test.account_test_06_1
+msgid "Test 7: « View  » account type"
+msgstr ""
+
+#. module: account_test
+#: view:accounting.assert.test:0
+msgid "Code Help"
+msgstr ""
diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py
index c6f754ed18f..b176c3b8fd9 100644
--- a/addons/account_voucher/account_voucher.py
+++ b/addons/account_voucher/account_voucher.py
@@ -40,7 +40,6 @@ class res_company(osv.osv):
domain="[('type', '=', 'other')]",),
}
-res_company()
class account_config_settings(osv.osv_memory):
_inherit = 'account.config.settings'
@@ -85,7 +84,7 @@ class account_voucher(osv.osv):
if context is None: context = {}
if context.get('period_id', False):
return context.get('period_id')
- periods = self.pool.get('account.period').find(cr, uid)
+ periods = self.pool.get('account.period').find(cr, uid, context=context)
return periods and periods[0] or False
def _make_journal_search(self, cr, uid, ttype, context=None):
@@ -1488,7 +1487,6 @@ class account_voucher_line(osv.osv):
'type':ttype
})
return values
-account_voucher_line()
class account_bank_statement(osv.osv):
_inherit = 'account.bank.statement'
@@ -1540,7 +1538,6 @@ class account_bank_statement(osv.osv):
raise osv.except_osv(_('Unable to change journal !'), _('You can not change the journal as you already reconciled some statement lines!'))
return super(account_bank_statement, self).write(cr, uid, ids, vals, context=context)
-account_bank_statement()
class account_bank_statement_line(osv.osv):
_inherit = 'account.bank.statement.line'
@@ -1594,7 +1591,6 @@ class account_bank_statement_line(osv.osv):
voucher_obj.unlink(cr, uid, unlink_ids, context=context)
return super(account_bank_statement_line, self).unlink(cr, uid, ids, context=context)
-account_bank_statement_line()
def resolve_o2m_operations(cr, uid, target_osv, operations, fields, context):
results = []
diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml
index f429480f656..4674d62b6a0 100644
--- a/addons/account_voucher/account_voucher_view.xml
+++ b/addons/account_voucher/account_voucher_view.xml
@@ -129,7 +129,7 @@
<filter icon="terp-camera_test" string="Posted" domain="[('state','=','posted')]" help="Posted Vouchers"/>
<separator/>
<filter icon="terp-gtk-jump-to-ltr" string="To Review" domain="[('state','=','posted'), ('audit','=',False)]" help="To Review"/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/>
<field name="journal_id" context="{'journal_id': self, 'set_visible':False}" />
<field name="period_id"/>
<group expand="0" string="Group By...">
diff --git a/addons/account_voucher/i18n/hu.po b/addons/account_voucher/i18n/hu.po
index 746ffe5b247..1a50a813042 100644
--- a/addons/account_voucher/i18n/hu.po
+++ b/addons/account_voucher/i18n/hu.po
@@ -7,19 +7,19 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2013-03-26 15:03+0000\n"
+"PO-Revision-Date: 2013-04-04 11:34+0000\n"
"Last-Translator: krnkris <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-27 04:36+0000\n"
-"X-Generator: Launchpad (build 16540)\n"
+"X-Launchpad-Export-Date: 2013-04-05 05:37+0000\n"
+"X-Generator: Launchpad (build 16550)\n"
#. module: account_voucher
#: field:account.bank.statement.line,voucher_id:0
msgid "Reconciliation"
-msgstr ""
+msgstr "Párosítás"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_config_settings
@@ -51,7 +51,7 @@ msgstr "Nyitott vevő tételek"
#: view:account.voucher:0
#: view:sale.receipt.report:0
msgid "Group By..."
-msgstr "Csoportosítás"
+msgstr "Csoportosítás ezzel..."
#. module: account_voucher
#: help:account.voucher,writeoff_amount:0
@@ -102,7 +102,7 @@ msgstr "Számla kifizetése"
#. module: account_voucher
#: view:account.voucher:0
msgid "Are you sure you want to cancel this receipt?"
-msgstr ""
+msgstr "Biztos, hogy vissza akarja vonni ezt a bevételi bizonylatot?"
#. module: account_voucher
#: view:account.voucher:0
@@ -137,6 +137,8 @@ msgid ""
"You can not change the journal as you already reconciled some statement "
"lines!"
msgstr ""
+"Nem tudja a naplót megváltoztatni mivel a kivonatok egyes sorait már "
+"párosította!"
#. module: account_voucher
#: view:account.voucher:0
@@ -160,6 +162,15 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Kattintson vásárlási bevételi bizonylat rögzítéséhez. \n"
+" </p><p>\n"
+" Ha a vásárlási bevételi bizonylat igazolva lett, rögzítheti "
+"a \n"
+" vásárlási bevételi bizonylathoz kapcsolódó beszállítói "
+"kifizetést.\n"
+" </p>\n"
+" "
#. module: account_voucher
#: view:account.voucher:0
@@ -169,7 +180,7 @@ msgstr "Nyugták keresése"
#. module: account_voucher
#: field:account.voucher,writeoff_acc_id:0
msgid "Counterpart Account"
-msgstr ""
+msgstr "Ellenszámla"
#. module: account_voucher
#: field:account.voucher,account_id:0
@@ -191,7 +202,7 @@ msgstr "Rendben"
#. module: account_voucher
#: field:account.voucher.line,reconcile:0
msgid "Full Reconcile"
-msgstr ""
+msgstr "Teljes párosítás"
#. module: account_voucher
#: field:account.voucher,date_due:0
@@ -215,7 +226,7 @@ msgstr "Üzenetek"
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
msgid "Purchase Receipts"
-msgstr ""
+msgstr "Vásárlások bevételi bizonylatai"
#. module: account_voucher
#: field:account.voucher.line,move_line_id:0
@@ -271,11 +282,18 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Kattintson értékesítési bevételi bizonylat létrehozásához.\n"
+" </p><p>\n"
+" Ha az értékesítési bizonylat igazolva lett, rögzítheti az \n"
+" értékesítéshez tartozó vevői befizetést.\n"
+" </p>\n"
+" "
#. module: account_voucher
#: help:account.voucher,message_unread:0
msgid "If checked new messages require your attention."
-msgstr ""
+msgstr "Ha be van jelölve, akkor figyelje az új üzeneteket."
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_bank_statement_line
@@ -298,17 +316,17 @@ msgstr "ÁFA"
#: code:addons/account_voucher/account_voucher.py:879
#, python-format
msgid "Invalid Action!"
-msgstr ""
+msgstr "Érvénytelen lépés!"
#. module: account_voucher
#: field:account.voucher,comment:0
msgid "Counterpart Comment"
-msgstr ""
+msgstr "Ellenoldali meglyegyzés"
#. module: account_voucher
#: field:account.voucher.line,account_analytic_id:0
msgid "Analytic Account"
-msgstr "Gyűjtőkód"
+msgstr "Gyűjtő/elemző könyvelés"
#. module: account_voucher
#: help:account.voucher,message_summary:0
@@ -316,11 +334,13 @@ msgid ""
"Holds the Chatter summary (number of messages, ...). This summary is "
"directly in html format in order to be inserted in kanban views."
msgstr ""
+"A chettelés összegzést megállítja (üzenetek száma,...). Ez az összegzés "
+"direkt HTML formátumú ahhoz hogy beilleszthető legyen a kanban nézetekbe."
#. module: account_voucher
#: view:account.voucher:0
msgid "Total Allocation"
-msgstr ""
+msgstr "Összes kiosztás"
#. module: account_voucher
#: view:account.voucher:0
@@ -330,7 +350,7 @@ msgstr "Fizetési információ"
#. module: account_voucher
#: view:account.voucher:0
msgid "(update)"
-msgstr ""
+msgstr "(frissítés)"
#. module: account_voucher
#: view:account.voucher:0
@@ -349,20 +369,20 @@ msgstr "Számlák importálása"
#: code:addons/account_voucher/account_voucher.py:1112
#, python-format
msgid "Wrong voucher line"
-msgstr "Nem megfelelő nyugta sorok"
+msgstr "Nem megfelelő nyugta sor"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
#: selection:sale.receipt.report,pay_now:0
msgid "Pay Later or Group Funds"
-msgstr "Későbbi fizetés"
+msgstr "Fizessen később vagy csoportosítsa a pénzeket"
#. module: account_voucher
#: view:account.voucher:0
#: selection:account.voucher,type:0
#: selection:sale.receipt.report,type:0
msgid "Receipt"
-msgstr "Befizetés"
+msgstr "Bevételi bizonylat"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:1018
@@ -372,6 +392,9 @@ msgid ""
"settings, to manage automatically the booking of accounting entries related "
"to differences between exchange rates."
msgstr ""
+"Be kell állítani a 'Átváltási arány nyereség számlája' a könyvelés "
+"beállításainál, ahhoz, hogy kezelni tudja az automatikus könyvelését azoknak "
+"a számla tételeknek, melyek az átváltási arányok különbségéből adódhatnak."
#. module: account_voucher
#: view:account.voucher:0
@@ -399,7 +422,7 @@ msgstr "Szállítói nyugta"
#. module: account_voucher
#: field:account.voucher,message_follower_ids:0
msgid "Followers"
-msgstr ""
+msgstr "Követők"
#. module: account_voucher
#: selection:account.voucher.line,type:0
@@ -410,13 +433,13 @@ msgstr "Tartozik"
#: code:addons/account_voucher/account_voucher.py:1547
#, python-format
msgid "Unable to change journal !"
-msgstr ""
+msgstr "Naplót nem lehet megváltoztatni !"
#. module: account_voucher
#: view:sale.receipt.report:0
#: field:sale.receipt.report,nbr:0
msgid "# of Voucher Lines"
-msgstr "Nyugtasorok száma"
+msgstr "# nyugta sor száma"
#. module: account_voucher
#: view:sale.receipt.report:0
@@ -446,6 +469,13 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Kattintson új beszállítói fizetés létrehozásához.\n"
+" </p><p>\n"
+" OpenERP segít a kifizetéseinek, valamint a beszállítók "
+"részére még fizetendő mérleg könnyű nyomon követéséhez.\n"
+" </p>\n"
+" "
#. module: account_voucher
#: view:account.voucher:0
@@ -460,12 +490,12 @@ msgstr "Nyugta tételek"
#. module: account_voucher
#: field:account.voucher,name:0
msgid "Memo"
-msgstr "Megnevezés"
+msgstr "Emlékeztető"
#. module: account_voucher
#: view:account.voucher:0
msgid "Are you sure to unreconcile and cancel this record ?"
-msgstr ""
+msgstr "Biztosan visszavonja a bejegyzés párosítását?"
#. module: account_voucher
#: field:account.voucher,is_multi_currency:0
@@ -494,17 +524,25 @@ msgid ""
"\n"
"* The 'Cancelled' status is used when user cancel voucher."
msgstr ""
+" * A 'Tervezet' állapotot használja amint egy felhasználó létrehoz egy új és "
+"még le nem igazolt nyugtát. \n"
+"* 'Pro-forma' lesz, ha a nyugta Pro-forma állapotú, a nyugtának még nincs "
+"nyugta száma. \n"
+"* 'Elküldött' állapotú, ha egy felhasználó létrehozta a nyugtát, egy nyugta "
+"számot generált hozzá, és a könyvelésben egy nyugta bevitel létre lett hozva "
+" \n"
+"* A 'Visszavonva' állapot lesz, ha egy felhasználó visszavonta a nyugtát."
#. module: account_voucher
#: field:account.voucher,writeoff_amount:0
msgid "Difference Amount"
-msgstr ""
+msgstr "Különbség számla"
#. module: account_voucher
#: view:sale.receipt.report:0
#: field:sale.receipt.report,due_delay:0
msgid "Avg. Due Delay"
-msgstr "Álagos fizetési határidő"
+msgstr "Álagos fizetési késedelem"
#. module: account_voucher
#: code:addons/account_voucher/invoice.py:34
@@ -543,12 +581,24 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Kattintson új kifizetés rögzítéséhez. \n"
+" </p><p>\n"
+" Vigye be a vásárlót és a fizetési módot és utána, vagy "
+"hozzon\n"
+" létre kézzel egy fizetési rekordot, vagy az OpenERP fel fog "
+"ajánlani\n"
+" automatikusan a fizetéshez tartozó összeegyeztetést a\n"
+" nyitott számlákkal vagy értékesítési bevételi "
+"bizonylatokkal.\n"
+" </p>\n"
+" "
#. module: account_voucher
#: field:account.config.settings,expense_currency_exchange_account_id:0
#: field:res.company,expense_currency_exchange_account_id:0
msgid "Loss Exchange Rate Account"
-msgstr ""
+msgstr "Árfolyamveszteség számla"
#. module: account_voucher
#: view:account.voucher:0
@@ -572,7 +622,7 @@ msgstr "Ellenőrizendő"
#: code:addons/account_voucher/account_voucher.py:1194
#, python-format
msgid "change"
-msgstr ""
+msgstr "módosítás"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:1014
@@ -582,6 +632,9 @@ msgid ""
"settings, to manage automatically the booking of accounting entries related "
"to differences between exchange rates."
msgstr ""
+"Be kell állítani a 'Árfolyamveszteség számla' a könyvelés beállításoknál, "
+"ahhoz, hogy kezelni tudja automatikusan a könyvelési tételek rögzítését, "
+"melyek az átváltási árfolyam különbségekkel összefüggenek."
#. module: account_voucher
#: view:account.voucher:0
@@ -599,11 +652,13 @@ msgid ""
"Fields with internal purpose only that depicts if the voucher is a multi "
"currency one or not"
msgstr ""
+"Belső használatú mezők, melyek azt ábrázolják, hogy a nyugták több "
+"pénzneműek vagy nem"
#. module: account_voucher
#: view:account.invoice:0
msgid "Register Payment"
-msgstr "Kifizetés"
+msgstr "Kifizetés rögzítés"
#. module: account_voucher
#: field:account.statement.from.invoice.lines,line_ids:0
@@ -618,7 +673,7 @@ msgstr "December"
#. module: account_voucher
#: view:sale.receipt.report:0
msgid "Group by month of Invoice Date"
-msgstr ""
+msgstr "Csoportosítás számla dátuma alapján"
#. module: account_voucher
#: view:sale.receipt.report:0
@@ -636,7 +691,7 @@ msgstr "Pénznem"
#. module: account_voucher
#: view:account.statement.from.invoice.lines:0
msgid "Payable and Receivables"
-msgstr "Vevők és szállítók"
+msgstr "Fizetendők & Bevételek"
#. module: account_voucher
#: view:account.voucher:0
@@ -651,7 +706,7 @@ msgstr "Nyugta állapota"
#. module: account_voucher
#: view:account.voucher:0
msgid "Are you sure to unreconcile this record?"
-msgstr ""
+msgstr "Biztosan törölni szeretné ennek a rekordnak a párosítását?"
#. module: account_voucher
#: field:account.voucher,company_id:0
@@ -664,18 +719,18 @@ msgstr "Vállalat"
#. module: account_voucher
#: help:account.voucher,paid:0
msgid "The Voucher has been totally paid."
-msgstr "A nyugta ki lett egyenlítve"
+msgstr "A nyugta teljesen ki lett egyenlítve"
#. module: account_voucher
#: selection:account.voucher,payment_option:0
msgid "Reconcile Payment Balance"
-msgstr ""
+msgstr "Fizetési egyenleg párosítás"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:975
#, python-format
msgid "Configuration Error !"
-msgstr ""
+msgstr "Beállítási hiba!"
#. module: account_voucher
#: view:account.voucher:0
@@ -687,7 +742,7 @@ msgstr "Nyugta tervezetek"
#: view:sale.receipt.report:0
#: field:sale.receipt.report,price_total_tax:0
msgid "Total With Tax"
-msgstr "Bruttó érték"
+msgstr "Bruttó érték adóval"
#. module: account_voucher
#: view:account.voucher:0
@@ -699,18 +754,18 @@ msgstr "Beszerzési nyugta"
#: field:account.voucher,state:0
#: view:sale.receipt.report:0
msgid "Status"
-msgstr ""
+msgstr "Állapot"
#. module: account_voucher
#: view:account.voucher:0
msgid "Allocation"
-msgstr ""
+msgstr "Kiosztás"
#. module: account_voucher
#: view:account.statement.from.invoice.lines:0
#: view:account.voucher:0
msgid "or"
-msgstr ""
+msgstr "vagy"
#. module: account_voucher
#: selection:sale.receipt.report,month:0
@@ -720,7 +775,7 @@ msgstr "Augusztus"
#. module: account_voucher
#: view:account.voucher:0
msgid "Validate Payment"
-msgstr ""
+msgstr "Fizetés jóváhagyása"
#. module: account_voucher
#: help:account.voucher,audit:0
@@ -728,6 +783,8 @@ msgid ""
"Check this box if you are unsure of that journal entry and if you want to "
"note it as 'to be reviewed' by an accounting expert."
msgstr ""
+"Jelölje be, ha bizonytalan a napló tétel kontírozásában. Ennek hatására "
+"könyvelő szekértő által 'ellenőrizendő'-ként jelölődik meg."
#. module: account_voucher
#: selection:sale.receipt.report,month:0
@@ -738,7 +795,7 @@ msgstr "Október"
#: code:addons/account_voucher/account_voucher.py:976
#, python-format
msgid "Please activate the sequence of selected journal !"
-msgstr ""
+msgstr "Kérem a sorozat aktiválását a kiválasztott naplóra !"
#. module: account_voucher
#: selection:sale.receipt.report,month:0
@@ -748,23 +805,23 @@ msgstr "Június"
#. module: account_voucher
#: field:account.voucher,payment_rate_currency_id:0
msgid "Payment Rate Currency"
-msgstr ""
+msgstr "Fizetési pénznem aránya"
#. module: account_voucher
#: field:account.voucher,paid:0
msgid "Paid"
-msgstr ""
+msgstr "Rendezett"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Sales Receipts"
-msgstr ""
+msgstr "Értékesítési bevételi bizonylatok"
#. module: account_voucher
#: field:account.voucher,message_is_follower:0
msgid "Is a Follower"
-msgstr ""
+msgstr "Ez egy követő"
#. module: account_voucher
#: field:account.voucher,analytic_id:0
@@ -791,7 +848,7 @@ msgstr "Kiterjesztett szűrők"
#. module: account_voucher
#: field:account.voucher,paid_amount_in_company_currency:0
msgid "Paid Amount in Company Currency"
-msgstr ""
+msgstr "Kifizetett összeg a vállalat pénznemében"
#. module: account_voucher
#: field:account.bank.statement.line,amount_reconciled:0
@@ -807,7 +864,7 @@ msgstr "Azonnali kifizetés"
#. module: account_voucher
#: field:account.voucher.line,type:0
msgid "Dr/Cr"
-msgstr ""
+msgstr "T/K"
#. module: account_voucher
#: field:account.voucher,pre_line:0
@@ -818,7 +875,7 @@ msgstr "Előző kifizetések ?"
#: code:addons/account_voucher/account_voucher.py:1112
#, python-format
msgid "The invoice you are willing to pay is not valid anymore."
-msgstr ""
+msgstr "A kifizetni kívánt számla már nem érvényes."
#. module: account_voucher
#: selection:sale.receipt.report,month:0
@@ -829,52 +886,52 @@ msgstr "Január"
#: model:ir.actions.act_window,name:account_voucher.action_voucher_list
#: model:ir.ui.menu,name:account_voucher.menu_encode_entries_by_voucher
msgid "Journal Vouchers"
-msgstr "Nyugták"
+msgstr "Nyugták naplói"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_res_company
msgid "Companies"
-msgstr ""
+msgstr "Vállalatok"
#. module: account_voucher
#: field:account.voucher,message_summary:0
msgid "Summary"
-msgstr ""
+msgstr "Összegzés"
#. module: account_voucher
#: field:account.voucher,active:0
msgid "Active"
-msgstr ""
+msgstr "Aktív"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:982
#, python-format
msgid "Please define a sequence on the journal."
-msgstr ""
+msgstr "Kérem egy sorozat meghatározását a naplón."
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.act_pay_voucher
#: model:ir.actions.act_window,name:account_voucher.action_vendor_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_vendor_receipt
msgid "Customer Payments"
-msgstr ""
+msgstr "Vevői befizetések"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt_report_all
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt_report_all
#: view:sale.receipt.report:0
msgid "Sales Receipts Analysis"
-msgstr ""
+msgstr "Értékesítési bevételi bizonylatok elemzései"
#. module: account_voucher
#: view:sale.receipt.report:0
msgid "Group by Invoice Date"
-msgstr ""
+msgstr "Számla dátuma szerinti csoportosítása"
#. module: account_voucher
#: view:account.voucher:0
msgid "Post"
-msgstr "Könyvelés"
+msgstr "Elküld"
#. module: account_voucher
#: view:account.voucher:0
@@ -885,7 +942,7 @@ msgstr "Számlák és kifizetetlen tételek"
#: view:sale.receipt.report:0
#: field:sale.receipt.report,price_total:0
msgid "Total Without Tax"
-msgstr "Nettó érték"
+msgstr "Nettó, adó nélküli érték"
#. module: account_voucher
#: view:account.voucher:0
@@ -921,7 +978,7 @@ msgstr "Bankkivonat"
#. module: account_voucher
#: view:account.bank.statement:0
msgid "onchange_amount(amount)"
-msgstr ""
+msgstr "onchange_amount(amount)"
#. module: account_voucher
#: selection:sale.receipt.report,month:0
@@ -954,19 +1011,19 @@ msgstr "Nyugta tételsorok"
#: view:account.statement.from.invoice.lines:0
#: view:account.voucher:0
msgid "Cancel"
-msgstr "Mégsem"
+msgstr "Visszavonás"
#. module: account_voucher
#: model:ir.actions.client,name:account_voucher.action_client_invoice_menu
msgid "Open Invoicing Menu"
-msgstr ""
+msgstr "Számlázási menü megnyitása"
#. module: account_voucher
#: selection:account.voucher,state:0
#: view:sale.receipt.report:0
#: selection:sale.receipt.report,state:0
msgid "Pro-forma"
-msgstr "Pro forma"
+msgstr "Pro-forma"
#. module: account_voucher
#: view:account.voucher:0
@@ -979,6 +1036,8 @@ msgstr "Könyvelési tételsorok"
#, python-format
msgid "Please define default credit/debit accounts on the journal \"%s\"."
msgstr ""
+"Kérem meghatározni az alapértelmezett követelés/tartozás könyvelést a naplón "
+"\"%s\"."
#. module: account_voucher
#: selection:account.voucher,type:0
@@ -995,7 +1054,7 @@ msgstr "Fizetés"
#. module: account_voucher
#: view:account.voucher:0
msgid "Currency Options"
-msgstr ""
+msgstr "Pénznem lehetőségek"
#. module: account_voucher
#: help:account.voucher,payment_option:0
@@ -1005,6 +1064,10 @@ msgid ""
"either choose to keep open this difference on the partner's account, or "
"reconcile it with the payment(s)"
msgstr ""
+"Ez a mező megkönnyíti a választást ahhoz, hogy mit szeretne tenni a "
+"kifizetett összeg és a kiosztott összeg közti különbségekkel. Hagyhatja "
+"nyitottan ezt a különbséget a partner számláján, vagy párosíthatja a "
+"fizetés(ek)el."
#. module: account_voucher
#: model:ir.actions.act_window,help:account_voucher.action_sale_receipt_report_all
@@ -1018,16 +1081,24 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p>\n"
+" Erről a jelentésről, a vevőnek elküldött számlákról és fizetési\n"
+" határidőkről és késve fizetésről áttekintést kaphat. A \n"
+" keresési eszköz használható a számla beszámolók személyre\n"
+" szabásához és így, az elemzést az igényének megfelelően "
+"alakíthatja.\n"
+" </p>\n"
+" "
#. module: account_voucher
#: view:account.voucher:0
msgid "Posted Vouchers"
-msgstr ""
+msgstr "Elküldött nyugták"
#. module: account_voucher
#: field:account.voucher,payment_rate:0
msgid "Exchange Rate"
-msgstr ""
+msgstr "Árfolyam arány"
#. module: account_voucher
#: view:account.voucher:0
@@ -1047,7 +1118,7 @@ msgstr "Május"
#. module: account_voucher
#: view:account.voucher:0
msgid "Sale Receipt"
-msgstr ""
+msgstr "Értékesítési bevételi bizonylat"
#. module: account_voucher
#: view:account.voucher:0
@@ -1066,7 +1137,7 @@ msgstr "Belső megjegyzések"
#: view:account.voucher:0
#: field:account.voucher,line_cr_ids:0
msgid "Credits"
-msgstr "Követel"
+msgstr "Követelések"
#. module: account_voucher
#: field:account.voucher.line,amount_original:0
@@ -1076,7 +1147,7 @@ msgstr "Eredeti összeg"
#. module: account_voucher
#: view:account.voucher:0
msgid "Purchase Receipt"
-msgstr ""
+msgstr "Vásárlási bevételi bizonylatok"
#. module: account_voucher
#: help:account.voucher,payment_rate:0
@@ -1084,6 +1155,8 @@ msgid ""
"The specific rate that will be used, in this voucher, between the selected "
"currency (in 'Payment Rate Currency' field) and the voucher currency."
msgstr ""
+"Az arány, mely ezen nyugtán lesz használva, a kiválasztott pénznem (a "
+"'Fizetési pénznem aránya' mezőben) és a nyugta pénzneme közt."
#. module: account_voucher
#: view:account.voucher:0
@@ -1115,12 +1188,12 @@ msgstr "Február"
#. module: account_voucher
#: view:account.voucher:0
msgid "Supplier Invoices and Outstanding transactions"
-msgstr "Bejövő számlák és kifizetetlen tételek"
+msgstr "Beszállítók bejövő számlái és kifizetetlen tételek"
#. module: account_voucher
#: field:account.voucher,reference:0
msgid "Ref #"
-msgstr "Hiv. szám"
+msgstr "Hiv. szám #"
#. module: account_voucher
#: view:sale.receipt.report:0
@@ -1132,7 +1205,7 @@ msgstr "Év"
#: field:account.config.settings,income_currency_exchange_account_id:0
#: field:res.company,income_currency_exchange_account_id:0
msgid "Gain Exchange Rate Account"
-msgstr ""
+msgstr "Árfolyamnyereség számla"
#. module: account_voucher
#: selection:account.voucher,type:0
@@ -1148,7 +1221,7 @@ msgstr "Április"
#. module: account_voucher
#: help:account.voucher,tax_id:0
msgid "Only for tax excluded from price"
-msgstr ""
+msgstr "Csak az árakból kihagyott adók"
#. module: account_voucher
#: field:account.voucher,type:0
@@ -1158,7 +1231,7 @@ msgstr "Alapértelmezett típus"
#. module: account_voucher
#: help:account.voucher,message_ids:0
msgid "Messages and communication history"
-msgstr ""
+msgstr "Üzenetek és kommunikációs történet"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_statement_from_invoice_lines
@@ -1182,12 +1255,16 @@ msgid ""
"The amount of the voucher must be the same amount as the one on the "
"statement line."
msgstr ""
+"A nyugtán lévő összegnek ugyanannak kell lennie mint ami a kivonat sorában "
+"szerepel."
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:879
#, python-format
msgid "Cannot delete voucher(s) which are already opened or paid."
msgstr ""
+"Nem lehet olyan nyugtá(ka)t törölni, melyek meg lettek nyitva vagy ki lettek "
+"fozetve."
#. module: account_voucher
#: help:account.voucher,date:0
@@ -1197,7 +1274,7 @@ msgstr "Könyvelési tételek teljesítési dátuma"
#. module: account_voucher
#: model:mail.message.subtype,name:account_voucher.mt_voucher_state_change
msgid "Status Change"
-msgstr ""
+msgstr "Állapotváltozás"
#. module: account_voucher
#: selection:account.voucher,payment_option:0
@@ -1225,7 +1302,7 @@ msgstr "Nettó érték"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_sale_receipt_report
msgid "Sales Receipt Statistics"
-msgstr "Értékesítési nyugta statisztika"
+msgstr "Értékesítési bevételi bizonylatok statisztikái"
#. module: account_voucher
#: view:account.voucher:0
@@ -1244,14 +1321,14 @@ msgstr "Nyitott egyenleg"
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status <b>changed</b>"
-msgstr ""
+msgstr "Állapot <b>megváltozott</b>"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:1014
#: code:addons/account_voucher/account_voucher.py:1018
#, python-format
msgid "Insufficient Configuration!"
-msgstr ""
+msgstr "Nem megfelelő beállítás!"
#. module: account_voucher
#: help:account.voucher,active:0
@@ -1260,6 +1337,9 @@ msgid ""
"inactive, which allow to hide the customer/supplier payment while the bank "
"statement isn't confirmed."
msgstr ""
+"Alapértelmezetten, a tervezet bank kivonathoz párosított nyugták nem lesznek "
+"aktívak, így el lehet tüntetni a vevő/beszállító fizetéseket amíg a banki "
+"kivonatok nem kerülnek jóváhagyásra."
#~ msgid "Particulars"
#~ msgstr "Adatok"
@@ -1310,9 +1390,6 @@ msgstr ""
#~ msgid "Want to remove accounting entries too ?"
#~ msgstr "A könyvelési tételeket is törölni szeretné?"
-#~ msgid "Sales Receipt"
-#~ msgstr "Nyugta"
-
#~ msgid "Unreconciliation"
#~ msgstr "Párosítás visszavonása"
@@ -1485,3 +1562,6 @@ msgstr ""
#~ msgid "Canceled"
#~ msgstr "Érvénytelenített"
+
+#~ msgid "Sales Receipt"
+#~ msgstr "Értékesítési bevételi bizonylat"
diff --git a/addons/account_voucher/i18n/nl_BE.po b/addons/account_voucher/i18n/nl_BE.po
index 0cdc8cd8399..a58e655aec6 100644
--- a/addons/account_voucher/i18n/nl_BE.po
+++ b/addons/account_voucher/i18n/nl_BE.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2012-12-19 18:04+0000\n"
+"PO-Revision-Date: 2013-04-26 16:01+0000\n"
"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: Els Van Vossel\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:33+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-27 05:44+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
"Language: nl\n"
#. module: account_voucher
@@ -138,6 +138,8 @@ msgid ""
"You can not change the journal as you already reconciled some statement "
"lines!"
msgstr ""
+"U kunt het journaal niet veranderen, omdat er al uittreksellijnen zijn "
+"afgepunt."
#. module: account_voucher
#: view:account.voucher:0
@@ -148,7 +150,7 @@ msgstr "Goedkeuren"
#: model:ir.actions.act_window,name:account_voucher.action_vendor_payment
#: model:ir.ui.menu,name:account_voucher.menu_action_vendor_payment
msgid "Supplier Payments"
-msgstr ""
+msgstr "Leveranciersbetalingen"
#. module: account_voucher
#: model:ir.actions.act_window,help:account_voucher.action_purchase_receipt
@@ -223,7 +225,7 @@ msgstr "Berichten"
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt
msgid "Purchase Receipts"
-msgstr ""
+msgstr "Aankoopbewijzen"
#. module: account_voucher
#: field:account.voucher.line,move_line_id:0
@@ -431,7 +433,7 @@ msgstr "Debet"
#: code:addons/account_voucher/account_voucher.py:1547
#, python-format
msgid "Unable to change journal !"
-msgstr ""
+msgstr "Het dagboek kan niet worden gewijzigd"
#. module: account_voucher
#: view:sale.receipt.report:0
@@ -745,7 +747,7 @@ msgstr "Augustus"
#. module: account_voucher
#: view:account.voucher:0
msgid "Validate Payment"
-msgstr ""
+msgstr "Betaling bevestigen"
#. module: account_voucher
#: help:account.voucher,audit:0
@@ -786,7 +788,7 @@ msgstr "Betaald"
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Sales Receipts"
-msgstr ""
+msgstr "Verkoopbewijzen"
#. module: account_voucher
#: field:account.voucher,message_is_follower:0
@@ -834,7 +836,7 @@ msgstr "Onmiddellijk betalen"
#. module: account_voucher
#: field:account.voucher.line,type:0
msgid "Dr/Cr"
-msgstr ""
+msgstr "Db/Cr"
#. module: account_voucher
#: field:account.voucher,pre_line:0
@@ -845,7 +847,7 @@ msgstr "Vorige betalingen?"
#: code:addons/account_voucher/account_voucher.py:1112
#, python-format
msgid "The invoice you are willing to pay is not valid anymore."
-msgstr ""
+msgstr "De factuur die u wilt betalen, is niet meer geldig."
#. module: account_voucher
#: selection:sale.receipt.report,month:0
@@ -884,7 +886,7 @@ msgstr "Gelieve een reeks in te stellen voor het journaal."
#: model:ir.actions.act_window,name:account_voucher.action_vendor_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_vendor_receipt
msgid "Customer Payments"
-msgstr ""
+msgstr "Klantenbetalingen"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt_report_all
@@ -938,7 +940,7 @@ msgstr "Nummer"
#. module: account_voucher
#: selection:account.voucher.line,type:0
msgid "Credit"
-msgstr ""
+msgstr "Credit"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_bank_statement
@@ -1279,7 +1281,7 @@ msgstr "Openstaand saldo"
#. module: account_voucher
#: model:mail.message.subtype,description:account_voucher.mt_voucher_state_change
msgid "Status <b>changed</b>"
-msgstr ""
+msgstr "Status <b>vgewijzigd</b>"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:1014
diff --git a/addons/account_voucher/invoice.py b/addons/account_voucher/invoice.py
index c0584ddbd52..03a3e5fab67 100644
--- a/addons/account_voucher/invoice.py
+++ b/addons/account_voucher/invoice.py
@@ -52,6 +52,5 @@ class invoice(osv.osv):
}
}
-invoice()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_voucher/report/account_voucher_sales_receipt.py b/addons/account_voucher/report/account_voucher_sales_receipt.py
index 2ab76c252f5..246cd8b47e8 100644
--- a/addons/account_voucher/report/account_voucher_sales_receipt.py
+++ b/addons/account_voucher/report/account_voucher_sales_receipt.py
@@ -126,6 +126,5 @@ class sale_receipt_report(osv.osv):
)
""")
-sale_receipt_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_voucher/test/account_voucher_report.yml b/addons/account_voucher/test/account_voucher_report.yml
index e8dbde413f2..96e96e4bdfd 100644
--- a/addons/account_voucher/test/account_voucher_report.yml
+++ b/addons/account_voucher/test/account_voucher_report.yml
@@ -20,7 +20,8 @@
-
!python {model: account.voucher}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.voucher.cash_receipt.drcr').create(cr, uid, [ref("account_voucher_voucheraxelor0again")], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref("account_voucher_voucheraxelor0again")], 'voucher.cash_receipt.drcr', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'account_voucher-report.'+format), 'wb+').write(data)
diff --git a/addons/account_voucher/test/case5_suppl_usd_usd.yml b/addons/account_voucher/test/case5_suppl_usd_usd.yml
index ace88e0bd4d..917e2366f56 100644
--- a/addons/account_voucher/test/case5_suppl_usd_usd.yml
+++ b/addons/account_voucher/test/case5_suppl_usd_usd.yml
@@ -125,7 +125,6 @@
-
!python {model: account.voucher}: |
import time
- from openerp import netsvc
vals = {}
voucher_id = self.browse(cr, uid, ref('account_voucher_case_5_supplier_flow'))
for item in voucher_id.line_dr_ids:
diff --git a/addons/account_voucher/test/sales_payment.yml b/addons/account_voucher/test/sales_payment.yml
index 37264de114a..71e605d5651 100644
--- a/addons/account_voucher/test/sales_payment.yml
+++ b/addons/account_voucher/test/sales_payment.yml
@@ -37,7 +37,6 @@
I will create and post an account voucher of amount 450.0 for the partner Seagate.
-
!python {model: account.voucher}: |
- from openerp import netsvc
vals = {}
journal_id = self.default_get(cr, uid, ['journal_id']).get('journal_id',None)
res = self.onchange_partner_id(cr, uid, [], ref("base.res_partner_19"), journal_id, 0.0, 1, ttype='receipt', date=False)
diff --git a/addons/account_voucher/test/sales_receipt.yml b/addons/account_voucher/test/sales_receipt.yml
index dc5602753fd..d27083b4513 100644
--- a/addons/account_voucher/test/sales_receipt.yml
+++ b/addons/account_voucher/test/sales_receipt.yml
@@ -45,7 +45,6 @@
I create and post a voucher payment of amount 30000.0 for the partner Seagate
-
!python {model: account.voucher}: |
- from openerp import netsvc
vals = {}
journal_id = self.default_get(cr, uid, ['journal_id']).get('journal_id',None)
res = self.onchange_partner_id(cr, uid, [], ref("base.res_partner_19"), journal_id, 0.0, 1, ttype='receipt', date=False)
diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml
index de873c9195c..109c2f9aec9 100644
--- a/addons/account_voucher/voucher_payment_receipt_view.xml
+++ b/addons/account_voucher/voucher_payment_receipt_view.xml
@@ -11,7 +11,7 @@
<field name="date"/>
<filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]" help="Draft Vouchers"/>
<filter icon="terp-camera_test" string="Posted" domain="[('state','=','posted')]" help="Posted Vouchers"/>
- <field name="partner_id" string="Customer"/>
+ <field name="partner_id" string="Customer" filter_domain="[('partner_id','child_of',self)]"/>
<field name="journal_id" context="{'journal_id': self, 'set_visible':False}" domain="[('type','in',('bank','cash'))]"/>
<field name="period_id"/>
<group expand="0" string="Group By...">
@@ -34,7 +34,7 @@
<field name="date"/>
<filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]" help="Draft Vouchers"/>
<filter icon="terp-camera_test" string="Posted" domain="[('state','=','posted')]" help="Posted Vouchers"/>
- <field name="partner_id" string="Supplier"/>
+ <field name="partner_id" string="Supplier" filter_domain="[('partner_id','child_of',self)]"/>
<field name="journal_id" context="{'journal_id': self, 'set_visible':False}" domain="[('type','in',('bank','cash'))]"/>
<field name="period_id"/>
<group expand="0" string="Group By...">
diff --git a/addons/account_voucher/voucher_sales_purchase_view.xml b/addons/account_voucher/voucher_sales_purchase_view.xml
index 05b783dd339..6a84a09d5e6 100644
--- a/addons/account_voucher/voucher_sales_purchase_view.xml
+++ b/addons/account_voucher/voucher_sales_purchase_view.xml
@@ -10,7 +10,7 @@
<field name="date"/>
<filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]" help="Draft Vouchers"/>
<filter icon="terp-camera_test" string="Posted" domain="[('state','=','posted')]" help="Posted Vouchers"/>
- <field name="partner_id" string="Supplier"/>
+ <field name="partner_id" string="Supplier" filter_domain="[('partner_id','child_of',self)]"/>
<field name="journal_id" context="{'journal_id': self, 'set_visible':False}" domain="[('type','in',('purchase','purchase_refund'))]"/>
<field name="period_id"/>
<group expand="0" string="Group By...">
@@ -32,7 +32,7 @@
<field name="date"/>
<filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]" help="Draft Vouchers"/>
<filter icon="terp-camera_test" string="Posted" domain="[('state','=','posted')]" help="Posted Vouchers"/>
- <field name="partner_id" string="Customer"/>
+ <field name="partner_id" string="Customer" filter_domain="[('partner_id','child_of',self)]"/>
<field name="journal_id" context="{'journal_id': self, 'set_visible':False}" domain="[('type','in',('sale','sale_refund'))]"/>
<field name="period_id"/>
<group expand="0" string="Group By...">
diff --git a/addons/account_voucher/wizard/account_statement_from_invoice.py b/addons/account_voucher/wizard/account_statement_from_invoice.py
index fce251df175..de5121a819b 100644
--- a/addons/account_voucher/wizard/account_statement_from_invoice.py
+++ b/addons/account_voucher/wizard/account_statement_from_invoice.py
@@ -123,6 +123,5 @@ class account_statement_from_invoice_lines(osv.osv_memory):
}, context=context)
return {'type': 'ir.actions.act_window_close'}
-account_statement_from_invoice_lines()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/analytic/analytic.py b/addons/analytic/analytic.py
index 42651acb0c6..ac298713b04 100644
--- a/addons/analytic/analytic.py
+++ b/addons/analytic/analytic.py
@@ -171,9 +171,9 @@ class account_analytic_account(osv.osv):
return result
_columns = {
- 'name': fields.char('Account/Contract Name', size=128, required=True),
+ 'name': fields.char('Account/Contract Name', size=128, required=True, track_visibility='onchange'),
'complete_name': fields.function(_get_full_name, type='char', string='Full Name'),
- 'code': fields.char('Reference', select=True),
+ 'code': fields.char('Reference', select=True, track_visibility='onchange'),
'type': fields.selection([('view','Analytic View'), ('normal','Analytic Account'),('contract','Contract or Project'),('template','Template of Contract')], 'Type of Account', required=True,
help="If you select the View Type, it means you won\'t allow to create journal entries using that account.\n"\
"The type 'Analytic account' stands for usual accounts that you only want to use in accounting.\n"\
@@ -191,10 +191,10 @@ class account_analytic_account(osv.osv):
'quantity': fields.function(_debit_credit_bal_qtty, type='float', string='Quantity', multi='debit_credit_bal_qtty'),
'quantity_max': fields.float('Prepaid Service Units', help='Sets the higher limit of time to work on the contract, based on the timesheet. (for instance, number of hours in a limited support contract.)'),
'partner_id': fields.many2one('res.partner', 'Customer'),
- 'user_id': fields.many2one('res.users', 'Project Manager'),
- 'manager_id': fields.many2one('res.users', 'Account Manager'),
+ 'user_id': fields.many2one('res.users', 'Project Manager', track_visibility='onchange'),
+ 'manager_id': fields.many2one('res.users', 'Account Manager', track_visibility='onchange'),
'date_start': fields.date('Start Date'),
- 'date': fields.date('End Date', select=True),
+ 'date': fields.date('End Date', select=True, track_visibility='onchange'),
'company_id': fields.many2one('res.company', 'Company', required=False), #not required because we want to allow different companies to use the same chart of account, except for leaf accounts.
'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'),('pending','To Renew'),('close','Closed'),('cancelled', 'Cancelled')], 'Status', required=True, track_visibility='onchange'),
'currency_id': fields.function(_currency, fnct_inv=_set_company_currency, #the currency_id field is readonly except if it's a view account and if there is no company
diff --git a/addons/analytic/i18n/lt.po b/addons/analytic/i18n/lt.po
new file mode 100644
index 00000000000..d9073313307
--- /dev/null
+++ b/addons/analytic/i18n/lt.po
@@ -0,0 +1,388 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-29 15:10+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: analytic
+#: field:account.analytic.account,child_ids:0
+msgid "Child Accounts"
+msgstr ""
+
+#. module: analytic
+#: selection:account.analytic.account,state:0
+msgid "In Progress"
+msgstr ""
+
+#. module: analytic
+#: code:addons/analytic/analytic.py:229
+#, python-format
+msgid "Contract: "
+msgstr ""
+
+#. module: analytic
+#: selection:account.analytic.account,state:0
+msgid "Template"
+msgstr ""
+
+#. module: analytic
+#: view:account.analytic.account:0
+msgid "End Date"
+msgstr ""
+
+#. module: analytic
+#: help:account.analytic.line,unit_amount:0
+msgid "Specifies the amount of quantity to count."
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,debit:0
+msgid "Debit"
+msgstr ""
+
+#. module: analytic
+#: help:account.analytic.account,type:0
+msgid ""
+"If you select the View Type, it means you won't allow to create journal "
+"entries using that account.\n"
+"The type 'Analytic account' stands for usual accounts that you only want to "
+"use in accounting.\n"
+"If you select Contract or Project, it offers you the possibility to manage "
+"the validity and the invoicing options for this account.\n"
+"The special type 'Template of Contract' allows you to define a template with "
+"default data that you can reuse easily."
+msgstr ""
+
+#. module: analytic
+#: view:account.analytic.account:0
+msgid ""
+"Once the end date of the contract is\n"
+" passed or the maximum number of "
+"service\n"
+" units (e.g. support contract) is\n"
+" reached, the account manager is "
+"notified \n"
+" by email to renew the contract with "
+"the\n"
+" customer."
+msgstr ""
+
+#. module: analytic
+#: selection:account.analytic.account,type:0
+msgid "Contract or Project"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,name:0
+msgid "Account/Contract Name"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,manager_id:0
+msgid "Account Manager"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: analytic
+#: selection:account.analytic.account,state:0
+msgid "Closed"
+msgstr ""
+
+#. module: analytic
+#: model:mail.message.subtype,name:analytic.mt_account_pending
+msgid "Contract to Renew"
+msgstr ""
+
+#. module: analytic
+#: selection:account.analytic.account,state:0
+msgid "New"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,user_id:0
+msgid "Project Manager"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,state:0
+msgid "Status"
+msgstr ""
+
+#. module: analytic
+#: code:addons/analytic/analytic.py:271
+#, python-format
+msgid "%s (copy)"
+msgstr ""
+
+#. module: analytic
+#: model:ir.model,name:analytic.model_account_analytic_line
+msgid "Analytic Line"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,description:0
+#: field:account.analytic.line,name:0
+msgid "Description"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: analytic
+#: constraint:account.analytic.account:0
+msgid "Error! You cannot create recursive analytic accounts."
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,company_id:0
+#: field:account.analytic.line,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: analytic
+#: view:account.analytic.account:0
+msgid "Renewal"
+msgstr ""
+
+#. module: analytic
+#: help:account.analytic.account,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: analytic
+#: model:mail.message.subtype,description:analytic.mt_account_opened
+msgid "Stage <b>opened</b>"
+msgstr ""
+
+#. module: analytic
+#: help:account.analytic.account,quantity_max:0
+msgid ""
+"Sets the higher limit of time to work on the contract, based on the "
+"timesheet. (for instance, number of hours in a limited support contract.)"
+msgstr ""
+
+#. module: analytic
+#: code:addons/analytic/analytic.py:160
+#, python-format
+msgid ""
+"If you set a company, the currency selected has to be the same as it's "
+"currency. \n"
+"You can remove the company belonging, and thus change the currency, only on "
+"analytic account of type 'view'. This can be really usefull for "
+"consolidation purposes of several companies charts with different "
+"currencies, for example."
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.line,user_id:0
+msgid "User"
+msgstr ""
+
+#. module: analytic
+#: model:mail.message.subtype,description:analytic.mt_account_pending
+msgid "Contract <b>pending</b>"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.line,date:0
+msgid "Date"
+msgstr ""
+
+#. module: analytic
+#: model:mail.message.subtype,name:analytic.mt_account_closed
+msgid "Contract Finished"
+msgstr ""
+
+#. module: analytic
+#: view:account.analytic.account:0
+msgid "Terms and Conditions"
+msgstr ""
+
+#. module: analytic
+#: help:account.analytic.line,amount:0
+msgid ""
+"Calculated by multiplying the quantity and the price given in the Product's "
+"cost price. Always expressed in the company main currency."
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,partner_id:0
+msgid "Customer"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,child_complete_ids:0
+msgid "Account Hierarchy"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,parent_id:0
+msgid "Parent Analytic Account"
+msgstr ""
+
+#. module: analytic
+#: view:account.analytic.account:0
+msgid "Contract Information"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,template_id:0
+#: selection:account.analytic.account,type:0
+msgid "Template of Contract"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,quantity_max:0
+msgid "Prepaid Service Units"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,credit:0
+msgid "Credit"
+msgstr ""
+
+#. module: analytic
+#: model:mail.message.subtype,name:analytic.mt_account_opened
+msgid "Contract Opened"
+msgstr ""
+
+#. module: analytic
+#: model:mail.message.subtype,description:analytic.mt_account_closed
+msgid "Contract <b>closed</b>"
+msgstr ""
+
+#. module: analytic
+#: selection:account.analytic.account,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: analytic
+#: selection:account.analytic.account,type:0
+msgid "Analytic View"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,balance:0
+msgid "Balance"
+msgstr ""
+
+#. module: analytic
+#: help:account.analytic.account,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: analytic
+#: selection:account.analytic.account,state:0
+msgid "To Renew"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,quantity:0
+#: field:account.analytic.line,unit_amount:0
+msgid "Quantity"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,date:0
+msgid "Date End"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,code:0
+msgid "Reference"
+msgstr ""
+
+#. module: analytic
+#: code:addons/analytic/analytic.py:160
+#, python-format
+msgid "Error!"
+msgstr ""
+
+#. module: analytic
+#: model:res.groups,name:analytic.group_analytic_accounting
+msgid "Analytic Accounting"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.line,amount:0
+msgid "Amount"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,complete_name:0
+msgid "Full Account Name"
+msgstr ""
+
+#. module: analytic
+#: view:account.analytic.account:0
+#: selection:account.analytic.account,type:0
+#: field:account.analytic.line,account_id:0
+#: model:ir.model,name:analytic.model_account_analytic_account
+msgid "Analytic Account"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,currency_id:0
+msgid "Currency"
+msgstr ""
+
+#. module: analytic
+#: help:account.analytic.account,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,type:0
+msgid "Type of Account"
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,date_start:0
+msgid "Start Date"
+msgstr ""
+
+#. module: analytic
+#: constraint:account.analytic.line:0
+msgid "You cannot create analytic line on view account."
+msgstr ""
+
+#. module: analytic
+#: field:account.analytic.account,line_ids:0
+msgid "Analytic Entries"
+msgstr ""
diff --git a/addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py b/addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py
index 8b10381434d..a1bf43714ce 100644
--- a/addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py
+++ b/addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py
@@ -152,6 +152,5 @@ class account_analytic_account(osv.osv):
'nodestroy': True,
}
-account_analytic_account()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/analytic_contract_hr_expense/i18n/cs.po b/addons/analytic_contract_hr_expense/i18n/cs.po
new file mode 100644
index 00000000000..b57756bce0b
--- /dev/null
+++ b/addons/analytic_contract_hr_expense/i18n/cs.po
@@ -0,0 +1,72 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "or view"
+msgstr ""
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "Nothing to invoice, create"
+msgstr ""
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "expenses"
+msgstr ""
+
+#. module: analytic_contract_hr_expense
+#: model:ir.model,name:analytic_contract_hr_expense.model_account_analytic_account
+msgid "Analytic Account"
+msgstr ""
+
+#. module: analytic_contract_hr_expense
+#: code:addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py:129
+#, python-format
+msgid "Expenses to Invoice of %s"
+msgstr ""
+
+#. module: analytic_contract_hr_expense
+#: code:addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py:121
+#, python-format
+msgid "Expenses of %s"
+msgstr ""
+
+#. module: analytic_contract_hr_expense
+#: field:account.analytic.account,expense_invoiced:0
+#: field:account.analytic.account,expense_to_invoice:0
+#: field:account.analytic.account,remaining_expense:0
+msgid "unknown"
+msgstr ""
+
+#. module: analytic_contract_hr_expense
+#: field:account.analytic.account,est_expenses:0
+msgid "Estimation of Expenses to Invoice"
+msgstr ""
+
+#. module: analytic_contract_hr_expense
+#: field:account.analytic.account,charge_expenses:0
+msgid "Charge Expenses"
+msgstr ""
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "⇒ Invoice"
+msgstr ""
diff --git a/addons/analytic_contract_hr_expense/i18n/nl_BE.po b/addons/analytic_contract_hr_expense/i18n/nl_BE.po
new file mode 100644
index 00000000000..4bc0cc559e5
--- /dev/null
+++ b/addons/analytic_contract_hr_expense/i18n/nl_BE.po
@@ -0,0 +1,72 @@
+# Dutch (Belgium) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-15 16:33+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "or view"
+msgstr "of bekijk"
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "Nothing to invoice, create"
+msgstr "Niets te factureren, aanmaken"
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "expenses"
+msgstr "onkosten"
+
+#. module: analytic_contract_hr_expense
+#: model:ir.model,name:analytic_contract_hr_expense.model_account_analytic_account
+msgid "Analytic Account"
+msgstr "Analytische rekening"
+
+#. module: analytic_contract_hr_expense
+#: code:addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py:129
+#, python-format
+msgid "Expenses to Invoice of %s"
+msgstr "Te factureren onkosten van %s"
+
+#. module: analytic_contract_hr_expense
+#: code:addons/analytic_contract_hr_expense/analytic_contract_hr_expense.py:121
+#, python-format
+msgid "Expenses of %s"
+msgstr "Onkosten van %s"
+
+#. module: analytic_contract_hr_expense
+#: field:account.analytic.account,expense_invoiced:0
+#: field:account.analytic.account,expense_to_invoice:0
+#: field:account.analytic.account,remaining_expense:0
+msgid "unknown"
+msgstr "onbekend"
+
+#. module: analytic_contract_hr_expense
+#: field:account.analytic.account,est_expenses:0
+msgid "Estimation of Expenses to Invoice"
+msgstr "Te verwachten te factureren onkosten"
+
+#. module: analytic_contract_hr_expense
+#: field:account.analytic.account,charge_expenses:0
+msgid "Charge Expenses"
+msgstr "Onkosten doorrekenen"
+
+#. module: analytic_contract_hr_expense
+#: view:account.analytic.account:0
+msgid "⇒ Invoice"
+msgstr "⇒ Factuur"
diff --git a/addons/anonymization/anonymization.py b/addons/anonymization/anonymization.py
index de46e2e8d03..025f1f79f70 100644
--- a/addons/anonymization/anonymization.py
+++ b/addons/anonymization/anonymization.py
@@ -411,7 +411,7 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory):
model_name = field.model_id.model
field_name = field.field_id.name
field_type = field.field_id.ttype
- table_name = self.pool.get(model_name)._table
+ table_name = self.pool[model_name]._table
# get the current value
sql = "select id, %s from %s" % (field_name, table_name)
@@ -543,7 +543,7 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory):
fixes = group(fixes, ('model_name', 'field_name'))
for line in data:
- table_name = self.pool.get(line['model_id'])._table if self.pool.get(line['model_id']) else None
+ table_name = self.pool[line['model_id']]._table if line['model_id'] in self.pool else None
# check if custom sql exists:
key = (line['model_id'], line['field_id'])
diff --git a/addons/anonymization/i18n/cs.po b/addons/anonymization/i18n/cs.po
new file mode 100644
index 00000000000..aa320cbba21
--- /dev/null
+++ b/addons/anonymization/i18n/cs.po
@@ -0,0 +1,331 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: anonymization
+#: model:ir.model,name:anonymization.model_ir_model_fields_anonymize_wizard
+msgid "ir.model.fields.anonymize.wizard"
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization,model_id:0
+msgid "Object"
+msgstr ""
+
+#. module: anonymization
+#: model:ir.model,name:anonymization.model_ir_model_fields_anonymization_migration_fix
+msgid "ir.model.fields.anonymization.migration.fix"
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.migration.fix,target_version:0
+msgid "Target Version"
+msgstr ""
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.migration.fix,query_type:0
+msgid "sql"
+msgstr ""
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:91
+#, python-format
+msgid ""
+"The database anonymization is currently in an unstable state. Some fields "
+"are anonymized, while some fields are not anonymized. You should try to "
+"solve this problem before trying to create, write or delete fields."
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization,field_name:0
+msgid "Field Name"
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization,field_id:0
+#: field:ir.model.fields.anonymization.migration.fix,field_name:0
+msgid "Field"
+msgstr ""
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization,state:0
+msgid "New"
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymize.wizard,file_import:0
+msgid "Import"
+msgstr ""
+
+#. module: anonymization
+#: model:ir.model,name:anonymization.model_ir_model_fields_anonymization
+msgid "ir.model.fields.anonymization"
+msgstr ""
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:300
+#, python-format
+msgid ""
+"Before executing the anonymization process, you should make a backup of your "
+"database."
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.history,state:0
+#: field:ir.model.fields.anonymize.wizard,state:0
+msgid "Status"
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.history,direction:0
+msgid "Direction"
+msgstr ""
+
+#. module: anonymization
+#: model:ir.actions.act_window,name:anonymization.action_ir_model_fields_anonymization_tree
+#: view:ir.model.fields.anonymization:0
+#: model:ir.ui.menu,name:anonymization.menu_administration_anonymization_fields
+msgid "Anonymized Fields"
+msgstr ""
+
+#. module: anonymization
+#: model:ir.ui.menu,name:anonymization.menu_administration_anonymization
+msgid "Database anonymization"
+msgstr ""
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.history,direction:0
+msgid "clear -> anonymized"
+msgstr ""
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization,state:0
+#: selection:ir.model.fields.anonymize.wizard,state:0
+msgid "Anonymized"
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization,state:0
+msgid "unknown"
+msgstr ""
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:448
+#, python-format
+msgid "Anonymized value is None. This cannot happens."
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.history,filepath:0
+msgid "File path"
+msgstr ""
+
+#. module: anonymization
+#: help:ir.model.fields.anonymize.wizard,file_import:0
+msgid ""
+"This is the file created by the anonymization process. It should have the "
+"'.pickle' extention."
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.history,date:0
+msgid "Date"
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymize.wizard,file_export:0
+msgid "Export"
+msgstr ""
+
+#. module: anonymization
+#: view:ir.model.fields.anonymize.wizard:0
+msgid "Reverse the Database Anonymization"
+msgstr ""
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:444
+#, python-format
+msgid ""
+"Cannot anonymize fields of these types: binary, many2many, many2one, "
+"one2many, reference."
+msgstr ""
+
+#. module: anonymization
+#: view:ir.model.fields.anonymize.wizard:0
+msgid "Database Anonymization"
+msgstr ""
+
+#. module: anonymization
+#: model:ir.ui.menu,name:anonymization.menu_administration_anonymization_wizard
+msgid "Anonymize database"
+msgstr ""
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.migration.fix,query_type:0
+msgid "python"
+msgstr ""
+
+#. module: anonymization
+#: view:ir.model.fields.anonymization.history:0
+#: field:ir.model.fields.anonymization.history,field_ids:0
+msgid "Fields"
+msgstr ""
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization,state:0
+#: selection:ir.model.fields.anonymize.wizard,state:0
+msgid "Clear"
+msgstr ""
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:533
+#, python-format
+msgid ""
+"It is not possible to reverse the anonymization process without supplying "
+"the anonymization export file."
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymize.wizard,summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: anonymization
+#: view:ir.model.fields.anonymization:0
+msgid "Anonymized Field"
+msgstr ""
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:391
+#: code:addons/anonymization/anonymization.py:526
+#, python-format
+msgid ""
+"The database anonymization is currently in an unstable state. Some fields "
+"are anonymized, while some fields are not anonymized. You should try to "
+"solve this problem before trying to do anything."
+msgstr ""
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymize.wizard,state:0
+msgid "Unstable"
+msgstr ""
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.history,state:0
+msgid "Exception occured"
+msgstr ""
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization,state:0
+msgid "Not Existing"
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization,model_name:0
+msgid "Object Name"
+msgstr ""
+
+#. module: anonymization
+#: model:ir.actions.act_window,name:anonymization.action_ir_model_fields_anonymization_history_tree
+#: view:ir.model.fields.anonymization.history:0
+#: model:ir.ui.menu,name:anonymization.menu_administration_anonymization_history
+msgid "Anonymization History"
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.migration.fix,model_name:0
+msgid "Model"
+msgstr ""
+
+#. module: anonymization
+#: model:ir.model,name:anonymization.model_ir_model_fields_anonymization_history
+msgid "ir.model.fields.anonymization.history"
+msgstr ""
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:358
+#, python-format
+msgid ""
+"The database anonymization is currently in an unstable state. Some fields "
+"are anonymized, while some fields are not anonymized. You should try to "
+"solve this problem before trying to do anything else."
+msgstr ""
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:389
+#: code:addons/anonymization/anonymization.py:448
+#, python-format
+msgid "Error !"
+msgstr ""
+
+#. module: anonymization
+#: model:ir.actions.act_window,name:anonymization.action_ir_model_fields_anonymize_wizard
+#: view:ir.model.fields.anonymize.wizard:0
+msgid "Anonymize Database"
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymize.wizard,name:0
+msgid "File Name"
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.migration.fix,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.history,direction:0
+msgid "anonymized -> clear"
+msgstr ""
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.history,state:0
+msgid "Started"
+msgstr ""
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:389
+#, python-format
+msgid "The database is currently anonymized, you cannot anonymize it again."
+msgstr ""
+
+#. module: anonymization
+#: selection:ir.model.fields.anonymization.history,state:0
+msgid "Done"
+msgstr ""
+
+#. module: anonymization
+#: field:ir.model.fields.anonymization.migration.fix,query:0
+#: field:ir.model.fields.anonymization.migration.fix,query_type:0
+msgid "Query"
+msgstr ""
+
+#. module: anonymization
+#: view:ir.model.fields.anonymization.history:0
+#: field:ir.model.fields.anonymization.history,msg:0
+#: field:ir.model.fields.anonymize.wizard,msg:0
+msgid "Message"
+msgstr ""
+
+#. module: anonymization
+#: code:addons/anonymization/anonymization.py:65
+#: sql_constraint:ir.model.fields.anonymization:0
+#, python-format
+msgid "You cannot have two fields with the same name on the same object!"
+msgstr ""
diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py
index 811c5387697..159baf3a9e7 100644
--- a/addons/audittrail/audittrail.py
+++ b/addons/audittrail/audittrail.py
@@ -70,8 +70,7 @@ class audittrail_rule(osv.osv):
obj_model = self.pool.get('ir.model.data')
#start Loop
for thisrule in self.browse(cr, uid, ids):
- obj = self.pool.get(thisrule.object_id.model)
- if not obj:
+ if thisrule.object_id.model not in self.pool:
raise osv.except_osv(
_('WARNING: audittrail is not part of the pool'),
_('Change audittrail depends -- Setting rule as DRAFT'))
@@ -131,7 +130,7 @@ class audittrail_log(osv.osv):
model_object = resname.object_id
res_id = resname.res_id
if model_object and res_id:
- model_pool = self.pool.get(model_object.model)
+ model_pool = self.pool[model_object.model]
res = model_pool.read(cr, uid, res_id, ['name'])
data[resname.id] = res['name']
else:
@@ -190,7 +189,7 @@ def get_value_text(cr, uid, pool, resource_pool, method, field, value):
field_obj = (resource_pool._all_columns.get(field)).column
if field_obj._type in ('one2many','many2many'):
- data = pool.get(field_obj._obj).name_get(cr, uid, value)
+ data = pool[field_obj._obj].name_get(cr, uid, value)
#return the modifications on x2many fields as a list of names
res = map(lambda x:x[1], data)
elif field_obj._type == 'many2one':
@@ -212,7 +211,7 @@ def create_log_line(cr, uid, log_id, model, lines=None):
if lines is None:
lines = []
pool = openerp.registry(cr.dbname)
- obj_pool = pool.get(model.model)
+ obj_pool = pool[model.model]
model_pool = pool.get('ir.model')
field_pool = pool.get('ir.model.fields')
log_line_pool = pool.get('audittrail.log.line')
@@ -251,7 +250,7 @@ def log_fct(cr, uid_orig, model, method, fct_src, *args, **kw):
@return: Returns result as per method of Object proxy
"""
pool = openerp.registry(cr.dbname)
- resource_pool = pool.get(model)
+ resource_pool = pool[model]
model_pool = pool.get('ir.model')
model_ids = model_pool.search(cr, SUPERUSER_ID, [('model', '=', model)])
model_id = model_ids and model_ids[0] or False
@@ -321,7 +320,7 @@ def get_data(cr, uid, pool, res_ids, model, method):
}
"""
data = {}
- resource_pool = pool.get(model.model)
+ resource_pool = pool[model.model]
# read all the fields of the given resources in super admin mode
for resource in resource_pool.read(cr, SUPERUSER_ID, res_ids):
values = {}
@@ -390,7 +389,7 @@ def prepare_audittrail_log_line(cr, uid, pool, model, resource_id, method, old_v
key: []
}
# loop on all the fields
- for field_name, field_definition in pool.get(model.model)._all_columns.items():
+ for field_name, field_definition in pool[model.model]._all_columns.items():
if field_name in ('__last_update', 'id'):
continue
#if the field_list param is given, skip all the fields not in that list
@@ -457,7 +456,7 @@ def process_data(cr, uid, pool, res_ids, model, method, old_values=None, new_val
# if at least one modification has been found
for model_id, resource_id in lines:
- name = pool.get(model.model).name_get(cr, uid, [resource_id])[0][1]
+ name = pool[model.model].name_get(cr, uid, [resource_id])[0][1]
vals = {
'method': method,
'object_id': model_id,
diff --git a/addons/audittrail/wizard/audittrail_view_log.py b/addons/audittrail/wizard/audittrail_view_log.py
index d06da281933..4385970f8d9 100644
--- a/addons/audittrail/wizard/audittrail_view_log.py
+++ b/addons/audittrail/wizard/audittrail_view_log.py
@@ -61,6 +61,5 @@ class audittrail_view_log(osv.osv_memory):
#End Loop
return result
-audittrail_view_log()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_crypt/i18n/cs.po b/addons/auth_crypt/i18n/cs.po
index b97e90df13b..0ae0746fbdb 100644
--- a/addons/auth_crypt/i18n/cs.po
+++ b/addons/auth_crypt/i18n/cs.po
@@ -1,41 +1,28 @@
# Czech translation for openobject-addons
-# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-03 16:03+0000\n"
-"PO-Revision-Date: 2012-04-06 05:20+0000\n"
-"Last-Translator: Jiří Hajda <robie@centrum.cz>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Czech <cs@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-12-04 05:53+0000\n"
-"X-Generator: Launchpad (build 16335)\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
-#. module: base_crypt
-#: model:ir.model,name:base_crypt.model_res_users
-msgid "Users"
+#. module: auth_crypt
+#: field:res.users,password_crypt:0
+msgid "Encrypted Password"
msgstr ""
-#~ msgid "You can not have two users with the same login !"
-#~ msgstr "Nemůžete mít dva uživatele se stejným přihlašovacím jménem !"
-
-#, python-format
-#~ msgid "Error"
-#~ msgstr "Chyba"
-
-#, python-format
-#~ msgid "Please specify the password !"
-#~ msgstr "Prosíme zadejte heslo!"
-
-#~ msgid "The chosen company is not in the allowed companies for this user"
-#~ msgstr ""
-#~ "Vybraná společnost není v povolených společnostech pro tohoto uživatele"
-
-#~ msgid "res.users"
-#~ msgstr "res.users"
+#. module: auth_crypt
+#: model:ir.model,name:auth_crypt.model_res_users
+msgid "Users"
+msgstr ""
diff --git a/addons/auth_crypt/i18n/lt.po b/addons/auth_crypt/i18n/lt.po
new file mode 100644
index 00000000000..03f0bd5249f
--- /dev/null
+++ b/addons/auth_crypt/i18n/lt.po
@@ -0,0 +1,28 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-24 18:24+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-25 05:20+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: auth_crypt
+#: field:res.users,password_crypt:0
+msgid "Encrypted Password"
+msgstr "Užšifruotas slaptažodis"
+
+#. module: auth_crypt
+#: model:ir.model,name:auth_crypt.model_res_users
+msgid "Users"
+msgstr "Naudotojai"
diff --git a/addons/auth_crypt/i18n/nl_BE.po b/addons/auth_crypt/i18n/nl_BE.po
index b9477ece5dc..abb65c8700f 100644
--- a/addons/auth_crypt/i18n/nl_BE.po
+++ b/addons/auth_crypt/i18n/nl_BE.po
@@ -1,42 +1,28 @@
# Dutch (Belgium) translation for openobject-addons
-# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2012-12-03 16:03+0000\n"
-"PO-Revision-Date: 2012-07-26 17:52+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-15 16:02+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-12-04 05:53+0000\n"
-"X-Generator: Launchpad (build 16335)\n"
+"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
-#. module: base_crypt
-#: model:ir.model,name:base_crypt.model_res_users
-msgid "Users"
-msgstr ""
-
-#~ msgid "You can not have two users with the same login !"
-#~ msgstr "U kunt geen twee gebruikers met dezelfde login maken."
-
-#, python-format
-#~ msgid "Please specify the password !"
-#~ msgstr "Gelieve een wachtwoord op te geven"
+#. module: auth_crypt
+#: field:res.users,password_crypt:0
+msgid "Encrypted Password"
+msgstr "Geëncrypteerd wachtwoord"
-#~ msgid "The chosen company is not in the allowed companies for this user"
-#~ msgstr ""
-#~ "De gekozen firma behoort niet tot de toegelaten bedrijven voor deze "
-#~ "gebruiker."
-
-#~ msgid "res.users"
-#~ msgstr "res.users"
-
-#, python-format
-#~ msgid "Error"
-#~ msgstr "Fout"
+#. module: auth_crypt
+#: model:ir.model,name:auth_crypt.model_res_users
+msgid "Users"
+msgstr "Gebruikers"
diff --git a/addons/auth_ldap/i18n/cs.po b/addons/auth_ldap/i18n/cs.po
new file mode 100644
index 00000000000..539c923450d
--- /dev/null
+++ b/addons/auth_ldap/i18n/cs.po
@@ -0,0 +1,159 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: auth_ldap
+#: field:res.company.ldap,user:0
+msgid "Template User"
+msgstr ""
+
+#. module: auth_ldap
+#: help:res.company.ldap,ldap_tls:0
+msgid ""
+"Request secure TLS/SSL encryption when connecting to the LDAP server. This "
+"option requires a server with STARTTLS enabled, otherwise all authentication "
+"attempts will fail."
+msgstr ""
+
+#. module: auth_ldap
+#: view:res.company:0
+#: view:res.company.ldap:0
+msgid "LDAP Configuration"
+msgstr ""
+
+#. module: auth_ldap
+#: field:res.company.ldap,ldap_binddn:0
+msgid "LDAP binddn"
+msgstr ""
+
+#. module: auth_ldap
+#: field:res.company.ldap,company:0
+msgid "Company"
+msgstr ""
+
+#. module: auth_ldap
+#: field:res.company.ldap,ldap_server:0
+msgid "LDAP Server address"
+msgstr ""
+
+#. module: auth_ldap
+#: field:res.company.ldap,ldap_server_port:0
+msgid "LDAP Server port"
+msgstr ""
+
+#. module: auth_ldap
+#: help:res.company.ldap,create_user:0
+msgid ""
+"Automatically create local user accounts for new users authenticating via "
+"LDAP"
+msgstr ""
+
+#. module: auth_ldap
+#: field:res.company.ldap,ldap_base:0
+msgid "LDAP base"
+msgstr ""
+
+#. module: auth_ldap
+#: view:res.company.ldap:0
+msgid "User Information"
+msgstr ""
+
+#. module: auth_ldap
+#: field:res.company.ldap,ldap_password:0
+msgid "LDAP password"
+msgstr ""
+
+#. module: auth_ldap
+#: model:ir.model,name:auth_ldap.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: auth_ldap
+#: view:res.company.ldap:0
+msgid "Process Parameter"
+msgstr ""
+
+#. module: auth_ldap
+#: model:ir.model,name:auth_ldap.model_res_company_ldap
+msgid "res.company.ldap"
+msgstr ""
+
+#. module: auth_ldap
+#: help:res.company.ldap,user:0
+msgid "User to copy when creating new users"
+msgstr ""
+
+#. module: auth_ldap
+#: field:res.company.ldap,ldap_tls:0
+msgid "Use TLS"
+msgstr ""
+
+#. module: auth_ldap
+#: field:res.company.ldap,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: auth_ldap
+#: view:res.company.ldap:0
+msgid "Login Information"
+msgstr ""
+
+#. module: auth_ldap
+#: view:res.company.ldap:0
+msgid "Server Information"
+msgstr ""
+
+#. module: auth_ldap
+#: model:ir.actions.act_window,name:auth_ldap.action_ldap_installer
+msgid "Setup your LDAP Server"
+msgstr ""
+
+#. module: auth_ldap
+#: view:res.company:0
+#: field:res.company,ldaps:0
+msgid "LDAP Parameters"
+msgstr ""
+
+#. module: auth_ldap
+#: help:res.company.ldap,ldap_password:0
+msgid ""
+"The password of the user account on the LDAP server that is used to query "
+"the directory."
+msgstr ""
+
+#. module: auth_ldap
+#: help:res.company.ldap,ldap_binddn:0
+msgid ""
+"The user account on the LDAP server that is used to query the directory. "
+"Leave empty to connect anonymously."
+msgstr ""
+
+#. module: auth_ldap
+#: model:ir.model,name:auth_ldap.model_res_users
+msgid "Users"
+msgstr ""
+
+#. module: auth_ldap
+#: field:res.company.ldap,ldap_filter:0
+msgid "LDAP filter"
+msgstr ""
+
+#. module: auth_ldap
+#: field:res.company.ldap,create_user:0
+msgid "Create user"
+msgstr ""
diff --git a/addons/auth_ldap/users_ldap.py b/addons/auth_ldap/users_ldap.py
index e8778449da5..8e7128ca91e 100644
--- a/addons/auth_ldap/users_ldap.py
+++ b/addons/auth_ldap/users_ldap.py
@@ -227,7 +227,6 @@ class CompanyLDAP(osv.osv):
'create_user': True,
}
-CompanyLDAP()
class res_company(osv.osv):
@@ -236,7 +235,6 @@ class res_company(osv.osv):
'ldaps': fields.one2many(
'res.company.ldap', 'company', 'LDAP Parameters'),
}
-res_company()
class users(osv.osv):
@@ -282,5 +280,4 @@ class users(osv.osv):
cr.close()
raise openerp.exceptions.AccessDenied()
-users()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_oauth/i18n/cs.po b/addons/auth_oauth/i18n/cs.po
new file mode 100644
index 00000000000..e607a08a7bd
--- /dev/null
+++ b/addons/auth_oauth/i18n/cs.po
@@ -0,0 +1,135 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:45+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,validation_endpoint:0
+msgid "Validation URL"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,auth_endpoint:0
+msgid "Authentication URL"
+msgstr ""
+
+#. module: auth_oauth
+#: model:ir.model,name:auth_oauth.model_base_config_settings
+msgid "base.config.settings"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,name:0
+msgid "Provider name"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,scope:0
+msgid "Scope"
+msgstr ""
+
+#. module: auth_oauth
+#: field:res.users,oauth_provider_id:0
+msgid "OAuth Provider"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,css_class:0
+msgid "CSS class"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,body:0
+msgid "Body"
+msgstr ""
+
+#. module: auth_oauth
+#: model:ir.model,name:auth_oauth.model_res_users
+msgid "Users"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,sequence:0
+msgid "unknown"
+msgstr ""
+
+#. module: auth_oauth
+#: field:res.users,oauth_access_token:0
+msgid "OAuth Access Token"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,client_id:0
+#: field:base.config.settings,auth_oauth_facebook_client_id:0
+#: field:base.config.settings,auth_oauth_google_client_id:0
+msgid "Client ID"
+msgstr ""
+
+#. module: auth_oauth
+#: model:ir.ui.menu,name:auth_oauth.menu_oauth_providers
+msgid "OAuth Providers"
+msgstr ""
+
+#. module: auth_oauth
+#: model:ir.model,name:auth_oauth.model_auth_oauth_provider
+msgid "OAuth2 provider"
+msgstr ""
+
+#. module: auth_oauth
+#: field:res.users,oauth_uid:0
+msgid "OAuth User ID"
+msgstr ""
+
+#. module: auth_oauth
+#: field:base.config.settings,auth_oauth_facebook_enabled:0
+msgid "Allow users to sign in with Facebook"
+msgstr ""
+
+#. module: auth_oauth
+#: sql_constraint:res.users:0
+msgid "OAuth UID must be unique per provider"
+msgstr ""
+
+#. module: auth_oauth
+#: help:res.users,oauth_uid:0
+msgid "Oauth Provider user_id"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,data_endpoint:0
+msgid "Data URL"
+msgstr ""
+
+#. module: auth_oauth
+#: view:auth.oauth.provider:0
+msgid "arch"
+msgstr ""
+
+#. module: auth_oauth
+#: model:ir.actions.act_window,name:auth_oauth.action_oauth_provider
+msgid "Providers"
+msgstr ""
+
+#. module: auth_oauth
+#: field:base.config.settings,auth_oauth_google_enabled:0
+msgid "Allow users to sign in with Google"
+msgstr ""
+
+#. module: auth_oauth
+#: field:auth.oauth.provider,enabled:0
+msgid "Allowed"
+msgstr ""
diff --git a/addons/auth_oauth/static/src/js/auth_oauth.js b/addons/auth_oauth/static/src/js/auth_oauth.js
index 7ee83bd99e9..131ae5c1c42 100644
--- a/addons/auth_oauth/static/src/js/auth_oauth.js
+++ b/addons/auth_oauth/static/src/js/auth_oauth.js
@@ -5,6 +5,7 @@ openerp.auth_oauth = function(instance) {
start: function(parent, params) {
var self = this;
var d = this._super.apply(this, arguments);
+ this.$el.hide();
this.$el.on('click', 'a.zocial', this.on_oauth_sign_in);
this.oauth_providers = [];
if(this.params.oauth_error === 1) {
@@ -24,6 +25,8 @@ openerp.auth_oauth = function(instance) {
var db = this.$("form [name=db]").val();
if (db) {
this.rpc("/auth_oauth/list_providers", { dbname: db }).done(this.on_oauth_loaded);
+ } else {
+ this.$el.show();
}
},
on_oauth_loaded: function(result) {
@@ -32,6 +35,7 @@ openerp.auth_oauth = function(instance) {
if (this.oauth_providers.length === 1 && params.type === 'signup') {
this.do_oauth_sign_in(this.oauth_providers[0]);
} else {
+ this.$el.show();
this.$('.oe_oauth_provider_login_button').remove();
var buttons = QWeb.render("auth_oauth.Login.button",{"widget":this});
this.$(".oe_login_pane form ul").after(buttons);
@@ -57,7 +61,7 @@ openerp.auth_oauth = function(instance) {
state: JSON.stringify(state),
};
var url = provider.auth_endpoint + '?' + $.param(params);
- window.location = url;
+ instance.web.redirect(url);
},
_oauth_state: function(provider) {
// return the state object sent back with the redirected uri
diff --git a/addons/auth_oauth_signup/i18n/cs.po b/addons/auth_oauth_signup/i18n/cs.po
new file mode 100644
index 00000000000..6351d6c056c
--- /dev/null
+++ b/addons/auth_oauth_signup/i18n/cs.po
@@ -0,0 +1,23 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:45+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: auth_oauth_signup
+#: model:ir.model,name:auth_oauth_signup.model_res_users
+msgid "Users"
+msgstr ""
diff --git a/addons/auth_oauth_signup/i18n/lt.po b/addons/auth_oauth_signup/i18n/lt.po
new file mode 100644
index 00000000000..27fb83e6a4f
--- /dev/null
+++ b/addons/auth_oauth_signup/i18n/lt.po
@@ -0,0 +1,23 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-24 18:21+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-25 05:20+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: auth_oauth_signup
+#: model:ir.model,name:auth_oauth_signup.model_res_users
+msgid "Users"
+msgstr "Naudotojai"
diff --git a/addons/auth_oauth_signup/i18n/nl_BE.po b/addons/auth_oauth_signup/i18n/nl_BE.po
new file mode 100644
index 00000000000..04d5034d029
--- /dev/null
+++ b/addons/auth_oauth_signup/i18n/nl_BE.po
@@ -0,0 +1,23 @@
+# Dutch (Belgium) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-15 16:01+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
+
+#. module: auth_oauth_signup
+#: model:ir.model,name:auth_oauth_signup.model_res_users
+msgid "Users"
+msgstr "Gebruikers"
diff --git a/addons/auth_openid/i18n/cs.po b/addons/auth_openid/i18n/cs.po
new file mode 100644
index 00000000000..071ee7ea210
--- /dev/null
+++ b/addons/auth_openid/i18n/cs.po
@@ -0,0 +1,97 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:45+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:24
+#, python-format
+msgid "Username"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:12
+#: view:res.users:0
+#, python-format
+msgid "OpenID"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:30
+#: field:res.users,openid_url:0
+#, python-format
+msgid "OpenID URL"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:9
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:10
+#, python-format
+msgid "Google"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:11
+#, python-format
+msgid "Launchpad"
+msgstr ""
+
+#. module: auth_openid
+#: help:res.users,openid_email:0
+msgid "Used for disambiguation in case of a shared OpenID URL"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:18
+#, python-format
+msgid "Google Apps Domain"
+msgstr ""
+
+#. module: auth_openid
+#: field:res.users,openid_email:0
+msgid "OpenID Email"
+msgstr ""
+
+#. module: auth_openid
+#: field:res.users,openid_key:0
+msgid "OpenID Key"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:8
+#, python-format
+msgid "Password"
+msgstr ""
+
+#. module: auth_openid
+#. openerp-web
+#: code:addons/auth_openid/static/src/xml/auth_openid.xml:10
+#, python-format
+msgid "Google Apps"
+msgstr ""
+
+#. module: auth_openid
+#: model:ir.model,name:auth_openid.model_res_users
+msgid "Users"
+msgstr ""
diff --git a/addons/auth_openid/res_users.py b/addons/auth_openid/res_users.py
index feea2d8d396..47e119f2a1e 100644
--- a/addons/auth_openid/res_users.py
+++ b/addons/auth_openid/res_users.py
@@ -91,7 +91,6 @@ class res_users(osv.osv):
raise
self._uid_cache.setdefault(db, {})[uid] = passwd
-res_users()
diff --git a/addons/auth_signup/i18n/cs.po b/addons/auth_signup/i18n/cs.po
new file mode 100644
index 00000000000..ee9cf157cdd
--- /dev/null
+++ b/addons/auth_signup/i18n/cs.po
@@ -0,0 +1,279 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:45+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: auth_signup
+#: field:res.partner,signup_type:0
+msgid "Signup Token Type"
+msgstr ""
+
+#. module: auth_signup
+#: field:base.config.settings,auth_signup_uninvited:0
+msgid "Allow external users to sign up"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:16
+#, python-format
+msgid "Confirm Password"
+msgstr ""
+
+#. module: auth_signup
+#: help:base.config.settings,auth_signup_uninvited:0
+msgid "If unchecked, only invited users may sign up."
+msgstr ""
+
+#. module: auth_signup
+#: model:ir.model,name:auth_signup.model_base_config_settings
+msgid "base.config.settings"
+msgstr ""
+
+#. module: auth_signup
+#: code:addons/auth_signup/res_users.py:265
+#, python-format
+msgid "Cannot send email: user has no email address."
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:24
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:28
+#, python-format
+msgid "Reset password"
+msgstr ""
+
+#. module: auth_signup
+#: field:base.config.settings,auth_signup_template_user_id:0
+msgid "Template user for new users created through signup"
+msgstr ""
+
+#. module: auth_signup
+#: model:email.template,subject:auth_signup.reset_password_email
+msgid "Password reset"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:117
+#, python-format
+msgid "Please enter a password and confirm it."
+msgstr ""
+
+#. module: auth_signup
+#: view:res.users:0
+msgid "Send an email to the user to (re)set their password."
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:23
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:26
+#, python-format
+msgid "Sign Up"
+msgstr ""
+
+#. module: auth_signup
+#: selection:res.users,state:0
+msgid "New"
+msgstr ""
+
+#. module: auth_signup
+#: code:addons/auth_signup/res_users.py:258
+#, python-format
+msgid "Mail sent to:"
+msgstr ""
+
+#. module: auth_signup
+#: field:res.users,state:0
+msgid "Status"
+msgstr ""
+
+#. module: auth_signup
+#: model:email.template,body_html:auth_signup.reset_password_email
+msgid ""
+"\n"
+"<p>A password reset was requested for the OpenERP account linked to this "
+"email.</p>\n"
+"\n"
+"<p>You may change your password by following <a "
+"href=\"${object.signup_url}\">this link</a>.</p>\n"
+"\n"
+"<p>Note: If you do not expect this, you can safely ignore this email.</p>"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:111
+#, python-format
+msgid "Please enter a name."
+msgstr ""
+
+#. module: auth_signup
+#: model:ir.model,name:auth_signup.model_res_users
+msgid "Users"
+msgstr ""
+
+#. module: auth_signup
+#: field:res.partner,signup_url:0
+msgid "Signup URL"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:114
+#, python-format
+msgid "Please enter a username."
+msgstr ""
+
+#. module: auth_signup
+#: selection:res.users,state:0
+msgid "Active"
+msgstr ""
+
+#. module: auth_signup
+#: code:addons/auth_signup/res_users.py:269
+#, python-format
+msgid ""
+"Cannot send email: no outgoing email server configured.\n"
+"You can configure it under Settings/General Settings."
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:12
+#, python-format
+msgid "Username"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:8
+#, python-format
+msgid "Name"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:170
+#, python-format
+msgid "Please enter a username or email address."
+msgstr ""
+
+#. module: auth_signup
+#: selection:res.users,state:0
+msgid "Resetting Password"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:13
+#, python-format
+msgid "Username (Email)"
+msgstr ""
+
+#. module: auth_signup
+#: field:res.partner,signup_expiration:0
+msgid "Signup Expiration"
+msgstr ""
+
+#. module: auth_signup
+#: help:base.config.settings,auth_signup_reset_password:0
+msgid "This allows users to trigger a password reset from the Login page."
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:22
+#, python-format
+msgid "Log in"
+msgstr ""
+
+#. module: auth_signup
+#: field:res.partner,signup_valid:0
+msgid "Signup Token is Valid"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:108
+#: code:addons/auth_signup/static/src/js/auth_signup.js:111
+#: code:addons/auth_signup/static/src/js/auth_signup.js:114
+#: code:addons/auth_signup/static/src/js/auth_signup.js:117
+#: code:addons/auth_signup/static/src/js/auth_signup.js:120
+#: code:addons/auth_signup/static/src/js/auth_signup.js:167
+#: code:addons/auth_signup/static/src/js/auth_signup.js:170
+#, python-format
+msgid "Login"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:94
+#, python-format
+msgid "Invalid signup token"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:120
+#, python-format
+msgid "Passwords do not match; please retype them."
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:108
+#: code:addons/auth_signup/static/src/js/auth_signup.js:167
+#, python-format
+msgid "No database selected !"
+msgstr ""
+
+#. module: auth_signup
+#: view:res.users:0
+msgid "Reset Password"
+msgstr ""
+
+#. module: auth_signup
+#: field:base.config.settings,auth_signup_reset_password:0
+msgid "Enable password reset from Login page"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:27
+#, python-format
+msgid "Back to Login"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:22
+#, python-format
+msgid "Sign up"
+msgstr ""
+
+#. module: auth_signup
+#: model:ir.model,name:auth_signup.model_res_partner
+msgid "Partner"
+msgstr ""
+
+#. module: auth_signup
+#: field:res.partner,signup_token:0
+msgid "Signup Token"
+msgstr ""
diff --git a/addons/auth_signup/i18n/lt.po b/addons/auth_signup/i18n/lt.po
new file mode 100644
index 00000000000..7ae419856e6
--- /dev/null
+++ b/addons/auth_signup/i18n/lt.po
@@ -0,0 +1,279 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-29 15:13+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: auth_signup
+#: field:res.partner,signup_type:0
+msgid "Signup Token Type"
+msgstr ""
+
+#. module: auth_signup
+#: field:base.config.settings,auth_signup_uninvited:0
+msgid "Allow external users to sign up"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:16
+#, python-format
+msgid "Confirm Password"
+msgstr ""
+
+#. module: auth_signup
+#: help:base.config.settings,auth_signup_uninvited:0
+msgid "If unchecked, only invited users may sign up."
+msgstr ""
+
+#. module: auth_signup
+#: model:ir.model,name:auth_signup.model_base_config_settings
+msgid "base.config.settings"
+msgstr ""
+
+#. module: auth_signup
+#: code:addons/auth_signup/res_users.py:265
+#, python-format
+msgid "Cannot send email: user has no email address."
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:24
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:28
+#, python-format
+msgid "Reset password"
+msgstr ""
+
+#. module: auth_signup
+#: field:base.config.settings,auth_signup_template_user_id:0
+msgid "Template user for new users created through signup"
+msgstr ""
+
+#. module: auth_signup
+#: model:email.template,subject:auth_signup.reset_password_email
+msgid "Password reset"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:117
+#, python-format
+msgid "Please enter a password and confirm it."
+msgstr ""
+
+#. module: auth_signup
+#: view:res.users:0
+msgid "Send an email to the user to (re)set their password."
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:23
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:26
+#, python-format
+msgid "Sign Up"
+msgstr ""
+
+#. module: auth_signup
+#: selection:res.users,state:0
+msgid "New"
+msgstr ""
+
+#. module: auth_signup
+#: code:addons/auth_signup/res_users.py:258
+#, python-format
+msgid "Mail sent to:"
+msgstr ""
+
+#. module: auth_signup
+#: field:res.users,state:0
+msgid "Status"
+msgstr ""
+
+#. module: auth_signup
+#: model:email.template,body_html:auth_signup.reset_password_email
+msgid ""
+"\n"
+"<p>A password reset was requested for the OpenERP account linked to this "
+"email.</p>\n"
+"\n"
+"<p>You may change your password by following <a "
+"href=\"${object.signup_url}\">this link</a>.</p>\n"
+"\n"
+"<p>Note: If you do not expect this, you can safely ignore this email.</p>"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:111
+#, python-format
+msgid "Please enter a name."
+msgstr ""
+
+#. module: auth_signup
+#: model:ir.model,name:auth_signup.model_res_users
+msgid "Users"
+msgstr ""
+
+#. module: auth_signup
+#: field:res.partner,signup_url:0
+msgid "Signup URL"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:114
+#, python-format
+msgid "Please enter a username."
+msgstr ""
+
+#. module: auth_signup
+#: selection:res.users,state:0
+msgid "Active"
+msgstr ""
+
+#. module: auth_signup
+#: code:addons/auth_signup/res_users.py:269
+#, python-format
+msgid ""
+"Cannot send email: no outgoing email server configured.\n"
+"You can configure it under Settings/General Settings."
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:12
+#, python-format
+msgid "Username"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:8
+#, python-format
+msgid "Name"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:170
+#, python-format
+msgid "Please enter a username or email address."
+msgstr ""
+
+#. module: auth_signup
+#: selection:res.users,state:0
+msgid "Resetting Password"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:13
+#, python-format
+msgid "Username (Email)"
+msgstr ""
+
+#. module: auth_signup
+#: field:res.partner,signup_expiration:0
+msgid "Signup Expiration"
+msgstr ""
+
+#. module: auth_signup
+#: help:base.config.settings,auth_signup_reset_password:0
+msgid "This allows users to trigger a password reset from the Login page."
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:22
+#, python-format
+msgid "Log in"
+msgstr ""
+
+#. module: auth_signup
+#: field:res.partner,signup_valid:0
+msgid "Signup Token is Valid"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:108
+#: code:addons/auth_signup/static/src/js/auth_signup.js:111
+#: code:addons/auth_signup/static/src/js/auth_signup.js:114
+#: code:addons/auth_signup/static/src/js/auth_signup.js:117
+#: code:addons/auth_signup/static/src/js/auth_signup.js:120
+#: code:addons/auth_signup/static/src/js/auth_signup.js:167
+#: code:addons/auth_signup/static/src/js/auth_signup.js:170
+#, python-format
+msgid "Login"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:94
+#, python-format
+msgid "Invalid signup token"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:120
+#, python-format
+msgid "Passwords do not match; please retype them."
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/js/auth_signup.js:108
+#: code:addons/auth_signup/static/src/js/auth_signup.js:167
+#, python-format
+msgid "No database selected !"
+msgstr ""
+
+#. module: auth_signup
+#: view:res.users:0
+msgid "Reset Password"
+msgstr ""
+
+#. module: auth_signup
+#: field:base.config.settings,auth_signup_reset_password:0
+msgid "Enable password reset from Login page"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:27
+#, python-format
+msgid "Back to Login"
+msgstr ""
+
+#. module: auth_signup
+#. openerp-web
+#: code:addons/auth_signup/static/src/xml/auth_signup.xml:22
+#, python-format
+msgid "Sign up"
+msgstr ""
+
+#. module: auth_signup
+#: model:ir.model,name:auth_signup.model_res_partner
+msgid "Partner"
+msgstr ""
+
+#. module: auth_signup
+#: field:res.partner,signup_token:0
+msgid "Signup Token"
+msgstr ""
diff --git a/addons/auth_signup/i18n/zh_CN.po b/addons/auth_signup/i18n/zh_CN.po
index 333dd1be2dc..aa8d9f952c1 100644
--- a/addons/auth_signup/i18n/zh_CN.po
+++ b/addons/auth_signup/i18n/zh_CN.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2012-12-04 20:16+0000\n"
-"Last-Translator: 盈通 ccdos <ccdos@163.com>\n"
+"PO-Revision-Date: 2013-04-16 04:33+0000\n"
+"Last-Translator: Key <key.diagram@gmail.com>\n"
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:52+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-17 05:15+0000\n"
+"X-Generator: Launchpad (build 16567)\n"
#. module: auth_signup
#: field:res.partner,signup_type:0
@@ -73,7 +73,7 @@ msgstr "重置密码"
#: code:addons/auth_signup/static/src/js/auth_signup.js:117
#, python-format
msgid "Please enter a password and confirm it."
-msgstr ""
+msgstr "请输入密码并确认。"
#. module: auth_signup
#: view:res.users:0
diff --git a/addons/auth_signup/res_users.py b/addons/auth_signup/res_users.py
index b5383e41775..f4a985280ac 100644
--- a/addons/auth_signup/res_users.py
+++ b/addons/auth_signup/res_users.py
@@ -200,6 +200,9 @@ class res_users(osv.Model):
'partner_id': partner.id,
'email': values.get('email') or values.get('login'),
})
+ if partner.company_id:
+ values['company_id'] = partner.company_id.id
+ values['company_ids'] = [(6,0,[partner.company_id.id])]
self._signup_create_user(cr, uid, values, context=context)
else:
# no token, sign up an external user
diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py
index 62c808ed556..9d7d4d34ac4 100644
--- a/addons/base_action_rule/base_action_rule.py
+++ b/addons/base_action_rule/base_action_rule.py
@@ -96,7 +96,7 @@ class base_action_rule(osv.osv):
""" filter the list record_ids that satisfy the action filter """
if record_ids and action_filter:
assert action.model == action_filter.model_id, "Filter model different from action rule model"
- model = self.pool.get(action_filter.model_id)
+ model = self.pool[action_filter.model_id]
domain = [('id', 'in', record_ids)] + eval(action_filter.domain)
ctx = dict(context or {})
ctx.update(eval(action_filter.context))
@@ -106,7 +106,7 @@ class base_action_rule(osv.osv):
def _process(self, cr, uid, action, record_ids, context=None):
""" process the given action on the records """
# execute server actions
- model = self.pool.get(action.model_id.model)
+ model = self.pool[action.model_id.model]
if action.server_action_ids:
server_action_ids = map(int, action.server_action_ids)
for record in model.browse(cr, uid, record_ids, context):
@@ -195,7 +195,7 @@ class base_action_rule(osv.osv):
ids = self.search(cr, SUPERUSER_ID, [])
for action_rule in self.browse(cr, SUPERUSER_ID, ids):
model = action_rule.model_id.model
- model_obj = self.pool.get(model)
+ model_obj = self.pool[model]
if not hasattr(model_obj, 'base_action_ruled'):
model_obj.create = self._wrap_create(model_obj.create, model)
model_obj.write = self._wrap_write(model_obj.write, model)
@@ -232,7 +232,7 @@ class base_action_rule(osv.osv):
last_run = get_datetime(action.last_run) if action.last_run else False
# retrieve all the records that satisfy the action's condition
- model = self.pool.get(action.model_id.model)
+ model = self.pool[action.model_id.model]
domain = []
ctx = dict(context)
if action.filter_id:
diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py
index ca75c9e20fc..896349ec5e6 100644
--- a/addons/base_calendar/base_calendar.py
+++ b/addons/base_calendar/base_calendar.py
@@ -591,7 +591,7 @@ property or property parameter."),
for vals in self.browse(cr, uid, ids, context=context):
if vals.ref and vals.ref.user_id:
- mod_obj = self.pool.get(vals.ref._name)
+ mod_obj = self.pool[vals.ref._name]
res=mod_obj.read(cr,uid,[vals.ref.id],['duration','class'],context)
defaults = {'user_id': vals.user_id.id, 'organizer_id': vals.ref.user_id.id,'duration':res[0]['duration'],'class':res[0]['class']}
mod_obj.copy(cr, uid, vals.ref.id, default=defaults, context=context)
@@ -632,7 +632,6 @@ property or property parameter."),
res = super(calendar_attendee, self).create(cr, uid, vals, context=context)
return res
-calendar_attendee()
class res_alarm(osv.osv):
"""Resource Alarm """
@@ -684,7 +683,7 @@ true, it will allow you to hide the event alarm information without removing it.
ir_obj = self.pool.get('ir.model')
model_id = ir_obj.search(cr, uid, [('model', '=', model)])[0]
- model_obj = self.pool.get(model)
+ model_obj = self.pool[model]
for data in model_obj.browse(cr, uid, ids, context=context):
basic_alarm = data.alarm_id
@@ -754,7 +753,7 @@ true, it will allow you to hide the event alarm information without removing it.
alarm_obj = self.pool.get('calendar.alarm')
ir_obj = self.pool.get('ir.model')
model_id = ir_obj.search(cr, uid, [('model', '=', model)])[0]
- model_obj = self.pool.get(model)
+ model_obj = self.pool[model]
for data in model_obj.browse(cr, uid, ids, context=context):
alarm_ids = alarm_obj.search(cr, uid, [('model_id', '=', model_id), ('res_id', '=', data.id)])
if alarm_ids:
@@ -763,7 +762,6 @@ true, it will allow you to hide the event alarm information without removing it.
where id=%%s' % model_obj._table,(data.id,))
return True
-res_alarm()
class calendar_alarm(osv.osv):
_name = 'calendar.alarm'
@@ -853,13 +851,15 @@ class calendar_alarm(osv.osv):
for alarm in self.browse(cr, uid, alarm_ids, context=context):
next_trigger_date = None
update_vals = {}
- model_obj = self.pool.get(alarm.model_id.model)
+ model_obj = self.pool[alarm.model_id.model]
res_obj = model_obj.browse(cr, uid, alarm.res_id, context=context)
re_dates = []
if hasattr(res_obj, 'rrule') and res_obj.rrule:
event_date = datetime.strptime(res_obj.date, '%Y-%m-%d %H:%M:%S')
- recurrent_dates = get_recurrent_dates(res_obj.rrule, res_obj.exdate, event_date, res_obj.exrule)
+ #exdate is a string and we need a list
+ exdate = res_obj.exdate and res_obj.exdate.split(',') or []
+ recurrent_dates = get_recurrent_dates(res_obj.rrule, exdate, event_date, res_obj.exrule)
trigger_interval = alarm.trigger_interval
if trigger_interval == 'days':
@@ -916,7 +916,6 @@ From:
self.write(cr, uid, [alarm.id], update_vals)
return True
-calendar_alarm()
class calendar_event(osv.osv):
@@ -1608,7 +1607,6 @@ rule or repeating pattern of time to exclude from the recurring rule."),
"""
return self.write(cr, uid, ids, {'state': 'confirmed'}, context)
-calendar_event()
class calendar_todo(osv.osv):
""" Calendar Task """
@@ -1657,7 +1655,6 @@ class calendar_todo(osv.osv):
__attribute__ = {}
-calendar_todo()
class ir_values(osv.osv):
@@ -1702,7 +1699,6 @@ class ir_values(osv.osv):
return super(ir_values, self).get(cr, uid, key, key2, new_model, \
meta, context, res_id_req, without_user, key2_req)
-ir_values()
class ir_model(osv.osv):
@@ -1728,7 +1724,6 @@ class ir_model(osv.osv):
val['id'] = base_calendar_id2real_id(val['id'])
return isinstance(ids, (str, int, long)) and data[0] or data
-ir_model()
original_exp_report = openerp.service.report.exp_report
diff --git a/addons/base_calendar/base_calendar_data.xml b/addons/base_calendar/base_calendar_data.xml
index 727a0703db2..64aa7ba59b6 100644
--- a/addons/base_calendar/base_calendar_data.xml
+++ b/addons/base_calendar/base_calendar_data.xml
@@ -126,7 +126,7 @@
<field name="name">Run Event Reminder</field>
<field eval="True" name="active" />
<field name="user_id" ref="base.user_root" />
- <field name="interval_number">1</field>
+ <field name="interval_number">5</field>
<field name="interval_type">minutes</field>
<field name="numbercall">-1</field>
<field eval="False" name="doall" />
diff --git a/addons/base_calendar/crm_meeting.py b/addons/base_calendar/crm_meeting.py
index 6010f5ccfca..aa476002abc 100644
--- a/addons/base_calendar/crm_meeting.py
+++ b/addons/base_calendar/crm_meeting.py
@@ -135,7 +135,7 @@ class mail_message(osv.osv):
def _find_allowed_model_wise(self, cr, uid, doc_model, doc_dict, context=None):
if doc_model == 'crm.meeting':
- for virtual_id in self.pool.get(doc_model).get_recurrent_ids(cr, uid, doc_dict.keys(), [], context=context):
+ for virtual_id in self.pool[doc_model].get_recurrent_ids(cr, uid, doc_dict.keys(), [], context=context):
doc_dict.setdefault(virtual_id, doc_dict[get_real_ids(virtual_id)])
return super(mail_message, self)._find_allowed_model_wise(cr, uid, doc_model, doc_dict, context=context)
diff --git a/addons/base_calendar/i18n/es_MX.po b/addons/base_calendar/i18n/es_MX.po
index fcb00c6d478..9a2fe449d37 100644
--- a/addons/base_calendar/i18n/es_MX.po
+++ b/addons/base_calendar/i18n/es_MX.po
@@ -1,929 +1,879 @@
-# Spanish translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# Spanish (Mexico) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
-"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2011-01-18 01:17+0000\n"
-"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
-"<jesteve@zikzakmedia.com>\n"
-"Language-Team: Spanish <es@li.org>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-24 15:25+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Spanish (Mexico) <es_MX@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-09-05 05:52+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
+"X-Launchpad-Export-Date: 2013-04-25 05:20+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
#. module: base_calendar
#: selection:calendar.alarm,trigger_related:0
#: selection:res.alarm,trigger_related:0
msgid "The event starts"
-msgstr "El evento comienza"
-
-#. module: base_calendar
-#: selection:base.calendar.set.exrule,freq:0
-msgid "Hourly"
-msgstr "Cada hora"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
-msgid "Required to Join"
-msgstr "Requerido para unirse"
+#: view:calendar.event:0
+msgid "My Events"
+msgstr ""
#. module: base_calendar
#: help:calendar.event,exdate:0
#: help:calendar.todo,exdate:0
+#: help:crm.meeting,exdate:0
msgid ""
"This property defines the list of date/time exceptions for a recurring "
"calendar component."
msgstr ""
-"Esta propiedad define la lista de excepciones de fecha/hora para un evento "
-"de calendario recurrente."
-
-#. module: base_calendar
-#: constraint:res.users:0
-msgid "The chosen company is not in the allowed companies for this user"
-msgstr ""
-"La compañía seleccionada no está en las compañías permitidas para este "
-"usuario"
-
-#. module: base_calendar
-#: field:calendar.event.edit.all,name:0
-msgid "Title"
-msgstr "Título"
#. module: base_calendar
-#: selection:base.calendar.set.exrule,freq:0
#: selection:calendar.event,rrule_type:0
#: selection:calendar.todo,rrule_type:0
-msgid "Monthly"
-msgstr "Mensual"
+#: selection:crm.meeting,rrule_type:0
+msgid "Week(s)"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
-msgid "Invited User"
-msgstr "Usuario invitado"
+#: field:calendar.event,we:0
+#: field:calendar.todo,we:0
+#: field:crm.meeting,we:0
+msgid "Wed"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
-msgid "Invitation"
-msgstr "Invitación"
+#: selection:calendar.attendee,cutype:0
+msgid "Unknown"
+msgstr ""
#. module: base_calendar
#: help:calendar.event,recurrency:0
#: help:calendar.todo,recurrency:0
+#: help:crm.meeting,recurrency:0
msgid "Recurrent Meeting"
-msgstr "Reunión periódica"
+msgstr ""
+
+#. module: base_calendar
+#: model:crm.meeting.type,name:base_calendar.categ_meet5
+msgid "Feedback Meeting"
+msgstr ""
#. module: base_calendar
#: model:ir.actions.act_window,name:base_calendar.action_res_alarm_view
#: model:ir.ui.menu,name:base_calendar.menu_crm_meeting_avail_alarm
msgid "Alarms"
-msgstr "Alarmas"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,week_list:0
#: selection:calendar.event,week_list:0
#: selection:calendar.todo,week_list:0
+#: selection:crm.meeting,week_list:0
msgid "Sunday"
-msgstr "Domingo"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
#: field:calendar.attendee,role:0
msgid "Role"
-msgstr "Rol"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
#: view:calendar.event:0
+#: view:crm.meeting:0
msgid "Invitation details"
-msgstr "Detalles de la invitación"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,byday:0
#: selection:calendar.event,byday:0
#: selection:calendar.todo,byday:0
+#: selection:crm.meeting,byday:0
msgid "Fourth"
-msgstr "Cuarto"
+msgstr ""
#. module: base_calendar
-#: field:calendar.event,show_as:0
-#: field:calendar.todo,show_as:0
-msgid "Show as"
-msgstr "Mostrar como"
+#: model:ir.model,name:base_calendar.model_res_users
+msgid "Users"
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,day:0
-#: selection:base.calendar.set.exrule,select1:0
#: field:calendar.event,day:0
#: selection:calendar.event,select1:0
#: field:calendar.todo,day:0
#: selection:calendar.todo,select1:0
+#: field:crm.meeting,day:0
+#: selection:crm.meeting,select1:0
msgid "Date of month"
-msgstr "Día del mes"
+msgstr ""
#. module: base_calendar
#: selection:calendar.event,class:0
#: selection:calendar.todo,class:0
+#: selection:crm.meeting,class:0
msgid "Public"
-msgstr "Público"
+msgstr ""
#. module: base_calendar
-#: view:calendar.event:0
-msgid " "
-msgstr " "
+#: selection:calendar.alarm,trigger_interval:0
+#: selection:res.alarm,trigger_interval:0
+msgid "Hours"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,month_list:0
#: selection:calendar.event,month_list:0
#: selection:calendar.todo,month_list:0
+#: selection:crm.meeting,month_list:0
msgid "March"
-msgstr "Marzo"
+msgstr ""
#. module: base_calendar
-#: code:addons/base_calendar/base_calendar.py:414
-#: code:addons/base_calendar/wizard/base_calendar_set_exrule.py:90
-#, python-format
-msgid "Warning !"
-msgstr "¡Aviso!"
+#: help:calendar.attendee,cutype:0
+msgid "Specify the type of Invitation"
+msgstr ""
+
+#. module: base_calendar
+#: view:crm.meeting:0
+#: field:crm.meeting,message_unread:0
+msgid "Unread Messages"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,week_list:0
#: selection:calendar.event,week_list:0
#: selection:calendar.todo,week_list:0
+#: selection:crm.meeting,week_list:0
msgid "Friday"
-msgstr "Viernes"
+msgstr ""
#. module: base_calendar
#: field:calendar.event,allday:0
#: field:calendar.todo,allday:0
+#: field:crm.meeting,allday:0
msgid "All Day"
-msgstr "Todo el día"
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,select1:0
-#: field:calendar.event,select1:0
-#: field:calendar.todo,select1:0
-msgid "Option"
-msgstr "Opción"
+#: field:calendar.event,vtimezone:0
+#: field:calendar.todo,vtimezone:0
+#: field:crm.meeting,vtimezone:0
+msgid "Timezone"
+msgstr ""
#. module: base_calendar
#: selection:calendar.attendee,availability:0
#: selection:calendar.event,show_as:0
#: selection:calendar.todo,show_as:0
-#: selection:res.users,availability:0
+#: selection:crm.meeting,show_as:0
msgid "Free"
-msgstr "Libre"
+msgstr ""
+
+#. module: base_calendar
+#: help:crm.meeting,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
#. module: base_calendar
#: help:calendar.attendee,rsvp:0
msgid "Indicats whether the favor of a reply is requested"
-msgstr "Indica si es requerida la confirmación de una respuesta."
+msgstr ""
#. module: base_calendar
-#: model:ir.model,name:base_calendar.model_ir_attachment
-msgid "ir.attachment"
-msgstr "ir.adjunto"
+#: field:calendar.alarm,alarm_id:0
+msgid "Basic Alarm"
+msgstr ""
#. module: base_calendar
#: help:calendar.attendee,delegated_to:0
msgid "The users that the original request was delegated to"
-msgstr "Los usuarios a los que les fue delegado la petición original"
+msgstr ""
#. module: base_calendar
#: field:calendar.attendee,ref:0
msgid "Event Ref"
-msgstr "Ref. evento"
-
-#. module: base_calendar
-#: field:base.calendar.set.exrule,we:0
-#: field:calendar.event,we:0
-#: field:calendar.todo,we:0
-msgid "Wed"
-msgstr "Mié"
-
-#. module: base_calendar
-#: view:calendar.event:0
-msgid "Show Time as"
-msgstr "Mostrar hora como"
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,tu:0
#: field:calendar.event,tu:0
#: field:calendar.todo,tu:0
+#: field:crm.meeting,tu:0
msgid "Tue"
-msgstr "Mar"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,freq:0
-#: selection:calendar.event,rrule_type:0
-#: selection:calendar.todo,rrule_type:0
-msgid "Yearly"
-msgstr "Anualmente"
+#: selection:calendar.event,byday:0
+#: selection:calendar.todo,byday:0
+#: selection:crm.meeting,byday:0
+msgid "Third"
+msgstr ""
#. module: base_calendar
#: selection:calendar.alarm,trigger_related:0
#: selection:res.alarm,trigger_related:0
msgid "The event ends"
-msgstr "El evento finaliza"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,byday:0
#: selection:calendar.event,byday:0
#: selection:calendar.todo,byday:0
+#: selection:crm.meeting,byday:0
msgid "Last"
-msgstr "Última"
+msgstr ""
#. module: base_calendar
-#: help:calendar.attendee,state:0
-msgid "Status of the attendee's participation"
-msgstr "Estado de la participación de los asistentes"
+#: help:crm.meeting,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
#. module: base_calendar
-#: selection:calendar.attendee,cutype:0
-msgid "Room"
-msgstr "Sala"
+#: field:crm.meeting,message_ids:0
+msgid "Messages"
+msgstr ""
#. module: base_calendar
#: selection:calendar.alarm,trigger_interval:0
-#: selection:calendar.event,freq:0
-#: selection:calendar.todo,freq:0
#: selection:res.alarm,trigger_interval:0
msgid "Days"
-msgstr "Días"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
#: view:calendar.event:0
-msgid "Invitation Detail"
-msgstr "Detalle de la invitación"
+msgid "To"
+msgstr ""
#. module: base_calendar
-#: code:addons/base_calendar/base_calendar.py:1355
-#: code:addons/base_calendar/wizard/base_calendar_invite_attendee.py:96
-#: code:addons/base_calendar/wizard/base_calendar_invite_attendee.py:143
-#: code:addons/base_calendar/wizard/base_calendar_set_exrule.py:128
-#: code:addons/base_calendar/wizard/base_calendar_set_exrule.py:136
+#: code:addons/base_calendar/base_calendar.py:1260
#, python-format
msgid "Error!"
-msgstr "¡Error!"
+msgstr ""
#. module: base_calendar
#: selection:calendar.attendee,role:0
msgid "Chair Person"
-msgstr "Presidente"
+msgstr ""
+
+#. module: base_calendar
+#: view:crm.meeting:0
+msgid "My Meetings"
+msgstr ""
#. module: base_calendar
#: selection:calendar.alarm,action:0
msgid "Procedure"
-msgstr "Procedimiento"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,recurrent_id:0
+#: field:calendar.todo,recurrent_id:0
+#: field:crm.meeting,recurrent_id:0
+msgid "Recurrent ID"
+msgstr ""
#. module: base_calendar
#: selection:calendar.event,state:0
#: selection:calendar.todo,state:0
msgid "Cancelled"
-msgstr "Cancelada"
+msgstr ""
#. module: base_calendar
#: selection:calendar.alarm,trigger_interval:0
#: selection:res.alarm,trigger_interval:0
msgid "Minutes"
-msgstr "Minutos"
+msgstr ""
#. module: base_calendar
#: selection:calendar.alarm,action:0
msgid "Display"
-msgstr "Mostrar"
+msgstr ""
#. module: base_calendar
-#: view:calendar.event.edit.all:0
-msgid "Edit all Occurrences"
-msgstr "Editar todas las ocurrencias"
+#: help:calendar.attendee,state:0
+msgid "Status of the attendee's participation"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
-msgid "Invitation type"
-msgstr "Tipo de invitación"
+#: view:crm.meeting:0
+msgid "Mail To"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,freq:0
-msgid "Secondly"
-msgstr "En segundo lugar"
+#: field:crm.meeting,name:0
+msgid "Meeting Subject"
+msgstr ""
#. module: base_calendar
-#: field:calendar.alarm,event_date:0
-#: field:calendar.attendee,event_date:0
#: view:calendar.event:0
-msgid "Event Date"
-msgstr "Fecha evento"
+msgid "End of Recurrence"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
#: view:calendar.event:0
msgid "Group By..."
-msgstr "Agrupar por..."
+msgstr ""
#. module: base_calendar
-#: help:base_calendar.invite.attendee,email:0
-msgid "Provide external email address who will receive this invitation."
+#: view:calendar.event:0
+msgid "Recurrency Option"
msgstr ""
-"Proporcione las direcciones de correo externas de quienes recibiran esta "
-"invitacion."
#. module: base_calendar
-#: model:ir.module.module,description:base_calendar.module_meta_information
-msgid ""
-"Full featured calendar system that supports:\n"
-" - Calendar of events\n"
-" - Alerts (create requests)\n"
-" - Recurring events\n"
-" - Invitations to people"
+#: view:calendar.event:0
+msgid "Choose day where repeat the meeting"
msgstr ""
-"Completo sistema de calendario que soporta:\n"
-" - Calendario de eventos\n"
-" - Alertas (crea peticiones)\n"
-" - Eventos recursivos\n"
-" - Invitación de personas"
#. module: base_calendar
-#: help:calendar.attendee,cutype:0
-msgid "Specify the type of Invitation"
-msgstr "Especifique el tipo de invitación"
+#: view:crm.meeting:0
+#: model:ir.actions.act_window,name:base_calendar.action_crm_meeting
+msgid "Meetings"
+msgstr ""
#. module: base_calendar
-#: selection:calendar.event,freq:0
-#: selection:calendar.todo,freq:0
-msgid "Years"
-msgstr "Años"
+#: field:calendar.event,recurrent_id_date:0
+#: field:calendar.todo,recurrent_id_date:0
+#: field:crm.meeting,recurrent_id_date:0
+msgid "Recurrent ID date"
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,event_end_date:0
#: field:calendar.attendee,event_end_date:0
msgid "Event End Date"
-msgstr "Fecha del final del evento"
+msgstr ""
#. module: base_calendar
#: selection:calendar.attendee,role:0
msgid "Optional Participation"
-msgstr "Participación opcional"
+msgstr ""
#. module: base_calendar
-#: field:calendar.event,date_deadline:0
-#: field:calendar.todo,date_deadline:0
-msgid "Deadline"
-msgstr "Fecha límite"
+#: help:crm.meeting,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
#. module: base_calendar
-#: code:addons/base_calendar/base_calendar.py:385
-#: code:addons/base_calendar/base_calendar.py:1088
-#: code:addons/base_calendar/base_calendar.py:1090
+#: code:addons/base_calendar/base_calendar.py:399
+#: code:addons/base_calendar/base_calendar.py:441
+#: code:addons/base_calendar/base_calendar.py:1013
+#: code:addons/base_calendar/base_calendar.py:1015
+#: code:addons/base_calendar/base_calendar.py:1460
#, python-format
msgid "Warning!"
-msgstr "¡Aviso!"
+msgstr ""
#. module: base_calendar
#: help:calendar.event,active:0
#: help:calendar.todo,active:0
+#: help:crm.meeting,active:0
msgid ""
"If the active field is set to true, it will allow you to hide the "
"event alarm information without removing it."
msgstr ""
-"Si el campo activo se establece a verdadero, se omitirá la alarma del "
-"evento, sin embargo no se eliminará."
#. module: base_calendar
-#: model:ir.module.module,shortdesc:base_calendar.module_meta_information
-msgid "Basic Calendar Functionality"
-msgstr "Funcionalidad básica del calendario"
+#: field:calendar.alarm,repeat:0
+#: field:calendar.event,count:0
+#: field:calendar.todo,count:0
+#: field:crm.meeting,count:0
+#: field:res.alarm,repeat:0
+msgid "Repeat"
+msgstr ""
#. module: base_calendar
#: field:calendar.event,organizer:0
#: field:calendar.event,organizer_id:0
#: field:calendar.todo,organizer:0
#: field:calendar.todo,organizer_id:0
+#: field:crm.meeting,organizer:0
+#: field:crm.meeting,organizer_id:0
msgid "Organizer"
-msgstr "Organizador"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
#: view:calendar.event:0
#: field:calendar.event,user_id:0
#: field:calendar.todo,user_id:0
+#: field:crm.meeting,user_id:0
msgid "Responsible"
-msgstr "Responsable"
+msgstr ""
#. module: base_calendar
#: view:calendar.event:0
-#: model:res.request.link,name:base_calendar.request_link_meeting
+#: model:res.request.link,name:base_calendar.request_link_event
msgid "Event"
-msgstr "Evento"
-
-#. module: base_calendar
-#: help:calendar.event,edit_all:0
-#: help:calendar.todo,edit_all:0
-msgid "Edit all Occurrences of recurrent Meeting."
-msgstr "Editar todas las ocurrencias de la reunión recurrente."
+msgstr ""
#. module: base_calendar
#: selection:calendar.alarm,trigger_occurs:0
#: selection:res.alarm,trigger_occurs:0
msgid "Before"
-msgstr "Antes de"
+msgstr ""
#. module: base_calendar
#: view:calendar.event:0
#: selection:calendar.event,state:0
#: selection:calendar.todo,state:0
+#: field:crm.meeting,date_open:0
+#: selection:crm.meeting,state:0
msgid "Confirmed"
-msgstr "Confirmada"
-
-#. module: base_calendar
-#: model:ir.actions.act_window,name:base_calendar.action_calendar_event_edit_all
-msgid "Edit all events"
-msgstr "Editar todos los eventos"
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,attendee_ids:0
#: field:calendar.event,attendee_ids:0
+#: field:calendar.event,partner_ids:0
#: field:calendar.todo,attendee_ids:0
+#: field:calendar.todo,partner_ids:0
+#: field:crm.meeting,attendee_ids:0
+#: field:crm.meeting,partner_ids:0
msgid "Attendees"
-msgstr "Asistentes"
+msgstr ""
#. module: base_calendar
#: view:calendar.event:0
msgid "Confirm"
-msgstr "Confirmar"
+msgstr ""
#. module: base_calendar
#: model:ir.model,name:base_calendar.model_calendar_todo
msgid "Calendar Task"
-msgstr "Calendario de tareas"
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,su:0
#: field:calendar.event,su:0
#: field:calendar.todo,su:0
+#: field:crm.meeting,su:0
msgid "Sun"
-msgstr "Dom"
+msgstr ""
#. module: base_calendar
#: field:calendar.attendee,cutype:0
msgid "Invite Type"
-msgstr "Tipo de invitación"
-
-#. module: base_calendar
-#: help:calendar.attendee,partner_id:0
-msgid "Partner related to contact"
-msgstr "Partner relacionado con el contacto"
+msgstr ""
#. module: base_calendar
#: view:res.alarm:0
msgid "Reminder details"
-msgstr "Detalles del recordatorio"
+msgstr ""
#. module: base_calendar
#: field:calendar.attendee,parent_ids:0
msgid "Delegrated From"
-msgstr "Delegado desde"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,select1:0
#: selection:calendar.event,select1:0
#: selection:calendar.todo,select1:0
+#: selection:crm.meeting,select1:0
msgid "Day of month"
-msgstr "Día del mes"
+msgstr ""
+
+#. module: base_calendar
+#: field:crm.meeting,message_follower_ids:0
+msgid "Followers"
+msgstr ""
#. module: base_calendar
-#: view:calendar.event:0
#: field:calendar.event,location:0
-#: field:calendar.event.edit.all,location:0
#: field:calendar.todo,location:0
+#: field:crm.meeting,location:0
msgid "Location"
-msgstr "Lugar"
+msgstr ""
#. module: base_calendar
-#: field:base_calendar.invite.attendee,send_mail:0
-msgid "Send mail?"
-msgstr "¿Enviar email?"
+#: selection:calendar.attendee,role:0
+msgid "Participation required"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+#: field:calendar.event,show_as:0
+#: field:calendar.todo,show_as:0
+#: field:crm.meeting,show_as:0
+msgid "Show Time as"
+msgstr ""
#. module: base_calendar
-#: field:base_calendar.invite.attendee,email:0
#: selection:calendar.alarm,action:0
#: field:calendar.attendee,email:0
msgid "Email"
-msgstr "Correo electrónico"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
-msgid "Event Detail"
-msgstr "Detalles del evento"
+#: selection:calendar.attendee,cutype:0
+msgid "Room"
+msgstr ""
#. module: base_calendar
#: selection:calendar.alarm,state:0
msgid "Run"
-msgstr "Ejecutar"
+msgstr ""
#. module: base_calendar
-#: field:calendar.event,exdate:0
-#: field:calendar.todo,exdate:0
-msgid "Exception Date/Times"
-msgstr "Fecha/horas excepción"
+#: model:ir.model,name:base_calendar.model_calendar_alarm
+msgid "Event alarm information"
+msgstr ""
#. module: base_calendar
-#: selection:calendar.event,class:0
-#: selection:calendar.todo,class:0
-msgid "Confidential"
-msgstr "Confidencial"
+#: code:addons/base_calendar/base_calendar.py:1015
+#, python-format
+msgid "Count cannot be negative or 0."
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,end_date:0
-#: field:calendar.event,end_date:0
-#: field:calendar.todo,end_date:0
-msgid "Repeat Until"
-msgstr "Repetir hasta"
+#: field:crm.meeting,create_date:0
+msgid "Creation Date"
+msgstr ""
#. module: base_calendar
-#: model:ir.actions.act_window,help:base_calendar.action_res_alarm_view
-msgid ""
-"Create specific calendar alarms that may be assigned to calendar events or "
-"meetings."
+#: view:crm.meeting:0
+#: model:ir.model,name:base_calendar.model_crm_meeting
+#: model:res.request.link,name:base_calendar.request_link_meeting
+msgid "Meeting"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.event,rrule_type:0
+#: selection:calendar.todo,rrule_type:0
+#: selection:crm.meeting,rrule_type:0
+msgid "Month(s)"
msgstr ""
-"Crear alarmas específicas que puedan ser asignadas a eventos de calendario o "
-"reuniones."
#. module: base_calendar
#: view:calendar.event:0
msgid "Visibility"
-msgstr "Visibilidad"
+msgstr ""
#. module: base_calendar
#: field:calendar.attendee,rsvp:0
msgid "Required Reply?"
-msgstr "¿Respuesta requerida?"
+msgstr ""
#. module: base_calendar
#: field:calendar.event,base_calendar_url:0
#: field:calendar.todo,base_calendar_url:0
+#: field:crm.meeting,base_calendar_url:0
msgid "Caldav URL"
-msgstr "URL de caldav"
-
-#. module: base_calendar
-#: view:base.calendar.set.exrule:0
-msgid "Select range to Exclude"
-msgstr "Elija el rango a excluir"
+msgstr ""
#. module: base_calendar
-#: field:calendar.event,recurrent_uid:0
-#: field:calendar.todo,recurrent_uid:0
-msgid "Recurrent ID"
-msgstr "ID recurrente"
+#: model:ir.model,name:base_calendar.model_mail_wizard_invite
+msgid "Invite wizard"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,month_list:0
#: selection:calendar.event,month_list:0
#: selection:calendar.todo,month_list:0
+#: selection:crm.meeting,month_list:0
msgid "July"
-msgstr "Julio"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
#: selection:calendar.attendee,state:0
msgid "Accepted"
-msgstr "Aceptada"
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,th:0
#: field:calendar.event,th:0
#: field:calendar.todo,th:0
+#: field:crm.meeting,th:0
msgid "Thu"
-msgstr "Jue"
+msgstr ""
#. module: base_calendar
-#: field:calendar.attendee,child_ids:0
-msgid "Delegrated To"
-msgstr "Delegada en"
+#: view:crm.meeting:0
+msgid "Meeting Details"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
-msgid "Required Reply"
-msgstr "Respuesta requerida"
+#: field:calendar.attendee,child_ids:0
+msgid "Delegrated To"
+msgstr ""
#. module: base_calendar
-#: selection:calendar.event,end_type:0
-#: selection:calendar.todo,end_type:0
-msgid "Forever"
-msgstr "Siempre"
+#: code:addons/base_calendar/crm_meeting.py:102
+#, python-format
+msgid "The following contacts have no email address :"
+msgstr ""
#. module: base_calendar
-#: selection:calendar.attendee,role:0
-msgid "Participation required"
-msgstr "Participación requerida"
+#: selection:calendar.event,rrule_type:0
+#: selection:calendar.todo,rrule_type:0
+#: selection:crm.meeting,rrule_type:0
+msgid "Year(s)"
+msgstr ""
#. module: base_calendar
-#: view:base.calendar.set.exrule:0
-msgid "_Cancel"
-msgstr "_Cancelar"
+#: view:crm.meeting.type:0
+#: model:ir.actions.act_window,name:base_calendar.action_crm_meeting_type
+#: model:ir.ui.menu,name:base_calendar.menu_crm_meeting_type
+msgid "Meeting Types"
+msgstr ""
#. module: base_calendar
#: field:calendar.event,create_date:0
#: field:calendar.todo,create_date:0
msgid "Created"
-msgstr "Creada"
+msgstr ""
#. module: base_calendar
#: selection:calendar.event,class:0
#: selection:calendar.todo,class:0
-msgid "Private"
-msgstr "Privada"
-
-#. module: base_calendar
-#: selection:base.calendar.set.exrule,freq:0
-#: selection:calendar.event,rrule_type:0
-#: selection:calendar.todo,rrule_type:0
-msgid "Daily"
-msgstr "Diariamente"
-
-#. module: base_calendar
-#: code:addons/base_calendar/base_calendar.py:385
-#, python-format
-msgid "Can not Duplicate"
-msgstr "No se puede duplicar"
+#: selection:crm.meeting,class:0
+msgid "Public for Employees"
+msgstr ""
#. module: base_calendar
-#: field:calendar.event,class:0
-#: field:calendar.todo,class:0
-msgid "Mark as"
-msgstr "Marcar como"
+#: view:crm.meeting:0
+msgid "hours"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
-#: field:calendar.attendee,partner_address_id:0
+#: field:calendar.attendee,partner_id:0
msgid "Contact"
-msgstr "Contacto"
-
-#. module: base_calendar
-#: help:calendar.event,rrule_type:0
-#: help:calendar.todo,rrule_type:0
-msgid "Let the event automatically repeat at that interval"
-msgstr "Permite que el evento se repita automáticamente en ese intervalo"
-
-#. module: base_calendar
-#: view:calendar.attendee:0
-#: view:calendar.event:0
-msgid "Delegate"
-msgstr "Delegar"
+msgstr ""
#. module: base_calendar
-#: field:base_calendar.invite.attendee,partner_id:0
-#: view:calendar.attendee:0
-#: field:calendar.attendee,partner_id:0
-msgid "Partner"
-msgstr "Empresa"
+#: field:calendar.attendee,language:0
+msgid "Language"
+msgstr ""
#. module: base_calendar
-#: view:base_calendar.invite.attendee:0
-#: selection:base_calendar.invite.attendee,type:0
-msgid "Partner Contacts"
-msgstr "Contactos de la empresa"
+#: field:calendar.event,end_date:0
+#: field:calendar.todo,end_date:0
+#: field:crm.meeting,end_date:0
+msgid "Repeat Until"
+msgstr ""
#. module: base_calendar
-#: view:base.calendar.set.exrule:0
-msgid "_Ok"
-msgstr "_Aceptar"
+#: view:crm.meeting:0
+msgid "Options"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,byday:0
#: selection:calendar.event,byday:0
#: selection:calendar.todo,byday:0
+#: selection:crm.meeting,byday:0
msgid "First"
-msgstr "Primera"
-
-#. module: base_calendar
-#: view:calendar.event:0
-msgid "Privacy"
-msgstr "Privacidad"
-
-#. module: base_calendar
-#: field:calendar.event,vtimezone:0
-#: field:calendar.todo,vtimezone:0
-msgid "Timezone"
-msgstr "Zona horaria"
+msgstr ""
#. module: base_calendar
#: view:calendar.event:0
+#: view:crm.meeting:0
msgid "Subject"
-msgstr "Asunto"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,month_list:0
#: selection:calendar.event,month_list:0
#: selection:calendar.todo,month_list:0
+#: selection:crm.meeting,month_list:0
msgid "September"
-msgstr "Septiembre"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,month_list:0
#: selection:calendar.event,month_list:0
#: selection:calendar.todo,month_list:0
+#: selection:crm.meeting,month_list:0
msgid "December"
-msgstr "Diciembre"
+msgstr ""
#. module: base_calendar
-#: help:base_calendar.invite.attendee,send_mail:0
-msgid "Check this if you want to send an Email to Invited Person"
-msgstr "Marque aquí si quiere enviar un correo a la persona invitada"
+#: selection:calendar.event,week_list:0
+#: selection:calendar.todo,week_list:0
+#: selection:crm.meeting,week_list:0
+msgid "Tuesday"
+msgstr ""
#. module: base_calendar
-#: view:calendar.event:0
-msgid "Availability"
-msgstr "Disponibilidad"
+#: field:crm.meeting,categ_ids:0
+msgid "Tags"
+msgstr ""
#. module: base_calendar
-#: view:calendar.event.edit.all:0
-msgid "_Save"
-msgstr "_Guardar"
+#: view:calendar.event:0
+msgid "Availability"
+msgstr ""
#. module: base_calendar
#: selection:calendar.attendee,cutype:0
msgid "Individual"
-msgstr "Individual"
+msgstr ""
#. module: base_calendar
#: help:calendar.event,count:0
#: help:calendar.todo,count:0
+#: help:crm.meeting,count:0
msgid "Repeat x times"
-msgstr "Repetir x veces"
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,user_id:0
msgid "Owner"
-msgstr "Dueño"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
-msgid "Delegation Info"
-msgstr "Información delegación"
+#: help:calendar.event,rrule_type:0
+#: help:calendar.todo,rrule_type:0
+#: help:crm.meeting,rrule_type:0
+msgid "Let the event automatically repeat at that interval"
+msgstr ""
#. module: base_calendar
-#: view:calendar.event:0
-#: field:calendar.event.edit.all,date:0
-msgid "Start Date"
-msgstr "Fecha inicio"
+#: model:ir.ui.menu,name:base_calendar.mail_menu_calendar
+msgid "Calendar"
+msgstr ""
#. module: base_calendar
#: field:calendar.attendee,cn:0
msgid "Common name"
-msgstr "Nombre común"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
#: selection:calendar.attendee,state:0
msgid "Declined"
-msgstr "Rechazada"
-
-#. module: base_calendar
-#: view:calendar.attendee:0
-msgid "My Role"
-msgstr "Mi rol"
+msgstr ""
#. module: base_calendar
-#: view:calendar.event:0
-msgid "My Events"
-msgstr "Mis eventos"
+#: code:addons/base_calendar/base_calendar.py:1460
+#, python-format
+msgid "Group by date is not supported, use the calendar view instead."
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
#: view:calendar.event:0
+#: view:crm.meeting:0
msgid "Decline"
-msgstr "Rechazar"
-
-#. module: base_calendar
-#: selection:calendar.event,freq:0
-#: selection:calendar.todo,freq:0
-msgid "Weeks"
-msgstr "Semanas"
+msgstr ""
#. module: base_calendar
#: selection:calendar.attendee,cutype:0
msgid "Group"
-msgstr "Grupo"
+msgstr ""
#. module: base_calendar
-#: field:calendar.event,edit_all:0
-#: field:calendar.todo,edit_all:0
-msgid "Edit All"
-msgstr "Editar todo"
+#: selection:calendar.event,class:0
+#: selection:calendar.todo,class:0
+#: selection:crm.meeting,class:0
+msgid "Private"
+msgstr ""
#. module: base_calendar
-#: field:base_calendar.invite.attendee,contact_ids:0
-msgid "Contacts"
-msgstr "Contactos"
+#: view:calendar.event:0
+#: field:calendar.event,class:0
+#: field:calendar.todo,class:0
+#: field:crm.meeting,class:0
+msgid "Privacy"
+msgstr ""
#. module: base_calendar
#: model:ir.model,name:base_calendar.model_res_alarm
msgid "Basic Alarm Information"
-msgstr "Información sobre la alarma básica"
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,fr:0
#: field:calendar.event,fr:0
#: field:calendar.todo,fr:0
+#: field:crm.meeting,fr:0
msgid "Fri"
-msgstr "Vie"
-
-#. module: base_calendar
-#: selection:calendar.alarm,trigger_interval:0
-#: selection:calendar.event,freq:0
-#: selection:calendar.todo,freq:0
-#: selection:res.alarm,trigger_interval:0
-msgid "Hours"
-msgstr "Horas"
+msgstr ""
#. module: base_calendar
-#: code:addons/base_calendar/base_calendar.py:1090
-#, python-format
-msgid "Count can not be Negative"
-msgstr "La cuenta no puede ser negativa"
+#: view:calendar.event:0
+msgid "Invitation Detail"
+msgstr ""
#. module: base_calendar
#: field:calendar.attendee,member:0
msgid "Member"
-msgstr "Miembro"
+msgstr ""
#. module: base_calendar
#: help:calendar.event,location:0
#: help:calendar.todo,location:0
+#: help:crm.meeting,location:0
msgid "Location of Event"
-msgstr "Ubicación del evento"
+msgstr ""
#. module: base_calendar
#: field:calendar.event,rrule:0
#: field:calendar.todo,rrule:0
+#: field:crm.meeting,rrule:0
msgid "Recurrent Rule"
-msgstr "Regla recurrente"
+msgstr ""
#. module: base_calendar
#: selection:calendar.alarm,state:0
msgid "Draft"
-msgstr "Borrador"
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,attach:0
msgid "Attachment"
-msgstr "Adjunto"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
-msgid "Invitation From"
-msgstr "Invitación desde"
+#: field:crm.meeting,date_closed:0
+msgid "Closed"
+msgstr ""
#. module: base_calendar
#: view:calendar.event:0
-msgid "End of Recurrency"
-msgstr "Fin de recurrencia"
+msgid "From"
+msgstr ""
#. module: base_calendar
#: view:calendar.event:0
-#: field:calendar.event.edit.all,alarm_id:0
+#: field:calendar.event,alarm_id:0
+#: field:calendar.todo,alarm_id:0
+#: field:crm.meeting,alarm_id:0
msgid "Reminder"
-msgstr "Recordatorio"
+msgstr ""
#. module: base_calendar
-#: view:base.calendar.set.exrule:0
-#: model:ir.model,name:base_calendar.model_base_calendar_set_exrule
-msgid "Set Exrule"
-msgstr "Establecer Exregla"
+#: selection:calendar.event,end_type:0
+#: selection:calendar.todo,end_type:0
+#: selection:crm.meeting,end_type:0
+msgid "Number of repetitions"
+msgstr ""
+
+#. module: base_calendar
+#: model:crm.meeting.type,name:base_calendar.categ_meet2
+msgid "Internal Meeting"
+msgstr ""
#. module: base_calendar
#: view:calendar.event:0
#: model:ir.actions.act_window,name:base_calendar.action_view_event
#: model:ir.ui.menu,name:base_calendar.menu_events
msgid "Events"
-msgstr "Eventos"
+msgstr ""
#. module: base_calendar
-#: model:ir.actions.act_window,name:base_calendar.action_view_calendar_invite_attendee_wizard
-#: model:ir.model,name:base_calendar.model_base_calendar_invite_attendee
-msgid "Invite Attendees"
-msgstr "Invitar asistentes"
+#: field:calendar.alarm,state:0
+#: field:calendar.attendee,state:0
+#: view:calendar.event:0
+#: field:calendar.event,state:0
+#: field:calendar.todo,state:0
+#: field:crm.meeting,state:0
+msgid "Status"
+msgstr ""
#. module: base_calendar
#: help:calendar.attendee,email:0
msgid "Email of Invited Person"
-msgstr "Email del invitado"
+msgstr ""
#. module: base_calendar
-#: field:calendar.alarm,repeat:0
-#: field:calendar.event,count:0
-#: field:calendar.todo,count:0
-#: field:res.alarm,repeat:0
-msgid "Repeat"
-msgstr "Repetir"
+#: model:crm.meeting.type,name:base_calendar.categ_meet1
+msgid "Customer Meeting"
+msgstr ""
#. module: base_calendar
#: help:calendar.attendee,dir:0
@@ -931,186 +881,193 @@ msgid ""
"Reference to the URIthat points to the directory information corresponding "
"to the attendee."
msgstr ""
-"La referencia a la URI que apunta a la información del directorio "
-"correspondiente al participante."
#. module: base_calendar
-#: selection:base.calendar.set.exrule,month_list:0
#: selection:calendar.event,month_list:0
#: selection:calendar.todo,month_list:0
+#: selection:crm.meeting,month_list:0
msgid "August"
-msgstr "Agosto"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,week_list:0
#: selection:calendar.event,week_list:0
#: selection:calendar.todo,week_list:0
+#: selection:crm.meeting,week_list:0
msgid "Monday"
-msgstr "Lunes"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,byday:0
-#: selection:calendar.event,byday:0
-#: selection:calendar.todo,byday:0
-msgid "Third"
-msgstr "Tercero"
+#: model:crm.meeting.type,name:base_calendar.categ_meet4
+msgid "Open Discussion"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_ir_model
+msgid "Models"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,month_list:0
#: selection:calendar.event,month_list:0
#: selection:calendar.todo,month_list:0
+#: selection:crm.meeting,month_list:0
msgid "June"
-msgstr "Junio"
+msgstr ""
#. module: base_calendar
-#: field:calendar.alarm,alarm_id:0
-msgid "Basic Alarm"
-msgstr "Alarma básica"
+#: field:calendar.alarm,event_date:0
+#: field:calendar.attendee,event_date:0
+#: view:calendar.event:0
+msgid "Event Date"
+msgstr ""
+
+#. module: base_calendar
+#: view:crm.meeting:0
+msgid "Invitations"
+msgstr ""
#. module: base_calendar
-#: view:base.calendar.set.exrule:0
#: view:calendar.event:0
+#: view:crm.meeting:0
msgid "The"
-msgstr "El"
+msgstr ""
+
+#. module: base_calendar
+#: field:crm.meeting,write_date:0
+msgid "Write Date"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
#: field:calendar.attendee,delegated_from:0
msgid "Delegated From"
-msgstr "Delegado desde"
+msgstr ""
+
+#. module: base_calendar
+#: field:crm.meeting,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
#. module: base_calendar
#: field:calendar.attendee,user_id:0
msgid "User"
-msgstr "Usuario"
+msgstr ""
#. module: base_calendar
#: view:calendar.event:0
#: field:calendar.event,date:0
+#: field:crm.meeting,date:0
msgid "Date"
-msgstr "Fecha"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Start Date"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,month_list:0
#: selection:calendar.event,month_list:0
#: selection:calendar.todo,month_list:0
+#: selection:crm.meeting,month_list:0
msgid "November"
-msgstr "Noviembre"
+msgstr ""
#. module: base_calendar
#: help:calendar.attendee,member:0
msgid "Indicate the groups that the attendee belongs to"
-msgstr "Indicar los grupos a los que pertenece el asistente"
-
-#. module: base_calendar
-#: view:base_calendar.invite.attendee:0
-msgid "Data"
-msgstr "Datos"
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,mo:0
#: field:calendar.event,mo:0
#: field:calendar.todo,mo:0
+#: field:crm.meeting,mo:0
msgid "Mon"
-msgstr "Lun"
-
-#. module: base_calendar
-#: field:base.calendar.set.exrule,count:0
-msgid "Count"
-msgstr "Total"
-
-#. module: base_calendar
-#: selection:base.calendar.set.exrule,freq:0
-#: selection:calendar.event,freq:0
-#: selection:calendar.todo,freq:0
-msgid "No Repeat"
-msgstr "No repetir"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,month_list:0
#: selection:calendar.event,month_list:0
#: selection:calendar.todo,month_list:0
+#: selection:crm.meeting,month_list:0
msgid "October"
-msgstr "Octubre"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
+#: selection:calendar.attendee,state:0
#: view:calendar.event:0
+#: selection:calendar.event,state:0
+#: selection:calendar.todo,state:0
+#: view:crm.meeting:0
msgid "Uncertain"
-msgstr "Incierto"
+msgstr ""
#. module: base_calendar
-#: field:calendar.attendee,language:0
-msgid "Language"
-msgstr "Idioma"
+#: constraint:calendar.event:0
+#: constraint:calendar.todo:0
+#: constraint:crm.meeting:0
+msgid "Error ! End date cannot be set before start date."
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,trigger_occurs:0
#: field:res.alarm,trigger_occurs:0
msgid "Triggers"
-msgstr "Disparadores"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,month_list:0
#: selection:calendar.event,month_list:0
#: selection:calendar.todo,month_list:0
+#: selection:crm.meeting,month_list:0
msgid "January"
-msgstr "Enero"
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,trigger_related:0
#: field:res.alarm,trigger_related:0
msgid "Related to"
-msgstr "Relacionado con"
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,interval:0
#: field:calendar.alarm,trigger_interval:0
#: field:res.alarm,trigger_interval:0
msgid "Interval"
-msgstr "Intervalo"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,week_list:0
#: selection:calendar.event,week_list:0
#: selection:calendar.todo,week_list:0
+#: selection:crm.meeting,week_list:0
msgid "Wednesday"
-msgstr "Miércoles"
-
-#. module: base_calendar
-#: code:addons/base_calendar/base_calendar.py:1088
-#, python-format
-msgid "Interval can not be Negative"
-msgstr "El intervalo no puede ser negativo"
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,name:0
#: view:calendar.event:0
+#: field:crm.meeting,message_summary:0
msgid "Summary"
-msgstr "Resumen"
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,active:0
#: field:calendar.event,active:0
#: field:calendar.todo,active:0
+#: field:crm.meeting,active:0
#: field:res.alarm,active:0
msgid "Active"
-msgstr "Activo"
+msgstr ""
+
+#. module: base_calendar
+#: code:addons/base_calendar/base_calendar.py:399
+#, python-format
+msgid "You cannot duplicate a calendar attendee."
+msgstr ""
#. module: base_calendar
#: view:calendar.event:0
msgid "Choose day in the month where repeat the meeting"
-msgstr "Elija el día del mes en que se repetirá la reunión"
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,action:0
msgid "Action"
-msgstr "Acción"
-
-#. module: base_calendar
-#: help:base_calendar.invite.attendee,type:0
-msgid "Select whom you want to Invite"
-msgstr "Seleccione a quien quiere invitar"
+msgstr ""
#. module: base_calendar
#: help:calendar.alarm,duration:0
@@ -1119,52 +1076,38 @@ msgid ""
"Duration' and 'Repeat' are both optional, but if one occurs, so MUST the "
"other"
msgstr ""
-"Duración' y 'Repetir' son ambos opcionales, pero si uno está activo también "
-"debe estarlo el otro"
-
-#. module: base_calendar
-#: model:ir.model,name:base_calendar.model_calendar_event_edit_all
-msgid "Calendar Edit all event"
-msgstr "Editar todos los eventos del calendario"
#. module: base_calendar
#: help:calendar.attendee,role:0
msgid "Participation role for the calendar user"
-msgstr "Rol de participación para el usuario del calendario."
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
#: field:calendar.attendee,delegated_to:0
msgid "Delegated To"
-msgstr "Delegado a"
+msgstr ""
#. module: base_calendar
#: help:calendar.alarm,action:0
msgid "Defines the action to be invoked when an alarm is triggered"
-msgstr "Define la acción a invocar cuando salte la alarma"
+msgstr ""
+
+#. module: base_calendar
+#: view:crm.meeting:0
+msgid "Starting at"
+msgstr ""
#. module: base_calendar
#: selection:calendar.event,end_type:0
#: selection:calendar.todo,end_type:0
+#: selection:crm.meeting,end_type:0
msgid "End date"
-msgstr "Fecha de fin"
+msgstr ""
#. module: base_calendar
#: view:calendar.event:0
msgid "Search Events"
-msgstr "Buscar eventos"
-
-#. module: base_calendar
-#: view:calendar.event:0
-msgid "Recurrency Option"
-msgstr "Opción de recurrencia"
-
-#. module: base_calendar
-#: selection:base.calendar.set.exrule,freq:0
-#: selection:calendar.event,rrule_type:0
-#: selection:calendar.todo,rrule_type:0
-msgid "Weekly"
-msgstr "Semanal"
+msgstr ""
#. module: base_calendar
#: help:calendar.alarm,active:0
@@ -1173,87 +1116,70 @@ msgid ""
"If the active field is set to true, it will allow you to hide the event "
"alarm information without removing it."
msgstr ""
-"Si el campo activo es verdadero, le permitirá ocultar la notificación de "
-"aviso del evento sin eliminarlo."
#. module: base_calendar
-#: field:calendar.event,recurrent_id:0
-#: field:calendar.todo,recurrent_id:0
-msgid "Recurrent ID date"
-msgstr "ID fecha recurrente"
-
-#. module: base_calendar
-#: sql_constraint:res.users:0
-msgid "You can not have two users with the same login !"
-msgstr "¡No puede tener dos usuarios con el mismo identificador de usuario!"
+#: field:calendar.event,end_type:0
+#: field:calendar.todo,end_type:0
+#: field:crm.meeting,end_type:0
+msgid "Recurrence Termination"
+msgstr ""
#. module: base_calendar
-#: field:calendar.alarm,state:0
-#: view:calendar.attendee:0
-#: field:calendar.attendee,state:0
-#: view:calendar.event:0
-#: field:calendar.event,state:0
-#: field:calendar.todo,state:0
-msgid "State"
-msgstr "Estado"
+#: view:crm.meeting:0
+msgid "Until"
+msgstr ""
#. module: base_calendar
#: view:res.alarm:0
msgid "Reminder Details"
-msgstr "Detalles del recordatorio"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
-msgid "To Review"
-msgstr "A revisar"
+#: model:crm.meeting.type,name:base_calendar.categ_meet3
+msgid "Off-site Meeting"
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,freq:0
-#: field:calendar.event,freq:0
-#: field:calendar.todo,freq:0
-msgid "Frequency"
-msgstr "Frecuencia"
+#: view:crm.meeting:0
+msgid "Day of Month"
+msgstr ""
#. module: base_calendar
#: selection:calendar.alarm,state:0
msgid "Done"
-msgstr "Hecho"
+msgstr ""
#. module: base_calendar
#: help:calendar.event,interval:0
#: help:calendar.todo,interval:0
+#: help:crm.meeting,interval:0
msgid "Repeat every (Days/Week/Month/Year)"
-msgstr "Repetir cada (días/semana/mes/año)"
-
-#. module: base_calendar
-#: view:base_calendar.invite.attendee:0
-#: field:base_calendar.invite.attendee,user_ids:0
-msgid "Users"
-msgstr "Usuarios"
+msgstr ""
#. module: base_calendar
-#: view:base.calendar.set.exrule:0
-msgid "of"
-msgstr "de"
+#: view:crm.meeting:0
+msgid "All Day?"
+msgstr ""
#. module: base_calendar
-#: view:base_calendar.invite.attendee:0
#: view:calendar.event:0
-#: view:calendar.event.edit.all:0
msgid "Cancel"
-msgstr "Cancelar"
-
-#. module: base_calendar
-#: model:ir.model,name:base_calendar.model_res_users
-msgid "res.users"
-msgstr "res.usuarios"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,week_list:0
-#: selection:calendar.event,week_list:0
-#: selection:calendar.todo,week_list:0
-msgid "Tuesday"
-msgstr "Martes"
+#: model:ir.actions.act_window,help:base_calendar.action_crm_meeting
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to schedule a new meeting.\n"
+" </p><p>\n"
+" The calendar is shared between employees and fully integrated "
+"with\n"
+" other applications such as the employee holidays or the "
+"business\n"
+" opportunities.\n"
+" </p>\n"
+" "
+msgstr ""
#. module: base_calendar
#: help:calendar.alarm,description:0
@@ -1262,129 +1188,103 @@ msgid ""
"calendar component, than that provided by the "
"\"SUMMARY\" property"
msgstr ""
-"Facilita una descripción más completa del componente del calendario que la "
-"facilitada por la propiedad \"RESUMEN\""
#. module: base_calendar
#: view:calendar.event:0
msgid "Responsible User"
-msgstr "Usuario responsable"
+msgstr ""
#. module: base_calendar
+#: view:crm.meeting:0
+msgid "Select Weekdays"
+msgstr ""
+
+#. module: base_calendar
+#: code:addons/base_calendar/base_calendar.py:1519
#: selection:calendar.attendee,availability:0
#: selection:calendar.event,show_as:0
#: selection:calendar.todo,show_as:0
-#: selection:res.users,availability:0
+#: selection:crm.meeting,show_as:0
+#, python-format
msgid "Busy"
-msgstr "Ocupado"
+msgstr ""
#. module: base_calendar
#: model:ir.model,name:base_calendar.model_calendar_event
msgid "Calendar Event"
-msgstr "Evento de calendario"
-
-#. module: base_calendar
-#: selection:calendar.attendee,state:0
-#: selection:calendar.event,state:0
-#: selection:calendar.todo,state:0
-msgid "Tentative"
-msgstr "Provisional"
-
-#. module: base_calendar
-#: field:calendar.event,interval:0
-#: field:calendar.todo,interval:0
-msgid "Repeat every"
-msgstr "Repetir cada"
-
-#. module: base_calendar
-#: selection:calendar.event,end_type:0
-#: selection:calendar.todo,end_type:0
-msgid "Fix amout of times"
-msgstr "Cantidad fija de veces"
+msgstr ""
#. module: base_calendar
#: field:calendar.event,recurrency:0
#: field:calendar.todo,recurrency:0
+#: field:crm.meeting,recurrency:0
msgid "Recurrent"
-msgstr "Recurrente"
+msgstr ""
#. module: base_calendar
#: field:calendar.event,rrule_type:0
#: field:calendar.todo,rrule_type:0
+#: field:crm.meeting,rrule_type:0
msgid "Recurrency"
-msgstr "Recurrencia"
-
-#. module: base_calendar
-#: model:ir.actions.act_window,name:base_calendar.action_view_attendee_form
-#: model:ir.ui.menu,name:base_calendar.menu_attendee_invitations
-msgid "Event Invitations"
-msgstr "Invitaciones al evento"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,week_list:0
#: selection:calendar.event,week_list:0
#: selection:calendar.todo,week_list:0
+#: selection:crm.meeting,week_list:0
msgid "Thursday"
-msgstr "Jueves"
+msgstr ""
#. module: base_calendar
#: field:calendar.event,exrule:0
#: field:calendar.todo,exrule:0
+#: field:crm.meeting,exrule:0
msgid "Exception Rule"
-msgstr "Regla de excepción"
+msgstr ""
#. module: base_calendar
#: help:calendar.attendee,language:0
msgid ""
"To specify the language for text values in aproperty or property parameter."
msgstr ""
-"Para indicar el idioma de los valores de texto en una propiedad o parámetro "
-"de propiedad."
#. module: base_calendar
#: view:calendar.event:0
msgid "Details"
-msgstr "Detalles"
+msgstr ""
#. module: base_calendar
#: help:calendar.event,exrule:0
#: help:calendar.todo,exrule:0
+#: help:crm.meeting,exrule:0
msgid ""
"Defines a rule or repeating pattern of time to exclude from the recurring "
"rule."
msgstr ""
-"Define una regla o patrón de repetición de tiempo a excluir de la regla "
-"recurrente."
#. module: base_calendar
-#: field:base.calendar.set.exrule,month_list:0
#: field:calendar.event,month_list:0
#: field:calendar.todo,month_list:0
+#: field:crm.meeting,month_list:0
msgid "Month"
-msgstr "Mes"
+msgstr ""
#. module: base_calendar
-#: view:base_calendar.invite.attendee:0
-#: view:calendar.event:0
-msgid "Invite People"
-msgstr "Invitar personas"
+#: selection:calendar.event,rrule_type:0
+#: selection:calendar.todo,rrule_type:0
+#: selection:crm.meeting,rrule_type:0
+msgid "Day(s)"
+msgstr ""
#. module: base_calendar
-#: help:calendar.event,rrule:0
-#: help:calendar.todo,rrule:0
-msgid ""
-"Defines a rule or repeating pattern for recurring events\n"
-"e.g.: Every other month on the last Sunday of the month for 10 occurrences: "
-" FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=-1SU"
+#: view:calendar.event:0
+msgid "Confirmed Events"
msgstr ""
-"Define una regla o patrón repetitivo para eventos recurrentes.\n"
-"Por ejemplo: Para 10 ocurrencias cada último domingo de cada dos meses : "
-"FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=-1SU"
#. module: base_calendar
#: field:calendar.attendee,dir:0
msgid "URI Reference"
-msgstr "Referencia URI"
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,description:0
@@ -1393,110 +1293,115 @@ msgstr "Referencia URI"
#: field:calendar.event,name:0
#: field:calendar.todo,description:0
#: field:calendar.todo,name:0
+#: field:crm.meeting,description:0
msgid "Description"
-msgstr "Descripción"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,month_list:0
#: selection:calendar.event,month_list:0
#: selection:calendar.todo,month_list:0
+#: selection:crm.meeting,month_list:0
msgid "May"
-msgstr "Mayo"
-
-#. module: base_calendar
-#: field:base_calendar.invite.attendee,type:0
-#: view:calendar.attendee:0
-msgid "Type"
-msgstr "Tipo"
-
-#. module: base_calendar
-#: view:calendar.attendee:0
-msgid "Search Invitations"
-msgstr "Buscar invitaciones"
+msgstr ""
#. module: base_calendar
#: selection:calendar.alarm,trigger_occurs:0
#: selection:res.alarm,trigger_occurs:0
msgid "After"
-msgstr "Después de"
+msgstr ""
#. module: base_calendar
#: selection:calendar.alarm,state:0
msgid "Stop"
-msgstr "Parar"
+msgstr ""
#. module: base_calendar
#: model:ir.model,name:base_calendar.model_ir_values
msgid "ir.values"
-msgstr "ir.valores"
+msgstr ""
#. module: base_calendar
-#: model:ir.model,name:base_calendar.model_ir_model
-msgid "Objects"
-msgstr "Objetos"
+#: view:crm.meeting:0
+msgid "Search Meetings"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_ir_attachment
+msgid "ir.attachment"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_crm_meeting_type
+msgid "Meeting Type"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
#: selection:calendar.attendee,state:0
msgid "Delegated"
-msgstr "Delegada"
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,sa:0
#: field:calendar.event,sa:0
#: field:calendar.todo,sa:0
+#: field:crm.meeting,sa:0
msgid "Sat"
-msgstr "Sáb"
+msgstr ""
#. module: base_calendar
-#: view:calendar.event:0
-msgid "Choose day where repeat the meeting"
-msgstr "Eligir día en el que repetir la cita"
+#: model:ir.actions.act_window,help:base_calendar.action_res_alarm_view
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to setup a new alarm type.\n"
+" </p><p>\n"
+" You can define a customized type of calendar alarm that may "
+"be\n"
+" assigned to calendar events or meetings.\n"
+" </p>\n"
+" "
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,freq:0
-msgid "Minutely"
-msgstr "Cada minuto"
+#: selection:crm.meeting,state:0
+msgid "Unconfirmed"
+msgstr ""
#. module: base_calendar
#: help:calendar.attendee,sent_by:0
msgid "Specify the user that is acting on behalf of the calendar user"
msgstr ""
-"Indique el usuario que está actuando en nombre del usuario del calendario."
#. module: base_calendar
#: view:calendar.event:0
-#: field:calendar.event.edit.all,date_deadline:0
+#: field:calendar.event,date_deadline:0
+#: field:calendar.todo,date_deadline:0
+#: field:crm.meeting,date_deadline:0
msgid "End Date"
-msgstr "Fecha final"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,month_list:0
#: selection:calendar.event,month_list:0
#: selection:calendar.todo,month_list:0
+#: selection:crm.meeting,month_list:0
msgid "February"
-msgstr "Febrero"
-
-#. module: base_calendar
-#: selection:calendar.event,freq:0
-#: selection:calendar.todo,freq:0
-msgid "Months"
-msgstr "Meses"
+msgstr ""
#. module: base_calendar
#: selection:calendar.attendee,cutype:0
msgid "Resource"
-msgstr "Recurso"
+msgstr ""
#. module: base_calendar
+#: field:crm.meeting.type,name:0
#: field:res.alarm,name:0
msgid "Name"
-msgstr "Nombre"
+msgstr ""
#. module: base_calendar
-#: model:ir.model,name:base_calendar.model_calendar_alarm
-msgid "Event alarm information"
-msgstr "Información del aviso del evento"
+#: field:calendar.event,exdate:0
+#: field:calendar.todo,exdate:0
+#: field:crm.meeting,exdate:0
+msgid "Exception Date/Times"
+msgstr ""
#. module: base_calendar
#: help:calendar.alarm,name:0
@@ -1504,154 +1409,162 @@ msgid ""
"Contains the text to be used as the message subject for "
"email or contains the text to be used for display"
msgstr ""
-"Contiene el texto a usar como asunto del mensaje para correos electrónicos, "
-"o contiene el texto a mostrar"
#. module: base_calendar
-#: field:calendar.event,alarm_id:0
+#: model:ir.model,name:base_calendar.model_mail_message
+msgid "Message"
+msgstr ""
+
+#. module: base_calendar
#: field:calendar.event,base_calendar_alarm_id:0
-#: field:calendar.todo,alarm_id:0
#: field:calendar.todo,base_calendar_alarm_id:0
+#: field:crm.meeting,base_calendar_alarm_id:0
msgid "Alarm"
-msgstr "Alarma"
-
-#. module: base_calendar
-#: code:addons/base_calendar/wizard/base_calendar_set_exrule.py:90
-#, python-format
-msgid "Please Apply Recurrency before applying Exception Rule."
msgstr ""
-"Por favor, aplique la repetición antes de aplicar la excepción de la regla"
#. module: base_calendar
#: field:calendar.attendee,sent_by_uid:0
msgid "Sent By User"
-msgstr "Enviado por usuario"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,month_list:0
#: selection:calendar.event,month_list:0
#: selection:calendar.todo,month_list:0
+#: selection:crm.meeting,month_list:0
msgid "April"
-msgstr "Abril"
+msgstr ""
+
+#. module: base_calendar
+#: code:addons/base_calendar/crm_meeting.py:106
+#, python-format
+msgid "Email addresses not found"
+msgstr ""
#. module: base_calendar
#: view:calendar.event:0
msgid "Recurrency period"
-msgstr "Periodo de recurrencia"
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,week_list:0
#: field:calendar.event,week_list:0
#: field:calendar.todo,week_list:0
+#: field:crm.meeting,week_list:0
msgid "Weekday"
-msgstr "Día de la semana"
+msgstr ""
+
+#. module: base_calendar
+#: code:addons/base_calendar/base_calendar.py:1013
+#, python-format
+msgid "Interval cannot be negative."
+msgstr ""
#. module: base_calendar
-#: field:base.calendar.set.exrule,byday:0
#: field:calendar.event,byday:0
#: field:calendar.todo,byday:0
+#: field:crm.meeting,byday:0
msgid "By day"
-msgstr "Por día"
+msgstr ""
+
+#. module: base_calendar
+#: code:addons/base_calendar/base_calendar.py:441
+#, python-format
+msgid "First you have to specify the date of the invitation."
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,model_id:0
msgid "Model"
-msgstr "Modelo"
+msgstr ""
#. module: base_calendar
#: selection:calendar.alarm,action:0
msgid "Audio"
-msgstr "Audio"
+msgstr ""
#. module: base_calendar
#: field:calendar.event,id:0
#: field:calendar.todo,id:0
+#: field:crm.meeting,id:0
msgid "ID"
-msgstr "ID"
+msgstr ""
#. module: base_calendar
#: selection:calendar.attendee,role:0
msgid "For information Purpose"
-msgstr "Con propósito informativo"
+msgstr ""
#. module: base_calendar
-#: view:base_calendar.invite.attendee:0
-msgid "Invite"
-msgstr "Invitar"
+#: field:calendar.event,select1:0
+#: field:calendar.todo,select1:0
+#: field:crm.meeting,select1:0
+msgid "Option"
+msgstr ""
#. module: base_calendar
#: model:ir.model,name:base_calendar.model_calendar_attendee
msgid "Attendee information"
-msgstr "Información asistentes"
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,res_id:0
msgid "Resource ID"
-msgstr "ID del registro"
+msgstr ""
#. module: base_calendar
#: selection:calendar.attendee,state:0
msgid "Needs Action"
-msgstr "Necesita acción"
+msgstr ""
#. module: base_calendar
#: field:calendar.attendee,sent_by:0
msgid "Sent By"
-msgstr "Enviado por"
+msgstr ""
#. module: base_calendar
#: field:calendar.event,sequence:0
#: field:calendar.todo,sequence:0
+#: field:crm.meeting,sequence:0
msgid "Sequence"
-msgstr "Secuencia"
+msgstr ""
#. module: base_calendar
#: help:calendar.event,alarm_id:0
#: help:calendar.todo,alarm_id:0
+#: help:crm.meeting,alarm_id:0
msgid "Set an alarm at this time, before the event occurs"
-msgstr "Configure una alarma en este momento, antes de que ocurra el evento"
-
-#. module: base_calendar
-#: selection:base_calendar.invite.attendee,type:0
-msgid "Internal User"
-msgstr "Usuario interno"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
#: view:calendar.event:0
+#: view:crm.meeting:0
msgid "Accept"
-msgstr "Aceptar"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,week_list:0
#: selection:calendar.event,week_list:0
#: selection:calendar.todo,week_list:0
+#: selection:crm.meeting,week_list:0
msgid "Saturday"
-msgstr "Sábado"
+msgstr ""
#. module: base_calendar
-#: view:calendar.attendee:0
-msgid "Invitation To"
-msgstr "Invitación a"
+#: field:calendar.event,interval:0
+#: field:calendar.todo,interval:0
+#: field:crm.meeting,interval:0
+msgid "Repeat Every"
+msgstr ""
#. module: base_calendar
-#: selection:base.calendar.set.exrule,byday:0
#: selection:calendar.event,byday:0
#: selection:calendar.todo,byday:0
+#: selection:crm.meeting,byday:0
msgid "Second"
-msgstr "Segundo"
+msgstr ""
#. module: base_calendar
#: field:calendar.attendee,availability:0
-#: field:res.users,availability:0
msgid "Free/Busy"
-msgstr "Libre/Ocupado"
-
-#. module: base_calendar
-#: field:calendar.event,end_type:0
-#: field:calendar.todo,end_type:0
-msgid "Way to end reccurency"
-msgstr "Forma de terminar recurrencia"
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,duration:0
@@ -1659,20 +1572,16 @@ msgstr "Forma de terminar recurrencia"
#: field:calendar.event,duration:0
#: field:calendar.todo,date:0
#: field:calendar.todo,duration:0
+#: field:crm.meeting,duration:0
#: field:res.alarm,duration:0
#: field:res.alarm,trigger_duration:0
msgid "Duration"
-msgstr "Duración"
-
-#. module: base_calendar
-#: selection:base_calendar.invite.attendee,type:0
-msgid "External Email"
-msgstr "Email externo"
+msgstr ""
#. module: base_calendar
#: field:calendar.alarm,trigger_date:0
msgid "Trigger Date"
-msgstr "Fecha activación"
+msgstr ""
#. module: base_calendar
#: help:calendar.alarm,attach:0
@@ -1684,19 +1593,10 @@ msgid ""
" * Points to a procedure resource, which is invoked when "
" the alarm is triggered for procedure."
msgstr ""
-"* Apunta a un recurso de sonido, que se escucha cuando la alarma se activa "
-"por audio.\n"
-"* El archivo que está intentando ser enviado como adjunto en el correo "
-"electrónico.\n"
-"* Apunta a un recurso de procedimiento, que se invoca cuando la alarma se "
-"activa por procedimiento."
#. module: base_calendar
-#: selection:base.calendar.set.exrule,byday:0
#: selection:calendar.event,byday:0
#: selection:calendar.todo,byday:0
+#: selection:crm.meeting,byday:0
msgid "Fifth"
-msgstr "Quinto"
-
-#~ msgid "Set Exclude range"
-#~ msgstr "Fijar el rango de exclusión"
+msgstr ""
diff --git a/addons/base_crypt/i18n/nl_BE.po b/addons/base_crypt/i18n/nl_BE.po
index 7ad3faa1ef5..d77a3f14b47 100644
--- a/addons/base_crypt/i18n/nl_BE.po
+++ b/addons/base_crypt/i18n/nl_BE.po
@@ -8,19 +8,19 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-03 16:03+0000\n"
-"PO-Revision-Date: 2012-07-26 17:52+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"PO-Revision-Date: 2013-04-15 16:02+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:49+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
#. module: base_crypt
#: model:ir.model,name:base_crypt.model_res_users
msgid "Users"
-msgstr ""
+msgstr "Gebruikers"
#~ msgid "You can not have two users with the same login !"
#~ msgstr "U kunt geen twee gebruikers met dezelfde login maken."
diff --git a/addons/base_gengo/i18n/cs.po b/addons/base_gengo/i18n/cs.po
new file mode 100644
index 00000000000..91dc5ea941d
--- /dev/null
+++ b/addons/base_gengo/i18n/cs.po
@@ -0,0 +1,249 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:46+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: base_gengo
+#: view:res.company:0
+msgid "Comments for Translator"
+msgstr ""
+
+#. module: base_gengo
+#: field:ir.translation,job_id:0
+msgid "Gengo Job ID"
+msgstr ""
+
+#. module: base_gengo
+#: code:addons/base_gengo/wizard/base_gengo_translations.py:114
+#, python-format
+msgid "This language is not supported by the Gengo translation services."
+msgstr ""
+
+#. module: base_gengo
+#: field:res.company,gengo_comment:0
+msgid "Comments"
+msgstr ""
+
+#. module: base_gengo
+#: field:res.company,gengo_private_key:0
+msgid "Gengo Private Key"
+msgstr ""
+
+#. module: base_gengo
+#: model:ir.model,name:base_gengo.model_base_gengo_translations
+msgid "base.gengo.translations"
+msgstr ""
+
+#. module: base_gengo
+#: help:res.company,gengo_auto_approve:0
+msgid "Jobs are Automatically Approved by Gengo."
+msgstr ""
+
+#. module: base_gengo
+#: field:base.gengo.translations,lang_id:0
+msgid "Language"
+msgstr ""
+
+#. module: base_gengo
+#: field:ir.translation,gengo_comment:0
+msgid "Comments & Activity Linked to Gengo"
+msgstr ""
+
+#. module: base_gengo
+#: code:addons/base_gengo/wizard/base_gengo_translations.py:124
+#, python-format
+msgid "Gengo Sync Translation (Response)"
+msgstr ""
+
+#. module: base_gengo
+#: code:addons/base_gengo/wizard/base_gengo_translations.py:72
+#, python-format
+msgid ""
+"Gengo `Public Key` or `Private Key` are missing. Enter your Gengo "
+"authentication parameters under `Settings > Companies > Gengo Parameters`."
+msgstr ""
+
+#. module: base_gengo
+#: selection:ir.translation,gengo_translation:0
+msgid "Translation By Machine"
+msgstr ""
+
+#. module: base_gengo
+#: code:addons/base_gengo/wizard/base_gengo_translations.py:155
+#, python-format
+msgid ""
+"%s\n"
+"\n"
+"--\n"
+" Commented on %s by %s."
+msgstr ""
+
+#. module: base_gengo
+#: field:ir.translation,gengo_translation:0
+msgid "Gengo Translation Service Level"
+msgstr ""
+
+#. module: base_gengo
+#: constraint:ir.translation:0
+msgid ""
+"The Gengo translation service selected is not supported for this language."
+msgstr ""
+
+#. module: base_gengo
+#: selection:ir.translation,gengo_translation:0
+msgid "Standard"
+msgstr ""
+
+#. module: base_gengo
+#: help:ir.translation,gengo_translation:0
+msgid ""
+"You can select here the service level you want for an automatic translation "
+"using Gengo."
+msgstr ""
+
+#. module: base_gengo
+#: field:base.gengo.translations,restart_send_job:0
+msgid "Restart Sending Job"
+msgstr ""
+
+#. module: base_gengo
+#: view:ir.translation:0
+msgid "To Approve In Gengo"
+msgstr ""
+
+#. module: base_gengo
+#: view:res.company:0
+msgid "Private Key"
+msgstr ""
+
+#. module: base_gengo
+#: view:res.company:0
+msgid "Public Key"
+msgstr ""
+
+#. module: base_gengo
+#: field:res.company,gengo_public_key:0
+msgid "Gengo Public Key"
+msgstr ""
+
+#. module: base_gengo
+#: code:addons/base_gengo/wizard/base_gengo_translations.py:123
+#, python-format
+msgid "Gengo Sync Translation (Request)"
+msgstr ""
+
+#. module: base_gengo
+#: view:ir.translation:0
+msgid "Translations"
+msgstr ""
+
+#. module: base_gengo
+#: field:res.company,gengo_auto_approve:0
+msgid "Auto Approve Translation ?"
+msgstr ""
+
+#. module: base_gengo
+#: model:ir.actions.act_window,name:base_gengo.action_wizard_base_gengo_translations
+#: model:ir.ui.menu,name:base_gengo.menu_action_wizard_base_gengo_translations
+msgid "Gengo: Manual Request of Translation"
+msgstr ""
+
+#. module: base_gengo
+#: code:addons/base_gengo/ir_translation.py:62
+#: code:addons/base_gengo/wizard/base_gengo_translations.py:109
+#, python-format
+msgid "Gengo Authentication Error"
+msgstr ""
+
+#. module: base_gengo
+#: model:ir.model,name:base_gengo.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: base_gengo
+#: view:ir.translation:0
+msgid ""
+"Note: If the translation state is 'In Progress', it means that the "
+"translation has to be approved to be uploaded in this system. You are "
+"supposed to do that directly by using your Gengo Account"
+msgstr ""
+
+#. module: base_gengo
+#: code:addons/base_gengo/wizard/base_gengo_translations.py:82
+#, python-format
+msgid ""
+"Gengo connection failed with this message:\n"
+"``%s``"
+msgstr ""
+
+#. module: base_gengo
+#: view:res.company:0
+msgid "Gengo Parameters"
+msgstr ""
+
+#. module: base_gengo
+#: view:base.gengo.translations:0
+msgid "Send"
+msgstr ""
+
+#. module: base_gengo
+#: selection:ir.translation,gengo_translation:0
+msgid "Ultra"
+msgstr ""
+
+#. module: base_gengo
+#: model:ir.model,name:base_gengo.model_ir_translation
+msgid "ir.translation"
+msgstr ""
+
+#. module: base_gengo
+#: view:ir.translation:0
+msgid "Gengo Translation Service"
+msgstr ""
+
+#. module: base_gengo
+#: selection:ir.translation,gengo_translation:0
+msgid "Pro"
+msgstr ""
+
+#. module: base_gengo
+#: view:base.gengo.translations:0
+msgid "Gengo Request Form"
+msgstr ""
+
+#. module: base_gengo
+#: code:addons/base_gengo/wizard/base_gengo_translations.py:114
+#, python-format
+msgid "Warning"
+msgstr ""
+
+#. module: base_gengo
+#: help:res.company,gengo_comment:0
+msgid ""
+"This comment will be automatically be enclosed in each an every request sent "
+"to Gengo"
+msgstr ""
+
+#. module: base_gengo
+#: view:base.gengo.translations:0
+msgid "Cancel"
+msgstr ""
+
+#. module: base_gengo
+#: view:base.gengo.translations:0
+msgid "or"
+msgstr ""
diff --git a/addons/base_iban/base_iban.py b/addons/base_iban/base_iban.py
index 0872af2d0f3..d50ca33ff15 100644
--- a/addons/base_iban/base_iban.py
+++ b/addons/base_iban/base_iban.py
@@ -181,6 +181,5 @@ class res_partner_bank(osv.osv):
(_check_bank, '\nPlease define BIC/Swift code on bank for bank type IBAN Account to make valid payments', ['bic'])
]
-res_partner_bank()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_import/i18n/cs.po b/addons/base_import/i18n/cs.po
new file mode 100644
index 00000000000..e49e2198de7
--- /dev/null
+++ b/addons/base_import/i18n/cs.po
@@ -0,0 +1,1164 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:46+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/js/import.js:451
+#, python-format
+msgid "Get all possible values"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:71
+#, python-format
+msgid "Need to import data from an other application?"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:163
+#, python-format
+msgid ""
+"When you use External IDs, you can import CSV files \n"
+" with the \"External ID\" column to define the "
+"External \n"
+" ID of each record you import. Then, you will be able "
+"\n"
+" to make a reference to that record with columns like "
+"\n"
+" \"Field/External ID\". The following two CSV files "
+"give \n"
+" you an example for Products and their Categories."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:271
+#, python-format
+msgid ""
+"How to export/import different tables from an SQL \n"
+" application to OpenERP?"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/js/import.js:331
+#, python-format
+msgid "Relation Fields"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:142
+#, python-format
+msgid ""
+"Country/Database ID: the unique OpenERP ID for a \n"
+" record, defined by the ID postgresql column"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:155
+#, python-format
+msgid ""
+"Use \n"
+" Country/Database ID: You should rarely use this \n"
+" notation. It's mostly used by developers as it's "
+"main \n"
+" advantage is to never have conflicts (you may have \n"
+" several records with the same name, but they always "
+"\n"
+" have a unique Database ID)"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:146
+#, python-format
+msgid ""
+"For the country \n"
+" Belgium, you can use one of these 3 ways to import:"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:303
+#, python-format
+msgid "company_1,Bigees,True"
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_m2o
+msgid "base_import.tests.models.m2o"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:297
+#, python-format
+msgid ""
+"copy \n"
+" (select 'company_'||id as \"External "
+"ID\",company_name \n"
+" as \"Name\",'True' as \"Is a Company\" from "
+"companies) TO \n"
+" '/tmp/company.csv' with CSV HEADER;"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:206
+#, python-format
+msgid "CSV file for Manufacturer, Retailer"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:160
+#, python-format
+msgid ""
+"Use \n"
+" Country/External ID: Use External ID when you import "
+"\n"
+" data from a third party application."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:316
+#, python-format
+msgid "person_1,Fabien,False,company_1"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:80
+#, python-format
+msgid "XXX/External ID"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:351
+#, python-format
+msgid "Don't Import"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:24
+#, python-format
+msgid "Select the"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:100
+#, python-format
+msgid ""
+"Note that if your CSV file \n"
+" has a tabulation as separator, OpenERP will not \n"
+" detect the separations. You will need to change the "
+"\n"
+" file format options in your spreadsheet application. "
+"\n"
+" See the following question."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:141
+#, python-format
+msgid "Country: the name or code of the country"
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_o2m_child
+msgid "base_import.tests.models.o2m.child"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:239
+#, python-format
+msgid "Can I import several times the same record?"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:15
+#, python-format
+msgid "Validate"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:55
+#, python-format
+msgid "Map your data to OpenERP"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:153
+#, python-format
+msgid ""
+"Use Country: This is \n"
+" the easiest way when your data come from CSV files \n"
+" that have been created manually."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:127
+#, python-format
+msgid ""
+"What's the difference between Database ID and \n"
+" External ID?"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:138
+#, python-format
+msgid ""
+"For example, to \n"
+" reference the country of a contact, OpenERP proposes "
+"\n"
+" you 3 different fields to import:"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:175
+#, python-format
+msgid "What can I do if I have multiple matches for a field?"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:302
+#, python-format
+msgid "External ID,Name,Is a Company"
+msgstr ""
+
+#. module: base_import
+#: field:base_import.tests.models.preview,somevalue:0
+msgid "Some Value"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:231
+#, python-format
+msgid ""
+"The following CSV file shows how to import \n"
+" suppliers and their respective contacts"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:109
+#, python-format
+msgid ""
+"How can I change the CSV file format options when \n"
+" saving in my spreadsheet application?"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:320
+#, python-format
+msgid ""
+"As you can see in this file, Fabien and Laurence \n"
+" are working for the Bigees company (company_1) and \n"
+" Eric is working for the Organi company. The relation "
+"\n"
+" between persons and companies is done using the \n"
+" External ID of the companies. We had to prefix the \n"
+" \"External ID\" by the name of the table to avoid a "
+"\n"
+" conflict of ID between persons and companies "
+"(person_1 \n"
+" and company_1 who shared the same ID 1 in the "
+"orignial \n"
+" database)."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:308
+#, python-format
+msgid ""
+"copy (select \n"
+" 'person_'||id as \"External ID\",person_name as \n"
+" \"Name\",'False' as \"Is a "
+"Company\",'company_'||company_id\n"
+" as \"Related Company/External ID\" from persons) TO "
+"\n"
+" '/tmp/person.csv' with CSV"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:148
+#, python-format
+msgid "Country: Belgium"
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_char_stillreadonly
+msgid "base_import.tests.models.char.stillreadonly"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:314
+#, python-format
+msgid ""
+"External ID,Name,Is a \n"
+" Company,Related Company/External ID"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:233
+#, python-format
+msgid "Suppliers and their respective contacts"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:179
+#, python-format
+msgid ""
+"If for example you have two product categories \n"
+" with the child name \"Sellable\" (ie. \"Misc. \n"
+" Products/Sellable\" & \"Other Products/Sellable\"),\n"
+" your validation is halted but you may still import \n"
+" your data. However, we recommend you do not import "
+"the \n"
+" data because they will all be linked to the first \n"
+" 'Sellable' category found in the Product Category "
+"list \n"
+" (\"Misc. Products/Sellable\"). We recommend you "
+"modify \n"
+" one of the duplicates' values or your product "
+"category \n"
+" hierarchy."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:306
+#, python-format
+msgid ""
+"To create the CSV file for persons, linked to \n"
+" companies, we will use the following SQL command in "
+"\n"
+" PSQL:"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:119
+#, python-format
+msgid ""
+"Microsoft Excel will allow \n"
+" you to modify only the encoding when saving \n"
+" (in 'Save As' dialog box > click 'Tools' dropdown \n"
+" list > Encoding tab)."
+msgstr ""
+
+#. module: base_import
+#: field:base_import.tests.models.preview,othervalue:0
+msgid "Other Variable"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:82
+#, python-format
+msgid ""
+"will also be used to update the original\n"
+" import if you need to re-import modified data\n"
+" later, it's thus good practice to specify it\n"
+" whenever possible"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:26
+#, python-format
+msgid ""
+"file to import. If you need a sample importable file, you\n"
+" can use the export tool to generate one."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:148
+#, python-format
+msgid ""
+"Country/Database \n"
+" ID: 21"
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_char
+msgid "base_import.tests.models.char"
+msgstr ""
+
+#. module: base_import
+#: help:base_import.import,file:0
+msgid "File to check and/or import, raw binary (not base64)"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:230
+#, python-format
+msgid "Purchase orders with their respective purchase order lines"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:60
+#, python-format
+msgid ""
+"If the file contains\n"
+" the column names, OpenERP can try auto-detecting the\n"
+" field corresponding to the column. This makes imports\n"
+" simpler especially when the file has many columns."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:26
+#, python-format
+msgid ".CSV"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:360
+#, python-format
+msgid ""
+". The issue is\n"
+" usually an incorrect file encoding."
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_m2o_required
+msgid "base_import.tests.models.m2o.required"
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_char_noreadonly
+msgid "base_import.tests.models.char.noreadonly"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:113
+#, python-format
+msgid ""
+"If you edit and save CSV files in speadsheet \n"
+" applications, your computer's regional settings will "
+"\n"
+" be applied for the separator and delimiter. \n"
+" We suggest you use OpenOffice or LibreOffice Calc \n"
+" as they will allow you to modify all three options \n"
+" (in 'Save As' dialog box > Check the box 'Edit "
+"filter \n"
+" settings' > Save)."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:30
+#, python-format
+msgid "CSV File:"
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_preview
+msgid "base_import.tests.models.preview"
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_char_required
+msgid "base_import.tests.models.char.required"
+msgstr ""
+
+#. module: base_import
+#: code:addons/base_import/models.py:112
+#, python-format
+msgid "Database ID"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:313
+#, python-format
+msgid "It will produce the following CSV file:"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:362
+#, python-format
+msgid "Here is the start of the file we could not import:"
+msgstr ""
+
+#. module: base_import
+#: field:base_import.import,file_type:0
+msgid "File Type"
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_import
+msgid "base_import.import"
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_o2m
+msgid "base_import.tests.models.o2m"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:360
+#, python-format
+msgid "Import preview failed due to:"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:144
+#, python-format
+msgid ""
+"Country/External ID: the ID of this record \n"
+" referenced in another application (or the .XML file "
+"\n"
+" that imported it)"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:35
+#, python-format
+msgid "Reload data to check changes."
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_char_readonly
+msgid "base_import.tests.models.char.readonly"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:131
+#, python-format
+msgid ""
+"Some fields define a relationship with another \n"
+" object. For example, the country of a contact is a \n"
+" link to a record of the 'Country' object. When you \n"
+" want to import such fields, OpenERP will have to \n"
+" recreate links between the different records. \n"
+" To help you import such fields, OpenERP provides 3 \n"
+" mechanisms. You must use one and only one mechanism "
+"\n"
+" per field you want to import."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:201
+#, python-format
+msgid ""
+"The tags should be separated by a comma without any \n"
+" spacing. For example, if you want you customer to be "
+"\n"
+" lined to both tags 'Manufacturer' and 'Retailer' \n"
+" then you will encode it as follow \"Manufacturer,\n"
+" Retailer\" in the same column of your CSV file."
+msgstr ""
+
+#. module: base_import
+#: code:addons/base_import/models.py:264
+#, python-format
+msgid "You must configure at least one field to import"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:304
+#, python-format
+msgid "company_2,Organi,True"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:58
+#, python-format
+msgid ""
+"The first row of the\n"
+" file contains the label of the column"
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_char_states
+msgid "base_import.tests.models.char.states"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:7
+#, python-format
+msgid "Import a CSV File"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/js/import.js:74
+#, python-format
+msgid "Quoting:"
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_m2o_required_related
+msgid "base_import.tests.models.m2o.required.related"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:293
+#, python-format
+msgid ")."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:18
+#: code:addons/base_import/static/src/xml/import.xml:396
+#, python-format
+msgid "Import"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/js/import.js:438
+#, python-format
+msgid "Here are the possible values:"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:82
+#, python-format
+msgid "The"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/js/import.js:248
+#, python-format
+msgid ""
+"A single column was found in the file, this often means the file separator "
+"is incorrect"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:293
+#, python-format
+msgid "dump of such a PostgreSQL database"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:301
+#, python-format
+msgid "This SQL command will create the following CSV file:"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:228
+#, python-format
+msgid ""
+"The following CSV file shows how to import purchase \n"
+" orders with their respective purchase order lines:"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:91
+#, python-format
+msgid ""
+"What can I do when the Import preview table isn't \n"
+" displayed correctly?"
+msgstr ""
+
+#. module: base_import
+#: field:base_import.tests.models.char,value:0
+#: field:base_import.tests.models.char.noreadonly,value:0
+#: field:base_import.tests.models.char.readonly,value:0
+#: field:base_import.tests.models.char.required,value:0
+#: field:base_import.tests.models.char.states,value:0
+#: field:base_import.tests.models.char.stillreadonly,value:0
+#: field:base_import.tests.models.m2o,value:0
+#: field:base_import.tests.models.m2o.related,value:0
+#: field:base_import.tests.models.m2o.required,value:0
+#: field:base_import.tests.models.m2o.required.related,value:0
+#: field:base_import.tests.models.o2m,value:0
+#: field:base_import.tests.models.o2m.child,parent_id:0
+#: field:base_import.tests.models.o2m.child,value:0
+msgid "unknown"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:317
+#, python-format
+msgid "person_2,Laurence,False,company_1"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:149
+#, python-format
+msgid "Country/External ID: base.be"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:288
+#, python-format
+msgid ""
+"As an example, suppose you have a SQL database \n"
+" with two tables you want to import: companies and \n"
+" persons. Each person belong to one company, so you \n"
+" will have to recreate the link between a person and "
+"\n"
+" the company he work for. (If you want to test this \n"
+" example, here is a"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/js/import.js:427
+#, python-format
+msgid "(%d more)"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:227
+#, python-format
+msgid "File for some Quotations"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/js/import.js:72
+#, python-format
+msgid "Encoding:"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:280
+#, python-format
+msgid ""
+"To manage relations between tables, \n"
+" you can use the \"External ID\" facilities of "
+"OpenERP. \n"
+" The \"External ID\" of a record is the unique "
+"identifier \n"
+" of this record in another application. This "
+"\"External \n"
+" ID\" must be unique accoss all the records of all \n"
+" objects, so it's a good practice to prefix this \n"
+" \"External ID\" with the name of the application or "
+"\n"
+" table. (like 'company_1', 'person_1' instead of '1')"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:295
+#, python-format
+msgid ""
+"We will first export all companies and their \n"
+" \"External ID\". In PSQL, write the following "
+"command:"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:212
+#, python-format
+msgid ""
+"How can I import a one2many relationship (e.g. several \n"
+" Order Lines of a Sales Order)?"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/js/import.js:404
+#, python-format
+msgid "Everything seems valid."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:188
+#, python-format
+msgid ""
+"However if you do not wish to change your \n"
+" configuration of product categories, we recommend "
+"you \n"
+" use make use of the external ID for this field \n"
+" 'Category'."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/js/import.js:421
+#, python-format
+msgid "at row %d"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:197
+#, python-format
+msgid ""
+"How can I import a many2many relationship field \n"
+" (e.g. a customer that has multiple tags)?"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:80
+#, python-format
+msgid "XXX/ID"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:275
+#, python-format
+msgid ""
+"If you need to import data from different tables, \n"
+" you will have to recreate relations between records "
+"\n"
+" belonging to different tables. (e.g. if you import \n"
+" companies and persons, you will have to recreate the "
+"\n"
+" link between each person and the company they work \n"
+" for)."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:150
+#, python-format
+msgid ""
+"According to your need, you should use \n"
+" one of these 3 ways to reference records in "
+"relations. \n"
+" Here is when you should use one or the other, \n"
+" according to your need:"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:319
+#, python-format
+msgid "person_4,Ramsy,False,company_3"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:261
+#, python-format
+msgid ""
+"If you do not set all fields in your CSV file, \n"
+" OpenERP will assign the default value for every non "
+"\n"
+" defined fields. But if you\n"
+" set fields with empty values in your CSV file, "
+"OpenERP \n"
+" will set the EMPTY value in the field, instead of \n"
+" assigning the default value."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:20
+#, python-format
+msgid "Cancel"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:257
+#, python-format
+msgid ""
+"What happens if I do not provide a value for a \n"
+" specific field?"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:68
+#, python-format
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:305
+#, python-format
+msgid "company_3,Boum,True"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:249
+#, python-format
+msgid ""
+"This feature \n"
+" allows you to use the Import/Export tool of OpenERP "
+"to \n"
+" modify a batch of records in your favorite "
+"spreadsheet \n"
+" application."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:77
+#, python-format
+msgid ""
+"column in OpenERP. When you\n"
+" import an other record that links to the first\n"
+" one, use"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:242
+#, python-format
+msgid ""
+"If you import a file that contains one of the \n"
+" column \"External ID\" or \"Database ID\", records "
+"that \n"
+" have already been imported will be modified instead "
+"of \n"
+" being created. This is very usefull as it allows you "
+"\n"
+" to import several times the same CSV file while "
+"having \n"
+" made some changes in between two imports. OpenERP "
+"will \n"
+" take care of creating or modifying each record \n"
+" depending if it's new or not."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:169
+#, python-format
+msgid "CSV file for categories"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/js/import.js:330
+#, python-format
+msgid "Normal Fields"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:74
+#, python-format
+msgid ""
+"In order to re-create relationships between\n"
+" different records, you should use the unique\n"
+" identifier from the original application and\n"
+" map it to the"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:170
+#, python-format
+msgid "CSV file for Products"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:216
+#, python-format
+msgid ""
+"If you want to import sales order having several \n"
+" order lines; for each order line, you need to "
+"reserve \n"
+" a specific row in the CSV file. The first order line "
+"\n"
+" will be imported on the same row as the information "
+"\n"
+" relative to order. Any additional lines will need an "
+"\n"
+" addtional row that does not have any information in "
+"\n"
+" the fields relative to the order."
+msgstr ""
+
+#. module: base_import
+#: model:ir.model,name:base_import.model_base_import_tests_models_m2o_related
+msgid "base_import.tests.models.m2o.related"
+msgstr ""
+
+#. module: base_import
+#: field:base_import.tests.models.preview,name:0
+msgid "Name"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:80
+#, python-format
+msgid "to the original unique identifier."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:318
+#, python-format
+msgid "person_3,Eric,False,company_2"
+msgstr ""
+
+#. module: base_import
+#: field:base_import.import,res_model:0
+msgid "Model"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:77
+#: code:addons/base_import/static/src/xml/import.xml:82
+#, python-format
+msgid "ID"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:329
+#, python-format
+msgid ""
+"The two files produced are ready to be imported in \n"
+" OpenERP without any modifications. After having \n"
+" imported these two CSV files, you will have 4 "
+"contacts \n"
+" and 3 companies. (the firsts two contacts are linked "
+"\n"
+" to the first company). You must first import the \n"
+" companies and then the persons."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:95
+#, python-format
+msgid ""
+"By default the Import preview is set on commas as \n"
+" field separators and quotation marks as text \n"
+" delimiters. If your csv file does not have these \n"
+" settings, you can modify the File Format Options \n"
+" (displayed under the Browse CSV file bar after you \n"
+" select your file)."
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/js/import.js:73
+#, python-format
+msgid "Separator:"
+msgstr ""
+
+#. module: base_import
+#: field:base_import.import,file_name:0
+msgid "File Name"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/models.py:80
+#: code:addons/base_import/models.py:111
+#: code:addons/base_import/static/src/xml/import.xml:77
+#: code:addons/base_import/static/src/xml/import.xml:82
+#, python-format
+msgid "External ID"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:39
+#, python-format
+msgid "File Format Options…"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/js/import.js:423
+#, python-format
+msgid "between rows %d and %d"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:19
+#, python-format
+msgid "or"
+msgstr ""
+
+#. module: base_import
+#. openerp-web
+#: code:addons/base_import/static/src/xml/import.xml:223
+#, python-format
+msgid ""
+"As an example, here is \n"
+" purchase.order_functional_error_line_cant_adpat.CSV "
+"\n"
+" file of some quotations you can import, based on "
+"demo \n"
+" data."
+msgstr ""
+
+#. module: base_import
+#: field:base_import.import,file:0
+msgid "File"
+msgstr ""
diff --git a/addons/base_import/i18n/hu.po b/addons/base_import/i18n/hu.po
index 2c3c4e60ab2..db143a0f032 100644
--- a/addons/base_import/i18n/hu.po
+++ b/addons/base_import/i18n/hu.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2013-03-17 23:49+0000\n"
+"PO-Revision-Date: 2013-03-27 22:52+0000\n"
"Last-Translator: krnkris <Unknown>\n"
"Language-Team: Hungarian <hu@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-19 05:33+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-03-29 04:36+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
#. module: base_import
#. openerp-web
@@ -441,6 +441,20 @@ msgid ""
"category \n"
" hierarchy."
msgstr ""
+"Például, ha két termék kategóriával rendelkezik \n"
+" ezzel az al-névvel \"Értékesíthető\" (pl. \"Egyéb \n"
+" Termékek/Értékesíthetők\" & \"Más "
+"Termékek/Értékesíthetők\"),\n"
+" akkor a jóváhagyás meg lesz állítva, de az adatait "
+"még tudja \n"
+" importálni. Azonban, nem ajánlott az adat betöltése "
+"\n"
+" mivel az összes adat az első találhat "
+"'Értékesíthető' kategóriához \n"
+" lesz hozzárendelve a Termék kategória listában \n"
+" (\"Egyéb Termékeke/Értékesíthető\"). Ajánljuk, hogy "
+"módosítsa \n"
+" a termék kategória rangsor egyik ismétlődő értékét ."
#. module: base_import
#. openerp-web
@@ -452,6 +466,9 @@ msgid ""
"\n"
" PSQL:"
msgstr ""
+"Személyekhez CVS fájl létrehozása, vállalatokhoz\n"
+" kapcsolva, a következő SQL parancsot használva a \n"
+" PSQL-ben:"
#. module: base_import
#. openerp-web
@@ -463,11 +480,16 @@ msgid ""
" (in 'Save As' dialog box > click 'Tools' dropdown \n"
" list > Encoding tab)."
msgstr ""
+"Microsoft Excel lehetővé teszi\n"
+" csak a kódolás módosítását az elmentés alatt \n"
+" (a 'Mentés másként' párbeszéd ablakban > kattints a "
+"'Kellékek' legördülő \n"
+" listán > a Kódolás fülre)."
#. module: base_import
#: field:base_import.tests.models.preview,othervalue:0
msgid "Other Variable"
-msgstr ""
+msgstr "Másik változó"
#. module: base_import
#. openerp-web
@@ -479,6 +501,11 @@ msgid ""
" later, it's thus good practice to specify it\n"
" whenever possible"
msgstr ""
+"az eredeti importálás frissítéséhez is \n"
+" használja, ha később is fel akarja használni az újra-"
+"importált módosított\n"
+" adatot, amikor csak lehet ez egy jó gyakorlás a \n"
+" meghatározáshoz"
#. module: base_import
#. openerp-web
@@ -488,6 +515,9 @@ msgid ""
"file to import. If you need a sample importable file, you\n"
" can use the export tool to generate one."
msgstr ""
+"fájl importáláshoz, betöltéshez. Ha szüksége van egy importálható példa "
+"fájlra, akkor\n"
+" használhatja az export eszközt egy új generálásához."
#. module: base_import
#. openerp-web
@@ -497,16 +527,19 @@ msgid ""
"Country/Database \n"
" ID: 21"
msgstr ""
+"Ország/Adatbázis \n"
+" ID: 21"
#. module: base_import
#: model:ir.model,name:base_import.model_base_import_tests_models_char
msgid "base_import.tests.models.char"
-msgstr ""
+msgstr "base_import.tests.models.char"
#. module: base_import
#: help:base_import.import,file:0
msgid "File to check and/or import, raw binary (not base64)"
msgstr ""
+"Az importálandó és/vagy ellenőrizni kívánt fájl, nyers bináris (nem base64)"
#. module: base_import
#. openerp-web
@@ -514,6 +547,7 @@ msgstr ""
#, python-format
msgid "Purchase orders with their respective purchase order lines"
msgstr ""
+"Beszerzési megrendelések a hozzájuk tartozó beszerzési megrendelés sorokkal"
#. module: base_import
#. openerp-web
@@ -525,13 +559,18 @@ msgid ""
" field corresponding to the column. This makes imports\n"
" simpler especially when the file has many columns."
msgstr ""
+"Ha a fájl tartalmazza\n"
+" az oszlop neveket, OpenERP megpróbálhatja automatikusan "
+"észlelni\n"
+" oszlophoz tartozó mezőt. Ez az importálásokat egyszerűbbé\n"
+" teszi, főként, ha a fájl tele van oszlopokkal."
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:26
#, python-format
msgid ".CSV"
-msgstr ""
+msgstr ".CSV"
#. module: base_import
#. openerp-web
@@ -541,16 +580,18 @@ msgid ""
". The issue is\n"
" usually an incorrect file encoding."
msgstr ""
+". A probléma\n"
+" általában a téves fájl kódolás."
#. module: base_import
#: model:ir.model,name:base_import.model_base_import_tests_models_m2o_required
msgid "base_import.tests.models.m2o.required"
-msgstr ""
+msgstr "base_import.tests.models.m2o.required"
#. module: base_import
#: model:ir.model,name:base_import.model_base_import_tests_models_char_noreadonly
msgid "base_import.tests.models.char.noreadonly"
-msgstr ""
+msgstr "base_import.tests.models.char.noreadonly"
#. module: base_import
#. openerp-web
@@ -567,65 +608,75 @@ msgid ""
"filter \n"
" settings' > Save)."
msgstr ""
+"Ha szerkeszti és menti a CSV fájlt a táblázat kezelő \n"
+" alkalmazásokban, a számítógépének területi "
+"beállítása lesz \n"
+" az elválasztáshoz és a határolójelekhez használva. \n"
+" Ajánljuk az OpenOffice vagy LibreOffice Calc \n"
+" használatát, mivel ezek lehetővé teszik mindhárom "
+"lehetőség\n"
+" módosítását (a 'Mentés másként' beszédpanelen > a\n"
+" 'Szerkesztési szűrő beállítás' négyzetnek\n"
+" a bejelölésével > Mentés)."
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:30
#, python-format
msgid "CSV File:"
-msgstr ""
+msgstr "CSV Fájl:"
#. module: base_import
#: model:ir.model,name:base_import.model_base_import_tests_models_preview
msgid "base_import.tests.models.preview"
-msgstr ""
+msgstr "base_import.tests.models.preview"
#. module: base_import
#: model:ir.model,name:base_import.model_base_import_tests_models_char_required
msgid "base_import.tests.models.char.required"
-msgstr ""
+msgstr "base_import.tests.models.char.required"
#. module: base_import
#: code:addons/base_import/models.py:112
#, python-format
msgid "Database ID"
-msgstr ""
+msgstr "Adatbázis ID azonosító"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:313
#, python-format
msgid "It will produce the following CSV file:"
-msgstr ""
+msgstr "Ez a következő CSV fájlt fogja létrehozni:"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:362
#, python-format
msgid "Here is the start of the file we could not import:"
-msgstr ""
+msgstr "Itt van a fájlnak az eleje, melyiket nem tudtuk importálni:"
#. module: base_import
#: field:base_import.import,file_type:0
msgid "File Type"
-msgstr ""
+msgstr "Fájl típus"
#. module: base_import
#: model:ir.model,name:base_import.model_base_import_import
msgid "base_import.import"
-msgstr ""
+msgstr "base_import.import"
#. module: base_import
#: model:ir.model,name:base_import.model_base_import_tests_models_o2m
msgid "base_import.tests.models.o2m"
-msgstr ""
+msgstr "base_import.tests.models.o2m"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:360
#, python-format
msgid "Import preview failed due to:"
-msgstr ""
+msgstr "Import előnézet ezért nem sikerült:"
#. module: base_import
#. openerp-web
@@ -637,18 +688,22 @@ msgid ""
"\n"
" that imported it)"
msgstr ""
+"Ország/Külső ID azonosító: ennek a rekordnak az ID azonosítója\n"
+" másik alkalmazásban egy hivatkozás (vagy az .XML "
+"fájl \n"
+" ami importálta azt)"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:35
#, python-format
msgid "Reload data to check changes."
-msgstr ""
+msgstr "Adatok újratöltése a változások ellenőrzéséhez."
#. module: base_import
#: model:ir.model,name:base_import.model_base_import_tests_models_char_readonly
msgid "base_import.tests.models.char.readonly"
-msgstr ""
+msgstr "base_import.tests.models.char.readonly"
#. module: base_import
#. openerp-web
@@ -665,6 +720,18 @@ msgid ""
"\n"
" per field you want to import."
msgstr ""
+"Egyes mezők hivatkozásokat határoznak meg más \n"
+" objektummal. Például, egy kapcsolat országa \n"
+" csatolva van egy 'Ország' tárgyú rekorddal. Ha ilyen "
+"\n"
+" mezőket szeretne importálni, OpenERP újra létre "
+"kell\n"
+" hozza a kapcsolatokat a különböző rekordokhoz. \n"
+" Ilyen mezők importálásának segítésére, OpenERP három "
+"\n"
+" módot biztosít. Kizárólag egy módszert használhat az "
+"\n"
+" importálni kívánt mezőnként."
#. module: base_import
#. openerp-web
@@ -678,19 +745,26 @@ msgid ""
" then you will encode it as follow \"Manufacturer,\n"
" Retailer\" in the same column of your CSV file."
msgstr ""
+"A címkéket vesszővel kell elválasztani egyéb szóköz használata \n"
+" nélkül. Például, ha a vevőjét két címkéhez szeretné "
+"\n"
+" társítani, mint 'Gyártó' és 'Kiskereskedő' \n"
+" akkor azt a következő képpen kell bevinnie "
+"\"Gyártó,\n"
+" Kiskereskedő\" a CVS fájl ugyanazon oszlopába."
#. module: base_import
#: code:addons/base_import/models.py:264
#, python-format
msgid "You must configure at least one field to import"
-msgstr ""
+msgstr "Legalább egy mezőt be kell állítania az importáláshoz"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:304
#, python-format
msgid "company_2,Organi,True"
-msgstr ""
+msgstr "vállalat_2,Organi,Igaz"
#. module: base_import
#. openerp-web
@@ -700,37 +774,39 @@ msgid ""
"The first row of the\n"
" file contains the label of the column"
msgstr ""
+"A fájl első oszlopa\n"
+" tartalmazza az oszlop elnevezését"
#. module: base_import
#: model:ir.model,name:base_import.model_base_import_tests_models_char_states
msgid "base_import.tests.models.char.states"
-msgstr ""
+msgstr "base_import.tests.models.char.states"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:7
#, python-format
msgid "Import a CSV File"
-msgstr ""
+msgstr "Egy CVS fájl importálása"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/js/import.js:74
#, python-format
msgid "Quoting:"
-msgstr ""
+msgstr "Hivatkozni:"
#. module: base_import
#: model:ir.model,name:base_import.model_base_import_tests_models_m2o_required_related
msgid "base_import.tests.models.m2o.required.related"
-msgstr ""
+msgstr "base_import.tests.models.m2o.required.related"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:293
#, python-format
msgid ")."
-msgstr ""
+msgstr "nkat)."
#. module: base_import
#. openerp-web
@@ -738,21 +814,21 @@ msgstr ""
#: code:addons/base_import/static/src/xml/import.xml:396
#, python-format
msgid "Import"
-msgstr ""
+msgstr "Importálás"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/js/import.js:438
#, python-format
msgid "Here are the possible values:"
-msgstr ""
+msgstr "Ezek a lehetséges értékek:"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:82
#, python-format
msgid "The"
-msgstr ""
+msgstr "A"
#. module: base_import
#. openerp-web
@@ -762,20 +838,22 @@ msgid ""
"A single column was found in the file, this often means the file separator "
"is incorrect"
msgstr ""
+"Egy oszlop található a fájlban, Ez sokszor azt jelenti, hogy a fájl "
+"elválasztó hibás"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:293
#, python-format
msgid "dump of such a PostgreSQL database"
-msgstr ""
+msgstr "ilyen jellegű PostgreSQL adatbázis eldobása"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:301
#, python-format
msgid "This SQL command will create the following CSV file:"
-msgstr ""
+msgstr "Ez az SQL parancs ezt a CSV fájlt fogja létre hozni:"
#. module: base_import
#. openerp-web
@@ -785,6 +863,9 @@ msgid ""
"The following CSV file shows how to import purchase \n"
" orders with their respective purchase order lines:"
msgstr ""
+"A következő CSV fájl megmutatja hogyan importálja a beszerzési \n"
+" megrendeléseket a hozzá tartozó beszerzési "
+"megrendelés sorokkal:"
#. module: base_import
#. openerp-web
@@ -794,6 +875,8 @@ msgid ""
"What can I do when the Import preview table isn't \n"
" displayed correctly?"
msgstr ""
+"Mit tehetek, ha a kijelzőn lévő import tábla\n"
+" előnézete hibás?"
#. module: base_import
#: field:base_import.tests.models.char,value:0
@@ -810,21 +893,21 @@ msgstr ""
#: field:base_import.tests.models.o2m.child,parent_id:0
#: field:base_import.tests.models.o2m.child,value:0
msgid "unknown"
-msgstr ""
+msgstr "ismeretlen"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:317
#, python-format
msgid "person_2,Laurence,False,company_1"
-msgstr ""
+msgstr "személy_2,Laurence,Hamis,vállalat_1"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:149
#, python-format
msgid "Country/External ID: base.be"
-msgstr ""
+msgstr "Ország/Külső ID azonosító: base.be"
#. module: base_import
#. openerp-web
@@ -839,27 +922,35 @@ msgid ""
" the company he work for. (If you want to test this \n"
" example, here is a"
msgstr ""
+"Példának, feltételezzük, hogy van egy SQL adatbázis \n"
+" két importálandó táblázattal: vállalatok és \n"
+" személyek. Mindegyik személy egy vállalathoz "
+"tartozik, így \n"
+" létre kell hozni a kapcsolatot a személyek és a "
+"munkahelyi \n"
+" vállalatuk közt. (Ha tesztelni szeretné \n"
+" ezt a példát, itt van a"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/js/import.js:427
#, python-format
msgid "(%d more)"
-msgstr ""
+msgstr "(%d több)"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:227
#, python-format
msgid "File for some Quotations"
-msgstr ""
+msgstr "Fájl egy pár kérdésnek"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/js/import.js:72
#, python-format
msgid "Encoding:"
-msgstr ""
+msgstr "Kódolás:"
#. module: base_import
#. openerp-web
@@ -879,6 +970,20 @@ msgid ""
"\n"
" table. (like 'company_1', 'person_1' instead of '1')"
msgstr ""
+"Táblák közti relációk összefésülésének kezelése, \n"
+" használhatja a \"Külső ID azonosító\" OpenERP "
+"lehetőséget. \n"
+" A rekordhoz tartozó \"Külső ID azonosító\" a rekord "
+"egy másik \n"
+" alkalmazáson belüli egyedi azonosítója. Ez a \"Külső "
+"ID\n"
+" azonosító\" egyedi kell legyen minden rekordban és "
+"az összes \n"
+" objektumon, ezért jó gyakorlat ennek a \"Külső ID "
+"azonosítónak\"\n"
+" az alkalmazás vagy tábla előtaggal való "
+"kiegészítése. \n"
+" (mint 'vállalat_1', 'személy_1' az '1' helyett)"
#. module: base_import
#. openerp-web
@@ -889,6 +994,9 @@ msgid ""
" \"External ID\". In PSQL, write the following "
"command:"
msgstr ""
+"Először az összes vállalatot és a hozzá tartozó \"Külső ID azonosító\" lesz "
+"\n"
+" exportálva. A PSQL-ben, írja a következő parancsot:"
#. module: base_import
#. openerp-web
@@ -898,13 +1006,15 @@ msgid ""
"How can I import a one2many relationship (e.g. several \n"
" Order Lines of a Sales Order)?"
msgstr ""
+"Hogyan tudom importálni a one2many kapcsolatot (pl. egyes \n"
+" megrendelés sorokat egy megrendelésből)?"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/js/import.js:404
#, python-format
msgid "Everything seems valid."
-msgstr ""
+msgstr "Úgy néz ki mindegyik érvényes."
#. module: base_import
#. openerp-web
@@ -917,13 +1027,18 @@ msgid ""
" use make use of the external ID for this field \n"
" 'Category'."
msgstr ""
+"Azonban, ha nem szeretné a termék kategóriákat\n"
+" beállításait megváltoztatni, azt ajánljuk, hogy "
+"használja \n"
+" a külső ID azonosító használatát erre a 'Kategória'\n"
+" mezőre."
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/js/import.js:421
#, python-format
msgid "at row %d"
-msgstr ""
+msgstr "Ebben a sorban %d"
#. module: base_import
#. openerp-web
@@ -933,13 +1048,15 @@ msgid ""
"How can I import a many2many relationship field \n"
" (e.g. a customer that has multiple tags)?"
msgstr ""
+"Hogyan tudom importálni egy many2many kapcsolati mezőt \n"
+" (pl. egy vevő akinek több címkéje van)?"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:80
#, python-format
msgid "XXX/ID"
-msgstr ""
+msgstr "XXX/ID"
#. module: base_import
#. openerp-web
@@ -955,6 +1072,14 @@ msgid ""
" link between each person and the company they work \n"
" for)."
msgstr ""
+"Ha különböző táblázatokból kell adatot importálni, \n"
+" akkor a különböző táblázatok közötti rekordok "
+"kapcsolatait\n"
+" újra létre kell hozni. (pl. ha vállalatokat és "
+"személyeket \n"
+" importál, akkor létre kell hoznia a kapcsolatot \n"
+" minden személy és a vállalata közt, ahol "
+"alakalmazott)."
#. module: base_import
#. openerp-web
@@ -967,13 +1092,19 @@ msgid ""
" Here is when you should use one or the other, \n"
" according to your need:"
msgstr ""
+"Az igénye szerint, használni kell \n"
+" egyet a lehetésges 3 közül a a rekordokra "
+"hivatkozáshoz a kapcsolatokban. \n"
+" It van, ha egyiket a másik helyett kelle használni, "
+"\n"
+" az igénye szerint:"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:319
#, python-format
msgid "person_4,Ramsy,False,company_3"
-msgstr ""
+msgstr "személy_4,Ramsy,Hamis,vállalat_3"
#. module: base_import
#. openerp-web
@@ -989,13 +1120,20 @@ msgid ""
" will set the EMPTY value in the field, instead of \n"
" assigning the default value."
msgstr ""
+"Ha nem állítja be az összes mezőt a CSV fájlban, \n"
+" OpenERP az alapértelmezett értéket fogja adni minden "
+"olyan mezőnak ami \n"
+" nincs meghatározva. Ha a mezőnek\n"
+" üres értéket ad a CSV fájlban, OpenERP \n"
+" az ÜRES értéket fogja beállítani a mezőre, az \n"
+" alapértelmezett érték hozzáadása helyett."
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:20
#, python-format
msgid "Cancel"
-msgstr ""
+msgstr "Megszakítás"
#. module: base_import
#. openerp-web
@@ -1005,20 +1143,22 @@ msgid ""
"What happens if I do not provide a value for a \n"
" specific field?"
msgstr ""
+"Mi történik, ha nem adok meg értéket egy \n"
+" bizonyos mezőhöz?"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:68
#, python-format
msgid "Frequently Asked Questions"
-msgstr ""
+msgstr "Leggyakoribb kérdések"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:305
#, python-format
msgid "company_3,Boum,True"
-msgstr ""
+msgstr "vállalat_3,Boum,Igaz"
#. module: base_import
#. openerp-web
@@ -1032,6 +1172,12 @@ msgid ""
"spreadsheet \n"
" application."
msgstr ""
+"Ez a tulajdonság \n"
+" lehetővé teszi az OpenERP Import/Export eszköz "
+"használatát \n"
+" a rekord kötegek módosítására a kedvenc táblázat "
+"kezelőjénak \n"
+" alkalmazásával."
#. module: base_import
#. openerp-web
@@ -1042,6 +1188,9 @@ msgid ""
" import an other record that links to the first\n"
" one, use"
msgstr ""
+"oszlop az OpenERP-ben. Ha\n"
+" másik rekordot importál amelyik az elsőre\n"
+" hivatkozik, hasznája"
#. module: base_import
#. openerp-web
@@ -1068,14 +1217,14 @@ msgstr ""
#: code:addons/base_import/static/src/xml/import.xml:169
#, python-format
msgid "CSV file for categories"
-msgstr ""
+msgstr "CSV fájl kategóriákhoz"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/js/import.js:330
#, python-format
msgid "Normal Fields"
-msgstr ""
+msgstr "Normál mezők"
#. module: base_import
#. openerp-web
@@ -1087,13 +1236,18 @@ msgid ""
" identifier from the original application and\n"
" map it to the"
msgstr ""
+"A különböző rekordok közötti kapcsolat újboli\n"
+" létrehozásához, az eredeti alkalmazás \n"
+" egyedi azonosítójának használata\n"
+" szükséges amit\n"
+" irányítson ehhez"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:170
#, python-format
msgid "CSV file for Products"
-msgstr ""
+msgstr "CSV fájl a termékekhez"
#. module: base_import
#. openerp-web
@@ -1117,31 +1271,31 @@ msgstr ""
#. module: base_import
#: model:ir.model,name:base_import.model_base_import_tests_models_m2o_related
msgid "base_import.tests.models.m2o.related"
-msgstr ""
+msgstr "base_import.tests.models.m2o.related"
#. module: base_import
#: field:base_import.tests.models.preview,name:0
msgid "Name"
-msgstr ""
+msgstr "Név"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:80
#, python-format
msgid "to the original unique identifier."
-msgstr ""
+msgstr "az eredeti egyedi ID azonosítóhoz."
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:318
#, python-format
msgid "person_3,Eric,False,company_2"
-msgstr ""
+msgstr "személy_3,Eric,Hamis,vállalt_2"
#. module: base_import
#: field:base_import.import,res_model:0
msgid "Model"
-msgstr ""
+msgstr "Modell"
#. module: base_import
#. openerp-web
@@ -1149,7 +1303,7 @@ msgstr ""
#: code:addons/base_import/static/src/xml/import.xml:82
#, python-format
msgid "ID"
-msgstr ""
+msgstr "Azonosító ID"
#. module: base_import
#. openerp-web
@@ -1184,12 +1338,12 @@ msgstr ""
#: code:addons/base_import/static/src/js/import.js:73
#, python-format
msgid "Separator:"
-msgstr ""
+msgstr "Elválasztó:"
#. module: base_import
#: field:base_import.import,file_name:0
msgid "File Name"
-msgstr ""
+msgstr "Fájl neve"
#. module: base_import
#. openerp-web
@@ -1199,28 +1353,28 @@ msgstr ""
#: code:addons/base_import/static/src/xml/import.xml:82
#, python-format
msgid "External ID"
-msgstr ""
+msgstr "Külső ID azonosító"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:39
#, python-format
msgid "File Format Options…"
-msgstr ""
+msgstr "Fájl formátum lehetőségek…"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/js/import.js:423
#, python-format
msgid "between rows %d and %d"
-msgstr ""
+msgstr "oszlopok közt %d és %d"
#. module: base_import
#. openerp-web
#: code:addons/base_import/static/src/xml/import.xml:19
#, python-format
msgid "or"
-msgstr ""
+msgstr "vagy"
#. module: base_import
#. openerp-web
diff --git a/addons/base_report_designer/base_report_designer.py b/addons/base_report_designer/base_report_designer.py
index 359f41c4aa2..bc7959a17df 100644
--- a/addons/base_report_designer/base_report_designer.py
+++ b/addons/base_report_designer/base_report_designer.py
@@ -20,12 +20,13 @@
##############################################################################
import base64
+from StringIO import StringIO
+
+from openerp.modules.module import get_module_resource
import openerp.modules.registry
from openerp.osv import osv
from openerp_sxw2rml import sxw2rml
-from StringIO import StringIO
-from openerp import addons
-
+
class report_xml(osv.osv):
_inherit = 'ir.actions.report.xml'
@@ -36,9 +37,9 @@ class report_xml(osv.osv):
'''
sxwval = StringIO(base64.decodestring(file_sxw))
if file_type=='sxw':
- fp = open(addons.get_module_resource('base_report_designer','openerp_sxw2rml', 'normalized_oo2rml.xsl'),'rb')
+ fp = open(get_module_resource('base_report_designer','openerp_sxw2rml', 'normalized_oo2rml.xsl'),'rb')
if file_type=='odt':
- fp = open(addons.get_module_resource('base_report_designer','openerp_sxw2rml', 'normalized_odt2rml.xsl'),'rb')
+ fp = open(get_module_resource('base_report_designer','openerp_sxw2rml', 'normalized_odt2rml.xsl'),'rb')
return {'report_rml_content': str(sxw2rml(sxwval, xsl=fp.read()))}
def upload_report(self, cr, uid, report_id, file_sxw, file_type, context=None):
@@ -47,19 +48,14 @@ class report_xml(osv.osv):
'''
sxwval = StringIO(base64.decodestring(file_sxw))
if file_type=='sxw':
- fp = open(addons.get_module_resource('base_report_designer','openerp_sxw2rml', 'normalized_oo2rml.xsl'),'rb')
+ fp = open(get_module_resource('base_report_designer','openerp_sxw2rml', 'normalized_oo2rml.xsl'),'rb')
if file_type=='odt':
- fp = open(addons.get_module_resource('base_report_designer','openerp_sxw2rml', 'normalized_odt2rml.xsl'),'rb')
+ fp = open(get_module_resource('base_report_designer','openerp_sxw2rml', 'normalized_odt2rml.xsl'),'rb')
report = self.pool['ir.actions.report.xml'].write(cr, uid, [report_id], {
'report_sxw_content': base64.decodestring(file_sxw),
'report_rml_content': str(sxw2rml(sxwval, xsl=fp.read())),
})
- # FIXME: this should be moved to an override of the ir.actions.report_xml.create() method
- cr.commit()
- self.pool['ir.actions.report.xml'].register_all(cr)
- openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
-
return True
def report_get(self, cr, uid, report_id, context=None):
@@ -80,7 +76,6 @@ class report_xml(osv.osv):
'report_rml_content': rml_data and base64.encodestring(rml_data) or False
}
-report_xml()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/base_report_designer_installer.xml b/addons/base_report_designer/base_report_designer_installer.xml
index 657eae8fd63..99898f5a703 100644
--- a/addons/base_report_designer/base_report_designer_installer.xml
+++ b/addons/base_report_designer/base_report_designer_installer.xml
@@ -20,7 +20,7 @@
<xpath expr="//separator[@string='title']" position="after">
<group colspan="8" height="450" width="750">
<field name="name" invisible="1"/>
- <field name="plugin_file" filename="name"/>
+ <field name="plugin_file" filename="name" widget="url"/>
<separator string="Installation and Configuration Steps" colspan="4"/>
<field name="description" nolabel="1" colspan="8"/>
</group>
diff --git a/addons/base_report_designer/installer.py b/addons/base_report_designer/installer.py
index bfda6e7a30f..7fddc27f037 100644
--- a/addons/base_report_designer/installer.py
+++ b/addons/base_report_designer/installer.py
@@ -23,7 +23,6 @@ from openerp.osv import fields
from openerp.osv import osv
import base64
from openerp.tools.translate import _
-from openerp import addons
class base_report_designer_installer(osv.osv_memory):
_name = 'base_report_designer.installer'
@@ -31,13 +30,13 @@ class base_report_designer_installer(osv.osv_memory):
def default_get(self, cr, uid, fields, context=None):
data = super(base_report_designer_installer, self).default_get(cr, uid, fields, context=context)
- plugin_file = open(addons.get_module_resource('base_report_designer','plugin', 'openerp_report_designer.zip'),'rb')
- data['plugin_file'] = base64.encodestring(plugin_file.read())
+ base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
+ data['plugin_file'] = base_url + '/base_report_designer/static/base-report-designer-plugin/openerp_report_designer.zip'
return data
_columns = {
'name':fields.char('File name', size=34),
- 'plugin_file':fields.binary('OpenObject Report Designer Plug-in', readonly=True, help="OpenObject Report Designer plug-in file. Save as this file and install this plug-in in OpenOffice."),
+ 'plugin_file':fields.char('OpenObject Report Designer Plug-in', size=256, readonly=True, help="OpenObject Report Designer plug-in file. Save as this file and install this plug-in in OpenOffice."),
'description':fields.text('Description', readonly=True)
}
@@ -58,6 +57,5 @@ class base_report_designer_installer(osv.osv_memory):
4. if your connection success, A message appears like 'You can start creating your report in current document.'.
"""
}
-base_report_designer_installer()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/openerp_sxw2rml/normalized_odt2rml.xsl b/addons/base_report_designer/openerp_sxw2rml/normalized_odt2rml.xsl
index 50ffb3d81be..9f9e5050d69 100644
--- a/addons/base_report_designer/openerp_sxw2rml/normalized_odt2rml.xsl
+++ b/addons/base_report_designer/openerp_sxw2rml/normalized_odt2rml.xsl
@@ -414,7 +414,7 @@
<xsl:value-of select="$size" />
</xsl:attribute>
</xsl:if>
- <seq id="{../../@text:style-name}"/>.</bullet>
+ <seq id="{../../@text:style-name}"/></bullet>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
diff --git a/addons/base_report_designer/openerp_sxw2rml/normalized_oo2rml.xsl b/addons/base_report_designer/openerp_sxw2rml/normalized_oo2rml.xsl
index 66ef0b5b53c..ae68ae1ed1b 100644
--- a/addons/base_report_designer/openerp_sxw2rml/normalized_oo2rml.xsl
+++ b/addons/base_report_designer/openerp_sxw2rml/normalized_oo2rml.xsl
@@ -414,7 +414,7 @@
<xsl:value-of select="$size" />
</xsl:attribute>
</xsl:if>
- <seq id="{../../@text:style-name}"/>.</bullet>
+ <seq id="{../../@text:style-name}"/></bullet>
</xsl:otherwise>
</xsl:choose>
diff --git a/addons/base_report_designer/plugin/openerp_report_designer.zip b/addons/base_report_designer/static/base-report-designer-plugin/openerp_report_designer.zip
index 7d03f45dbb4..7d03f45dbb4 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer.zip
+++ b/addons/base_report_designer/static/base-report-designer-plugin/openerp_report_designer.zip
Binary files differ
diff --git a/addons/base_report_designer/wizard/base_report_designer_modify.py b/addons/base_report_designer/wizard/base_report_designer_modify.py
index 838f591a2f4..e8ed45e7ce1 100644
--- a/addons/base_report_designer/wizard/base_report_designer_modify.py
+++ b/addons/base_report_designer/wizard/base_report_designer_modify.py
@@ -54,7 +54,6 @@ class base_report_sxw(osv.osv_memory):
'target': 'new',
}
-base_report_sxw()
class base_report_file_sxw(osv.osv_memory):
"""Base Report File sxw """
@@ -116,7 +115,6 @@ class base_report_file_sxw(osv.osv_memory):
'type': 'ir.actions.act_window',
'target': 'new',
}
-base_report_file_sxw()
class base_report_rml_save(osv.osv_memory):
"""Base Report file Save"""
@@ -146,6 +144,5 @@ class base_report_rml_save(osv.osv_memory):
'file_rml':fields.binary('Save As'),
}
-base_report_rml_save()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_setup/i18n/nl_BE.po b/addons/base_setup/i18n/nl_BE.po
index f22fd2c8adc..518ada07a5c 100644
--- a/addons/base_setup/i18n/nl_BE.po
+++ b/addons/base_setup/i18n/nl_BE.po
@@ -7,19 +7,19 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2012-10-01 11:22+0000\n"
+"PO-Revision-Date: 2013-04-26 16:24+0000\n"
"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:12+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-27 05:44+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
#. module: base_setup
#: view:sale.config.settings:0
msgid "Emails Integration"
-msgstr ""
+msgstr "E-mailintegratie"
#. module: base_setup
#: selection:base.setup.terminology,partner:0
@@ -29,18 +29,19 @@ msgstr "Gast"
#. module: base_setup
#: view:sale.config.settings:0
msgid "Contacts"
-msgstr ""
+msgstr "Contactpersonen"
#. module: base_setup
#: model:ir.model,name:base_setup.model_base_config_settings
msgid "base.config.settings"
-msgstr ""
+msgstr "base.config.settings"
#. module: base_setup
#: field:base.config.settings,module_auth_oauth:0
msgid ""
"Use external authentication providers, sign in with google, facebook, ..."
msgstr ""
+"Gebruik externe verificatieproviders. Meld aan met Google, Facebook, ..."
#. module: base_setup
#: view:sale.config.settings:0
@@ -54,11 +55,19 @@ msgid ""
"OpenERP using specific\n"
" plugins for your preferred email application."
msgstr ""
+"OpenERP maakt het mogelijk om automatisch leads (of andere documenten)\n"
+" aan te maken op basis van inkomende e-mails. U "
+"kunt automatisch e-mails synchroniseren met OpenERP\n"
+" met behulp van reguliere POP / IMAP-accounts, "
+"via een direct e-mailintegratiescript voor uw\n"
+" e-mailserver, of door zelf uw e-mails naar "
+"OpenERP te sturen met behulp van specifieke\n"
+" plug-ins voor uw favoriete e-mailprogramma."
#. module: base_setup
#: field:sale.config.settings,module_sale:0
msgid "SALE"
-msgstr ""
+msgstr "VERKOOP"
#. module: base_setup
#: selection:base.setup.terminology,partner:0
@@ -68,24 +77,24 @@ msgstr "Lid"
#. module: base_setup
#: view:base.config.settings:0
msgid "Portal access"
-msgstr ""
+msgstr "Portaaltoegang"
#. module: base_setup
#: view:base.config.settings:0
msgid "Authentication"
-msgstr ""
+msgstr "Verificatie"
#. module: base_setup
#: view:sale.config.settings:0
msgid "Quotations and Sales Orders"
-msgstr ""
+msgstr "Offertes en verkooporders"
#. module: base_setup
#: view:base.config.settings:0
#: model:ir.actions.act_window,name:base_setup.action_general_configuration
#: model:ir.ui.menu,name:base_setup.menu_general_configuration
msgid "General Settings"
-msgstr ""
+msgstr "Algemeen"
#. module: base_setup
#: selection:base.setup.terminology,partner:0
@@ -95,12 +104,12 @@ msgstr "Donor"
#. module: base_setup
#: view:base.config.settings:0
msgid "Email"
-msgstr ""
+msgstr "E-mail"
#. module: base_setup
#: field:sale.config.settings,module_crm:0
msgid "CRM"
-msgstr ""
+msgstr "Relatiebeheer"
#. module: base_setup
#: selection:base.setup.terminology,partner:0
@@ -110,32 +119,32 @@ msgstr "Patiënt"
#. module: base_setup
#: field:base.config.settings,module_base_import:0
msgid "Allow users to import data from CSV files"
-msgstr ""
+msgstr "Gebruikers mogen gegevens importeren uit csv-bestanden"
#. module: base_setup
#: field:base.config.settings,module_multi_company:0
msgid "Manage multiple companies"
-msgstr ""
+msgstr "Meerdere bedrijven beheren"
#. module: base_setup
#: view:sale.config.settings:0
msgid "On Mail Client"
-msgstr ""
+msgstr "Op e-mailclient"
#. module: base_setup
#: view:base.config.settings:0
msgid "--db-filter=YOUR_DATABAE"
-msgstr ""
+msgstr "--db-filter=UW_DATABASE"
#. module: base_setup
#: field:sale.config.settings,module_web_linkedin:0
msgid "Get contacts automatically from linkedIn"
-msgstr ""
+msgstr "Haal contactpersonen op uit LinkedIn"
#. module: base_setup
#: field:sale.config.settings,module_plugin_thunderbird:0
msgid "Enable Thunderbird plug-in"
-msgstr ""
+msgstr "Activeer de Thunderbirdplug-in"
#. module: base_setup
#: view:base.setup.terminology:0
@@ -145,22 +154,22 @@ msgstr "res_config_contents"
#. module: base_setup
#: view:sale.config.settings:0
msgid "Customer Features"
-msgstr ""
+msgstr "Klantenopties"
#. module: base_setup
#: view:base.config.settings:0
msgid "Import / Export"
-msgstr ""
+msgstr "Import / Export"
#. module: base_setup
#: view:sale.config.settings:0
msgid "Sale Features"
-msgstr ""
+msgstr "Verkoopopties"
#. module: base_setup
#: field:sale.config.settings,module_plugin_outlook:0
msgid "Enable Outlook plug-in"
-msgstr ""
+msgstr "Activeer de Outlookplug-in"
#. module: base_setup
#: view:base.setup.terminology:0
@@ -179,7 +188,7 @@ msgstr "Huurder"
#. module: base_setup
#: help:base.config.settings,module_share:0
msgid "Share or embbed any screen of openerp."
-msgstr ""
+msgstr "Gelijk welk scherm van OpenERP delen of insluiten"
#. module: base_setup
#: selection:base.setup.terminology,partner:0
@@ -192,6 +201,8 @@ msgid ""
"When you create a new contact (person or company), you will be able to load "
"all the data from LinkedIn (photos, address, etc)."
msgstr ""
+"Als u een nieuwe contactpersoon maakt (persoon of bedrijf), kunt u alle "
+"gegevens van LinkedIn laden (foto, adres, enz.)"
#. module: base_setup
#: help:base.config.settings,module_multi_company:0
@@ -200,6 +211,9 @@ msgid ""
"companies.\n"
" This installs the module multi_company."
msgstr ""
+"Werken in omgevingen met meerdere bedrijven, met de nodige "
+"toegangsbeveiliging tussen de bedrijven.\n"
+" Hiermee installeert u de module multi_company."
#. module: base_setup
#: view:base.config.settings:0
@@ -208,6 +222,9 @@ msgid ""
"You can\n"
" launch the OpenERP Server with the option"
msgstr ""
+"Het openbare portaal is alleen toegankelijk als u zich in een enkele "
+"databasemodus bevindt. U kunt\n"
+" de OpenERP-server starten met de optie"
#. module: base_setup
#: view:base.config.settings:0
@@ -215,11 +232,13 @@ msgid ""
"You will find more options in your company details: address for the header "
"and footer, overdue payments texts, etc."
msgstr ""
+"U vindt meer opties bij de bedrijfsgegevens: adres voor de kop- en "
+"voettekst, teksten voor achterstallige betalingen, enz."
#. module: base_setup
#: model:ir.model,name:base_setup.model_sale_config_settings
msgid "sale.config.settings"
-msgstr ""
+msgstr "sale.config.settings"
#. module: base_setup
#: field:base.setup.terminology,partner:0
@@ -238,6 +257,12 @@ msgid ""
"projects,\n"
" etc."
msgstr ""
+"Wanneer u een document naar een klant stuurt,\n"
+" (offerte, factuur), kan uw klant\n"
+" aanmelden en zijn documenten bekijken,\n"
+" uw bedrijfsnieuws lezen, zijn projecten "
+"controleren,\n"
+" enz."
#. module: base_setup
#: model:ir.model,name:base_setup.model_base_setup_terminology
@@ -253,6 +278,8 @@ msgstr "Cliënt"
#: help:base.config.settings,module_portal_anonymous:0
msgid "Enable the public part of openerp, openerp becomes a public website."
msgstr ""
+"Activeer het openbare deel van OpenERP; OpenERP wordt hiermee een openbare "
+"website."
#. module: base_setup
#: help:sale.config.settings,module_plugin_thunderbird:0
@@ -265,6 +292,13 @@ msgid ""
" Partner from the selected emails.\n"
" This installs the module plugin_thunderbird."
msgstr ""
+"Met de plug-in kunt u e-mails met bijlagen koppelen aan de geselecteerde\n"
+" OpenERP-objecten. U kunt een relatie of een lead kiezen en\n"
+" de gekozen e-mail koppelen als een .eml-bestand als bijlage\n"
+" aan het geselecteerde record. U kunt documenten aanmaken "
+"voor CRM-lead\n"
+" en relaties vanuit de geselecteerde e-mails. Hiermee "
+"installeert u de module plugin_thunderbird."
#. module: base_setup
#: selection:base.setup.terminology,partner:0
@@ -280,7 +314,7 @@ msgstr "Gebruik een andere benaming voor Klant"
#: model:ir.actions.act_window,name:base_setup.action_sale_config
#: view:sale.config.settings:0
msgid "Configure Sales"
-msgstr ""
+msgstr "Verkoop instellen"
#. module: base_setup
#: help:sale.config.settings,module_plugin_outlook:0
@@ -293,16 +327,23 @@ msgid ""
" email into an OpenERP mail message with attachments.\n"
" This installs the module plugin_outlook."
msgstr ""
+"Met de Outlookplug-in kunt u een object selecteren dat u wilt toevoegen\n"
+" aan uw e-mail en de bijlagen van MS Outlook. U kunt een "
+"relatie \n"
+" of een lead kiezen en de geselecteerde e-mail archiveren in "
+"een\n"
+" OpenERP-mailbericht met bijlagen.\n"
+" Hiermee installeert u de module plugin_outlook."
#. module: base_setup
#: view:base.config.settings:0
msgid "Options"
-msgstr ""
+msgstr "Opties"
#. module: base_setup
#: field:base.config.settings,module_portal:0
msgid "Activate the customer portal"
-msgstr ""
+msgstr "Klantenportaal activeren"
#. module: base_setup
#: view:base.config.settings:0
@@ -311,36 +352,37 @@ msgid ""
" Once activated, the login page will be "
"replaced by the public website."
msgstr ""
+"Na activering zal de aanmeldpagina worden vervangen door de openbare website."
#. module: base_setup
#: field:base.config.settings,module_share:0
msgid "Allow documents sharing"
-msgstr ""
+msgstr "Sta het delen van documenten toe"
#. module: base_setup
#: view:base.config.settings:0
msgid "(company news, jobs, contact form, etc.)"
-msgstr ""
+msgstr "(bedrijfsnieuws, vacatures, contactformulier, enz.)"
#. module: base_setup
#: field:base.config.settings,module_portal_anonymous:0
msgid "Activate the public portal"
-msgstr ""
+msgstr "Openbare portaal activeren"
#. module: base_setup
#: view:base.config.settings:0
msgid "Configure outgoing email servers"
-msgstr ""
+msgstr "Uitgaande e-mailservers instellen"
#. module: base_setup
#: view:sale.config.settings:0
msgid "Social Network Integration"
-msgstr ""
+msgstr "Integratie sociale netwerken"
#. module: base_setup
#: help:base.config.settings,module_portal:0
msgid "Give your customers access to their documents."
-msgstr ""
+msgstr "Geef uw klanten toegang tot hun documenten."
#. module: base_setup
#: view:base.config.settings:0
@@ -352,7 +394,7 @@ msgstr "Afbreken"
#: view:base.config.settings:0
#: view:sale.config.settings:0
msgid "Apply"
-msgstr ""
+msgstr "Toepassen"
#. module: base_setup
#: view:base.setup.terminology:0
@@ -363,12 +405,12 @@ msgstr "Kies uw terminologie"
#: view:base.config.settings:0
#: view:sale.config.settings:0
msgid "or"
-msgstr ""
+msgstr "of"
#. module: base_setup
#: view:base.config.settings:0
msgid "Configure your company data"
-msgstr ""
+msgstr "Uw bedrijfsgegevens instellen"
#~ msgid "Logo"
#~ msgstr "Logo"
diff --git a/addons/base_status/i18n/cs.po b/addons/base_status/i18n/cs.po
new file mode 100644
index 00000000000..3fdb5247e7f
--- /dev/null
+++ b/addons/base_status/i18n/cs.po
@@ -0,0 +1,76 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-30 12:43+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-31 05:28+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:107
+#, python-format
+msgid "Error !"
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:166
+#, python-format
+msgid "%s has been <b>opened</b>."
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:199
+#, python-format
+msgid "%s has been <b>renewed</b>."
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_stage.py:210
+#, python-format
+msgid "Error!"
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:107
+#, python-format
+msgid ""
+"You can not escalate, you are already at the top level regarding your sales-"
+"team category."
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:193
+#, python-format
+msgid "%s is now <b>pending</b>."
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:187
+#, python-format
+msgid "%s has been <b>canceled</b>."
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_stage.py:210
+#, python-format
+msgid ""
+"You are already at the top level of your sales-team category.\n"
+"Therefore you cannot escalate furthermore."
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:181
+#, python-format
+msgid "%s has been <b>closed</b>."
+msgstr ""
diff --git a/addons/base_status/i18n/lt.po b/addons/base_status/i18n/lt.po
new file mode 100644
index 00000000000..cdaf9b0db37
--- /dev/null
+++ b/addons/base_status/i18n/lt.po
@@ -0,0 +1,76 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-29 15:17+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:107
+#, python-format
+msgid "Error !"
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:166
+#, python-format
+msgid "%s has been <b>opened</b>."
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:199
+#, python-format
+msgid "%s has been <b>renewed</b>."
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_stage.py:210
+#, python-format
+msgid "Error!"
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:107
+#, python-format
+msgid ""
+"You can not escalate, you are already at the top level regarding your sales-"
+"team category."
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:193
+#, python-format
+msgid "%s is now <b>pending</b>."
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:187
+#, python-format
+msgid "%s has been <b>canceled</b>."
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_stage.py:210
+#, python-format
+msgid ""
+"You are already at the top level of your sales-team category.\n"
+"Therefore you cannot escalate furthermore."
+msgstr ""
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:181
+#, python-format
+msgid "%s has been <b>closed</b>."
+msgstr ""
diff --git a/addons/base_status/i18n/nl_BE.po b/addons/base_status/i18n/nl_BE.po
new file mode 100644
index 00000000000..6a3c2d83fc7
--- /dev/null
+++ b/addons/base_status/i18n/nl_BE.po
@@ -0,0 +1,80 @@
+# Dutch (Belgium) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-15 16:40+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:107
+#, python-format
+msgid "Error !"
+msgstr "Fout"
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:166
+#, python-format
+msgid "%s has been <b>opened</b>."
+msgstr "%s is <b>geopend</b>."
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:199
+#, python-format
+msgid "%s has been <b>renewed</b>."
+msgstr "%s is <b>vernieuwd</b>."
+
+#. module: base_status
+#: code:addons/base_status/base_stage.py:210
+#, python-format
+msgid "Error!"
+msgstr "Fout"
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:107
+#, python-format
+msgid ""
+"You can not escalate, you are already at the top level regarding your sales-"
+"team category."
+msgstr ""
+"U kunt niet escaleren; u heeft het hoogste niveau in de verkoopteams al "
+"bereikt."
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:193
+#, python-format
+msgid "%s is now <b>pending</b>."
+msgstr "%s is <b>wachtend</b>."
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:187
+#, python-format
+msgid "%s has been <b>canceled</b>."
+msgstr "%s is <b>geannuleerd</b>."
+
+#. module: base_status
+#: code:addons/base_status/base_stage.py:210
+#, python-format
+msgid ""
+"You are already at the top level of your sales-team category.\n"
+"Therefore you cannot escalate furthermore."
+msgstr ""
+"U bent al op het hoogste niveau van uw verkoopteam.\n"
+"U kunt dus niet verder escaleren."
+
+#. module: base_status
+#: code:addons/base_status/base_state.py:181
+#, python-format
+msgid "%s has been <b>closed</b>."
+msgstr "%s is <b>gesloten</b>."
diff --git a/addons/base_vat/base_vat.py b/addons/base_vat/base_vat.py
index 616333e3b47..e7501334997 100644
--- a/addons/base_vat/base_vat.py
+++ b/addons/base_vat/base_vat.py
@@ -134,6 +134,9 @@ class res_partner(osv.osv):
'vat_subjected': fields.boolean('VAT Legal Statement', help="Check this box if the partner is subjected to the VAT. It will be used for the VAT legal statement.")
}
+ def _commercial_fields(self, cr, uid, context=None):
+ return super(res_partner, self)._commercial_fields(cr, uid, context=context) + ['vat_subjected']
+
def _construct_constraint_msg(self, cr, uid, ids, context=None):
def default_vat_check(cn, vn):
# by default, a VAT number is valid if:
@@ -243,6 +246,5 @@ class res_partner(osv.osv):
return False
return check == int(vat[8])
-res_partner()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_vat/i18n/nl_BE.po b/addons/base_vat/i18n/nl_BE.po
index 39966dc58ef..a2fe05c5705 100644
--- a/addons/base_vat/i18n/nl_BE.po
+++ b/addons/base_vat/i18n/nl_BE.po
@@ -7,19 +7,19 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2012-10-01 11:23+0000\n"
+"PO-Revision-Date: 2013-04-15 16:03+0000\n"
"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:10+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
#. module: base_vat
#: view:res.partner:0
msgid "Check Validity"
-msgstr ""
+msgstr "Geldigheid controleren"
#. module: base_vat
#: code:addons/base_vat/base_vat.py:147
@@ -45,7 +45,7 @@ msgstr "Bedrijven"
#: code:addons/base_vat/base_vat.py:111
#, python-format
msgid "Error!"
-msgstr ""
+msgstr "Fout"
#. module: base_vat
#: help:res.partner,vat_subjected:0
diff --git a/addons/board/static/src/js/dashboard.js b/addons/board/static/src/js/dashboard.js
index bd9625a4fa8..3489b686e1b 100644
--- a/addons/board/static/src/js/dashboard.js
+++ b/addons/board/static/src/js/dashboard.js
@@ -419,8 +419,10 @@ instance.board.AddToDashboard = instance.web.search.Input.extend({
instance.web.SearchView.include({
add_common_inputs: function() {
this._super();
- (new instance.board.AddToDashboard(this));
-
+ var vm = this.getParent().getParent();
+ if (vm.inner_action && vm.inner_action.views) {
+ (new instance.board.AddToDashboard(this));
+ }
}
});
diff --git a/addons/claim_from_delivery/i18n/nl_BE.po b/addons/claim_from_delivery/i18n/nl_BE.po
index a8793109b5f..38aab39e523 100644
--- a/addons/claim_from_delivery/i18n/nl_BE.po
+++ b/addons/claim_from_delivery/i18n/nl_BE.po
@@ -8,29 +8,29 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2012-10-01 11:24+0000\n"
+"PO-Revision-Date: 2013-04-15 16:38+0000\n"
"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:41+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
#. module: claim_from_delivery
#: view:stock.picking.out:0
msgid "Claims"
-msgstr ""
+msgstr "Klachten"
#. module: claim_from_delivery
#: model:res.request.link,name:claim_from_delivery.request_link_claim_from_delivery
msgid "Delivery Order"
-msgstr ""
+msgstr "Leveringsorder"
#. module: claim_from_delivery
#: model:ir.actions.act_window,name:claim_from_delivery.action_claim_from_delivery
msgid "Claim From Delivery"
-msgstr ""
+msgstr "Klachten van levering"
#~ msgid "Claim"
#~ msgstr "Klacht"
diff --git a/addons/contacts/i18n/lt.po b/addons/contacts/i18n/lt.po
new file mode 100644
index 00000000000..f785a308009
--- /dev/null
+++ b/addons/contacts/i18n/lt.po
@@ -0,0 +1,45 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-24 18:20+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-25 05:20+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: contacts
+#: model:ir.actions.act_window,help:contacts.action_contacts
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a contact in your address book.\n"
+" </p><p>\n"
+" OpenERP helps you easily track all activities related to\n"
+" a customer; discussions, history of business opportunities,\n"
+" documents, etc.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+"Spauskite, kad sukurtumėte kontaktą adresų knygoje.\n"
+"</p><p>\n"
+"OpenERP pagalba galima stebėti visus veiksmus susijusius su\n"
+"kontaktu; bendravimas, pardavimų galimybių istorija,\n"
+"dokumentai, ir t.t.\n"
+"</p>\n"
+" "
+
+#. module: contacts
+#: model:ir.actions.act_window,name:contacts.action_contacts
+#: model:ir.ui.menu,name:contacts.menu_contacts
+msgid "Contacts"
+msgstr "Kontaktai"
diff --git a/addons/contacts/i18n/nl_BE.po b/addons/contacts/i18n/nl_BE.po
new file mode 100644
index 00000000000..78fdb540ad6
--- /dev/null
+++ b/addons/contacts/i18n/nl_BE.po
@@ -0,0 +1,46 @@
+# Dutch (Belgium) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-15 16:01+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
+
+#. module: contacts
+#: model:ir.actions.act_window,help:contacts.action_contacts
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a contact in your address book.\n"
+" </p><p>\n"
+" OpenERP helps you easily track all activities related to\n"
+" a customer; discussions, history of business opportunities,\n"
+" documents, etc.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik hier om een contactpersoon toe te voegen aan het "
+"adresboek.\n"
+" </p><p>\n"
+" Met OpenERP kunt u eenvoudig alle activiteiten registreren met "
+"betrekking tot \n"
+" een klant, discussies, opportuniteiten, documenten, enz. \n"
+" </p>\n"
+" "
+
+#. module: contacts
+#: model:ir.actions.act_window,name:contacts.action_contacts
+#: model:ir.ui.menu,name:contacts.menu_contacts
+msgid "Contacts"
+msgstr "Contactpersonen"
diff --git a/addons/crm/__init__.py b/addons/crm/__init__.py
index d78fb09eae7..4e3a704d5f3 100644
--- a/addons/crm/__init__.py
+++ b/addons/crm/__init__.py
@@ -28,6 +28,7 @@ import report
import wizard
import res_partner
import res_config
+import base_partner_merge
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py
index 0dd075d48e6..8e17a882076 100644
--- a/addons/crm/__openerp__.py
+++ b/addons/crm/__openerp__.py
@@ -81,6 +81,8 @@ Dashboard for CRM will include:
'crm_lead_view.xml',
'crm_lead_menu.xml',
+ 'crm_case_section_view.xml',
+
'crm_meeting_menu.xml',
'crm_phonecall_view.xml',
@@ -95,6 +97,7 @@ Dashboard for CRM will include:
'board_crm_view.xml',
'res_config_view.xml',
+ 'base_partner_merge_view.xml',
],
'demo': [
'crm_demo.xml',
@@ -103,20 +106,37 @@ Dashboard for CRM will include:
'crm_action_rule_demo.xml',
],
'test': [
- 'test/process/communication_with_customer.yml',
- 'test/process/lead2opportunity2win.yml',
- 'test/process/lead2opportunity_assign_salesmen.yml',
- 'test/process/merge_opportunity.yml',
- 'test/process/cancel_lead.yml',
- 'test/process/segmentation.yml',
- 'test/process/phonecalls.yml',
- 'test/ui/crm_demo.yml',
- 'test/ui/duplicate_lead.yml',
- 'test/ui/delete_lead.yml',
+ 'test/crm_lead_message.yml',
+ 'test/lead2opportunity2win.yml',
+ 'test/lead2opportunity_assign_salesmen.yml',
+ 'test/crm_lead_merge.yml',
+ 'test/crm_lead_cancel.yml',
+ 'test/segmentation.yml',
+ 'test/phonecalls.yml',
+ 'test/crm_lead_onchange.yml',
+ 'test/crm_lead_copy.yml',
+ 'test/crm_lead_unlink.yml',
+ ],
+ 'css': [
+ 'static/src/css/crm.css'
+ ],
+ 'js': [
+ 'static/src/js/crm.js'
],
'installable': True,
'application': True,
'auto_install': False,
- 'images': ['images/crm_dashboard.png', 'images/customers.png','images/leads.png','images/opportunities_kanban.png','images/opportunities_form.png','images/opportunities_calendar.png','images/opportunities_graph.png','images/logged_calls.png','images/scheduled_calls.png','images/stages.png'],
+ 'images': [
+ 'images/crm_dashboard.png',
+ 'images/customers.png',
+ 'images/leads.png',
+ 'images/opportunities_kanban.png',
+ 'images/opportunities_form.png',
+ 'images/opportunities_calendar.png',
+ 'images/opportunities_graph.png',
+ 'images/logged_calls.png',
+ 'images/scheduled_calls.png',
+ 'images/stages.png',
+ ],
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/base_partner_merge.py b/addons/crm/base_partner_merge.py
new file mode 100644
index 00000000000..b2645e7fb79
--- /dev/null
+++ b/addons/crm/base_partner_merge.py
@@ -0,0 +1,760 @@
+#!/usr/bin/env python
+from __future__ import absolute_import
+from email.utils import parseaddr
+import functools
+import htmlentitydefs
+import itertools
+import logging
+import operator
+import re
+from ast import literal_eval
+from openerp.tools import mute_logger
+
+# Validation Library https://pypi.python.org/pypi/validate_email/1.1
+from .validate_email import validate_email
+
+from openerp.osv import osv, orm
+from openerp.osv import fields
+from openerp.osv.orm import browse_record
+from openerp.tools.translate import _
+
+pattern = re.compile("&(\w+?);")
+
+_logger = logging.getLogger('base.partner.merge')
+
+
+# http://www.php2python.com/wiki/function.html-entity-decode/
+def html_entity_decode_char(m, defs=htmlentitydefs.entitydefs):
+ try:
+ return defs[m.group(1)]
+ except KeyError:
+ return m.group(0)
+
+
+def html_entity_decode(string):
+ return pattern.sub(html_entity_decode_char, string)
+
+
+def sanitize_email(email):
+ assert isinstance(email, basestring) and email
+
+ result = re.subn(r';|/|:', ',',
+ html_entity_decode(email or ''))[0].split(',')
+
+ emails = [parseaddr(email)[1]
+ for item in result
+ for email in item.split()]
+
+ return [email.lower()
+ for email in emails
+ if validate_email(email)]
+
+
+def is_integer_list(ids):
+ return all(isinstance(i, (int, long)) for i in ids)
+
+
+class ResPartner(osv.Model):
+ _inherit = 'res.partner'
+
+ _columns = {
+ 'id': fields.integer('Id', readonly=True),
+ 'create_date': fields.datetime('Create Date', readonly=True),
+ }
+
+class MergePartnerLine(osv.TransientModel):
+ _name = 'base.partner.merge.line'
+
+ _columns = {
+ 'wizard_id': fields.many2one('base.partner.merge.automatic.wizard',
+ 'Wizard'),
+ 'min_id': fields.integer('MinID'),
+ 'aggr_ids': fields.char('Ids', required=True),
+ }
+
+ _order = 'min_id asc'
+
+
+class MergePartnerAutomatic(osv.TransientModel):
+ """
+ The idea behind this wizard is to create a list of potential partners to
+ merge. We use two objects, the first one is the wizard for the end-user.
+ And the second will contain the partner list to merge.
+ """
+ _name = 'base.partner.merge.automatic.wizard'
+
+ _columns = {
+ # Group by
+ 'group_by_email': fields.boolean('Email'),
+ 'group_by_name': fields.boolean('Name'),
+ 'group_by_is_company': fields.boolean('Is Company'),
+ 'group_by_vat': fields.boolean('VAT'),
+ 'group_by_parent_id': fields.boolean('Parent Company'),
+
+ 'state': fields.selection([('option', 'Option'),
+ ('selection', 'Selection'),
+ ('finished', 'Finished')],
+ 'State',
+ readonly=True,
+ required=True),
+ 'number_group': fields.integer("Group of Contacts", readonly=True),
+ 'current_line_id': fields.many2one('base.partner.merge.line', 'Current Line'),
+ 'line_ids': fields.one2many('base.partner.merge.line', 'wizard_id', 'Lines'),
+ 'partner_ids': fields.many2many('res.partner', string='Contacts'),
+
+ 'exclude_contact': fields.boolean('A user associated to the contact'),
+ 'exclude_journal_item': fields.boolean('Journal Items associated to the contact'),
+ 'maximum_group': fields.integer("Maximum of Group of Contacts"),
+ }
+
+ _defaults = {
+ 'state': 'option',
+ }
+
+ def get_fk_on(self, cr, table):
+ q = """ SELECT cl1.relname as table,
+ att1.attname as column
+ FROM pg_constraint as con, pg_class as cl1, pg_class as cl2,
+ pg_attribute as att1, pg_attribute as att2
+ WHERE con.conrelid = cl1.oid
+ AND con.confrelid = cl2.oid
+ AND array_lower(con.conkey, 1) = 1
+ AND con.conkey[1] = att1.attnum
+ AND att1.attrelid = cl1.oid
+ AND cl2.relname = %s
+ AND att2.attname = 'id'
+ AND array_lower(con.confkey, 1) = 1
+ AND con.confkey[1] = att2.attnum
+ AND att2.attrelid = cl2.oid
+ AND con.contype = 'f'
+ """
+ return cr.execute(q, (table,))
+
+ def _update_foreign_keys(self, cr, uid, src_partners, dst_partner, context=None):
+ _logger.debug('_update_foreign_keys for dst_partner: %s for src_partners: %r', dst_partner.id, list(map(operator.attrgetter('id'), src_partners)))
+
+ # find the many2one relation to a partner
+ proxy = self.pool.get('res.partner')
+ self.get_fk_on(cr, 'res_partner')
+
+ # ignore two tables
+
+ for table, column in cr.fetchall():
+ if 'base_partner_merge_' in table:
+ continue
+ partner_ids = tuple(map(int, src_partners))
+
+ query = "SELECT column_name FROM information_schema.columns WHERE table_name LIKE '%s'" % (table)
+ cr.execute(query, ())
+ columns = []
+ for data in cr.fetchall():
+ if data[0] != column:
+ columns.append(data[0])
+
+ query_dic = {
+ 'table': table,
+ 'column': column,
+ 'value': columns[0],
+ }
+ if len(columns) <= 1:
+ # unique key treated
+ query = """
+ UPDATE "%(table)s" as ___tu
+ SET %(column)s = %%s
+ WHERE
+ %(column)s = %%s AND
+ NOT EXISTS (
+ SELECT 1
+ FROM "%(table)s" as ___tw
+ WHERE
+ %(column)s = %%s AND
+ ___tu.%(value)s = ___tw.%(value)s
+ )""" % query_dic
+ for partner_id in partner_ids:
+ cr.execute(query, (dst_partner.id, partner_id, dst_partner.id))
+ else:
+ cr.execute("SAVEPOINT recursive_partner_savepoint")
+ try:
+ query = 'UPDATE "%(table)s" SET %(column)s = %%s WHERE %(column)s IN %%s' % query_dic
+ cr.execute(query, (dst_partner.id, partner_ids,))
+
+ if column == proxy._parent_name and table == 'res_partner':
+ query = """
+ WITH RECURSIVE cycle(id, parent_id) AS (
+ SELECT id, parent_id FROM res_partner
+ UNION
+ SELECT cycle.id, res_partner.parent_id
+ FROM res_partner, cycle
+ WHERE res_partner.id = cycle.parent_id AND
+ cycle.id != cycle.parent_id
+ )
+ SELECT id FROM cycle WHERE id = parent_id AND id = %s
+ """
+ cr.execute(query, (dst_partner.id,))
+ if cr.fetchall():
+ cr.execute("ROLLBACK TO SAVEPOINT recursive_partner_savepoint")
+ finally:
+ cr.execute("RELEASE SAVEPOINT recursive_partner_savepoint")
+
+ def _update_reference_fields(self, cr, uid, src_partners, dst_partner, context=None):
+ _logger.debug('_update_reference_fields for dst_partner: %s for src_partners: %r', dst_partner.id, list(map(operator.attrgetter('id'), src_partners)))
+
+ def update_records(model, src, field_model='model', field_id='res_id', context=None):
+ proxy = self.pool.get(model)
+ if proxy is None:
+ return
+ domain = [(field_model, '=', 'res.partner'), (field_id, '=', src.id)]
+ ids = proxy.search(cr, uid, domain, context=context)
+ return proxy.write(cr, uid, ids, {field_id: dst_partner.id}, context=context)
+
+ update_records = functools.partial(update_records, context=context)
+
+ for partner in src_partners:
+ update_records('base.calendar', src=partner, field_model='model_id.model')
+ update_records('ir.attachment', src=partner, field_model='res_model')
+ update_records('mail.followers', src=partner, field_model='res_model')
+ update_records('mail.message', src=partner)
+ update_records('marketing.campaign.workitem', src=partner, field_model='object_id.model')
+ update_records('ir.model.data', src=partner)
+
+ proxy = self.pool['ir.model.fields']
+ domain = [('ttype', '=', 'reference')]
+ record_ids = proxy.search(cr, uid, domain, context=context)
+
+ for record in proxy.browse(cr, uid, record_ids, context=context):
+ proxy_model = self.pool[record.model]
+
+ field_type = proxy_model._columns.get(record.name).__class__._type
+
+ if field_type == 'function':
+ continue
+
+ for partner in src_partners:
+ domain = [
+ (record.name, '=', 'res.partner,%d' % partner.id)
+ ]
+ model_ids = proxy_model.search(cr, uid, domain, context=context)
+ values = {
+ record.name: 'res.partner,%d' % dst_partner.id,
+ }
+ proxy_model.write(cr, uid, model_ids, values, context=context)
+
+ def _update_values(self, cr, uid, src_partners, dst_partner, context=None):
+ _logger.debug('_update_values for dst_partner: %s for src_partners: %r', dst_partner.id, list(map(operator.attrgetter('id'), src_partners)))
+
+ columns = dst_partner._columns
+ def write_serializer(column, item):
+ if isinstance(item, browse_record):
+ return item.id
+ else:
+ return item
+
+ values = dict()
+ for column, field in columns.iteritems():
+ if field._type not in ('many2many', 'one2many', 'function'):
+ for item in itertools.chain(src_partners, [dst_partner]):
+ if item[column]:
+ values[column] = write_serializer(column, item[column])
+
+ values.pop('id', None)
+ parent_id = values.pop('parent_id', None)
+ dst_partner.write(values)
+ if parent_id and parent_id != dst_partner.id:
+ try:
+ dst_partner.write({'parent_id': parent_id})
+ except (osv.except_osv, orm.except_orm):
+ _logger.info('Skip recursive partner hierarchies for parent_id %s of partner: %s', parent_id, dst_partner.id)
+
+ @mute_logger('openerp.osv.expression', 'openerp.osv.orm')
+ def _merge(self, cr, uid, partner_ids, context=None):
+ proxy = self.pool.get('res.partner')
+
+ partner_ids = proxy.exists(cr, uid, list(partner_ids), context=context)
+ if len(partner_ids) < 2:
+ return
+
+ partners = proxy.browse(cr, uid, list(partner_ids), context=context)
+ ordered_partners = sorted(sorted(partners,
+ key=operator.attrgetter('create_date'), reverse=True),
+ key=operator.attrgetter('active'), reverse=True)
+
+ dst_partner = ordered_partners[-1]
+ src_partners = ordered_partners[:-1]
+ _logger.info("dst_partner: %s", dst_partner.id)
+
+ call_it = lambda function: function(cr, uid, src_partners, dst_partner,
+ context=context)
+
+ call_it(self._update_foreign_keys)
+ call_it(self._update_reference_fields)
+ call_it(self._update_values)
+
+ _logger.info("---merged---")
+
+ for partner in src_partners:
+ partner.unlink()
+
+
+ def clean_emails(self, cr, uid, context=None):
+ """
+ Clean the email address of the partner, if there is an email field with
+ a mimum of two addresses, the system will create a new partner, with the
+ information of the previous one and will copy the new cleaned email into
+ the email field.
+ """
+ if context is None:
+ context = {}
+
+ proxy_model = self.pool['ir.model.fields']
+ field_ids = proxy_model.search(cr, uid, [('model', '=', 'res.partner'),
+ ('ttype', 'like', '%2many')],
+ context=context)
+ fields = proxy_model.read(cr, uid, field_ids, context=context)
+ reset_fields = dict((field['name'], []) for field in fields)
+
+ proxy_partner = self.pool['res.partner']
+ context['active_test'] = False
+ ids = proxy_partner.search(cr, uid, [], context=context)
+
+ fields = ['name', 'var' 'partner_id' 'is_company', 'email']
+ partners = proxy_partner.read(cr, uid, ids, fields, context=context)
+
+ partners.sort(key=operator.itemgetter('id'))
+ partners_len = len(partners)
+
+ _logger.info('partner_len: %r', partners_len)
+
+ for idx, partner in enumerate(partners):
+ if not partner['email']:
+ continue
+
+ percent = (idx / float(partners_len)) * 100.0
+ _logger.info('idx: %r', idx)
+ _logger.info('percent: %r', percent)
+ try:
+ emails = sanitize_email(partner['email'])
+ head, tail = emails[:1], emails[1:]
+ email = head[0] if head else False
+
+ proxy_partner.write(cr, uid, [partner['id']],
+ {'email': email}, context=context)
+
+ for email in tail:
+ values = dict(reset_fields, email=email)
+ proxy_partner.copy(cr, uid, partner['id'], values,
+ context=context)
+
+ except Exception:
+ _logger.exception("There is a problem with this partner: %r", partner)
+ raise
+ return True
+
+ def close_cb(self, cr, uid, ids, context=None):
+ return {'type': 'ir.actions.act_window_close'}
+
+ def _generate_query(self, fields, maximum_group=100):
+ group_fields = ', '.join(fields)
+
+ filters = []
+ for field in fields:
+ if field in ['email', 'name']:
+ filters.append((field, 'IS NOT', 'NULL'))
+
+ criteria = ' AND '.join('%s %s %s' % (field, operator, value)
+ for field, operator, value in filters)
+
+ text = [
+ "SELECT min(id), array_agg(id)",
+ "FROM res_partner",
+ ]
+
+ if criteria:
+ text.append('WHERE %s' % criteria)
+
+ text.extend([
+ "GROUP BY %s" % group_fields,
+ "HAVING COUNT(*) >= 2",
+ "ORDER BY min(id)",
+ ])
+
+ if maximum_group:
+ text.extend([
+ "LIMIT %s" % maximum_group,
+ ])
+
+ return ' '.join(text)
+
+ def _compute_selected_groupby(self, this):
+ group_by_str = 'group_by_'
+ group_by_len = len(group_by_str)
+
+ fields = [
+ key[group_by_len:]
+ for key in self._columns.keys()
+ if key.startswith(group_by_str)
+ ]
+
+ groups = [
+ field
+ for field in fields
+ if getattr(this, '%s%s' % (group_by_str, field), False)
+ ]
+
+ if not groups:
+ raise osv.except_osv(_('Error'),
+ _("You have to specify a filter for your selection"))
+
+ return groups
+
+ def next_cb(self, cr, uid, ids, context=None):
+ """
+ Don't compute any thing
+ """
+ context = dict(context or {}, active_test=False)
+ this = self.browse(cr, uid, ids[0], context=context)
+ if this.current_line_id:
+ this.current_line_id.unlink()
+ return self._next_screen(this)
+
+ def _next_screen(self, this):
+ this.refresh()
+ values = {}
+ if this.line_ids:
+ # in this case, we try to find the next record.
+ current_line = this.line_ids[0]
+ current_partner_ids = literal_eval(current_line.aggr_ids)
+ values.update({
+ 'current_line_id': current_line.id,
+ 'partner_ids': [(6, 0, current_partner_ids)],
+ 'state': 'selection',
+ })
+ else:
+ values.update({
+ 'current_line_id': False,
+ 'partner_ids': [],
+ 'state': 'finished',
+ })
+
+ this.write(values)
+
+ return {
+ 'type': 'ir.actions.act_window',
+ 'res_model': this._name,
+ 'res_id': this.id,
+ 'view_mode': 'form',
+ 'target': 'new',
+ }
+
+ def _model_is_installed(self, cr, uid, model, context=None):
+ proxy = self.pool.get('ir.model')
+ domain = [('model', '=', model)]
+ return proxy.search_count(cr, uid, domain, context=context) > 0
+
+ def _partner_use_in(self, cr, uid, aggr_ids, models, context=None):
+ """
+ Check if there is no occurence of this group of partner in the selected
+ model
+ """
+ for model, field in models.iteritems():
+ proxy = self.pool.get(model)
+ domain = [(field, 'in', aggr_ids)]
+ if proxy.search_count(cr, uid, domain, context=context):
+ return True
+ return False
+
+ def compute_models(self, cr, uid, ids, context=None):
+ """
+ Compute the different models needed by the system if you want to exclude
+ some partners.
+ """
+ assert is_integer_list(ids)
+
+ this = self.browse(cr, uid, ids[0], context=context)
+
+ models = {}
+ if this.exclude_contact:
+ models['res.users'] = 'partner_id'
+
+ if self._model_is_installed(cr, uid, 'account.move.line', context=context) and this.exclude_journal_item:
+ models['account.move.line'] = 'partner_id'
+
+ return models
+
+ def _process_query(self, cr, uid, ids, query, context=None):
+ """
+ Execute the select request and write the result in this wizard
+ """
+ proxy = self.pool.get('base.partner.merge.line')
+ this = self.browse(cr, uid, ids[0], context=context)
+ models = self.compute_models(cr, uid, ids, context=context)
+ cr.execute(query)
+
+ counter = 0
+ for min_id, aggr_ids in cr.fetchall():
+ if models and self._partner_use_in(cr, uid, aggr_ids, models, context=context):
+ continue
+ values = {
+ 'wizard_id': this.id,
+ 'min_id': min_id,
+ 'aggr_ids': aggr_ids,
+ }
+
+ proxy.create(cr, uid, values, context=context)
+ counter += 1
+
+ values = {
+ 'state': 'selection',
+ 'number_group': counter,
+ }
+
+ this.write(values)
+
+ _logger.info("counter: %s", counter)
+
+ def start_process_cb(self, cr, uid, ids, context=None):
+ """
+ Start the process.
+ * Compute the selected groups (with duplication)
+ * If the user has selected the 'exclude_XXX' fields, avoid the partners.
+ """
+ assert is_integer_list(ids)
+
+ context = dict(context or {}, active_test=False)
+ this = self.browse(cr, uid, ids[0], context=context)
+ groups = self._compute_selected_groupby(this)
+ query = self._generate_query(groups, this.maximum_group)
+ self._process_query(cr, uid, ids, query, context=context)
+
+ return self._next_screen(this)
+
+ def automatic_process_cb(self, cr, uid, ids, context=None):
+ assert is_integer_list(ids)
+ this = self.browse(cr, uid, ids[0], context=context)
+ this.start_process_cb()
+ this.refresh()
+
+ for line in this.line_ids:
+ partner_ids = literal_eval(line.aggr_ids)
+ self._merge(cr, uid, partner_ids, context=context)
+ line.unlink()
+ cr.commit()
+
+ this.write({'state': 'finished'})
+ return {
+ 'type': 'ir.actions.act_window',
+ 'res_model': this._name,
+ 'res_id': this.id,
+ 'view_mode': 'form',
+ 'target': 'new',
+ }
+
+ def parent_migration_process_cb(self, cr, uid, ids, context=None):
+ assert is_integer_list(ids)
+
+ context = dict(context or {}, active_test=False)
+ this = self.browse(cr, uid, ids[0], context=context)
+
+ query = """
+ SELECT
+ min(p1.id),
+ array_agg(DISTINCT p1.id)
+ FROM
+ res_partner as p1
+ INNER join
+ res_partner as p2
+ ON
+ p1.email = p2.email AND
+ p1.name = p2.name AND
+ (p1.parent_id = p2.id OR p1.id = p2.parent_id)
+ WHERE
+ p2.id IS NOT NULL
+ GROUP BY
+ p1.email,
+ p1.name,
+ CASE WHEN p1.parent_id = p2.id THEN p2.id
+ ELSE p1.id
+ END
+ HAVING COUNT(*) >= 2
+ ORDER BY
+ min(p1.id)
+ """
+
+ self._process_query(cr, uid, ids, query, context=context)
+
+ for line in this.line_ids:
+ partner_ids = literal_eval(line.aggr_ids)
+ self._merge(cr, uid, partner_ids, context=context)
+ line.unlink()
+ cr.commit()
+
+ this.write({'state': 'finished'})
+
+ cr.execute("""
+ UPDATE
+ res_partner
+ SET
+ is_company = NULL,
+ parent_id = NULL
+ WHERE
+ parent_id = id
+ """)
+
+ return {
+ 'type': 'ir.actions.act_window',
+ 'res_model': this._name,
+ 'res_id': this.id,
+ 'view_mode': 'form',
+ 'target': 'new',
+ }
+
+ def update_all_process_cb(self, cr, uid, ids, context=None):
+ assert is_integer_list(ids)
+
+ # WITH RECURSIVE cycle(id, parent_id) AS (
+ # SELECT id, parent_id FROM res_partner
+ # UNION
+ # SELECT cycle.id, res_partner.parent_id
+ # FROM res_partner, cycle
+ # WHERE res_partner.id = cycle.parent_id AND
+ # cycle.id != cycle.parent_id
+ # )
+ # UPDATE res_partner
+ # SET parent_id = NULL
+ # WHERE id in (SELECT id FROM cycle WHERE id = parent_id);
+
+ this = self.browse(cr, uid, ids[0], context=context)
+
+ self.parent_migration_process_cb(cr, uid, ids, context=None)
+
+ list_merge = [
+ {'group_by_vat': True, 'group_by_email': True, 'group_by_name': True},
+ # {'group_by_name': True, 'group_by_is_company': True, 'group_by_parent_id': True},
+ # {'group_by_email': True, 'group_by_is_company': True, 'group_by_parent_id': True},
+ # {'group_by_name': True, 'group_by_vat': True, 'group_by_is_company': True, 'exclude_journal_item': True},
+ # {'group_by_email': True, 'group_by_vat': True, 'group_by_is_company': True, 'exclude_journal_item': True},
+ # {'group_by_email': True, 'group_by_is_company': True, 'exclude_contact': True, 'exclude_journal_item': True},
+ # {'group_by_name': True, 'group_by_is_company': True, 'exclude_contact': True, 'exclude_journal_item': True}
+ ]
+
+ for merge_value in list_merge:
+ id = self.create(cr, uid, merge_value, context=context)
+ self.automatic_process_cb(cr, uid, [id], context=context)
+
+ cr.execute("""
+ UPDATE
+ res_partner
+ SET
+ is_company = NULL
+ WHERE
+ parent_id IS NOT NULL AND
+ is_company IS NOT NULL
+ """)
+
+ # cr.execute("""
+ # UPDATE
+ # res_partner as p1
+ # SET
+ # is_company = NULL,
+ # parent_id = (
+ # SELECT p2.id
+ # FROM res_partner as p2
+ # WHERE p2.email = p1.email AND
+ # p2.parent_id != p2.id
+ # LIMIT 1
+ # )
+ # WHERE
+ # p1.parent_id = p1.id
+ # """)
+
+ return self._next_screen(this)
+
+ def merge_cb(self, cr, uid, ids, context=None):
+ assert is_integer_list(ids)
+
+ context = dict(context or {}, active_test=False)
+ this = self.browse(cr, uid, ids[0], context=context)
+
+ partner_ids = set(map(int, this.partner_ids))
+ if not partner_ids:
+ this.write({'state': 'finished'})
+ return {
+ 'type': 'ir.actions.act_window',
+ 'res_model': this._name,
+ 'res_id': this.id,
+ 'view_mode': 'form',
+ 'target': 'new',
+ }
+
+ self._merge(cr, uid, partner_ids, context=context)
+
+ this.current_line_id.unlink()
+
+ return self._next_screen(this)
+
+ def merge_multi(self, cr, uid, ids, context=None):
+
+ active_model = context.get('active_model')
+ if active_model != 'res.partner':
+ raise osv.except_osv(
+ _('Error'),
+ _('This wizard can only used with the Partners')
+ )
+
+ partner_ids = context.get('active_ids', [])
+
+ MINIMAL_NUMBER = 2
+ if len(partner_ids) < MINIMAL_NUMBER:
+ raise osv.except_osv(
+ _('Error'),
+ _("You can't use this wizard with only one Partner")
+ )
+
+ self._merge(cr, uid, partner_ids, context=context)
+
+ return True
+
+ def auto_set_parent_id(self, cr, uid, ids, context=None):
+ assert is_integer_list(ids)
+
+ # select partner who have one least invoice
+ partner_treated = ['@gmail.com']
+ cr.execute(""" SELECT p.id, p.email
+ FROM res_partner as p
+ LEFT JOIN account_invoice as a
+ ON p.id = a.partner_id AND a.state in ('open','paid')
+ WHERE p.grade_id is NOT NULL
+ GROUP BY p.id
+ ORDER BY COUNT(a.id) DESC
+ """)
+ re_email = re.compile(r".*@")
+ for id, email in cr.fetchall():
+ # check email domain
+ email = re_email.sub("@", email or "")
+ if not email or email in partner_treated:
+ continue
+ partner_treated.append(email)
+
+ # don't update the partners if they are more of one who have invoice
+ cr.execute(""" SELECT *
+ FROM res_partner as p
+ WHERE p.id != %s AND p.email LIKE '%%%s' AND
+ EXISTS (SELECT * FROM account_invoice as a WHERE p.id = a.partner_id AND a.state in ('open','paid'))
+ """ % (id, email))
+
+ if len(cr.fetchall()) > 1:
+ _logger.info("%s MORE OF ONE COMPANY", email)
+ continue
+
+ # to display changed values
+ cr.execute(""" SELECT id,email
+ FROM res_partner
+ WHERE parent_id != %s AND id != %s AND email LIKE '%%%s'
+ """ % (id, id, email))
+ _logger.info("%r", cr.fetchall())
+
+ # upgrade
+ cr.execute(""" UPDATE res_partner
+ SET parent_id = %s
+ WHERE id != %s AND email LIKE '%%%s'
+ """ % (id, id, email))
+ return False
diff --git a/addons/crm/base_partner_merge_view.xml b/addons/crm/base_partner_merge_view.xml
new file mode 100644
index 00000000000..74e7a72d7a8
--- /dev/null
+++ b/addons/crm/base_partner_merge_view.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+ <data>
+ <!-- the sequence of the configuration sub menu is 30 -->
+ <menuitem id='root_menu' name='Tools' parent='base.menu_base_partner' sequence="25"/>
+
+ <record model="ir.actions.act_window" id="base_partner_merge_automatic_act">
+ <field name="name">Deduplicate Contacts</field>
+ <field name="res_model">base.partner.merge.automatic.wizard</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">form</field>
+ <field name="target">new</field>
+ <field name="context">{'active_test': False}</field>
+ </record>
+
+ <menuitem id='partner_merge_automatic_menu'
+ action='base_partner_merge_automatic_act'
+ groups='base.group_system'
+ parent='root_menu' />
+
+ <record model='ir.ui.view' id='base_partner_merge_automatic_wizard_form'>
+ <field name='name'>base.partner.merge.automatic.wizard.form</field>
+ <field name='model'>base.partner.merge.automatic.wizard</field>
+ <field name='arch' type='xml'>
+ <form string='Automatic Merge Wizard' version='7.0'>
+ <header>
+ <button name='merge_cb' string='Merge Selection'
+ class='oe_highlight'
+ type='object'
+ attrs="{'invisible': [('state', 'in', ('option', 'finished' ))]}"
+ />
+ <button name='next_cb' string='Skip these contacts'
+ type='object' class='oe_link'
+ attrs="{'invisible': [('state', '!=', 'selection')]}" />
+ <button name='start_process_cb'
+ string='Merge with Manual Check'
+ type='object' class='oe_highlight'
+ attrs="{'invisible': [('state', '!=', 'option')]}" />
+ <button name='automatic_process_cb'
+ string='Merge Automatically'
+ type='object' class='oe_highlight'
+ confirm="Are you sure to execute the automatic merge of your contacts ?"
+ attrs="{'invisible': [('state', '!=', 'option')]}" />
+ <button name='update_all_process_cb'
+ string='Merge Automatically all process'
+ type='object'
+ confirm="Are you sure to execute the list of automatic merges of your contacts ?"
+ attrs="{'invisible': [('state', '!=', 'option')]}" />
+ <span class="or_cancel" attrs="{'invisible': [('state', '=', 'finished')]} ">or
+ <button name="close_cb" special="nosave" string="Cancel" type="object" class="oe_link oe_inline"/>
+ </span>
+ <span class="or_cancel" attrs="{'invisible': [('state', '!=', 'finished')]} ">
+ <button name="close_cb" special="nosave"
+ string="Close"
+ type="object"
+ class="oe_link oe_inline"/>
+ </span>
+ </header>
+ <sheet>
+ <group attrs="{'invisible': [('state', '!=', 'finished')]}" col="1">
+ <h2>There is no more contacts to merge for this request...</h2>
+ <button name="%(base_partner_merge_automatic_act)d" string="Deduplicate the other Contacts" class="oe_highlight"
+ type="action"/>
+ </group>
+ <p class="oe_grey" attrs="{'invisible': [('state', '!=', ('option'))]}">
+ Select the list of fields used to search for
+ duplicated records. If you select several fields,
+ OpenERP will propose you to merge only those having
+ all these fields in common. (not one of the fields).
+ </p>
+ <group attrs="{'invisible': [('state', 'not in', ('selection', 'finished'))]}">
+ <field name="state" invisible="1" />
+ <field name="number_group" invisible="0" />
+ </group>
+ <group string="Search duplicates based on duplicated data in"
+ attrs="{'invisible': [('state', 'not in', ('option',))]}">
+ <field name='group_by_email' />
+ <field name='group_by_name' />
+ <field name='group_by_is_company' />
+ <field name='group_by_vat' />
+ <field name='group_by_parent_id' />
+ </group>
+ <group string="Exclude contacts having"
+ attrs="{'invisible': [('state', 'not in', ('option',))]}">
+ <field name='exclude_contact' />
+ <field name='exclude_journal_item' />
+ </group>
+ <separator string="Options" attrs="{'invisible': [('state', 'not in', ('option',))]}"/>
+ <group attrs="{'invisible': [('state', 'not in', ('option','finished'))]}">
+ <field name='maximum_group' attrs="{'readonly': [('state', 'in', ('finished'))]}"/>
+ </group>
+ <separator string="Merge the following contacts"
+ attrs="{'invisible': [('state', 'in', ('option', 'finished'))]}"/>
+ <group attrs="{'invisible': [('state', 'in', ('option', 'finished'))]}" col="1">
+ <p class="oe_grey">
+ The selected contacts will be merged together. All
+ documents linking to one of these contacts will be
+ redirected to the aggregated contact. You can remove
+ contacts from this list to avoid merging them.
+ </p>
+ <field name="partner_ids" nolabel="1">
+ <tree string="Partners">
+ <field name="id" />
+ <field name="name" />
+ <field name="email" />
+ <field name="is_company" />
+ <field name="vat" />
+ <field name="country_id" />
+ <field name="parent_id" />
+ </tree>
+ </field>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record model="ir.actions.server"
+ id="ir_actions_server_merge_automatic">
+ <field name="code">pool.get('base.partner.merge.automatic.wizard').merge_multi(cr, uid, None, context)</field>
+ <field name="condition">True</field>
+ <field name="model_id" ref="base.model_res_partner" />
+ <field name="name">Automatic Merge</field>
+ <field name="sequence" eval="5" />
+ <field name="state">code</field>
+ <field name="type">ir.actions.server</field>
+ </record>
+
+ <record model="ir.values" id="ir_open_merge_automatic">
+ <field name="key2" eval="'client_action_multi'" />
+ <field name="model">res.partner</field>
+ <field name="name">Automatic Merge</field>
+ <field name="value" eval="'ir.actions.server,%d' % ir_actions_server_merge_automatic" />
+ </record>
+
+ </data>
+
+</openerp>
diff --git a/addons/crm/crm.py b/addons/crm/crm.py
index df6d5e12b66..7b6fe02afa8 100644
--- a/addons/crm/crm.py
+++ b/addons/crm/crm.py
@@ -98,6 +98,7 @@ class crm_case_stage(osv.osv):
'case_default': True,
}
+
class crm_case_section(osv.osv):
""" Model for sales teams. """
_name = "crm.case.section"
@@ -107,7 +108,7 @@ class crm_case_section(osv.osv):
_order = "complete_name"
def get_full_name(self, cr, uid, ids, field_name, arg, context=None):
- return dict(self.name_get(cr, uid, ids, context=context))
+ return dict(self.name_get(cr, uid, ids, context=context))
_columns = {
'name': fields.char('Sales Team', size=64, required=True, translate=True),
@@ -117,27 +118,36 @@ class crm_case_section(osv.osv):
"true, it will allow you to hide the sales team without removing it."),
'change_responsible': fields.boolean('Reassign Escalated', help="When escalating to this team override the salesman with the team leader."),
'user_id': fields.many2one('res.users', 'Team Leader'),
- 'member_ids':fields.many2many('res.users', 'sale_member_rel', 'section_id', 'member_id', 'Team Members'),
+ 'member_ids': fields.many2many('res.users', 'sale_member_rel', 'section_id', 'member_id', 'Team Members'),
'reply_to': fields.char('Reply-To', size=64, help="The email address put in the 'Reply-To' of all emails sent by OpenERP about cases in this sales team"),
'parent_id': fields.many2one('crm.case.section', 'Parent Team'),
'child_ids': fields.one2many('crm.case.section', 'parent_id', 'Child Teams'),
'resource_calendar_id': fields.many2one('resource.calendar', "Working Time", help="Used to compute open days"),
'note': fields.text('Description'),
- 'working_hours': fields.float('Working Hours', digits=(16,2 )),
+ 'working_hours': fields.float('Working Hours', digits=(16, 2)),
'stage_ids': fields.many2many('crm.case.stage', 'section_stage_rel', 'section_id', 'stage_id', 'Stages'),
'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="cascade", required=True,
help="The email address associated with this team. New emails received will automatically "
"create new leads assigned to the team."),
+ 'open_lead_ids': fields.one2many('crm.lead', 'section_id',
+ string='Open Leads', readonly=True,
+ domain=['&', ('type', '!=', 'opportunity'), ('state', 'not in', ['done', 'cancel'])]),
+ 'open_opportunity_ids': fields.one2many('crm.lead', 'section_id',
+ string='Open Opportunities', readonly=True,
+ domain=['&', '|', ('type', '=', 'opportunity'), ('type', '=', 'both'), ('state', 'not in', ['done', 'cancel'])]),
+ 'color': fields.integer('Color Index'),
+ 'use_leads': fields.boolean('Leads',
+ help="This enables the management of leads in the sales team. Otherwise the sales team manages only opportunities."),
}
def _get_stage_common(self, cr, uid, context):
- ids = self.pool.get('crm.case.stage').search(cr, uid, [('case_default','=',1)], context=context)
+ ids = self.pool.get('crm.case.stage').search(cr, uid, [('case_default', '=', 1)], context=context)
return ids
_defaults = {
'active': 1,
'stage_ids': _get_stage_common,
- 'alias_domain': False, # always hide alias during creation
+ 'use_leads': True,
}
_sql_constraints = [
@@ -150,7 +160,7 @@ class crm_case_section(osv.osv):
def name_get(self, cr, uid, ids, context=None):
"""Overrides orm name_get method"""
- if not isinstance(ids, list) :
+ if not isinstance(ids, list):
ids = [ids]
res = []
if not ids:
@@ -167,20 +177,20 @@ class crm_case_section(osv.osv):
def create(self, cr, uid, vals, context=None):
mail_alias = self.pool.get('mail.alias')
if not vals.get('alias_id'):
- vals.pop('alias_name', None) # prevent errors during copy()
+ alias_name = vals.pop('alias_name', None) or vals.get('name') # prevent errors during copy()
alias_id = mail_alias.create_unique_alias(cr, uid,
- {'alias_name': vals['name']},
+ {'alias_name': alias_name},
model_name="crm.lead",
context=context)
vals['alias_id'] = alias_id
res = super(crm_case_section, self).create(cr, uid, vals, context)
- mail_alias.write(cr, uid, [vals['alias_id']], {'alias_defaults': {'section_id': res, 'type':'lead'}}, context)
+ mail_alias.write(cr, uid, [vals['alias_id']], {'alias_defaults': {'section_id': res, 'type': 'lead'}}, context)
return res
def unlink(self, cr, uid, ids, context=None):
# Cascade-delete mail aliases as well, as they should not exist without the sales team.
mail_alias = self.pool.get('mail.alias')
- alias_ids = [team.alias_id.id for team in self.browse(cr, uid, ids, context=context) if team.alias_id ]
+ alias_ids = [team.alias_id.id for team in self.browse(cr, uid, ids, context=context) if team.alias_id]
res = super(crm_case_section, self).unlink(cr, uid, ids, context=context)
mail_alias.unlink(cr, uid, alias_ids, context=context)
return res
@@ -230,4 +240,5 @@ class crm_payment_mode(osv.osv):
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
}
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/crm_case_section_view.xml b/addons/crm/crm_case_section_view.xml
new file mode 100644
index 00000000000..c788872b47e
--- /dev/null
+++ b/addons/crm/crm_case_section_view.xml
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+
+ <!-- CRM lead search by Salesteams -->
+
+ <record model="ir.actions.act_window" id="crm_case_form_view_salesteams_lead">
+ <field name="name">Leads</field>
+ <field name="res_model">crm.lead</field>
+ <field name="view_mode">tree,form</field>
+ <field name="domain">['|', ('type','=','lead'), ('type','=',False)]</field>
+ <field name="view_id" ref="crm_case_tree_view_leads"/>
+ <field name="search_view_id" ref="crm.view_crm_case_leads_filter"/>
+ <field name="context">{
+ 'search_default_section_id': [active_id],
+ 'search_default_open': 1,
+ 'default_section_id': active_id,
+ 'default_type': 'lead',
+ 'stage_type': 'lead',
+ }
+ </field>
+ <field name="help" type="html">
+ <p>
+ Use leads if you need a qualification step before creating an
+ opportunity or a customer. It can be a business card you received,
+ a contact form filled in your website, or a file of unqualified
+ prospects you import, etc.
+ </p><p>
+ Once qualified, the lead can be converted into a business
+ opportunity and/or a new customer in your address book.
+ </p>
+ </field>
+ </record>
+
+ <!-- CRM opportunity search by Salesteams -->
+
+ <record model="ir.actions.act_window" id="crm_case_form_view_salesteams_opportunity">
+ <field name="name">Opportunities</field>
+ <field name="res_model">crm.lead</field>
+ <field name="view_mode">kanban,tree,graph,form,calendar</field>
+ <field name="domain">[('type','=','opportunity')]</field>
+ <field name="view_id" ref="crm.crm_case_kanban_view_leads"/>
+ <field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/>
+ <field name="context">{
+ 'search_default_section_id': [active_id],
+ 'search_default_new': 1,
+ 'search_default_open': 1,
+ 'default_section_id': active_id,
+ 'stage_type': 'opportunity',
+ 'default_type': 'opportunity',
+ 'default_user_id': uid,
+ }
+ </field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click to create a new opportunity.
+ </p><p>
+ OpenERP helps you keep track of your sales pipeline to follow
+ up potential sales and better forecast your future revenues.
+ </p><p>
+ You will be able to plan meetings and phone calls from
+ opportunities, convert them into quotations, attach related
+ documents, track all discussions, and much more.
+ </p>
+ </field>
+ </record>
+
+ <!-- Case Sections Salesteams kanban view -->
+
+ <record model="ir.ui.view" id="crm_case_section_salesteams_view_kanban">
+ <field name="name">crm.case.section.kanban</field>
+ <field name="model">crm.case.section</field>
+ <field name="arch" type="xml">
+ <kanban version="7.0" class="oe_background_grey">
+ <field name="use_leads"/>
+ <field name="name"/>
+ <field name="user_id"/>
+ <field name="member_ids"/>
+ <field name="note"/>
+ <field name="alias_id"/>
+ <field name="color"/>
+ <field name="open_lead_ids"/>
+ <field name="open_opportunity_ids"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_project oe_kanban_global_click oe_kanban_crm_salesteams">
+ <div class="oe_dropdown_toggle oe_dropdown_kanban" groups="base.group_user">
+ <span class="oe_e">í</span>
+ <ul class="oe_dropdown_menu">
+ <li t-if="widget.view.is_action_enabled('edit')"><a type="edit">Sales Teams Settings</a></li>
+ <li t-if="widget.view.is_action_enabled('delete')"><a type="delete">Delete</a></li>
+ <li t-if="widget.view.is_action_enabled('edit')"><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+ </ul>
+ </div>
+ <div class="oe_kanban_content">
+ <h4><field name="name"/></h4>
+ <div class="oe_kanban_alias" t-if="record.use_leads.raw_value and record.alias_id.value">
+ <span class="oe_e">%%</span><small><field name="alias_id"/></small>
+ </div>
+ <div class="oe_items_list">
+ <a t-if="record.use_leads.raw_value" name="%(crm_case_form_view_salesteams_lead)d" type="action">
+ <t t-raw="record.open_lead_ids.raw_value.length"/>
+ <t t-if="record.open_lead_ids.raw_value.length &gt;= 2">Leads</t>
+ <t t-if="record.open_lead_ids.raw_value.length &lt; 2">Lead</t></a>
+ <a name="%(crm_case_form_view_salesteams_opportunity)d" type="action">
+ <t t-raw="record.open_opportunity_ids.raw_value.length"/>
+ <t t-if="record.open_opportunity_ids.raw_value.length &gt;= 2">Opportunities</t>
+ <t t-if="record.open_opportunity_ids.raw_value.length &lt; 2">Opportunity</t></a>
+ </div>
+ <div class="oe_avatars">
+ <img t-if="record.user_id.raw_value" t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-data-member_id="record.user_id.raw_value"/>
+ <t t-foreach="record.member_ids.raw_value.slice(0,11)" t-as="member">
+ <img t-att-src="kanban_image('res.users', 'image_small', member)" t-att-data-member_id="member"/>
+ </t>
+ </div>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
+
+ <!-- Case Sections Action -->
+
+ <record id="crm_case_section_salesteams_act" model="ir.actions.act_window">
+ <field name="name">Sales Teams</field>
+ <field name="res_model">crm.case.section</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">kanban,tree,form</field>
+ <field name="view_id" ref="crm_case_section_salesteams_view_kanban"/>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click here to define a new sales team.
+ </p><p>
+ Use sales team to organize your different salespersons or
+ departments into separate teams. Each team will work in
+ its own list of opportunities.
+ </p>
+ </field>
+ </record>
+
+ <!-- Case Sections Form View -->
+
+ <record id="crm_case_section_view_form" model="ir.ui.view">
+ <field name="name">crm.case.section.form</field>
+ <field name="model">crm.case.section</field>
+ <field name="arch" type="xml">
+ <form string="Sales Team" version="7.0">
+ <sheet>
+ <div class="oe_title">
+ <label for="name" class="oe_edit_only" string="Project Name"/>
+ <h1>
+ <field name="name" string="Project Name"/>
+ </h1>
+ <div name="group_alias"
+ attrs="{'invisible': [('alias_domain', '=', False)]}">
+ <label for="alias_id" string="Email Alias"/>
+ <field name="alias_id" class="oe_inline oe_read_only" required="0" nolabel="1"/>
+ <span name="edit_alias" class="oe_edit_only">
+ <field name="alias_name" class="oe_inline"
+ attrs="{'required': [('use_leads', '=', True), ('alias_id', '!=', False)]}"/>
+ @
+ <field name="alias_domain" class="oe_inline" readonly="1"/>
+ </span>
+ </div>
+ <div name="options_active">
+ <field name="use_leads" class="oe_inline"/><label for="use_leads"/>
+ </div>
+ </div>
+ <group>
+ <group>
+ <field name="parent_id"/>
+ <field name="resource_calendar_id"/>
+ <field name="active"/>
+ </group>
+ <group>
+ <field name="user_id"/>
+ <field name="code"/>
+ </group>
+ <group colspan="4" attrs="{'invisible': [('use_leads', '=', False)]}">
+
+ </group>
+ </group>
+ <notebook colspan="4">
+ <page string="Sales Team">
+ <group>
+ <field name="change_responsible"/>
+ </group>
+ <separator string="Team Members"/>
+ <field name="member_ids" widget="many2many_kanban">
+ <kanban quick_create="false" create="true">
+ <field name="name"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div style="position: relative">
+ <a t-if="! read_only_mode" type="delete" style="position: absolute; right: 0; padding: 4px; diplay: inline-block">X</a>
+ <div class="oe_module_vignette">
+ <div class="oe_module_desc">
+ <field name="name"/>
+ </div>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </page>
+ <page string="Stages">
+ <separator string="Select Stages for this Sales Team"/>
+ <field name="stage_ids"/>
+ </page>
+ <page string="Notes">
+ <field name="note"/>
+ </page>
+ </notebook>
+ </sheet>
+ <div class="oe_chatter">
+ <field name="message_follower_ids" widget="mail_followers" help="Follow this salesteam to automatically track the events associated to users of this team."/>
+ <field name="message_ids" widget="mail_thread"/>
+ </div>
+ </form>
+ </field>
+ </record>
+
+ <!-- Case Sections Tree View -->
+
+ <record id="crm_case_section_view_tree" model="ir.ui.view">
+ <field name="name">crm.case.section.tree</field>
+ <field name="model">crm.case.section</field>
+ <field name="field_parent">child_ids</field>
+ <field name="arch" type="xml">
+ <tree string="Sales Team">
+ <field name="name"/>
+ <field name="code"/>
+ <field name="user_id"/>
+ </tree>
+ </field>
+ </record>
+
+ <!-- Case Sections Action -->
+
+ <record model="ir.actions.act_window.view" id="action_crm_tag_kanban_view_salesteams_oppor11">
+ <field name="sequence" eval="0"/>
+ <field name="view_mode">kanban</field>
+ <field name="view_id" ref="crm_case_kanban_view_leads"/>
+ <field name="act_window_id" ref="crm_case_form_view_salesteams_opportunity"/>
+ </record>
+
+ <record model="ir.actions.act_window.view" id="action_crm_tag_tree_view_salesteams_oppor11">
+ <field name="sequence" eval="1"/>
+ <field name="view_mode">tree</field>
+ <field name="view_id" ref="crm_case_tree_view_oppor"/>
+ <field name="act_window_id" ref="crm_case_form_view_salesteams_opportunity"/>
+ </record>
+
+ <record model="ir.actions.act_window.view" id="action_crm_tag_form_view_salesteams_oppor11">
+ <field name="sequence" eval="2"/>
+ <field name="view_mode">form</field>
+ <field name="view_id" ref="crm_case_form_view_oppor"/>
+ <field name="act_window_id" ref="crm_case_form_view_salesteams_opportunity"/>
+ </record>
+
+ <record id="crm_case_section_act_tree" model="ir.actions.act_window">
+ <field name="name">Cases by Sales Team</field>
+ <field name="res_model">crm.case.section</field>
+ <field name="domain">[('parent_id','=',False)]</field>
+ <field name="view_type">tree</field>
+ <field name="view_id" ref="crm_case_section_view_tree"/>
+ </record>
+
+ <record id="crm_case_section_act" model="ir.actions.act_window">
+ <field name="name">Sales Teams</field>
+ <field name="res_model">crm.case.section</field>
+ <field name="view_type">form</field>
+ <field name="view_id" ref="crm_case_section_view_tree"/>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click here to define a new sales team.
+ </p><p>
+ Use sales team to organize your different salespersons or
+ departments into separate teams. Each team will work in
+ its own list of opportunities.
+ </p>
+ </field>
+ </record>
+
+ <menuitem id="crm.menu_crm_case_section_act"
+ action="crm_case_section_salesteams_act"
+ sequence="1"
+ parent="base.menu_sales"
+ groups="base.group_multi_salesteams"/>
+ </data>
+</openerp> \ No newline at end of file
diff --git a/addons/crm/crm_data.xml b/addons/crm/crm_data.xml
index 3db7a457dfd..f24aee13c1d 100644
--- a/addons/crm/crm_data.xml
+++ b/addons/crm/crm_data.xml
@@ -27,8 +27,10 @@
</record>
<record model="crm.case.section" id="section_sales_department">
- <field name="name">Sales Department</field>
+ <field name="name">Sales</field>
<field name="code">Sales</field>
+ <field name="use_leads">True</field>
+ <field name="member_ids" eval="[(4, ref('base.user_root'))]"/>
</record>
<!-- Payment Mode -->
@@ -64,12 +66,6 @@
<p>To manage quotations and sale orders, install the "Sales Management" application.</p>]]></field>
</record>
- <record model="mail.alias" id="default_sales_alias">
- <field name="alias_name">sales</field>
- <field name="alias_model_id" ref="model_crm_lead"/>
- <field name="alias_user_id" ref="base.user_root"/>
- <field name="alias_defaults">{'type':'lead'}</field>
- </record>
</data>
</openerp>
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index 6c74ead0140..61e8c75cea8 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -22,6 +22,7 @@
from openerp.addons.base_status.base_stage import base_stage
import crm
from datetime import datetime
+from operator import itemgetter
from openerp.osv import fields, osv
import time
from openerp import tools
@@ -84,6 +85,13 @@ class crm_lead(base_stage, format_address, osv.osv):
},
}
+ def get_empty_list_help(self, cr, uid, help, context=None):
+ if context.get('default_type') == 'lead':
+ context['empty_list_help_model'] = 'crm.case.section'
+ context['empty_list_help_id'] = context.get('default_section_id')
+ context['empty_list_help_document_name'] = _("leads")
+ return super(crm_lead, self).get_empty_list_help(cr, uid, help, context=context)
+
def create(self, cr, uid, vals, context=None):
if context is None:
context = {}
@@ -355,6 +363,16 @@ class crm_lead(base_stage, format_address, osv.osv):
}
return {'value' : values}
+ def on_change_user(self, cr, uid, ids, user_id, context=None):
+ """ When changing the user, also set a section_id or restrict section id
+ to the ones user_id is member of. """
+ section_id = False
+ if user_id:
+ section_ids = self.pool.get('crm.case.section').search(cr, uid, ['|', ('user_id', '=', user_id), ('member_ids', '=', user_id)], context=context)
+ if section_ids:
+ section_id = section_ids[0]
+ return {'value': {'section_id': section_id}}
+
def _check(self, cr, uid, ids=False, context=None):
""" Override of the base.stage method.
Function called by the scheduler to process cases for date actions
@@ -628,12 +646,13 @@ class crm_lead(base_stage, format_address, osv.osv):
opportunities = self.browse(cr, uid, ids, context=context)
sequenced_opps = []
for opportunity in opportunities:
+ sequence = -1
if opportunity.stage_id and opportunity.stage_id.state != 'cancel':
- sequenced_opps.append((opportunity.stage_id.sequence, opportunity))
- else:
- sequenced_opps.append((-1, opportunity))
- sequenced_opps.sort(key=lambda tup: tup[0], reverse=True)
- opportunities = [opportunity for sequence, opportunity in sequenced_opps]
+ sequence = opportunity.stage_id.sequence
+ sequenced_opps.append(((int(sequence != -1 and opportunity.type == 'opportunity'), sequence, -opportunity.id), opportunity))
+
+ sequenced_opps.sort(reverse=True)
+ opportunities = map(itemgetter(1), sequenced_opps)
ids = [opportunity.id for opportunity in opportunities]
highest = opportunities[0]
opportunities_rest = opportunities[1:]
@@ -652,11 +671,10 @@ class crm_lead(base_stage, format_address, osv.osv):
opportunities.extend(opportunities_rest)
self._merge_notify(cr, uid, highest, opportunities, context=context)
# Check if the stage is in the stages of the sales team. If not, assign the stage with the lowest sequence
- if merged_data.get('type') == 'opportunity' and merged_data.get('section_id'):
- section_stages = self.pool.get('crm.case.section').read(cr, uid, merged_data['section_id'], ['stage_ids'], context=context)
- if merged_data.get('stage_id') not in section_stages['stage_ids']:
- stages_sequences = self.pool.get('crm.case.stage').search(cr, uid, [('id','in',section_stages['stage_ids'])], order='sequence', limit=1, context=context)
- merged_data['stage_id'] = stages_sequences and stages_sequences[0] or False
+ if merged_data.get('section_id'):
+ section_stage_ids = self.pool.get('crm.case.stage').search(cr, uid, [('section_ids', 'in', merged_data['section_id']), ('type', '=', merged_data.get('type'))], order='sequence', context=context)
+ if merged_data.get('stage_id') not in section_stage_ids:
+ merged_data['stage_id'] = section_stage_ids and section_stage_ids[0] or False
# Write merged data into first opportunity
self.write(cr, uid, [highest.id], merged_data, context=context)
# Delete tail opportunities
@@ -944,6 +962,7 @@ class crm_lead(base_stage, format_address, osv.osv):
'default_composition_mode': 'comment',
})
return {
+ 'name': _('Compose Email'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
@@ -1034,6 +1053,14 @@ class crm_lead(base_stage, format_address, osv.osv):
message = _("%s a call for %s.%s") % (prefix, phonecall.date, suffix)
return self.message_post(cr, uid, ids, body=message, context=context)
+ def log_meeting(self, cr, uid, ids, meeting_subject, meeting_date, duration, context=None):
+ if not duration:
+ duration = _('unknown')
+ else:
+ duration = str(duration)
+ message = _("Meeting scheduled at '%s'<br> Subject: %s <br> Duration: %s hour(s)") % (meeting_date, meeting_subject, duration)
+ return self.message_post(cr, uid, ids, body=message, context=context)
+
def onchange_state(self, cr, uid, ids, state_id, context=None):
if state_id:
country_id=self.pool.get('res.country.state').browse(cr, uid, state_id, context).country_id.id
diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml
index e335bd1b2ff..0979a94eb3f 100644
--- a/addons/crm/crm_lead_data.xml
+++ b/addons/crm/crm_lead_data.xml
@@ -7,68 +7,69 @@
<field name="name">New</field>
<field eval="1" name="case_default"/>
<field name="state">draft</field>
- <field eval="'10'" name="probability"/>
- <field eval="'10'" name="sequence"/>
+ <field eval="0" name="probability"/>
+ <field eval="10" name="sequence"/>
<field name="type">both</field>
</record>
<record model="crm.case.stage" id="stage_lead2">
<field name="name">Opportunity</field>
<field eval="1" name="case_default"/>
<field name="state">open</field>
- <field eval="'20'" name="probability"/>
- <field eval="'11'" name="sequence"/>
+ <field eval="20" name="probability"/>
+ <field eval="20" name="sequence"/>
+ <field name="type">lead</field>
+ </record>
+ <record model="crm.case.stage" id="stage_lead7">
+ <field name="name">Dead</field>
+ <field eval="1" name="case_default"/>
+ <field eval="False" name="fold"/>
+ <field name="state">cancel</field>
+ <field eval="0" name="probability"/>
+ <field eval="30" name="sequence"/>
<field name="type">lead</field>
</record>
<record model="crm.case.stage" id="stage_lead3">
<field name="name">Qualification</field>
<field eval="1" name="case_default"/>
<field name="state">open</field>
- <field eval="'20'" name="probability"/>
- <field eval="'12'" name="sequence"/>
+ <field eval="20" name="probability"/>
+ <field eval="100" name="sequence"/>
<field name="type">opportunity</field>
</record>
<record model="crm.case.stage" id="stage_lead4">
<field name="name">Proposition</field>
<field eval="1" name="case_default"/>
<field name="state">open</field>
- <field eval="'40'" name="probability"/>
- <field eval="'13'" name="sequence"/>
+ <field eval="40" name="probability"/>
+ <field eval="110" name="sequence"/>
<field name="type">opportunity</field>
</record>
<record model="crm.case.stage" id="stage_lead5">
<field name="name">Negotiation</field>
<field eval="1" name="case_default"/>
<field name="state">open</field>
- <field eval="'60'" name="probability"/>
- <field eval="'14'" name="sequence"/>
+ <field eval="60" name="probability"/>
+ <field eval="120" name="sequence"/>
<field name="type">opportunity</field>
</record>
<record model="crm.case.stage" id="stage_lead6">
<field name="name">Won</field>
+ <field eval="True" name="fold"/>
<field eval="1" name="case_default"/>
<field name="state">done</field>
- <field eval="'100'" name="probability"/>
- <field eval="'15'" name="sequence"/>
+ <field eval="100" name="probability"/>
+ <field eval="130" name="sequence"/>
<field eval="1" name="on_change"/>
<field name="type">opportunity</field>
</record>
- <record model="crm.case.stage" id="stage_lead7">
- <field name="name">Dead</field>
- <field eval="1" name="case_default"/>
- <field eval="False" name="fold"/>
- <field name="state">cancel</field>
- <field eval="'0'" name="probability"/>
- <field eval="'16'" name="sequence"/>
- <field name="type">lead</field>
- </record>
<record model="crm.case.stage" id="stage_lead8">
<field name="name">Lost</field>
<field eval="1" name="case_default"/>
<field eval="True" name="fold"/>
<field eval="1" name="on_change"/>
<field name="state">cancel</field>
- <field eval="'0'" name="probability"/>
- <field eval="'17'" name="sequence"/>
+ <field eval="0" name="probability"/>
+ <field eval="140" name="sequence"/>
<field name="type">opportunity</field>
</record>
@@ -228,7 +229,7 @@
<field name="name">Lead/Opportunity Mass Mail</field>
<field name="model_id" ref="crm.model_crm_lead"/>
<field name="auto_delete" eval="True"/>
- <field name="partner_to">${object.partner_id and object.partner_id.id}</field>
+ <field name="partner_to">${object.partner_id != False and object.partner_id.id}</field>
<field name="email_to">${not object.partner_id and object.email_from}</field>
<field name="body_html"></field>
</record>
diff --git a/addons/crm/crm_lead_menu.xml b/addons/crm/crm_lead_menu.xml
index 8c38ed41a1c..2226b4ac895 100644
--- a/addons/crm/crm_lead_menu.xml
+++ b/addons/crm/crm_lead_menu.xml
@@ -9,55 +9,49 @@
<field name="domain">['|', ('type','=','lead'), ('type','=',False)]</field>
<field name="view_id" ref="crm_case_tree_view_leads"/>
<field name="search_view_id" ref="crm.view_crm_case_leads_filter"/>
- <field name="context">{'default_type':'lead', 'stage_type':'lead'}</field>
+ <field name="context">{
+ 'default_type':'lead',
+ 'stage_type':'lead',
+ 'search_default_unassigned':1,
+ }
+ </field>
<field name="help" type="html">
- <p class="oe_view_nocontent_create">
- Click to create an unqualified lead.
- </p><p>
- Use leads if you need a qualification step before creating an
- opportunity or a customer. It can be a business card you received,
- a contact form filled in your website, or a file of unqualified
- prospects you import, etc.
- </p><p>
- Once qualified, the lead can be converted into a business
- opportunity and/or a new customer in your address book.
- </p>
+ <p>
+ Use leads if you need a qualification step before creating an
+ opportunity or a customer. It can be a business card you received,
+ a contact form filled in your website, or a file of unqualified
+ prospects you import, etc.
+ </p><p>
+ Once qualified, the lead can be converted into a business
+ opportunity and/or a new customer in your address book.
+ </p>
</field>
</record>
- <record model="ir.actions.act_window.view" id="action_crm_tag_tree_view_leads_all">
- <field name="sequence" eval="1"/>
- <field name="view_mode">tree</field>
- <field name="view_id" ref="crm_case_tree_view_leads"/>
- <field name="act_window_id" ref="crm_case_category_act_leads_all"/>
- </record>
-
- <record model="ir.actions.act_window.view" id="action_crm_tag_form_view_leads_all">
- <field name="sequence" eval="3"/>
- <field name="view_mode">form</field>
- <field name="view_id" ref="crm_case_form_view_leads"/>
- <field name="act_window_id" ref="crm_case_category_act_leads_all"/>
- </record>
-
<record model="ir.actions.act_window" id="crm_case_category_act_oppor11">
<field name="name">Opportunities</field>
<field name="res_model">crm.lead</field>
<field name="view_mode">kanban,tree,graph,form,calendar</field>
<field name="domain">[('type','=','opportunity')]</field>
- <field name="context">{'stage_type': 'opportunity', 'default_type': 'opportunity', 'default_user_id': uid}</field>
+ <field name="context">{
+ 'stage_type': 'opportunity',
+ 'default_type': 'opportunity',
+ 'default_user_id': uid
+ }
+ </field>
<field name="view_id" eval="False"/>
<field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/>
<field name="help" type="html">
- <p class="oe_view_nocontent_create">
- Click to create a new opportunity.
- </p><p>
- OpenERP helps you keep track of your sales pipeline to follow
- up potential sales and better forecast your future revenues.
- </p><p>
- You will be able to plan meetings and phone calls from
- opportunities, convert them into quotations, attach related
- documents, track all discussions, and much more.
- </p>
+ <p class="oe_view_nocontent_create">
+ Click to create a new opportunity.
+ </p><p>
+ OpenERP helps you keep track of your sales pipeline to follow
+ up potential sales and better forecast your future revenues.
+ </p><p>
+ You will be able to plan meetings and phone calls from
+ opportunities, convert them into quotations, attach related
+ documents, track all discussions, and much more.
+ </p>
</field>
</record>
@@ -82,9 +76,13 @@
<field name="act_window_id" ref="crm_case_category_act_oppor11"/>
</record>
- <menuitem name="Sales" id="base.menu_sales" parent="base.menu_base_partner" sequence="1" />
- <menuitem name="Leads" id="menu_crm_leads" parent="base.menu_sales" action="crm_case_category_act_leads_all" sequence="2" />
- <menuitem name="Opportunities" id="menu_crm_opportunities" parent="base.menu_sales" action="crm_case_category_act_oppor11" sequence="3" />
+ <menuitem name="Sales" id="base.menu_sales" parent="base.menu_base_partner" sequence="1"/>
+ <menuitem name="Leads" id="menu_crm_leads" parent="base.menu_sales" sequence="3"
+ action="crm_case_category_act_leads_all"
+ groups="base.group_mono_salesteams,base.group_sale_manager"/>
+ <menuitem name="Opportunities" id="menu_crm_opportunities" parent="base.menu_sales" sequence="4"
+ action="crm_case_category_act_oppor11"
+ groups="base.group_mono_salesteams,base.group_sale_manager"/>
</data>
</openerp>
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
index df28d240a0c..8c22a0a2e1c 100644
--- a/addons/crm/crm_lead_view.xml
+++ b/addons/crm/crm_lead_view.xml
@@ -100,6 +100,7 @@
<button name="case_cancel" string="Cancel Case" type="object"
states="draft,open,pending"/>
<field name="stage_id" widget="statusbar" clickable="True"
+ domain="['&amp;', '|', ('case_default', '=', True), ('section_ids', '=', section_id), '|', ('type', '=', type), ('type', '=', 'both')]"
on_change="onchange_stage_id(stage_id)"/>
</header>
<sheet>
@@ -151,12 +152,13 @@
-->
</group>
<group>
- <field name="user_id"
- context="{'default_groups_ref': ['base.group_user', 'base.group_sale_salesman_all_leads']}"/>
- <label for="section_id"/>
- <div>
+ <field name="user_id" on_change="on_change_user(user_id, context)"
+ context="{'default_groups_ref': ['base.group_user', 'base.group_sale_salesman_all_leads'] }"/>
+ <label for="section_id" groups="base.group_multi_salesteams"/>
+ <div groups="base.group_multi_salesteams">
<field name="section_id"/>
- <button name="case_escalate" string="Escalate" type="object" attrs="{'invisible': ['|', ('section_id','=',False), ('state', 'not in', ['draft','open','pending'])]}"/>
+ <button name="case_escalate" string="Escalate" type="object"
+ attrs="{'invisible': ['|', ('section_id','=',False), ('state', 'not in', ['draft','open','pending'])]}"/>
</div>
<field name="type" invisible="1"/>
</group>
@@ -228,7 +230,7 @@
<field name="stage_id"/>
<field name="user_id" invisible="1"/>
<field name="partner_id" invisible="1"/>
- <field name="section_id" invisible="context.get('invisible_section', True)"/>
+ <field name="section_id" invisible="context.get('invisible_section', True)" groups="base.group_multi_salesteams"/>
<field name="state" invisible="1"/>
<field name="type_id" invisible="1"/>
<field name="referred" invisible="1"/>
@@ -326,15 +328,15 @@
<search string="Search Leads">
<field name="name" string="Lead / Customer" filter_domain="['|','|',('partner_name','ilike',self),('email_from','ilike',self),('name','ilike',self)]"/>
<field name="categ_ids" string="Category" filter_domain="[('categ_ids','ilike',self)]"/>
- <field name="section_id" context="{'invisible_section': False, 'default_section_id': self}"/>
+ <field name="section_id" context="{'invisible_section': False}" groups="base.group_multi_salesteams"/>
<field name="user_id"/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="create_date"/>
<field name="country_id" context="{'invisible_country': False}"/>
<separator/>
<filter string="Open" name="open" domain="[('state','!=','cancel')]" help="Open Leads"/>
<filter string="Dead" name="dead" domain="[('state','=','cancel')]"/>
- <filter string="Unassigned" domain="[('user_id','=', False)]" help="No salesperson"/>
+ <filter string="Unassigned" name="unassigned" domain="[('user_id','=', False)]" help="No salesperson"/>
<filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]" help="Unread messages"/>
<filter string="Assigned to Me"
domain="[('user_id','=',uid)]" context="{'invisible_section': False}"
@@ -427,9 +429,9 @@
</group>
<group>
- <field name="user_id" context="{'default_groups_ref': ['base.group_user', 'base.group_sale_salesman_all_leads']}"/>
- <label for="section_id"/>
- <div>
+ <field name="user_id" on_change="on_change_user(user_id, context)" context="{'default_groups_ref': ['base.group_user', 'base.group_sale_salesman_all_leads']}"/>
+ <label for="section_id" groups="base.group_multi_salesteams"/>
+ <div groups="base.group_multi_salesteams">
<field name="section_id" widget="selection"/>
<button name="case_escalate" string="Escalate" type="object" class="oe_link" attrs="{'invisible': ['|', ('section_id','=',False), ('state', 'not in', ['draft','open','pending'])]}"/>
</div>
@@ -525,7 +527,7 @@
<field name="stage_id"/>
<field name="planned_revenue" sum="Expected Revenues"/>
<field name="probability" avg="Avg. of Probability"/>
- <field name="section_id" invisible="context.get('invisible_section', True)"/>
+ <field name="section_id" invisible="context.get('invisible_section', True)" groups="base.group_multi_salesteams"/>
<field name="user_id"/>
<field name="referred" invisible="1"/>
<field name="priority" invisible="1"/>
@@ -544,15 +546,15 @@
<search string="Search Opportunities">
<field name="name" string="Opportunity" filter_domain="['|','|','|',('partner_id','ilike',self),('partner_name','ilike',self),('email_from','ilike',self),('name', 'ilike', self)]"/>
<field name="categ_ids" string="Category" filter_domain="[('categ_ids','ilike', self)]"/>
- <field name="section_id" context="{'invisible_section': False, 'default_section_id': self}"/>
+ <field name="section_id" context="{'invisible_section': False}" groups="base.group_multi_salesteams"/>
<field name="user_id"/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<separator/>
<filter string="New" name="new" domain="[('state','=','draft')]" help="New Opportunities"/>
<filter string="In Progress" name="open" domain="[('state','=','open')]" help="Open Opportunities"/>
<filter string="Won" name="won" domain="[('state','=','done')]"/>
<filter string="Lost" name="lost" domain="[('state','=','cancel')]"/>
- <filter string="Unassigned" domain="[('user_id','=', False)]" help="No salesperson"/>
+ <filter string="Unassigned" name="unassigned" domain="[('user_id','=', False)]" help="No salesperson"/>
<filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]" help="Unread messages"/>
<filter string="Assigned to Me"
domain="[('user_id','=',uid)]" context="{'invisible_section': False}"
diff --git a/addons/crm/crm_meeting.py b/addons/crm/crm_meeting.py
index 14b69ed0e11..c31907bebe2 100644
--- a/addons/crm/crm_meeting.py
+++ b/addons/crm/crm_meeting.py
@@ -34,6 +34,13 @@ class crm_meeting(osv.Model):
'opportunity_id': fields.many2one ('crm.lead', 'Opportunity', domain="[('type', '=', 'opportunity')]"),
}
+ def create(self, cr, uid, vals, context=None):
+ res = super(crm_meeting, self).create(cr, uid, vals, context=context)
+ obj = self.browse(cr, uid, res, context=context)
+ if obj.opportunity_id:
+ self.pool.get('crm.lead').log_meeting(cr, uid, [obj.opportunity_id.id], obj.name, obj.date, obj.duration, context=context)
+ return res
+
class calendar_attendee(osv.osv):
""" Calendar Attendee """
diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml
index 67df85e6178..6c1b31180be 100644
--- a/addons/crm/crm_phonecall_view.xml
+++ b/addons/crm/crm_phonecall_view.xml
@@ -103,7 +103,8 @@
<field name="date"/>
<field name="user_id"/>
<field name="duration" widget="float_time"/>
- <field name="section_id" colspan="1" widget="selection"/>
+ <field name="section_id" colspan="1" widget="selection"
+ groups="base.group_multi_salesteams"/>
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
<field name="email_from" invisible="1"/> <!--not needed because of the chatter, thus invisible, but must be in the view as it's returned by onchange_partner_id()-->
<field name="categ_id" widget="selection"
@@ -185,9 +186,10 @@
<separator/>
<filter string="Phone Calls Assigned to Me or My Team(s)" icon="terp-personal+" domain="['|', ('section_id.user_id','=',uid), ('user_id', '=', uid)]"
help="Phone Calls Assigned to the current user or with a team having the current user as team leader"/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="user_id"/>
- <field name="section_id" string="Sales Team"/>
+ <field name="section_id" string="Sales Team"
+ groups="base.group_multi_salesteams"/>
<group expand="0" string="Group By...">
<filter string="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
<filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
diff --git a/addons/crm/crm_report_view.xml b/addons/crm/crm_report_view.xml
index 355d862c898..39a2967c947 100644
--- a/addons/crm/crm_report_view.xml
+++ b/addons/crm/crm_report_view.xml
@@ -12,7 +12,7 @@
<field name="name"/>
<field name="month"/>
<field name="user_id"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
<field name="category2_id"/>
<field name="stage_id"/>
<field name="amount_revenue"/>
@@ -33,7 +33,8 @@
<field name="name"/>
<field name="month"/>
<field name="user_id"/>
- <field name="section_id" widget="selection"/>
+ <field name="section_id" widget="selection"
+ groups="base.group_multi_salesteams"/>
<field name="category2_id" />
<field name="stage_id"/>
<field name="amount_revenue"/>
@@ -53,7 +54,8 @@
<graph string="Cases by Teams and Type" type="bar" orientation="horizontal">
<field name="category2_id"/>
<field name="amount_revenue" operator="+"/>
- <field name="section_id" group="True"/>
+ <field name="section_id" group="True"
+ groups="base.group_multi_salesteams"/>
</graph>
</field>
</record>
@@ -69,7 +71,7 @@
<field name="month"/>
<field name="nbr"/>
<field name="state"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
<field name="category2_id"/>
</search>
</field>
@@ -95,7 +97,7 @@
<field name="name"/>
<field name="month"/>
<field name="user_id"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
<field name="stage_id"/>
<field name="amount_revenue"/>
<field name="nbr"/>
@@ -115,7 +117,8 @@
<field name="name"/>
<field name="month"/>
<field name="user_id"/>
- <field name="section_id" widget="selection"/>
+ <field name="section_id" widget="selection"
+ groups="base.group_multi_salesteams"/>
<field name="stage_id"/>
<field name="amount_revenue"/>
<field name="nbr" />
@@ -134,7 +137,7 @@
<graph string="Cases by Team and Stage" type="bar" orientation="horizontal">
<field name="stage_id"/>
<field name="amount_revenue" operator="+"/>
- <field name="section_id" group="True"/>
+ <field name="section_id" group="True" groups="base.group_multi_salesteams"/>
</graph>
</field>
</record>
@@ -150,7 +153,7 @@
<field name="month"/>
<field name="nbr"/>
<field name="state"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</search>
</field>
</record>
@@ -175,7 +178,7 @@
<field name="name"/>
<field name="month"/>
<field name="user_id"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
<field name="categ_id"/>
<field name="stage_id"/>
<field name="nbr"/>
@@ -195,7 +198,7 @@
<field name="name"/>
<field name="month"/>
<field name="user_id"/>
- <field name="section_id" widget="selection"/>
+ <field name="section_id" widget="selection" groups="base.group_multi_salesteams"/>
<field name="categ_id"/>
<field name="stage_id"/>
<field name="nbr" />
@@ -216,7 +219,7 @@
<field name="month"/>
<field name="nbr"/>
<field name="state"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</search>
</field>
</record>
@@ -230,7 +233,7 @@
<graph string="Cases by Section, Category and Stage" type="bar" orientation="horizontal">
<field name="categ_id"/>
<field name="nbr" operator="+"/>
- <field name="section_id" group="True"/>
+ <field name="section_id" group="True" groups="base.group_multi_salesteams"/>
</graph>
</field>
</record>
@@ -255,7 +258,7 @@
<field name="name"/>
<field name="month"/>
<field name="user_id"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
<field name="categ_id"/>
<field name="category2_id"/>
<field name="stage_id"/>
@@ -276,7 +279,7 @@
<field name="name"/>
<field name="month"/>
<field name="user_id"/>
- <field name="section_id" widget="selection"/>
+ <field name="section_id" widget="selection" groups="base.group_multi_salesteams"/>
<field name="categ_id"/>
<field name="category2_id"/>
<field name="stage_id"/>
@@ -298,7 +301,7 @@
<field name="month"/>
<field name="nbr"/>
<field name="state"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</search>
</field>
</record>
@@ -312,7 +315,7 @@
<graph string="Cases by Section, Category and Type" type="bar" orientation="horizontal">
<field name="category2_id"/>
<field name="nbr" operator="+"/>
- <field name="section_id" group="True"/>
+ <field name="section_id" group="True" groups="base.group_multi_salesteams"/>
</graph>
</field>
</record>
diff --git a/addons/crm/crm_segmentation.py b/addons/crm/crm_segmentation.py
index b11fac31dcf..6e596b5fb9c 100644
--- a/addons/crm/crm_segmentation.py
+++ b/addons/crm/crm_segmentation.py
@@ -108,7 +108,6 @@ added to partners that match the segmentation criterions after computation.'),
self.write(cr, uid, ids, {'state':'running', 'partner_id':0})
return self.process_continue(cr, uid, ids, start=True)
-crm_segmentation()
class crm_segmentation_line(osv.osv):
""" Segmentation line """
@@ -180,7 +179,6 @@ class crm_segmentation_line(osv.osv):
return True
return True
-crm_segmentation_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/crm_view.xml b/addons/crm/crm_view.xml
index 2c156ca2ac2..63385fa3e17 100644
--- a/addons/crm/crm_view.xml
+++ b/addons/crm/crm_view.xml
@@ -70,109 +70,6 @@
<menuitem action="crm_case_channel_action" id="menu_crm_case_channel" parent="base.menu_crm_config_lead" sequence="4" groups="base.group_no_one"/>
- <!-- Case Sections Form View -->
-
- <record id="crm_case_section_view_form" model="ir.ui.view">
- <field name="name">crm.case.section.form</field>
- <field name="model">crm.case.section</field>
- <field name="arch" type="xml">
- <form string="Sales Team" version="7.0">
- <group>
- <group>
- <field name="name" colspan="2"/>
- <field name="parent_id"/>
- <field name="code"/>
- </group>
-
- <group>
- <field name="user_id"/>
- <field name="resource_calendar_id"/>
- <field name="active"/>
- </group>
- </group>
- <notebook colspan="4">
- <page string="Sales Team">
- <group>
- <field name="alias_id" invisible="1" required="0"/>
- <label for="alias_name" attrs="{'invisible': [('alias_domain', '=', False)]}"/>
- <div attrs="{'invisible': [('alias_domain', '=', False)]}">
- <field name="alias_name" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" class="oe_inline"/>
- </div>
- <field name="change_responsible"/>
- </group>
- <separator string="Team Members"/>
- <field name="member_ids" widget="many2many_kanban">
- <kanban quick_create="false" create="true">
- <field name="name"/>
- <templates>
- <t t-name="kanban-box">
- <div style="position: relative">
- <a t-if="! read_only_mode" type="delete" style="position: absolute; right: 0; padding: 4px; diplay: inline-block">X</a>
- <div class="oe_module_vignette">
- <div class="oe_module_desc">
- <field name="name"/>
- </div>
- </div>
- </div>
- </t>
- </templates>
- </kanban>
- </field>
- </page>
- <page string="Stages">
- <separator string="Select Stages for this Sales Team"/>
- <field name="stage_ids"/>
- </page>
- <page string="Notes">
- <field name="note"/>
- </page>
- </notebook>
- <div class="oe_chatter">
- <field name="message_follower_ids" widget="mail_followers" help="Follow this salesteam to automatically track the events associated to users of this team."/>
- <field name="message_ids" widget="mail_thread"/>
- </div>
- </form>
- </field>
- </record>
-
- <!-- Case Sections Tree View -->
-
- <record id="crm_case_section_view_tree" model="ir.ui.view">
- <field name="name">crm.case.section.tree</field>
- <field name="model">crm.case.section</field>
- <field name="field_parent">child_ids</field>
- <field name="arch" type="xml">
- <tree string="Sales Team">
- <field name="name"/>
- <field name="code"/>
- <field name="user_id"/>
- </tree>
- </field>
- </record>
-
- <!-- Case Sections Action -->
-
- <record id="crm_case_section_act" model="ir.actions.act_window">
- <field name="name">Sales Teams</field>
- <field name="res_model">crm.case.section</field>
- <field name="view_type">form</field>
- <field name="view_id" ref="crm_case_section_view_tree"/>
- <field name="help" type="html">
- <p class="oe_view_nocontent_create">
- Click to define a new sales team.
- </p><p>
- Use sales team to organize your different salespersons or
- departments into separate teams. Each team will work in
- its own list of opportunities.
- </p>
- </field>
- </record>
-
- <menuitem action="crm_case_section_act"
- id="menu_crm_case_section_act" sequence="15"
- parent="base.menu_base_config" groups="base.group_sale_manager"/>
-
-
<!-- CRM Stage Tree View -->
<record model="ir.ui.view" id="crm_case_stage_tree">
@@ -233,7 +130,7 @@
<form string="Case Category" version="7.0">
<group>
<field name="name"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
<field name="object_id" invisible="1"/>
</group>
</form>
@@ -248,7 +145,7 @@
<field name="arch" type="xml">
<tree string="Case Category">
<field name="name"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</tree>
</field>
</record>
@@ -261,7 +158,7 @@
<field name="arch" type="xml">
<tree string="Campaign">
<field name="name"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</tree>
</field>
</record>
@@ -275,7 +172,7 @@
<form string="Campaign" version="7.0">
<group>
<field name="name"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</group>
</form>
</field>
@@ -295,13 +192,6 @@
groups="base.group_no_one"
parent="base.menu_crm_config_lead"/>
- <record id="crm_case_section_act_tree" model="ir.actions.act_window">
- <field name="name">Cases by Sales Team</field>
- <field name="res_model">crm.case.section</field>
- <field name="domain">[('parent_id','=',False)]</field>
- <field name="view_type">tree</field>
- <field name="view_id" ref="crm_case_section_view_tree"/>
- </record>
<!-- Segmentation line Tree View -->
@@ -434,7 +324,7 @@
<field name="arch" type="xml">
<tree string="Payment Mode">
<field name="name"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</tree>
</field>
</record>
@@ -448,7 +338,7 @@
<form string="Payment Mode" version="7.0">
<group>
<field name="name"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</group>
</form>
</field>
diff --git a/addons/crm/i18n/es_MX.po b/addons/crm/i18n/es_MX.po
index 24271346a0b..5e347b16f67 100644
--- a/addons/crm/i18n/es_MX.po
+++ b/addons/crm/i18n/es_MX.po
@@ -1,20 +1,21 @@
-# Translation of OpenERP Server.
-# This file contains the translation of the following modules:
-# * crm
+# Spanish (Mexico) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 6.0dev\n"
-"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-01-18 07:46+0000\n"
-"Last-Translator: Jorge L Tupac-Yupanqui <Unknown>\n"
-"Language-Team: \n"
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:04+0000\n"
+"PO-Revision-Date: 2013-03-28 01:06+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Spanish (Mexico) <es_MX@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-09-05 05:08+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
+"X-Launchpad-Export-Date: 2013-03-29 04:36+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
#. module: crm
#: view:crm.lead.report:0
@@ -22,71 +23,67 @@ msgid "# Leads"
msgstr "# Iniciativas"
#. module: crm
+#: help:sale.config.settings,fetchmail_lead:0
+msgid ""
+"Allows you to configure your incoming mail server, and create leads from "
+"incoming emails."
+msgstr ""
+"Le permite configurar su servidor de correo entrante y crear iniciativas "
+"desde los correos entrantes."
+
+#. module: crm
+#: code:addons/crm/crm_lead.py:881
+#: selection:crm.case.stage,type:0
#: view:crm.lead:0
#: selection:crm.lead,type:0
+#: view:crm.lead.report:0
#: selection:crm.lead.report,type:0
+#, python-format
msgid "Lead"
msgstr "Iniciativa"
#. module: crm
-#: model:crm.case.categ,name:crm.categ_oppor3
-msgid "Need Services"
-msgstr "Necesita servicios"
-
-#. module: crm
-#: selection:crm.meeting,rrule_type:0
-msgid "Monthly"
-msgstr "Mensual"
-
-#. module: crm
-#: view:crm.opportunity2phonecall:0
-msgid "Schedule a PhoneCall"
-msgstr "Planificar llamada telefónica"
-
-#. module: crm
-#: model:ir.model,name:crm.model_crm_case_stage
-msgid "Stage of case"
-msgstr "Etapa del caso"
-
-#. module: crm
-#: view:crm.meeting:0
-msgid "Visibility"
-msgstr "Visibilidad"
-
-#. module: crm
+#: view:crm.lead:0
#: field:crm.lead,title:0
msgid "Title"
msgstr "Título"
#. module: crm
-#: field:crm.meeting,show_as:0
-msgid "Show as"
-msgstr "Mostrar como"
+#: model:ir.actions.server,message:crm.action_email_reminder_lead
+msgid ""
+"Warning unprocessed incoming lead is more than 5 day old.\n"
+"Name: [[object.name ]]\n"
+"ID: [[object.id ]]\n"
+"Description: [[object.description]]\n"
+" "
+msgstr ""
+"Advertencia: Una iniciativa entrante está sin procesar más de 5 días.\n"
+"Nombre: [[object.name ]]\n"
+"ID: [[object.id ]]\n"
+"Descripción: [[object.description]]\n"
+" "
#. module: crm
-#: field:crm.meeting,day:0
-#: selection:crm.meeting,select1:0
-msgid "Date of month"
-msgstr "Día del mes"
+#: field:crm.opportunity2phonecall,action:0
+#: field:crm.phonecall2phonecall,action:0
+msgid "Action"
+msgstr "Acción"
#. module: crm
-#: view:crm.lead:0
-#: view:crm.phonecall:0
-msgid "Today"
-msgstr "Hoy"
+#: model:ir.actions.server,name:crm.action_set_team_sales_department
+msgid "Set team to Sales Department"
+msgstr "Establecer como equipo al Departamento de ventas"
#. module: crm
-#: view:crm.merge.opportunity:0
+#: view:crm.lead2opportunity.partner.mass:0
msgid "Select Opportunities"
msgstr "Seleccionar oportunidades"
#. module: crm
-#: view:crm.meeting:0
-#: view:crm.phonecall2opportunity:0
-#: view:crm.phonecall2phonecall:0
-#: view:crm.send.mail:0
-msgid " "
-msgstr " "
+#: model:res.groups,name:crm.group_fund_raising
+#: field:sale.config.settings,group_fund_raising:0
+msgid "Manage Fund Raising"
+msgstr "Administrar recaudación de fondos"
#. module: crm
#: view:crm.lead.report:0
@@ -95,64 +92,63 @@ msgid "Delay to close"
msgstr "Demora cierre"
#. module: crm
-#: view:crm.lead:0
-msgid "Previous Stage"
-msgstr "Etapa anterior"
+#: view:crm.case.stage:0
+#: field:crm.case.stage,name:0
+msgid "Stage Name"
+msgstr "Nombre de etapa"
#. module: crm
-#: code:addons/crm/wizard/crm_add_note.py:26
-#, python-format
-msgid "Can not add note!"
-msgstr "¡No se puede añadir una nota!"
+#: view:crm.lead:0
+#: field:crm.lead,user_id:0
+#: view:crm.lead.report:0
+#: view:crm.phonecall.report:0
+msgid "Salesperson"
+msgstr "Comercial"
#. module: crm
-#: field:crm.case.stage,name:0
-msgid "Stage Name"
-msgstr "Nombre de etapa"
+#: model:ir.model,name:crm.model_crm_lead_report
+msgid "CRM Lead Analysis"
+msgstr "Análisis Iniciativas CRM"
#. module: crm
#: view:crm.lead.report:0
-#: field:crm.lead.report,day:0
#: view:crm.phonecall.report:0
#: field:crm.phonecall.report,day:0
msgid "Day"
msgstr "Día"
#. module: crm
-#: sql_constraint:crm.case.section:0
-msgid "The code of the sales team must be unique !"
-msgstr "¡El código del equipo de ventas debe ser único!"
+#: view:crm.lead:0
+msgid "Company Name"
+msgstr "Nombre de la compañía"
#. module: crm
-#: code:addons/crm/wizard/crm_lead_to_opportunity.py:95
-#, python-format
-msgid "Lead '%s' has been converted to an opportunity."
-msgstr "La inicaitiva '%s' ha sido convertida en oportunidad"
+#: model:crm.case.categ,name:crm.categ_oppor6
+msgid "Training"
+msgstr "Formación"
#. module: crm
-#: code:addons/crm/crm_lead.py:228
-#, python-format
-msgid "The lead '%s' has been closed."
-msgstr "La iniciativa '%s' ha sido cerrada"
+#: model:ir.actions.act_window,name:crm.crm_lead_categ_action
+#: model:ir.ui.menu,name:crm.menu_crm_lead_categ
+msgid "Sales Tags"
+msgstr "Etiquetas de ventas"
#. module: crm
-#: selection:crm.meeting,freq:0
-msgid "No Repeat"
-msgstr "No repetir"
+#: view:crm.lead.report:0
+msgid "Exp. Closing"
+msgstr "Cierre Esperado"
#. module: crm
-#: code:addons/crm/wizard/crm_lead_to_opportunity.py:135
-#: code:addons/crm/wizard/crm_lead_to_opportunity.py:260
-#: code:addons/crm/wizard/crm_lead_to_partner.py:55
-#: code:addons/crm/wizard/crm_phonecall_to_partner.py:52
-#, python-format
-msgid "Warning !"
-msgstr "Advertencia !"
+#: help:crm.case.section,message_unread:0
+#: help:crm.lead,message_unread:0
+#: help:crm.phonecall,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr "Si se marca, los nuevos mensajes requieren su atención"
#. module: crm
-#: selection:crm.meeting,rrule_type:0
-msgid "Yearly"
-msgstr "Anual"
+#: help:crm.lead.report,creation_day:0
+msgid "Creation day"
+msgstr "Fecha creción"
#. module: crm
#: field:crm.segmentation.line,name:0
@@ -160,6 +156,12 @@ msgid "Rule Name"
msgstr "Nombre de regla"
#. module: crm
+#: code:addons/crm/crm_phonecall.py:280
+#, python-format
+msgid "It's only possible to convert one phonecall at a time."
+msgstr "Sólo es posible convertir una llamada telefónica cada vez."
+
+#. module: crm
#: view:crm.case.resource.type:0
#: view:crm.lead:0
#: field:crm.lead,type_id:0
@@ -170,117 +172,82 @@ msgid "Campaign"
msgstr "Campaña"
#. module: crm
-#: selection:crm.lead2opportunity.partner,action:0
-msgid "Do not create a partner"
-msgstr "No crear una empresa"
-
-#. module: crm
#: view:crm.lead:0
msgid "Search Opportunities"
msgstr "Busqueda de oportunidades"
#. module: crm
-#: code:addons/crm/wizard/crm_merge_opportunities.py:46
-#, python-format
+#: help:crm.lead.report,deadline_month:0
+msgid "Expected closing month"
+msgstr "Mes esperado de cierre"
+
+#. module: crm
+#: help:crm.case.section,message_summary:0
+#: help:crm.lead,message_summary:0
+#: help:crm.phonecall,message_summary:0
msgid ""
-"Opportunity must have Partner assigned before merging with other Opportunity."
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
msgstr ""
-"La oportunidad debe de tener una empresa asignada antes de fusionarla con "
-"otra oportunidad."
+"Contiene el resumen del chatter (nº de mensajes, ...). Este resumen viene "
+"directamente en formato HTML para poder ser insertado en las vistas kanban."
#. module: crm
-#: code:addons/crm/wizard/crm_merge_opportunities.py:46
-#: code:addons/crm/wizard/crm_merge_opportunities.py:53
+#: code:addons/crm/crm_lead.py:624
+#: code:addons/crm/crm_lead.py:744
+#: code:addons/crm/crm_phonecall.py:280
#, python-format
msgid "Warning!"
msgstr "¡Aviso!"
#. module: crm
-#: view:crm.lead.report:0
-#: model:ir.actions.act_window,name:crm.action_report_crm_opportunity
-#: model:ir.ui.menu,name:crm.menu_report_crm_opportunities_tree
-msgid "Opportunities Analysis"
-msgstr "Análisis de oportunidades"
-
-#. module: crm
+#: view:crm.lead:0
#: field:crm.lead,partner_id:0
#: view:crm.lead.report:0
#: field:crm.lead.report,partner_id:0
-#: field:crm.lead2opportunity,partner_id:0
-#: field:crm.lead2opportunity.partner,partner_id:0
-#: field:crm.lead2partner,partner_id:0
-#: view:crm.meeting:0
-#: field:crm.meeting,partner_id:0
-#: field:crm.partner2opportunity,partner_id:0
+#: field:crm.opportunity2phonecall,partner_id:0
#: view:crm.phonecall:0
-#: field:crm.phonecall,partner_id:0
#: view:crm.phonecall.report:0
#: field:crm.phonecall.report,partner_id:0
-#: field:crm.phonecall2opportunity,partner_id:0
-#: field:crm.phonecall2partner,partner_id:0
+#: field:crm.phonecall2phonecall,partner_id:0
#: model:ir.model,name:crm.model_res_partner
#: model:process.node,name:crm.process_node_partner0
msgid "Partner"
msgstr "Empresa"
#. module: crm
-#: field:crm.meeting,organizer:0
-#: field:crm.meeting,organizer_id:0
-msgid "Organizer"
-msgstr "Organizador"
-
-#. module: crm
#: view:crm.phonecall:0
-#: view:crm.phonecall2phonecall:0
#: model:ir.actions.act_window,name:crm.phonecall_to_phonecall_act
-#: view:res.partner:0
msgid "Schedule Other Call"
msgstr "Planificar otra llamada"
#. module: crm
-#: help:crm.meeting,edit_all:0
-msgid "Edit all Occurrences of recurrent Meeting."
-msgstr "Editar todas las ocurrencias de la reunión recurrente."
-
-#. module: crm
-#: code:addons/crm/wizard/crm_opportunity_to_phonecall.py:134
-#: code:addons/crm/wizard/crm_phonecall_to_phonecall.py:89
-#: model:crm.case.categ,name:crm.categ_meet3
+#: code:addons/crm/crm_phonecall.py:209
#: view:crm.phonecall:0
-#: model:ir.ui.menu,name:crm.menu_crm_config_phonecall
-#: view:res.partner:0
#, python-format
msgid "Phone Call"
msgstr "Llamada de telefono"
#. module: crm
-#: field:crm.lead,optout:0
+#: field:crm.lead,opt_out:0
msgid "Opt-Out"
msgstr "No acepta recibir emails"
#. module: crm
-#: code:addons/crm/crm_opportunity.py:108
-#, python-format
-msgid "The opportunity '%s' has been marked as lost."
-msgstr "La oportunidad '%s' ha sido marcada como perdida."
+#: view:crm.lead:0
+#: field:crm.lead,state_id:0
+msgid "State"
+msgstr "Estado"
#. module: crm
-#: model:ir.actions.act_window,help:crm.action_report_crm_lead
-msgid ""
-"Leads Analysis allows you to check different CRM related information. Check "
-"for treatment delays, number of responses given and emails sent. You can "
-"sort out your leads analysis by different groups to get accurate grained "
-"analysis."
-msgstr ""
-"El análisis de iniciativas le permite verificar información relacionada con "
-"el CRM. Puede verificar los retrasos, el número de respuestas realizadas y "
-"el número de emails enviados. Puede ordenar el análisis de sus iniciativas "
-"según diferentes grupos para obtener un análisis reagrupado preciso."
+#: field:res.partner,meeting_count:0
+msgid "# Meetings"
+msgstr "Nº reuniones"
#. module: crm
-#: view:crm.lead:0
-msgid "Send New Email"
-msgstr "Enviar nuevo email"
+#: model:ir.actions.server,name:crm.action_email_reminder_lead
+msgid "Reminder to User"
+msgstr "Recordatorio al usuario"
#. module: crm
#: field:crm.segmentation,segmentation_line:0
@@ -293,14 +260,9 @@ msgid "Excluded Answers :"
msgstr "Respuestas excluidas:"
#. module: crm
-#: field:crm.case.stage,section_ids:0
-msgid "Sections"
-msgstr "Secciones"
-
-#. module: crm
-#: view:crm.merge.opportunity:0
-msgid "_Merge"
-msgstr "_Fusionar"
+#: model:ir.model,name:crm.model_crm_merge_opportunity
+msgid "Merge opportunities"
+msgstr "Fusionar oportunidades"
#. module: crm
#: view:crm.lead.report:0
@@ -310,20 +272,12 @@ msgid "Leads Analysis"
msgstr "Análisis de iniciativas"
#. module: crm
-#: view:crm.lead2opportunity.action:0
-msgid ""
-"If you select Merge with existing Opportunity, the lead details(with the "
-"communication history) will be merged with existing Opportunity of Selected "
-"partner."
+#: code:addons/crm/crm_lead.py:1010
+#, python-format
+msgid "<b>%s a call</b> for the <em>%s</em>."
msgstr ""
-"Si selecciona fusionar con oportunidad existente, los detalles de la "
-"iniciativa (con el histórico de la comunicación) serán fusionados con la "
-"oportunidad existente de la empresa seleccionada"
-
-#. module: crm
-#: selection:crm.meeting,class:0
-msgid "Public"
-msgstr "Público"
+"Copy text \t\r\n"
+"<b>%s una llamada</b> para el <em>%s</em>."
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_case_resource_type_act
@@ -332,19 +286,14 @@ msgid "Campaigns"
msgstr "Campañas"
#. module: crm
-#: model:ir.actions.act_window,name:crm.crm_lead_categ_action
+#: view:crm.lead:0
+#: field:crm.lead,categ_ids:0
#: model:ir.ui.menu,name:crm.menu_crm_case_phonecall-act
-#: model:ir.ui.menu,name:crm.menu_crm_lead_categ
msgid "Categories"
msgstr "Categorías"
#. module: crm
-#: selection:crm.meeting,end_type:0
-msgid "Forever"
-msgstr "Siempre"
-
-#. module: crm
-#: help:crm.lead,optout:0
+#: help:crm.lead,opt_out:0
msgid ""
"If opt-out is checked, this contact has refused to receive emails or "
"unsubscribed to a campaign."
@@ -358,44 +307,61 @@ msgid "Prospect Partner"
msgstr "Socio prospecto"
#. module: crm
+#: code:addons/crm/crm_lead.py:982
+#, python-format
+msgid "No Subject"
+msgstr "Sin asunto"
+
+#. module: crm
#: field:crm.lead,contact_name:0
msgid "Contact Name"
msgstr "Nombre de contacto"
#. module: crm
-#: selection:crm.lead2opportunity.partner,action:0
-#: selection:crm.lead2partner,action:0
-#: selection:crm.phonecall2partner,action:0
-msgid "Link to an existing partner"
-msgstr "Enlace al socio existente"
+#: help:crm.segmentation,categ_id:0
+msgid ""
+"The partner category that will be added to partners that match the "
+"segmentation criterions after computation."
+msgstr ""
+"La categoría de empresas que será añadida a las empresas que cumplan los "
+"criterios de segmentación después del cálculo."
#. module: crm
-#: view:crm.lead:0
-#: view:crm.meeting:0
-#: field:crm.phonecall,partner_contact:0
+#: model:ir.actions.act_window,help:crm.crm_segmentation_tree-act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to define a new customer segmentation.\n"
+" </p><p>\n"
+" Create specific categories which you can assign to your\n"
+" contacts to better manage your interactions with them. The\n"
+" segmentation tool is able to assign categories to contacts\n"
+" according to criteria you set.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+"Pulse para definir una nueva segmentación de clientes.\n"
+"</p><p>\n"
+"Cree categorías específicas que puede asignar a sus contactos para "
+"administrar mejor sus interacciones con ellos. La herramienta de "
+"segmentación es capaz de asignar categorías a los contactos de acuerdo a los "
+"criterios que establezca.\n"
+"</p>\n"
+" "
+
+#. module: crm
+#: field:crm.opportunity2phonecall,contact_name:0
+#: field:crm.phonecall,partner_id:0
+#: field:crm.phonecall2phonecall,contact_name:0
msgid "Contact"
msgstr "Contacto"
#. module: crm
-#: view:crm.installer:0
-msgid "Enhance your core CRM Application with additional functionalities."
-msgstr "Mejore su aplicación CRM básica con funcionalidades adicionales."
-
-#. module: crm
-#: field:crm.case.stage,on_change:0
-msgid "Change Probability Automatically"
-msgstr "Cambiar la probabilidad automáticamente"
-
-#. module: crm
-#: field:base.action.rule,regex_history:0
-msgid "Regular Expression on Case History"
-msgstr "Expresiones Regulares en el Historial del Caso"
-
-#. module: crm
-#: code:addons/crm/crm_lead.py:209
-#, python-format
-msgid "The lead '%s' has been opened."
-msgstr "La iniciativa '%s' ha sido abierta."
+#: help:crm.case.section,change_responsible:0
+msgid ""
+"When escalating to this team override the salesman with the team leader."
+msgstr ""
+"Al escalar a este equipo sobreescribir al comercial con el jefe de equipo."
#. module: crm
#: model:process.transition,name:crm.process_transition_opportunitymeeting0
@@ -414,55 +380,66 @@ msgid "When a real project/opportunity is detected"
msgstr "Cuando un proyecto/oportunidad real es detectado"
#. module: crm
-#: field:crm.installer,crm_fundraising:0
-msgid "Fundraising"
-msgstr "Recaudación de fondos"
-
-#. module: crm
-#: view:res.partner:0
#: field:res.partner,opportunity_ids:0
msgid "Leads and Opportunities"
msgstr "Iniciativas y oportunidades"
#. module: crm
-#: view:crm.send.mail:0
-msgid "_Send"
-msgstr "_Enviar"
+#: model:ir.actions.act_window,help:crm.relate_partner_opportunities
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create an opportunity related to this customer.\n"
+" </p><p>\n"
+" Use opportunities to keep track of your sales pipeline, "
+"follow\n"
+" up potential sales and better forecast your future "
+"revenues.\n"
+" </p><p>\n"
+" You will be able to plan meetings and phone calls from\n"
+" opportunities, convert them into quotations, attach related\n"
+" documents, track all discussions, and much more.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+"Pulse para crear una oportunidad relacionada con este cliente.\n"
+"</p><p>\n"
+"Use las oportunidades para seguir la pista al flujo de sus ventas, seguir "
+"una venta potencial y prever mejor sus futuros ingresos.\n"
+"</p><p>\n"
+"Podrá planificar reuniones y llamadas telefónicas desde las oportunidades, "
+"convertirlas en ofertas, adjuntar documentos relacionados, rastrear todas "
+"las discusiones, y mucho más.\n"
+"</p>\n"
+" "
#. module: crm
+#: model:crm.case.stage,name:crm.stage_lead7
#: view:crm.lead:0
-msgid "Communication"
-msgstr "Comunicación"
+msgid "Dead"
+msgstr "Muerta"
#. module: crm
-#: field:crm.case.section,change_responsible:0
-msgid "Change Responsible"
-msgstr "Cambiar responsable"
-
-#. module: crm
-#: field:crm.merge.opportunity,state:0
-msgid "Set State To"
-msgstr "Cmabiar estado a"
+#: field:crm.case.section,message_unread:0
+#: view:crm.lead:0
+#: field:crm.lead,message_unread:0
+#: field:crm.phonecall,message_unread:0
+msgid "Unread Messages"
+msgstr "Mensajes sin leer"
#. module: crm
-#: model:ir.actions.act_window,help:crm.crm_case_categ_phone_outgoing0
-msgid ""
-"Outbound Calls list all the calls to be done by your sales team. A salesman "
-"can record the information about the call in the form view. This information "
-"will be stored in the partner form to trace every contact you have with a "
-"customer. You can also import a .CSV file with a list of calls to be done by "
-"your sales team."
-msgstr ""
-"Llamadas salientes muestra todas las llamadas realizadas por su equipo de "
-"ventas. Un vendedor puede grabar la información sobre la llamada en la vista "
-"de formulario. Esta información se almacenará en el formulario de empresa "
-"para rastrear cada contacto que tenga con un cliente. También puede importar "
-"un archivo .CSV con una lista de llamadas a realizar por su equipo de ventas."
+#: view:crm.segmentation:0
+#: field:crm.segmentation.line,segmentation_id:0
+#: model:ir.actions.act_window,name:crm.crm_segmentation-act
+msgid "Segmentation"
+msgstr "Segmentación"
#. module: crm
-#: model:ir.model,name:crm.model_crm_lead2opportunity_action
-msgid "Convert/Merge Opportunity"
-msgstr "Convertir/Fusionar oportunidad"
+#: selection:crm.lead2opportunity.partner,action:0
+#: selection:crm.lead2opportunity.partner.mass,action:0
+#: selection:crm.partner.binding,action:0
+msgid "Link to an existing customer"
+msgstr "Enlace a cliente existente"
#. module: crm
#: field:crm.lead,write_date:0
@@ -470,19 +447,24 @@ msgid "Update Date"
msgstr "Actualizar fecha"
#. module: crm
-#: view:crm.lead2opportunity.action:0
-#: field:crm.lead2opportunity.action,name:0
-msgid "Select Action"
-msgstr "Seleccionar acción"
+#: field:crm.case.section,user_id:0
+msgid "Team Leader"
+msgstr "Jefe de equipo"
+
+#. module: crm
+#: help:crm.case.stage,probability:0
+msgid ""
+"This percentage depicts the default/average probability of the Case for this "
+"stage to be a success"
+msgstr ""
+"Este porcentaje representa la probabilidad por defecto / media para que los "
+"casos de esta etapa sean un éxito."
#. module: crm
-#: field:base.action.rule,trg_categ_id:0
#: view:crm.lead:0
-#: field:crm.lead,categ_id:0
-#: view:crm.lead.report:0
-#: field:crm.lead.report,categ_id:0
#: field:crm.opportunity2phonecall,categ_id:0
#: field:crm.phonecall,categ_id:0
+#: view:crm.phonecall.report:0
#: field:crm.phonecall.report,categ_id:0
#: field:crm.phonecall2phonecall,categ_id:0
msgid "Category"
@@ -494,49 +476,45 @@ msgid "#Opportunities"
msgstr "# Oportunidades"
#. module: crm
-#: model:crm.case.resource.type,name:crm.type_oppor2
-msgid "Campaign 1"
-msgstr "Campaña 1"
-
-#. module: crm
-#: model:crm.case.resource.type,name:crm.type_oppor1
-msgid "Campaign 2"
-msgstr "Campaña 2"
-
-#. module: crm
-#: view:crm.meeting:0
-msgid "Privacy"
-msgstr "Privada"
-
-#. module: crm
-#: view:crm.lead.report:0
-msgid "Opportunity Analysis"
-msgstr "Análisis de oportunidades"
-
-#. module: crm
-#: help:crm.meeting,location:0
-msgid "Location of Event"
-msgstr "Lacalización del evento"
-
-#. module: crm
-#: field:crm.meeting,rrule:0
-msgid "Recurrent Rule"
-msgstr "Regla recurrente"
+#: code:addons/crm/crm_lead.py:624
+#, python-format
+msgid ""
+"Please select more than one element (lead or opportunity) from the list view."
+msgstr ""
+"Seleccione por favor más de un elemento (iniciativa u oportunidad) desde la "
+"vista lista."
#. module: crm
-#: model:crm.case.resource.type,name:crm.type_lead1
-msgid "Version 4.2"
-msgstr "Versión 4.2"
+#: view:crm.lead:0
+msgid "Leads that are assigned to one of the sale teams I manage, or to me"
+msgstr ""
+"Iniciativas asignadas a uno de los equipos que gestiono, o a mí mismo"
#. module: crm
-#: model:crm.case.resource.type,name:crm.type_lead2
-msgid "Version 4.4"
-msgstr "Versión 4.4"
+#: field:crm.lead,partner_address_email:0
+msgid "Partner Contact Email"
+msgstr "Email de contacto de la empresa"
#. module: crm
-#: help:crm.installer,fetchmail:0
-msgid "Allows you to receive E-Mails from POP/IMAP server."
-msgstr "Le permite recibir e-mails desde un servidor POP/IMAP"
+#: model:ir.actions.act_window,help:crm.crm_case_section_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to define a new sales team.\n"
+" </p><p>\n"
+" Use sales team to organize your different salespersons or\n"
+" departments into separate teams. Each team will work in\n"
+" its own list of opportunities.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+"Pulse para definir un nuevo equipo de ventas.\n"
+"</p><p>\n"
+"Use los equipos de venta para organizar a los diferentes comerciales o "
+"departamentos en equipos separados. Cada equipo trabajará en su propia lista "
+"de oportunidades.\n"
+"</p>\n"
+" "
#. module: crm
#: model:process.transition,note:crm.process_transition_opportunitymeeting0
@@ -544,45 +522,42 @@ msgid "Normal or phone meeting for opportunity"
msgstr "Oportunidad de reunion normal ó telefonico."
#. module: crm
-#: model:process.node,note:crm.process_node_leads0
-msgid "Very first contact with new prospect"
-msgstr "Primer contacto con nueva prospección"
+#: field:crm.lead,state:0
+#: field:crm.lead.report,state:0
+#: field:crm.phonecall,state:0
+#: view:crm.phonecall.report:0
+#: field:crm.phonecall.report,state:0
+msgid "Status"
+msgstr "Estado"
#. module: crm
-#: code:addons/crm/crm_lead.py:278
-#: code:addons/crm/wizard/crm_lead_to_opportunity.py:197
-#: code:addons/crm/wizard/crm_lead_to_opportunity.py:231
-#: code:addons/crm/wizard/crm_lead_to_opportunity.py:299
-#: view:crm.lead2opportunity:0
-#: view:crm.partner2opportunity:0
-#: model:ir.actions.act_window,name:crm.action_crm_lead2opportunity
-#: model:ir.actions.act_window,name:crm.action_view_crm_partner2opportunity
-#: model:ir.actions.act_window,name:crm.crm_partner2opportunity
-#, python-format
+#: view:crm.lead2opportunity.partner:0
msgid "Create Opportunity"
msgstr "Crear oportunidad"
#. module: crm
-#: view:crm.installer:0
+#: view:sale.config.settings:0
msgid "Configure"
msgstr "Configurar"
#. module: crm
-#: code:addons/crm/crm.py:378
#: view:crm.lead:0
-#: view:res.partner:0
-#, python-format
msgid "Escalate"
msgstr "Escalado"
#. module: crm
-#: model:ir.module.module,shortdesc:crm.module_meta_information
-msgid "Customer & Supplier Relationship Management"
-msgstr "Gestión de relaciones con clientes & proveedores"
+#: view:crm.lead:0
+msgid "Mailings"
+msgstr "Mailings"
#. module: crm
-#: selection:crm.lead.report,month:0
-#: selection:crm.meeting,month_list:0
+#: model:mail.message.subtype,description:crm.mt_lead_stage
+msgid "Stage changed"
+msgstr "Etapa cambiada"
+
+#. module: crm
+#: selection:crm.lead.report,creation_month:0
+#: selection:crm.lead.report,deadline_month:0
#: selection:crm.phonecall.report,month:0
msgid "June"
msgstr "Junio"
@@ -593,29 +568,18 @@ msgid "Not Running"
msgstr "No ejecutado"
#. module: crm
-#: view:crm.send.mail:0
-#: model:ir.actions.act_window,name:crm.action_crm_reply_mail
-msgid "Reply to last Mail"
-msgstr "Responder al último e-mail"
-
-#. module: crm
-#: field:crm.lead,email:0
-msgid "E-Mail"
-msgstr "E-mail"
-
-#. module: crm
-#: field:crm.installer,wiki_sale_faq:0
-msgid "Sale FAQ"
-msgstr "FAQ de ventas"
+#: field:crm.lead.report,planned_revenue:0
+msgid "Planned Revenue"
+msgstr "Ingresos previstos"
#. module: crm
-#: model:ir.model,name:crm.model_crm_send_mail_attachment
-msgid "crm.send.mail.attachment"
-msgstr "crm.enviar.mail.adjunto"
+#: field:crm.lead,planned_revenue:0
+msgid "Expected Revenue"
+msgstr "Ingreso estimado"
#. module: crm
-#: selection:crm.lead.report,month:0
-#: selection:crm.meeting,month_list:0
+#: selection:crm.lead.report,creation_month:0
+#: selection:crm.lead.report,deadline_month:0
#: selection:crm.phonecall.report,month:0
msgid "October"
msgstr "Octubre"
@@ -626,42 +590,35 @@ msgid "Included Answers :"
msgstr "Respuestas incluidas:"
#. module: crm
-#: help:crm.meeting,email_from:0
-#: help:crm.phonecall,email_from:0
-msgid "These people will receive email."
-msgstr "Estas personas recibirán un email."
+#: help:crm.phonecall,state:0
+msgid ""
+"The status is set to 'Todo', when a case is created. "
+" If the case is in progress the status is set to 'Open'. "
+" When the call is over, the status is set to 'Held'. "
+" If the call needs to be done then the status is set "
+"to 'Not Held'."
+msgstr ""
+"El estado se establece a 'Para hacer', cuando un caso es creado. Si el caso "
+"está en progreso el estado se establece a 'Abierto'. Cuando la llamada "
+"finaliza, el estado se establece a 'Realizada'. si la llamada requiere ser "
+"realizada entonces el estado se establece a 'No realizada'"
#. module: crm
-#: view:crm.meeting:0
-#: field:crm.meeting,name:0
+#: field:crm.case.section,message_summary:0
+#: field:crm.lead,message_summary:0
+#: field:crm.phonecall,message_summary:0
msgid "Summary"
msgstr "Resumen"
#. module: crm
-#: view:crm.segmentation:0
-msgid "State of Mind Computation"
-msgstr "Cálculo grado de satisfacción"
-
-#. module: crm
-#: help:crm.case.section,change_responsible:0
-msgid ""
-"Thick this box if you want that on escalation, the responsible of this sale "
-"team automatically becomes responsible of the lead/opportunity escaladed"
-msgstr ""
-"Marque esta opción si quiere que el responsable del equipo de ventas sea "
-"automáticamente responsable de la iniciativa/oportunidad, en caso de ser "
-"escalada."
+#: view:crm.merge.opportunity:0
+msgid "Merge"
+msgstr "Fusionar"
#. module: crm
-#: help:crm.installer,outlook:0
-#: help:crm.installer,thunderbird:0
-msgid ""
-"Allows you to link your e-mail to OpenERP's documents. You can attach it to "
-"any existing one in OpenERP or create a new one."
-msgstr ""
-"Permite enlazar su e-mail a la gestión documental de OpenERP. Puede "
-"adjuntarlo a cualquier documento ya existente en OpenERP o crear uno de "
-"nuevo."
+#: model:email.template,subject:crm.email_template_opportunity_mail
+msgid "Opportunity ${object.name | h})"
+msgstr "Oportunidad ${object.name | h})"
#. module: crm
#: view:crm.case.categ:0
@@ -669,24 +626,18 @@ msgid "Case Category"
msgstr "Categoría del caso"
#. module: crm
-#: help:crm.segmentation,som_interval_default:0
-msgid ""
-"Default state of mind for period preceeding the 'Max Interval' computation. "
-"This is the starting state of mind by default if the partner has no event."
-msgstr ""
-"Grado de satisfacción por defecto para el período que precede el cálculo de "
-"'Intervalo máx.'. Este es el grado de satisfacción inicial por defecto si la "
-"empresa no tiene ningún evento."
+#: field:crm.lead,partner_address_name:0
+msgid "Partner Contact Name"
+msgstr "Nombre contacto de empresa"
#. module: crm
-#: selection:crm.meeting,end_type:0
-msgid "End date"
-msgstr "Fecha de fin"
-
-#. module: crm
-#: constraint:base.action.rule:0
-msgid "Error: The mail is not well formated"
-msgstr "Error: El email no está bien formateado"
+#: model:ir.actions.server,subject:crm.action_email_reminder_lead
+msgid ""
+"Reminder on Lead: [[object.id ]] [[object.partner_id and 'of ' "
+"+object.partner_id.name or '']]"
+msgstr ""
+"Recordatorio en iniciativa: [[object.id ]] [[object.partner_id and 'of ' "
+"+object.partner_id.name or '']]"
#. module: crm
#: view:crm.segmentation:0
@@ -699,46 +650,41 @@ msgid "#Phone calls"
msgstr "#Llamadas telefónicas"
#. module: crm
-#: help:crm.segmentation,categ_id:0
-msgid ""
-"The partner category that will be added to partners that match the "
-"segmentation criterions after computation."
-msgstr ""
-"La categoría de empresas que será añadida a las empresas que cumplan los "
-"criterios de segmentación después del cálculo."
+#: sql_constraint:crm.case.section:0
+msgid "The code of the sales team must be unique !"
+msgstr "¡El código del equipo de ventas debe ser único!"
+
+#. module: crm
+#: help:crm.lead,email_from:0
+msgid "Email address of the contact"
+msgstr "Dirección de email del contacto"
#. module: crm
+#: selection:crm.case.stage,state:0
#: view:crm.lead:0
-msgid "Communication history"
-msgstr "Historial de comunicación"
+#: selection:crm.lead,state:0
+msgid "In Progress"
+msgstr "En Proceso"
#. module: crm
-#: help:crm.phonecall,canal_id:0
+#: model:ir.actions.act_window,help:crm.crm_phonecall_categ_action
msgid ""
-"The channels represent the different communication "
-"modes available with the customer. With each commercial opportunity, you can "
-"indicate the canall which is this opportunity source."
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a new category.\n"
+" </p><p>\n"
+" Create specific phone call categories to better define the type "
+"of\n"
+" calls tracked in the system.\n"
+" </p>\n"
+" "
msgstr ""
-"Los canales representan los diferentes modos de comunicación posibles con el "
-"cliente. En cada oportunidad comercial, puede indicar el canal que ha sido "
-"el origen de esta oportunidad."
-
-#. module: crm
-#: code:addons/crm/crm_meeting.py:93
-#, python-format
-msgid "The meeting '%s' has been confirmed."
-msgstr "La reunión '%s' ha sido confirmada"
-
-#. module: crm
-#: field:crm.case.section,user_id:0
-msgid "Responsible User"
-msgstr "Usuario responsable"
-
-#. module: crm
-#: code:addons/crm/wizard/crm_phonecall_to_partner.py:53
-#, python-format
-msgid "A partner is already defined on this phonecall."
-msgstr "Una empresa ya esta definida para esta llamada."
+"<p class=\"oe_view_nocontent_create\">\n"
+"Pulse para añadir una nueva categoría.\n"
+"</p><p>\n"
+"Cree categorías específicas de llamadas telefónicas para definir mejor el "
+"tipo de llamadas registradas en el sistema.\n"
+"</p>\n"
+" "
#. module: crm
#: help:crm.case.section,reply_to:0
@@ -751,21 +697,13 @@ msgstr ""
"ventas."
#. module: crm
-#: view:res.users:0
-msgid "Current Activity"
-msgstr "Actividad actual"
-
-#. module: crm
-#: help:crm.meeting,exrule:0
-msgid ""
-"Defines a rule or repeating pattern of time to exclude from the recurring "
-"rule."
-msgstr ""
-"Define una regla o patrón de repetición de tiempo a excluir de la regla "
-"recurrente."
+#: field:crm.lead.report,creation_month:0
+msgid "Creation Month"
+msgstr "Mes de creación"
#. module: crm
#: field:crm.case.section,resource_calendar_id:0
+#: model:ir.ui.menu,name:crm.menu_action_resource_calendar_form
msgid "Working Time"
msgstr "Horario de trabajo"
@@ -775,33 +713,10 @@ msgid "Partner Segmentation Lines"
msgstr "Líneas de segmentación de empresa"
#. module: crm
-#: view:crm.lead:0
-#: view:crm.meeting:0
-msgid "Details"
-msgstr "Detalles"
-
-#. module: crm
-#: help:crm.installer,crm_caldav:0
-msgid ""
-"Helps you to synchronize the meetings with other calendar clients and "
-"mobiles."
-msgstr ""
-"Le permite sincronizar las reuniones con otros clientes de calendario y "
-"móviles."
-
-#. module: crm
-#: selection:crm.meeting,freq:0
-msgid "Years"
-msgstr "Años"
-
-#. module: crm
-#: help:crm.installer,crm_claim:0
-msgid ""
-"Manages the suppliers and customers claims, including your corrective or "
-"preventive actions."
-msgstr ""
-"Gestiona las reclamaciones de clientes y proveedores, incluyendo acciones "
-"correctivas o preventivas"
+#: model:ir.actions.act_window,name:crm.action_report_crm_phonecall
+#: model:ir.ui.menu,name:crm.menu_report_crm_phonecalls_tree
+msgid "Phone Calls Analysis"
+msgstr "Análisis de llamadas"
#. module: crm
#: view:crm.lead:0
@@ -815,43 +730,55 @@ msgid "Partner Segmentation"
msgstr "Segmentación de empresa"
#. module: crm
+#: field:crm.lead,company_currency:0
+msgid "Currency"
+msgstr "Moneda"
+
+#. module: crm
#: field:crm.lead.report,probable_revenue:0
msgid "Probable Revenue"
msgstr "Ingreso estimado"
#. module: crm
+#: help:crm.lead.report,creation_month:0
+msgid "Creation month"
+msgstr "Mes de creación"
+
+#. module: crm
#: help:crm.segmentation,name:0
msgid "The name of the segmentation."
msgstr "El nombre de la segmentación."
#. module: crm
#: field:crm.case.stage,probability:0
-#: field:crm.lead,probability:0
msgid "Probability (%)"
msgstr "Probabilidad (%)"
#. module: crm
+#: sql_constraint:crm.lead:0
+msgid "The probability of closing the deal should be between 0% and 100%!"
+msgstr "¡La probabilidad de cierre debería estar entre 0% y 100%!"
+
+#. module: crm
#: view:crm.lead:0
msgid "Leads Generation"
msgstr "Generación de iniciativas"
#. module: crm
#: view:board.board:0
-#: model:ir.ui.menu,name:crm.menu_board_statistics_dash
msgid "Statistics Dashboard"
msgstr "Tablero de estadísticas"
#. module: crm
-#: code:addons/crm/wizard/crm_lead_to_opportunity.py:88
-#: code:addons/crm/wizard/crm_lead_to_opportunity.py:98
-#: code:addons/crm/wizard/crm_partner_to_opportunity.py:101
-#: code:addons/crm/wizard/crm_phonecall_to_opportunity.py:117
+#: code:addons/crm/crm_lead.py:861
+#: model:crm.case.stage,name:crm.stage_lead2
+#: selection:crm.case.stage,type:0
#: view:crm.lead:0
#: selection:crm.lead,type:0
+#: view:crm.lead.report:0
#: selection:crm.lead.report,type:0
-#: field:crm.lead2opportunity,name:0
#: field:crm.meeting,opportunity_id:0
-#: field:crm.phonecall,opportunity_id:0
+#: field:res.partner,opportunity_count:0
#, python-format
msgid "Opportunity"
msgstr "Oportunidad"
@@ -862,9 +789,14 @@ msgid "Television"
msgstr "Televisión"
#. module: crm
-#: field:crm.installer,crm_caldav:0
-msgid "Calendar Synchronizing"
-msgstr "Sincronización del calendario"
+#: model:ir.actions.act_window,name:crm.action_crm_send_mass_convert
+msgid "Convert to opportunities"
+msgstr "Convertir a oportunidad"
+
+#. module: crm
+#: model:ir.model,name:crm.model_sale_config_settings
+msgid "sale.config.settings"
+msgstr "sale.config.settings"
#. module: crm
#: view:crm.segmentation:0
@@ -872,124 +804,52 @@ msgid "Stop Process"
msgstr "Parar el proceso"
#. module: crm
+#: field:crm.case.section,alias_id:0
+msgid "Alias"
+msgstr "Alias"
+
+#. module: crm
#: view:crm.phonecall:0
msgid "Search Phonecalls"
msgstr "Buscar llamadas"
#. module: crm
-#: view:crm.lead2opportunity.partner:0
-#: view:crm.lead2partner:0
-#: view:crm.phonecall2partner:0
-msgid "Continue"
-msgstr "Siguiente"
-
-#. module: crm
-#: field:crm.segmentation,som_interval:0
-msgid "Days per Period"
-msgstr "Días por período"
-
-#. module: crm
-#: field:crm.meeting,byday:0
-msgid "By day"
-msgstr "Por día"
-
-#. module: crm
-#: field:base.action.rule,act_section_id:0
-msgid "Set Team to"
-msgstr "Establecer equipo a"
+#: view:crm.lead.report:0
+msgid ""
+"Leads/Opportunities that are assigned to one of the sale teams I manage"
+msgstr ""
+"Iniciativas/Oportunidades que están asignadas a uno de los equipos de venta "
+"que gestiono"
#. module: crm
-#: view:calendar.attendee:0
#: field:calendar.attendee,categ_id:0
msgid "Event Type"
msgstr "Tipo de evento"
#. module: crm
-#: model:ir.model,name:crm.model_crm_installer
-msgid "crm.installer"
-msgstr "crm.instalador"
-
-#. module: crm
#: field:crm.segmentation,exclusif:0
msgid "Exclusive"
msgstr "Exclusivo"
#. module: crm
-#: code:addons/crm/crm_opportunity.py:91
+#: code:addons/crm/crm_lead.py:584
#, python-format
-msgid "The opportunity '%s' has been won."
-msgstr "La oportunidad '%s' ha sido ganada"
+msgid "From %s : %s"
+msgstr "De %s : %s"
#. module: crm
-#: help:crm.meeting,alarm_id:0
-msgid "Set an alarm at this time, before the event occurs"
-msgstr "Configure una alarma en este momento, antes de que ocurra el evento"
+#: view:crm.lead2opportunity.partner.mass:0
+msgid "Convert to Opportunities"
+msgstr "Convertir a oportunidad"
#. module: crm
-#: model:ir.module.module,description:crm.module_meta_information
-msgid ""
-"The generic OpenERP Customer Relationship Management\n"
-"system enables a group of people to intelligently and efficiently manage\n"
-"leads, opportunities, meeting, phonecall etc.\n"
-"It manages key tasks such as communication, identification, prioritization,\n"
-"assignment, resolution and notification.\n"
-"\n"
-"OpenERP ensures that all cases are successfully tracked by users, customers "
-"and\n"
-"suppliers. It can automatically send reminders, escalate the request, "
-"trigger\n"
-"specific methods and lots of other actions based on your own enterprise "
-"rules.\n"
-"\n"
-"The greatest thing about this system is that users don't need to do "
-"anything\n"
-"special. They can just send email to the request tracker. OpenERP will take\n"
-"care of thanking them for their message, automatically routing it to the\n"
-"appropriate staff, and make sure all future correspondence gets to the "
-"right\n"
-"place.\n"
-"\n"
-"The CRM module has a email gateway for the synchronisation interface\n"
-"between mails and OpenERP. \n"
-"Create dashboard for CRM that includes:\n"
-" * My Leads (list)\n"
-" * Leads by Stage (graph)\n"
-" * My Meetings (list)\n"
-" * Sales Pipeline by Stage (graph)\n"
-" * My Cases (list)\n"
-" * Jobs Tracking (graph)\n"
-msgstr ""
-"El sistema genérico de gestión de relaciones con el cliente de OpenERP\n"
-"permite a un grupo de gente manejar de forma inteligente y eficiente\n"
-"iniciativas, oportunidades, reuniones, llamadas, etc.\n"
-"Maneja tareas clave como la comunicación, identificación, priorización,\n"
-"asignación, resolución y notificación.\n"
-"\n"
-"OpenERP se asegura de que todos los casos son seguidos por los usuarios, "
-"clientes y\n"
-"proveedores. Puede enviar automáticamente recordatorios, escalar la "
-"petición, disparar\n"
-"métodos específicos y muchas otras acciones basadas en las reglas de su "
-"empresa.\n"
-"\n"
-"Lo mejor de este sistema es que los usuarios no necesitan hacer nada \n"
-"especial. Tan sólo tienen que enviar un correo electrónico al gestor de "
-"seguimientos. \n"
-"OpenERP le agradecerá su mensaje, enrutándolo automáticamente a la \n"
-"persona adecuada, asegurándose de que toda la correspondencia futura llegue "
-"al\n"
-"lugar correcto.\n"
-"\n"
-"El módulo CRM tiene una pasarela de correo para el interfaz de "
-"sincronización\n"
-"entre correos electrónicos y OpenERP. \n"
-"Cree tableros para el CRM que incluyan:\n"
-" *Mis iniciativas(lista)\n"
-" *Iniciativas por etapa (gráfico)\n"
-" *Mis reuniones (lista)\n"
-" *Proceso de ventas por etapa (gráfico)\n"
-" *Mis casos (lista)\n"
-" *Seguimiento de trabajos (gráfico)\n"
+#: view:crm.lead2opportunity.partner:0
+#: view:crm.lead2opportunity.partner.mass:0
+#: view:crm.merge.opportunity:0
+#: view:crm.opportunity2phonecall:0
+#: view:crm.phonecall2phonecall:0
+msgid "or"
+msgstr "o"
#. module: crm
#: field:crm.lead.report,create_date:0
@@ -1003,9 +863,13 @@ msgid "Reference 2"
msgstr "Referencia 2"
#. module: crm
-#: view:crm.segmentation:0
-msgid "Sales Purchase"
-msgstr "Compra Ventas"
+#: help:crm.case.stage,section_ids:0
+msgid ""
+"Link between stages and sales teams. When set, this limitate the current "
+"stage to the selected sales teams."
+msgstr ""
+"Enlace entre etapas y equipos de ventas. Cuando se asigna, las etapas están "
+"limitadas al equipo de venta seleccionado."
#. module: crm
#: view:crm.case.stage:0
@@ -1014,31 +878,25 @@ msgid "Requirements"
msgstr "Requerimientos"
#. module: crm
-#: help:crm.meeting,exdate:0
-msgid ""
-"This property defines the list of date/time exceptions for a recurring "
-"calendar component."
-msgstr ""
-"Esta propiedad define la lista de excepciones de fecha/hora para un evento "
-"de calendario recurrente."
-
-#. module: crm
-#: view:crm.phonecall2opportunity:0
-msgid "Convert To Opportunity "
-msgstr "Convertir a oportunidad "
+#: field:crm.lead,zip:0
+msgid "Zip"
+msgstr "Código postal"
#. module: crm
-#: help:crm.case.stage,sequence:0
-msgid "Gives the sequence order when displaying a list of case stages."
-msgstr ""
-"Indica el orden de secuencia cuando se muestra un lista de etapas de casos."
+#: view:crm.phonecall:0
+msgid "Unassigned Phonecalls"
+msgstr "Llamadas sin asignar"
#. module: crm
#: view:crm.lead:0
-#: field:crm.merge.opportunity,opportunity_ids:0
+#: view:crm.lead2opportunity.partner:0
+#: field:crm.lead2opportunity.partner,opportunity_ids:0
+#: field:crm.lead2opportunity.partner.mass,opportunity_ids:0
#: model:ir.actions.act_window,name:crm.crm_case_category_act_oppor11
-#: model:ir.ui.menu,name:crm.menu_crm_case_opp
+#: model:ir.actions.act_window,name:crm.relate_partner_opportunities
+#: model:ir.ui.menu,name:crm.menu_crm_opportunities
#: model:process.node,name:crm.process_node_opportunities0
+#: view:res.partner:0
msgid "Opportunities"
msgstr "Oportunidades"
@@ -1048,20 +906,19 @@ msgid "Partner Category"
msgstr "Categoría de empresa"
#. module: crm
-#: view:crm.add.note:0
-#: model:ir.actions.act_window,name:crm.action_crm_add_note
-msgid "Add Note"
-msgstr "Añadir nota"
+#: field:crm.lead,probability:0
+msgid "Success Rate (%)"
+msgstr "Tasa de éxito (%)"
#. module: crm
-#: field:crm.lead,is_supplier_add:0
-msgid "Supplier"
-msgstr "Proveedor"
+#: field:crm.segmentation,sales_purchase_active:0
+msgid "Use The Sales Purchase Rules"
+msgstr "Utiliza las reglas de compra ventas"
#. module: crm
-#: help:crm.send.mail,reply_to:0
-msgid "Reply-to of the Sales team defined on this case"
-msgstr "\"Responder a\" del equipo de ventas definido en este caso"
+#: model:crm.case.categ,name:crm.categ_phone2
+msgid "Outbound"
+msgstr "Saliente"
#. module: crm
#: view:crm.lead:0
@@ -1069,9 +926,9 @@ msgid "Mark Won"
msgstr "Marcar ganado"
#. module: crm
-#: selection:crm.segmentation.line,expr_name:0
-msgid "Purchase Amount"
-msgstr "Importe de compra"
+#: model:ir.filters,name:crm.filter_usa_lead
+msgid "Leads from USA"
+msgstr "Iniciativas de EEUU"
#. module: crm
#: view:crm.lead:0
@@ -1079,17 +936,27 @@ msgid "Mark Lost"
msgstr "Marcar perdido"
#. module: crm
-#: selection:crm.lead.report,month:0
-#: selection:crm.meeting,month_list:0
+#: model:ir.filters,name:crm.filter_draft_lead
+msgid "Draft Leads"
+msgstr "Iniciativas borrador"
+
+#. module: crm
+#: selection:crm.lead.report,creation_month:0
+#: selection:crm.lead.report,deadline_month:0
#: selection:crm.phonecall.report,month:0
msgid "March"
msgstr "Marzo"
#. module: crm
-#: code:addons/crm/crm_lead.py:230
+#: view:crm.lead:0
+msgid "Send Email"
+msgstr "Enviar correo"
+
+#. module: crm
+#: code:addons/crm/wizard/crm_lead_to_opportunity.py:89
#, python-format
-msgid "The opportunity '%s' has been closed."
-msgstr "La oportunidad '%s' ha sido cerrada"
+msgid "Warning !"
+msgstr "Advertencia !"
#. module: crm
#: field:crm.lead,day_open:0
@@ -1097,116 +964,56 @@ msgid "Days to Open"
msgstr "Días para abrir"
#. module: crm
-#: view:crm.meeting:0
-msgid "Show Time as"
-msgstr "Mostrar hora como"
-
-#. module: crm
-#: code:addons/crm/crm_lead.py:264
-#: view:crm.phonecall2partner:0
-#, python-format
-msgid "Create Partner"
-msgstr "Crear empresa"
-
-#. module: crm
-#: selection:crm.segmentation.line,expr_operator:0
-msgid "<"
-msgstr "<"
-
-#. module: crm
#: field:crm.lead,mobile:0
#: field:crm.phonecall,partner_mobile:0
msgid "Mobile"
msgstr "Móvil"
#. module: crm
-#: field:crm.meeting,end_type:0
-msgid "Way to end reccurency"
-msgstr "Forma de terminar recurrencia"
+#: field:crm.lead,ref:0
+msgid "Reference"
+msgstr "Referencia"
#. module: crm
-#: code:addons/crm/wizard/crm_merge_opportunities.py:53
-#, python-format
+#: view:crm.lead:0
msgid ""
-"There are no other 'Open' or 'Pending' Opportunities for the partner '%s'."
+"Opportunities that are assigned to either me or one of the sale teams I "
+"manage"
msgstr ""
-"No existen más oportunidades 'Abiertas' o 'Pendientes' para la empresa '%s'."
+"Oportunidades que están asignadas a mi o a uno de los equipos que gestiono"
#. module: crm
-#: view:crm.lead:0
-msgid "Next Stage"
-msgstr "Siguiente etapa"
+#: help:crm.case.section,resource_calendar_id:0
+msgid "Used to compute open days"
+msgstr "Utilizado para cálculo de días abiertos"
#. module: crm
-#: view:board.board:0
-msgid "My Meetings"
-msgstr "Mis reuniones"
-
-#. module: crm
-#: field:crm.lead,ref:0
-msgid "Reference"
-msgstr "Referencia"
-
-#. module: crm
-#: field:crm.lead,optin:0
-msgid "Opt-In"
-msgstr "Acepta recibir emails"
-
-#. module: crm
-#: code:addons/crm/crm_opportunity.py:208
-#: code:addons/crm/crm_phonecall.py:185
-#: code:addons/crm/wizard/crm_phonecall_to_meeting.py:55
-#: code:addons/crm/wizard/crm_phonecall_to_meeting.py:137
-#: view:crm.meeting:0
#: model:ir.actions.act_window,name:crm.act_crm_opportunity_crm_meeting_new
-#: model:ir.actions.act_window,name:crm.crm_case_categ_meet
-#: model:ir.ui.menu,name:crm.menu_crm_case_categ_meet
-#: model:ir.ui.menu,name:crm.menu_meeting_sale
+#: model:ir.actions.act_window,name:crm.crm_meeting_partner
#: view:res.partner:0
#: field:res.partner,meeting_ids:0
-#, python-format
msgid "Meetings"
msgstr "Reuniones"
#. module: crm
-#: view:crm.meeting:0
-msgid "Choose day where repeat the meeting"
-msgstr "Eligir día en el que repetir la cita"
-
-#. module: crm
#: field:crm.lead,date_action_next:0
#: field:crm.lead,title_action:0
-#: field:crm.meeting,date_action_next:0
#: field:crm.phonecall,date_action_next:0
msgid "Next Action"
msgstr "Acción siguiente"
#. module: crm
-#: field:crm.meeting,end_date:0
-msgid "Repeat Until"
-msgstr "Repetir hasta"
-
-#. module: crm
-#: field:crm.meeting,date_deadline:0
-msgid "Deadline"
-msgstr "Fecha límite"
-
-#. module: crm
-#: help:crm.meeting,active:0
-msgid ""
-"If the active field is set to true, it will allow you to hide the "
-"event alarm information without removing it."
-msgstr ""
-"Si el campo activo se establece en verdadero, se omitirá la alarma del "
-"evento, sin embargo no se eliminará."
+#: code:addons/crm/crm_lead.py:763
+#, python-format
+msgid "<b>Partner</b> set to <em>%s</em>."
+msgstr "<b>Empresa</b> establecida a <em>%s</em>."
#. module: crm
-#: code:addons/crm/wizard/crm_phonecall_to_opportunity.py:57
-#, python-format
-msgid "Closed/Cancelled Phone Call Could not convert into Opportunity"
-msgstr ""
-"Las llamadas telefónicas cerradas/canceladas no podrían ser convertidas en "
-"oportunidades"
+#: selection:crm.lead.report,state:0
+#: selection:crm.phonecall,state:0
+#: selection:crm.phonecall.report,state:0
+msgid "Draft"
+msgstr "Borrador"
#. module: crm
#: view:crm.segmentation:0
@@ -1214,44 +1021,36 @@ msgid "Partner Segmentations"
msgstr "Segmentaciones de empresa"
#. module: crm
-#: view:crm.meeting:0
-#: field:crm.meeting,user_id:0
-#: view:crm.phonecall:0
-#: field:crm.phonecall,user_id:0
-#: view:res.partner:0
-msgid "Responsible"
-msgstr "Responsable"
+#: view:crm.lead.report:0
+msgid "Show only opportunity"
+msgstr "Mostrar únicamente oportunidades"
#. module: crm
-#: view:res.partner:0
-msgid "Previous"
-msgstr "Anterior"
+#: field:crm.lead,name:0
+msgid "Subject"
+msgstr "Asunto"
#. module: crm
#: view:crm.lead:0
-msgid "Statistics"
-msgstr "Estadísticas"
-
-#. module: crm
-#: view:crm.meeting:0
-#: field:crm.send.mail,email_from:0
-msgid "From"
-msgstr "De"
+msgid "New Leads"
+msgstr "Nuevas iniciativas"
#. module: crm
-#: view:crm.lead2opportunity.action:0
-#: view:res.partner:0
-msgid "Next"
-msgstr "Siguiente"
+#: view:crm.lead:0
+msgid "Show Sales Team"
+msgstr "Mostrar equipo de ventas"
#. module: crm
-#: view:crm.lead:0
-msgid "Stage:"
-msgstr "Etapa:"
+#: help:sale.config.settings,module_crm_claim:0
+msgid ""
+"Allows you to track your customers/suppliers claims and grievances.\n"
+" This installs the module crm_claim."
+msgstr ""
+"Le permite rastrear las reclamaciones y quejas de sus clientes/proveedores.\n"
+"Esto instalará el módulo 'crm_claim'."
#. module: crm
-#: model:crm.case.stage,name:crm.stage_lead5
-#: model:crm.case.stage,name:crm.stage_opportunity5
+#: model:crm.case.stage,name:crm.stage_lead6
#: view:crm.lead:0
msgid "Won"
msgstr "Ganado"
@@ -1267,18 +1066,10 @@ msgid "Sales Department"
msgstr "Departamento de ventas"
#. module: crm
-#: field:crm.send.mail,html:0
-msgid "HTML formatting?"
-msgstr "Formato HTML?"
-
-#. module: crm
#: field:crm.case.stage,type:0
#: field:crm.lead,type:0
#: field:crm.lead.report,type:0
-#: view:crm.meeting:0
-#: view:crm.phonecall:0
-#: view:crm.phonecall.report:0
-#: view:res.partner:0
+#: view:crm.opportunity2phonecall:0
msgid "Type"
msgstr "Tipo"
@@ -1296,97 +1087,52 @@ msgid "Lowest"
msgstr "Muy bajo"
#. module: crm
-#: view:crm.add.note:0
-#: view:crm.send.mail:0
-#: field:crm.send.mail.attachment,binary:0
-msgid "Attachment"
-msgstr "Adjunto"
-
-#. module: crm
-#: selection:crm.lead.report,month:0
-#: selection:crm.meeting,month_list:0
-#: selection:crm.phonecall.report,month:0
-msgid "August"
-msgstr "Agosto"
-
-#. module: crm
-#: view:crm.lead:0
#: field:crm.lead,create_date:0
-#: field:crm.lead.report,creation_date:0
-#: field:crm.meeting,create_date:0
+#: view:crm.phonecall:0
#: field:crm.phonecall,create_date:0
#: field:crm.phonecall.report,creation_date:0
msgid "Creation Date"
msgstr "Fecha creación"
#. module: crm
-#: model:crm.case.categ,name:crm.categ_oppor5
-msgid "Need a Website Design"
-msgstr "Necesita un diseño de sitio web"
-
-#. module: crm
-#: field:crm.meeting,recurrent_uid:0
-msgid "Recurrent ID"
-msgstr "ID recurrente"
+#: code:addons/crm/crm_lead.py:698
+#, python-format
+msgid "Lead <b>converted into an Opportunity</b>"
+msgstr "Iniciativa <b>convertida a oportunidad</b>"
#. module: crm
-#: view:crm.lead:0
-#: view:crm.meeting:0
-#: field:crm.send.mail,subject:0
-#: view:res.partner:0
-msgid "Subject"
-msgstr "Asunto"
+#: selection:crm.segmentation.line,expr_name:0
+msgid "Purchase Amount"
+msgstr "Importe de compra"
#. module: crm
-#: field:crm.meeting,tu:0
-msgid "Tue"
-msgstr "Mar"
+#: view:crm.phonecall.report:0
+msgid "Year of call"
+msgstr "Año de la llamada"
#. module: crm
-#: code:addons/crm/crm_lead.py:300
#: view:crm.case.stage:0
#: view:crm.lead:0
#: field:crm.lead,stage_id:0
#: view:crm.lead.report:0
#: field:crm.lead.report,stage_id:0
-#, python-format
msgid "Stage"
msgstr "Etapa"
#. module: crm
-#: view:crm.lead:0
-msgid "History Information"
-msgstr "Histórico información"
-
-#. module: crm
-#: field:base.action.rule,act_mail_to_partner:0
-msgid "Mail to Partner"
-msgstr "Mail a la empresa"
-
-#. module: crm
-#: view:crm.lead:0
-msgid "Mailings"
-msgstr "Mailings"
-
-#. module: crm
-#: field:crm.meeting,class:0
-msgid "Mark as"
-msgstr "Marcar como"
-
-#. module: crm
-#: field:crm.meeting,count:0
-msgid "Repeat"
-msgstr "Repetir"
+#: view:crm.phonecall.report:0
+msgid "Phone Calls that are assigned to me"
+msgstr "Llamadas que están asignadas a mí"
#. module: crm
-#: help:crm.meeting,rrule_type:0
-msgid "Let the event automatically repeat at that interval"
-msgstr "Permite que el evento se repita en ese intervalo"
+#: field:crm.lead,user_login:0
+msgid "User Login"
+msgstr "Nombre de usuario"
#. module: crm
-#: view:base.action.rule:0
-msgid "Condition Case Fields"
-msgstr "Campos de condiciones de casos"
+#: view:crm.phonecall.report:0
+msgid "Phone calls which are in pending state"
+msgstr "Llamadas con estado pendiente"
#. module: crm
#: view:crm.case.section:0
@@ -1394,46 +1140,91 @@ msgstr "Campos de condiciones de casos"
#: view:crm.case.stage:0
#: model:ir.actions.act_window,name:crm.crm_case_stage_act
#: model:ir.actions.act_window,name:crm.crm_lead_stage_act
-#: model:ir.actions.act_window,name:crm.crm_opportunity_stage_act
#: model:ir.ui.menu,name:crm.menu_crm_lead_stage_act
-#: model:ir.ui.menu,name:crm.menu_crm_opportunity_stage_act
msgid "Stages"
msgstr "Etapas"
#. module: crm
-#: field:crm.lead,planned_revenue:0
-#: field:crm.lead2opportunity,planned_revenue:0
-#: field:crm.partner2opportunity,planned_revenue:0
-#: field:crm.phonecall2opportunity,planned_revenue:0
-msgid "Expected Revenue"
-msgstr "Ingreso estimado"
-
-#. module: crm
-#: model:ir.actions.act_window,help:crm.crm_phonecall_categ_action
+#: help:sale.config.settings,module_crm_helpdesk:0
msgid ""
-"Create specific phone call categories to better define the type of calls "
-"tracked in the system."
+"Allows you to communicate with Customer, process Customer query, and "
+"provide better help and support. This installs the module crm_helpdesk."
msgstr ""
-"Crear categorías específicas de llamada telefónica para definir mejor el "
-"tipo de llamadas en el sistema de seguimiento."
+"Le permite comunicarse conel cliente, procesar solicitud del cliente y "
+"proveer mejor ayuda y servicio. Instala el módulo crm_helpdesk."
+
+#. module: crm
+#: view:crm.lead:0
+msgid "Delete"
+msgstr "Borrar"
#. module: crm
-#: selection:crm.lead.report,month:0
-#: selection:crm.meeting,month_list:0
+#: model:mail.message.subtype,description:crm.mt_lead_create
+msgid "Opportunity created"
+msgstr "Oportunidad creada"
+
+#. module: crm
+#: view:crm.lead:0
+msgid "í"
+msgstr "í"
+
+#. module: crm
+#: selection:crm.lead.report,creation_month:0
+#: selection:crm.lead.report,deadline_month:0
#: selection:crm.phonecall.report,month:0
msgid "September"
msgstr "Setiembre"
#. module: crm
+#: model:ir.actions.act_window,help:crm.crm_case_category_act_oppor11
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new opportunity.\n"
+" </p><p>\n"
+" OpenERP helps you keep track of your sales pipeline to follow\n"
+" up potential sales and better forecast your future revenues.\n"
+" </p><p>\n"
+" You will be able to plan meetings and phone calls from\n"
+" opportunities, convert them into quotations, attach related\n"
+" documents, track all discussions, and much more.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+"Pulse para crear una nueva oportunidad.\n"
+"</p><p>\n"
+"OpenERP le ayuda a gestionar el flujo de ventas para seguir ventas "
+"potenciales y prever mejor sus futuros ingresos.\n"
+"</p><p>\n"
+"Será capaz de planificar reuniones y llamadas telefónicas desde las "
+"oportunidades, convertirlas en presupuestos, adjuntar documentos "
+"relacionados, seguir todas las discusiones, y mucho más.\n"
+"</p>\n"
+" "
+
+#. module: crm
#: field:crm.segmentation,partner_id:0
msgid "Max Partner ID processed"
msgstr "Máx ID de empresa procesado"
#. module: crm
-#: model:ir.actions.act_window,name:crm.action_report_crm_phonecall
-#: model:ir.ui.menu,name:crm.menu_report_crm_phonecalls_tree
-msgid "Phone Calls Analysis"
-msgstr "Análisis de llamadas"
+#: help:crm.case.stage,on_change:0
+msgid ""
+"Setting this stage will change the probability automatically on the "
+"opportunity."
+msgstr ""
+"Cambiando a esta etapa cambiará automáticamente la probabilidad de la "
+"oportunidad."
+
+#. module: crm
+#: view:crm.lead:0
+msgid "oe_kanban_text_red"
+msgstr "oe_kanban_text_red"
+
+#. module: crm
+#: model:ir.ui.menu,name:crm.menu_crm_payment_mode_act
+msgid "Payment Modes"
+msgstr "Formas de pago"
#. module: crm
#: field:crm.lead.report,opening_date:0
@@ -1447,14 +1238,14 @@ msgid "Duration in Minutes"
msgstr "Duración en minutos"
#. module: crm
-#: help:crm.installer,crm_helpdesk:0
-msgid "Manages a Helpdesk service."
-msgstr "Gestiona un servicio de soporte."
+#: field:crm.case.channel,name:0
+msgid "Channel Name"
+msgstr "Nombre del canal"
#. module: crm
-#: field:crm.partner2opportunity,name:0
-msgid "Opportunity Name"
-msgstr "Nombre oportunidad"
+#: help:crm.lead.report,deadline_day:0
+msgid "Expected closing day"
+msgstr "Fecha de cierre prevista"
#. module: crm
#: help:crm.case.section,active:0
@@ -1466,40 +1257,29 @@ msgstr ""
"eliminarlo."
#. module: crm
-#: view:crm.lead.report:0
-#: view:crm.phonecall.report:0
-msgid " Year "
-msgstr " Año "
-
-#. module: crm
-#: field:crm.meeting,edit_all:0
-msgid "Edit All"
-msgstr "Editar todo"
-
-#. module: crm
-#: field:crm.meeting,fr:0
-msgid "Fri"
-msgstr "Vie"
-
-#. module: crm
-#: model:ir.model,name:crm.model_crm_lead
-msgid "crm.lead"
-msgstr "crm.iniciativa"
-
-#. module: crm
-#: field:crm.meeting,write_date:0
-msgid "Write Date"
-msgstr "Fecha escritura"
+#: help:crm.case.stage,case_default:0
+msgid ""
+"If you check this field, this stage will be proposed by default on each "
+"sales team. It will not assign this stage to existing teams."
+msgstr ""
+"SI selecciona este campo, esta etapa será propuesta por defecto a cada "
+"equipo de ventas. No asignará esta etapa a equipos existentes."
#. module: crm
-#: view:crm.meeting:0
-msgid "End of Recurrency"
-msgstr "Fin de recurrencia"
+#: help:crm.case.stage,type:0
+msgid ""
+"This field is used to distinguish stages related to Leads from stages "
+"related to Opportunities, or to specify stages available for both types."
+msgstr ""
+"Este campo se utiliza para diferenciar etapas relacionadas con iniciativas "
+"de etapas relacionadas con oportunidades, o para especificar etapas "
+"disponibles para ambos tipos."
#. module: crm
-#: view:crm.meeting:0
-msgid "Reminder"
-msgstr "Recordatorio"
+#: model:mail.message.subtype,name:crm.mt_lead_create
+#: model:mail.message.subtype,name:crm.mt_salesteam_lead
+msgid "Lead Created"
+msgstr "Iniciativa creada"
#. module: crm
#: help:crm.segmentation,sales_purchase_active:0
@@ -1511,25 +1291,14 @@ msgstr ""
"segmentación. Si no se marca, los criterios que contenga serán ignorados"
#. module: crm
-#: view:crm.lead2opportunity.partner:0
-#: view:crm.lead2partner:0
-#: view:crm.phonecall:0
-#: view:crm.phonecall2partner:0
-#: model:ir.actions.act_window,name:crm.action_crm_lead2partner
-#: model:ir.actions.act_window,name:crm.action_crm_phonecall2partner
-#: view:res.partner:0
-msgid "Create a Partner"
-msgstr "Crear una empresa"
-
-#. module: crm
#: field:crm.segmentation,state:0
msgid "Execution Status"
msgstr "Estado ejecución"
#. module: crm
-#: selection:crm.meeting,week_list:0
-msgid "Monday"
-msgstr "Lunes"
+#: view:crm.opportunity2phonecall:0
+msgid "Log call"
+msgstr "Registrar llamada"
#. module: crm
#: field:crm.lead,day_close:0
@@ -1537,47 +1306,40 @@ msgid "Days to Close"
msgstr "Días para el cierre"
#. module: crm
-#: field:crm.add.note,attachment_ids:0
#: field:crm.case.section,complete_name:0
-#: field:crm.send.mail,attachment_ids:0
msgid "unknown"
msgstr "desconocido"
#. module: crm
-#: field:crm.lead,id:0
-#: field:crm.meeting,id:0
-#: field:crm.phonecall,id:0
-msgid "ID"
-msgstr "ID"
-
-#. module: crm
-#: model:ir.model,name:crm.model_crm_partner2opportunity
-msgid "Partner To Opportunity"
-msgstr "Empresa a oportunidad"
+#: field:crm.case.section,message_is_follower:0
+#: field:crm.lead,message_is_follower:0
+#: field:crm.phonecall,message_is_follower:0
+msgid "Is a Follower"
+msgstr "Es un seguidor."
#. module: crm
-#: view:crm.meeting:0
-#: field:crm.meeting,date:0
#: field:crm.opportunity2phonecall,date:0
#: view:crm.phonecall:0
#: field:crm.phonecall,date:0
#: field:crm.phonecall2phonecall,date:0
-#: view:res.partner:0
msgid "Date"
msgstr "Fecha"
#. module: crm
-#: view:crm.lead:0
+#: model:crm.case.section,name:crm.crm_case_section_4
+msgid "Online Support"
+msgstr "Soporte en línea"
+
+#. module: crm
#: view:crm.lead.report:0
-#: view:crm.meeting:0
#: view:crm.phonecall.report:0
msgid "Extended Filters..."
msgstr "Filtros extendidos..."
#. module: crm
-#: field:crm.phonecall2opportunity,name:0
-msgid "Opportunity Summary"
-msgstr "Resumen oportunidad"
+#: view:crm.phonecall.report:0
+msgid "Phone calls which are in closed state"
+msgstr "Llamadas en estado cerrado"
#. module: crm
#: view:crm.phonecall.report:0
@@ -1585,14 +1347,44 @@ msgid "Search"
msgstr "Buscar"
#. module: crm
-#: view:board.board:0
-msgid "Opportunities by Categories"
-msgstr "Oportunidades por categorías"
+#: help:crm.lead,state:0
+msgid ""
+"The Status is set to 'Draft', when a case is created. If the case is in "
+"progress the Status is set to 'Open'. When the case is over, the Status is "
+"set to 'Done'. If the case needs to be reviewed then the Status is set to "
+"'Pending'."
+msgstr ""
+"El estado se establece a 'Borrador', cuando un caso es creado. Si el caso "
+"está en progreso el estado se establece 'Abierto'. Cuando el caso finaliza, "
+"el estado se establece a 'Realizado'. Si el caso necesita ser revisado "
+"entonces el estado se establece a 'Pendiente'."
+
+#. module: crm
+#: model:crm.case.section,name:crm.crm_case_section_1
+msgid "Sales Marketing Department"
+msgstr "Departamento de ventas y marketing"
+
+#. module: crm
+#: view:crm.phonecall.report:0
+msgid "Date of call"
+msgstr "Fecha de la llamada"
#. module: crm
-#: view:crm.meeting:0
-msgid "Choose day in the month where repeat the meeting"
-msgstr "Elija el día del mes en que se repetirá la cita."
+#: help:crm.lead,section_id:0
+msgid ""
+"When sending mails, the default email address is taken from the sales team."
+msgstr ""
+"Cunado se envían emails, la dirección de email por defecto proviene del "
+"equipo de ventas"
+
+#. module: crm
+#: view:crm.phonecall:0
+msgid ""
+"Phone Calls Assigned to the current user or with a team having the current "
+"user as team leader"
+msgstr ""
+"Llamadas telefónicas asignadas al usuario actual o con un equipo que tiene "
+"al usuario actual como líder del equipo"
#. module: crm
#: view:crm.segmentation:0
@@ -1601,20 +1393,19 @@ msgstr "Descripción de segmentación"
#. module: crm
#: view:crm.lead:0
-#: view:res.partner:0
-msgid "History"
-msgstr "Historial"
+msgid "Lead Description"
+msgstr "Descripción de la iniciativa"
#. module: crm
-#: model:ir.actions.act_window,help:crm.crm_segmentation_tree-act
-msgid ""
-"Create specific partner categories which you can assign to your partners to "
-"better manage your interactions with them. The segmentation tool is able to "
-"assign categories to partners according to criteria you set."
-msgstr ""
-"Cree categorías de empresa específicas para gestionar mejor sus "
-"interacciones con ellas. La herramienta de segmentación es capaz de asignar "
-"categorías a empresas de acuerdo a los criterios que establezca."
+#: code:addons/crm/crm_lead.py:565
+#, python-format
+msgid "Merged opportunities"
+msgstr "Oportunidades fusionadas"
+
+#. module: crm
+#: model:crm.case.categ,name:crm.categ_oppor7
+msgid "Consulting"
+msgstr "Consultoría"
#. module: crm
#: field:crm.case.section,code:0
@@ -1622,27 +1413,24 @@ msgid "Code"
msgstr "Código"
#. module: crm
+#: view:sale.config.settings:0
+msgid "Features"
+msgstr "Características"
+
+#. module: crm
#: field:crm.case.section,child_ids:0
msgid "Child Teams"
msgstr "Equipos hijos"
#. module: crm
-#: view:crm.lead:0
-#: field:crm.lead,state:0
-#: view:crm.lead.report:0
-#: field:crm.lead.report,state:0
-#: view:crm.meeting:0
-#: field:crm.meeting,state:0
-#: field:crm.phonecall,state:0
#: view:crm.phonecall.report:0
-#: field:crm.phonecall.report,state:0
-msgid "State"
-msgstr "Estado"
+msgid "Phone calls which are in draft and open state"
+msgstr "Llamadas que están en estado borrador o abierto"
#. module: crm
-#: field:crm.meeting,freq:0
-msgid "Frequency"
-msgstr "Frecuencia"
+#: field:crm.lead2opportunity.partner.mass,user_ids:0
+msgid "Salesmen"
+msgstr "Vendedores"
#. module: crm
#: view:crm.lead:0
@@ -1650,52 +1438,68 @@ msgid "References"
msgstr "Referencias"
#. module: crm
-#: code:addons/crm/crm.py:392
-#: view:crm.lead:0
-#: view:crm.lead2opportunity:0
-#: view:crm.lead2opportunity.action:0
#: view:crm.lead2opportunity.partner:0
-#: view:crm.lead2partner:0
+#: view:crm.lead2opportunity.partner.mass:0
+#: view:crm.merge.opportunity:0
+#: view:crm.opportunity2phonecall:0
#: view:crm.phonecall:0
-#: view:crm.phonecall2partner:0
-#: view:res.partner:0
-#, python-format
+#: view:crm.phonecall2phonecall:0
msgid "Cancel"
msgstr "Cancelar"
#. module: crm
-#: model:ir.model,name:crm.model_res_users
-msgid "res.users"
-msgstr "res.usuarios"
+#: view:crm.lead:0
+msgid "Opportunities Assigned to Me or My Team(s)"
+msgstr "Oportunidades asignadas a mi o mi equipo"
#. module: crm
-#: model:ir.model,name:crm.model_crm_merge_opportunity
-msgid "Merge two Opportunities"
-msgstr "Fusionar dos oportunidades"
+#: model:crm.case.categ,name:crm.categ_oppor4
+msgid "Information"
+msgstr "Información"
#. module: crm
-#: selection:crm.meeting,end_type:0
-msgid "Fix amout of times"
-msgstr "Cantidad fija de veces"
+#: view:crm.lead.report:0
+msgid "Leads/Opportunities which are in pending state"
+msgstr "Iniciativas/Oportunidades que están en estado pendiente"
#. module: crm
-#: view:crm.lead:0
-#: view:crm.meeting:0
#: view:crm.phonecall:0
-msgid "Current"
-msgstr "Actual"
+msgid "To Do"
+msgstr "Por hacer"
#. module: crm
-#: field:crm.meeting,exrule:0
-msgid "Exception Rule"
-msgstr "Exception de regla"
+#: model:mail.message.subtype,description:crm.mt_lead_lost
+msgid "Opportunity lost"
+msgstr "Oportunidad perdida"
#. module: crm
-#: help:base.action.rule,act_mail_to_partner:0
-msgid "Check this if you want the rule to send an email to the partner."
-msgstr ""
-"Verifica esto si tu quieres enviar la norma en un correo electronico a el "
-"socio"
+#: field:crm.lead2opportunity.partner,action:0
+#: field:crm.lead2opportunity.partner.mass,action:0
+#: field:crm.partner.binding,action:0
+msgid "Related Customer"
+msgstr "Cliente relacionado"
+
+#. module: crm
+#: model:crm.case.categ,name:crm.categ_oppor8
+msgid "Other"
+msgstr "Otro"
+
+#. module: crm
+#: field:crm.phonecall,opportunity_id:0
+#: model:ir.model,name:crm.model_crm_lead
+msgid "Lead/Opportunity"
+msgstr "Inicaitiva / Oportunbidad"
+
+#. module: crm
+#: model:ir.actions.act_window,name:crm.action_merge_opportunities
+#: model:ir.actions.act_window,name:crm.merge_opportunity_act
+msgid "Merge leads/opportunities"
+msgstr "Fusionar iniciativas/oportunidades"
+
+#. module: crm
+#: help:crm.case.stage,sequence:0
+msgid "Used to order stages. Lower is better."
+msgstr "Utilizado para ordenar etapas. Bajo es más prioritario."
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_phonecall_categ_action
@@ -1703,9 +1507,24 @@ msgid "Phonecall Categories"
msgstr "Categorías de llamadas"
#. module: crm
-#: view:crm.meeting:0
-msgid "Invite People"
-msgstr "Invitar personas"
+#: view:crm.lead.report:0
+msgid "Leads/Opportunities which are in open state"
+msgstr "Iniciativas/Oportunidades que están en estado abierto"
+
+#. module: crm
+#: model:ir.model,name:crm.model_res_users
+msgid "Users"
+msgstr "Usuarios"
+
+#. module: crm
+#: model:mail.message.subtype,name:crm.mt_lead_stage
+msgid "Stage Changed"
+msgstr "Etapa cambiada"
+
+#. module: crm
+#: field:crm.case.stage,section_ids:0
+msgid "Sections"
+msgstr "Secciones"
#. module: crm
#: constraint:crm.case.section:0
@@ -1713,9 +1532,10 @@ msgid "Error ! You cannot create recursive Sales team."
msgstr "¡Error! No puede crear equipos de ventas recursivos."
#. module: crm
-#: view:crm.meeting:0
-msgid "Search Meetings"
-msgstr "Buscar reuniones"
+#: selection:crm.opportunity2phonecall,action:0
+#: selection:crm.phonecall2phonecall,action:0
+msgid "Log a call"
+msgstr "Registrar una llamada"
#. module: crm
#: selection:crm.segmentation.line,expr_name:0
@@ -1723,22 +1543,10 @@ msgid "Sale Amount"
msgstr "Importe de venta"
#. module: crm
-#: code:addons/crm/wizard/crm_send_email.py:141
-#, python-format
-msgid "Unable to send mail. Please check SMTP is configured properly."
-msgstr ""
-"Imposible enviar el correo electrónico. Verifique que la configuración SMTP "
-"sea correcta."
-
-#. module: crm
-#: selection:crm.segmentation.line,expr_operator:0
-msgid "="
-msgstr "="
-
-#. module: crm
-#: selection:crm.meeting,state:0
-msgid "Unconfirmed"
-msgstr "No confirmado"
+#: view:crm.phonecall.report:0
+#: model:ir.actions.act_window,name:crm.act_crm_opportunity_crm_phonecall_new
+msgid "Phone calls"
+msgstr "Llamadas telefónicas"
#. module: crm
#: model:ir.actions.act_window,help:crm.action_report_crm_opportunity
@@ -1757,59 +1565,38 @@ msgstr ""
#. module: crm
#: field:crm.case.categ,name:0
-#: field:crm.installer,name:0
-#: field:crm.lead,name:0
+#: field:crm.payment.mode,name:0
#: field:crm.segmentation,name:0
-#: field:crm.send.mail.attachment,name:0
msgid "Name"
msgstr "Nombre"
#. module: crm
-#: field:crm.meeting,alarm_id:0
-#: field:crm.meeting,base_calendar_alarm_id:0
-msgid "Alarm"
-msgstr "Alarma"
+#: view:crm.lead.report:0
+msgid "Leads/Opportunities that are assigned to me"
+msgstr "Iniciativas/Oportunidades que están asignadas a mí."
#. module: crm
-#: model:ir.actions.act_window,help:crm.crm_lead_stage_act
-msgid ""
-"Add specific stages to leads and opportunities allowing your sales to better "
-"organise their sales pipeline. Stages will allow them to easily track how a "
-"specific lead or opportunity is positioned in the sales cycle."
-msgstr ""
-"Agregar etapas específicas de iniciativas y oportunidades para organizar "
-"mejor su flujo de ventas. Estas etapas permitirán un fácil seguimiento de "
-"iniciativas u oportunidades en relación al ciclo de ventas."
+#: field:crm.lead.report,date_closed:0
+#: field:crm.phonecall.report,date_closed:0
+msgid "Close Date"
+msgstr "Fecha cierre"
#. module: crm
#: view:crm.lead.report:0
-#: view:crm.phonecall.report:0
msgid "My Case(s)"
msgstr "Mi(s) caso(s)"
#. module: crm
-#: field:crm.lead,birthdate:0
-msgid "Birthdate"
-msgstr "Fecha de nacimiento"
-
-#. module: crm
-#: view:crm.meeting:0
-msgid "The"
-msgstr "El"
-
-#. module: crm
-#: field:crm.send.mail.attachment,wizard_id:0
-msgid "Wizard"
-msgstr "Asistente"
+#: help:crm.case.section,message_ids:0
+#: help:crm.lead,message_ids:0
+#: help:crm.phonecall,message_ids:0
+msgid "Messages and communication history"
+msgstr "Mensajes e historial de comunicación"
#. module: crm
-#: help:crm.lead,section_id:0
-msgid ""
-"Sales team to which this case belongs to. Defines responsible user and e-"
-"mail address for the mail gateway."
-msgstr ""
-"El equipo de ventas al que pertenece este caso. Define el usuario "
-"responsable y la dirección de correo electrónico para la pasarela de correo."
+#: view:crm.lead:0
+msgid "Show Countries"
+msgstr "Mostrar países"
#. module: crm
#: view:crm.lead:0
@@ -1831,36 +1618,14 @@ msgid "Convert to prospect to business partner"
msgstr "Convertir prospección a empresa"
#. module: crm
-#: view:crm.phonecall2opportunity:0
-msgid "_Convert"
-msgstr "_Convertir"
-
-#. module: crm
-#: model:ir.actions.act_window,help:crm.action_view_attendee_form
-msgid ""
-"With Meeting Invitations you can create and manage the meeting invitations "
-"sent/to be sent to your colleagues/partners. You can not only invite OpenERP "
-"users, but also external parties, such as a customer."
-msgstr ""
-"Con invitaciones a reuniones puede crear y gesionar las invitaciones de "
-"reuniones enviadas / por enviar a sus compañeros de trabajo / empresas. La "
-"invitación no debe ser únicamente para usuarios de OpenERP, puede ser "
-"igualmente para terceros externos, como un cliente."
-
-#. module: crm
-#: selection:crm.meeting,week_list:0
-msgid "Saturday"
-msgstr "Sábado"
-
-#. module: crm
-#: selection:crm.meeting,byday:0
-msgid "Fifth"
-msgstr "Quinto"
+#: model:ir.model,name:crm.model_crm_payment_mode
+msgid "CRM Payment Mode"
+msgstr "CRM Forma de pago"
#. module: crm
-#: view:crm.phonecall2phonecall:0
-msgid "_Schedule"
-msgstr "_Calendario"
+#: view:crm.lead.report:0
+msgid "Leads/Opportunities which are in done state"
+msgstr "Iniciativas / Oportunidades que están en el estado realizado"
#. module: crm
#: field:crm.lead.report,delay_close:0
@@ -1868,40 +1633,17 @@ msgid "Delay to Close"
msgstr "Tiempo restante para el cierre"
#. module: crm
-#: field:crm.meeting,we:0
-msgid "Wed"
-msgstr "Mier"
-
-#. module: crm
-#: model:crm.case.categ,name:crm.categ_oppor6
-msgid "Potential Reseller"
-msgstr "Distribuidor potencial"
-
-#. module: crm
-#: field:crm.lead.report,planned_revenue:0
-msgid "Planned Revenue"
-msgstr "Ingresos previstos"
-
-#. module: crm
#: view:crm.lead:0
#: view:crm.lead.report:0
-#: view:crm.meeting:0
#: view:crm.phonecall:0
#: view:crm.phonecall.report:0
msgid "Group By..."
msgstr "Agrupar por..."
#. module: crm
-#: help:crm.lead,partner_id:0
-msgid "Optional linked partner, usually after conversion of the lead"
-msgstr ""
-"Empresa relacionada opcional, normalmente después de la conversión de la "
-"iniciativa"
-
-#. module: crm
-#: view:crm.meeting:0
-msgid "Invitation details"
-msgstr "Detalles de la invitación"
+#: view:crm.merge.opportunity:0
+msgid "Merge Leads/Opportunities"
+msgstr "Fusionar iniciativas/oportunidades"
#. module: crm
#: field:crm.case.section,parent_id:0
@@ -1909,82 +1651,71 @@ msgid "Parent Team"
msgstr "Equipo padre"
#. module: crm
+#: selection:crm.lead2opportunity.partner,action:0
+#: selection:crm.lead2opportunity.partner.mass,action:0
+#: selection:crm.partner.binding,action:0
+msgid "Do not link to a customer"
+msgstr "No enlazar a un cliente"
+
+#. module: crm
#: field:crm.lead,date_action:0
msgid "Next Action Date"
msgstr "Fecha de la próxima acción"
#. module: crm
-#: selection:crm.segmentation,state:0
-msgid "Running"
-msgstr "En proceso"
-
-#. module: crm
-#: selection:crm.meeting,freq:0
-msgid "Hours"
-msgstr "Horas"
-
-#. module: crm
-#: field:crm.lead,zip:0
-msgid "Zip"
-msgstr "Código postal"
-
-#. module: crm
-#: code:addons/crm/crm_lead.py:213
-#, python-format
-msgid "The case '%s' has been opened."
-msgstr "El caso '%s' ha sido abierto"
+#: help:crm.case.stage,state:0
+msgid ""
+"The status of your document will automatically change regarding the selected "
+"stage. For example, if a stage is related to the status 'Close', when your "
+"document reaches this stage, it is automatically closed."
+msgstr ""
+"El estado de su documento cambiará automáticamente en función de la etapa "
+"seleccionada. Por ejemplo, si una etapa está relacionada con el estado "
+"'Cerrado', cuando su documento llegue a este estado, se cierra "
+"automáticamente."
#. module: crm
-#: view:crm.installer:0
-msgid "title"
-msgstr "título"
+#: view:crm.lead2opportunity.partner.mass:0
+msgid "Assign opportunities to"
+msgstr "Asignar oportunidades a"
#. module: crm
#: model:crm.case.categ,name:crm.categ_phone1
-#: model:ir.actions.act_window,name:crm.crm_case_categ_phone_incoming0
-#: model:ir.ui.menu,name:crm.menu_crm_case_phone_inbound
msgid "Inbound"
msgstr "Entrante"
#. module: crm
-#: help:crm.case.stage,probability:0
-msgid ""
-"This percentage depicts the default/average probability of the Case for this "
-"stage to be a success"
-msgstr ""
-"Este porcentaje representa la probabilidad por defecto / media para que los "
-"casos de esta etapa sean un éxito."
-
-#. module: crm
#: view:crm.phonecall.report:0
-#: model:ir.actions.act_window,name:crm.act_crm_opportunity_crm_phonecall_new
-msgid "Phone calls"
-msgstr "Llamadas telefónicas"
-
-#. module: crm
-#: view:crm.lead:0
-msgid "Communication History"
-msgstr "Historial de comunicaciones"
+msgid "Month of call"
+msgstr "Mes de la llamada"
#. module: crm
-#: selection:crm.meeting,show_as:0
-msgid "Free"
-msgstr "Libre"
+#: code:addons/crm/crm_phonecall.py:290
+#, python-format
+msgid "Partner has been <b>created</b>."
+msgstr "El cliente ha sido <b>creado</b>."
#. module: crm
-#: view:crm.installer:0
-msgid "Synchronization"
-msgstr "Sincronización"
+#: field:sale.config.settings,module_crm_claim:0
+msgid "Manage Customer Claims"
+msgstr "Gestionar reclamaciones de clientes"
#. module: crm
-#: field:crm.case.section,allow_unlink:0
-msgid "Allow Delete"
-msgstr "Permitir eliminar"
+#: model:ir.actions.act_window,help:crm.action_report_crm_lead
+msgid ""
+"Leads Analysis allows you to check different CRM related information like "
+"the treatment delays or number of leads per state. You can sort out your "
+"leads analysis by different groups to get accurate grained analysis."
+msgstr ""
+"El análisis de iniciativas le permite verificar diferente información "
+"referente a CRM como el tratamiento de retrasos o el número de iniciativas "
+"por estado. Puede ordenar sus iniciativas por diferentes grupos para tener "
+"un análisis"
#. module: crm
-#: field:crm.meeting,mo:0
-msgid "Mon"
-msgstr "Lun"
+#: model:crm.case.categ,name:crm.categ_oppor3
+msgid "Services"
+msgstr "Servicios"
#. module: crm
#: selection:crm.lead,priority:0
@@ -1995,80 +1726,35 @@ msgid "Highest"
msgstr "Muy alto"
#. module: crm
-#: model:ir.actions.act_window,help:crm.crm_case_categ_phone_incoming0
-msgid ""
-"The Inbound Calls tool allows you to log your inbound calls on the fly. Each "
-"call you get will appear on the partner form to trace every contact you have "
-"with a partner. From the phone call form, you can trigger a request for "
-"another call, a meeting or an opportunity."
-msgstr ""
-"La herramienta de llamadas entrantes le permite seguir el rastro de sus "
-"llamadas entrantes en tiempo real. Cada llamada que reciba, aparecerá en el "
-"formulario de la empresa para dejar el rastro de cada contacto que tiene en "
-"una empresa. Desde el formulario de llamada telefónica, puede lanzar una "
-"solicitud para otra llamada, una reunión o una oportunidad"
-
-#. module: crm
-#: help:crm.meeting,recurrency:0
-msgid "Recurrent Meeting"
-msgstr "Reunión periódica"
+#: help:crm.lead.report,creation_year:0
+msgid "Creation year"
+msgstr "Año de creación"
#. module: crm
#: view:crm.case.section:0
-#: view:crm.lead:0
#: field:crm.lead,description:0
msgid "Notes"
msgstr "Notas"
#. module: crm
-#: selection:crm.meeting,freq:0
-msgid "Days"
-msgstr "Días"
-
-#. module: crm
#: field:crm.segmentation.line,expr_value:0
msgid "Value"
msgstr "Valor"
#. module: crm
-#: view:crm.lead:0
-#: view:crm.lead.report:0
-msgid "Opportunity by Categories"
-msgstr "Oportunidades por categorías"
-
-#. module: crm
-#: view:crm.lead:0
#: field:crm.lead,partner_name:0
msgid "Customer Name"
msgstr "Nombre del cliente"
#. module: crm
-#: model:ir.actions.act_window,help:crm.crm_case_categ_meet
-msgid ""
-"The meeting calendar is shared between the sales teams and fully integrated "
-"with other applications such as the employee holidays or the business "
-"opportunities. You can also synchronize meetings with your mobile phone "
-"using the caldav interface."
-msgstr ""
-"El calendario de reuniones es compartido entre los equipos de ventas e "
-"integrado por completo con otras aplicaciones como las vacaciones de "
-"empleados o las oportunidades de negocio. Puede sincronizar reuniones con su "
-"teléfono móvil utilizando el interfaz caldav."
-
-#. module: crm
-#: model:ir.model,name:crm.model_crm_phonecall2opportunity
-msgid "Phonecall To Opportunity"
-msgstr "Llamada telefónica a oportunidad"
-
-#. module: crm
#: field:crm.case.section,reply_to:0
msgid "Reply-To"
msgstr "Responder a"
#. module: crm
-#: view:crm.case.section:0
-msgid "Select Stages for this Sales Team"
-msgstr "Seleccionar etapas para este equipo de ventas"
+#: view:crm.lead:0
+msgid "Display"
+msgstr "Mostrar"
#. module: crm
#: view:board.board:0
@@ -2076,47 +1762,40 @@ msgid "Opportunities by Stage"
msgstr "Oportunidades por etapa"
#. module: crm
-#: view:crm.meeting:0
-msgid "Recurrency Option"
-msgstr "Opción de recurrencia"
-
-#. module: crm
#: model:process.transition,note:crm.process_transition_leadpartner0
msgid "Prospect is converting to business partner"
msgstr "El prospecto se convierte a partner"
#. module: crm
-#: view:crm.lead2opportunity:0
-#: view:crm.partner2opportunity:0
-#: model:ir.actions.act_window,name:crm.phonecall2opportunity_act
-msgid "Convert To Opportunity"
-msgstr "Convertir en oportunidad"
+#: view:crm.case.channel:0
+#: model:ir.actions.act_window,name:crm.crm_case_channel_action
+#: model:ir.model,name:crm.model_crm_case_channel
+#: model:ir.ui.menu,name:crm.menu_crm_case_channel
+msgid "Channels"
+msgstr "Canales"
#. module: crm
#: view:crm.phonecall:0
+#: selection:crm.phonecall,state:0
#: view:crm.phonecall.report:0
-#: view:res.partner:0
+#: selection:crm.phonecall.report,state:0
msgid "Held"
msgstr "Realizada"
#. module: crm
#: view:crm.lead:0
-#: view:crm.phonecall:0
-#: view:res.partner:0
-msgid "Reset to Draft"
-msgstr "Cambiar a borrador"
+msgid "Extra Info"
+msgstr "Información extra"
#. module: crm
#: view:crm.lead:0
-msgid "Extra Info"
-msgstr "Información extra"
+msgid "Fund Raising"
+msgstr "Recaudación de fondos"
#. module: crm
-#: view:crm.merge.opportunity:0
-#: model:ir.actions.act_window,name:crm.action_merge_opportunities
-#: model:ir.actions.act_window,name:crm.merge_opportunity_act
-msgid "Merge Opportunities"
-msgstr "Fusionar oportunidades"
+#: view:crm.lead:0
+msgid "Edit..."
+msgstr "Editar…"
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead5
@@ -2124,30 +1803,9 @@ msgid "Google Adwords"
msgstr "Google Adwords"
#. module: crm
-#: model:ir.model,name:crm.model_crm_phonecall
-msgid "crm.phonecall"
-msgstr "crm.llamadateléfono"
-
-#. module: crm
-#: model:crm.case.resource.type,name:crm.type_lead3
-msgid "Mail Campaign 2"
-msgstr "Campaña mail 2"
-
-#. module: crm
-#: view:crm.lead:0
-msgid "Create"
-msgstr "Crear"
-
-#. module: crm
-#: view:crm.lead:0
-msgid "Dates"
-msgstr "Fechas"
-
-#. module: crm
-#: code:addons/crm/crm.py:492
-#, python-format
-msgid "Send"
-msgstr "Enviar"
+#: view:crm.case.section:0
+msgid "Select Stages for this Sales Team"
+msgstr "Seleccione etapas para este equipo de ventas"
#. module: crm
#: view:crm.lead:0
@@ -2161,29 +1819,44 @@ msgid "Priority"
msgstr "Prioridad"
#. module: crm
-#: field:crm.segmentation,sales_purchase_active:0
-msgid "Use The Sales Purchase Rules"
-msgstr "Utiliza las reglas de compra ventas"
-
-#. module: crm
#: model:ir.model,name:crm.model_crm_lead2opportunity_partner
msgid "Lead To Opportunity Partner"
msgstr "Iniciativa a Oportunidad"
#. module: crm
-#: field:crm.meeting,location:0
-msgid "Location"
-msgstr "Ubicación"
+#: help:crm.lead,partner_id:0
+msgid "Linked partner (optional). Usually created when converting the lead."
+msgstr ""
+"Empresa asociada(opcional). Usualmente es creado al convertir la iniciativa."
#. module: crm
-#: view:crm.lead:0
-msgid "Reply"
-msgstr "Responder"
+#: field:crm.lead,payment_mode:0
+#: view:crm.payment.mode:0
+#: model:ir.actions.act_window,name:crm.action_crm_payment_mode
+msgid "Payment Mode"
+msgstr "Modo de pago"
+
+#. module: crm
+#: model:ir.model,name:crm.model_crm_lead2opportunity_partner_mass
+msgid "Mass Lead To Opportunity Partner"
+msgstr "Transformación masiva de iniciativa a oportunidad"
+
+#. module: crm
+#: view:sale.config.settings:0
+msgid "On Mail Server"
+msgstr "En servidor de mail"
#. module: crm
-#: selection:crm.meeting,freq:0
-msgid "Weeks"
-msgstr "Semanas"
+#: model:ir.actions.act_window,name:crm.open_board_statistical_dash
+#: model:ir.ui.menu,name:crm.menu_board_statistics_dash
+msgid "CRM"
+msgstr "CRM"
+
+#. module: crm
+#: model:ir.actions.act_window,name:crm.crm_segmentation_tree-act
+#: model:ir.ui.menu,name:crm.menu_crm_segmentation-act
+msgid "Contacts Segmentation"
+msgstr "Segmentación de contactos"
#. module: crm
#: model:process.node,note:crm.process_node_meeting0
@@ -2191,19 +1864,14 @@ msgid "Schedule a normal or phone meeting"
msgstr "Programar una reunión normal o telefónica"
#. module: crm
-#: code:addons/crm/crm.py:375
-#, python-format
-msgid "Error !"
-msgstr "¡Error!"
+#: model:crm.case.resource.type,name:crm.type_lead1
+msgid "Telesales"
+msgstr "Ventas a distancia"
#. module: crm
-#: model:ir.actions.act_window,help:crm.crm_meeting_categ_action
-msgid ""
-"Create different meeting categories to better organize and classify your "
-"meetings."
-msgstr ""
-"Cree diferentes categorías de reuniones para organizarlas y clasificarlas "
-"mejor."
+#: view:crm.lead:0
+msgid "Leads Assigned to Me or My Team(s)"
+msgstr "Iniciativas asignadas a mi o mi equipo"
#. module: crm
#: model:ir.model,name:crm.model_crm_segmentation_line
@@ -2217,19 +1885,14 @@ msgid "Planned Date"
msgstr "Fecha prevista"
#. module: crm
-#: field:crm.meeting,base_calendar_url:0
-msgid "Caldav URL"
-msgstr "URL de caldav"
-
-#. module: crm
#: view:crm.lead:0
msgid "Expected Revenues"
msgstr "Ingresos esperados"
#. module: crm
-#: model:crm.case.resource.type,name:crm.type_lead6
-msgid "Google Adwords 2"
-msgstr "Google Adwords 2"
+#: view:crm.lead:0
+msgid "Referrer"
+msgstr "Referenciado por"
#. module: crm
#: help:crm.lead,type:0
@@ -2238,38 +1901,26 @@ msgid "Type is used to separate Leads and Opportunities"
msgstr "El tipo es utilizado para separar iniciativas y oportunidades"
#. module: crm
-#: view:crm.phonecall2partner:0
-msgid "Are you sure you want to create a partner based on this Phonecall ?"
-msgstr ""
-"¿Está seguro que quiere crear una empresa basada en esta llamada telefónica?"
-
-#. module: crm
-#: selection:crm.lead.report,month:0
-#: selection:crm.meeting,month_list:0
+#: selection:crm.lead.report,creation_month:0
+#: selection:crm.lead.report,deadline_month:0
#: selection:crm.phonecall.report,month:0
msgid "July"
msgstr "Julio"
#. module: crm
-#: model:ir.actions.act_window,help:crm.crm_case_section_act
-msgid ""
-"Define a Sales Team to organize your different salesmen or sales departments "
-"into separate teams. Each team will work in its own list of opportunities, "
-"sales orders, etc. Each user can set a default team in his user preferences. "
-"The opportunities and sales order displayed, will automatically be filtered "
-"according to his team."
-msgstr ""
-"Defina un equipo de ventas para organizar a sus diferentes vendedores o "
-"departamentos de ventas en equipos separados. Cada equipo trabajará en su "
-"propia lista de oportunidades, pedidos de venta, etc. Cada usuario puede "
-"configurar un equipo predeterminado en sus preferencias de usuario. Las "
-"oportunidades y pedidos de venta mostrados se filtrarán automáticamente de "
-"acuerdo a su equipo."
+#: view:crm.lead:0
+msgid "Lead / Customer"
+msgstr "Iniciativa / Cliente"
#. module: crm
-#: help:crm.meeting,count:0
-msgid "Repeat x times"
-msgstr "Repetir x veces"
+#: model:crm.case.section,name:crm.crm_case_section_2
+msgid "Support Department"
+msgstr "Departamento de soporte"
+
+#. module: crm
+#: view:crm.lead.report:0
+msgid "Show only lead"
+msgstr "Mostrar solo iniciativas"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_case_section_act
@@ -2279,16 +1930,9 @@ msgid "Sales Teams"
msgstr "Equipos de ventas"
#. module: crm
-#: model:ir.model,name:crm.model_crm_lead2partner
-msgid "Lead to Partner"
-msgstr "Inicaitiva a cliente"
-
-#. module: crm
-#: view:crm.segmentation:0
-#: field:crm.segmentation.line,segmentation_id:0
-#: model:ir.actions.act_window,name:crm.crm_segmentation-act
-msgid "Segmentation"
-msgstr "Segmentación"
+#: field:crm.case.stage,case_default:0
+msgid "Default to New Sales Team"
+msgstr "Por defecto a un nuevo equipo de ventas"
#. module: crm
#: view:crm.lead:0
@@ -2296,14 +1940,13 @@ msgid "Team"
msgstr "Equipo"
#. module: crm
-#: field:crm.installer,outlook:0
-msgid "MS-Outlook"
-msgstr "MS-Outlook"
+#: view:crm.lead.report:0
+msgid "Leads/Opportunities which are in New state"
+msgstr "Iniciativas / oportunidades que están en estado nuveo"
#. module: crm
-#: view:crm.phonecall:0
+#: selection:crm.phonecall,state:0
#: view:crm.phonecall.report:0
-#: view:res.partner:0
msgid "Not Held"
msgstr "Pendiente"
@@ -2314,8 +1957,6 @@ msgstr "Probabilidad"
#. module: crm
#: view:crm.lead.report:0
-#: field:crm.lead.report,month:0
-#: field:crm.meeting,month_list:0
#: view:crm.phonecall.report:0
#: field:crm.phonecall.report,month:0
msgid "Month"
@@ -2324,93 +1965,61 @@ msgstr "Mes"
#. module: crm
#: view:crm.lead:0
#: model:ir.actions.act_window,name:crm.crm_case_category_act_leads_all
-#: model:ir.ui.menu,name:crm.menu_crm_case_categ0_act_leads
+#: model:ir.ui.menu,name:crm.menu_crm_leads
#: model:process.node,name:crm.process_node_leads0
msgid "Leads"
msgstr "Iniciativas"
#. module: crm
-#: model:ir.actions.act_window,help:crm.crm_case_category_act_leads_all
-msgid ""
-"Leads allow you to manage and keep track of all initial contacts with a "
-"prospect or partner showing interest in your products or services. A lead is "
-"usually the first step in your sales cycle. Once qualified, a lead may be "
-"converted into a business opportunity, while creating the related partner "
-"for further detailed tracking of any linked activities. You can import a "
-"database of prospects, keep track of your business cards or integrate your "
-"website's contact form with the OpenERP Leads. Leads can be connected to the "
-"email gateway: new emails may create leads, each of them automatically gets "
-"the history of the conversation with the prospect."
-msgstr ""
-"Las iniciativas le permiten gestionar y realizar un seguimiento de todos los "
-"contactos iniciales con un cliente potencial o socio que muestre interés en "
-"sus productos o servicios. Una iniciativa es generalmente el primer paso en "
-"su ciclo de ventas. Una vez identificada, una iniciativa se puede convertir "
-"en una oportunidad de negocio, creándose el socio correspondiente para el "
-"seguimiento detallado de cualquier actividad relacionada. Usted puede "
-"importar una base de datos de posibles clientes, realizar el seguimiento de "
-"sus tarjetas de visita o integrar el formulario de contacto de su sitio web "
-"con las iniciativas de OpenERP. Las iniciativas pueden ser conectadas a una "
-"pasarela de correo electrónico: los nuevos correos crearán nuevas "
-"iniciativas y cada una de ellas obtendrá automáticamente el historial de la "
-"conversación con el cliente potencial."
+#: code:addons/crm/crm_lead.py:563
+#, python-format
+msgid "Merged leads"
+msgstr "Combinar iniciativas"
#. module: crm
-#: selection:crm.lead2opportunity.partner,action:0
-#: selection:crm.lead2partner,action:0
-#: selection:crm.phonecall2partner,action:0
-msgid "Create a new partner"
-msgstr "Crear una nueva empresa"
+#: model:crm.case.categ,name:crm.categ_oppor5
+msgid "Design"
+msgstr "Diseño"
#. module: crm
-#: view:crm.meeting:0
-#: view:res.partner:0
-msgid "Start Date"
-msgstr "Fecha inicio"
+#: selection:crm.lead2opportunity.partner,name:0
+#: selection:crm.lead2opportunity.partner.mass,name:0
+msgid "Merge with existing opportunities"
+msgstr "Fusionar con oportunidad existente"
#. module: crm
-#: selection:crm.phonecall,state:0
#: view:crm.phonecall.report:0
+#: selection:crm.phonecall.report,state:0
msgid "Todo"
msgstr "Por hacer"
#. module: crm
-#: view:crm.meeting:0
-msgid "Delegate"
-msgstr "Delegar"
+#: model:mail.message.subtype,name:crm.mt_lead_convert_to_opportunity
+#: model:mail.message.subtype,name:crm.mt_salesteam_lead_opportunity
+msgid "Lead to Opportunity"
+msgstr "Iniciativa a oportunidad"
#. module: crm
-#: view:crm.meeting:0
-msgid "Decline"
-msgstr "Rechazar"
+#: field:crm.lead,user_email:0
+msgid "User Email"
+msgstr "Email del usuario"
#. module: crm
-#: help:crm.lead,optin:0
-msgid "If opt-in is checked, this contact has accepted to receive emails."
+#: help:crm.lead,partner_name:0
+msgid ""
+"The name of the future partner company that will be created while converting "
+"the lead into opportunity"
msgstr ""
-"Si opt-in está marcado, este contacto ha aceptado recibir correos "
-"electrónicos."
-
-#. module: crm
-#: view:crm.meeting:0
-msgid "Reset to Unconfirmed"
-msgstr "Restablecer a no confirmado"
+"El nombre de compañía de la futura empresa será creado al convertir la "
+"iniciativa en oportunidad."
#. module: crm
-#: code:addons/crm/wizard/crm_add_note.py:40
-#: view:crm.add.note:0
-#, python-format
+#: field:crm.opportunity2phonecall,note:0
+#: field:crm.phonecall2phonecall,note:0
msgid "Note"
msgstr "Nota"
#. module: crm
-#: constraint:res.users:0
-msgid "The chosen company is not in the allowed companies for this user"
-msgstr ""
-"La compañía seleccionada no está en las compañías permitidas para este "
-"usuario"
-
-#. module: crm
#: selection:crm.lead,priority:0
#: selection:crm.lead.report,priority:0
#: selection:crm.phonecall,priority:0
@@ -2419,64 +2028,59 @@ msgid "Low"
msgstr "Bajo"
#. module: crm
-#: selection:crm.add.note,state:0
+#: selection:crm.case.stage,state:0
#: field:crm.lead,date_closed:0
#: selection:crm.lead,state:0
#: view:crm.lead.report:0
#: selection:crm.lead.report,state:0
-#: field:crm.meeting,date_closed:0
-#: selection:crm.merge.opportunity,state:0
#: field:crm.phonecall,date_closed:0
-#: selection:crm.phonecall.report,state:0
-#: selection:crm.send.mail,state:0
msgid "Closed"
msgstr "Cerrado"
#. module: crm
-#: view:crm.installer:0
-msgid "Plug-In"
-msgstr "Conector"
+#: view:crm.lead:0
+msgid "Open Opportunities"
+msgstr "Oportunidades abiertas"
#. module: crm
-#: model:crm.case.categ,name:crm.categ_meet2
-msgid "Internal Meeting"
-msgstr "Reunión interna"
+#: model:crm.case.resource.type,name:crm.type_lead2
+msgid "Email Campaign - Services"
+msgstr "Email campaña - servicios"
#. module: crm
-#: code:addons/crm/crm.py:411
-#: selection:crm.add.note,state:0
-#: view:crm.lead:0
+#: selection:crm.case.stage,state:0
#: selection:crm.lead,state:0
#: view:crm.lead.report:0
#: selection:crm.lead.report,state:0
-#: selection:crm.merge.opportunity,state:0
-#: selection:crm.phonecall,state:0
#: selection:crm.phonecall.report,state:0
-#: selection:crm.send.mail,state:0
-#, python-format
msgid "Pending"
msgstr "Pendiente"
#. module: crm
-#: model:crm.case.categ,name:crm.categ_meet1
-msgid "Customer Meeting"
-msgstr "Reunión de cliente"
+#: model:process.transition,name:crm.process_transition_leadopportunity0
+msgid "Prospect Opportunity"
+msgstr "Oportunidad de prospección"
#. module: crm
-#: view:crm.lead:0
#: field:crm.lead,email_cc:0
msgid "Global CC"
msgstr "CC Global"
#. module: crm
+#: view:crm.lead:0
#: view:crm.phonecall:0
#: model:ir.actions.act_window,name:crm.crm_case_categ_phone0
#: model:ir.ui.menu,name:crm.menu_crm_case_phone
-#: view:res.partner:0
+#: model:ir.ui.menu,name:crm.menu_crm_config_phonecall
msgid "Phone Calls"
msgstr "Llamadas telefónicas"
#. module: crm
+#: view:crm.case.stage:0
+msgid "Stage Search"
+msgstr "Búsqueda de etapa"
+
+#. module: crm
#: help:crm.lead.report,delay_open:0
#: help:crm.phonecall.report,delay_open:0
msgid "Number of Days to open the case"
@@ -2484,114 +2088,59 @@ msgstr "Número de días para abrir el caso"
#. module: crm
#: field:crm.lead,phone:0
+#: field:crm.opportunity2phonecall,phone:0
+#: view:crm.phonecall:0
#: field:crm.phonecall,partner_phone:0
+#: field:crm.phonecall2phonecall,phone:0
msgid "Phone"
msgstr "Teléfono"
#. module: crm
+#: field:crm.case.channel,active:0
#: field:crm.case.section,active:0
#: field:crm.lead,active:0
-#: view:crm.lead.report:0
-#: field:crm.meeting,active:0
#: field:crm.phonecall,active:0
msgid "Active"
msgstr "Activo"
#. module: crm
-#: code:addons/crm/crm_lead.py:306
-#, python-format
-msgid "The stage of opportunity '%s' has been changed to '%s'."
-msgstr "La fase de la oportunidad '%s' ha cambiado a '%s'."
-
-#. module: crm
-#: code:addons/crm/crm_lead.py:282
-#, python-format
-msgid "Changed Stage to: %s"
-msgstr ""
-
-#. module: crm
#: selection:crm.segmentation.line,operator:0
msgid "Mandatory Expression"
msgstr "Expresión obligatoria"
#. module: crm
-#: selection:crm.segmentation.line,expr_operator:0
-msgid ">"
-msgstr ">"
-
-#. module: crm
-#: view:crm.meeting:0
-msgid "Uncertain"
-msgstr "Incierto"
-
-#. module: crm
-#: field:crm.send.mail,email_cc:0
-msgid "CC"
-msgstr "CC"
-
-#. module: crm
-#: view:crm.send.mail:0
-#: model:ir.actions.act_window,name:crm.action_crm_send_mail
+#: view:crm.lead:0
msgid "Send Mail"
msgstr "Enviar correo"
#. module: crm
-#: selection:crm.meeting,freq:0
-msgid "Months"
-msgstr "Meses"
-
-#. module: crm
-#: help:crm.installer,wiki_sale_faq:0
-msgid ""
-"Helps you manage wiki pages for Frequently Asked Questions on Sales "
-"Application."
-msgstr ""
-"Le ayuda a organizar páginas wiki para preguntas frecuentes sobre la "
-"aplicación de ventas"
-
-#. module: crm
-#: help:crm.installer,crm_fundraising:0
-msgid "This may help associations in their fundraising process and tracking."
-msgstr ""
-"Puede ayudar a las asociaciones en su proceso de obtención de fondos y "
-"seguimiento."
-
-#. module: crm
-#: field:crm.lead2opportunity.partner,action:0
-#: field:crm.lead2partner,action:0
-#: field:crm.phonecall2partner,action:0
-msgid "Action"
-msgstr "Acción"
-
-#. module: crm
-#: field:crm.installer,crm_claim:0
-msgid "Claims"
-msgstr "Reclamaciones"
+#: selection:crm.lead2opportunity.partner,action:0
+#: selection:crm.lead2opportunity.partner.mass,action:0
+#: selection:crm.partner.binding,action:0
+msgid "Create a new customer"
+msgstr "Crear un nuevo cliente"
#. module: crm
-#: field:crm.segmentation,som_interval_decrease:0
-msgid "Decrease (0>1)"
-msgstr "Disminuir (0>1)"
+#: field:crm.lead.report,deadline_day:0
+msgid "Exp. Closing Day"
+msgstr "Fecha de cierre esperada"
#. module: crm
-#: view:crm.add.note:0
-#: view:crm.lead:0
-#: view:crm.send.mail:0
-msgid "Attachments"
-msgstr "Datos adjuntos"
+#: model:crm.case.categ,name:crm.categ_oppor2
+msgid "Software"
+msgstr "Software"
#. module: crm
-#: selection:crm.meeting,rrule_type:0
-msgid "Weekly"
-msgstr "Semanal"
+#: field:crm.case.section,change_responsible:0
+msgid "Reassign Escalated"
+msgstr "Reasignar escalado"
#. module: crm
-#: code:addons/crm/wizard/crm_send_email.py:72
-#: code:addons/crm/wizard/crm_send_email.py:169
-#: code:addons/crm/wizard/crm_send_email.py:270
-#, python-format
-msgid "Can not send mail!"
-msgstr "¡No se pudo enviar el correo!"
+#: view:crm.lead.report:0
+#: model:ir.actions.act_window,name:crm.action_report_crm_opportunity
+#: model:ir.ui.menu,name:crm.menu_report_crm_opportunities_tree
+msgid "Opportunities Analysis"
+msgstr "Análisis de oportunidades"
#. module: crm
#: view:crm.lead:0
@@ -2599,199 +2148,81 @@ msgid "Misc"
msgstr "Varios"
#. module: crm
-#: model:crm.case.categ,name:crm.categ_oppor8
-#: view:crm.meeting:0
-msgid "Other"
-msgstr "Otro"
-
-#. module: crm
-#: view:crm.meeting:0
-#: selection:crm.meeting,state:0
-#: selection:crm.phonecall,state:0
-msgid "Done"
-msgstr "Hecho"
-
-#. module: crm
-#: help:crm.meeting,interval:0
-msgid "Repeat every (Days/Week/Month/Year)"
-msgstr "Repetir cada (días/semana/mes/año)"
-
-#. module: crm
-#: field:crm.segmentation,som_interval_max:0
-msgid "Max Interval"
-msgstr "Intervalo máx"
-
-#. module: crm
-#: view:crm.opportunity2phonecall:0
-msgid "_Schedule Call"
-msgstr "_Programar llamada"
-
-#. module: crm
-#: code:addons/crm/crm.py:326
-#: selection:crm.add.note,state:0
#: view:crm.lead:0
-#: selection:crm.lead,state:0
+#: view:crm.lead.report:0
#: selection:crm.lead.report,state:0
-#: selection:crm.merge.opportunity,state:0
-#: view:crm.phonecall:0
-#: selection:crm.phonecall.report,state:0
-#: selection:crm.send.mail,state:0
-#: view:res.partner:0
-#, python-format
msgid "Open"
msgstr "Abierto"
#. module: crm
-#: selection:crm.meeting,week_list:0
-msgid "Tuesday"
-msgstr "Martes"
-
-#. module: crm
+#: view:crm.lead:0
#: field:crm.lead,city:0
msgid "City"
msgstr "Ciudad"
#. module: crm
-#: selection:crm.meeting,show_as:0
-msgid "Busy"
-msgstr "Ocupado"
-
-#. module: crm
-#: field:crm.meeting,interval:0
-msgid "Repeat every"
-msgstr "Repetir cada"
-
-#. module: crm
-#: field:crm.installer,crm_helpdesk:0
-msgid "Helpdesk"
-msgstr "Asistencia/Ayuda"
-
-#. module: crm
-#: field:crm.meeting,recurrency:0
-msgid "Recurrent"
-msgstr "Recurrente"
-
-#. module: crm
-#: code:addons/crm/crm.py:397
-#, python-format
-msgid "The case '%s' has been cancelled."
-msgstr "El caso '%s' ha sido cancelado"
-
-#. module: crm
-#: field:crm.installer,sale_crm:0
-msgid "Opportunity to Quotation"
-msgstr "Oportunidad a presupuesto"
-
-#. module: crm
-#: model:ir.model,name:crm.model_crm_send_mail
-msgid "Send new email"
-msgstr "Enviar nuevo email"
-
-#. module: crm
-#: view:board.board:0
-#: model:ir.actions.act_window,name:crm.act_my_oppor
-msgid "My Open Opportunities"
-msgstr "Mis oportunidades abiertas"
-
-#. module: crm
-#: model:ir.actions.act_window,name:crm.open_board_statistical_dash
-msgid "CRM - Statistics Dashboard"
-msgstr "CRM - Tablero de estadísticas"
+#: selection:crm.case.stage,type:0
+msgid "Both"
+msgstr "Ambos"
#. module: crm
-#: help:crm.meeting,rrule:0
-msgid ""
-"Defines a rule or repeating pattern for recurring events\n"
-"e.g.: Every other month on the last Sunday of the month for 10 occurrences: "
-" FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=-1SU"
-msgstr ""
-"Define una regla o patrón repetitivo para eventos recurrentes.\n"
-"Por ejemplo: Para 10 ocurrencias cada último domingo de cada dos meses : "
-"FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=-1SU"
+#: view:crm.phonecall:0
+msgid "Call Done"
+msgstr "Llamada realizada"
#. module: crm
-#: field:crm.lead,job_id:0
-msgid "Main Job"
-msgstr "Trabajo principal"
+#: view:crm.phonecall:0
+#: field:crm.phonecall,user_id:0
+msgid "Responsible"
+msgstr "Responsable"
#. module: crm
-#: field:base.action.rule,trg_max_history:0
-msgid "Maximum Communication History"
-msgstr "Máximo historial de comunicaciones"
+#: model:crm.case.section,name:crm.crm_case_section_3
+msgid "Direct Marketing"
+msgstr "Marketing directo"
#. module: crm
-#: view:crm.lead2opportunity.partner:0
-#: view:crm.lead2partner:0
-msgid "Are you sure you want to create a partner based on this lead ?"
-msgstr "¿Está seguro que quiere crear una empresa basada en esta iniciativa?"
+#: model:crm.case.categ,name:crm.categ_oppor1
+msgid "Product"
+msgstr "Producto"
#. module: crm
-#: view:crm.meeting:0
-#: field:crm.meeting,categ_id:0
-msgid "Meeting Type"
-msgstr "Tipo de reunión"
+#: field:crm.lead.report,creation_year:0
+msgid "Creation Year"
+msgstr "Año de creación"
#. module: crm
-#: code:addons/crm/wizard/crm_lead_to_opportunity.py:314
-#, python-format
-msgid "Merge with Existing Opportunity"
-msgstr "Fusinar con oportunidad existente"
+#: view:crm.lead2opportunity.partner.mass:0
+msgid "Conversion Options"
+msgstr "Opciones de conversión"
#. module: crm
-#: help:crm.lead,state:0
-#: help:crm.phonecall,state:0
+#: view:crm.case.section:0
msgid ""
-"The state is set to 'Draft', when a case is created. "
-" \n"
-"If the case is in progress the state is set to 'Open'. "
-" \n"
-"When the case is over, the state is set to 'Done'. "
-" \n"
-"If the case needs to be reviewed then the state is set to 'Pending'."
+"Follow this salesteam to automatically track the events associated to users "
+"of this team."
msgstr ""
-"El estado se establece a 'Borrador', cuando se crea un caso. "
-" \n"
-"Si el caso está en progreso el estado se establece a 'Abierto'. "
-" \n"
-"Cuando el caso se cierra, el estado se establece a 'Realizado'. "
-" \n"
-"Si el caso necesita ser revisado entonces en estado se establece a "
-"'Pendiente'."
-
-#. module: crm
-#: view:crm.meeting:0
-#: view:res.partner:0
-msgid "End Date"
-msgstr "Fecha final"
+"Seguir a este equipo de ventas para rastrear automáticamente los eventos "
+"asociados a los usuarios de este equipo."
#. module: crm
-#: selection:crm.meeting,byday:0
-msgid "Third"
-msgstr "Tercero"
+#: view:crm.lead:0
+msgid "Address"
+msgstr "Dirección"
#. module: crm
-#: help:crm.segmentation,som_interval_max:0
+#: help:crm.case.section,alias_id:0
msgid ""
-"The computation is made on all events that occured during this interval, the "
-"past X periods."
+"The email address associated with this team. New emails received will "
+"automatically create new leads assigned to the team."
msgstr ""
-"El cálculo se realiza en todos los eventos que ocurran durante este "
-"intervalo, los X períodos anteriores."
+"La dirección de correo asociada a este equipo. Nuevos emails recibidos "
+"crearán automáticamente nuevas iniciativas asociadas al equipo."
#. module: crm
-#: view:board.board:0
-msgid "My Win/Lost Ratio for the Last Year"
-msgstr "Mi coeficiente ganado/perdido del año anterior"
-
-#. module: crm
-#: field:crm.installer,thunderbird:0
-msgid "Thunderbird"
-msgstr "Thunderbird"
-
-#. module: crm
-#: view:crm.lead.report:0
-msgid "# of Emails"
-msgstr "Nº de e-mails"
+#: view:crm.lead:0
+msgid "Unassigned Opportunities"
+msgstr "Oportunidades sin asignar"
#. module: crm
#: view:crm.lead:0
@@ -2806,24 +2237,24 @@ msgid "Delay to open"
msgstr "Retraso de apertura"
#. module: crm
-#: view:crm.meeting:0
-msgid "Recurrency period"
-msgstr "Periodo de recurrencia"
-
-#. module: crm
-#: field:crm.meeting,week_list:0
-msgid "Weekday"
-msgstr "Día de la semana"
+#: model:ir.actions.act_window,name:crm.crm_case_categ_phone_outgoing0
+#: model:ir.ui.menu,name:crm.menu_crm_case_phone_outbound
+msgid "Scheduled Calls"
+msgstr "Llamadas planificadas"
#. module: crm
-#: view:crm.lead:0
-msgid "Referrer"
-msgstr "Referenciado por"
+#: field:crm.lead,id:0
+msgid "ID"
+msgstr "ID"
#. module: crm
-#: model:ir.model,name:crm.model_crm_lead2opportunity
-msgid "Lead To Opportunity"
-msgstr "Iniciativa a opportunidad"
+#: help:crm.lead,type_id:0
+msgid ""
+"From which campaign (seminar, marketing campaign, mass mailing, ...) did "
+"this contact come from?"
+msgstr ""
+"Campaña de procedencia (seminario, campaña de marketing, mailing masivo, ... "
+") de este contacto"
#. module: crm
#: model:ir.model,name:crm.model_calendar_attendee
@@ -2841,23 +2272,11 @@ msgid "Continue Process"
msgstr "Continuar el proceso"
#. module: crm
-#: view:crm.installer:0
-msgid "Configure Your CRM Application"
-msgstr "Configure su aplicación CRM"
-
-#. module: crm
-#: model:ir.model,name:crm.model_crm_phonecall2partner
-msgid "Phonecall to Partner"
-msgstr "Llamada telefónica a empresa"
-
-#. module: crm
-#: help:crm.lead,partner_name:0
-msgid ""
-"The name of the future partner that will be created while converting the "
-"into opportunity"
-msgstr ""
-"El nombre del futuro cliente que se creará cuando se convierta en "
-"oportunidad."
+#: selection:crm.lead2opportunity.partner,name:0
+#: selection:crm.lead2opportunity.partner.mass,name:0
+#: model:ir.actions.act_window,name:crm.action_crm_lead2opportunity_partner
+msgid "Convert to opportunity"
+msgstr "Convertir a oportunidad"
#. module: crm
#: field:crm.opportunity2phonecall,user_id:0
@@ -2866,42 +2285,51 @@ msgid "Assign To"
msgstr "Asignar a"
#. module: crm
-#: field:crm.add.note,state:0
-#: field:crm.send.mail,state:0
-msgid "Set New State To"
-msgstr "Establecer nuevo estado a"
-
-#. module: crm
#: field:crm.lead,date_action_last:0
-#: field:crm.meeting,date_action_last:0
#: field:crm.phonecall,date_action_last:0
msgid "Last Action"
msgstr "Última acción"
#. module: crm
-#: field:crm.meeting,duration:0
#: field:crm.phonecall,duration:0
#: field:crm.phonecall.report,duration:0
msgid "Duration"
msgstr "Duración"
#. module: crm
-#: field:crm.send.mail,reply_to:0
-msgid "Reply To"
-msgstr "Responder a"
-
-#. module: crm
-#: view:board.board:0
-#: model:ir.actions.act_window,name:crm.open_board_crm
-#: model:ir.ui.menu,name:crm.menu_board_crm
-msgid "Sales Dashboard"
-msgstr "Tablero de ventas"
-
-#. module: crm
-#: code:addons/crm/wizard/crm_lead_to_partner.py:56
-#, python-format
-msgid "A partner is already defined on this lead."
-msgstr "Una empresa ya ha sido definida en esta iniciativa."
+#: model:ir.actions.act_window,help:crm.crm_case_categ_phone_outgoing0
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to schedule a call \n"
+" </p><p>\n"
+" OpenERP allows you to easily define all the calls to be done\n"
+" by your sales team and follow up based on their summary.\n"
+" </p><p> \n"
+" You can use the import feature to massively import a new list "
+"of\n"
+" prospects to qualify.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+"Pulse para planificar una llamada.\n"
+"</p><p>\n"
+"OpenERP le permite definir fácilmente las llamadas a ser realizadas por su "
+"equipo de ventas y seguirlas basadas en su resumen.\n"
+"</p><p> \n"
+"Puede usar la característica de importación para importar masivamente una "
+"nueva lista de prospectos a calificar.\n"
+"</p>\n"
+" "
+
+#. module: crm
+#: help:crm.case.stage,fold:0
+msgid ""
+"This stage is not visible, for example in status bar or kanban view, when "
+"there are no records in that stage to display."
+msgstr ""
+"Esta etapa no es visible, por ejemplo en la barra de estado o vista kanban, "
+"cuando no hay registros en este estado para visualizar"
#. module: crm
#: field:crm.lead.report,nbr:0
@@ -2910,33 +2338,19 @@ msgid "# of Cases"
msgstr "# de casos"
#. module: crm
-#: help:crm.meeting,section_id:0
#: help:crm.phonecall,section_id:0
msgid "Sales team to which Case belongs to."
msgstr "Equipo de ventas al cual pertence el caso"
#. module: crm
-#: selection:crm.meeting,week_list:0
-msgid "Sunday"
-msgstr "Domingo"
-
-#. module: crm
-#: selection:crm.meeting,byday:0
-msgid "Fourth"
-msgstr "Cuarto"
-
-#. module: crm
-#: selection:crm.add.note,state:0
-#: selection:crm.merge.opportunity,state:0
-#: selection:crm.send.mail,state:0
-msgid "Unchanged"
-msgstr "Sin cambios"
+#: model:crm.case.resource.type,name:crm.type_lead6
+msgid "Banner Ads"
+msgstr "Anuncios"
#. module: crm
-#: model:ir.actions.act_window,name:crm.crm_segmentation_tree-act
-#: model:ir.ui.menu,name:crm.menu_crm_segmentation-act
-msgid "Partners Segmentation"
-msgstr "Segmentación de empresas"
+#: field:crm.merge.opportunity,opportunity_ids:0
+msgid "Leads/Opportunities"
+msgstr "Iniciativas/Oportunidades"
#. module: crm
#: field:crm.lead,fax:0
@@ -2944,35 +2358,6 @@ msgid "Fax"
msgstr "Fax"
#. module: crm
-#: model:ir.actions.act_window,help:crm.crm_case_category_act_oppor11
-msgid ""
-"With opportunities you can manage and keep track of your sales pipeline by "
-"creating specific customer- or prospect-related sales documents to follow up "
-"potential sales. Information such as expected revenue, opportunity stage, "
-"expected closing date, communication history and much more can be stored. "
-"Opportunities can be connected to the email gateway: new emails may create "
-"opportunities, each of them automatically gets the history of the "
-"conversation with the customer.\n"
-"\n"
-"You and your team(s) will be able to plan meetings and phone calls from "
-"opportunities, convert them into quotations, manage related documents, track "
-"all customer related activities, and much more."
-msgstr ""
-"Con las oportunidades puede gestionar y guardar el registro de su canal de "
-"ventas creando documentos específicos de venta por cliente - o potencial "
-"cliente - para el seguimiento de sus ventas potenciales. La información "
-"sobre ingresos esperados, etapa de la oportunidad, fecha estimada de cierre, "
-"histórico de las comunicaciones y muchos otros datos puede ser registrada. "
-"Las oportunidades pueden ser conectadas a la pasarela de correo electrónico: "
-"nuevos emails pueden crear oportunidades, y cada uno de ellos obtiene "
-"automáticamente el historial de la conversación con el cliente."
-
-#. module: crm
-#: view:crm.meeting:0
-msgid "Assignment"
-msgstr "Asignación"
-
-#. module: crm
#: field:crm.lead,company_id:0
#: view:crm.lead.report:0
#: field:crm.lead.report,company_id:0
@@ -2983,25 +2368,24 @@ msgid "Company"
msgstr "Compañía"
#. module: crm
-#: selection:crm.meeting,week_list:0
-msgid "Friday"
-msgstr "Viernes"
+#: selection:crm.segmentation,state:0
+msgid "Running"
+msgstr "En proceso"
#. module: crm
-#: field:crm.meeting,allday:0
-msgid "All Day"
-msgstr "Todo el día"
+#: model:mail.message.subtype,description:crm.mt_lead_convert_to_opportunity
+msgid "Lead converted into an opportunity"
+msgstr "Iniciativa convertida a oportunidad"
#. module: crm
-#: field:crm.segmentation.line,operator:0
-msgid "Mandatory / Optional"
-msgstr "Obligatorio / Opcional"
+#: view:crm.lead:0
+msgid "Unassigned Leads"
+msgstr "Iniciativas sin asignar"
#. module: crm
-#: model:ir.actions.act_window,name:crm.action_view_attendee_form
-#: model:ir.ui.menu,name:crm.menu_attendee_invitations
-msgid "Meeting Invitations"
-msgstr "Invitaciones a reunión"
+#: model:mail.message.subtype,description:crm.mt_lead_won
+msgid "Opportunity won"
+msgstr "Oportunidad ganada"
#. module: crm
#: field:crm.case.categ,object_id:0
@@ -3009,52 +2393,31 @@ msgid "Object Name"
msgstr "Nombre del objeto"
#. module: crm
-#: help:crm.lead,email_from:0
-msgid "E-mail address of the contact"
-msgstr "e-mail del contacto"
-
-#. module: crm
-#: field:crm.lead,referred:0
-msgid "Referred by"
-msgstr "Referenciado por"
+#: view:crm.phonecall:0
+msgid "Phone Calls Assigned to Me or My Team(s)"
+msgstr "Llamadas asignadas a mí o a mi equipo"
#. module: crm
#: view:crm.lead:0
-#: model:ir.model,name:crm.model_crm_add_note
-msgid "Add Internal Note"
-msgstr "Añadir nota interna"
-
-#. module: crm
-#: code:addons/crm/crm_lead.py:304
-#, python-format
-msgid "The stage of lead '%s' has been changed to '%s'."
-msgstr "La etapa de la iniciativa '%s' ha sido cambiada por '%s'"
+msgid "Reset"
+msgstr "Restablecer"
#. module: crm
-#: selection:crm.meeting,byday:0
-msgid "Last"
-msgstr "Último"
+#: view:sale.config.settings:0
+msgid "After-Sale Services"
+msgstr "Servicios Post-venta"
#. module: crm
+#: field:crm.case.section,message_ids:0
#: field:crm.lead,message_ids:0
-#: field:crm.meeting,message_ids:0
#: field:crm.phonecall,message_ids:0
msgid "Messages"
msgstr "Mensajes"
#. module: crm
-#: help:crm.case.stage,on_change:0
-msgid "Change Probability on next and previous stages."
-msgstr "Cambiar probabilidad para las etapas siguientes y anteriores."
-
-#. module: crm
-#: code:addons/crm/crm.py:455
-#: code:addons/crm/crm.py:457
-#: code:addons/crm/crm_action_rule.py:66
-#: code:addons/crm/wizard/crm_send_email.py:141
-#, python-format
-msgid "Error!"
-msgstr "¡Error!"
+#: help:crm.lead,channel_id:0
+msgid "Communication channel (mail, direct, phone, ...)"
+msgstr "Canal de comunicación (email, directo, teléfono, ...)"
#. module: crm
#: field:crm.opportunity2phonecall,name:0
@@ -3063,65 +2426,18 @@ msgid "Call summary"
msgstr "Resumen de la llamada"
#. module: crm
-#: selection:crm.add.note,state:0
+#: selection:crm.case.stage,state:0
#: selection:crm.lead,state:0
#: selection:crm.lead.report,state:0
-#: selection:crm.meeting,state:0
-#: selection:crm.merge.opportunity,state:0
#: selection:crm.phonecall,state:0
#: selection:crm.phonecall.report,state:0
-#: selection:crm.send.mail,state:0
msgid "Cancelled"
msgstr "Cancelado"
#. module: crm
-#: field:crm.add.note,body:0
-msgid "Note Body"
-msgstr "Contenido de la nota"
-
-#. module: crm
-#: view:board.board:0
-msgid "My Planned Revenues by Stage"
-msgstr "Mis ingresos previstos por etapa"
-
-#. module: crm
-#: field:crm.lead.report,date_closed:0
-#: field:crm.phonecall.report,date_closed:0
-msgid "Close Date"
-msgstr "Fecha cierre"
-
-#. module: crm
-#: view:crm.lead.report:0
-#: view:crm.phonecall.report:0
-msgid " Month "
-msgstr " Mes "
-
-#. module: crm
-#: view:crm.lead:0
-msgid "Links"
-msgstr "Enlaces"
-
-#. module: crm
-#: model:ir.actions.act_window,help:crm.crm_lead_categ_action
-msgid ""
-"Create specific categories that fit your company's activities to better "
-"classify and analyse your leads and opportunities. Such categories could for "
-"instance reflect your product structure or the different types of sales you "
-"do."
-msgstr ""
-"Crear categorías específicas que se adapten a las actividades de su compañía "
-"para clasificar y analizar mejor sus iniciativas y oportunidades. Estas "
-"categorías podrían, por ejemplo, reflejar la estructura de sus productos o "
-"de los distintos tipos de ventas que realice."
-
-#. module: crm
-#: help:crm.segmentation,som_interval_decrease:0
-msgid ""
-"If the partner has not purchased (or bought) during a period, decrease the "
-"state of mind by this factor. It's a multiplication"
-msgstr ""
-"Si la empresa no ha comprado durante un período, disminuir el grado de "
-"satisfacción por este factor. Es una multiplicación."
+#: field:crm.lead,color:0
+msgid "Color Index"
+msgstr "Índice de colores"
#. module: crm
#: model:ir.actions.act_window,help:crm.action_report_crm_phonecall
@@ -3137,30 +2453,17 @@ msgstr ""
"añadiendo más grupos al informe."
#. module: crm
-#: view:crm.case.section:0
-msgid "Mailgateway"
-msgstr "Pasarela de correo"
-
-#. module: crm
-#: help:crm.lead,user_id:0
-msgid "By Default Salesman is Administrator when create New User"
-msgstr ""
-"Por defecto el vendedor es administrador cuando se crea un nuevo usuario"
-
-#. module: crm
-#: view:crm.lead.report:0
-msgid "# Mails"
-msgstr "Nº de correos"
+#: field:crm.case.stage,fold:0
+msgid "Fold by Default"
+msgstr "Replegar por defecto"
#. module: crm
-#: code:addons/crm/wizard/crm_phonecall_to_opportunity.py:57
-#, python-format
-msgid "Warning"
-msgstr "Aviso"
+#: field:crm.case.stage,state:0
+msgid "Related Status"
+msgstr "Estado relacionado"
#. module: crm
#: field:crm.phonecall,name:0
-#: view:res.partner:0
msgid "Call Summary"
msgstr "Resumen de llamadas"
@@ -3170,43 +2473,41 @@ msgid "Operator"
msgstr "Operador"
#. module: crm
-#: model:ir.model,name:crm.model_crm_phonecall2phonecall
-msgid "Phonecall To Phonecall"
-msgstr "Llamada telefónica a llamada telefónica"
-
-#. module: crm
#: view:crm.lead:0
+#: model:ir.actions.act_window,name:crm.opportunity2phonecall_act
msgid "Schedule/Log Call"
msgstr "Planificar/Registrar llamada"
#. module: crm
-#: field:crm.installer,fetchmail:0
-msgid "Fetch Emails"
-msgstr "Buscar emails"
+#: view:crm.merge.opportunity:0
+msgid "Select Leads/Opportunities"
+msgstr "Seleccionar Iniciativas/Oportunidades"
#. module: crm
-#: selection:crm.meeting,state:0
+#: selection:crm.phonecall,state:0
msgid "Confirmed"
msgstr "Confirmado"
#. module: crm
-#: help:crm.send.mail,email_cc:0
-msgid ""
-"These addresses will receive a copy of this email. To modify the permanent "
-"CC list, edit the global CC field of this case"
+#: model:ir.model,name:crm.model_crm_partner_binding
+msgid "Handle partner binding or generation in CRM wizards."
msgstr ""
-"Estas direcciones recibirán una copia de este correo electrónico. Para "
-"modificar la lista CC permanente, edite el campo CC global de este caso."
+"Asistentes CRM para gestionar el enlanzamiento o la generación de empresas."
+
+#. module: crm
+#: model:ir.actions.act_window,name:crm.act_oppor_stage_user
+msgid "Planned Revenue By User and Stage"
+msgstr "Ingresos previstos por Usuario y Etapa"
#. module: crm
-#: view:crm.meeting:0
+#: view:crm.phonecall:0
msgid "Confirm"
msgstr "Confirmar"
#. module: crm
-#: field:crm.meeting,su:0
-msgid "Sun"
-msgstr "Dom"
+#: view:crm.lead:0
+msgid "Unread messages"
+msgstr "Mensajes sin leer"
#. module: crm
#: field:crm.phonecall.report,section_id:0
@@ -3214,81 +2515,79 @@ msgid "Section"
msgstr "Sección"
#. module: crm
-#: view:crm.lead:0
-msgid "Total of Planned Revenue"
-msgstr "Total ingresos previstos"
-
-#. module: crm
-#: code:addons/crm/crm.py:375
-#, python-format
-msgid ""
-"You can not escalate, You are already at the top level regarding your sales-"
-"team category."
-msgstr ""
-"No puede escalar, ya está en el nivel más alto en su categoría de equipo de "
-"ventas."
-
-#. module: crm
#: selection:crm.segmentation.line,operator:0
msgid "Optional Expression"
msgstr "Expresión opcional"
#. module: crm
-#: selection:crm.meeting,select1:0
-msgid "Day of month"
-msgstr "Día del mes"
+#: field:crm.case.section,message_follower_ids:0
+#: field:crm.lead,message_follower_ids:0
+#: field:crm.phonecall,message_follower_ids:0
+msgid "Followers"
+msgstr "Seguidores"
#. module: crm
-#: field:crm.lead2opportunity,probability:0
-msgid "Success Rate (%)"
-msgstr "Tasa de éxito (%)"
-
-#. module: crm
-#: model:crm.case.stage,name:crm.stage_lead1
-#: model:crm.case.stage,name:crm.stage_opportunity1
-msgid "New"
-msgstr "Nuevo"
+#: model:ir.actions.act_window,help:crm.crm_case_category_act_leads_all
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create an unqualified lead.\n"
+" </p><p>\n"
+" Use leads if you need a qualification step before creating an\n"
+" opportunity or a customer. It can be a business card you "
+"received,\n"
+" a contact form filled in your website, or a file of unqualified\n"
+" prospects you import, etc.\n"
+" </p><p>\n"
+" Once qualified, the lead can be converted into a business\n"
+" opportunity and/or a new customer in your address book.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+"Pulse para crear una iniciativa sin calificar.\n"
+"</p><p>\n"
+"Use las iniciativas si necesita un paso de calificación antes de crear una "
+"oportunidad o un cliente. Puede ser una tarjeta de visita que recibió, un "
+"formulario de contacto rellenado en su sitio web, o un archivo de prospectos "
+"sin calificar importado.\n"
+"</p><p>\n"
+"Una vez calificada, la iniciativa se puede convertir en una oportunidad de "
+"negocio y/o un nuevo cliente en su libreta de direcciones.\n"
+"</p>\n"
+" "
#. module: crm
-#: view:crm.meeting:0
-msgid "Mail TO"
-msgstr "Enviar correo a"
+#: field:sale.config.settings,fetchmail_lead:0
+msgid "Create leads from incoming mails"
+msgstr "Crear iniciativa desde correos entrantes"
#. module: crm
#: view:crm.lead:0
#: field:crm.lead,email_from:0
-#: field:crm.meeting,email_from:0
#: field:crm.phonecall,email_from:0
msgid "Email"
msgstr "Email"
#. module: crm
+#: view:crm.case.channel:0
#: view:crm.lead:0
#: field:crm.lead,channel_id:0
#: view:crm.lead.report:0
#: field:crm.lead.report,channel_id:0
-#: field:crm.phonecall,canal_id:0
msgid "Channel"
msgstr "Canal"
#. module: crm
-#: model:ir.actions.act_window,name:crm.opportunity2phonecall_act
+#: view:crm.opportunity2phonecall:0
+#: view:crm.phonecall2phonecall:0
msgid "Schedule Call"
msgstr "Planificar llamada"
#. module: crm
-#: code:addons/crm/wizard/crm_lead_to_opportunity.py:135
-#: code:addons/crm/wizard/crm_lead_to_opportunity.py:260
-#, python-format
-msgid "Closed/Cancelled Leads Could not convert into Opportunity"
-msgstr ""
-"Las iniciativas cerradas/canceladas no podrían ser convertidas en "
-"oportunidades"
-
-#. module: crm
-#: view:crm.segmentation:0
-msgid "Profiling"
-msgstr "Perfiles"
+#: view:crm.lead.report:0
+#: view:crm.phonecall.report:0
+msgid "My Sales Team(s)"
+msgstr "Mi equipo de ventas"
#. module: crm
#: help:crm.segmentation,exclusif:0
@@ -3304,180 +2603,131 @@ msgstr ""
"con los criterios de segmentación."
#. module: crm
-#: field:crm.meeting,exdate:0
-msgid "Exception Date/Times"
-msgstr "Fecha/horas excepción"
-
-#. module: crm
-#: selection:crm.meeting,class:0
-msgid "Confidential"
-msgstr "Confidencial"
-
-#. module: crm
-#: help:crm.meeting,date_deadline:0
-msgid ""
-"Deadline Date is automatically computed from Start "
-"Date + Duration"
-msgstr ""
-"La fecha límite se calcula automáticamente a partir de la fecha inicial + "
-"duración."
-
-#. module: crm
-#: field:crm.lead,state_id:0
-msgid "Fed. State"
-msgstr "Provincia"
-
-#. module: crm
#: model:process.transition,note:crm.process_transition_leadopportunity0
msgid "Creating business opportunities from Leads"
msgstr "Creando oportunidades de negocio desde iniciativas"
#. module: crm
-#: help:crm.send.mail,html:0
-msgid "Select this if you want to send email with HTML formatting."
-msgstr "Seleccione esta opción si desea enviar emails con formato HTML"
-
-#. module: crm
-#: model:crm.case.categ,name:crm.categ_oppor4
-msgid "Need Information"
-msgstr "Necesita información"
-
-#. module: crm
-#: model:process.transition,name:crm.process_transition_leadopportunity0
-msgid "Prospect Opportunity"
-msgstr "Oportunidad de prospección"
-
-#. module: crm
-#: view:crm.installer:0
-#: model:ir.actions.act_window,name:crm.action_crm_installer
-msgid "CRM Application Configuration"
-msgstr "Configuración de la aplicación CRM"
+#: model:crm.case.resource.type,name:crm.type_lead3
+msgid "Email Campaign - Products"
+msgstr "Campaña email - productos"
#. module: crm
-#: field:base.action.rule,act_categ_id:0
-msgid "Set Category to"
-msgstr "Establecer categoría"
+#: model:ir.actions.act_window,help:crm.crm_case_categ_phone_incoming0
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to log the summary of a phone call. \n"
+" </p><p>\n"
+" OpenERP allows you to log inbound calls on the fly to track the\n"
+" history of the communication with a customer or to inform "
+"another\n"
+" team member.\n"
+" </p><p>\n"
+" In order to follow up on the call, you can trigger a request "
+"for\n"
+" another call, a meeting or an opportunity.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+"Pulse para registrar el resumen de una llamada telefónica.\n"
+"</p><p>\n"
+"OpenERP le permite registrar las llamadas entrantes sobre la marcha para "
+"mantener el histórico de comunicación con un cliente o informar a otro "
+"miembro del equipo.\n"
+"</p><p>\n"
+"Para seguir una llamada, puede lanzar una petición para otra llamada, una "
+"reunión o una oportunidad.\n"
+"</p>\n"
+" "
#. module: crm
-#: view:crm.case.section:0
-msgid "Configuration"
-msgstr "Configuración"
+#: model:process.node,note:crm.process_node_leads0
+msgid "Very first contact with new prospect"
+msgstr "Primer contacto con nueva prospección"
#. module: crm
-#: field:crm.meeting,th:0
-msgid "Thu"
-msgstr "Jue"
+#: view:res.partner:0
+msgid "Calls"
+msgstr "Llamadas"
#. module: crm
-#: view:crm.add.note:0
-#: view:crm.merge.opportunity:0
-#: view:crm.opportunity2phonecall:0
-#: view:crm.partner2opportunity:0
-#: view:crm.phonecall2opportunity:0
-#: view:crm.phonecall2phonecall:0
-#: view:crm.send.mail:0
-msgid "_Cancel"
-msgstr "_Cancelar"
+#: field:crm.case.stage,on_change:0
+msgid "Change Probability Automatically"
+msgstr "Cambiar la probabilidad automáticamente"
#. module: crm
-#: view:crm.lead.report:0
#: view:crm.phonecall.report:0
-msgid " Month-1 "
-msgstr " Mes-1 "
+msgid "My Phone Calls"
+msgstr "Mis llamadas"
#. module: crm
-#: help:crm.installer,sale_crm:0
-msgid "This module relates sale from opportunity cases in the CRM."
-msgstr "Este módulo relaciona ventas con oportunidades en el CRM."
-
-#. module: crm
-#: selection:crm.meeting,rrule_type:0
-msgid "Daily"
-msgstr "Diario"
-
-#. module: crm
-#: model:crm.case.stage,name:crm.stage_lead2
-#: model:crm.case.stage,name:crm.stage_opportunity2
+#: model:crm.case.stage,name:crm.stage_lead3
msgid "Qualification"
msgstr "Calificación"
#. module: crm
-#: view:crm.case.stage:0
-msgid "Stage Definition"
-msgstr "Definición de etapa"
-
-#. module: crm
-#: selection:crm.meeting,byday:0
-msgid "First"
-msgstr "Primero"
-
-#. module: crm
-#: selection:crm.lead.report,month:0
-#: selection:crm.meeting,month_list:0
-#: selection:crm.phonecall.report,month:0
-msgid "December"
-msgstr "Diciembre"
+#: field:crm.lead2opportunity.partner,name:0
+#: field:crm.lead2opportunity.partner.mass,name:0
+msgid "Conversion Action"
+msgstr "Acciones de conversión"
#. module: crm
-#: field:crm.installer,config_logo:0
-msgid "Image"
-msgstr "Imagen"
-
-#. module: crm
-#: view:base.action.rule:0
-msgid "Condition on Communication History"
-msgstr "Condición en el historial de comunicaciones"
-
-#. module: crm
-#: help:crm.segmentation,som_interval:0
+#: model:ir.actions.act_window,help:crm.crm_lead_categ_action
msgid ""
-"A period is the average number of days between two cycle of sale or purchase "
-"for this segmentation. \n"
-"It's mainly used to detect if a partner has not purchased or buy for a too "
-"long time, \n"
-"so we suppose that his state of mind has decreased because he probably "
-"bought goods to another supplier. \n"
-"Use this functionality for recurring businesses."
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to define a new sales tag.\n"
+" </p><p>\n"
+" Create specific tags that fit your company's activities\n"
+" to better classify and analyse your leads and "
+"opportunities.\n"
+" Such categories could for instance reflect your product\n"
+" structure or the different types of sales you do.\n"
+" </p>\n"
+" "
msgstr ""
-"Un periodo es el número medio de días entre dos ciclos de ventas o compras "
-"para esta segmentación. \n"
-"Se utiliza principalmente para detectar si una empresa no ha comprado por un "
-"largo periodo de tiempo, \n"
-"por lo que suponemos que su grado de satisfacción ha disminuido porqué "
-"seguramente compró bienes a otro proveedor. \n"
-"Utilice esta funcionalidad para negocios recurrentes."
+"<p class=\"oe_view_nocontent_create\">\n"
+"Pulse para definir una nueva etiqueta de ventas.\n"
+"</p><p>\n"
+"Cree etiquetas específicas que se ajusten a las actividades de su compañía "
+"para clasificar y analizar mejor sus iniciativas y oportunidades. Dichas "
+"categorías pueden reflejar por ejemplo su estructura de productos o los "
+"diferentes tipos de ventas que hace.\n"
+"</p>\n"
+" "
+
+#. module: crm
+#: selection:crm.lead.report,creation_month:0
+#: selection:crm.lead.report,deadline_month:0
+#: selection:crm.phonecall.report,month:0
+msgid "August"
+msgstr "Agosto"
#. module: crm
-#: view:crm.send.mail:0
-msgid "_Send Reply"
-msgstr "_Enviar respuesta"
+#: model:mail.message.subtype,name:crm.mt_lead_lost
+#: model:mail.message.subtype,name:crm.mt_salesteam_lead_lost
+msgid "Opportunity Lost"
+msgstr "Oportunidad perdida"
#. module: crm
-#: field:crm.meeting,vtimezone:0
-msgid "Timezone"
-msgstr "Zona horaria"
+#: field:crm.lead.report,deadline_month:0
+msgid "Exp. Closing Month"
+msgstr "Mes de cierre previsto"
#. module: crm
-#: field:crm.lead2opportunity.partner,msg:0
-#: field:crm.lead2partner,msg:0
-#: view:crm.send.mail:0
-msgid "Message"
-msgstr "Mensaje"
+#: selection:crm.lead.report,creation_month:0
+#: selection:crm.lead.report,deadline_month:0
+#: selection:crm.phonecall.report,month:0
+msgid "December"
+msgstr "Diciembre"
#. module: crm
-#: field:crm.meeting,sa:0
-msgid "Sat"
-msgstr "Sáb"
+#: view:crm.phonecall:0
+msgid "Date of Call"
+msgstr "Fecha de la llamada"
#. module: crm
#: view:crm.lead:0
-#: field:crm.lead,user_id:0
-#: view:crm.lead.report:0
-#: view:crm.phonecall.report:0
-msgid "Salesman"
-msgstr "Comercial"
-
-#. module: crm
#: field:crm.lead,date_deadline:0
msgid "Expected Closing"
msgstr "Cierre previsto"
@@ -3488,9 +2738,9 @@ msgid "Opportunity to Phonecall"
msgstr "Oportunidad a llamada telefónica"
#. module: crm
-#: help:crm.case.section,allow_unlink:0
-msgid "Allows to delete non draft cases"
-msgstr "Permite eliminar los casos en estado no borrador."
+#: view:crm.segmentation:0
+msgid "Sales Purchase"
+msgstr "Compra Ventas"
#. module: crm
#: view:crm.lead:0
@@ -3498,16 +2748,14 @@ msgid "Schedule Meeting"
msgstr "Programar reunión"
#. module: crm
-#: view:crm.lead:0
-msgid "Partner Name"
-msgstr "Nombre empresa"
+#: field:crm.lead.report,deadline_year:0
+msgid "Ex. Closing Year"
+msgstr "Año de cierre previsto"
#. module: crm
-#: model:crm.case.categ,name:crm.categ_phone2
-#: model:ir.actions.act_window,name:crm.crm_case_categ_phone_outgoing0
-#: model:ir.ui.menu,name:crm.menu_crm_case_phone_outbound
-msgid "Outbound"
-msgstr "Saliente"
+#: model:ir.actions.client,name:crm.action_client_crm_menu
+msgid "Open Sale Menu"
+msgstr "Menu ventas abiertas"
#. module: crm
#: field:crm.lead,date_open:0
@@ -3522,28 +2770,20 @@ msgid "Team Members"
msgstr "Miembros del equipo"
#. module: crm
-#: view:crm.lead:0
-#: field:crm.lead,job_ids:0
-#: view:crm.meeting:0
-#: view:crm.phonecall:0
-#: view:res.partner:0
-msgid "Contacts"
-msgstr "Contactos"
-
-#. module: crm
-#: model:crm.case.categ,name:crm.categ_oppor1
-msgid "Interest in Computer"
-msgstr "Interesado en ordenadores"
+#: view:crm.opportunity2phonecall:0
+#: view:crm.phonecall2phonecall:0
+msgid "Schedule/Log a Call"
+msgstr "Planificar/Registrar una llamada"
#. module: crm
-#: view:crm.meeting:0
-msgid "Invitation Detail"
-msgstr "Detalle de la invitación"
+#: field:crm.lead,planned_cost:0
+msgid "Planned Costs"
+msgstr "Costos previstos"
#. module: crm
-#: field:crm.segmentation,som_interval_default:0
-msgid "Default (0=None)"
-msgstr "Por defecto (0=Ninguno)"
+#: help:crm.lead,date_deadline:0
+msgid "Estimate of the date on which the opportunity will be won."
+msgstr "Fecha estimada en la que la oportunidad será ganada"
#. module: crm
#: help:crm.lead,email_cc:0
@@ -3557,28 +2797,16 @@ msgstr ""
"las diferentes direcciones de correo con una coma."
#. module: crm
-#: constraint:res.partner:0
-msgid "Error ! You can not create recursive associated members."
-msgstr "¡Error! No puede crear miembros asociados recursivos."
-
-#. module: crm
-#: field:crm.partner2opportunity,probability:0
-#: field:crm.phonecall2opportunity,probability:0
-msgid "Success Probability"
-msgstr "Probabilidad de éxito"
+#: model:ir.actions.act_window,name:crm.crm_case_categ_phone_incoming0
+#: model:ir.ui.menu,name:crm.menu_crm_case_phone_inbound
+msgid "Logged Calls"
+msgstr "Llamadas registradas"
#. module: crm
-#: code:addons/crm/crm.py:426
-#: selection:crm.add.note,state:0
-#: selection:crm.lead,state:0
-#: selection:crm.lead.report,state:0
-#: selection:crm.merge.opportunity,state:0
-#: selection:crm.phonecall,state:0
-#: selection:crm.phonecall.report,state:0
-#: selection:crm.send.mail,state:0
-#, python-format
-msgid "Draft"
-msgstr "Borrador"
+#: model:mail.message.subtype,name:crm.mt_lead_won
+#: model:mail.message.subtype,name:crm.mt_salesteam_lead_won
+msgid "Opportunity Won"
+msgstr "Oportunidad ganada"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_case_section_act_tree
@@ -3586,16 +2814,10 @@ msgid "Cases by Sales Team"
msgstr "Casos por equipo de ventas"
#. module: crm
-#: field:crm.meeting,attendee_ids:0
-msgid "Attendees"
-msgstr "Asistentes"
-
-#. module: crm
-#: view:crm.meeting:0
+#: view:crm.lead:0
#: view:crm.phonecall:0
#: model:ir.model,name:crm.model_crm_meeting
#: model:process.node,name:crm.process_node_meeting0
-#: model:res.request.link,name:crm.request_link_meeting
msgid "Meeting"
msgstr "Reunión"
@@ -3605,32 +2827,11 @@ msgid "Category of Case"
msgstr "Categoría de caso"
#. module: crm
-#: view:crm.lead:0
-#: view:crm.phonecall:0
-msgid "7 Days"
-msgstr "7 días"
-
-#. module: crm
#: view:board.board:0
msgid "Planned Revenue by Stage and User"
msgstr "Ingresos previsto por etapa y usuario"
#. module: crm
-#: view:crm.lead:0
-msgid "Communication & History"
-msgstr "Comunicación e Historial"
-
-#. module: crm
-#: model:ir.model,name:crm.model_crm_lead_report
-msgid "CRM Lead Report"
-msgstr "Informe de iniciativas CRM"
-
-#. module: crm
-#: field:crm.installer,progress:0
-msgid "Configuration Progress"
-msgstr "Progreso de la configuración"
-
-#. module: crm
#: selection:crm.lead,priority:0
#: selection:crm.lead.report,priority:0
#: selection:crm.phonecall,priority:0
@@ -3644,17 +2845,9 @@ msgid "Street2"
msgstr "Calle2"
#. module: crm
-#: model:ir.actions.act_window,name:crm.crm_meeting_categ_action
-#: model:ir.ui.menu,name:crm.menu_crm_case_meeting-act
-msgid "Meeting Categories"
-msgstr "Categorías de reuniones"
-
-#. module: crm
-#: view:crm.lead2opportunity.partner:0
-#: view:crm.lead2partner:0
-#: view:crm.phonecall2partner:0
-msgid "You may have to verify that this partner does not exist already."
-msgstr "Debería verificar que esta empresa no exista ya."
+#: field:sale.config.settings,module_crm_helpdesk:0
+msgid "Manage Helpdesk and Support"
+msgstr "Gestionar incidencias y soporte"
#. module: crm
#: field:crm.lead.report,delay_open:0
@@ -3668,49 +2861,26 @@ msgid "User"
msgstr "Usuario"
#. module: crm
-#: selection:crm.lead.report,month:0
-#: selection:crm.meeting,month_list:0
+#: selection:crm.lead.report,creation_month:0
+#: selection:crm.lead.report,deadline_month:0
#: selection:crm.phonecall.report,month:0
msgid "November"
msgstr "Noviembre"
#. module: crm
-#: code:addons/crm/crm_action_rule.py:67
-#, python-format
-msgid "No E-Mail ID Found for your Company address!"
-msgstr "¡No se ha encontrado Email en la dirección de su compañía!"
-
-#. module: crm
#: view:crm.lead.report:0
+#: model:ir.actions.act_window,name:crm.act_opportunity_stage
msgid "Opportunities By Stage"
msgstr "Oportunidades por etapa"
#. module: crm
-#: model:ir.actions.act_window,name:crm.crm_case_categ_phone_create_partner
-msgid "Schedule Phone Call"
-msgstr "Planificar llamada telefónica"
-
-#. module: crm
-#: selection:crm.lead.report,month:0
-#: selection:crm.meeting,month_list:0
+#: selection:crm.lead.report,creation_month:0
+#: selection:crm.lead.report,deadline_month:0
#: selection:crm.phonecall.report,month:0
msgid "January"
msgstr "Enero"
#. module: crm
-#: model:ir.actions.act_window,help:crm.crm_opportunity_stage_act
-msgid ""
-"Create specific stages that will help your sales better organise their sales "
-"pipeline by maintaining them to their sales opportunities. It will allow "
-"them to easily track how is positioned a specific opportunity in the sales "
-"cycle."
-msgstr ""
-"Crear pasos específicos que ayudarán a su departamento de ventas a organizar "
-"mejor el flujo de venta gestionando sus oportunidades de venta. Esto les "
-"permitirá seguir fácilmente como está posicionada una oportunidad en el "
-"ciclo de ventas."
-
-#. module: crm
#: model:process.process,name:crm.process_process_contractprocess0
msgid "Contract"
msgstr "Contrato"
@@ -3721,13 +2891,9 @@ msgid "Twitter Ads"
msgstr "Anuncios Twiter"
#. module: crm
-#: code:addons/crm/wizard/crm_add_note.py:26
-#: code:addons/crm/wizard/crm_send_email.py:72
-#: code:addons/crm/wizard/crm_send_email.py:169
-#: code:addons/crm/wizard/crm_send_email.py:270
-#, python-format
-msgid "Error"
-msgstr "Error"
+#: field:crm.lead.report,creation_day:0
+msgid "Creation Day"
+msgstr "Fecha de creación"
#. module: crm
#: view:crm.lead.report:0
@@ -3735,89 +2901,73 @@ msgid "Planned Revenues"
msgstr "Ingresos esperados"
#. module: crm
-#: model:crm.case.categ,name:crm.categ_oppor7
-msgid "Need Consulting"
-msgstr "Necesita consultoría"
-
-#. module: crm
-#: constraint:crm.segmentation:0
-msgid "Error ! You can not create recursive profiles."
-msgstr "¡Error! No se puede crear perfiles recursivos."
-
-#. module: crm
-#: code:addons/crm/crm_lead.py:232
-#, python-format
-msgid "The case '%s' has been closed."
-msgstr "El caso '%s' ha sido cerrado"
-
-#. module: crm
-#: field:crm.lead,partner_address_id:0
-#: field:crm.meeting,partner_address_id:0
-#: field:crm.phonecall,partner_address_id:0
-msgid "Partner Contact"
-msgstr "Contacto empresa"
+#: view:crm.lead:0
+msgid "Exp.Closing"
+msgstr "Cierre previsto"
#. module: crm
-#: field:crm.meeting,recurrent_id:0
-msgid "Recurrent ID date"
-msgstr "ID fecha recurrente"
+#: help:crm.lead.report,deadline_year:0
+msgid "Expected closing year"
+msgstr "Año de cierre previsto"
#. module: crm
-#: sql_constraint:res.users:0
-msgid "You can not have two users with the same login !"
-msgstr "¡No puede tener dos usuarios con el mismo identificador de usuario!"
+#: model:ir.model,name:crm.model_crm_case_stage
+msgid "Stage of case"
+msgstr "Etapa del caso"
#. module: crm
-#: code:addons/crm/wizard/crm_merge_opportunities.py:100
-#, python-format
-msgid "Merged into Opportunity: %s"
-msgstr "Fusionado con la oportunidad '%s'"
+#: selection:crm.opportunity2phonecall,action:0
+#: selection:crm.phonecall2phonecall,action:0
+msgid "Schedule a call"
+msgstr "Planificar una llamada"
#. module: crm
-#: code:addons/crm/crm.py:347
#: view:crm.lead:0
-#: view:res.partner:0
-#, python-format
-msgid "Close"
-msgstr "Cerrado"
-
-#. module: crm
-#: view:crm.lead:0
-#: view:crm.phonecall:0
-#: view:res.partner:0
msgid "Categorization"
msgstr "Categorización"
#. module: crm
-#: model:ir.model,name:crm.model_base_action_rule
-msgid "Action Rules"
-msgstr "Reglas de acciones"
+#: view:crm.phonecall2phonecall:0
+msgid "Log Call"
+msgstr "Registrar llamada"
#. module: crm
-#: field:crm.meeting,rrule_type:0
-msgid "Recurrency"
-msgstr "Recurrencia"
+#: help:sale.config.settings,group_fund_raising:0
+msgid "Allows you to trace and manage your activities for fund raising."
+msgstr ""
+"Permitir rastrear y administrar sus actividades para recaudación de fondos."
#. module: crm
#: field:crm.meeting,phonecall_id:0
+#: model:ir.model,name:crm.model_crm_phonecall
msgid "Phonecall"
msgstr "Llamada telefónica"
#. module: crm
-#: selection:crm.meeting,week_list:0
-msgid "Thursday"
-msgstr "Jueves"
+#: view:crm.phonecall.report:0
+msgid "Phone calls that are assigned to one of the sale teams I manage"
+msgstr ""
+"Las llamadas de teléfono están asignadas a uno de los equipos que yo "
+"gestiono."
#. module: crm
-#: view:crm.meeting:0
-#: field:crm.send.mail,email_to:0
-msgid "To"
-msgstr "Para"
+#: view:crm.lead:0
+msgid "Create date"
+msgstr "Fecha de creación"
#. module: crm
-#: selection:crm.meeting,class:0
-msgid "Private"
-msgstr "Privado"
+#: view:crm.lead:0
+msgid "at"
+msgstr "en"
+
+#. module: crm
+#: model:crm.case.stage,name:crm.stage_lead1
+#: selection:crm.case.stage,state:0
+#: view:crm.lead:0
+#: selection:crm.lead,state:0
+#: view:crm.lead.report:0
+msgid "New"
+msgstr "Nuevo"
#. module: crm
#: field:crm.lead,function:0
@@ -3825,28 +2975,13 @@ msgid "Function"
msgstr "Función"
#. module: crm
-#: view:crm.add.note:0
-msgid "_Add"
-msgstr "_Añadir"
-
-#. module: crm
-#: selection:crm.segmentation.line,expr_name:0
-msgid "State of Mind"
-msgstr "Grado de satisfacción"
-
-#. module: crm
#: field:crm.case.section,note:0
-#: view:crm.meeting:0
-#: field:crm.meeting,description:0
-#: view:crm.phonecall:0
#: field:crm.phonecall,description:0
#: field:crm.segmentation,description:0
-#: view:res.partner:0
msgid "Description"
msgstr "Descripción"
#. module: crm
-#: field:base.action.rule,trg_section_id:0
#: field:crm.case.categ,section_id:0
#: field:crm.case.resource.type,section_id:0
#: view:crm.case.section:0
@@ -3854,39 +2989,66 @@ msgstr "Descripción"
#: field:crm.lead,section_id:0
#: view:crm.lead.report:0
#: field:crm.lead.report,section_id:0
-#: field:crm.meeting,section_id:0
+#: field:crm.lead2opportunity.partner.mass,section_id:0
#: field:crm.opportunity2phonecall,section_id:0
+#: field:crm.payment.mode,section_id:0
#: view:crm.phonecall:0
#: field:crm.phonecall,section_id:0
#: view:crm.phonecall.report:0
#: field:crm.phonecall2phonecall,section_id:0
#: field:res.partner,section_id:0
-#: field:res.users,context_section_id:0
msgid "Sales Team"
msgstr "Equipo de ventas"
#. module: crm
-#: selection:crm.lead.report,month:0
-#: selection:crm.meeting,month_list:0
+#: selection:crm.lead.report,creation_month:0
+#: selection:crm.lead.report,deadline_month:0
#: selection:crm.phonecall.report,month:0
msgid "May"
msgstr "Mayo"
#. module: crm
-#: model:crm.case.categ,name:crm.categ_oppor2
-msgid "Interest in Accessories"
-msgstr "Interesado en accesorios"
+#: model:ir.actions.act_window,help:crm.crm_case_channel_action
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to define a new channel.\n"
+" </p><p>\n"
+" Use channels to track the soure of your leads and "
+"opportunities. Channels\n"
+" are mostly used in reporting to analyse sales performance\n"
+" related to marketing efforts.\n"
+" </p><p>\n"
+" Some examples of channels: company website, phone call\n"
+" campaign, reseller, etc.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+"Pulse para definir un nuevo canal.\n"
+"</p><p>\n"
+"Use los canales para administrar las fuentes de sus iniciativas y "
+"oportunidades. Los canales se usan sobre todo en los informes para analizar "
+"el rendimiento de ventas en relación con los esfuerzos de marketing.\n"
+"</p><p>\n"
+"Algunos ejemplos de canales: web de la compañía, campaña de llamadas "
+"telefónicas, distribuidor, etc.\n"
+"</p>\n"
+" "
#. module: crm
-#: code:addons/crm/crm_lead.py:211
-#, python-format
-msgid "The opportunity '%s' has been opened."
-msgstr "La oportunidad '%s' ha sido abierta"
+#: view:crm.lead:0
+msgid "Internal Notes"
+msgstr "Notas internas"
+
+#. module: crm
+#: view:crm.lead:0
+msgid "New Opportunities"
+msgstr "Nuevas oportunidades"
#. module: crm
-#: field:crm.lead.report,email:0
-msgid "# Emails"
-msgstr "Nº de emails"
+#: field:crm.segmentation.line,operator:0
+msgid "Mandatory / Optional"
+msgstr "Obligatorio / Opcional"
#. module: crm
#: field:crm.lead,street:0
@@ -3894,9 +3056,14 @@ msgid "Street"
msgstr "Calle"
#. module: crm
-#: view:crm.lead.report:0
-msgid "Opportunities by User and Team"
-msgstr "Oportunidades por usuario y equipo"
+#: field:crm.lead,referred:0
+msgid "Referred By"
+msgstr "Referenciado por"
+
+#. module: crm
+#: view:crm.phonecall:0
+msgid "Reset to Todo"
+msgstr "Cambiar a 'Para hacer'"
#. module: crm
#: field:crm.case.section,working_hours:0
@@ -3904,33 +3071,43 @@ msgid "Working Hours"
msgstr "Horario de trabajo"
#. module: crm
+#: code:addons/crm/crm_lead.py:968
#: view:crm.lead:0
-#: field:crm.lead,is_customer_add:0
+#: field:crm.lead2opportunity.partner,partner_id:0
+#: field:crm.lead2opportunity.partner.mass,partner_id:0
+#: field:crm.partner.binding,partner_id:0
+#, python-format
msgid "Customer"
msgstr "Cliente"
#. module: crm
-#: selection:crm.lead.report,month:0
-#: selection:crm.meeting,month_list:0
+#: selection:crm.lead.report,creation_month:0
+#: selection:crm.lead.report,deadline_month:0
#: selection:crm.phonecall.report,month:0
msgid "February"
msgstr "Febrero"
#. module: crm
#: view:crm.phonecall:0
-#: model:ir.actions.act_window,name:crm.crm_case_categ_meet_create_partner
-#: view:res.partner:0
msgid "Schedule a Meeting"
msgstr "Planificar una reunión"
#. module: crm
-#: model:crm.case.stage,name:crm.stage_lead6
-#: model:crm.case.stage,name:crm.stage_opportunity6
+#: model:crm.case.stage,name:crm.stage_lead8
#: view:crm.lead:0
msgid "Lost"
msgstr "Perdido"
#. module: crm
+#: code:addons/crm/wizard/crm_lead_to_opportunity.py:89
+#, python-format
+msgid "Closed/Cancelled leads cannot be converted into opportunities."
+msgstr ""
+"Las iniciativas Cerradas/canceladas no pueden ser convertidas en "
+"oportunidades."
+
+#. module: crm
+#: view:crm.lead:0
#: field:crm.lead,country_id:0
#: view:crm.lead.report:0
#: field:crm.lead.report,country_id:0
@@ -3939,20 +3116,20 @@ msgstr "País"
#. module: crm
#: view:crm.lead:0
-#: selection:crm.lead2opportunity.action,name:0
+#: view:crm.lead2opportunity.partner:0
+#: view:crm.lead2opportunity.partner.mass:0
#: view:crm.phonecall:0
-#: view:res.partner:0
msgid "Convert to Opportunity"
msgstr "Convertir a oportunidad"
#. module: crm
-#: selection:crm.meeting,week_list:0
-msgid "Wednesday"
-msgstr "Miércoles"
+#: help:crm.phonecall,email_from:0
+msgid "These people will receive email."
+msgstr "Estas personas recibirán un email."
#. module: crm
-#: selection:crm.lead.report,month:0
-#: selection:crm.meeting,month_list:0
+#: selection:crm.lead.report,creation_month:0
+#: selection:crm.lead.report,deadline_month:0
#: selection:crm.phonecall.report,month:0
msgid "April"
msgstr "Abril"
@@ -3963,71 +3140,48 @@ msgid "Campaign Name"
msgstr "Nombre de la campaña"
#. module: crm
+#: view:crm.segmentation:0
+msgid "Profiling"
+msgstr "Perfiles"
+
+#. module: crm
#: model:ir.model,name:crm.model_crm_phonecall_report
msgid "Phone calls by user and section"
msgstr "Llamadas telefónicas por usuario y sección"
#. module: crm
-#: selection:crm.lead2opportunity.action,name:0
-msgid "Merge with existing Opportunity"
-msgstr "Fusionado con oportunidad existente"
-
-#. module: crm
-#: field:crm.meeting,select1:0
-msgid "Option"
-msgstr "Opción"
-
-#. module: crm
-#: model:crm.case.stage,name:crm.stage_lead4
-#: model:crm.case.stage,name:crm.stage_opportunity4
+#: model:crm.case.stage,name:crm.stage_lead5
msgid "Negotiation"
msgstr "Negociación"
#. module: crm
-#: view:crm.lead:0
-msgid "Exp.Closing"
-msgstr "Cierre previsto"
+#: model:ir.model,name:crm.model_crm_phonecall2phonecall
+msgid "Phonecall To Phonecall"
+msgstr "Llamada telefónica a llamada telefónica"
#. module: crm
#: field:crm.case.stage,sequence:0
-#: field:crm.meeting,sequence:0
msgid "Sequence"
msgstr "Secuencia"
#. module: crm
-#: field:crm.send.mail,body:0
-msgid "Message Body"
-msgstr "Cuerpo del mensaje"
-
-#. module: crm
-#: view:crm.meeting:0
-msgid "Accept"
-msgstr "Aceptar"
-
-#. module: crm
#: field:crm.segmentation.line,expr_name:0
msgid "Control Variable"
msgstr "Variable de control"
#. module: crm
-#: selection:crm.meeting,byday:0
-msgid "Second"
-msgstr "Segundo"
-
-#. module: crm
-#: model:crm.case.stage,name:crm.stage_lead3
-#: model:crm.case.stage,name:crm.stage_opportunity3
+#: model:crm.case.stage,name:crm.stage_lead4
msgid "Proposition"
msgstr "Propuesta"
#. module: crm
+#: view:crm.phonecall:0
#: field:res.partner,phonecall_ids:0
msgid "Phonecalls"
msgstr "Llamadas telefónicas"
#. module: crm
#: view:crm.lead.report:0
-#: field:crm.lead.report,name:0
#: view:crm.phonecall.report:0
#: field:crm.phonecall.report,name:0
msgid "Year"
@@ -4038,606 +3192,27 @@ msgstr "Año"
msgid "Newsletter"
msgstr "Boletín de noticias"
-#~ msgid "Status"
-#~ msgstr "Estado"
-
-#, python-format
-#~ msgid ""
-#~ "You can not escalate this case.\n"
-#~ "You are already at the top level."
-#~ msgstr ""
-#~ "No puede intensificar este caso.\n"
-#~ "Ya se encuentra en el nivel superior."
-
-#~ msgid "Delay After Trigger Date:"
-#~ msgstr "Demora después fecha del disparo:"
-
-#~ msgid "My Draft "
-#~ msgstr "Mis borradores "
-
-#~ msgid "Add Last Mail for Replying"
-#~ msgstr "Añadir último mail para responder"
-
-#~ msgid "All Cases"
-#~ msgstr "Todos los casos"
-
-#~ msgid "Remind Partner"
-#~ msgstr "Recordar empresa"
-
-#~ msgid "Update The Proposed Menus To Be Created"
-#~ msgstr "Actualizar los menús propuestos a crear"
-
-#~ msgid "Base Information"
-#~ msgstr "Información base"
-
-#~ msgid "All Open "
-#~ msgstr "Todos los abiertos "
-
-#~ msgid "Create menus for a case section"
-#~ msgstr "Crear menús para una sección de casos"
-
-#~ msgid "Template of Email to Send"
-#~ msgstr "Plantilla de Email a enviar"
-
-#~ msgid "CRM & SRM"
-#~ msgstr "CRM & SRM"
-
-#~ msgid "%(case_user)s = Responsible name"
-#~ msgstr "%(case_user)s = Nombre del responsable"
-
-#~ msgid "Add watchers (Cc)"
-#~ msgstr "Añadir observadores (CC)"
-
-#~ msgid "My "
-#~ msgstr "Mis "
-
-#~ msgid "Cases"
-#~ msgstr "Casos"
-
-#~ msgid "Watchers Emails"
-#~ msgstr "Observadores emails (CC)"
-
-#~ msgid "Create menu Entries"
-#~ msgstr "Crear entradas de menús"
-
-#~ msgid "Case history"
-#~ msgstr "Historial del caso"
-
-#~ msgid "Set state to"
-#~ msgstr "Establecer grado a"
-
-#~ msgid "Case Category Name"
-#~ msgstr "Nombre de la categoría de casos"
-
-#~ msgid "None"
-#~ msgstr "Ninguno"
-
-#~ msgid "Minutes"
-#~ msgstr "Minutos"
-
-#~ msgid "All Unclosed and Unassigned "
-#~ msgstr "Mis no cerrados o no asignados "
-
-#~ msgid ""
-#~ "Check this if you want the rule to send a reminder by email to the partner."
-#~ msgstr ""
-#~ "Marque esta opción si desea que la regla envíe un recordatorio por correo "
-#~ "electrónico a la empresa."
-
-#~ msgid "Maximim Priority"
-#~ msgstr "Prioridad máxima"
-
-#~ msgid "New "
-#~ msgstr "Nuevo "
-
-#~ msgid "Partner Events"
-#~ msgstr "Eventos empresa"
-
-#~ msgid "Conditions on Case Fields"
-#~ msgstr "Condiciones sobre campos del caso"
-
-#~ msgid "Case Communication History"
-#~ msgstr "Historial de comunicación del caso"
-
-#~ msgid "Category of case"
-#~ msgstr "Categoría del caso"
-
-#~ msgid "Estimates"
-#~ msgstr "Estimaciones"
-
-#~ msgid "%(case_subject)s = Case subject"
-#~ msgstr "%(case_subject)s = Asunto del caso"
-
-#~ msgid ""
-#~ "The generic Open ERP Customer Relationship Management\n"
-#~ "system enables a group of people to intelligently and efficiently manage\n"
-#~ "leads, opportunities, tasks, issues, requests, bugs, campaign, claims, etc.\n"
-#~ "It manages key tasks such as communication, identification, prioritization,\n"
-#~ "assignment, resolution and notification.\n"
-#~ "\n"
-#~ "Open ERP ensures that all cases are successfully tracked by users, customers "
-#~ "and\n"
-#~ "suppliers. It can automatically send reminders, escalate the request, "
-#~ "trigger\n"
-#~ "specific methods and lots of others actions based on your enterprise own "
-#~ "rules.\n"
-#~ "\n"
-#~ "The greatest thing about this system is that users don't need to do "
-#~ "anything\n"
-#~ "special. They can just send email to the request tracker. Open ERP will "
-#~ "take\n"
-#~ "care of thanking them for their message, automatically routing it to the\n"
-#~ "appropriate staff, and making sure all future correspondence gets to the "
-#~ "right\n"
-#~ "place.\n"
-#~ "\n"
-#~ "The CRM module has a email gateway for the synchronisation interface\n"
-#~ "between mails and Open ERP."
-#~ msgstr ""
-#~ "El sistema genérico de Gestión de las Relaciones con el Cliente (CRM) de\n"
-#~ "OpenERP permite a un grupo de gente gestionar de forma inteligente\n"
-#~ "y eficaz iniciativas, oportunidades, tareas, cuestiones,\n"
-#~ "peticiones, errores, campañas comerciales, reclamaciones, etc.\n"
-#~ "Gestiona tareas clave como comunicación, identificación,\n"
-#~ "priorización, asignación, resolución y notificación.\n"
-#~ "\n"
-#~ "OpenERP asegura que todos los casos son seguidos con éxito\n"
-#~ "por usuarios, clientes y proveedores. Puede enviar automáticamente\n"
-#~ "recordatorios y notificaciones, intensificar la petición, disparar\n"
-#~ "métodos específicos y muchas otras acciones basadas en sus\n"
-#~ "reglas propias de empresa.\n"
-#~ "\n"
-#~ "La cosa más importante sobre este sistema es que los usuarios no\n"
-#~ "necesitan hacer nada especial. Pueden enviar sólo un correo electrónico\n"
-#~ "al registro de peticiones. OpenERP se encargará de agradecerle su\n"
-#~ "mensaje, dirigirlo automáticamente a las personas apropiadas, y asegurarse\n"
-#~ "de que toda la futura correspondencia llega al lugar apropiado.\n"
-#~ "\n"
-#~ "El módulo de CRM dispone de una puerta de enlace con el correo electrónico\n"
-#~ "para la sincronización entre correos electrónicos y OpenERP."
-
-#~ msgid "My Open "
-#~ msgstr "Mis abiertos "
-
-#~ msgid "Select Views (empty for default)"
-#~ msgstr "Seleccionar vistas (vacía por defecto)"
-
-#~ msgid "Case State"
-#~ msgstr "Estado del caso"
-
-#~ msgid "Invalid XML for View Architecture!"
-#~ msgstr "¡XML inválido para la definición de la vista!"
-
-#~ msgid "Your action"
-#~ msgstr "Su acción"
-
-#~ msgid "Case section"
-#~ msgstr "Sección del caso"
-
-#~ msgid "E-Mail Reminders (includes the content of the case)"
-#~ msgstr "Recordatorios por Email (incluye el contenido del caso)"
-
-#~ msgid "Fields to Change"
-#~ msgstr "Campos a cambiar"
-
-#~ msgid "Cases Histories"
-#~ msgstr "Historiales de casos"
-
-#~ msgid "My cases"
-#~ msgstr "Mis casos"
-
-#~ msgid "All Draft "
-#~ msgstr "Todos los borradores "
-
-#~ msgid "%(partner_email)s = Partner email"
-#~ msgstr "%(partner_email)s = Email empresa"
-
-#~ msgid "My Open Cases"
-#~ msgstr "Mis casos abiertos"
-
-#~ msgid "Remind with attachment"
-#~ msgstr "Recordar con adjunto"
-
-#~ msgid "All Late "
-#~ msgstr "Todos los retrasados "
-
-#~ msgid "My Late "
-#~ msgstr "Mis retrasados "
-
-#~ msgid "Open cases"
-#~ msgstr "Casos abiertos"
-
-#~ msgid "My Unclosed "
-#~ msgstr "Mis no cerrados "
-
-#~ msgid "Created"
-#~ msgstr "Creado"
-
-#~ msgid "Mail to responsible"
-#~ msgstr "Enviar correo a responsable"
-
-#~ msgid "My Pending "
-#~ msgstr "Mis pendientes "
-
-#~ msgid "New Form"
-#~ msgstr "Nuevo formulario"
-
-#~ msgid "Set responsible to"
-#~ msgstr "Establecer responsable a"
-
-#~ msgid ""
-#~ "The rule use a AND operator. The case must match all non empty fields so "
-#~ "that the rule execute the action described in the 'Actions' tab."
-#~ msgstr ""
-#~ "La regla utiliza un operador AND. El caso debe concordar con todos los "
-#~ "campos no vacíos para que la regla ejecute la acción descrita en la pestaña "
-#~ "'Acciones'."
-
-#~ msgid "%(email_from)s = Partner email"
-#~ msgstr "%(email_from)s = Email empresa"
-
-#~ msgid "Case Section"
-#~ msgstr "Sección del caso"
-
-#~ msgid "Rules"
-#~ msgstr "Reglas"
-
-#~ msgid "Call Object Method"
-#~ msgstr "Método llamada al objeto"
-
-#, python-format
-#~ msgid "You can not delete this case. You should better cancel it."
-#~ msgstr "No puede eliminar este caso. Sería mejor que lo cancelara."
-
-#, python-format
-#~ msgid "done"
-#~ msgstr "realizado"
-
-#~ msgid "Calendar"
-#~ msgstr "Calendario"
-
-#~ msgid "Log"
-#~ msgstr "Registro"
-
-#~ msgid ""
-#~ "These people will receive a copy of the futur communication between partner "
-#~ "and users by email"
-#~ msgstr ""
-#~ "Estas personas recibirán una copia de la futura comunicación entre empresa y "
-#~ "usuarios por correo electrónico"
-
-#, python-format
-#~ msgid "Historize"
-#~ msgstr "Añadir al historial"
-
-#~ msgid "%(partner)s = Partner name"
-#~ msgstr "%(partner)s = Nombre empresa"
-
-#~ msgid "New With Calendar"
-#~ msgstr "Nuevo con calendario"
-
-#~ msgid "List With Calendar"
-#~ msgstr "Lista con calendario"
-
-#~ msgid "Action Information"
-#~ msgstr "Información de la acción"
-
-#~ msgid "Calendar View"
-#~ msgstr "Vista calendario"
-
-#~ msgid "%(case_user_phone)s = Responsible phone"
-#~ msgstr "%(case_user_phone)s = Teléfono del responsable"
-
-#~ msgid "Delay after trigger date"
-#~ msgstr "Demora después fecha del disparo"
-
-#~ msgid "Conditions"
-#~ msgstr "Condiciones"
-
-#~ msgid "Open Cases"
-#~ msgstr "Casos abiertos"
-
-#~ msgid "Remind responsible"
-#~ msgstr "Recordar responsable"
-
-#~ msgid "Set section to"
-#~ msgstr "Establecer sección a"
-
-#, python-format
-#~ msgid "You must put a Partner eMail to use this action!"
-#~ msgstr "¡Debe indicar un Email de empresa para usar esta acción!"
-
-#~ msgid "Minimum Priority"
-#~ msgstr "Prioridad mínima"
-
-#~ msgid "Case History"
-#~ msgstr "Historial del caso"
-
-#, python-format
-#~ msgid "draft"
-#~ msgstr "borrador"
-
-#~ msgid "Created Menus"
-#~ msgstr "Menús creados"
-
-#~ msgid ""
-#~ "Check this if you want that all documents attached to the case be attached "
-#~ "to the reminder email sent."
-#~ msgstr ""
-#~ "Marque esta opción si desea que todos los documentos adjuntados a este caso "
-#~ "sean adjuntados en el correo electrónico enviado como recordatorio."
-
-#, python-format
-#~ msgid "cancel"
-#~ msgstr "cancelado"
-
-#~ msgid "Parent Section"
-#~ msgstr "Sección padre"
-
-#~ msgid "Parent Menu"
-#~ msgstr "Menú padre"
-
-#~ msgid "%(case_id)s = Case ID"
-#~ msgstr "%(case_id)s = ID del caso"
-
-#~ msgid "Don't Create"
-#~ msgstr "No crear"
-
-#~ msgid "Base Menu Name"
-#~ msgstr "Nombre menú base"
-
-#~ msgid "Child Sections"
-#~ msgstr "Secciones hijas"
-
-#~ msgid "All Unassigned "
-#~ msgstr "Todos los no asignados "
-
-#~ msgid "All Unclosed "
-#~ msgstr "Todos los no cerrados "
-
-#~ msgid "%(case_user_email)s = Responsible email"
-#~ msgstr "%(case_user_email)s = Email del responsable"
-
-#~ msgid "General"
-#~ msgstr "General"
-
-#~ msgid "Send Reminder"
-#~ msgstr "Enviar recordatorio"
-
-#~ msgid "Complete this if you use the mail gateway."
-#~ msgstr "Complete esto si utiliza una pasarela de correo."
-
-#~ msgid "Business Opportunities"
-#~ msgstr "Oportunidades de negocio"
-
-#~ msgid "Tree View"
-#~ msgstr "Vista de árbol"
-
-#~ msgid "Conditions on Case Partner"
-#~ msgstr "Condiciones sobre caso empresa"
-
-#~ msgid "Section Code"
-#~ msgstr "Código de sección"
-
-#~ msgid ""
-#~ "The Object name must start with x_ and not contain any special character !"
-#~ msgstr ""
-#~ "¡El nombre del objeto debe empezar con x_ y no contener ningún carácter "
-#~ "especial!"
-
-#~ msgid "General Description"
-#~ msgstr "Descripción general"
-
-#~ msgid "Create Menus For Cases"
-#~ msgstr "Crear menús para una sección de casos"
-
-#~ msgid "Mail to partner"
-#~ msgstr "Enviar correo a empresa"
-
-#~ msgid "Partner Email"
-#~ msgstr "Email empresa"
-
-#~ msgid "All Pending "
-#~ msgstr "Todos los pendientes "
-
-#~ msgid "Set priority to"
-#~ msgstr "Establecer prioridad a"
-
-#, python-format
-#~ msgid "open"
-#~ msgstr "abierto"
-
-#~ msgid "All Canceled "
-#~ msgstr "Todos los cancelados "
-
-#~ msgid "Mail body"
-#~ msgstr "Texto correo"
-
-#~ msgid ""
-#~ "Check this if you want the rule to send a reminder by email to the user."
-#~ msgstr ""
-#~ "Marque esta opción si desea que la regla envíe un recordatorio por correo "
-#~ "electrónico al usuario."
-
-#~ msgid "Segmentations"
-#~ msgstr "Segmentaciones"
-
-#~ msgid ""
-#~ "The email address put in the 'Reply-To' of all emails sent by Open ERP about "
-#~ "cases in this section"
-#~ msgstr ""
-#~ "La dirección de correo electrónico que se pondrá en 'Responder A' en todos "
-#~ "los correos electrónicos enviados por OpenERP para los casos de esta sección."
-
-#~ msgid "Case Rule"
-#~ msgstr "Regla del caso"
-
-#, python-format
-#~ msgid "Case"
-#~ msgstr "Caso"
-
-#~ msgid "Conditions on Priority Range"
-#~ msgstr "Condiciones sobre intervalo de prioridades"
-
-#~ msgid "All "
-#~ msgstr "Todos "
-
-#~ msgid "E-Mail Actions"
-#~ msgstr "Acciones de Email"
-
-#~ msgid "List"
-#~ msgstr "Lista"
-
-#~ msgid "User Responsible"
-#~ msgstr "Usuario responsable"
-
-#~ msgid "All Histories"
-#~ msgstr "Todos los historiales"
-
-#~ msgid "My Canceled "
-#~ msgstr "Mis cancelados "
-
-#~ msgid "Latest E-Mail"
-#~ msgstr "Último email"
-
-#~ msgid "Case logs"
-#~ msgstr "Registros del caso"
-
-#~ msgid ""
-#~ "Check if the category is limited to partners that match the segmentation "
-#~ "criterions. If checked, remove the category from partners that doesn't match "
-#~ "segmentation criterions"
-#~ msgstr ""
-#~ "Indica si esta categoría está limitada a empresas que cumplan los criterios "
-#~ "de segmentación. Si está marcada, se eliminan de la categoría las empresas "
-#~ "que no cumplan los criterios de segmentación."
-
-#~ msgid "Logs History"
-#~ msgstr "Historial del registro"
-
-#~ msgid "Form View"
-#~ msgstr "Vista formulario"
-
-#~ msgid "Conditions on Timing"
-#~ msgstr "Condiciones sobre temporización"
-
-#~ msgid "Case Description"
-#~ msgstr "Descripción del caso"
-
-#~ msgid "Mail to watchers (Cc)"
-#~ msgstr "Enviar correo a observadores (CC)"
-
-#~ msgid "Actions"
-#~ msgstr "Acciones"
-
-#~ msgid "Cases by section"
-#~ msgstr "Casos por sección"
-
-#~ msgid "Conditions on States"
-#~ msgstr "Condiciones sobre los estados"
-
-#~ msgid "Trigger Date"
-#~ msgstr "Fecha del disparo"
-
-#~ msgid ""
-#~ "A period is the average number of days between two cycle of sale or purchase "
-#~ "for this segmentation. It's mainly used to detect if a partner has not "
-#~ "purchased or buy for a too long time, so we suppose that his state of mind "
-#~ "has decreased because he probably bought goods to another supplier. Use this "
-#~ "functionality for recurring businesses."
-#~ msgstr ""
-#~ "Un período es el número promedio de días entre dos ciclos de venta o compra "
-#~ "para esta segmentación. Se utiliza principalmente para detectar si una "
-#~ "empresa no ha comprado o compra durante un tiempo demasiado largo, así que "
-#~ "suponemos que su grado de satisfacción se ha reducido porque probablemente "
-#~ "ha comprado productos a otro proveedor. Utilice esta funcionalidad para los "
-#~ "negocios recurrentes."
-
-#, python-format
-#~ msgid ""
-#~ "You must define a responsible user for this case in order to use this action!"
-#~ msgstr ""
-#~ "¡Debe definir un usuario responsable para este caso para poder utilizar esta "
-#~ "acción!"
-
-#, python-format
-#~ msgid ""
-#~ "Can not send mail with empty body,you should have description in the body"
-#~ msgstr ""
-#~ "No puede enviar mensajes con un texto vacío, debería incluir una descripción "
-#~ "en el mensaje"
-
-#, python-format
-#~ msgid ""
-#~ "No E-Mail ID Found for the Responsible Partner or missing reply address in "
-#~ "section!"
-#~ msgstr ""
-#~ "¡No se ha encontrado Email en la empresa responsable o falta dirección de "
-#~ "respuesta en la sección!"
-
-#~ msgid "Deadline Date is automatically computed from Start Date + Duration"
-#~ msgstr ""
-#~ "La fecha límite se calcula automáticamente a partir de Fecha de inicio + "
-#~ "Duración"
-
-#, python-format
-#~ msgid ""
-#~ "No E-Mail ID Found for your Company address or missing reply address in "
-#~ "section!"
-#~ msgstr ""
-#~ "¡No se ha encontrado Email en la dirección de su compañía o falta dirección "
-#~ "de respuesta en la sección!"
-
-#~ msgid "this wizard will create all sub-menus, within the selected menu."
-#~ msgstr "este asistente creará todos los sub-menús, en el menú seleccionado."
-
-#~ msgid "Invalid model name in the action definition."
-#~ msgstr "Nombre de modelo no válido en la definición de acción."
-
-#~ msgid ""
-#~ "You may want to create a new parent menu to put all the created menus in."
-#~ msgstr ""
-#~ "Es posible que desee crear un nuevo menú padre para poner todos los menús "
-#~ "creados en él."
-
-#~ msgid "Button Pressed"
-#~ msgstr "Botón oprimido"
-
-#~ msgid "Mail to these emails"
-#~ msgstr "Correo a estos correos electronicos"
-
-#~ msgid "Special Keywords to Be Used in The Body"
-#~ msgstr "Palabras claves especiales para ser usadas en el cuerpo del mensaje."
-
-#~ msgid "My Histories"
-#~ msgstr "Mis historias"
-
-#~ msgid "Last Action Date"
-#~ msgstr "Fechas de ultima acción"
-
-#~ msgid "Delay type"
-#~ msgstr "Tipo de retraso"
-
-#~ msgid "%(case_description)s = Case description"
-#~ msgstr "%(case_description)s = Descripción del caso"
-
-#~ msgid "Planned revenue"
-#~ msgstr "Ingresos previstos"
-
-#~ msgid "Planned Costs"
-#~ msgstr "Costos previstos"
-
-#~ msgid "Planned costs"
-#~ msgstr "Costos previstos"
-
-#~ msgid "Telesales"
-#~ msgstr "Ventas a distancia"
-
-#~ msgid "Invalid arguments"
-#~ msgstr "Argumentos inválidos"
-
-#~ msgid "Send Partner & Historize"
-#~ msgstr "Enviar a empresa y añadir al historial"
+#. module: crm
+#: model:mail.message.subtype,name:crm.mt_salesteam_lead_stage
+msgid "Opportunity Stage Changed"
+msgstr "Etapa de la oportunidad cambiada"
-#~ msgid "Mail Campaign 1"
-#~ msgstr "Campaña mail 1"
+#. module: crm
+#: model:ir.actions.act_window,help:crm.crm_lead_stage_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to set a new stage in your lead/opportunity pipeline.\n"
+" </p><p>\n"
+" Stages will allow salespersons to easily track how a "
+"specific\n"
+" lead or opportunity is positioned in the sales cycle.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+"Pulse para establecer una nueva etapa en su flujo iniciativa/oportunidad.\n"
+"</p><p>\n"
+"Las etapas permiten ver fácilmente a los comerciales cómo una iniciativa u "
+"oportunidad están posicionadas en el ciclo de ventas.\n"
+"</p>\n"
+" "
diff --git a/addons/crm/i18n/hu.po b/addons/crm/i18n/hu.po
index 193fbdfc6cb..98313efb4f3 100644
--- a/addons/crm/i18n/hu.po
+++ b/addons/crm/i18n/hu.po
@@ -7,19 +7,19 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2013-03-17 23:22+0000\n"
+"PO-Revision-Date: 2013-04-13 08:42+0000\n"
"Last-Translator: krnkris <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-19 05:33+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-14 05:12+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
#. module: crm
#: view:crm.lead.report:0
msgid "# Leads"
-msgstr "Érdeklődők száma"
+msgstr "# Érdeklődések"
#. module: crm
#: help:sale.config.settings,fetchmail_lead:0
@@ -2688,7 +2688,7 @@ msgstr "Telefonhívásaim"
#. module: crm
#: model:crm.case.stage,name:crm.stage_lead3
msgid "Qualification"
-msgstr "Végzettség"
+msgstr "Besorolás"
#. module: crm
#: field:crm.lead2opportunity.partner,name:0
@@ -2993,7 +2993,7 @@ msgstr "ekkor"
#: selection:crm.lead,state:0
#: view:crm.lead.report:0
msgid "New"
-msgstr "új"
+msgstr "Új"
#. module: crm
#: field:crm.lead,function:0
diff --git a/addons/crm/i18n/nl_BE.po b/addons/crm/i18n/nl_BE.po
index 697c7c4f083..a22d1f605a6 100644
--- a/addons/crm/i18n/nl_BE.po
+++ b/addons/crm/i18n/nl_BE.po
@@ -1,20 +1,20 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * crm
-# Els Van Vossel <evv@agaplan.eu>, 2012.
+# Els Van Vossel <evv@agaplan.eu>, 2012, 2013.
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2012-10-02 07:29+0000\n"
+"PO-Revision-Date: 2013-04-26 23:39+0000\n"
"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: Els Van Vossel\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:09+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-27 05:44+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
"Language: nl\n"
#. module: crm
@@ -28,6 +28,8 @@ msgid ""
"Allows you to configure your incoming mail server, and create leads from "
"incoming emails."
msgstr ""
+"Hiermee kunt u de inkomende mailserver instellen en leads laten maken van "
+"binnenkomende e-mails."
#. module: crm
#: code:addons/crm/crm_lead.py:881
@@ -76,7 +78,7 @@ msgstr "Opportuniteiten kiezen"
#: model:res.groups,name:crm.group_fund_raising
#: field:sale.config.settings,group_fund_raising:0
msgid "Manage Fund Raising"
-msgstr ""
+msgstr "Fondsenwerving"
#. module: crm
#: view:crm.lead.report:0
@@ -96,7 +98,7 @@ msgstr "Fasenaam"
#: view:crm.lead.report:0
#: view:crm.phonecall.report:0
msgid "Salesperson"
-msgstr ""
+msgstr "Verkoper"
#. module: crm
#: model:ir.model,name:crm.model_crm_lead_report
@@ -113,18 +115,18 @@ msgstr "Dag"
#. module: crm
#: view:crm.lead:0
msgid "Company Name"
-msgstr ""
+msgstr "Bedrijfsnaam"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor6
msgid "Training"
-msgstr ""
+msgstr "Training"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_lead_categ_action
#: model:ir.ui.menu,name:crm.menu_crm_lead_categ
msgid "Sales Tags"
-msgstr ""
+msgstr "Verkooplabels"
#. module: crm
#: view:crm.lead.report:0
@@ -137,6 +139,7 @@ msgstr "Verw. sluiting"
#: help:crm.phonecall,message_unread:0
msgid "If checked new messages require your attention."
msgstr ""
+"Als dit is ingeschakeld, zijn er nieuwe berichten die uw aandacht vragen."
#. module: crm
#: help:crm.lead.report,creation_day:0
@@ -182,6 +185,8 @@ msgid ""
"Holds the Chatter summary (number of messages, ...). This summary is "
"directly in html format in order to be inserted in kanban views."
msgstr ""
+"Bevat de Chatsamenvatting (aantal berichten, ...). Deze samenvatting is in "
+"html-formaat, zodat ze in de kanbanweergave kan worden gebruikt."
#. module: crm
#: code:addons/crm/crm_lead.py:624
@@ -189,7 +194,7 @@ msgstr ""
#: code:addons/crm/crm_phonecall.py:280
#, python-format
msgid "Warning!"
-msgstr ""
+msgstr "Waarschuwing"
#. module: crm
#: view:crm.lead:0
@@ -238,7 +243,7 @@ msgstr ""
#. module: crm
#: model:ir.actions.server,name:crm.action_email_reminder_lead
msgid "Reminder to User"
-msgstr ""
+msgstr "Herinnering voor gebruiker"
#. module: crm
#: field:crm.segmentation,segmentation_line:0
@@ -266,7 +271,7 @@ msgstr "Leadanalyse"
#: code:addons/crm/crm_lead.py:1010
#, python-format
msgid "<b>%s a call</b> for the <em>%s</em>."
-msgstr ""
+msgstr "<b>%s een gesprek</b> voor <em>%s</em>."
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_case_resource_type_act
@@ -328,6 +333,16 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik als u een nieuwe klantensegmentering wilt instellen.\n"
+" </p><p>\n"
+" Maak specifiieke categorieën en ken deze toe aan uw\n"
+" contactpersonen voor een betere interactie. Via\n"
+" segmentering kunt u categorieën toekennen aan "
+"contactpersonen\n"
+" volgens de door u ingestelde criteria.\n"
+" </p>\n"
+" "
#. module: crm
#: field:crm.opportunity2phonecall,contact_name:0
@@ -341,6 +356,7 @@ msgstr "Contactpersoon"
msgid ""
"When escalating to this team override the salesman with the team leader."
msgstr ""
+"Bij escaleren naar dit team, wordt de verkoper vervangen door de teamleider."
#. module: crm
#: model:process.transition,name:crm.process_transition_opportunitymeeting0
@@ -380,12 +396,25 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik om een opportuniteit voor deze klant te maken.\n"
+" </p><p>\n"
+" Met opportuniteiten kunt u uw verkooppijplijn en uw "
+"mogelijke verkopen opvolgen,\n"
+" voor een beter zicht op te verwachten inkomsten.\n"
+" </p><p>\n"
+" U kunt vergaderingen en telefoongesprekken plannen\n"
+" voor opportuniteiten. U kunt van een opportuniteit een "
+"offerte maken, documenten\n"
+" toevoegen, discussies volgen, en nog veel meer.\n"
+" </p>\n"
+" "
#. module: crm
#: model:crm.case.stage,name:crm.stage_lead7
#: view:crm.lead:0
msgid "Dead"
-msgstr ""
+msgstr "Dood"
#. module: crm
#: field:crm.case.section,message_unread:0
@@ -393,7 +422,7 @@ msgstr ""
#: field:crm.lead,message_unread:0
#: field:crm.phonecall,message_unread:0
msgid "Unread Messages"
-msgstr ""
+msgstr "Ongelezen berichten"
#. module: crm
#: view:crm.segmentation:0
@@ -407,7 +436,7 @@ msgstr "Segmentering"
#: selection:crm.lead2opportunity.partner.mass,action:0
#: selection:crm.partner.binding,action:0
msgid "Link to an existing customer"
-msgstr ""
+msgstr "Koppelen aan een bestaande relatie"
#. module: crm
#: field:crm.lead,write_date:0
@@ -425,8 +454,8 @@ msgid ""
"This percentage depicts the default/average probability of the Case for this "
"stage to be a success"
msgstr ""
-"Dit percentage drukt de standaard/gemiddelde slaagkans uit voor de zaak in "
-"deze fase."
+"Dit percentage drukt de standaard/gemiddelde slagingskans uit voor de zaak "
+"in deze fase."
#. module: crm
#: view:crm.lead:0
@@ -454,6 +483,7 @@ msgstr ""
#: view:crm.lead:0
msgid "Leads that are assigned to one of the sale teams I manage, or to me"
msgstr ""
+"Leads toegewezen aan een van de verkoopteams onder mijn beheer, of aan mij"
#. module: crm
#: field:crm.lead,partner_address_email:0
@@ -472,6 +502,15 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik als u een nieuw verkoopteam wilt maken.\n"
+" </p><p>\n"
+" Met verkoopteams organiseert u meerdere verkopers of "
+"afdelingen in\n"
+" aparte teams. Elk team werkt op zijn eigen\n"
+" opportuniteitenlijst.\n"
+" </p>\n"
+" "
#. module: crm
#: model:process.transition,note:crm.process_transition_opportunitymeeting0
@@ -485,7 +524,7 @@ msgstr "Gewone of telefonische vergadering over opportuniteit"
#: view:crm.phonecall.report:0
#: field:crm.phonecall.report,state:0
msgid "Status"
-msgstr ""
+msgstr "Status"
#. module: crm
#: view:crm.lead2opportunity.partner:0
@@ -495,7 +534,7 @@ msgstr "Opportuniteit maken"
#. module: crm
#: view:sale.config.settings:0
msgid "Configure"
-msgstr ""
+msgstr "Instellen"
#. module: crm
#: view:crm.lead:0
@@ -555,18 +594,26 @@ msgid ""
" If the call needs to be done then the status is set "
"to 'Not Held'."
msgstr ""
+"De status wordt op 'Uit te voeren' gezet als er een zaak wordt gemaakt. "
+" \n"
+"Als de zaak lopende is, wordt de status op 'Open' gezet. "
+" \n"
+"Als het gesprek is gevoerd, wordt de status op 'Uitgevoerd' gezet. "
+" \n"
+"Als het gesprek nog moet worden uitgevoerd, gaat de status naar 'Niet "
+"uitgevoerd'."
#. module: crm
#: field:crm.case.section,message_summary:0
#: field:crm.lead,message_summary:0
#: field:crm.phonecall,message_summary:0
msgid "Summary"
-msgstr "Samenvatting"
+msgstr "Overzicht"
#. module: crm
#: view:crm.merge.opportunity:0
msgid "Merge"
-msgstr ""
+msgstr "Samenvoegen"
#. module: crm
#: model:email.template,subject:crm.email_template_opportunity_mail
@@ -589,6 +636,8 @@ msgid ""
"Reminder on Lead: [[object.id ]] [[object.partner_id and 'of ' "
"+object.partner_id.name or '']]"
msgstr ""
+"Herinnering voor Lead: [[object.id ]] [[object.partner_id and 'van ' "
+"+object.partner_id.name or '']]"
#. module: crm
#: view:crm.segmentation:0
@@ -608,7 +657,7 @@ msgstr "De code van het verkoopteam moet uniek zijn"
#. module: crm
#: help:crm.lead,email_from:0
msgid "Email address of the contact"
-msgstr ""
+msgstr "E-mailadres van de contactpersoon"
#. module: crm
#: selection:crm.case.stage,state:0
@@ -629,6 +678,13 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik als u een nieuwe categorie wilt maken.\n"
+" </p><p>\n"
+" Maak specifieke telefooncategorieën om beter de gesprekstypen\n"
+" op te volgen in het systeem.\n"
+" </p>\n"
+" "
#. module: crm
#: help:crm.case.section,reply_to:0
@@ -734,12 +790,12 @@ msgstr "Televisie"
#. module: crm
#: model:ir.actions.act_window,name:crm.action_crm_send_mass_convert
msgid "Convert to opportunities"
-msgstr ""
+msgstr "Omzetten naar opportuniteit"
#. module: crm
#: model:ir.model,name:crm.model_sale_config_settings
msgid "sale.config.settings"
-msgstr ""
+msgstr "sale.config.settings"
#. module: crm
#: view:crm.segmentation:0
@@ -749,7 +805,7 @@ msgstr "Verwerking stoppen"
#. module: crm
#: field:crm.case.section,alias_id:0
msgid "Alias"
-msgstr ""
+msgstr "Alias"
#. module: crm
#: view:crm.phonecall:0
@@ -761,6 +817,8 @@ msgstr "Telefoongesprekken zoeken"
msgid ""
"Leads/Opportunities that are assigned to one of the sale teams I manage"
msgstr ""
+"Leads/Opportuniteiten die zijn toegewezen aan een van de verkoopteams onder "
+"mijn beheer"
#. module: crm
#: field:calendar.attendee,categ_id:0
@@ -781,7 +839,7 @@ msgstr "Van %s : %s"
#. module: crm
#: view:crm.lead2opportunity.partner.mass:0
msgid "Convert to Opportunities"
-msgstr ""
+msgstr "Omzetten naar opportuniteit"
#. module: crm
#: view:crm.lead2opportunity.partner:0
@@ -790,7 +848,7 @@ msgstr ""
#: view:crm.opportunity2phonecall:0
#: view:crm.phonecall2phonecall:0
msgid "or"
-msgstr ""
+msgstr "of"
#. module: crm
#: field:crm.lead.report,create_date:0
@@ -809,6 +867,8 @@ msgid ""
"Link between stages and sales teams. When set, this limitate the current "
"stage to the selected sales teams."
msgstr ""
+"Koppeling tussen fasen en verkoopteams. Deze maken de huidige fase enkel "
+"toegankelijk voor de gekozen verkoopteams."
#. module: crm
#: view:crm.case.stage:0
@@ -847,7 +907,7 @@ msgstr "Relatiecategorie"
#. module: crm
#: field:crm.lead,probability:0
msgid "Success Rate (%)"
-msgstr ""
+msgstr "Slagingskans (%)"
#. module: crm
#: field:crm.segmentation,sales_purchase_active:0
@@ -889,7 +949,7 @@ msgstr "Maart"
#. module: crm
#: view:crm.lead:0
msgid "Send Email"
-msgstr ""
+msgstr "E-mail verzenden"
#. module: crm
#: code:addons/crm/wizard/crm_lead_to_opportunity.py:89
@@ -919,6 +979,8 @@ msgid ""
"Opportunities that are assigned to either me or one of the sale teams I "
"manage"
msgstr ""
+"Opportuniteiten die zijn toegewezen aan een van de verkoopteams onder mijn "
+"beheer of aan mij"
#. module: crm
#: help:crm.case.section,resource_calendar_id:0
@@ -984,6 +1046,9 @@ msgid ""
"Allows you to track your customers/suppliers claims and grievances.\n"
" This installs the module crm_claim."
msgstr ""
+"Hiermee kunt u klachten en problemen van klanten/ aan leveranciers "
+"opvolgen.\n"
+" Hiermee installeert u de module crm_claim."
#. module: crm
#: model:crm.case.stage,name:crm.stage_lead6
@@ -1058,7 +1123,7 @@ msgstr "Fase"
#. module: crm
#: view:crm.phonecall.report:0
msgid "Phone Calls that are assigned to me"
-msgstr ""
+msgstr "Aan mij toegewezen telefoongesprekken"
#. module: crm
#: field:crm.lead,user_login:0
@@ -1086,11 +1151,13 @@ msgid ""
"Allows you to communicate with Customer, process Customer query, and "
"provide better help and support. This installs the module crm_helpdesk."
msgstr ""
+"Hiermee kunt u met de klant communiceren, vragen beantwoorden en betere "
+"ondersteuning verlenen. Hiermee installeert u de module crm_helpdesk."
#. module: crm
#: view:crm.lead:0
msgid "Delete"
-msgstr ""
+msgstr "Verwijderen"
#. module: crm
#: model:mail.message.subtype,description:crm.mt_lead_create
@@ -1100,7 +1167,7 @@ msgstr ""
#. module: crm
#: view:crm.lead:0
msgid "í"
-msgstr ""
+msgstr "í"
#. module: crm
#: selection:crm.lead.report,creation_month:0
@@ -1141,12 +1208,12 @@ msgstr ""
#. module: crm
#: view:crm.lead:0
msgid "oe_kanban_text_red"
-msgstr ""
+msgstr "oe_kanban_text_red"
#. module: crm
#: model:ir.ui.menu,name:crm.menu_crm_payment_mode_act
msgid "Payment Modes"
-msgstr ""
+msgstr "Betalingswijzen"
#. module: crm
#: field:crm.lead.report,opening_date:0
@@ -1193,6 +1260,9 @@ msgid ""
"This field is used to distinguish stages related to Leads from stages "
"related to Opportunities, or to specify stages available for both types."
msgstr ""
+"Dit veld dient om een onderscheid te maken tussen de fasen voor leads en die "
+"voor opportuniteiten, of om fasen in te stellen die voor beide typen van "
+"toepassing zijn."
#. module: crm
#: model:mail.message.subtype,name:crm.mt_lead_create
@@ -1234,7 +1304,7 @@ msgstr "onbekend"
#: field:crm.lead,message_is_follower:0
#: field:crm.phonecall,message_is_follower:0
msgid "Is a Follower"
-msgstr ""
+msgstr "Is een volger"
#. module: crm
#: field:crm.opportunity2phonecall,date:0
@@ -1247,7 +1317,7 @@ msgstr "Datum"
#. module: crm
#: model:crm.case.section,name:crm.crm_case_section_4
msgid "Online Support"
-msgstr ""
+msgstr "Onlineondersteuning"
#. module: crm
#: view:crm.lead.report:0
@@ -1273,6 +1343,10 @@ msgid ""
"set to 'Done'. If the case needs to be reviewed then the Status is set to "
"'Pending'."
msgstr ""
+"De status wordt op 'Voorlopig' gezet als de zaak wordt gemaakt. Als de zaak "
+"lopende is, wordt de status op 'Open' gezet. Als de zaak is behandeld, wordt "
+"de status op 'Gereed' gezet. Als de zaak moet worden bekeken, wordt de "
+"status op 'Wachtend' gezet."
#. module: crm
#: model:crm.case.section,name:crm.crm_case_section_1
@@ -1306,7 +1380,7 @@ msgstr "Segmenteringsomschrijving"
#. module: crm
#: view:crm.lead:0
msgid "Lead Description"
-msgstr ""
+msgstr "Leadomschrijving"
#. module: crm
#: code:addons/crm/crm_lead.py:565
@@ -1317,7 +1391,7 @@ msgstr "Samengevoegde opportuniteiten"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor7
msgid "Consulting"
-msgstr ""
+msgstr "Consulting"
#. module: crm
#: field:crm.case.section,code:0
@@ -1327,7 +1401,7 @@ msgstr "Code"
#. module: crm
#: view:sale.config.settings:0
msgid "Features"
-msgstr ""
+msgstr "Opties"
#. module: crm
#: field:crm.case.section,child_ids:0
@@ -1342,7 +1416,7 @@ msgstr "Telefoongesprekken in status Uit te voeren en Open."
#. module: crm
#: field:crm.lead2opportunity.partner.mass,user_ids:0
msgid "Salesmen"
-msgstr ""
+msgstr "Verkopers"
#. module: crm
#: view:crm.lead:0
@@ -1362,12 +1436,12 @@ msgstr "Annuleren"
#. module: crm
#: view:crm.lead:0
msgid "Opportunities Assigned to Me or My Team(s)"
-msgstr ""
+msgstr "Opportuniteiten voor mij of mijn team(s)"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor4
msgid "Information"
-msgstr ""
+msgstr "Informatie"
#. module: crm
#: view:crm.lead.report:0
@@ -1389,7 +1463,7 @@ msgstr ""
#: field:crm.lead2opportunity.partner.mass,action:0
#: field:crm.partner.binding,action:0
msgid "Related Customer"
-msgstr ""
+msgstr "Gekoppelde klant"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor8
@@ -1406,12 +1480,12 @@ msgstr "Lead/opportuniteit"
#: model:ir.actions.act_window,name:crm.action_merge_opportunities
#: model:ir.actions.act_window,name:crm.merge_opportunity_act
msgid "Merge leads/opportunities"
-msgstr ""
+msgstr "Leads/opportuniteiten samenvoegen"
#. module: crm
#: help:crm.case.stage,sequence:0
msgid "Used to order stages. Lower is better."
-msgstr ""
+msgstr "WOrdt gebruikt om fasen te rangschikken. Lager is beter."
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_phonecall_categ_action
@@ -1426,7 +1500,7 @@ msgstr "Leads/opportuniteiten in status Open."
#. module: crm
#: model:ir.model,name:crm.model_res_users
msgid "Users"
-msgstr ""
+msgstr "Gebruikers"
#. module: crm
#: model:mail.message.subtype,name:crm.mt_lead_stage
@@ -1484,7 +1558,7 @@ msgstr "Naam"
#. module: crm
#: view:crm.lead.report:0
msgid "Leads/Opportunities that are assigned to me"
-msgstr ""
+msgstr "Leads/opportuniteiten die aan mij zijn toegekend"
#. module: crm
#: field:crm.lead.report,date_closed:0
@@ -1502,12 +1576,12 @@ msgstr "Mijn zaken"
#: help:crm.lead,message_ids:0
#: help:crm.phonecall,message_ids:0
msgid "Messages and communication history"
-msgstr ""
+msgstr "Berichten en communicatiehistoriek"
#. module: crm
#: view:crm.lead:0
msgid "Show Countries"
-msgstr ""
+msgstr "Landen tonen"
#. module: crm
#: view:crm.lead:0
@@ -1531,7 +1605,7 @@ msgstr "Prospect omzetten naar relatie"
#. module: crm
#: model:ir.model,name:crm.model_crm_payment_mode
msgid "CRM Payment Mode"
-msgstr ""
+msgstr "CRM betalingswijze"
#. module: crm
#: view:crm.lead.report:0
@@ -1554,7 +1628,7 @@ msgstr "Groeperen op..."
#. module: crm
#: view:crm.merge.opportunity:0
msgid "Merge Leads/Opportunities"
-msgstr ""
+msgstr "Leads/opportuniteiten samenvoegen"
#. module: crm
#: field:crm.case.section,parent_id:0
@@ -1566,7 +1640,7 @@ msgstr "Hoofdteam"
#: selection:crm.lead2opportunity.partner.mass,action:0
#: selection:crm.partner.binding,action:0
msgid "Do not link to a customer"
-msgstr ""
+msgstr "Geen relatie koppelen"
#. module: crm
#: field:crm.lead,date_action:0
@@ -1580,11 +1654,14 @@ msgid ""
"stage. For example, if a stage is related to the status 'Close', when your "
"document reaches this stage, it is automatically closed."
msgstr ""
+"De status van uw document wordt automatisch gewijzigd in de functie van de "
+"gekozen fase. Als een fase gekoppeld is aan de status 'Gesloten', dan wordt "
+"het document automatisch gesloten als het in deze status komt."
#. module: crm
#: view:crm.lead2opportunity.partner.mass:0
msgid "Assign opportunities to"
-msgstr ""
+msgstr "Opportuniteiten toewijzen aan"
#. module: crm
#: model:crm.case.categ,name:crm.categ_phone1
@@ -1600,12 +1677,12 @@ msgstr "Maand van gesprek"
#: code:addons/crm/crm_phonecall.py:290
#, python-format
msgid "Partner has been <b>created</b>."
-msgstr ""
+msgstr "Relatie is <b>gemaakt</b>."
#. module: crm
#: field:sale.config.settings,module_crm_claim:0
msgid "Manage Customer Claims"
-msgstr ""
+msgstr "Klachten van klanten opvolgen"
#. module: crm
#: model:ir.actions.act_window,help:crm.action_report_crm_lead
@@ -1618,7 +1695,7 @@ msgstr ""
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor3
msgid "Services"
-msgstr ""
+msgstr "Diensten"
#. module: crm
#: selection:crm.lead,priority:0
@@ -1657,7 +1734,7 @@ msgstr "Antwoord aan"
#. module: crm
#: view:crm.lead:0
msgid "Display"
-msgstr ""
+msgstr "Weergeven"
#. module: crm
#: view:board.board:0
@@ -1693,12 +1770,12 @@ msgstr "Extra informatie"
#. module: crm
#: view:crm.lead:0
msgid "Fund Raising"
-msgstr ""
+msgstr "Fondsenwerving"
#. module: crm
#: view:crm.lead:0
msgid "Edit..."
-msgstr ""
+msgstr "Bewerken…"
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead5
@@ -1730,13 +1807,15 @@ msgstr "Lead naar opportuniteit / relatie"
#: help:crm.lead,partner_id:0
msgid "Linked partner (optional). Usually created when converting the lead."
msgstr ""
+"Gekoppelde relatie (optioneel). Doorgaans gemaakt bij het omzetten van de "
+"lead."
#. module: crm
#: field:crm.lead,payment_mode:0
#: view:crm.payment.mode:0
#: model:ir.actions.act_window,name:crm.action_crm_payment_mode
msgid "Payment Mode"
-msgstr ""
+msgstr "Betalingswijze"
#. module: crm
#: model:ir.model,name:crm.model_crm_lead2opportunity_partner_mass
@@ -1746,19 +1825,19 @@ msgstr "Vele leads naar opportuniteit / relatie"
#. module: crm
#: view:sale.config.settings:0
msgid "On Mail Server"
-msgstr ""
+msgstr "Op mailserver"
#. module: crm
#: model:ir.actions.act_window,name:crm.open_board_statistical_dash
#: model:ir.ui.menu,name:crm.menu_board_statistics_dash
msgid "CRM"
-msgstr ""
+msgstr "CRM"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_segmentation_tree-act
#: model:ir.ui.menu,name:crm.menu_crm_segmentation-act
msgid "Contacts Segmentation"
-msgstr ""
+msgstr "Contactpersoonsegmentering"
#. module: crm
#: model:process.node,note:crm.process_node_meeting0
@@ -1773,7 +1852,7 @@ msgstr "Televerkoop"
#. module: crm
#: view:crm.lead:0
msgid "Leads Assigned to Me or My Team(s)"
-msgstr ""
+msgstr "Leads voor mij of mijn team(s)"
#. module: crm
#: model:ir.model,name:crm.model_crm_segmentation_line
@@ -1817,7 +1896,7 @@ msgstr "Lead / klant"
#. module: crm
#: model:crm.case.section,name:crm.crm_case_section_2
msgid "Support Department"
-msgstr ""
+msgstr "Supportafdeling"
#. module: crm
#: view:crm.lead.report:0
@@ -1881,13 +1960,13 @@ msgstr ""
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor5
msgid "Design"
-msgstr ""
+msgstr "Ontwerp"
#. module: crm
#: selection:crm.lead2opportunity.partner,name:0
#: selection:crm.lead2opportunity.partner.mass,name:0
msgid "Merge with existing opportunities"
-msgstr ""
+msgstr "Samenvoegen met bestaande opportuniteiten"
#. module: crm
#: view:crm.phonecall.report:0
@@ -1912,6 +1991,8 @@ msgid ""
"The name of the future partner company that will be created while converting "
"the lead into opportunity"
msgstr ""
+"De naam van de toekomstige relatie die zal worden gemaakt als van de lead "
+"een opportuniteit wordt gemaakt."
#. module: crm
#: field:crm.opportunity2phonecall,note:0
@@ -1945,7 +2026,7 @@ msgstr "Openstaande opportuniteiten"
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead2
msgid "Email Campaign - Services"
-msgstr ""
+msgstr "E-mailcampagne - Diensten"
#. module: crm
#: selection:crm.case.stage,state:0
@@ -2018,7 +2099,7 @@ msgstr ""
#: selection:crm.lead2opportunity.partner.mass,action:0
#: selection:crm.partner.binding,action:0
msgid "Create a new customer"
-msgstr ""
+msgstr "Een nieuwe klant maken"
#. module: crm
#: field:crm.lead.report,deadline_day:0
@@ -2028,7 +2109,7 @@ msgstr "Verw. sluiting"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor2
msgid "Software"
-msgstr ""
+msgstr "Software"
#. module: crm
#: field:crm.case.section,change_responsible:0
@@ -2063,12 +2144,12 @@ msgstr "Plaats"
#. module: crm
#: selection:crm.case.stage,type:0
msgid "Both"
-msgstr ""
+msgstr "Beide"
#. module: crm
#: view:crm.phonecall:0
msgid "Call Done"
-msgstr ""
+msgstr "Gesprek uitgevoerd"
#. module: crm
#: view:crm.phonecall:0
@@ -2079,12 +2160,12 @@ msgstr "Verantwoordelijke"
#. module: crm
#: model:crm.case.section,name:crm.crm_case_section_3
msgid "Direct Marketing"
-msgstr ""
+msgstr "Direct Marketing"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor1
msgid "Product"
-msgstr ""
+msgstr "Product"
#. module: crm
#: field:crm.lead.report,creation_year:0
@@ -2094,7 +2175,7 @@ msgstr "Creatiejaar"
#. module: crm
#: view:crm.lead2opportunity.partner.mass:0
msgid "Conversion Options"
-msgstr ""
+msgstr "Conversieopties"
#. module: crm
#: view:crm.case.section:0
@@ -2106,7 +2187,7 @@ msgstr ""
#. module: crm
#: view:crm.lead:0
msgid "Address"
-msgstr ""
+msgstr "Adres"
#. module: crm
#: help:crm.case.section,alias_id:0
@@ -2114,6 +2195,8 @@ msgid ""
"The email address associated with this team. New emails received will "
"automatically create new leads assigned to the team."
msgstr ""
+"Het e-mailadres van het team. Nieuwe e-mails worden automatisch als lead "
+"gemaakt en toegekend aan dit team."
#. module: crm
#: view:crm.lead:0
@@ -2172,7 +2255,7 @@ msgstr "Verder verwerken"
#: selection:crm.lead2opportunity.partner.mass,name:0
#: model:ir.actions.act_window,name:crm.action_crm_lead2opportunity_partner
msgid "Convert to opportunity"
-msgstr ""
+msgstr "Omzetten naar opportuniteit"
#. module: crm
#: field:crm.opportunity2phonecall,user_id:0
@@ -2214,6 +2297,8 @@ msgid ""
"This stage is not visible, for example in status bar or kanban view, when "
"there are no records in that stage to display."
msgstr ""
+"Deze fase is niet zichtbaar, vb. in statusbalk of kanbanweergave, als er "
+"zich geen records in deze fase bevinden."
#. module: crm
#: field:crm.lead.report,nbr:0
@@ -2229,12 +2314,12 @@ msgstr "Verkoopteam aan wie de zaak toebehoort"
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead6
msgid "Banner Ads"
-msgstr ""
+msgstr "Kopadvertenties"
#. module: crm
#: field:crm.merge.opportunity,opportunity_ids:0
msgid "Leads/Opportunities"
-msgstr ""
+msgstr "Leads/opportuniteiten"
#. module: crm
#: field:crm.lead,fax:0
@@ -2279,17 +2364,17 @@ msgstr "Objectnaam"
#. module: crm
#: view:crm.phonecall:0
msgid "Phone Calls Assigned to Me or My Team(s)"
-msgstr ""
+msgstr "Telefoongesprekken voor mij of mijn team(s)"
#. module: crm
#: view:crm.lead:0
msgid "Reset"
-msgstr ""
+msgstr "Herstellen"
#. module: crm
#: view:sale.config.settings:0
msgid "After-Sale Services"
-msgstr ""
+msgstr "Klantenservice"
#. module: crm
#: field:crm.case.section,message_ids:0
@@ -2344,7 +2429,7 @@ msgstr ""
#. module: crm
#: field:crm.case.stage,state:0
msgid "Related Status"
-msgstr ""
+msgstr "Gekoppelde status"
#. module: crm
#: field:crm.phonecall,name:0
@@ -2365,7 +2450,7 @@ msgstr "Een gesprek plannen/noteren"
#. module: crm
#: view:crm.merge.opportunity:0
msgid "Select Leads/Opportunities"
-msgstr ""
+msgstr "Leads/opportuniteiten kiezen"
#. module: crm
#: selection:crm.phonecall,state:0
@@ -2390,7 +2475,7 @@ msgstr "Bevestigen"
#. module: crm
#: view:crm.lead:0
msgid "Unread messages"
-msgstr ""
+msgstr "Ongelezen berichten"
#. module: crm
#: field:crm.phonecall.report,section_id:0
@@ -2407,7 +2492,7 @@ msgstr "Optionele expressie"
#: field:crm.lead,message_follower_ids:0
#: field:crm.phonecall,message_follower_ids:0
msgid "Followers"
-msgstr ""
+msgstr "Volgers"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_case_category_act_leads_all
@@ -2430,7 +2515,7 @@ msgstr ""
#. module: crm
#: field:sale.config.settings,fetchmail_lead:0
msgid "Create leads from incoming mails"
-msgstr ""
+msgstr "Leads maken van binnenkomende mails"
#. module: crm
#: view:crm.lead:0
@@ -2481,7 +2566,7 @@ msgstr "Opportuniteiten maken van leads"
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead3
msgid "Email Campaign - Products"
-msgstr ""
+msgstr "E-mailcampagne - Producten"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_case_categ_phone_incoming0
@@ -2509,7 +2594,7 @@ msgstr "Allereerste contact met een nieuwe prospect"
#. module: crm
#: view:res.partner:0
msgid "Calls"
-msgstr ""
+msgstr "Gesprekken"
#. module: crm
#: field:crm.case.stage,on_change:0
@@ -2519,7 +2604,7 @@ msgstr "Kans automatisch wijzigen"
#. module: crm
#: view:crm.phonecall.report:0
msgid "My Phone Calls"
-msgstr ""
+msgstr "Mijn telefoongesprekken"
#. module: crm
#: model:crm.case.stage,name:crm.stage_lead3
@@ -2530,7 +2615,7 @@ msgstr "Kwalificatie"
#: field:crm.lead2opportunity.partner,name:0
#: field:crm.lead2opportunity.partner.mass,name:0
msgid "Conversion Action"
-msgstr ""
+msgstr "Conversieactie"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_lead_categ_action
@@ -2606,7 +2691,7 @@ msgstr "Verw. sluitingsjaar"
#. module: crm
#: model:ir.actions.client,name:crm.action_client_crm_menu
msgid "Open Sale Menu"
-msgstr ""
+msgstr "Het verkoopmenu openen"
#. module: crm
#: field:crm.lead,date_open:0
@@ -2629,12 +2714,12 @@ msgstr "Een gesprek plannen/noteren"
#. module: crm
#: field:crm.lead,planned_cost:0
msgid "Planned Costs"
-msgstr ""
+msgstr "Geplande kosten"
#. module: crm
#: help:crm.lead,date_deadline:0
msgid "Estimate of the date on which the opportunity will be won."
-msgstr ""
+msgstr "Verwachte datum waarop de opportuniteit kan worden gerealiseerd."
#. module: crm
#: help:crm.lead,email_cc:0
@@ -2698,7 +2783,7 @@ msgstr "Straat 2"
#. module: crm
#: field:sale.config.settings,module_crm_helpdesk:0
msgid "Manage Helpdesk and Support"
-msgstr ""
+msgstr "Helpdesk en ondersteuning"
#. module: crm
#: field:crm.lead.report,delay_open:0
@@ -2785,7 +2870,7 @@ msgstr "Gesprek noteren"
#. module: crm
#: help:sale.config.settings,group_fund_raising:0
msgid "Allows you to trace and manage your activities for fund raising."
-msgstr ""
+msgstr "Hiermee kunt u activiteiten voor fondsenwerving beheren"
#. module: crm
#: field:crm.meeting,phonecall_id:0
@@ -2797,6 +2882,8 @@ msgstr "Telefoongesprek"
#: view:crm.phonecall.report:0
msgid "Phone calls that are assigned to one of the sale teams I manage"
msgstr ""
+"Telefoongesprekken die zijn toegewezen aan een van de verkoopteams onder "
+"mijn beheer"
#. module: crm
#: view:crm.lead:0
@@ -2806,7 +2893,7 @@ msgstr "Creatiedatum"
#. module: crm
#: view:crm.lead:0
msgid "at"
-msgstr ""
+msgstr "bij"
#. module: crm
#: model:crm.case.stage,name:crm.stage_lead1
@@ -2875,7 +2962,7 @@ msgstr ""
#. module: crm
#: view:crm.lead:0
msgid "Internal Notes"
-msgstr ""
+msgstr "Interne notities"
#. module: crm
#: view:crm.lead:0
@@ -2895,7 +2982,7 @@ msgstr "Straat"
#. module: crm
#: field:crm.lead,referred:0
msgid "Referred By"
-msgstr ""
+msgstr "Doorverwezen via"
#. module: crm
#: view:crm.phonecall:0
@@ -2940,6 +3027,7 @@ msgstr "Verloren"
#, python-format
msgid "Closed/Cancelled leads cannot be converted into opportunities."
msgstr ""
+"Gesloten/geannuleerde leads kunnen niet in een opportuniteit worden omgezet"
#. module: crm
#: view:crm.lead:0
@@ -4199,3 +4287,6 @@ msgstr ""
#~ msgid "Recurrent"
#~ msgstr "Recurrent"
+
+#~ msgid "Conditions on Case Fields"
+#~ msgstr "Voorwaardevelden"
diff --git a/addons/crm/report/crm_lead_report.py b/addons/crm/report/crm_lead_report.py
index 323d6e4c3d6..d12facd66a0 100644
--- a/addons/crm/report/crm_lead_report.py
+++ b/addons/crm/report/crm_lead_report.py
@@ -145,6 +145,5 @@ class crm_lead_report(osv.osv):
WHERE c.active = 'true'
)""")
-crm_lead_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml
index 0e5df8837f1..759063b3c1d 100644
--- a/addons/crm/report/crm_lead_report_view.xml
+++ b/addons/crm/report/crm_lead_report_view.xml
@@ -19,7 +19,8 @@
<field name="channel_id" invisible="1"/>
<field name="type" invisible="1"/>
<field name="priority" invisible="1"/>
- <field name="section_id" invisible="1"/>
+ <field name="section_id" invisible="1"
+ groups="base.group_multi_salesteams"/>
<field name="user_id" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="partner_id" invisible="1"/>
@@ -77,10 +78,11 @@
help="Leads/Opportunities that are assigned to one of the sale teams I manage"/>
<separator/>
<filter icon="terp-personal" string="My Case(s)" help="Leads/Opportunities that are assigned to me" domain="[('user_id','=',uid)]"/>
- <field name="section_id" context="{'invisible_section': False}"/>
+ <field name="section_id" context="{'invisible_section': False}"
+ groups="base.group_multi_salesteams"/>
<field name="user_id" string="Salesperson"/>
<group expand="0" string="Extended Filters...">
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="stage_id" domain="[('section_ids', '=', 'section_id')]" />
<field name="type_id"/>
<field name="channel_id"/>
@@ -134,7 +136,8 @@
<field name="creation_month" invisible="1"/>
<field name="creation_day" invisible="1"/>
<field name="deadline_month" invisible="1"/>
- <field name="section_id" invisible="1"/>
+ <field name="section_id" invisible="1"
+ groups="base.group_multi_salesteams"/>
<field name="user_id" invisible="1"/>
<field name="partner_id" invisible="1"/>
<field name="country_id" invisible="1"/>
diff --git a/addons/crm/report/crm_phonecall_report.py b/addons/crm/report/crm_phonecall_report.py
index c4b014bb86f..77195097965 100644
--- a/addons/crm/report/crm_phonecall_report.py
+++ b/addons/crm/report/crm_phonecall_report.py
@@ -98,6 +98,5 @@ class crm_phonecall_report(osv.osv):
from
crm_phonecall c
)""")
-crm_phonecall_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/report/crm_phonecall_report_view.xml b/addons/crm/report/crm_phonecall_report_view.xml
index 1f1a4f91046..070d574e0cd 100644
--- a/addons/crm/report/crm_phonecall_report_view.xml
+++ b/addons/crm/report/crm_phonecall_report_view.xml
@@ -11,7 +11,8 @@
<tree string="Phone calls" create="false">
<field name="name" invisible="1"/>
<field name="month" invisible="1"/>
- <field name="section_id" invisible="1"/>
+ <field name="section_id" invisible="1"
+ groups="base.group_multi_salesteams"/>
<field name="priority" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="company_id" invisible="1"/>
@@ -59,10 +60,11 @@
help="Phone calls that are assigned to one of the sale teams I manage"/>
<separator/>
<filter icon="terp-personal" string="My Phone Calls" help="Phone Calls that are assigned to me" domain="[('user_id','=',uid)]" />
- <field name="section_id" string="Sales Team" context="{'invisible_section': False}"/>
+ <field name="section_id" string="Sales Team" context="{'invisible_section': False}"
+ groups="base.group_multi_salesteams"/>
<field name="user_id" string="Salesperson"/>
<group expand="0" string="Extended Filters...">
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="creation_date"/>
<field name="opening_date"/>
diff --git a/addons/crm/report/report_businessopp.py b/addons/crm/report/report_businessopp.py
index 45e36cf7046..c057673d57f 100644
--- a/addons/crm/report/report_businessopp.py
+++ b/addons/crm/report/report_businessopp.py
@@ -20,7 +20,6 @@
##############################################################################
import os, time
-from openerp import netsvc
import random
import StringIO
diff --git a/addons/crm/res_config.py b/addons/crm/res_config.py
index 229ad0189ff..ea37c24fe06 100644
--- a/addons/crm/res_config.py
+++ b/addons/crm/res_config.py
@@ -2,7 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Business Applications
-# Copyright (C) 2004-2012 OpenERP S.A. (<http://openerp.com>).
+# Copyright (C) 2004-TODAY OpenERP S.A. (<http://openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -21,24 +21,51 @@
from openerp.osv import fields, osv
-class crm_configuration(osv.osv_memory):
+
+class crm_configuration(osv.TransientModel):
_name = 'sale.config.settings'
_inherit = ['sale.config.settings', 'fetchmail.config.settings']
+ def set_group_multi_salesteams(self, cr, uid, ids, context=None):
+ """ This method is automatically called by res_config as it begins
+ with set. It is used to implement the 'one group or another'
+ behavior. We have to perform some group manipulation by hand
+ because in res_config.execute(), set_* methods are called
+ after group_*; therefore writing on an hidden res_config file
+ could not work.
+ If group_multi_salesteams is checked: remove group_mono_salesteams
+ from group_user, remove the users. Otherwise, just add
+ group_mono_salesteams in group_user.
+ The inverse logic about group_multi_salesteams is managed by the
+ normal behavior of 'group_multi_salesteams' field.
+ """
+ def ref(xml_id):
+ mod, xml = xml_id.split('.', 1)
+ return self.pool['ir.model.data'].get_object(cr, uid, mod, xml, context)
+
+ for obj in self.browse(cr, uid, ids, context=context):
+ config_group = ref('base.group_mono_salesteams')
+ base_group = ref('base.group_user')
+ if obj.group_multi_salesteams:
+ base_group.write({'implied_ids': [(3, config_group.id)]})
+ config_group.write({'users': [(3, u.id) for u in base_group.users]})
+ else:
+ base_group.write({'implied_ids': [(4, config_group.id)]})
+ return True
+
_columns = {
- 'fetchmail_lead': fields.boolean("Create leads from incoming mails",
- fetchmail_model='crm.lead', fetchmail_name='Incoming Leads',
- help="""Allows you to configure your incoming mail server, and create leads from incoming emails."""),
'group_fund_raising': fields.boolean("Manage Fund Raising",
implied_group='crm.group_fund_raising',
help="""Allows you to trace and manage your activities for fund raising."""),
- 'module_crm_claim':fields.boolean("Manage Customer Claims",
+ 'module_crm_claim': fields.boolean("Manage Customer Claims",
help="""Allows you to track your customers/suppliers claims and grievances.
This installs the module crm_claim."""),
- 'module_crm_helpdesk':fields.boolean("Manage Helpdesk and Support",
- help="""Allows you to communicate with Customer, process Customer query, and provide better help and support. This installs the module crm_helpdesk."""),
-
-
+ 'module_crm_helpdesk': fields.boolean("Manage Helpdesk and Support",
+ help="""Allows you to communicate with Customer, process Customer query, and provide better help and support. This installs the module crm_helpdesk."""),
+ 'group_multi_salesteams': fields.boolean("Organize Sales activities into multiple Sales Teams",
+ implied_group='base.group_multi_salesteams',
+ help="""Allows you to use Sales Teams to manage your leads and opportunities."""),
}
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/res_config_view.xml b/addons/crm/res_config_view.xml
index 9534c8620ee..547ce1c2ae6 100644
--- a/addons/crm/res_config_view.xml
+++ b/addons/crm/res_config_view.xml
@@ -22,20 +22,15 @@
</div>
</div>
</group>
- </div>
- <group name="On Mail Client" version="7.0" position="after">
+ <separator string="Sales Teams Configuration"/>
<group>
- <label for="id" string="On Mail Server"/>
+ <label for="id" string="Use Sales Teams"/>
<div>
- <div name="fetchmail_lead">
- <field name="fetchmail_lead" class="oe_inline"/>
- <label for="fetchmail_lead"/>
- <button name="configure_fetchmail_lead" type="object" string="Configure" icon="gtk-go-forward"
- attrs="{'invisible': [('fetchmail_lead','=',False)]}" class="oe_link"/>
- </div>
+ <field name="group_multi_salesteams" class="oe_inline"/>
+ <label for="group_multi_salesteams"/>
</div>
</group>
- </group>
+ </div>
</field>
</record>
diff --git a/addons/crm/res_partner.py b/addons/crm/res_partner.py
index 2fdccda2e06..f25b1303c02 100644
--- a/addons/crm/res_partner.py
+++ b/addons/crm/res_partner.py
@@ -92,7 +92,6 @@ class res_partner(osv.osv):
}, context=context)
opportunity_ids[partner_id] = opportunity_id
return opportunity_ids
-res_partner()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/res_partner_view.xml b/addons/crm/res_partner_view.xml
index 00a071fa954..dd6c50dbaba 100644
--- a/addons/crm/res_partner_view.xml
+++ b/addons/crm/res_partner_view.xml
@@ -10,7 +10,7 @@
<field eval="18" name="priority"/>
<field name="arch" type="xml">
<field name="user_id" position="after">
- <field name="section_id" completion="1"/>
+ <field name="section_id" completion="1" groups="base.group_multi_salesteams"/>
</field>
</field>
</record>
@@ -30,8 +30,11 @@
<field name="res_model">crm.lead</field>
<field name="view_mode">kanban,tree,form,graph,calendar</field>
<field name="domain">[('type','=','opportunity')]</field>
- <field name="context">{'search_default_partner_id': active_id,
- 'stage_type': 'opportunity', 'default_type': 'opportunity'}</field>
+ <field name="context">{
+ 'search_default_partner_id': active_id,
+ 'stage_type': 'opportunity',
+ 'default_type': 'opportunity'
+ }</field>
<field name="view_id" eval="False"/>
<field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/>
<field name="help" type="html">
diff --git a/addons/crm/security/crm_security.xml b/addons/crm/security/crm_security.xml
index 2c34252209c..34137dc0fac 100644
--- a/addons/crm/security/crm_security.xml
+++ b/addons/crm/security/crm_security.xml
@@ -22,6 +22,19 @@
<field name="implied_ids" eval="[(4, ref('base.group_sale_salesman_all_leads'))]"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
+
+ <record id="base.group_mono_salesteams" model="res.groups">
+ <field name="name">Do Not Use Sales Teams</field>
+ <field name="category_id" ref="base.module_category_hidden"/>
+ </record>
+ <record id="base.group_user" model="res.groups">
+ <field name="implied_ids" eval="[(4, ref('base.group_mono_salesteams'))]"/>
+ </record>
+
+ <record id="base.group_multi_salesteams" model="res.groups">
+ <field name="name">Manage Sales Teams</field>
+ <field name="category_id" ref="base.module_category_hidden"/>
+ </record>
<record id="group_fund_raising" model="res.groups">
<field name="name">Manage Fund Raising</field>
diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv
index 74394d3c5ce..b09c201df2b 100644
--- a/addons/crm/security/ir.model.access.csv
+++ b/addons/crm/security/ir.model.access.csv
@@ -11,9 +11,7 @@ access_crm_lead_manager,crm.lead.manager,model_crm_lead,base.group_sale_manager,
access_crm_phonecall_manager,crm.phonecall.manager,model_crm_phonecall,base.group_sale_manager,1,1,1,1
access_crm_case_categ,crm.case.categ,model_crm_case_categ,base.group_user,1,0,0,0
access_crm_lead,crm.lead,model_crm_lead,base.group_sale_salesman,1,1,1,0
-access_crm_lead_all,crm.lead.all,model_crm_lead,base.group_user,1,0,0,0
access_crm_phonecall,crm.phonecall,model_crm_phonecall,base.group_sale_salesman,1,1,1,0
-access_crm_phonecall_all,crm.phonecall.all,model_crm_phonecall,base.group_user,1,0,0,0
access_crm_case_section_user,crm.case.section.user,model_crm_case_section,base.group_sale_salesman,1,1,1,0
access_crm_case_section_manager,crm.case.section.manager,model_crm_case_section,base.group_sale_manager,1,1,1,1
access_crm_case_stage,crm.case.stage,model_crm_case_stage,,1,0,0,0
@@ -37,3 +35,5 @@ access_crm_lead_partner_manager,crm.lead.partner.manager,model_crm_lead,base.gro
access_crm_phonecall_partner_manager,crm.phonecall.partner.manager,model_crm_phonecall,base.group_partner_manager,1,1,1,1
access_crm_payment_mode_user,crm.payment.mode,model_crm_payment_mode,base.group_sale_salesman,1,0,0,0
access_crm_payment_mode,crm.payment.mode,model_crm_payment_mode,base.group_sale_manager,1,1,1,1
+access_base_partner_merge_line_manager,base_partner_merge_line.manager,model_base_partner_merge_line,base.group_system,1,1,1,1
+access_base_partner_merge_manager,base_partner_merge.manager,model_base_partner_merge_automatic_wizard,base.group_system,1,1,1,1
diff --git a/addons/crm/static/src/css/crm.css b/addons/crm/static/src/css/crm.css
new file mode 100644
index 00000000000..3ad3840a4e1
--- /dev/null
+++ b/addons/crm/static/src/css/crm.css
@@ -0,0 +1,42 @@
+.openerp .oe_kanban_view .oe_kanban_crm_salesteams {
+ width: 345px;
+}
+.openerp .oe_kanban_view .oe_kanban_crm_salesteams .oe_avatars {
+ text-align: right;
+ margin: -5px 0 -10px 0;
+}
+
+.openerp .oe_kanban_view .oe_kanban_crm_salesteams .oe_avatars img {
+ width: 30px;
+ height: 30px;
+ padding-left: 0px;
+ margin-top: 3px;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+ border-radius: 2px;
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+ -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+}
+
+.openerp .oe_kanban_view .oe_kanban_crm_salesteams .oe_items_list {
+ margin: 10px 0;
+}
+.openerp .oe_kanban_view .oe_kanban_crm_salesteams .oe_items_list a {
+ width: 110px;
+ display: inline-block;
+}
+.openerp .oe_kanban_view .oe_kanban_crm_salesteams .oe_items_list a:hover {
+ text-decoration: underline !important;
+}
+.openerp .oe_kanban_view .oe_kanban_crm_salesteams .oe_center {
+ text-align: center;
+ margin: 3px 0;
+}
+.openerp .oe_kanban_view .oe_kanban_crm_salesteams .oe_center .oe_sum {
+ margin: 0;
+ font-size: 40px;
+}
+.openerp .oe_kanban_view .oe_kanban_crm_salesteams .oe_center .oe_subsum {
+ font-size: 10px;
+}
diff --git a/addons/crm/static/src/js/crm.js b/addons/crm/static/src/js/crm.js
new file mode 100644
index 00000000000..e027313d6dc
--- /dev/null
+++ b/addons/crm/static/src/js/crm.js
@@ -0,0 +1,11 @@
+openerp.crm = function(openerp) {
+ openerp.web_kanban.KanbanRecord.include({
+ on_card_clicked: function() {
+ if (this.view.dataset.model === 'crm.case.section') {
+ this.$('.oe_kanban_crm_salesteams_list a').first().click();
+ } else {
+ this._super.apply(this, arguments);
+ }
+ },
+ });
+};
diff --git a/addons/crm/test/process/cancel_lead.yml b/addons/crm/test/crm_lead_cancel.yml
index edaf844952a..edaf844952a 100644
--- a/addons/crm/test/process/cancel_lead.yml
+++ b/addons/crm/test/crm_lead_cancel.yml
diff --git a/addons/crm/test/ui/duplicate_lead.yml b/addons/crm/test/crm_lead_copy.yml
index b6071ae9f9d..b6071ae9f9d 100644
--- a/addons/crm/test/ui/duplicate_lead.yml
+++ b/addons/crm/test/crm_lead_copy.yml
diff --git a/addons/crm/test/process/merge_opportunity.yml b/addons/crm/test/crm_lead_merge.yml
index c50af5214e6..b14f9272df9 100644
--- a/addons/crm/test/process/merge_opportunity.yml
+++ b/addons/crm/test/crm_lead_merge.yml
@@ -37,20 +37,19 @@
I check for the resulting merged opp (based on name and partner).
-
!python {model: crm.lead}: |
- merge_id = self.search(cr, uid, [('name', '=', 'Test lead 1'), ('partner_id','=', ref("base.res_partner_1"))])
+ merge_id = self.search(cr, uid, [('name', '=', 'Test opportunity 1'), ('partner_id','=', ref("base.res_partner_5"))])
assert merge_id, 'Fail to create merge opportunity wizard'
merge_result = self.browse(cr, uid, merge_id)[0]
- assert merge_result.partner_id.id == ref("base.res_partner_1"), 'Partner mismatch: when merging leads/opps with different m2o values, the first not null value prevails (the other are dropped)'
- assert merge_result.description == 'This is the description of the test lead 1.\n\nThis is the description of the test lead 2.\n\nThis is the description of the test opp 1.', 'Description mismatch: when merging leads/opps with different text values, these values should get concatenated and separated with line returns'
+ assert merge_result.description == 'This is the description of the test opp 1.\n\nThis is the description of the test lead 1.\n\nThis is the description of the test lead 2.', 'Description mismatch: when merging leads/opps with different text values, these values should get concatenated and separated with line returns'
assert merge_result.type == 'opportunity', 'Type mismatch: when at least one opp in involved in the merge, the result should be a new opp (instead of %s)' % merge_result.type
-
The other (tailing) leads/opps shouldn't exist anymore.
-
!python {model: crm.lead}: |
- tailing_lead = self.search(cr, uid, [('id', '=', ref('test_crm_lead_02'))])
+ tailing_lead = self.search(cr, uid, [('id', '=', ref('test_crm_lead_01'))])
assert not tailing_lead, 'This tailing lead (id %s) should not exist anymore' % ref('test_crm_lead_02')
- tailing_opp = self.search(cr, uid, [('id', '=', ref('test_crm_opp_01'))])
+ tailing_opp = self.search(cr, uid, [('id', '=', ref('test_crm_lead_02'))])
assert not tailing_opp, 'This tailing opp (id %s) should not exist anymore' % ref('test_crm_opp_01')
-
I want to test leads merge. Start by creating two leads (with the same partner).
diff --git a/addons/crm/test/process/communication_with_customer.yml b/addons/crm/test/crm_lead_message.yml
index 221a4ab634f..0f7d4655398 100644
--- a/addons/crm/test/process/communication_with_customer.yml
+++ b/addons/crm/test/crm_lead_message.yml
@@ -4,8 +4,7 @@
Mail script will fetch his request from mail server. Then I process that mail after read EML file.
-
!python {model: mail.thread}: |
- from openerp import addons
- request_file = open(addons.get_module_resource('crm','test', 'customer_request.eml'),'rb')
+ request_file = open(openerp.modules.module.get_module_resource('crm','test', 'customer_request.eml'),'rb')
request_message = request_file.read()
self.message_process(cr, uid, 'crm.lead', request_message)
-
diff --git a/addons/crm/test/ui/crm_demo.yml b/addons/crm/test/crm_lead_onchange.yml
index 9154ffdf513..9154ffdf513 100644
--- a/addons/crm/test/ui/crm_demo.yml
+++ b/addons/crm/test/crm_lead_onchange.yml
diff --git a/addons/crm/test/ui/delete_lead.yml b/addons/crm/test/crm_lead_unlink.yml
index 49713039f22..49713039f22 100644
--- a/addons/crm/test/ui/delete_lead.yml
+++ b/addons/crm/test/crm_lead_unlink.yml
diff --git a/addons/crm/test/process/lead2opportunity2win.yml b/addons/crm/test/lead2opportunity2win.yml
index 94e7149ef77..94e7149ef77 100644
--- a/addons/crm/test/process/lead2opportunity2win.yml
+++ b/addons/crm/test/lead2opportunity2win.yml
diff --git a/addons/crm/test/process/lead2opportunity_assign_salesmen.yml b/addons/crm/test/lead2opportunity_assign_salesmen.yml
index 0edd3b8edce..0edd3b8edce 100644
--- a/addons/crm/test/process/lead2opportunity_assign_salesmen.yml
+++ b/addons/crm/test/lead2opportunity_assign_salesmen.yml
diff --git a/addons/crm/test/process/phonecalls.yml b/addons/crm/test/phonecalls.yml
index 51a933f3223..51a933f3223 100644
--- a/addons/crm/test/process/phonecalls.yml
+++ b/addons/crm/test/phonecalls.yml
diff --git a/addons/crm/test/process/segmentation.yml b/addons/crm/test/segmentation.yml
index f3801b80ec6..f3801b80ec6 100644
--- a/addons/crm/test/process/segmentation.yml
+++ b/addons/crm/test/segmentation.yml
diff --git a/addons/crm/validate_email.py b/addons/crm/validate_email.py
new file mode 100644
index 00000000000..38de5743fca
--- /dev/null
+++ b/addons/crm/validate_email.py
@@ -0,0 +1,123 @@
+# RFC 2822 - style email validation for Python
+# (c) 2012 Syrus Akbary <me@syrusakbary.com>
+# Extended from (c) 2011 Noel Bush <noel@aitools.org>
+# for support of mx and user check
+# This code is made available to you under the GNU LGPL v3.
+#
+# This module provides a single method, valid_email_address(),
+# which returns True or False to indicate whether a given address
+# is valid according to the 'addr-spec' part of the specification
+# given in RFC 2822. Ideally, we would like to find this
+# in some other library, already thoroughly tested and well-
+# maintained. The standard Python library email.utils
+# contains a parse_addr() function, but it is not sufficient
+# to detect many malformed addresses.
+#
+# This implementation aims to be faithful to the RFC, with the
+# exception of a circular definition (see comments below), and
+# with the omission of the pattern components marked as "obsolete".
+
+import re
+import smtplib
+import socket
+
+try:
+ import DNS
+ ServerError = DNS.ServerError
+except:
+ DNS = None
+ class ServerError(Exception): pass
+# All we are really doing is comparing the input string to one
+# gigantic regular expression. But building that regexp, and
+# ensuring its correctness, is made much easier by assembling it
+# from the "tokens" defined by the RFC. Each of these tokens is
+# tested in the accompanying unit test file.
+#
+# The section of RFC 2822 from which each pattern component is
+# derived is given in an accompanying comment.
+#
+# (To make things simple, every string below is given as 'raw',
+# even when it's not strictly necessary. This way we don't forget
+# when it is necessary.)
+#
+WSP = r'[ \t]' # see 2.2.2. Structured Header Field Bodies
+CRLF = r'(?:\r\n)' # see 2.2.3. Long Header Fields
+NO_WS_CTL = r'\x01-\x08\x0b\x0c\x0f-\x1f\x7f' # see 3.2.1. Primitive Tokens
+QUOTED_PAIR = r'(?:\\.)' # see 3.2.2. Quoted characters
+FWS = r'(?:(?:' + WSP + r'*' + CRLF + r')?' + \
+ WSP + r'+)' # see 3.2.3. Folding white space and comments
+CTEXT = r'[' + NO_WS_CTL + \
+ r'\x21-\x27\x2a-\x5b\x5d-\x7e]' # see 3.2.3
+CCONTENT = r'(?:' + CTEXT + r'|' + \
+ QUOTED_PAIR + r')' # see 3.2.3 (NB: The RFC includes COMMENT here
+ # as well, but that would be circular.)
+COMMENT = r'\((?:' + FWS + r'?' + CCONTENT + \
+ r')*' + FWS + r'?\)' # see 3.2.3
+CFWS = r'(?:' + FWS + r'?' + COMMENT + ')*(?:' + \
+ FWS + '?' + COMMENT + '|' + FWS + ')' # see 3.2.3
+ATEXT = r'[\w!#$%&\'\*\+\-/=\?\^`\{\|\}~]' # see 3.2.4. Atom
+ATOM = CFWS + r'?' + ATEXT + r'+' + CFWS + r'?' # see 3.2.4
+DOT_ATOM_TEXT = ATEXT + r'+(?:\.' + ATEXT + r'+)*' # see 3.2.4
+DOT_ATOM = CFWS + r'?' + DOT_ATOM_TEXT + CFWS + r'?' # see 3.2.4
+QTEXT = r'[' + NO_WS_CTL + \
+ r'\x21\x23-\x5b\x5d-\x7e]' # see 3.2.5. Quoted strings
+QCONTENT = r'(?:' + QTEXT + r'|' + \
+ QUOTED_PAIR + r')' # see 3.2.5
+QUOTED_STRING = CFWS + r'?' + r'"(?:' + FWS + \
+ r'?' + QCONTENT + r')*' + FWS + \
+ r'?' + r'"' + CFWS + r'?'
+LOCAL_PART = r'(?:' + DOT_ATOM + r'|' + \
+ QUOTED_STRING + r')' # see 3.4.1. Addr-spec specification
+DTEXT = r'[' + NO_WS_CTL + r'\x21-\x5a\x5e-\x7e]' # see 3.4.1
+DCONTENT = r'(?:' + DTEXT + r'|' + \
+ QUOTED_PAIR + r')' # see 3.4.1
+DOMAIN_LITERAL = CFWS + r'?' + r'\[' + \
+ r'(?:' + FWS + r'?' + DCONTENT + \
+ r')*' + FWS + r'?\]' + CFWS + r'?' # see 3.4.1
+DOMAIN = r'(?:' + DOT_ATOM + r'|' + \
+ DOMAIN_LITERAL + r')' # see 3.4.1
+ADDR_SPEC = LOCAL_PART + r'@' + DOMAIN # see 3.4.1
+
+# A valid address will match exactly the 3.4.1 addr-spec.
+VALID_ADDRESS_REGEXP = '^' + ADDR_SPEC + '$'
+
+def validate_email(email, check_mx=False,verify=False):
+
+ """Indicate whether the given string is a valid email address
+ according to the 'addr-spec' portion of RFC 2822 (see section
+ 3.4.1). Parts of the spec that are marked obsolete are *not*
+ included in this test, and certain arcane constructions that
+ depend on circular definitions in the spec may not pass, but in
+ general this should correctly identify any email address likely
+ to be in use as of 2011."""
+ try:
+ assert re.match(VALID_ADDRESS_REGEXP, email) is not None
+ check_mx |= verify
+ if check_mx:
+ if not DNS: raise Exception('For check the mx records or check if the email exists you must have installed pyDNS python package')
+ DNS.DiscoverNameServers()
+ hostname = email[email.find('@')+1:]
+ mx_hosts = DNS.mxlookup(hostname)
+ for mx in mx_hosts:
+ try:
+ smtp = smtplib.SMTP()
+ smtp.connect(mx[1])
+ if not verify: return True
+ status, _ = smtp.helo()
+ if status != 250: continue
+ smtp.mail('')
+ status, _ = smtp.rcpt(email)
+ if status != 250: return False
+ break
+ except smtplib.SMTPServerDisconnected: #Server not permits verify user
+ break
+ except smtplib.SMTPConnectError:
+ continue
+ except (AssertionError, ServerError):
+ return False
+ return True
+
+# import sys
+
+# sys.modules[__name__],sys.modules['validate_email_module'] = validate_email,sys.modules[__name__]
+# from validate_email_module import *
diff --git a/addons/crm/wizard/crm_lead_to_opportunity_view.xml b/addons/crm/wizard/crm_lead_to_opportunity_view.xml
index 00686de1c8e..4093df910d0 100644
--- a/addons/crm/wizard/crm_lead_to_opportunity_view.xml
+++ b/addons/crm/wizard/crm_lead_to_opportunity_view.xml
@@ -22,7 +22,7 @@
<field name="phone"/>
<field name="stage_id"/>
<field name="user_id"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</tree>
</field>
</group>
@@ -68,13 +68,13 @@
<field name="phone"/>
<field name="stage_id"/>
<field name="user_id"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</tree>
</field>
</group>
<group string="Assign opportunities to" attrs="{'invisible': [('name', '=', '')]}">
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
<field name="user_ids" widget="many2many_tags"/>
</group>
diff --git a/addons/crm/wizard/crm_merge_opportunities_view.xml b/addons/crm/wizard/crm_merge_opportunities_view.xml
index f68abeb8a52..919d83cb9a7 100644
--- a/addons/crm/wizard/crm_merge_opportunities_view.xml
+++ b/addons/crm/wizard/crm_merge_opportunities_view.xml
@@ -19,7 +19,7 @@
<field name="phone"/>
<field name="stage_id"/>
<field name="user_id"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</tree>
</field>
<footer>
diff --git a/addons/crm/wizard/crm_opportunity_to_phonecall.py b/addons/crm/wizard/crm_opportunity_to_phonecall.py
index ee7ed1fc31f..bb1ac2fdce6 100644
--- a/addons/crm/wizard/crm_opportunity_to_phonecall.py
+++ b/addons/crm/wizard/crm_opportunity_to_phonecall.py
@@ -73,6 +73,5 @@ class crm_opportunity2phonecall(osv.osv_memory):
action=data.action, context=context)
return {'type': 'ir.actions.act_window_close'}
-crm_opportunity2phonecall()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/wizard/crm_opportunity_to_phonecall_view.xml b/addons/crm/wizard/crm_opportunity_to_phonecall_view.xml
index ad369448517..846d71d74da 100644
--- a/addons/crm/wizard/crm_opportunity_to_phonecall_view.xml
+++ b/addons/crm/wizard/crm_opportunity_to_phonecall_view.xml
@@ -23,7 +23,7 @@
<field name="partner_id" readonly="True"/>
<field name="phone"/>
<field name="user_id" attrs="{'invisible': [('action','=','log')]}"/>
- <field name="section_id" widget="selection" attrs="{'invisible': [('action','=','log')]}"/>
+ <field name="section_id" widget="selection" attrs="{'invisible': [('action','=','log')]}" groups="base.group_multi_salesteams"/>
</group>
</group>
<field name="note" placeholder="Call Description" />
diff --git a/addons/crm/wizard/crm_phonecall_to_meeting.py b/addons/crm/wizard/crm_phonecall_to_meeting.py
index 4e21e01b834..105ab113a71 100644
--- a/addons/crm/wizard/crm_phonecall_to_meeting.py
+++ b/addons/crm/wizard/crm_phonecall_to_meeting.py
@@ -59,6 +59,5 @@ class crm_phonecall2meeting(osv.osv_memory):
}
return res
-crm_phonecall2meeting()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/wizard/crm_phonecall_to_phonecall.py b/addons/crm/wizard/crm_phonecall_to_phonecall.py
index d0bcd12dbb7..7e1da41a29f 100644
--- a/addons/crm/wizard/crm_phonecall_to_phonecall.py
+++ b/addons/crm/wizard/crm_phonecall_to_phonecall.py
@@ -96,6 +96,5 @@ class crm_phonecall2phonecall(osv.osv_memory):
res.update({'partner_id': phonecall.partner_id and phonecall.partner_id.id or False})
return res
-crm_phonecall2phonecall()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/wizard/crm_phonecall_to_phonecall_view.xml b/addons/crm/wizard/crm_phonecall_to_phonecall_view.xml
index e2d25218749..812468b17e6 100644
--- a/addons/crm/wizard/crm_phonecall_to_phonecall_view.xml
+++ b/addons/crm/wizard/crm_phonecall_to_phonecall_view.xml
@@ -15,7 +15,7 @@
<field name="date" string="Planned Date" attrs="{'invisible': [('action','=','log')]}"/>
<field name="partner_id" readonly="True"/>
<field name="user_id"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</group>
<footer>
<button name="action_schedule" type="object" string="Log Call" attrs="{'invisible' : [('action', '!=', 'log')]}" class="oe_highlight"/>
diff --git a/addons/crm_claim/__init__.py b/addons/crm_claim/__init__.py
index 2012c227adf..7395ea83fe5 100644
--- a/addons/crm_claim/__init__.py
+++ b/addons/crm_claim/__init__.py
@@ -21,7 +21,6 @@
import crm_claim
import report
-import res_config
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_claim/__openerp__.py b/addons/crm_claim/__openerp__.py
index 78dfba2ed53..61257265f1b 100644
--- a/addons/crm_claim/__openerp__.py
+++ b/addons/crm_claim/__openerp__.py
@@ -41,7 +41,6 @@ automatically new claims based on incoming emails.
'crm_claim_menu.xml',
'security/ir.model.access.csv',
'report/crm_claim_report_view.xml',
- 'res_config_view.xml',
'crm_claim_data.xml',
],
'demo': ['crm_claim_demo.xml'],
diff --git a/addons/crm_claim/crm_claim_view.xml b/addons/crm_claim/crm_claim_view.xml
index b1ab72e20f6..e295bfdd250 100644
--- a/addons/crm_claim/crm_claim_view.xml
+++ b/addons/crm_claim/crm_claim_view.xml
@@ -116,7 +116,7 @@
<group colspan="4" col="4" groups="base.group_user">
<field name="user_id"/>
<field name="priority"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
<field name="date_deadline"/>
<field name="state" groups="base.group_no_one"/>
</group>
@@ -201,7 +201,7 @@
<filter icon="terp-gtk-media-pause" string="Pending" domain="[('state','=','pending')]"/>
<separator/>
<filter string="Unassigned Claims" icon="terp-personal-" domain="[('user_id','=', False)]" help="Unassigned Claims" />
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="user_id"/>
<group expand="0" string="Group By...">
<filter string="Partner" icon="terp-partner" domain="[]" help="Partner" context="{'group_by':'partner_id'}"/>
diff --git a/addons/crm_claim/i18n/cs.po b/addons/crm_claim/i18n/cs.po
new file mode 100644
index 00000000000..9c9bc7c46d0
--- /dev/null
+++ b/addons/crm_claim/i18n/cs.po
@@ -0,0 +1,881 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:47+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: crm_claim
+#: help:crm.claim.stage,fold:0
+msgid ""
+"This stage is not visible, for example in status bar or kanban view, when "
+"there are no records in that stage to display."
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.report,nbr:0
+msgid "# of Cases"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: view:crm.claim.report:0
+msgid "Group By..."
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Responsibilities"
+msgstr ""
+
+#. module: crm_claim
+#: help:sale.config.settings,fetchmail_claim:0
+msgid ""
+"Allows you to configure your incoming mail server, and create claims from "
+"incoming emails."
+msgstr ""
+
+#. module: crm_claim
+#: model:ir.model,name:crm_claim.model_crm_claim_stage
+msgid "Claim stages"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "March"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.report,delay_close:0
+msgid "Delay to close"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,resolution:0
+msgid "Resolution"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,company_id:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: crm_claim
+#: model:ir.actions.act_window,help:crm_claim.crm_claim_categ_action
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a claim category.\n"
+" </p><p>\n"
+" Create claim categories to better manage and classify your\n"
+" claims. Some example of claims can be: preventive action,\n"
+" corrective action.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "#Claim"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.stage,name:0
+msgid "Stage Name"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Salesperson"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim,priority:0
+#: selection:crm.claim.report,priority:0
+msgid "Highest"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+#: field:crm.claim.report,day:0
+msgid "Day"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Claim Description"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: crm_claim
+#: model:crm.case.categ,name:crm_claim.categ_claim1
+msgid "Factual Claims"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim,state:0
+#: selection:crm.claim.report,state:0
+#: selection:crm.claim.stage,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: crm_claim
+#: model:crm.case.resource.type,name:crm_claim.type_claim2
+msgid "Preventive"
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.report,date_closed:0
+msgid "Close Date"
+msgstr ""
+
+#. module: crm_claim
+#: view:res.partner:0
+msgid "False"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,ref:0
+msgid "Reference"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Date of claim"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "# Mails"
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: field:crm.claim,date_deadline:0
+#: field:crm.claim.report,date_deadline:0
+msgid "Deadline"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: field:crm.claim,partner_id:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,partner_id:0
+#: model:ir.model,name:crm_claim.model_res_partner
+msgid "Partner"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Follow Up"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim,type_action:0
+#: selection:crm.claim.report,type_action:0
+msgid "Preventive Action"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.report,section_id:0
+msgid "Section"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Root Causes"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,user_fault:0
+msgid "Trouble Responsible"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,priority:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,priority:0
+msgid "Priority"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.stage,fold:0
+msgid "Hide in Views when Empty"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: selection:crm.claim,state:0
+#: view:crm.claim.report:0
+#: model:crm.claim.stage,name:crm_claim.stage_claim1
+#: selection:crm.claim.stage,state:0
+msgid "New"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.stage,section_ids:0
+msgid "Sections"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,email_from:0
+msgid "Email"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim,priority:0
+#: selection:crm.claim.report,priority:0
+msgid "Lowest"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,action_next:0
+msgid "Next Action"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "My Sales Team(s)"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,create_date:0
+msgid "Creation Date"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,name:0
+msgid "Claim Subject"
+msgstr ""
+
+#. module: crm_claim
+#: model:crm.claim.stage,name:crm_claim.stage_claim3
+msgid "Rejected"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,date_action_next:0
+msgid "Next Action Date"
+msgstr ""
+
+#. module: crm_claim
+#: model:ir.actions.act_window,help:crm_claim.action_report_crm_claim
+msgid ""
+"Have a general overview of all claims processed in the system by sorting "
+"them with specific criteria."
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "July"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.stage:0
+#: model:ir.actions.act_window,name:crm_claim.crm_claim_stage_act
+msgid "Claim Stages"
+msgstr ""
+
+#. module: crm_claim
+#: model:ir.ui.menu,name:crm_claim.menu_crm_case_claim-act
+msgid "Categories"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: field:crm.claim,stage_id:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,stage_id:0
+msgid "Stage"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Dates"
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim,email_from:0
+msgid "Destination email for email gateway."
+msgstr ""
+
+#. module: crm_claim
+#: code:addons/crm_claim/crm_claim.py:194
+#, python-format
+msgid "No Subject"
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim.stage,state:0
+msgid ""
+"The related status for the stage. The status of your document will "
+"automatically change regarding the selected stage. For example, if a stage "
+"is related to the status 'Close', when your document reaches this stage, it "
+"will be automatically have the 'closed' status."
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Settle"
+msgstr ""
+
+#. module: crm_claim
+#: model:ir.ui.menu,name:crm_claim.menu_claim_stage_view
+msgid "Stages"
+msgstr ""
+
+#. module: crm_claim
+#: model:ir.actions.act_window,name:crm_claim.action_report_crm_claim
+#: model:ir.ui.menu,name:crm_claim.menu_report_crm_claim_tree
+msgid "Claims Analysis"
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim.report,delay_close:0
+msgid "Number of Days to close the case"
+msgstr ""
+
+#. module: crm_claim
+#: model:ir.model,name:crm_claim.model_crm_claim_report
+msgid "CRM Claim Report"
+msgstr ""
+
+#. module: crm_claim
+#: view:sale.config.settings:0
+msgid "Configure"
+msgstr ""
+
+#. module: crm_claim
+#: model:crm.case.resource.type,name:crm_claim.type_claim1
+msgid "Corrective"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "September"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "December"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+#: field:crm.claim.report,month:0
+msgid "Month"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,type_action:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,type_action:0
+msgid "Action Type"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,write_date:0
+msgid "Update Date"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Year of claim"
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim.stage,case_default:0
+msgid ""
+"If you check this field, this stage will be proposed by default on each "
+"sales team. It will not assign this stage to existing teams."
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,categ_id:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,categ_id:0
+msgid "Category"
+msgstr ""
+
+#. module: crm_claim
+#: model:crm.case.categ,name:crm_claim.categ_claim2
+msgid "Value Claims"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Responsible User"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,email_cc:0
+msgid "Watchers Emails"
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim,email_cc:0
+msgid ""
+"These email addresses will be added to the CC field of all inbound and "
+"outbound emails for this record before being sent. Separate multiple email "
+"addresses with a comma"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim,priority:0
+#: selection:crm.claim.report,priority:0
+msgid "Low"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,date_closed:0
+#: selection:crm.claim,state:0
+#: selection:crm.claim.report,state:0
+#: selection:crm.claim.stage,state:0
+msgid "Closed"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Reject"
+msgstr ""
+
+#. module: crm_claim
+#: view:res.partner:0
+msgid "Partners Claim"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.stage:0
+msgid "Claim Stage"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: selection:crm.claim,state:0
+#: view:crm.claim.report:0
+#: selection:crm.claim.report,state:0
+#: selection:crm.claim.stage,state:0
+msgid "Pending"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: field:crm.claim,state:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,state:0
+#: field:crm.claim.stage,state:0
+msgid "Status"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "August"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim,priority:0
+#: selection:crm.claim.report,priority:0
+msgid "Normal"
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim.stage,sequence:0
+msgid "Used to order stages. Lower is better."
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "June"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,id:0
+msgid "ID"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,partner_phone:0
+msgid "Phone"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.report,user_id:0
+msgid "User"
+msgstr ""
+
+#. module: crm_claim
+#: model:ir.actions.act_window,help:crm_claim.crm_claim_stage_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to setup a new stage in the processing of the claims. "
+"\n"
+" </p><p>\n"
+" You can create claim stages to categorize the status of "
+"every\n"
+" claim entered in the system. The stages define all the "
+"steps\n"
+" required for the resolution of a claim.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim,state:0
+msgid ""
+"The status is set to 'Draft', when a case is created. "
+"If the case is in progress the status is set to 'Open'. "
+"When the case is over, the status is set to 'Done'. If "
+"the case needs to be reviewed then the status is set "
+"to 'Pending'."
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,active:0
+msgid "Active"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "November"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Extended Filters..."
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Closure"
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim,section_id:0
+msgid ""
+"Responsible sales team. Define Responsible user and Email account for mail "
+"gateway."
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "October"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "January"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: field:crm.claim,date:0
+msgid "Claim Date"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: crm_claim
+#: model:ir.actions.act_window,name:crm_claim.crm_claim_categ_action
+msgid "Claim Categories"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.stage,case_default:0
+msgid "Common to All Teams"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: view:crm.claim.report:0
+#: model:ir.actions.act_window,name:crm_claim.act_claim_partner
+#: model:ir.actions.act_window,name:crm_claim.crm_case_categ_claim0
+#: model:ir.ui.menu,name:crm_claim.menu_crm_case_claims
+#: view:res.partner:0
+#: field:res.partner,claims_ids:0
+msgid "Claims"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim,type_action:0
+#: selection:crm.claim.report,type_action:0
+msgid "Corrective Action"
+msgstr ""
+
+#. module: crm_claim
+#: model:crm.case.categ,name:crm_claim.categ_claim3
+msgid "Policy Claims"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Date Closed"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: model:ir.model,name:crm_claim.model_crm_claim
+#: model:ir.ui.menu,name:crm_claim.menu_config_claim
+msgid "Claim"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "My Company"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Done"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Claim Reporter"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Cancel"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+#: selection:crm.claim.report,state:0
+msgid "Open"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "New Claims"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: selection:crm.claim,state:0
+#: model:crm.claim.stage,name:crm_claim.stage_claim5
+#: selection:crm.claim.stage,state:0
+msgid "In Progress"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: field:crm.claim,user_id:0
+msgid "Responsible"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Search"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Unassigned Claims"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.report,delay_expected:0
+msgid "Overpassed Deadline"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,cause:0
+msgid "Root Cause"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Claim/Action Description"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,description:0
+msgid "Description"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Search Claims"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "May"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: view:crm.claim.report:0
+msgid "Type"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Resolution Actions"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.stage,case_refused:0
+msgid "Refused stage"
+msgstr ""
+
+#. module: crm_claim
+#: model:ir.actions.act_window,help:crm_claim.crm_case_categ_claim0
+msgid ""
+"Record and track your customers' claims. Claims may be linked to a sales "
+"order or a lot. You can send emails with attachments and keep the full "
+"history for a claim (emails sent, intervention type and so on). Claims may "
+"automatically be linked to an email address using the mail gateway module."
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.report,email:0
+msgid "# Emails"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Month of claim"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "February"
+msgstr ""
+
+#. module: crm_claim
+#: model:ir.model,name:crm_claim.model_sale_config_settings
+msgid "sale.config.settings"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+#: field:crm.claim.report,name:0
+msgid "Year"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "My company"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "April"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "My Case(s)"
+msgstr ""
+
+#. module: crm_claim
+#: model:crm.claim.stage,name:crm_claim.stage_claim2
+msgid "Settled"
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: crm_claim
+#: field:sale.config.settings,fetchmail_claim:0
+msgid "Create claims from incoming mails"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.stage,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Actions"
+msgstr ""
+
+#. module: crm_claim
+#: selection:crm.claim,priority:0
+#: selection:crm.claim.report,priority:0
+msgid "High"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim,section_id:0
+#: view:crm.claim.report:0
+msgid "Sales Team"
+msgstr ""
+
+#. module: crm_claim
+#: field:crm.claim.report,create_date:0
+msgid "Create Date"
+msgstr ""
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "In Progress Claims"
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim.stage,section_ids:0
+msgid ""
+"Link between stages and sales teams. When set, this limitate the current "
+"stage to the selected sales teams."
+msgstr ""
+
+#. module: crm_claim
+#: help:crm.claim.stage,case_refused:0
+msgid "Refused stages are specific stages for done."
+msgstr ""
diff --git a/addons/crm_claim/i18n/ko.po b/addons/crm_claim/i18n/ko.po
new file mode 100644
index 00000000000..aabd1bef7bb
--- /dev/null
+++ b/addons/crm_claim/i18n/ko.po
@@ -0,0 +1,906 @@
+# Korean translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-29 00:30+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Korean <ko@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-30 05:27+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: crm_claim
+#: help:crm.claim.stage,fold:0
+msgid ""
+"This stage is not visible, for example in status bar or kanban view, when "
+"there are no records in that stage to display."
+msgstr "이 단계는 이 단계에 표시될 기록이 없을 때 상태 표시줄 또는 간판 화면에 나타나지 않습니다."
+
+#. module: crm_claim
+#: field:crm.claim.report,nbr:0
+msgid "# of Cases"
+msgstr "사례 #"
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: view:crm.claim.report:0
+msgid "Group By..."
+msgstr "분류 기준..."
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Responsibilities"
+msgstr "책무"
+
+#. module: crm_claim
+#: help:sale.config.settings,fetchmail_claim:0
+msgid ""
+"Allows you to configure your incoming mail server, and create claims from "
+"incoming emails."
+msgstr "수신메일서버를 설정하고 수신메일로부터 클레임을 생성할 수 있도록 함."
+
+#. module: crm_claim
+#: model:ir.model,name:crm_claim.model_crm_claim_stage
+msgid "Claim stages"
+msgstr "클레임 단계"
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "March"
+msgstr "3월"
+
+#. module: crm_claim
+#: field:crm.claim.report,delay_close:0
+msgid "Delay to close"
+msgstr "마감까지의 지연"
+
+#. module: crm_claim
+#: field:crm.claim,message_unread:0
+msgid "Unread Messages"
+msgstr "읽지 않은 메시지"
+
+#. module: crm_claim
+#: field:crm.claim,resolution:0
+msgid "Resolution"
+msgstr "해결"
+
+#. module: crm_claim
+#: field:crm.claim,company_id:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,company_id:0
+msgid "Company"
+msgstr "업체"
+
+#. module: crm_claim
+#: model:ir.actions.act_window,help:crm_claim.crm_claim_categ_action
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a claim category.\n"
+" </p><p>\n"
+" Create claim categories to better manage and classify your\n"
+" claims. Some example of claims can be: preventive action,\n"
+" corrective action.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" 클레임 목록을 생성하려면 클릭하십시오.\n"
+" </p><p>\n"
+" 클레임 목록을 생성하여 클레임을 더욱 잘 관리하고 분류하십시오.\n"
+" 클레임의 몇몇 예시는 다음과 같습니다: 예방조치,\n"
+" 시정조치.\n"
+" </p>\n"
+" "
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "#Claim"
+msgstr "클레임 #"
+
+#. module: crm_claim
+#: field:crm.claim.stage,name:0
+msgid "Stage Name"
+msgstr "단계명"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Salesperson"
+msgstr "영업사원"
+
+#. module: crm_claim
+#: selection:crm.claim,priority:0
+#: selection:crm.claim.report,priority:0
+msgid "Highest"
+msgstr "가장 높음"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+#: field:crm.claim.report,day:0
+msgid "Day"
+msgstr "일"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Claim Description"
+msgstr "클레임 설명"
+
+#. module: crm_claim
+#: field:crm.claim,message_ids:0
+msgid "Messages"
+msgstr "메시지"
+
+#. module: crm_claim
+#: model:crm.case.categ,name:crm_claim.categ_claim1
+msgid "Factual Claims"
+msgstr "사실에 근거한 클레임"
+
+#. module: crm_claim
+#: selection:crm.claim,state:0
+#: selection:crm.claim.report,state:0
+#: selection:crm.claim.stage,state:0
+msgid "Cancelled"
+msgstr "취소됨"
+
+#. module: crm_claim
+#: model:crm.case.resource.type,name:crm_claim.type_claim2
+msgid "Preventive"
+msgstr "예방"
+
+#. module: crm_claim
+#: help:crm.claim,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr "체크할 경우, 새로운 메시지를 주목할 필요가 있습니다."
+
+#. module: crm_claim
+#: field:crm.claim.report,date_closed:0
+msgid "Close Date"
+msgstr "마감일"
+
+#. module: crm_claim
+#: view:res.partner:0
+msgid "False"
+msgstr "거짓"
+
+#. module: crm_claim
+#: field:crm.claim,ref:0
+msgid "Reference"
+msgstr "참조"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Date of claim"
+msgstr "클레임 날짜"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "# Mails"
+msgstr "메일 #"
+
+#. module: crm_claim
+#: help:crm.claim,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr "대화 요약 (메시지 개수, ...)을 내포함. 이 요약은 간판 화면에 삽입할 수 있도록 html 형식으로 직접 작성됩니다."
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: field:crm.claim,date_deadline:0
+#: field:crm.claim.report,date_deadline:0
+msgid "Deadline"
+msgstr "기한"
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: field:crm.claim,partner_id:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,partner_id:0
+#: model:ir.model,name:crm_claim.model_res_partner
+msgid "Partner"
+msgstr "협력업체"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Follow Up"
+msgstr "후속조치"
+
+#. module: crm_claim
+#: selection:crm.claim,type_action:0
+#: selection:crm.claim.report,type_action:0
+msgid "Preventive Action"
+msgstr "예방조치"
+
+#. module: crm_claim
+#: field:crm.claim.report,section_id:0
+msgid "Section"
+msgstr "부서"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Root Causes"
+msgstr "근본 원인"
+
+#. module: crm_claim
+#: field:crm.claim,user_fault:0
+msgid "Trouble Responsible"
+msgstr "문제 담당"
+
+#. module: crm_claim
+#: field:crm.claim,priority:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,priority:0
+msgid "Priority"
+msgstr "우선 순위"
+
+#. module: crm_claim
+#: field:crm.claim.stage,fold:0
+msgid "Hide in Views when Empty"
+msgstr "비어있으면 화면에서 숨김"
+
+#. module: crm_claim
+#: field:crm.claim,message_follower_ids:0
+msgid "Followers"
+msgstr "팔로워"
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: selection:crm.claim,state:0
+#: view:crm.claim.report:0
+#: model:crm.claim.stage,name:crm_claim.stage_claim1
+#: selection:crm.claim.stage,state:0
+msgid "New"
+msgstr "새로 만들기"
+
+#. module: crm_claim
+#: field:crm.claim.stage,section_ids:0
+msgid "Sections"
+msgstr "부서"
+
+#. module: crm_claim
+#: field:crm.claim,email_from:0
+msgid "Email"
+msgstr "이메일"
+
+#. module: crm_claim
+#: selection:crm.claim,priority:0
+#: selection:crm.claim.report,priority:0
+msgid "Lowest"
+msgstr "가장 낮음"
+
+#. module: crm_claim
+#: field:crm.claim,action_next:0
+msgid "Next Action"
+msgstr "다음 액션"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "My Sales Team(s)"
+msgstr "내 영업팀"
+
+#. module: crm_claim
+#: field:crm.claim,create_date:0
+msgid "Creation Date"
+msgstr "생성일"
+
+#. module: crm_claim
+#: field:crm.claim,name:0
+msgid "Claim Subject"
+msgstr "클레임 주제"
+
+#. module: crm_claim
+#: model:crm.claim.stage,name:crm_claim.stage_claim3
+msgid "Rejected"
+msgstr "거부됨"
+
+#. module: crm_claim
+#: field:crm.claim,date_action_next:0
+msgid "Next Action Date"
+msgstr "다음 액션일"
+
+#. module: crm_claim
+#: model:ir.actions.act_window,help:crm_claim.action_report_crm_claim
+msgid ""
+"Have a general overview of all claims processed in the system by sorting "
+"them with specific criteria."
+msgstr "클레임을 특정 기준으로 분류하여 시스템에서 처리된 모든 클레임의 일반 개요를 소유하십시오."
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "July"
+msgstr "7월"
+
+#. module: crm_claim
+#: view:crm.claim.stage:0
+#: model:ir.actions.act_window,name:crm_claim.crm_claim_stage_act
+msgid "Claim Stages"
+msgstr "클레임 단계"
+
+#. module: crm_claim
+#: model:ir.ui.menu,name:crm_claim.menu_crm_case_claim-act
+msgid "Categories"
+msgstr "분류"
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: field:crm.claim,stage_id:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,stage_id:0
+msgid "Stage"
+msgstr "단계"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Dates"
+msgstr "날짜"
+
+#. module: crm_claim
+#: help:crm.claim,email_from:0
+msgid "Destination email for email gateway."
+msgstr "이메일 게이트웨이를 위한 목적지 이메일"
+
+#. module: crm_claim
+#: code:addons/crm_claim/crm_claim.py:194
+#, python-format
+msgid "No Subject"
+msgstr "제목 없음"
+
+#. module: crm_claim
+#: help:crm.claim.stage,state:0
+msgid ""
+"The related status for the stage. The status of your document will "
+"automatically change regarding the selected stage. For example, if a stage "
+"is related to the status 'Close', when your document reaches this stage, it "
+"will be automatically have the 'closed' status."
+msgstr ""
+"단계의 관련된 상태. 문서의 상태는 선택한 단계에 관해 자동으로 변경됩니다. 예를 들어, 단계가 '마감' 상태와 관련되었을 경우, 문서가 "
+"이 단계에 도달하면 자동으로 '마감' 상태가 됩니다."
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Settle"
+msgstr "해결"
+
+#. module: crm_claim
+#: model:ir.ui.menu,name:crm_claim.menu_claim_stage_view
+msgid "Stages"
+msgstr "단계"
+
+#. module: crm_claim
+#: model:ir.actions.act_window,name:crm_claim.action_report_crm_claim
+#: model:ir.ui.menu,name:crm_claim.menu_report_crm_claim_tree
+msgid "Claims Analysis"
+msgstr "클레임 분석"
+
+#. module: crm_claim
+#: help:crm.claim.report,delay_close:0
+msgid "Number of Days to close the case"
+msgstr "사례를 마감하기까지의 잔여일수"
+
+#. module: crm_claim
+#: model:ir.model,name:crm_claim.model_crm_claim_report
+msgid "CRM Claim Report"
+msgstr "CRM 클레임 보고서"
+
+#. module: crm_claim
+#: view:sale.config.settings:0
+msgid "Configure"
+msgstr "설정"
+
+#. module: crm_claim
+#: model:crm.case.resource.type,name:crm_claim.type_claim1
+msgid "Corrective"
+msgstr "수정 조치"
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "September"
+msgstr "9월"
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "December"
+msgstr "12월"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+#: field:crm.claim.report,month:0
+msgid "Month"
+msgstr "월"
+
+#. module: crm_claim
+#: field:crm.claim,type_action:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,type_action:0
+msgid "Action Type"
+msgstr "액션 유형"
+
+#. module: crm_claim
+#: field:crm.claim,write_date:0
+msgid "Update Date"
+msgstr "날짜 갱신"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Year of claim"
+msgstr "클레임 발생년도"
+
+#. module: crm_claim
+#: help:crm.claim.stage,case_default:0
+msgid ""
+"If you check this field, this stage will be proposed by default on each "
+"sales team. It will not assign this stage to existing teams."
+msgstr "이 필드를 체크하면, 이 단계는 각 영업팀에 기본으로 제안됩니다. 기존 팀에게는 이 단계를 할당하지 않습니다."
+
+#. module: crm_claim
+#: field:crm.claim,categ_id:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,categ_id:0
+msgid "Category"
+msgstr "분류"
+
+#. module: crm_claim
+#: model:crm.case.categ,name:crm_claim.categ_claim2
+msgid "Value Claims"
+msgstr "가치 클레임"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Responsible User"
+msgstr "담당 사용자"
+
+#. module: crm_claim
+#: field:crm.claim,email_cc:0
+msgid "Watchers Emails"
+msgstr "전문가 이메일"
+
+#. module: crm_claim
+#: help:crm.claim,email_cc:0
+msgid ""
+"These email addresses will be added to the CC field of all inbound and "
+"outbound emails for this record before being sent. Separate multiple email "
+"addresses with a comma"
+msgstr ""
+"이 이메일 주소들은 이 기록에 대한 모든 수신 및 발신 이메일이 발송되기 전에 참조 필드에 추가됩니다. 다수의 이메일 주소를 쉼표로 "
+"분리하십시오"
+
+#. module: crm_claim
+#: selection:crm.claim.report,state:0
+msgid "Draft"
+msgstr "초안"
+
+#. module: crm_claim
+#: selection:crm.claim,priority:0
+#: selection:crm.claim.report,priority:0
+msgid "Low"
+msgstr "낮음"
+
+#. module: crm_claim
+#: field:crm.claim,date_closed:0
+#: selection:crm.claim,state:0
+#: selection:crm.claim.report,state:0
+#: selection:crm.claim.stage,state:0
+msgid "Closed"
+msgstr "마감됨"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Reject"
+msgstr "거부"
+
+#. module: crm_claim
+#: view:res.partner:0
+msgid "Partners Claim"
+msgstr "협력업체 클레임"
+
+#. module: crm_claim
+#: view:crm.claim.stage:0
+msgid "Claim Stage"
+msgstr "클레임 단계"
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: selection:crm.claim,state:0
+#: view:crm.claim.report:0
+#: selection:crm.claim.report,state:0
+#: selection:crm.claim.stage,state:0
+msgid "Pending"
+msgstr "보류 중"
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: field:crm.claim,state:0
+#: view:crm.claim.report:0
+#: field:crm.claim.report,state:0
+#: field:crm.claim.stage,state:0
+msgid "Status"
+msgstr "상태"
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "August"
+msgstr "8월"
+
+#. module: crm_claim
+#: selection:crm.claim,priority:0
+#: selection:crm.claim.report,priority:0
+msgid "Normal"
+msgstr "보통"
+
+#. module: crm_claim
+#: help:crm.claim.stage,sequence:0
+msgid "Used to order stages. Lower is better."
+msgstr "단계를 정렬하기 위해 사용됨. 낮을 수록 좋음."
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "June"
+msgstr "6월"
+
+#. module: crm_claim
+#: field:crm.claim,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: crm_claim
+#: field:crm.claim,partner_phone:0
+msgid "Phone"
+msgstr "전화"
+
+#. module: crm_claim
+#: field:crm.claim,message_is_follower:0
+msgid "Is a Follower"
+msgstr "은(는) 팔로워임"
+
+#. module: crm_claim
+#: field:crm.claim.report,user_id:0
+msgid "User"
+msgstr "사용자"
+
+#. module: crm_claim
+#: model:ir.actions.act_window,help:crm_claim.crm_claim_stage_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to setup a new stage in the processing of the claims. "
+"\n"
+" </p><p>\n"
+" You can create claim stages to categorize the status of "
+"every\n"
+" claim entered in the system. The stages define all the "
+"steps\n"
+" required for the resolution of a claim.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" 클레임을 처리하는 중에 새로운 단계를 설정하기 위해 클릭하십시오. \n"
+" </p><p>\n"
+" 시스템에 입력된 클레임의 단계마다 분류할 수 있도록\n"
+" 클레임 단계를 생성할 수 있습니다. 단계는 클레임을 해결하기 위해\n"
+" 필요한 모든 단계를 정의합니다..\n"
+" </p>\n"
+" "
+
+#. module: crm_claim
+#: help:crm.claim,state:0
+msgid ""
+"The status is set to 'Draft', when a case is created. "
+"If the case is in progress the status is set to 'Open'. "
+"When the case is over, the status is set to 'Done'. If "
+"the case needs to be reviewed then the status is set "
+"to 'Pending'."
+msgstr ""
+"사례가 생성되었을 때 상태가 '초안'으로 설정됩니다. 사례가 진행 중일 경우 상태는 '개시'로 설정됩니다. 사례가 끝났을 경우 '완료'로 "
+"설정됩니다. 사례를 검토할 필요가 있을 경우 상태는 '보류 중'으로 설정됩니다."
+
+#. module: crm_claim
+#: field:crm.claim,active:0
+msgid "Active"
+msgstr "활성"
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "November"
+msgstr "11월"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Extended Filters..."
+msgstr "확장 필터..."
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Closure"
+msgstr "폐쇄"
+
+#. module: crm_claim
+#: help:crm.claim,section_id:0
+msgid ""
+"Responsible sales team. Define Responsible user and Email account for mail "
+"gateway."
+msgstr "담당 영업팀. 메일 게이트웨이의 담당 사용자 및 이메일 계정을 정의하십시오."
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "October"
+msgstr "10월"
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "January"
+msgstr "1월"
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: field:crm.claim,date:0
+msgid "Claim Date"
+msgstr "클레임 발생일"
+
+#. module: crm_claim
+#: field:crm.claim,message_summary:0
+msgid "Summary"
+msgstr "요약"
+
+#. module: crm_claim
+#: model:ir.actions.act_window,name:crm_claim.crm_claim_categ_action
+msgid "Claim Categories"
+msgstr "클레임 분류"
+
+#. module: crm_claim
+#: field:crm.claim.stage,case_default:0
+msgid "Common to All Teams"
+msgstr "모든 팀에 공통적임"
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: view:crm.claim.report:0
+#: model:ir.actions.act_window,name:crm_claim.act_claim_partner
+#: model:ir.actions.act_window,name:crm_claim.crm_case_categ_claim0
+#: model:ir.ui.menu,name:crm_claim.menu_crm_case_claims
+#: view:res.partner:0
+#: field:res.partner,claims_ids:0
+msgid "Claims"
+msgstr "클레임"
+
+#. module: crm_claim
+#: selection:crm.claim,type_action:0
+#: selection:crm.claim.report,type_action:0
+msgid "Corrective Action"
+msgstr "시정조치"
+
+#. module: crm_claim
+#: model:crm.case.categ,name:crm_claim.categ_claim3
+msgid "Policy Claims"
+msgstr "정책 클레임"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Date Closed"
+msgstr "마감일"
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: model:ir.model,name:crm_claim.model_crm_claim
+#: model:ir.ui.menu,name:crm_claim.menu_config_claim
+msgid "Claim"
+msgstr "클레임"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "My Company"
+msgstr "내 업체"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Done"
+msgstr "완료"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Claim Reporter"
+msgstr "클레임 보고자"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Cancel"
+msgstr "취소"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+#: selection:crm.claim.report,state:0
+msgid "Open"
+msgstr "열기"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "New Claims"
+msgstr "새로운 클레임"
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: selection:crm.claim,state:0
+#: model:crm.claim.stage,name:crm_claim.stage_claim5
+#: selection:crm.claim.stage,state:0
+msgid "In Progress"
+msgstr "진행 중"
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: field:crm.claim,user_id:0
+msgid "Responsible"
+msgstr "담당"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Search"
+msgstr "검색"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Unassigned Claims"
+msgstr "할당되지 않은 클레임"
+
+#. module: crm_claim
+#: field:crm.claim.report,delay_expected:0
+msgid "Overpassed Deadline"
+msgstr "과거 만기일"
+
+#. module: crm_claim
+#: field:crm.claim,cause:0
+msgid "Root Cause"
+msgstr "근본 원인"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Claim/Action Description"
+msgstr "클레임/조치 설명"
+
+#. module: crm_claim
+#: field:crm.claim,description:0
+msgid "Description"
+msgstr "설명"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Search Claims"
+msgstr "클레임 검색"
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "May"
+msgstr "5월"
+
+#. module: crm_claim
+#: view:crm.claim:0
+#: view:crm.claim.report:0
+msgid "Type"
+msgstr "유형"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Resolution Actions"
+msgstr "결의 조치"
+
+#. module: crm_claim
+#: field:crm.claim.stage,case_refused:0
+msgid "Refused stage"
+msgstr "거부함 단계"
+
+#. module: crm_claim
+#: model:ir.actions.act_window,help:crm_claim.crm_case_categ_claim0
+msgid ""
+"Record and track your customers' claims. Claims may be linked to a sales "
+"order or a lot. You can send emails with attachments and keep the full "
+"history for a claim (emails sent, intervention type and so on). Claims may "
+"automatically be linked to an email address using the mail gateway module."
+msgstr ""
+"고객의 클레임을 기록 및 추적하십시오. 클레임은 판매 주문 또는 로트와 연결될 수 있습니다. 첨부 파일이 포함된 이메일을 발송하고 "
+"클레임에 대한 전체 기록을 보관할 수 있습니다 (보낸 이메일, 개입 유형 등). 클레임은 메일 게이트웨이 모듈을 사용하는 이메일 주소와 "
+"자동으로 연결될 수 있습니다."
+
+#. module: crm_claim
+#: field:crm.claim.report,email:0
+msgid "# Emails"
+msgstr "이메일 #"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "Month of claim"
+msgstr "클레임 발생월"
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "February"
+msgstr "2월"
+
+#. module: crm_claim
+#: model:ir.model,name:crm_claim.model_sale_config_settings
+msgid "sale.config.settings"
+msgstr "sale.config.settings"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+#: field:crm.claim.report,name:0
+msgid "Year"
+msgstr "년도"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "My company"
+msgstr "내 업체"
+
+#. module: crm_claim
+#: selection:crm.claim.report,month:0
+msgid "April"
+msgstr "4월"
+
+#. module: crm_claim
+#: view:crm.claim.report:0
+msgid "My Case(s)"
+msgstr "내 사례"
+
+#. module: crm_claim
+#: model:crm.claim.stage,name:crm_claim.stage_claim2
+msgid "Settled"
+msgstr "해결됨"
+
+#. module: crm_claim
+#: help:crm.claim,message_ids:0
+msgid "Messages and communication history"
+msgstr "메시지 및 의사소통 기록"
+
+#. module: crm_claim
+#: field:sale.config.settings,fetchmail_claim:0
+msgid "Create claims from incoming mails"
+msgstr "수신 이메일로부터 클레임을 생성"
+
+#. module: crm_claim
+#: field:crm.claim.stage,sequence:0
+msgid "Sequence"
+msgstr "순서"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "Actions"
+msgstr "조치"
+
+#. module: crm_claim
+#: selection:crm.claim,priority:0
+#: selection:crm.claim.report,priority:0
+msgid "High"
+msgstr "높음"
+
+#. module: crm_claim
+#: field:crm.claim,section_id:0
+#: view:crm.claim.report:0
+msgid "Sales Team"
+msgstr "영업팀"
+
+#. module: crm_claim
+#: field:crm.claim.report,create_date:0
+msgid "Create Date"
+msgstr "생성일"
+
+#. module: crm_claim
+#: view:crm.claim:0
+msgid "In Progress Claims"
+msgstr "진행 중 클레임"
+
+#. module: crm_claim
+#: help:crm.claim.stage,section_ids:0
+msgid ""
+"Link between stages and sales teams. When set, this limitate the current "
+"stage to the selected sales teams."
+msgstr "단계와 영업팀 간의 연결. 설정 시 현재 단계를 선택된 영업팀으로 한계를 정합니다."
+
+#. module: crm_claim
+#: help:crm.claim.stage,case_refused:0
+msgid "Refused stages are specific stages for done."
+msgstr "거절됨 단계는 완료됨의 특정 단계입니다."
diff --git a/addons/crm_claim/report/crm_claim_report.py b/addons/crm_claim/report/crm_claim_report.py
index ad56fa5e34e..2ed87505d9c 100644
--- a/addons/crm_claim/report/crm_claim_report.py
+++ b/addons/crm_claim/report/crm_claim_report.py
@@ -114,6 +114,5 @@ class crm_claim_report(osv.osv):
c.priority,c.type_action,c.date_deadline,c.date_closed,c.id
)""")
-crm_claim_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_claim/report/crm_claim_report_view.xml b/addons/crm_claim/report/crm_claim_report_view.xml
index a61490c6086..530eb6061a3 100644
--- a/addons/crm_claim/report/crm_claim_report_view.xml
+++ b/addons/crm_claim/report/crm_claim_report_view.xml
@@ -11,7 +11,8 @@
<tree string="Claims" create="false">
<field name="name" invisible="1"/>
<field name="month" invisible="1"/>
- <field name="section_id" invisible="1"/>
+ <field name="section_id" invisible="1"
+ groups="base.group_multi_salesteams"/>
<field name="user_id" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="partner_id" invisible="1"/>
@@ -61,9 +62,10 @@
<filter icon="terp-personal" string="My Case(s)" help="My Case(s)" domain="[('user_id','=',uid)]" />
<field name="company_id" groups="base.group_multi_company"/>
<field name="user_id" string="Salesperson"/>
- <field name="section_id" string="Sales Team" context="{'invisible_section': False}"/>
+ <field name="section_id" string="Sales Team" context="{'invisible_section': False}"
+ groups="base.group_multi_salesteams"/>
<group expand="0" string="Extended Filters...">
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="stage_id" domain="[('section_ids', '=', 'section_id')]"/>
<field name="categ_id" domain="[('object_id.model', '=', 'crm.claim')]"/>
<field name="priority"/>
diff --git a/addons/crm_claim/res_config_view.xml b/addons/crm_claim/res_config_view.xml
deleted file mode 100644
index 79474f1fb00..00000000000
--- a/addons/crm_claim/res_config_view.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<openerp>
- <data>
-
- <record id="view_project_config_claim" model="ir.ui.view">
- <field name="name">crm_claim settings</field>
- <field name="model">sale.config.settings</field>
- <field name="inherit_id" ref="base_setup.view_sale_config_settings"/>
- <field name="priority" eval="20"/>
- <field name="arch" type="xml">
- <div name="fetchmail_lead" position="after">
- <div>
- <field name="fetchmail_claim" class="oe_inline"/>
- <label for="fetchmail_claim"/>
- <button type="object" name="configure_fetchmail_claim" string="Configure" icon="gtk-go-forward"
- attrs="{'invisible': [('fetchmail_claim','=',False)]}" class="oe_link"/>
- </div>
- </div>
- </field>
- </record>
-
- </data>
-</openerp>
diff --git a/addons/crm_claim/test/process/claim.yml b/addons/crm_claim/test/process/claim.yml
index bacb073b4b9..a843372956e 100644
--- a/addons/crm_claim/test/process/claim.yml
+++ b/addons/crm_claim/test/process/claim.yml
@@ -4,8 +4,7 @@
Mail script will be fetched him request from mail server. so I process that mail after read EML file
-
!python {model: mail.thread}: |
- from openerp import addons
- request_file = open(addons.get_module_resource('crm_claim','test', 'customer_claim.eml'),'rb')
+ request_file = open(openerp.modules.module.get_module_resource('crm_claim','test', 'customer_claim.eml'),'rb')
request_message = request_file.read()
self.message_process(cr, uid, 'crm.claim', request_message)
-
diff --git a/addons/crm_helpdesk/crm_helpdesk_view.xml b/addons/crm_helpdesk/crm_helpdesk_view.xml
index 6c0e3433afe..6e3521be6f2 100644
--- a/addons/crm_helpdesk/crm_helpdesk_view.xml
+++ b/addons/crm_helpdesk/crm_helpdesk_view.xml
@@ -48,7 +48,7 @@
<sheet string="Helpdesk Support">
<group col="4" class="oe_header">
<field name="name" string="Query"/>
- <field name="section_id" widget="selection"/>
+ <field name="section_id" widget="selection" groups="base.group_multi_salesteams"/>
<field name="user_id"/>
<field name="date"/>
<field name="date_deadline"/>
@@ -115,7 +115,7 @@
<field name="date" string="Date"/>
<field name="date_deadline"/>
<field name="user_id"/>
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
<field name="priority"/>
<field name="state"/>
</tree>
@@ -152,9 +152,9 @@
<separator/>
<filter string="Assigned to Me or My Sales Team(s)" icon="terp-personal+" domain="['|', ('section_id.user_id','=',uid), ('section_id.member_ids', 'in', [uid])]"
help="Helpdesk requests that are assigned to me or to one of the sale teams I manage" />
- <field name="partner_id" />
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="user_id"/>
- <field name="section_id" string="Sales Team"/>
+ <field name="section_id" string="Sales Team" groups="base.group_multi_salesteams"/>
<group expand="0" string="Group By...">
<filter string="Partner" icon="terp-partner" domain="[]" help="Partner" context="{'group_by':'partner_id'}" />
<filter string="Responsible" icon="terp-personal" domain="[]" help="Responsible User" context="{'group_by':'user_id'}" />
diff --git a/addons/crm_helpdesk/i18n/cs.po b/addons/crm_helpdesk/i18n/cs.po
new file mode 100644
index 00000000000..58c37a7bc30
--- /dev/null
+++ b/addons/crm_helpdesk/i18n/cs.po
@@ -0,0 +1,708 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:47+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk.report,delay_close:0
+msgid "Delay to Close"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk.report,nbr:0
+msgid "# of Cases"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: view:crm.helpdesk.report:0
+msgid "Group By..."
+msgstr ""
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,email_from:0
+msgid "Destination email for email gateway"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "March"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,company_id:0
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,email_cc:0
+msgid "Watchers Emails"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "Salesperson"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,priority:0
+#: selection:crm.helpdesk.report,priority:0
+msgid "Highest"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,day:0
+msgid "Day"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "Date of helpdesk requests"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Notes"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "My company"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,state:0
+#: selection:crm.helpdesk.report,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: crm_helpdesk
+#: model:ir.actions.act_window,name:crm_helpdesk.action_report_crm_helpdesk
+#: model:ir.ui.menu,name:crm_helpdesk.menu_report_crm_helpdesks_tree
+msgid "Helpdesk Analysis"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,date_closed:0
+msgid "Close Date"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,ref:0
+msgid "Reference"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,date_action_next:0
+msgid "Next Action"
+msgstr ""
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Helpdesk Supports"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Extra Info"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,partner_id:0
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Estimates"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk.report,section_id:0
+msgid "Section"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,priority:0
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,priority:0
+msgid "Priority"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: selection:crm.helpdesk,state:0
+#: view:crm.helpdesk.report:0
+msgid "New"
+msgstr ""
+
+#. module: crm_helpdesk
+#: model:ir.model,name:crm_helpdesk.model_crm_helpdesk_report
+msgid "Helpdesk report after Sales Services"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,email_from:0
+msgid "Email"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,channel_id:0
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,channel_id:0
+msgid "Channel"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,priority:0
+#: selection:crm.helpdesk.report,priority:0
+msgid "Lowest"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "# Mails"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "My Sales Team(s)"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,create_date:0
+#: field:crm.helpdesk.report,create_date:0
+msgid "Creation Date"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Reset to Draft"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,date_deadline:0
+#: field:crm.helpdesk.report,date_deadline:0
+msgid "Deadline"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "July"
+msgstr ""
+
+#. module: crm_helpdesk
+#: model:ir.actions.act_window,name:crm_helpdesk.crm_helpdesk_categ_action
+msgid "Helpdesk Categories"
+msgstr ""
+
+#. module: crm_helpdesk
+#: model:ir.ui.menu,name:crm_helpdesk.menu_crm_case_helpdesk-act
+msgid "Categories"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "New Helpdesk Request"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Dates"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "Month of helpdesk requests"
+msgstr ""
+
+#. module: crm_helpdesk
+#: code:addons/crm_helpdesk/crm_helpdesk.py:104
+#, python-format
+msgid "No Subject"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid ""
+"Helpdesk requests that are assigned to me or to one of the sale teams I "
+"manage"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "#Helpdesk"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "All pending Helpdesk Request"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "Year of helpdesk requests"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "September"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "December"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,month:0
+msgid "Month"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,write_date:0
+msgid "Update Date"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Query"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,ref2:0
+msgid "Reference 2"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,categ_id:0
+#: field:crm.helpdesk.report,categ_id:0
+msgid "Category"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Responsible User"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Helpdesk Support"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,planned_cost:0
+#: field:crm.helpdesk.report,planned_cost:0
+msgid "Planned Costs"
+msgstr ""
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,channel_id:0
+msgid "Communication channel."
+msgstr ""
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,email_cc:0
+msgid ""
+"These email addresses will be added to the CC field of all inbound and "
+"outbound emails for this record before being sent. Separate multiple email "
+"addresses with a comma"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Search Helpdesk"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,priority:0
+#: selection:crm.helpdesk.report,priority:0
+msgid "Low"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,date_closed:0
+#: selection:crm.helpdesk,state:0
+#: view:crm.helpdesk.report:0
+#: selection:crm.helpdesk.report,state:0
+msgid "Closed"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: selection:crm.helpdesk,state:0
+#: selection:crm.helpdesk.report,state:0
+msgid "Pending"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,state:0
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,state:0
+msgid "Status"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "August"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,priority:0
+#: selection:crm.helpdesk.report,priority:0
+msgid "Normal"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Escalate"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "June"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,id:0
+msgid "ID"
+msgstr ""
+
+#. module: crm_helpdesk
+#: model:ir.actions.act_window,help:crm_helpdesk.crm_case_helpdesk_act111
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new request. \n"
+" </p><p>\n"
+" Helpdesk and Support allow you to track your interventions.\n"
+" </p><p>\n"
+" Use the OpenERP Issues system to manage your support\n"
+" activities. Issues can be connected to the email gateway: "
+"new\n"
+" emails may create issues, each of them automatically gets "
+"the\n"
+" history of the conversation with the customer.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,planned_revenue:0
+msgid "Planned Revenue"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk.report,user_id:0
+msgid "User"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,active:0
+msgid "Active"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "November"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "Extended Filters..."
+msgstr ""
+
+#. module: crm_helpdesk
+#: model:ir.actions.act_window,name:crm_helpdesk.crm_case_helpdesk_act111
+msgid "Helpdesk Requests"
+msgstr ""
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,section_id:0
+msgid ""
+"Responsible sales team. Define Responsible user and Email account for mail "
+"gateway."
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "October"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "January"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,date:0
+msgid "Date"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Misc"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "My Company"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "General"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "References"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Communication"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Cancel"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Close"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: view:crm.helpdesk.report:0
+#: selection:crm.helpdesk.report,state:0
+msgid "Open"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Helpdesk Support Tree"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,state:0
+msgid "In Progress"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Categorization"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+#: model:ir.model,name:crm_helpdesk.model_crm_helpdesk
+#: model:ir.ui.menu,name:crm_helpdesk.menu_config_helpdesk
+msgid "Helpdesk"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,user_id:0
+msgid "Responsible"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "Search"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk.report,delay_expected:0
+msgid "Overpassed Deadline"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,description:0
+msgid "Description"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "May"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,probability:0
+msgid "Probability (%)"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk.report,email:0
+msgid "# Emails"
+msgstr ""
+
+#. module: crm_helpdesk
+#: model:ir.actions.act_window,help:crm_helpdesk.action_report_crm_helpdesk
+msgid ""
+"Have a general overview of all support requests by sorting them with "
+"specific criteria such as the processing time, number of requests answered, "
+"emails sent and costs."
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "February"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,name:0
+msgid "Name"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,name:0
+msgid "Year"
+msgstr ""
+
+#. module: crm_helpdesk
+#: model:ir.ui.menu,name:crm_helpdesk.menu_help_support_main
+msgid "Helpdesk and Support"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "April"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "My Case(s)"
+msgstr ""
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,state:0
+msgid ""
+"The status is set to 'Draft', when a case is created. "
+" \n"
+"If the case is in progress the status is set to 'Open'. "
+" \n"
+"When the case is over, the status is set to 'Done'. "
+" \n"
+"If the case needs to be reviewed then the status is set to 'Pending'."
+msgstr ""
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: crm_helpdesk
+#: model:ir.actions.act_window,help:crm_helpdesk.crm_helpdesk_categ_action
+msgid ""
+"Create and manage helpdesk categories to better manage and classify your "
+"support requests."
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Request Date"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Open Helpdesk Request"
+msgstr ""
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,priority:0
+#: selection:crm.helpdesk.report,priority:0
+msgid "High"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,section_id:0
+#: view:crm.helpdesk.report:0
+msgid "Sales Team"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,date_action_last:0
+msgid "Last Action"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Assigned to Me or My Sales Team(s)"
+msgstr ""
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,duration:0
+msgid "Duration"
+msgstr ""
diff --git a/addons/crm_helpdesk/i18n/ko.po b/addons/crm_helpdesk/i18n/ko.po
new file mode 100644
index 00000000000..42d5760068c
--- /dev/null
+++ b/addons/crm_helpdesk/i18n/ko.po
@@ -0,0 +1,726 @@
+# Korean translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-29 01:09+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Korean <ko@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-30 05:27+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk.report,delay_close:0
+msgid "Delay to Close"
+msgstr "마감까지의 지연"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk.report,nbr:0
+msgid "# of Cases"
+msgstr "사례 #"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: view:crm.helpdesk.report:0
+msgid "Group By..."
+msgstr "분류 기준..."
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,email_from:0
+msgid "Destination email for email gateway"
+msgstr "이메일 게이트웨이를 위한 목적지 이메일"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "March"
+msgstr "3월"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,message_unread:0
+msgid "Unread Messages"
+msgstr "읽지 않은 메시지"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,company_id:0
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,company_id:0
+msgid "Company"
+msgstr "업체"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,email_cc:0
+msgid "Watchers Emails"
+msgstr "전문가 이메일"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "Salesperson"
+msgstr "영업사원"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,priority:0
+#: selection:crm.helpdesk.report,priority:0
+msgid "Highest"
+msgstr "가장 높음"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,day:0
+msgid "Day"
+msgstr "일"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "Date of helpdesk requests"
+msgstr "헬프데스크 요청 발생 날짜"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Notes"
+msgstr "메모"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,message_ids:0
+msgid "Messages"
+msgstr "메시지"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "My company"
+msgstr "내 업체"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,state:0
+#: selection:crm.helpdesk.report,state:0
+msgid "Cancelled"
+msgstr "취소됨"
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr "체크할 경우, 새로운 메시지를 주목할 필요가 있습니다."
+
+#. module: crm_helpdesk
+#: model:ir.actions.act_window,name:crm_helpdesk.action_report_crm_helpdesk
+#: model:ir.ui.menu,name:crm_helpdesk.menu_report_crm_helpdesks_tree
+msgid "Helpdesk Analysis"
+msgstr "헬프데스크 분석"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,date_closed:0
+msgid "Close Date"
+msgstr "마감일"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,ref:0
+msgid "Reference"
+msgstr "참조"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,date_action_next:0
+msgid "Next Action"
+msgstr "다음 조치"
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr "대화 요약 (메시지 개수, ...)을 내포함. 이 요약은 간판 화면에 삽입할 수 있도록 html 형식으로 직접 작성됩니다."
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Helpdesk Supports"
+msgstr "헬프데스크 지원"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Extra Info"
+msgstr "추가 정보"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,partner_id:0
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,partner_id:0
+msgid "Partner"
+msgstr "협력업체"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Estimates"
+msgstr "예상"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk.report,section_id:0
+msgid "Section"
+msgstr "부서"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,priority:0
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,priority:0
+msgid "Priority"
+msgstr "우선 순위"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,message_follower_ids:0
+msgid "Followers"
+msgstr "팔로워"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: selection:crm.helpdesk,state:0
+#: view:crm.helpdesk.report:0
+msgid "New"
+msgstr "새로 만들기"
+
+#. module: crm_helpdesk
+#: model:ir.model,name:crm_helpdesk.model_crm_helpdesk_report
+msgid "Helpdesk report after Sales Services"
+msgstr "판매 서비스 이후 헬프데스크 보고서"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,email_from:0
+msgid "Email"
+msgstr "이메일"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,channel_id:0
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,channel_id:0
+msgid "Channel"
+msgstr "수단"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,priority:0
+#: selection:crm.helpdesk.report,priority:0
+msgid "Lowest"
+msgstr "가장 낮음"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "# Mails"
+msgstr "메일 #"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "My Sales Team(s)"
+msgstr "내 영업팀"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,create_date:0
+#: field:crm.helpdesk.report,create_date:0
+msgid "Creation Date"
+msgstr "생성일"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Reset to Draft"
+msgstr "초안으로 재설정"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,date_deadline:0
+#: field:crm.helpdesk.report,date_deadline:0
+msgid "Deadline"
+msgstr "기한"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "July"
+msgstr "7월"
+
+#. module: crm_helpdesk
+#: model:ir.actions.act_window,name:crm_helpdesk.crm_helpdesk_categ_action
+msgid "Helpdesk Categories"
+msgstr "헬프데스크 분류"
+
+#. module: crm_helpdesk
+#: model:ir.ui.menu,name:crm_helpdesk.menu_crm_case_helpdesk-act
+msgid "Categories"
+msgstr "분류"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "New Helpdesk Request"
+msgstr "새로운 헬프데스크 요청"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Dates"
+msgstr "날짜"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "Month of helpdesk requests"
+msgstr "헬프데스크 요청 발생월"
+
+#. module: crm_helpdesk
+#: code:addons/crm_helpdesk/crm_helpdesk.py:104
+#, python-format
+msgid "No Subject"
+msgstr "제목 없음"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid ""
+"Helpdesk requests that are assigned to me or to one of the sale teams I "
+"manage"
+msgstr "나 또는 내가 관리하는 영업팀에 할당된 헬프데스크 요청"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "#Helpdesk"
+msgstr "#Helpdesk"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "All pending Helpdesk Request"
+msgstr "모든 보류 중인 헬프데스크 요청"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "Year of helpdesk requests"
+msgstr "헬프데스크 요청의 생성년도"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "September"
+msgstr "9월"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "December"
+msgstr "12월"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,month:0
+msgid "Month"
+msgstr "월"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,write_date:0
+msgid "Update Date"
+msgstr "날짜 갱신"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Query"
+msgstr "질의"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,ref2:0
+msgid "Reference 2"
+msgstr "참조 2"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,categ_id:0
+#: field:crm.helpdesk.report,categ_id:0
+msgid "Category"
+msgstr "분류"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Responsible User"
+msgstr "담당 사용자"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Helpdesk Support"
+msgstr "헬프데스크 지원"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,planned_cost:0
+#: field:crm.helpdesk.report,planned_cost:0
+msgid "Planned Costs"
+msgstr "계획된 비용"
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,channel_id:0
+msgid "Communication channel."
+msgstr "의사소통 수단"
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,email_cc:0
+msgid ""
+"These email addresses will be added to the CC field of all inbound and "
+"outbound emails for this record before being sent. Separate multiple email "
+"addresses with a comma"
+msgstr ""
+"이 이메일 주소들은 이 기록에 대한 모든 수신 및 발신 이메일이 발송되기 전에 참조 필드에 추가됩니다. 다수의 이메일 주소를 쉼표로 "
+"분리하십시오"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Search Helpdesk"
+msgstr "헬프데스크 검색"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,state:0
+msgid "Draft"
+msgstr "초안"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,priority:0
+#: selection:crm.helpdesk.report,priority:0
+msgid "Low"
+msgstr "낮음"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,date_closed:0
+#: selection:crm.helpdesk,state:0
+#: view:crm.helpdesk.report:0
+#: selection:crm.helpdesk.report,state:0
+msgid "Closed"
+msgstr "마감됨"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: selection:crm.helpdesk,state:0
+#: selection:crm.helpdesk.report,state:0
+msgid "Pending"
+msgstr "보류 중"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,state:0
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,state:0
+msgid "Status"
+msgstr "상태"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "August"
+msgstr "8월"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,priority:0
+#: selection:crm.helpdesk.report,priority:0
+msgid "Normal"
+msgstr "보통"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Escalate"
+msgstr "승급"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "June"
+msgstr "6월"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,id:0
+msgid "ID"
+msgstr "아이디"
+
+#. module: crm_helpdesk
+#: model:ir.actions.act_window,help:crm_helpdesk.crm_case_helpdesk_act111
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new request. \n"
+" </p><p>\n"
+" Helpdesk and Support allow you to track your interventions.\n"
+" </p><p>\n"
+" Use the OpenERP Issues system to manage your support\n"
+" activities. Issues can be connected to the email gateway: "
+"new\n"
+" emails may create issues, each of them automatically gets "
+"the\n"
+" history of the conversation with the customer.\n"
+" </p>\n"
+" "
+msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" 새로운 요청을 생성하기 위해 클릭하십시오. \n"
+" </p><p>\n"
+" 헬프데스크와 지원은 중재를 추적할 수 있도록 합니다.\n"
+" </p><p>\n"
+" OpenERP 문제 시스템을 사용하여 지원 활동을 관리하십시오.\n"
+" 문제는 이메일 게이트웨이로 연결될 수 있습니다: 새로운 이메일은\n"
+" 문제를 생성할 수 있으며, 각각의 문제마다 고객과의 대화 기록을\n"
+" 자동으로 획득합니다.\n"
+" </p>\n"
+" "
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,planned_revenue:0
+msgid "Planned Revenue"
+msgstr "계획된 수익"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,message_is_follower:0
+msgid "Is a Follower"
+msgstr "은(는) 팔로워임"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk.report,user_id:0
+msgid "User"
+msgstr "사용자"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,active:0
+msgid "Active"
+msgstr "활성"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "November"
+msgstr "11월"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "Extended Filters..."
+msgstr "확장 필터..."
+
+#. module: crm_helpdesk
+#: model:ir.actions.act_window,name:crm_helpdesk.crm_case_helpdesk_act111
+msgid "Helpdesk Requests"
+msgstr "헬프데스크 요청"
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,section_id:0
+msgid ""
+"Responsible sales team. Define Responsible user and Email account for mail "
+"gateway."
+msgstr "담당 영업팀. 메일 게이트웨이의 담당 사용자 및 이메일 계정을 정의하십시오."
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "October"
+msgstr "10월"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "January"
+msgstr "1월"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,message_summary:0
+msgid "Summary"
+msgstr "요약"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,date:0
+msgid "Date"
+msgstr "날짜"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Misc"
+msgstr "기타"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "My Company"
+msgstr "내 업체"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "General"
+msgstr "일반"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "References"
+msgstr "참조"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Communication"
+msgstr "의사소통"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Cancel"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Close"
+msgstr ""
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: view:crm.helpdesk.report:0
+#: selection:crm.helpdesk.report,state:0
+msgid "Open"
+msgstr "열기"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Helpdesk Support Tree"
+msgstr "헬프데스크 지원 트리"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,state:0
+msgid "In Progress"
+msgstr "진행 중"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Categorization"
+msgstr "분류화"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+#: model:ir.model,name:crm_helpdesk.model_crm_helpdesk
+#: model:ir.ui.menu,name:crm_helpdesk.menu_config_helpdesk
+msgid "Helpdesk"
+msgstr "헬프데스크"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,user_id:0
+msgid "Responsible"
+msgstr "담당"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "Search"
+msgstr "검색"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk.report,delay_expected:0
+msgid "Overpassed Deadline"
+msgstr "과거 기한"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,description:0
+msgid "Description"
+msgstr "설명"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "May"
+msgstr "5월"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,probability:0
+msgid "Probability (%)"
+msgstr "확률 (%)"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk.report,email:0
+msgid "# Emails"
+msgstr "이메일 #"
+
+#. module: crm_helpdesk
+#: model:ir.actions.act_window,help:crm_helpdesk.action_report_crm_helpdesk
+msgid ""
+"Have a general overview of all support requests by sorting them with "
+"specific criteria such as the processing time, number of requests answered, "
+"emails sent and costs."
+msgstr ""
+"처리 시간, 응답 완료된 요청 개수, 전송된 이메일, 비용 등의 특정 기준으로 정렬하여 모든 지원 요청에 대한 전반적인 개요를 획득함."
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "February"
+msgstr "2월"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,name:0
+msgid "Name"
+msgstr "이름"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+#: field:crm.helpdesk.report,name:0
+msgid "Year"
+msgstr "년도"
+
+#. module: crm_helpdesk
+#: model:ir.ui.menu,name:crm_helpdesk.menu_help_support_main
+msgid "Helpdesk and Support"
+msgstr "헬프데스크 및 지원"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk.report,month:0
+msgid "April"
+msgstr "4월"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk.report:0
+msgid "My Case(s)"
+msgstr "내 사례"
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,state:0
+msgid ""
+"The status is set to 'Draft', when a case is created. "
+" \n"
+"If the case is in progress the status is set to 'Open'. "
+" \n"
+"When the case is over, the status is set to 'Done'. "
+" \n"
+"If the case needs to be reviewed then the status is set to 'Pending'."
+msgstr ""
+"사례가 생성되었을 때 '초안'으로 설정됩니다. \n"
+"사례가 진행 중일 경우, 상태는 '개시됨'으로 설정됩니다. \n"
+"사례를 마쳤을 때 상태는 '완료됨'으로 설정됩니다. \n"
+"사례가 검토를 필요로 할 경우, 상태는 '보류 중'으로 설정됩니다."
+
+#. module: crm_helpdesk
+#: help:crm.helpdesk,message_ids:0
+msgid "Messages and communication history"
+msgstr "메시지 및 의사소통 기록"
+
+#. module: crm_helpdesk
+#: model:ir.actions.act_window,help:crm_helpdesk.crm_helpdesk_categ_action
+msgid ""
+"Create and manage helpdesk categories to better manage and classify your "
+"support requests."
+msgstr "헬프데스크 분류를 생성 및 관리하여 지원요청을 더욱 잘 관리하고 분류하세요."
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Request Date"
+msgstr "요청일"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Open Helpdesk Request"
+msgstr "헬프데스크 요청 열기"
+
+#. module: crm_helpdesk
+#: selection:crm.helpdesk,priority:0
+#: selection:crm.helpdesk.report,priority:0
+msgid "High"
+msgstr "높음"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+#: field:crm.helpdesk,section_id:0
+#: view:crm.helpdesk.report:0
+msgid "Sales Team"
+msgstr "영업팀"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,date_action_last:0
+msgid "Last Action"
+msgstr "최근 조치"
+
+#. module: crm_helpdesk
+#: view:crm.helpdesk:0
+msgid "Assigned to Me or My Sales Team(s)"
+msgstr "나 또는 내 영업팀에 할당됨"
+
+#. module: crm_helpdesk
+#: field:crm.helpdesk,duration:0
+msgid "Duration"
+msgstr "시간"
diff --git a/addons/crm_helpdesk/report/crm_helpdesk_report.py b/addons/crm_helpdesk/report/crm_helpdesk_report.py
index 8d535fa07a0..8b54e30ddd3 100644
--- a/addons/crm_helpdesk/report/crm_helpdesk_report.py
+++ b/addons/crm_helpdesk/report/crm_helpdesk_report.py
@@ -108,6 +108,5 @@ class crm_helpdesk_report(osv.osv):
c.categ_id,c.channel_id,c.planned_cost,c.id
)""")
-crm_helpdesk_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml b/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml
index 05f502656d2..6ce2c60093f 100644
--- a/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml
+++ b/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml
@@ -11,7 +11,7 @@
<tree string="Helpdesk" create="false">
<field name="name" invisible="1"/>
<field name="month" invisible="1"/>
- <field name="section_id" invisible="1"/>
+ <field name="section_id" invisible="1" groups="base.group_multi_salesteams"/>
<field name="user_id" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="partner_id" invisible="1"/>
@@ -60,8 +60,9 @@
<separator/>
<filter string="My Company" icon="terp-go-home" context="{'invisible_section': False}" domain="[('section_id.user_id.company_id','=',uid)]" help="My company"/>
<field name="user_id" string="Salesperson"/>
- <field name="section_id" string="Sales Team" context="{'invisible_section': False}"/>
+ <field name="section_id" string="Sales Team" context="{'invisible_section': False}" groups="base.group_multi_salesteams"/>
<field name="company_id" groups="base.group_multi_company"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<group expand="0" string="Extended Filters..." groups="base.group_no_one">
<field name="priority" string="Priority"/>
<field name="categ_id"/>
diff --git a/addons/crm_helpdesk/test/process/help-desk.yml b/addons/crm_helpdesk/test/process/help-desk.yml
index e2be4a64ca3..95536b1c8dd 100644
--- a/addons/crm_helpdesk/test/process/help-desk.yml
+++ b/addons/crm_helpdesk/test/process/help-desk.yml
@@ -4,8 +4,7 @@
Mail script will be fetched him request from mail server. so I process that mail after read EML file
-
!python {model: mail.thread}: |
- from openerp import addons
- request_file = open(addons.get_module_resource('crm_helpdesk','test', 'customer_question.eml'),'rb')
+ request_file = open(openerp.modules.module.get_module_resource('crm_helpdesk','test', 'customer_question.eml'),'rb')
request_message = request_file.read()
self.message_process(cr, uid, 'crm.helpdesk', request_message)
-
diff --git a/addons/crm_partner_assign/i18n/cs.po b/addons/crm_partner_assign/i18n/cs.po
new file mode 100644
index 00000000000..12c03bf18eb
--- /dev/null
+++ b/addons/crm_partner_assign/i18n/cs.po
@@ -0,0 +1,931 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-30 12:42+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-31 05:27+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,delay_close:0
+msgid "Delay to Close"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,author_id:0
+msgid "Author"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,planned_revenue:0
+msgid "Planned Revenue"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,type:0
+msgid ""
+"Message type: email for email message, notification for system message, "
+"comment for other messages such as user replies"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,nbr:0
+msgid "# of Cases"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: view:crm.partner.report.assign:0
+msgid "Group By..."
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,body:0
+msgid "Automatically sanitized HTML contents"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+msgid "Forward"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Geo Localize"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,starred:0
+msgid "Starred"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+msgid "Body"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,email_from:0
+msgid ""
+"Email address of the sender. This field is set when no matching partner is "
+"found for incoming emails."
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.partner.report.assign:0
+msgid "Date Partnership"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,type:0
+msgid "Lead"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Delay to close"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.forward.to.partner,history_mode:0
+msgid "Whole Story"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,notification_ids:0
+msgid "Notifications"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,date_assign:0
+msgid "Partner Date"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: view:crm.partner.report.assign:0
+#: view:res.partner:0
+msgid "Salesperson"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,priority:0
+msgid "Highest"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,day:0
+msgid "Day"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,message_id:0
+msgid "Message unique identifier"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:res.partner,date_review_next:0
+msgid "Next Partner Review"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.forward.to.partner,history_mode:0
+msgid "Latest email"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead,partner_latitude:0
+#: field:res.partner,partner_latitude:0
+msgid "Geo Latitude"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+msgid "Geo Assignation"
+msgstr ""
+
+#. module: crm_partner_assign
+#: model:ir.model,name:crm_partner_assign.model_crm_lead_forward_to_partner
+msgid "Email composition wizard"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.partner.report.assign,turnover:0
+msgid "Turnover"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,date_closed:0
+msgid "Close Date"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:res.partner,partner_weight:0
+msgid ""
+"Gives the probability to assign a lead to this partner. (0 means no "
+"assignation.)"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Partner Activation"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.forward.to.partner,type:0
+msgid "System notification"
+msgstr ""
+
+#. module: crm_partner_assign
+#: code:addons/crm_partner_assign/wizard/crm_forward_to_partner.py:74
+#, python-format
+msgid "Lead forward"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,probability:0
+msgid "Avg Probability"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Previous"
+msgstr ""
+
+#. module: crm_partner_assign
+#: code:addons/crm_partner_assign/partner_geo_assign.py:36
+#, python-format
+msgid "Network error"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,email_from:0
+msgid "From"
+msgstr ""
+
+#. module: crm_partner_assign
+#: model:ir.actions.act_window,name:crm_partner_assign.res_partner_grade_action
+#: model:ir.ui.menu,name:crm_partner_assign.menu_res_partner_grade_action
+#: view:res.partner.grade:0
+msgid "Partner Grade"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: view:crm.partner.report.assign:0
+msgid "Section"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+msgid "Send"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Next"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,priority:0
+msgid "Priority"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,delay_expected:0
+msgid "Overpassed Deadline"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,type:0
+#: field:crm.lead.report.assign,type:0
+msgid "Type"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.forward.to.partner,type:0
+msgid "Email"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead,partner_assigned_id:0
+msgid "Partner this case has been forwarded/assigned to."
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,priority:0
+msgid "Lowest"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.partner.report.assign:0
+msgid "Date Invoice"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,template_id:0
+msgid "Template"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Assign Date"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Leads Analysis"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,creation_date:0
+msgid "Creation Date"
+msgstr ""
+
+#. module: crm_partner_assign
+#: model:ir.model,name:crm_partner_assign.model_res_partner_activation
+msgid "res.partner.activation"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,parent_id:0
+msgid "Parent Message"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,res_id:0
+msgid "Related Document ID"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,state:0
+msgid "Pending"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+msgid "Partner Assignation"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.report.assign,type:0
+msgid "Type is used to separate Leads and Opportunities"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "July"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.partner.report.assign:0
+msgid "Date Review"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,stage_id:0
+msgid "Stage"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,state:0
+msgid "Status"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,to_read:0
+msgid "To read"
+msgstr ""
+
+#. module: crm_partner_assign
+#: code:addons/crm_partner_assign/wizard/crm_forward_to_partner.py:74
+#, python-format
+msgid "Fwd"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Geo Localization"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: view:crm.partner.report.assign:0
+msgid "Opportunities Assignment Analysis"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+#: view:res.partner:0
+msgid "Cancel"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,history_mode:0
+msgid "Send history"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Close"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "March"
+msgstr ""
+
+#. module: crm_partner_assign
+#: model:ir.actions.act_window,name:crm_partner_assign.action_report_crm_opportunity_assign
+#: model:ir.ui.menu,name:crm_partner_assign.menu_report_crm_opportunities_assign_tree
+msgid "Opp. Assignment Analysis"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.report.assign,delay_close:0
+msgid "Number of Days to close the case"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,notified_partner_ids:0
+msgid ""
+"Partners that have a notification pushing this message in their mailboxes"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.forward.to.partner,type:0
+msgid "Comment"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:res.partner,partner_weight:0
+msgid "Weight"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "April"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,grade_id:0
+#: view:crm.partner.report.assign:0
+#: field:crm.partner.report.assign,grade_id:0
+msgid "Grade"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "December"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,vote_user_ids:0
+msgid "Users that voted for this message"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,month:0
+msgid "Month"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,opening_date:0
+msgid "Opening Date"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,child_ids:0
+msgid "Child Messages"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.partner.report.assign,date_review:0
+#: field:res.partner,date_review:0
+msgid "Latest Partner Review"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,subject:0
+msgid "Subject"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+msgid "or"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,body:0
+msgid "Contents"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,vote_user_ids:0
+msgid "Votes"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "#Opportunities"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,starred:0
+msgid "Current user has a starred notification linked to this message"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.partner.report.assign,date_partnership:0
+#: field:res.partner,date_partnership:0
+msgid "Partnership Date"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+msgid "Team"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,priority:0
+msgid "Low"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: selection:crm.lead.report.assign,state:0
+msgid "Closed"
+msgstr ""
+
+#. module: crm_partner_assign
+#: model:ir.actions.act_window,name:crm_partner_assign.action_crm_send_mass_forward
+msgid "Mass forward to partner"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+#: field:res.partner,opportunity_assigned_ids:0
+msgid "Assigned Opportunities"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead,date_assign:0
+msgid "Assignation Date"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,probability_max:0
+msgid "Max Probability"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "August"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,record_name:0
+msgid "Name get of the related document."
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,priority:0
+msgid "Normal"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Escalate"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "June"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.report.assign,delay_open:0
+msgid "Number of Days to open the case"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,delay_open:0
+msgid "Delay to Open"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,user_id:0
+#: field:crm.partner.report.assign,user_id:0
+msgid "User"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:res.partner.grade,active:0
+msgid "Active"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "November"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Extended Filters..."
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead,partner_longitude:0
+#: field:res.partner,partner_longitude:0
+msgid "Geo Longitude"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.partner.report.assign,opp:0
+msgid "# of Opportunity"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Lead Assign"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "October"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+msgid "Assignation"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "January"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+msgid "Send Mail"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,date:0
+msgid "Date"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Planned Revenues"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Partner Review"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.partner.report.assign,period_id:0
+msgid "Invoice Period"
+msgstr ""
+
+#. module: crm_partner_assign
+#: model:ir.model,name:crm_partner_assign.model_res_partner_grade
+msgid "res.partner.grade"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,message_id:0
+msgid "Message-Id"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+#: field:crm.lead.forward.to.partner,attachment_ids:0
+msgid "Attachments"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,record_name:0
+msgid "Message Record Name"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:res.partner.activation,sequence:0
+#: field:res.partner.grade,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: crm_partner_assign
+#: code:addons/crm_partner_assign/partner_geo_assign.py:37
+#, python-format
+msgid ""
+"Cannot contact geolocation servers. Please make sure that your internet "
+"connection is up and running (%s)."
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "September"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:res.partner.grade,name:0
+msgid "Grade Name"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead,date_assign:0
+msgid "Last date this case was forwarded/assigned to a partner"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,state:0
+#: view:res.partner:0
+msgid "Open"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,subtype_id:0
+msgid "Subtype"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:res.partner,date_localization:0
+msgid "Geo Localization Date"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Current"
+msgstr ""
+
+#. module: crm_partner_assign
+#: model:ir.model,name:crm_partner_assign.model_crm_lead
+msgid "Lead/Opportunity"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,notified_partner_ids:0
+msgid "Notified partners"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+#: model:ir.actions.act_window,name:crm_partner_assign.crm_lead_forward_to_partner_act
+msgid "Forward to Partner"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,section_id:0
+#: field:crm.partner.report.assign,section_id:0
+msgid "Sales Team"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "May"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,probable_revenue:0
+msgid "Probable Revenue"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.partner.report.assign:0
+#: field:crm.partner.report.assign,activation:0
+#: view:res.partner:0
+#: field:res.partner,activation:0
+#: view:res.partner.activation:0
+msgid "Activation"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+#: field:crm.lead,partner_assigned_id:0
+msgid "Assigned Partner"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:res.partner,grade_id:0
+msgid "Partner Level"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,to_read:0
+msgid "Current user has an unread notification linked to this message"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,type:0
+msgid "Opportunity"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,partner_id:0
+msgid "Customer"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "February"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:res.partner.activation,name:0
+msgid "Name"
+msgstr ""
+
+#. module: crm_partner_assign
+#: model:ir.actions.act_window,name:crm_partner_assign.res_partner_activation_act
+#: model:ir.ui.menu,name:crm_partner_assign.res_partner_activation_config_mi
+msgid "Partner Activations"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,country_id:0
+#: view:crm.partner.report.assign:0
+#: field:crm.partner.report.assign,country_id:0
+msgid "Country"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,year:0
+msgid "Year"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Convert to Opportunity"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+msgid "Geo Assign"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Delay to open"
+msgstr ""
+
+#. module: crm_partner_assign
+#: model:ir.actions.act_window,name:crm_partner_assign.action_report_crm_partner_assign
+#: model:ir.ui.menu,name:crm_partner_assign.menu_report_crm_partner_assign_tree
+msgid "Partnership Analysis"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,notification_ids:0
+msgid ""
+"Technical field holding the message notifications. Use notified_partner_ids "
+"to access notified partners."
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.partner.report.assign:0
+msgid "Partner assigned Analysis"
+msgstr ""
+
+#. module: crm_partner_assign
+#: model:ir.model,name:crm_partner_assign.model_crm_lead_report_assign
+msgid "CRM Lead Report"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,composition_mode:0
+msgid "Composition mode"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,model:0
+msgid "Related Document Model"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.forward.to.partner,history_mode:0
+msgid "Case Information"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,author_id:0
+msgid ""
+"Author of the message. If not set, email_from may hold an email address that "
+"did not match any partner."
+msgstr ""
+
+#. module: crm_partner_assign
+#: model:ir.model,name:crm_partner_assign.model_crm_partner_report_assign
+msgid "CRM Partner Report"
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,priority:0
+msgid "High"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,partner_ids:0
+msgid "Additional contacts"
+msgstr ""
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,parent_id:0
+msgid "Initial thread message."
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,create_date:0
+msgid "Create Date"
+msgstr ""
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,filter_id:0
+msgid "Filters"
+msgstr ""
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,partner_assigned_id:0
+#: view:crm.partner.report.assign:0
+#: field:crm.partner.report.assign,partner_id:0
+#: model:ir.model,name:crm_partner_assign.model_res_partner
+msgid "Partner"
+msgstr ""
diff --git a/addons/crm_partner_assign/i18n/ko.po b/addons/crm_partner_assign/i18n/ko.po
new file mode 100644
index 00000000000..f5b394c4634
--- /dev/null
+++ b/addons/crm_partner_assign/i18n/ko.po
@@ -0,0 +1,932 @@
+# Korean translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-29 01:57+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Korean <ko@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-30 05:27+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,delay_close:0
+msgid "Delay to Close"
+msgstr "마감까지의 지연"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,author_id:0
+msgid "Author"
+msgstr "작성자"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,planned_revenue:0
+msgid "Planned Revenue"
+msgstr "계획된 수익"
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,type:0
+msgid ""
+"Message type: email for email message, notification for system message, "
+"comment for other messages such as user replies"
+msgstr "메시지 유형: 이메일 메시지를 위한 이메일, 시스템 메시지를 위한 알림, 사용자 댓글과 같은 기타 메시지에 대한 의견"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,nbr:0
+msgid "# of Cases"
+msgstr "사례 #"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: view:crm.partner.report.assign:0
+msgid "Group By..."
+msgstr "분류 기준..."
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,body:0
+msgid "Automatically sanitized HTML contents"
+msgstr "HTML 내용 중 불건전한 내용을 자동으로 제거함"
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+msgid "Forward"
+msgstr "전달"
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Geo Localize"
+msgstr "지리적 지역화"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,starred:0
+msgid "Starred"
+msgstr "별표 추가됨"
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+msgid "Body"
+msgstr "본문"
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,email_from:0
+msgid ""
+"Email address of the sender. This field is set when no matching partner is "
+"found for incoming emails."
+msgstr "보내는 사람의 이메일 주소. 이 필드는 수신 메일에서 일치하는 협력업체를 찾을 수 없을 때 설정됩니다."
+
+#. module: crm_partner_assign
+#: view:crm.partner.report.assign:0
+msgid "Date Partnership"
+msgstr "협력관계 합의일"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,type:0
+msgid "Lead"
+msgstr "리드"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Delay to close"
+msgstr "마감까지의 지연"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.forward.to.partner,history_mode:0
+msgid "Whole Story"
+msgstr "전체 이야기"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,company_id:0
+msgid "Company"
+msgstr "업체"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,notification_ids:0
+msgid "Notifications"
+msgstr "알림"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,date_assign:0
+msgid "Partner Date"
+msgstr "협력업체 날짜"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: view:crm.partner.report.assign:0
+#: view:res.partner:0
+msgid "Salesperson"
+msgstr "영업사원"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,priority:0
+msgid "Highest"
+msgstr "가장 높음"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,day:0
+msgid "Day"
+msgstr "일"
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,message_id:0
+msgid "Message unique identifier"
+msgstr "메시지 유일 식별자"
+
+#. module: crm_partner_assign
+#: field:res.partner,date_review_next:0
+msgid "Next Partner Review"
+msgstr "다음 협력업체 검토"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.forward.to.partner,history_mode:0
+msgid "Latest email"
+msgstr "최근 이메일"
+
+#. module: crm_partner_assign
+#: field:crm.lead,partner_latitude:0
+#: field:res.partner,partner_latitude:0
+msgid "Geo Latitude"
+msgstr "지리적 위도"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,state:0
+msgid "Cancelled"
+msgstr "취소됨"
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+msgid "Geo Assignation"
+msgstr "지리적 할당"
+
+#. module: crm_partner_assign
+#: model:ir.model,name:crm_partner_assign.model_crm_lead_forward_to_partner
+msgid "Email composition wizard"
+msgstr "이메일 작성 마법사"
+
+#. module: crm_partner_assign
+#: field:crm.partner.report.assign,turnover:0
+msgid "Turnover"
+msgstr "회전율"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,date_closed:0
+msgid "Close Date"
+msgstr "마감일"
+
+#. module: crm_partner_assign
+#: help:res.partner,partner_weight:0
+msgid ""
+"Gives the probability to assign a lead to this partner. (0 means no "
+"assignation.)"
+msgstr "이 협력업체에 리드를 할당할 확률을 제공함. (0은 할당 없음을 의미,)"
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Partner Activation"
+msgstr "협력업체 활성화"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.forward.to.partner,type:0
+msgid "System notification"
+msgstr "시스템 알림"
+
+#. module: crm_partner_assign
+#: code:addons/crm_partner_assign/wizard/crm_forward_to_partner.py:74
+#, python-format
+msgid "Lead forward"
+msgstr "리드 전달"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,probability:0
+msgid "Avg Probability"
+msgstr "평균 확률"
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Previous"
+msgstr "이전"
+
+#. module: crm_partner_assign
+#: code:addons/crm_partner_assign/partner_geo_assign.py:36
+#, python-format
+msgid "Network error"
+msgstr "네트워크 오류"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,email_from:0
+msgid "From"
+msgstr "보낸 사람"
+
+#. module: crm_partner_assign
+#: model:ir.actions.act_window,name:crm_partner_assign.res_partner_grade_action
+#: model:ir.ui.menu,name:crm_partner_assign.menu_res_partner_grade_action
+#: view:res.partner.grade:0
+msgid "Partner Grade"
+msgstr "협력업체 등급"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: view:crm.partner.report.assign:0
+msgid "Section"
+msgstr "부서"
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+msgid "Send"
+msgstr "보내기"
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Next"
+msgstr "다음"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,priority:0
+msgid "Priority"
+msgstr "우선 순위"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,delay_expected:0
+msgid "Overpassed Deadline"
+msgstr "과거 기한"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,type:0
+#: field:crm.lead.report.assign,type:0
+msgid "Type"
+msgstr "유형"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.forward.to.partner,type:0
+msgid "Email"
+msgstr "이메일"
+
+#. module: crm_partner_assign
+#: help:crm.lead,partner_assigned_id:0
+msgid "Partner this case has been forwarded/assigned to."
+msgstr "이 사례가 전달/할당된 협력업체"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,priority:0
+msgid "Lowest"
+msgstr "가장 낮음"
+
+#. module: crm_partner_assign
+#: view:crm.partner.report.assign:0
+msgid "Date Invoice"
+msgstr "송장 발행일"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,template_id:0
+msgid "Template"
+msgstr "서식"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Assign Date"
+msgstr "날짜 할당"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Leads Analysis"
+msgstr "리드 분석"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,creation_date:0
+msgid "Creation Date"
+msgstr "생성일"
+
+#. module: crm_partner_assign
+#: model:ir.model,name:crm_partner_assign.model_res_partner_activation
+msgid "res.partner.activation"
+msgstr "res.partner.activation"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,parent_id:0
+msgid "Parent Message"
+msgstr "상위 메시지"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,res_id:0
+msgid "Related Document ID"
+msgstr "관련 문서 ID"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,state:0
+msgid "Pending"
+msgstr "보류 중"
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+msgid "Partner Assignation"
+msgstr "협력업체 할당"
+
+#. module: crm_partner_assign
+#: help:crm.lead.report.assign,type:0
+msgid "Type is used to separate Leads and Opportunities"
+msgstr "유형은 리드와 기회를 구분하기 위해 사용됩니다"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "July"
+msgstr "7월"
+
+#. module: crm_partner_assign
+#: view:crm.partner.report.assign:0
+msgid "Date Review"
+msgstr "검토 날짜"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,stage_id:0
+msgid "Stage"
+msgstr "단계"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,state:0
+msgid "Status"
+msgstr "상태"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,to_read:0
+msgid "To read"
+msgstr "읽기 대상"
+
+#. module: crm_partner_assign
+#: code:addons/crm_partner_assign/wizard/crm_forward_to_partner.py:74
+#, python-format
+msgid "Fwd"
+msgstr "전달"
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Geo Localization"
+msgstr "지리적 지역화"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: view:crm.partner.report.assign:0
+msgid "Opportunities Assignment Analysis"
+msgstr "기회 할당 분석"
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+#: view:res.partner:0
+msgid "Cancel"
+msgstr "취소"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,history_mode:0
+msgid "Send history"
+msgstr "전송 기록"
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Close"
+msgstr "닫기"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "March"
+msgstr "3월"
+
+#. module: crm_partner_assign
+#: model:ir.actions.act_window,name:crm_partner_assign.action_report_crm_opportunity_assign
+#: model:ir.ui.menu,name:crm_partner_assign.menu_report_crm_opportunities_assign_tree
+msgid "Opp. Assignment Analysis"
+msgstr "Opp. Assignment Analysis"
+
+#. module: crm_partner_assign
+#: help:crm.lead.report.assign,delay_close:0
+msgid "Number of Days to close the case"
+msgstr "사례를 마감하기까지의 잔여일수"
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,notified_partner_ids:0
+msgid ""
+"Partners that have a notification pushing this message in their mailboxes"
+msgstr "편지함에 이 메시지를 푸시하는 알림이 있는 협력업체"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.forward.to.partner,type:0
+msgid "Comment"
+msgstr "의견"
+
+#. module: crm_partner_assign
+#: field:res.partner,partner_weight:0
+msgid "Weight"
+msgstr "가중"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "April"
+msgstr "4월"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,grade_id:0
+#: view:crm.partner.report.assign:0
+#: field:crm.partner.report.assign,grade_id:0
+msgid "Grade"
+msgstr "등급"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "December"
+msgstr "12월"
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,vote_user_ids:0
+msgid "Users that voted for this message"
+msgstr "이 메시지에 투표한 사용자"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,month:0
+msgid "Month"
+msgstr "월"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,opening_date:0
+msgid "Opening Date"
+msgstr "개시일"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,child_ids:0
+msgid "Child Messages"
+msgstr "하위 메시지"
+
+#. module: crm_partner_assign
+#: field:crm.partner.report.assign,date_review:0
+#: field:res.partner,date_review:0
+msgid "Latest Partner Review"
+msgstr "최근 협력업체 검토"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,subject:0
+msgid "Subject"
+msgstr "제목"
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+msgid "or"
+msgstr "또는"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,body:0
+msgid "Contents"
+msgstr "내용"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,vote_user_ids:0
+msgid "Votes"
+msgstr "투표수"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "#Opportunities"
+msgstr "기회#"
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,starred:0
+msgid "Current user has a starred notification linked to this message"
+msgstr "현재 사용자에게 이 메시지와 연결된 별표 표시된 알림이 있습니다."
+
+#. module: crm_partner_assign
+#: field:crm.partner.report.assign,date_partnership:0
+#: field:res.partner,date_partnership:0
+msgid "Partnership Date"
+msgstr "협력관계 협약일"
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+msgid "Team"
+msgstr "팀"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,state:0
+msgid "Draft"
+msgstr "초안"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,priority:0
+msgid "Low"
+msgstr "낮음"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: selection:crm.lead.report.assign,state:0
+msgid "Closed"
+msgstr "마감됨"
+
+#. module: crm_partner_assign
+#: model:ir.actions.act_window,name:crm_partner_assign.action_crm_send_mass_forward
+msgid "Mass forward to partner"
+msgstr "협력업체에게 대량 전달"
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+#: field:res.partner,opportunity_assigned_ids:0
+msgid "Assigned Opportunities"
+msgstr "할당된 기회"
+
+#. module: crm_partner_assign
+#: field:crm.lead,date_assign:0
+msgid "Assignation Date"
+msgstr "할당일"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,probability_max:0
+msgid "Max Probability"
+msgstr "최대 확률"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "August"
+msgstr "8월"
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,record_name:0
+msgid "Name get of the related document."
+msgstr ""
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,priority:0
+msgid "Normal"
+msgstr "보통"
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Escalate"
+msgstr "승급"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "June"
+msgstr "6월"
+
+#. module: crm_partner_assign
+#: help:crm.lead.report.assign,delay_open:0
+msgid "Number of Days to open the case"
+msgstr "사례 개시까지의 소요일수"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,delay_open:0
+msgid "Delay to Open"
+msgstr "개시까지의 지연"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,user_id:0
+#: field:crm.partner.report.assign,user_id:0
+msgid "User"
+msgstr "사용자"
+
+#. module: crm_partner_assign
+#: field:res.partner.grade,active:0
+msgid "Active"
+msgstr "활성"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "November"
+msgstr "11월"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Extended Filters..."
+msgstr "확장 필터..."
+
+#. module: crm_partner_assign
+#: field:crm.lead,partner_longitude:0
+#: field:res.partner,partner_longitude:0
+msgid "Geo Longitude"
+msgstr "지리적 경도"
+
+#. module: crm_partner_assign
+#: field:crm.partner.report.assign,opp:0
+msgid "# of Opportunity"
+msgstr "기회 #"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Lead Assign"
+msgstr "리드 할당"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "October"
+msgstr "10월"
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+msgid "Assignation"
+msgstr "할당"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "January"
+msgstr "1월"
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+msgid "Send Mail"
+msgstr "메일 보내기"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,date:0
+msgid "Date"
+msgstr "날짜"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Planned Revenues"
+msgstr "계획된 수익"
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Partner Review"
+msgstr "협력업체 검토"
+
+#. module: crm_partner_assign
+#: field:crm.partner.report.assign,period_id:0
+msgid "Invoice Period"
+msgstr "송장 발행 주기"
+
+#. module: crm_partner_assign
+#: model:ir.model,name:crm_partner_assign.model_res_partner_grade
+msgid "res.partner.grade"
+msgstr "res.partner.grade"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,message_id:0
+msgid "Message-Id"
+msgstr "Message-Id"
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+#: field:crm.lead.forward.to.partner,attachment_ids:0
+msgid "Attachments"
+msgstr "첨부 파일"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,record_name:0
+msgid "Message Record Name"
+msgstr "메시지 기록명"
+
+#. module: crm_partner_assign
+#: field:res.partner.activation,sequence:0
+#: field:res.partner.grade,sequence:0
+msgid "Sequence"
+msgstr "순서"
+
+#. module: crm_partner_assign
+#: code:addons/crm_partner_assign/partner_geo_assign.py:37
+#, python-format
+msgid ""
+"Cannot contact geolocation servers. Please make sure that your internet "
+"connection is up and running (%s)."
+msgstr "지리위치서버를 연결할 수 없음. 인터넷 연결이 존재하고 실행 중인지 확인하십시오 (%s)."
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "September"
+msgstr "9월"
+
+#. module: crm_partner_assign
+#: field:res.partner.grade,name:0
+msgid "Grade Name"
+msgstr "등급명"
+
+#. module: crm_partner_assign
+#: help:crm.lead,date_assign:0
+msgid "Last date this case was forwarded/assigned to a partner"
+msgstr "이 사례가 협력업체로 전달/할당된 최근 날짜"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,state:0
+#: view:res.partner:0
+msgid "Open"
+msgstr "열기"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,subtype_id:0
+msgid "Subtype"
+msgstr "하위형식"
+
+#. module: crm_partner_assign
+#: field:res.partner,date_localization:0
+msgid "Geo Localization Date"
+msgstr "지리위치일"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Current"
+msgstr "현재"
+
+#. module: crm_partner_assign
+#: model:ir.model,name:crm_partner_assign.model_crm_lead
+msgid "Lead/Opportunity"
+msgstr "리드/기회"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,notified_partner_ids:0
+msgid "Notified partners"
+msgstr "통보한 협력업체"
+
+#. module: crm_partner_assign
+#: view:crm.lead.forward.to.partner:0
+#: model:ir.actions.act_window,name:crm_partner_assign.crm_lead_forward_to_partner_act
+msgid "Forward to Partner"
+msgstr "협력업체에 전달"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,section_id:0
+#: field:crm.partner.report.assign,section_id:0
+msgid "Sales Team"
+msgstr "영업팀"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "May"
+msgstr "5월"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,probable_revenue:0
+msgid "Probable Revenue"
+msgstr "예상 수익"
+
+#. module: crm_partner_assign
+#: view:crm.partner.report.assign:0
+#: field:crm.partner.report.assign,activation:0
+#: view:res.partner:0
+#: field:res.partner,activation:0
+#: view:res.partner.activation:0
+msgid "Activation"
+msgstr "활성화"
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+#: field:crm.lead,partner_assigned_id:0
+msgid "Assigned Partner"
+msgstr "할당된 협력업체"
+
+#. module: crm_partner_assign
+#: field:res.partner,grade_id:0
+msgid "Partner Level"
+msgstr "협력업체 수준"
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,to_read:0
+msgid "Current user has an unread notification linked to this message"
+msgstr "현재 사용자에게 이 메시지와 연결된 읽지 않은 알림이 있습니다."
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,type:0
+msgid "Opportunity"
+msgstr "기회"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,partner_id:0
+msgid "Customer"
+msgstr "고객"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,month:0
+msgid "February"
+msgstr "2월"
+
+#. module: crm_partner_assign
+#: field:res.partner.activation,name:0
+msgid "Name"
+msgstr "이름"
+
+#. module: crm_partner_assign
+#: model:ir.actions.act_window,name:crm_partner_assign.res_partner_activation_act
+#: model:ir.ui.menu,name:crm_partner_assign.res_partner_activation_config_mi
+msgid "Partner Activations"
+msgstr "협력업체 활성화"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,country_id:0
+#: view:crm.partner.report.assign:0
+#: field:crm.partner.report.assign,country_id:0
+msgid "Country"
+msgstr "국가"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,year:0
+msgid "Year"
+msgstr "연도"
+
+#. module: crm_partner_assign
+#: view:res.partner:0
+msgid "Convert to Opportunity"
+msgstr "기회로 전환"
+
+#. module: crm_partner_assign
+#: view:crm.lead:0
+msgid "Geo Assign"
+msgstr "지역적 할당"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+msgid "Delay to open"
+msgstr "개시까지의 지연"
+
+#. module: crm_partner_assign
+#: model:ir.actions.act_window,name:crm_partner_assign.action_report_crm_partner_assign
+#: model:ir.ui.menu,name:crm_partner_assign.menu_report_crm_partner_assign_tree
+msgid "Partnership Analysis"
+msgstr "협력관계 분석"
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,notification_ids:0
+msgid ""
+"Technical field holding the message notifications. Use notified_partner_ids "
+"to access notified partners."
+msgstr "메시지 알림을 포함한 기술적 필드. notified_partner_id를 이용하여 통보된 협력업체에 접근하십시오."
+
+#. module: crm_partner_assign
+#: view:crm.partner.report.assign:0
+msgid "Partner assigned Analysis"
+msgstr "할당된 협력업체 분석"
+
+#. module: crm_partner_assign
+#: model:ir.model,name:crm_partner_assign.model_crm_lead_report_assign
+msgid "CRM Lead Report"
+msgstr "CRM 리드 보고서"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,composition_mode:0
+msgid "Composition mode"
+msgstr "작성 모드"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,model:0
+msgid "Related Document Model"
+msgstr "관련된 문서 모델"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.forward.to.partner,history_mode:0
+msgid "Case Information"
+msgstr "사례 정보"
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,author_id:0
+msgid ""
+"Author of the message. If not set, email_from may hold an email address that "
+"did not match any partner."
+msgstr ""
+"메시지의 작성자. 설정되지 않았을 경우, email_from에 모든 협력업체와 일치하지 않은 이메일 주소를 포함할 수 있습니다."
+
+#. module: crm_partner_assign
+#: model:ir.model,name:crm_partner_assign.model_crm_partner_report_assign
+msgid "CRM Partner Report"
+msgstr "CRM 협력업체 보고서"
+
+#. module: crm_partner_assign
+#: selection:crm.lead.report.assign,priority:0
+msgid "High"
+msgstr "높음"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,partner_ids:0
+msgid "Additional contacts"
+msgstr "추가적인 연락처"
+
+#. module: crm_partner_assign
+#: help:crm.lead.forward.to.partner,parent_id:0
+msgid "Initial thread message."
+msgstr "초기 스레드 메시지"
+
+#. module: crm_partner_assign
+#: field:crm.lead.report.assign,create_date:0
+msgid "Create Date"
+msgstr "생성일"
+
+#. module: crm_partner_assign
+#: field:crm.lead.forward.to.partner,filter_id:0
+msgid "Filters"
+msgstr "필터"
+
+#. module: crm_partner_assign
+#: view:crm.lead.report.assign:0
+#: field:crm.lead.report.assign,partner_assigned_id:0
+#: view:crm.partner.report.assign:0
+#: field:crm.partner.report.assign,partner_id:0
+#: model:ir.model,name:crm_partner_assign.model_res_partner
+msgid "Partner"
+msgstr "협력업체"
diff --git a/addons/crm_partner_assign/report/crm_lead_report.py b/addons/crm_partner_assign/report/crm_lead_report.py
index 2c208131b3a..676a8536b74 100644
--- a/addons/crm_partner_assign/report/crm_lead_report.py
+++ b/addons/crm_partner_assign/report/crm_lead_report.py
@@ -118,6 +118,5 @@ class crm_lead_report_assign(osv.osv):
left join res_partner p on (c.partner_assigned_id=p.id)
)""")
-crm_lead_report_assign()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_partner_assign/report/crm_lead_report_view.xml b/addons/crm_partner_assign/report/crm_lead_report_view.xml
index ee9266a0235..fbc46302fd7 100644
--- a/addons/crm_partner_assign/report/crm_lead_report_view.xml
+++ b/addons/crm_partner_assign/report/crm_lead_report_view.xml
@@ -10,7 +10,7 @@
<search string="Leads Analysis">
<filter icon="terp-check" string="Current" domain="[('state','in',('draft','open'))]"/>
<filter icon="terp-dialog-close" string="Closed" domain="[('state','=','done')]"/>
- <field name="section_id" context="{'invisible_section': False}"/>
+ <field name="section_id" context="{'invisible_section': False}" groups="base.group_multi_salesteams"/>
<field name="grade_id"/>
<field name="user_id"/>
<field name="partner_assigned_id"/>
@@ -69,7 +69,7 @@
<field name="year" invisible="1"/>
<field name="month" invisible="1"/>
<field name="date_assign" invisible="1"/>
- <field name="section_id" invisible="1"/>
+ <field name="section_id" invisible="1" groups="base.group_multi_salesteams"/>
<field name="user_id" invisible="1"/>
<field name="grade_id" invisible="1" widget="selection"/>
<field name="partner_assigned_id" invisible="1"/>
diff --git a/addons/crm_partner_assign/report/crm_partner_report.py b/addons/crm_partner_assign/report/crm_partner_report.py
index 4611fdd06e4..6f07a8ce03a 100644
--- a/addons/crm_partner_assign/report/crm_partner_report.py
+++ b/addons/crm_partner_assign/report/crm_partner_report.py
@@ -67,6 +67,5 @@ class crm_partner_report_assign(osv.osv):
on (i.partner_id=p.id and i.type in ('out_invoice','out_refund') and i.state in ('open','paid'))
)""")
-crm_partner_report_assign()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_partner_assign/report/crm_partner_report_view.xml b/addons/crm_partner_assign/report/crm_partner_report_view.xml
index eb2c86874c4..4e7e13afb15 100644
--- a/addons/crm_partner_assign/report/crm_partner_report_view.xml
+++ b/addons/crm_partner_assign/report/crm_partner_report_view.xml
@@ -8,7 +8,7 @@
<field name="model">crm.partner.report.assign</field>
<field name="arch" type="xml">
<search string="Partner assigned Analysis">
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
<field name="user_id"/>
<field name="grade_id"/>
<field name="activation"/>
@@ -49,7 +49,7 @@
<field name="date_review" invisible="1"/>
<field name="date_partnership" invisible="1"/>
<field name="period_id" invisible="1"/>
- <field name="section_id" invisible="1"/>
+ <field name="section_id" invisible="1" groups="base.group_multi_salesteams"/>
<field name="user_id" invisible="1"/>
<field name="opp"/>
<field name="turnover"/>
diff --git a/addons/crm_partner_assign/res_partner_view.xml b/addons/crm_partner_assign/res_partner_view.xml
index 433a290ae81..9e70835a3f1 100644
--- a/addons/crm_partner_assign/res_partner_view.xml
+++ b/addons/crm_partner_assign/res_partner_view.xml
@@ -140,30 +140,31 @@
<field name="type"/>
<field name="stage_id"/>
<button name="stage_previous" string="Previous"
- states="open,pending" type="object" icon="gtk-go-back" />
+ states="open,pending" type="object" icon="gtk-go-back" />
<button name="stage_next" string="Next"
- states="open,pending" type="object"
- icon="gtk-go-forward" />
+ states="open,pending" type="object"
+ icon="gtk-go-forward" />
<field name="section_id"
- invisible="context.get('invisible_section', True)" />
+ invisible="context.get('invisible_section', True)"
+ groups="base.group_multi_salesteams"/>
<field name="user_id" />
<field name="state" />
<button name="case_cancel" string="Cancel"
- states="draft,open,pending" type="object"
- icon="gtk-cancel" />
+ states="draft,open,pending" type="object"
+ icon="gtk-cancel" />
<button name="case_open" string="Open"
- states="draft,pending" type="object"
- icon="gtk-go-forward" />
+ states="draft,pending" type="object"
+ icon="gtk-go-forward" />
<button name="case_close" string="Close"
- states="open,draft,pending" type="object"
- icon="gtk-close" />
+ states="open,draft,pending" type="object"
+ icon="gtk-close" />
<button string="Convert to Opportunity"
- name="convert_opportunity"
- states="draft,open,pending" icon="gtk-index"
- type="object" attrs="{'invisible':[('type','=','opportunity')]}" />
+ name="convert_opportunity"
+ states="draft,open,pending" icon="gtk-index"
+ type="object" attrs="{'invisible':[('type','=','opportunity')]}" />
<button name="case_escalate" string="Escalate"
- states="open,draft,pending" type="object"
- icon="gtk-go-up" />
+ states="open,draft,pending" type="object"
+ icon="gtk-go-up" />
</tree>
</field>
</page>
diff --git a/addons/crm_partner_assign/wizard/crm_forward_to_partner.py b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py
index 81cc09d9717..91d462de015 100644
--- a/addons/crm_partner_assign/wizard/crm_forward_to_partner.py
+++ b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py
@@ -86,7 +86,7 @@ class crm_lead_forward_to_partner(osv.TransientModel):
if context is None:
context = {}
if model and model == 'crm.lead' and res_id:
- lead = self.pool.get(model).browse(cr, uid, res_id, context=context)
+ lead = self.pool[model].browse(cr, uid, res_id, context=context)
context['history_mode'] = history_mode
body = self.get_record_data(cr, uid, 'crm.lead', res_id, context=context)['body']
return {'value': {'body': body}}
@@ -110,7 +110,7 @@ class crm_lead_forward_to_partner(osv.TransientModel):
if wizard.model not in ('crm.lead'):
return res
- lead = self.pool.get(wizard.model)
+ lead = self.pool[wizard.model]
lead_ids = wizard.res_id and [wizard.res_id] or []
if wizard.composition_mode == 'mass_mail':
diff --git a/addons/crm_profiling/crm_profiling.py b/addons/crm_profiling/crm_profiling.py
index 8ea08601c9a..7ae9d146bdd 100644
--- a/addons/crm_profiling/crm_profiling.py
+++ b/addons/crm_profiling/crm_profiling.py
@@ -150,7 +150,6 @@ class question(osv.osv):
'answers_ids': fields.one2many("crm_profiling.answer","question_id","Avalaible Answers",),
}
-question()
class questionnaire(osv.osv):
@@ -166,7 +165,6 @@ class questionnaire(osv.osv):
'questionnaire', 'question', "Questions"),
}
-questionnaire()
class answer(osv.osv):
@@ -176,7 +174,6 @@ class answer(osv.osv):
"name": fields.char("Answer",size=128, required=True),
"question_id": fields.many2one('crm_profiling.question',"Question"),
}
-answer()
class partner(osv.osv):
@@ -214,7 +211,6 @@ class partner(osv.osv):
vals['category_id']=[[6, 0, _recompute_categ(self, cr, uid, ids[0], vals['answers_ids'][0][2])]]
return super(partner, self).write(cr, uid, ids, vals, context=context)
-partner()
class crm_segmentation(osv.osv):
@@ -289,7 +285,6 @@ class crm_segmentation(osv.osv):
self.write(cr, uid, [id], {'state':'not running', 'partner_id':0})
return True
-crm_segmentation()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_profiling/wizard/open_questionnaire.py b/addons/crm_profiling/wizard/open_questionnaire.py
index cb7ad220e3f..979e9809d09 100644
--- a/addons/crm_profiling/wizard/open_questionnaire.py
+++ b/addons/crm_profiling/wizard/open_questionnaire.py
@@ -31,7 +31,6 @@ class open_questionnaire_line(osv.osv_memory):
'wizard_id': fields.many2one('open.questionnaire', 'Questionnaire'),
}
-open_questionnaire_line()
class open_questionnaire(osv.osv_memory):
_name = 'open.questionnaire'
@@ -61,7 +60,7 @@ class open_questionnaire(osv.osv_memory):
for d in data.question_ans_ids:
if d.answer_id:
answers.append(d.answer_id.id)
- self.pool.get(model)._questionnaire_compute(cr, uid, answers, context=context)
+ self.pool[model]._questionnaire_compute(cr, uid, answers, context=context)
return {'type': 'ir.actions.act_window_close'}
@@ -84,6 +83,5 @@ class open_questionnaire(osv.osv_memory):
'context': context
}
-open_questionnaire()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_todo/crm_todo_view.xml b/addons/crm_todo/crm_todo_view.xml
index 0b3de338808..851c2abfba4 100644
--- a/addons/crm_todo/crm_todo_view.xml
+++ b/addons/crm_todo/crm_todo_view.xml
@@ -52,11 +52,10 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,gantt,graph,kanban</field>
</record>
- <menuitem
- id="menu_crm_todo"
- parent="base.menu_sales"
- action="crm_todo_action"
- sequence="6"/>
+ <menuitem id="menu_crm_todo"
+ parent="base.menu_sales"
+ action="crm_todo_action"
+ sequence="7"/>
</data>
diff --git a/addons/crm_todo/i18n/cs.po b/addons/crm_todo/i18n/cs.po
new file mode 100644
index 00000000000..fea912005b8
--- /dev/null
+++ b/addons/crm_todo/i18n/cs.po
@@ -0,0 +1,85 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-30 12:42+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-31 05:27+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: crm_todo
+#: model:ir.model,name:crm_todo.model_project_task
+msgid "Task"
+msgstr ""
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "Timebox"
+msgstr ""
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "Lead"
+msgstr ""
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "For cancelling the task"
+msgstr ""
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "Next"
+msgstr ""
+
+#. module: crm_todo
+#: model:ir.actions.act_window,name:crm_todo.crm_todo_action
+#: model:ir.ui.menu,name:crm_todo.menu_crm_todo
+msgid "My Tasks"
+msgstr ""
+
+#. module: crm_todo
+#: view:crm.lead:0
+#: field:crm.lead,task_ids:0
+msgid "Tasks"
+msgstr ""
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "Done"
+msgstr ""
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "Cancel"
+msgstr ""
+
+#. module: crm_todo
+#: model:ir.model,name:crm_todo.model_crm_lead
+msgid "Lead/Opportunity"
+msgstr ""
+
+#. module: crm_todo
+#: field:project.task,lead_id:0
+msgid "Lead / Opportunity"
+msgstr ""
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "For changing to done state"
+msgstr ""
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "Previous"
+msgstr ""
diff --git a/addons/crm_todo/i18n/ko.po b/addons/crm_todo/i18n/ko.po
new file mode 100644
index 00000000000..f5924f76b40
--- /dev/null
+++ b/addons/crm_todo/i18n/ko.po
@@ -0,0 +1,85 @@
+# Korean translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-29 00:26+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Korean <ko@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-30 05:27+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: crm_todo
+#: model:ir.model,name:crm_todo.model_project_task
+msgid "Task"
+msgstr "과제"
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "Timebox"
+msgstr "기한"
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "Lead"
+msgstr "리드"
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "For cancelling the task"
+msgstr "과제를 취소하기 위해 사용됨"
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "Next"
+msgstr "다음"
+
+#. module: crm_todo
+#: model:ir.actions.act_window,name:crm_todo.crm_todo_action
+#: model:ir.ui.menu,name:crm_todo.menu_crm_todo
+msgid "My Tasks"
+msgstr "내 과제"
+
+#. module: crm_todo
+#: view:crm.lead:0
+#: field:crm.lead,task_ids:0
+msgid "Tasks"
+msgstr "과제"
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "Done"
+msgstr "완료"
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "Cancel"
+msgstr "취소"
+
+#. module: crm_todo
+#: model:ir.model,name:crm_todo.model_crm_lead
+msgid "Lead/Opportunity"
+msgstr "리드/기회"
+
+#. module: crm_todo
+#: field:project.task,lead_id:0
+msgid "Lead / Opportunity"
+msgstr "리드 / 기회"
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "For changing to done state"
+msgstr "완료 상태로 변경하기 위해 사용됨"
+
+#. module: crm_todo
+#: view:crm.lead:0
+msgid "Previous"
+msgstr "이전으로"
diff --git a/addons/decimal_precision/decimal_precision.py b/addons/decimal_precision/decimal_precision.py
index ab0979291bd..b237f053ebb 100644
--- a/addons/decimal_precision/decimal_precision.py
+++ b/addons/decimal_precision/decimal_precision.py
@@ -63,7 +63,6 @@ class decimal_precision(osv.osv):
col.digits_change(cr)
return res
-decimal_precision()
def get_precision(application):
def change_digit(cr):
diff --git a/addons/delivery/delivery.py b/addons/delivery/delivery.py
index 15a17b36775..76750212edd 100644
--- a/addons/delivery/delivery.py
+++ b/addons/delivery/delivery.py
@@ -166,7 +166,6 @@ class delivery_carrier(osv.osv):
self.create_grid_lines(cr, uid, [res_id], vals, context=context)
return res_id
-delivery_carrier()
class delivery_grid(osv.osv):
_name = "delivery.grid"
@@ -223,7 +222,6 @@ class delivery_grid(osv.osv):
return price
-delivery_grid()
class delivery_grid_line(osv.osv):
_name = "delivery.grid.line"
@@ -249,6 +247,5 @@ class delivery_grid_line(osv.osv):
}
_order = 'list_price'
-delivery_grid_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/delivery/partner.py b/addons/delivery/partner.py
index e4b0ba204ac..477315dfc9b 100644
--- a/addons/delivery/partner.py
+++ b/addons/delivery/partner.py
@@ -32,7 +32,6 @@ class res_partner(osv.osv):
view_load=True,
help="This delivery method will be used when invoicing from picking."),
}
-res_partner()
diff --git a/addons/delivery/sale.py b/addons/delivery/sale.py
index 98229f13c36..86a518ebca9 100644
--- a/addons/delivery/sale.py
+++ b/addons/delivery/sale.py
@@ -76,7 +76,6 @@ class sale_order(osv.osv):
return self.write(cr, uid, ids, {'carrier_id': False}, context=context)
#return {'type': 'ir.actions.act_window_close'} action reload?
-sale_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/delivery/stock.py b/addons/delivery/stock.py
index 95b17a8ba68..95e87eb45ab 100644
--- a/addons/delivery/stock.py
+++ b/addons/delivery/stock.py
@@ -140,7 +140,6 @@ class stock_picking(osv.osv):
'weight_uom_id': lambda self,cr,uid,c: self._get_default_uom(cr,uid,c)
}
-stock_picking()
class stock_move(osv.osv):
_inherit = 'stock.move'
@@ -184,7 +183,6 @@ class stock_move(osv.osv):
_defaults = {
'weight_uom_id': lambda self,cr,uid,c: self._get_default_uom(cr,uid,c)
}
-stock_move()
# Redefinition of the new fields in order to update the model stock.picking.out in the orm
# FIXME: this is a temporary workaround because of a framework bug (ref: lp996816). It should be removed as soon as
@@ -215,7 +213,6 @@ class stock_picking_out(osv.osv):
'carrier_tracking_ref': fields.char('Carrier Tracking Ref', size=32),
'number_of_packages': fields.integer('Number of Packages'),
}
-stock_picking_out()
class stock_picking_in(osv.osv):
_inherit = 'stock.picking.in'
@@ -238,7 +235,6 @@ class stock_picking_in(osv.osv):
'stock.move': (_get_picking_line, ['product_id','product_qty','product_uom','product_uos_qty'], 20),
}),
}
-stock_picking_in()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/delivery/test/delivery_cost.yml b/addons/delivery/test/delivery_cost.yml
index 8fc7a8b7afe..34ecb165ee1 100644
--- a/addons/delivery/test/delivery_cost.yml
+++ b/addons/delivery/test/delivery_cost.yml
@@ -32,11 +32,12 @@
-
!python {model: stock.picking}: |
import os
- from openerp import netsvc, tools
+ import openerp.report
+ from openerp import tools
sale = self.pool.get('sale.order')
sale_order = sale.browse(cr, uid, ref("sale.sale_order_6"))
ship_ids = [x.id for x in sale_order.picking_ids]
- (data, format) = netsvc.LocalService('report.sale.shipping').create(cr, uid, ship_ids, {}, {})
+ data, format = openerp.report.render_report(cr, uid, ship_ids, 'sale.shipping', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'delivery-shipping'+format), 'wb+').write(data)
-
diff --git a/addons/document/document.py b/addons/document/document.py
index 9b1fdc1d66b..54f12e204fe 100644
--- a/addons/document/document.py
+++ b/addons/document/document.py
@@ -137,7 +137,7 @@ class document_file(osv.osv):
It is a hack that will try to discover if the mentioned record is
clearly associated with a partner record.
"""
- obj_model = self.pool.get(res_model)
+ obj_model = self.pool[res_model]
if obj_model._name == 'res.partner':
return res_id
elif 'partner_id' in obj_model._columns and obj_model._columns['partner_id']._obj == 'res.partner':
@@ -422,7 +422,6 @@ class document_directory_content(osv.osv):
tname = ''
if content.include_name:
record_name = node.displayname or ''
- # obj = node.context._dirobj.pool.get(model)
if record_name:
tname = (content.prefix or '') + record_name + (content.suffix or '') + (content.extension or '')
else:
@@ -1296,9 +1295,9 @@ class node_res_dir(node_class):
Note that many objects use NULL for a name, so we should
better call the name_search(),name_get() set of methods
"""
- obj = self.context._dirobj.pool.get(self.res_model)
- if not obj:
+ if self.res_model not in self.context._dirobj.pool:
return []
+ obj = self.context._dirobj.pool[self.res_model]
dirobj = self.context._dirobj
uid = self.context.uid
ctx = self.context.context.copy()
@@ -1333,7 +1332,7 @@ class node_res_dir(node_class):
if self.ressource_tree:
object2 = False
if self.resm_id:
- object2 = dirobj.pool.get(self.res_model).browse(cr, uid, self.resm_id) or False
+ object2 = dirobj.pool[self.res_model].browse(cr, uid, self.resm_id) or False
if obj._parent_name in obj.fields_get(cr, uid):
where.append((obj._parent_name,'=',object2 and object2.id or False))
@@ -1504,7 +1503,7 @@ class node_res_obj(node_class):
ctx = self.context.context.copy()
ctx.update(self.dctx)
directory = dirobj.browse(cr, uid, self.dir_id)
- obj = dirobj.pool.get(self.res_model)
+ obj = dirobj.pool[self.res_model]
where = []
res = []
if name:
@@ -1590,7 +1589,7 @@ class node_res_obj(node_class):
uid = self.context.uid
ctx = self.context.context.copy()
ctx.update(self.dctx)
- res_obj = dirobj.pool.get(self.res_model)
+ res_obj = dirobj.pool[self.res_model]
object2 = res_obj.browse(cr, uid, self.res_id) or False
diff --git a/addons/document/document_view.xml b/addons/document/document_view.xml
index 68f294b251c..c3bd5ad3f56 100644
--- a/addons/document/document_view.xml
+++ b/addons/document/document_view.xml
@@ -258,7 +258,9 @@
name="Documents"
action="action_document_file_form"
id="menu_document_files"
- parent="menu_document_doc"/>
+ parent="menu_document_doc"
+ sequence="0"
+ />
<record model="ir.actions.act_window" id="action_document_file_directory_form">
<field name="type">ir.actions.act_window</field>
diff --git a/addons/document/wizard/document_configuration.py b/addons/document/wizard/document_configuration.py
index aec7f9b75a4..c846f288112 100644
--- a/addons/document/wizard/document_configuration.py
+++ b/addons/document/wizard/document_configuration.py
@@ -109,6 +109,5 @@ class document_configuration(osv.osv_memory):
'domain': '[]',
'ressource_tree': 1
})
-document_configuration()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_ftp/ftpserver/abstracted_fs.py b/addons/document_ftp/ftpserver/abstracted_fs.py
index a83843eb1a5..4a2d6e5e1ec 100644
--- a/addons/document_ftp/ftpserver/abstracted_fs.py
+++ b/addons/document_ftp/ftpserver/abstracted_fs.py
@@ -325,7 +325,7 @@ class abstracted_fs(object):
""" Get cr, uid, pool from a node
"""
assert node
- db = openerp.registry.(node.context.dbname).db
+ db = openerp.registry(node.context.dbname).db
return db.cursor(), node.context.uid
def get_node_cr(self, node):
diff --git a/addons/document_ftp/wizard/ftp_browse.py b/addons/document_ftp/wizard/ftp_browse.py
index ceb7d1a60e5..ee8f897ca20 100644
--- a/addons/document_ftp/wizard/ftp_browse.py
+++ b/addons/document_ftp/wizard/ftp_browse.py
@@ -60,6 +60,5 @@ class document_ftp_browse(osv.osv_memory):
'target': 'new'
}
-document_ftp_browse()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_ftp/wizard/ftp_configuration.py b/addons/document_ftp/wizard/ftp_configuration.py
index 87aaa2331b4..1dee9495a95 100644
--- a/addons/document_ftp/wizard/ftp_configuration.py
+++ b/addons/document_ftp/wizard/ftp_configuration.py
@@ -47,6 +47,5 @@ class document_ftp_configuration(osv.osv_memory):
self.pool.get('ir.actions.act_url').write(cr, uid, [aid],
{'url': 'ftp://'+(conf.host or 'localhost:8021')+'/' + cr.dbname+'/'})
-document_ftp_configuration()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_webdav/dav_fs.py b/addons/document_webdav/dav_fs.py
index a8ef9082b2c..fef7d7b5940 100644
--- a/addons/document_webdav/dav_fs.py
+++ b/addons/document_webdav/dav_fs.py
@@ -37,7 +37,7 @@ except ImportError:
from DAV.davcmd import copyone, copytree, moveone, movetree, delone, deltree
import openerp
-from openerp import sql_db, netsvc
+from openerp import sql_db
import openerp.service
from openerp.tools import misc
diff --git a/addons/document_webdav/nodes.py b/addons/document_webdav/nodes.py
index 5e819e01754..9a35f3cfe1b 100644
--- a/addons/document_webdav/nodes.py
+++ b/addons/document_webdav/nodes.py
@@ -67,7 +67,7 @@ class node_acl_mixin(object):
"""
ret = par_class.get_dav_props(self, cr)
if prop_model:
- propobj = self.context._dirobj.pool.get(prop_model)
+ propobj = self.context._dirobj.pool[prop_model]
uid = self.context.uid
ctx = self.context.context.copy()
ctx.update(self.dctx)
@@ -105,7 +105,7 @@ class node_acl_mixin(object):
if ret is not None:
return ret
if prop_model:
- propobj = self.context._dirobj.pool.get(prop_model)
+ propobj = self.context._dirobj.pool[prop_model]
uid = self.context.uid
ctx = self.context.context.copy()
ctx.update(self.dctx)
@@ -151,7 +151,7 @@ class node_acl_mixin(object):
assert prop_model
assert res_id
assert isinstance(lock_data, dict), '%r' % lock_data
- propobj = self.context._dirobj.pool.get(prop_model)
+ propobj = self.context._dirobj.pool[prop_model]
uid = self.context.uid
ctx = self.context.context.copy()
ctx.update(self.dctx)
diff --git a/addons/document_webdav/test/webdav_test1.yml b/addons/document_webdav/test/webdav_test1.yml
index 82236f63846..ae91d7cd4a8 100644
--- a/addons/document_webdav/test/webdav_test1.yml
+++ b/addons/document_webdav/test/webdav_test1.yml
@@ -47,10 +47,9 @@
-
!python {model: ir.attachment}: |
from document_webdav import test_davclient as te
- import addons
dc = te.DAVClient()
dc.get_creds(self, cr, uid)
- tdp = addons.get_module_resource('document_webdav', 'test_davclient.py')
+ tdp = openerp.modules.module.get_module_resource('document_webdav', 'test_davclient.py')
res = dc.gd_put(path=cr.dbname+'/Documents/test_davclient.py', srcpath=tdp)
-
I will try to get the file from the root
@@ -60,5 +59,5 @@
import addons
dc = te.DAVClient()
dc.get_creds(self, cr, uid)
- tdp = addons.get_module_resource('document_webdav', 'test_davclient.py')
+ tdp = openerp.modules.module.get_module_resource('document_webdav', 'test_davclient.py')
res = dc.gd_get(path=cr.dbname+'/Documents/test_davclient.py', crange=(4,508), compare=tdp)
diff --git a/addons/document_webdav/webdav_server.py b/addons/document_webdav/webdav_server.py
index 90b42fd8b5f..f67de272e29 100644
--- a/addons/document_webdav/webdav_server.py
+++ b/addons/document_webdav/webdav_server.py
@@ -36,7 +36,6 @@
import logging
import openerp
-from openerp import netsvc
from dav_fs import openerp_dav_handler
from openerp.tools.config import config
try:
@@ -609,7 +608,7 @@ try:
if base_path and base_path == '/':
dir_path = config.get_misc('static-http', 'dir_path', False)
else:
- dir_path = openerp.addons.get_module_resource('document_webdav','public_html')
+ dir_path = openerp.modules.module.get_module_resource('document_webdav','public_html')
# an _ugly_ hack: we put that dir back in tools.config.misc, so that
# the StaticHttpHandler can find its dir_path.
config.misc.setdefault('static-http',{})['dir_path'] = dir_path
diff --git a/addons/edi/i18n/cs.po b/addons/edi/i18n/cs.po
new file mode 100644
index 00000000000..880519ca93b
--- /dev/null
+++ b/addons/edi/i18n/cs.po
@@ -0,0 +1,87 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:48+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: edi
+#. openerp-web
+#: code:addons/edi/static/src/js/edi.js:67
+#, python-format
+msgid "Reason:"
+msgstr ""
+
+#. module: edi
+#. openerp-web
+#: code:addons/edi/static/src/js/edi.js:60
+#, python-format
+msgid "The document has been successfully imported!"
+msgstr ""
+
+#. module: edi
+#. openerp-web
+#: code:addons/edi/static/src/js/edi.js:65
+#, python-format
+msgid "Sorry, the document could not be imported."
+msgstr ""
+
+#. module: edi
+#: model:ir.model,name:edi.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: edi
+#: model:ir.model,name:edi.model_res_currency
+msgid "Currency"
+msgstr ""
+
+#. module: edi
+#. openerp-web
+#: code:addons/edi/static/src/js/edi.js:71
+#, python-format
+msgid "Document Import Notification"
+msgstr ""
+
+#. module: edi
+#: code:addons/edi/models/edi.py:130
+#, python-format
+msgid "Missing application."
+msgstr ""
+
+#. module: edi
+#: code:addons/edi/models/edi.py:131
+#, python-format
+msgid ""
+"The document you are trying to import requires the OpenERP `%s` application. "
+"You can install it by connecting as the administrator and opening the "
+"configuration assistant."
+msgstr ""
+
+#. module: edi
+#: code:addons/edi/models/edi.py:47
+#, python-format
+msgid "'%s' is an invalid external ID"
+msgstr ""
+
+#. module: edi
+#: model:ir.model,name:edi.model_res_partner
+msgid "Partner"
+msgstr ""
+
+#. module: edi
+#: model:ir.model,name:edi.model_edi_edi
+msgid "EDI Subsystem"
+msgstr ""
diff --git a/addons/edi/i18n/lt.po b/addons/edi/i18n/lt.po
new file mode 100644
index 00000000000..4c00a1dc6d6
--- /dev/null
+++ b/addons/edi/i18n/lt.po
@@ -0,0 +1,87 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-29 15:19+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: edi
+#. openerp-web
+#: code:addons/edi/static/src/js/edi.js:67
+#, python-format
+msgid "Reason:"
+msgstr ""
+
+#. module: edi
+#. openerp-web
+#: code:addons/edi/static/src/js/edi.js:60
+#, python-format
+msgid "The document has been successfully imported!"
+msgstr ""
+
+#. module: edi
+#. openerp-web
+#: code:addons/edi/static/src/js/edi.js:65
+#, python-format
+msgid "Sorry, the document could not be imported."
+msgstr ""
+
+#. module: edi
+#: model:ir.model,name:edi.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: edi
+#: model:ir.model,name:edi.model_res_currency
+msgid "Currency"
+msgstr ""
+
+#. module: edi
+#. openerp-web
+#: code:addons/edi/static/src/js/edi.js:71
+#, python-format
+msgid "Document Import Notification"
+msgstr ""
+
+#. module: edi
+#: code:addons/edi/models/edi.py:130
+#, python-format
+msgid "Missing application."
+msgstr ""
+
+#. module: edi
+#: code:addons/edi/models/edi.py:131
+#, python-format
+msgid ""
+"The document you are trying to import requires the OpenERP `%s` application. "
+"You can install it by connecting as the administrator and opening the "
+"configuration assistant."
+msgstr ""
+
+#. module: edi
+#: code:addons/edi/models/edi.py:47
+#, python-format
+msgid "'%s' is an invalid external ID"
+msgstr ""
+
+#. module: edi
+#: model:ir.model,name:edi.model_res_partner
+msgid "Partner"
+msgstr ""
+
+#. module: edi
+#: model:ir.model,name:edi.model_edi_edi
+msgid "EDI Subsystem"
+msgstr ""
diff --git a/addons/edi/i18n/nl_BE.po b/addons/edi/i18n/nl_BE.po
index f5fc80a6fcc..aa96f26d13b 100644
--- a/addons/edi/i18n/nl_BE.po
+++ b/addons/edi/i18n/nl_BE.po
@@ -8,35 +8,35 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2012-10-02 08:10+0000\n"
+"PO-Revision-Date: 2013-04-15 16:04+0000\n"
"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:50+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
#. module: edi
#. openerp-web
#: code:addons/edi/static/src/js/edi.js:67
#, python-format
msgid "Reason:"
-msgstr ""
+msgstr "Reden:"
#. module: edi
#. openerp-web
#: code:addons/edi/static/src/js/edi.js:60
#, python-format
msgid "The document has been successfully imported!"
-msgstr ""
+msgstr "Het document is met succes geïmporteerd"
#. module: edi
#. openerp-web
#: code:addons/edi/static/src/js/edi.js:65
#, python-format
msgid "Sorry, the document could not be imported."
-msgstr ""
+msgstr "Sorry, het document kan niet worden geïmporteerd"
#. module: edi
#: model:ir.model,name:edi.model_res_company
@@ -53,13 +53,13 @@ msgstr "Munt"
#: code:addons/edi/static/src/js/edi.js:71
#, python-format
msgid "Document Import Notification"
-msgstr ""
+msgstr "Documentimportbericht"
#. module: edi
#: code:addons/edi/models/edi.py:130
#, python-format
msgid "Missing application."
-msgstr ""
+msgstr "Ontbrekend programma"
#. module: edi
#: code:addons/edi/models/edi.py:131
@@ -87,7 +87,7 @@ msgstr "Relatie"
#. module: edi
#: model:ir.model,name:edi.model_edi_edi
msgid "EDI Subsystem"
-msgstr ""
+msgstr "EDI-subsysteem"
#~ msgid "The currency code must be unique per company!"
#~ msgstr "De munt moet uniek zijn per firma."
diff --git a/addons/edi/models/edi.py b/addons/edi/models/edi.py
index 4d524e63818..bfd59dae15a 100644
--- a/addons/edi/models/edi.py
+++ b/addons/edi/models/edi.py
@@ -29,7 +29,6 @@ import urllib2
import openerp
import openerp.release as release
-import openerp.netsvc as netsvc
from openerp.osv import osv, fields
from openerp.tools.translate import _
from openerp.tools.safe_eval import safe_eval as eval
@@ -107,8 +106,8 @@ class edi(osv.AbstractModel):
"""
edi_list = []
for record in records:
- record_model_obj = self.pool.get(record._name)
- edi_list += record_model_obj.edi_export(cr, uid, [record], context=context)
+ record_model = record._model
+ edi_list += record_model.edi_export(cr, uid, [record], context=context)
return self.serialize(edi_list)
def load_edi(self, cr, uid, edi_documents, context=None):
@@ -132,9 +131,9 @@ class edi(osv.AbstractModel):
"You can install it by connecting as the administrator and opening the configuration assistant.")%(module,))
model = edi_document.get('__import_model') or edi_document.get('__model')
assert model, 'a `__model` or `__import_model` attribute is required in each EDI document.'
- model_obj = self.pool.get(model)
- assert model_obj, 'model `%s` cannot be found, despite module `%s` being available - '\
+ assert model in self.pool, 'model `%s` cannot be found, despite module `%s` being available - '\
'this EDI document seems invalid or unsupported.' % (model,module)
+ model_obj = self.pool[model]
record_id = model_obj.edi_import(cr, uid, edi_document, context=context)
record_action = model_obj._edi_record_display_action(cr, uid, record_id, context=context)
res.append((model, record_id, record_action))
@@ -401,7 +400,7 @@ class EDIMixin(object):
return results
def _edi_get_object_by_name(self, cr, uid, name, model_name, context=None):
- model = self.pool.get(model_name)
+ model = self.pool[model_name]
search_results = model.name_search(cr, uid, name, operator='=', context=context)
if len(search_results) == 1:
return model.browse(cr, uid, search_results[0][0], context=context)
@@ -418,9 +417,7 @@ class EDIMixin(object):
('usage','=','default')])
if matching_reports:
report = ir_actions_report.browse(cr, uid, matching_reports[0])
- report_service = 'report.' + report.report_name
- service = netsvc.LocalService(report_service)
- (result, format) = service.create(cr, uid, [record.id], {'model': self._name}, context=context)
+ result, format = openerp.report.render_report(cr, uid, [record.id], report.report_name, {'model': self._name}, context=context)
eval_context = {'time': time, 'object': record}
if not report.attachment or not eval(report.attachment, eval_context):
# no auto-saving of report as attachment, need to do it manually
@@ -486,7 +483,7 @@ class EDIMixin(object):
('name','=',ext_id),
('module','in',modules)])
if data_ids:
- model = self.pool.get(model)
+ model = self.pool[model]
data = ir_model_data.browse(cr, uid, data_ids[0], context=context)
if model.exists(cr, uid, [data.res_id]):
return model.browse(cr, uid, data.res_id, context=context)
@@ -522,7 +519,7 @@ class EDIMixin(object):
_logger.debug("%s: Importing EDI relationship [%r,%r] - name not found, creating it.",
self._name, external_id, value)
# also need_new_ext_id here, but already been set above
- model = self.pool.get(model)
+ model = self.pool[model]
res_id, _ = model.name_create(cr, uid, value, context=context)
target = model.browse(cr, uid, res_id, context=context)
else:
@@ -595,7 +592,7 @@ class EDIMixin(object):
# process o2m values, connecting them to their parent on-the-fly
for o2m_field, o2m_value in o2m_todo.iteritems():
field = self._all_columns[o2m_field].column
- dest_model = self.pool.get(field._obj)
+ dest_model = self.pool[field._obj]
for o2m_line in o2m_value:
# link to parent record: expects an (ext_id, name) pair
o2m_line[field._fields_id] = (ext_id_members['full'], record_display[1])
diff --git a/addons/email_template/email_template.py b/addons/email_template/email_template.py
index 147347182f5..00285ebcd91 100644
--- a/addons/email_template/email_template.py
+++ b/addons/email_template/email_template.py
@@ -23,7 +23,7 @@
import base64
import logging
-from openerp import netsvc
+import openerp
from openerp.osv import osv, fields
from openerp.osv import fields
from openerp import tools
@@ -89,7 +89,7 @@ class email_template(osv.osv):
template = tools.ustr(template)
record = None
if res_id:
- record = self.pool.get(model).browse(cr, uid, res_id, context=context)
+ record = self.pool[model].browse(cr, uid, res_id, context=context)
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
variables = {
'object': record,
@@ -297,8 +297,7 @@ class email_template(osv.osv):
'copyvalue': self.build_expression(field_value.name, False, null_value or False),
'null_value': null_value or False
})
- return {'value':result}
-
+ return {'value': result}
def generate_email(self, cr, uid, template_id, res_id, context=None):
"""Generates an email from the template for given (model, res_id) pair.
@@ -336,26 +335,27 @@ class email_template(osv.osv):
# Add report in attachments
if template.report_template:
report_name = self.render_template(cr, uid, template.report_name, template.model, res_id, context=context)
- report_service = 'report.' + report_xml_pool.browse(cr, uid, template.report_template.id, context).report_name
+ report_service = report_xml_pool.browse(cr, uid, template.report_template.id, context).report_name
# Ensure report is rendered using template's language
ctx = context.copy()
if template.lang:
ctx['lang'] = self.render_template(cr, uid, template.lang, template.model, res_id, context)
- service = netsvc.LocalService(report_service)
- (result, format) = service.create(cr, uid, [res_id], {'model': template.model}, ctx)
+ result, format = openerp.report.render_report(cr, uid, [res_id], report_service, {'model': template.model}, ctx)
result = base64.b64encode(result)
if not report_name:
- report_name = report_service
+ report_name = 'report.' + report_service
ext = "." + format
if not report_name.endswith(ext):
report_name += ext
attachments.append((report_name, result))
+ attachment_ids = []
# Add template attachments
for attach in template.attachment_ids:
- attachments.append((attach.datas_fname, attach.datas))
+ attachment_ids.append(attach.id)
values['attachments'] = attachments
+ values['attachment_ids'] = attachment_ids
return values
def send_mail(self, cr, uid, template_id, res_id, force_send=False, context=None):
@@ -370,28 +370,34 @@ class email_template(osv.osv):
was executed for this message only.
:returns: id of the mail.message that was created
"""
- if context is None: context = {}
+ if context is None:
+ context = {}
mail_mail = self.pool.get('mail.mail')
ir_attachment = self.pool.get('ir.attachment')
+
+ # create a mail_mail based on values, without attachments
values = self.generate_email(cr, uid, template_id, res_id, context=context)
- assert 'email_from' in values, 'email_from is missing or empty after template rendering, send_mail() cannot proceed'
- attachments = values.pop('attachments') or {}
- del values['partner_to'] # TODO Properly use them.
+ assert values.get('email_from'), 'email_from is missing or empty after template rendering, send_mail() cannot proceed'
+ del values['partner_to'] # TODO Properly use them.
+ attachment_ids = values.pop('attachment_ids', [])
+ attachments = values.pop('attachments', [])
msg_id = mail_mail.create(cr, uid, values, context=context)
- # link attachments
- attachment_ids = []
- for fname, fcontent in attachments.iteritems():
+
+ # manage attachments
+ for attachment in attachments:
attachment_data = {
- 'name': fname,
- 'datas_fname': fname,
- 'datas': fcontent,
- 'res_model': mail_mail._name,
+ 'name': attachment[0],
+ 'datas_fname': attachment[0],
+ 'datas': attachment[1],
+ 'res_model': 'mail.message',
'res_id': msg_id,
}
context.pop('default_type', None)
attachment_ids.append(ir_attachment.create(cr, uid, attachment_data, context=context))
if attachment_ids:
+ values['attachment_ids'] = [(6, 0, attachment_ids)]
mail_mail.write(cr, uid, msg_id, {'attachment_ids': [(6, 0, attachment_ids)]}, context=context)
+
if force_send:
mail_mail.send(cr, uid, [msg_id], context=context)
return msg_id
diff --git a/addons/email_template/email_template_view.xml b/addons/email_template/email_template_view.xml
index 8c63a06ebe0..5429341e154 100644
--- a/addons/email_template/email_template_view.xml
+++ b/addons/email_template/email_template_view.xml
@@ -9,7 +9,7 @@
<sheet>
<div class="oe_title">
<label for="name" class="oe_edit_only"/><h1><field name="name" required="1"/></h1>
- <h3><label for="model_id"/><field name="model_id" required="1" on_change="onchange_model_id(model_id)" class="oe_inline"/></h3>
+ <label for="model_id"/><field name="model_id" required="1" on_change="onchange_model_id(model_id)" class="oe_inline"/>
<field name="model" invisible="1"/>
</div>
<div class="oe_right oe_button_box" name="buttons">
@@ -25,30 +25,44 @@
context="{'template_id':active_id}"/>
</div>
<notebook>
- <page string="Email Details">
+ <page string="Mailing Template">
<group>
- <group string="Addressing">
- <field name="email_from"/>
- <field name="email_to"/>
- <field name="partner_to"/>
- <field name="email_cc"/>
- <field name="reply_to"/>
- <field name="user_signature"/>
+ <group>
+ <field name="email_from"
+ placeholder="Override author's email"/>
+ <field name="email_to"
+ placeholder="Comma-separated recipient addresses"/>
+ <field name="partner_to"
+ placeholder="Comma-separated ids of recipient partners"/>
+ <field name="email_cc"
+ placeholder="Comma-separated carbon copy recipients addresses"/>
+ <field name="reply_to"
+ placeholder="Preferred reply address"/>
+ <field name="subject"
+ placeholder="Subject (placeholders may be used here)"/>
+ <field name="user_signature" string="Author Signature (mass mail only)"/>
</group>
- <group string="Dynamic Value Builder" class="oe_edit_only">
- <field name="model_object_field" domain="[('model_id','=',model_id),('ttype','!=','one2many'),('ttype','!=','many2many')]" on_change="onchange_sub_model_object_value_field(model_object_field)"/>
- <field name="sub_object" readonly="1"/>
- <field name="sub_model_object_field" domain="[('model_id','=',sub_object),('ttype','!=','one2many'),('ttype','!=','many2many')]" attrs="{'readonly':[('sub_object','=',False)],'required':[('sub_object','!=',False)]}" on_change="onchange_sub_model_object_value_field(model_object_field,sub_model_object_field)"/>
- <field name="null_value" on_change="onchange_sub_model_object_value_field(model_object_field,sub_model_object_field,null_value)"/>
- <field name="copyvalue"/>
- </group>
- <group string="Contents" colspan="2">
- <field name="subject"/>
- <field name="body_html" width="250" height="450" nolabel="1" colspan="2" placeholder="Email contents (in raw HTML format)"/>
+ <group class="oe_edit_only">
+ <h3 colspan="2">Dynamic placeholder generator</h3>
+ <field name="model_object_field"
+ domain="[('model_id','=',model_id),('ttype','!=','one2many'),('ttype','!=','many2many')]"
+ on_change="onchange_sub_model_object_value_field(model_object_field)"/>
+ <field name="sub_object" readonly="1"/>
+ <field name="sub_model_object_field"
+ domain="[('model_id','=',sub_object),('ttype','!=','one2many'),('ttype','!=','many2many')]"
+ attrs="{'readonly':[('sub_object','=',False)],'required':[('sub_object','!=',False)]}"
+ on_change="onchange_sub_model_object_value_field(model_object_field,sub_model_object_field)"/>
+ <field name="null_value"
+ on_change="onchange_sub_model_object_value_field(model_object_field,sub_model_object_field,null_value)"/>
+ <field name="copyvalue"/>
</group>
</group>
+ <h3>Body</h3>
+ <field name="body_html" width="250" height="450"
+ placeholder="Rich-text/HTML content of the message (placeholders may be used here)"/>
+ <field name="attachment_ids" nolabel="1" widget="many2many_binary"/>
</page>
- <page string="Advanced">
+ <page string="Advanced Settings">
<group>
<field name="lang"/>
<field name="mail_server_id"/>
@@ -56,9 +70,6 @@
<field name="report_template" domain="[('model','=',model)]"/>
<field name="report_name" class="oe_inline"
attrs="{'invisible':[('report_template','=',False)]}"/>
- <field name="attachment_ids">
- <tree><field name="name"/></tree>
- </field>
</group>
</page>
</notebook>
diff --git a/addons/email_template/i18n/lt.po b/addons/email_template/i18n/lt.po
new file mode 100644
index 00000000000..20c2c5e0e5d
--- /dev/null
+++ b/addons/email_template/i18n/lt.po
@@ -0,0 +1,488 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-29 15:19+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: email_template
+#: field:email.template,email_from:0
+#: field:email_template.preview,email_from:0
+msgid "From"
+msgstr ""
+
+#. module: email_template
+#: field:mail.compose.message,template_id:0
+msgid "Template"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,ref_ir_value:0
+#: help:email_template.preview,ref_ir_value:0
+msgid "Sidebar button to open the sidebar action"
+msgstr ""
+
+#. module: email_template
+#: field:res.partner,opt_out:0
+msgid "Opt-Out"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,email_to:0
+#: field:email_template.preview,email_to:0
+msgid "To (Emails)"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,mail_server_id:0
+#: field:email_template.preview,mail_server_id:0
+msgid "Outgoing Mail Server"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,ref_ir_act_window:0
+#: help:email_template.preview,ref_ir_act_window:0
+msgid ""
+"Sidebar action to make this template available on records of the related "
+"document model"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,model_object_field:0
+#: field:email_template.preview,model_object_field:0
+msgid "Field"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,email_from:0
+#: help:email_template.preview,email_from:0
+msgid "Sender address (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Remove context action"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,mail_server_id:0
+#: help:email_template.preview,mail_server_id:0
+msgid ""
+"Optional preferred server for outgoing mails. If not set, the highest "
+"priority one will be used."
+msgstr ""
+
+#. module: email_template
+#: field:email.template,report_name:0
+#: field:email_template.preview,report_name:0
+msgid "Report Filename"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Preview"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,reply_to:0
+#: field:email_template.preview,reply_to:0
+msgid "Reply-To"
+msgstr ""
+
+#. module: email_template
+#: view:mail.compose.message:0
+msgid "Use template"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,body_html:0
+#: field:email_template.preview,body_html:0
+msgid "Body"
+msgstr ""
+
+#. module: email_template
+#: code:addons/email_template/email_template.py:244
+#, python-format
+msgid "%s (copy)"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,user_signature:0
+#: help:email_template.preview,user_signature:0
+msgid ""
+"If checked, the user's signature will be appended to the text version of the "
+"message"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "SMTP Server"
+msgstr ""
+
+#. module: email_template
+#: view:mail.compose.message:0
+msgid "Save as new template"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,sub_object:0
+#: help:email_template.preview,sub_object:0
+msgid ""
+"When a relationship field is selected as first field, this field shows the "
+"document model the relationship goes to."
+msgstr ""
+
+#. module: email_template
+#: model:ir.model,name:email_template.model_email_template
+msgid "Email Templates"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,report_name:0
+#: help:email_template.preview,report_name:0
+msgid ""
+"Name to use for the generated report file (may contain placeholders)\n"
+"The extension can be omitted and will then come from the report type."
+msgstr ""
+
+#. module: email_template
+#: field:email.template,ref_ir_act_window:0
+#: field:email_template.preview,ref_ir_act_window:0
+msgid "Sidebar action"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,lang:0
+#: help:email_template.preview,lang:0
+msgid ""
+"Optional translation language (ISO code) to select when sending out an "
+"email. If not set, the english version will be used. This should usually be "
+"a placeholder expression that provides the appropriate language code, e.g. "
+"${object.partner_id.lang.code}."
+msgstr ""
+
+#. module: email_template
+#: field:email_template.preview,res_id:0
+msgid "Sample Document"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,model_object_field:0
+#: help:email_template.preview,model_object_field:0
+msgid ""
+"Select target field from the related document model.\n"
+"If it is a relationship field you will be able to select a target field at "
+"the destination of the relationship."
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Dynamic Value Builder"
+msgstr ""
+
+#. module: email_template
+#: model:ir.actions.act_window,name:email_template.wizard_email_template_preview
+msgid "Template Preview"
+msgstr ""
+
+#. module: email_template
+#: view:mail.compose.message:0
+msgid "Save as a new template"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid ""
+"Display an option on related documents to open a composition wizard with "
+"this template"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,email_cc:0
+#: help:email_template.preview,email_cc:0
+msgid "Carbon copy recipients (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,email_to:0
+#: help:email_template.preview,email_to:0
+msgid "Comma-separated recipient addresses (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Advanced"
+msgstr ""
+
+#. module: email_template
+#: view:email_template.preview:0
+msgid "Preview of"
+msgstr ""
+
+#. module: email_template
+#: view:email_template.preview:0
+msgid "Using sample document"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+#: model:ir.actions.act_window,name:email_template.action_email_template_tree_all
+#: model:ir.ui.menu,name:email_template.menu_email_templates
+msgid "Templates"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,name:0
+#: field:email_template.preview,name:0
+msgid "Name"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,lang:0
+#: field:email_template.preview,lang:0
+msgid "Language"
+msgstr ""
+
+#. module: email_template
+#: model:ir.model,name:email_template.model_email_template_preview
+msgid "Email Template Preview"
+msgstr ""
+
+#. module: email_template
+#: view:email_template.preview:0
+msgid "Email Preview"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid ""
+"Remove the contextual action to use this template on related documents"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,copyvalue:0
+#: field:email_template.preview,copyvalue:0
+msgid "Placeholder Expression"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,sub_object:0
+#: field:email_template.preview,sub_object:0
+msgid "Sub-model"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,subject:0
+#: help:email_template.preview,subject:0
+msgid "Subject (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,reply_to:0
+#: help:email_template.preview,reply_to:0
+msgid "Preferred response address (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,ref_ir_value:0
+#: field:email_template.preview,ref_ir_value:0
+msgid "Sidebar Button"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,report_template:0
+#: field:email_template.preview,report_template:0
+msgid "Optional report to print and attach"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,null_value:0
+#: help:email_template.preview,null_value:0
+msgid "Optional value to use if the target field is empty"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Model"
+msgstr ""
+
+#. module: email_template
+#: model:ir.model,name:email_template.model_mail_compose_message
+msgid "Email composition wizard"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Add context action"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,model_id:0
+#: help:email_template.preview,model_id:0
+msgid "The kind of document with with this template can be used"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,email_recipients:0
+#: field:email_template.preview,email_recipients:0
+msgid "To (Partners)"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,auto_delete:0
+#: field:email_template.preview,auto_delete:0
+msgid "Auto Delete"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,copyvalue:0
+#: help:email_template.preview,copyvalue:0
+msgid ""
+"Final placeholder expression, to be copy-pasted in the desired template "
+"field."
+msgstr ""
+
+#. module: email_template
+#: field:email.template,model:0
+#: field:email_template.preview,model:0
+msgid "Related Document Model"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Addressing"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,email_recipients:0
+#: help:email_template.preview,email_recipients:0
+msgid ""
+"Comma-separated ids of recipient partners (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,attachment_ids:0
+#: field:email_template.preview,attachment_ids:0
+msgid "Attachments"
+msgstr ""
+
+#. module: email_template
+#: code:addons/email_template/email_template.py:231
+#, python-format
+msgid "Deletion of the action record failed."
+msgstr ""
+
+#. module: email_template
+#: field:email.template,email_cc:0
+#: field:email_template.preview,email_cc:0
+msgid "Cc"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,model_id:0
+#: field:email_template.preview,model_id:0
+msgid "Applies to"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,sub_model_object_field:0
+#: field:email_template.preview,sub_model_object_field:0
+msgid "Sub-field"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Email Details"
+msgstr ""
+
+#. module: email_template
+#: code:addons/email_template/email_template.py:196
+#, python-format
+msgid "Send Mail (%s)"
+msgstr ""
+
+#. module: email_template
+#: help:res.partner,opt_out:0
+msgid ""
+"If checked, this partner will not receive any automated email notifications, "
+"such as the availability of invoices."
+msgstr ""
+
+#. module: email_template
+#: help:email.template,auto_delete:0
+#: help:email_template.preview,auto_delete:0
+msgid "Permanently delete this email after sending it, to save space"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Group by..."
+msgstr ""
+
+#. module: email_template
+#: help:email.template,sub_model_object_field:0
+#: help:email_template.preview,sub_model_object_field:0
+msgid ""
+"When a relationship field is selected as first field, this field lets you "
+"select the target field within the destination document model (sub-model)."
+msgstr ""
+
+#. module: email_template
+#: code:addons/email_template/email_template.py:231
+#, python-format
+msgid "Warning"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,user_signature:0
+#: field:email_template.preview,user_signature:0
+msgid "Add Signature"
+msgstr ""
+
+#. module: email_template
+#: model:ir.model,name:email_template.model_res_partner
+msgid "Partner"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,null_value:0
+#: field:email_template.preview,null_value:0
+msgid "Default Value"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,attachment_ids:0
+#: help:email_template.preview,attachment_ids:0
+msgid ""
+"You may attach files to this template, to be added to all emails created "
+"from this template"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,body_html:0
+#: help:email_template.preview,body_html:0
+msgid "Rich-text/HTML version of the message (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Contents"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,subject:0
+#: field:email_template.preview,subject:0
+msgid "Subject"
+msgstr ""
diff --git a/addons/email_template/i18n/nl_BE.po b/addons/email_template/i18n/nl_BE.po
new file mode 100644
index 00000000000..5e7ddeec587
--- /dev/null
+++ b/addons/email_template/i18n/nl_BE.po
@@ -0,0 +1,489 @@
+# Dutch (Belgium) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-26 16:28+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-27 05:44+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: email_template
+#: field:email.template,email_from:0
+#: field:email_template.preview,email_from:0
+msgid "From"
+msgstr "Van"
+
+#. module: email_template
+#: field:mail.compose.message,template_id:0
+msgid "Template"
+msgstr "Sjabloon"
+
+#. module: email_template
+#: help:email.template,ref_ir_value:0
+#: help:email_template.preview,ref_ir_value:0
+msgid "Sidebar button to open the sidebar action"
+msgstr ""
+
+#. module: email_template
+#: field:res.partner,opt_out:0
+msgid "Opt-Out"
+msgstr "Uitschrijven"
+
+#. module: email_template
+#: field:email.template,email_to:0
+#: field:email_template.preview,email_to:0
+msgid "To (Emails)"
+msgstr "Naar (E-mails)"
+
+#. module: email_template
+#: field:email.template,mail_server_id:0
+#: field:email_template.preview,mail_server_id:0
+msgid "Outgoing Mail Server"
+msgstr "Uitgaande mailserver"
+
+#. module: email_template
+#: help:email.template,ref_ir_act_window:0
+#: help:email_template.preview,ref_ir_act_window:0
+msgid ""
+"Sidebar action to make this template available on records of the related "
+"document model"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,model_object_field:0
+#: field:email_template.preview,model_object_field:0
+msgid "Field"
+msgstr "Veld"
+
+#. module: email_template
+#: help:email.template,email_from:0
+#: help:email_template.preview,email_from:0
+msgid "Sender address (placeholders may be used here)"
+msgstr ""
+"Adres van de afzender (variabele aanduidingen kunnen hier worden gebruikt)"
+
+#. module: email_template
+#: view:email.template:0
+msgid "Remove context action"
+msgstr "Contextactie verwijderen"
+
+#. module: email_template
+#: help:email.template,mail_server_id:0
+#: help:email_template.preview,mail_server_id:0
+msgid ""
+"Optional preferred server for outgoing mails. If not set, the highest "
+"priority one will be used."
+msgstr ""
+
+#. module: email_template
+#: field:email.template,report_name:0
+#: field:email_template.preview,report_name:0
+msgid "Report Filename"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Preview"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,reply_to:0
+#: field:email_template.preview,reply_to:0
+msgid "Reply-To"
+msgstr ""
+
+#. module: email_template
+#: view:mail.compose.message:0
+msgid "Use template"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,body_html:0
+#: field:email_template.preview,body_html:0
+msgid "Body"
+msgstr ""
+
+#. module: email_template
+#: code:addons/email_template/email_template.py:244
+#, python-format
+msgid "%s (copy)"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,user_signature:0
+#: help:email_template.preview,user_signature:0
+msgid ""
+"If checked, the user's signature will be appended to the text version of the "
+"message"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "SMTP Server"
+msgstr ""
+
+#. module: email_template
+#: view:mail.compose.message:0
+msgid "Save as new template"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,sub_object:0
+#: help:email_template.preview,sub_object:0
+msgid ""
+"When a relationship field is selected as first field, this field shows the "
+"document model the relationship goes to."
+msgstr ""
+
+#. module: email_template
+#: model:ir.model,name:email_template.model_email_template
+msgid "Email Templates"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,report_name:0
+#: help:email_template.preview,report_name:0
+msgid ""
+"Name to use for the generated report file (may contain placeholders)\n"
+"The extension can be omitted and will then come from the report type."
+msgstr ""
+
+#. module: email_template
+#: field:email.template,ref_ir_act_window:0
+#: field:email_template.preview,ref_ir_act_window:0
+msgid "Sidebar action"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,lang:0
+#: help:email_template.preview,lang:0
+msgid ""
+"Optional translation language (ISO code) to select when sending out an "
+"email. If not set, the english version will be used. This should usually be "
+"a placeholder expression that provides the appropriate language code, e.g. "
+"${object.partner_id.lang.code}."
+msgstr ""
+
+#. module: email_template
+#: field:email_template.preview,res_id:0
+msgid "Sample Document"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,model_object_field:0
+#: help:email_template.preview,model_object_field:0
+msgid ""
+"Select target field from the related document model.\n"
+"If it is a relationship field you will be able to select a target field at "
+"the destination of the relationship."
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Dynamic Value Builder"
+msgstr ""
+
+#. module: email_template
+#: model:ir.actions.act_window,name:email_template.wizard_email_template_preview
+msgid "Template Preview"
+msgstr ""
+
+#. module: email_template
+#: view:mail.compose.message:0
+msgid "Save as a new template"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid ""
+"Display an option on related documents to open a composition wizard with "
+"this template"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,email_cc:0
+#: help:email_template.preview,email_cc:0
+msgid "Carbon copy recipients (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,email_to:0
+#: help:email_template.preview,email_to:0
+msgid "Comma-separated recipient addresses (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Advanced"
+msgstr ""
+
+#. module: email_template
+#: view:email_template.preview:0
+msgid "Preview of"
+msgstr ""
+
+#. module: email_template
+#: view:email_template.preview:0
+msgid "Using sample document"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+#: model:ir.actions.act_window,name:email_template.action_email_template_tree_all
+#: model:ir.ui.menu,name:email_template.menu_email_templates
+msgid "Templates"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,name:0
+#: field:email_template.preview,name:0
+msgid "Name"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,lang:0
+#: field:email_template.preview,lang:0
+msgid "Language"
+msgstr ""
+
+#. module: email_template
+#: model:ir.model,name:email_template.model_email_template_preview
+msgid "Email Template Preview"
+msgstr ""
+
+#. module: email_template
+#: view:email_template.preview:0
+msgid "Email Preview"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid ""
+"Remove the contextual action to use this template on related documents"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,copyvalue:0
+#: field:email_template.preview,copyvalue:0
+msgid "Placeholder Expression"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,sub_object:0
+#: field:email_template.preview,sub_object:0
+msgid "Sub-model"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,subject:0
+#: help:email_template.preview,subject:0
+msgid "Subject (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,reply_to:0
+#: help:email_template.preview,reply_to:0
+msgid "Preferred response address (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,ref_ir_value:0
+#: field:email_template.preview,ref_ir_value:0
+msgid "Sidebar Button"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,report_template:0
+#: field:email_template.preview,report_template:0
+msgid "Optional report to print and attach"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,null_value:0
+#: help:email_template.preview,null_value:0
+msgid "Optional value to use if the target field is empty"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Model"
+msgstr ""
+
+#. module: email_template
+#: model:ir.model,name:email_template.model_mail_compose_message
+msgid "Email composition wizard"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Add context action"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,model_id:0
+#: help:email_template.preview,model_id:0
+msgid "The kind of document with with this template can be used"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,email_recipients:0
+#: field:email_template.preview,email_recipients:0
+msgid "To (Partners)"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,auto_delete:0
+#: field:email_template.preview,auto_delete:0
+msgid "Auto Delete"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,copyvalue:0
+#: help:email_template.preview,copyvalue:0
+msgid ""
+"Final placeholder expression, to be copy-pasted in the desired template "
+"field."
+msgstr ""
+
+#. module: email_template
+#: field:email.template,model:0
+#: field:email_template.preview,model:0
+msgid "Related Document Model"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Addressing"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,email_recipients:0
+#: help:email_template.preview,email_recipients:0
+msgid ""
+"Comma-separated ids of recipient partners (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,attachment_ids:0
+#: field:email_template.preview,attachment_ids:0
+msgid "Attachments"
+msgstr ""
+
+#. module: email_template
+#: code:addons/email_template/email_template.py:231
+#, python-format
+msgid "Deletion of the action record failed."
+msgstr ""
+
+#. module: email_template
+#: field:email.template,email_cc:0
+#: field:email_template.preview,email_cc:0
+msgid "Cc"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,model_id:0
+#: field:email_template.preview,model_id:0
+msgid "Applies to"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,sub_model_object_field:0
+#: field:email_template.preview,sub_model_object_field:0
+msgid "Sub-field"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Email Details"
+msgstr ""
+
+#. module: email_template
+#: code:addons/email_template/email_template.py:196
+#, python-format
+msgid "Send Mail (%s)"
+msgstr ""
+
+#. module: email_template
+#: help:res.partner,opt_out:0
+msgid ""
+"If checked, this partner will not receive any automated email notifications, "
+"such as the availability of invoices."
+msgstr ""
+
+#. module: email_template
+#: help:email.template,auto_delete:0
+#: help:email_template.preview,auto_delete:0
+msgid "Permanently delete this email after sending it, to save space"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Group by..."
+msgstr ""
+
+#. module: email_template
+#: help:email.template,sub_model_object_field:0
+#: help:email_template.preview,sub_model_object_field:0
+msgid ""
+"When a relationship field is selected as first field, this field lets you "
+"select the target field within the destination document model (sub-model)."
+msgstr ""
+
+#. module: email_template
+#: code:addons/email_template/email_template.py:231
+#, python-format
+msgid "Warning"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,user_signature:0
+#: field:email_template.preview,user_signature:0
+msgid "Add Signature"
+msgstr ""
+
+#. module: email_template
+#: model:ir.model,name:email_template.model_res_partner
+msgid "Partner"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,null_value:0
+#: field:email_template.preview,null_value:0
+msgid "Default Value"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,attachment_ids:0
+#: help:email_template.preview,attachment_ids:0
+msgid ""
+"You may attach files to this template, to be added to all emails created "
+"from this template"
+msgstr ""
+
+#. module: email_template
+#: help:email.template,body_html:0
+#: help:email_template.preview,body_html:0
+msgid "Rich-text/HTML version of the message (placeholders may be used here)"
+msgstr ""
+
+#. module: email_template
+#: view:email.template:0
+msgid "Contents"
+msgstr ""
+
+#. module: email_template
+#: field:email.template,subject:0
+#: field:email_template.preview,subject:0
+msgid "Subject"
+msgstr ""
diff --git a/addons/email_template/tests/test_mail.py b/addons/email_template/tests/test_mail.py
index 56abe6a0fef..d5feea9ebc4 100644
--- a/addons/email_template/tests/test_mail.py
+++ b/addons/email_template/tests/test_mail.py
@@ -48,8 +48,8 @@ class test_message_compose(TestMailBase):
_body_html1 = 'Fans of Pigs, unite !'
_body_html2 = 'I am angry !'
_attachments = [
- {'name': 'First', 'datas_fname': 'first.txt', 'datas': base64.b64encode('My first attachment')},
- {'name': 'Second', 'datas_fname': 'second.txt', 'datas': base64.b64encode('My second attachment')}
+ {'name': 'First', 'datas_fname': 'first.txt', 'datas': base64.b64encode('My first attachment'), 'res_model': 'res.partner', 'res_id': self.partner_admin_id},
+ {'name': 'Second', 'datas_fname': 'second.txt', 'datas': base64.b64encode('My second attachment'), 'res_model': 'res.partner', 'res_id': self.partner_admin_id},
]
_attachments_test = [('first.txt', 'My first attachment'), ('second.txt', 'My second attachment')]
@@ -115,12 +115,20 @@ class test_message_compose(TestMailBase):
self.assertEqual(compose.subject, _subject1, 'mail.compose.message subject incorrect')
self.assertIn(_body_html1, compose.body, 'mail.compose.message body incorrect')
self.assertEqual(set(message_pids), set(partner_ids), 'mail.compose.message partner_ids incorrect')
- # Test: mail.compose.message: attachments
- # Test: mail.message: attachments
+ # Test: mail.compose.message: attachments (owner has not been modified)
for attach in compose.attachment_ids:
- self.assertEqual(attach.res_model, 'mail.group', 'mail.message attachment res_model incorrect')
- self.assertEqual(attach.res_id, self.group_pigs_id, 'mail.message attachment res_id incorrect')
- self.assertIn((attach.name, base64.b64decode(attach.datas)), _attachments_test,
+ self.assertEqual(attach.res_model, 'res.partner', 'mail.compose.message attachment res_model through templat was overriden')
+ self.assertEqual(attach.res_id, self.partner_admin_id, 'mail.compose.message attachment res_id incorrect')
+ self.assertIn((attach.datas_fname, base64.b64decode(attach.datas)), _attachments_test,
+ 'mail.message attachment name / data incorrect')
+ # Test: mail.message: attachments
+ mail_compose.send_mail(cr, uid, [compose_id])
+ group_pigs.refresh()
+ message_pigs = group_pigs.message_ids[0]
+ for attach in message_pigs.attachment_ids:
+ self.assertEqual(attach.res_model, 'mail.group', 'mail.compose.message attachment res_model through templat was overriden')
+ self.assertEqual(attach.res_id, self.group_pigs_id, 'mail.compose.message attachment res_id incorrect')
+ self.assertIn((attach.datas_fname, base64.b64decode(attach.datas)), _attachments_test,
'mail.message attachment name / data incorrect')
# ----------------------------------------
diff --git a/addons/email_template/wizard/email_template_preview.py b/addons/email_template/wizard/email_template_preview.py
index 1cfcf048691..5fee415a75e 100644
--- a/addons/email_template/wizard/email_template_preview.py
+++ b/addons/email_template/wizard/email_template_preview.py
@@ -40,7 +40,7 @@ class email_template_preview(osv.osv_memory):
email_template = self.pool.get('email.template')
template = email_template.browse(cr, uid, int(template_id), context=context)
template_object = template.model_id
- model = self.pool.get(template_object.model)
+ model = self.pool[template_object.model]
record_ids = model.search(cr, uid, [], 0, 10, 'id', context=context)
default_id = context.get('default_res_id')
@@ -69,15 +69,19 @@ class email_template_preview(osv.osv_memory):
}
def on_change_res_id(self, cr, uid, ids, res_id, context=None):
- if not res_id: return {}
- vals = {}
+ if context is None:
+ context = {'value': {}}
+ if not res_id or not context.get('template_id'):
+ return {'value': {}}
+
email_template = self.pool.get('email.template')
- template_id = context and context.get('template_id')
+ template_id = context.get('template_id')
template = email_template.browse(cr, uid, template_id, context=context)
- vals['name'] = template.name
+
+ # generate and get template values
mail_values = email_template.generate_email(cr, uid, template_id, res_id, context=context)
- for k in ('email_from','email_to','email_cc','reply_to','subject','body_html'):
- vals[k] = mail_values[k]
+ vals = dict((field, mail_values.get(field, False)) for field in ('email_from', 'email_to', 'email_cc', 'reply_to', 'subject', 'body_html', 'partner_to'))
+ vals['name'] = template.name
return {'value': vals}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/email_template/wizard/email_template_preview_view.xml b/addons/email_template/wizard/email_template_preview_view.xml
index 2d7abcb4eef..0a74f7d813e 100644
--- a/addons/email_template/wizard/email_template_preview_view.xml
+++ b/addons/email_template/wizard/email_template_preview_view.xml
@@ -7,22 +7,22 @@
<field name="model">email_template.preview</field>
<field name="arch" type="xml">
<form string="Email Preview" version="7.0">
- <div>
- <h2>Preview of <field name="name" readonly="1" class="oe_inline"/></h2>
- <field name="model_id" invisible="1"/>
- <h3>Using sample document
- <field name="res_id" on_change="on_change_res_id(res_id, context)" class="oe_inline"/>
- </h3>
- </div>
+ <field name="model_id" invisible="1"/>
+ <h2 style="color: #7c7bad;">Preview of <field name="name" readonly="1" nolabel="1" class="oe_inline"/></h2>
+ Using sample document <field name="res_id" on_change="on_change_res_id(res_id, context)" class="oe_inline"/>
<group>
- <field name="email_from" readonly="1"/>
- <field name="email_to" readonly="1"/>
- <field name="partner_to" readonly="1"/>
- <field name="email_cc" readonly="1" attrs="{'invisible':[('email_cc','=',False)]}"/>
- <field name="reply_to" readonly="1" attrs="{'invisible':[('reply_to','=',False)]}"/>
- <field name="subject" readonly="1"/>
- <field name="body_html" widget="html" readonly="1" options='{"safe": True}'/>
+ <field name="subject" readonly="1"/>
+ <field name="email_from" readonly="1"
+ attrs="{'invisible':[('email_from','=',False)]}"/>
+ <field name="email_to" readonly="1"/>
+ <field name="partner_to" readonly="1"/>
+ <field name="email_cc" readonly="1"
+ attrs="{'invisible':[('email_cc','=',False)]}"/>
+ <field name="reply_to" readonly="1"
+ attrs="{'invisible':[('reply_to','=',False)]}"/>
</group>
+ <field name="body_html" widget="html" readonly="1"
+ nolabel="1" options='{"safe": True}'/>
</form>
</field>
</record>
diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py
index 2215d0705f1..7f44828ce15 100644
--- a/addons/email_template/wizard/mail_compose_message.py
+++ b/addons/email_template/wizard/mail_compose_message.py
@@ -39,26 +39,8 @@ def _reopen(self, res_id, model):
class mail_compose_message(osv.TransientModel):
_inherit = 'mail.compose.message'
- def _get_templates(self, cr, uid, context=None):
- if context is None:
- context = {}
- model = False
- email_template_obj = self.pool.get('email.template')
- message_id = context.get('default_parent_id', context.get('message_id', context.get('active_id')))
-
- if context.get('default_composition_mode') == 'reply' and message_id:
- message_data = self.pool.get('mail.message').browse(cr, uid, message_id, context=context)
- if message_data:
- model = message_data.model
- else:
- model = context.get('default_model', context.get('active_model'))
-
- record_ids = email_template_obj.search(cr, uid, [('model', '=', model)], context=context)
- return email_template_obj.name_get(cr, uid, record_ids, context) + [(False, '')]
-
_columns = {
- # incredible hack of the day: size=-1 means we want an int db column instead of an str one
- 'template_id': fields.selection(_get_templates, 'Template', size=-1),
+ 'template_id': fields.many2one('email.template', 'Use template', select=True),
'partner_to': fields.char('To (Partner IDs)',
help="Comma-separated list of recipient partners ids (placeholders may be used here)"),
'email_to': fields.char('To (Emails)',
@@ -67,26 +49,44 @@ class mail_compose_message(osv.TransientModel):
help="Carbon copy recipients (placeholders may be used here)"),
}
+ def send_mail(self, cr, uid, ids, context=None):
+ """ Override of send_mail to duplicate attachments linked to the email.template.
+ Indeed, basic mail.compose.message wizard duplicates attachments in mass
+ mailing mode. But in 'single post' mode, attachments of an email template
+ also have to be duplicated to avoid changing their ownership. """
+ for wizard in self.browse(cr, uid, ids, context=context):
+ if not wizard.attachment_ids or wizard.composition_mode == 'mass_mail' or not wizard.template_id:
+ continue
+ template = self.pool.get('email.template').browse(cr, uid, wizard.template_id.id, context=context)
+ new_attachment_ids = []
+ for attachment in wizard.attachment_ids:
+ if attachment in template.attachment_ids:
+ new_attachment_ids.append(self.pool.get('ir.attachment').copy(cr, uid, attachment.id, {'res_model': 'mail.compose.message', 'res_id': wizard.id}, context=context))
+ else:
+ new_attachment_ids.append(attachment.id)
+ self.write(cr, uid, wizard.id, {'attachment_ids': [(6, 0, new_attachment_ids)]}, context=context)
+ return super(mail_compose_message, self).send_mail(cr, uid, ids, context=context)
+
def onchange_template_id(self, cr, uid, ids, template_id, composition_mode, model, res_id, context=None):
""" - mass_mailing: we cannot render, so return the template values
- normal mode: return rendered values """
if template_id and composition_mode == 'mass_mail':
- fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to']
+ fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids']
template_values = self.pool.get('email.template').read(cr, uid, template_id, fields, context)
values = dict((field, template_values[field]) for field in fields if template_values.get(field))
elif template_id:
- # FIXME odo: change the mail generation to avoid attachment duplication
values = self.generate_email_for_composer(cr, uid, template_id, res_id, context=context)
- # transform attachments into attachment_ids
- values['attachment_ids'] = []
+ # transform attachments into attachment_ids; not attached to the document because this will
+ # be done further in the posting process, allowing to clean database if email not send
+ values['attachment_ids'] = values.pop('attachment_ids', [])
ir_attach_obj = self.pool.get('ir.attachment')
for attach_fname, attach_datas in values.pop('attachments', []):
data_attach = {
'name': attach_fname,
'datas': attach_datas,
'datas_fname': attach_fname,
- 'res_model': model,
- 'res_id': res_id,
+ 'res_model': 'mail.compose.message',
+ 'res_id': 0,
'type': 'binary', # override default_type from context, possibly meant for another model!
}
values['attachment_ids'].append(ir_attach_obj.create(cr, uid, data_attach, context=context))
@@ -114,10 +114,13 @@ class mail_compose_message(osv.TransientModel):
'subject': record.subject or False,
'body_html': record.body or False,
'model_id': model_id or False,
- 'attachment_ids': [(6, 0, [att.id for att in record.attachment_ids])]
+ 'attachment_ids': [(6, 0, [att.id for att in record.attachment_ids])],
}
template_id = email_template.create(cr, uid, values, context=context)
- record.write(record.onchange_template_id(template_id, record.composition_mode, record.model, record.res_id)['value'])
+ # generate the saved template
+ template_values = record.onchange_template_id(template_id, record.composition_mode, record.model, record.res_id)['value']
+ template_values['template_id'] = template_id
+ record.write(template_values)
return _reopen(self, record.id, record.model)
#------------------------------------------------------
@@ -143,7 +146,7 @@ class mail_compose_message(osv.TransientModel):
mail.compose.message, transform email_cc and email_to into partner_ids """
template_values = self.pool.get('email.template').generate_email(cr, uid, template_id, res_id, context=context)
# filter template values
- fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachments']
+ fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids', 'attachments']
values = dict((field, template_values[field]) for field in fields if template_values.get(field))
values['body'] = values.pop('body_html', '')
@@ -160,9 +163,11 @@ class mail_compose_message(osv.TransientModel):
""" Override to handle templates. """
# generate the composer email
if wizard.template_id:
- values = self.generate_email_for_composer(cr, uid, wizard.template_id, res_id, context=context)
+ values = self.generate_email_for_composer(cr, uid, wizard.template_id.id, res_id, context=context)
else:
values = {}
+ # remove attachments as they should not be rendered
+ values.pop('attachment_ids', None)
# get values to return
email_dict = super(mail_compose_message, self).render_message(cr, uid, wizard, res_id, context)
# those values are not managed; they are readonly
diff --git a/addons/email_template/wizard/mail_compose_message_view.xml b/addons/email_template/wizard/mail_compose_message_view.xml
index 1b2be68a4a2..46ed49e6627 100644
--- a/addons/email_template/wizard/mail_compose_message_view.xml
+++ b/addons/email_template/wizard/mail_compose_message_view.xml
@@ -24,10 +24,11 @@
</div>
</xpath>
<xpath expr="//footer" position="inside">
- <group class="oe_right" col="1">
+ <group class="oe_right oe_form" col="1">
<div>Use template
- <field name="template_id" nolabel="1"
- on_change="onchange_template_id(template_id, composition_mode, model, res_id, context)"/>
+ <!--FIX: To avoid css issue of many2one field in footer temporary used oe_form (BUG:1152464)-->
+ <field name="template_id" nolabel="1" class='oe_inline'
+ on_change="onchange_template_id(template_id, composition_mode, model, res_id, context)" domain="[('model_id','=',context.get('default_model'))]"/>
</div>
<button icon="/email_template/static/src/img/email_template_save.png"
type="object" name="save_as_template" string="Save as new template" class="oe_link"
diff --git a/addons/event/event.py b/addons/event/event.py
index 9e50128c592..eb18afd747c 100644
--- a/addons/event/event.py
+++ b/addons/event/event.py
@@ -41,7 +41,6 @@ class event_type(osv.osv):
'default_registration_max': 0,
}
-event_type()
class event_event(osv.osv):
"""Event"""
diff --git a/addons/event/report/report_event_registration.py b/addons/event/report/report_event_registration.py
index 481b86f032c..0e33e892432 100644
--- a/addons/event/report/report_event_registration.py
+++ b/addons/event/report/report_event_registration.py
@@ -99,6 +99,5 @@ class report_event_registration(osv.osv):
)
""")
-report_event_registration()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/event/res_partner.py b/addons/event/res_partner.py
index 88249c5a7cd..fc4afa56e69 100644
--- a/addons/event/res_partner.py
+++ b/addons/event/res_partner.py
@@ -31,6 +31,5 @@ class res_partner(osv.osv):
}
-res_partner()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/event/wizard/event_confirm.py b/addons/event/wizard/event_confirm.py
index 8611a066801..5fb2cd67c87 100644
--- a/addons/event/wizard/event_confirm.py
+++ b/addons/event/wizard/event_confirm.py
@@ -32,6 +32,5 @@ class event_confirm(osv.osv_memory):
self.pool.get('event.event').do_confirm(cr, uid, context.get('event_ids', []), context=context)
return {'type': 'ir.actions.act_window_close'}
-event_confirm()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/event_moodle/event_moodle.py b/addons/event_moodle/event_moodle.py
index 5c7373d1adb..44d2de4bdd5 100644
--- a/addons/event_moodle/event_moodle.py
+++ b/addons/event_moodle/event_moodle.py
@@ -150,7 +150,6 @@ class event_moodle(osv.osv):
name_user = "moodle_" + "%d" % (response_courses,) + "%d" % (random.randint(1,999999),)
return name_user
-event_moodle()
class event_event(osv.osv):
_inherit = "event.event"
@@ -221,7 +220,6 @@ class event_event(osv.osv):
moodle_pool.moodle_enrolled(cr, uid, moodle_config_wiz_id, enrolled, context=context)
return res
-event_event()
class event_registration(osv.osv):
@@ -286,4 +284,3 @@ class event_registration(osv.osv):
'city': reg.city,
'street': reg.street}}
return res
-event_registration()
diff --git a/addons/event_moodle/i18n/cs.po b/addons/event_moodle/i18n/cs.po
new file mode 100644
index 00000000000..fd98a1df93a
--- /dev/null
+++ b/addons/event_moodle/i18n/cs.po
@@ -0,0 +1,185 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:48+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: event_moodle
+#: view:event.moodle.config.wiz:0
+msgid "Connection with username and password"
+msgstr ""
+
+#. module: event_moodle
+#: model:ir.model,name:event_moodle.model_event_moodle_config_wiz
+msgid "event.moodle.config.wiz"
+msgstr ""
+
+#. module: event_moodle
+#: help:event.moodle.config.wiz,server_moodle:0
+msgid ""
+"URL where you have your moodle server. For exemple: 'http://127.0.0.1' or "
+"'http://localhost'"
+msgstr ""
+
+#. module: event_moodle
+#: field:event.registration,moodle_user_password:0
+msgid "Password for Moodle User"
+msgstr ""
+
+#. module: event_moodle
+#: field:event.moodle.config.wiz,moodle_password:0
+msgid "Moodle Password"
+msgstr ""
+
+#. module: event_moodle
+#: code:addons/event_moodle/event_moodle.py:137
+#, python-format
+msgid "Your email '%s' is wrong."
+msgstr ""
+
+#. module: event_moodle
+#: view:event.moodle.config.wiz:0
+msgid "Connection with a Token"
+msgstr ""
+
+#. module: event_moodle
+#: view:event.moodle.config.wiz:0
+msgid ""
+"The easiest way to connect OpenERP with a moodle server is to create a "
+"'token' in Moodle. It will be used to authenticate OpenERP as a trustable "
+"application."
+msgstr ""
+
+#. module: event_moodle
+#: field:event.moodle.config.wiz,url:0
+msgid "URL to Moodle Server"
+msgstr ""
+
+#. module: event_moodle
+#: help:event.moodle.config.wiz,url:0
+msgid "The url that will be used for the connection with moodle in xml-rpc"
+msgstr ""
+
+#. module: event_moodle
+#: model:ir.model,name:event_moodle.model_event_registration
+msgid "Event Registration"
+msgstr ""
+
+#. module: event_moodle
+#: view:event.moodle.config.wiz:0
+msgid ""
+"Another approach is to create a user for OpenERP in Moodle. If you do so, "
+"make sure that this user has appropriate access rights."
+msgstr ""
+
+#. module: event_moodle
+#: field:event.registration,moodle_uid:0
+msgid "Moodle User ID"
+msgstr ""
+
+#. module: event_moodle
+#: field:event.moodle.config.wiz,server_moodle:0
+msgid "Moodle Server"
+msgstr ""
+
+#. module: event_moodle
+#: field:event.event,moodle_id:0
+msgid "Moodle ID"
+msgstr ""
+
+#. module: event_moodle
+#: view:event.moodle.config.wiz:0
+msgid "Server"
+msgstr ""
+
+#. module: event_moodle
+#: code:addons/event_moodle/event_moodle.py:57
+#: code:addons/event_moodle/event_moodle.py:105
+#: code:addons/event_moodle/event_moodle.py:137
+#, python-format
+msgid "Error!"
+msgstr ""
+
+#. module: event_moodle
+#: code:addons/event_moodle/event_moodle.py:105
+#, python-format
+msgid "You must configure your moodle connection."
+msgstr ""
+
+#. module: event_moodle
+#: field:event.moodle.config.wiz,moodle_username:0
+#: field:event.registration,moodle_username:0
+msgid "Moodle Username"
+msgstr ""
+
+#. module: event_moodle
+#: view:event.moodle.config.wiz:0
+#: model:ir.actions.act_window,name:event_moodle.configure_moodle
+msgid "Configure Moodle"
+msgstr ""
+
+#. module: event_moodle
+#: field:event.moodle.config.wiz,moodle_token:0
+msgid "Moodle Token"
+msgstr ""
+
+#. module: event_moodle
+#: help:event.moodle.config.wiz,moodle_username:0
+msgid ""
+"You can also connect with your username that you define when you create a "
+"token"
+msgstr ""
+
+#. module: event_moodle
+#: help:event.event,moodle_id:0
+msgid "The identifier of this event in Moodle"
+msgstr ""
+
+#. module: event_moodle
+#: help:event.moodle.config.wiz,moodle_token:0
+msgid "Put your token that you created in your moodle server"
+msgstr ""
+
+#. module: event_moodle
+#: model:ir.ui.menu,name:event_moodle.wizard_moodle
+msgid "Moodle Configuration"
+msgstr ""
+
+#. module: event_moodle
+#: view:event.moodle.config.wiz:0
+msgid "or"
+msgstr ""
+
+#. module: event_moodle
+#: code:addons/event_moodle/event_moodle.py:57
+#, python-format
+msgid "First configure your moodle connection."
+msgstr ""
+
+#. module: event_moodle
+#: view:event.moodle.config.wiz:0
+msgid "Apply"
+msgstr ""
+
+#. module: event_moodle
+#: view:event.moodle.config.wiz:0
+msgid "Cancel"
+msgstr ""
+
+#. module: event_moodle
+#: model:ir.model,name:event_moodle.model_event_event
+msgid "Event"
+msgstr ""
diff --git a/addons/event_sale/event_sale.py b/addons/event_sale/event_sale.py
index 4f32620e667..ec583a58cbf 100644
--- a/addons/event_sale/event_sale.py
+++ b/addons/event_sale/event_sale.py
@@ -32,7 +32,6 @@ class product(osv.osv):
def onchange_event_ok(self, cr, uid, ids, event_ok, context=None):
return {'value': {'type': event_ok and 'service' or False}}
-product()
class sale_order_line(osv.osv):
_inherit = 'sale.order.line'
diff --git a/addons/event_sale/i18n/cs.po b/addons/event_sale/i18n/cs.po
new file mode 100644
index 00000000000..69b719fbc8d
--- /dev/null
+++ b/addons/event_sale/i18n/cs.po
@@ -0,0 +1,90 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:48+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: event_sale
+#: model:ir.model,name:event_sale.model_product_product
+msgid "Product"
+msgstr ""
+
+#. module: event_sale
+#: help:product.product,event_ok:0
+msgid ""
+"Determine if a product needs to create automatically an event registration "
+"at the confirmation of a sales order line."
+msgstr ""
+
+#. module: event_sale
+#: help:sale.order.line,event_id:0
+msgid ""
+"Choose an event and it will automatically create a registration for this "
+"event."
+msgstr ""
+
+#. module: event_sale
+#: model:event.event,name:event_sale.event_technical_training
+msgid "Technical training in Grand-Rosiere"
+msgstr ""
+
+#. module: event_sale
+#: help:product.product,event_type_id:0
+msgid ""
+"Select event types so when we use this product in sales order lines, it will "
+"filter events of this type only."
+msgstr ""
+
+#. module: event_sale
+#: field:product.product,event_type_id:0
+msgid "Type of Event"
+msgstr ""
+
+#. module: event_sale
+#: field:sale.order.line,event_ok:0
+msgid "event_ok"
+msgstr ""
+
+#. module: event_sale
+#: field:product.product,event_ok:0
+msgid "Event Subscription"
+msgstr ""
+
+#. module: event_sale
+#: field:sale.order.line,event_type_id:0
+msgid "Event Type"
+msgstr ""
+
+#. module: event_sale
+#: model:product.template,name:event_sale.event_product_product_template
+msgid "Technical Training"
+msgstr ""
+
+#. module: event_sale
+#: code:addons/event_sale/event_sale.py:88
+#, python-format
+msgid "The registration %s has been created from the Sales Order %s."
+msgstr ""
+
+#. module: event_sale
+#: field:sale.order.line,event_id:0
+msgid "Event"
+msgstr ""
+
+#. module: event_sale
+#: model:ir.model,name:event_sale.model_sale_order_line
+msgid "Sales Order Line"
+msgstr ""
diff --git a/addons/fetchmail/fetchmail.py b/addons/fetchmail/fetchmail.py
index 4edba8cbe3c..cce1f77856e 100644
--- a/addons/fetchmail/fetchmail.py
+++ b/addons/fetchmail/fetchmail.py
@@ -34,7 +34,6 @@ import zipfile
import base64
from openerp import addons
-from openerp import netsvc
from openerp.osv import fields, osv
from openerp import tools
from openerp.tools.translate import _
@@ -90,7 +89,6 @@ class fetchmail_server(osv.osv):
'script': '/mail/static/scripts/openerp_mailgate.py',
}
-
def onchange_server_type(self, cr, uid, ids, server_type=False, ssl=False, object_id=False):
port = 0
values = {}
@@ -176,13 +174,14 @@ openerp_mailgate: "|/path/to/openerp-mailgate.py --host=localhost -u %(uid)d -p
def _fetch_mails(self, cr, uid, ids=False, context=None):
if not ids:
- ids = self.search(cr, uid, [('state','=','done')])
+ ids = self.search(cr, uid, [('state','=','done'),('type','in',['pop','imap'])])
return self.fetch_mail(cr, uid, ids, context=context)
def fetch_mail(self, cr, uid, ids, context=None):
"""WARNING: meant for cron usage only - will commit() after each email!"""
if context is None:
context = {}
+ context['fetchmail_cron_running'] = True
mail_thread = self.pool.get('mail.thread')
action_pool = self.pool.get('ir.actions.server')
for server in self.browse(cr, uid, ids, context=context):
@@ -241,6 +240,29 @@ openerp_mailgate: "|/path/to/openerp-mailgate.py --host=localhost -u %(uid)d -p
server.write({'date': time.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)})
return True
+ def cron_update(self, cr, uid, context=None):
+ if context is None:
+ context = {}
+ if not context.get('fetchmail_cron_running'):
+ # Enabled/Disable cron based on the number of 'done' server of type pop or imap
+ ids = self.search(cr, uid, [('state','=','done'),('type','in',['pop','imap'])])
+ try:
+ cron_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'fetchmail', 'ir_cron_mail_gateway_action')[1]
+ self.pool.get('ir.cron').write(cr, 1, [cron_id], {'active': bool(ids)})
+ except ValueError:
+ # Nevermind if default cron cannot be found
+ pass
+
+ def create(self, cr, uid, values, context=None):
+ res = super(fetchmail_server, self).create(cr, uid, values, context=context)
+ self.cron_update(cr, uid, context=context)
+ return res
+
+ def write(self, cr, uid, ids, values, context=None):
+ res = super(fetchmail_server, self).write(cr, uid, ids, values, context=context)
+ self.cron_update(cr, uid, context=context)
+ return res
+
class mail_mail(osv.osv):
_inherit = "mail.mail"
_columns = {
diff --git a/addons/fetchmail/fetchmail_data.xml b/addons/fetchmail/fetchmail_data.xml
index d77aadc12de..3f6592b340f 100644
--- a/addons/fetchmail/fetchmail_data.xml
+++ b/addons/fetchmail/fetchmail_data.xml
@@ -10,6 +10,8 @@
<field name="model">fetchmail.server</field>
<field name="function">_fetch_mails</field>
<field name="args">()</field>
+ <!-- Active flag is set on fetchmail_server.create/write -->
+ <field name="active" eval="False"/>
</record>
</data>
</openerp>
diff --git a/addons/fetchmail/i18n/cs.po b/addons/fetchmail/i18n/cs.po
new file mode 100644
index 00000000000..78e00a1f982
--- /dev/null
+++ b/addons/fetchmail/i18n/cs.po
@@ -0,0 +1,335 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-27 09:03+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-28 04:41+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: fetchmail
+#: selection:fetchmail.server,state:0
+msgid "Confirmed"
+msgstr "Potvrzeno"
+
+#. module: fetchmail
+#: field:fetchmail.server,server:0
+msgid "Server Name"
+msgstr "Název serveru"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "POP"
+msgstr "POP"
+
+#. module: fetchmail
+#: help:fetchmail.server,priority:0
+msgid "Defines the order of processing, lower values mean higher priority"
+msgstr "Určuje pořadí provádění, nižší hodnota znamená vyšší prioritu"
+
+#. module: fetchmail
+#: help:fetchmail.server,is_ssl:0
+msgid ""
+"Connections are encrypted with SSL/TLS through a dedicated port (default: "
+"IMAPS=993, POP3S=995)"
+msgstr ""
+"Přenos je zabezpečen certifikáty SSL/TSL a probíhá přes vyhrazené porty "
+"(standardně: IMAPS=993, POP3S=995)"
+
+#. module: fetchmail
+#: field:fetchmail.server,attach:0
+msgid "Keep Attachments"
+msgstr "Ponechat přílohy"
+
+#. module: fetchmail
+#: field:fetchmail.server,is_ssl:0
+msgid "SSL/TLS"
+msgstr "SSL/TLS"
+
+#. module: fetchmail
+#: help:fetchmail.server,original:0
+msgid ""
+"Whether a full original copy of each email should be kept for referenceand "
+"attached to each processed message. This will usually double the size of "
+"your message database."
+msgstr ""
+"Mají-li být zahrnuty také originály každého e-mailu u zpracovávaných zpráv. "
+"To obvykle zdvojnásí velikost databáze zpráv."
+
+#. module: fetchmail
+#: view:base.config.settings:0
+msgid "Configure the incoming email gateway"
+msgstr "Nastavení příchozí poštovní brány"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Fetch Now"
+msgstr "Zkontrolovat"
+
+#. module: fetchmail
+#: model:ir.actions.act_window,name:fetchmail.action_email_server_tree
+#: model:ir.ui.menu,name:fetchmail.menu_action_fetchmail_server_tree
+msgid "Incoming Mail Servers"
+msgstr "Servery příchozí pošty"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Server type IMAP."
+msgstr "IMAP server."
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "POP/IMAP Servers"
+msgstr "POP/IMAP servery"
+
+#. module: fetchmail
+#: selection:fetchmail.server,type:0
+msgid "Local Server"
+msgstr "Místní server"
+
+#. module: fetchmail
+#: field:fetchmail.server,state:0
+msgid "Status"
+msgstr "Stav"
+
+#. module: fetchmail
+#: model:ir.model,name:fetchmail.model_fetchmail_server
+msgid "POP/IMAP Server"
+msgstr "POP/IMAP server"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Reset Confirmation"
+msgstr "Obnovit potvrzení"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "SSL"
+msgstr "SSL"
+
+#. module: fetchmail
+#: model:ir.model,name:fetchmail.model_fetchmail_config_settings
+msgid "fetchmail.config.settings"
+msgstr "fetchmail.config.settings"
+
+#. module: fetchmail
+#: field:fetchmail.server,date:0
+msgid "Last Fetch Date"
+msgstr "Poslední kontrola pošty"
+
+#. module: fetchmail
+#: help:fetchmail.server,action_id:0
+msgid ""
+"Optional custom server action to trigger for each incoming mail, on the "
+"record that was created or updated by this mail"
+msgstr ""
+"Volitelné vlastní akce serveru pro příchozí e-mail – na záznamu, který byl "
+"vytvořen nebo aktualizován tímto e-mailem."
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "# of emails"
+msgstr "# e-mailů"
+
+#. module: fetchmail
+#: field:fetchmail.server,original:0
+msgid "Keep Original"
+msgstr "Ponechat originál"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Advanced Options"
+msgstr "Rozšířené volby"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+#: field:fetchmail.server,configuration:0
+msgid "Configuration"
+msgstr "Nastavení"
+
+#. module: fetchmail
+#: field:fetchmail.server,script:0
+msgid "Script"
+msgstr "Skript"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Incoming Mail Server"
+msgstr "Server příchozí pošty"
+
+#. module: fetchmail
+#: code:addons/fetchmail/fetchmail.py:164
+#, python-format
+msgid "Connection test failed!"
+msgstr "Tes připojení byl neúspěšný!"
+
+#. module: fetchmail
+#: field:fetchmail.server,user:0
+msgid "Username"
+msgstr "Uživatelské jméno"
+
+#. module: fetchmail
+#: help:fetchmail.server,server:0
+msgid "Hostname or IP of the mail server"
+msgstr "Název nebo IP adresa e-mail serveru"
+
+#. module: fetchmail
+#: field:fetchmail.server,name:0
+msgid "Name"
+msgstr "Název"
+
+#. module: fetchmail
+#: code:addons/fetchmail/fetchmail.py:164
+#, python-format
+msgid ""
+"Here is what we got instead:\n"
+" %s."
+msgstr ""
+"Bylo obdrženo namísto:\n"
+" %s."
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Test & Confirm"
+msgstr "Test & Potvrzení"
+
+#. module: fetchmail
+#: field:fetchmail.server,action_id:0
+msgid "Server Action"
+msgstr "Akce serveru"
+
+#. module: fetchmail
+#: field:mail.mail,fetchmail_server_id:0
+msgid "Inbound Mail Server"
+msgstr "Server příchozí pošty"
+
+#. module: fetchmail
+#: field:fetchmail.server,message_ids:0
+#: model:ir.actions.act_window,name:fetchmail.act_server_history
+msgid "Messages"
+msgstr "Zprávy"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Search Incoming Mail Servers"
+msgstr "Hledat servery příchozí pošty"
+
+#. module: fetchmail
+#: field:fetchmail.server,active:0
+msgid "Active"
+msgstr "Aktivní"
+
+#. module: fetchmail
+#: help:fetchmail.server,attach:0
+msgid ""
+"Whether attachments should be downloaded. If not enabled, incoming emails "
+"will be stripped of any attachments before being processed"
+msgstr ""
+"Mají-li být za zahrnuty také přílohy. Pokud nebude povoleno, budou příchozí "
+"e-maily zbaveny všech příloh před dalším zpracováním."
+
+#. module: fetchmail
+#: model:ir.model,name:fetchmail.model_mail_mail
+msgid "Outgoing Mails"
+msgstr "Odchozí e-maily"
+
+#. module: fetchmail
+#: field:fetchmail.server,priority:0
+msgid "Server Priority"
+msgstr "Priorita serveru"
+
+#. module: fetchmail
+#: selection:fetchmail.server,type:0
+msgid "IMAP Server"
+msgstr "IMAP server"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "IMAP"
+msgstr "IMAP"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Server type POP."
+msgstr "POP server."
+
+#. module: fetchmail
+#: field:fetchmail.server,password:0
+msgid "Password"
+msgstr "Heslo"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Actions to Perform on Incoming Mails"
+msgstr "Akce prováděné s příchozími e-maily"
+
+#. module: fetchmail
+#: field:fetchmail.server,type:0
+msgid "Server Type"
+msgstr "Druh serveru"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Login Information"
+msgstr "Přihlašovací údaje"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Server Information"
+msgstr "Údaje o serveru"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "If SSL required."
+msgstr "Je-li požádován SSL."
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Advanced"
+msgstr "Rozšířené"
+
+#. module: fetchmail
+#: view:fetchmail.server:0
+msgid "Server & Login"
+msgstr "Server & Přihlášení"
+
+#. module: fetchmail
+#: help:fetchmail.server,object_id:0
+msgid ""
+"Process each incoming mail as part of a conversation corresponding to this "
+"document type. This will create new documents for new conversations, or "
+"attach follow-up emails to the existing conversations (documents)."
+msgstr ""
+"Zpracuje každý příchozí e-mail jako součást konverzace podle druhu "
+"dokumentu. Buď se nové konverzaci se vytvoří nové dokumenty, nebo se ke "
+"stávající konverzaci připojí navazující e-maily (dokumenty)."
+
+#. module: fetchmail
+#: field:fetchmail.server,object_id:0
+msgid "Create a New Record"
+msgstr "Vytvořit nový záznam"
+
+#. module: fetchmail
+#: selection:fetchmail.server,state:0
+msgid "Not Confirmed"
+msgstr "Nepotvrzeno"
+
+#. module: fetchmail
+#: selection:fetchmail.server,type:0
+msgid "POP Server"
+msgstr "POP server"
+
+#. module: fetchmail
+#: field:fetchmail.server,port:0
+msgid "Port"
+msgstr "Port"
diff --git a/addons/fleet/i18n/nl_BE.po b/addons/fleet/i18n/nl_BE.po
new file mode 100644
index 00000000000..380de8a945e
--- /dev/null
+++ b/addons/fleet/i18n/nl_BE.po
@@ -0,0 +1,1912 @@
+# Dutch (Belgium) translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-04-15 16:40+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
+"X-Generator: Launchpad (build 16564)\n"
+
+#. module: fleet
+#: selection:fleet.vehicle,fuel_type:0
+msgid "Hybrid"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.vehicle.tag,name:fleet.vehicle_tag_compact
+msgid "Compact"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_1
+msgid "A/C Compressor Replacement"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,vin_sn:0
+msgid "Unique number written on the vehicle motor (VIN/SN number)"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.service.type,category:0
+#: view:fleet.vehicle.log.contract:0
+#: view:fleet.vehicle.log.services:0
+msgid "Service"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle.log.contract,cost_frequency:0
+msgid "Monthly"
+msgstr ""
+
+#. module: fleet
+#: code:addons/fleet/fleet.py:62
+#, python-format
+msgid "Unknown"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_20
+msgid "Engine/Drive Belt(s) Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+msgid "Vehicle costs"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle,fuel_type:0
+msgid "Diesel"
+msgstr ""
+
+#. module: fleet
+#: code:addons/fleet/fleet.py:421
+#, python-format
+msgid "License Plate: from '%s' to '%s'"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_38
+msgid "Resurface Rotors"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+#: view:fleet.vehicle.model:0
+msgid "Group By..."
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_32
+msgid "Oil Pump Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_18
+msgid "Engine Belt Inspection"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle.log.contract,cost_frequency:0
+msgid "No"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,power:0
+msgid "Power in kW of the vehicle"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_2
+msgid "Depreciation and Interests"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.contract,insurer_id:0
+#: field:fleet.vehicle.log.fuel,vendor_id:0
+#: field:fleet.vehicle.log.services,vendor_id:0
+msgid "Supplier"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_35
+msgid "Power Steering Hose Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+msgid "Odometer details"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "Has Alert(s)"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.fuel,liter:0
+msgid "Liter"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.client,name:fleet.action_fleet_menu
+msgid "Open Fleet Menu"
+msgstr ""
+
+#. module: fleet
+#: view:board.board:0
+msgid "Fuel Costs"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_9
+msgid "Battery Inspection"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+msgid "Invoice Date"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.fuel:0
+msgid "Refueling Details"
+msgstr ""
+
+#. module: fleet
+#: code:addons/fleet/fleet.py:669
+#, python-format
+msgid "%s contract(s) need(s) to be renewed and/or closed!"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+msgid "Indicative Costs"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_16
+msgid "Charging System Diagnosis"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,car_value:0
+msgid "Value of the bought vehicle"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_44
+msgid "Tie Rod End Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_24
+msgid "Head Gasket(s) Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+#: selection:fleet.vehicle.cost,cost_type:0
+msgid "Services"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,odometer:0
+#: help:fleet.vehicle.cost,odometer:0
+#: help:fleet.vehicle.cost,odometer_id:0
+msgid "Odometer measure of the vehicle at the moment of this log"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+#: field:fleet.vehicle.log.contract,notes:0
+msgid "Terms and Conditions"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.action_fleet_vehicle_kanban
+msgid "Vehicles with alerts"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.fleet_vehicle_costs_act
+#: model:ir.ui.menu,name:fleet.fleet_vehicle_costs_menu
+msgid "Vehicle Costs"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+msgid "Total Cost"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.service.type,category:0
+msgid "Both"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.contract,cost_id:0
+#: field:fleet.vehicle.log.fuel,cost_id:0
+#: field:fleet.vehicle.log.services,cost_id:0
+msgid "Automatically created field to link to parent fleet.vehicle.cost"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+msgid "Terminate Contract"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.cost,parent_id:0
+msgid "Parent cost to this current cost"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.log.contract,cost_frequency:0
+msgid "Frequency of the recuring cost"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_1
+msgid "Calculation Benefit In Kind"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.log.contract,expiration_date:0
+msgid ""
+"Date when the coverage of the contract expirates (by default, one year after "
+"begin date)"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.fuel:0
+#: field:fleet.vehicle.log.fuel,notes:0
+#: view:fleet.vehicle.log.services:0
+#: field:fleet.vehicle.log.services,notes:0
+msgid "Notes"
+msgstr ""
+
+#. module: fleet
+#: code:addons/fleet/fleet.py:47
+#, python-format
+msgid "Operation not allowed!"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: fleet
+#: model:res.groups,name:fleet.group_fleet_user
+msgid "User"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.cost,vehicle_id:0
+msgid "Vehicle concerned by this log"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.contract,cost_amount:0
+#: field:fleet.vehicle.log.fuel,cost_amount:0
+#: field:fleet.vehicle.log.services,cost_amount:0
+msgid "Amount"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_6
+msgid "Air Filter Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:ir.model,name:fleet.model_fleet_vehicle_tag
+msgid "fleet.vehicle.tag"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "show the services logs for this vehicle"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,contract_renewal_name:0
+msgid "Name of contract to renew soon"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.vehicle.tag,name:fleet.vehicle_tag_senior
+msgid "Senior"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.log.contract,state:0
+msgid "Choose wheter the contract is still valid or not"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle,transmission:0
+msgid "Automatic"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: fleet
+#: code:addons/fleet/fleet.py:414
+#, python-format
+msgid "Driver: from '%s' to '%s'"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "and"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.model.brand,image_medium:0
+msgid "Medium-sized photo"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_34
+msgid "Oxygen Sensor Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.services:0
+msgid "Service Type"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,transmission:0
+msgid "Transmission Used by the vehicle"
+msgstr ""
+
+#. module: fleet
+#: code:addons/fleet/fleet.py:740
+#: view:fleet.vehicle.log.contract:0
+#: model:ir.actions.act_window,name:fleet.act_renew_contract
+#, python-format
+msgid "Renew Contract"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "show the odometer logs for this vehicle"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,odometer_unit:0
+msgid "Unit of the odometer "
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.services:0
+msgid "Services Costs Per Month"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+msgid "Effective Costs"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_8
+msgid "Repair and maintenance"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.log.contract,purchaser_id:0
+msgid "Person to which the contract is signed for"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.fleet_vehicle_log_contract_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new contract. \n"
+" </p><p>\n"
+" Manage all your contracts (leasing, insurances, etc.) with\n"
+" their related services, costs. OpenERP will automatically "
+"warn\n"
+" you when some contracts have to be renewed.\n"
+" </p><p>\n"
+" Each contract (e.g.: leasing) may include several services\n"
+" (reparation, insurances, periodic maintenance).\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: model:ir.model,name:fleet.model_fleet_service_type
+msgid "Type of services available on a vehicle"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.fleet_vehicle_service_types_act
+#: model:ir.ui.menu,name:fleet.fleet_vehicle_service_types_menu
+msgid "Service Types"
+msgstr ""
+
+#. module: fleet
+#: view:board.board:0
+msgid "Contracts Costs"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.fleet_vehicle_log_services_act
+#: model:ir.ui.menu,name:fleet.fleet_vehicle_log_services_menu
+msgid "Vehicles Services Logs"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.fleet_vehicle_log_fuel_act
+#: model:ir.ui.menu,name:fleet.fleet_vehicle_log_fuel_menu
+msgid "Vehicles Fuel Logs"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.model.brand:0
+msgid ""
+"$('.oe_picture').load(function() { if($(this).width() > $(this).height()) { "
+"$(this).addClass('oe_employee_picture_wide') } });"
+msgstr ""
+
+#. module: fleet
+#: view:board.board:0
+msgid "Vehicles With Alerts"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.fleet_vehicle_costs_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new cost.\n"
+" </p><p>\n"
+" OpenERP helps you managing the costs for your different\n"
+" vehicles. Costs are created automatically from services,\n"
+" contracts (fixed or recurring) and fuel logs.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "show the fuel logs for this vehicle"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.contract,purchaser_id:0
+msgid "Contractor"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,license_plate:0
+msgid "License Plate"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle.log.contract,state:0
+msgid "To Close"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.contract,cost_frequency:0
+msgid "Recurring Cost Frequency"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.fuel,inv_ref:0
+#: field:fleet.vehicle.log.services,inv_ref:0
+msgid "Invoice Reference"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,location:0
+msgid "Location"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+msgid "Costs Per Month"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.contract.state,name:0
+msgid "Contract Status"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,contract_renewal_total:0
+msgid "Total of contracts due or overdue minus one"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.cost,cost_subtype_id:0
+msgid "Type"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,contract_renewal_overdue:0
+msgid "Has Contracts Overdued"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.cost,amount:0
+msgid "Total Price"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_27
+msgid "Heater Core Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_14
+msgid "Car Wash"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,driver_id:0
+msgid "Driver of the vehicle"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "other(s)"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_refueling
+msgid "Refueling"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_5
+msgid "A/C Recharge"
+msgstr ""
+
+#. module: fleet
+#: model:ir.model,name:fleet.model_fleet_vehicle_log_fuel
+msgid "Fuel log for vehicles"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "Engine Options"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.fuel:0
+msgid "Fuel Costs Per Month"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.vehicle.tag,name:fleet.vehicle_tag_sedan
+msgid "Sedan"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,seats:0
+msgid "Seats Number"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.vehicle.tag,name:fleet.vehicle_tag_convertible
+msgid "Convertible"
+msgstr ""
+
+#. module: fleet
+#: model:ir.ui.menu,name:fleet.fleet_configuration
+msgid "Configuration"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+#: field:fleet.vehicle.log.contract,sum_cost:0
+msgid "Indicative Costs Total"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.vehicle.tag,name:fleet.vehicle_tag_junior
+msgid "Junior"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,model_id:0
+msgid "Model of the vehicle"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.fleet_vehicle_state_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a vehicule status.\n"
+" </p><p>\n"
+" You can customize available status to track the evolution "
+"of\n"
+" each vehicule. Example: Active, Being Repaired, Sold.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+#: field:fleet.vehicle,log_fuel:0
+#: view:fleet.vehicle.log.fuel:0
+msgid "Fuel Logs"
+msgstr ""
+
+#. module: fleet
+#: code:addons/fleet/fleet.py:409
+#: code:addons/fleet/fleet.py:413
+#: code:addons/fleet/fleet.py:417
+#: code:addons/fleet/fleet.py:420
+#, python-format
+msgid "None"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.action_fleet_reporting_costs_non_effective
+#: model:ir.ui.menu,name:fleet.menu_fleet_reporting_indicative_costs
+msgid "Indicative Costs Analysis"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_12
+msgid "Brake Inspection"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,state_id:0
+msgid "Current state of the vehicle"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle,transmission:0
+msgid "Manual"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_52
+msgid "Wheel Bearing Replacement"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.cost,cost_subtype_id:0
+msgid "Cost type purchased with this cost"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle,fuel_type:0
+msgid "Gasoline"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.fleet_vehicle_model_brand_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new brand.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.contract,start_date:0
+msgid "Contract Start Date"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,odometer_unit:0
+msgid "Odometer Unit"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_30
+msgid "Intake Manifold Gasket Replacement"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle.log.contract,cost_frequency:0
+msgid "Daily"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_6
+msgid "Snow tires"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.cost,date:0
+msgid "Date when the cost has been executed"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+#: view:fleet.vehicle.model:0
+msgid "Vehicles costs"
+msgstr ""
+
+#. module: fleet
+#: model:ir.model,name:fleet.model_fleet_vehicle_log_services
+msgid "Services for vehicles"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+msgid "Indicative Cost"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_26
+msgid "Heater Control Valve Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+msgid ""
+"Create a new contract automatically with all the same informations except "
+"for the date that will start at the end of current contract"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle.log.contract,state:0
+msgid "Terminated"
+msgstr ""
+
+#. module: fleet
+#: model:ir.model,name:fleet.model_fleet_vehicle_cost
+msgid "Cost related to a vehicle"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_33
+msgid "Other Maintenance"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+#: field:fleet.vehicle.cost,parent_id:0
+msgid "Parent"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,state_id:0
+#: view:fleet.vehicle.state:0
+msgid "State"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.contract,cost_generated:0
+msgid "Recurring Cost Amount"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_49
+msgid "Transmission Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.fleet_vehicle_log_fuel_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new fuel log. \n"
+" </p><p>\n"
+" Here you can add refuelling entries for all vehicles. You "
+"can\n"
+" also filter logs of a particular vehicle using the search\n"
+" field.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_11
+msgid "Brake Caliper Replacement"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,odometer:0
+msgid "Last Odometer"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.fleet_vehicle_model_act
+#: model:ir.ui.menu,name:fleet.fleet_vehicle_model_menu
+msgid "Vehicle Model"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,doors:0
+msgid "Doors Number"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,acquisition_date:0
+msgid "Date when the vehicle has been bought"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.model:0
+msgid "Models"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+msgid "amount"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,fuel_type:0
+msgid "Fuel Used by the vehicle"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+msgid "Set Contract In Progress"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.cost,odometer_unit:0
+#: field:fleet.vehicle.odometer,unit:0
+msgid "Unit"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,horsepower:0
+msgid "Horsepower"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,image:0
+#: field:fleet.vehicle,image_medium:0
+#: field:fleet.vehicle,image_small:0
+#: field:fleet.vehicle.model,image:0
+#: field:fleet.vehicle.model,image_medium:0
+#: field:fleet.vehicle.model,image_small:0
+#: field:fleet.vehicle.model.brand,image:0
+msgid "Logo"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,horsepower_tax:0
+msgid "Horsepower Taxation"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,log_services:0
+#: view:fleet.vehicle.log.services:0
+msgid "Services Logs"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.model:0
+msgid "Brand"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_43
+msgid "Thermostat Replacement"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.service.type,category:0
+msgid "Category"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.action_fleet_vehicle_log_fuel_graph
+msgid "Fuel Costs by Month"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.model.brand,image:0
+msgid ""
+"This field holds the image used as logo for the brand, limited to "
+"1024x1024px."
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_11
+msgid "Management Fee"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "All vehicles"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.fuel:0
+#: view:fleet.vehicle.log.services:0
+msgid "Additional Details"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.action_fleet_vehicle_log_services_graph
+msgid "Services Costs by Month"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_9
+msgid "Assistance"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.fuel,price_per_liter:0
+msgid "Price Per Liter"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_17
+msgid "Door Window Motor/Regulator Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_46
+msgid "Tire Service"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_8
+msgid "Ball Joint Replacement"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,fuel_type:0
+msgid "Fuel Type"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_22
+msgid "Fuel Injector Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.fleet_vehicle_state_act
+#: model:ir.ui.menu,name:fleet.fleet_vehicle_state_menu
+msgid "Vehicle Status"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_50
+msgid "Water Pump Replacement"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,location:0
+msgid "Location of the vehicle (garage, ...)"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_28
+msgid "Heater Hose Replacement"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.contract,state:0
+msgid "Status"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_40
+msgid "Rotor Replacement"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.model,brand_id:0
+msgid "Brand of the vehicle"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.log.contract,start_date:0
+msgid "Date when the coverage of the contract begins"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle,fuel_type:0
+msgid "Electric"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,tag_ids:0
+msgid "Tags"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+#: field:fleet.vehicle,log_contracts:0
+msgid "Contracts"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_13
+msgid "Brake Pad(s) Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.fuel:0
+#: view:fleet.vehicle.log.services:0
+msgid "Odometer Details"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,driver_id:0
+msgid "Driver"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.model.brand,image_small:0
+msgid ""
+"Small-sized photo of the brand. It is automatically resized as a 64x64px "
+"image, with aspect ratio preserved. Use this field anywhere a small image is "
+"required."
+msgstr ""
+
+#. module: fleet
+#: view:board.board:0
+msgid "Fleet Dashboard"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.vehicle.tag,name:fleet.vehicle_tag_break
+msgid "Break"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_contract_omnium
+msgid "Omnium"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.services:0
+msgid "Services Details"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_15
+msgid "Residual value (Excluding VAT)"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_7
+msgid "Alternator Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_3
+msgid "A/C Diagnosis"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_23
+msgid "Fuel Pump Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+msgid "Activation Cost"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+msgid "Cost Type"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_4
+msgid "A/C Evaporator Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "show all the costs for this vehicle"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.odometer:0
+msgid "Odometer Values Per Month"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.fleet_vehicle_model_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new model.\n"
+" </p><p>\n"
+" You can define several models (e.g. A3, A4) for each brand "
+"(Audi).\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.fleet_vehicle_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new vehicle. \n"
+" </p><p>\n"
+" You will be able to manage your fleet by keeping track of "
+"the\n"
+" contracts, services, fixed and recurring costs, odometers "
+"and\n"
+" fuel logs associated to each vehicle.\n"
+" </p><p>\n"
+" OpenERP will warn you when services or contract have to be\n"
+" renewed.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_13
+msgid "Entry into service tax"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.contract,expiration_date:0
+msgid "Contract Expiration Date"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+msgid "Cost Subtype"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.open_board_fleet
+msgid ""
+"<div class=\"oe_empty_custom_dashboard\">\n"
+" <p>\n"
+" <b>Fleet dashboard is empty.</b>\n"
+" </p><p>\n"
+" To add your first report into this dashboard, go to any\n"
+" menu, switch to list or graph view, and click <i>'Add "
+"to\n"
+" Dashboard'</i> in the extended search options.\n"
+" </p><p>\n"
+" You can filter and group data before inserting into the\n"
+" dashboard using the search options.\n"
+" </p>\n"
+" </div>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_12
+msgid "Rent (Excluding VAT)"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle,odometer_unit:0
+msgid "Kilometers"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.fuel:0
+msgid "Vehicle Details"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.service.type,category:0
+#: field:fleet.vehicle.cost,contract_id:0
+#: selection:fleet.vehicle.cost,cost_type:0
+msgid "Contract"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.fleet_vehicle_model_brand_act
+#: model:ir.ui.menu,name:fleet.fleet_vehicle_model_brand_menu
+msgid "Model brand of Vehicle"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_10
+msgid "Battery Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+#: field:fleet.vehicle.cost,date:0
+#: field:fleet.vehicle.odometer,date:0
+msgid "Date"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.fleet_vehicle_act
+#: model:ir.ui.menu,name:fleet.fleet_vehicle_menu
+#: model:ir.ui.menu,name:fleet.fleet_vehicles
+msgid "Vehicles"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle,odometer_unit:0
+msgid "Miles"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.log.contract,cost_generated:0
+msgid ""
+"Costs paid at regular intervals, depending on the cost frequency. If the "
+"cost frequency is set to unique, the cost will be logged at the start date"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_17
+msgid "Emissions"
+msgstr ""
+
+#. module: fleet
+#: model:ir.model,name:fleet.model_fleet_vehicle_model
+msgid "Model of a vehicle"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.action_fleet_reporting_costs
+#: model:ir.actions.act_window,help:fleet.action_fleet_reporting_costs_non_effective
+msgid ""
+"<p>\n"
+" OpenERP helps you managing the costs for your different vehicles\n"
+" Costs are generally created from services and contract and appears "
+"here.\n"
+" </p>\n"
+" <p>\n"
+" Thanks to the different filters, OpenERP can only print the "
+"effective\n"
+" costs, sort them by type and by vehicle.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,car_value:0
+msgid "Car Value"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.open_board_fleet
+#: model:ir.module.category,name:fleet.module_fleet_category
+#: model:ir.ui.menu,name:fleet.menu_fleet_dashboard
+#: model:ir.ui.menu,name:fleet.menu_fleet_reporting
+#: model:ir.ui.menu,name:fleet.menu_root
+msgid "Fleet"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_14
+msgid "Total expenses (Excluding VAT)"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.cost,odometer_id:0
+msgid "Odometer"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_45
+msgid "Tire Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.service.type:0
+msgid "Service types"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.fuel,purchaser_id:0
+#: field:fleet.vehicle.log.services,purchaser_id:0
+msgid "Purchaser"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_3
+msgid "Tax roll"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.model:0
+#: field:fleet.vehicle.model,vendors:0
+msgid "Vendors"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_contract_leasing
+msgid "Leasing"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.model.brand,image_medium:0
+msgid ""
+"Medium-sized logo of the brand. It is automatically resized as a 128x128px "
+"image, with aspect ratio preserved. Use this field in form views or some "
+"kanban views."
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle.log.contract,cost_frequency:0
+msgid "Weekly"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+#: view:fleet.vehicle.odometer:0
+msgid "Odometer Logs"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,acquisition_date:0
+msgid "Acquisition Date"
+msgstr ""
+
+#. module: fleet
+#: model:ir.model,name:fleet.model_fleet_vehicle_odometer
+msgid "Odometer log for a vehicle"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.cost,cost_type:0
+msgid "Category of the cost"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_5
+#: model:fleet.service.type,name:fleet.type_service_service_7
+msgid "Summer tires"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,contract_renewal_due_soon:0
+msgid "Has Contracts to renew"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_31
+msgid "Oil Change"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.model.brand,image_small:0
+msgid "Smal-sized photo"
+msgstr ""
+
+#. module: fleet
+#: model:ir.model,name:fleet.model_fleet_vehicle_model_brand
+msgid "Brand model of the vehicle"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_51
+msgid "Wheel Alignment"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.vehicle.tag,name:fleet.vehicle_tag_purchased
+msgid "Purchased"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.fleet_vehicle_odometer_act
+msgid ""
+"<p>\n"
+" Here you can add various odometer entries for all vehicles.\n"
+" You can also show odometer value for a particular vehicle "
+"using\n"
+" the search field.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.model,brand_id:0
+#: view:fleet.vehicle.model.brand:0
+msgid "Model Brand"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "General Properties"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_21
+msgid "Exhaust Manifold Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_47
+msgid "Transmission Filter Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_10
+msgid "Replacement Vehicle"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle.log.contract,state:0
+msgid "In Progress"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle.log.contract,cost_frequency:0
+msgid "Yearly"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.model,modelname:0
+msgid "Model name"
+msgstr ""
+
+#. module: fleet
+#: view:board.board:0
+#: model:ir.actions.act_window,name:fleet.action_fleet_vehicle_costs_graph
+msgid "Costs by Month"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_18
+msgid "Touring Assistance"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,power:0
+msgid "Power (kW)"
+msgstr ""
+
+#. module: fleet
+#: code:addons/fleet/fleet.py:418
+#, python-format
+msgid "State: from '%s' to '%s'"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_2
+msgid "A/C Condenser Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_19
+msgid "Engine Coolant Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+msgid "Cost Details"
+msgstr ""
+
+#. module: fleet
+#: code:addons/fleet/fleet.py:410
+#, python-format
+msgid "Model: from '%s' to '%s'"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle.cost,cost_type:0
+msgid "Other"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+msgid "Contract details"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.vehicle.tag,name:fleet.vehicle_tag_leasing
+msgid "Employee Car"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.cost,auto_generated:0
+msgid "Automatically Generated"
+msgstr ""
+
+#. module: fleet
+#: selection:fleet.vehicle.cost,cost_type:0
+msgid "Fuel"
+msgstr ""
+
+#. module: fleet
+#: sql_constraint:fleet.vehicle.state:0
+msgid "State name already exists"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_37
+msgid "Radiator Repair"
+msgstr ""
+
+#. module: fleet
+#: model:ir.model,name:fleet.model_fleet_vehicle_log_contract
+msgid "Contract information on a vehicle"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.contract,days_left:0
+msgid "Warning Date"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_19
+msgid "Residual value in %"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "Additional Properties"
+msgstr ""
+
+#. module: fleet
+#: model:ir.model,name:fleet.model_fleet_vehicle_state
+msgid "fleet.vehicle.state"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+msgid "Contract Costs Per Month"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.fleet_vehicle_log_contract_act
+#: model:ir.ui.menu,name:fleet.fleet_vehicle_log_contract_menu
+msgid "Vehicles Contracts"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_48
+msgid "Transmission Fluid Replacement"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.model.brand,name:0
+msgid "Brand Name"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_36
+msgid "Power Steering Pump Replacement"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.cost,contract_id:0
+msgid "Contract attached to this cost"
+msgstr ""
+
+#. module: fleet
+#: code:addons/fleet/fleet.py:397
+#, python-format
+msgid "Vehicle %s has been added to the fleet!"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+#: view:fleet.vehicle.log.fuel:0
+#: view:fleet.vehicle.log.services:0
+msgid "Price"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.cost,odometer:0
+#: field:fleet.vehicle.odometer,value:0
+msgid "Odometer Value"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+#: view:fleet.vehicle.cost:0
+#: field:fleet.vehicle.cost,vehicle_id:0
+#: field:fleet.vehicle.odometer,vehicle_id:0
+msgid "Vehicle"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.cost,cost_ids:0
+#: view:fleet.vehicle.log.contract:0
+#: view:fleet.vehicle.log.services:0
+msgid "Included Services"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.action_fleet_vehicle_kanban
+msgid ""
+"<p>\n"
+" Here are displayed vehicles for which one or more contracts need "
+"to be renewed. If you see this message, then there is no contracts to "
+"renew.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_15
+msgid "Catalytic Converter Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_25
+msgid "Heater Blower Motor Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.fleet_vehicle_odometer_act
+#: model:ir.ui.menu,name:fleet.fleet_vehicle_odometer_menu
+msgid "Vehicles Odometer"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.log.contract,notes:0
+msgid "Write here all supplementary informations relative to this contract"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_29
+msgid "Ignition Coil Replacement"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_service_16
+msgid "Options"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_contract_repairing
+msgid "Repairing"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.action_fleet_reporting_costs
+#: model:ir.ui.menu,name:fleet.menu_fleet_reporting_costs
+msgid "Costs Analysis"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.log.contract,ins_ref:0
+msgid "Contract Reference"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.service.type,name:0
+#: field:fleet.vehicle,name:0
+#: field:fleet.vehicle.cost,name:0
+#: field:fleet.vehicle.log.contract,name:0
+#: field:fleet.vehicle.model,name:0
+#: field:fleet.vehicle.odometer,name:0
+#: field:fleet.vehicle.state,name:0
+#: field:fleet.vehicle.tag,name:0
+msgid "Name"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,doors:0
+msgid "Number of doors of the vehicle"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,transmission:0
+msgid "Transmission"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,vin_sn:0
+msgid "Chassis Number"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,color:0
+msgid "Color of the vehicle"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.fleet_vehicle_log_services_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new service entry. \n"
+" </p><p>\n"
+" OpenERP helps you keeping track of all the services done\n"
+" on your vehicle. Services can be of many type: occasional\n"
+" repair, fixed maintenance, etc.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,co2:0
+msgid "CO2 Emissions"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+msgid "Contract logs"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "Costs"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,name:fleet.action_fleet_vehicle_log_contract_graph
+msgid "Contracts Costs by Month"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,model_id:0
+#: view:fleet.vehicle.model:0
+msgid "Model"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_41
+msgid "Spark Plug Replacement"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: fleet
+#: model:ir.model,name:fleet.model_fleet_vehicle
+msgid "Information on a vehicle"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,co2:0
+msgid "CO2 emissions of the vehicle"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_53
+msgid "Windshield Wiper(s) Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.contract:0
+#: field:fleet.vehicle.log.contract,generated_cost_ids:0
+msgid "Generated Costs"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle.state,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: fleet
+#: field:fleet.vehicle,color:0
+msgid "Color"
+msgstr ""
+
+#. module: fleet
+#: model:ir.actions.act_window,help:fleet.fleet_vehicle_service_types_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new type of service.\n"
+" </p><p>\n"
+" Each service can used in contracts, as a standalone service "
+"or both.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: fleet
+#: view:board.board:0
+msgid "Services Costs"
+msgstr ""
+
+#. module: fleet
+#: code:addons/fleet/fleet.py:47
+#, python-format
+msgid "Emptying the odometer value of a vehicle is not allowed."
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,seats:0
+msgid "Number of seats of the vehicle"
+msgstr ""
+
+#. module: fleet
+#: model:res.groups,name:fleet.group_fleet_manager
+msgid "Manager"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.services:0
+msgid "Cost"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_39
+msgid "Rotate Tires"
+msgstr ""
+
+#. module: fleet
+#: model:fleet.service.type,name:fleet.type_service_42
+msgid "Starter Replacement"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.cost:0
+#: field:fleet.vehicle.cost,year:0
+msgid "Year"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle,license_plate:0
+msgid "License plate number of the vehicle (ie: plate number for a car)"
+msgstr ""
+
+#. module: fleet
+#: model:ir.model,name:fleet.model_fleet_contract_state
+msgid "Contains the different possible status of a leasing contract"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle:0
+msgid "show the contract for this vehicle"
+msgstr ""
+
+#. module: fleet
+#: view:fleet.vehicle.log.services:0
+msgid "Total"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.service.type,category:0
+msgid ""
+"Choose wheter the service refer to contracts, vehicle services or both"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.cost,cost_type:0
+msgid "For internal purpose only"
+msgstr ""
+
+#. module: fleet
+#: help:fleet.vehicle.state,sequence:0
+msgid "Used to order the note stages"
+msgstr ""
diff --git a/addons/google_base_account/google_base_account.py b/addons/google_base_account/google_base_account.py
index 46b1757a7b3..06e5643344c 100644
--- a/addons/google_base_account/google_base_account.py
+++ b/addons/google_base_account/google_base_account.py
@@ -27,7 +27,6 @@ class res_users(osv.osv):
'gmail_user': fields.char('Username', size=64,),
'gmail_password': fields.char('Password', size=64),
}
-res_users()
# vim:expandtab:smartindent:toabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/google_base_account/i18n/cs.po b/addons/google_base_account/i18n/cs.po
new file mode 100644
index 00000000000..48287b5c484
--- /dev/null
+++ b/addons/google_base_account/i18n/cs.po
@@ -0,0 +1,109 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:49+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: google_base_account
+#: field:res.users,gmail_user:0
+msgid "Username"
+msgstr ""
+
+#. module: google_base_account
+#: model:ir.actions.act_window,name:google_base_account.act_google_login_form
+msgid "Google Login"
+msgstr ""
+
+#. module: google_base_account
+#: code:addons/google_base_account/wizard/google_login.py:29
+#, python-format
+msgid "Google Contacts Import Error!"
+msgstr ""
+
+#. module: google_base_account
+#: model:ir.model,name:google_base_account.model_res_users
+msgid "Users"
+msgstr ""
+
+#. module: google_base_account
+#: view:google.login:0
+msgid "or"
+msgstr ""
+
+#. module: google_base_account
+#: view:google.login:0
+msgid "Google login"
+msgstr ""
+
+#. module: google_base_account
+#: field:google.login,password:0
+msgid "Google Password"
+msgstr ""
+
+#. module: google_base_account
+#: code:addons/google_base_account/wizard/google_login.py:77
+#, python-format
+msgid "Error!"
+msgstr ""
+
+#. module: google_base_account
+#: view:res.users:0
+msgid "Google Account"
+msgstr ""
+
+#. module: google_base_account
+#: view:res.users:0
+msgid "Synchronization"
+msgstr ""
+
+#. module: google_base_account
+#: code:addons/google_base_account/wizard/google_login.py:77
+#, python-format
+msgid "Authentication failed. Check the user and password."
+msgstr ""
+
+#. module: google_base_account
+#: code:addons/google_base_account/wizard/google_login.py:29
+#, python-format
+msgid ""
+"Please install gdata-python-client from http://code.google.com/p/gdata-"
+"python-client/downloads/list"
+msgstr ""
+
+#. module: google_base_account
+#: model:ir.model,name:google_base_account.model_google_login
+msgid "Google Contact"
+msgstr ""
+
+#. module: google_base_account
+#: view:google.login:0
+msgid "Cancel"
+msgstr ""
+
+#. module: google_base_account
+#: field:google.login,user:0
+msgid "Google Username"
+msgstr ""
+
+#. module: google_base_account
+#: field:res.users,gmail_password:0
+msgid "Password"
+msgstr ""
+
+#. module: google_base_account
+#: view:google.login:0
+msgid "_Login"
+msgstr ""
diff --git a/addons/google_base_account/wizard/google_login.py b/addons/google_base_account/wizard/google_login.py
index f4464976aee..1771d99b51e 100644
--- a/addons/google_base_account/wizard/google_login.py
+++ b/addons/google_base_account/wizard/google_login.py
@@ -81,6 +81,5 @@ class google_login(osv.osv_memory):
def _get_next_action(self, cr, uid, context=None):
return {'type': 'ir.actions.act_window_close'}
-google_login()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/google_docs/google_docs.py b/addons/google_docs/google_docs.py
index 824a9ddf06b..138d7afe44f 100644
--- a/addons/google_docs/google_docs.py
+++ b/addons/google_docs/google_docs.py
@@ -233,7 +233,6 @@ class config(osv.osv):
_defaults = {
'name_template': '%(name)s_%(model)s_%(filter)s_gdrive',
}
-
def _check_model_id(self, cr, uid, ids, context=None):
config_id = self.browse(cr, uid, ids[0], context=context)
if config_id.filter_id.id and config_id.model_id != config_id.filter_id.model_id:
diff --git a/addons/google_docs/i18n/cs.po b/addons/google_docs/i18n/cs.po
new file mode 100644
index 00000000000..38cda3eccca
--- /dev/null
+++ b/addons/google_docs/i18n/cs.po
@@ -0,0 +1,188 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:49+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: google_docs
+#: code:addons/google_docs/google_docs.py:167
+#, python-format
+msgid "Key Error!"
+msgstr ""
+
+#. module: google_docs
+#: view:google.docs.config:0
+msgid ""
+"for a presentation (slide show) document with url like "
+"`https://docs.google.com/a/openerp.com/presentation/d/123456789/edit#slide=id"
+".p`, the ID is `presentation:123456789`"
+msgstr ""
+
+#. module: google_docs
+#: view:google.docs.config:0
+msgid ""
+"for a text document with url like "
+"`https://docs.google.com/a/openerp.com/document/d/123456789/edit`, the ID is "
+"`document:123456789`"
+msgstr ""
+
+#. module: google_docs
+#: field:google.docs.config,gdocs_resource_id:0
+msgid "Google Resource ID to Use as Template"
+msgstr ""
+
+#. module: google_docs
+#: view:google.docs.config:0
+msgid ""
+"for a drawing document with url like "
+"`https://docs.google.com/a/openerp.com/drawings/d/123456789/edit`, the ID is "
+"`drawings:123456789`"
+msgstr ""
+
+#. module: google_docs
+#. openerp-web
+#: code:addons/google_docs/static/src/xml/gdocs.xml:6
+#, python-format
+msgid "Add Google Doc..."
+msgstr ""
+
+#. module: google_docs
+#: view:google.docs.config:0
+msgid ""
+"This is the id of the template document, on google side. You can find it "
+"thanks to its URL:"
+msgstr ""
+
+#. module: google_docs
+#: model:ir.model,name:google_docs.model_google_docs_config
+msgid "Google Docs templates config"
+msgstr ""
+
+#. module: google_docs
+#. openerp-web
+#: code:addons/google_docs/static/src/js/gdocs.js:25
+#, python-format
+msgid ""
+"The user google credentials are not set yet. Contact your administrator for "
+"help."
+msgstr ""
+
+#. module: google_docs
+#: view:google.docs.config:0
+msgid ""
+"for a spreadsheet document with url like "
+"`https://docs.google.com/a/openerp.com/spreadsheet/ccc?key=123456789#gid=0`, "
+"the ID is `spreadsheet:123456789`"
+msgstr ""
+
+#. module: google_docs
+#: code:addons/google_docs/google_docs.py:129
+#, python-format
+msgid ""
+"Your resource id is not correct. You can find the id in the google docs URL."
+msgstr ""
+
+#. module: google_docs
+#: code:addons/google_docs/google_docs.py:153
+#, python-format
+msgid "Creating google docs may only be done by one at a time."
+msgstr ""
+
+#. module: google_docs
+#: code:addons/google_docs/google_docs.py:83
+#: code:addons/google_docs/google_docs.py:129
+#: code:addons/google_docs/google_docs.py:153
+#, python-format
+msgid "Google Docs Error!"
+msgstr ""
+
+#. module: google_docs
+#: code:addons/google_docs/google_docs.py:83
+#, python-format
+msgid "Check your google configuration in Users/Users/Synchronization tab."
+msgstr ""
+
+#. module: google_docs
+#: model:ir.ui.menu,name:google_docs.menu_gdocs_config
+msgid "Google Docs configuration"
+msgstr ""
+
+#. module: google_docs
+#: model:ir.actions.act_window,name:google_docs.action_google_docs_users_config
+#: model:ir.ui.menu,name:google_docs.menu_gdocs_model_config
+msgid "Models configuration"
+msgstr ""
+
+#. module: google_docs
+#: field:google.docs.config,model_id:0
+msgid "Model"
+msgstr ""
+
+#. module: google_docs
+#. openerp-web
+#: code:addons/google_docs/static/src/js/gdocs.js:28
+#, python-format
+msgid "User Google credentials are not yet set."
+msgstr ""
+
+#. module: google_docs
+#: code:addons/google_docs/google_docs.py:167
+#, python-format
+msgid "Your Google Doc Name Pattern's key does not found in object."
+msgstr ""
+
+#. module: google_docs
+#: help:google.docs.config,name_template:0
+msgid ""
+"Choose how the new google docs will be named, on google side. Eg. "
+"gdoc_%(field_name)s"
+msgstr ""
+
+#. module: google_docs
+#: view:google.docs.config:0
+msgid "Google Docs Configuration"
+msgstr ""
+
+#. module: google_docs
+#: help:google.docs.config,gdocs_resource_id:0
+msgid ""
+"\n"
+"This is the id of the template document, on google side. You can find it "
+"thanks to its URL: \n"
+"*for a text document with url like "
+"`https://docs.google.com/a/openerp.com/document/d/123456789/edit`, the ID is "
+"`document:123456789`\n"
+"*for a spreadsheet document with url like "
+"`https://docs.google.com/a/openerp.com/spreadsheet/ccc?key=123456789#gid=0`, "
+"the ID is `spreadsheet:123456789`\n"
+"*for a presentation (slide show) document with url like "
+"`https://docs.google.com/a/openerp.com/presentation/d/123456789/edit#slide=id"
+".p`, the ID is `presentation:123456789`\n"
+"*for a drawing document with url like "
+"`https://docs.google.com/a/openerp.com/drawings/d/123456789/edit`, the ID is "
+"`drawings:123456789`\n"
+"...\n"
+msgstr ""
+
+#. module: google_docs
+#: model:ir.model,name:google_docs.model_ir_attachment
+msgid "ir.attachment"
+msgstr ""
+
+#. module: google_docs
+#: field:google.docs.config,name_template:0
+msgid "Google Doc Name Pattern"
+msgstr ""
diff --git a/addons/hr/hr.py b/addons/hr/hr.py
index 467f34f708b..585e5ce81a4 100644
--- a/addons/hr/hr.py
+++ b/addons/hr/hr.py
@@ -19,10 +19,12 @@
#
##############################################################################
-from openerp import addons
import logging
+
+from openerp.modules.module import get_module_resource
from openerp.osv import fields, osv
from openerp import tools
+
_logger = logging.getLogger(__name__)
class hr_employee_category(osv.osv):
@@ -67,7 +69,6 @@ class hr_employee_category(osv.osv):
(_check_recursion, 'Error! You cannot create recursive Categories.', ['parent_id'])
]
-hr_employee_category()
class hr_job(osv.osv):
@@ -144,7 +145,6 @@ class hr_job(osv.osv):
self.write(cr, uid, ids, {'state': 'open', 'no_of_recruitment': 0})
return True
-hr_job()
class hr_employee(osv.osv):
_name = "hr.employee"
@@ -221,7 +221,7 @@ class hr_employee(osv.osv):
(model, mail_group_id) = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'mail', 'group_all_employees')
employee = self.browse(cr, uid, employee_id, context=context)
self.pool.get('mail.group').message_post(cr, uid, [mail_group_id],
- body='Welcome to %s! Please help them take the first steps with OpenERP!' % (employee.name),
+ body='Welcome to %s! Please help him/her take the first steps with OpenERP!' % (employee.name),
subtype='mail.mt_comment', context=context)
except:
pass # group deleted: do not push a message
@@ -261,7 +261,7 @@ class hr_employee(osv.osv):
return {'value': {'work_email' : work_email}}
def _get_default_image(self, cr, uid, context=None):
- image_path = addons.get_module_resource('hr', 'static/src/img', 'default_image.png')
+ image_path = get_module_resource('hr', 'static/src/img', 'default_image.png')
return tools.image_resize_image_big(open(image_path, 'rb').read().encode('base64'))
_defaults = {
@@ -284,7 +284,6 @@ class hr_employee(osv.osv):
(_check_recursion, 'Error! You cannot create recursive hierarchy of Employee(s).', ['parent_id']),
]
-hr_employee()
class hr_department(osv.osv):
_description = "Department"
@@ -326,7 +325,6 @@ class res_users(osv.osv):
'employee_ids': fields.one2many('hr.employee', 'user_id', 'Related employees'),
}
-res_users()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr/hr_demo.xml b/addons/hr/hr_demo.xml
index 3f34a703475..641d5b272cf 100644
--- a/addons/hr/hr_demo.xml
+++ b/addons/hr/hr_demo.xml
@@ -235,5 +235,99 @@
<field name="image">/9j/4AAQSkZJRgABAQEASABIAAD/4gv4SUNDX1BST0ZJTEUAAQEAAAvoAAAAAAIAAABtbnRyUkdCIFhZWiAH2QADABsAFQAkAB9hY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA9tYAAQAAAADTLQAAAAAp+D3er/JVrnhC+uTKgzkNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBkZXNjAAABRAAAAHliWFlaAAABwAAAABRiVFJDAAAB1AAACAxkbWRkAAAJ4AAAAIhnWFlaAAAKaAAAABRnVFJDAAAB1AAACAxsdW1pAAAKfAAAABRtZWFzAAAKkAAAACRia3B0AAAKtAAAABRyWFlaAAAKyAAAABRyVFJDAAAB1AAACAx0ZWNoAAAK3AAAAAx2dWVkAAAK6AAAAId3dHB0AAALcAAAABRjcHJ0AAALhAAAADdjaGFkAAALvAAAACxkZXNjAAAAAAAAAB9zUkdCIElFQzYxOTY2LTItMSBibGFjayBzY2FsZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAACSgAAAPhAAAts9jdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//2Rlc2MAAAAAAAAALklFQyA2MTk2Ni0yLTEgRGVmYXVsdCBSR0IgQ29sb3VyIFNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAAAABQAAAAAAAAbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWFlaIAAAAAAAAAMWAAADMwAAAqRYWVogAAAAAAAAb6IAADj1AAADkHNpZyAAAAAAQ1JUIGRlc2MAAAAAAAAALVJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUMgNjE5NjYtMi0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLXRleHQAAAAAQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSwgMjAwOQAAc2YzMgAAAAAAAQxEAAAF3///8yYAAAeUAAD9j///+6H///2iAAAD2wAAwHX/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCACWAMgDASIAAhEBAxEB/8QAHQAAAQUBAQEBAAAAAAAAAAAABQAEBgcIAwIBCf/EAEcQAAIBAwIDBQQGBgYKAwEAAAECAwAEEQUhBhIxBxNBUWEicYHBFDJCkaGxCCMkUnLRFTNTYnPhFiU0VGOCkrLw8TZDosL/xAAZAQADAQEBAAAAAAAAAAAAAAABAwQCAAX/xAAqEQACAgICAgEDAgcAAAAAAAAAAQIRAyESMQRBEyJRYRSBIzJxkdHw8f/aAAwDAQACEQMRAD8AiVmskWGRip8wcUSF0ZUEd5bwXaAggSoDgjx99P5NFuol3hJA8V3rh9DZTgqQfdTxK+6OGpadpOsFnuJLu2lbGSJCybdNum3nQu74Nv3mmuLKW3vw6N7XMO8Y42yCAPeRv49aOi3I8K9ojoeZSQfMUKTOPXD1tdR6WkV3DNDJGxXklYswHhueoookOfCuNvqF3GOV2EqeUgzT2G/snP66F4G/eT2h91cce4IfSnLRDuXH901y0+2jd8rfpdZP8LfdRk2Uf0cNzpzMSpTfmHqfQ/Kus5ETePfYVGu0sNDwTfug39gfe4qa3tuI7pUQD2jjFRXtbi7rgmceLTRA46/Wz8qD2mFaaK34O1F7qa100W5Z8H2gfLJ6VPEsmwNiKrXhV3XibTpLb9UTexgcjEbFxkZ69DWiJdPt5SSU5T5rtS8dtMt8zHHH8bj7in++yBiwIORkHzrr9Bu2jLKhZVGSx2x8elTVbC3hUExKW8yc1zlHMcYHL5U3hfZFzroqzi3VF4f00Xd5bSPzSBAqkA753391NtE1XS9YhL2NyHkxl422dfh/Kl2/Rn+gogNv2lPyaqVglntpVljZ0dTlXQkEUhyplEVasvaWGvEMOZQMeNQPh3j25iCQ6uhuounfIMSD3jofzqwNGvrHU1WexuEmTO+Oq+hHUVqMkzMotHV4ceFcmiPlRJ0BNeDFTaMWDTEPKvDRelEjEKYavK9pbd4iBjzAb9KD0EbtCMdK4yRALv8AjQm81ecZ57lYh5AAUGu9WgJPPO8p+JpfyB4h68mtUB5pkz5A5/KlUQn1ZNxHCfiaVZ5sPE1lEMJk16MEUoxJGre8V5jxy10U71QTIbnR7SUZUFD6GuEnD79Y5Fb37UXhIA6V2jffFAJF5dHuo8kwkgeI3prJaMp3Uj31OYH38Otd3jhlAEkSNnzFcc2Vw9qwOVyDXeC+1G2wFmZlH2X9ofjU2m0fT5eiGM/3TTa54biETSRz7DwZa45Mj8N7HNIklzalXU5DRN8jUb7Xmt5eDgEugiG7i7zmBDKN98eNTyDS7WHeTMjD4Cof21RJJwYYo7Yle+DHu0+qAD7Rx0Az1O1FqkFO2VXw9p96L7R76OxuHsVvE5ZxFlT+sGckeVX20saD23VBnqTiqh4Lvb+20rNjcSWyGV8RofZG/kdqOvr93uL2zhuM7F1zG/3ilxXEpz5nmUU1XFUT6Zw24II8wa48uWqH6TfWYaV4Hvbd3G/eNzgH3j51KLTULaUKqyDO2/maapImcWVd2/LjSLcedyv/AGtVKlCDjGauvt8P+rrRT/vP/wDBqn+X2l2FST2yqLaSGXdqTt7LelGOBpZ4uLdOSORkLTqrFTjmU+Bpi6KS+3TFPuCATxppYH9svzrK7NXaZeKDIyaRXNek2Fes4qsmORQUK4jT9g6fbFGA++OU0M4jH7Af4xQl0zl2VjxMuLvI68maBE53JqQ8VDE7HyiqKtJUvbKUkkdWYD1pU3aQ+JpV1B5GuoOLbrA+l6dazjxIyp+dPYeJdGlP6+wuYD5owYCnUnD2nOoKvInxBplLwyhz3Vyh/iXFWWyFRiErfUdCmGItT7onwmQrT6KASjNtdW048OSQVF5uGbxRlBG/uamk2h6hCc/RpR5FR/KhYa/JNVguYjl4mHr1FATqd9JqU6d68USuVReXGw2zvQWOfWrM4juruLHgWOPuNOE4n1uPCzGG5XyliB/EVykgOLJNbzTFRmVz8acXc7jKCSQLgbE1F4+K484udHjB8WhkK/gacHXtInTLve2pP7yBwPurXJGOEharqc1qOdTzDP1WHWgPanHd32gQxWgJmLlgqvjYDOPX3U9vILfUHQW+vWRQkcyyAq2PTO1Cu05XuLOztLYhpy5dJIpfqYHXb0yKzJ6bNxi7ojFjxPZabwXbfSkhmvSzbyDmYKMBQBsTtgDwAFDV1ziPULFJ7Th6zIbJ5+8bcD+6eho32ZcK2Wo6y3Kn0q5jwJJCP1aH91R4n31orhns809EV5tOhd8D2nGalllosx4HLZk/WIOLbm2jntrGa2kZvZMLk+zy+Xnk1OOEOKAtpa2WtWaWd/8A1fetHyrNjxz4E+NaZuOB9JZGA062BYbnuxVQdqfZfLb2015pcLSIAS9sd1YePL5GhHPTNy8a1plM9vDhrOywcjvyf/xVTZBdanHaD/SI0y2sr0FlhctFKftxkYA94qAsG5gFz7jXN2zlDR1b7f8A54U+4F/+aaWf+MvzoS7sudtvSi/A2/GWm4/tgfwND2gcaTLvQ7CvYrip2G9eubeqyU+n61DOIz+wH+MUSJoXxIf2D/nFdLo5dlb8Wf1j/wCD/OocTipjxX9Z/wDC/nUNbrUa7ZVLpHhiaVI0qNmTbgncAb5r0tyd6a8wwN6Q6HfxqsjQSS7O21dBdrkbmh67qtMOI7uex0a7ubZQ1xHCzRKVzzNjbbx91BulYUrJHHdIeuD765SJYzH9ZbQN55QVRUfG3aA8n6u0BXO2bHH51IdM4h45eLvLnT4wPS3/AJGkPyYIevGm/aLNbSNIlODaqv8ACxFfLvhrSPohde9ByNsg1Vt3x9xPYyYk0iGQDzikX8qazdtF4kfc3fDwHmUnYfgVox8jHIL8XKv+liT6XpNupIthKR++xIqCzNBdX2oLAkcTDEKBRgZOSaZWva7ol4e5uLO9tnf2QTyuoJ28Dn8KZ8GXi3HGEILKySSPIATsfDNHJNNaOhCSezQPYTwxBpGkRKY0aUjmlfH1mO5P5Vd1lGO7AAGw2qCcCQWcOmNe6nMsFouyBn5QfUn5VL9M1HRbgyXWlXEUgjH6wRk4x/540hLdlTdKkF+6yNx76EavDbTQsjNGc7HJHXyooNQhkjQKwPedN/OgurcUaPpshsriCboWJFuSnKOrZA6etHimjEZSj2ZZ/SY4Wisrf6dawr3UkntAfYc+I99ZlvUaKVcjAbcHzr9Au1Ph7T9f4Su5IF76wvoO8ixvyNjIK+Xgawbqi9289nIodoZCC3iOozQ9GnqWgHLJ7RFGOBphHxZZTFWYRuWblGTgKaAP/W49asnsSsLWWTWL+6ClYVSIZ64YknH3CtLbR03UWHzrN1dXCRxRSxxvsOXAOffXQPrMZLJKeUfZc5yPjUzXStLiKGJAZFyzZOyjwxTfUbW3W3EoYA+pxQnkmmM8fDjnG5IG6fdfSIwfHofQ+INNeJD/AKv/AOcVxsy0WrZQERTKQ3lkdPnXviNv2D3uKojLlC2R5sfx5OJXXFZGX/wv51DmzgMNhUu4tbHe+fdfzqFRux26ip49sZLpHU9KVfCaVEFG0IGs1hRJL+WRlGC7wFS3rgDFc4Y1UNnXYmJbK81vjA8q8h8gbnpXQE8nxqpqyRDyH6OI1X6fbs2NznGaa67pz6hBEltfWilebJMmOo8K6QEdwmRnau0YXO6qfeKzKKaphi6dojl1wvczxFBHp7sVxzi5bOfPrjNJeGdTNjJA8hV2Qp3kMwyAdgR61JeSP+zTP8Ipd3Cf/qT/AKaVLDFjY5ZIrqXgLiWPe34l1gbfb5JPnTKbhDjeIEf0406+U1grfOrUighJwY1r1dW8AQcilTnflcj51n4EMXkzKB4u0LiLTNLlu76LSXRftfQCjfAjxplwjcCDtDsLMkLgJH16HkB+/OatPtMRJdOisiryLLKoKlzvvVO8K2N5N2jQCCN5JzMzRYJHt749+cYA8SRWOKhKhqm8kbN5afpFjq2macLpZClqVljVMY5wNiQdjj1otd6fBpmj3As4XXmDOSx8T1PvoL2XXq3ug2k5By8anB6ipfrbJNaLEQAvONsda5aQ5xXNAqKMwWNo7gqvs5Y9BtRSTT4ZYxLJaW0hG6vy52+FeYYLs2QSeVWiXdcdT5DFPLCQLCEjB9nYg+Iro6M5He0RviC0hTSJbeKCOFCpCqi4A+Ffn92m8NXej8TandDka0lvpYk5XyynAkAI8Mg7eeDX6HcWZ+hScq4PKfyrI/6RlnpI1fh2xsFc394izXQHQlgFTbz2bHoaPSdB4ppMzJIuLjH96pv2UXTQXd4ruTA0sZZPM71EdShMOqtE6lSrlWB8CDgj76sHsW4cXULi8vLxGjjICwN9UnxLDz8BRSbdIXyUaf5LHhkzkLgZHMCDnY9K+66hFiSsjKCBkrsRv867PoV5Zsz2579cDps33VwvZlnhELMI3U+0D1HpvSmpJ7PQxyxyX0gqX29VhlxyoY2CqMDcY8Pcaa8SHFiP4xXywRpNYubkuzKqhBnz/wDVLiT/AGJf8Qfkaqgqxnl+XXzOit+LOsv+HUTXvYlCNFyCUBwzLuRvgj0qWcVkBpSRsI+lRJtsMpx6VjHjck2jGSaVL8HrmBOPGlXlCMdBnxpVk62bA0m+tNStFubKYSxHbmAx+FEOU8tUzpmsXeiXifRx9FZD9HukxlefP1iDtv5/zq2eHNVh1ew71cLMm0seeh8x6Hwpnj51mjfsHleNLx5Ux/agmJPLFOo1PX0pW0B7hMD7Ip7DbswzjwpxNY3jQs2wr2kLhtxTpgkDKIypYfWyetdBzNymQKNsDBrmjrBkk0Fu4FxPHDzdOdsZr6txaTSFRdxkKux5gPa+NeNdhUSEsoII8Rmqp4qs5p+JJoUW5ghIBWWJQQDyjbz3O1Tzlki1xVj8UMc3UpcfySHjy7tDqdhEtxG5FyqsoYEj2gOlBjdaVw9dS3tnDi9AzHMTumPqkeWDVcWdtq2kaq7X8FzA8j4QyAhs+e9P769a/JljbmwvLj76nnkfyK1Rc8EYxcYyujYX6Pus2er8IWN1G4J9sMCMHPMcjHvzU+4nguO/t5oHkeFPrwI3KX8vaxmsocC9oumcD2nDJs7C6SxubRzqKqOcpIsjK0vm26knYYGPKtP8K8VaTxJaRTWN5BcxyIGjZHBDCmSVAhO2pfYMWqmS2HLp1yTj6stwcVy0q0ni1LvpmEQ5cd3ETyfEHqaMWjSNGQuBjzplqNwtrbvJIVU5wN6MujudtxGXGFwkdhO7EBQh/KsNcfa3dXvbFG2pQRwGxuoogo2UpGAFO/XIwc+taR7cOI9aueE7u04XBlvXUqHQczL58o8TWUO1ttRbju4u7shZTFbMExy8gMKNgL4dTQf8r+5naaXoHWuh/wCkPaBLMIVa2Sd5JQBhWbnOB8cAn/Ort03Sbe2UMEjDcuMKCAPhVIaLxVquiZFnHZuCxY95ESSScnJBq3OzHjm24mZ9Pu4lstRReYIr+zKPErnfI8jVOKNJWTTmpS0HkkaH2GGUXcjO4H8qF8TWVtdIjSYkTAbmX6y+nrUsu7VXi9ok48SMmgV5Z4QgYZMnYeH+XpTTCb9ETuEhiYi3IaNcDCjHLQfiQ/saesg/I1JLu1EV4bhQeRj7XpTDWtLW7BCOVz7QA86ElapArZUfFx3n/wAMVFbiSJ7dJMFJgeUhVATlAGD1zzHfNT3i/QNXzP3VlJMCmxj3ziq/lgmjlEEsLxykjaQFT+NSqNdjnNaX4PjMqAgEuxwVI2HrmlXyUckhTcEbYP49KVdoW21ovK6hW6svpYh7/uv1d2pHtyQnYN13ZcYPqo8676Bq0+h6v3LOxeNQVdvqTxHofiOvkRUq0ng3itbiad7aDnmYly/IobKBcEDboB91PE7LtZurmCe4urZTCMJuWK75wPStLEozk4rt3/v7f2NxzN4I457a1f4/yiZaPrekSadC5eUsVGQI+h8qdT8QabDaTPGkpYIcZAHzodpXAF1BAsL6iSF/dSii8Bwd2VuLi4ZGGGzhRinNsn0QLiHio6dIizappM5kjDMttIZWjJGeQnGObz/9VHr/ALQLpw0dnqAiXxbPJnbwyKsqTgTs407H0xNNUrt+uuQT92aSHsz07/ZbbT5GH+72RkP38vzpT5/c9SGbwIxX8Nt/1RDeGeJJNSZ7OXUzdRW/KRMEdicnPLk7miGp3um2bTXmoNJDY8oDSSREKp+PWpNJxdokC8tjod9KB0xEkS/iflVRduuv3esT6fFLYmxtI0dhGZufnbP1jgAbDamY5uJ53kcMs3KKpfYjfHXEtvrOrudMMUkK8wV0hKFs+YPXalw1Yd9pqsYzEZJXVSw2OCQfhkYoXBNpMHCDqXC6gZFmhUDJdicb+QC/jUy7OIu80try/wCd4LVQRzDbJIA/M1BnfOTkXYF8cFE98XRLpvA2lz4UMk01s5Az7ErlsH3HNaC4N4ZtW4dtW093gu7SNFS5gbkd15AVJxsTggb+VUnr8VvrENzowmia1SL6SDzb82CVx57nceWa0d2eadc6Np+nrc5aOfT4ObbowXH5EUFN2kb4UmwnpGtcQwRLDcSW95y7B2Uxv8QMg/hXjiBr+9hLXU+BjaNNgKN3NlCJO8C7HxFMtREYhx1JGMmnXoxdkMMItrnTERcc7NnHgMVRH6U+ifQ+JNI1kRgC7sjbu2PtwsVH3oU/GtIWtk13q9scZWBdvjUP/Su4ejuuyw3/ACjvtNuo5QcdFf2G/MfdRxP6zGfcTGz4yT51702+l0zVbW/tn5ZYJVkBHod/wyK+SLsRjpTK4OFPuqwgNc20nPGFlXDMMq3nnpTa5tYy/N3Tq5GDynrXrQZRJpdrHMPbEEYYHz5RRYIjpysAwx41tdDCE6nFEju5f2QPbUqQR61DNY1WzeeKxgjuhLIeWGVYWwcb7Y3NW/d2yEboGIGxIyQKiOpW09hqC6hpkUKXNsxaDnQlemGGxHUEj0rM1KtGotJ2Rc2epGEK7cyAbFW+sPU0C4m0az1aya1nhdZQPYY+0UbwZT1946GpnZXstxB3t+8BupWZphFtGhY5CjPgM/GoxxdfQ6ck1zI3dRow5WLA5PmK6lWwXbKH1KJoL+aAgqYpGT2lwdj5eFKuvEOpDUtbur5UKiWTmApUigO2zap4x1KTa20uwT+KV5D+AFdI9X4wutoDHCD/AGNj83Jpxas4ABuTGP8AhxqtPlezUAz3Ttnb2pjv8BTOL+4vkgU9pxbcD9q1i+jU9QbhIR9y4pv/AKLJcNm91ITt4hppJjUntzaq2YrLmPmY/m1PkuJQPZijjHq/yFdxByItb8H6ZFjEMzn+5bhPxaiUHDlkoHLZZ/xZ/koo5EWcMZSpO2OUYrgVy2C00mRnHeYH4V3FHcmMhpVvBv3dlCPSLJ+9jVKfpOxRqdHaKbvMwzqcAADdfIVezwqpBWOJD54yaoX9Km/iaTR9KSRmuVWWVtsAIeUY+8V1HJ2Ufpv0Z7mAXRlVFKg8u4A9R41P0vr/AE7QIdMSe3W2un72ZYn5zhOjnG6g9MHxqC2FuxkBPXqakWn3UlvGyqkcyPjnWRc5+PWlSwcuijHn49hjh3ia909e6jhjblm72KSRAxGOgwfDGdq252S8R6bx/wAC2uq2ixx3MX6m6tlP9RIBuv8ACRgj091YS1C9luWTmjhhReiRIFH+Z99TnsK7R5+zzjKO7cvJpV1iK/gXfmjzs4H7y9R5jI8aC8dKJp53Jm13sZY/YGSvkfCh11p2ZNgSTUlstQsdU0+C/sJ4rm1uIxJDNGcq6kZBBrnMi56UpxobGV7Bmn6cloGfHtud6i/bJpp1Xsz4ksguWfT5XUf3lHMP+2py7AjamOoWy3NpNbuoKzI0bA+TAj50I6Zz2nZ+aswyxPnvQ67XfHnRrWLd7PUrm0cYa3meI+9WI+VBbzPMAu5JwAOpq4i9mmOEpp7vhLSdTjzKstnGW/fUgYPv3Bo9Zagr4DHxplwZbtY8HaXZPF3bQ20SMnip5QTn1zmul/YhyJY3MbnqR6/+vxpi6NLboOK6ONqE6zZgQSSIcHlIpsjXtqcd8kieBbAND9W1PWZ4mt7e1t1UnHe97nb3YrXoHsjF+og72QqM3GERSPs5+saoXirW7zUr+W0ku+e1SdhGWGMDmIBOOuBV/wBxZ3PM0t1Jh8btncfyrOHFFk2m67eWJJPcylQT4jqD9xpGS0jfYxmh5AzKVdFcoHU7MfQdaVGOG+HrnWJxPymKzTZ5COvovnSpNmljb2aztblMHFuuOhLnP86JWjxg86pCrZzkJk/jVC8FcFahaarDqV5rU0AicOIreViz48GY7Y8xg1cNpeDGObf0pyk2tk7X2Jdbz5wWkY/GiFs6ZBwKi1teqAC2wHiTTyHVYfqrKHPlGCx/CjYKJJDcAs2/l868wTjnyT9j50Ftr0gMSrjJGAcZPX7qX0pkTmnvEhT0wv4mgFoPSTLjJ2XzJwKyp296rHqXaddpGQyWsSQAg5HTJ/OtEC/s3OYVmvG/ewSP+ptvurJnaFdvP2g65LIOVjeMMZzjGBQYUj5ZMoPdnAz409aRU6bketBEmDKN9x0r2bhnH94dfUedMTBQZeVXQFTnxFci5wGFC7a4Kkr67U8V8g11hL//AEYO2BeGL1OE+I7rGh3Un7NO52spSfHyjY9fI7+da8lYFAwYEEZBB8K/MLvORs/Z8a0d+jf22m0W24L4uu/2XaPTr6Vv6ryicn7P7reHQ7YwnLC9ofjn6ZqE3KhuUHeujNzIG8RvUcivQdSePm6DNGUuQY/hUqKmYD7aLNdO7UuJ7NRhU1KYqPIMeYf91NeySCO443haREfuInlAZc4IwMj1GaLfpIXMM3bTxKYCOUXKq2OnOI1DfiKD9jXeNxpI6fVjsLhnPkMAfnirJOokUVc6NCWjB3CocquST5nH+dOJXQTcjdO6z9xodazRwwmSN1dQASRuCvidvvqOdoPF1tw/pVxfKBPKcRQoGHU5wT6beFU9IXdkkuLyNgU9oDqW8fhQu61C2jJHexpgeLjP41mvUuJdY1K4ea8vpeZzljGoXJ+GKFO73EhBklkZjgAndjSnkfpDuEF3IvzXOMdAt1uIZbqO5dYmd4oWDHlA3quNK4LvuKtYm4g1OM2thcP3kcXOO8kXwHoMePjQK00mbSrpXv7URTgBhFLuOUjow9R4UZPE2tpMHGoEADZVVeX3Yxit/p8uSKekZ+XHCXsni6Zb29uIY41gt4lwABgADypVF7PjyVuWG/sl5QPrwHG/8J/nSqaXj5U6opWbE12GtE1yS6Yx20O46mRsflmpLZz3j457kqPKNAPxOTSpVyeyVha3MYHNIrSEeMjFj+NFLa8YKAi4HlSpVt6MD2G6kJyxz8K4ww2qN35gEkrb88hLke7PSlSoI4ex3js4RRv6msncaTd7xlrEuMc17Jt7jj5UqVB9nRGUcmR412WXLKD9bwYfOlSrYUIScsqsBsSRjyNPIZiSNutKlQRzPUj+FcRIQ/J1z0pUq0zl2Xz2F9q+pxyR8P6qJbxhDy2lwTllVd+R89RjoevhV9HjJLfRJtRlhmMcMZkZVwSQPLelSqeUVzKoSbgYc471c6zxbq+r8jILy8lmCsclQzEgGp72I6fHBwdxJxG3tTMhs4x+6oXnY/ElfupUqOZ/SYwL6yqrDVdRsZOayvrm2bGMxykU64gErwadcTXVxcy3Fr3sjTOWwS7DA9MAUqVOTZMwSB5VovsS7IrSbTYeINTuY5biQc0XKpYRDHgDjJ36n4UqVdV6YbcYuS7JTxB2A2ur3815Y8STQySnmKT2wdQfQhgcelVX2hdkmu8IqZ7vUdMurX/hc6ufgV+dKlVuLLK+Polm9tlaXsYjkxFtnwO4pUqVUZFUnQYu0j//2Q==</field>
</record>
+ <record id="employee_han" model="hr.employee">
+ <field name="name">Hans Anders</field>
+ <field name="department_id" ref="dep_rd"/>
+ <field name="job_id" ref="hr.job_developer"/>
+ <field name="work_location">Grand-Rosière</field>
+ <field name="work_phone">+3282823500</field>
+ <field name="image">/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhQQEBAUEBQPDxQQEBQVFBUUFA8PFRQQFRUVFBYUFBUXHCYeFxkjGRUUHy8gIycpLCwsFR4xNTAqNSYrLSkBCQoKDgwOGA8PFykcHh0pKSkpKSksKSkpKSkpKSwsKSkpKSkpKSwpKSk1KSkpKSksLCwpKSkpKSkpLCwsKSwpLP/AABEIAOEA4QMBIgACEQEDEQH/xAAcAAACAgMBAQAAAAAAAAAAAAAAAgEDBAUGBwj/xAA+EAABBAAEAwYDBAgFBQAAAAABAAIDEQQSITEFBkETIlFhcZEHMoFCocHRFCMzUmJysfAkU4KT4RU0Q9Lx/8QAGQEBAAMBAQAAAAAAAAAAAAAAAAECAwQF/8QAIREBAQACAQQDAQEAAAAAAAAAAAECETEDEiFBE1FhMhT/2gAMAwEAAhEDEQA/AO4LUpary1KWoKC1QWq4tSlqCnKoyq7KoyoKsqMqtyoyoK8qMqtyoyoK8qMqtyqHEC/IXXWkFeVGVcrxD4n4SIuFTyOYQC0MyEHY6SFux0UYX4oYR4NiWJwqg8DUaX3mkgfWtvqo3E6rq8qjKtVhuc8FIBWJgaSPldJGwjbez5j1Gq22GnZK0PieyRp2cxzXtPoRoVKC5VGVXlqUtQUlqjKri1RlQU5UZVblUZUFeVTlVmVFIEyqcqfKpDUCBqYNTgKQ1AmVCsyoQZRalLVeWpC1BSWpS1XFqUtQVZVGVW5UZUFWVTlVmVTlQVhqTETNjaXOugOgc8/QDUq8ivp9VwPNnPkTow3CYh8TsubO2ORrgbygAkiuu4sUNBai3SZNr+KfEqFn/b5ZKD83a9pAczCBkaHN+Y2d62XIc3/EA4uOFjWOhc0l5c2Qg3TmgCvI62ubx05m7V5LnO7TMS4l5PabkuPzGxZ/mWJxCOi1w0toaR4FoGlfes+7a+lBnNvObvOBvYgtduD62VV2jtBZPQbeqdrLV7Yw3wF/1/JNoVRyEbe+xvyW+4ZzhiMPm7N3Z5xT8rW081QkLXChIPEaGqIK57Jrrfr/AMqxumo1HnqL8CNwiXsXJ3OhxEhhlp1BoY8A97M0vaHerQ7U1q2jquzIXz1wjiT4ZmPjOQte1xsZgMpsEj7QGq9WwvPeByNdNMJHyuJot+RjSQ0vGjGGgHV83e2VscvtWx12VQWqnA8VhnA7GSOS22A1wJr0WUWq6qnKjKrcqjKgrpFKzKikCUpDU1KQEEAKQ1MGpgEC5UJ8qEGUWpSFcQkIQVEJaVpCWkFdIpWUikFeVSGp6U5fog4j4h81/o8Zhj7GSSRveBcHuYDsTH0B6E+G3UeS4Zlu1ojIRVZW9dxsPoAF1fOnGP0iYxwxNijY8jUMMkjwXBzi4XQOp3s0LrULA4VwfNtrrX/xc+eTfDDbWR4CjvmB0LfLz8UuO4bpsTYF+NtFB3rWnmvQsJy61oF+GuxWY3gcR+YE/Wlj8jo+Hw8kZhth1Hv/AH5pZMP4X/yvRcfyX/lm/VaaDlt+ch7a13CvM9s70q40wnwNH7iroWFu4sO0O2h6H1XfR8uxjfVY2M4GzoKT5IfDXEGMgn6j8Fdg8Tku2568wPwOq3U3CfRa3F4LI4Hqfm8x0cp3tS4adtyVz24PhglaHxvfkDqawxW0BrRQyuFjxvvnwAXqBavnHCTOikBZpTg4eFg2PwX0PwrHtxEEUrLyysDhehF7g+d2tsL6ZZRaQoyq0tSlq0UV5UUrMqKQJSmk1KaQKAmAUgJwEC0hPlQgyiEhCsSkIKyFFKwhLSBKRSekUgUBYnGZWsw2Ic97omthkLntALmNDSS5oIOo6aFZwCwePxB2ExQcQ1rsNKCSLABjcLrqovCY8LiiIcANS7fehsCNdd9LPgfFdrwvABgZ10381yuFFuaT/MR53TR95K7fDjuM9FwZ139KMpmpWwgjsai1gtFbLIY1x2NLGOmsot8liYzD36qTIRuT9U0hsX+KttVoJoSHLGxLLW5miG61WKZ4KYNTLCtTxOH7tR/fgt447rVcVbbT/e61jnzczQEjh4EEey925Fka7h+Gy9GkHfRwcbXhj2d8n+9NfwXu/IEIHDcLQALmEu/nLja6MOXJlw3Baoyq8sUFi2ZqMqMquyIyIKcqnIrsiMiCsNTBqsDEwYgryoV2RCApFJ6RSCvKjKrKRlQVZVOVWZUZUCBq1HN7qwOJ84y0+jiAfuK3dLWcytYcJOyQkCSNzRlFkuI0rzulXLipx82PFoG5nsaPtPA9iV29ZaA6CvZcXwmNzcRGHCnNdqPDx+9dXiw9xIZppuuDN39Lwzo8Y0GiRp4rOh4jHdBwJ9VyM/DWRi55nNrWhqfYAla52Bie49nJOCD5DXzBAKiY+2nd6ejSva4V1WOwiq8FzvC4pWV3u0b9b/qtviiWMzaqtWJjcSKrQLTyY1h3IC0nGOIOe+gS0eXVVx8L7hfJ2rgLutTQGYl3QUBepWuOLPLPTY4iZvQhYUgDgeoKXsIXAd0tvYnY/UEhQyDLtqFPDPe3OYgZZK8HH2XtnwtxfacOjFgmJ72GumuYD2cPdeL8QbcxrckL1r4R8QHZTYU7wESA1VtkJzAnqQR7OC2wvmOfLG2W/TuixRkV+VRkXQxUZEZFfkRkQUZFORXZEZEFQYmDFaGKQxBXkQrsqhBVSKT5VOVBXSmk+VGVAlIyqzKjKgSlzXO2HJZh3DNTJtaJG7Tv7V9V1GVUY/BCWN7D9ppryd0Puq5Tc006WXZnMnkOPw4/T2ZerA4/Q0uhIpumpK1+O4aW4xryKywuY47d4OFfitthza87Ll6Pbq1psFwrKZ+0Dnds0C8wBA3Bb9f6LHZw/sTIbMrpDZLu84nQm9T/AF6LqAwdQCllwwJoAD0WkyutI7JvdjFwIa1oNC/SunVHEHXE4eivkhDdAsXEHuvHiFn7ayOBkbUpJsb6joV0EDmyYbsSQW6/MNddDZ+1YNG91pcS3vm9KK2eC2FLXemGpbZVeIwFMDBVDahXksYREaHoN1vCbWDitAo7touOnM42HLOx3Qm/Zel/Cnhju1xU9HI+OKNp17zgXF9eNU33XBcWaBGCd9m+pXsXw4wmThmFvQvaZOv23Ej7qW3Tm6wzvbjf10WVGVWZUZV0uVXlRkVuVGVBVkU5VZlU5UFeVTlT5VOVBXlQrMqEFGVGVWZVOVBXlRlVmVGVAmVGVWZUZUFeVTlVmVGVBw/N+ALJA8DuON3/ABVqPx+q1ULqpeh8T4cJ4nxnTMNDvR6Fefy4cxPfG6szHUSDp9FxdfDV27+j1O6avpdG/XUrID6GixGNRPJsFht1coxUuoo7pY2NyOLiQaS4qLM3R1EdVqsRCYo6Y57i7TvOLtT67K8hb4aLjLLkNb2m4RLYWBicG8S5nEg0RuSK9FseFRhunir3hjvd22j3aLWYl/RZk76WuldqoiMqyOHcH/TMXh4LLc161eUBrnk+tNIvxIXueHwwjY1jRTWNDWjwaBQC5X4fcvQsjbimFz5JYw12bLUZaSHNZoCNd/RdjS6+njqOLqZbuiZUZVZlRS0ZEyoyp6U0gTKjKnpFIEpTlT0ikCZUJ6QgpyqcqfKikCZUUrMqKQJSMqelNIK6U5U9IpAlLg+csN2eKDukrAf9Q7p/D3XoFLQ858P7TDF+xh7w/l2cP78Fn1Md4tell25RxbpNFVO7r4BIx2gVc0Jc4d5zRX2au+h1C87Xl6G1rnBvzOA/JYWJxsZO/wAq18WBfHI8zfrxpkAJbrY+be+v5LZulgy0IcpzXVeJ1Gy3mK18erWqxWMjf4+q15eLBYVm8QYNQ1kTGmjqCXadBsNVqsNg2s1Bc5xN27Wh4BTrwplPzTNlnJGu4/oseQ7KzEv1WJiZaCiMbfL1/wCFGM7TAvFEdlipGettZJY/3K+i7Ol5x8EsY10GLjsZm4gPrrldGxt+7SvSaXXh/Mcmf9UtIpPSKV1C0ik1IpAtIpNSmkC0ikyEC0hMhBXSKT0ikC0ik1IpAtIpPSKQLSKTIQLS8T+JPxIdLj4cHh3AYeKZoneP/JMCbZf7rSB6m/Bd/wDE/m//AKbgXOj/AG87uyh8nEEuf6NaCfWh1XzZhGASQ19mRlel0ovCZy9eYSPrsVcyRVRvDm0kElGnLzbN+Xp8L5RYWqxmKcKHe7u2wpbRo891RjA0biyrY2xfurQzhz9SOqxntyjzW6xDAB4fmtNiSNfZX81lnftQ5/UrVY3F7p8fjK0C0mJnLleRhs2B4/NhpWy4eR8UjHghzSdfJw+00gkEHxX0z8Puc28UwbZaDZGHJMwG8sgG4/hI1HqvlWRq6Lkzm+fhk4lgNtOUTRGsssQPy+ThZyu6E9RYXTjw5suX1cha/gPHIsbh454HB7JG35tPVrh0cDoR5LYKyoQhCAQhCAQhCAQhCAQhCAQhCAQhaTmPnLCcPbeKmYxxBLYwc0r6/djGp9dkG7Wh5l55wfDgP0qZrXO+WNodLI7S9GNBIHmaG2q8b5q+OGLxGZmEaMDGSQHAiWZzehzEZYzXQXV6HS15y6YufneXOc93ec4l7nHxc46n6oOt+IfO7uKYrPXZwwgtgYfmymsz5NSC4kaVsKG9rlvTcaj1GoTUodopHpfCsf2kTHj7bAfQ1qPdbDRw1XE8n8U3hcf4ma738zfx9110Ute64c8e26ejjlM8diSQx/Nt0cPDzWNiMcHHcLOmNiwsR2GZIDoLHkAoifLBxnEgBuCtBjeIXde6zeJ4AM18Fz2JfZ0WkZZ2+1GJlLiqhEsmKC1sOF8Amxcgiw0bpHH1DWj957tmj1+lqVNOfmiOUno0gfUnQJmrpudeCMwnY4eMh/Zd6aSq7TEOFE+QAAAHguaXRjNRzZea3vK/OeK4a9z8K9oD6zxvaZI31sS0EEO6WCDX0r1Dl74/wvOXHwuwxoXJFmnj8yWgZ29dKd6rxEbqiR1OHorKvsnB4xkzGyRPZIx4Ba5hDmuaRYII8lcvkfg3MWJwbg7CTzYc3dNeSwk6HNEbY7fqD47r1blT482Ws4jEGdO3htwv+OLdo8wT6BNJexIWHwvi8OKjEmGljnYdnRua8X4Gtj5FZigCEIQCEIQCEIQCoxuNZCx0kr2xsaLc5xDQPqVzXN/xJwvDg5rndtPXdhZqbo1nP2BYIteB8082YjiUxkxDtAf1cTS7s4hrWVp3dRNuOp9KAD0bnX42tcySHhvaNdYH6SRHlq+8YmmybGgcQPEXovIMXiXSPc+RzpHvNue4lznHbUny0+gUOSlSEyrHldr6LKcVjZbKIZRP5pCdURusD2/EJsqJQyQsILSWkGwRuCNiu75b4z+ldzaYC8u2cDdzPfULg6VkEzmOa5pLXNNtI6FUywmXK+Gdwvh6q2wcrwWnwIo+xWJiCWajour5E5tbjof1ga58Zyva4XRoEEX0Nrsm4SJw/ZxH/Qz8ll8P66P9E+nz9zDxdmtuAJGxIGq1PCeEzYs/4eKWfXUsaXNHq7Ye6+lzwqH/ACof9tn5LJY0AUAGjwAAHsFedNll1d+nj/LvwhneQcW5uHZoS1pD5T4jbK31s+i9Gi4fBw7CmPDsyNAJ3LnOd4ucdSVu1y/OnGm4eJziRmA0voaVpjIp3XLl5Dzw05rkP6yR2YNH2W9S7zO1LjithxriJkeXEknz6ne/Ja2wVeKWpDlTiN/oFe1qpxHzfQKUHiKtVLdFaEGfwjjU+EfnwssuHcassOh/maba76gr1vk745hxbHxJoYXOoTxjLE0Gq7VpcS0X9oWOpoXXizSmKgfYGFxbJWNfE5sjHC2uaQ4EbaEK1fKfK3OGJ4c9zsJIGB2ro3DPG8+LmWNa6ggr3Hk74uYbHubFL/hJ3bMeQWPOmkcmxNk900TV0iXdoQhQElmaxpc4hoG5JoBeNc9/GYyZ4OGksZ3muxOznbC4PAb9867EdCud+I/xEdxN/Zx548K0D9W4NBkfvmkom60pt1pe9VxLiglxskklxcSSSSS5x3LidSfMqHGlDSlkKlBS5DkrSpkcgWY6KGt0RiDsmbsgTDHvEeOo9Qr6WJI6nAjoVmOcDsR47oIyqCE2cAalvusd+MA21+4IlnYLiL4HCSKR8Lm7Oacp9PA77G13vAPje+NrW4nD9sAK7SN/ZvPmWEZbrwIXlj5C7fVWskPZltAguzXRsGq0PghH1Vwbj0WLgjmgdnZILHiDsWuHRwNghZ+cL5n5K52k4bLeroJCO1jvzH6xng8C/Ve3v5nja3MZGhuXNmJAaGb5rUJkdBxLijMPC+WRwa2NpJJ02Fr5/wCcubHY6Xq2O7DSTbq2Lh69Fmc+8/uxzuzhtkDD3QaBkIP7R1elgeeuu3H4mWm2N/NIVjSvsklIwKA+1eGqypVVJq72WS1qonb3/UBBD1Yw6KuRNGdFAek1pLQSpCF1OWUJa9RqOmo6rBu3K6U6IM3/AKxL/n4n/fn/APZC1eZCDZApHFRG5LIVCTxJC7WlYwaLFDu8VKFg3Svd3gEz1WzVygTONU7RollHeTgIEMSQwhXJUCMhHgmdGEwKhyCtraTAaehUEJM+hQEhr6rYnGu7Jsbndxmw9NQPOui1+eqPU7fmqy4ndErpcZ+77lY7iTqdUMZatyKUKmsT5PVWNYmpBWI/X3KmOOinpSgreiNS9qlgUCXGiklKmQ6pJVIWPdTMdURbhKNT9UE5UK21CCyF2tJpjqkl0eFMupChK9poD0WE495ZIf3yPJYs/wAxRDIOwSxbpM2gVkLUA494q1VjdWoISOCdQVIrCYhQVNqAr2qmIWT7+yue9VRDV3og7DlrF8OGBnGLbEZyZLzse6ZzS39T+jPHykO31HmuQYzui9619U7ApKSJ2VjdEwCgFSAiEhCFDkAFAUhCCHjREaYlK3dSEm6KuRPPsqyoDRbhKzdNEUsY1Ui7KhTaEEYzdqYbtQhQlDf2ipn+ZCEDeCyI0IRCG7qwoQiQFBQhSgjkO2QhQK/FLD9r0UoQOOik/ghCCApCEIApShCBgob+ChCBghCEFcuyqjQhA0W6iLcoQpEoQhB//9k=</field>
+ </record>
+
+ <record id="employee_jve" model="hr.employee">
+ <field name="name">Jan Van Eyck</field>
+ <field name="department_id" ref="dep_rd"/>
+ <field name="job_id" ref="hr.job_developer"/>
+ <field name="work_location">Auderghem</field>
+ <field name="work_phone">+3282823500</field>
+ <field name="work_email">jve@openerp.com</field>
+ <field name="image">/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhQSEBUUEhQWFBUUFRQVFRYYFxYUFRcWFhcVFBQVFRQXHCYeFxokHBYUHy8gIycpLCwsFR4xNTAqNSYrLCkBCQoKDgwOGg8PGC0cHB8sLCkpLCksKSksKSwsLDQsKSwpLCwuLCwsLCkpLCwsLCwpKSwsLCwsLCwsLCksLCwsLP/AABEIAQAAxQMBIgACEQEDEQH/xAAcAAABBAMBAAAAAAAAAAAAAAACAAEDBAUGBwj/xAA9EAABAgQEAwUGBQQBBAMAAAABAhEAAyExBBJBUQVhcQYigZGhBxMyscHwI0JS0eEzYnLxFBVDkrIWJML/xAAaAQACAwEBAAAAAAAAAAAAAAAAAQIDBAYF/8QALREAAgECAgoCAgIDAAAAAAAAAAECAxEhMQUSEzI0UnGBkbFBUSJhBDMkQqH/2gAMAwEAAhEDEQA/AOjFRfxhwTAm56w4jPSpQ1I/isl8DDBh3gRBCLNlDlXgQQMOIYQ8GyhyrwA8PDQ2asGyhyrwAYhEwwMc27fe1FMk+5wpzrSoe8UwyBNcyM36jSotBsocq8AdJMwA1P39/KATikksCHpRw9d44JP9peLmAgLIF2YFt2pblGDw/H58mbnRNUFO+Z3Jfcm4sawtnT5V4HZnpzPVuTwBnfiZBfLmPRyB6g+Rjzlw/t9iJc4TM7qF3/NzVqTesbNg/bTPTOKpkmWpJQlIylQPdKiCSSX+MvQQbOnyrwGJ21odo4nh/bDiDMdWUouEhkU1BKgcx8RpHVezfaOXjJKZks0VmDG7pbN8xTmIap0+VeBYmXaHaFCh7KHKvAhQmh4UGyhyrwAzQmh4UGyhyrwAzQmh4UGyhyrwMFUKEqFHG6UjFfyppL69IsjkUDcw4hjeHEdjS3I9EVhCCECIIRYA4h4Qh4AFGI452glYVGeaoDLVvzFJpQal/lFrjPEfcSVzLlI7orVVgKVuRHnztV2lm4mcfeqcCzJKGfVn6X6QmxpFnjHtKxa5k7LNUETCQnRSEOWSkp5Fn1jVMyiXfxESz5YBfT7rFnDy0i7EdHBiI7FeXNqyqHRQp5gXHMesZLCS0rT3mUCG5g6V+vnFWdLQ9CGPMunbwixJk5AWvemo+lvSAZUm4BlEaVbQve33yiWZgSnLvT1+xAnEEliXuUK5G4P3QjnFqRxNnKq/pOxY0PQ/IQADOwTHMKPcbb+EbP2Q7RKwBKi5lqUl0/JSebFQ5gN01s478RKvyqCQocyCkuPD0i1j8UMmQ7MTz0PpCGegez/aSTikBUtaSakodlgPqnyrGWjzb2Y7WzMJOStNWJCgTQhmPpHeOzPamVjJYUgjMwzJ2P0ixMrasZuFChQxChQoUAChQoeGAK4aHXDRxelOKn29ItjkUDeCEMbw4jrqW5HoiDCEEIEQQiwQ8PDQ8AGG7U45MqQpS8pyh2IJdrOBUh2jzpiZ6p01UyhUpRUWYCpeg25R3z2lZRwzEFTjugBm+IqCQPXyePOhLOzxFkkXkyX1YvYpPoRFiXIUD3UuDcMwP8+sVOHJUtQAck0A+7R1Ls12XSkBU3vFrXEVTnqlsIaxpnC+xM7EVSnIPExm5vs3xAS4UFHZ2VoKG2gvtHS5EpgwDRZ9yYz7WRo2aOFYvsfOlnvS1Urb7+sQJ7MTlAd0kfEw/beO++7e4eK6cIlPwpAh7ZkdkmcJxXZmdLHeSWoXag+6RTxaVh8w0A8o77Ml7geUarxzs9LUSyaKqRsdxy5RKNb7E6P0chlq1s3zjfPZbxpMrGJStWQTBlBc5c2gOznwrGr8X4X7pVAWL9CRQ9D/ABFTBglVC1m5HSNCd8TO4tOx6sQtxBRqHs47SHFSClZPvJTJU9zsr72jb4tRUPChQoAFChQoYArhQlwo4vSnFT7ekWRyKBvBCGN4cR11Lcj0RFhCCECIKLBDw8MIIQAaL7ZMSE8NKdVzZaR4OonyBHjHD8PkPUerAv4ktHXfbmg/8fDnT3qwepRT0Co4xJDKERZJG9dk+Ed8KFB96x0rDSwAG0jV+yeDaSlRuQ/QaCNqkGkedN3kejCNol/DxkQA0UMNaLiUmHEUgSIjmpaJsrmIZwiTQIgmWtGF4iirxmV2jG4tLxUyaZz7tVhQogb18e6HjV/+JlHMOPIxuPbNGXKRrmB8Bm+T+UagcSVG73J+X0EbKW6ZKyxN/wDZRjEy50wEsVhIHg/7iOwgx564IpQnSimiiodbtWPQMgukPsIuhK90UTjazJIUKFFhWKFCh4YALhQ64aOL0pxU+3pFkciibwQhjeHEddS3I9ERY4goYQUWCEIIQwh4ANF9seGzcOCm+Ccg9MyVp+ojh2Cw2ebLSfzEP0eO7+0ZUybJmYdITkUhJcgklQVmDF6fC0cl4Dw9sUAQxS9OgimU1jb4LoweF/k6JhJiZaNkpHkAIqzZuKxQbDp90j9ZLKPQaCLmG4b71OU/DQkbtp0i1j+LJkZU2JolIDknQJSKkxijgbn9GJE7iOHoWULZmCx6fWM1wzjk8rRnBYuFOG8uRpWMKe005cz3aZS3JbvKCdwaJBa2+ojKYSbOSVBSSCj4klnHNxQjmIsbazRWkpZM3hJSQ+sUuJ41MqWVM7aRVwfEQpD6tGKxHFFLJADgfT5Qa6DVZguIdq8QKhKW/Sx8OZMYr/5BjHCzKdBuyVBvONhV2jkyj3j3v8FkeCmr4Rfl8YRNDBiCKEVBhtr5QJP4ZqvGQnESAtLm52NlCkaFgwxPJx9/ekdNncPyLVl+BYdtAdaRz33OWZMejrLev8RZSwKquJsXYmRnxkgXGZ/JzHd0iOLezjDf/eli2VJPpHa4tpZN/spq5pfoUNDwouKRQoUKGAC4UOuFHF6U4qfb0iyORRN4cQjeHEddS3I9ERY4goYQ4iwQQh4YQ8AGE7RBPdCg+YAeSn+TxzPiGB91xAlmdDh9dB6AR1bjISPdlVgoh+qT+0aR23QkTpSkt8JDgXsYx1MJM208YIyPBT3IuTuBIWcxSCrc384o8BV3RGxSg4iiKL3+jFS+DBP5dqu9Q9YbHJSlPdHes9W+dYy65bRheKzGuQOWsSllYI5kWAog7wHDJaVqWkkjvO1O9yL86xJwxPdPjFWV3Z45/OIxJzRLxXgiZq8ywcwIqR0BsNvkIpo7OqE4TEKy2zJAZCgAzt+q1Y26V3hziOYgi8WNtopSS+DC4uTQRpXC+znvsQskOELISNCol6/2hx1cRu2NnfOK/AsOUSZqzQKmKVm/sSb+h8oksIkGryI+x2GB4pNaokoyPuQwPq/lHSI5J7KuJKnY/EKT8Cs6z0UslMdbjVSVomWq7yFChQotKhQoUKAAViFCXCji9KcVPt6RbHIpGHENBCOupbkeiIDiHENBCLBDiHhhBCAChxxBMhTaFKn2AUHPk8al2p4cFYfMgURlPlQ+YPpG+FL+Mco432gmyJ03DDKZZJSHBcJVoK84zVlimaqDwcTK8EXboI2zCm0ajwlNAeUbPhVUjKnY1MtT512jWcbLImKJSVBVQaN0L2jM4qdoIhRLc11h5ji7EfA8XLCSFAuKVoRrYxhMbipalqKSaGjAmvhryjPYng4XY1Zuo2MVBwwSwwEStgLWu7mX4dMJQnN8TB/LWJsTaMbgcQbRdxJ7rwk/gizWuLKYlvDrAdpOJnDYCdTuiWUo55vwwT4l/GB4hPQFgzFBKM6QSSwuNT5eMar7SO10qZKGHkrC3KSspqkBNQHFCSW8otir2KZStdmd9hOBIlT5pHxKSkH/ABBJ+cdWBjTvZTw4yuGS8wqsqX4KNPSNxjcsjCwoUMIeABxChoeAAJkKHmQo4rSnFT7ekXRyKJghDaw4jr6W5HoiDHghDCCEWCHh4aCEACjRO2vY1U2Z76V8RZxu0b5CKYjKKkrMlGTi7o5xwNZHdVQpdJGxFDGx4RekYTtOUyMfSgmoSvlmcpU3kD4mL2CnxhnGzsboyurkXHFTUkKQWQPjo6mOoeH4eAsAnEgEhLApCQ5uK3brGWmoCk1rGFVwAZnFOjwIuiovN2MqvBzSSlE+WQADUOavsTtGJ4giahiZsovlpVu8dxpS8P8A9IFWVfXKH82iqrgVauz6/tEm/wBDUbf7f8LHAlzJqsxACaVD1OoqIznE15UARFgEhCQLARQ4rjnPIRFfZTJmie0rEth0o1XMHkkEn1yxoHDeGrnTEoQkkqIFo3biuJRiJ6gsZpaO4P8AL85B0ag6iOn9iOzkmXhZSkgE5fiYOa6xrprCxiqPG5nuC4T3WHlS/wBEtKfIARehQo0FIoeGhxCAeFChQABMhQlwo4rSvFz7ekWxyKcOIGCEdfS3I9ERYQghAiCEWCHEEIEQQgAeHENGJ7T8bGFwy5n5myoFKqNr7X8IANT9oi0TJ6EpUCtCDmY1Qp3S/Oppt1jF8C425yLooevMRgcHjFKnErJKlHMSS5JNTaJsXgu9mFH1Gh3jDN3k7m2mvxR0zCzcwibJzjSezfaIpWJc6itDor+eUbvLTmPXWEizAYogFy/GJsThQBQvFFc7IFFRhyBWzIsdisoNY5/2g7Q1MqUe9+ZQrkG/+Ww8es/GePqxGcSSRKTRc0V1bJL3Ud7CMFJw6QTlBSXcBVX0OYm/1fVocUUVJBYVASkABhYGt+bir7x1v2f40KwwQTVJJA5G31jkhmPYUJrQM+4I6j06RvHYfFkT5Y/VmSrxc/MRog8TNJYHTIUKFGggKCEDBCEAoeGhQABMhQpkKOK0pxU+3pFscilBCB1ghHX0tyPREWEIIQIghFghxBCBghAA8cy9q/ECZkuU4ZCSsvUZlUFOQHrHTY457RJ4PEF1DAISeuUfJ4hPIazNZw87LiAKeFtPWNzkgFIjnswNNB2+3aOhcPGaWD0jHVWKNlJ/iXcT2eTNRQfekQYfG4vDDKUmegWYtMHLZfoYznCcYB3VRkJuU0EJEmarM7fkBhhsQVbZD5O8U14LGY9zPBwuGFVB/wAVYFSCfyj7rG8ScONo0ztr2gSs+4Q7IUCpQLglvhAFxU+IiaxISlZGA4likrKUS0GXKQMqUNQbqLH4j4384VywzVO1gxqGL+HlpESByFQHo7ZmYnTX9onKGG4LVCU/MuwNS8TyM7d8wJiu81Mw1oR0bfS9DF7hXE1SVpUn8pBr8ooKcsFMCKgMANNvlCnLYUua5bsXZy2n3rDQHZOGdsMPOUlAUyyBQgs5o2ZmvGcjgOGxmVaWLsoFmyl9xsY7pw/iCJyApCgoa7g7EaGNEJXzKmrFqCEDBRMQoUKFAAMyGhTIUcVpXip9vSLY5FKCECbw4jr6W5HoiIUEIGCEWCChxDQ7wAJSmDmgFSTQeJjiXbLFibjpxSQQVAJL0okBx5E+UbF227WGapUqWWkouR/3FA6kF8r2DVYnZtGKgp35E+DCv3pFM5XwJpFHEDv9dqDyjfezCnlgHaNLXLJKXYWenl0jcuzacpCfKMtRmqlkbHKwuojIYZDQMuXGP7QdoBhZYIAUtRZKSfNR5QkSZU7Y9ozJT7qWxWtKsxeqRanO8aGlZuLhgasGNWH38oZSlLKiouonPmsSXJfryAix7xwVB3o5sz7CuW+383JWM0ncZLJcu+pFTTdX38okTKAuAoEUIBob62hBTMX7qhV/Jhv0G8VZswlwxSLgakkfm2DEUhkQytwAkgmjEhzdqM+zvanOKOIxABo4LtWrkXf5ecHMxelTokEPrRm6Cph8PJYOSCok/wB1qN0vEhBYZKviNToQH8njK8M4vNlLzS1KQWc1AcUpQVuIxp5hRo1S1dC2z+cXf+PkTYOL1fvVp0D+fSC4HT+zHbaXOQETlBE4ULhkq2INgd7RtQMcClJGp6FiTX6WjcOyHbYySJU8lUstlNSUdNcvLTTaLYz+yLidOhQEuYFAFJBBDgioI3EFFpAGZChTIUcVpXi59vSLY5FI3hxAm8EI6+luR6IiEIcRVx3EZclGeaoJTzuTsBcmNK4v7RlHu4dOQH866qbcJFB4vE20gSubjxjj8nDJeaqp+FIqtXQbczSOdcf7XTsRT4JX6ATUf3n83yjD4jGLWorWoqLuSqpPMnUbCAlqKlq1o37sPERTKbZJIp8QmW2JtyApz1ijmIVdv2v4xc4uAFIHJR01J/YRSUnX7P7RFDLKxs7VY07rGxbwHhG59nB7wIWNmPUXjSkKCgxtVnoCdr3o0X8B2gm4Y/hsUmuRQJHJi7jziucdYtpz1czo/FeJjDyVLLEgd1LgFRJAAHnHNuIYtU6apUyql2GwFG6QXFeJTMTM95MYOlkMO6BcAbPu94pFaU/ES4Nkhy2hIsk1asOMbCnO5aHfFGcaNehIoL/dIIzBmORyoBiKZUuzurW9oppJW4IypJILUL3ZSteg53aLSAlLh8rVrcXADWsD/wCIiViseeQSHckBnbKNCWGgqOZYxQmTiaJzUtcVrW8STZhKqk3r1Nz4Q8mSwBGYljuKt+zQxAIktUu+pJZmHpE6jo+gBYMKljXxhLSRomwbcVoX1v6i0WMFIUtbPQEOwFg1qfPUiAZLw/CfmYufgfQBhnLDy5xamAAMQHf4SR1uG8YtTJfdYGtHDkMA1A2wiKXJbTSvm1360hAQJAI1Fw3yLneI1IDXfq7p6K+kWpgsEi29Sd+n8CGWh6tVq6A3FaUgAyPZ3tbOwqgk9+Ua5TVumx6U5ax0jhPaSRiAPdrGb9BYLHJtfCOOKFcpGU8y79POFLQx1ejG0WRnYi4ndJkKOedkuPT1CYlUxSggS8uarPme/TeFHIaUd/5U+3pEorA3UxDjsciTLVMmFkpDn6AcyaRMY577ReJlU5EgFkoAWrmtT5X6D/2jr6btTXREPkwXGuPrxM0rUSkBwlAskbDfQk6+EUZCa/7O3+oaXRzerDycPFjSl+bAN4c/nFbZYABlq49LbA71EDK1LXPjQbtRvpEhQSOfTpZ9NbQEh3c6fz+8AGtY3ELmLSXpQNYMND4PFtNR9LuRcP4esPxDDhMx0pbMlJZmuND5m8DJDWFDTepHPq3rD+Ak7sNJAqNBzqbgdaRMhQDqUXULJua1DkW5uRCCGehAFbNXQOS4tcRKkBJaxsNK7geVeUAgcxUAPgSH5rIoaU7txV9YGVLADJYC7DbT/fKDChuG+nPe5iRz+kU01cOK+bPAAg+7/l0DPdn1qeUEUqf4Q5NbM16De8Ryylw4IAd2Z9XYHqa84POxFz+5blTT1hAClBo5FybgO30b5warXfuNyrTz1MAwZgGDU8Henj6wZLly9dvJq9C8AAsHLoew8Lqd+kZjh8r3YoLsT1ZwD0flU8oDhfDKJmVscqWzXso71tZ/neChQubmpZ605nnz8IABUkHagZ/I6fdIiVfMKa8/WCXNLsC4swAdt67/AF8pk4Yt8LVcVILWAFHgAiTNAbnQWBeju3SFNSDzrvta94kQwou7bkM9mLdf4gZhDli+hFaC1Tv+0AEGVyQXKiRf9/CHKQCaZam70uOlYnQAEuE3e7BjeoIECqS5Lamoq+hsd39dIAMn2UUAZgZqS77PMZtoUW+zcts7jRA8iuHjkdJcTLt6RJG6G8ch7QYkzcXPWG/qFIfZHcHS0de18Y4nh5hIJN8xvu5qTHYL+uPREFmDhk79RXT7eLpQq7dGbe4ApoPOKMsvcsK1sObbmL6lEAfXw86fK8RZIrTlnrycEUfryLcvGDkFki1CSz7X0g5mUoLvQswoKa/OGSHYGxBDvflABjeMo74DhyGZ3NCdhWh6RHIU41CXYNctdRb9tIfjSFlYVkdNgaBjUkcnv4Q8hFHcJJCSX1bqx+cCG0laxMZjB8xpvb9PJ9ojq5YpPMtVqEloJSSW+Ek946GrsNCNd4iOUM6CGZ20JofNoCJYyHVreTVFxex8IBaqbZqm96+dhS1IeWlLAAEaHSwcE8rbRLOUas4ctXZLu+2lOR5wARS001rU7UoxGpoYSpbs2lb6nx1b1gveUN62oPB//JNOsPLND3XJ3O1Q1q0bxgAQ7pKXTZqaFWvWo6NF/B4TOxVVFQLsSHLUq3P6tEODw5UpnAAPeIFUgPQHWw6xsCZgSAALBgl6Afual4AAlDNRg/6gALb+lIhxCCB3lE83qH5DwiWYAWIAatAQSbgC1q+kAnEJA6ixINByIMICIy9d6GoILav1Hr4RLImAsAD1JJGgFYUpIs1HL0PzGnPlE6yCGAAFBsddb7N1hgRk92qgz8z0fyitlsUBROjOdQWIFLteJTMCU2Icjukj5kaeMJMsAABPIsWPMgiAAMNOYnMTTqOteu+8CqcnMasXrSlAX+h8KRYUkC7l7Fq2a71q2kMhI1FK89K63v56wAZfsur43YUR/wDv1hRT7Kzipc9mA/D2I/OSz/eusKOS0kv8mXb0iSyOgvXxji0hPxNUZlN0ct0/kx2aapgTs58qxxCTPHuRXm1tWqfXyjr1/XHoiCLAIZ3NGo1Lu/3vE2XNROgFT8g9v9RXwyDctuX35eEW0qYAh6UpZqEsBESQxkhqdXYuT02H1h/eU3NrX3ECVaCnja4FfKkSnD91jVmb/dxTeARHxZjhkmjgpPOue7jciMZIJsK7B1cie6PmIzKJYWgBbMoMU1SKWLp2L+ERI4AACUqNywoW8ymtdtTABilqSTZSamopzDVf1hpc1mIXuWIPk3V9vGMhP4OoA/iUFnSpjoGYFh/MR/8AR1ue+mjklj5Nl3+UMCsFmoKySAdNK1FOn8xZE46qdhRxoH0OtBt0ixL4OofnTUA60FNMtRTX/aPDF1qmuvw1c2oKQgIiylj4i5s1L6trQ220hsNhnKUhBJJNzy9NyeXOMgnhsxR+JNrZm1fdntFnByPdpO5HeVfugNkGjb+UADyMCmWgjQFyRYlzVxZnp4nWLKZZJD/DSrnWgYHVmu0Agkl2IY3YEaMzXtsbwwWGoL6X38/4hAAmWxqKNTkLfPaHXLFWLjmCOZtb+YXu6gUIvY02+sJSjp+qlAKcwL1cnrAA4BU7pNX6PzrZg14aZIAAdNQx/VqXu5vSEqWAL6VYJAubUL0beHCMqtgXZjozaWsB4wwBmyqEAhOnOjAgBqa/xDSyXskgGtC926wap4u4bus7kudmdiG8aRFLkErIA5l9Rro+j0g+LiG7pB0fcE+ZuKiK+OmqDISaqYXpvR9vqmLYWAlwnSxub1G8YvD5lKKmv3bltSfEv93iSBm1dj5SUJWAR+Ryaue/y6w0H2VQHmMNJd7/AJ7jSFHH6T4mXb0iayNu4h/Tmf4TP/Uxw+Q5CQBZn1tX5x3PESyUqDXCh5giOP4fg81s3upgsKoWbCtGeOsVWGpH8ll9kELDCjBjY2et/D6RLlYFOZuQ8y5YbRIjhc4f9tfXLMB9BEkzh80AfhTK7IXfc06wtrDmXkkQJuyQ9Xv8uVfWJJqHlhPLSqulLaQ8vATSotLmsLfhr7x8qROOGzCQfdTC/wAQyrHN7ekG1hzLyBHJJo/pSvN7f7idK72UevVrcniWXglA/wBJVrZFMKNdukJGEmju+7XU3yq+ZFBWFtYcy8gRf8ckClTYUNbsSSdDtBIGVLHM526ActWg/wDgzFCkteYOB3VVY3zEDeHTgJhFUzcw/tVzeHtIcy8gFmLGr110YFyXoNmO8NJmlu9mABe45OwAqIGZgJv6JjP+hTcyx+cGMJOVeWpxbuK6XbpeFtIcy8gEucRUZk1FfhcXVexp4PEoSMqnN71cEnvGrtApw8wsFS5liaS1AeIILm0OrCrytkWCSH7irAhtOkG1hzLyBDPnBNCkkM7OQQ1XFC9h5GJcLNlFNSpwO8GAZwXBe5AYRXXgZqiT7uYC4zAJLFIcDLyZqcjuImk8PUouZUwafAp3ezNat4NrDmQBSsNKIZKmFGfu3Ac5SXb76AiQE0Zw9h5X+/rAL4bNTTKrLWmVZL+IpqPCC9zPllwFlh+hRs/Itq3h4Paw+15EOKfqpoa1NfkPlEBnEqChYvv1qIuJM5J/oqUOaGLbOE7eNDDjDZyc0lYKv7T4F/u0LaQ5kBQTMFCpKVMSQS1dGcCpYRdQFFSlZS47oINKhiGN7i2sQpkTULLS5hGncOvhUU61trE0sz8yzkW1D8JerFg4ejD7vXUnrYJq3ULK9wOJTC2QS2KqBVCHUXDt/kH2cdYgxxDhNjlzaAAGmZ9fDeAkpmuVZJlFOB7tTufibu2FB5bQ83BTVVMtelPdkO1tOcKnqxea8gZjspM/qAaBBpaucwoLsnhpife5krBOS6VAfntTp6Qo5nSUk/5MrP69Iksj/9k=</field>
+ </record>
+
+ <record id="employee_jep" model="hr.employee">
+ <field name="name">Jean Pierre</field>
+ <field name="department_id" ref="dep_ps"/>
+ <field name="job_id" ref="hr.job_consultant"/>
+ <field name="work_location">Grand-Rosière</field>
+ <field name="work_phone">+3282823500</field>
+ <field name="work_email">jep@openerp.com</field>
+ <field name="image">/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhQPDw8PEBAUDxAUFRUQFhUUFBAUEBQUFBAXFhUVFRQXGyYfFxkjGhUUHy8gJCcpLCwsFR4xNTAqNSYrLCkBCQoKDgwOGg8PGiwkHCQpKSwpKSwpLCkqLCksKSwqKSksKSwsLCwsLCwsKSkpLCwpKSksKSwsLCwsLCwtLCkpKf/AABEIANUA7QMBIgACEQEDEQH/xAAcAAACAgMBAQAAAAAAAAAAAAAAAQIDBQYHBAj/xABAEAABBAAEAwUFBQYFBAMAAAABAAIDEQQSITEFBkETUWFxgQciMpGhFEJSscEjYnKC0fAWM0Ph8SSSosIVNGP/xAAZAQEAAwEBAAAAAAAAAAAAAAAAAQIDBAX/xAAnEQEBAAICAgIBAgcAAAAAAAAAAQIRAyExQRJRMiJhBBNCcZHB8P/aAAwDAQACEQMRAD8A6zlTpSpFKyiNIpTpFII0ilKkUiUKRSnSKRCFIpTpKkEKRSnSqxD8rbGtEfK9VCTKofi2DQuG5HqN/ktf5g5m+ztlcCHsADQb0LnC7ae8dQfQ9Fz3Gc4vdAyP78d6jfUkk2b6n6KmWemmOG3ZGzNJoEHroR0JH6FT0XFuGc2SQ4d3Z0XNa7X71uGt/iJNG/Bb3h+Nsgw8FPzsyMzm7db2AyO882/naTMvHY26kqUMDjGzRskYQWuFivyV9LRkqpIhWZUiFIqLUiFZSRaoFJCRCtIUSEFRCiWq0hRIQVFqgWq8tUS1ShQWKstXoLVGkSzdJ0pUilCUaTpSpFKBGkUpUikEaRSlSKQRpKlOlF7qBJ0A1QRcta575njwOFdmd+3kFRMGri4EHNXRrTRJ9Oq8POXPUcDWsie1zz7zqOgH3QT4nXyC4zxnFyYmd75JHSvNDM49wHwjo3wHeq2+mmOHt7puMPmZb3W0lzyB8Id4DuFLAYnEErI49+RjIma0Ghx8dyse3Ck616Kk01sr18Nxfu11/RZpuLIaCw2B02Ow6m73KwOG4c8H4TrsFlMLwyS6H9hVti+OOVbLyfzi7BFwzdpE7V0ZBBYb+Jvf10G665w7GsmjD45BK065h1sA+m+y+f8AHcLkYA7K4gb9a8uqyfKfM8mGeKccl5XN+6b667OG/jSvjl9M+Tj+3dqSIWP4BxhuKjL29Dl8DosnS0c9mlRakQrCEiFKFRCRarC1RIUiohItVpCiWoKiFEhWkKJCCotUSFcQo0gzFJ0mhVWKkUpIpAqRSdIpBGkUpUikEaWu87cxDBYZ7y0vJGUNAFHN0JvRbJS4D7RuYX4vGye8exiJZG0E5RrRfW2Ym9fJRVsZutZe6TFShjRrsBewvqt04RycxrRfvP6k7elry8o8KppkrV3XuHct0w7KpcPJnd6j0ePCSbvliouR4jZdqT9FkoeS4RVN+iy+GGgXuhIBVZurW6YT/CMO+QWrTwKJo/ywfO1nnV3qmSlNxROStdm4SwWAND0/5Wic08tmImaMabkDT19F03EBY7FwB4LSqY5XC9L5T5TVahyLzk7CuyyEOjedSda6WfJdmgkzta4EEEAgg2CD1C+d+NcMOHnc1ugJsd1HcLqfsl4g+TDSwvNiJwy+AcNR87+a9DHLbzeTDTeKSIVlKNLRirISLVYQlSIVFqiQrSEiEFRCiWq0tUSFIqIUS1WkKNIMrSdITpVWJCdJ0ginSdIQKkUpIQRpfOvM3D8uIma1paHTu37g4619fKl9GLlvG+X+0x2c6i36aVmLzfjs4f8AaqZ+GnH5VYDAdjBCPDX+I6r2Q/Re7HQfsXDuoj5BY/Dv6Lg5JqvQ47uMnA46L2Mda82Fo7rIwxCr6qcezK6NjLSfCe9W3VKTlppn8qx00ax8zNQspiXWsfKNR3LDLy1lavznwsPi7RvxN19F7PZNiaxEkewkizdazMcL176cCs5Pgu0icKuwVhOUo/s/EsLF39oz07J1evT0XVxWzpzcurHT6SpTpKl1OJAhIhTSIQVkJUrCFEhEKyEiFYQokIKiFGlaQokKUsinSE1CQhCFAEJoRJITQpCWquObG4gVYjoE9LcMwH1Wy4vFshY6SV4jY3dztgtX41xJsM0eIZLE7DTkNe5rrILR8WmmUDfuVbpaSpYmPM5g6V6brXnBkbnAmqJHkFkOJ8cZHHPIHA5G03K4G3E0NvFc7kxhc9xmec7jeRu/+wC5eWbdnB15bh/iSFhNyBe3C8xscRTwubYiCM29pa/XLTcQ3tAauq7Mgmulrx/bcp9wuBGmV9Bw9QaKpMPpvue3ZGcUBF2sfjeZo2AkuCxvBqkgBN3lBu29R4laDxPGntZGg3lcW9QNDubUTdNSN6/xn2hqNjnd5AcR9AvS3jWUgyAhpI1oivmFoGFx0cYIlbJK/LbR2r4Wk9zA0HMeutBZP/5Ux5Q1rwHC8jy14LT1Y8AG/AhTlx+yZS9OrYDKQDdgiwfosNHC13GcOxjS7swZHOAJaD2b/vVQ+IdeqwXDcb2kboWuMWe8ktuc+Pb4Gn3Xb9dvFZfi+Gdg54Z45DHA+Hs5ACRmLGl1106m/Na45TW3Llhflr7b+yZri4Nc1xbuAQSL2sDZSXMvZ3xOWXiUhkJZG+F+WPSrD2uaT3uy5tfFdOW3Hn85tlz8P8rL4/ttGkiFNKlowQISIU6UaRCBCRCmQkQgrISpTIUaRD3IQmoXCEIUgQmhAIQhBpXtYxMseBjdDIWftg19AEOYWOGU30ulo/IUjH4qpGAOui3+U28Eb7Vqumc+cO7fAyD8JEnoNCfS1yLDA4XiELhdZy3N1c0kiz3WuXO65P8AD0eLGZ8Gp57/ANPTzRgOxkMDHyTMsuaZcjng3ZogDTdYGHhxlLpC9rPeALCDbhV6EbC+i6JzBh2vyOOjr0P5enT1K13E8H9+x7l7gnT0OxVMstZIwksjD4HlnM8Znjsw7PlGYgnvogAGtLJVvFeAxtjkewOc7xIEbbP6eC2DC8JJ0L9O5pLj8m2pcZwVMa0tytu8pqyQN3foPHXXaLna1mGM6jZ+U3tGCjawe61gbXeAOveVp0vL0QmxAe3Oxzy5gqsmYEkWfiI0rurzW28qwlsJaPwql8Xvua8Ag/36Kt3pEmsq12fl2F2VxBsUNHkbDqCD+aubhmWA2MED1s7dVsI4MNw6x+8LI9QRahJhGjy65RlJ8Lux6UotuvKZrfUY12CDcoaBTRl02L3EFwHlTR5kjosjzxiAzh+HvUiRrSPB2hH1+i8804zsAFAEaDYAeCs4vxBr8VBC5uZvvOrcW6NwHXvTD8ares8d/Z8sYb/qcNK0b1t3EEH8l0Janyphw+YvaPdhZ2YPQvsg15W4ei26l1fw81i5/wCMy+Wf9oilSkkt3GikpUkgiQokKZCVIIJUpEJUg9SaEIkJoQgEUhCAQhCIKSMOBa4ZmkFpB2IIogriXM/BXwYt8BuomPnjeQ454mtLmtDvxaZfMLty1/nfhva4OWRjC+aJjnsDRbzQvKANTrRrwWXJjubdPByXC6+3NpuIOmw4J+JoF+IHX++5Lh3FCS1pKXBZGvZEd7zwv0N20VlPiF43YbsjJ4HRc+eO+3Vx5avxbjheIgClg+N46Mu/aHQAkNHU7C/ALyQ47TRYTmuGw2t+u9/MbLPGd6dF1Jt0LlrjsfZ1YNCl4+I8aiM2UuPU2Nmnp5rmXD8XJE0tzEjbc35X1V0GCfPO1ziTqBqXZQO4Dy6rS4ssbLduuYXiFtFaqvFYixoFF8Aa0FmgoDTovBLN0WNrSSKWOzSt815sY+8cw7ZdMwHc2638F7sFFbr2Wa4By3HPNLJK3MwBtCyAT1JrcLTDG3qOfkzku62bgWGDYWv6yAPPy0H6+qyKGtAAAFAaADYAdELtk1NODK/K7KkqUkirKopUpJIhFKlJJBFIhSKSD0IQhEmhCEAhCEQE0IRIQhChDWeeMFbI5wNWHKT+646fUfVc54tH7zq2IXZcdgxNFJE74XtLT3i9iPEGj6Lj3HYjE50b9HscWHoNP6iiPNY8kdHDkxTTkIJ2Xi4liw67IAHer67RoHXZY3GcHFixm8Suaa329Dyrie3bN4rPcHxEbdc7b7jofqsNDwGJ24yn92xfgslByvCRs71e/UeVq2Vx+15hGxt46NG3ptujt7s9FjYuW4qGVvZkbFun/Kte7swW3t9VhuXwjwyWDxNfNb/ypERh+0P+oS4fwjQH11Pquc8Bw32nEwRfde/Wt8rQXOr0B+a68yMNAa0U0AAAbAAaBdfDj7cHPl6NCaS6XKEk0kCISUlEhAklJJSIpKSSIXJpJokIQhAJpIQNCEIgIQhALmvtWwAEkcw++3I+uhHwOP5eS3Hm/mRvDcFPin0XNaRG0ms8h0Y31cRZ6C1y6NskvBY8RM4y4jEPfi5Xak/tXVGQO4MawV0F9yrnjvFfC6rWIJyDTtDdHzWUZAZK71rzpDfiNPMLI4HilV3jcdf9wuPLHfcejhlrqs7BwNxO9LJwcHLfvBYtnMHu0DqoQ8xENp5s+GyysrXbK4lhYND0Wu8QxmtfVLG8dLvLu71i3uMhs/7K2GGu6pllvqN19muIzY3tSKY0dmB3ZqBPnquwLlPs6wNU8j3C41+9lNH06LZOTOZB9pxvCpXXLhpSISd3wOaJGN82B4HkB4rt4p+l5/N+Tckk0ldkEIQgSEIQRSTSUoJJNJBcE0k0SEIQgE0k0AhChNO2Npe9wYwalziA0DxJRCaxPM3NEHDYDPiH0NmMFGWV/RjG9T47DckBaNzZ7bIos0XD2faJNu2dphwf3R8Unf0b4rkmK4rLi5ziMVM+d4FlzzsPwtaPdYNtAAFfHHflOmV575ul4g8Ol90E5mxA2yKMfCPFx3J/QBbZyvic+BgicdBEIx5N1Z9DXouWYiYve5x6/wB0ui8lvzQQMOnu6ehI/MFWy7W0x/EODkh0jBq3SRg3Hc9o6jvCwmXVdJx3CnipoxbhuOhFajx0+nksDxPgjZwXxjs5eo+67TZ373c7qB3hcuWG+42xz9VrTQVZ2aoOIMTyyQUR/d+I8U5OIt6brCyt5U+qz3L3AnYpxr3Y2kB7+g0stHe6vlv50cs8syY17XH3IN3O+87wZ4b2fla6lhOFNjYyGJoYwbDoBuSe8ncny7lphx77vhnnya6nkuFxNiBcBkiY3IwdzW/rr8yuSca406HjeInBLT2jWkjQ/wCSwb940+S6/jwBTOjdT+g/vvK4LzHL2mNxb/xSuPypv6Lrw+3O7xyrz/HiKgxD2sn2a46MlHSugd4denctwXzHw2ftIsp+Junp0Ky3COfsbgXARzmSMf6ctyR79L95p8jWuytcJe4rp9CoXN+C+2yCSm4qB8Dur4/2sXqPjHoCt74ZxmDFNz4eZkw/ccCR5jcLO42eUPYhNJVCSTSUoJJNJBahCESaEiaBJNAaknQD1Wr8e9pOCwYdcv2iQf6cNPN9xdeUepUybG0rzcR4pFhmGTETMhZ3vcGj0vdcY497Z8VOHNw7W4NpsAtPaS10OdwoH+X1WgYvGulkMsr3SyHd73OfIfDM7WvDZW+P2nTsHMntvjjJjwMJndsZZLZEOnut+J/rQ8SuW8d5nxOPfnxU7pe5llsDP4Yhp6mz4rFF6rEutH0/orTUTpY8ql89NyjqbPpt/VN8q8zgiVkOq61yNwsS8Kw8rdHxvnaSPDEP/Qt+RXJcPuu1exvEB2Bni/BO7T+ONrvrr81XIZvB4nLo8aH+u48jr808TwJpdnYPddvXz0+hCyLsGLcz1/3/ACK0DnDnjK88Ph/y2ktnlHU9YmV0H3j413ql67hO+kOZMHh5XGNjWzvHxOGYBvQlrmiyfAaA9VheDcv4ZslPbNO7MKa1ji3S8wdsBrW/is3wOCPEV2W5GaiQKa3Ld+pW4cOhELczmRushtFpIBYXDRw2B8ugXNbbd1t4mou5blqNrJomxS/CA03G4hoOUaCjqLHdse7LSzdmwu3J2/T+vp4rjnFuK4iSd/ZyvawNy2CW/BVuB6EloHiQAuhcn8zHiDCydvZ4uAASM0p91llaPwnqOhaRrut8e4yymu3sdhHPIBO5zO8hqfyK4BjX5pp3d8steXaur6L6UkeI45pTsxj3ejWE/oPmvmOBxLWuOpIzHzOpWuKsXwTljg5u/wBCO4r0zTBxDh8uoXhTa+tldK+VWYbHuYQ5rnMeNnsc5jx5OaQV5JH5ulItTsdB4L7W8ZAA2RzcW3/9RUnlnb+oJW7cH9seFmOXEMkwjtBZqSE/zN1H8zQuEh6k2UprG+ldPqjAcTixDc8ErJm97HB3zrZehfKsGKLHCRjnRvGz2OcyQeT2kELc+De1zGwU1724to6TCn+A7Rv6gqnw+kad2SWkcue1vDYyWKB8cmFlfTRnyOhMlfC2Rpuu4ua29Oq3cqllnlC1aF7Q/aUeHOGHw7GyYgjM5z7LIwRoMo+J3qAPot6fIGguOgaC4+QFlfLvMPFnYrEvxDvikcX+V7D0FD0VsJ7qY9fH+d8Tjie3mc9p+4NIh/IND62sC7EEqtACttfSWYphIJoFaTxog9D6IfsgrfqoEqZUCoE8Puuq+xrE/wD3oxuOxl+eZt/+I+i5TCdVvvsokeeIPgjcI+2geHO6hrHtJLR1fTnV0F3rVJ6RXS+JY04mcYPDOLXVc8rdom6e4Dt2hB9B5hYvjPs5jbhqgvMw5gNCbyHbv8lueE4cyABsbco6ndxOWyXHqTvani8S2KKWV+jGNL3eTQVSdVG3BuBYZ32qKNlnMRnbWjf2gDm1ppemp7l0zjfFI4YZnOJrLlbl6ENc0igdPerodlg+T8QyYzYgRND5HAvJ1fq7M2MC8oFkdNa1KxPM/C2RcQZiG4cFuhlYSxzHte4x3TSQfA3pS5rd9xvr1Wb5E5S7aNk89lo+FulOcScxPhdUto4nyUwuZiMM84fFR2WSDUG2i2uB3Yaoj9aK9fLEzfs7YQ7NlFtNVmjLvdPmLo+NHqsvOfd+Q+YW+PjpjlbtpXMHMgPC+JxSDsMXHhpQ6M6WHNyiSI/eYbb5XquGgUAu6e2GGMcLlkcwGQOiYx1e8M0wBo+VrhhWmHgJRtNRpXSadqIKY3QNAStCgStFqNpWgtjmILSDRDgdNwdKI8V9N8r8W+14PDzn4y0Nf/G3R31F+q+XM3xeYXafZLzPGyDEQSuDcjmSNvapGkED1Yfml7xVyb1zljOx4bjpOoheB5ublH5r5kxB94eS+gvaxisnCpgN3vij9C8E/QFfPeIPvlMfxIrKVoedUgVCyaSSkpAQo5rCkSq+p+aBFQcpqL1AI1t3s4xPZ8Y4c66DnviPiJIJGgH+bKfRahGszwLFdlisHIPuzwn0MrQfoSg+mm6n0/8AVab7UOLGDAOiYSJMRIIBXRgOeQ+rW5f51ubPi/vuXNPaRiGyY6KFxrsmB4F0C+R3lqab9VlkjDy9XL+BZhsLFTrLm9octZg5uUiqJ6nQV0TxPCftEmZzi5r4zG4nKHe+MzSGhoHukA66r38PjaIWMf8ADmFllk0AaurO9XSpfgyJmvjzdnmboS5ttreiASAehC59zW74+mvv92I5RxMzHzYad5bJCS+N1Gs/VpDWkljheg710HB8QbiYIpWfC7p1a5pLXNPcQQR6LBsiaJjNqXUc597KANhRAG9VV76lWctfs5J4rJDnCf3tHZ8oa85aFWAw6CrtaYWzqqZavbEe22WuGsb+KeP/AMSXLiRK697dpv8Ap8Azvnc70EB/UrkBXTj4VgSKaFZJJBDkIGkhFoESolyZVTiqgHwu81l8PbmNLXFulGuqw7fgPmvfwzE00hWxvaK7d7apSMFhm9HYjX0heQuF4g++UIT+mIxVSFIFCFCyTVNCEEbUH9PkhCACUiEKBCNeiY1G8g0QCQRuCBYKEIPqThkuaOFx3dGx3zauTc2/tOL4q9swbrrWWNrRXy+qELDkW4/Le8NIJMoa3s6ZVjLdkij8PTXe91ViMSI3ODmCTM0USG2KLxvXWwdK2QhW1Jza/wC8M5f0bXtiJj1ccxaGXrQrqG3vZ+gVWBlJx7Sa1a9umbai7qT1QhcfHld6b2NJ9uWIJxPD4/uiGWT1c9jdvJv1XNShC9HHwxJCEKyS6oCEIGVBCFARVLyhCgH3B6oidVoQg//Z</field>
+ </record>
+
+ <record id="employee_jod" model="hr.employee">
+ <field name="name">John Doe</field>
+ <field name="department_id" ref="dep_sales"/>
+ <field name="job_id" ref="hr.job_marketing"/>
+ <field name="work_location">Grand-Rosière</field>
+ <field name="work_phone">+3282823500</field>
+ <field name="work_email">jod@openerp.com</field>
+ <field name="image">/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhQSEBQUEBQUFRUUFRQUFBUUFBQUFhQXFxgWFBUVFBQXHCYeFxkkGhUVHy8gIycpLC0sFR4xNTAqNSYrLCkBCQoKDgwOGg8PFywkHBwqKSkqKSksKSwsLCkpKSwpKSksKSkpKSwsKSkpKSkpLCkpKSksKSkpKSwpKSwsLCwpKf/AABEIAQQAwgMBIgACEQEDEQH/xAAcAAABBQEBAQAAAAAAAAAAAAABAAIDBAUGBwj/xAA+EAABAwIDBQUGBAUDBQEAAAABAAIRAyEEMUEFElFhcQYigZGhEzJCscHwB1LR4RQVI2JyssLxJDNDguKS/8QAGQEBAAMBAQAAAAAAAAAAAAAAAAECAwQF/8QAJhEBAAIBBAEDBQEBAAAAAAAAAAECEQMSITFBBDJhEyJCUcFxI//aAAwDAQACEQMRAD8A83hEBEBGFRcIToShGEChKEYRhAIRhGEYRIQktvZPZapWG+4inTtDnAy7kxvxfJdBR7I4Zo75qOvmXMZe3wgEx4+qjI4WEgu4/keCNt2oMripMyJyIVrC9lMDvd41jyJAjLg3r93TI8+Rhep0dhYFmVHem0ubUd0z6cFG/AYJ1vYszGTCPkROt0yPMIQhej4ns1hHghrHNiDNLenKfiJB8tVg4vsSZPsKgf8A2PBY/wDQ9bJkctCSuYzZdWkYq03N6ix6HIqqQpDEoToShA2EoToQhQGpJ0IQgEJJySIQQnAJAJwCkABGEQEYRIQjCICMIha2TgxVrNa6d2ZdGYaLkrew+yMN7ZzgXOptiKbyCS+xgkR3Yc3neFX2LRDKL6riBvWHGARPnfyWX2Xxzqj6zjlvGD1IJ15DyUJdlVx5NxbQcAIyA0FvRU2PeQXSbi9zrx8imRvCBynmLOiZTi6H2ndgjTgNDnHHnyUAjEuENBmPdJib3AuJiQoquOJIhxygRxtJt9OJQqnu2tcWPP1BtpZRvYJPQZ6QAeEjP7ugl/jqvvBz72s4+M/eis09r1SPecYOsTExBn5dVTY+CM8sgIgicgeaayuBE2zzHP8ATrkgvHbTyc7cMom59AfXil/OnERvC1r3mMxObf3WW/ei3GJyA4ffJRj4pGUQeeufVB01Pa26DvSWmQfiBnjxPVZeL2JRrDepxTcfy5STaWaDp5LKNYtsJAIkkER0jLNTUseZ3rTIiJB6+nogobQ2FUo3cN5v52neb4xl4rOhdXT23G8CQRMQbGLz1nnwWXtWgxxL6Td3PebNuO83lGY5KcjJhCE6EoUhsIQnwhCINSTkEEQCcAkAjCJJFKEQEQSMJQp8HR3qjW8SAiWnt+r7DAgCzvZwePfuZPTeWZ2IoxRLj8Tj6WS/ECsdyN43eGx0k/ULT2RSDcPTa3ukNF+ZGnO6jwjy0WOdp1MHqb8PVJ1Tee2/9swORtdPNSWuhwMNAga3vrn55Jlal3oiLjdvkYABgeN0SjfmQTPeF+kifVCq0uceYuBaLDThF09rIDpOTj8zYD795RvqXufhniZIEQoSY9pBbc717wDqYE8EH9OJm2ZuZMKRrbtIjObi+YJ58PNNe+0AC7r3jjYRqgjc838iQCToZ5C5TXgTY6ax4g+SfUqTMETaNTkLTPX7KiqgwM8rxOdxEDmiEWUHOWzy5fNQlwEzwPpfPQQnvMkEwInQAxzAvqq7wIzN79RcmfvVSD7QZEiLGPCJ1UDsRqLxe+Xj6+aFarl0HISTkqz32Pl4qBaqATLcjccuR5jJNhNoGWzzP0T4Vg1KE6EoQMhJOhJBCEUUYRAQnAJIgIkgFe2R/wB0HgCfSPqqYV7Zebug0nWUGZ25YSxjuDgDnqNdNFvbMqf02Otk03mAfdjyVPtLhzUw9SIsQ4WnLeNj0J9Fb2eQ2jTGoYLW1Av5wo8I8rzWSRED3Gm3p6IvaQ10/ERBj15ZqH2sCJBuLnOQIOmSbUqHdGfxAExu2AvOuSJTPw0F5mLjI2nIfOfBMqaZzunOYBAPK565KH+Ic7elwkxrzBNrxnopg7dcDvADd0JPw5+o8SoBbQdDI/MYyHA5c5UVVp72d3DTre1lNTrtAbJuLujd/NyJA/4KipuaQbjMAXnjPLh5qEq9VvvXMcb8OGWaiNt2RwmLHMzHkdFdrtEWkSL3EZZeQz5Ks1tmm13HgeZN0QpucJBHHiM7a9TkoajsiTOZAEWz/VSVsKYEXvyIvefvgq1SiWgeP7AKwjrgESMx6eHiqjnQIH39yrBfMi8WUDwkoWMDiAd5mrb+djby81ZhYmwqv9Z4OZLvqfot1SGwlCMJIk2Ek5JBBCICQCIQKEUYSQGFe2b8XQfPRVsPRL3taM3ODR4mF2+wn4Wvv4b2RYWyA8hveOU74uHcj+yzveK8N9HQtqRMx1Dl8TjWtmTaLgxfXLrfwUOyalOs4spvI3WmRY2yAAnIQPRZfbzY+IoVA192H3XNyPXgVR7F7IqVMQNwkbufC+YPHRTFoxlnNJi2127djNMBxJiZkkT1A8lMdmUhaAbEjeJMcLSfvyVzG4V1M9/ugwC4Tum+X1hRuYSLgGIPAAHS+d+PFItnlE1mOJRfwNPds1oI5Dw00Q9g2fdAkGYaJjL5j1UpbNwC0EEOztxy8DZN9jYgZi4sbDW3MNnwUIVjh90nutEZ5X8Iy/VDcAyA7wv5yfpZSveW31yO9mZzN9FFXLBZz2NmD77Zvr3Z4RCJJ7RfutMcQDIHGRbxlRP3TbdHhYZaqB22KLf/ACX4RPpaf3QbtehIh5ANzIiD/wAc0Qe/Ct0ka5mZ8R9yqGJwJbqHAcbHSw8Z9Faftqkbh7dJzuOMfead/GMd7rh148ZUjEqDiIiMxeL5qpUaIEa8PvktvFYQPzzOULJxWHczO4ynIjqFOUM/Yzf+of1d8it5YuwMN33vP90dCbfVbasg1JGEoUAQgnJIIAE6EkQpSQRASARQWdm1N2tTccg9s+a9C2PsxlGi91TWTPif0XmwXfbTxLquCp7ubxTJ8Rf1BXPrx1L0vQ2zE0/yXJ/iDtH2lZrWvD2Umb0zq4m3WwWr+FmzRDnamTKxtvdnvZURWcSd5wDuAgOMfJdp+G+BNPD7zhBqd4CMhp+qzmcUVtX/AKy39p4YFhBC4/G9nyJNNxbxg2jpku7xzO6ei4faYmd48dZHkVnWcT20xExzDl9ourUzHtTyEibZLPrbTxJze7TXhkeoWhjdl73u1GjpLfkVi1dm1WZPt1ldEW+XPNMT7S/qOneJM53N09mEPkpMNinAw4StWk0G6ra0wvWkSxTgyFFUw5hdFUoDgo/4UAKsXTNHJ18M7mq289mR8/1XVVvZ6kDqsrFBnEFaRaWVqwGB22cj6/rqtUVmvFiDeP8AlYWNwQFIuF53cuoVvB4N5pgz3ufDmtInLC9MNChRDRDeqfCqUsWZh4IPnKuK7I2EkYSQCEkYSUiBOAQATgiSRCQRCAhegdhKja1L2biA6kciJlrjIt1kLz8LR2HtY4esHi4ycOLdfHVUvXdDbQ1Nl8vSO1XZ2m/DOpxDC5rjBNnBwgwdInzUuzAGMa0ZAAJuL2qyrh2mm4GXN18boUn281xWd8e7lsC4hcx2g7G060mXN47piVu4SqtB9EOURBb7XjuO7B0WhwBdvH3XEl0QsnZnZtlMOFUudmW7sggxnvEC3LJetbZ2U1wNo5yuUxHZ0k90OPVafUtHEqfTpPOHF0MBUmAJiLzIz4rpMBsYyJ1XR7J7IlneqeDRkOvFaDtnwbcVWZTDmamzN0GdFym2sWGEyeUBeibfobod0BXA7Uwkm7RyMT1SOJTbpzdDEtquLQ182tLZMkNAEm5lwsFbZg6clsua4WLXCCOoK1cFgAxwe0br9DAMdJt4qSpskOfvvku1Op5dFtN4xwwjTnyxsRhCwNzLS8fVaVPJWNoUp3RoDPkCPqo4WmnOYy59aMWwaknJQtGRiSKUIGwkikiEITghCKlIohBEICigE4INHYVUiuy9r28Cu/o1LDw5LzvZX/daeEnyF129GtLei5Nft2+n6b1B60GVbWWDh8SIlaeGxIOqwiXZaMwmrUic0KVMDhxTzUssfaW1S0GBc2F1OcM9szw13125KI0p6LP2bjKYa0Pe0Pde5uVtYOmJzmL2V68k12ub7XWa7wC5EskQRIXX9o277Hk6LiGY/dfuv1Ej5Ktu1scLNLCBOqUBCs04hQ1nRKonDDxnvRwUCkrOlxPNRrv04xWHl6s5vJIIpK7M1JFIoGpIpIIUUAnKQkQgiEBCmw2HdUe1jAXOcYaBmSoguw/DbBb1d9Qj3GFrf8ncPAHzSZwtWu6cK2B2QylXaxzt+puu392NxloLZzce9mpsFXglrs2mD1EhQdlWmpi8W5wvTd7PLXeJP+n1Um1qXsq4f8L7HgDlPl8lw2ndPL0tsUj7Wvh3cDOh/RauGeVk4F4zkH5HotqkFk13RhLVxFlBgqAed4ieEz9UMXiGtzi0eJ4KHD7VDrNMnkcuqRGZUmTO0PZCjiQ0uEObkbeSxf5zUwXckuAGZJPgSb+a6HFYnu997Wjm4D7C5jalNlZ4DarHATMOH3C2WrumEVbtZ7VhbHvZ8ljbRoBzQ5ubb/qpccKDXbrajeFspyzyUP8AFMMtDgTunIg6HyUTCszMLmBxXcuq+LxljGeSL+60HKWieqoaqNOu6ymrqbahCUIpLueYCCISKAIFFBAEUkkEKKaE5SEnBNJUNTHNGs9FIshel9kMAcPRbve8477hw3hYdYhcl+H2DbWqh9QAgElo/wAY06keS9I+LqqW/Tq9PT8lR2zGUqlU0xHtne2PMwGu+Q81i7ZwYqMc06/YhdZ7HebBzb7p+axMXSgkOEH59Fx3rMTl2RDktl44iQ6ZYYPPgeWq6LCbVAFuvVYO2MEWO9ozMe8OLcyjhcUHtG6Re8C3SFSVOpapoCs7vG3Dqnv7IYUSQHga7lRwnnY2UWz2u4ff1TsRinsGSROGsSz6vZrBgzvVmn+6o48dSVlVuz9GT/UfGnf+dlLtDalUmGsnwlZDnVibgdIWu5r9WI8Iq+x6e+Qwlw1Jk+F1bZhmshrQAI0RpggXUJeXu3W5nM/lAzKrM7pY3tk3aGM1MhgO6XAGAYsCdExlQHIrdwzhSbugS0iCDBnrOa57aWzxd+HBbF3UvhPHcIuw8sui6dOIrGHHq0tblKUlg/ztzY+JpEibGFew22qb8zunn+q1w48r6SDagORB6JKEkgiggSSSSCuXAZqniNpgWbfmsqpiCcyVE56vhXKzXxxOd1E+qoHFAuUj1L8JawvxG/6ln7eS9CxNnTovI/wqxobidw/EQPBwLfnur12q6QQdPsrG/b0vTc0W6DpEqPamz/aMsYcLgxl+vRVcHX3bHJbNN1vqq4zDWftlwGIcTvMcIc33hnbiOIK5fHYd9F+9TmJkt48SF0vaTtjgHVxRbV/qSQHtBLWn8rnDME8FSqUi4Qd13HdId4x7w8lzTWayvMReD9jbea4AtgmDI1nWeC6RlVjxcDhpdec4zZoDt6k4sd5g9eKFPb1ekIcN6LS10+majET0yxNZ5d3tB7GtiAPBYeLrt0+i5iv2r3vfcRyIIVLGdqhHdl3DQeZTZMp3Q0dsbSDRAzNgNSeSk2JRgSfecfv75rkX7S3Xh9Yy4/CL7reJBynhnquw2PimVADTIPT6jRbRTbCsWiZ+VzH1Yaeh/RV8C6Gm0TfqOIUG2sQLN8T00+qr7NdxM8OQVl8cOT29S3KrwMg8kdHDe/VUGV1s9rG/1Xf4s/3Bc8uis8PL1YxeV6lji090kdCtHDdoHj3ocOdj5rABUjSrMnW0NuMdnLfUeiv06rXe6Qei4hr1NSxJBsYUbVsuzSXMjbNT83yQUbZMqxKaUEldBBBEIDVBqdnMaaWIYQYm3jmPUBe9txIqMZWb7rgN7lOvgvnJjogjSCvc/wAO8d7XDOByMHpvXI8w7zWWpDt9JfEzDSxjSw8s5Hz6LmPxN7Tvo7PDKRLXVXbhcMw25Inw9V25w1t12Wh4Lj+2XZY16LqYzmW6wRkRy/dZw77xurO3t4dhCd8Obm0gjqDK9Tq9uxjHUvbsbTe1pDqm8BvuhsCTE3Djc/Frp52dkvpvh3ccDEOs13R2RWqymYuwyfeYcnDix2RK2mImHmae7TtnDsNoVmES10uvl397xb9f2XNYjGFy2uzu0wyKboh3uPjdM/lfzWfi6lOnVc9rd4ky0RLWnVxmxMzA0zPBc9tLnh3fUi0ZU6OwnP71TutiQHfF4cPmsraWLZTdFKHOHxQIb0581a2ptOpUBDbTmSblZAwu60kiePCdBzV60x2x1NTxRn1CSSSZOpOq3OyNR7K4cJDYO9wiE3ZmwKmIeLBrczpA/Wy6ars9lLdpU8yAXnlo36+Cta0dM9HRnO6SBNRxcdfsBOwFLvkFWMPhjCs4fDQ4nksna43tUP6j54U/qufXQ9rD/Ud1aPJs/Vc8t69PK1vfIBHeQhJWZDvIhyaigl9qUlEkiF5FNlOCskkm5pIOzQJel/hBtYCoaTj70i/PvN9QR/7BeauC0ez+0DRxDHC1wJ4XBB8CAomMwvS220S+kGU1DisODEgHiOI1Cbs7GirTbUGT2g20Oo8DKtHJc71Ys5HtbsajUxVP2bGubWa/epkRJpxLgCLG/jBXMY78PGi+GqPZM9wkiOQORHVel/y5jqgqEd5s7pkxfMxMTzUWKoCZjPPgVJivEPI8NsupSLmVwT+VxzkdcrKpjcJF16N2twwGH3jmx7I1zO7E56nyXDY+IM/OFrW3Dl1KYt8OTxL72W/s/Yg3AH6d53U/YCycJQDq/wDa3vX14eq6nAsNR4baLE89VS88tNGsTGWl2XrDCNe5zA4kSBxDrNB6xCr0NnG5cO8TJIWlicKPatkTAEeCvswt/wB1l26orEcshuE9U91DdBWpWwigxbAGnkiXlHap01T/AJO9ICxIWnt981vCfMkrNhdMRw8S85tMmpIpQigJJwCUIGopQkpFwJwQanKUmpP/AESlJwsUDtExpTgU059UHtn4V7Y9rQNMm7bjxs71E+K7hzF4V+G+2fYYoA5HPobO+h8F7s4rG0Yl6GjbdWAAumlpjROb4JuIqBrXOcYABJ6ASfkqtXFfiRjIoCjTP9R5Du78LRInlJy/xK4w4emwb263eAjeIBd5m60NpY41ar6js3EW4DJrfAALBxlQklaxGHPa0XlXwfeqnK4K7HYmEh3l8guIpEtcCNF6F2WqNqAObykcDqs7x5baFsRtntfxGH77VpUMPCjxLe+tLDe6FR0TPChWp2Kytsd2i8j8p+S3sYLLne0tbdwziTpH1+iImcRMvGdqP3qzyOMeVlVIUj7kniSfNNq5LpeKiCdCTQiiACUIooGwgnwggtBElAIlSkCUQE1OCANyQqIhJ6CbA4k06jXj4TPUajyX0P2X2j7fCsdMkDdPUa+IXzg1eufhDtuWOouOnd6t/wDkj/8AJVLxxl0enti2P29Ka1ZvaEOOGqgHNpy8ytP7Ko4lkyDkfqP0WTtxl4y7Hb1Wqwf+PcHiQ4u+g8E2sbQoMNhyzHYym7NtT5FwB8iFYxC1xnEywraaxatZ74n5hQqtutzsdtL2dcD4XGD10WI6+Smw003B2ocD6pbHSNOLcW+cZ/j1Vxl0rWwjAQsXZz98A6wCugwgssHbbpn7Rb0XE9vsTu4YjKxjxt9V2m1HXtK84/E7Gd1rOMfU/QK1e2etO3Tl50AmV/qpAFFWNwt3kk0IkIhJwQNSRSUBQkkkhhYSKCBKsCigE6UAQqFEBMqoDkV0PYna5oYpjpgSD1jTxBcufenUKpa4OGYII8FEpicTl9QNeC0EGxEiPPRQ1c+qxuwm1vb4NvFkN8Ilp8reC2K0yLeqwl6tcTy4Dtn2dDMV/FMiKrBTqDLvtgtcOrRH/qOK5DHu0Xp/bgzhJ4VG/wC79V5biLuWtOnLqxi3BYZkXUWMqQrVMWVHGuupxhE2m1cZ+cf16p2ccTTaeQXS4U9391zHYx4dh6d82jgulpjOB8uqwdszlR2qJd+y8e/EXETiQ3h+w+hXr21nQQfkvDu1mJ38W8nSB9fqr07c/qbfZEMghV3XcrBNlWp5rV56WEnp0JrygCCcggakkkoQnKCSSkFP0SSRIBQ1cwkkiEkoNSSUj1T8HMU4+0act0+hEf6ivScUIARSWF+3paHthzfbQf8ASP5Fn+oLzTdukktKdM/Ue6DnuWbjSkkrSwjt6V+HNQ/wzerh6ldi2nL78AUklzvQ8MXtI7d3o0DvkvB9qPmtUP8Ac70MJJLSjk9V+KpUNvBR0Uklo40rk1xSSQJNSSQNlJJJEP/Z</field>
+ </record>
+
+ <record id="employee_jog" model="hr.employee">
+ <field name="name">João Gomer</field>
+ <field name="department_id" ref="dep_rd"/>
+ <field name="job_id" ref="hr.job_developer"/>
+ <field name="work_location">Auderghem</field>
+ <field name="work_phone">+3282823500</field>
+ <field name="work_email">jog@openerp.com</field>
+ <field name="image">/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhQSERUUEhQUFBQUFBQUEhYUFBUVFBQUFBQVFRQUFBQXHCYeFxkjGRQUHy8gIycpLCwsFR4xNTAqNSYrLCkBCQoKDgwOFA8PFCkYFBgpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKf/AABEIAOEA4QMBIgACEQEDEQH/xAAcAAABBQEBAQAAAAAAAAAAAAAFAgMEBgcAAQj/xABEEAABAwEFBQQHBQcCBgMAAAABAAIDEQQFEiExBkFRYXETIoGRBzJCobHB8CNSctHhFDM0YnOy8VOCJHSSorPSFRY1/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAECA//EABoRAQEBAAMBAAAAAAAAAAAAAAABESExQQL/2gAMAwEAAhEDEQA/AMgDk3IEu1RFjy3gSEklRTZTjCkvC9YqFPYmAM1LYm5I1BJs6mWeCtSd1ANNTkKZiuoyUaxRVUmWU5YdzqV8Kb9+agnQWhjAe1NaHDQOAw0rrQ5tO413cNW226smXZPDW0bUOALQK65ZiuR+jEhstS5jzWjHOYanC7WhNRxrr03KQ+zOYwYgQ4tyrua7QdMJHmimxbQ6TQYQCAKbwQQacKZLsdBT2n148ak/XFMMZQV5ZeJrXyCkGpIcRUuFGtA3HdThv8d+4hGLvAClARpx4fBPRQ6l3HjvOvyUyz3UaVeQOAB3HfkDTEQadNydNlLnhrfVpU1BrQby0EnXSuqCAxmXrOI0aK1A45JyMZEUpmpcNjzIcHDeBTvUHLIe/fvSobOHGu4ZGuo8v0RUV9gaRUa8tPJCZbJ3s8yflorTPEB3WgkZAchz96h3ld1DUClKct2aCrvj3FT7gi+08UzbICD5fBENm3AyAHU6K+Iu4b3PBArwjyKtEcfdQW8odVGjWz9q7tFVtsZKzKfZbZ2biOaB39PjkqrEDAn4nJhLYURN3KHaWb1KickzMQD1yd7Bcgsm213dnOSNHKuBy0z0h3bijxgZhZikKkOzCSxcw5LzeqH2FOltUywp5qgn2SznB1zTwyINAQ0Oy0zcNfMinROMZ3W1+6CnLIwuq0by3XLIbvMqKZu1oeyVxriLTHGDpR1MZ03Z+aebGTGKnNjcDq5ggnKh5An6KmXXdTgXNGmnhUVpw0CMturuYaDWvx/NFVMSsFARyaB7VTlQHTVeut4aaNpiFQc8geFRrT5oza9nTWrR04+aHjZZ59gnPdoiYbstsdTNzTqRqddx7wyPFS7GO8SXULszQg58RrT3ohd2x73ADAeVa5K02H0elwGIAHLP9ApqyKoLNjBaQDnUl2uXkPciN1XTjdm1rmt41rTdodPBXu7vR81o7xqegFRwyR+x7NRx+qKKauK7YtkWjMnXQZHLhXVe3rsix7QGjTwVtNnDcgmntU1rGHbUbJOhccss8x5hVKzOMUrXcCPivoi/buEsbsqmnmsK2msHZyEbqlajFmNAsfeblvFUNvOFP7KT44Gfhp4jJO3rGis4vvuuQO0SVKsW1EearDlph4EtqQEsIJETk+cwozE/G5AnCuTq5Brd7RCWIjiFjV4WYxyOadxWv3dacTeoWf7c3fhlxgZFSLVcjKU8JppTx0WkLYU80qNGU+wqCyywd1uvqg5cKDJELosh7RulA8VHEDeD9ahOMs1WsplVjRpXMjT4KWI3CjM2ihBGYzO/hWjWjxWWljuqwB9ab9CaVyXGKh6KfsvZ6truAHWhIrTw+CXfliwSZaHTyz96jSNZoQdUdsFnaKZDyQKyOzCsFjUBOOEcApVnTEBT7BRGkthzUoRqPEFLaoiNLGoczERlCizR1RYGOWQbf3fSVxHGvmthnbQrOPSBZ8zz+vzWoz9A+w1oqwt+6T780bvNmSrWxvdke3oflVWq8G5Ksxnu1MWSpjlftpou6VQX6rUSkhLCQltREiMJYSI0qqBeNeptcgu+xt6YowCc25KXtjYe0gJGozVL2Ut+CWh0ctGmIfERyUrTH0/Gck5etl7OVzeeSZiKrJQ1T7CmnBLjQa3YLOHwxuwkYGNrhHEjPmO9TPRKtUZJa5xaKEOI3BobWm4Cppv1J4KXs9ERHF3qtoKivABw6mu7mkXrBXOhJLTkRU1AyI3Aku8ATwWWxrZm21LQaYaAdQKg7t5y96l7UHutdSnHn935+/VArktFHhpBGQwgihpkAPKv6KxX7ZcUeM6NzNNc6DpzUXwFu9qO2YKtWGXNWOzPSkFbKKfJTI0PiloFMglqo0mxyKTHIoTU/HIoJDkzIxemYDMlDrVfTAcINTTcgTalnO3BdiApqQB40qOv5q9OvJrsjkVXtr7AHwlw1bQj68VqJWe7PPwzkfWRVxtgq1UO7JKWgcyRzV8kNWDoqzFO2gjqwrOJx3itQvqOrSs0traPPVWM1GS2pCW1aQ/GlJLEpoUHtFyXgXqCBDLhcCNxqtQuW2CSIHiFlhCuGxV4ZFh1GY6JViNtlY6ODx0PyVcjK0HaWx42HmKjqFntKFIVJOi9jK8YckW2c2Zltj3tiApGwySOdk1rQaZ9TQIjTbpm+ziLS2roq0dQ5dzKu72ffwSrY4BjczWUk1zyGEFuQ1GhHMkpi4Q0xiLEHPbHRwFSRhqG0yGQ39U/AXSuwEjuPDAa9W7qV0A6jrXDYtcN0l/ezyz4EU06f4Vk2hoyyVJpTw4DJEjZ2wRAAVyG7p+QWaekPacvHYxZgFtTXIU1FBzT1fA520IY7u6e/wDyp9j29YMn+6qqlgu9oGOd1G665nwSrbeFgJDWwvJJDQ7EGipNAauNAOdVcZ1o1i2zs8lAHUPPJE7JerT6pBHJY4+4nMZ2oY4REkAmhzBIILmEitQdcuaK7O3g5rmgE016hTF1s8U1Qh953+2H1tdymXO7E3wUG/Lrxtc5gq8Cjepy1UbUq+9pp53YWVZTeSRTPgNB1SrvuZ1A6S1VOvdyArz/ADoh1+bEvkaD3nPocQqO6TvaCaIzs3siaPdaG4nubGyPAQ14wNw4yY6YTp13qscpUt3yAVa/GOozoKUy3KZZXulspa4Udhc01BA30pXdml3bsvJESXSFzXatdQnLeXDU80VngDW5UCi4yHZ+7hJaHF3dayrnHcKcfNXFnqZablBuW7gJrY0j2qj8LqkZbwiBFC8cHFVFdvRmRWZXuykhWqXizVZntCykhWozQlLakJxi0h0JyMZpqqfgGaB/AvU7hXKAEVNuS29lM07q0PRRKJNFRqkzccWW5Zze9mwSngcwrlsleXaRhp1bkfkhW193U7w3GvgszharkLlbNjrwfFFasDsJLYcX8zcbgWniO8FT4irFsxPR0rP9SB48WFsgp/0FVIul2TYJWSsdTH6za+sN4r4KxXJYSbS0DPE5rjllhpUUOmtVVL4kbG2zM9Uss8bnU1xvrLU86PHkFedgrwbPgmz7pLQOB3j8uvisVuLTtTMWxvI3A0/RYu6yOLi6lc9+a2y+4u0hfmKYT9Z66LPIrKNKfJIWKu243PdilqWjRtaCm5EmbKxyuHrtzGRaxwrxrUK0susOUuy3WGpaYd/+NjFlbBpGBSgPeNakknmTXJU+0XO2EjAKAE0BNaAnSquk9AOAVavSSp+CQq47NT1Y3oizHUKqmy9pyAKswdmo1DpsIca/qnIYaZZeS6zSqQ4Z1UUxK1C7Y3VG5m1GSDWzQoK/ZrEO0kdveAP+nihkTqyS/jKO2cEVduqfE6UVWui045JCN73fFVg1eMazPaqOj1q15RrNNsIs1qJVWolxpFU5GVtksqVZRmopU2yBQS6LkpcgryVhSVLsrK5IJOzt4dlMODsj8le75sglhqOCoFqu8tzCumyl59rFgdqMiosZ/NEWPLTuKn3TauzljedA4Yvwnuu9xKm7W3b2cmIaFBYyr2i47Vk9sDuMcfTusa0+8Far6PJImXe1kYq4/aSHKuNxcKjkA0DwWYXDO20shZKMXfbE8jN7SSA1wG8EbuIKuGyM/YWuazEUYWuDK6gscDTrQkrNai8S2yjXCuXSniOKrNoFQ5wFA0/PIDwoEQtE27d9ZodJLhgcePHdVRpMu+atEaipSqqN12xG23hRuqgYvy8RE0kqtR2gPGJx10UfayR8gyPgqpIJC3AXuFN4yPuWpErStnrc0S0JVztFvY1uJxDWgVJJAAHMnRYhdVpcwgdo4kbzUnzWoXNGJ4R2wxUzAcMhwNOKlWUajtIlaHREOH3gajlmkwX4WnBJk7nv6JVmjbG0NYA1g0Ay/wApFusrZBRwG+h3g8lGk02+oyKh2iWqDQzuY8xk14dESJyRNDr0t3ZWV76Z98N/E40HxVJ2Sm7xRvau+BhMA1qXO5A5gdVWNmpaSkc1Watt4NyWc7YwZVWkWrMKjbXR1YVYVndEppXjguC0wdaiFlQ9iI2ZBJXLqrxABUmxuoUz2SdhjIKC2WaAPZQqBA11mmDh6pyKlXRLkiVqswkGain77sonhqNaVCzsswkg7ir7dE5aDG7dp0Vd2ou7C/G3Q68irCodyXq6zzNkaKgEYmnRwBrQ+S0KS2s/aGWmI1je4PGeYr6wPPWoWXNKIWK9HxigNW64TpXiOBUsSNznflXX61Qa9p6RYep9/wCqnWCTHZoX7nxRu82itOhqPBBb3f3qHT86LLby6HEotNPTqh+zpGY4IxJd5J5HNUV62vBOZTMdijdqRXzQraWzWmOVxazFHXVpJI5FoU/Z67JZmtLXhtZMDhTMc0RZ7nu+zNFXAk/hNFbbOYWNDmNNSKcPNA7o2QmL3NfLhpTCQ0UIIqCa+Sst27NNbEDM9znV71ThbTF6tBuUagba72azNxaNdXAIQNpRO/BZftXDN9D3WjTN+nvViva7LO9jo2xtIJcSaDulwoS0nfw4JOzVyQ2aLDC0NaMuZpxOpPNRUWGMvwl7cLhrv96cmNBRTrXkckNl48kGc7QyVtknLCPJoQu634Z/FKt1pxWh7/vPcR0rl7lHLsMwK0wvsjqt8FU9po6xlWOCarB0QO/21YUVlsmpSQnLQO8eqbWmDsaI2dD4kRgQSF4vVyAJHNRErJamnVCSuBQXOxFu4omxUOz25zd6NWK/dxUXRq0MzDhqE3bSJGGu/I8ilxWkOCblbToUVTLRFgcR5JIkRe+LAaYhu+CDYVWa2vYm0dpdlnO9hliP+2RxHuKg7QR6FM+i60YrBKz7loqP98bT8WnzRK9LPiaeOf8AhYb8V6xW0seCtBuy8GmOp0NM1mcjaHojtz284C2vRWpB23nMlvFN2S34aAgEA60zr+ajx2upoeGa9lsbjmytfioq12S8MZDhI4GgFMQAoMxkRzKLxAuFHyYm60JrXkqBAJgMyARyCOWCJ7vWkca8O6oso9OAcmmnFS4BRvgolhsjW0JJ+uKmSvRpFtIqgN/Wrs4nO0yNOpyHvKOTv1Wf7aXrie2Jp07z+u4fE+SJVPnyckW05tKXbhoVHtr+6Ftha7rtFYwmL3FWFRbgnqxTLc2rSgy63tpI7qo6m3uykpUIKsn4URhQ6BEYkD65IxL1ACXL0heIOS2OSF6EBWw3kWo3FbA8KogqTBaSN6C2RMDxQ6jVVq9buML6eyc2/kiV3XjRwPmrRa7nbaYctSKtPAqL2b9FDzgtbN2GJ/iC5vzVimtgB72mjuvFRfRtsjNAy0vmAbjjaxrK9+mMnG4bgaZDVRb0loSOoKnqzoze1iocQ0Kg2aXCapUN4lmR7zDqD8l5LCCMTDVutN46hAVhmxEZ/qrVclpacjrp4Kgwz0+Sn2W+sJ1RWguDa+qDUaqZDHQfqqvYr9Yad6njUIqy/m0pXQ6/D65LOLqxRsy1+gkPeAq6dpWn2+GhUS07Ql9GR58+KLo1aLWXHC3U68hvJWW3q7/iJd/2jx4BxA+C1C7LKWtq71jmT8llN5y1mk5vef8AuKsZpFrbVqGWx3cRXVqE2sd0hVEzZi3jRWedtWnosxsltMb6jirxdV9h7KE7lUlUq/2UlKGBGdpf3lQgyqH4EQjKgQKa05IF4l4msS5APK8XpXiDgvV4lIOXBdRKAVQ7BNQrS/RlaMcjmu9RjMee4kho95qswAWl+hWzF01pJFWCANPCrnggHnRrvJZrU7TbFf8ANY7bM20EmCfJj9QCKlp65kEcFFv6jnYm5g8FZr2sTY6tlaH2d2QJz7M7g7l/NuVUvq4ZIe9HWSHXLNzR4esOf+VFoS51VHMpaag0XPn3hNvNQqJsN4g+sM/JShgdqgSehlciDkcDRo9OOH83vQ+zwOcjVhuquuaim7JZMZyq7zorzcFxYBiIzovLgu1rRorBQAZKVqQilAVhF5T/AGjvxO+JW7E5FYt6Qbm/ZbSQw4opR2sDjva40c082uqEifRmxWiqYvRlAhdgttHIneFoDmLTKrSjMqVY7UW6KPJquaqhy3TYjUqGnpE0gehUmuSjQp9xQeYlybqvUEUrxekrxB6lJAKUECwlAJATrQqh6OznAX034W9aVJ+uK130MGM3faGVwyumxV0dhDQGEdCHeaz28LH2dnYz2gMTvxOzNemQ8ET2Dtrg6kZAkbUhtadozUtrucNyzWpxWmTWoucYpQMedPuyt3lvnmNyGmyvg/djHFvj9pvOM7x/KicccdqjzqaHo+N497XApNXw5T96PQTDdwErfZ/EMuiy2BWnZaC1jtITgdvLRv4PZx8jzVZvLZC0QZvZiZ99mbf9w1b4rTJbhDndpE7s5KZPZmHDcHt0eFKsl6mIhlpaGE5NkbUwu8fYPJ3gSmmMis90FyKWe5aUqKLVrRslZ5s2tEbjmHR0oeZbofBCLXs1JDqMbPvNFaD+Yat+HNNTFUs9gpTLyROGzDh5DeijbE0jLgnf2McfdmmrhF3Sbq+CK9rXRA5bAa1D1PsjaZVqVFifhyp9VVM9J91Ca7mTNp3Zg5nCknckA5FwY5XJ0oa0k5UFfJDtpLrfJcQbho8QiXDya5shHXCrE+nz2+FzdxSjajSiIpp8LTqFtzC1ymvu8bj5piSyOG6vRAwQmSnyEyQgdhTr0iFqXIgbquXLkDb7I4bimzGeC0ea52ncoM1yN4IuKLhXoCtr7ibwTX/14JqYrbAi9yWYA9o7Rh7o4u/Ia+SkWi5Gx+sact6amtIwhrRQAUp47+f5qBd4W4vrU1UCy2h0bg5hLXNNWkZEHqvTmu7NBq2yF/NtnqubFbGtzBHctDRxbvNNaZjdkrrd94B5MUrezloasdSjhxYdHtP0F89WaUscHNJa5pBa4GhBGhBGhWx7HbUw3jG2z2ugtLfUd6pkpo+Nw9WTiBrqN4GbG5VjF0PhqbMcq1MLj3Dx7N2sZ9ymWO2MlrG5pY+neikAxU6aOGmYqkME1mykxTRf6jR9qz8bB645jPkib7JDaYwThe3VrmnvNPFrhm0qNB8dxPhOKzPoNexkJMR/AczH4ZckSu+9MTsEjXRSfcfTvccDgaP3/km29tBrWeMe0B9s3qPbHMZqbH2NpZ7Mjee48xq13kUTTdruFju80BrjqPYd1A0PMIRNclahndeMyxxzPNjvaHkjbIpIdCZY+Bp2jRyPtjlqn+5M3I1ociMnMd8Wlaxjapb4i00cDUcdfelRszVntlkDspRXc2VozHJ43fDoq9fL47JR08rWRkEh+tQKaNGZ1b5hSxqV7LYDIx4/lz8SGgePyVslhBwsplgcKbqUa2nvWeR+lO72NayN7nDG10hcxzC6mfdypuGRIyGqul2bQQ2iQdm/Ps64T3XCpaaUO+gqrIlfPO11yfsdslhp3K44ucT+8zyGXghDmbwtc9NuzmKCK1NHehpHL/Tc6jXeDv71kNnmqqy8XoKdc1JLFQlzQdRVR33cw8uik0XqCGLvpofNNTWV3CqIpTUAXsDwK5HKLkVIs+1fFEob9Y/VZ/iTjJiEw1pETmO0KavK1shbxefVb8zyVUux0lA4khvsje7py5p+2zUqSakjX5KYag2+2Oc41NTv/JM2c508R8/kmwvXDeNRmqiX2a7AnGZgGiVRAgBPwvoQQSCCCCDQgjMEEaFM4Vzn0Hu+vBBuPo49I7bU0QWkgTjJjjkJgPg/lvVxtFzUcZIXGKQ60zY/+ozQ9Rn1ovl6GYtI5LWtgvSdJ3YZ/tNzSTR/IBxyPQ+azY1K0eC98LgydnZOPqmtY3/gfu6GhT892Nc7GwmOT7zMq8ntOTx180qG0xWhhGTho9jhmOTmHMFRxYZIP3Jxs/0nE5f03nToclFPx3i5hwzgNO54zjd46tPIqRNZATiacL/vDfycPaCTZbcyUEUIIyex4o4cnNO73JH7I6POI1bvjJ0/A7d0OS2wV+3YP31Ga96vcI44vZ8Viu3e0kNpnc3ssUcZIaC97QTvOFrxTOqs3pT2z+z/AGWB4jkdTtsdQWjItjyB19Y03AfeWORXY6o/4hlSeEpPPPCosWO64bKQ6V8D4xGTQiR7mktGJxLXucHBoplvLmDeQoIvKk3a2aZ2IAkA1D2a1IPtEak0HGh3GZLpE1mbCyePEAMXdkzAJcTk0+s7P8McaEO2InicJGuikDSHENc8HI6d9rQamgyO9BsOyu0DLysboLTQyua6OZugeHAnGymgNK8lhm0NyPsNqkgfngPdP32HNrvEe8FaXd+z9qi7C1WNmOgDg2oxOY7VjweIyrxHJS/SNswbxskdrs7a2iFpEkdKPLNXsLdcTDu5lRWSxPqvHBRo3FpoagjipbjUVCrJAevSmnE7x5FOMcqPV4vV4oPcRXJK9QVxet3dR8Vy5UWmb1m9Gf2hQb318T8ly5BBCUfryXLkEizeqE8Fy5B4dV5JoOvyXLkDe5Trp/et6t/uXLkJ2+g7v/i4v6Df7Wq1NXLlhuhF4/xUPT/2Rp35rly1GK+YPSH/APpWv/mJPkqzY/33+1/9pXLkU4P4g9fyVtuD91aOsX/htK5cpVjavR9/AWP+i74lTLq/jbT1b/axcuQr5x2l/i5v6knxTMOi5cqkckb1y5ELXhXLkHi5cuQf/9k=</field>
+ </record>
+
+ <record id="employee_jgo" model="hr.employee">
+ <field name="name">Juan Gomez</field>
+ <field name="department_id" ref="dep_ps"/>
+ <field name="job_id" ref="hr.job_consultant"/>
+ <field name="work_location">Grand-Rosière</field>
+ <field name="work_phone">+3282823500</field>
+ <field name="image">/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBg8PEA8QDw8PDxAQDw8PDw8PDw8MDQ8QFBAVFBQQEhQXHCYfFxkjGRQUHy8gIycpLCwsFR8xNTAqNSYrLCkBCQoKDQwOFA8PFCkYFBwpKSkpKSkpKSkpLSkpKSkpKSkuLSkpKSkpKSkpKSkpKSkpKSkpKSkpKSwpKSkpKSkpLP/AABEIAQoAvgMBIgACEQEDEQH/xAAcAAACAgMBAQAAAAAAAAAAAAAAAQIDBAUGBwj/xABBEAACAQIDBQYDAwkHBQAAAAABAgADEQQhMQUGEkFRBxMiYXGBMpGhQlKxFCNicpKiweHwJENTc4Ky0QgzNGOD/8QAGQEBAQEBAQEAAAAAAAAAAAAAAAEEAgMF/8QAHxEBAQACAgMBAQEAAAAAAAAAAAECEQMhEjFBMpEi/9oADAMBAAIRAxEAPwD1cCTEiJMQACO0I4CtCOEAAjtGIQCEcIBC0ccCMI7QgKFo4QFC0cIBFaOEBQjhAUI4oFAkxICTEBxwEIBACEcAjhHAIQhaA4QhAIQhAIQhAIQhAIo4oBCEUBxQhApEkIhJCAxHARwFHCEBwEI4BCEIBCY+N2jSoLxVXVByv8R9BqZz+N38pJ/26bv5t+bX/mS2RZLfTqITzuv2hYj7IoqP1WaZGC7RqmXe0VcfepNZvkZPKOvDJ3kJqNm71YXEWC1Arn7FTwN7X1m3nTjQhCEAihCARRxQCBhFAgJISIkhAkIGAgYBHEI4BHCEAmi25vH3TGjRs1a13Y506IOnF1bymw2zj+4ou4+LJaY6uxsv/PtOD7u18ySSWZjq7HVjPPPPT148PJDFV2ZizMzudXbNvQdB5Ca+tTvmZnusoqJM1y23Y4yNNiqVphKxBuJs8YJqnMTIyxZ1OstTwtkeTaG/rN/sDfmthKgo4smrQNglTWpT87/aHlr0nHGoJkhxWXgJ8QzUnn5es9Mc3hnhHulCutRVdGDKwBVlN1IPMGTnm/ZftxhUfBuSVKmpSv8AZYfGo8iM/Yz0iaJdslmqUIQlQoQigEIRQEIxIiThDEIo4U44o5QQhHA0G9b5Ul83f3ACj/cZzq07zfb1nx0R1Sp/uSaVDaZeT218P5UnDSqrh5sA8oxNQTz0991oMXh5p8VRtedFjMppMawznD09tI97wo1CGBHKW1VlNPWNuLHRbAxHdYzDVRke9QNna4Y8J+hM9ong+Ce1eh/mU/ownvBmzjvTDy+yijino8hFHFAIoQgREkJEGMGESjEQjhTEcUcoIQjEg4rbuMqPimRlULSVlS17kGxJbzyHzmKGF8zNpvFhQlct/iLxehACn8BOS2rW4Dn3rsxsq0wPTU6DPWZcvfbdhrU035ta95g4yrmBrecTX2tVpYhqRDjhzJ77jXVhyA5Lfnkw6zrNnsKtPizuL5NqJzeneNlSxagqJz+Pp2uZZtvbq0gVJ06TS1MQzU++d2p0iwTi4HqqCSBYldM2Ue4nGvJ3cvEqjSNKQdbgFKqVB1U/QydCc6S1k4GqBisPxMFUVKfExyVRxAkk9J7js3a9DFKXw9RaihuElbix1zBF54HXp3c9LAW0udcp6L2T0XviqmfdkUUHTjHETb0BHzmjjz/14vDk494XPfp6HFCBmljKBhEYBeKEUCIjEiJKETEciDJQp3jijEIcYkZIQNLvOg4aZ5hiPYi/8JytZOc6zealemjX+FyLdeIfynLPXVQSReZuT9N/B3i1OL2cjm5/CXm1KmQMvD/CXUsVxi4p2XqdTMbalMmk50ytPOtEjgMc/eOSc/FebbDCm1IU2pqVBBAtkG6gaXzmoqeFjlfObbZtVHyHhYcus5nRqWsbE7KFwVAW3TLLpBFtkJn4ziAmBROfznP1MsdFjKTlkVRmbZ9P5me57vbIGEw1KiNVF6h+9UbNj88vQCeSbAwz1cbhkReI95SZsrgU1YFifIAGe2TTwzu1l58rrHERGOKaGQSMcUBQhFAiDHeRElKiQMmJWDJgyCQMcjHCpRyjEYpKSl6jpTQavUZaaD1JynD7wdsmAw4ZcNxYuqAbcAKYcNy4nOo/VB9YHS71YqmtNFZ1V3qDu0LAM/CpLcI52Gc5DGUsr3Nuds55Rjd6sViMUMZWqF6oYFeSKoOVNV+yvl59Z6ts/GLXopUX4aiBhfWxEz8s+tXDlqaUGq9rKNOVpTiMcWp8BGZOV8gZZiMKTwVVZ1dGsyhj3brfMMt/rqMvSFbF4dwFdqtEm3xBai+oOXnPP41zbhcdh6wdvDbn4dfnKsPxJnYj8ZvtqVKK8QR3qnkTamumX1mqwNEvU4nfw8kA8AHU3zM4LttHqd7SVuZ8J9Zr6a+IDzm2xtVUREXpxH1M1eC2xhcPiKT4rjNPjuy01DOQM7WJGV7A+smM3k4zz1O3te7ezFoYekAiq5poajBQHYkXsx1Nr8+k2s5rYnaLszGMEpYkJUOlKuDQdj0Xi8LHyBM6WfQ1p863ZQhCEKKEUAMUcUCAkpESvFYynRQ1KtRKaLq9RlpoPUnKVF4kxPPtu9smBoXXDq+Lfqt6VAf62Fz7D3nn28HavtHFgotQYamcimHujEdDUJ4j7EQr2bb+++AwFxiMQveD+5p/na/7I+H/AFWnm+3+3Cu91wVFaC6CrVtVreoX4V/enlrVCSSTcnM+ZkSZBn7X2/icU3HiK9Ss3I1GLAfqjQe0wklFRpcsKsWe4bn0PyjZGErUxd6KPRqKNWWnUYD3AsfQzw0T13sL25/5ODY53GJpD5JUA/cPzjUymqS6u429BgGK8mHF76GYe2VAAB05aZX5WM6Tend8qTiaCFiLl6a656so/ETjcVtVWAu1uo0IPSZssbi3cfJK02LpK+lzbloAZiN+bHmfTrMnaGIVc0YaXOc1JBduNrgai/OeWnpll/Vz4ktr6TT75YbuqtBSLN+TKz/rGrUOfoMvadbsPY5JFWoLKM0B1Y8jbpOH3vxxq42ueSN3S+iCx/e4vnPTinbNy3rTVs1x6Ts9ze1nG4ErTqscVhhYd1Ua9RB/63OY9Dcek4gNKic5qZn09sbtM2XiuELiRSZvsVx3Bv04j4frOnVwQCCCDmCDcH0M+Q6Fa03ex97MbgWvhcRUpi9zTvx0W9abXX6Qj6hhPL91u2ylVK08fTFFjl39IE0SerpqvqL+09LoYhKiq9NldGF1dCGRh1BGRgTMIQgcjvl2gUNm/m+E1cSycS0hki3+E1G5A9Bnly1niO8O9GKx9TvMRUL2vwIPDSpjoi6D116kzYb/AFdqm0saW5Yh0HkqeBR8lE5hzY+v4ygJkSYzImAiYiYExSKhzlwMoOstUwLOKb/cjbH5HtDCVibKKoSp/l1PA1/Y39pzl5byhH1zOb2/u3TrXZVVX5+EEN/OX7j7a/LMBha97saQSp/mJ4W+ov7zC37273CUsNTYitiiU4lNnpUrHiqDoT8IOouSMxGclna42y9ODx2zFBJL4amoYrxPWopexsSBe5F/KdFgN0sKqJVZ1xDModGGdCxFwVH2vU/ITy7aGDFMsAMgb58TEaWLcXiGV7KfedHuPt9xx4RibENUpXOasM6ie4u2WQKnmxmeeM+Pa55V0W08StMOxPhRSzHyAuZ4XicQaju51d2c+rEn+M9K7Q9pd3huAHxVn4PPgGbfwHvPL51xz65yTBkSbmSCxcNj5T2eaQlq1eRlZhAvDdJ0O62/GL2e16FTwE+OhUu9BvPh+yfMZzmRJqYH1XsLa64zDUMSg4VrUw/CTcqdGW/OxBHtM6cJ2MY81dmcB/uK9WmP1W4ag+rtO8hHzTvXiTVx2Mc6tiq/yFQgfQCaPELcTZ7bxi1sTiKyjhWrXq1FHQNUJH4zXtKMdGuL/wBXjMiuTW5HT1k3ECpoxEYxIqI19cpIRMsA384AxlqHKUMZOi0D2PsM28Fp4vDVGAFP+0KToFtZz9AZrt4MZUxeLq4ojwIycIYcSrTDcKqR73PnecFsDaLUK/hJAqIabWNrrcNY/s2956BtDblEJilAzqjDLTVRrwsGex0FgRmeslVq95LBr9cweK7Z8WjEfGbjI6TVbARkr0KugauaYysLW4W/3Ee02O8BZi1gQaVNe8BN2XiZV4T943vcnxWzk2VKGFwtQ2PdqlUWyBY+Mj6zN9d4ua7QNo97i+7B8NBQn+s+Jj+A9pzSiSxOIao71GzZ2Zz6sbwpiaMZqac2pgSL8h1/CWWlV8yfYTpyZOcnaVS4Qogp1jkRoIR6r2Lb0rRc4FwAMQ5em/MVQtuA+RVcvMec9nM+Vt3No/k+LwtY5CliKNRj+itQE/S8+pqNZXVXRgyMAyMDdWUi4IPS0I+ViZAw4svORJlFOIXLzGYkg3EoMbiUUHsxXkcxAcZMHykbyKmsOGJTJwKGMlSMVUSKGBkFyCGH2SD8p3WxaYZKNY+IFQ1/ia9zeitza5Kg2HRb9JweonYboYm+GKm96buuRs3CfFYGwt1vf7Ok4z9ES27icqlreMi5ybQEAg6m4NmPIzG3rxv9joKp1WiPOxo5yG2G4mOntcJn9wcqbcvM3nN7SxzVAqnSmOEfIAfQTyxm679RgCZFMSmkLzJUT3ck55czlIOJJMyT0yH8ZF5UQMuTSVsMpZS0kU30kWH0AhVOg6kSUqBDa0937FttmvgqlBmu2GqAJzPdVAWA9Awf5ieDkzsuzHfSnsutWqVab1Fq0QgCW4gQ4IOZAta/0grl6nUe8hxXlhylLpzHylRImYtccxqM5ZxexiqU7iBZVEqEtPwj0H4SoSKmJZIKJMwKaplY1jrGQU3HmMoVepm63VxPDUqoTZWVXN9BwH4jzNtbc85olMzNlV+7xFJgSLNqBxMPMDrOcvQ3u1NWuPUH9IXt5KwzA+yJyeJa5J+8xPnbledLtx7BrWGqgA8QBJzUHmL5365cpzFbW3TKefHPdWp0RJ1GsPPlBBYSIzN+Q09Z7IsRbACUvrLiZQdYRIjKW09JAjKMtYQqt2uwlxN9PnMVM2mWYRAgDMwRjr9PKPh5n2gIGXeVHKTvINKiLKDKSbSzitKKphWQrXUekgBCj8A/rmZNRCJgSJaVVq/ISVNOsiq6kguUsrSlmhVgliNZkPRh+MpptcemUkxy9JKNztqvcJ5i9tLAD4bfdufD7zRILmZeKxPHc8h4R11/q0xqYkxmoVYx5DnJAWkKeefXT0gzTpEiZUNZYNJDhgWyio0nKHMKswg1MyjMXCHWXOb5D3lQcV/SOO1pG8IyLyLQBiYwKmMoqGTZ85VUkVlUD4R6fxldat0jRvCPSYzHOUX0EubmZJMroiwhUaBVWaVgRtJKsikotJNoY7RHp7QFbwqPf5xHkOv4Syqbe0qo5kmEX3iivAwqUiTHeVsYAzTu+yPc2jtGviRiU4qSYVx5rUqngRx+ko42HmBOCn0F2IbFNDAPWYWOJqArfnTpjhB/aLwjw3aWx6mDxFfDVR+co1Gpt0Njkw8iLEeRlAFp6j29bv8ABXw2NQWFZTQrEf4lMXRj6oSP/nPKwTKhnOBYCRL/AHfnoJWCOZufKBkcUcqNQ9ImqEdPaFRqLaUO0k5MrvILqT+G0rGZiU5GSojOEZq6SuoZMGVMZaqAEtAkQskxtIExkKRuwkC5OQk0Qi9tSNeQHWBGu9zaSpDKUhc5eogSERMUV4VK8qcyd5UxgZOz8K1arTpoLtUdKaj9JmCj6mfXOAwa0KVKigslKmlNQOiqFH4T5z7H9k/lG1cOSLrQ4sQ3T82PD++Un0pCVxXa/ghV2TiDa5ovRrL5WqBGP7LtPnImwz56z642lgExFGrQqC6Vab0n68LKVNvPOfLm8ux0weLr0ErDECk5TvQvACQPELXOYNwc9QZYjUlb8svPISai38hYQ7yFzCnwzHqOQZeZXW0iinjvIESS84mkRGW0JUZZRgZRMiBHFKoLWlLteN5FZBbSS0HYg5c1IMmuntK6usCuWKZUZNZFSJivHINKAtK7waC6wj2P/p+wn5zG1LaUaSBuQ4nJt+6PlPaLziOx2ko2VRIVQWqVixAALEPYEnnkAPadrCNfvHtYYTCYnEn+5o1HXze1kHuxUe8+V6rFiSxuSbknUk6kz6A7ZGI2W9iRfEYcGxtcXJsfcA+0+fG/r5yiLG0QaSlRkV//2Q==</field>
+ </record>
+
+ <record id="employee_lur" model="hr.employee">
+ <field name="name">Luigi Roni</field>
+ <field name="department_id" ref="dep_sales"/>
+ <field name="job_id" ref="hr.job_marketing"/>
+ <field name="work_location">Auderghem</field>
+ <field name="work_phone">+3282823500</field>
+ <field name="work_email">lur@openerp.com</field>
+ <field name="image">/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhQSEBISEhQUFRUUFBcVFBcXFRYVGBUdFxQYFBUXFBUXHCYeGBkjGRUUIC8gJCcpLCwsFR4xNTAqNSYrLCkBCQoKDgwOFw8PGikcHBwpKSwpKSksKSwpLCkpKSkpLSkpKSkpNSkpKTUpKSkpKSkpKSwsLCwpLCkpLCkpKSkpKf/AABEIAKAAgAMBIgACEQEDEQH/xAAcAAABBQEBAQAAAAAAAAAAAAAGAgMEBQcBAAj/xABDEAABAgMEBggDAwkJAAAAAAABAAIDBBEFITFBBhJRYXGRBxMiMoGhscFC0fBSYoIWI0Nyg6Ky4fEUFSVTY3OSwtL/xAAYAQADAQEAAAAAAAAAAAAAAAACAwQBAP/EACMRAAICAgIBBQEBAAAAAAAAAAABAhESIQMxQRMUMlFhIgT/2gAMAwEAAhEDEQA/ANahBPhySGpQCUGPQyn2qPDUhq5GMWvLy8mIE8uFUekmmctJD88/tUqGNvcfDLxWZ2x04RnEiXhtYMi7tu87vJC5JBKLYW6fYxP9sKm0Ed/iDf1XfwoDmekKPGcTFdrVFCDQeFyuNH9Nmy8Zky6ESL2nVdTEUzuwCnm7kmVQePHKP2bykxMDwKrrC0hhTcPrIJqMwbnN4hWSqTTWiSqI0GdZqt7bcBmNidE0z7TeYS9QbFzqhsHILtmHP7Q37TeYXRGbtHMLhlm/ZbyCSZNn2G/8Qu2cNFi4GJ0heolhnmNToSWhLWoxnqoM6QNOf7I3qoRBjOFScerBwNM3HIeKI7ethsrLxI78GNrTacGjxNF81Wvbz48aJFiGpe4k765Ddktk/BsVZ60Iz4ry97i5zrySa+ZxVZFZQqxkGviuAY0mv1kiWW0CiO7TwG8bzySm0h6i30BTipz4B6lt91a02o3GgzAL7yq217G1G0GAS81Yx8TQ1oJpA+VjtewktrR7cnA4/W5fQkrNNiMa9pq1wBB4r5vs5gYRXEn+nojmzrcithasOO+G1t4ApS+84hdDkxl+MB8WfXZrq8spbpNNZTRPEMP/AFTn5Wzgwjg8YbT7J/qoH20zUl5Zf+WU6P0sM/swlt07nB/kn8B/9LvVRntuT6NIK4lFcXChQSkkLrngAk4DFEgWZH05aR0EOVacB1j+JuYOVT4hZZYVmOmYzWC5vxH1T2n9uGZm40Wtz39n9UGjfKiIdBZcQw57iGhrQK+ZKTJ+Snjjug/sKwocBoDGgXY5nxVpEYg8aZs12thxCa/aYaHe0gBEkG0NaHrpb/SyNeBcVUlsygLCVFntJS01c8MZuYXHxyCk2ba8OMCGvDxgaijm8QlNasK09Gd2k4g723+9UWaGTjHR4QiAOY86pBvHaw86qk0ss5zIjiLrrlD0YnaNNLixwI3X1BHiCt7Vkz06N+doXJn9A3wr80y/o/kj+h/ed81cWVM9ZBhvHxMafJS1akmiPKS8gu7o4kz8LxweU07o0lcnRh+0+YRavLcI/RvqT+xsrhXC5eCEwW1Uums6YUjMPBodQgHZW6vqrpqGukhhNmzFMm187/Jc+jF2fMM0NZ4H3gFq2gkq2JAo4AguPlcssDaxK/eBWkdHM9qw3A5OrzFUmXRbw/ILY2jUIOBoAQKXJ98ICHq5Epox3RXE5DDfxTU2+LqhoaONKjlVC3aKVFJiX2Ex7SCLnY76YL0DR6FDNQ0A7czxOaXBe9or5ZeCXEm6pcpfyEoK7BvTV4Aadg9PooQkoOpGdTB7NYb6EHniiHTi0GN1A44g0uQ/KRQWQX7CWHeDeK+FVkfiT8tZG9dH05ryMO/u1byRKs76J5/sRIJ+E63O71HmtEVvC7iQ8iqTPLy8uJjFkcFKam2p5gSwxbVWaTywiSUyw5wX/wAJI9FaBIjQg5rmnAgg+IoirQN7PkaCyjnnZEb719UVaJTghxtR1we2niDd5Eqstqz+qfMMpTVjvHLDyoo8Z51GvFQdUHx4qd7KoPF2ahNWcXFsRj3gA9toNA4bRvCkGUZq1MeI3G4g5C7Lah7QzSwRfzUQ0iDD7w2jejQyjCAbkPSotUstg9FkYj3AQorw34nOF2J7oOJpTmpsw4NurgPop+enWwmm8AAcAs+0g04aA4QjrO25D5peLm6R0pqG2UPSHaPWR2tBuaKeJN/snbHfWUI2UPI0+aH2NMZ51jUuqalEFkw9RjmY1BHHMeafOOMaIcrk2aR0ZT9JyH/qNLccwK+3mtiXz5oTP6kxAdkIjT50PkfJb0+eaM13C6TQHMtpklcUH+9WpD7WGSfYmiRDCfamWJ5pQo1iwvFcquF4R2CYb0rWL1c1FeBdFIieNKO9K+KCWwqw2jd7rVOlqK17obcdUGv4q09As0Apq7DX+EqVvZXFaB+KSxzXg0IoRleN6LH9IdGUbUupmbkN2nB7G8E/NVOpwVfFCM1sBycXon2tpFFjntvqNgw5KthsJOfz4Lg+v5BFujFiUAjRBf8AADlvO9OxUehUpN9i7JsbUZV3eIv3bk5Gki1us2/NW8QgApgdo0yF3HclyjaBUnZV2PNasSmF9R6j3C3GSmdeGx21oPksmiWY19COy4YOHuM1oeiUZxghh7zdikUcJD5PKJe1XAU62TcU/Dsw5lOsQTROtGa5EtUDBUGslhdR1ljEtRxTDppxzUcJTgaE7BXleto4zHSqe13xSTXtH900HohyYGo1hzvPCv8AXyUy2pmjdY7akoWjWkSTmTh8lNKLUiqMk4jk93Hb/r3VL1RIvKsp+LXs7BenLHsoxogb8Ivcd3zKu/zxqNsTyPZJ0Z0eDz1rx2R3QfiO07gi95pglMhhoDWgAAUAUWcIpVxo1oJN9ONdqYxF2R4kYE0rfuyHzUiCBTZRMSbddodq6tcGqygwKYoAkJg1xVzZFrGDED2G8Yg4OGYVWCuEpclYSdG0WfOtjQ2xGYOHLaDvClAIG6OLTqYkAmvxt9HeyPAEoIpmWe0qTDstqkw2NUhrQmAEVtmhN2jLhsGK4ZQ3nk0qxDUNdINpdTJuaD2op1BwxceQ81iWzjHosEOBDu7RA0cjrHlvdDjqos0kn+qglo7z7h4oPa24DmqYQUns6LFwoZc4AXucacSUe2TZogww0Y4vO07tyqdF7J1R1zhee5uGZ8fREJKKT8ICTsS5QI8IPdQ90Grt5GA4Z8lKjRchjgok1EDTDhjFzqng0a1T4oGciUYwaL8cgE2YkQ4ADzPyXIHavAr975VUpoQsJEUyZPecTuySTIjePEqY7C5N37UDCLnQVpZPQKE3uLTwLXVC2RZBoLLl1oQL8C5x8GFbHRLas6yshw95UhjDtVdDgDaeZXnzQbg4k8Vpxbtadqy7pHtPXm+rr2YLaHiaOd5URhGtKKASIlAAT3RkFiWmNtO1XurWJGcb+JvKOKBYMWtPddHc74W3N91IsWzOuiAU7Db3n28VXS0E3NF5N3ElH1k2eIMMNGOLjtKr+KoxukTYYoKfQTcUpyiizT7wwYn90ZlKAOQjWrshh7lUz4+vMmt7WsofFwp6KwnZkMbQZC5VdhisSI92ApTjfzp7oWEi+g1peabAAB4X3pxzk02JU92nHHlilOccsduSxhIae52weaRqOOJ9l50N32uQCU1tMUtmhv0VylZiI8/DDoPxOA9itRogDoqlezHiUuq1gO2gLnerUfoUcB7p4uwwXmlUliTZJMGJdEZj94ZObtBV8yCmGFdpBMasrFIxLdUfiNPSqwK25zrJh99Qzst91tOn84IUq6puoXHwFB5lfP8ABmKlxOZJ5o4fI4KtFIFYjn/YApxP8qouYhzRJlIRP2nH0AV9Di0BrkmSdsFipiLqjfkNp2KG0FoLnd52PyG4KWGXFzsactyqpyYJQgkK0Y1VaWbJ6rG0yFeJN5KrpGV6yKAcBeVfOZX+RosbCQ2S7Kg41JXNQ46x8gnXMp9EpqI92wcSgYYgs3ldaAEjUO3kmpp+qDTIV9gls1E2ztMJiWJ6qIQwHui9vI3LSNFOkyHHAZMUhvNBrXhpO+vdPksPhxqVocL88fdSIE0RjU5kitTd6Ke2ihxTP//Z</field>
+ </record>
+
+ <record id="employee_hne" model="hr.employee">
+ <field name="name">Николай Петра</field>
+ <field name="department_id" ref="dep_ps"/>
+ <field name="job_id" ref="hr.job_consultant"/>
+ <field name="work_location">Grand-Rosière</field>
+ <field name="work_phone">+3282823500</field>
+ <field name="image">/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhEQEBUSEA8PFBQQEA8SEA8PEA8PFBAQFBAVFRUSFBQXHCYeFxkjGRQVHy8gJCcpLCwsFR8xNTAqNSYrLCkBCQoKDgwOGg8PGCklHCUpKSwqKSksLCkvLCksKSwpKSwpKS8qLiwsLCwpLCkpLCkpLCkqKSksLCwpKSwsKSkpKf/AABEIARMAtwMBIgACEQEDEQH/xAAcAAEAAQUBAQAAAAAAAAAAAAAAAgEDBgcIBQT/xABBEAABAwICBgcFBAkEAwAAAAABAAIDBBESIQUGBzFBURMiYXGBkaEUMkJSsSNyksEIM1NiY4Ky4fBDc6LSFcLR/8QAGQEBAQEBAQEAAAAAAAAAAAAAAAEEAgUD/8QAHhEBAQEBAQACAwEAAAAAAAAAAAECEQMSMQQhQVH/2gAMAwEAAhEDEQA/AN4oiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiLw9YNcqWhymkOK1+jjaXutzNt3ig9npW7ri53C+9TWntO7aI5WlsMeE52MlyHZZbmkeZHesQg2uaQYXYZQQTk2QmRo5jM4gOXWQdIKgK5wZtnr7gSyFljdksQu5md8L2m4kZw3Xtxvmsw1M2wslqbVQwOlhY0vYHGIzMc44rZ4A5pHiN6DcF0WP6I082Vs0gcCMTMFuRhYQO/P1XvtdfcgqiIgIiICIiAiIgIiICIiAiIgIiIPE1q1ljoYS+R7Wk3wghziT3DP1C501q10nq5T1xgvfA1ojb3m2Z8SVuzaTLTwU0k9ThJLejiYWh7nOdkGj5QeJ+i5ulkxE2yub/wBkVblmtxF+NlZ9q7/Gyk6OwuoYL5lEGz35ju3KccpYcTTa3EZK3ZRI5IM91N19FLC5kmM/bNeGtObg2Nlhc7vcDe5bd1C03W1zMbsMUZcXcXyOxEkDP3Ba1gc1zTE8tIcLXabi4vY8DZbp2R6/FzvZ5IxlnGWWGIkC5cBm524Cw3BBupjbDeT2lSUY3EgEi1+AN1JAREQEREBERAREQEREBERARFGTce4oOdts2tPtlb0DAeipSRiN+vJh6xA3WF7dpJ5LAsNu/wCi+/TM3SVM0nOV9gDcXDrHPjcgnxXxNbxRViRlyoOjyvw3BfWGX8Ve9nD3hoyA4/UqdWZ6850Fmhx+I2A7OJVtkZPBejNAZpcMbSdzGAchx/NejWaNbBEGCzpH5vI+HkPzXF3x9M+fy7Z9RjZC9HQNcYJ45BI5hY8HG02tzvfK1r71dboJ7mF9iG26uXvdq8+F2E3IuGkEi17gbxbiupqX6caxc/bsXRM5fBG4kEuY03aLA3G8C5yX1rxdTcPsNPgJw9DHYE3t1RkDxC9pdOBERAREQEREBERAREQEREBebrLW9BRVEv7OnmdlzEZsvSWPbQRfRlS0XvJC6NtvmdkFLeftcy28jl1/AHebk95JUCeH+f5vVydh6S3K/oqw07nGzWkm17dnNS11JUWuzyGe4BfVS0j3EsjBc4jrlu5o5XXo6L1cbJ+smwHg1oDifI3WaaCkhpGhjmxix9/AY79pDt5Xy16SfTT5+Fv283Q+rj4IyRGTK8ZuDSS1p+Fo4dpV2j1Nc92OoADf2W9zvvHl2cVmVVpmOJl8TesODm3cvDn0xNJ7romDmA+Qn8Iss1tt63TMzOcfJpenaG4QALBavrYLPc23Fw9VsOsxWLjJId1/sZQDbwyWC1LmvlJBBBIII3WK+vhOWs35XLmOlNl9X0uiKRx3iBrHfeZ1T9FlKw/ZNo90GioWOa5pvK+zhb33l1/VZgtbzhERAREQEREBERAREQEREBeZrHT46WQcm4vwnF+S9NUc0EWO45EcwpZ2cdZvxsrmSn0GJa58ZyF3PI5gEZd2ayym1RjviLLkjDcXvhuDb0X16w0lPS6VYA9rXOuxrDe7mm5AHPf6L3oyL5LH62x6fjnNtseCNUYS9ry12JgYGg+7Zji5oI42Jvmr2ktBYo2xtfaxOLLMtPD1+iyOSpAGa+DEXZ237l8bq3+vvPPM/jyNJatxHB0MbGFhabhozF8+/JS0lqw2YWMkg97OM4ThcLYf77169Q0hw7lfo60HI7xcKS2VdZmp+2MS6ttGM4ndb4Re3lwWEu1YH/kaekYDaV0TQDc3bcl1+eTXLbldILGy+bU3VnptIe2PabU7LRkg2dI5rm5HjYOd5hfbx1bpm/IzJlsqNgaABuAAHcFJEW55YiIgIiICIiAiIgIiICIiAiIg0ltzp+gqqeqtkHxuy/hyNc4+gXswyHe05HMdxzCtbfKXpWUUfzVEgLvlYWWcT2C9/BeNqdWv9jiL8WEmRsTniznQskLWE9tgPJZ/fPZ1s/F3zXGQ9KR72/cLq2KEE3Ejmnsfl5HJXJ4GSsLXtDgeBHke9XtDxQtIa+KM4eLjYmwtmeKySPS6+SelJsXzOvwAcG5eCrGbZNtcZ77lfbpOGnDBhiZisBfFjN/zK8vR9HHAw4WBuIlzjvc4ni4rqxOvoqZ3OsA03dYAcyTYBbM0dS9FEyP5GNb4gZnzWG6qaO6acSuHUiGJt/ifewPcM/JZ0tPhj4zrzfyvT5a5P4IiLQyCIiAiIgIiICIiAiIgIiICIoySBoLnEANBJJNgABcknkgxnXrVtlXG175GsFOJiXPIa0NfHhJJO5akj1mifWPpWPb7MxkcVC8WwuLAcZvxxlxI7GhU2qbRhpFxpqcn2WN18W72l43Pt8gO7nv5LXl7ix8VNZ+U47xu5vW4qLSRidhl3cHcu9e9E6N4ucJ7clrXVbWgS2p6o9bdFM63X5Mcfm+tlkjtFn4XOA5AkLztZubyvV89zU7GSTmJgxdUWXk0UoqapkWeF2PFbKwDHOy7cl8LtCcXOce8kr4KjWF2jC2qja1xjlYMDtz2Odhe0cjhLrHgV158uo59bfjW3tR9DGloIY3/AKwR3kJ3l7iXEntuV7y+HQumIqynjqIHYo5mB7TuOe8EcCDkR2L7l6DyRERAREQEREBERAREQEREBCViOte06hoAW9K2aYXAp4XBxB/fIyYO/PkCtIa17S67SF2yS9HEbj2enLmMLeTze8nbewPJBtzW/bLSUTjFA01MrbhwY4NiY7k6TO57Gg2WqtaNrFfpCN0Mhiiif70UDHDE35HvcSXDuAv6LCy5RuguYlF2WfmqNcp2ugbwsn1e12kgsyfFJGNzszIz/uPXvWLM5K4FzrM1OV3jdxexuFul2zRAxkOadzm537Fg2vk5wNYODg4js3fUrw9G6WlpnF0TrYvfYfdf3jn2q/pjSjJhcHrOtdp3tA3+qzzyudT/ABq17TeLL9va1P2lVujYmwwmJ8TXPeYZmE+867sL2kFuZJ479y23qptjoqxwimvTTONmtlIMbzbc2QZX7HWK5y6WxB7fqr7gCOw7wtTE7ERc36l7Tqqgcxr5Hy0zSGvhfd5bH/CO8EbwN2VrcuiqOrZNGyWNwcyVjXse3MOY4AtI7wUF5ERAREQEREBERB4et2t8GjYOlnJJcS2KJlscr7bhfIdpOQWkdbNr9bWgxstTREWLIXuMjx+9LlYdgA7yvh2mazmtr5X3+zgc+CAfuscQ5w+84E92FYi7IdpzKoPeoWVUBUEbKllJCEEVcCtK4Cgo4Z3UwhF1GN3A7x6oJrcOqGzpjtEXqY8TqpxqC02BjBaGxgHeHYWg97itNTyYWk5bjkc+HFdTauscYBiORjjytbMxtOQ4DNSrHKjuI5Oc037DZXaZ3w8l9OsNAYKueM/BUTDwLy5p/C4L4r2IPgVUfTxXR2xuuMuh4MX+kZoR92OVzW+llzpa+a3zsGv/AOMeOVZPYchhYfrc+Ko2QiIoCIiAiIgKzWvtG8jgx5Hg0q8vi03XMgpppZXWZHDI955NDTdByXUTYiZHczhHzO3kr5s953lVxYziIs1u4chwHeoufcqioKqVAFV4KCYQqjCpIIOaqtUiFFBNpUJW8VVqm4ILFQLtPPC63kusdXJg+igkBykp4HX5/ZhcoFdDbH9L9PoiFpILqd0lO63Do3XYD/I5iLGstrmhuirOmA6s5Idu/WN/+t/oWCytyW69rmjsVFI8C5hlikB5NLsDj5OJ8FpcoVfpXXHkfyK6G2L0mDRYP7Sed/hiwj0audaI7u8jzXRmxmqx6La3jFNOw/jxD0cFUZyiIoCIiAiIgLG9pMbHaIrRI4Nb7LL1ibdYNu0eLgBbjdZItJ/pCaelx09C24jew1Elr/aOD8LGnsBBPeRyQafkk4DcPU81QBSMWHfvUVRVVCiqhQUBV1q+dxzV5hQTUVIFEFG/RTUCpNKC3Itq7CNL2NVTEjfHUNF8zcdG/LsszzWq5dyyXZbX9DpaDPKZssLv5mFw/wCTGosb107o9s8UkbgCJY3sIP7zSFzO+MtJa7exzmO+80lp9QuoJn5LnTW6k6KvqWcOnc8d0gEn1cUK8qm494+q3tsGqr01VHfNlS19uTXwtaPWNy0TBuPet3bAvcrf92n88D/7Ko2yiIoCIiAiIgLT232rhBpWdHecCV4l3BkJs0tPMlwFuWErcK5w2t6XM2k5xfKEtgZ2NY25/wCTnKwYHIoKTyoKCqkCoogtyHNXWKwTmrzSgugqStgqt0B7lCN+due5TcrLkF9+5fVq/KWVlM5t7tqqci3H7VoI8iV8bHXH+b17Oo1OH6UpGnd09/wsc78kHRNQOoey49VonafDh0i4/PBC7x6zT/SFviUdU95+q0ztipbS08o+Jk0Z72ua5v8AU5I6rB4G5DtP5remwKntSVUlv1lYQO0Mhj/NxWjmfCuhdiNNg0QwkWMk1S/vBlIB8gFXLPURFAREQEREBcqa+3GkqsE3PtdQb9hkJA8AQPBdLa16Z9iop6m1zDC9zRzfazR4uIC5NqpXPc573Ynvc573H4nucXOd4kkqiwSqKiKCqEoFF5yQW2K6FaZuV0OQTCkoAqYKAVbc1XFFyC2x1j2H6rI9Q5A3SlITkOmI84ngfVY49qvUtY+NzZGGz4nte37zCHDwyQdRvzafFah2uPuKVv8AFmPkwLa+jdIMqKdkrM2yxteLcnC61TtVt0kI+Xpj54UdVgR39w/sumtmMGDQ9EOdNG8/zjFf1XMT7kENFycmgcXcB52XXGhaEQU0MIFhDBDGAOTIw38lXL7URFAREQEREGvtuGkBHoox3zqJ6dgHMMkErvSNc6TOuVt39IHS4NRTUwJ+yikneLZXkdgjt22ZJ5hafcVRRFRFBUKEpyUrq27MoJsClZRapAoKhSBUVVBMKhUbquJBQq002N/NXiFbIQbt2O6Z6WhfA49amkLW/wCy8Ym+RxDwCw7aZVYqzD+zjHm5xJ+gXlbONPmkrmXdaOoBhkvuuQTGfB9h/MVZ1nrelq533/1C0fy9X6gov8XNS9Hio0jSxEXDqmMnuZ9pn+BdWLnLYxTh+loj8jJ5PBsRZ9ZAujVagiIoCIiAiIg5v24Sl2mH3+Cnpmju67vqStfFbG27QYNLE/tKSmf5PlZ/6rXCoIiXUBxVob7qTyqAZILoCqqRlSc1ACkCohVQSVLKiICoQqqlkFA4g3BtYggjgQbg+a+t0hIud5JJPMk3J818xZkrjnXsFRtHYJDevldb3aYgdmKRv/Vb5Wlf0faY9NVP4COBoPaXPP5BbqSgiIoCIiAiIg0x+kRoXKmqxwx08ncevGfAh4/mWlF1Dta0A+s0VMyMEyRYJ2NHxGJ2It8W4vGy5dKoKiKigjIVJii5SYUEmK8FaCm0oKlqpdTBSyCKrZVIUC5BUlVYFFoV0IITHJAc1CcqrT9FRurYFpJrXTwG2KRsczeZDbsI9QfFblXL2z7SfQV1LLcjDO2N9srtfdhB8HrqFKCIigIiICIiAVyJrlTtj0jWMY0NaysqA1o3NHSE2Coio8ZERQRcqsREFwKTVVEFQqoiCDijURBcCqiKiy7ejfyREHo6LeQRY7pGEd669hPVH3R9ERBNERQEREH/2Q==</field>
+ </record>
+
+ <record id="employee_djj" model="hr.employee">
+ <field name="name">佐藤さくら (demo_ja_JP)</field>
+ <field name="department_id" ref="dep_ps"/>
+ <field name="job_id" ref="hr.job_consultant"/>
+ <field name="work_location">Grand-Rosière</field>
+ <field name="work_phone">+3282823500</field>
+ <field name="image">/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhQSERUUExQVFRMVGB0XGRcXGRcaGhwcGB0XFxUaGRocHCceHB0jHRcWHy8gJCcqLCwsGh8xNTAqNSYrLCkBCQoKDgwOGg8PGiwlHCQpLCwsLCwpLCkpLCksKSkpKSwpKSkpLCksLCwsKSksKSwpLCkpKSwpLCkpKSwsLCkpKf/AABEIAKoAgAMBIgACEQEDEQH/xAAcAAADAAMBAQEAAAAAAAAAAAADBAUBAgYHCAD/xAA9EAACAQIEAwUFBgMIAwAAAAABAhEAAwQSITEFQWEGEyJRcTKBkaGxBxRCwdHwI1JiFSQzcpKy4fEWQ8L/xAAZAQACAwEAAAAAAAAAAAAAAAABAgADBAX/xAAnEQACAgICAQQBBQEAAAAAAAAAAQIRAzESIVETIkFhUjJCcYGRI//aAAwDAQACEQMRAD8A4i32fLWiSFDKCwBIDaFRop1PtaRUvH8PhrIKjxqTy/mPL3V3nDsbmwzuCe+t27hWbYKqC1pdCDMgFtTtNczxLEs17COGGbKw9jaGMa/iMHekTl4KFx+GRL2AAZBlGs+XIijNw0CPANfTpT2LxR7604yE+OAVOgkRJ5kcjRsTiSzq4yAiY8JmPDvyJ60Ll4I68kfG8NCtblRDLIiNdYnSsjhgn2B8qrcUxQ+8Yd5RibYmFIjxsOehaI12oB4iVuMw7vM28KdNOvunzqcnWiVemYwfB1N7JkTQ7EoBtO5MUrZs28ryEkKd8u/KKJddWJdjLEzAEfAcqWv3iVgII5c6JZ6f2UG4Opw7OLa7qA3h3J9edZscFBsO/drCsozeHSf2ag54B8RXp15aVfwHaQthjh2ywXDgldTlDAa8t/fUfIDhS2E/sc9xdfu1CoBr4fMUReCf3ZrmRQBl1OQbnrVE8RzYDEK7DMQkDIYkMDvPhEQIpzHYwNw8AspbOh9g9QI8hGlLchaj5Id/hEW7fhQFmPNZgLJ+tGHBjNrwpLTAJWTHTeneJ8TzJhPGJUXN7cwxAEzOvpygVrjOK5rtgi4ZVSP8NZiQSJnn5760tyDUPJpa4WyYkqwAIshtI0BOk09gLeUtoT4f1601w+4MRxG+QxZRbULKhSBrpoTPrWe1XDWV0yEKAknQ+Z6GqJp3bOngmlCkGwXClSwyKWa4+FvsR4Y8L2xHTbnXKfdc1zBqAQ5F0wxQCACQQ0gRodzXQ4K+ndJkGRvu98MMnhOqTADA6x7qkcOH8bCAOQy2sQPCm3heIBY/lWxcvk5b4WR8XlBsciQ8zlgEEbEEg0y9gDJ4pzA+UDbcz0iiYpyDhYfMwsuWJXLux2j61ZxGKL27eVtUsPmENqDcXQtzEwflzoe6yVjOX44oS9bUGctoSY0Ek7amkjeXU+Q0/fvq3x/DG9eTxzCKskGFVVzEH+mW+VRsZhQtxxIhUkDbkN+porRZFJaB220knU8qYw6knLqZ5DfXlU69f19PLrt9K9K+zPsyC4vXNWgEDynUe+NfeKWclFWX48fNka19mN91zMVQcl3PvqFx/s2+F31A3/Ka+icigQBNcv2i4AlxXBHtgg+/nWP1pJ96N3oQcddnkeDxSnCXgS0jKV0BkFgCCZERVrilgLhLLT7bhf8A1xoszo5Ma7xXJLhyFdZhlbIfUMI+nyrruLYtzZwKtczhc7FQpEmMusgzoCOk1st7RypRgn2L9psKLAwcktntloWCdTGg8uta2rIbF2bWS4CVBIbIh8URGYxW3bTErfuYNUOTJh1khdcwJYnkToaY4TfycUtuL1wwqglkDGAByL9KCuuwVjst9jLEcTxq7BIXUqdiea6VR7aBRcJbvBlsZlyBSJlvaJ91S+wGJN3iOPdmksM0wF3Zo0kxWv2n3f7wnSyP9zVVNXs14+l0c5a4yBH8RPZdZzCTnifpWMPxUJdS7nBKK4GombggH3Vz9jhisVGXckT7p/KqGG7OozhchIyu2k65YjX31dxl+RleTCv2DjY5e8V8wlUKbjctM01a4yoD6iWt5JkaHOHn5RFRuIcCQdwFQr3gYk66wSNPhW3/AIuCqmG1zawdcsT/ALhQqX5A9TB8wf8ArHL7NcLsrSe72U6yo6eZqI2Ha5daDqIn9PcKt4fggs2xcAcZswO4kdCdN6d7LcGD2r5Ut3kBgdOs6kTpTdpVZbFxk7iujnsNwG5cbKq5m0HIDziTXr3A+OdwmW5hzbAGhDKwOw3Fcrg+GXGym0xAyiWUDN115E+dV+J8MuLhCDdctA/xGmfFvptG1ZZzvpnQxQcdHV8Y7R9yPBkGYaFtQNY1ApDv7rp3hxC3BqSFtqB10zTRMNwpb1lOQNvKwHONQR13nzo2A7L20VFAXKkwAPPfnzqm1Rc4Ozx7jOAU4y8UYBHYXBPXUiJmZmqOIvi4LMsP4SMkyOcxt5SKc+0DggbGWk3lJMb+J38q5bhnBldzmByDMdN4TN06CtkOTimmcrLLGpvkuzoL2DW9eS4b6LkQJrGsc6rYPh6JifvP322HiNxPOdc3X5VymM7IlAvhuSQPwnnrppS9rsfncr418Jb2CdiB+dFJ/LEcsV9RO87K8JW1irjrdW/3oBIX8Pi0JIOu5ql2z4zhLV0jEhmYoBCgk5TmnSdB161zP2X4M2cRiVkmETfTck7fCur7Q4O1dvS6AsEGpk6a6aCq5utmrGrXtPMreKzPbci3KtoCGjRSTMdZNN3bguX1cC3s/h8QBgLExprJ202qdh1GW3vq55cspjej32W0bZYnVX2A/pjn9auSic6ayfCHeK4qbmDIFslVYR4h+JoLdfSrGKxWa3aYC14e9IGZhAJQAlYgmZgc65u9dQvhdSNDOg0MtGx1qpi3RLdlc+Ym25AVT7RZYEk+QPpU4xA/U8DGOxMpZaLZAziAx0BIgsvnHlTPCsO1nPBWHh5XUCVEqW89dvWpnFVVLdlC3iKkx5TBOpMbVR1GJKIWeLYYgK0ABFJPMct6HFbRdhlOLprZ0HZq8oOSB/30rHbS/DKmQlACSVGuY7etS+AYkC7JO5I9+uWfWKZ4vfv9+AArJA1JjXyOn51ia9x2oS9tF3gnG3NlB3DzpIMKY2kSa6ay5A1Poa53h/elJz2c0RAzE+hH51SwyXFJNxlIIEbiPP3c6Vosba2cnxXED+1BmyjKqEFnKwAGJ1989a5LgmMAw14ZUzm1cOfP4jmmTP8A886e4lxu3iMZiLitlVFZQSrEHu1iZA8yaj8Mw5+73TDALZkmDEMyiZHrWyMEo9nCyyk5ukdPx++CmGUJaJTJJ7y54oBiTEsDpTfZrEgY29cYW1XuoyB2T8W5B3PQVO43xbL93/ijw5TbItkGIYfCdNac7JcTL4u9ca4GcWsrAqRsWmIUggASaDiBWZ7KHNjscT/R+LPGkwG5gUXtLcujEKEK5cq5pMc/Wlew7f3rHwQwzgSNjppGg+lPdoMSVvMc2UqiwI3k+KTmEabb0mQ2Y26PNbQ8NvMROc/g8l0nXWj8QsKwsQwVockZDGhGWZOs6z6UBCvh/iDwknceUCjXbisVOdfCCNwZzGZ3q5TgZ3gzGuMXMcPmZZAMjKQNCSJ85mnMbZB7kq4EIWiCIIYCAYjXzpRwGKHOJWeY50droMGRoCNxzM/8VPUh5FeDP4H+JWwVsPnBIUggzO8DXLBiKLjGdcXeNq9lBtFPxAmbaiPZ5zFT8Zj8lsMfwiPUmTpUz+3yxYkAFjqB0AAqxJPQtZE6kPYnFMjBlJGZVb1kCuh7L9oQzAXD8aS7M4FMbYNowL1knIfNGMhT6EkA9aC/AXtXTbuKVYeY5efUdaoyQS2bsM29Hq/DMRaKlhAO0jep3aTjGiKkd3mysxmPZZtCB5getSeEdmiIkzMQAT+tG7c4j7vgZVRk7xLaHzK52uH0AhZ5knyqiCuSSLcsmoM8+4JeYYfEjNbytbfQh5kspkRoD4edFwjD7ldTwglbSzmfUZwTKxHIfCpuB4gvctZLBSwgFttTO8TVZcOxtd2GUg5df8pneNa1ycU+zmxjllpFbj2LzthT3lv+DABAfXKNSfCOUCPPWqnYrGKmIxF5jabvEVcpzACSdpQ+Qn1qJiS7vbbMoNvQaD3ctaa4W7W3use7Y3AAZA65iBGh9KRuFbHWPMtxB9icatu9jZI8V3KImDBI05xW3a7FkX9GI8K6A7xO9JcG4a1lrksGLt3gjlJjnV69cwzZ/vF0pm0gRtH+UnzqtyVmtQagrPMLvCwoDQdTGpHkDWw4eCs5efSn+Is2S1mCgj2fBGhH0rOHxQVWcxMQNBpt8TWqLbOd/YqvCgFzOAq/E/CtVvWV1CS3xjkDG1L3LxadfdQu7ph1fkcxmON5hpAGwoF/B+AEeVfrIp642g8tv0qBMdlONthsQtweh6g6EfP5V9F8L+7cRsLnUNA0P4lPQ/sV8ytbjavYvs/vPdwWew0XkDWmE7kKTabpuP8ASaNX0yW07Q2narB2sUcMWZbKOUa8B4TECJmQsyC3KKV+3rHqLeGw6REG5ptAhEjpq3yry6xbuWrrWrylXG4O8jf4zVHtHijc7gM2bLhraj08RA90iq4wUNGjK+UVKyG+HlA3Pn1oGWnrTQoHkfkaFjbGU9DtTUZwKZcpBUa85MiNafu8NtNZVkZc8kMpMN00pGK2tjYj+b/upRCl2dm21wE7EdetXsUgdJKgk/igTzG9c7w6Q12SSc3Pfauiw7t3YiMsNmEb+1zrBP8AWdKFLEmchfvaJIaTqMx01FMXLb91C5SJkgwaVxOqoDm020EUXErKrGbNDE7QNREAe+tys5ftESNdRlNGyEiRuPn0NARzOv0p6w1OE/LbESNjQ7eZZAPh5g6/Cj4YQWXyOnoawyRNQgIJXffYxxILi2sMfDeWR/mtnOvxGYVxFldKY4FxA4fFWrw3turfA6j3iR76gS/9o+IDcWdRHghT6xJ+oFQMWZaf6VHwUVnHYk3cY9w7uWf/AFEn5SPhQLOoJ6n/AIoWaMkeMEvsxloWLXQc6ZIpfF+yahnAqNBTiJBH9In3nQfAVpg7UgVh70lgDAHz9KhBuxzPM7/SrdjExh3EweQ01nNM8/hXNYRoPtb7D05nyqpfd7aMnKJMQRqNNfyrFkj/ANDoRleFIiG5aMS+1FLq65UYsQDoOfrSZwoyk5dqOcGwCgHLn8iPyrSo/Zg9SP4iRmfZZfU/rTuHedN6HcwFxNwT13omGmdAT6fLerALsZyQQ3uP5UI3J3/mj8xXqNr7LLWTx3bmZkWBC+B/xSNmUnTpXAdoeyd7COyXBKtrbuLOViPoelIppui2WKUVbE7AoV4Q00bCtKg/vSv19Zpyo0w3+OT/AEyKLhV8I9/1odj2lPQj86PhPYHpQL5O8a/k1uLSeL2A61RiRSmJXxCeQolAW0Qq0ggzEgH99f0od7EEzRrRCJG7VCBlYLogJadSdutVLHELCoUu3GXMdVExHLYUjhrBkE6Vvh0tuXDLLrrMaH/qqMsLdmrBJ/pRMceDcadDRrryEOYyIGw+s0s10ZJ5+tZv3RlWN9+dWpIxVL5Cvgo1NwA+UmtrdsHc6eQmaVfCMTIBajYe2eenTn/xTjHsP2bdoWxNprd1wzWoCz/iFeZnnGldRxfCLfRrVzKysND59ejDzFeC4XENaZWRirg6MpjL6V0WL+0XEsCJRRCqSq+LMPaYGdCYHTWs0sTu0bYZ1xqRC4hgWw2IuWXHsmJjQ/yn3iKETNGXHPdLM7FjJGZiSfnW1sgDy6+dXr7Mjq+hRNIo9icg0MxTXe6UNr8mBUDfVDPBuz2JxJIsWWuFd4KiJ2mSKW4x2YxtsnPhb49EJA9YmrnYTjTYfiFhgYDOLbdVchSPnPur6D4phNMw32NLNtK0GCTdM+Pb1h1aGVlJP4gR9aaw5GaBrG/mTX0Z2j4JbvWLqXAMrIdTrGntdCPMV8528LDEEkqpIlOfX30uOfMfLj4aY/nJ3OUdNTW+HuwSoUEEGkspXZR75FMYO7qTlgkHXf5608laZXF1JNE1bYyGSekAfPnX6+gKrMzpz5ekUUIIifnW3dgiJHxpOcRvRyMDebKoCyDz8RM7RpyoNhtQPM6061hTpI+PnFTvZbTkaeM1LQJY5Q2URcJJPJfqf02rFtTlDcySf0H0+FaWjKx502ugHID9zTCG+G0gctvU8z8aJdPL49BS6byNANBRchO+3l5+tQhl38MjYbdaNhkgdTWoWdAOvuFZFz9KBAth8rhv5TPvGo+lfT/FL5+7XXAki0zgdcpYfOvl6dP36VV4126xuJVVu3v4YAARBkXaBMSWMeZPpUIbcb+0LE4lcjNkTmi+GZ8zuw98Vzl28vNfkfnWcVJAlAQPLel7KLyZ19NY9RUSS0Fu9hu8K+cHY6MPpNHtoDqNOoO/78jS9tJmdf6l/Sm7aaR86gEQ+5GUn8qI2FASTMmI0EfWhT4aI/sj0FJbFM3MOAF0Op6RSuJXK0UziPZX3UtjPa+H0pojDGGvCN6a+8LzIqOtPWRpTEHBjF86NYv5vZBb0qNiRS4aNqjCjosSz2/EyMOXL8U9elIrxKDIXkRv58/Ws8PYm1dkz4V3/wA4oTCgiMNb4i/kIpy3jlYQdKQs1+cUQFVU/lbStbuGDbiD5ipdptaeRjQIZNiN2B9d/iKJmER50HC6u3pREHiH75VVOfdGvDhUu2f/2Q==</field>
+ </record>
+
+ <record id="employee_dzc" model="hr.employee">
+ <field name="name">趙生 (demo_zh_CN)</field>
+ <field name="department_id" ref="dep_rd"/>
+ <field name="job_id" ref="hr.job_developer"/>
+ <field name="work_location">Auderghem</field>
+ <field name="work_phone">+3282823500</field>
+ <field name="image">/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5Ojf/2wBDAQoKCg0MDRoPDxo3JR8lNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzf/wAARCADwAM4DASIAAhEBAxEB/8QAHAAAAQUBAQEAAAAAAAAAAAAAAgEDBAUGAAcI/8QAPxAAAQMDAgQEBAMGAwgDAAAAAQIDEQAEIRIxBQZBURMiYXEygZGhBxRSI0JiscHRM+HwFSQ0U3KCkqIWQ7L/xAAZAQADAQEBAAAAAAAAAAAAAAAAAQIDBAX/xAAjEQACAgMBAAEFAQEAAAAAAAAAAQIRAyExEkEEEyIyUUJh/9oADAMBAAIRAxEAPwDWNk6043p4KlRxM04htCVjGrE5G9HoBxATHYVijoZHCSoeVE5p0pIlJSZic9KeTI2xS6ZHuM5pMBgtyZkfKjDRjJMUax5sYAG1CD9PapsODsNkjQFgT+8qae0AYG9MI+09KkGAqM0IljSgQeh6UPXOKdO0nM9KApBEYzTFQJmIoSMzJnaaF5xtlMrWlKR1JqmvOaODWpIcv2gR+6Qf7Ug4XeNO+OkUqVA9ayiOeuGFRGuFbQTAI9CaiufiBZJUQGH94AMD51N/8C0bWU606ttQipYPp61iLfnnhLqkpcU43nOtEj6ir/hvHbG9UoW90haY1IUD9qd10G0XIMdK4dO9A24FtawdQPbrRDtGT0q7TQjp3P0pQRgdaSMR0rj26fyooZxEda4mYrh/KkM7detACKPWg6CDRE13uOlIDp8lLMRkmhz164ogoBUSdulAFelJ1SRPtToHlJE0gUk5CqNJTsD9KaNDu0k0K9YAiT/ajkY2mlOnEwfahkjJBJCjj1mjgRMmgUZVt7T0ok7d/WpYPYaBCjnttT6sEimGkmQY3o7x1Nu2484QlCQSoqPvQgbOccCG1OOeVCRJPasbzFz1a2gWxw1JffA+JQhA/vWe5t5ifvXVNtvKQx0CTGPXvNY11XiKBBhIGwrRY72zKUv4WXEeYOIcRKvzN0tyTgIOlI+VVpuSEq1KWVHYJMD50KAJBGqDtP8ArNAWAkp0EKneT0rVRSIHUuLWnyDUTg5gCmiVjfT6iKNCUqjUYkx2ikcagkKVkbGd6aoAPzJSrAHywak2vEXGXAW1lOMwaiFo9s9qEqKPKiIJnak4pjNhy9zXfWty1auXKzarV8PVPeD0r1Wy4gwplKkK8ygDgz9TXz8h7w8yI6Yq84fzHf2yAUPwlUDG5ArCWNp3EpSPdEOJWMEH55ojgkV59y1zjrcQzdrSUr/fUnb51vWHEutpUhUyJpKXwy07DPr2pM9emN6KE5k0JjagAVT0+9d5fCIOrWVCO0Vyk4ocCdqYw0kyCDtQpVOoYmdjSjYYx0NQ+YL5PB7G3uFJEvqAT7QZoWwbHfCJUCZijDJAkE0KXesA/OjDyoIgfWqGIG5MEn50pY1CSCB6V3iqnI+lC6spzBIoqwFW220opUU/D70CHUAYBMdDimnVaiDGwpbdCn1+GhIKiCQCYwKzkMdD6/EbAAAUqJ05FYj8ReYCkjhts5KjlwDoe1aPj/E08N4eu5mCn4fU14/cOLu313V0qFunWo1cI2yJMaeaeWnxCDpHqM0z4QB3SkEd6fccUqSlKiZOSelLaWq7p0BCYJ7Zrd6RmlboiKaPi+aFACMGprNsl1IABQIidO30rRcM5VddIUsEic4itLbcuNsoggep/wBb1DyJG8cLZ545wt0KgtkEHPagTYOKSuUkhJyK9SPB0dAoj1FNjgLSDqIJJ+1L7sSn9Ozyxdo5GUkSO1Q3mNMyZjtmvVrvgiHElMJGZmKzl/ysvzFsAq77VSyRZLwSMJp6rMCacaSVrEkqExA3ip99wt62kOJCNOYHWoTf7FwETqmaowlFpky1UpDaoUdI27g7V6HyRx94sJtnlKWhPwmdq83Q4UR4gI1GRB3q45cv/wAnxcJUYYcVBJHeM1llScbBOj2pDmtOoHJ2NOaoHeqrh750hP8AWrJJ3/tWMXaNUGVeXJoEkkzG+9EY07RQojUNeR1jeqYBHO8nHesh+Iy1uN8PtmiSoa1kTsMCtcogqJTOkHAPasZzpKuMsgmNFsBHzmhCZssqVnTHtXFHmGBim0BSSSdXpAnNPZxqWr/wqxg6TOB74pSgRtijSUgmVqA/6aAE4GsmP4aYDLrYKfKmD9KZCFJcnIipjgxMn2igJM9RjtUtWM89/EC8BcYtSDISXMHArEEBuVriVGAScVo+eFpc4m64pcrnTpjAHWssVeI54iwrSDCE9DitoqkZSe6H221PPJCATkJ26V6Ly9wdDNqgqQJMGYrJ8vWCnX2/PJxIA2r1KxYDbSQe0VhmnWjowR+QmLdIkJAAGBUptgRNE0Ug5z2p1K8Vy+jsTALAmYiKHwEnenwT13oCvuKbZSIbtukjYfKoNywCJgTt8qtXFA9qiOgdqExmS4rwdL6lEpGx3rDcZswwfImIORXrFy2CDpJjp1rA8zWqkuagJnEd5rpwzvRy5oasx6FzqQ4J7R0qQy4VlDY3G3v3qO4CACuQrY+lcy4pLjauqc5rdq0cD6evcr335qxZW6T4gwqevT+lapHmRM5rznk+4PgpKSNOrJnY1vrNwqTE9BiuRKpGseEk9e1JBA2yaIEFO2DXJ2ODFVsYiTWP5plfMaUaSYtUk59RWyjAwKyHGNL3NNzOdDIR9IqkxM2iNBOT8xXKA1byOmKYBTMANA/9JrkEJUR4Taj3qrGSEwRvSnTPemVLBnS0iK4QIJbTFABqAkRjv603pAkmcHMVy1SYKEQOtIojeAB9qLGeYc88PbtlrvH1y4+4dLQMY6GsxaW5V5lgqSjf0J2Fb38Q+HqdR+ecV5W06UBJ2rK8usfmuIeFBDSUgqB2J7+taOVKyauRqeAWbdkwh+4KU4k6iBE1YL5ps2lhDRKwcTEVG4pwd28Lcrc0gAeGFQKl8N5XskoPjpSoEd65qjLcjqSa4OM812BXClOADeUR96vLW8YuwFtLKkH03NRE8u8O8MlTY0jqlWakW1p+TToZ+DcEjNDhAtOVlklorRqSQcwKB9AYSpTkyATiltHi2gITsMA0F/8A7xqBUfhil+BdzM9xPjybcaWrdxSh+oQKqDzQtJPi2ykg9ZEfStObK3KocbLsYAqWOWmrlOtFq2mR161tjxwkzOblFbZjWOYGXXghXk1dVGmeN2Kbm1WoZGjPrVrxflMoCyq1UB0ITI+1Q7CxfYtlMvqBREIzke9PJi+27Qov2jzHiVsphwBYxH3qGyCpYSk+1azmi2Sg9tUx/OsxaNkuCDHb0rVS0ceSPl0a/lNlbT6HW3TpJKVIAiD7V6Pw1RKQI3nrWJ5YQtxKbhSRBTEf1rZcObgkz1yO1ckv2CJap+VFEZxmkSN5n60Qqloo5KSSB6xWPR+343eO6TCnHI9gUitknykKP7sq+lZTl8Fy4bXPxMuLPupyafwJmmDTmwacM/wmnxbvgT4To/7TSNOKCf8AGcBHdRpwvPLmXndt5ir0UwEtORPhr3/TSKC8J0L37UYUsJjW5/5GmyTvrXv+qmIZWpOvSZCpIj1qO7q8QheCOhp95CUyqPNuM1HRqcUdUyd5rKRSIHGrVN3w59spkFMCNpNYnk+3KL66OlUJUlAJ2kGYr0ZaApC09Ck1ieWdX5i6GkAl47+9Db8FQVyNO+o+BC/jncHBFQ0q4kXUhhLaUd1ETHoKtvDS+0lEAKGZNGzw9STJBHqKyjJJHUoIbsmOIPFDbowXRDkgeXtH9askfs1LQ+VAJJA0+amkMFPU46k0dwSllaWSA4oeUzWv3Y1VE+JJ9I/DrwXB8RaAGkKI8pkyKG0ukOXLqXTpU2oQmCZB60tq0m1tktJMkSSe5qJ4CvzqHULKZToUNpHSudOmaeW/kmi3uHXFBTi2gAdK0jrVw+bvh/Bl+E4VuhsaSTkKqMlZW2ARIB2FML1rZKFrUANgZ77V2QmkuGGTG5vZTs8e4kVJauHlATuUggZouLOamVLtwHkT8aTpn1ArrmyKgAlJ1bz2qNdqKG0sjZAie9Z5J2y1i88MDzmtWq3JTHWZ6jFVNjwp919pKkadasT3q75zSXWUDEhczFaHhtkg8vcEWMOu/tFqUOgq/dRMMkE3Y9whjwbYAI0nr6VpLJtQTJ33qsYbKldd8CtBYIQkpDoVozMd+lZdZgg1KLiwpyJJgwMUOQDAEA0+UpFghwfGXCIJppC1Bp5OIXE4qh2IvUW1oGf2ajtvg1muUXkXKEsXGEMsDQW0wTKjMnrtWoaUAHiqTLC0pj2rJ8j3KG13HiNNufs0gaxt5lU215EzUBERDzeakeEG0hP5pkz0ANQ3cp+KI38tEhQGJMj0irstok+GiSPzDfyBptaUgH9oFfKkmOpz1oCUxt96LEhkuKXCVwlJUJPaktXG2rtC1o1oCjIxkdKJ0y2RURIg4296zY0SRpDo0kHvWUt2UM8Xuy2MKeJrUM/4oEQCQAZmqAJnibpBkeMZ9YqJPReNfkXluBCekVNSDphMj2qDbiAMR86sme5isEdy4clnAUsnTH1qMoB5RWFBDacQT/WpVwoRk4B2rOcQt1XDDlu7JaUoqGlRBBrVr+Ar6XqG0LSYUkRmZqEthDqwEvBDgyBOarLBp2ztUMeM65p/UZNNi3ZRdqu0Nk3EfGpRxR50CZe2N0VNeE8POhWlSgetTC2oj4iR0zVTw1QhSVZUtWpR9atrRcpIV0pJvjBkK5SQDqk+5qmvCNKtImr+8mCM57VRXQ+IgdNqF0b2jG8XYVdvNtiYW8lO2M4rbXloLEW9knKbZqEes5JrN3CCEqcHxNrCx8jWo4tcC4um19Qymcbkj/Or9WcWXQfD2ZOqZBq6YUG3EqKAoD907Gq+ySEp3wBU9An2qomCOUuU6TgaiqOgJocaSO8VxTgUo0jBIntNUFUIkKIVHYiPlWP5MSk/mTIgQPuqtiV6EOKUdMoOT0xWN5NUAzcjUJ1CfvSbXkRrCWp8qFD/ALqdQG1AwwcbnXUZKwPp3pwLMQMT6VdsseUloH/CJMba6HQlWyAPnQJOnfVHSj1mYzHrRYhr8uoK1SIHQVHJEqMQSamF0n4TgelMkJWSTPvSexoBsnxAnM7/AHqibg8UfSBjxic/KtAkaM7jE1QcQQLXj2kGErEgVlNaNcbqReMjv2qU3jO1RLcggETt1p8q/Z4Gaw4diGrh0qj2PSox8NCSpSsnvS3JUUkIBJ/diqkh9V0DeAeEBHhpO9bLZNMsU3FsVFKVnVGTFM/mbYqPnKZ/UOtTm7lhDbak2LZUMGUYj+9Q+KXqFJWRYtyoxJx/LNaeUFv+AtylxKiMdwZq2Yf6CaytmbpLqoUPCBkAzNX/AA5alp1EQQPpWUnQ1dky4MIj+VVN4mAe8b1ZrVOJk+1V94BpMxSRTejOOgFxbeAN5JxFXjySq4BOy0giegiKo2EpuLpSVT4ZVBj0q5S9LqVLGEjTA6CmcOV7Lm1TDYnIipSSQKj2qgpvqMVITBTWiMglqUlRSYkDpmonErdh+0Wm6KUtqB8+oApHf0qUrAxiKoucHVM8F8sgLeQDHUTtVCbpGJ4/b8S4epLbl2p+zUrU0QslDgnqJ3pngXEkWbd01cl1KXXQ4FM4iBEEVNsLpnQ7aXwK7JxJ8s5bV0Ums+gOhJciUlRSFHYx67TUKXpUYer2j2FKzGM04l1RO5iNgaYSlUmRCSJmaLSroUj1NabOkfK1lR8yo7SaQzpUCSSabCYkFYAA3rsnJVgdaAD1HY9u9ICO+9DEkxnHaug7yOgzSYBnCZ37Zqi5rZM276Z1AwrPTBq8AggkTmmeJsJubR1kCVRKfehjTp2QOG3geZSZzuTU4O9zWXsnHGFCRpOxHrVsh6ckzjauaSpndCVompdCiQTMVy2VFST5SkGTIzTKCheJG2amsrABBikmy7GipxCQG2RB2imltqX5tASe6v7VPA1iNqjPpLZ7itN0DkVxQUKJTnrgVOtDoTq6EVFKvPE0puNCCkbCoaEpE3xAVGCY9aqONXQQ0UgyTgRT5e0Nkzmqp1Jdf8RZOBAFERSkJw5kpClwJ/qatLRAcWJGOlR0gNoS2kCes9TVjw5uYJG1ao8+btlm0lKBjFOogx0nem0pgd/aueeaYb8R9xLaP1LVAquEsdxE9Tg1VczWi77gb7TSdTqCHEgdYM1CvOcOFMEpaLtysf8ALTj6mo45xZdSoDh7yUlBypxIxGaX3I/BDkjE+J1TO2Qd603JdvaXdm9avobWlDhWEq2E9qw1tcKe1rCYhZgD9J2+1WXCr56zeW62ojWmCJispadoxTSZ6jIAMAb04HP4QTUNNuR/97nzpSy6ANNwrf5iuizrJhXkiPoKTxSnI+1RfCdGfzKp9hQeA8oA+OQfbagCcH560odkdx7b1C8B5J/4kx6pmi8B/Th/bYaaQExK1GZ+VIsnUBFMtNuhSS4+gp7AZNUXMfFTwlsqVc631/4bSAZA7mjr0IHinhs8VKEKSSpIUUg5FOtjVlJ6TFN8i8JHFuD3d5eKK7l50pS6rcEf0yKcXav2j62Xk6Vp3Hp3Henkwtq0b4ci4wk60rkGPSpjNxmDKT61GQNQHSprSEaYUJOM1zpUbthJvSnsI6gU2/c6hBJPvT5ZZMKKcD70Jt7fBCZO+TViK5bpWqG9wck9qEjYmQe/Spj4GwAg+lRlCJAGT0FSxpALSMkn+1QH71m3uGkOqgKVCferay4fc364ZR5QfM4dh/rtVL+Jlo1w3hFk21Os3IlfVRg10YvpnPphmzeVSLBADjiUggknFXlo2EIG2djXl3BOYPyjqBdNKfbHQKgitrecc4eeBu3XDiFP4SlBJ1JJ7j2qJRcHRyqfyS+N8fFiFM2SQ9cAeZRPlR79/asXequ71wO3t2p1R2kSAfTsKbZuylvS7mThROTTTri1lOlQgHAnespO2cuTI3wB/RbrKRkjvUO9uCm2DUjxHjER+71p55aVXBW6SBA+3+dRHUvXV0p4pAGyUjoB0qUqISbH+G2ugKcU2TqAPtU0tIJJmB6U3a3bdq0oOocUo/p2qJecWQs6WUKZUD5iTv8ASkrkw82etkyIneuBkR360OJwB6RQzPUR6V1cPSF1T5cAilnG0zTF1cMWjZcuH0NNjOpZiKz3EedLFiU2bTlyeh+FNFN8E3Rq0EyIIPvTdxeMW4JfebbT/GsA15pe81cWvSUIcDCCfhaTEfOq/WtatT5Liv1Ez/OtFhb6ZvIjcca5rtmUlvhZDzv/ADZ8qT/WsNe3D10tbrrqnHlZUtRyT/rpQKIKY6A96bmQNQnIz8xW0caijOU7PduTuHCx5atGUxJSFq9zk1b3/DGOJMAOjS6keVY3FBwny2bIHwFtGn/xqzQKTY1ow17wx6zd0OjfYjY0wBp9h1re3Vs1dMlp5OpJrOX3DF2qp06kdFdPnWOTGntHZhyp6ZSFS9h96KCTOYGZqatlIk+nbJpU22pSUgEnsOtclO6OukQUtEzqOJ61a8L4Cbkh26BQz+nqr/KrThnB0tkO3KQVbpR0TVucCuqGOts482dfrEiKbbYZCGmwlCRgAYrxz8W78u8TsrMZDLZcV7qwPtXsdyqcdDjevnnnG5/Pcy8SdCtSUueGj2Tiu7FpWcMnbKcHSCRgnGO/en0PYnZUAA9jUYjaCTSZ3kge1ZNW9jJRunZB1axGJ6VIY4mpOChMgVW4mBqzXKEHUDkYIqXji/gnyWLzyrhYXrgx8KRt1x60QvrZEFTikrHQoIzVa1he0Sd6k6tQIVlJ7ipeGLHomf7RtHE+a4QQNs/6iq69etnQNLyDncGuNjbuCEKKD+mMVFVwt4eVtaFAHodqhfT1xi8pnrL/ADVwxkYU+4e6UR/OqTifO7i06OHMBmd3XfOfkKx7ji1ZUTPYdqA6jgATNaRxRXTT2yTd3j924Hbl5Tq5wVK/lTLIDqpWsj1FNlIKsRSAlt0LjAG201oopE7ZOQAnCRAk7UqiANzHWgStKhrQR7RQKd8xGI6zTAJcDqSPSuaGtxKNwVJEHvNME+eFHPX+lS+GI13zCSDJcT/+hS+APo+xaCLVlMfC0kfYVITIxStABAHoP5URFZMoWo3ELu2s7Zbt4sJaAzImflUis/zRwJ/iqA5aXSmnUiNJ2I9OxoGumU4rzbZIKlcPtnTpOQ6sJ1ew3pOGc4XxaU+xwlrS2JdJclX+VUvELW8Ytn2HmGAUOFJWYLpI603CEsMMIZfN66tII1n9sgg1zyUvR03qr0encvcy2vGQW0jwrhOS2SDI7g9aulnFUPKfLrPB7RDjiEm8WgeIoDb0H8qv1p1D1reKa6cz7oqeJPflbG5uVmEtNKX9BXzi44XFLdXlayV57kzXvH4lXP5TlC9gwp6Gh8z/AGrwg6cjbFdUX+BDWxogJGr1xST55Vt2ilMFQgxjE9a5Sgrp/XFRTYAFQEg6jPSYppK1KUcR2mnT51AJCR2xXJ64x6daPkLOSCIM5pxBMdYGJFChSTIB9qJKTBHUmfnR0QZUQoGTmi1EZJJ9+lAk4+cfOlIkAk59KdhQBIJK9gZNCkgiT1Eek0qpCUxkHeetIqQqMDFFAEUwImJ7VyU6hpVJA6UQykQOm+9KAQsQBEbkxQM4EFJCQMZPtSyAjyie9cDnMHO0UkwIjr9aVr+COUZgk+maseAoDvF7MATNw2P/AGFVmqQRHXerflgzxrh5jIu0SekSKVaGun0emlNIkHM96KsijqQkDJ2FLVVzNdm04Q8pHxLGgEmAJoBK9Hnt8H7y54jxCyQhLSiQ6tQ8wz+78gKsfw7sW3uIO3NyXXHGEQyHeknJFVVq27/sl29aeDbClJSq2CsKPck1N5X4k/wi9tjf6RZvIKW1g6jBO5P0rnWTdm8o0qR6cKQ7VySFJBGxrjvXQYHnH40PlHC7C21jS48olP8A0ivIVyQABiPpXoX4yXYe47bWwyLdjUfdRrz5R1K2iN/U10x1BEvo3pKUzOelAU4gbkZjoKdG4Wc9xSaZE7xkxUhQKkgghJmRkdqBRASUkbHeM0WJknrk10kK1KBMfOaQITCVAaYPU04CZjIB+woGQpYkzgk07pEIJ6DFMRwwtQ+nWlCZEAx7iuwFbZO1cB5iBP1oGxoDU51G9LOCd4zQpMBR6YGfWkOEAnrmjghxPmZEmSD07V3SJE7UjQCXNBTgiI7k0QTGoQNo+dHpAKqd98UihHmSRIGKGFKSU4GN5rgfTzDOKKGdGZM9yat+XyE8XsiYkPtxj+IVThJUADmNqt+Cf8fZKAwHm+v8VTJaFHp9Ij4zRUI+L5UVZFnVh+er5Trq7DUlDaW9eoidSp2H2raurDbanDskTXlPE7hV9d3AuVuG9bWQwhsCJ6Ed/es8kqiXjVsAtMr4YLtT+m6W4A4zBSkY/SO3eo1zbXNpc2jfiOXTi0hy1bBwM5EHpHX1qV/uJs2HELV+fClG4URqV2M5HyqO5Zoa4oi14W8264UIW26tWotEbj1B6CuX/J0NHqXL7yrjg9q4tOlRRBE7RirGKqOUis8AtS6ZXCtRjrqNWF8+LazffUcNtqWfkJrshxHK+ngXPl0bzmniLoUNIeDY9his8pPTcin7l1T9wp9ZlTiys57maYUSJKjvtXW/4Qd0IJzjYULgxABzXAafNEnbelSSJWYiYGKmgYKoAiJE/egUZWAmYGadSrBXvBgYoEI0nvQLYTYAEdN8UoMoGreuSPMRGD0BpQCQZgweo6U+DOJyn6Qa6BrJ79O1crbGTShBJIAJgDIoGMmEo9dyK4p/aAGIAiDSg6liRnArpHnIT8jSdiABPiBR3macMgJgiCJzTZBKCI6npRtkBOkySnNAhSPN1jfFcfiB3FIflA+1Efh3zt70gOSqFaIiOwqy4OoJv7b1fb+uoVVn90icb9qsOHGLm3VEaXUn/wBhSkikz6YFLQNHU2g90ijO1ZDKbmp1SOFOIbeDK3Maz0Aya8uZWi5W+lpA/OrKYdC40xOo6vXb2itjz9ctOOpQHv2lvBDYE5OSSO0CsXbrZfs3WW0toIdU6HnJHiR+6n+UVhmfwbY1osVv8PfZYS00tAab/wB4PwySes/EKZDFtc8SNtw98sWZJU26lBEOBOQkmpzl+y8+w+/ZFpltLaFIIMkewwR71CuWbS5ubgveJb2Kwt61RISFLAz7D0rFp0jXh6PybP8A8bs5MnSZPfJzUX8QrtVpyjxBafiWjwx7qMU/ySI5ZsgNgkjaOprO/jDd+FwS0tgcvXEkdwkT/au3Eto5ZHjrsk6cAAxIoFZIAmfWi1FImJknJoCTGoSJrpfSDp1HSMjvQEkqKRnG+1L8IK1bnEAV2kFG5k/ypaAQASFYiSBTiwZBG+xpEplGkCQKUplQif8AOjobOgBwxkkd9qDckEke9OLkKEDehOVGPfNFgJI8OexxQrJMQfelHwk5HtXE+UQPtTA//9k=</field>
+ </record>
</data>
</openerp>
diff --git a/addons/hr/hr_department.py b/addons/hr/hr_department.py
index 185e9f73a45..dded3241b91 100644
--- a/addons/hr/hr_department.py
+++ b/addons/hr/hr_department.py
@@ -79,7 +79,6 @@ class hr_department(osv.osv):
(_check_recursion, 'Error! You cannot create recursive departments.', ['parent_id'])
]
-hr_department()
class ir_action_window(osv.osv):
_inherit = 'ir.actions.act_window'
@@ -103,7 +102,6 @@ class ir_action_window(osv.osv):
return False
return res
-ir_action_window()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml
index e0c3edfdb39..ccd11bc0dc2 100644
--- a/addons/hr/hr_view.xml
+++ b/addons/hr/hr_view.xml
@@ -341,7 +341,8 @@
</group>
<group>
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
- <field name="department_id"/> </group>
+ <field name="department_id"/>
+ </group>
</group>
<div>
<label for="description"/>
diff --git a/addons/hr_attendance/hr_attendance.py b/addons/hr_attendance/hr_attendance.py
index ce3dc00d258..dcff0ad5085 100644
--- a/addons/hr_attendance/hr_attendance.py
+++ b/addons/hr_attendance/hr_attendance.py
@@ -35,7 +35,6 @@ class hr_action_reason(osv.osv):
'action_type': 'sign_in',
}
-hr_action_reason()
def _employee_get(obj, cr, uid, context=None):
ids = obj.pool.get('hr.employee').search(cr, uid, [('user_id', '=', uid)], context=context)
@@ -86,7 +85,6 @@ class hr_attendance(osv.osv):
_constraints = [(_altern_si_so, 'Error ! Sign in (resp. Sign out) must follow Sign out (resp. Sign in)', ['action'])]
_order = 'name desc'
-hr_attendance()
class hr_employee(osv.osv):
_inherit = "hr.employee"
@@ -166,6 +164,5 @@ class hr_employee(osv.osv):
hr_attendance.create(cr, uid, vals, context=context)
return True
-hr_employee()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_attendance/wizard/hr_attendance_bymonth.py b/addons/hr_attendance/wizard/hr_attendance_bymonth.py
index 6994bc5f906..93868bb2379 100644
--- a/addons/hr_attendance/wizard/hr_attendance_bymonth.py
+++ b/addons/hr_attendance/wizard/hr_attendance_bymonth.py
@@ -48,6 +48,5 @@ class hr_attendance_bymonth(osv.osv_memory):
'datas': datas,
}
-hr_attendance_bymonth()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_attendance/wizard/hr_attendance_byweek.py b/addons/hr_attendance/wizard/hr_attendance_byweek.py
index 7fcfc175f0e..963a2946ffa 100644
--- a/addons/hr_attendance/wizard/hr_attendance_byweek.py
+++ b/addons/hr_attendance/wizard/hr_attendance_byweek.py
@@ -49,6 +49,5 @@ class hr_attendance_byweek(osv.osv_memory):
'datas': datas,
}
-hr_attendance_byweek()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_attendance/wizard/hr_attendance_error.py b/addons/hr_attendance/wizard/hr_attendance_error.py
index 066f4a56e07..137bac30215 100644
--- a/addons/hr_attendance/wizard/hr_attendance_error.py
+++ b/addons/hr_attendance/wizard/hr_attendance_error.py
@@ -64,6 +64,5 @@ class hr_attendance_error(osv.osv_memory):
'datas': datas,
}
-hr_attendance_error()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_contract/hr_contract.py b/addons/hr_contract/hr_contract.py
index faf8b015a48..0cd31d66bcf 100644
--- a/addons/hr_contract/hr_contract.py
+++ b/addons/hr_contract/hr_contract.py
@@ -49,7 +49,6 @@ class hr_employee(osv.osv):
'contract_id':fields.function(_get_latest_contract, string='Contract', type='many2one', relation="hr.contract", help='Latest contract of the employee'),
}
-hr_employee()
class hr_contract_type(osv.osv):
_name = 'hr.contract.type'
@@ -57,7 +56,6 @@ class hr_contract_type(osv.osv):
_columns = {
'name': fields.char('Contract Type', size=32, required=True),
}
-hr_contract_type()
class hr_contract(osv.osv):
_name = 'hr.contract'
@@ -99,6 +97,5 @@ class hr_contract(osv.osv):
_constraints = [
(_check_dates, 'Error! Contract start-date must be less than contract end-date.', ['date_start', 'date_end'])
]
-hr_contract()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_evaluation/hr_evaluation.py b/addons/hr_evaluation/hr_evaluation.py
index d4ee28aff68..09c47b89153 100644
--- a/addons/hr_evaluation/hr_evaluation.py
+++ b/addons/hr_evaluation/hr_evaluation.py
@@ -45,7 +45,6 @@ class hr_evaluation_plan(osv.osv):
'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'account.account', context=c),
}
-hr_evaluation_plan()
class hr_evaluation_plan_phase(osv.osv):
_name = "hr_evaluation.plan.phase"
@@ -98,7 +97,6 @@ Thanks,
'''),
}
-hr_evaluation_plan_phase()
class hr_employee(osv.osv):
_name = "hr.employee"
@@ -272,7 +270,6 @@ class hr_evaluation(osv.osv):
obj_hr_eval_iterview.write(cr, uid, [survey_req.id], new_vals, context=context)
return super(hr_evaluation, self).write(cr, uid, ids, vals, context=context)
-hr_evaluation()
class survey_request(osv.osv):
_inherit = "survey.request"
@@ -280,7 +277,6 @@ class survey_request(osv.osv):
'is_evaluation': fields.boolean('Is Appraisal?'),
}
-survey_request()
class hr_evaluation_interview(osv.osv):
_name = 'hr.evaluation.interview'
@@ -357,6 +353,5 @@ class hr_evaluation_interview(osv.osv):
value = self.pool.get("survey").action_print_survey(cr, uid, ids, context=context)
return value
-hr_evaluation_interview()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:1
diff --git a/addons/hr_evaluation/i18n/cs.po b/addons/hr_evaluation/i18n/cs.po
new file mode 100644
index 00000000000..5fee15f25a9
--- /dev/null
+++ b/addons/hr_evaluation/i18n/cs.po
@@ -0,0 +1,910 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:04+0000\n"
+"PO-Revision-Date: 2013-03-31 16:49+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: hr_evaluation
+#: help:hr_evaluation.plan.phase,send_anonymous_manager:0
+msgid "Send an anonymous summary to the manager"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+msgid "Start Appraisal"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+#: view:hr.evaluation.report:0
+#: view:hr_evaluation.plan:0
+msgid "Group By..."
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.interview,request_id:0
+#: field:hr.evaluation.report,request_id:0
+msgid "Request_id"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,month:0
+msgid "March"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.report,delay_date:0
+msgid "Delay to Start"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+msgid "Appraisal that are in waiting appreciation state"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan:0
+#: field:hr_evaluation.plan,company_id:0
+#: field:hr_evaluation.plan.phase,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.interview,evaluation_id:0
+#: field:hr_evaluation.plan.phase,survey_id:0
+msgid "Appraisal Form"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+#: field:hr.evaluation.report,day:0
+msgid "Day"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan:0
+#: field:hr_evaluation.plan,phase_ids:0
+msgid "Appraisal Phases"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+msgid "Send Request"
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr_evaluation.plan,month_first:0
+msgid ""
+"This number of months will be used to schedule the first evaluation date of "
+"the employee when selecting an evaluation plan. "
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.employee:0
+#: model:ir.ui.menu,name:hr_evaluation.menu_open_view_hr_evaluation_tree
+msgid "Appraisals"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan.phase:0
+msgid "(eval_name)s:Appraisal Name"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.interview,message_ids:0
+#: field:hr_evaluation.evaluation,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan.phase:0
+msgid "Mail Body"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.plan.phase,wait:0
+msgid "Wait Previous Phases"
+msgstr ""
+
+#. module: hr_evaluation
+#: model:ir.model,name:hr_evaluation.model_hr_evaluation_evaluation
+msgid "Employee Appraisal"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,state:0
+#: selection:hr_evaluation.evaluation,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,rating:0
+#: selection:hr_evaluation.evaluation,rating:0
+msgid "Did not meet expectations"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+#: model:ir.actions.act_window,name:hr_evaluation.open_view_hr_evaluation_tree
+#: model:ir.ui.menu,name:hr_evaluation.menu_eval_hr
+msgid "Appraisal"
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr.evaluation.interview,message_unread:0
+#: help:hr_evaluation.evaluation,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan.phase:0
+msgid "Send to Managers"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.evaluation,date_close:0
+msgid "Ending Date"
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr_evaluation.evaluation,note_action:0
+msgid ""
+"If the evaluation does not meet the expectations, you can proposean action "
+"plan"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan.phase:0
+msgid "Send to Employees"
+msgstr ""
+
+#. module: hr_evaluation
+#: code:addons/hr_evaluation/hr_evaluation.py:84
+#, python-format
+msgid ""
+"\n"
+"Date: %(date)s\n"
+"\n"
+"Dear %(employee_name)s,\n"
+"\n"
+"I am doing an evaluation regarding %(eval_name)s.\n"
+"\n"
+"Kindly submit your response.\n"
+"\n"
+"\n"
+"Thanks,\n"
+"--\n"
+"%(user_signature)s\n"
+"\n"
+" "
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+msgid "Appraisal that are in Plan In Progress state"
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr.evaluation.interview,message_summary:0
+#: help:hr_evaluation.evaluation,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+msgid "Reset to Draft"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.report,deadline:0
+msgid "Deadline"
+msgstr ""
+
+#. module: hr_evaluation
+#: code:addons/hr_evaluation/hr_evaluation.py:235
+#: code:addons/hr_evaluation/hr_evaluation.py:320
+#, python-format
+msgid "Warning!"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+msgid "In progress Evaluations"
+msgstr ""
+
+#. module: hr_evaluation
+#: model:ir.model,name:hr_evaluation.model_survey_request
+msgid "survey.request"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan.phase:0
+msgid "(date)s: Current Date"
+msgstr ""
+
+#. module: hr_evaluation
+#: model:ir.actions.act_window,name:hr_evaluation.act_hr_employee_2_hr__evaluation_interview
+msgid "Interviews"
+msgstr ""
+
+#. module: hr_evaluation
+#: code:addons/hr_evaluation/hr_evaluation.py:83
+#, python-format
+msgid "Regarding "
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.interview,message_follower_ids:0
+#: field:hr_evaluation.evaluation,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.interview,message_unread:0
+#: field:hr_evaluation.evaluation,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+#: field:hr.evaluation.report,employee_id:0
+#: view:hr_evaluation.evaluation:0
+#: field:hr_evaluation.evaluation,employee_id:0
+#: model:ir.model,name:hr_evaluation.model_hr_employee
+msgid "Employee"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr_evaluation.evaluation,state:0
+msgid "New"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.plan.phase,mail_body:0
+msgid "Email"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,rating:0
+#: selection:hr_evaluation.evaluation,rating:0
+msgid "Exceeds expectations"
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr_evaluation.plan.phase,mail_feature:0
+msgid ""
+"Check this box if you want to send mail to employees coming under this phase"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+msgid "Creation Date"
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr_evaluation.plan.phase,send_answer_manager:0
+msgid "Send all answers to the manager"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,state:0
+#: selection:hr_evaluation.evaluation,state:0
+msgid "Plan In Progress"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+msgid "Public Notes"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+msgid "Send Reminder Email"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+#: field:hr_evaluation.evaluation,rating:0
+msgid "Appreciation"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+msgid "Print Interview"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.report,closed:0
+msgid "closed"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,rating:0
+#: selection:hr_evaluation.evaluation,rating:0
+msgid "Meet expectations"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+#: field:hr.evaluation.report,nbr:0
+msgid "# of Requests"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,month:0
+msgid "July"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+#: view:hr.evaluation.report:0
+#: field:hr.evaluation.report,state:0
+#: view:hr_evaluation.evaluation:0
+#: field:hr_evaluation.evaluation,state:0
+msgid "Status"
+msgstr ""
+
+#. module: hr_evaluation
+#: model:ir.actions.act_window,name:hr_evaluation.action_evaluation_plans_installer
+msgid "Review Appraisal Plans"
+msgstr ""
+
+#. module: hr_evaluation
+#: model:ir.actions.act_window,help:hr_evaluation.action_evaluation_plans_installer
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to define a new appraisal plan.\n"
+" </p><p>\n"
+" You can define appraisal plans (ex: first interview after 6\n"
+" months, then every year). Then, each employee can be linked "
+"to\n"
+" an appraisal plan so that OpenERP can automatically "
+"generate\n"
+" interview requests to managers and/or subordinates.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan.phase:0
+msgid "Action to Perform"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.evaluation,note_action:0
+msgid "Action Plan"
+msgstr ""
+
+#. module: hr_evaluation
+#: model:ir.ui.menu,name:hr_evaluation.menu_eval_hr_config
+msgid "Periodic Appraisal"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.plan,month_next:0
+msgid "Periodicity of Appraisal (months)"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,rating:0
+#: selection:hr_evaluation.evaluation,rating:0
+msgid "Significantly exceeds expectations"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+msgid "In progress"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+msgid "Interview Request"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.plan.phase,send_answer_employee:0
+#: field:hr_evaluation.plan.phase,send_answer_manager:0
+msgid "All Answers"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+#: view:hr_evaluation.evaluation:0
+msgid "Answer Survey"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,month:0
+msgid "September"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,month:0
+msgid "December"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+#: field:hr.evaluation.report,month:0
+msgid "Month"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+msgid "Group by..."
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan.phase:0
+msgid "Mail Settings"
+msgstr ""
+
+#. module: hr_evaluation
+#: model:ir.actions.act_window,name:hr_evaluation.evaluation_reminders
+msgid "Appraisal Reminders"
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr_evaluation.plan.phase,wait:0
+msgid ""
+"Check this box if you want to wait that all preceding phases are finished "
+"before launching this phase."
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan.phase:0
+msgid "Legend"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.plan,month_first:0
+msgid "First Appraisal in (months)"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.plan.phase,send_anonymous_employee:0
+#: field:hr_evaluation.plan.phase,send_anonymous_manager:0
+msgid "Anonymous Summary"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+msgid "Pending"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.employee,evaluation_plan_id:0
+#: view:hr.evaluation.interview:0
+#: view:hr_evaluation.plan:0
+#: field:hr_evaluation.plan,name:0
+#: field:hr_evaluation.plan.phase,plan_id:0
+#: model:ir.model,name:hr_evaluation.model_hr_evaluation_plan
+msgid "Appraisal Plan"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+msgid "Print Survey"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,month:0
+msgid "August"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,month:0
+msgid "June"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,rating:0
+#: selection:hr_evaluation.evaluation,rating:0
+msgid "Significantly bellow expectations"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+msgid "Validate Appraisal"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan.phase:0
+msgid " (employee_name)s: Partner name"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.interview,message_is_follower:0
+#: field:hr_evaluation.evaluation,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+#: field:hr.evaluation.report,plan_id:0
+#: view:hr_evaluation.evaluation:0
+#: field:hr_evaluation.evaluation,plan_id:0
+msgid "Plan"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.plan,active:0
+msgid "Active"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,month:0
+msgid "November"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+msgid "Extended Filters..."
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr_evaluation.plan.phase,send_anonymous_employee:0
+msgid "Send an anonymous summary to the employee"
+msgstr ""
+
+#. module: hr_evaluation
+#: model:ir.model,name:hr_evaluation.model_hr_evaluation_plan_phase
+msgid "Appraisal Plan Phase"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,month:0
+msgid "January"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.employee:0
+msgid "Appraisal Interviews"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.interview,message_summary:0
+#: field:hr_evaluation.evaluation,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+msgid "Date"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+msgid "Survey"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.plan.phase,action:0
+msgid "Action"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+#: selection:hr.evaluation.report,state:0
+msgid "Final Validation"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr_evaluation.evaluation,state:0
+msgid "Waiting Appreciation"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+#: model:ir.actions.act_window,name:hr_evaluation.action_evaluation_report_all
+#: model:ir.ui.menu,name:hr_evaluation.menu_evaluation_report_all
+msgid "Appraisal Analysis"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.evaluation,date:0
+msgid "Appraisal Deadline"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.report,rating:0
+msgid "Overall Rating"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+#: view:hr_evaluation.evaluation:0
+msgid "Interviewer"
+msgstr ""
+
+#. module: hr_evaluation
+#: model:ir.model,name:hr_evaluation.model_hr_evaluation_report
+msgid "Evaluations Statistics"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+msgid "Deadline Date"
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr_evaluation.evaluation,rating:0
+msgid "This is the appreciation on which the evaluation is summarized."
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr_evaluation.plan.phase,action:0
+msgid "Top-Down Appraisal Requests"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan.phase:0
+msgid "General"
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr_evaluation.plan.phase,send_answer_employee:0
+msgid "Send all answers to the employee"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+#: view:hr.evaluation.report:0
+#: selection:hr.evaluation.report,state:0
+#: view:hr_evaluation.evaluation:0
+#: selection:hr_evaluation.evaluation,state:0
+msgid "Done"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan:0
+#: model:ir.actions.act_window,name:hr_evaluation.open_view_hr_evaluation_plan_tree
+#: model:ir.ui.menu,name:hr_evaluation.menu_open_view_hr_evaluation_plan_tree
+msgid "Appraisal Plans"
+msgstr ""
+
+#. module: hr_evaluation
+#: model:ir.model,name:hr_evaluation.model_hr_evaluation_interview
+msgid "Appraisal Interview"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+#: view:hr_evaluation.evaluation:0
+msgid "Cancel"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+msgid "In Progress"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+msgid "To Do"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+msgid "Final Validation Evaluations"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.plan.phase,mail_feature:0
+msgid "Send mail for this phase"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.plan.phase,email_subject:0
+msgid "char"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,month:0
+msgid "October"
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr.employee,evaluation_date:0
+msgid ""
+"The date of the next appraisal is computed by the appraisal plan's dates "
+"(first appraisal + periodicity)."
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.report,overpass_delay:0
+msgid "Overpassed Deadline"
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr_evaluation.plan,month_next:0
+msgid ""
+"The number of month that depicts the delay between each evaluation of this "
+"plan (after the first one)."
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr_evaluation.plan.phase,action:0
+msgid "Self Appraisal Requests"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+#: field:hr_evaluation.evaluation,survey_request_ids:0
+msgid "Appraisal Forms"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,month:0
+msgid "May"
+msgstr ""
+
+#. module: hr_evaluation
+#: model:ir.actions.act_window,help:hr_evaluation.open_view_hr_evaluation_tree
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new appraisal.\n"
+" </p><p>\n"
+" Each employee may be assigned an Appraisal Plan. Such a "
+"plan\n"
+" defines the frequency and the way you manage your periodic\n"
+" personnel evaluation. You will be able to define steps and\n"
+" attach interviews to each step. OpenERP manages all kinds "
+"of\n"
+" evaluations: bottom-up, top-down, self-evaluation and final\n"
+" evaluation by the manager.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.evaluation:0
+msgid "Internal Notes"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr_evaluation.plan.phase,action:0
+msgid "Final Interview"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.plan.phase,name:0
+msgid "Phase"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr_evaluation.plan.phase,action:0
+msgid "Bottom-Up Appraisal Requests"
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,month:0
+msgid "February"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+#: view:hr_evaluation.evaluation:0
+msgid "Interview Appraisal"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:survey.request,is_evaluation:0
+msgid "Is Appraisal?"
+msgstr ""
+
+#. module: hr_evaluation
+#: code:addons/hr_evaluation/hr_evaluation.py:320
+#, python-format
+msgid "You cannot start evaluation without Appraisal."
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.interview,user_to_review_id:0
+msgid "Employee to Interview"
+msgstr ""
+
+#. module: hr_evaluation
+#: code:addons/hr_evaluation/hr_evaluation.py:235
+#, python-format
+msgid ""
+"You cannot change state, because some appraisal(s) are in waiting answer or "
+"draft state."
+msgstr ""
+
+#. module: hr_evaluation
+#: selection:hr.evaluation.report,month:0
+msgid "April"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan.phase:0
+msgid "Appraisal Plan Phases"
+msgstr ""
+
+#. module: hr_evaluation
+#: model:ir.actions.act_window,help:hr_evaluation.action_hr_evaluation_interview_tree
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a new interview request related to a "
+"personal evaluation. \n"
+" </p><p>\n"
+" Interview requests are usually generated automatically by\n"
+" OpenERP according to an employee's appraisal plan. Each "
+"user\n"
+" receives automatic emails and requests to evaluate their\n"
+" colleagues periodically.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: hr_evaluation
+#: help:hr.evaluation.interview,message_ids:0
+#: help:hr_evaluation.evaluation,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.interview:0
+#: view:hr_evaluation.evaluation:0
+msgid "Search Appraisal"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.plan.phase,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr_evaluation.plan.phase:0
+msgid "(user_signature)s: User name"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:board.board:0
+#: model:ir.actions.act_window,name:hr_evaluation.action_hr_evaluation_interview_board
+#: model:ir.actions.act_window,name:hr_evaluation.action_hr_evaluation_interview_tree
+#: model:ir.ui.menu,name:hr_evaluation.menu_open_hr_evaluation_interview_requests
+msgid "Interview Requests"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.evaluation.report,create_date:0
+msgid "Create Date"
+msgstr ""
+
+#. module: hr_evaluation
+#: view:hr.evaluation.report:0
+#: field:hr.evaluation.report,year:0
+msgid "Year"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr_evaluation.evaluation,note_summary:0
+msgid "Appraisal Summary"
+msgstr ""
+
+#. module: hr_evaluation
+#: field:hr.employee,evaluation_date:0
+msgid "Next Appraisal Date"
+msgstr ""
diff --git a/addons/hr_evaluation/report/hr_evaluation_report.py b/addons/hr_evaluation/report/hr_evaluation_report.py
index 62a5e4abd89..36353b65dfb 100644
--- a/addons/hr_evaluation/report/hr_evaluation_report.py
+++ b/addons/hr_evaluation/report/hr_evaluation_report.py
@@ -97,7 +97,6 @@ class hr_evaluation_report(osv.osv):
)
""")
-hr_evaluation_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_evaluation/test/test_hr_evaluation.yml b/addons/hr_evaluation/test/test_hr_evaluation.yml
index ba0a77221c9..3244e37302e 100644
--- a/addons/hr_evaluation/test/test_hr_evaluation.yml
+++ b/addons/hr_evaluation/test/test_hr_evaluation.yml
@@ -101,8 +101,8 @@
-
!python {model: hr.evaluation.report}: |
import os, time
- from openerp import netsvc, tools
+ from openerp import tools
ctx={}
data_dict={'state': 'done', 'rating': 2, 'employee_id': ref("hr.employee_fp")}
from openerp.tools import test_reports
- test_reports.try_report_action(cr, uid, 'hr_evaluation_evaluation_0',wiz_data=data_dict, context=ctx, our_module='hr_evaluation') \ No newline at end of file
+ test_reports.try_report_action(cr, uid, 'hr_evaluation_evaluation_0',wiz_data=data_dict, context=ctx, our_module='hr_evaluation')
diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py
index 15926336697..73daa64f841 100644
--- a/addons/hr_expense/hr_expense.py
+++ b/addons/hr_expense/hr_expense.py
@@ -52,6 +52,9 @@ class hr_expense_expense(osv.osv):
res[expense.id] = total
return res
+ def _get_expense_from_line(self, cr, uid, ids, context=None):
+ return [line.expense_id.id for line in self.pool.get('hr.expense.line').browse(cr, uid, ids, context=context)]
+
def _get_currency(self, cr, uid, context=None):
user = self.pool.get('res.users').browse(cr, uid, [uid], context=context)[0]
if user.company_id:
@@ -84,7 +87,10 @@ class hr_expense_expense(osv.osv):
'account_move_id': fields.many2one('account.move', 'Ledger Posting'),
'line_ids': fields.one2many('hr.expense.line', 'expense_id', 'Expense Lines', readonly=True, states={'draft':[('readonly',False)]} ),
'note': fields.text('Note'),
- 'amount': fields.function(_amount, string='Total Amount', digits_compute=dp.get_precision('Account')),
+ 'amount': fields.function(_amount, string='Total Amount', digits_compute=dp.get_precision('Account'),
+ store={
+ 'hr.expense.line': (_get_expense_from_line, ['unit_amount','unit_quantity'], 10)
+ }),
'currency_id': fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}),
'department_id':fields.many2one('hr.department','Department', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}),
'company_id': fields.many2one('res.company', 'Company', required=True),
@@ -228,6 +234,8 @@ class hr_expense_expense(osv.osv):
for exp in self.browse(cr, uid, ids, context=context):
if not exp.employee_id.address_home_id:
raise osv.except_osv(_('Error!'), _('The employee must have a home address.'))
+ if not exp.employee_id.address_home_id.property_account_payable.id:
+ raise osv.except_osv(_('Error!'), _('The employee must have a payable account set on his home address.'))
company_currency = exp.company_id.currency_id.id
diff_currency_p = exp.currency_id.id <> company_currency
@@ -319,7 +327,7 @@ class hr_expense_expense(osv.osv):
'price_unit': tax['price_unit'],
'quantity': 1,
'price': tax['amount'] * tax['base_sign'] or 0.0,
- 'account_id': tax['account_collected_id'],
+ 'account_id': tax['account_collected_id'] or mres['account_id'],
'tax_code_id': tax['tax_code_id'],
'tax_amount': tax['amount'] * tax['base_sign'],
}
@@ -333,6 +341,8 @@ class hr_expense_expense(osv.osv):
acc = line.product_id.property_account_expense
if not acc:
acc = line.product_id.categ_id.property_account_expense_categ
+ if not acc:
+ raise osv.except_osv(_('Error!'), _('No purchase account found for the product %s (or for his category), please configure one.') % (line.product_id.name))
else:
acc = property_obj.get(cr, uid, 'property_account_expense_categ', 'product.category', context={'force_company': company.id})
if not acc:
@@ -373,7 +383,6 @@ class hr_expense_expense(osv.osv):
}
return result
-hr_expense_expense()
class product_product(osv.osv):
_inherit = "product.product"
@@ -381,7 +390,6 @@ class product_product(osv.osv):
'hr_expense_ok': fields.boolean('Can be Expensed', help="Specify if the product can be selected in an HR expense line."),
}
-product_product()
class hr_expense_line(osv.osv):
_name = "hr.expense.line"
@@ -440,6 +448,5 @@ class hr_expense_line(osv.osv):
res['value'].update({'uom_id': product.uom_id.id})
return res
-hr_expense_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml
index 49ea2f0ab9e..10abe95d892 100644
--- a/addons/hr_expense/hr_expense_view.xml
+++ b/addons/hr_expense/hr_expense_view.xml
@@ -32,7 +32,7 @@
<field name="user_id" invisible="1"/>
<field name="name"/>
<field name="currency_id" groups="base.group_multi_currency"/>
- <field name="amount"/>
+ <field name="amount" sum="Total Amount"/>
<field name="state"/>
</tree>
</field>
@@ -112,7 +112,7 @@
<field name="date_value" string="Expense Date"/>
<field name="name"/>
<field name="ref"/>
- <field domain="[('type','in',['normal','contract']), ('parent_id','!=',False)]" name="analytic_account" groups="analytic.group_analytic_accounting"/>
+ <field domain="[('type','in',['normal','contract'])]" name="analytic_account" groups="analytic.group_analytic_accounting"/>
<field name="uom_id" on_change="onchange_uom(product_id, uom_id, context)"/>
<field name="unit_amount"/>
<field name="unit_quantity"/>
diff --git a/addons/hr_expense/report/hr_expense_report.py b/addons/hr_expense/report/hr_expense_report.py
index 2adc11535ff..b29605a8e31 100644
--- a/addons/hr_expense/report/hr_expense_report.py
+++ b/addons/hr_expense/report/hr_expense_report.py
@@ -117,6 +117,5 @@ class hr_expense_report(osv.osv):
)
""")
-hr_expense_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_expense/test/expense_process.yml b/addons/hr_expense/test/expense_process.yml
index 8c4e09f47f0..e9339e24a95 100644
--- a/addons/hr_expense/test/expense_process.yml
+++ b/addons/hr_expense/test/expense_process.yml
@@ -36,8 +36,7 @@
I print a report of the expenses.
-
!python {model: hr.expense.expense}: |
- import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.hr.expense').create(cr, uid, [ref('hr_expense.sep_expenses')], {}, {})
- if tools.config['test_report_directory']:
- file(os.path.join(tools.config['test_report_directory'], 'hr_expense-report.'+format), 'wb+').write(data)
+ data, format = self.print_report(cr, uid, [ref('hr_expense.sep_expenses')], 'hr.expense', {}, {})
+ if openerp.tools.config['test_report_directory']:
+ import os
+ file(os.path.join(openerp.tools.config['test_report_directory'], 'hr_expense-report.'+format), 'wb+').write(data)
diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py
index 8c715149ff8..0eb3c0cbf16 100644
--- a/addons/hr_holidays/hr_holidays.py
+++ b/addons/hr_holidays/hr_holidays.py
@@ -180,10 +180,21 @@ class hr_holidays(osv.osv):
]
_sql_constraints = [
- ('type_value', "CHECK( (holiday_type='employee' AND employee_id IS NOT NULL) or (holiday_type='category' AND category_id IS NOT NULL))", "The employee or employee category of this request is missing."),
+ ('type_value', "CHECK( (holiday_type='employee' AND employee_id IS NOT NULL) or (holiday_type='category' AND category_id IS NOT NULL))",
+ "The employee or employee category of this request is missing. Please make sure that your user login is linked to an employee."),
('date_check2', "CHECK ( (type='add') OR (date_from <= date_to))", "The start date must be anterior to the end date."),
('date_check', "CHECK ( number_of_days_temp >= 0 )", "The number of days must be greater than 0."),
]
+
+ def copy(self, cr, uid, id, default=None, context=None):
+ if default is None:
+ default = {}
+ if context is None:
+ context = {}
+ default = default.copy()
+ default['date_from'] = False
+ default['date_to'] = False
+ return super(hr_holidays, self).copy(cr, uid, id, default, context=context)
def _create_resource_leave(self, cr, uid, leaves, context=None):
'''This method will create entry in resource calendar leave object at the time of holidays validated '''
@@ -444,7 +455,6 @@ class resource_calendar_leaves(osv.osv):
'holiday_id': fields.many2one("hr.holidays", "Leave Request"),
}
-resource_calendar_leaves()
class hr_employee(osv.osv):
@@ -476,9 +486,9 @@ class hr_employee(osv.osv):
leave_id = holiday_obj.create(cr, uid, {'name': _('Leave Request for %s') % employee.name, 'employee_id': employee.id, 'holiday_status_id': status_id, 'type': 'remove', 'holiday_type': 'employee', 'number_of_days_temp': abs(diff)}, context=context)
else:
return False
- holidays_obj.signal_confirm(cr, uid, [leave_id])
- holidays_obj.signal_validate(cr, uid, [leave_id])
- holidays_obj.signal_second_validate(cr, uid, [leave_id])
+ holiday_obj.signal_confirm(cr, uid, [leave_id])
+ holiday_obj.signal_validate(cr, uid, [leave_id])
+ holiday_obj.signal_second_validate(cr, uid, [leave_id])
return True
def _get_remaining_days(self, cr, uid, ids, name, args, context=None):
@@ -533,6 +543,5 @@ class hr_employee(osv.osv):
'leave_date_to': fields.function(_get_leave_status, multi='leave_status', type='date', string='To Date'),
}
-hr_employee()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_holidays/report/hr_holidays_report.py b/addons/hr_holidays/report/hr_holidays_report.py
index 394575d765d..0e5d6fe773c 100644
--- a/addons/hr_holidays/report/hr_holidays_report.py
+++ b/addons/hr_holidays/report/hr_holidays_report.py
@@ -55,6 +55,5 @@ class hr_holidays_remaining_leaves_user(osv.osv):
)
""")
-hr_holidays_remaining_leaves_user()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_holidays/wizard/hr_holidays_summary_department.py b/addons/hr_holidays/wizard/hr_holidays_summary_department.py
index ef1cb8f9e6f..8a204389572 100644
--- a/addons/hr_holidays/wizard/hr_holidays_summary_department.py
+++ b/addons/hr_holidays/wizard/hr_holidays_summary_department.py
@@ -53,6 +53,5 @@ class hr_holidays_summary_dept(osv.osv_memory):
'datas': datas,
}
-hr_holidays_summary_dept()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_holidays/wizard/hr_holidays_summary_employees.py b/addons/hr_holidays/wizard/hr_holidays_summary_employees.py
index 1897d82c882..1ec08eb2c86 100644
--- a/addons/hr_holidays/wizard/hr_holidays_summary_employees.py
+++ b/addons/hr_holidays/wizard/hr_holidays_summary_employees.py
@@ -50,6 +50,5 @@ class hr_holidays_summary_employee(osv.osv_memory):
'datas': datas,
}
-hr_holidays_summary_employee()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_payroll/hr_payroll.py b/addons/hr_payroll/hr_payroll.py
index 06af3054b68..e08e8db5623 100644
--- a/addons/hr_payroll/hr_payroll.py
+++ b/addons/hr_payroll/hr_payroll.py
@@ -107,7 +107,6 @@ class hr_payroll_structure(osv.osv):
parent = self._get_parent_structure(cr, uid, parent, context)
return parent + struct_ids
-hr_payroll_structure()
class hr_contract(osv.osv):
"""
@@ -143,7 +142,6 @@ class hr_contract(osv.osv):
structure_ids = [contract.struct_id.id for contract in self.browse(cr, uid, contract_ids, context=context)]
return list(set(self.pool.get('hr.payroll.structure')._get_parent_structure(cr, uid, structure_ids, context=context)))
-hr_contract()
class contrib_register(osv.osv):
'''
@@ -166,7 +164,6 @@ class contrib_register(osv.osv):
context=context).company_id.id,
}
-contrib_register()
class hr_salary_rule_category(osv.osv):
"""
@@ -190,7 +187,6 @@ class hr_salary_rule_category(osv.osv):
context=context).company_id.id,
}
-hr_salary_rule_category()
class one2many_mod2(fields.one2many):
@@ -202,8 +198,8 @@ class one2many_mod2(fields.one2many):
res = {}
for id in ids:
res[id] = []
- ids2 = obj.pool.get(self._obj).search(cr, user, [(self._fields_id,'in',ids), ('appears_on_payslip', '=', True)], limit=self._limit)
- for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'):
+ ids2 = obj.pool[self._obj].search(cr, user, [(self._fields_id,'in',ids), ('appears_on_payslip', '=', True)], limit=self._limit)
+ for r in obj.pool[self._obj]._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'):
res[r[self._fields_id]].append( r['id'] )
return res
@@ -234,7 +230,6 @@ class hr_payslip_run(osv.osv):
def close_payslip_run(self, cr, uid, ids, context=None):
return self.write(cr, uid, ids, {'state': 'close'}, context=context)
-hr_payslip_run()
class hr_payslip(osv.osv):
'''
@@ -714,7 +709,6 @@ class hr_payslip(osv.osv):
res['value'].update({'struct_id': False})
return self.onchange_employee_id(cr, uid, ids, date_from=date_from, date_to=date_to, employee_id=employee_id, contract_id=contract_id, context=context)
-hr_payslip()
class hr_payslip_worked_days(osv.osv):
'''
@@ -736,7 +730,6 @@ class hr_payslip_worked_days(osv.osv):
_defaults = {
'sequence': 10,
}
-hr_payslip_worked_days()
class hr_payslip_input(osv.osv):
'''
@@ -759,7 +752,6 @@ class hr_payslip_input(osv.osv):
'amount': 0.0,
}
-hr_payslip_input()
class hr_salary_rule(osv.osv):
@@ -897,7 +889,6 @@ result = rules.NET > categories.NET * 0.10''',
except:
raise osv.except_osv(_('Error!'), _('Wrong python condition defined for salary rule %s (%s).')% (rule.name, rule.code))
-hr_salary_rule()
class hr_rule_input(osv.osv):
'''
@@ -912,7 +903,6 @@ class hr_rule_input(osv.osv):
'input_id': fields.many2one('hr.salary.rule', 'Salary Rule Input', required=True)
}
-hr_rule_input()
class hr_payslip_line(osv.osv):
'''
@@ -947,7 +937,6 @@ class hr_payslip_line(osv.osv):
'rate': 100.0,
}
-hr_payslip_line()
class hr_payroll_structure(osv.osv):
@@ -956,7 +945,6 @@ class hr_payroll_structure(osv.osv):
'rule_ids':fields.many2many('hr.salary.rule', 'hr_structure_salary_rule_rel', 'struct_id', 'rule_id', 'Salary Rules'),
}
-hr_payroll_structure()
class hr_employee(osv.osv):
'''
@@ -989,6 +977,5 @@ class hr_employee(osv.osv):
'total_wage': fields.function(_calculate_total_wage, method=True, type='float', string='Total Basic Salary', digits_compute=dp.get_precision('Payroll'), help="Sum of all current contract's wage of employee."),
}
-hr_employee()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_payroll/test/hr_payroll_report.yml b/addons/hr_payroll/test/hr_payroll_report.yml
index 9681134f270..ab4b0fa97e1 100644
--- a/addons/hr_payroll/test/hr_payroll_report.yml
+++ b/addons/hr_payroll/test/hr_payroll_report.yml
@@ -5,7 +5,8 @@
-
!python {model: hr.payslip}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.payslip.pdf').create(cr, uid, [ref('hr_payroll.hr_payslip_salaryslipofbonamyforjune0')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('hr_payroll.hr_payslip_salaryslipofbonamyforjune0')], 'payslip.pdf', {}, {})
if tools.config['test_report_directory']:
- file(os.path.join(tools.config['test_report_directory'], 'hr_payroll-payslip_report.'+format), 'wb+').write(data) \ No newline at end of file
+ file(os.path.join(tools.config['test_report_directory'], 'hr_payroll-payslip_report.'+format), 'wb+').write(data)
diff --git a/addons/hr_payroll/wizard/hr_payroll_contribution_register_report.py b/addons/hr_payroll/wizard/hr_payroll_contribution_register_report.py
index 716a5060f14..ff078b09a67 100644
--- a/addons/hr_payroll/wizard/hr_payroll_contribution_register_report.py
+++ b/addons/hr_payroll/wizard/hr_payroll_contribution_register_report.py
@@ -50,6 +50,5 @@ class payslip_lines_contribution_register(osv.osv_memory):
'datas': datas,
}
-payslip_lines_contribution_register()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py b/addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py
index aa36d223406..5837472be5f 100644
--- a/addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py
+++ b/addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py
@@ -68,6 +68,5 @@ class hr_payslip_employees(osv.osv_memory):
slip_pool.compute_sheet(cr, uid, slip_ids, context=context)
return {'type': 'ir.actions.act_window_close'}
-hr_payslip_employees()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_payroll_account/hr_payroll_account.py b/addons/hr_payroll_account/hr_payroll_account.py
index b15000dd12f..ccab06c0dc1 100644
--- a/addons/hr_payroll_account/hr_payroll_account.py
+++ b/addons/hr_payroll_account/hr_payroll_account.py
@@ -20,7 +20,6 @@
#
##############################################################################
import time
-from openerp import netsvc
from datetime import date, datetime, timedelta
from openerp.osv import fields, osv
@@ -188,7 +187,6 @@ class hr_payslip(osv.osv):
move_pool.post(cr, uid, [move_id], context=context)
return super(hr_payslip, self).process_sheet(cr, uid, [slip.id], context=context)
-hr_payslip()
class hr_salary_rule(osv.osv):
_inherit = 'hr.salary.rule'
@@ -198,7 +196,6 @@ class hr_salary_rule(osv.osv):
'account_debit': fields.many2one('account.account', 'Debit Account'),
'account_credit': fields.many2one('account.account', 'Credit Account'),
}
-hr_salary_rule()
class hr_contract(osv.osv):
@@ -208,7 +205,6 @@ class hr_contract(osv.osv):
'analytic_account_id':fields.many2one('account.analytic.account', 'Analytic Account'),
'journal_id': fields.many2one('account.journal', 'Salary Journal'),
}
-hr_contract()
class hr_payslip_run(osv.osv):
@@ -229,6 +225,5 @@ class hr_payslip_run(osv.osv):
'journal_id': _get_default_journal,
}
-hr_payslip_run()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_payroll_account/i18n/cs.po b/addons/hr_payroll_account/i18n/cs.po
new file mode 100644
index 00000000000..f981b32d5e1
--- /dev/null
+++ b/addons/hr_payroll_account/i18n/cs.po
@@ -0,0 +1,126 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:50+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: hr_payroll_account
+#: field:hr.salary.rule,account_credit:0
+msgid "Credit Account"
+msgstr ""
+
+#. module: hr_payroll_account
+#: code:addons/hr_payroll_account/hr_payroll_account.py:103
+#, python-format
+msgid "Payslip of %s"
+msgstr ""
+
+#. module: hr_payroll_account
+#: code:addons/hr_payroll_account/hr_payroll_account.py:156
+#, python-format
+msgid ""
+"The Expense Journal \"%s\" has not properly configured the Credit Account!"
+msgstr ""
+
+#. module: hr_payroll_account
+#: field:hr.payslip,move_id:0
+msgid "Accounting Entry"
+msgstr ""
+
+#. module: hr_payroll_account
+#: code:addons/hr_payroll_account/hr_payroll_account.py:172
+#, python-format
+msgid ""
+"The Expense Journal \"%s\" has not properly configured the Debit Account!"
+msgstr ""
+
+#. module: hr_payroll_account
+#: field:hr.salary.rule,account_tax_id:0
+msgid "Tax Code"
+msgstr ""
+
+#. module: hr_payroll_account
+#: field:hr.payslip,period_id:0
+msgid "Force Period"
+msgstr ""
+
+#. module: hr_payroll_account
+#: help:hr.payslip,period_id:0
+msgid "Keep empty to use the period of the validation(Payslip) date."
+msgstr ""
+
+#. module: hr_payroll_account
+#: model:ir.model,name:hr_payroll_account.model_hr_contract
+msgid "Contract"
+msgstr ""
+
+#. module: hr_payroll_account
+#: field:hr.contract,analytic_account_id:0
+#: field:hr.salary.rule,analytic_account_id:0
+msgid "Analytic Account"
+msgstr ""
+
+#. module: hr_payroll_account
+#: field:hr.salary.rule,account_debit:0
+msgid "Debit Account"
+msgstr ""
+
+#. module: hr_payroll_account
+#: model:ir.model,name:hr_payroll_account.model_hr_payslip_run
+msgid "Payslip Batches"
+msgstr ""
+
+#. module: hr_payroll_account
+#: model:ir.model,name:hr_payroll_account.model_hr_payslip_employees
+msgid "Generate payslips for all selected employees"
+msgstr ""
+
+#. module: hr_payroll_account
+#: code:addons/hr_payroll_account/hr_payroll_account.py:156
+#: code:addons/hr_payroll_account/hr_payroll_account.py:172
+#, python-format
+msgid "Configuration Error!"
+msgstr ""
+
+#. module: hr_payroll_account
+#: model:ir.model,name:hr_payroll_account.model_hr_salary_rule
+msgid "hr.salary.rule"
+msgstr ""
+
+#. module: hr_payroll_account
+#: view:hr.contract:0
+#: view:hr.salary.rule:0
+msgid "Accounting"
+msgstr ""
+
+#. module: hr_payroll_account
+#: model:ir.model,name:hr_payroll_account.model_hr_payslip
+msgid "Pay Slip"
+msgstr ""
+
+#. module: hr_payroll_account
+#: code:addons/hr_payroll_account/hr_payroll_account.py:158
+#: code:addons/hr_payroll_account/hr_payroll_account.py:174
+#, python-format
+msgid "Adjustment Entry"
+msgstr ""
+
+#. module: hr_payroll_account
+#: field:hr.contract,journal_id:0
+#: field:hr.payslip,journal_id:0
+#: field:hr.payslip.run,journal_id:0
+msgid "Salary Journal"
+msgstr ""
diff --git a/addons/hr_payroll_account/i18n/lt.po b/addons/hr_payroll_account/i18n/lt.po
new file mode 100644
index 00000000000..c29df14b44e
--- /dev/null
+++ b/addons/hr_payroll_account/i18n/lt.po
@@ -0,0 +1,126 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-29 15:21+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: hr_payroll_account
+#: field:hr.salary.rule,account_credit:0
+msgid "Credit Account"
+msgstr ""
+
+#. module: hr_payroll_account
+#: code:addons/hr_payroll_account/hr_payroll_account.py:103
+#, python-format
+msgid "Payslip of %s"
+msgstr ""
+
+#. module: hr_payroll_account
+#: code:addons/hr_payroll_account/hr_payroll_account.py:156
+#, python-format
+msgid ""
+"The Expense Journal \"%s\" has not properly configured the Credit Account!"
+msgstr ""
+
+#. module: hr_payroll_account
+#: field:hr.payslip,move_id:0
+msgid "Accounting Entry"
+msgstr ""
+
+#. module: hr_payroll_account
+#: code:addons/hr_payroll_account/hr_payroll_account.py:172
+#, python-format
+msgid ""
+"The Expense Journal \"%s\" has not properly configured the Debit Account!"
+msgstr ""
+
+#. module: hr_payroll_account
+#: field:hr.salary.rule,account_tax_id:0
+msgid "Tax Code"
+msgstr ""
+
+#. module: hr_payroll_account
+#: field:hr.payslip,period_id:0
+msgid "Force Period"
+msgstr ""
+
+#. module: hr_payroll_account
+#: help:hr.payslip,period_id:0
+msgid "Keep empty to use the period of the validation(Payslip) date."
+msgstr ""
+
+#. module: hr_payroll_account
+#: model:ir.model,name:hr_payroll_account.model_hr_contract
+msgid "Contract"
+msgstr ""
+
+#. module: hr_payroll_account
+#: field:hr.contract,analytic_account_id:0
+#: field:hr.salary.rule,analytic_account_id:0
+msgid "Analytic Account"
+msgstr ""
+
+#. module: hr_payroll_account
+#: field:hr.salary.rule,account_debit:0
+msgid "Debit Account"
+msgstr ""
+
+#. module: hr_payroll_account
+#: model:ir.model,name:hr_payroll_account.model_hr_payslip_run
+msgid "Payslip Batches"
+msgstr ""
+
+#. module: hr_payroll_account
+#: model:ir.model,name:hr_payroll_account.model_hr_payslip_employees
+msgid "Generate payslips for all selected employees"
+msgstr ""
+
+#. module: hr_payroll_account
+#: code:addons/hr_payroll_account/hr_payroll_account.py:156
+#: code:addons/hr_payroll_account/hr_payroll_account.py:172
+#, python-format
+msgid "Configuration Error!"
+msgstr ""
+
+#. module: hr_payroll_account
+#: model:ir.model,name:hr_payroll_account.model_hr_salary_rule
+msgid "hr.salary.rule"
+msgstr ""
+
+#. module: hr_payroll_account
+#: view:hr.contract:0
+#: view:hr.salary.rule:0
+msgid "Accounting"
+msgstr ""
+
+#. module: hr_payroll_account
+#: model:ir.model,name:hr_payroll_account.model_hr_payslip
+msgid "Pay Slip"
+msgstr ""
+
+#. module: hr_payroll_account
+#: code:addons/hr_payroll_account/hr_payroll_account.py:158
+#: code:addons/hr_payroll_account/hr_payroll_account.py:174
+#, python-format
+msgid "Adjustment Entry"
+msgstr ""
+
+#. module: hr_payroll_account
+#: field:hr.contract,journal_id:0
+#: field:hr.payslip,journal_id:0
+#: field:hr.payslip.run,journal_id:0
+msgid "Salary Journal"
+msgstr ""
diff --git a/addons/hr_payroll_account/wizard/hr_payroll_payslips_by_employees.py b/addons/hr_payroll_account/wizard/hr_payroll_payslips_by_employees.py
index 76d197a17ec..053fab16e84 100644
--- a/addons/hr_payroll_account/wizard/hr_payroll_payslips_by_employees.py
+++ b/addons/hr_payroll_account/wizard/hr_payroll_payslips_by_employees.py
@@ -36,6 +36,5 @@ class hr_payslip_employees(osv.osv_memory):
if journal_id: context.update({'journal_id': journal_id})
return super(hr_payslip_employees, self).compute_sheet(cr, uid, ids, context=context)
-hr_payslip_employees()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py
index deccf10619f..e41d80fb348 100644
--- a/addons/hr_recruitment/hr_recruitment.py
+++ b/addons/hr_recruitment/hr_recruitment.py
@@ -487,6 +487,12 @@ class hr_applicant(base_stage, osv.Model):
"""
return self.set_priority(cr, uid, ids, '3')
+ def get_empty_list_help(self, cr, uid, help, context=None):
+ context['empty_list_help_model'] = 'hr.job'
+ context['empty_list_help_id'] = context.get('default_job_id', None)
+ context['empty_list_help_document_name'] = _("job applicants")
+ return super(hr_applicant, self).get_empty_list_help(cr, uid, help, context=context)
+
class hr_job(osv.osv):
_inherit = "hr.job"
@@ -504,8 +510,9 @@ class hr_job(osv.osv):
def _auto_init(self, cr, context=None):
"""Installation hook to create aliases for all jobs and avoid constraint errors."""
- self.pool.get('mail.alias').migrate_to_alias(cr, self._name, self._table, super(hr_job,self)._auto_init,
+ res = self.pool.get('mail.alias').migrate_to_alias(cr, self._name, self._table, super(hr_job,self)._auto_init,
self._columns['alias_id'], 'name', alias_prefix='job+', alias_defaults={'job_id': 'id'}, context=context)
+ return res
def create(self, cr, uid, vals, context=None):
mail_alias = self.pool.get('mail.alias')
diff --git a/addons/hr_recruitment/hr_recruitment_menu.xml b/addons/hr_recruitment/hr_recruitment_menu.xml
index dbd4335d730..c280f64105c 100644
--- a/addons/hr_recruitment/hr_recruitment_menu.xml
+++ b/addons/hr_recruitment/hr_recruitment_menu.xml
@@ -10,17 +10,13 @@
<field name="view_id" eval="False"/>
<field name="search_view_id" ref="view_crm_case_jobs_filter"/>
<field name="help" type="html">
- <p class="oe_view_nocontent_create">
- Click to add a new job applicant.
- </p><p>
+ <p>
OpenERP helps you track applicants in the recruitment
process and follow up all operations: meetings, interviews, etc.
</p><p>
- If you setup the email gateway, applicants and their attached
- CV are created automatically when an email is sent to
- jobs@yourcompany.com. If you install the document management
- modules, all resumes are indexed automatically, so that you can
- easily search through their content.
+ Applicants and their attached CV are created automatically when an email is sent.
+ If you install the document management modules, all resumes are indexed automatically,
+ so that you can easily search through their content.
</p>
</field>
</record>
diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml
index ccf5c8f7934..716c1cba8d5 100644
--- a/addons/hr_recruitment/hr_recruitment_view.xml
+++ b/addons/hr_recruitment/hr_recruitment_view.xml
@@ -41,7 +41,7 @@
<field name="arch" type="xml">
<tree string="Applicants" fonts="bold:message_unread==True" colors="grey:state in ('cancel','done');blue:state=='pending'">
<field name="message_unread" invisible="1"/>
- <field name="create_date" groups="base.group_no_one"/>
+ <field name="create_date"/>
<field name="name" string="Subject"/>
<field name="partner_name"/>
<field name="email_from"/>
@@ -199,7 +199,7 @@
<filter string="Appreciation" domain="[]" context="{'group_by':'priority'}"/>
<filter string="Stage" domain="[]" context="{'group_by':'stage_id'}"/>
<filter string="Source" domain="[]" context="{'group_by':'source_id'}"/>
- <filter string="Creation Date" domain="[]" context="{'group_by':'create_date'}" groups="base.group_no_one"/>
+ <filter string="Creation Date" domain="[]" context="{'group_by':'create_date'}"/>
</group>
</search>
</field>
@@ -312,11 +312,17 @@
attrs="{'invisible':[('survey_id','=',False)]}"/>
</div>
</field>
- <xpath expr="//div[@class='oe_title']" version="7.0" position="after">
- <div attrs="{'invisible': [('alias_domain', '=', False)]}">
- <field name="alias_id" invisible="1" required="0"/>
- <label for="alias_name" class="oe_edit_only"/>
- <field name="alias_name" nolabel="1" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" nolabel="1" class="oe_inline"/>
+ <xpath expr="//div[@class='oe_title']//h1" position="after">
+ <div name="group_alias"
+ attrs="{'invisible': [('alias_domain', '=', False)]}">
+ <label for="alias_id" string="Email Alias"/>
+ <field name="alias_id" class="oe_inline oe_read_only" required="0" nolabel="1"/>
+ <span name="edit_alias" class="oe_edit_only">
+ <field name="alias_name" class="oe_inline"
+ attrs="{'required': [('alias_id', '!=', False)]}"/>
+ @
+ <field name="alias_domain" class="oe_inline" readonly="1"/>
+ </span>
</div>
</xpath>
</field>
diff --git a/addons/hr_recruitment/i18n/cs.po b/addons/hr_recruitment/i18n/cs.po
new file mode 100644
index 00000000000..c5ac49a5b6d
--- /dev/null
+++ b/addons/hr_recruitment/i18n/cs.po
@@ -0,0 +1,1261 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:04+0000\n"
+"PO-Revision-Date: 2013-03-31 16:50+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: hr_recruitment
+#: help:hr.applicant,active:0
+msgid ""
+"If the active field is set to false, it will allow you to hide the case "
+"without removing it."
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.stage:0
+#: field:hr.recruitment.stage,requirements:0
+msgid "Requirements"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Application Summary"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Start Interview"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Mobile:"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.recruitment.stage,fold:0
+msgid ""
+"This stage is not visible, for example in status bar or kanban view, when "
+"there are no records in that stage to display."
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.degree,name:hr_recruitment.degree_graduate
+msgid "Graduate"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Group By..."
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Filter and view on next actions and date"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: field:hr.applicant,department_id:0
+#: view:hr.recruitment.report:0
+#: field:hr.recruitment.report,department_id:0
+msgid "Department"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,date_action:0
+msgid "Next Action Date"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,salary_expected_extra:0
+msgid "Expected Salary Extra"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+msgid "Jobs"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Pending Jobs"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: field:hr.applicant,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,company_id:0
+#: view:hr.recruitment.report:0
+#: field:hr.recruitment.report,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.source:0
+#: model:ir.actions.act_window,name:hr_recruitment.hr_recruitment_source_action
+#: model:ir.ui.menu,name:hr_recruitment.menu_hr_recruitment_source
+msgid "Sources of Applicants"
+msgstr ""
+
+#. module: hr_recruitment
+#: code:addons/hr_recruitment/hr_recruitment.py:445
+#, python-format
+msgid "You must define Applied Job for this applicant."
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Job"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.recruitment.partner.create,close:0
+msgid "Close job request"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.actions.act_window,help:hr_recruitment.crm_case_categ0_act_job
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a new job applicant.\n"
+" </p><p>\n"
+" OpenERP helps you track applicants in the recruitment\n"
+" process and follow up all operations: meetings, interviews, "
+"etc.\n"
+" </p><p>\n"
+" If you setup the email gateway, applicants and their "
+"attached\n"
+" CV are created automatically when an email is sent to\n"
+" jobs@yourcompany.com. If you install the document "
+"management\n"
+" modules, all resumes are indexed automatically, so that you "
+"can\n"
+" easily search through their content.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.actions.act_window,name:hr_recruitment.crm_case_categ0_act_job
+#: model:ir.ui.menu,name:hr_recruitment.menu_crm_case_categ0_act_job
+msgid "Applications"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,day_open:0
+msgid "Days to Open"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,emp_id:0
+msgid "employee"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.config.settings,fetchmail_applicants:0
+msgid "Create applicants from an incoming email account"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+#: field:hr.recruitment.report,day:0
+msgid "Day"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.partner.create:0
+#: model:ir.actions.act_window,name:hr_recruitment.action_hr_recruitment_partner_create
+msgid "Create Contact"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Refuse"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.degree,name:hr_recruitment.degree_licenced
+msgid "Master Degree"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,partner_mobile:0
+msgid "Mobile"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Next Actions"
+msgstr ""
+
+#. module: hr_recruitment
+#: code:addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py:38
+#: code:addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py:56
+#, python-format
+msgid "Error!"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.degree,name:hr_recruitment.degree_bac5
+msgid "Doctoral Degree"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,job_id:0
+#: field:hr.recruitment.report,job_id:0
+msgid "Applied Job"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.recruitment.stage,department_id:0
+msgid ""
+"Stages of the recruitment process may be different per department. If this "
+"stage is common to all departments, keep this field empty."
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.applicant,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,color:0
+msgid "Color Index"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.actions.act_window,name:hr_recruitment.act_hr_applicant_to_meeting
+msgid "Meetings"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: model:ir.actions.act_window,name:hr_recruitment.action_applicants_status
+msgid "Applicants Status"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+msgid "My Recruitment"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.job,survey_id:0
+msgid "Interview Form"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.job,survey_id:0
+msgid ""
+"Choose an interview form for this job position and you will be able to "
+"print/answer this interview from all applicants who apply for this job"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.ui.menu,name:hr_recruitment.menu_hr_recruitment_recruitment
+msgid "Recruitment"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.applicant,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: hr_recruitment
+#: code:addons/hr_recruitment/hr_recruitment.py:445
+#, python-format
+msgid "Warning!"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.recruitment.report,salary_prop:0
+msgid "Salary Proposed"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+#: field:hr.recruitment.report,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+msgid "Avg Proposed Salary"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: field:hr.applicant,availability:0
+#: field:hr.recruitment.report,available:0
+msgid "Availability"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,salary_proposed:0
+#: view:hr.recruitment.report:0
+msgid "Proposed Salary"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.model,name:hr_recruitment.model_hr_recruitment_source
+msgid "Source of Applicants"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.partner.create:0
+msgid "Convert To Partner"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.model,name:hr_recruitment.model_hr_recruitment_report
+msgid "Recruitments Statistics"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Print interview report"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+msgid "Hired employees"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.model,name:hr_recruitment.model_hr_job
+msgid "Job Description"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: field:hr.applicant,source_id:0
+msgid "Source"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.source,name:hr_recruitment.source_monster
+msgid "Monster"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:mail.message.subtype,name:hr_recruitment.mt_applicant_hired
+msgid "Applicant Hired"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,email_from:0
+msgid "Email"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.actions.act_window,help:hr_recruitment.hr_job_stage_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a new stage in the recruitment process.\n"
+" </p><p>\n"
+" Define here your stages of the recruitment process, for "
+"example:\n"
+" qualification call, first interview, second interview, refused,\n"
+" hired.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+msgid "Available"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,title_action:0
+msgid "Next Action"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.job,alias_id:0
+msgid ""
+"Email alias for this job position. New emails will automatically create new "
+"applicants for this job position."
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.applicant,priority:0
+#: selection:hr.recruitment.report,priority:0
+msgid "Good"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,month:0
+msgid "August"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: field:hr.applicant,create_date:0
+#: view:hr.recruitment.report:0
+msgid "Creation Date"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.actions.act_window,name:hr_recruitment.action_hr_recruitment_hired_employee
+#: model:ir.model,name:hr_recruitment.model_hired_employee
+msgid "Create Employee"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: field:hr.applicant,priority:0
+#: field:hr.recruitment.report,priority:0
+msgid "Appreciation"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.stage,name:hr_recruitment.stage_job1
+msgid "Initial Qualification"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Print Interview"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: field:hr.applicant,stage_id:0
+#: view:hr.recruitment.report:0
+#: field:hr.recruitment.report,stage_id:0
+#: view:hr.recruitment.stage:0
+msgid "Stage"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.stage,name:hr_recruitment.stage_job3
+msgid "Second Interview"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.actions.act_window,name:hr_recruitment.hr_job_stage_act
+msgid "Recruitment / Applicants Stages"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,salary_expected:0
+#: view:hr.recruitment.report:0
+msgid "Expected Salary"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,month:0
+msgid "July"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,email_cc:0
+msgid "Watchers Emails"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Applicants"
+msgstr ""
+
+#. module: hr_recruitment
+#: code:addons/hr_recruitment/hr_recruitment.py:360
+#, python-format
+msgid "No Subject"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.recruitment.report,salary_exp:0
+msgid "Salary Expected"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.model,name:hr_recruitment.model_hr_applicant
+msgid "Applicant"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.recruitment.stage,sequence:0
+msgid "Gives the sequence order when displaying a list of stages."
+msgstr ""
+
+#. module: hr_recruitment
+#: code:addons/hr_recruitment/hr_recruitment.py:347
+#: field:hr.applicant,partner_id:0
+#, python-format
+msgid "Contact"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.applicant,salary_expected_extra:0
+msgid "Salary Expected by Applicant, extra advantages"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.applicant,state:0
+msgid ""
+"The status is set to 'Draft', when a case is created. "
+"If the case is in progress the status is set to 'Open'. "
+"When the case is over, the status is set to 'Done'. If "
+"the case needs to be reviewed then the status is set "
+"to 'Pending'."
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,month:0
+msgid "March"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.stage:0
+#: model:ir.actions.act_window,name:hr_recruitment.hr_recruitment_stage_act
+#: model:ir.ui.menu,name:hr_recruitment.menu_hr_recruitment_stage
+msgid "Stages"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+msgid "Draft recruitment"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Delete"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+msgid "In progress"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Hire & Create Employee"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:mail.message.subtype,description:hr_recruitment.mt_applicant_hired
+msgid "Applicant hired"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Jobs - Recruitment Form"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,probability:0
+msgid "Probability"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,month:0
+msgid "April"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,month:0
+msgid "September"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,month:0
+msgid "December"
+msgstr ""
+
+#. module: hr_recruitment
+#: code:addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py:39
+#, python-format
+msgid "A contact is already defined on this job request."
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,categ_ids:0
+msgid "Tags"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.model,name:hr_recruitment.model_hr_applicant_category
+msgid "Category of applicant"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+#: field:hr.recruitment.report,month:0
+msgid "Month"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Answer related job question"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.stage,name:hr_recruitment.stage_job2
+msgid "First Interview"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,write_date:0
+msgid "Update Date"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hired.employee:0
+msgid "Yes"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: field:hr.applicant,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hired.employee:0
+#: view:hr.recruitment.partner.create:0
+msgid "or"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:mail.message.subtype,name:hr_recruitment.mt_applicant_refused
+msgid "Applicant Refused"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Schedule Meeting"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,partner_name:0
+msgid "Applicant's Name"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.applicant,priority:0
+#: selection:hr.recruitment.report,priority:0
+msgid "Very Good"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,user_email:0
+msgid "User Email"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,date_open:0
+msgid "Opened"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+msgid "Group By ..."
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hired.employee:0
+msgid "No"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.applicant,salary_expected:0
+msgid "Salary Expected by Applicant"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "All Initial Jobs"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.applicant,email_cc:0
+msgid ""
+"These email addresses will be added to the CC field of all inbound and "
+"outbound emails for this record before being sent. Separate multiple email "
+"addresses with a comma"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.ui.menu,name:hr_recruitment.menu_hr_recruitment_degree
+msgid "Degrees"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,date_closed:0
+#: field:hr.recruitment.report,date_closed:0
+msgid "Closed"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.stage:0
+msgid "Stage Definition"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.recruitment.report,delay_close:0
+msgid "Avg. Delay to Close"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.applicant,salary_proposed:0
+msgid "Salary Proposed by the Organisation"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: selection:hr.applicant,state:0
+#: view:hr.recruitment.report:0
+#: selection:hr.recruitment.report,state:0
+#: selection:hr.recruitment.stage,state:0
+msgid "Pending"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,state:0
+#: field:hr.recruitment.report,state:0
+#: field:hr.recruitment.stage,state:0
+msgid "Status"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Schedule interview with this applicant"
+msgstr ""
+
+#. module: hr_recruitment
+#: code:addons/hr_recruitment/hr_recruitment.py:407
+#, python-format
+msgid "Applicant <b>created</b>"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: field:hr.applicant,type_id:0
+#: view:hr.recruitment.degree:0
+#: view:hr.recruitment.report:0
+#: field:hr.recruitment.report,type_id:0
+#: model:ir.actions.act_window,name:hr_recruitment.hr_recruitment_degree_action
+msgid "Degree"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,partner_phone:0
+msgid "Phone"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,month:0
+msgid "June"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,day_close:0
+msgid "Days to Close"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.recruitment.report,user_id:0
+msgid "User"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.applicant,priority:0
+#: selection:hr.recruitment.report,priority:0
+msgid "Excellent"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,active:0
+msgid "Active"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+#: field:hr.recruitment.report,nbr:0
+msgid "# of Applications"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.actions.act_window,help:hr_recruitment.hr_recruitment_stage_act
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a new stage in the recruitment process.\n"
+" </p><p>\n"
+" Don't forget to specify the department if your recruitment "
+"process\n"
+" is different according to the job position.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,response:0
+msgid "Response"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,month:0
+msgid "October"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.config.settings,module_document_ftp:0
+msgid "Allow the automatic indexation of resumes"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,salary_proposed_extra:0
+msgid "Proposed Salary Extra"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,month:0
+msgid "January"
+msgstr ""
+
+#. module: hr_recruitment
+#: code:addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py:56
+#, python-format
+msgid "A contact is already existing with the same name."
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.actions.act_window,name:hr_recruitment.hr_recruitment_stage_form_installer
+msgid "Review Recruitment Stages"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Contact:"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Search Jobs"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,date:0
+#: field:hr.recruitment.report,date:0
+msgid "Date"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,survey:0
+msgid "Survey"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hired.employee:0
+msgid "Would you like to create an employee ?"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Degree:"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+msgid "Extended Filters..."
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.actions.act_window,help:hr_recruitment.hr_recruitment_stage_form_installer
+msgid ""
+"Check if the following stages are matching your recruitment process. Don't "
+"forget to specify the department if your recruitment process is different "
+"according to the job position."
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.config.settings:0
+msgid "Configure"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.stage,name:hr_recruitment.stage_job4
+msgid "Contract Proposed"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.source,name:hr_recruitment.source_website_company
+msgid "Company Website"
+msgstr ""
+
+#. module: hr_recruitment
+#: sql_constraint:hr.recruitment.degree:0
+msgid "The name of the Degree of Recruitment must be unique!"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+#: field:hr.recruitment.report,year:0
+msgid "Year"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hired.employee:0
+#: view:hr.recruitment.partner.create:0
+msgid "Cancel"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.partner.create:0
+msgid "Are you sure you want to create a contact based on this job request ?"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.config.settings,fetchmail_applicants:0
+msgid ""
+"Allow applicants to send their job application to an email address "
+"(jobs@mycompany.com),\n"
+" and create automatically application documents in the system."
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: selection:hr.applicant,state:0
+#: selection:hr.recruitment.stage,state:0
+msgid "In Progress"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Subject / Applicant"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.recruitment.degree,sequence:0
+msgid "Gives the sequence order when displaying a list of degrees."
+msgstr ""
+
+#. module: hr_recruitment
+#: model:mail.message.subtype,description:hr_recruitment.mt_stage_changed
+msgid "Stage changed"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: field:hr.applicant,user_id:0
+#: view:hr.recruitment.report:0
+msgid "Responsible"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+#: model:ir.actions.act_window,name:hr_recruitment.action_hr_recruitment_report_all
+#: model:ir.ui.menu,name:hr_recruitment.menu_hr_recruitment_report_all
+msgid "Recruitment Analysis"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hired.employee:0
+msgid "Create New Employee"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.source,name:hr_recruitment.source_linkedin
+msgid "LinkedIn"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:mail.message.subtype,name:hr_recruitment.mt_job_new_applicant
+msgid "New Applicant"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.model,name:hr_recruitment.model_hr_recruitment_stage
+msgid "Stage of Recruitment"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Cases By Stage and Estimates"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+#: selection:hr.applicant,state:0
+#: view:hr.recruitment.report:0
+#: selection:hr.recruitment.report,state:0
+#: selection:hr.recruitment.stage,state:0
+msgid "New"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:crm.meeting.type,name:hr_recruitment.categ_meet_interview
+#: view:hr.job:0
+msgid "Interview"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.recruitment.source,name:0
+msgid "Source Name"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Day(s)"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,description:0
+msgid "Description"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:mail.message.subtype,name:hr_recruitment.mt_stage_changed
+msgid "Stage Changed"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,month:0
+msgid "May"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.stage,name:hr_recruitment.stage_job5
+msgid "Contract Signed"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.source,name:hr_recruitment.source_word
+msgid "Word of Mouth"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.recruitment.stage,fold:0
+msgid "Hide in views if empty"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.config.settings,module_document_ftp:0
+msgid ""
+"Manage your CV's and motivation letter related to all applicants.\n"
+" This installs the module document_ftp. This will install the "
+"knowledge management module in order to allow you to search using specific "
+"keywords through the content of all documents (PDF, .DOCx...)"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.applicant,state:0
+#: selection:hr.recruitment.report,state:0
+#: model:hr.recruitment.stage,name:hr_recruitment.stage_job6
+#: selection:hr.recruitment.stage,state:0
+msgid "Refused"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.applicant,state:0
+#: view:hr.recruitment.report:0
+#: selection:hr.recruitment.report,state:0
+#: selection:hr.recruitment.stage,state:0
+msgid "Hired"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,reference:0
+msgid "Referred By"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Departement:"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.applicant,priority:0
+#: selection:hr.recruitment.report,priority:0
+msgid "On Average"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.model,name:hr_recruitment.model_hr_recruitment_degree
+msgid "Degree of Recruitment"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.recruitment.report,salary_prop_avg:0
+msgid "Avg. Proposed Salary"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Open Jobs"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,month:0
+msgid "February"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.applicant,priority:0
+#: selection:hr.recruitment.report,priority:0
+msgid "Not Good"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant_category,name:0
+#: field:hr.recruitment.degree,name:0
+#: field:hr.recruitment.stage,name:0
+msgid "Name"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,month:0
+msgid "November"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.recruitment.report,salary_exp_avg:0
+msgid "Avg. Expected Salary"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+msgid "Avg Expected Salary"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.model,name:hr_recruitment.model_hr_recruitment_partner_create
+msgid "Create Partner from job application"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.applicant,email_from:0
+msgid "These people will receive email."
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.job,alias_id:0
+msgid "Alias"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+msgid "Pending recruitment"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Contract"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.applicant,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.applicant,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:mail.message.subtype,description:hr_recruitment.mt_applicant_refused
+msgid "Applicant refused"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.recruitment.stage,department_id:0
+msgid "Specific to a Department"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.recruitment.report:0
+msgid "In progress recruitment"
+msgstr ""
+
+#. module: hr_recruitment
+#: field:hr.recruitment.degree,sequence:0
+#: field:hr.recruitment.stage,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:hr.recruitment.degree,name:hr_recruitment.degree_bachelor
+msgid "Bachelor Degree"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Unassigned Recruitments"
+msgstr ""
+
+#. module: hr_recruitment
+#: model:ir.model,name:hr_recruitment.model_hr_config_settings
+msgid "hr.config.settings"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.recruitment.stage,state:0
+msgid ""
+"The related status for the stage. The status of your document will "
+"automatically change according to the selected stage. Example, a stage is "
+"related to the status 'Close', when your document reach this stage, it will "
+"be automatically closed."
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.applicant,salary_proposed_extra:0
+msgid "Salary Proposed by the Organisation, extra advantages"
+msgstr ""
+
+#. module: hr_recruitment
+#: help:hr.recruitment.report,delay_close:0
+msgid "Number of Days to close the project issue"
+msgstr ""
+
+#. module: hr_recruitment
+#: selection:hr.recruitment.report,state:0
+msgid "Open"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:board.board:0
+msgid "Applications to be Processed"
+msgstr ""
+
+#. module: hr_recruitment
+#: view:hr.applicant:0
+msgid "Schedule Interview"
+msgstr ""
diff --git a/addons/hr_recruitment/report/hr_recruitment_report.py b/addons/hr_recruitment/report/hr_recruitment_report.py
index 62fa1badc41..8c365b10070 100644
--- a/addons/hr_recruitment/report/hr_recruitment_report.py
+++ b/addons/hr_recruitment/report/hr_recruitment_report.py
@@ -116,6 +116,5 @@ class hr_recruitment_report(osv.osv):
s.department_id
)
""")
-hr_recruitment_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_recruitment/test/recruitment_process.yml b/addons/hr_recruitment/test/recruitment_process.yml
index f2d4e4736fa..335edc71892 100644
--- a/addons/hr_recruitment/test/recruitment_process.yml
+++ b/addons/hr_recruitment/test/recruitment_process.yml
@@ -4,8 +4,7 @@
An applicant is interested in the job position. So he sends a resume by email.
-
!python {model: mail.thread}: |
- from openerp import addons
- request_file = open(addons.get_module_resource('hr_recruitment','test', 'resume.eml'),'rb')
+ request_file = open(openerp.modules.module.get_module_resource('hr_recruitment','test', 'resume.eml'),'rb')
request_message = request_file.read()
self.message_process(cr, uid, 'hr.applicant', request_message)
-
diff --git a/addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py b/addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py
index 82dd534d81b..b0d4aebe09a 100644
--- a/addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py
+++ b/addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py
@@ -80,6 +80,5 @@ class hr_recruitment_partner_create(osv.osv_memory):
'search_view_id': res['res_id']
}
-hr_recruitment_partner_create()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py b/addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py
index 58fb706a09e..60d31e74eee 100644
--- a/addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py
+++ b/addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py
@@ -50,6 +50,5 @@ class hired_employee(osv.osv_memory):
context = {}
return self.pool.get('hr.applicant').case_close_with_emp(cr, uid,context.get('active_ids', []))
-hired_employee()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet/hr_timesheet.py b/addons/hr_timesheet/hr_timesheet.py
index cc9c0653a85..22dfb7b9552 100644
--- a/addons/hr_timesheet/hr_timesheet.py
+++ b/addons/hr_timesheet/hr_timesheet.py
@@ -56,7 +56,6 @@ class hr_employee(osv.osv):
'journal_id': _getAnalyticJournal,
'product_id': _getEmployeeProduct
}
-hr_employee()
class hr_analytic_timesheet(osv.osv):
diff --git a/addons/hr_timesheet/wizard/hr_timesheet_print_employee.py b/addons/hr_timesheet/wizard/hr_timesheet_print_employee.py
index 1523756aae0..efffa6acd5f 100644
--- a/addons/hr_timesheet/wizard/hr_timesheet_print_employee.py
+++ b/addons/hr_timesheet/wizard/hr_timesheet_print_employee.py
@@ -62,6 +62,5 @@ class analytical_timesheet_employee(osv.osv_memory):
'report_name': 'hr.analytical.timesheet',
'datas': datas,
}
-analytical_timesheet_employee()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet/wizard/hr_timesheet_print_users.py b/addons/hr_timesheet/wizard/hr_timesheet_print_users.py
index 8d9f0b01f68..d7dda927111 100644
--- a/addons/hr_timesheet/wizard/hr_timesheet_print_users.py
+++ b/addons/hr_timesheet/wizard/hr_timesheet_print_users.py
@@ -52,6 +52,5 @@ class analytical_timesheet_employees(osv.osv_memory):
'datas': datas,
}
-analytical_timesheet_employees()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py b/addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py
index 054e797a884..d0cbdc78c31 100644
--- a/addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py
+++ b/addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py
@@ -103,7 +103,6 @@ class hr_so_project(osv.osv_memory):
self._write(cr, uid, data, emp_id, context=context)
return {'type': 'ir.actions.act_window_close'}
-hr_so_project()
class hr_si_project(osv.osv_memory):
@@ -168,6 +167,5 @@ class hr_si_project(osv.osv_memory):
res.update({'name': employee.name, 'state': employee.state, 'emp_id': emp_id[0], 'server_date':time.strftime('%Y-%m-%d %H:%M:%S')})
return res
-hr_si_project()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
index 828c7230ddf..f8c27bded5e 100644
--- a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
+++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
@@ -37,7 +37,6 @@ class hr_timesheet_invoice_factor(osv.osv):
'factor': lambda *a: 0.0,
}
-hr_timesheet_invoice_factor()
class account_analytic_account(osv.osv):
@@ -286,7 +285,6 @@ class account_analytic_line(osv.osv):
invoice_obj.button_reset_taxes(cr, uid, [last_invoice], context)
return invoices
-account_analytic_line()
class hr_analytic_timesheet(osv.osv):
@@ -314,7 +312,6 @@ class hr_analytic_timesheet(osv.osv):
return super(hr_analytic_timesheet, self).copy(cursor, user, obj_id,
default, context=context)
-hr_analytic_timesheet()
class account_invoice(osv.osv):
@@ -334,7 +331,6 @@ class account_invoice(osv.osv):
il['analytic_lines'][0][2]['to_invoice'] = to_invoice[0]
return iml
-account_invoice()
class account_move_line(osv.osv):
@@ -353,6 +349,5 @@ class account_move_line(osv.osv):
}, context=context)
return res
-account_move_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report.py b/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report.py
index 02b46b71b20..3ea7e209051 100644
--- a/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report.py
+++ b/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report.py
@@ -71,7 +71,6 @@ class report_timesheet_line(osv.osv):
l.invoice_id
)
""")
-report_timesheet_line()
@@ -107,7 +106,6 @@ class report_timesheet_user(osv.osv):
group by l.date, to_char(l.date,'YYYY'),to_char(l.date,'MM'), l.user_id
)
""")
-report_timesheet_user()
class report_timesheet_account(osv.osv):
_name = "report_timesheet.account"
@@ -140,7 +138,6 @@ class report_timesheet_account(osv.osv):
to_char(create_date, 'YYYY'),to_char(create_date, 'MM'), user_id, account_id
)
""")
-report_timesheet_account()
class report_timesheet_account_date(osv.osv):
@@ -174,7 +171,6 @@ class report_timesheet_account_date(osv.osv):
to_char(date,'YYYY'),to_char(date,'MM'), user_id, account_id
)
""")
-report_timesheet_account_date()
class report_timesheet_invoice(osv.osv):
@@ -215,7 +211,6 @@ class report_timesheet_invoice(osv.osv):
a.user_id
)
""")
-report_timesheet_invoice()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_invoice/report/report_analytic.py b/addons/hr_timesheet_invoice/report/report_analytic.py
index 53912fcb1d6..c620b2f9584 100644
--- a/addons/hr_timesheet_invoice/report/report_analytic.py
+++ b/addons/hr_timesheet_invoice/report/report_analytic.py
@@ -60,7 +60,6 @@ class report_analytic_account_close(osv.osv):
(a.quantity_max>0 and (sum(l.unit_amount)>=a.quantity_max)) or
a.date <= current_date
)""")
-report_analytic_account_close()
class report_account_analytic_line_to_invoice(osv.osv):
_name = "report.account.analytic.line.to.invoice"
@@ -105,7 +104,6 @@ class report_account_analytic_line_to_invoice(osv.osv):
to_char(l.date, 'YYYY'), to_char(l.date,'MM'), product_id, product_uom_id, account_id
)
""")
-report_account_analytic_line_to_invoice()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_invoice/test/hr_timesheet_invoice_report.yml b/addons/hr_timesheet_invoice/test/hr_timesheet_invoice_report.yml
index 9f7be9e53b3..39c3161f244 100644
--- a/addons/hr_timesheet_invoice/test/hr_timesheet_invoice_report.yml
+++ b/addons/hr_timesheet_invoice/test/hr_timesheet_invoice_report.yml
@@ -3,8 +3,9 @@
-
!python {model: account.analytic.line}: |
import os, time
- from openerp import netsvc, tools
+ import openerp.report
+ from openerp import tools
data_dict = {'model': 'ir.ui.menu', 'form': {'date_from': time.strftime('%Y-%m-01'), 'employee_ids': [[6,0,[ref('hr.employee_fp'), ref('hr.employee_qdp'),ref('hr.employee_al')]]], 'journal_ids': [[6,0,[ref('hr_timesheet.analytic_journal')]]], 'date_to': time.strftime('%Y-%m-%d')}}
- (data, format) = netsvc.LocalService('report.account.analytic.profit').create(cr, uid, [], data_dict, {})
+ data, format = openerp.report.render_report(cr, uid, [], 'account.analytic.profit', data_dict, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'hr_timesheet_invoice-account_analytic_profit_report.'+format), 'wb+').write(data)
diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_analytic_profit.py b/addons/hr_timesheet_invoice/wizard/hr_timesheet_analytic_profit.py
index 6c6523f93f9..2675556e8ac 100644
--- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_analytic_profit.py
+++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_analytic_profit.py
@@ -70,6 +70,5 @@ class account_analytic_profit(osv.osv_memory):
'datas': datas,
}
-account_analytic_profit()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_final_invoice_create.py b/addons/hr_timesheet_invoice/wizard/hr_timesheet_final_invoice_create.py
index 1977d6cccc5..8d5f0c4067c 100644
--- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_final_invoice_create.py
+++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_final_invoice_create.py
@@ -58,6 +58,5 @@ class final_invoice_create(osv.osv_memory):
act_win['name'] = _('Invoices')
return act_win
-final_invoice_create()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py
index 6aa8b0f9d8d..874370fea22 100644
--- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py
+++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py
@@ -69,7 +69,6 @@ class hr_timesheet_invoice_create(osv.osv_memory):
return act_win
-hr_timesheet_invoice_create()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index 4be032ba99b..156732ba33d 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -327,7 +327,6 @@ class hr_timesheet_line(osv.osv):
return dict([(el, self.on_change_account_id(cr, uid, ids, el, context.get('user_id', uid))) for el in account_ids])
-hr_timesheet_line()
class hr_attendance(osv.osv):
_inherit = "hr.attendance"
@@ -425,7 +424,6 @@ class hr_attendance(osv.osv):
raise osv.except_osv(_('Error!'), _('You cannot modify an entry in a confirmed timesheet'))
return True
-hr_attendance()
class hr_timesheet_sheet_sheet_day(osv.osv):
_name = "hr_timesheet_sheet.sheet.day"
@@ -505,7 +503,6 @@ class hr_timesheet_sheet_sheet_day(osv.osv):
GROUP BY name, sheet_id
)) AS bar""")
-hr_timesheet_sheet_sheet_day()
class hr_timesheet_sheet_sheet_account(osv.osv):
@@ -539,7 +536,6 @@ class hr_timesheet_sheet_sheet_account(osv.osv):
group by l.account_id, s.id, l.to_invoice
)""")
-hr_timesheet_sheet_sheet_account()
@@ -558,7 +554,6 @@ class res_company(osv.osv):
'timesheet_max_difference': lambda *args: 0.0
}
-res_company()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_sheet/report/hr_timesheet_report.py b/addons/hr_timesheet_sheet/report/hr_timesheet_report.py
index 49b66b63c0f..61c2b9e53da 100644
--- a/addons/hr_timesheet_sheet/report/hr_timesheet_report.py
+++ b/addons/hr_timesheet_sheet/report/hr_timesheet_report.py
@@ -79,6 +79,5 @@ class hr_timesheet_report(osv.osv):
l.currency_id
)
""")
-hr_timesheet_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_sheet/report/timesheet_report.py b/addons/hr_timesheet_sheet/report/timesheet_report.py
index 31255a3a6b2..16889253a68 100644
--- a/addons/hr_timesheet_sheet/report/timesheet_report.py
+++ b/addons/hr_timesheet_sheet/report/timesheet_report.py
@@ -114,6 +114,5 @@ class timesheet_report(osv.osv):
htss.user_id
)
""")
-timesheet_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml
index f2477b7c3f0..0cffabd0721 100644
--- a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml
+++ b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml
@@ -60,7 +60,6 @@
-
!python {model: hr_timesheet_sheet.sheet}: |
uid = ref('base.user_root')
- from openerp import netsvc
try:
self.button_confirm(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], {"active_ids":
[ref("hr_timesheet_sheet.menu_act_hr_timesheet_sheet_form")],"active_id": ref("hr_timesheet_sheet.menu_act_hr_timesheet_sheet_form"),
diff --git a/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py b/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py
index c2d5167c179..62511f4575b 100644
--- a/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py
+++ b/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py
@@ -58,6 +58,5 @@ class hr_timesheet_current_open(osv.osv_memory):
value['res_id'] = ids[0]
return value
-hr_timesheet_current_open()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/im/__init__.py b/addons/im/__init__.py
new file mode 100644
index 00000000000..23c6ad13350
--- /dev/null
+++ b/addons/im/__init__.py
@@ -0,0 +1,2 @@
+
+import im
diff --git a/addons/im/__openerp__.py b/addons/im/__openerp__.py
new file mode 100644
index 00000000000..a76dd7c8cc2
--- /dev/null
+++ b/addons/im/__openerp__.py
@@ -0,0 +1,27 @@
+{
+ 'name' : 'Instant Messaging',
+ 'version': '1.0',
+ 'summary': 'Live Chat, Talks with Others',
+ 'sequence': '18',
+ 'category': 'Tools',
+ 'complexity': 'easy',
+ 'description':
+ """
+Instant Messaging
+=================
+
+Allows users to chat with each other in real time. Find other users easily and
+chat in real time. It support several chats in parallel.
+ """,
+ 'data': [
+ 'security/ir.model.access.csv',
+ 'security/im_security.xml',
+ ],
+ 'depends' : ['base'],
+ 'js': ['static/src/js/*.js'],
+ 'css': ['static/src/css/*.css'],
+ 'qweb': ['static/src/xml/*.xml'],
+ 'installable': True,
+ 'auto_install': False,
+ 'application': True,
+}
diff --git a/addons/im/im.py b/addons/im/im.py
new file mode 100644
index 00000000000..0de9ea8c79b
--- /dev/null
+++ b/addons/im/im.py
@@ -0,0 +1,351 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import openerp
+import openerp.tools.config
+import openerp.modules.registry
+from openerp.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
+import datetime
+from openerp.osv import osv, fields
+import time
+import logging
+import json
+import select
+
+_logger = logging.getLogger(__name__)
+
+def listen_channel(cr, channel_name, handle_message, check_stop=(lambda: False), check_stop_timer=60.):
+ """
+ Begin a loop, listening on a PostgreSQL channel. This method does never terminate by default, you need to provide a check_stop
+ callback to do so. This method also assume that all notifications will include a message formated using JSON (see the
+ corresponding notify_channel() method).
+
+ :param db_name: database name
+ :param channel_name: the name of the PostgreSQL channel to listen
+ :param handle_message: function that will be called when a message is received. It takes one argument, the message
+ attached to the notification.
+ :type handle_message: function (one argument)
+ :param check_stop: function that will be called periodically (see the check_stop_timer argument). If it returns True
+ this function will stop to watch the channel.
+ :type check_stop: function (no arguments)
+ :param check_stop_timer: The maximum amount of time between calls to check_stop_timer (can be shorter if messages
+ are received).
+ """
+ try:
+ conn = cr._cnx
+ cr.execute("listen " + channel_name + ";")
+ cr.commit();
+ stopping = False
+ while not stopping:
+ if check_stop():
+ stopping = True
+ break
+ if select.select([conn], [], [], check_stop_timer) == ([],[],[]):
+ pass
+ else:
+ conn.poll()
+ while conn.notifies:
+ message = json.loads(conn.notifies.pop().payload)
+ handle_message(message)
+ finally:
+ try:
+ cr.execute("unlisten " + channel_name + ";")
+ cr.commit()
+ except:
+ pass # can't do anything if that fails
+
+def notify_channel(cr, channel_name, message):
+ """
+ Send a message through a PostgreSQL channel. The message will be formatted using JSON. This method will
+ commit the given transaction because the notify command in Postgresql seems to work correctly when executed in
+ a separate transaction (despite what is written in the documentation).
+
+ :param cr: The cursor.
+ :param channel_name: The name of the PostgreSQL channel.
+ :param message: The message, must be JSON-compatible data.
+ """
+ cr.commit()
+ cr.execute("notify " + channel_name + ", %s", [json.dumps(message)])
+ cr.commit()
+
+POLL_TIMER = 30
+DISCONNECTION_TIMER = POLL_TIMER + 5
+WATCHER_ERROR_DELAY = 10
+
+if openerp.evented:
+ import gevent
+ import gevent.event
+
+ class ImWatcher(object):
+ watchers = {}
+
+ @staticmethod
+ def get_watcher(db_name):
+ if not ImWatcher.watchers.get(db_name):
+ ImWatcher(db_name)
+ return ImWatcher.watchers[db_name]
+
+ def __init__(self, db_name):
+ self.db_name = db_name
+ ImWatcher.watchers[db_name] = self
+ self.waiting = 0
+ self.wait_id = 0
+ self.users = {}
+ self.users_watch = {}
+ gevent.spawn(self.loop)
+
+ def loop(self):
+ _logger.info("Begin watching on channel im_channel for database " + self.db_name)
+ stop = False
+ while not stop:
+ try:
+ registry = openerp.modules.registry.RegistryManager.get(self.db_name)
+ with registry.cursor() as cr:
+ listen_channel(cr, "im_channel", self.handle_message, self.check_stop)
+ stop = True
+ except:
+ # if something crash, we wait some time then try again
+ _logger.exception("Exception during watcher activity")
+ time.sleep(WATCHER_ERROR_DELAY)
+ _logger.info("End watching on channel im_channel for database " + self.db_name)
+ del ImWatcher.watchers[self.db_name]
+
+ def handle_message(self, message):
+ if message["type"] == "message":
+ for waiter in self.users.get(message["receiver"], {}).values():
+ waiter.set()
+ else: #type status
+ for waiter in self.users_watch.get(message["user"], {}).values():
+ waiter.set()
+
+ def check_stop(self):
+ return self.waiting == 0
+
+ def _get_wait_id(self):
+ self.wait_id += 1
+ return self.wait_id
+
+ def stop(self, user_id, watch_users, timeout=None):
+ wait_id = self._get_wait_id()
+ event = gevent.event.Event()
+ self.waiting += 1
+ self.users.setdefault(user_id, {})[wait_id] = event
+ for watch in watch_users:
+ self.users_watch.setdefault(watch, {})[wait_id] = event
+ try:
+ event.wait(timeout)
+ finally:
+ for watch in watch_users:
+ del self.users_watch[watch][wait_id]
+ if len(self.users_watch[watch]) == 0:
+ del self.users_watch[watch]
+ del self.users[user_id][wait_id]
+ if len(self.users[user_id]) == 0:
+ del self.users[user_id]
+ self.waiting -= 1
+
+
+class LongPollingController(openerp.addons.web.http.Controller):
+ _cp_path = '/longpolling/im'
+
+ @openerp.addons.web.http.jsonrequest
+ def poll(self, req, last=None, users_watch=None, db=None, uid=None, password=None, uuid=None):
+ assert_uuid(uuid)
+ if not openerp.evented:
+ raise Exception("Not usable in a server not running gevent")
+ if db is not None:
+ req.session._db = db
+ req.session._uid = uid
+ req.session._password = password
+ req.session.model('im.user').im_connect(uuid=uuid, context=req.context)
+ my_id = req.session.model('im.user').get_by_user_id(uuid or req.session._uid, req.context)["id"]
+ num = 0
+ while True:
+ res = req.session.model('im.message').get_messages(last, users_watch, uuid=uuid, context=req.context)
+ if num >= 1 or len(res["res"]) > 0:
+ return res
+ last = res["last"]
+ num += 1
+ ImWatcher.get_watcher(res["dbname"]).stop(my_id, users_watch or [], POLL_TIMER)
+
+ @openerp.addons.web.http.jsonrequest
+ def activated(self, req):
+ return not not openerp.evented
+
+ @openerp.addons.web.http.jsonrequest
+ def gen_uuid(self, req):
+ import uuid
+ return "%s" % uuid.uuid1()
+
+def assert_uuid(uuid):
+ if not isinstance(uuid, (str, unicode, type(None))):
+ raise Exception("%s is not a uuid" % uuid)
+
+
+class im_message(osv.osv):
+ _name = 'im.message'
+
+ _order = "date desc"
+
+ _columns = {
+ 'message': fields.char(string="Message", size=200, required=True),
+ 'from_id': fields.many2one("im.user", "From", required= True, ondelete='cascade'),
+ 'to_id': fields.many2one("im.user", "To", required=True, select=True, ondelete='cascade'),
+ 'date': fields.datetime("Date", required=True, select=True),
+ }
+
+ _defaults = {
+ 'date': lambda *args: datetime.datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT),
+ }
+
+ def get_messages(self, cr, uid, last=None, users_watch=None, uuid=None, context=None):
+ assert_uuid(uuid)
+ users_watch = users_watch or []
+
+ # complex stuff to determine the last message to show
+ users = self.pool.get("im.user")
+ my_id = users.get_by_user_id(cr, uid, uuid or uid, context=context)["id"]
+ c_user = users.browse(cr, openerp.SUPERUSER_ID, my_id, context=context)
+ if last:
+ if c_user.im_last_received < last:
+ users.write(cr, openerp.SUPERUSER_ID, my_id, {'im_last_received': last}, context=context)
+ else:
+ last = c_user.im_last_received or -1
+
+ # how fun it is to always need to reorder results from read
+ mess_ids = self.search(cr, openerp.SUPERUSER_ID, [['id', '>', last], ['to_id', '=', my_id]], order="id", context=context)
+ mess = self.read(cr, openerp.SUPERUSER_ID, mess_ids, ["id", "message", "from_id", "date"], context=context)
+ index = {}
+ for i in xrange(len(mess)):
+ index[mess[i]["id"]] = mess[i]
+ mess = []
+ for i in mess_ids:
+ mess.append(index[i])
+
+ if len(mess) > 0:
+ last = mess[-1]["id"]
+ users_status = users.read(cr, openerp.SUPERUSER_ID, users_watch, ["im_status"], context=context)
+ return {"res": mess, "last": last, "dbname": cr.dbname, "users_status": users_status}
+
+ def post(self, cr, uid, message, to_user_id, uuid=None, context=None):
+ assert_uuid(uuid)
+ my_id = self.pool.get('im.user').get_by_user_id(cr, uid, uuid or uid)["id"]
+ self.create(cr, openerp.SUPERUSER_ID, {"message": message, 'from_id': my_id, 'to_id': to_user_id}, context=context)
+ notify_channel(cr, "im_channel", {'type': 'message', 'receiver': to_user_id})
+ return False
+
+class im_user(osv.osv):
+ _name = "im.user"
+
+ def _im_status(self, cr, uid, ids, something, something_else, context=None):
+ res = {}
+ current = datetime.datetime.now()
+ delta = datetime.timedelta(0, DISCONNECTION_TIMER)
+ data = self.read(cr, openerp.SUPERUSER_ID, ids, ["im_last_status_update", "im_last_status"], context=context)
+ for obj in data:
+ last_update = datetime.datetime.strptime(obj["im_last_status_update"], DEFAULT_SERVER_DATETIME_FORMAT)
+ res[obj["id"]] = obj["im_last_status"] and (last_update + delta) > current
+ return res
+
+ def search_users(self, cr, uid, domain, fields, limit, context=None):
+ # do not user openerp.SUPERUSER_ID, reserved to normal users
+ found = self.pool.get('res.users').search(cr, uid, domain, limit=limit, context=context)
+ found = self.get_by_user_ids(cr, uid, found, context=context)
+ return self.read(cr, uid, found, fields, context=context)
+
+ def im_connect(self, cr, uid, uuid=None, context=None):
+ assert_uuid(uuid)
+ return self._im_change_status(cr, uid, True, uuid, context)
+
+ def im_disconnect(self, cr, uid, uuid=None, context=None):
+ assert_uuid(uuid)
+ return self._im_change_status(cr, uid, False, uuid, context)
+
+ def _im_change_status(self, cr, uid, new_one, uuid=None, context=None):
+ assert_uuid(uuid)
+ id = self.get_by_user_id(cr, uid, uuid or uid, context=context)["id"]
+ current_status = self.read(cr, openerp.SUPERUSER_ID, id, ["im_status"], context=None)["im_status"]
+ self.write(cr, openerp.SUPERUSER_ID, id, {"im_last_status": new_one,
+ "im_last_status_update": datetime.datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)}, context=context)
+ if current_status != new_one:
+ notify_channel(cr, "im_channel", {'type': 'status', 'user': id})
+ return True
+
+ def get_by_user_id(self, cr, uid, id, context=None):
+ ids = self.get_by_user_ids(cr, uid, [id], context=context)
+ return ids[0]
+
+ def get_by_user_ids(self, cr, uid, ids, context=None):
+ user_ids = [x for x in ids if isinstance(x, int)]
+ uuids = [x for x in ids if isinstance(x, (str, unicode))]
+ users = self.search(cr, openerp.SUPERUSER_ID, ["|", ["user", "in", user_ids], ["uuid", "in", uuids]], context=None)
+ records = self.read(cr, openerp.SUPERUSER_ID, users, ["user", "uuid"], context=None)
+ inside = {}
+ for i in records:
+ if i["user"]:
+ inside[i["user"][0]] = True
+ elif ["uuid"]:
+ inside[i["uuid"]] = True
+ not_inside = {}
+ for i in ids:
+ if not (i in inside):
+ not_inside[i] = True
+ for to_create in not_inside.keys():
+ if isinstance(to_create, int):
+ created = self.create(cr, openerp.SUPERUSER_ID, {"user": to_create}, context=context)
+ records.append({"id": created, "user": [to_create, ""]})
+ else:
+ created = self.create(cr, openerp.SUPERUSER_ID, {"uuid": to_create}, context=context)
+ records.append({"id": created, "uuid": to_create})
+ return records
+
+ def assign_name(self, cr, uid, uuid, name, context=None):
+ assert_uuid(uuid)
+ id = self.get_by_user_id(cr, uid, uuid or uid, context=context)["id"]
+ self.write(cr, openerp.SUPERUSER_ID, id, {"assigned_name": name}, context=context)
+ return True
+
+ def _get_name(self, cr, uid, ids, name, arg, context=None):
+ res = {}
+ for record in self.browse(cr, uid, ids, context=context):
+ res[record.id] = record.assigned_name
+ if record.user:
+ res[record.id] = record.user.name
+ continue
+ return res
+
+ _columns = {
+ 'name': fields.function(_get_name, type='char', size=200, string="Name", store=True, readonly=True),
+ 'assigned_name': fields.char(string="Assigned Name", size=200, required=False),
+ 'image': fields.related('user', 'image_small', type='binary', string="Image", readonly=True),
+ 'user': fields.many2one("res.users", string="User", select=True, ondelete='cascade'),
+ 'uuid': fields.char(string="UUID", size=50, select=True),
+ 'im_last_received': fields.integer(string="Instant Messaging Last Received Message"),
+ 'im_last_status': fields.boolean(strint="Instant Messaging Last Status"),
+ 'im_last_status_update': fields.datetime(string="Instant Messaging Last Status Update"),
+ 'im_status': fields.function(_im_status, string="Instant Messaging Status", type='boolean'),
+ }
+
+ _defaults = {
+ 'im_last_received': -1,
+ 'im_last_status': False,
+ 'im_last_status_update': lambda *args: datetime.datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT),
+ }
diff --git a/addons/im/security/im_security.xml b/addons/im/security/im_security.xml
new file mode 100644
index 00000000000..10297ac0669
--- /dev/null
+++ b/addons/im/security/im_security.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<openerp>
+ <data>
+ <record id="message_rule_1" model="ir.rule">
+ <field name="name">Can only read messages that you sent or messages sent to you</field>
+ <field name="model_id" ref="model_im_message"/>
+ <field name="groups" eval="[(6,0,[ref('base.group_user')])]"/>
+ <field name="domain_force">["|", ('to_id.user', '=', user.id), ('from_id.user', '=', user.id)]</field>
+ <field name="perm_unlink" eval="0"/>
+ <field name="perm_write" eval="0"/>
+ <field name="perm_read" eval="1"/>
+ <field name="perm_create" eval="0"/>
+ </record>
+
+ <record id="users_rule_1" model="ir.rule">
+ <field name="name">Can only modify your user</field>
+ <field name="model_id" ref="model_im_user"/>
+ <field name="groups" eval="[(6,0,[ref('base.group_user')])]"/>
+ <field name="domain_force">[('user', '=', user.id)]</field>
+ <field name="perm_unlink" eval="0"/>
+ <field name="perm_write" eval="1"/>
+ <field name="perm_read" eval="0"/>
+ <field name="perm_create" eval="0"/>
+ </record>
+ </data>
+</openerp>
diff --git a/addons/im/security/ir.model.access.csv b/addons/im/security/ir.model.access.csv
new file mode 100644
index 00000000000..ed639353e21
--- /dev/null
+++ b/addons/im/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_im_message,im.message,model_im_message,base.group_user,1,0,1,0
+access_im_user,im.user,model_im_user,base.group_user,1,1,1,0 \ No newline at end of file
diff --git a/addons/im/static/src/audio/Ting.mp3 b/addons/im/static/src/audio/Ting.mp3
new file mode 100644
index 00000000000..6fd090a89ce
--- /dev/null
+++ b/addons/im/static/src/audio/Ting.mp3
Binary files differ
diff --git a/addons/im/static/src/audio/Ting.ogg b/addons/im/static/src/audio/Ting.ogg
new file mode 100644
index 00000000000..8d17ea85bd3
--- /dev/null
+++ b/addons/im/static/src/audio/Ting.ogg
Binary files differ
diff --git a/addons/im/static/src/audio/purr.mp3 b/addons/im/static/src/audio/purr.mp3
new file mode 100644
index 00000000000..849d303c3b1
--- /dev/null
+++ b/addons/im/static/src/audio/purr.mp3
Binary files differ
diff --git a/addons/im/static/src/audio/purr.ogg b/addons/im/static/src/audio/purr.ogg
new file mode 100644
index 00000000000..2ddc77537f1
--- /dev/null
+++ b/addons/im/static/src/audio/purr.ogg
Binary files differ
diff --git a/addons/im/static/src/css/im.css b/addons/im/static/src/css/im.css
new file mode 100644
index 00000000000..2f3e7dd58bb
--- /dev/null
+++ b/addons/im/static/src/css/im.css
@@ -0,0 +1,258 @@
+
+.openerp .oe_im {
+ position: fixed;
+ background-color: #E8EBEF;
+ width: 220px;
+ border-left: 1px solid #AEB9BD;
+}
+
+/* button */
+
+.openerp .oe_topbar_imbutton {
+ cursor: pointer;
+}
+
+/* search stuff */
+.openerp .oe_im_frame_header {
+ position: relative;
+ background: #dedede;
+ background: -moz-linear-gradient(#fcfcfc, #dedede);
+ background: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
+ border-bottom: 1px solid border-color !important;
+ padding: 5px;
+}
+.openerp .oe_im_frame_header .oe_im_searchbox {
+ width: 168px;
+ padding: 1px 21px 1px 19px;
+ font-size: 13px;
+ -moz-border-radius: 13px;
+ -webkit-border-radius: 13px;
+ border-radius: 13px;
+}
+.openerp .oe_im_frame_header .oe_im_search_icon {
+ position: absolute;
+ color: #888;
+ top: 2px;
+ left: 9px;
+ font-size: 28px;
+ font-family: "entypoRegular" !important;
+ font-weight: 300 !important;
+}
+.openerp .oe_im_frame_header .oe_im_search_clear {
+ display: none;
+ position: absolute;
+ right: 11px;
+ top: 4px;
+ font-size: 26px;
+ color: #b6b6b6;
+ cursor: pointer;
+}
+.openerp .oe_im_frame_header .oe_im_search_clear:hover {
+ color: #888;
+}
+
+/* users */
+
+.openerp .oe_im_users {
+ padding-bottom: 38px;
+}
+.openerp .oe_im_user {
+ position: relative;
+ padding: 2px 6px;
+ cursor: pointer;
+ font-size: 13px;
+ margin-bottom: 3px;
+}
+.openerp .oe_im_user:hover {
+ background: lightGrey;
+}
+.openerp .oe_im_user_clip {
+ display: inline-block;
+ width: 26px;
+ height: 26px;
+ margin-right: 4px;
+ -moz-box-shadow: 0 0 2px 1px rgba(0,0,0,0.25);
+ -webkit-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.25);
+ box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.25);
+}
+.openerp .oe_im_user_avatar {
+ width: 26px;
+ height: auto;
+}
+.openerp .oe_im_user_name {
+ width: 162px;
+ line-height: 26px;
+ padding-right: 15px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ position: relative;
+}
+
+.openerp .oe_im_user_online {
+ display: none;
+ position: absolute;
+ top: 9.5px;
+ right: 11px;
+ width: 11px;
+ height: 11px;
+ vertical-align: middle;
+ border: 0;
+}
+
+/* conversations */
+
+.openerp .oe_im_chatview {
+ position: fixed;
+ overflow: hidden;
+ bottom: 6px;
+ margin-right: 6px;
+ background: rgba(60, 60, 60, 0.8);
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ -moz-box-shadow: 0 0 3px rgba(0,0,0,0.3), 0 2px 4px rgba(0,0,0,0.3);
+ -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 0 3px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3);
+ width: 240px;
+}
+.openerp .oe_im_chatview .oe_im_chatview_disconnected {
+ display:none;
+ z-index: 100;
+ width: 100%;
+ background: #E8EBEF;
+ padding: 5px;
+ font-size: 11px;
+ color: #999;
+ line-height: 14px;
+ height: 28px;
+ overflow: hidden;
+}
+.openerp .oe_im_chatview.oe_im_chatview_disconnected_status .oe_im_chatview_disconnected {
+ display: block;
+}
+.openerp .oe_im_chatview .oe_im_chatview_header {
+ padding: 3px 6px 2px;
+ background: #DEDEDE;
+ background: -moz-linear-gradient(#FCFCFC, #DEDEDE);
+ background: -webkit-gradient(linear, left top, left bottom, from(#FCFCFC), to(#DEDEDE));
+ -moz-border-radius: 3px 3px 0 0;
+ -webkit-border-radius: 3px 3px 0 0;
+ border-radius: 3px 3px 0 0;
+ border-bottom: 1px solid #AEB9BD;
+ cursor: pointer;
+}
+.openerp .oe_im_chatview .oe_im_chatview_close {
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+ font-size: 18px;
+ line-height: 16px;
+ float: right;
+ font-weight: bold;
+ color: black;
+ text-shadow: 0 1px 0 white;
+ opacity: 0.2;
+}
+.openerp .oe_im_chatview .oe_im_chatview_content {
+ overflow: auto;
+ height: 287px;
+}
+.openerp .oe_im_chatview.oe_im_chatview_disconnected_status .oe_im_chatview_content {
+ height: 249px;
+}
+.openerp .oe_im_chatview .oe_im_chatview_footer {
+ position: relative;
+ padding: 3px;
+ border-top: 1px solid #AEB9BD;
+ background: #DEDEDE;
+ background: -moz-linear-gradient(#FCFCFC, #DEDEDE);
+ background: -webkit-gradient(linear, left top, left bottom, from(#FCFCFC), to(#DEDEDE));
+ -moz-border-radius: 0 0 3px 3px;
+ -webkit-border-radius: 0 0 3px 3px;
+ border-radius: 0 0 3px 3px;
+}
+.openerp .oe_im_chatview .oe_im_chatview_input {
+ width: 222px;
+ font-family: Lato, Helvetica, sans-serif;
+ font-size: 13px;
+ color: #333;
+ padding: 1px 5px;
+ border: 1px solid #AEB9BD;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ -moz-box-shadow: inset 0 1px 4px rgba(0,0,0,0.2);
+ -webkit-box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.2);
+ box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.2);
+}
+.openerp .oe_im_chatview .oe_im_chatview_bubble {
+ background: white;
+ position: relative;
+ padding: 3px;
+ margin: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+}
+.openerp .oe_im_chatview .oe_im_chatview_clip {
+ position: relative;
+ float: left;
+ width: 26px;
+ height: 26px;
+ margin-right: 4px;
+ -moz-box-shadow: 0 0 2px 1px rgba(0,0,0,0.25);
+ -webkit-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.25);
+ box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.25);
+}
+.openerp .oe_im_chatview .oe_im_chatview_avatar {
+ float: left;
+ width: 26px;
+ height: auto;
+ clip: rect(0, 26px, 26px, 0);
+ max-width: 100%;
+ width: auto 9;
+ height: auto;
+ vertical-align: middle;
+ border: 0;
+ -ms-interpolation-mode: bicubic;
+}
+.openerp .oe_im_chatview .oe_im_chatview_time {
+ position: absolute;
+ right: 0px;
+ top: 0px;
+ margin: 3px;
+ text-align: right;
+ line-height: 13px;
+ font-size: 11px;
+ color: #999;
+ width: 60px;
+ overflow: hidden;
+}
+.openerp .oe_im_chatview .oe_im_chatview_from {
+ margin: 0 0 2px 0;
+ line-height: 14px;
+ font-weight: bold;
+ font-size: 12px;
+ width: 140px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ color: #3A87AD;
+}
+.openerp .oe_im_chatview .oe_im_chatview_bubble_list {
+}
+.openerp .oe_im_chatview .oe_im_chatview_bubble_item {
+ margin: 0 0 2px 30px;
+ line-height: 14px;
+ word-wrap: break-word;
+}
+
+.openerp .oe_im_chatview_online {
+ display: none;
+ margin-top: -4px;
+ width: 11px;
+ height: 11px;
+}
diff --git a/addons/im/static/src/img/avatar/avatar.jpeg b/addons/im/static/src/img/avatar/avatar.jpeg
new file mode 100644
index 00000000000..7168794022e
--- /dev/null
+++ b/addons/im/static/src/img/avatar/avatar.jpeg
Binary files differ
diff --git a/addons/im/static/src/img/button-gloss.png b/addons/im/static/src/img/button-gloss.png
new file mode 100755
index 00000000000..6f3957702fe
--- /dev/null
+++ b/addons/im/static/src/img/button-gloss.png
Binary files differ
diff --git a/addons/im/static/src/img/glyphicons-halflings-white.png b/addons/im/static/src/img/glyphicons-halflings-white.png
new file mode 100755
index 00000000000..3bf6484a29d
--- /dev/null
+++ b/addons/im/static/src/img/glyphicons-halflings-white.png
Binary files differ
diff --git a/addons/im/static/src/img/glyphicons-halflings.png b/addons/im/static/src/img/glyphicons-halflings.png
new file mode 100755
index 00000000000..a9969993201
--- /dev/null
+++ b/addons/im/static/src/img/glyphicons-halflings.png
Binary files differ
diff --git a/addons/im/static/src/img/green.png b/addons/im/static/src/img/green.png
new file mode 100644
index 00000000000..01fb373c251
--- /dev/null
+++ b/addons/im/static/src/img/green.png
Binary files differ
diff --git a/addons/im/static/src/img/icon.png b/addons/im/static/src/img/icon.png
new file mode 100644
index 00000000000..07d2503ce4e
--- /dev/null
+++ b/addons/im/static/src/img/icon.png
Binary files differ
diff --git a/addons/im/static/src/img/logo.png b/addons/im/static/src/img/logo.png
new file mode 100644
index 00000000000..aca5f4c60d8
--- /dev/null
+++ b/addons/im/static/src/img/logo.png
Binary files differ
diff --git a/addons/im/static/src/img/wood.png b/addons/im/static/src/img/wood.png
new file mode 100644
index 00000000000..22f2450d3ad
--- /dev/null
+++ b/addons/im/static/src/img/wood.png
Binary files differ
diff --git a/addons/im/static/src/js/im.js b/addons/im/static/src/js/im.js
new file mode 100644
index 00000000000..b21a339cb84
--- /dev/null
+++ b/addons/im/static/src/js/im.js
@@ -0,0 +1,463 @@
+
+openerp.im = function(instance) {
+
+ var USERS_LIMIT = 20;
+ var ERROR_DELAY = 5000;
+
+ var _t = instance.web._t,
+ _lt = instance.web._lt;
+ var QWeb = instance.web.qweb;
+
+ instance.web.UserMenu.include({
+ do_update: function(){
+ var self = this;
+ this.update_promise.then(function() {
+ var im = new instance.im.InstantMessaging(self);
+ im.appendTo(instance.client.$el);
+ var button = new instance.im.ImTopButton(this);
+ button.on("clicked", im, im.switch_display);
+ button.appendTo(instance.webclient.$el.find('.oe_systray'));
+ });
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ instance.im.ImTopButton = instance.web.Widget.extend({
+ template:'ImTopButton',
+ events: {
+ "click": "clicked",
+ },
+ clicked: function() {
+ this.trigger("clicked");
+ },
+ });
+
+ instance.im.InstantMessaging = instance.web.Widget.extend({
+ template: "InstantMessaging",
+ events: {
+ "keydown .oe_im_searchbox": "input_change",
+ "keyup .oe_im_searchbox": "input_change",
+ "change .oe_im_searchbox": "input_change",
+ },
+ init: function(parent) {
+ this._super(parent);
+ this.shown = false;
+ this.set("right_offset", 0);
+ this.set("current_search", "");
+ this.users = [];
+ this.c_manager = new instance.im.ConversationManager(this);
+ this.on("change:right_offset", this.c_manager, _.bind(function() {
+ this.c_manager.set("right_offset", this.get("right_offset"));
+ }, this));
+ this.user_search_dm = new instance.web.DropMisordered();
+ },
+ start: function() {
+ this.$el.css("right", -this.$el.outerWidth());
+ $(window).scroll(_.bind(this.calc_box, this));
+ $(window).resize(_.bind(this.calc_box, this));
+ this.calc_box();
+
+ this.on("change:current_search", this, this.search_changed);
+ this.search_changed();
+
+ var self = this;
+
+ return this.c_manager.start_polling();
+ },
+ calc_box: function() {
+ var $topbar = instance.client.$(".oe_topbar");
+ var top = $topbar.offset().top + $topbar.height();
+ top = Math.max(top - $(window).scrollTop(), 0);
+ this.$el.css("top", top);
+ this.$el.css("bottom", 0);
+ },
+ input_change: function() {
+ this.set("current_search", this.$(".oe_im_searchbox").val());
+ },
+ search_changed: function(e) {
+ var users = new instance.web.Model("im.user");
+ var self = this;
+ return this.user_search_dm.add(users.call("search_users",
+ [[["name", "ilike", this.get("current_search")], ["id", "<>", instance.session.uid]],
+ ["name", "user", "uuid", "im_status"], USERS_LIMIT], {context:new instance.web.CompoundContext()})).then(function(result) {
+ self.c_manager.add_to_user_cache(result);
+ self.$(".oe_im_input").val("");
+ var old_users = self.users;
+ self.users = [];
+ _.each(result, function(user) {
+ var widget = new instance.im.UserWidget(self, self.c_manager.get_user(user.id));
+ widget.appendTo(self.$(".oe_im_users"));
+ widget.on("activate_user", self, self.activate_user);
+ self.users.push(widget);
+ });
+ _.each(old_users, function(user) {
+ user.destroy();
+ });
+ });
+ },
+ switch_display: function() {
+ var fct = _.bind(function(place) {
+ this.set("right_offset", place + this.$el.outerWidth());
+ }, this);
+ var opt = {
+ step: fct,
+ };
+ if (this.shown) {
+ this.$el.animate({
+ right: -this.$el.outerWidth(),
+ }, opt);
+ } else {
+ if (! this.c_manager.get_activated()) {
+ this.do_warn("Instant Messaging is not activated on this server.", "");
+ return;
+ }
+ this.$el.animate({
+ right: 0,
+ }, opt);
+ }
+ this.shown = ! this.shown;
+ },
+ activate_user: function(user) {
+ this.c_manager.activate_user(user, true);
+ },
+ });
+
+ instance.im.UserWidget = instance.web.Widget.extend({
+ "template": "UserWidget",
+ events: {
+ "click": "activate_user",
+ },
+ init: function(parent, user) {
+ this._super(parent);
+ this.user = user;
+ this.user.add_watcher();
+ },
+ start: function() {
+ var change_status = function() {
+ this.$(".oe_im_user_online").toggle(this.user.get("im_status") === true);
+ };
+ this.user.on("change:im_status", this, change_status);
+ change_status.call(this);
+ },
+ activate_user: function() {
+ this.trigger("activate_user", this.user);
+ },
+ destroy: function() {
+ this.user.remove_watcher();
+ this._super();
+ },
+ });
+
+ instance.im.ImUser = instance.web.Class.extend(instance.web.PropertiesMixin, {
+ init: function(parent, user_rec) {
+ instance.web.PropertiesMixin.init.call(this, parent);
+ user_rec.image_url = instance.session.url("/im/static/src/img/avatar/avatar.jpeg");
+ if (user_rec.user)
+ user_rec.image_url = instance.session.url('/web/binary/image', {model:'res.users', field: 'image_small', id: user_rec.user[0]});
+ this.set(user_rec);
+ this.set("watcher_count", 0);
+ this.on("change:watcher_count", this, function() {
+ if (this.get("watcher_count") === 0)
+ this.destroy();
+ });
+ },
+ destroy: function() {
+ this.trigger("destroyed");
+ instance.web.PropertiesMixin.destroy.call(this);
+ },
+ add_watcher: function() {
+ this.set("watcher_count", this.get("watcher_count") + 1);
+ },
+ remove_watcher: function() {
+ this.set("watcher_count", this.get("watcher_count") - 1);
+ },
+ });
+
+ instance.im.ConversationManager = instance.web.Controller.extend({
+ init: function(parent) {
+ this._super(parent);
+ this.set("right_offset", 0);
+ this.conversations = [];
+ this.users = {};
+ this.on("change:right_offset", this, this.calc_positions);
+ this.set("window_focus", true);
+ this.set("waiting_messages", 0);
+ this.focus_hdl = _.bind(function() {
+ this.set("window_focus", true);
+ }, this);
+ $(window).bind("focus", this.focus_hdl);
+ this.blur_hdl = _.bind(function() {
+ this.set("window_focus", false);
+ }, this);
+ $(window).bind("blur", this.blur_hdl);
+ this.on("change:window_focus", this, this.window_focus_change);
+ this.window_focus_change();
+ this.on("change:waiting_messages", this, this.messages_change);
+ this.messages_change();
+ this.create_ting();
+ this.activated = false;
+ this.users_cache = {};
+ this.last = null;
+ this.unload_event_handler = _.bind(this.unload, this);
+ },
+ start_polling: function() {
+ var self = this;
+ return new instance.web.Model("im.user").call("get_by_user_id", [instance.session.uid]).then(function(my_id) {
+ self.my_id = my_id["id"];
+ return self.ensure_users([self.my_id]).then(function() {
+ var me = self.users_cache[self.my_id];
+ delete self.users_cache[self.my_id];
+ self.me = me;
+ self.rpc("/longpolling/im/activated", {}, {shadow: true}).then(function(activated) {
+ if (activated) {
+ self.activated = true;
+ $(window).on("unload", self.unload_event_handler);
+ self.poll();
+ }
+ }, function(a, e) {
+ e.preventDefault();
+ });
+ });
+ });
+ },
+ unload: function() {
+ return new instance.web.Model("im.user").call("im_disconnect", [], {context: new instance.web.CompoundContext()});
+ },
+ ensure_users: function(user_ids) {
+ var no_cache = {};
+ _.each(user_ids, function(el) {
+ if (! this.users_cache[el])
+ no_cache[el] = el;
+ }, this);
+ var self = this;
+ if (_.size(no_cache) === 0)
+ return $.when();
+ else
+ return new instance.web.Model("im.user").call("read", [_.values(no_cache), ["name", "user", "uuid", "im_status"]],
+ {context: new instance.web.CompoundContext()}).then(function(users) {
+ self.add_to_user_cache(users);
+ });
+ },
+ add_to_user_cache: function(user_recs) {
+ _.each(user_recs, function(user_rec) {
+ if (! this.users_cache[user_rec.id]) {
+ var user = new instance.im.ImUser(this, user_rec);
+ this.users_cache[user_rec.id] = user;
+ user.on("destroyed", this, function() {
+ delete this.users_cache[user_rec.id];
+ });
+ }
+ }, this);
+ },
+ get_user: function(user_id) {
+ return this.users_cache[user_id];
+ },
+ poll: function() {
+ var self = this;
+ var user_ids = _.map(this.users_cache, function(el) {
+ return el.get("id");
+ });
+ this.rpc("/longpolling/im/poll", {
+ last: this.last,
+ users_watch: user_ids,
+ context: instance.web.pyeval.eval('context', {}),
+ }, {shadow: true}).then(function(result) {
+ _.each(result.users_status, function(el) {
+ if (self.get_user(el.id))
+ self.get_user(el.id).set(el);
+ });
+ self.last = result.last;
+ var user_ids = _.pluck(_.pluck(result.res, "from_id"), 0);
+ self.ensure_users(user_ids).then(function() {
+ _.each(result.res, function(mes) {
+ var user = self.get_user(mes.from_id[0]);
+ self.received_message(mes, user);
+ });
+ self.poll();
+ });
+ }, function(unused, e) {
+ e.preventDefault();
+ setTimeout(_.bind(self.poll, self), ERROR_DELAY);
+ });
+ },
+ get_activated: function() {
+ return this.activated;
+ },
+ create_ting: function() {
+ var kitten = jQuery.param !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined;
+ this.ting = new Audio(instance.webclient.session.origin + "/im/static/src/audio/" + (kitten ? "purr" : "Ting") +
+ (new Audio().canPlayType("audio/ogg; codecs=vorbis") ? ".ogg" : ".mp3"));
+ },
+ window_focus_change: function() {
+ if (this.get("window_focus")) {
+ this.set("waiting_messages", 0);
+ }
+ },
+ messages_change: function() {
+ if (! instance.webclient.set_title_part)
+ return;
+ instance.webclient.set_title_part("aa_im_messages", this.get("waiting_messages") === 0 ? undefined :
+ _.str.sprintf(_t("%d Messages"), this.get("waiting_messages")));
+ },
+ activate_user: function(user, focus) {
+ var conv = this.users[user.get('id')];
+ if (! conv) {
+ conv = new instance.im.Conversation(this, user, this.me);
+ conv.appendTo(instance.client.$el);
+ conv.on("destroyed", this, function() {
+ this.conversations = _.without(this.conversations, conv);
+ delete this.users[conv.user.get('id')];
+ this.calc_positions();
+ });
+ this.conversations.push(conv);
+ this.users[user.get('id')] = conv;
+ this.calc_positions();
+ }
+ if (focus)
+ conv.focus();
+ return conv;
+ },
+ received_message: function(message, user) {
+ if (! this.get("window_focus")) {
+ this.set("waiting_messages", this.get("waiting_messages") + 1);
+ this.ting.play();
+ this.create_ting();
+ }
+ var conv = this.activate_user(user);
+ conv.received_message(message);
+ },
+ calc_positions: function() {
+ var current = this.get("right_offset");
+ _.each(_.range(this.conversations.length), function(i) {
+ this.conversations[i].set("right_position", current);
+ current += this.conversations[i].$el.outerWidth(true);
+ }, this);
+ },
+ destroy: function() {
+ $(window).off("unload", this.unload_event_handler);
+ $(window).unbind("blur", this.blur_hdl);
+ $(window).unbind("focus", this.focus_hdl);
+ this._super();
+ },
+ });
+
+ instance.im.Conversation = instance.web.Widget.extend({
+ "template": "Conversation",
+ events: {
+ "keydown input": "send_message",
+ "click .oe_im_chatview_close": "destroy",
+ "click .oe_im_chatview_header": "show_hide",
+ },
+ init: function(parent, user, me) {
+ this._super(parent);
+ this.me = me;
+ this.user = user;
+ this.user.add_watcher();
+ this.set("right_position", 0);
+ this.shown = true;
+ this.set("pending", 0);
+ },
+ start: function() {
+ var change_status = function() {
+ this.$el.toggleClass("oe_im_chatview_disconnected_status", this.user.get("im_status") === false);
+ this.$(".oe_im_chatview_online").toggle(this.user.get("im_status") === true);
+ this._go_bottom();
+ };
+ this.user.on("change:im_status", this, change_status);
+ change_status.call(this);
+
+ this.on("change:right_position", this, this.calc_pos);
+ this.full_height = this.$el.height();
+ this.calc_pos();
+ this.on("change:pending", this, _.bind(function() {
+ if (this.get("pending") === 0) {
+ this.$(".oe_im_chatview_nbr_messages").text("");
+ } else {
+ this.$(".oe_im_chatview_nbr_messages").text("(" + this.get("pending") + ")");
+ }
+ }, this));
+ },
+ show_hide: function() {
+ if (this.shown) {
+ this.$el.animate({
+ height: this.$(".oe_im_chatview_header").outerHeight(),
+ });
+ } else {
+ this.$el.animate({
+ height: this.full_height,
+ });
+ }
+ this.shown = ! this.shown;
+ if (this.shown) {
+ this.set("pending", 0);
+ }
+ },
+ calc_pos: function() {
+ this.$el.css("right", this.get("right_position"));
+ },
+ received_message: function(message) {
+ if (this.shown) {
+ this.set("pending", 0);
+ } else {
+ this.set("pending", this.get("pending") + 1);
+ }
+ this._add_bubble(this.user, message.message, message.date);
+ },
+ send_message: function(e) {
+ if(e && e.which !== 13) {
+ return;
+ }
+ var mes = this.$("input").val();
+ this.$("input").val("");
+ var send_it = _.bind(function() {
+ var model = new instance.web.Model("im.message");
+ return model.call("post", [mes, this.user.get('id')],
+ {context: new instance.web.CompoundContext()});
+ }, this);
+ var tries = 0;
+ send_it().then(_.bind(function() {
+ this._add_bubble(this.me, mes, instance.web.datetime_to_str(new Date()));
+ }, this), function(error, e) {
+ e.preventDefault();
+ tries += 1;
+ if (tries < 3)
+ return send_it();
+ });
+ },
+ _add_bubble: function(user, item, date) {
+ var items = [item];
+ if (user === this.last_user) {
+ this.last_bubble.remove();
+ items = this.last_items.concat(items);
+ }
+ this.last_user = user;
+ this.last_items = items;
+ date = instance.web.str_to_datetime(date);
+ var now = new Date();
+ var diff = now - date;
+ if (diff > (1000 * 60 * 60 * 24)) {
+ date = $.timeago(date);
+ } else {
+ date = date.toString(Date.CultureInfo.formatPatterns.shortTime);
+ }
+
+ this.last_bubble = $(QWeb.render("Conversation.bubble", {"items": items, "user": user, "time": date}));
+ $(this.$(".oe_im_chatview_content").children()[0]).append(this.last_bubble);
+ this._go_bottom();
+ },
+ _go_bottom: function() {
+ this.$(".oe_im_chatview_content").scrollTop($(this.$(".oe_im_chatview_content").children()[0]).height());
+ },
+ focus: function() {
+ this.$(".oe_im_chatview_input").focus();
+ if (! this.shown)
+ this.show_hide();
+ },
+ destroy: function() {
+ this.user.remove_watcher();
+ this.trigger("destroyed");
+ return this._super();
+ },
+ });
+
+} \ No newline at end of file
diff --git a/addons/im/static/src/xml/im.xml b/addons/im/static/src/xml/im.xml
new file mode 100644
index 00000000000..795d1b3e698
--- /dev/null
+++ b/addons/im/static/src/xml/im.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vim:fdl=1:
+-->
+<templates xml:space="preserve">
+ <t t-name="InstantMessaging">
+ <div class="oe_im">
+ <div class="oe_im_frame_header">
+ <span class="oe_e oe_im_search_icon">ô</span>
+ <input class="oe_im_searchbox" t-att-placeholder="_t('Search users...')"/>
+ <span class="oe_e oe_im_search_clear">[</span>
+ </div>
+ <div class="oe_im_users"></div>
+ <div class="oe_im_content"></div>
+ </div>
+ </t>
+ <t t-name="ImTopButton">
+ <div t-att-title='_t("Display Instant Messaging")' class="oe_topbar_item oe_topbar_imbutton">
+ <span class="oe_e">+</span>
+ </div>
+ </t>
+ <t t-name="UserWidget">
+ <div class="oe_im_user">
+ <span class="oe_im_user_clip">
+ <img t-att-src='widget.user.get("image_url")' class="oe_im_user_avatar"/>
+ </span>
+ <span class="oe_im_user_name"><t t-esc="widget.user.get('name')"/></span>
+ <img t-att-src="_s +'/im/static/src/img/green.png'" class="oe_im_user_online"/>
+ </div>
+ </t>
+ <t t-name="Conversation">
+ <div class="oe_im_chatview">
+ <div class="oe_im_chatview_header">
+ <img t-att-src="_s +'/im/static/src/img/green.png'" class="oe_im_chatview_online"/>
+ <t t-esc="widget.user.get('name') || 'Anonymous'"/>
+ <scan class="oe_im_chatview_nbr_messages" />
+ <button class="oe_im_chatview_close">×</button>
+ </div>
+ <div class="oe_im_chatview_disconnected">
+ <t t-esc='_.str.sprintf(_t("%s is offline. He/She will receive your messages on his/her next connection."), widget.user.get("name") || "Anonymous")'/>
+ </div>
+ <div class="oe_im_chatview_content">
+ <div></div>
+ </div>
+ <div class="oe_im_chatview_footer">
+ <input class="oe_im_chatview_input" t-att-placeholder="_t('Say something...')" />
+ </div>
+ </div>
+ </t>
+ <t t-name="Conversation.bubble">
+ <div class="oe_im_chatview_bubble">
+ <div class="oe_im_chatview_clip">
+ <img class="oe_im_chatview_avatar" t-att-src='user.get("image_url")'/>
+ </div>
+ <div class="oe_im_chatview_from"><t t-esc="user.get('name') || 'Anonymous'"/></div>
+ <div class="oe_im_chatview_bubble_list">
+ <t t-foreach="items" t-as="item">
+ <div class="oe_im_chatview_bubble_item"><t t-esc="item"/></div>
+ </t>
+ </div>
+ <div class="oe_im_chatview_time"><t t-esc="time"/></div>
+ </div>
+ </t>
+</templates> \ No newline at end of file
diff --git a/addons/im_livechat/__init__.py b/addons/im_livechat/__init__.py
new file mode 100644
index 00000000000..2825a75179c
--- /dev/null
+++ b/addons/im_livechat/__init__.py
@@ -0,0 +1,2 @@
+
+import im_livechat
diff --git a/addons/im_livechat/__openerp__.py b/addons/im_livechat/__openerp__.py
new file mode 100644
index 00000000000..8b9ea3924d5
--- /dev/null
+++ b/addons/im_livechat/__openerp__.py
@@ -0,0 +1,29 @@
+{
+ 'name' : 'Live Support',
+ 'version': '1.0',
+ 'summary': 'Live Chat with Visitors/Customers',
+ 'category': 'Tools',
+ 'complexity': 'easy',
+ 'description':
+ """
+Live Chat Support
+=================
+
+Allow to drop instant messaging widgets on any web page that will communicate
+with the current server and dispatch visitors request amongst several live
+chat operators.
+
+ """,
+ 'data': [
+ "security/im_livechat_security.xml",
+ "security/ir.model.access.csv",
+ "im_livechat_view.xml",
+ ],
+ 'demo': [
+ "im_livechat_demo.xml",
+ ],
+ 'depends' : ["im", "mail", "portal_anonymous"],
+ 'installable': True,
+ 'auto_install': False,
+ 'application': True,
+}
diff --git a/addons/im_livechat/im_livechat.py b/addons/im_livechat/im_livechat.py
new file mode 100644
index 00000000000..1ffb422fe6a
--- /dev/null
+++ b/addons/im_livechat/im_livechat.py
@@ -0,0 +1,245 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import openerp
+import openerp.addons.im.im as im
+import json
+import random
+import jinja2
+from openerp.osv import osv, fields
+from openerp import tools
+
+env = jinja2.Environment(
+ loader=jinja2.PackageLoader('openerp.addons.im_livechat', "."),
+ autoescape=False
+)
+env.filters["json"] = json.dumps
+
+class LiveChatController(openerp.addons.web.http.Controller):
+ _cp_path = '/im_livechat'
+
+ @openerp.addons.web.http.httprequest
+ def loader(self, req, **kwargs):
+ p = json.loads(kwargs["p"])
+ db = p["db"]
+ channel = p["channel"]
+ user_name = p.get("user_name", None)
+ req.session._db = db
+ req.session._uid = None
+ req.session._login = "anonymous"
+ req.session._password = "anonymous"
+ info = req.session.model('im_livechat.channel').get_info_for_chat_src(channel)
+ info["db"] = db
+ info["channel"] = channel
+ info["userName"] = user_name
+ return req.make_response(env.get_template("loader.js").render(info),
+ headers=[('Content-Type', "text/javascript")])
+
+ @openerp.addons.web.http.httprequest
+ def web_page(self, req, **kwargs):
+ p = json.loads(kwargs["p"])
+ db = p["db"]
+ channel = p["channel"]
+ req.session._db = db
+ req.session._uid = None
+ req.session._login = "anonymous"
+ req.session._password = "anonymous"
+ script = req.session.model('im_livechat.channel').read(channel, ["script"])["script"]
+ info = req.session.model('im_livechat.channel').get_info_for_chat_src(channel)
+ info["script"] = script
+ return req.make_response(env.get_template("web_page.html").render(info),
+ headers=[('Content-Type', "text/html")])
+
+ @openerp.addons.web.http.jsonrequest
+ def available(self, req, db, channel):
+ req.session._db = db
+ req.session._uid = None
+ req.session._login = "anonymous"
+ req.session._password = "anonymous"
+ return req.session.model('im_livechat.channel').get_available_user(channel) > 0
+
+class im_livechat_channel(osv.osv):
+ _name = 'im_livechat.channel'
+
+ def _get_default_image(self, cr, uid, context=None):
+ image_path = openerp.modules.get_module_resource('im_livechat', 'static/src/img', 'default.png')
+ return tools.image_resize_image_big(open(image_path, 'rb').read().encode('base64'))
+ def _get_image(self, cr, uid, ids, name, args, context=None):
+ result = dict.fromkeys(ids, False)
+ for obj in self.browse(cr, uid, ids, context=context):
+ result[obj.id] = tools.image_get_resized_images(obj.image)
+ return result
+ def _set_image(self, cr, uid, id, name, value, args, context=None):
+ return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)
+
+
+ def _are_you_inside(self, cr, uid, ids, name, arg, context=None):
+ res = {}
+ for record in self.browse(cr, uid, ids, context=context):
+ res[record.id] = False
+ for user in record.user_ids:
+ if user.id == uid:
+ res[record.id] = True
+ break
+ return res
+
+ def _script(self, cr, uid, ids, name, arg, context=None):
+ res = {}
+ for record in self.browse(cr, uid, ids, context=context):
+ res[record.id] = env.get_template("include.html").render({
+ "url": self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url'),
+ "parameters": {"db":cr.dbname, "channel":record.id},
+ })
+ return res
+
+ def _web_page(self, cr, uid, ids, name, arg, context=None):
+ res = {}
+ for record in self.browse(cr, uid, ids, context=context):
+ res[record.id] = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url') + \
+ "/im_livechat/web_page?p=" + json.dumps({"db":cr.dbname, "channel":record.id})
+ return res
+
+ _columns = {
+ 'name': fields.char(string="Channel Name", size=200, required=True),
+ 'user_ids': fields.many2many('res.users', 'im_livechat_channel_im_user', 'channel_id', 'user_id', string="Users"),
+ 'are_you_inside': fields.function(_are_you_inside, type='boolean', string='Are you inside the matrix?', store=False),
+ 'script': fields.function(_script, type='text', string='Script', store=False),
+ 'web_page': fields.function(_web_page, type='url', string='Web Page', store=False, size="200"),
+ 'button_text': fields.char(string="Text of the Button", size=200),
+ 'input_placeholder': fields.char(string="Chat Input Placeholder", size=200),
+ 'default_message': fields.char(string="Welcome Message", size=200, help="This is an automated 'welcome' message that your visitor will see when they initiate a new chat session."),
+ # image: all image fields are base64 encoded and PIL-supported
+ 'image': fields.binary("Photo",
+ help="This field holds the image used as photo for the group, limited to 1024x1024px."),
+ 'image_medium': fields.function(_get_image, fnct_inv=_set_image,
+ string="Medium-sized photo", type="binary", multi="_get_image",
+ store={
+ 'im_livechat.channel': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
+ },
+ help="Medium-sized photo of the group. It is automatically "\
+ "resized as a 128x128px image, with aspect ratio preserved. "\
+ "Use this field in form views or some kanban views."),
+ 'image_small': fields.function(_get_image, fnct_inv=_set_image,
+ string="Small-sized photo", type="binary", multi="_get_image",
+ store={
+ 'im_livechat.channel': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
+ },
+ help="Small-sized photo of the group. It is automatically "\
+ "resized as a 64x64px image, with aspect ratio preserved. "\
+ "Use this field anywhere a small image is required."),
+ }
+
+ def _default_user_ids(self, cr, uid, context=None):
+ return [(6, 0, [uid])]
+
+ _defaults = {
+ 'button_text': "Have a Question? Chat with us.",
+ 'input_placeholder': "How may I help you?",
+ 'default_message': '',
+ 'user_ids': _default_user_ids,
+ 'image': _get_default_image,
+ }
+
+ def get_available_user(self, cr, uid, channel_id, context=None):
+ channel = self.browse(cr, openerp.SUPERUSER_ID, channel_id, context=context)
+ users = []
+ for user in channel.user_ids:
+ iuid = self.pool.get("im.user").get_by_user_id(cr, uid, user.id, context=context)["id"]
+ imuser = self.pool.get("im.user").browse(cr, uid, iuid, context=context)
+ if imuser.im_status:
+ users.append(imuser)
+ if len(users) == 0:
+ return False
+ return random.choice(users).id
+
+ def test_channel(self, cr, uid, channel, context=None):
+ if not channel:
+ return {}
+ return {
+ 'url': self.browse(cr, uid, channel[0], context=context or {}).web_page,
+ 'type': 'ir.actions.act_url'
+ }
+
+ def get_info_for_chat_src(self, cr, uid, channel, context=None):
+ url = self.pool.get('ir.config_parameter').get_param(cr, openerp.SUPERUSER_ID, 'web.base.url')
+ chan = self.browse(cr, uid, channel, context=context)
+ return {
+ "url": url,
+ 'buttonText': chan.button_text,
+ 'inputPlaceholder': chan.input_placeholder,
+ 'defaultMessage': chan.default_message,
+ "channelName": chan.name,
+ }
+
+ def join(self, cr, uid, ids, context=None):
+ self.write(cr, uid, ids, {'user_ids': [(4, uid)]})
+ return True
+
+ def quit(self, cr, uid, ids, context=None):
+ self.write(cr, uid, ids, {'user_ids': [(3, uid)]})
+ return True
+
+
+class im_message(osv.osv):
+ _inherit = 'im.message'
+
+ def _support_member(self, cr, uid, ids, name, arg, context=None):
+ res = {}
+ for record in self.browse(cr, uid, ids, context=context):
+ res[record.id] = False
+ if record.to_id.user and record.from_id.user:
+ continue
+ elif record.to_id.user:
+ res[record.id] = record.to_id.user.id
+ elif record.from_id.user:
+ res[record.id] = record.from_id.user.id
+ return res
+
+ def _customer(self, cr, uid, ids, name, arg, context=None):
+ res = {}
+ for record in self.browse(cr, uid, ids, context=context):
+ res[record.id] = False
+ if record.to_id.uuid and record.from_id.uuid:
+ continue
+ elif record.to_id.uuid:
+ res[record.id] = record.to_id.id
+ elif record.from_id.uuid:
+ res[record.id] = record.from_id.id
+ return res
+
+ def _direction(self, cr, uid, ids, name, arg, context=None):
+ res = {}
+ for record in self.browse(cr, uid, ids, context=context):
+ res[record.id] = False
+ if not not record.to_id.user and not not record.from_id.user:
+ continue
+ elif not not record.to_id.user:
+ res[record.id] = "c2s"
+ elif not not record.from_id.user:
+ res[record.id] = "s2c"
+ return res
+
+ _columns = {
+ 'support_member_id': fields.function(_support_member, type='many2one', relation='res.users', string='Support Member', store=True, select=True),
+ 'customer_id': fields.function(_customer, type='many2one', relation='im.user', string='Customer', store=True, select=True),
+ 'direction': fields.function(_direction, type="selection", selection=[("s2c", "Support Member to Customer"), ("c2s", "Customer to Support Member")],
+ string='Direction', store=False),
+ }
diff --git a/addons/im_livechat/im_livechat_demo.xml b/addons/im_livechat/im_livechat_demo.xml
new file mode 100644
index 00000000000..f199179fb50
--- /dev/null
+++ b/addons/im_livechat/im_livechat_demo.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<openerp>
+ <data>
+
+ <record id="channel_website" model="im_livechat.channel">
+ <field name="name">YourWebsite.com</field>
+ <field name="default_message">Hello, how may I help you?</field>
+ </record>
+
+ <record id="group_im_livechat" model="res.groups">
+ <field name="users" eval="[(4, ref('base.user_demo'))]"/>
+ </record>
+
+ </data>
+</openerp>
diff --git a/addons/im_livechat/im_livechat_view.xml b/addons/im_livechat/im_livechat_view.xml
new file mode 100644
index 00000000000..f684fd561fc
--- /dev/null
+++ b/addons/im_livechat/im_livechat_view.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0"?>
+<openerp>
+ <data>
+ <menuitem id="im_livechat" name="Live Chat" parent="mail.mail_feeds_main" groups="group_im_livechat"/>
+
+ <record model="ir.actions.act_window" id="action_support_channels">
+ <field name="name">Live Chat Channels</field>
+ <field name="res_model">im_livechat.channel</field>
+ <field name="view_mode">kanban,form</field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click to define a new live chat channel.
+ </p><p>
+ You can create channels for each website on which you want
+ to integrate the live chat widget, allowing you website
+ visitors to talk in real time with your operators.
+ </p><p>
+ Each channel has it's own URL that you can send by email to
+ your customers in order to start chatting with you.
+ </p>
+ </field>
+ </record>
+ <menuitem name="Channels" parent="im_livechat" id="support_channels" action="action_support_channels" groups="group_im_livechat"/>
+
+
+ <record model="ir.ui.view" id="support_channel_kanban">
+ <field name="name">support_channel.kanban</field>
+ <field name="model">im_livechat.channel</field>
+ <field name="arch" type="xml">
+ <kanban>
+ <field name="name"/>
+ <field name="web_page"/>
+ <field name="are_you_inside"/>
+ <field name="user_ids"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div class="oe_group_image">
+ <a type="open"><img t-att-src="kanban_image('im_livechat.channel', 'image_medium', record.id.value)" class="oe_group_photo"/></a>
+ </div>
+ <div class="oe_group_details">
+ <h4><a type="open"><field name="name"/></a></h4>
+ <div class="oe_kanban_footer_left">
+ <span>
+ <span class="oe_e">+</span> <t t-esc="(record.user_ids.raw_value || []).length"/>
+ </span>
+ </div>
+ <div class="oe_group_button">
+ <button t-if="record.are_you_inside.raw_value" name="quit" type="object" class="oe_group_join">Quit</button>
+ <button t-if="! record.are_you_inside.raw_value" name="join" type="object">Join</button>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
+
+
+ <record id="support_channel_form" model="ir.ui.view">
+ <field name="name">support_channel.form</field>
+ <field name="model">im_livechat.channel</field>
+ <field name="arch" type="xml">
+ <form string="Support Channels" version="7.0">
+ <sheet>
+ <field name="image" widget='image' class="oe_avatar oe_left" options='{"preview_image": "image_medium"}'/>
+ <div class="oe_title">
+ <label for="name" class="oe_edit_only"/>
+ <h1>
+ <field name="name" placeholder="e.g. YourWebsite.com"/>
+ </h1>
+ <div>
+ <button type="object" name="join" class="oe_highlight" string="Join Channel" attrs='{"invisible": [["are_you_inside", "=", True]]}'/>
+ <button type="object" name="quit" string="Leave Channel" attrs='{"invisible": [["are_you_inside", "=", False]]}'/>
+ <button type="object" name="test_channel" string="Test" attrs='{"invisible": [["web_page", "=", False]]}'/>
+ <field name="are_you_inside" invisible="1"/>
+ </div>
+ </div>
+
+ <group>
+ <group string="Operators">
+ <field name="user_ids" widget="many2many_kanban" nolabel="1" colspan="2">
+ <kanban>
+ <field name="name"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div>
+ <a t-if="! read_only_mode" type="delete" style="position: absolute; right: 0; padding: 4px; diplay: inline-block">X</a>
+ <div class="oe_group_details" style="min-height: 40px">
+ <img t-att-src="kanban_image('res.users', 'image', record.id.value)"
+ class="oe_avatar oe_kanban_avatar_smallbox" style="float:left; margin-right: 10px;"/>
+ <h4><field name="name"/></h4>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </group>
+ <group string="Options">
+ <field name="button_text"/>
+ <field name="input_placeholder"/>
+ <field name="default_message" placeholder="e.g. Hello, how may I help you?"/>
+ </group>
+ </group>
+
+ <div attrs='{"invisible": [["web_page", "=", False]]}'>
+ <separator string="How to use the Live Chat widget?"/>
+ <p>
+ Copy and paste this code into your website, within the &amp;lt;head&amp;gt; tag:
+ </p>
+ <field name="script" readonly="1" class="oe_tag"/>
+ <p>
+ or copy this url and send it by email to your customers or suppliers:
+ </p>
+ <field name="web_page" readonly="1" class="oe_tag"/>
+ </div>
+
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record model="ir.actions.act_window" id="action_history">
+ <field name="name">History</field>
+ <field name="res_model">im.message</field>
+ <field name="view_mode">list</field>
+ <field name="domain">["|", ('to_id.user', '=', None), ('from_id.user', '=', None)]</field>
+ </record>
+ <menuitem name="History" parent="im_livechat" id="history" action="action_history" groups="group_im_livechat_manager"/>
+
+ <record id="im_message_form" model="ir.ui.view">
+ <field name="name">im.message.tree</field>
+ <field name="model">im.message</field>
+ <field name="arch" type="xml">
+ <tree string="History">
+ <field name="date"/>
+ <field name="support_member_id"/>
+ <field name="customer_id"/>
+ <field name="direction"/>
+ <field name="message"/>
+ </tree>
+ </field>
+ </record>
+
+ </data>
+</openerp>
diff --git a/addons/im_livechat/include.html b/addons/im_livechat/include.html
new file mode 100644
index 00000000000..55de6212361
--- /dev/null
+++ b/addons/im_livechat/include.html
@@ -0,0 +1,2 @@
+<script type="text/javascript" src="{{url}}/im_livechat/static/ext/static/js/require.js"></script>
+<script type="text/javascript" src='{{url}}/im_livechat/loader?p={{parameters | json | escape}}'></script> \ No newline at end of file
diff --git a/addons/im_livechat/loader.js b/addons/im_livechat/loader.js
new file mode 100644
index 00000000000..669591b410f
--- /dev/null
+++ b/addons/im_livechat/loader.js
@@ -0,0 +1,24 @@
+
+require.config({
+ context: "oelivesupport",
+ baseUrl: {{url | json}} + "/im_livechat/static/ext/static/js",
+ shim: {
+ underscore: {
+ init: function() {
+ return _.noConflict();
+ },
+ },
+ "jquery.achtung": {
+ deps: ['jquery'],
+ },
+ },
+})(["livesupport", "jquery"], function(livesupport, jQuery) {
+ jQuery.noConflict();
+ livesupport.main({{url | json}}, {{db | json}}, "anonymous", "anonymous", {{channel | json}}, {
+ buttonText: {{buttonText | json}},
+ inputPlaceholder: {{inputPlaceholder | json}},
+ defaultMessage: {{(defaultMessage or None) | json}},
+ auto: window.oe_im_livechat_auto || false,
+ userName: {{userName | json}} || undefined,
+ });
+});
diff --git a/addons/im_livechat/security/im_livechat_security.xml b/addons/im_livechat/security/im_livechat_security.xml
new file mode 100644
index 00000000000..5ad020a8a78
--- /dev/null
+++ b/addons/im_livechat/security/im_livechat_security.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<openerp>
+ <data>
+
+ <record id="module_category_im_livechat" model="ir.module.category">
+ <field name="name">Live Support</field>
+ <field name="sequence" eval="20" />
+ </record>
+
+ <record id="group_im_livechat" model="res.groups">
+ <field name="name">User</field>
+ <field name="category_id" ref="module_category_im_livechat"/>
+ <field name="comment">The user will be able to join support channels.</field>
+ </record>
+
+ <record id="group_im_livechat_manager" model="res.groups">
+ <field name="name">Manager</field>
+ <field name="comment">The user will be able to delete support channels.</field>
+ <field name="category_id" ref="module_category_im_livechat"/>
+ <field name="implied_ids" eval="[(4, ref('im_livechat.group_im_livechat'))]"/>
+ <field name="users" eval="[(4, ref('base.user_root'))]"/>
+ </record>
+
+ <record id="message_rule_1" model="ir.rule">
+ <field name="name">Live Support Managers can read messages from live support</field>
+ <field name="model_id" ref="im.model_im_message"/>
+ <field name="groups" eval="[(6,0,[ref('im_livechat.group_im_livechat_manager')])]"/>
+ <field name="domain_force">["|", ('to_id.user', '=', None), ('from_id.user', '=', None)]</field>
+ <field name="perm_unlink" eval="0"/>
+ <field name="perm_write" eval="0"/>
+ <field name="perm_read" eval="1"/>
+ <field name="perm_create" eval="0"/>
+ </record>
+
+ </data>
+</openerp>
diff --git a/addons/im_livechat/security/ir.model.access.csv b/addons/im_livechat/security/ir.model.access.csv
new file mode 100644
index 00000000000..6e17c1a127f
--- /dev/null
+++ b/addons/im_livechat/security/ir.model.access.csv
@@ -0,0 +1,6 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_ls_chann1,im_livechat.channel,model_im_livechat_channel,,1,0,0,0
+access_ls_chann2,im_livechat.channel,model_im_livechat_channel,group_im_livechat,1,1,1,0
+access_ls_chann3,im_livechat.channel,model_im_livechat_channel,group_im_livechat_manager,1,1,1,1
+access_ls_message,im_livechat.im.message,im.model_im_message,portal.group_anonymous,0,0,0,0
+access_im_user,im_livechat.im.user,im.model_im_user,portal.group_anonymous,1,0,0,0 \ No newline at end of file
diff --git a/addons/im_livechat/static/ext/Makefile b/addons/im_livechat/static/ext/Makefile
new file mode 100644
index 00000000000..b73ca4f2b89
--- /dev/null
+++ b/addons/im_livechat/static/ext/Makefile
@@ -0,0 +1,3 @@
+
+static/js/livesupport_templates.js: static/js/livesupport_templates.html
+ python static/js/to_jsonp.py static/js/livesupport_templates.html oe_livesupport_templates_callback > static/js/livesupport_templates.js \ No newline at end of file
diff --git a/addons/im_livechat/static/ext/static/audio/Ting.mp3 b/addons/im_livechat/static/ext/static/audio/Ting.mp3
new file mode 100644
index 00000000000..6fd090a89ce
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/audio/Ting.mp3
Binary files differ
diff --git a/addons/im_livechat/static/ext/static/audio/Ting.ogg b/addons/im_livechat/static/ext/static/audio/Ting.ogg
new file mode 100644
index 00000000000..8d17ea85bd3
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/audio/Ting.ogg
Binary files differ
diff --git a/addons/im_livechat/static/ext/static/css/livesupport.css b/addons/im_livechat/static/ext/static/css/livesupport.css
new file mode 100644
index 00000000000..bfe26b5e838
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/css/livesupport.css
@@ -0,0 +1,190 @@
+
+
+
+.openerp_style { /* base style of openerp */
+ font-family: "Lucida Grande", Helvetica, Verdana, Arial, sans-serif;
+ color: #4c4c4c;
+ font-size: 13px;
+ background: white;
+ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+}
+
+/* button */
+
+.oe_chat_button {
+ position: fixed;
+ bottom: 0px;
+ right: 6px;
+ display: inline-block;
+ min-width: 100px;
+ background-color: rgba(60, 60, 60, 0.6);
+ font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif;
+ font-size: 14px;
+ font-weight: bold;
+ padding: 10px;
+ color: white;
+ text-shadow: rgb(59, 76, 88) 1px 1px 0px;
+ border: 1px solid rgb(80, 80, 80);
+ border-bottom: 0px;
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+ cursor: pointer;
+}
+
+/* conversations */
+
+.oe_im_chatview {
+ position: fixed;
+ overflow: hidden;
+ bottom: 42px;
+ margin-right: 6px;
+ background: rgba(60, 60, 60, 0.8);
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ -moz-box-shadow: 0 0 3px rgba(0,0,0,0.3), 0 2px 4px rgba(0,0,0,0.3);
+ -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 0 3px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3);
+ width: 240px;
+}
+.oe_im_chatview .oe_im_chatview_disconnected {
+ display:none;
+ z-index: 100;
+ width: 100%;
+ background: #E8EBEF;
+ padding: 5px;
+ font-size: 11px;
+ color: #999;
+ line-height: 14px;
+ height: 28px;
+ overflow: hidden;
+}
+.oe_im_chatview.oe_im_chatview_disconnected_status .oe_im_chatview_disconnected {
+ display: block;
+}
+.oe_im_chatview .oe_im_chatview_header {
+ padding: 3px 6px 2px;
+ background: #DEDEDE;
+ background: -moz-linear-gradient(#FCFCFC, #DEDEDE);
+ background: -webkit-gradient(linear, left top, left bottom, from(#FCFCFC), to(#DEDEDE));
+ -moz-border-radius: 3px 3px 0 0;
+ -webkit-border-radius: 3px 3px 0 0;
+ border-radius: 3px 3px 0 0;
+ border-bottom: 1px solid #AEB9BD;
+ cursor: pointer;
+}
+.oe_im_chatview .oe_im_chatview_close {
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+ font-size: 18px;
+ line-height: 16px;
+ float: right;
+ font-weight: bold;
+ color: black;
+ text-shadow: 0 1px 0 white;
+ opacity: 0.2;
+}
+.oe_im_chatview .oe_im_chatview_content {
+ overflow: auto;
+ height: 287px;
+ width: 240px;
+}
+.oe_im_chatview.oe_im_chatview_disconnected_status .oe_im_chatview_content {
+ height: 249px;
+}
+.oe_im_chatview .oe_im_chatview_footer {
+ position: relative;
+ padding: 3px;
+ border-top: 1px solid #AEB9BD;
+ background: #DEDEDE;
+ background: -moz-linear-gradient(#FCFCFC, #DEDEDE);
+ background: -webkit-gradient(linear, left top, left bottom, from(#FCFCFC), to(#DEDEDE));
+ -moz-border-radius: 0 0 3px 3px;
+ -webkit-border-radius: 0 0 3px 3px;
+ border-radius: 0 0 3px 3px;
+}
+.oe_im_chatview .oe_im_chatview_input {
+ width: 222px;
+ font-family: Lato, Helvetica, sans-serif;
+ font-size: 13px;
+ color: #333;
+ padding: 1px 5px;
+ border: 1px solid #AEB9BD;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ -moz-box-shadow: inset 0 1px 4px rgba(0,0,0,0.2);
+ -webkit-box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.2);
+ box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.2);
+}
+.oe_im_chatview .oe_im_chatview_bubble {
+ background: white;
+ position: relative;
+ padding: 3px;
+ margin: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+}
+.oe_im_chatview .oe_im_chatview_clip {
+ position: relative;
+ float: left;
+ width: 26px;
+ height: 26px;
+ margin-right: 4px;
+ -moz-box-shadow: 0 0 2px 1px rgba(0,0,0,0.25);
+ -webkit-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.25);
+ box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.25);
+}
+.oe_im_chatview .oe_im_chatview_avatar {
+ float: left;
+ width: 26px;
+ height: auto;
+ clip: rect(0, 26px, 26px, 0);
+ max-width: 100%;
+ width: auto 9;
+ height: auto;
+ vertical-align: middle;
+ border: 0;
+ -ms-interpolation-mode: bicubic;
+}
+.oe_im_chatview .oe_im_chatview_time {
+ position: absolute;
+ right: 0px;
+ top: 0px;
+ margin: 3px;
+ text-align: right;
+ line-height: 13px;
+ font-size: 11px;
+ color: #999;
+ width: 60px;
+ overflow: hidden;
+}
+.oe_im_chatview .oe_im_chatview_from {
+ margin: 0 0 2px 0;
+ line-height: 14px;
+ font-weight: bold;
+ font-size: 12px;
+ width: 140px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ color: #3A87AD;
+}
+.oe_im_chatview .oe_im_chatview_bubble_list {
+}
+.oe_im_chatview .oe_im_chatview_bubble_item {
+ margin: 0 0 2px 30px;
+ line-height: 14px;
+ word-wrap: break-word;
+}
+
+.oe_im_chatview_online {
+ display: none;
+ margin-top: -4px;
+ width: 11px;
+ height: 11px;
+}
diff --git a/addons/im_livechat/static/ext/static/img/avatar/avatar.jpeg b/addons/im_livechat/static/ext/static/img/avatar/avatar.jpeg
new file mode 100644
index 00000000000..7168794022e
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/img/avatar/avatar.jpeg
Binary files differ
diff --git a/addons/im_livechat/static/ext/static/img/button-gloss.png b/addons/im_livechat/static/ext/static/img/button-gloss.png
new file mode 100755
index 00000000000..6f3957702fe
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/img/button-gloss.png
Binary files differ
diff --git a/addons/im_livechat/static/ext/static/img/glyphicons-halflings-white.png b/addons/im_livechat/static/ext/static/img/glyphicons-halflings-white.png
new file mode 100755
index 00000000000..3bf6484a29d
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/img/glyphicons-halflings-white.png
Binary files differ
diff --git a/addons/im_livechat/static/ext/static/img/glyphicons-halflings.png b/addons/im_livechat/static/ext/static/img/glyphicons-halflings.png
new file mode 100755
index 00000000000..a9969993201
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/img/glyphicons-halflings.png
Binary files differ
diff --git a/addons/im_livechat/static/ext/static/img/green.png b/addons/im_livechat/static/ext/static/img/green.png
new file mode 100644
index 00000000000..01fb373c251
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/img/green.png
Binary files differ
diff --git a/addons/im_livechat/static/ext/static/img/logo.png b/addons/im_livechat/static/ext/static/img/logo.png
new file mode 100644
index 00000000000..aca5f4c60d8
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/img/logo.png
Binary files differ
diff --git a/addons/im_livechat/static/ext/static/img/wood.png b/addons/im_livechat/static/ext/static/img/wood.png
new file mode 100644
index 00000000000..22f2450d3ad
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/img/wood.png
Binary files differ
diff --git a/addons/im_livechat/static/ext/static/js/jquery.achtung.css b/addons/im_livechat/static/ext/static/js/jquery.achtung.css
new file mode 100644
index 00000000000..820ae3e9194
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/js/jquery.achtung.css
@@ -0,0 +1,306 @@
+/**
+ * achtung 0.3.0
+ *
+ * Growl-like notifications for jQuery
+ *
+ * Copyright (c) 2009 Josh Varner <josh@voxwerk.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * Portions of this file are from the jQuery UI CSS framework.
+ *
+ * @license http://www.opensource.org/licenses/mit-license.php
+ * @author Josh Varner <josh@voxwerk.com>
+ */
+
+/* IE 6 doesn't support position: fixed */
+* html #achtung-overlay {
+ position:absolute;
+}
+
+/* IE6 includes padding in width */
+* html .achtung {
+ width: 280px;
+}
+
+#achtung-overlay {
+ overflow: hidden;
+ position: fixed;
+ top: 15px;
+ right: 15px;
+ width: 280px;
+ z-index:50;
+}
+
+.achtung {
+ display:none;
+ margin-bottom: 8px;
+ padding: 15px 15px;
+ background-color: #000;
+ color: white;
+ width: 250px;
+ font-weight: bold;
+ position:relative;
+ overflow: hidden;
+ -moz-box-shadow: #aaa 1px 1px 2px;
+ -webkit-box-shadow: #aaa 1px 1px 2px;
+ box-shadow: #aaa 1px 1px 2px;
+ -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px;
+ /* Note that if using show/hide animations, IE will lose
+ this setting */
+ opacity: .85;
+ filter:Alpha(Opacity=85);
+}
+
+/**
+ * This section from jQuery UI CSS framework
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Can (and should) be removed if you are already loading the jQuery UI CSS
+ * to reduce payload size.
+ */
+.ui-icon { display: block; overflow: hidden; background-repeat: no-repeat; }
+.ui-icon { width: 16px; height: 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+.achtung .achtung-message-icon {
+ margin-top: 0px;
+ margin-left: -.5em;
+ margin-right: .5em;
+ float: left;
+ zoom: 1;
+}
+
+.achtung .ui-icon.achtung-close-button {
+ float: right;
+ margin-right: -8px;
+ margin-top: -12px;
+ cursor: pointer;
+ color: white;
+ text-align: right;
+}
+
+.achtung .ui-icon.achtung-close-button:after {
+ content: "x"
+}
+
+/* Slightly darker for these colors (readability) */
+.achtungSuccess, .achtungFail, .achtungWait {
+ /* Note that if using show/hide animations, IE will lose
+ this setting */
+ opacity: .93; filter:Alpha(Opacity=93);
+}
+
+.achtungSuccess {
+ background-color: #4DB559;
+}
+
+.achtungFail {
+ background-color: #D64450;
+}
+
+.achtungWait {
+ background-color: #658093;
+}
+
+.achtungSuccess .ui-icon.achtung-close-button,
+.achtungFail .ui-icon.achtung-close-button {
+}
+
+.achtungSuccess .ui-icon.achtung-close-button-hover,
+.achtungFail .ui-icon.achtung-close-button-hover {
+}
+
+.achtung .wait-icon {
+}
+
+.achtung .achtung-message {
+ display: inline;
+}
diff --git a/addons/im_livechat/static/ext/static/js/jquery.achtung.js b/addons/im_livechat/static/ext/static/js/jquery.achtung.js
new file mode 100644
index 00000000000..1aa69469c1d
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/js/jquery.achtung.js
@@ -0,0 +1,273 @@
+/**
+ * achtung 0.3.0
+ *
+ * Growl-like notifications for jQuery
+ *
+ * Copyright (c) 2009 Josh Varner <josh@voxwerk.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @license http://www.opensource.org/licenses/mit-license.php
+ * @author Josh Varner <josh@voxwerk.com>
+ */
+
+/*globals jQuery,clearTimeout,document,navigator,setTimeout
+*/
+(function($) {
+
+/**
+ * This is based on the jQuery UI $.widget code. I would have just made this
+ * a $.widget but I didn't want the jQuery UI dependency.
+ */
+$.fn.achtung = function(options)
+{
+ var isMethodCall = (typeof options === 'string'),
+ args = Array.prototype.slice.call(arguments, 0),
+ name = 'achtung';
+
+ // handle initialization and non-getter methods
+ return this.each(function() {
+ var instance = $.data(this, name);
+
+ // prevent calls to internal methods
+ if (isMethodCall && options.substring(0, 1) === '_') {
+ return this;
+ }
+
+ // constructor
+ (!instance && !isMethodCall &&
+ $.data(this, name, new $.achtung(this))._init(args));
+
+ // method call
+ (instance && isMethodCall && $.isFunction(instance[options]) &&
+ instance[options].apply(instance, args.slice(1)));
+ });
+};
+
+$.achtung = function(element)
+{
+ var args = Array.prototype.slice.call(arguments, 0), $el;
+
+ if (!element || !element.nodeType) {
+ $el = $('<div />');
+ return $el.achtung.apply($el, args);
+ }
+
+ this.$container = $(element);
+};
+
+
+/**
+ * Static members
+ **/
+$.extend($.achtung, {
+ version: '0.3.0',
+ $overlay: false,
+ defaults: {
+ timeout: 10,
+ disableClose: false,
+ icon: false,
+ className: '',
+ animateClassSwitch: false,
+ showEffects: {'opacity':'toggle','height':'toggle'},
+ hideEffects: {'opacity':'toggle','height':'toggle'},
+ showEffectDuration: 500,
+ hideEffectDuration: 700
+ }
+});
+
+/**
+ * Non-static members
+ **/
+$.extend($.achtung.prototype, {
+ $container: false,
+ closeTimer: false,
+ options: {},
+
+ _init: function(args)
+ {
+ var o, self = this;
+
+ args = $.isArray(args) ? args : [];
+
+
+ args.unshift($.achtung.defaults);
+ args.unshift({});
+
+ o = this.options = $.extend.apply($, args);
+
+ if (!$.achtung.$overlay) {
+ $.achtung.$overlay = $('<div id="achtung-overlay"></div>').appendTo(document.body);
+ }
+
+ if (!o.disableClose) {
+ $('<span class="achtung-close-button ui-icon ui-icon-close" />')
+ .click(function () { self.close(); })
+ .hover(function () { $(this).addClass('achtung-close-button-hover'); },
+ function () { $(this).removeClass('achtung-close-button-hover'); })
+ .prependTo(this.$container);
+ }
+
+ this.changeIcon(o.icon, true);
+
+ if (o.message) {
+ this.$container.append($('<span class="achtung-message">' + o.message + '</span>'));
+ }
+
+ (o.className && this.$container.addClass(o.className));
+ (o.css && this.$container.css(o.css));
+
+ this.$container
+ .addClass('achtung')
+ .appendTo($.achtung.$overlay);
+
+ if (o.showEffects) {
+ this.$container.toggle();
+ } else {
+ this.$container.show();
+ }
+
+ if (o.timeout > 0) {
+ this.timeout(o.timeout);
+ }
+ },
+
+ timeout: function(timeout)
+ {
+ var self = this;
+
+ if (this.closeTimer) {
+ clearTimeout(this.closeTimer);
+ }
+
+ this.closeTimer = setTimeout(function() { self.close(); }, timeout * 1000);
+ this.options.timeout = timeout;
+ },
+
+ /**
+ * Change the CSS class associated with this message, using
+ * a transition if available (not availble in Safari/Webkit).
+ * If no transition is available, the switch is immediate.
+ *
+ * #LATER Check if this has been corrected in Webkit or jQuery UI
+ * #TODO Make transition time configurable
+ * @param newClass string Name of new class to associate
+ */
+ changeClass: function(newClass)
+ {
+ var self = this;
+
+ if (this.options.className === newClass) {
+ return;
+ }
+
+ this.$container.queue(function() {
+ if (!self.options.animateClassSwitch ||
+ /webkit/.test(navigator.userAgent.toLowerCase()) ||
+ !$.isFunction($.fn.switchClass)) {
+ self.$container.removeClass(self.options.className);
+ self.$container.addClass(newClass);
+ } else {
+ self.$container.switchClass(self.options.className, newClass, 500);
+ }
+
+ self.options.className = newClass;
+ self.$container.dequeue();
+ });
+ },
+
+ changeIcon: function(newIcon, force)
+ {
+ var self = this;
+
+ if ((force !== true || newIcon === false) && this.options.icon === newIcon) {
+ return;
+ }
+
+ if (force || this.options.icon === false) {
+ this.$container.prepend($('<span class="achtung-message-icon ui-icon ' + newIcon + '" />'));
+ this.options.icon = newIcon;
+ return;
+ } else if (newIcon === false) {
+ this.$container.find('.achtung-message-icon').remove();
+ this.options.icon = false;
+ return;
+ }
+
+ this.$container.queue(function() {
+ var $span = $('.achtung-message-icon', self.$container);
+
+ if (!self.options.animateClassSwitch ||
+ /webkit/.test(navigator.userAgent.toLowerCase()) ||
+ !$.isFunction($.fn.switchClass)) {
+ $span.removeClass(self.options.icon);
+ $span.addClass(newIcon);
+ } else {
+ $span.switchClass(self.options.icon, newIcon, 500);
+ }
+
+ self.options.icon = newIcon;
+ self.$container.dequeue();
+ });
+ },
+
+
+ changeMessage: function(newMessage)
+ {
+ this.$container.queue(function() {
+ $('.achtung-message', $(this)).html(newMessage);
+ $(this).dequeue();
+ });
+ },
+
+
+ update: function(options)
+ {
+ (options.className && this.changeClass(options.className));
+ (options.css && this.$container.css(options.css));
+ (typeof(options.icon) !== 'undefined' && this.changeIcon(options.icon));
+ (options.message && this.changeMessage(options.message));
+ (options.timeout && this.timeout(options.timeout));
+ },
+
+ close: function()
+ {
+ var o = this.options, $container = this.$container;
+
+ if (o.hideEffects) {
+ this.$container.animate(o.hideEffects, o.hideEffectDuration);
+ } else {
+ this.$container.hide();
+ }
+
+ $container.queue(function() {
+ $container.removeData('achtung');
+ $container.remove();
+
+ if ($.achtung.$overlay && $.achtung.$overlay.is(':empty')) {
+ $.achtung.$overlay.remove();
+ $.achtung.$overlay = false;
+ }
+
+ $container.dequeue();
+ });
+ }
+});
+
+})(jQuery); \ No newline at end of file
diff --git a/addons/im_livechat/static/ext/static/js/jquery.js b/addons/im_livechat/static/ext/static/js/jquery.js
new file mode 100644
index 00000000000..ded03845983
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/js/jquery.js
@@ -0,0 +1,9555 @@
+/*!
+ * jQuery JavaScript Library v1.9.0
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-1-14
+ */
+(function( window, undefined ) {
+"use strict";
+var
+ // A central reference to the root jQuery(document)
+ rootjQuery,
+
+ // The deferred used on DOM ready
+ readyList,
+
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+ location = window.location,
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$,
+
+ // [[Class]] -> type pairs
+ class2type = {},
+
+ // List of deleted data cache ids, so we can reuse them
+ core_deletedIds = [],
+
+ core_version = "1.9.0",
+
+ // Save a reference to some core methods
+ core_concat = core_deletedIds.concat,
+ core_push = core_deletedIds.push,
+ core_slice = core_deletedIds.slice,
+ core_indexOf = core_deletedIds.indexOf,
+ core_toString = class2type.toString,
+ core_hasOwn = class2type.hasOwnProperty,
+ core_trim = core_version.trim,
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init( selector, context, rootjQuery );
+ },
+
+ // Used for matching numbers
+ core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+
+ // Used for splitting on whitespace
+ core_rnotwhite = /\S+/g,
+
+ // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ // Match a standalone tag
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+ // JSON RegExp
+ rvalidchars = /^[\],:{}\s]*$/,
+ rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+ rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+ rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ },
+
+ // The ready event handler and self cleanup method
+ DOMContentLoaded = function() {
+ if ( document.addEventListener ) {
+ document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+ jQuery.ready();
+ } else if ( document.readyState === "complete" ) {
+ // we're here because readyState === "complete" in oldIE
+ // which is good enough for us to call the dom ready!
+ document.detachEvent( "onreadystatechange", DOMContentLoaded );
+ jQuery.ready();
+ }
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: core_version,
+
+ constructor: jQuery,
+ init: function( selector, context, rootjQuery ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // scripts is true for back-compat
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( elem.id !== match[2] ) {
+ return rootjQuery.find( selector );
+ }
+
+ // Otherwise, we inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return rootjQuery.ready( selector );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ },
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ // The number of elements contained in the matched element set
+ size: function() {
+ return this.length;
+ },
+
+ toArray: function() {
+ return core_slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num == null ?
+
+ // Return a 'clean' array
+ this.toArray() :
+
+ // Return just the object
+ ( num < 0 ? this[ this.length + num ] : this[ num ] );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ ready: function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+ },
+
+ slice: function() {
+ return this.pushStack( core_slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: core_push,
+ sort: [].sort,
+ splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+ target = arguments[1] || {};
+ // skip the boolean and the target
+ i = 2;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( length === i ) {
+ target = this;
+ --i;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ noConflict: function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+ },
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( !document.body ) {
+ return setTimeout( jQuery.ready );
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.trigger ) {
+ jQuery( document ).trigger("ready").off("ready");
+ }
+ },
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray || function( obj ) {
+ return jQuery.type(obj) === "array";
+ },
+
+ isWindow: function( obj ) {
+ return obj != null && obj == obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ return !isNaN( parseFloat(obj) ) && isFinite( obj );
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return String( obj );
+ }
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ core_toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ isPlainObject: function( obj ) {
+ // Must be an Object.
+ // Because of IE, we also have to check the presence of the constructor property.
+ // Make sure that DOM nodes and window objects don't pass through, as well
+ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ try {
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !core_hasOwn.call(obj, "constructor") &&
+ !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+ return false;
+ }
+ } catch ( e ) {
+ // IE8,9 Will throw exceptions on certain host objects #9897
+ return false;
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own.
+
+ var key;
+ for ( key in obj ) {}
+
+ return key === undefined || core_hasOwn.call( obj, key );
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ // data: string of html
+ // context (optional): If specified, the fragment will be created in this context, defaults to document
+ // keepScripts (optional): If true, will include scripts passed in the html string
+ parseHTML: function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+ if ( scripts ) {
+ jQuery( scripts ).remove();
+ }
+ return jQuery.merge( [], parsed.childNodes );
+ },
+
+ parseJSON: function( data ) {
+ // Attempt to parse using the native JSON parser first
+ if ( window.JSON && window.JSON.parse ) {
+ return window.JSON.parse( data );
+ }
+
+ if ( data === null ) {
+ return data;
+ }
+
+ if ( typeof data === "string" ) {
+
+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
+ data = jQuery.trim( data );
+
+ if ( data ) {
+ // Make sure the incoming data is actual JSON
+ // Logic borrowed from http://json.org/json2.js
+ if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+ .replace( rvalidtokens, "]" )
+ .replace( rvalidbraces, "")) ) {
+
+ return ( new Function( "return " + data ) )();
+ }
+ }
+ }
+
+ jQuery.error( "Invalid JSON: " + data );
+ },
+
+ // Cross-browser xml parsing
+ parseXML: function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ try {
+ if ( window.DOMParser ) { // Standard
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data , "text/xml" );
+ } else { // IE
+ xml = new ActiveXObject( "Microsoft.XMLDOM" );
+ xml.async = "false";
+ xml.loadXML( data );
+ }
+ } catch( e ) {
+ xml = undefined;
+ }
+ if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+ },
+
+ noop: function() {},
+
+ // Evaluates a script in a global context
+ // Workarounds based on findings by Jim Driscoll
+ // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+ globalEval: function( data ) {
+ if ( data && jQuery.trim( data ) ) {
+ // We use execScript on Internet Explorer
+ // We use an anonymous function so that context is window
+ // rather than jQuery in Firefox
+ ( window.execScript || function( data ) {
+ window[ "eval" ].call( window, data );
+ } )( data );
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Use native String.trim function wherever possible
+ trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+ function( text ) {
+ return text == null ?
+ "" :
+ core_trim.call( text );
+ } :
+
+ // Otherwise use our own trimming functionality
+ function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ core_push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ var len;
+
+ if ( arr ) {
+ if ( core_indexOf ) {
+ return core_indexOf.call( arr, elem, i );
+ }
+
+ len = arr.length;
+ i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+ for ( ; i < len; i++ ) {
+ // Skip accessing in sparse arrays
+ if ( i in arr && arr[ i ] === elem ) {
+ return i;
+ }
+ }
+ }
+
+ return -1;
+ },
+
+ merge: function( first, second ) {
+ var l = second.length,
+ i = first.length,
+ j = 0;
+
+ if ( typeof l === "number" ) {
+ for ( ; j < l; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+ } else {
+ while ( second[j] !== undefined ) {
+ first[ i++ ] = second[ j++ ];
+ }
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, inv ) {
+ var retVal,
+ ret = [],
+ i = 0,
+ length = elems.length;
+ inv = !!inv;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ retVal = !!callback( elems[ i ], i );
+ if ( inv !== retVal ) {
+ ret.push( elems[ i ] );
+ }
+ }
+
+ return ret;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return core_concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = core_slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ // Multifunctional method to get and set values of a collection
+ // The value/s can optionally be executed if it's a function
+ access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ length = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < length; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ length ? fn( elems[0], key ) : emptyGet;
+ },
+
+ now: function() {
+ return ( new Date() ).getTime();
+ }
+});
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ // Standards-based browsers support DOMContentLoaded
+ } else if ( document.addEventListener ) {
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", jQuery.ready, false );
+
+ // If IE event model is used
+ } else {
+ // Ensure firing before onload, maybe late but safe also for iframes
+ document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+ // A fallback to window.onload, that will always work
+ window.attachEvent( "onload", jQuery.ready );
+
+ // If IE and not a frame
+ // continually check to see if the document is ready
+ var top = false;
+
+ try {
+ top = window.frameElement == null && document.documentElement;
+ } catch(e) {}
+
+ if ( top && top.doScroll ) {
+ (function doScrollCheck() {
+ if ( !jQuery.isReady ) {
+
+ try {
+ // Use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ top.doScroll("left");
+ } catch(e) {
+ return setTimeout( doScrollCheck, 50 );
+ }
+
+ // and execute any waiting functions
+ jQuery.ready();
+ }
+ })();
+ }
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+ var length = obj.length,
+ type = jQuery.type( obj );
+
+ if ( jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || type !== "function" &&
+ ( length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Control if a given callback is in the list
+ has: function( fn ) {
+ return jQuery.inArray( fn, list ) > -1;
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( list && ( !fired || stack ) ) {
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var action = tuple[ 0 ],
+ fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = core_slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+ if( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // if we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+jQuery.support = (function() {
+
+ var support, all, a, select, opt, input, fragment, eventName, isSupported, i,
+ div = document.createElement("div");
+
+ // Setup
+ div.setAttribute( "className", "t" );
+ div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+ // Support tests won't run in some limited or non-browser environments
+ all = div.getElementsByTagName("*");
+ a = div.getElementsByTagName("a")[ 0 ];
+ if ( !all || !a || !all.length ) {
+ return {};
+ }
+
+ // First batch of tests
+ select = document.createElement("select");
+ opt = select.appendChild( document.createElement("option") );
+ input = div.getElementsByTagName("input")[ 0 ];
+
+ a.style.cssText = "top:1px;float:left;opacity:.5";
+ support = {
+ // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+ getSetAttribute: div.className !== "t",
+
+ // IE strips leading whitespace when .innerHTML is used
+ leadingWhitespace: div.firstChild.nodeType === 3,
+
+ // Make sure that tbody elements aren't automatically inserted
+ // IE will insert them into empty tables
+ tbody: !div.getElementsByTagName("tbody").length,
+
+ // Make sure that link elements get serialized correctly by innerHTML
+ // This requires a wrapper element in IE
+ htmlSerialize: !!div.getElementsByTagName("link").length,
+
+ // Get the style information from getAttribute
+ // (IE uses .cssText instead)
+ style: /top/.test( a.getAttribute("style") ),
+
+ // Make sure that URLs aren't manipulated
+ // (IE normalizes it by default)
+ hrefNormalized: a.getAttribute("href") === "/a",
+
+ // Make sure that element opacity exists
+ // (IE uses filter instead)
+ // Use a regex to work around a WebKit issue. See #5145
+ opacity: /^0.5/.test( a.style.opacity ),
+
+ // Verify style float existence
+ // (IE uses styleFloat instead of cssFloat)
+ cssFloat: !!a.style.cssFloat,
+
+ // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+ checkOn: !!input.value,
+
+ // Make sure that a selected-by-default option has a working selected property.
+ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+ optSelected: opt.selected,
+
+ // Tests for enctype support on a form (#6743)
+ enctype: !!document.createElement("form").enctype,
+
+ // Makes sure cloning an html5 element does not cause problems
+ // Where outerHTML is undefined, this still works
+ html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+ // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+ boxModel: document.compatMode === "CSS1Compat",
+
+ // Will be defined later
+ deleteExpando: true,
+ noCloneEvent: true,
+ inlineBlockNeedsLayout: false,
+ shrinkWrapBlocks: false,
+ reliableMarginRight: true,
+ boxSizingReliable: true,
+ pixelPosition: false
+ };
+
+ // Make sure checked status is properly cloned
+ input.checked = true;
+ support.noCloneChecked = input.cloneNode( true ).checked;
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as disabled)
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Support: IE<9
+ try {
+ delete div.test;
+ } catch( e ) {
+ support.deleteExpando = false;
+ }
+
+ // Check if we can trust getAttribute("value")
+ input = document.createElement("input");
+ input.setAttribute( "value", "" );
+ support.input = input.getAttribute( "value" ) === "";
+
+ // Check if an input maintains its value after becoming a radio
+ input.value = "t";
+ input.setAttribute( "type", "radio" );
+ support.radioValue = input.value === "t";
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ input.setAttribute( "checked", "t" );
+ input.setAttribute( "name", "t" );
+
+ fragment = document.createDocumentFragment();
+ fragment.appendChild( input );
+
+ // Check if a disconnected checkbox will retain its checked
+ // value of true after appended to the DOM (IE6/7)
+ support.appendChecked = input.checked;
+
+ // WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE<9
+ // Opera does not clone events (and typeof div.attachEvent === undefined).
+ // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+ if ( div.attachEvent ) {
+ div.attachEvent( "onclick", function() {
+ support.noCloneEvent = false;
+ });
+
+ div.cloneNode( true ).click();
+ }
+
+ // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
+ // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
+ for ( i in { submit: true, change: true, focusin: true }) {
+ div.setAttribute( eventName = "on" + i, "t" );
+
+ support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
+ }
+
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ // Run tests that need a body at doc ready
+ jQuery(function() {
+ var container, marginDiv, tds,
+ divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
+ body = document.getElementsByTagName("body")[0];
+
+ if ( !body ) {
+ // Return for frameset docs that don't have a body
+ return;
+ }
+
+ container = document.createElement("div");
+ container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+
+ body.appendChild( container ).appendChild( div );
+
+ // Support: IE8
+ // Check if table cells still have offsetWidth/Height when they are set
+ // to display:none and there are still other visible table cells in a
+ // table row; if so, offsetWidth/Height are not reliable for use when
+ // determining if an element has been hidden directly using
+ // display:none (it is still safe to use offsets if a parent element is
+ // hidden; don safety goggles and see bug #4512 for more information).
+ div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+ tds = div.getElementsByTagName("td");
+ tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+ isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+ tds[ 0 ].style.display = "";
+ tds[ 1 ].style.display = "none";
+
+ // Support: IE8
+ // Check if empty table cells still have offsetWidth/Height
+ support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+ // Check box-sizing and margin behavior
+ div.innerHTML = "";
+ div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+ support.boxSizing = ( div.offsetWidth === 4 );
+ support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+ // Use window.getComputedStyle because jsdom on node.js will break without it.
+ if ( window.getComputedStyle ) {
+ support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+ support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // Fails in WebKit before Feb 2011 nightlies
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ marginDiv = div.appendChild( document.createElement("div") );
+ marginDiv.style.cssText = div.style.cssText = divReset;
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+
+ support.reliableMarginRight =
+ !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+ }
+
+ if ( typeof div.style.zoom !== "undefined" ) {
+ // Support: IE<8
+ // Check if natively block-level elements act like inline-block
+ // elements when setting their display to 'inline' and giving
+ // them layout
+ div.innerHTML = "";
+ div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+ support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+ // Support: IE6
+ // Check if elements with layout shrink-wrap their children
+ div.style.display = "block";
+ div.innerHTML = "<div></div>";
+ div.firstChild.style.width = "5px";
+ support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+ // Prevent IE 6 from affecting layout for positioned elements #11048
+ // Prevent IE from shrinking the body in IE 7 mode #12869
+ body.style.zoom = 1;
+ }
+
+ body.removeChild( container );
+
+ // Null elements to avoid leaks in IE
+ container = div = tds = marginDiv = null;
+ });
+
+ // Null elements to avoid leaks in IE
+ all = select = fragment = opt = a = input = null;
+
+ return support;
+})();
+
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ){
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ var thisCache, ret,
+ internalKey = jQuery.expando,
+ getByName = typeof name === "string",
+
+ // We have to handle DOM nodes and JS objects differently because IE6-7
+ // can't GC object references properly across the DOM-JS boundary
+ isNode = elem.nodeType,
+
+ // Only DOM nodes need the global jQuery cache; JS object data is
+ // attached directly to the object so GC can occur automatically
+ cache = isNode ? jQuery.cache : elem,
+
+ // Only defining an ID for JS objects if its cache already exists allows
+ // the code to shortcut on the same path as a DOM node with no cache
+ id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+ // Avoid doing any more work than we need to when trying to get data on an
+ // object that has no data at all
+ if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
+ return;
+ }
+
+ if ( !id ) {
+ // Only DOM nodes need a new unique ID for each element since their data
+ // ends up in the global cache
+ if ( isNode ) {
+ elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
+ } else {
+ id = internalKey;
+ }
+ }
+
+ if ( !cache[ id ] ) {
+ cache[ id ] = {};
+
+ // Avoids exposing jQuery metadata on plain JS objects when the object
+ // is serialized using JSON.stringify
+ if ( !isNode ) {
+ cache[ id ].toJSON = jQuery.noop;
+ }
+ }
+
+ // An object can be passed to jQuery.data instead of a key/value pair; this gets
+ // shallow copied over onto the existing cache
+ if ( typeof name === "object" || typeof name === "function" ) {
+ if ( pvt ) {
+ cache[ id ] = jQuery.extend( cache[ id ], name );
+ } else {
+ cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+ }
+ }
+
+ thisCache = cache[ id ];
+
+ // jQuery data() is stored in a separate object inside the object's internal data
+ // cache in order to avoid key collisions between internal data and user-defined
+ // data.
+ if ( !pvt ) {
+ if ( !thisCache.data ) {
+ thisCache.data = {};
+ }
+
+ thisCache = thisCache.data;
+ }
+
+ if ( data !== undefined ) {
+ thisCache[ jQuery.camelCase( name ) ] = data;
+ }
+
+ // Check for both converted-to-camel and non-converted data property names
+ // If a data property was specified
+ if ( getByName ) {
+
+ // First Try to find as-is property data
+ ret = thisCache[ name ];
+
+ // Test for null|undefined property data
+ if ( ret == null ) {
+
+ // Try to find the camelCased property
+ ret = thisCache[ jQuery.camelCase( name ) ];
+ }
+ } else {
+ ret = thisCache;
+ }
+
+ return ret;
+}
+
+function internalRemoveData( elem, name, pvt /* For internal use only */ ){
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ var thisCache, i, l,
+
+ isNode = elem.nodeType,
+
+ // See jQuery.data for more information
+ cache = isNode ? jQuery.cache : elem,
+ id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+ // If there is already no cache entry for this object, there is no
+ // purpose in continuing
+ if ( !cache[ id ] ) {
+ return;
+ }
+
+ if ( name ) {
+
+ thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+ if ( thisCache ) {
+
+ // Support array or space separated string names for data keys
+ if ( !jQuery.isArray( name ) ) {
+
+ // try the string as a key before any manipulation
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+
+ // split the camel cased version by spaces unless a key with the spaces exists
+ name = jQuery.camelCase( name );
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+ name = name.split(" ");
+ }
+ }
+ } else {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+ }
+
+ for ( i = 0, l = name.length; i < l; i++ ) {
+ delete thisCache[ name[i] ];
+ }
+
+ // If there is no data left in the cache, we want to continue
+ // and let the cache object itself get destroyed
+ if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+ return;
+ }
+ }
+ }
+
+ // See jQuery.data for more information
+ if ( !pvt ) {
+ delete cache[ id ].data;
+
+ // Don't destroy the parent cache unless the internal data object
+ // had been the only thing left in it
+ if ( !isEmptyDataObject( cache[ id ] ) ) {
+ return;
+ }
+ }
+
+ // Destroy the cache
+ if ( isNode ) {
+ jQuery.cleanData( [ elem ], true );
+
+ // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+ } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+ delete cache[ id ];
+
+ // When all else fails, null
+ } else {
+ cache[ id ] = null;
+ }
+}
+
+jQuery.extend({
+ cache: {},
+
+ // Unique for each copy of jQuery on the page
+ // Non-digits removed to match rinlinejQuery
+ expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
+ // The following elements throw uncatchable exceptions if you
+ // attempt to add expando properties to them.
+ noData: {
+ "embed": true,
+ // Ban all objects except for Flash (which handle expandos)
+ "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+ "applet": true
+ },
+
+ hasData: function( elem ) {
+ elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+ return !!elem && !isEmptyDataObject( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return internalData( elem, name, data, false );
+ },
+
+ removeData: function( elem, name ) {
+ return internalRemoveData( elem, name, false );
+ },
+
+ // For internal use only.
+ _data: function( elem, name, data ) {
+ return internalData( elem, name, data, true );
+ },
+
+ _removeData: function( elem, name ) {
+ return internalRemoveData( elem, name, true );
+ },
+
+ // A method for determining if a DOM node can handle the data expando
+ acceptData: function( elem ) {
+ var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+ // nodes accept data unless otherwise specified; rejection can be conditional
+ return !noData || noData !== true && elem.getAttribute("classid") === noData;
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var attrs, name,
+ elem = this[0],
+ i = 0,
+ data = null;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = jQuery.data( elem );
+
+ if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+ attrs = elem.attributes;
+ for ( ; i < attrs.length; i++ ) {
+ name = attrs[i].name;
+
+ if ( !name.indexOf( "data-" ) ) {
+ name = jQuery.camelCase( name.substring(5) );
+
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ jQuery._data( elem, "parsedAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ jQuery.data( this, key );
+ });
+ }
+
+ return jQuery.access( this, function( value ) {
+
+ if ( value === undefined ) {
+ // Try to fetch any internally stored data first
+ return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
+ }
+
+ this.each(function() {
+ jQuery.data( this, key, value );
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ jQuery.removeData( this, key );
+ });
+ }
+});
+
+function dataAttr( elem, key, data ) {
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+
+ var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ jQuery.data( elem, key, data );
+
+ } else {
+ data = undefined;
+ }
+ }
+
+ return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+ var name;
+ for ( name in obj ) {
+
+ // if the public data object is empty, the private is still empty
+ if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+ continue;
+ }
+ if ( name !== "toJSON" ) {
+ return false;
+ }
+ }
+
+ return true;
+}
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = jQuery._data( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray(data) ) {
+ queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ hooks.cur = fn;
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // not intended for public consumption - generates a queueHooks object, or returns the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ jQuery._removeData( elem, type + "queue" );
+ jQuery._removeData( elem, key );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ // Based off of the plugin by Clint Helfers, with permission.
+ // http://blindsignals.com/index.php/2009/07/jquery-delay/
+ delay: function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while( i-- ) {
+ tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var nodeHook, boolHook,
+ rclass = /[\t\r\n]/g,
+ rreturn = /\r/g,
+ rfocusable = /^(?:input|select|textarea|button|object)$/i,
+ rclickable = /^(?:a|area)$/i,
+ rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
+ ruseDefault = /^(?:checked|selected)$/i,
+ getSetAttribute = jQuery.support.getSetAttribute,
+ getSetInput = jQuery.support.input;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ },
+
+ prop: function( name, value ) {
+ return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ name = jQuery.propFix[ name ] || name;
+ return this.each(function() {
+ // try/catch handles cases where IE balks (such as removing a property on window)
+ try {
+ this[ name ] = undefined;
+ delete this[ name ];
+ } catch( e ) {}
+ });
+ },
+
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j,
+ i = 0,
+ len = this.length,
+ proceed = typeof value === "string" && value;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+ elem.className = jQuery.trim( cur );
+
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j,
+ i = 0,
+ len = this.length,
+ proceed = arguments.length === 0 || typeof value === "string" && value;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+ elem.className = value ? jQuery.trim( cur ) : "";
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value,
+ isBool = typeof stateVal === "boolean";
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ state = stateVal,
+ classNames = value.match( core_rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space separated list
+ state = isBool ? state : !self.hasClass( className );
+ self[ state ? "addClass" : "removeClass" ]( className );
+ }
+
+ // Toggle whole class name
+ } else if ( type === "undefined" || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ jQuery._data( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed "false",
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // handle most common string cases
+ ret.replace(rreturn, "") :
+ // handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val,
+ self = jQuery(this);
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, self.val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+ } else if ( typeof val === "number" ) {
+ val += "";
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map(val, function ( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ // attributes.value is undefined in Blackberry 4.7 but
+ // uses .value. See #6932
+ var val = elem.attributes.value;
+ return !val || val.specified ? elem.value : elem.text;
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // oldIE doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var values = jQuery.makeArray( value );
+
+ jQuery(elem).find("option").each(function() {
+ this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+ });
+
+ if ( !values.length ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ },
+
+ attr: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === "undefined" ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( notxml ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+
+ // In IE9+, Flash objects don't have .getAttribute (#12945)
+ // Support: IE9+
+ if ( typeof elem.getAttribute !== "undefined" ) {
+ ret = elem.getAttribute( name );
+ }
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( core_rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( rboolean.test( name ) ) {
+ // Set corresponding property to false for boolean attributes
+ // Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
+ if ( !getSetAttribute && ruseDefault.test( name ) ) {
+ elem[ jQuery.camelCase( "default-" + name ) ] =
+ elem[ propName ] = false;
+ } else {
+ elem[ propName ] = false;
+ }
+
+ // See #9699 for explanation of this approach (setting first, then removal)
+ } else {
+ jQuery.attr( elem, name, "" );
+ }
+
+ elem.removeAttribute( getSetAttribute ? name : propName );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+ // Setting the type on a radio button after the value resets the value in IE6-9
+ // Reset value to default in case type is set after value during creation
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ },
+
+ propFix: {
+ tabindex: "tabIndex",
+ readonly: "readOnly",
+ "for": "htmlFor",
+ "class": "className",
+ maxlength: "maxLength",
+ cellspacing: "cellSpacing",
+ cellpadding: "cellPadding",
+ rowspan: "rowSpan",
+ colspan: "colSpan",
+ usemap: "useMap",
+ frameborder: "frameBorder",
+ contenteditable: "contentEditable"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ return ( elem[ name ] = value );
+ }
+
+ } else {
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ return elem[ name ];
+ }
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ var attributeNode = elem.getAttributeNode("tabindex");
+
+ return attributeNode && attributeNode.specified ?
+ parseInt( attributeNode.value, 10 ) :
+ rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+ 0 :
+ undefined;
+ }
+ }
+ }
+});
+
+// Hook for boolean attributes
+boolHook = {
+ get: function( elem, name ) {
+ var
+ // Use .prop to determine if this attribute is understood as boolean
+ prop = jQuery.prop( elem, name ),
+
+ // Fetch it accordingly
+ attr = typeof prop === "boolean" && elem.getAttribute( name ),
+ detail = typeof prop === "boolean" ?
+
+ getSetInput && getSetAttribute ?
+ attr != null :
+ // oldIE fabricates an empty string for missing boolean attributes
+ // and conflates checked/selected into attroperties
+ ruseDefault.test( name ) ?
+ elem[ jQuery.camelCase( "default-" + name ) ] :
+ !!attr :
+
+ // fetch an attribute node for properties not recognized as boolean
+ elem.getAttributeNode( name );
+
+ return detail && detail.value !== false ?
+ name.toLowerCase() :
+ undefined;
+ },
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+ // IE<8 needs the *property* name
+ elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+ // Use defaultChecked and defaultSelected for oldIE
+ } else {
+ elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+ }
+
+ return name;
+ }
+};
+
+// fix oldIE value attroperty
+if ( !getSetInput || !getSetAttribute ) {
+ jQuery.attrHooks.value = {
+ get: function( elem, name ) {
+ var ret = elem.getAttributeNode( name );
+ return jQuery.nodeName( elem, "input" ) ?
+
+ // Ignore the value *property* by using defaultValue
+ elem.defaultValue :
+
+ ret && ret.specified ? ret.value : undefined;
+ },
+ set: function( elem, value, name ) {
+ if ( jQuery.nodeName( elem, "input" ) ) {
+ // Does not return so that setAttribute is also used
+ elem.defaultValue = value;
+ } else {
+ // Use nodeHook if defined (#1954); otherwise setAttribute is fine
+ return nodeHook && nodeHook.set( elem, value, name );
+ }
+ }
+ };
+}
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+ // Use this for any attribute in IE6/7
+ // This fixes almost every IE6/7 issue
+ nodeHook = jQuery.valHooks.button = {
+ get: function( elem, name ) {
+ var ret = elem.getAttributeNode( name );
+ return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
+ ret.value :
+ undefined;
+ },
+ set: function( elem, value, name ) {
+ // Set the existing or create a new attribute node
+ var ret = elem.getAttributeNode( name );
+ if ( !ret ) {
+ elem.setAttributeNode(
+ (ret = elem.ownerDocument.createAttribute( name ))
+ );
+ }
+
+ ret.value = value += "";
+
+ // Break association with cloned elements by also using setAttribute (#9646)
+ return name === "value" || value === elem.getAttribute( name ) ?
+ value :
+ undefined;
+ }
+ };
+
+ // Set contenteditable to false on removals(#10429)
+ // Setting to empty string throws an error as an invalid value
+ jQuery.attrHooks.contenteditable = {
+ get: nodeHook.get,
+ set: function( elem, value, name ) {
+ nodeHook.set( elem, value === "" ? false : value, name );
+ }
+ };
+
+ // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+ // This is for removals
+ jQuery.each([ "width", "height" ], function( i, name ) {
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+ set: function( elem, value ) {
+ if ( value === "" ) {
+ elem.setAttribute( name, "auto" );
+ return value;
+ }
+ }
+ });
+ });
+}
+
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !jQuery.support.hrefNormalized ) {
+ jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+ get: function( elem ) {
+ var ret = elem.getAttribute( name, 2 );
+ return ret == null ? undefined : ret;
+ }
+ });
+ });
+
+ // href/src property should get the full normalized URL (#10299/#12915)
+ jQuery.each([ "href", "src" ], function( i, name ) {
+ jQuery.propHooks[ name ] = {
+ get: function( elem ) {
+ return elem.getAttribute( name, 4 );
+ }
+ };
+ });
+}
+
+if ( !jQuery.support.style ) {
+ jQuery.attrHooks.style = {
+ get: function( elem ) {
+ // Return undefined in the case of empty string
+ // Note: IE uppercases css property names, but if we were to .toLowerCase()
+ // .cssText, that would destroy case senstitivity in URL's, like in "background"
+ return elem.style.cssText || undefined;
+ },
+ set: function( elem, value ) {
+ return ( elem.style.cssText = value + "" );
+ }
+ };
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+ jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+
+ if ( parent ) {
+ parent.selectedIndex;
+
+ // Make sure that it also works with optgroups, see #5701
+ if ( parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ }
+ return null;
+ }
+ });
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+ jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+ jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ get: function( elem ) {
+ // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ }
+ };
+ });
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ });
+});
+var rformElems = /^(?:input|select|textarea)$/i,
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ elemData = elem.nodeType !== 3 && elem.nodeType !== 8 && jQuery._data( elem );
+
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+ jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+ undefined;
+ };
+ // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+ eventHandle.elem = elem;
+ }
+
+ // Handle multiple events separated by a space
+ // jQuery(...).bind("mouseover mouseout", fn);
+ types = ( types || "" ).match( core_rnotwhite ) || [""];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener/attachEvent if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ // Bind the global event handler to the element
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+
+ } else if ( elem.attachEvent ) {
+ elem.attachEvent( "on" + type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ // Nullify elem to prevent memory leaks in IE
+ elem = null;
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( core_rnotwhite ) || [""];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+
+ // removeData also checks for emptiness and clears the expando if empty
+ // so use it instead of delete
+ jQuery._removeData( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special,
+ eventPath = [ elem || document ],
+ type = event.type || event,
+ namespaces = event.namespace ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ event.isTrigger = true;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+ event.preventDefault();
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+ !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Can't use an .isFunction() check here because IE6/7 fails that test.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ try {
+ elem[ type ]();
+ } catch ( e ) {
+ // IE<9 dies on focus/blur to hidden element (#1486,#12518)
+ // only reproducible on winXP IE8 native, not IE9 in IE8 mode
+ }
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = core_slice.call( arguments ),
+ handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG <use> instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+ for ( ; cur != this; cur = cur.parentNode || this ) {
+
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.disabled !== true || event.type !== "click" ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+ }
+
+ return handlerQueue;
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop,
+ originalEvent = event,
+ fixHook = jQuery.event.fixHooks[ event.type ] || {},
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: IE<9
+ // Fix target property (#1925)
+ if ( !event.target ) {
+ event.target = originalEvent.srcElement || document;
+ }
+
+ // Support: Chrome 23+, Safari?
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ // Support: IE<9
+ // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+ event.metaKey = !!event.metaKey;
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button,
+ fromElement = original.fromElement;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && fromElement ) {
+ event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+ this.click();
+ return false;
+ }
+ }
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== document.activeElement && this.focus ) {
+ try {
+ this.focus();
+ return false;
+ } catch ( e ) {
+ // Support: IE<9
+ // If we error on focus to hidden element (#1486, #12518),
+ // let .trigger() run the handlers
+ }
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === document.activeElement && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Even when returnValue equals to undefined Firefox will still show alert
+ if ( event.result !== undefined ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ { type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+ function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+ } :
+ function( elem, type, handle ) {
+ var name = "on" + type;
+
+ if ( elem.detachEvent ) {
+
+ // #8545, #7054, preventing memory leaks for custom events in IE6-8
+ // detachEvent needed property on element, by name of that event, to properly expose it to GC
+ if ( typeof elem[ name ] === "undefined" ) {
+ elem[ name ] = null;
+ }
+
+ elem.detachEvent( name, handle );
+ }
+ };
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+ src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+ if ( !e ) {
+ return;
+ }
+
+ // If preventDefault exists, run it on the original event
+ if ( e.preventDefault ) {
+ e.preventDefault();
+
+ // Support: IE
+ // Otherwise set the returnValue property of the original event to false
+ } else {
+ e.returnValue = false;
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+ if ( !e ) {
+ return;
+ }
+ // If stopPropagation exists, run it on the original event
+ if ( e.stopPropagation ) {
+ e.stopPropagation();
+ }
+
+ // Support: IE
+ // Set the cancelBubble property of the original event to true
+ e.cancelBubble = true;
+ },
+ stopImmediatePropagation: function() {
+ this.isImmediatePropagationStopped = returnTrue;
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+ jQuery.event.special.submit = {
+ setup: function() {
+ // Only need this for delegated form submit events
+ if ( jQuery.nodeName( this, "form" ) ) {
+ return false;
+ }
+
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
+ jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+ // Node name check avoids a VML-related crash in IE (#9807)
+ var elem = e.target,
+ form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+ if ( form && !jQuery._data( form, "submitBubbles" ) ) {
+ jQuery.event.add( form, "submit._submit", function( event ) {
+ event._submit_bubble = true;
+ });
+ jQuery._data( form, "submitBubbles", true );
+ }
+ });
+ // return undefined since we don't need an event listener
+ },
+
+ postDispatch: function( event ) {
+ // If form was submitted by the user, bubble the event up the tree
+ if ( event._submit_bubble ) {
+ delete event._submit_bubble;
+ if ( this.parentNode && !event.isTrigger ) {
+ jQuery.event.simulate( "submit", this.parentNode, event, true );
+ }
+ }
+ },
+
+ teardown: function() {
+ // Only need this for delegated form submit events
+ if ( jQuery.nodeName( this, "form" ) ) {
+ return false;
+ }
+
+ // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+ jQuery.event.remove( this, "._submit" );
+ }
+ };
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+ jQuery.event.special.change = {
+
+ setup: function() {
+
+ if ( rformElems.test( this.nodeName ) ) {
+ // IE doesn't fire change on a check/radio until blur; trigger it on click
+ // after a propertychange. Eat the blur-change in special.change.handle.
+ // This still fires onchange a second time for check/radio after blur.
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ jQuery.event.add( this, "propertychange._change", function( event ) {
+ if ( event.originalEvent.propertyName === "checked" ) {
+ this._just_changed = true;
+ }
+ });
+ jQuery.event.add( this, "click._change", function( event ) {
+ if ( this._just_changed && !event.isTrigger ) {
+ this._just_changed = false;
+ }
+ // Allow triggered, simulated change events (#11500)
+ jQuery.event.simulate( "change", this, event, true );
+ });
+ }
+ return false;
+ }
+ // Delegated event; lazy-add a change handler on descendant inputs
+ jQuery.event.add( this, "beforeactivate._change", function( e ) {
+ var elem = e.target;
+
+ if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
+ jQuery.event.add( elem, "change._change", function( event ) {
+ if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+ jQuery.event.simulate( "change", this.parentNode, event, true );
+ }
+ });
+ jQuery._data( elem, "changeBubbles", true );
+ }
+ });
+ },
+
+ handle: function( event ) {
+ var elem = event.target;
+
+ // Swallow native change events from checkbox/radio, we already triggered them above
+ if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+ return event.handleObj.handler.apply( this, arguments );
+ }
+ },
+
+ teardown: function() {
+ jQuery.event.remove( this, "._change" );
+
+ return !rformElems.test( this.nodeName );
+ }
+ };
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler while someone wants focusin/focusout
+ var attaches = 0,
+ handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ if ( attaches++ === 0 ) {
+ document.addEventListener( orig, handler, true );
+ }
+ },
+ teardown: function() {
+ if ( --attaches === 0 ) {
+ document.removeEventListener( orig, handler, true );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on( types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ },
+
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ }
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+
+ if ( rkeyEvent.test( name ) ) {
+ jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+ }
+
+ if ( rmouseEvent.test( name ) ) {
+ jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+ }
+});
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://sizzlejs.com/
+ */
+(function( window, undefined ) {
+
+var i,
+ cachedruns,
+ Expr,
+ getText,
+ isXML,
+ compile,
+ hasDuplicate,
+ outermostContext,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsXML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+ sortOrder,
+
+ // Instance-specific data
+ expando = "sizzle" + -(new Date()),
+ preferredDoc = window.document,
+ support = {},
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+
+ // General-purpose constants
+ strundefined = typeof undefined,
+ MAX_NEGATIVE = 1 << 31,
+
+ // Array methods
+ arr = [],
+ pop = arr.pop,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf if we can't use a native one
+ indexOf = arr.indexOf || function( elem ) {
+ var i = 0,
+ len = this.length;
+ for ( ; i < len; i++ ) {
+ if ( this[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+ operators = "([*^$|!~]?=)",
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+ "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+ // Prefer arguments quoted,
+ // then not containing pseudos/brackets,
+ // then attribute selectors/non-parenthetical expressions,
+ // then anything else
+ // These preferences are here to reduce the number of selectors
+ // needing tokenize in the PSEUDO preFilter
+ pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rsibling = /[\x20\t\r\n\f]*[+~]/,
+
+ rnative = /\{\s*\[native code\]\s*\}/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rescape = /'|\\/g,
+ rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
+ funescape = function( _, escaped ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ return high !== high ?
+ escaped :
+ // BMP codepoint
+ high < 0 ?
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ };
+
+// Use a stripped-down slice if we can't use a native one
+try {
+ slice.call( docElem.childNodes, 0 )[0].nodeType;
+} catch ( e ) {
+ slice = function( i ) {
+ var elem,
+ results = [];
+ for ( ; (elem = this[i]); i++ ) {
+ results.push( elem );
+ }
+ return results;
+ };
+}
+
+/**
+ * For feature detection
+ * @param {Function} fn The function to test for native support
+ */
+function isNative( fn ) {
+ return rnative.test( fn + "" );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var cache,
+ keys = [];
+
+ return (cache = function( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key += " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key ] = value);
+ });
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // release memory in IE
+ div = null;
+ }
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( !documentIsXML && !seed ) {
+
+ // Shortcuts
+ if ( (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {
+ push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && !rbuggyQSA.test(selector) ) {
+ old = true;
+ nid = expando;
+ newContext = context;
+ newSelector = nodeType === 9 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && context.parentNode || context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results, slice.call( newContext.querySelectorAll(
+ newSelector
+ ), 0 ) );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Detect xml
+ * @param {Element|Object} elem An element or a document
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+
+ // Support tests
+ documentIsXML = isXML( doc );
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.tagNameNoComments = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Check if attributes should be retrieved by attribute nodes
+ support.attributes = assert(function( div ) {
+ div.innerHTML = "<select></select>";
+ var type = typeof div.lastChild.getAttribute("multiple");
+ // IE8 returns a string for some attributes even when not present
+ return type !== "boolean" && type !== "string";
+ });
+
+ // Check if getElementsByClassName can be trusted
+ support.getByClassName = assert(function( div ) {
+ // Opera can't find a second classname (in 9.6)
+ div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
+ if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
+ return false;
+ }
+
+ // Safari 3.2 caches class attributes and doesn't catch changes
+ div.lastChild.className = "e";
+ return div.getElementsByClassName("e").length === 2;
+ });
+
+ // Check if getElementById returns elements by name
+ // Check if getElementsByName privileges form controls or returns elements by ID
+ support.getByName = assert(function( div ) {
+ // Inject content
+ div.id = expando + 0;
+ div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
+ docElem.insertBefore( div, docElem.firstChild );
+
+ // Test
+ var pass = doc.getElementsByName &&
+ // buggy browsers will return fewer than the correct 2
+ doc.getElementsByName( expando ).length === 2 +
+ // buggy browsers will return more than the correct 0
+ doc.getElementsByName( expando + 0 ).length;
+ support.getIdNotName = !doc.getElementById( expando );
+
+ // Cleanup
+ docElem.removeChild( div );
+
+ return pass;
+ });
+
+ // IE6/7 return modified attributes
+ Expr.attrHandle = assert(function( div ) {
+ div.innerHTML = "<a href='#'></a>";
+ return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
+ div.firstChild.getAttribute("href") === "#";
+ }) ?
+ {} :
+ {
+ "href": function( elem ) {
+ return elem.getAttribute( "href", 2 );
+ },
+ "type": function( elem ) {
+ return elem.getAttribute("type");
+ }
+ };
+
+ // ID find and filter
+ if ( support.getIdNotName ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [m] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
+ var m = context.getElementById( id );
+
+ return m ?
+ m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
+ [m] :
+ undefined :
+ [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.tagNameNoComments ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== strundefined ) {
+ return context.getElementsByTagName( tag );
+ }
+ } :
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ for ( ; (elem = results[i]); i++ ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Name
+ Expr.find["NAME"] = support.getByName && function( tag, context ) {
+ if ( typeof context.getElementsByName !== strundefined ) {
+ return context.getElementsByName( name );
+ }
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21),
+ // no need to also add to buggyMatches since matches checks buggyQSA
+ // A support test would require too much code (would include document ready)
+ rbuggyQSA = [ ":focus" ];
+
+ if ( (support.qsa = isNative(doc.querySelectorAll)) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explictly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ div.innerHTML = "<select><option selected=''></option></select>";
+
+ // IE8 - Some boolean attributes are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+ });
+
+ assert(function( div ) {
+
+ // Opera 10-12/IE8 - ^= $= *= and empty values
+ // Should not select anything
+ div.innerHTML = "<input type='hidden' i=''/>";
+ if ( div.querySelectorAll("[i^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.webkitMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = new RegExp( rbuggyMatches.join("|") );
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = isNative(docElem.contains) || docElem.compareDocumentPosition ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ // Document order sorting
+ sortOrder = docElem.compareDocumentPosition ?
+ function( a, b ) {
+ var compare;
+
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {
+ if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {
+ if ( a === doc || contains( preferredDoc, a ) ) {
+ return -1;
+ }
+ if ( b === doc || contains( preferredDoc, b ) ) {
+ return 1;
+ }
+ return 0;
+ }
+ return compare & 4 ? -1 : 1;
+ }
+
+ return a.compareDocumentPosition ? -1 : 1;
+ } :
+ function( a, b ) {
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // The nodes are identical, we can exit early
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+
+ // Fallback to using sourceIndex (in IE) if it's available on both nodes
+ } else if ( a.sourceIndex && b.sourceIndex ) {
+ return ( ~b.sourceIndex || MAX_NEGATIVE ) - ( contains( preferredDoc, a ) && ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Parentless nodes are either documents or disconnected
+ } else if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ // Always assume the presence of duplicates if sort doesn't
+ // pass them to our comparison function (as in Google Chrome).
+ hasDuplicate = false;
+ [0, 0].sort( sortOrder );
+ support.detectDuplicates = hasDuplicate;
+
+ return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ // rbuggyQSA always contains :focus, so no need for an existence check
+ if ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle( expr, document, null, [elem] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ var val;
+
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ if ( !documentIsXML ) {
+ name = name.toLowerCase();
+ }
+ if ( (val = Expr.attrHandle[ name ]) ) {
+ return val( elem );
+ }
+ if ( documentIsXML || support.attributes ) {
+ return elem.getAttribute( name );
+ }
+ return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?
+ name :
+ val && val.specified ? val.value : null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+// Document sorting and removing duplicates
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ i = 1,
+ j = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ for ( ; (elem = results[i]); i++ ) {
+ if ( elem === results[ i - 1 ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ return results;
+};
+
+function siblingCheck( a, b ) {
+ var cur = a && b && a.nextSibling;
+
+ for ( ; cur; cur = cur.nextSibling ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+// Returns a function to use in pseudos for input types
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+// Returns a function to use in pseudos for buttons
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+// Returns a function to use in pseudos for positionals
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ for ( ; (node = elem[i]); i++ ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (see #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[5] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[4] ) {
+ match[2] = match[4];
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeName ) {
+ if ( nodeName === "*" ) {
+ return function() { return true; };
+ }
+
+ nodeName = nodeName.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.substr( result.length - check.length ) === check :
+ operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf.call( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifider
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsXML ?
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang") :
+ elem.lang) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+ // not comment, processing instructions, or others
+ // Thanks to Diego Perini for the nodeName shortcut
+ // Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+ // use getAttribute instead to test this case
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+function tokenize( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( tokens = [] );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push( {
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ } );
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push( {
+ value: matched,
+ type: type,
+ matches: match
+ } );
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+}
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && combinator.dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var data, cache, outerCache,
+ dirkey = dirruns + " " + doneName;
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
+ if ( (data = cache[1]) === true || data === cachedruns ) {
+ return data === true;
+ }
+ } else {
+ cache = outerCache[ dir ] = [ dirkey ];
+ cache[1] = matcher( elem, context, xml ) || cachedruns;
+ if ( cache[1] === true ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf.call( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ // A counter to specify which element is currently being matched
+ var matcherCachedRuns = 0,
+ bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, expandContext ) {
+ var elem, j, matcher,
+ setMatched = [],
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ outermost = expandContext != null,
+ contextBackup = outermostContext,
+ // We must always have either seed elements or context
+ elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+ // Nested matchers should use non-integer dirruns
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ cachedruns = matcherCachedRuns;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ cachedruns = ++matcherCachedRuns;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ // `i` starts as a string, so matchedCount would equal "00" if there are no elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ for ( j = 0; (matcher = setMatchers[j]); j++ ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !group ) {
+ group = tokenize( selector );
+ }
+ i = group.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( group[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+ }
+ return cached;
+};
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function select( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ match = tokenize( selector );
+
+ if ( !seed ) {
+ // Try to minimize operations if there is only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ context.nodeType === 9 && !documentIsXML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = Expr.find["ID"]( token.matches[0].replace( runescape, funescape ), context )[0];
+ if ( !context ) {
+ return results;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ for ( i = matchExpr["needsContext"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && context.parentNode || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, slice.call( seed, 0 ) );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function
+ // Provide `match` to avoid retokenization if we modified the selector above
+ compile( selector, match )(
+ seed,
+ context,
+ documentIsXML,
+ results,
+ rsibling.test( selector )
+ );
+ return results;
+}
+
+// Deprecated
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Easy API for creating new setFilters
+function setFilters() {}
+Expr.filters = setFilters.prototype = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+// Initialize with the default document
+setDocument();
+
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+var runtil = /Until$/,
+ rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ isSimple = /^.[^:#\[\.,]*$/,
+ rneedsContext = jQuery.expr.match.needsContext,
+ // methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i, ret, self;
+
+ if ( typeof selector !== "string" ) {
+ self = this;
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < self.length; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ ret = [];
+ for ( i = 0; i < this.length; i++ ) {
+ jQuery.find( selector, this[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( jQuery.unique( ret ) );
+ ret.selector = ( this.selector ? this.selector + " " : "" ) + selector;
+ return ret;
+ },
+
+ has: function( target ) {
+ var i,
+ targets = jQuery( target, this ),
+ len = targets.length;
+
+ return this.filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector, false) );
+ },
+
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector, true) );
+ },
+
+ is: function( selector ) {
+ return !!selector && (
+ typeof selector === "string" ?
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ rneedsContext.test( selector ) ?
+ jQuery( selector, this.context ).index( this[0] ) >= 0 :
+ jQuery.filter( selector, this ).length > 0 :
+ this.filter( selector ).length > 0 );
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ ret = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ cur = this[i];
+
+ while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+ if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+ ret.push( cur );
+ break;
+ }
+ cur = cur.parentNode;
+ }
+ }
+
+ return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // index in selector
+ if ( typeof elem === "string" ) {
+ return jQuery.inArray( this[0], jQuery( elem ) );
+ }
+
+ // Locate the position of the desired element
+ return jQuery.inArray(
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[0] : elem, this );
+ },
+
+ add: function( selector, context ) {
+ var set = typeof selector === "string" ?
+ jQuery( selector, context ) :
+ jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+ all = jQuery.merge( this.get(), set );
+
+ return this.pushStack( jQuery.unique(all) );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+function sibling( cur, dir ) {
+ do {
+ cur = cur[ dir ];
+ } while ( cur && cur.nodeType !== 1 );
+
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return jQuery.nodeName( elem, "iframe" ) ?
+ elem.contentDocument || elem.contentWindow.document :
+ jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var ret = jQuery.map( this, fn, until );
+
+ if ( !runtil.test( name ) ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ ret = jQuery.filter( selector, ret );
+ }
+
+ ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+ if ( this.length > 1 && rparentsprev.test( name ) ) {
+ ret = ret.reverse();
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+jQuery.extend({
+ filter: function( expr, elems, not ) {
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 ?
+ jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+ jQuery.find.matches(expr, elems);
+ },
+
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ cur = elem[ dir ];
+
+ while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+ if ( cur.nodeType === 1 ) {
+ matched.push( cur );
+ }
+ cur = cur[dir];
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var r = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ r.push( n );
+ }
+ }
+
+ return r;
+ }
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+ // Can't pass null or undefined to indexOf in Firefox 4
+ // Set to 0 to skip string check
+ qualifier = qualifier || 0;
+
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep(elements, function( elem, i ) {
+ var retVal = !!qualifier.call( elem, i, elem );
+ return retVal === keep;
+ });
+
+ } else if ( qualifier.nodeType ) {
+ return jQuery.grep(elements, function( elem ) {
+ return ( elem === qualifier ) === keep;
+ });
+
+ } else if ( typeof qualifier === "string" ) {
+ var filtered = jQuery.grep(elements, function( elem ) {
+ return elem.nodeType === 1;
+ });
+
+ if ( isSimple.test( qualifier ) ) {
+ return jQuery.filter(qualifier, filtered, !keep);
+ } else {
+ qualifier = jQuery.filter( qualifier, filtered );
+ }
+ }
+
+ return jQuery.grep(elements, function( elem ) {
+ return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+ });
+}
+function createSafeFragment( document ) {
+ var list = nodeNames.split( "|" ),
+ safeFrag = document.createDocumentFragment();
+
+ if ( safeFrag.createElement ) {
+ while ( list.length ) {
+ safeFrag.createElement(
+ list.pop()
+ );
+ }
+ }
+ return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+ "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+ rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+ rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+ rleadingWhitespace = /^\s+/,
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rtbody = /<tbody/i,
+ rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
+ legend: [ 1, "<fieldset>", "</fieldset>" ],
+ area: [ 1, "<map>", "</map>" ],
+ param: [ 1, "<object>", "</object>" ],
+ thead: [ 1, "<table>", "</table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+ // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+ // unless wrapped in a div with non-breaking characters in front of it.
+ _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
+ },
+ safeFragment = createSafeFragment( document ),
+ fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+jQuery.fn.extend({
+ text: function( value ) {
+ return jQuery.access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+ }, null, value, arguments.length );
+ },
+
+ wrapAll: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function(i) {
+ jQuery(this).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[0] ) {
+ // The elements to wrap the target around
+ var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+ if ( this[0].parentNode ) {
+ wrap.insertBefore( this[0] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+ elem = elem.firstChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function(i) {
+ jQuery(this).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function(i) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ },
+
+ append: function() {
+ return this.domManip(arguments, true, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip(arguments, true, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.insertBefore( elem, this.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip( arguments, false, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip( arguments, false, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ });
+ },
+
+ // keepData is for internal use only--do not document
+ remove: function( selector, keepData ) {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
+
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
+ }
+ elem.parentNode.removeChild( elem );
+ }
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ }
+
+ // Remove any remaining nodes
+ while ( elem.firstChild ) {
+ elem.removeChild( elem.firstChild );
+ }
+
+ // If this is a select, ensure that it displays empty (#12336)
+ // Support: IE<9
+ if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+ elem.options.length = 0;
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map( function () {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ return jQuery.access( this, function( value ) {
+ var elem = this[0] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined ) {
+ return elem.nodeType === 1 ?
+ elem.innerHTML.replace( rinlinejQuery, "" ) :
+ undefined;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&
+ ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+ !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+ value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+ try {
+ for (; i < l; i++ ) {
+ // Remove element nodes and prevent memory leaks
+ elem = this[i] || {};
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch(e) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function( value ) {
+ var isFunc = jQuery.isFunction( value );
+
+ // Make sure that the elements are removed from the DOM before they are inserted
+ // this can help fix replacing a parent with child elements
+ if ( !isFunc && typeof value !== "string" ) {
+ value = jQuery( value ).not( this ).detach();
+ }
+
+ return this.domManip( [ value ], true, function( elem ) {
+ var next = this.nextSibling,
+ parent = this.parentNode;
+
+ if ( parent && this.nodeType === 1 || this.nodeType === 11 ) {
+
+ jQuery( this ).remove();
+
+ if ( next ) {
+ next.parentNode.insertBefore( elem, next );
+ } else {
+ parent.appendChild( elem );
+ }
+ }
+ });
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, table, callback ) {
+
+ // Flatten any nested arrays
+ args = core_concat.apply( [], args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[0],
+ isFunction = jQuery.isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[0] = value.call( this, index, table ? self.html() : undefined );
+ }
+ self.domManip( args, table, callback );
+ });
+ }
+
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ if ( first ) {
+ table = table && jQuery.nodeName( first, "tr" );
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call(
+ table && jQuery.nodeName( this[i], "table" ) ?
+ findOrAppend( this[i], "tbody" ) :
+ this[i],
+ node,
+ i
+ );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+ if ( node.src ) {
+ // Hope ajax is available...
+ jQuery.ajax({
+ url: node.src,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+ } else {
+ jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+ }
+ }
+ }
+ }
+
+ // Fix #11809: Avoid leaking memory
+ fragment = first = null;
+ }
+ }
+
+ return this;
+ }
+});
+
+function findOrAppend( elem, tag ) {
+ return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ var attr = elem.getAttributeNode("type");
+ elem.type = ( attr && attr.specified ) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+ if ( match ) {
+ elem.type = match[1];
+ } else {
+ elem.removeAttribute("type");
+ }
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var elem,
+ i = 0;
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
+ }
+}
+
+function cloneCopyEvent( src, dest ) {
+
+ if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+ return;
+ }
+
+ var type, i, l,
+ oldData = jQuery._data( src ),
+ curData = jQuery._data( dest, oldData ),
+ events = oldData.events;
+
+ if ( events ) {
+ delete curData.handle;
+ curData.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+
+ // make the cloned public data object a copy from the original
+ if ( curData.data ) {
+ curData.data = jQuery.extend( {}, curData.data );
+ }
+}
+
+function fixCloneNodeIssues( src, dest ) {
+ var nodeName, data, e;
+
+ // We do not need to do anything for non-Elements
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ nodeName = dest.nodeName.toLowerCase();
+
+ // IE6-8 copies events bound via attachEvent when using cloneNode.
+ if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
+ data = jQuery._data( dest );
+
+ for ( e in data.events ) {
+ jQuery.removeEvent( dest, e, data.handle );
+ }
+
+ // Event data gets referenced instead of copied if the expando gets copied too
+ dest.removeAttribute( jQuery.expando );
+ }
+
+ // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+ if ( nodeName === "script" && dest.text !== src.text ) {
+ disableScript( dest ).text = src.text;
+ restoreScript( dest );
+
+ // IE6-10 improperly clones children of object elements using classid.
+ // IE10 throws NoModificationAllowedError if parent is null, #12132.
+ } else if ( nodeName === "object" ) {
+ if ( dest.parentNode ) {
+ dest.outerHTML = src.outerHTML;
+ }
+
+ // This path appears unavoidable for IE9. When cloning an object
+ // element in IE9, the outerHTML strategy above is not sufficient.
+ // If the src has innerHTML and the destination does not,
+ // copy the src.innerHTML into the dest.innerHTML. #10324
+ if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
+ dest.innerHTML = src.innerHTML;
+ }
+
+ } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
+ // IE6-8 fails to persist the checked state of a cloned checkbox
+ // or radio button. Worse, IE6-7 fail to give the cloned element
+ // a checked appearance if the defaultChecked value isn't also set
+
+ dest.defaultChecked = dest.checked = src.checked;
+
+ // IE6-7 get confused and end up setting the value of a cloned
+ // checkbox/radio button to an empty string instead of "on"
+ if ( dest.value !== src.value ) {
+ dest.value = src.value;
+ }
+
+ // IE6-8 fails to return the selected option to the default selected
+ // state when cloning options
+ } else if ( nodeName === "option" ) {
+ dest.defaultSelected = dest.selected = src.defaultSelected;
+
+ // IE6-8 fails to set the defaultValue to the correct value when
+ // cloning other types of input fields
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ i = 0,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone(true);
+ jQuery( insert[i] )[ original ]( elems );
+
+ // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+ core_push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+function getAll( context, tag ) {
+ var elems, elem,
+ i = 0,
+ found = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( tag || "*" ) :
+ typeof context.querySelectorAll !== "undefined" ? context.querySelectorAll( tag || "*" ) :
+ undefined;
+
+ if ( !found ) {
+ for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
+ if ( !tag || jQuery.nodeName( elem, tag ) ) {
+ found.push( elem );
+ } else {
+ jQuery.merge( found, getAll( elem, tag ) );
+ }
+ }
+ }
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], found ) :
+ found;
+}
+
+// Used in buildFragment, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+ if ( manipulation_rcheckableType.test( elem.type ) ) {
+ elem.defaultChecked = elem.checked;
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var destElements, srcElements, node, i, clone,
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+ clone = elem.cloneNode( true );
+
+ // IE<=8 does not properly clone detached, unknown element nodes
+ } else {
+ fragmentDiv.innerHTML = elem.outerHTML;
+ fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+ }
+
+ if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+ (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ // Fix all IE cloning issues
+ for ( i = 0; (node = srcElements[i]) != null; ++i ) {
+ // Ensure that the destination node is not null; Fixes #9587
+ if ( destElements[i] ) {
+ fixCloneNodeIssues( node, destElements[i] );
+ }
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0; (node = srcElements[i]) != null; i++ ) {
+ cloneCopyEvent( node, destElements[i] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ destElements = srcElements = node = null;
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function( elems, context, scripts, selection ) {
+ var contains, elem, tag, tmp, wrap, tbody, j,
+ l = elems.length,
+
+ // Ensure a safe fragment
+ safe = createSafeFragment( context ),
+
+ nodes = [],
+ i = 0;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || safe.appendChild( context.createElement("div") );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+
+ tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
+
+ // Descend through wrappers to the right content
+ j = wrap[0];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Manually add leading whitespace removed by IE
+ if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+ nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
+ }
+
+ // Remove IE's autoinserted <tbody> from table fragments
+ if ( !jQuery.support.tbody ) {
+
+ // String was a <table>, *may* have spurious <tbody>
+ elem = tag === "table" && !rtbody.test( elem ) ?
+ tmp.firstChild :
+
+ // String was a bare <thead> or <tfoot>
+ wrap[1] === "<table>" && !rtbody.test( elem ) ?
+ tmp :
+ 0;
+
+ j = elem && elem.childNodes.length;
+ while ( j-- ) {
+ if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
+ elem.removeChild( tbody );
+ }
+ }
+ }
+
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Fix #12392 for WebKit and IE > 9
+ tmp.textContent = "";
+
+ // Fix #12392 for oldIE
+ while ( tmp.firstChild ) {
+ tmp.removeChild( tmp.firstChild );
+ }
+
+ // Remember the top-level container for proper cleanup
+ tmp = safe.lastChild;
+ }
+ }
+ }
+
+ // Fix #11356: Clear elements from fragment
+ if ( tmp ) {
+ safe.removeChild( tmp );
+ }
+
+ // Reset defaultChecked for any radios and checkboxes
+ // about to be appended to the DOM in IE 6/7 (#8060)
+ if ( !jQuery.support.appendChecked ) {
+ jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+ }
+
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( safe.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ tmp = null;
+
+ return safe;
+ },
+
+ cleanData: function( elems, /* internal */ acceptData ) {
+ var data, id, elem, type,
+ i = 0,
+ internalKey = jQuery.expando,
+ cache = jQuery.cache,
+ deleteExpando = jQuery.support.deleteExpando,
+ special = jQuery.event.special;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+
+ if ( acceptData || jQuery.acceptData( elem ) ) {
+
+ id = elem[ internalKey ];
+ data = id && cache[ id ];
+
+ if ( data ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+
+ // Remove cache only if it was not already removed by jQuery.event.remove
+ if ( cache[ id ] ) {
+
+ delete cache[ id ];
+
+ // IE does not allow us to delete expando properties from nodes,
+ // nor does it have a removeAttribute function on Document nodes;
+ // we must handle all of these cases
+ if ( deleteExpando ) {
+ delete elem[ internalKey ];
+
+ } else if ( typeof elem.removeAttribute !== "undefined" ) {
+ elem.removeAttribute( internalKey );
+
+ } else {
+ elem[ internalKey ] = null;
+ }
+
+ core_deletedIds.push( id );
+ }
+ }
+ }
+ }
+ }
+});
+var curCSS, getStyles, iframe,
+ ralpha = /alpha\([^)]*\)/i,
+ ropacity = /opacity\s*=\s*([^)]*)/,
+ rposition = /^(top|right|bottom|left)$/,
+ // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rmargin = /^margin/,
+ rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+ rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
+ elemdisplay = { BODY: "block" },
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: 0,
+ fontWeight: 400
+ },
+
+ cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+ // shortcut for names that are not vendor prefixed
+ if ( name in style ) {
+ return name;
+ }
+
+ // check for vendor prefixed names
+ var capName = name.charAt(0).toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in style ) {
+ return name;
+ }
+ }
+
+ return origName;
+}
+
+function isHidden( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+ var elem,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ values[ index ] = jQuery._data( elem, "olddisplay" );
+ if ( show ) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !values[ index ] && elem.style.display === "none" ) {
+ elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( elem.style.display === "" && isHidden( elem ) ) {
+ values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+ }
+ } else if ( !values[ index ] && !isHidden( elem ) ) {
+ jQuery._data( elem, "olddisplay", jQuery.css( elem, "display" ) );
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( index = 0; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+ elem.style.display = show ? values[ index ] || "" : "none";
+ }
+ }
+
+ return elements;
+}
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return jQuery.access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ var bool = typeof state === "boolean";
+
+ return this.each(function() {
+ if ( bool ? state : isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Exclude the following css properties to add px
+ cssNumber: {
+ "columnCount": true,
+ "fillOpacity": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ // normalize float css property
+ "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = jQuery.camelCase( name ),
+ style = elem.style;
+
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // convert relative number strings (+= or -=) to relative numbers. #7345
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that NaN and null values aren't set. See: #7116
+ if ( value == null || type === "number" && isNaN( value ) ) {
+ return;
+ }
+
+ // If a number was passed in, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
+ // but it would mean to define eight (for every problematic property) identical functions
+ if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+
+ // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+ // Fixes bug #5509
+ try {
+ style[ name ] = value;
+ } catch(e) {}
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = jQuery.camelCase( name );
+
+ // Make sure that we're working with the right name
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ //convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Return, converting to number if forced or a qualifier was provided and val looks numeric
+ if ( extra ) {
+ num = parseFloat( val );
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
+ },
+
+ // A method for quickly swapping in/out CSS properties to get correct calculations
+ swap: function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+ }
+});
+
+// NOTE: we've included the "window" in window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+ getStyles = function( elem ) {
+ return window.getComputedStyle( elem, null );
+ };
+
+ curCSS = function( elem, name, _computed ) {
+ var width, minWidth, maxWidth,
+ computed = _computed || getStyles( elem ),
+
+ // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+ ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
+ style = elem.style;
+
+ if ( computed ) {
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // A tribute to the "awesome hack by Dean Edwards"
+ // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+ // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret;
+ };
+} else if ( document.documentElement.currentStyle ) {
+ getStyles = function( elem ) {
+ return elem.currentStyle;
+ };
+
+ curCSS = function( elem, name, _computed ) {
+ var left, rs, rsLeft,
+ computed = _computed || getStyles( elem ),
+ ret = computed ? computed[ name ] : undefined,
+ style = elem.style;
+
+ // Avoid setting ret to empty string here
+ // so we don't default to auto
+ if ( ret == null && style && style[ name ] ) {
+ ret = style[ name ];
+ }
+
+ // From the awesome hack by Dean Edwards
+ // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+ // If we're not dealing with a regular pixel number
+ // but a number that has a weird ending, we need to convert it to pixels
+ // but not position css attributes, as those are proportional to the parent element instead
+ // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+ if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+ // Remember the original values
+ left = style.left;
+ rs = elem.runtimeStyle;
+ rsLeft = rs && rs.left;
+
+ // Put in the new values to get a computed value out
+ if ( rsLeft ) {
+ rs.left = elem.currentStyle.left;
+ }
+ style.left = name === "fontSize" ? "1em" : ret;
+ ret = style.pixelLeft + "px";
+
+ // Revert the changed values
+ style.left = left;
+ if ( rsLeft ) {
+ rs.left = rsLeft;
+ }
+ }
+
+ return ret === "" ? "auto" : ret;
+ };
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // at this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ } else {
+ // at this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // at this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // we need the check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
+}
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
+
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
+
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+ // Use the already-created iframe if possible
+ iframe = ( iframe ||
+ jQuery("<iframe frameborder='0' width='0' height='0'/>")
+ .css( "cssText", "display:block !important" )
+ ).appendTo( doc.documentElement );
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
+ doc.write("<!doctype html><html><body>");
+ doc.close();
+
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return display;
+}
+
+// Called ONLY from within css_defaultDisplay
+function actualDisplay( name, doc ) {
+ var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+ display = jQuery.css( elem[0], "display" );
+ elem.remove();
+ return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+ // certain elements can have dimension info if we invisibly show them
+ // however, it must have a current display style that would benefit from this
+ return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+
+if ( !jQuery.support.opacity ) {
+ jQuery.cssHooks.opacity = {
+ get: function( elem, computed ) {
+ // IE uses filters for opacity
+ return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+ ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+ computed ? "1" : "";
+ },
+
+ set: function( elem, value ) {
+ var style = elem.style,
+ currentStyle = elem.currentStyle,
+ opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+ filter = currentStyle && currentStyle.filter || style.filter || "";
+
+ // IE has trouble with opacity if it does not have layout
+ // Force it by setting the zoom level
+ style.zoom = 1;
+
+ // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+ // if value === "", then remove inline opacity #12685
+ if ( ( value >= 1 || value === "" ) &&
+ jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+ style.removeAttribute ) {
+
+ // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+ // if "filter:" is present at all, clearType is disabled, we want to avoid this
+ // style.removeAttribute is IE Only, but so apparently is this code path...
+ style.removeAttribute( "filter" );
+
+ // if there is no filter style applied in a css rule or unset inline opacity, we are done
+ if ( value === "" || currentStyle && !currentStyle.filter ) {
+ return;
+ }
+ }
+
+ // otherwise, set new filter values
+ style.filter = ralpha.test( filter ) ?
+ filter.replace( ralpha, opacity ) :
+ filter + " " + opacity;
+ }
+ };
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+ if ( !jQuery.support.reliableMarginRight ) {
+ jQuery.cssHooks.marginRight = {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // Work around by temporarily setting element display to inline-block
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+ };
+ }
+
+ // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+ // getComputedStyle returns percent when specified for top/left/bottom/right
+ // rather than make the css module depend on the offset module, we just check for it here
+ if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+ jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+ // if curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ };
+ });
+ }
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+ jQuery.expr.filters.hidden = function( elem ) {
+ return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+ };
+
+ jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+ };
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function(){
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function(){
+ var type = this.type;
+ // Use .is(":disabled") so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !manipulation_rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ){
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ){
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+var
+ // Document location
+ ajaxLocParts,
+ ajaxLocation,
+
+ ajax_nonce = jQuery.now(),
+
+ ajax_rquery = /\?/,
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+ // Keep a copy of the old load method
+ _load = jQuery.fn.load,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+ ajaxLocation = location.href;
+} catch( e ) {
+ // Use the href attribute of an A element
+ // since IE will modify it given document.location
+ ajaxLocation = document.createElement( "a" );
+ ajaxLocation.href = "";
+ ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
+
+ if ( jQuery.isFunction( func ) ) {
+ // For each dataType in the dataTypeExpression
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ });
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+ }
+
+ var selector, type, response,
+ self = this,
+ off = url.indexOf(" ");
+
+ if ( off >= 0 ) {
+ selector = url.slice( off, url.length );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
+
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+ });
+ }
+
+ return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
+ jQuery.fn[ type ] = function( fn ){
+ return this.on( type, fn );
+ };
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
+});
+
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ type: "GET",
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": window.String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // The jqXHR state
+ state = 0,
+ // Default abort message
+ strAbort = "canceled",
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
+
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( state === 2 ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ fireGlobals = s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
+
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
+
+ // Otherwise add one to the end
+ cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
+ }
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // If successful, handle type chaining
+ if ( status >= 200 && status < 300 || status === 304 ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // If not modified
+ if ( status === 304 ) {
+ isSuccess = true;
+ statusText = "notmodified";
+
+ // If we have data
+ } else {
+ isSuccess = ajaxConvert( s, response );
+ statusText = isSuccess.state;
+ success = isSuccess.data;
+ error = isSuccess.error;
+ isSuccess = !error;
+ }
+ } else {
+ // We extract error from statusText
+ // then normalize statusText and status for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ }
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes,
+ responseFields = s.responseFields;
+
+ // Fill responseXXX fields
+ for ( type in responseFields ) {
+ if ( type in responses ) {
+ jqXHR[ responseFields[type] ] = responses[ type ];
+ }
+ }
+
+ // Remove auto dataType and get content-type in the process
+ while( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+ var conv, conv2, current, tmp,
+ converters = {},
+ i = 0,
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice(),
+ prev = dataTypes[ 0 ];
+
+ // Apply the dataFilter if provided
+ if ( s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ // Convert to each sequential dataType, tolerating list modification
+ for ( ; (current = dataTypes[++i]); ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current !== "*" ) {
+
+ // Convert response if prev dataType is non-auto and differs from current
+ if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split(" ");
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.splice( i--, 0, current );
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s["throws"] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+
+ // Update prev for next iteration
+ prev = current;
+ }
+ }
+
+ return { state: "success", data: response };
+}
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /(?:java|ecma)script/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ s.global = false;
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+
+ var script,
+ head = document.head || jQuery("head")[0] || document.documentElement;
+
+ return {
+
+ send: function( _, callback ) {
+
+ script = document.createElement("script");
+
+ script.async = true;
+
+ if ( s.scriptCharset ) {
+ script.charset = s.scriptCharset;
+ }
+
+ script.src = s.url;
+
+ // Attach handlers for all browsers
+ script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+ if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+ // Handle memory leak in IE
+ script.onload = script.onreadystatechange = null;
+
+ // Remove the script
+ if ( script.parentNode ) {
+ script.parentNode.removeChild( script );
+ }
+
+ // Dereference the script
+ script = null;
+
+ // Callback if not abort
+ if ( !isAbort ) {
+ callback( 200, "success" );
+ }
+ }
+ };
+
+ // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+ // Use native DOM manipulation to avoid our domManip AJAX trickery
+ head.insertBefore( script, head.firstChild );
+ },
+
+ abort: function() {
+ if ( script ) {
+ script.onload( undefined, true );
+ }
+ }
+ };
+ }
+});
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function() {
+ // Restore preexisting value
+ window[ callbackName ] = overwritten;
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+ // make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+});
+var xhrCallbacks, xhrSupported,
+ xhrId = 0,
+ // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+ xhrOnUnloadAbort = window.ActiveXObject && function() {
+ // Abort all pending requests
+ var key;
+ for ( key in xhrCallbacks ) {
+ xhrCallbacks[ key ]( undefined, true );
+ }
+ };
+
+// Functions to create xhrs
+function createStandardXHR() {
+ try {
+ return new window.XMLHttpRequest();
+ } catch( e ) {}
+}
+
+function createActiveXHR() {
+ try {
+ return new window.ActiveXObject("Microsoft.XMLHTTP");
+ } catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+ /* Microsoft failed to properly
+ * implement the XMLHttpRequest in IE7 (can't request local files),
+ * so we use the ActiveXObject when it is available
+ * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+ * we need a fallback.
+ */
+ function() {
+ return !this.isLocal && createStandardXHR() || createActiveXHR();
+ } :
+ // For all other browsers, use the standard XMLHttpRequest object
+ createStandardXHR;
+
+// Determine support properties
+xhrSupported = jQuery.ajaxSettings.xhr();
+jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = jQuery.support.ajax = !!xhrSupported;
+
+// Create transport if the browser can provide an xhr
+if ( xhrSupported ) {
+
+ jQuery.ajaxTransport(function( s ) {
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( !s.crossDomain || jQuery.support.cors ) {
+
+ var callback;
+
+ return {
+ send: function( headers, complete ) {
+
+ // Get a new xhr
+ var handle, i,
+ xhr = s.xhr();
+
+ // Open the socket
+ // Passing null username, generates a login popup on Opera (#2865)
+ if ( s.username ) {
+ xhr.open( s.type, s.url, s.async, s.username, s.password );
+ } else {
+ xhr.open( s.type, s.url, s.async );
+ }
+
+ // Apply custom fields if provided
+ if ( s.xhrFields ) {
+ for ( i in s.xhrFields ) {
+ xhr[ i ] = s.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( s.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( s.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Need an extra try/catch for cross domain requests in Firefox 3
+ try {
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+ } catch( err ) {}
+
+ // Do send the request
+ // This may raise an exception which is actually
+ // handled in jQuery.ajax (so no try/catch here)
+ xhr.send( ( s.hasContent && s.data ) || null );
+
+ // Listener
+ callback = function( _, isAbort ) {
+
+ var status,
+ statusText,
+ responseHeaders,
+ responses,
+ xml;
+
+ // Firefox throws exceptions when accessing properties
+ // of an xhr when a network error occurred
+ // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+ try {
+
+ // Was never called and is aborted or complete
+ if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+ // Only called once
+ callback = undefined;
+
+ // Do not keep as active anymore
+ if ( handle ) {
+ xhr.onreadystatechange = jQuery.noop;
+ if ( xhrOnUnloadAbort ) {
+ delete xhrCallbacks[ handle ];
+ }
+ }
+
+ // If it's an abort
+ if ( isAbort ) {
+ // Abort it manually if needed
+ if ( xhr.readyState !== 4 ) {
+ xhr.abort();
+ }
+ } else {
+ responses = {};
+ status = xhr.status;
+ xml = xhr.responseXML;
+ responseHeaders = xhr.getAllResponseHeaders();
+
+ // Construct response list
+ if ( xml && xml.documentElement /* #4958 */ ) {
+ responses.xml = xml;
+ }
+
+ // When requesting binary data, IE6-9 will throw an exception
+ // on any attempt to access responseText (#11426)
+ if ( typeof xhr.responseText === "string" ) {
+ responses.text = xhr.responseText;
+ }
+
+ // Firefox throws an exception when accessing
+ // statusText for faulty cross-domain requests
+ try {
+ statusText = xhr.statusText;
+ } catch( e ) {
+ // We normalize with Webkit giving an empty statusText
+ statusText = "";
+ }
+
+ // Filter status for non standard behaviors
+
+ // If the request is local and we have data: assume a success
+ // (success with no data won't get notified, that's the best we
+ // can do given current implementations)
+ if ( !status && s.isLocal && !s.crossDomain ) {
+ status = responses.text ? 200 : 404;
+ // IE - #1450: sometimes returns 1223 when it should be 204
+ } else if ( status === 1223 ) {
+ status = 204;
+ }
+ }
+ }
+ } catch( firefoxAccessException ) {
+ if ( !isAbort ) {
+ complete( -1, firefoxAccessException );
+ }
+ }
+
+ // Call complete if needed
+ if ( responses ) {
+ complete( status, statusText, responses, responseHeaders );
+ }
+ };
+
+ if ( !s.async ) {
+ // if we're in sync mode we fire the callback
+ callback();
+ } else if ( xhr.readyState === 4 ) {
+ // (IE6 & IE7) if it's in cache and has been
+ // retrieved directly we need to fire the callback
+ setTimeout( callback );
+ } else {
+ handle = ++xhrId;
+ if ( xhrOnUnloadAbort ) {
+ // Create the active xhrs callbacks list if needed
+ // and attach the unload handler
+ if ( !xhrCallbacks ) {
+ xhrCallbacks = {};
+ jQuery( window ).unload( xhrOnUnloadAbort );
+ }
+ // Add to list of active xhrs callbacks
+ xhrCallbacks[ handle ] = callback;
+ }
+ xhr.onreadystatechange = callback;
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback( undefined, true );
+ }
+ }
+ };
+ }
+ });
+}
+var fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [function( prop, value ) {
+ var end, unit,
+ tween = this.createTween( prop, value ),
+ parts = rfxnum.exec( value ),
+ target = tween.cur(),
+ start = +target || 0,
+ scale = 1,
+ maxIterations = 20;
+
+ if ( parts ) {
+ end = +parts[2];
+ unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+ // We need to compute starting value
+ if ( unit !== "px" && start ) {
+ // Iteratively approximate from a nonzero starting point
+ // Prefer the current property, because this process will be trivial if it uses the same units
+ // Fallback to end or a simple constant
+ start = jQuery.css( tween.elem, prop, true ) || end || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*
+ // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+
+ tween.unit = unit;
+ tween.start = start;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+ }
+ return tween;
+ }]
+ };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
+}
+
+function createTweens( animation, props ) {
+ jQuery.each( props, function( prop, value ) {
+ var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( collection[ index ].call( animation, prop, value ) ) {
+
+ // we're done with this property
+ return;
+ }
+ }
+ });
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // if we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // resolve when we played the last frame
+ // otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
+ }
+ }
+
+ createTweens( animation, props );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // not quite $.extend, this wont overwrite keys already present.
+ // also - reusing 'index' from above because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
+});
+
+function defaultPrefilter( elem, props, opts ) {
+ /*jshint validthis:true */
+ var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
+ anim = this,
+ style = elem.style,
+ orig = {},
+ handled = [],
+ hidden = elem.nodeType && isHidden( elem );
+
+ // handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function() {
+ // doing this makes sure that the complete handler will be called
+ // before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE does not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ if ( jQuery.css( elem, "display" ) === "inline" &&
+ jQuery.css( elem, "float" ) === "none" ) {
+
+ // inline-level elements accept inline-block;
+ // block-level elements need to be inline with layout
+ if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+ style.display = "inline-block";
+
+ } else {
+ style.zoom = 1;
+ }
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ if ( !jQuery.support.shrinkWrapBlocks ) {
+ anim.done(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+ }
+
+
+ // show/hide pass
+ for ( index in props ) {
+ value = props[ index ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ index ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+ continue;
+ }
+ handled.push( index );
+ }
+ }
+
+ length = handled.length;
+ if ( length ) {
+ dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+
+ // store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+ jQuery._removeData( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( index = 0 ; index < length ; index++ ) {
+ prop = handled[ index ];
+ tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+ orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
+ }
+ }
+ }
+}
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // passing a non empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails
+ // so, simple values such as "10px" are parsed to Float.
+ // complex values such as "rotate(1rad)" are returned as is.
+ result = jQuery.css( tween.elem, tween.prop, "auto" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // use step hook for back compat - use cssHook if its there - use .style if its
+ // available and use plain properties where available
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Remove in 2.0 - this supports IE8's panic based approach
+// to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+});
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+ // animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+ doAnimation.finish = function() {
+ anim.stop( true );
+ };
+ // Empty animations, or finishing resolves immediately
+ if ( empty || jQuery._data( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = jQuery._data( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // start the next in the queue if the last step wasn't forced
+ // timers currently will call their complete callbacks, which will dequeue
+ // but only if they were gotoEnd
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = jQuery._data( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // enable finishing flag on private data
+ data.finish = true;
+
+ // empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.cur && hooks.cur.finish ) {
+ hooks.cur.finish.call( this );
+ }
+
+ // look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // turn off finishing flag
+ delete data.finish;
+ });
+ }
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ attrs = { height: type },
+ i = 0;
+
+ // if we include width, step value is 1 to do all cssExpand values,
+ // if we don't include width, step value is 2 to skip over Left and Right
+ includeWidth = includeWidth? 1 : 0;
+ for( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p*Math.PI ) / 2;
+ }
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+ var timer,
+ timers = jQuery.timers,
+ i = 0;
+
+ fxNow = jQuery.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ if ( timer() && jQuery.timers.push( timer ) ) {
+ jQuery.fx.start();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+ jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+ };
+}
+jQuery.fn.offset = function( options ) {
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ var docElem, win,
+ box = { top: 0, left: 0 },
+ elem = this[ 0 ],
+ doc = elem && elem.ownerDocument;
+
+ if ( !doc ) {
+ return;
+ }
+
+ docElem = doc.documentElement;
+
+ // Make sure it's not a disconnected DOM node
+ if ( !jQuery.contains( docElem, elem ) ) {
+ return box;
+ }
+
+ // If we don't have gBCR, just use 0,0 rather than error
+ // BlackBerry 5, iOS 3 (original iPhone)
+ if ( typeof elem.getBoundingClientRect !== "undefined" ) {
+ box = elem.getBoundingClientRect();
+ }
+ win = getWindow( doc );
+ return {
+ top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
+ left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+ };
+};
+
+jQuery.offset = {
+
+ setOffset: function( elem, options, i ) {
+ var position = jQuery.css( elem, "position" );
+
+ // set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ var curElem = jQuery( elem ),
+ curOffset = curElem.offset(),
+ curCSSTop = jQuery.css( elem, "top" ),
+ curCSSLeft = jQuery.css( elem, "left" ),
+ calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+ props = {}, curPosition = {}, curTop, curLeft;
+
+ // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+
+jQuery.fn.extend({
+
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset,
+ parentOffset = { top: 0, left: 0 },
+ elem = this[ 0 ];
+
+ // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+ // we assume that getBoundingClientRect is available when computed position is fixed
+ offset = elem.getBoundingClientRect();
+ } else {
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent();
+
+ // Get correct offsets
+ offset = this.offset();
+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ parentOffset = offsetParent.offset();
+ }
+
+ // Add offsetParent borders
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+ }
+
+ // Subtract parent offsets and element margins
+ // note: when an element has margin: auto the offsetLeft and marginLeft
+ // are the same in Safari causing offset.left to incorrectly be 0
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || document.documentElement;
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+ return offsetParent || document.documentElement;
+ });
+ }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+ var top = /Y/.test( prop );
+
+ jQuery.fn[ method ] = function( val ) {
+ return jQuery.access( this, function( elem, method, val ) {
+ var win = getWindow( elem );
+
+ if ( val === undefined ) {
+ return win ? (prop in win) ? win[ prop ] :
+ win.document.documentElement[ method ] :
+ elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : jQuery( win ).scrollLeft(),
+ top ? val : jQuery( win ).scrollTop()
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length, null );
+ };
+});
+
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ?
+ elem :
+ elem.nodeType === 9 ?
+ elem.defaultView || elem.parentWindow :
+ false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+ // margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return jQuery.access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( jQuery.isWindow( elem ) ) {
+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+ // isn't a whole lot we can do. See pull request at this URL for discussion:
+ // https://github.com/jquery/jquery/pull/764
+ return elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+ // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable, null );
+ };
+ });
+});
+// Limit scope pollution from any deprecated API
+// (function() {
+
+// })();
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+ define( "jquery", [], function () { return jQuery; } );
+}
+
+})( window ); \ No newline at end of file
diff --git a/addons/im_livechat/static/ext/static/js/livesupport.js b/addons/im_livechat/static/ext/static/js/livesupport.js
new file mode 100644
index 00000000000..0b9e52d2c07
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/js/livesupport.js
@@ -0,0 +1,446 @@
+
+define(["nova", "underscore", "oeclient", "require", "jquery",
+ "jquery.achtung"], function(nova, _, oeclient, require, $) {
+ var livesupport = {};
+
+ var templateEngine = new nova.TemplateEngine();
+ templateEngine.extendEnvironment({"toUrl": _.bind(require.toUrl, require)});
+ var connection;
+
+ var defaultInputPlaceholder;
+ var userName;
+
+ livesupport.main = function(server_url, db, login, password, channel, options) {
+ var defs = [];
+ options = options || {};
+ _.defaults(options, {
+ buttonText: "Chat with one of our collaborators",
+ inputPlaceholder: "How may I help you?",
+ defaultMessage: null,
+ auto: false,
+ userName: "Anonymous",
+ });
+ defaultInputPlaceholder = options.inputPlaceholder;
+ userName = options.userName;
+ defs.push($.ajax({
+ url: require.toUrl("./livesupport_templates.js"),
+ jsonp: false,
+ jsonpCallback: "oe_livesupport_templates_callback",
+ dataType: "jsonp",
+ cache: true,
+ }).then(function(content) {
+ return templateEngine.loadFileContent(content);
+ }));
+ defs.push(add_css("../css/livesupport.css"));
+ defs.push(add_css("./jquery.achtung.css"));
+
+ $.when.apply($, defs).then(function() {
+ console.log("starting live support customer app");
+ connection = new oeclient.Connection(new oeclient.JsonpRPCConnector(server_url), db, login, password);
+ connection.connector.call("/im_livechat/available", {db: db, channel: channel}).then(function(activated) {
+ if (! activated & ! options.auto)
+ return;
+ var button = new livesupport.ChatButton(null, channel, options);
+ button.appendTo($("body"));
+ if (options.auto)
+ button.click();
+ });
+ });
+ };
+
+ var add_css = function(relative_file_name) {
+ var css_def = $.Deferred();
+ $('<link rel="stylesheet" href="' + require.toUrl(relative_file_name) + '"></link>')
+ .appendTo($("head")).ready(function() {
+ css_def.resolve();
+ });
+ return css_def.promise();
+ };
+
+ var notification = function(message) {
+ $.achtung({message: message, timeout: 0, showEffects: false, hideEffects: false});
+ };
+
+ var ERROR_DELAY = 5000;
+
+ livesupport.ChatButton = nova.Widget.$extend({
+ className: "openerp_style oe_chat_button",
+ events: {
+ "click": "click",
+ },
+ __init__: function(parent, channel, options) {
+ this.$super(parent);
+ this.channel = channel;
+ this.options = options;
+ this.text = options.buttonText;
+ },
+ render: function() {
+ this.$().append(templateEngine.chatButton({widget: this}));
+ },
+ click: function() {
+ if (! this.manager) {
+ this.manager = new livesupport.ConversationManager(null);
+ this.activated_def = this.manager.start_polling();
+ }
+ var def = $.Deferred();
+ $.when(this.activated_def).then(function() {
+ def.resolve();
+ }, function() {
+ def.reject();
+ });
+ setTimeout(function() {
+ def.reject();
+ }, 5000);
+ def.then(_.bind(this.chat, this), function() {
+ notification("It seems the connection to the server is encountering problems, please try again later.");
+ });
+ },
+ chat: function() {
+ var self = this;
+ if (this.manager.conversations.length > 0)
+ return;
+ connection.getModel("im_livechat.channel").call("get_available_user", [this.channel]).then(function(user_id) {
+ if (! user_id) {
+ notification("None of our collaborators seems to be available, please try again later.");
+ return;
+ }
+ self.manager.ensure_users([user_id]).then(function() {
+ var conv = self.manager.activate_user(self.manager.get_user(user_id), true);
+ if (self.options.defaultMessage) {
+ conv.received_message({message: self.options.defaultMessage,
+ date: oeclient.datetime_to_str(new Date())});
+ }
+ });
+ });
+ },
+ });
+
+ livesupport.ImUser = nova.Class.$extend({
+ __include__: [nova.DynamicProperties],
+ __init__: function(parent, user_rec) {
+ nova.DynamicProperties.__init__.call(this, parent);
+ user_rec.image_url = require.toUrl("../img/avatar/avatar.jpeg");
+ if (user_rec.image)
+ user_rec.image_url = "data:image/png;base64," + user_rec.image;
+ this.set(user_rec);
+ this.set("watcher_count", 0);
+ this.on("change:watcher_count", this, function() {
+ if (this.get("watcher_count") === 0)
+ this.destroy();
+ });
+ },
+ destroy: function() {
+ this.trigger("destroyed");
+ nova.DynamicProperties.destroy.call(this);
+ },
+ add_watcher: function() {
+ this.set("watcher_count", this.get("watcher_count") + 1);
+ },
+ remove_watcher: function() {
+ this.set("watcher_count", this.get("watcher_count") - 1);
+ },
+ });
+
+ livesupport.ConversationManager = nova.Class.$extend({
+ __include__: [nova.DynamicProperties],
+ __init__: function(parent) {
+ nova.DynamicProperties.__init__.call(this, parent);
+ this.set("right_offset", 0);
+ this.conversations = [];
+ this.users = {};
+ this.on("change:right_offset", this, this.calc_positions);
+ this.set("window_focus", true);
+ this.set("waiting_messages", 0);
+ this.focus_hdl = _.bind(function() {
+ this.set("window_focus", true);
+ }, this);
+ $(window).bind("focus", this.focus_hdl);
+ this.blur_hdl = _.bind(function() {
+ this.set("window_focus", false);
+ }, this);
+ $(window).bind("blur", this.blur_hdl);
+ this.on("change:window_focus", this, this.window_focus_change);
+ this.window_focus_change();
+ this.on("change:waiting_messages", this, this.messages_change);
+ this.messages_change();
+ this.create_ting();
+ this.activated = false;
+ this.users_cache = {};
+ this.last = null;
+ this.unload_event_handler = _.bind(this.unload, this);
+ },
+ start_polling: function() {
+ var self = this;
+
+ var uuid = localStorage["oe_livesupport_uuid"];
+ var def = $.when(uuid);
+
+ if (! uuid) {
+ def = connection.connector.call("/longpolling/im/gen_uuid", {});
+ }
+ return def.then(function(uuid) {
+ localStorage["oe_livesupport_uuid"] = uuid;
+ return connection.getModel("im.user").call("get_by_user_id", [uuid]);
+ }).then(function(my_id) {
+ self.my_id = my_id["id"];
+ return connection.getModel("im.user").call("assign_name", [uuid, userName]);
+ }).then(function() {
+ return self.ensure_users([self.my_id])
+ }).then(function() {
+ var me = self.users_cache[self.my_id];
+ delete self.users_cache[self.my_id];
+ self.me = me;
+ me.set("name", "You");
+ return connection.connector.call("/longpolling/im/activated", {});
+ }).then(function(activated) {
+ if (activated) {
+ self.activated = true;
+ $(window).on("unload", self.unload_event_handler);
+ self.poll();
+ } else {
+ return $.Deferred().reject();
+ }
+ });
+ },
+ unload: function() {
+ connection.getModel("im.user").call("im_disconnect", [], {uuid: this.me.get("uuid"), context: {}});
+ },
+ ensure_users: function(user_ids) {
+ var no_cache = {};
+ _.each(user_ids, function(el) {
+ if (! this.users_cache[el])
+ no_cache[el] = el;
+ }, this);
+ var self = this;
+ if (_.size(no_cache) === 0)
+ return $.when();
+ else
+ return connection.getModel("im.user").call("read", [_.values(no_cache), []]).then(function(users) {
+ self.add_to_user_cache(users);
+ });
+ },
+ add_to_user_cache: function(user_recs) {
+ _.each(user_recs, function(user_rec) {
+ if (! this.users_cache[user_rec.id]) {
+ var user = new livesupport.ImUser(this, user_rec);
+ this.users_cache[user_rec.id] = user;
+ user.on("destroyed", this, function() {
+ delete this.users_cache[user_rec.id];
+ });
+ }
+ }, this);
+ },
+ get_user: function(user_id) {
+ return this.users_cache[user_id];
+ },
+ poll: function() {
+ console.debug("live support beggin polling");
+ var self = this;
+ var user_ids = _.map(this.users_cache, function(el) {
+ return el.get("id");
+ });
+ connection.connector.call("/longpolling/im/poll", {
+ last: this.last,
+ users_watch: user_ids,
+ db: connection.database,
+ uid: connection.userId,
+ password: connection.password,
+ uuid: self.me.get("uuid"),
+ }).then(function(result) {
+ _.each(result.users_status, function(el) {
+ if (self.get_user(el.id))
+ self.get_user(el.id).set(el);
+ });
+ self.last = result.last;
+ var user_ids = _.pluck(_.pluck(result.res, "from_id"), 0);
+ self.ensure_users(user_ids).then(function() {
+ _.each(result.res, function(mes) {
+ var user = self.get_user(mes.from_id[0]);
+ self.received_message(mes, user);
+ });
+ self.poll();
+ });
+ }, function() {
+ setTimeout(_.bind(self.poll, self), ERROR_DELAY);
+ });
+ },
+ get_activated: function() {
+ return this.activated;
+ },
+ create_ting: function() {
+ this.ting = new Audio(new Audio().canPlayType("audio/ogg; codecs=vorbis") ?
+ require.toUrl("../audio/Ting.ogg") :
+ require.toUrl("../audio/Ting.mp3")
+ );
+ },
+ window_focus_change: function() {
+ if (this.get("window_focus")) {
+ this.set("waiting_messages", 0);
+ }
+ },
+ messages_change: function() {
+ /*if (! instance.webclient.set_title_part)
+ return;
+ instance.webclient.set_title_part("im_messages", this.get("waiting_messages") === 0 ? undefined :
+ _.str.sprintf(_t("%d Messages"), this.get("waiting_messages")));*/
+ },
+ activate_user: function(user, focus) {
+ var conv = this.users[user.get('id')];
+ if (! conv) {
+ conv = new livesupport.Conversation(this, user, this.me);
+ conv.appendTo($("body"));
+ conv.on("destroyed", this, function() {
+ this.conversations = _.without(this.conversations, conv);
+ delete this.users[conv.user.get('id')];
+ this.calc_positions();
+ });
+ this.conversations.push(conv);
+ this.users[user.get('id')] = conv;
+ this.calc_positions();
+ }
+ if (focus)
+ conv.focus();
+ return conv;
+ },
+ received_message: function(message, user) {
+ if (! this.get("window_focus")) {
+ this.set("waiting_messages", this.get("waiting_messages") + 1);
+ this.ting.play();
+ this.create_ting();
+ }
+ var conv = this.activate_user(user);
+ conv.received_message(message);
+ },
+ calc_positions: function() {
+ var current = this.get("right_offset");
+ _.each(_.range(this.conversations.length), function(i) {
+ this.conversations[i].set("right_position", current);
+ current += this.conversations[i].$().outerWidth(true);
+ }, this);
+ },
+ destroy: function() {
+ $(window).off("unload", this.unload_event_handler);
+ $(window).unbind("blur", this.blur_hdl);
+ $(window).unbind("focus", this.focus_hdl);
+ nova.DynamicProperties.destroy.call(this);
+ },
+ });
+
+ livesupport.Conversation = nova.Widget.$extend({
+ className: "openerp_style oe_im_chatview",
+ events: {
+ "keydown input": "send_message",
+ "click .oe_im_chatview_close": "destroy",
+ "click .oe_im_chatview_header": "show_hide",
+ },
+ __init__: function(parent, user, me) {
+ this.$super(parent);
+ this.me = me;
+ this.user = user;
+ this.user.add_watcher();
+ this.set("right_position", 0);
+ this.shown = true;
+ this.set("pending", 0);
+ this.inputPlaceholder = defaultInputPlaceholder;
+ },
+ render: function() {
+ this.$().append(templateEngine.conversation({widget: this}));
+ var change_status = function() {
+ this.$().toggleClass("oe_im_chatview_disconnected_status", this.user.get("im_status") === false);
+ this.$(".oe_im_chatview_online").toggle(this.user.get("im_status") === true);
+ this._go_bottom();
+ };
+ this.user.on("change:im_status", this, change_status);
+ change_status.call(this);
+
+ this.on("change:right_position", this, this.calc_pos);
+ this.full_height = this.$().height();
+ this.calc_pos();
+ this.on("change:pending", this, _.bind(function() {
+ if (this.get("pending") === 0) {
+ this.$(".oe_im_chatview_nbr_messages").text("");
+ } else {
+ this.$(".oe_im_chatview_nbr_messages").text("(" + this.get("pending") + ")");
+ }
+ }, this));
+ },
+ show_hide: function() {
+ if (this.shown) {
+ this.$().animate({
+ height: this.$(".oe_im_chatview_header").outerHeight(),
+ });
+ } else {
+ this.$().animate({
+ height: this.full_height,
+ });
+ }
+ this.shown = ! this.shown;
+ if (this.shown) {
+ this.set("pending", 0);
+ }
+ },
+ calc_pos: function() {
+ this.$().css("right", this.get("right_position"));
+ },
+ received_message: function(message) {
+ if (this.shown) {
+ this.set("pending", 0);
+ } else {
+ this.set("pending", this.get("pending") + 1);
+ }
+ this._add_bubble(this.user, message.message, oeclient.str_to_datetime(message.date));
+ },
+ send_message: function(e) {
+ if(e && e.which !== 13) {
+ return;
+ }
+ var mes = this.$("input").val();
+ this.$("input").val("");
+ var send_it = _.bind(function() {
+ var model = connection.getModel("im.message");
+ return model.call("post", [mes, this.user.get('id')], {uuid: this.me.get("uuid"), context: {}});
+ }, this);
+ var tries = 0;
+ send_it().then(_.bind(function() {
+ this._add_bubble(this.me, mes, new Date());
+ }, this), function(error, e) {
+ tries += 1;
+ if (tries < 3)
+ return send_it();
+ });
+ },
+ _add_bubble: function(user, item, date) {
+ var items = [item];
+ if (user === this.last_user) {
+ this.last_bubble.remove();
+ items = this.last_items.concat(items);
+ }
+ this.last_user = user;
+ this.last_items = items;
+ var zpad = function(str, size) {
+ str = "" + str;
+ return new Array(size - str.length + 1).join('0') + str;
+ };
+ date = "" + zpad(date.getHours(), 2) + ":" + zpad(date.getMinutes(), 2);
+
+ this.last_bubble = $(templateEngine.conversation_bubble({"items": items, "user": user, "time": date}));
+ $(this.$(".oe_im_chatview_content").children()[0]).append(this.last_bubble);
+ this._go_bottom();
+ },
+ _go_bottom: function() {
+ this.$(".oe_im_chatview_content").scrollTop($(this.$(".oe_im_chatview_content").children()[0]).height());
+ },
+ focus: function() {
+ this.$(".oe_im_chatview_input").focus();
+ },
+ destroy: function() {
+ this.user.remove_watcher();
+ this.trigger("destroyed");
+ return this.$super();
+ },
+ });
+
+
+
+ return livesupport;
+});
diff --git a/addons/im_livechat/static/ext/static/js/livesupport_templates.html b/addons/im_livechat/static/ext/static/js/livesupport_templates.html
new file mode 100644
index 00000000000..54cdf450dc1
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/js/livesupport_templates.html
@@ -0,0 +1,36 @@
+
+<%def name="conversation">
+ <div class="oe_im_chatview_header">
+ <img src="${toUrl('../img/green.png')}" class="oe_im_chatview_online"/>
+ ${widget.user.get('name') || 'You'}
+ <button class="oe_im_chatview_close">×</button>
+ </div>
+ <div class="oe_im_chatview_disconnected">
+ ${widget.user.get("name") + " is offline. He/She will receive your messages on his/her next connection."}
+ </div>
+ <div class="oe_im_chatview_content">
+ <div></div>
+ </div>
+ <div class="oe_im_chatview_footer">
+ <input class="oe_im_chatview_input" placeholder="${widget.inputPlaceholder}" />
+ </div>
+</%def>
+
+<%def name="conversation_bubble">
+ <div class="oe_im_chatview_bubble">
+ <div class="oe_im_chatview_clip">
+ <img class="oe_im_chatview_avatar" src="${user.get('image_url')}"/>
+ </div>
+ <div class="oe_im_chatview_from">${user.get('name') || 'You'}</div>
+ <div class="oe_im_chatview_bubble_list">
+ % _.each(items, function(item) {
+ <div class="oe_im_chatview_bubble_item">${item}</div>
+ % });
+ </div>
+ <div class="oe_im_chatview_time">${time}</div>
+ </div>
+</%def>
+
+<%def name="chatButton">
+ ${widget.text}
+</%def> \ No newline at end of file
diff --git a/addons/im_livechat/static/ext/static/js/livesupport_templates.js b/addons/im_livechat/static/ext/static/js/livesupport_templates.js
new file mode 100644
index 00000000000..aaabfd38caf
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/js/livesupport_templates.js
@@ -0,0 +1 @@
+window.oe_livesupport_templates_callback("\n<%def name=\"conversation\">\n <div class=\"oe_im_chatview_header\">\n <img src=\"${toUrl('../img/green.png')}\" class=\"oe_im_chatview_online\"/>\n ${widget.user.get('name') || 'You'}\n <button class=\"oe_im_chatview_close\">\u00d7</button>\n </div>\n <div class=\"oe_im_chatview_disconnected\">\n ${widget.user.get(\"name\") + \" is offline. He/She will receive your messages on his/her next connection.\"}\n </div>\n <div class=\"oe_im_chatview_content\">\n <div></div>\n </div>\n <div class=\"oe_im_chatview_footer\">\n <input class=\"oe_im_chatview_input\" placeholder=\"${widget.inputPlaceholder}\" />\n </div>\n</%def>\n\n<%def name=\"conversation_bubble\">\n <div class=\"oe_im_chatview_bubble\">\n <div class=\"oe_im_chatview_clip\">\n <img class=\"oe_im_chatview_avatar\" src=\"${user.get('image_url')}\"/>\n </div>\n <div class=\"oe_im_chatview_from\">${user.get('name') || 'You'}</div>\n <div class=\"oe_im_chatview_bubble_list\">\n % _.each(items, function(item) {\n <div class=\"oe_im_chatview_bubble_item\">${item}</div>\n % });\n </div>\n <div class=\"oe_im_chatview_time\">${time}</div>\n </div>\n</%def>\n\n<%def name=\"chatButton\">\n ${widget.text}\n</%def>");
diff --git a/addons/im_livechat/static/ext/static/js/nova.js b/addons/im_livechat/static/ext/static/js/nova.js
new file mode 100644
index 00000000000..eee00741fb6
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/js/nova.js
@@ -0,0 +1,988 @@
+/*
+Copyright (c) 2012, Nicolas Vanhoren
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+(function() {
+
+if (typeof(define) !== "undefined") { // requirejs
+ define(["jquery", "underscore"], nova_declare);
+} else if (typeof(exports) !== "undefined") { // node
+ var _ = require("underscore")
+ _.extend(exports, nova_declare(null, _));
+} else { // define global variable 'nova'
+ nova = nova_declare($, _);
+}
+
+function nova_declare($, _) {
+ var nova = {};
+ nova.internal = {};
+
+ /*
+ * Modified Armin Ronacher's Classy library.
+ *
+ * Defines The Class object. That object can be used to define and inherit classes using
+ * the $extend() method.
+ *
+ * Example:
+ *
+ * var Person = nova.Class.$extend({
+ * __init__: function(isDancing){
+ * this.dancing = isDancing;
+ * },
+ * dance: function(){
+ * return this.dancing;
+ * }
+ * });
+ *
+ * The __init__() method act as a constructor. This class can be instancied this way:
+ *
+ * var person = new Person(true);
+ * person.dance();
+ *
+ * The Person class can also be extended again:
+ *
+ * var Ninja = Person.$extend({
+ * __init__: function(){
+ * this.$super( false );
+ * },
+ * dance: function(){
+ * // Call the inherited version of dance()
+ * return this.$super();
+ * },
+ * swingSword: function(){
+ * return true;
+ * }
+ * });
+ *
+ * When extending a class, each re-defined method can use this.$super() to call the previous
+ * implementation of that method.
+ */
+ /**
+ * Classy - classy classes for JavaScript
+ *
+ * :copyright: (c) 2011 by Armin Ronacher.
+ * :license: BSD.
+ */
+ (function(){
+ var
+ context = this,
+ disable_constructor = false;
+
+ /* we check if $super is in use by a class if we can. But first we have to
+ check if the JavaScript interpreter supports that. This also matches
+ to false positives later, but that does not do any harm besides slightly
+ slowing calls down. */
+ var probe_super = (function(){this.$super();}).toString().indexOf('$super') > 0;
+ function usesSuper(obj) {
+ return !probe_super || /\B\$super\b/.test(obj.toString());
+ }
+
+ /* helper function to set the attribute of something to a value or
+ removes it if the value is undefined. */
+ function setOrUnset(obj, key, value) {
+ if (value === undefined)
+ delete obj[key];
+ else
+ obj[key] = value;
+ }
+
+ /* gets the own property of an object */
+ function getOwnProperty(obj, name) {
+ return Object.prototype.hasOwnProperty.call(obj, name)
+ ? obj[name] : undefined;
+ }
+
+ /* instanciate a class without calling the constructor */
+ function cheapNew(cls) {
+ disable_constructor = true;
+ var rv = new cls;
+ disable_constructor = false;
+ return rv;
+ }
+
+ /* the base class we export */
+ var Class = function() {};
+
+ /* extend functionality */
+ Class.$extend = function(properties) {
+ var super_prototype = this.prototype;
+
+ /* disable constructors and instanciate prototype. Because the
+ prototype can't raise an exception when created, we are safe
+ without a try/finally here. */
+ var prototype = cheapNew(this);
+
+ /* copy all properties of the includes over if there are any */
+ prototype.__mixin_ids = _.clone(prototype.__mixin_ids || {});
+ if (properties.__include__)
+ for (var i = 0, n = properties.__include__.length; i != n; ++i) {
+ var mixin = properties.__include__[i];
+ if (mixin instanceof nova.Mixin) {
+ _.extend(prototype.__mixin_ids, mixin.__mixin_ids);
+ mixin = mixin.__mixin_properties;
+ }
+ for (var name in mixin) {
+ var value = getOwnProperty(mixin, name);
+ if (value !== undefined)
+ prototype[name] = mixin[name];
+ }
+ }
+
+ /* copy class vars from the superclass */
+ properties.__classvars__ = properties.__classvars__ || {};
+ if (prototype.__classvars__)
+ for (var key in prototype.__classvars__)
+ if (!properties.__classvars__[key]) {
+ var value = getOwnProperty(prototype.__classvars__, key);
+ properties.__classvars__[key] = value;
+ }
+
+ /* copy all properties over to the new prototype */
+ for (var name in properties) {
+ var value = getOwnProperty(properties, name);
+ if (name === '__include__' ||
+ value === undefined)
+ continue;
+
+ prototype[name] = typeof value === 'function' && usesSuper(value) ?
+ (function(meth, name) {
+ return function() {
+ var old_super = getOwnProperty(this, '$super');
+ this.$super = super_prototype[name];
+ try {
+ return meth.apply(this, arguments);
+ }
+ finally {
+ setOrUnset(this, '$super', old_super);
+ }
+ };
+ })(value, name) : value
+ }
+
+ var class_init = this.__class_init__ || function() {};
+ var p_class_init = prototype.__class_init__ || function() {};
+ delete prototype.__class_init__;
+ var n_class_init = function() {
+ class_init.apply(null, arguments);
+ p_class_init.apply(null, arguments);
+ }
+ n_class_init(prototype);
+
+ /* dummy constructor */
+ var instance = function() {
+ if (disable_constructor)
+ return;
+ var proper_this = context === this ? cheapNew(arguments.callee) : this;
+ if (proper_this.__init__)
+ proper_this.__init__.apply(proper_this, arguments);
+ proper_this.$class = instance;
+ return proper_this;
+ }
+
+ /* copy all class vars over of any */
+ for (var key in properties.__classvars__) {
+ var value = getOwnProperty(properties.__classvars__, key);
+ if (value !== undefined)
+ instance[key] = value;
+ }
+
+ /* copy prototype and constructor over, reattach $extend and
+ return the class */
+ instance.prototype = prototype;
+ instance.constructor = instance;
+ instance.$extend = this.$extend;
+ instance.$withData = this.$withData;
+ instance.__class_init__ = n_class_init;
+ return instance;
+ };
+
+ /* instanciate with data functionality */
+ Class.$withData = function(data) {
+ var rv = cheapNew(this);
+ for (var key in data) {
+ var value = getOwnProperty(data, key);
+ if (value !== undefined)
+ rv[key] = value;
+ }
+ return rv;
+ };
+
+ /* export the class */
+ this.Class = Class;
+ }).call(nova);
+ // end of Armin Ronacher's code
+
+ var mixinId = 1;
+ nova.Mixin = nova.Class.$extend({
+ __init__: function() {
+ this.__mixin_properties = {};
+ this.__mixin_id = mixinId;
+ mixinId++;
+ this.__mixin_ids = {};
+ this.__mixin_ids[this.__mixin_id] = true;
+ _.each(_.toArray(arguments), function(el) {
+ if (el instanceof nova.Mixin) {
+ _.extend(this.__mixin_properties, el.__mixin_properties);
+ _.extend(this.__mixin_ids, el.__mixin_ids);
+ } else { // object
+ _.extend(this.__mixin_properties, el)
+ }
+ }, this);
+ _.extend(this, this.__mixin_properties);
+ }
+ });
+
+ nova.Interface = nova.Mixin.$extend({
+ __init__: function() {
+ var lst = [];
+ _.each(_.toArray(arguments), function(el) {
+ if (el instanceof nova.Interface) {
+ lst.push(el);
+ } else if (el instanceof nova.Mixin) {
+ var tmp = new nova.Interface(el.__mixin_properties);
+ tmp.__mixin_ids = el.__mixin_ids;
+ lst.push(tmp);
+ } else { // object
+ var nprops = {};
+ _.each(el, function(v, k) {
+ nprops[k] = function() {
+ throw new nova.NotImplementedError();
+ };
+ });
+ lst.push(nprops);
+ }
+ });
+ this.$super.apply(this, lst);
+ }
+ });
+
+ nova.hasMixin = function(object, mixin) {
+ if (! object)
+ return false;
+ return (object.__mixin_ids || {})[mixin.__mixin_id] === true;
+ };
+
+ var ErrorBase = function() {
+ };
+ ErrorBase.prototype = new Error();
+ ErrorBase.$extend = nova.Class.$extend;
+ ErrorBase.$withData = nova.Class.$withData;
+
+ nova.Error = ErrorBase.$extend({
+ name: "nova.Error",
+ defaultMessage: "",
+ __init__: function(message) {
+ this.message = message || this.defaultMessage;
+ }
+ });
+
+ nova.NotImplementedError = nova.Error.$extend({
+ name: "nova.NotImplementedError",
+ defaultMessage: "This method is not implemented"
+ });
+
+ nova.InvalidArgumentError = nova.Error.$extend({
+ name: "nova.InvalidArgumentError"
+ });
+
+ /**
+ * Mixin to express the concept of destroying an object.
+ * When an object is destroyed, it should release any resource
+ * it could have reserved before.
+ */
+ nova.Destroyable = new nova.Mixin({
+ __init__: function() {
+ this.__destroyableDestroyed = false;
+ },
+ /**
+ * Returns true if destroy() was called on the current object.
+ */
+ isDestroyed : function() {
+ return this.__destroyableDestroyed;
+ },
+ /**
+ * Inform the object it should destroy itself, releasing any
+ * resource it could have reserved.
+ */
+ destroy : function() {
+ this.__destroyableDestroyed = true;
+ }
+ });
+
+ /**
+ * Mixin to structure objects' life-cycles folowing a parent-children
+ * relationship. Each object can a have a parent and multiple children.
+ * When an object is destroyed, all its children are destroyed too.
+ */
+ nova.Parented = new nova.Mixin(nova.Destroyable, {
+ __parentedMixin : true,
+ __init__: function() {
+ nova.Destroyable.__init__.apply(this);
+ this.__parentedChildren = [];
+ this.__parentedParent = null;
+ },
+ /**
+ * Set the parent of the current object. When calling this method, the
+ * parent will also be informed and will return the current object
+ * when its getChildren() method is called. If the current object did
+ * already have a parent, it is unregistered before, which means the
+ * previous parent will not return the current object anymore when its
+ * getChildren() method is called.
+ */
+ setParent : function(parent) {
+ if (this.getParent()) {
+ if (this.getParent().__parentedMixin) {
+ this.getParent().__parentedChildren = _.without(this
+ .getParent().getChildren(), this);
+ }
+ }
+ this.__parentedParent = parent;
+ if (parent && parent.__parentedMixin) {
+ parent.__parentedChildren.push(this);
+ }
+ },
+ /**
+ * Return the current parent of the object (or null).
+ */
+ getParent : function() {
+ return this.__parentedParent;
+ },
+ /**
+ * Return a list of the children of the current object.
+ */
+ getChildren : function() {
+ return _.clone(this.__parentedChildren);
+ },
+ destroy : function() {
+ _.each(this.getChildren(), function(el) {
+ el.destroy();
+ });
+ this.setParent(undefined);
+ nova.Destroyable.destroy.apply(this);
+ }
+ });
+
+ /*
+ * Yes, we steal Backbone's events :)
+ *
+ * This class just handle the dispatching of events, it is not meant to be extended,
+ * nor used directly. All integration with parenting and automatic unregistration of
+ * events is done in the mixin EventDispatcher.
+ */
+ // (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.
+ // Backbone may be freely distributed under the MIT license.
+ // For all details and documentation:
+ // http://backbonejs.org
+ nova.internal.Events = nova.Class.$extend({
+ on : function(events, callback, context) {
+ var ev;
+ events = events.split(/\s+/);
+ var calls = this._callbacks || (this._callbacks = {});
+ while (ev = events.shift()) {
+ var list = calls[ev] || (calls[ev] = {});
+ var tail = list.tail || (list.tail = list.next = {});
+ tail.callback = callback;
+ tail.context = context;
+ list.tail = tail.next = {};
+ }
+ return this;
+ },
+ off : function(events, callback, context) {
+ var ev, calls, node;
+ if (!events) {
+ delete this._callbacks;
+ } else if (calls = this._callbacks) {
+ events = events.split(/\s+/);
+ while (ev = events.shift()) {
+ node = calls[ev];
+ delete calls[ev];
+ if (!callback || !node)
+ continue;
+ while ((node = node.next) && node.next) {
+ if (node.callback === callback
+ && (!context || node.context === context))
+ continue;
+ this.on(ev, node.callback, node.context);
+ }
+ }
+ }
+ return this;
+ },
+ callbackList: function() {
+ var lst = [];
+ _.each(this._callbacks || {}, function(el, eventName) {
+ var node = el;
+ while ((node = node.next) && node.next) {
+ lst.push([eventName, node.callback, node.context]);
+ }
+ });
+ return lst;
+ },
+ trigger : function(events) {
+ var event, node, calls, tail, args, all, rest;
+ if (!(calls = this._callbacks))
+ return this;
+ all = calls['all'];
+ (events = events.split(/\s+/)).push(null);
+ // Save references to the current heads & tails.
+ while (event = events.shift()) {
+ if (all)
+ events.push({
+ next : all.next,
+ tail : all.tail,
+ event : event
+ });
+ if (!(node = calls[event]))
+ continue;
+ events.push({
+ next : node.next,
+ tail : node.tail
+ });
+ }
+ rest = Array.prototype.slice.call(arguments, 1);
+ while (node = events.pop()) {
+ tail = node.tail;
+ args = node.event ? [ node.event ].concat(rest) : rest;
+ while ((node = node.next) !== tail) {
+ node.callback.apply(node.context || this, args);
+ }
+ }
+ return this;
+ }
+ });
+ // end of Backbone's events class
+
+ nova.EventDispatcher = new nova.Mixin(nova.Parented, {
+ __eventDispatcherMixin: true,
+ __init__: function() {
+ nova.Parented.__init__.apply(this);
+ this.__edispatcherEvents = new nova.internal.Events();
+ this.__edispatcherRegisteredEvents = [];
+ },
+ on: function(events, dest, func) {
+ var self = this;
+ events = events.split(/\s+/);
+ _.each(events, function(eventName) {
+ self.__edispatcherEvents.on(eventName, func, dest);
+ if (dest && dest.__eventDispatcherMixin) {
+ dest.__edispatcherRegisteredEvents.push({name: eventName, func: func, source: self});
+ }
+ });
+ return this;
+ },
+ off: function(events, dest, func) {
+ var self = this;
+ events = events.split(/\s+/);
+ _.each(events, function(eventName) {
+ self.__edispatcherEvents.off(eventName, func, dest);
+ if (dest && dest.__eventDispatcherMixin) {
+ dest.__edispatcherRegisteredEvents = _.filter(dest.__edispatcherRegisteredEvents, function(el) {
+ return !(el.name === eventName && el.func === func && el.source === self);
+ });
+ }
+ });
+ return this;
+ },
+ trigger: function(events) {
+ this.__edispatcherEvents.trigger.apply(this.__edispatcherEvents, arguments);
+ return this;
+ },
+ destroy: function() {
+ var self = this;
+ _.each(this.__edispatcherRegisteredEvents, function(event) {
+ event.source.__edispatcherEvents.off(event.name, event.func, self);
+ });
+ this.__edispatcherRegisteredEvents = [];
+ _.each(this.__edispatcherEvents.callbackList(), function(cal) {
+ this.off(cal[0], cal[2], cal[1]);
+ }, this);
+ this.__edispatcherEvents.off();
+ nova.Parented.destroy.apply(this);
+ }
+ });
+
+ nova.Properties = new nova.Mixin(nova.EventDispatcher, {
+ __class_init__: function(proto) {
+ var props = {};
+ _.each(proto.__properties || {}, function(v, k) {
+ props[k] = _.clone(v);
+ });
+ _.each(proto, function(v, k) {
+ if (typeof v === "function") {
+ var res = /^((?:get)|(?:set))([A-Z]\w*)$/.exec(k);
+ if (! res)
+ return;
+ var name = res[2][0].toLowerCase() + res[2].slice(1);
+ var prop = props[name] || (props[name] = {});
+ prop[res[1]] = v;
+ }
+ });
+ proto.__properties = props;
+ },
+ __init__: function() {
+ nova.EventDispatcher.__init__.apply(this);
+ this.__dynamicProperties = {};
+ },
+ set: function(arg1, arg2) {
+ var self = this;
+ var map;
+ if (typeof arg1 === "string") {
+ map = {};
+ map[arg1] = arg2;
+ } else {
+ map = arg1;
+ }
+ var tmp_set = this.__props_setting;
+ this.__props_setting = false;
+ _.each(map, function(val, key) {
+ var prop = self.__properties[key];
+ if (prop) {
+ if (! prop.set)
+ throw new nova.InvalidArgumentError("Property " + key + " does not have a setter method.");
+ prop.set.call(self, val);
+ } else {
+ self.fallbackSet(key, val);
+ }
+ });
+ this.__props_setting = tmp_set;
+ if (! this.__props_setting && this.__props_setted) {
+ this.__props_setted = false;
+ self.trigger("change", self);
+ }
+ },
+ get: function(key) {
+ var prop = this.__properties[key];
+ if (prop) {
+ if (! prop.get)
+ throw new nova.InvalidArgumentError("Property " + key + " does not have a getter method.");
+ return prop.get.call(this);
+ } else {
+ return this.fallbackGet(key);
+ }
+ },
+ fallbackSet: function(key, val) {
+ throw new nova.InvalidArgumentError("Property " + key + " is not defined.");
+ },
+ fallbackGet: function(key) {
+ throw new nova.InvalidArgumentError("Property " + key + " is not defined.");
+ },
+ trigger: function(name) {
+ nova.EventDispatcher.trigger.apply(this, arguments);
+ if (/(\s|^)change\:.*/.exec(name)) {
+ if (! this.__props_setting)
+ this.trigger("change");
+ else
+ this.__props_setted = true;
+ }
+ }
+ });
+
+ nova.DynamicProperties = new nova.Mixin(nova.Properties, {
+ __init__: function() {
+ nova.Properties.__init__.apply(this);
+ this.__dynamicProperties = {};
+ },
+ fallbackSet: function(key, val) {
+ var tmp = this.__dynamicProperties[key];
+ if (tmp === val)
+ return;
+ this.__dynamicProperties[key] = val;
+ this.trigger("change:" + key, this, {
+ oldValue: tmp,
+ newValue: val
+ });
+ },
+ fallbackGet: function(key) {
+ return this.__dynamicProperties[key];
+ }
+ });
+
+ nova.Widget = nova.Class.$extend({
+ __include__ : [nova.DynamicProperties],
+ tagName: 'div',
+ className: '',
+ attributes: {},
+ events: {},
+ __init__: function(parent) {
+ nova.Properties.__init__.apply(this);
+ this.__widget_element = $(document.createElement(this.tagName));
+ this.$().addClass(this.className);
+ _.each(this.attributes, function(val, key) {
+ this.$().attr(key, val);
+ }, this);
+ _.each(this.events, function(val, key) {
+ key = key.split(" ");
+ val = _.bind(typeof val === "string" ? this[val] : val, this);
+ if (key.length > 1) {
+ this.$().on(key[0], key[1], val);
+ } else {
+ this.$().on(key[0], val);
+ }
+ }, this);
+
+ this.setParent(parent);
+ },
+ $: function(attr) {
+ if (attr)
+ return this.__widget_element.find.apply(this.__widget_element, arguments);
+ else
+ return this.__widget_element;
+ },
+ /**
+ * Destroys the current widget, also destroys all its children before destroying itself.
+ */
+ destroy: function() {
+ _.each(this.getChildren(), function(el) {
+ el.destroy();
+ });
+ this.$().remove();
+ nova.Properties.destroy.apply(this);
+ },
+ /**
+ * Renders the current widget and appends it to the given jQuery object or Widget.
+ *
+ * @param target A jQuery object or a Widget instance.
+ */
+ appendTo: function(target) {
+ this.$().appendTo(target);
+ return this.render();
+ },
+ /**
+ * Renders the current widget and prepends it to the given jQuery object or Widget.
+ *
+ * @param target A jQuery object or a Widget instance.
+ */
+ prependTo: function(target) {
+ this.$().prependTo(target);
+ return this.render();
+ },
+ /**
+ * Renders the current widget and inserts it after to the given jQuery object or Widget.
+ *
+ * @param target A jQuery object or a Widget instance.
+ */
+ insertAfter: function(target) {
+ this.$().insertAfter(target);
+ return this.render();
+ },
+ /**
+ * Renders the current widget and inserts it before to the given jQuery object or Widget.
+ *
+ * @param target A jQuery object or a Widget instance.
+ */
+ insertBefore: function(target) {
+ this.$().insertBefore(target);
+ return this.render();
+ },
+ /**
+ * Renders the current widget and replaces the given jQuery object.
+ *
+ * @param target A jQuery object or a Widget instance.
+ */
+ replace: function(target) {
+ this.$().replace(target);
+ return this.render();
+ },
+ /**
+ * This is the method to implement to render the Widget.
+ */
+ render: function() {}
+ });
+
+ /*
+ Nova Template Engine
+ */
+ var escape_ = function(text) {
+ return JSON.stringify(text);
+ }
+ var indent_ = function(txt) {
+ var tmp = _.map(txt.split("\n"), function(x) { return " " + x; });
+ tmp.pop();
+ tmp.push("");
+ return tmp.join("\n");
+ };
+ var tparams = {
+ def_begin: /<%\s*def\s+(?:name=(?:(?:"(.+?)")|(?:'(.+?)')))\s*>/g,
+ def_end: /<\/%\s*def\s*>/g,
+ comment_multi_begin: /<%\s*doc\s*>/g,
+ comment_multi_end: /<\/%\s*doc\s*>/g,
+ eval_long_begin: /<%/g,
+ eval_long_end: /%>/g,
+ eval_short_begin: /(?:^|\n)[[ \t]*%(?!{)/g,
+ eval_short_end: /\n|$/g,
+ escape_begin: /\${/g,
+ interpolate_begin: /%{/g,
+ comment_begin: /##/g,
+ comment_end: /\n|$/g
+ };
+ // /<%\s*def\s+(?:name=(?:"(.+?)"))\s*%>([\s\S]*?)<%\s*def\s*%>/g
+ var allbegin = new RegExp(
+ "((?:\\\\)*)(" +
+ "(" + tparams.def_begin.source + ")|" +
+ "(" + tparams.def_end.source + ")|" +
+ "(" + tparams.comment_multi_begin.source + ")|" +
+ "(" + tparams.eval_long_begin.source + ")|" +
+ "(" + tparams.interpolate_begin.source + ")|" +
+ "(" + tparams.eval_short_begin.source + ")|" +
+ "(" + tparams.escape_begin.source + ")|" +
+ "(" + tparams.comment_begin.source + ")" +
+ ")"
+ , "g");
+ allbegin.global = true;
+ var regexes = {
+ slashes: 1,
+ match: 2,
+ def_begin: 3,
+ def_name1: 4,
+ def_name2: 5,
+ def_end: 6,
+ comment_multi_begin: 7,
+ eval_long: 8,
+ interpolate: 9,
+ eval_short: 10,
+ escape: 11,
+ comment: 12
+ };
+ var regex_count = 4;
+
+ var compileTemplate = function(text, options) {
+ options = _.extend({start: 0, indent: true}, options);
+ start = options.start;
+ var source = "";
+ var current = start;
+ allbegin.lastIndex = current;
+ var text_end = text.length;
+ var restart = end;
+ var found;
+ var functions = [];
+ var indent = options.indent ? indent_ : function (txt) { return txt; };
+ var rmWhite = options.removeWhitespaces ? function(txt) {
+ if (! txt)
+ return txt;
+ txt = _.map(txt.split("\n"), function(x) { return x.trim() });
+ var last = txt.pop();
+ txt = _.reject(txt, function(x) { return !x });
+ txt.push(last);
+ return txt.join("\n") || "\n";
+ } : function(x) { return x };
+ while (found = allbegin.exec(text)) {
+ var to_add = rmWhite(text.slice(current, found.index));
+ source += to_add ? "__p+=" + escape_(to_add) + ";\n" : '';
+ current = found.index;
+
+ // slash escaping handling
+ var slashes = found[regexes.slashes] || "";
+ var nbr = slashes.length;
+ var nslash = slashes.slice(0, Math.floor(nbr / 2));
+ source += nbr !== 0 ? "__p+=" + escape_(nslash) + ";\n" : "";
+ if (nbr % 2 !== 0) {
+ source += "__p+=" + escape_(found[regexes.match]) + ";\n";
+ current = found.index + found[0].length;
+ allbegin.lastIndex = current;
+ continue;
+ }
+
+ if (found[regexes.def_begin]) {
+ var sub_compile = compileTemplate(text, _.extend({}, options, {start: found.index + found[0].length}));
+ var name = (found[regexes.def_name1] || found[regexes.def_name2]);
+ source += "var " + name + " = function(context) {\n" + indent(sub_compile.header + sub_compile.source
+ + sub_compile.footer) + "}\n";
+ functions.push(name);
+ current = sub_compile.end;
+ } else if (found[regexes.def_end]) {
+ text_end = found.index;
+ restart = found.index + found[0].length;
+ break;
+ } else if (found[regexes.comment_multi_begin]) {
+ tparams.comment_multi_end.lastIndex = found.index + found[0].length;
+ var end = tparams.comment_multi_end.exec(text);
+ if (!end)
+ throw new Error("<%doc> without corresponding </%doc>");
+ current = end.index + end[0].length;
+ } else if (found[regexes.eval_long]) {
+ tparams.eval_long_end.lastIndex = found.index + found[0].length;
+ var end = tparams.eval_long_end.exec(text);
+ if (!end)
+ throw new Error("<% without matching %>");
+ var code = text.slice(found.index + found[0].length, end.index);
+ code = _(code.split("\n")).chain().map(function(x) { return x.trim() })
+ .reject(function(x) { return !x }).value().join("\n");
+ source += code + "\n";
+ current = end.index + end[0].length;
+ } else if (found[regexes.interpolate]) {
+ var braces = /{|}/g;
+ braces.lastIndex = found.index + found[0].length;
+ var b_count = 1;
+ var brace;
+ while (brace = braces.exec(text)) {
+ if (brace[0] === "{")
+ b_count++;
+ else {
+ b_count--;
+ }
+ if (b_count === 0)
+ break;
+ }
+ if (b_count !== 0)
+ throw new Error("%{ without a matching }");
+ source += "__p+=" + text.slice(found.index + found[0].length, brace.index) + ";\n"
+ current = brace.index + brace[0].length;
+ } else if (found[regexes.eval_short]) {
+ tparams.eval_short_end.lastIndex = found.index + found[0].length;
+ var end = tparams.eval_short_end.exec(text);
+ if (!end)
+ throw new Error("impossible state!!");
+ source += text.slice(found.index + found[0].length, end.index).trim() + "\n";
+ current = end.index;
+ } else if (found[regexes.escape]) {
+ var braces = /{|}/g;
+ braces.lastIndex = found.index + found[0].length;
+ var b_count = 1;
+ var brace;
+ while (brace = braces.exec(text)) {
+ if (brace[0] === "{")
+ b_count++;
+ else {
+ b_count--;
+ }
+ if (b_count === 0)
+ break;
+ }
+ if (b_count !== 0)
+ throw new Error("${ without a matching }");
+ source += "__p+=_.escape(" + text.slice(found.index + found[0].length, brace.index) + ");\n"
+ current = brace.index + brace[0].length;
+ } else { // comment
+ tparams.comment_end.lastIndex = found.index + found[0].length;
+ var end = tparams.comment_end.exec(text);
+ if (!end)
+ throw new Error("impossible state!!");
+ current = end.index + end[0].length;
+ }
+ allbegin.lastIndex = current;
+ }
+ var to_add = rmWhite(text.slice(current, text_end));
+ source += to_add ? "__p+=" + escape_(to_add) + ";\n" : "";
+
+ var header = "var __p = ''; var print = function() { __p+=Array.prototype.join.call(arguments, '') };\n" +
+ "with (context || {}) {\n";
+ var footer = "}\nreturn __p;\n";
+ source = indent(source);
+
+ return {
+ header: header,
+ source: source,
+ footer: footer,
+ end: restart,
+ functions: functions,
+ };
+ };
+
+ nova.TemplateEngine = nova.Class.$extend({
+ __init__: function() {
+ this.resetEnvironment();
+ this.options = {
+ includeInDom: $ ? true : false,
+ indent: true,
+ removeWhitespaces: true,
+ };
+ },
+ loadFile: function(filename) {
+ var self = this;
+ return $.get(filename).pipe(function(content) {
+ return self.loadFileContent(content);
+ });
+ },
+ loadFileContent: function(file_content) {
+ var code = this.compileFile(file_content);
+
+ if (this.options.includeInDom) {
+ var varname = _.uniqueId("novajstemplate");
+ var previous = window[varname];
+ code = "window." + varname + " = " + code + ";";
+ var def = $.Deferred();
+ var script = document.createElement("script");
+ script.type = "text/javascript";
+ script.text = code;
+ $("head")[0].appendChild(script);
+ $(script).ready(function() {
+ def.resolve();
+ });
+ def.then(_.bind(function() {
+ var tmp = window[varname];
+ window[varname] = previous;
+ this.includeTemplates(tmp);
+ }, this));
+ return def;
+ } else {
+ console.log("return (" + code + ")(context);");
+ return this.includeTemplates(new Function('context', "return (" + code + ")(context);"));
+ }
+ },
+ compileFile: function(file_content) {
+ var result = compileTemplate(file_content, _.extend({}, this.options));
+ var to_append = "";
+ _.each(result.functions, function(name) {
+ to_append += name + ": " + name + ",\n";
+ }, this);
+ to_append = this.options.indent ? indent_(to_append) : to_append;
+ to_append = "return {\n" + to_append + "};\n";
+ to_append = this.options.indent ? indent_(to_append) : to_append;
+ var code = "function(context) {\n" + result.header +
+ result.source + to_append + result.footer + "}\n";
+ return code;
+ },
+ includeTemplates: function(fct) {
+ var add = _.extend({engine: this}, this._env);
+ var functions = fct(add);
+ _.each(functions, function(func, name) {
+ if (this[name])
+ throw new Error("The template '" + name + "' is already defined");
+ this[name] = func;
+ }, this);
+ },
+ buildTemplate: function(text) {
+ var comp = compileTemplate(text, _.extend({}, this.options));
+ var result = comp.header + comp.source + comp.footer;
+ var add = _.extend({engine: this}, this._env);
+ var func = new Function('context', result);
+ return function(data) {
+ return func.call(this, _.extend(add, data));
+ };
+ },
+ eval: function(text, context) {
+ return this.buildTemplate(text)(context);
+ },
+ resetEnvironment: function(nenv) {
+ this._env = {_: _};
+ this.extendEnvironment(nenv);
+ },
+ extendEnvironment: function(env) {
+ _.extend(this._env, env || {});
+ },
+ });
+
+ return nova;
+};
+})();
diff --git a/addons/im_livechat/static/ext/static/js/oeclient.js b/addons/im_livechat/static/ext/static/js/oeclient.js
new file mode 100644
index 00000000000..b3192b786e2
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/js/oeclient.js
@@ -0,0 +1,362 @@
+/*
+Copyright (c) 2013, OpenERP
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+define(["underscore", "jquery", "nova"], function(_, $, nova) {
+
+ var oeclient = {};
+
+ var genericJsonRPC = function(fct_name, params, fct) {
+ var data = {
+ jsonrpc: "2.0",
+ method: fct_name,
+ params: params,
+ id: Math.floor(Math.random()* (1000*1000*1000)),
+ };
+ return fct(data).pipe(function(result) {
+ if (result.error !== undefined) {
+ console.error("Server application error", result.error);
+ return $.Deferred().reject("server", result.error);
+ } else {
+ return result.result;
+ }
+ }, function() {
+ console.error("JsonRPC communication error", _.toArray(arguments));
+ var def = $.Deferred();
+ return def.reject.apply(def, ["communication"].concat(_.toArray(arguments)));
+ });
+ };
+
+ oeclient.jsonRpc = function(url, fct_name, params, settings) {
+ return genericJsonRPC(fct_name, params, function(data) {
+ return $.ajax(url, _.extend({}, settings, {
+ url: url,
+ dataType: 'json',
+ type: 'POST',
+ data: JSON.stringify(data),
+ contentType: 'application/json',
+ }));
+ });
+ };
+
+ oeclient.jsonpRpc = function(url, fct_name, params, settings) {
+ return genericJsonRPC(fct_name, params, function(data) {
+ return $.ajax(url, _.extend({}, settings, {
+ url: url,
+ dataType: 'jsonp',
+ jsonp: 'jsonp',
+ type: 'GET',
+ cache: false,
+ data: {r: JSON.stringify(data)},
+ }));
+ });
+ };
+
+ oeclient.Connector = nova.Class.$extend({
+ getService: function(serviceName) {
+ return new oeclient.Service(this, serviceName);
+ },
+ });
+
+ oeclient.JsonRPCConnector = oeclient.Connector.$extend({
+ __init__: function(url) {
+ this.url = url;
+ },
+ call: function(sub_url, content) {
+ return oeclient.jsonRpc(this.url + sub_url, "call", content);
+ },
+ send: function(serviceName, method, args) {
+ return this.call("/jsonrpc", {"service": serviceName, "method": method, "args": args});
+ },
+ });
+
+ oeclient.JsonpRPCConnector = oeclient.JsonRPCConnector.$extend({
+ call: function(sub_url, content) {
+ return oeclient.jsonpRpc(this.url + sub_url, "call", content);
+ },
+ });
+
+ oeclient.Service = nova.Class.$extend({
+ __init__: function(connector, serviceName) {
+ this.connector = connector;
+ this.serviceName = serviceName;
+ },
+ call: function(method, args) {
+ return this.connector.send(this.serviceName, method, args);
+ },
+ });
+
+ oeclient.AuthenticationError = nova.Error.$extend({
+ name: "oeclient.AuthenticationError",
+ defaultMessage: "An error occured during authentication."
+ });
+
+ oeclient.Connection = nova.Class.$extend({
+ __init__: function(connector, database, login, password, userId) {
+ this.connector = connector;
+ this.setLoginInfo(database, login, password, userId);
+ this.userContext = null;
+ },
+ setLoginInfo: function(database, login, password, userId) {
+ this.database = database;
+ this.login = login;
+ this.password = password;
+ this.userId = userId;
+ },
+ checkLogin: function(force) {
+ force = force === undefined ? true: force;
+ if (this.userId && ! force)
+ return $.when();
+
+ if (! this.database || ! this.login || ! this.password)
+ throw new oeclient.AuthenticationError();
+
+ return this.getService("common").call("login", [this.database, this.login, this.password])
+ .then(_.bind(function(result) {
+ this.userId = result;
+ if (! this.userId) {
+ console.error("Authentication failure");
+ return $.Deferred().reject({message:"Authentication failure"});
+ }
+ }, this));
+ },
+ getUserContext: function() {
+ if (! this.userContext) {
+ return this.getModel("res.users").call("context_get").then(_.bind(function(result) {
+ this.userContext = result;
+ return this.userContext;
+ }, this));
+ }
+ return $.when(this.userContext);
+ },
+ getModel: function(modelName) {
+ return new oeclient.Model(this, modelName);
+ },
+ getService: function(serviceName) {
+ return this.connector.getService(serviceName);
+ },
+ });
+
+ oeclient.Model = nova.Class.$extend({
+ __init__: function(connection, modelName) {
+ this.connection = connection;
+ this.modelName = modelName;
+ },
+ call: function(method, args, kw) {
+ return this.connection.checkLogin().then(_.bind(function() {
+ return this.connection.getService("object").call("execute_kw", [
+ this.connection.database,
+ this.connection.userId,
+ this.connection.password,
+ this.modelName,
+ method,
+ args || [],
+ kw || {},
+ ]);
+ }, this));
+ },
+ search_read: function(domain, fields, offset, limit, order, context) {
+ return this.call("search", [domain || [], offset || 0, limit || false, order || false, context || {}]).then(_.bind(function(record_ids) {
+ if (! record_ids) {
+ return [];
+ }
+ return this.call("read", [record_ids, fields || [], context || {}]).then(function(records) {
+ var index = {};
+ _.each(records, function(r) {
+ index[r.id] = r;
+ });
+ var res = [];
+ _.each(record_ids, function(id) {
+ if (index[id])
+ res.push(index[id]);
+ });
+ return res;
+ });
+ }, this));
+ },
+ });
+
+ /**
+ * Converts a string to a Date javascript object using OpenERP's
+ * datetime string format (exemple: '2011-12-01 15:12:35').
+ *
+ * The time zone is assumed to be UTC (standard for OpenERP 6.1)
+ * and will be converted to the browser's time zone.
+ *
+ * @param {String} str A string representing a datetime.
+ * @returns {Date}
+ */
+ oeclient.str_to_datetime = function(str) {
+ if(!str) {
+ return str;
+ }
+ var regex = /^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d(?:\.\d+)?)$/;
+ var res = regex.exec(str);
+ if ( !res ) {
+ throw new Error("'" + str + "' is not a valid datetime");
+ }
+ var tmp = new Date();
+ tmp.setUTCFullYear(parseFloat(res[1]));
+ tmp.setUTCMonth(parseFloat(res[2]) - 1);
+ tmp.setUTCDate(parseFloat(res[3]));
+ tmp.setUTCHours(parseFloat(res[4]));
+ tmp.setUTCMinutes(parseFloat(res[5]));
+ tmp.setUTCSeconds(parseFloat(res[6]));
+ return tmp;
+ };
+
+ /**
+ * Converts a string to a Date javascript object using OpenERP's
+ * date string format (exemple: '2011-12-01').
+ *
+ * As a date is not subject to time zones, we assume it should be
+ * represented as a Date javascript object at 00:00:00 in the
+ * time zone of the browser.
+ *
+ * @param {String} str A string representing a date.
+ * @returns {Date}
+ */
+ oeclient.str_to_date = function(str) {
+ if(!str) {
+ return str;
+ }
+ var regex = /^(\d\d\d\d)-(\d\d)-(\d\d)$/;
+ var res = regex.exec(str);
+ if ( !res ) {
+ throw new Error("'" + str + "' is not a valid date");
+ }
+ var tmp = new Date();
+ tmp.setFullYear(parseFloat(res[1]));
+ tmp.setMonth(parseFloat(res[2]) - 1);
+ tmp.setDate(parseFloat(res[3]));
+ tmp.setHours(0);
+ tmp.setMinutes(0);
+ tmp.setSeconds(0);
+ return tmp;
+ };
+
+ /**
+ * Converts a string to a Date javascript object using OpenERP's
+ * time string format (exemple: '15:12:35').
+ *
+ * The OpenERP times are supposed to always be naive times. We assume it is
+ * represented using a javascript Date with a date 1 of January 1970 and a
+ * time corresponding to the meant time in the browser's time zone.
+ *
+ * @param {String} str A string representing a time.
+ * @returns {Date}
+ */
+ oeclient.str_to_time = function(str) {
+ if(!str) {
+ return str;
+ }
+ var regex = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)$/;
+ var res = regex.exec(str);
+ if ( !res ) {
+ throw new Error("'" + str + "' is not a valid time");
+ }
+ debugger;
+ var tmp = new Date();
+ tmp.setFullYear(1970);
+ tmp.setMonth(0);
+ tmp.setDate(1);
+ tmp.setHours(parseFloat(res[1]));
+ tmp.setMinutes(parseFloat(res[2]));
+ tmp.setSeconds(parseFloat(res[3]));
+ return tmp;
+ };
+
+ /*
+ * Left-pad provided arg 1 with zeroes until reaching size provided by second
+ * argument.
+ *
+ * @param {Number|String} str value to pad
+ * @param {Number} size size to reach on the final padded value
+ * @returns {String} padded string
+ */
+ var zpad = function(str, size) {
+ str = "" + str;
+ return new Array(size - str.length + 1).join('0') + str;
+ };
+
+ /**
+ * Converts a Date javascript object to a string using OpenERP's
+ * datetime string format (exemple: '2011-12-01 15:12:35').
+ *
+ * The time zone of the Date object is assumed to be the one of the
+ * browser and it will be converted to UTC (standard for OpenERP 6.1).
+ *
+ * @param {Date} obj
+ * @returns {String} A string representing a datetime.
+ */
+ oeclient.datetime_to_str = function(obj) {
+ if (!obj) {
+ return false;
+ }
+ return zpad(obj.getUTCFullYear(),4) + "-" + zpad(obj.getUTCMonth() + 1,2) + "-"
+ + zpad(obj.getUTCDate(),2) + " " + zpad(obj.getUTCHours(),2) + ":"
+ + zpad(obj.getUTCMinutes(),2) + ":" + zpad(obj.getUTCSeconds(),2);
+ };
+
+ /**
+ * Converts a Date javascript object to a string using OpenERP's
+ * date string format (exemple: '2011-12-01').
+ *
+ * As a date is not subject to time zones, we assume it should be
+ * represented as a Date javascript object at 00:00:00 in the
+ * time zone of the browser.
+ *
+ * @param {Date} obj
+ * @returns {String} A string representing a date.
+ */
+ oeclient.date_to_str = function(obj) {
+ if (!obj) {
+ return false;
+ }
+ return zpad(obj.getFullYear(),4) + "-" + zpad(obj.getMonth() + 1,2) + "-"
+ + zpad(obj.getDate(),2);
+ };
+
+ /**
+ * Converts a Date javascript object to a string using OpenERP's
+ * time string format (exemple: '15:12:35').
+ *
+ * The OpenERP times are supposed to always be naive times. We assume it is
+ * represented using a javascript Date with a date 1 of January 1970 and a
+ * time corresponding to the meant time in the browser's time zone.
+ *
+ * @param {Date} obj
+ * @returns {String} A string representing a time.
+ */
+ oeclient.time_to_str = function(obj) {
+ if (!obj) {
+ return false;
+ }
+ return zpad(obj.getHours(),2) + ":" + zpad(obj.getMinutes(),2) + ":"
+ + zpad(obj.getSeconds(),2);
+ };
+
+ return oeclient;
+
+}); \ No newline at end of file
diff --git a/addons/im_livechat/static/ext/static/js/require.js b/addons/im_livechat/static/ext/static/js/require.js
new file mode 100644
index 00000000000..f46a9245d97
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/js/require.js
@@ -0,0 +1,1993 @@
+/** vim: et:ts=4:sw=4:sts=4
+ * @license RequireJS 2.1.2 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/jrburke/requirejs for details
+ */
+//Not using strict: uneven strict support in browsers, #392, and causes
+//problems with requirejs.exec()/transpiler plugins that may not be strict.
+/*jslint regexp: true, nomen: true, sloppy: true */
+/*global window, navigator, document, importScripts, jQuery, setTimeout, opera */
+
+var requirejs, require, define;
+(function (global) {
+ var req, s, head, baseElement, dataMain, src,
+ interactiveScript, currentlyAddingScript, mainScript, subPath,
+ version = '2.1.2',
+ commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,
+ cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
+ jsSuffixRegExp = /\.js$/,
+ currDirRegExp = /^\.\//,
+ op = Object.prototype,
+ ostring = op.toString,
+ hasOwn = op.hasOwnProperty,
+ ap = Array.prototype,
+ aps = ap.slice,
+ apsp = ap.splice,
+ isBrowser = !!(typeof window !== 'undefined' && navigator && document),
+ isWebWorker = !isBrowser && typeof importScripts !== 'undefined',
+ //PS3 indicates loaded and complete, but need to wait for complete
+ //specifically. Sequence is 'loading', 'loaded', execution,
+ // then 'complete'. The UA check is unfortunate, but not sure how
+ //to feature test w/o causing perf issues.
+ readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?
+ /^complete$/ : /^(complete|loaded)$/,
+ defContextName = '_',
+ //Oh the tragedy, detecting opera. See the usage of isOpera for reason.
+ isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]',
+ contexts = {},
+ cfg = {},
+ globalDefQueue = [],
+ useInteractive = false;
+
+ function isFunction(it) {
+ return ostring.call(it) === '[object Function]';
+ }
+
+ function isArray(it) {
+ return ostring.call(it) === '[object Array]';
+ }
+
+ /**
+ * Helper function for iterating over an array. If the func returns
+ * a true value, it will break out of the loop.
+ */
+ function each(ary, func) {
+ if (ary) {
+ var i;
+ for (i = 0; i < ary.length; i += 1) {
+ if (ary[i] && func(ary[i], i, ary)) {
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Helper function for iterating over an array backwards. If the func
+ * returns a true value, it will break out of the loop.
+ */
+ function eachReverse(ary, func) {
+ if (ary) {
+ var i;
+ for (i = ary.length - 1; i > -1; i -= 1) {
+ if (ary[i] && func(ary[i], i, ary)) {
+ break;
+ }
+ }
+ }
+ }
+
+ function hasProp(obj, prop) {
+ return hasOwn.call(obj, prop);
+ }
+
+ function getOwn(obj, prop) {
+ return hasProp(obj, prop) && obj[prop];
+ }
+
+ /**
+ * Cycles over properties in an object and calls a function for each
+ * property value. If the function returns a truthy value, then the
+ * iteration is stopped.
+ */
+ function eachProp(obj, func) {
+ var prop;
+ for (prop in obj) {
+ if (hasProp(obj, prop)) {
+ if (func(obj[prop], prop)) {
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Simple function to mix in properties from source into target,
+ * but only if target does not already have a property of the same name.
+ */
+ function mixin(target, source, force, deepStringMixin) {
+ if (source) {
+ eachProp(source, function (value, prop) {
+ if (force || !hasProp(target, prop)) {
+ if (deepStringMixin && typeof value !== 'string') {
+ if (!target[prop]) {
+ target[prop] = {};
+ }
+ mixin(target[prop], value, force, deepStringMixin);
+ } else {
+ target[prop] = value;
+ }
+ }
+ });
+ }
+ return target;
+ }
+
+ //Similar to Function.prototype.bind, but the 'this' object is specified
+ //first, since it is easier to read/figure out what 'this' will be.
+ function bind(obj, fn) {
+ return function () {
+ return fn.apply(obj, arguments);
+ };
+ }
+
+ function scripts() {
+ return document.getElementsByTagName('script');
+ }
+
+ //Allow getting a global that expressed in
+ //dot notation, like 'a.b.c'.
+ function getGlobal(value) {
+ if (!value) {
+ return value;
+ }
+ var g = global;
+ each(value.split('.'), function (part) {
+ g = g[part];
+ });
+ return g;
+ }
+
+ /**
+ * Constructs an error with a pointer to an URL with more information.
+ * @param {String} id the error ID that maps to an ID on a web page.
+ * @param {String} message human readable error.
+ * @param {Error} [err] the original error, if there is one.
+ *
+ * @returns {Error}
+ */
+ function makeError(id, msg, err, requireModules) {
+ var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#' + id);
+ e.requireType = id;
+ e.requireModules = requireModules;
+ if (err) {
+ e.originalError = err;
+ }
+ return e;
+ }
+
+ if (typeof define !== 'undefined') {
+ //If a define is already in play via another AMD loader,
+ //do not overwrite.
+ return;
+ }
+
+ if (typeof requirejs !== 'undefined') {
+ if (isFunction(requirejs)) {
+ //Do not overwrite and existing requirejs instance.
+ return;
+ }
+ cfg = requirejs;
+ requirejs = undefined;
+ }
+
+ //Allow for a require config object
+ if (typeof require !== 'undefined' && !isFunction(require)) {
+ //assume it is a config object.
+ cfg = require;
+ require = undefined;
+ }
+
+ function newContext(contextName) {
+ var inCheckLoaded, Module, context, handlers,
+ checkLoadedTimeoutId,
+ config = {
+ waitSeconds: 7,
+ baseUrl: './',
+ paths: {},
+ pkgs: {},
+ shim: {},
+ map: {},
+ config: {}
+ },
+ registry = {},
+ undefEvents = {},
+ defQueue = [],
+ defined = {},
+ urlFetched = {},
+ requireCounter = 1,
+ unnormalizedCounter = 1;
+
+ /**
+ * Trims the . and .. from an array of path segments.
+ * It will keep a leading path segment if a .. will become
+ * the first path segment, to help with module name lookups,
+ * which act like paths, but can be remapped. But the end result,
+ * all paths that use this function should look normalized.
+ * NOTE: this method MODIFIES the input array.
+ * @param {Array} ary the array of path segments.
+ */
+ function trimDots(ary) {
+ var i, part;
+ for (i = 0; ary[i]; i += 1) {
+ part = ary[i];
+ if (part === '.') {
+ ary.splice(i, 1);
+ i -= 1;
+ } else if (part === '..') {
+ if (i === 1 && (ary[2] === '..' || ary[0] === '..')) {
+ //End of the line. Keep at least one non-dot
+ //path segment at the front so it can be mapped
+ //correctly to disk. Otherwise, there is likely
+ //no path mapping for a path starting with '..'.
+ //This can still fail, but catches the most reasonable
+ //uses of ..
+ break;
+ } else if (i > 0) {
+ ary.splice(i - 1, 2);
+ i -= 2;
+ }
+ }
+ }
+ }
+
+ /**
+ * Given a relative module name, like ./something, normalize it to
+ * a real name that can be mapped to a path.
+ * @param {String} name the relative name
+ * @param {String} baseName a real name that the name arg is relative
+ * to.
+ * @param {Boolean} applyMap apply the map config to the value. Should
+ * only be done if this normalization is for a dependency ID.
+ * @returns {String} normalized name
+ */
+ function normalize(name, baseName, applyMap) {
+ var pkgName, pkgConfig, mapValue, nameParts, i, j, nameSegment,
+ foundMap, foundI, foundStarMap, starI,
+ baseParts = baseName && baseName.split('/'),
+ normalizedBaseParts = baseParts,
+ map = config.map,
+ starMap = map && map['*'];
+
+ //Adjust any relative paths.
+ if (name && name.charAt(0) === '.') {
+ //If have a base name, try to normalize against it,
+ //otherwise, assume it is a top-level require that will
+ //be relative to baseUrl in the end.
+ if (baseName) {
+ if (getOwn(config.pkgs, baseName)) {
+ //If the baseName is a package name, then just treat it as one
+ //name to concat the name with.
+ normalizedBaseParts = baseParts = [baseName];
+ } else {
+ //Convert baseName to array, and lop off the last part,
+ //so that . matches that 'directory' and not name of the baseName's
+ //module. For instance, baseName of 'one/two/three', maps to
+ //'one/two/three.js', but we want the directory, 'one/two' for
+ //this normalization.
+ normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);
+ }
+
+ name = normalizedBaseParts.concat(name.split('/'));
+ trimDots(name);
+
+ //Some use of packages may use a . path to reference the
+ //'main' module name, so normalize for that.
+ pkgConfig = getOwn(config.pkgs, (pkgName = name[0]));
+ name = name.join('/');
+ if (pkgConfig && name === pkgName + '/' + pkgConfig.main) {
+ name = pkgName;
+ }
+ } else if (name.indexOf('./') === 0) {
+ // No baseName, so this is ID is resolved relative
+ // to baseUrl, pull off the leading dot.
+ name = name.substring(2);
+ }
+ }
+
+ //Apply map config if available.
+ if (applyMap && (baseParts || starMap) && map) {
+ nameParts = name.split('/');
+
+ for (i = nameParts.length; i > 0; i -= 1) {
+ nameSegment = nameParts.slice(0, i).join('/');
+
+ if (baseParts) {
+ //Find the longest baseName segment match in the config.
+ //So, do joins on the biggest to smallest lengths of baseParts.
+ for (j = baseParts.length; j > 0; j -= 1) {
+ mapValue = getOwn(map, baseParts.slice(0, j).join('/'));
+
+ //baseName segment has config, find if it has one for
+ //this name.
+ if (mapValue) {
+ mapValue = getOwn(mapValue, nameSegment);
+ if (mapValue) {
+ //Match, update name to the new value.
+ foundMap = mapValue;
+ foundI = i;
+ break;
+ }
+ }
+ }
+ }
+
+ if (foundMap) {
+ break;
+ }
+
+ //Check for a star map match, but just hold on to it,
+ //if there is a shorter segment match later in a matching
+ //config, then favor over this star map.
+ if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) {
+ foundStarMap = getOwn(starMap, nameSegment);
+ starI = i;
+ }
+ }
+
+ if (!foundMap && foundStarMap) {
+ foundMap = foundStarMap;
+ foundI = starI;
+ }
+
+ if (foundMap) {
+ nameParts.splice(0, foundI, foundMap);
+ name = nameParts.join('/');
+ }
+ }
+
+ return name;
+ }
+
+ function removeScript(name) {
+ if (isBrowser) {
+ each(scripts(), function (scriptNode) {
+ if (scriptNode.getAttribute('data-requiremodule') === name &&
+ scriptNode.getAttribute('data-requirecontext') === context.contextName) {
+ scriptNode.parentNode.removeChild(scriptNode);
+ return true;
+ }
+ });
+ }
+ }
+
+ function hasPathFallback(id) {
+ var pathConfig = getOwn(config.paths, id);
+ if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) {
+ removeScript(id);
+ //Pop off the first array value, since it failed, and
+ //retry
+ pathConfig.shift();
+ context.require.undef(id);
+ context.require([id]);
+ return true;
+ }
+ }
+
+ //Turns a plugin!resource to [plugin, resource]
+ //with the plugin being undefined if the name
+ //did not have a plugin prefix.
+ function splitPrefix(name) {
+ var prefix,
+ index = name ? name.indexOf('!') : -1;
+ if (index > -1) {
+ prefix = name.substring(0, index);
+ name = name.substring(index + 1, name.length);
+ }
+ return [prefix, name];
+ }
+
+ /**
+ * Creates a module mapping that includes plugin prefix, module
+ * name, and path. If parentModuleMap is provided it will
+ * also normalize the name via require.normalize()
+ *
+ * @param {String} name the module name
+ * @param {String} [parentModuleMap] parent module map
+ * for the module name, used to resolve relative names.
+ * @param {Boolean} isNormalized: is the ID already normalized.
+ * This is true if this call is done for a define() module ID.
+ * @param {Boolean} applyMap: apply the map config to the ID.
+ * Should only be true if this map is for a dependency.
+ *
+ * @returns {Object}
+ */
+ function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {
+ var url, pluginModule, suffix, nameParts,
+ prefix = null,
+ parentName = parentModuleMap ? parentModuleMap.name : null,
+ originalName = name,
+ isDefine = true,
+ normalizedName = '';
+
+ //If no name, then it means it is a require call, generate an
+ //internal name.
+ if (!name) {
+ isDefine = false;
+ name = '_@r' + (requireCounter += 1);
+ }
+
+ nameParts = splitPrefix(name);
+ prefix = nameParts[0];
+ name = nameParts[1];
+
+ if (prefix) {
+ prefix = normalize(prefix, parentName, applyMap);
+ pluginModule = getOwn(defined, prefix);
+ }
+
+ //Account for relative paths if there is a base name.
+ if (name) {
+ if (prefix) {
+ if (pluginModule && pluginModule.normalize) {
+ //Plugin is loaded, use its normalize method.
+ normalizedName = pluginModule.normalize(name, function (name) {
+ return normalize(name, parentName, applyMap);
+ });
+ } else {
+ normalizedName = normalize(name, parentName, applyMap);
+ }
+ } else {
+ //A regular module.
+ normalizedName = normalize(name, parentName, applyMap);
+
+ //Normalized name may be a plugin ID due to map config
+ //application in normalize. The map config values must
+ //already be normalized, so do not need to redo that part.
+ nameParts = splitPrefix(normalizedName);
+ prefix = nameParts[0];
+ normalizedName = nameParts[1];
+ isNormalized = true;
+
+ url = context.nameToUrl(normalizedName);
+ }
+ }
+
+ //If the id is a plugin id that cannot be determined if it needs
+ //normalization, stamp it with a unique ID so two matching relative
+ //ids that may conflict can be separate.
+ suffix = prefix && !pluginModule && !isNormalized ?
+ '_unnormalized' + (unnormalizedCounter += 1) :
+ '';
+
+ return {
+ prefix: prefix,
+ name: normalizedName,
+ parentMap: parentModuleMap,
+ unnormalized: !!suffix,
+ url: url,
+ originalName: originalName,
+ isDefine: isDefine,
+ id: (prefix ?
+ prefix + '!' + normalizedName :
+ normalizedName) + suffix
+ };
+ }
+
+ function getModule(depMap) {
+ var id = depMap.id,
+ mod = getOwn(registry, id);
+
+ if (!mod) {
+ mod = registry[id] = new context.Module(depMap);
+ }
+
+ return mod;
+ }
+
+ function on(depMap, name, fn) {
+ var id = depMap.id,
+ mod = getOwn(registry, id);
+
+ if (hasProp(defined, id) &&
+ (!mod || mod.defineEmitComplete)) {
+ if (name === 'defined') {
+ fn(defined[id]);
+ }
+ } else {
+ getModule(depMap).on(name, fn);
+ }
+ }
+
+ function onError(err, errback) {
+ var ids = err.requireModules,
+ notified = false;
+
+ if (errback) {
+ errback(err);
+ } else {
+ each(ids, function (id) {
+ var mod = getOwn(registry, id);
+ if (mod) {
+ //Set error on module, so it skips timeout checks.
+ mod.error = err;
+ if (mod.events.error) {
+ notified = true;
+ mod.emit('error', err);
+ }
+ }
+ });
+
+ if (!notified) {
+ req.onError(err);
+ }
+ }
+ }
+
+ /**
+ * Internal method to transfer globalQueue items to this context's
+ * defQueue.
+ */
+ function takeGlobalQueue() {
+ //Push all the globalDefQueue items into the context's defQueue
+ if (globalDefQueue.length) {
+ //Array splice in the values since the context code has a
+ //local var ref to defQueue, so cannot just reassign the one
+ //on context.
+ apsp.apply(defQueue,
+ [defQueue.length - 1, 0].concat(globalDefQueue));
+ globalDefQueue = [];
+ }
+ }
+
+ handlers = {
+ 'require': function (mod) {
+ if (mod.require) {
+ return mod.require;
+ } else {
+ return (mod.require = context.makeRequire(mod.map));
+ }
+ },
+ 'exports': function (mod) {
+ mod.usingExports = true;
+ if (mod.map.isDefine) {
+ if (mod.exports) {
+ return mod.exports;
+ } else {
+ return (mod.exports = defined[mod.map.id] = {});
+ }
+ }
+ },
+ 'module': function (mod) {
+ if (mod.module) {
+ return mod.module;
+ } else {
+ return (mod.module = {
+ id: mod.map.id,
+ uri: mod.map.url,
+ config: function () {
+ return (config.config && getOwn(config.config, mod.map.id)) || {};
+ },
+ exports: defined[mod.map.id]
+ });
+ }
+ }
+ };
+
+ function cleanRegistry(id) {
+ //Clean up machinery used for waiting modules.
+ delete registry[id];
+ }
+
+ function breakCycle(mod, traced, processed) {
+ var id = mod.map.id;
+
+ if (mod.error) {
+ mod.emit('error', mod.error);
+ } else {
+ traced[id] = true;
+ each(mod.depMaps, function (depMap, i) {
+ var depId = depMap.id,
+ dep = getOwn(registry, depId);
+
+ //Only force things that have not completed
+ //being defined, so still in the registry,
+ //and only if it has not been matched up
+ //in the module already.
+ if (dep && !mod.depMatched[i] && !processed[depId]) {
+ if (getOwn(traced, depId)) {
+ mod.defineDep(i, defined[depId]);
+ mod.check(); //pass false?
+ } else {
+ breakCycle(dep, traced, processed);
+ }
+ }
+ });
+ processed[id] = true;
+ }
+ }
+
+ function checkLoaded() {
+ var map, modId, err, usingPathFallback,
+ waitInterval = config.waitSeconds * 1000,
+ //It is possible to disable the wait interval by using waitSeconds of 0.
+ expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),
+ noLoads = [],
+ reqCalls = [],
+ stillLoading = false,
+ needCycleCheck = true;
+
+ //Do not bother if this call was a result of a cycle break.
+ if (inCheckLoaded) {
+ return;
+ }
+
+ inCheckLoaded = true;
+
+ //Figure out the state of all the modules.
+ eachProp(registry, function (mod) {
+ map = mod.map;
+ modId = map.id;
+
+ //Skip things that are not enabled or in error state.
+ if (!mod.enabled) {
+ return;
+ }
+
+ if (!map.isDefine) {
+ reqCalls.push(mod);
+ }
+
+ if (!mod.error) {
+ //If the module should be executed, and it has not
+ //been inited and time is up, remember it.
+ if (!mod.inited && expired) {
+ if (hasPathFallback(modId)) {
+ usingPathFallback = true;
+ stillLoading = true;
+ } else {
+ noLoads.push(modId);
+ removeScript(modId);
+ }
+ } else if (!mod.inited && mod.fetched && map.isDefine) {
+ stillLoading = true;
+ if (!map.prefix) {
+ //No reason to keep looking for unfinished
+ //loading. If the only stillLoading is a
+ //plugin resource though, keep going,
+ //because it may be that a plugin resource
+ //is waiting on a non-plugin cycle.
+ return (needCycleCheck = false);
+ }
+ }
+ }
+ });
+
+ if (expired && noLoads.length) {
+ //If wait time expired, throw error of unloaded modules.
+ err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads);
+ err.contextName = context.contextName;
+ return onError(err);
+ }
+
+ //Not expired, check for a cycle.
+ if (needCycleCheck) {
+ each(reqCalls, function (mod) {
+ breakCycle(mod, {}, {});
+ });
+ }
+
+ //If still waiting on loads, and the waiting load is something
+ //other than a plugin resource, or there are still outstanding
+ //scripts, then just try back later.
+ if ((!expired || usingPathFallback) && stillLoading) {
+ //Something is still waiting to load. Wait for it, but only
+ //if a timeout is not already in effect.
+ if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {
+ checkLoadedTimeoutId = setTimeout(function () {
+ checkLoadedTimeoutId = 0;
+ checkLoaded();
+ }, 50);
+ }
+ }
+
+ inCheckLoaded = false;
+ }
+
+ Module = function (map) {
+ this.events = getOwn(undefEvents, map.id) || {};
+ this.map = map;
+ this.shim = getOwn(config.shim, map.id);
+ this.depExports = [];
+ this.depMaps = [];
+ this.depMatched = [];
+ this.pluginMaps = {};
+ this.depCount = 0;
+
+ /* this.exports this.factory
+ this.depMaps = [],
+ this.enabled, this.fetched
+ */
+ };
+
+ Module.prototype = {
+ init: function (depMaps, factory, errback, options) {
+ options = options || {};
+
+ //Do not do more inits if already done. Can happen if there
+ //are multiple define calls for the same module. That is not
+ //a normal, common case, but it is also not unexpected.
+ if (this.inited) {
+ return;
+ }
+
+ this.factory = factory;
+
+ if (errback) {
+ //Register for errors on this module.
+ this.on('error', errback);
+ } else if (this.events.error) {
+ //If no errback already, but there are error listeners
+ //on this module, set up an errback to pass to the deps.
+ errback = bind(this, function (err) {
+ this.emit('error', err);
+ });
+ }
+
+ //Do a copy of the dependency array, so that
+ //source inputs are not modified. For example
+ //"shim" deps are passed in here directly, and
+ //doing a direct modification of the depMaps array
+ //would affect that config.
+ this.depMaps = depMaps && depMaps.slice(0);
+
+ this.errback = errback;
+
+ //Indicate this module has be initialized
+ this.inited = true;
+
+ this.ignore = options.ignore;
+
+ //Could have option to init this module in enabled mode,
+ //or could have been previously marked as enabled. However,
+ //the dependencies are not known until init is called. So
+ //if enabled previously, now trigger dependencies as enabled.
+ if (options.enabled || this.enabled) {
+ //Enable this module and dependencies.
+ //Will call this.check()
+ this.enable();
+ } else {
+ this.check();
+ }
+ },
+
+ defineDep: function (i, depExports) {
+ //Because of cycles, defined callback for a given
+ //export can be called more than once.
+ if (!this.depMatched[i]) {
+ this.depMatched[i] = true;
+ this.depCount -= 1;
+ this.depExports[i] = depExports;
+ }
+ },
+
+ fetch: function () {
+ if (this.fetched) {
+ return;
+ }
+ this.fetched = true;
+
+ context.startTime = (new Date()).getTime();
+
+ var map = this.map;
+
+ //If the manager is for a plugin managed resource,
+ //ask the plugin to load it now.
+ if (this.shim) {
+ context.makeRequire(this.map, {
+ enableBuildCallback: true
+ })(this.shim.deps || [], bind(this, function () {
+ return map.prefix ? this.callPlugin() : this.load();
+ }));
+ } else {
+ //Regular dependency.
+ return map.prefix ? this.callPlugin() : this.load();
+ }
+ },
+
+ load: function () {
+ var url = this.map.url;
+
+ //Regular dependency.
+ if (!urlFetched[url]) {
+ urlFetched[url] = true;
+ context.load(this.map.id, url);
+ }
+ },
+
+ /**
+ * Checks is the module is ready to define itself, and if so,
+ * define it.
+ */
+ check: function () {
+ if (!this.enabled || this.enabling) {
+ return;
+ }
+
+ var err, cjsModule,
+ id = this.map.id,
+ depExports = this.depExports,
+ exports = this.exports,
+ factory = this.factory;
+
+ if (!this.inited) {
+ this.fetch();
+ } else if (this.error) {
+ this.emit('error', this.error);
+ } else if (!this.defining) {
+ //The factory could trigger another require call
+ //that would result in checking this module to
+ //define itself again. If already in the process
+ //of doing that, skip this work.
+ this.defining = true;
+
+ if (this.depCount < 1 && !this.defined) {
+ if (isFunction(factory)) {
+ //If there is an error listener, favor passing
+ //to that instead of throwing an error.
+ if (this.events.error) {
+ try {
+ exports = context.execCb(id, factory, depExports, exports);
+ } catch (e) {
+ err = e;
+ }
+ } else {
+ exports = context.execCb(id, factory, depExports, exports);
+ }
+
+ if (this.map.isDefine) {
+ //If setting exports via 'module' is in play,
+ //favor that over return value and exports. After that,
+ //favor a non-undefined return value over exports use.
+ cjsModule = this.module;
+ if (cjsModule &&
+ cjsModule.exports !== undefined &&
+ //Make sure it is not already the exports value
+ cjsModule.exports !== this.exports) {
+ exports = cjsModule.exports;
+ } else if (exports === undefined && this.usingExports) {
+ //exports already set the defined value.
+ exports = this.exports;
+ }
+ }
+
+ if (err) {
+ err.requireMap = this.map;
+ err.requireModules = [this.map.id];
+ err.requireType = 'define';
+ return onError((this.error = err));
+ }
+
+ } else {
+ //Just a literal value
+ exports = factory;
+ }
+
+ this.exports = exports;
+
+ if (this.map.isDefine && !this.ignore) {
+ defined[id] = exports;
+
+ if (req.onResourceLoad) {
+ req.onResourceLoad(context, this.map, this.depMaps);
+ }
+ }
+
+ //Clean up
+ delete registry[id];
+
+ this.defined = true;
+ }
+
+ //Finished the define stage. Allow calling check again
+ //to allow define notifications below in the case of a
+ //cycle.
+ this.defining = false;
+
+ if (this.defined && !this.defineEmitted) {
+ this.defineEmitted = true;
+ this.emit('defined', this.exports);
+ this.defineEmitComplete = true;
+ }
+
+ }
+ },
+
+ callPlugin: function () {
+ var map = this.map,
+ id = map.id,
+ //Map already normalized the prefix.
+ pluginMap = makeModuleMap(map.prefix);
+
+ //Mark this as a dependency for this plugin, so it
+ //can be traced for cycles.
+ this.depMaps.push(pluginMap);
+
+ on(pluginMap, 'defined', bind(this, function (plugin) {
+ var load, normalizedMap, normalizedMod,
+ name = this.map.name,
+ parentName = this.map.parentMap ? this.map.parentMap.name : null,
+ localRequire = context.makeRequire(map.parentMap, {
+ enableBuildCallback: true,
+ skipMap: true
+ });
+
+ //If current map is not normalized, wait for that
+ //normalized name to load instead of continuing.
+ if (this.map.unnormalized) {
+ //Normalize the ID if the plugin allows it.
+ if (plugin.normalize) {
+ name = plugin.normalize(name, function (name) {
+ return normalize(name, parentName, true);
+ }) || '';
+ }
+
+ //prefix and name should already be normalized, no need
+ //for applying map config again either.
+ normalizedMap = makeModuleMap(map.prefix + '!' + name,
+ this.map.parentMap);
+ on(normalizedMap,
+ 'defined', bind(this, function (value) {
+ this.init([], function () { return value; }, null, {
+ enabled: true,
+ ignore: true
+ });
+ }));
+
+ normalizedMod = getOwn(registry, normalizedMap.id);
+ if (normalizedMod) {
+ //Mark this as a dependency for this plugin, so it
+ //can be traced for cycles.
+ this.depMaps.push(normalizedMap);
+
+ if (this.events.error) {
+ normalizedMod.on('error', bind(this, function (err) {
+ this.emit('error', err);
+ }));
+ }
+ normalizedMod.enable();
+ }
+
+ return;
+ }
+
+ load = bind(this, function (value) {
+ this.init([], function () { return value; }, null, {
+ enabled: true
+ });
+ });
+
+ load.error = bind(this, function (err) {
+ this.inited = true;
+ this.error = err;
+ err.requireModules = [id];
+
+ //Remove temp unnormalized modules for this module,
+ //since they will never be resolved otherwise now.
+ eachProp(registry, function (mod) {
+ if (mod.map.id.indexOf(id + '_unnormalized') === 0) {
+ cleanRegistry(mod.map.id);
+ }
+ });
+
+ onError(err);
+ });
+
+ //Allow plugins to load other code without having to know the
+ //context or how to 'complete' the load.
+ load.fromText = bind(this, function (text, textAlt) {
+ /*jslint evil: true */
+ var moduleName = map.name,
+ moduleMap = makeModuleMap(moduleName),
+ hasInteractive = useInteractive;
+
+ //As of 2.1.0, support just passing the text, to reinforce
+ //fromText only being called once per resource. Still
+ //support old style of passing moduleName but discard
+ //that moduleName in favor of the internal ref.
+ if (textAlt) {
+ text = textAlt;
+ }
+
+ //Turn off interactive script matching for IE for any define
+ //calls in the text, then turn it back on at the end.
+ if (hasInteractive) {
+ useInteractive = false;
+ }
+
+ //Prime the system by creating a module instance for
+ //it.
+ getModule(moduleMap);
+
+ //Transfer any config to this other module.
+ if (hasProp(config.config, id)) {
+ config.config[moduleName] = config.config[id];
+ }
+
+ try {
+ req.exec(text);
+ } catch (e) {
+ throw new Error('fromText eval for ' + moduleName +
+ ' failed: ' + e);
+ }
+
+ if (hasInteractive) {
+ useInteractive = true;
+ }
+
+ //Mark this as a dependency for the plugin
+ //resource
+ this.depMaps.push(moduleMap);
+
+ //Support anonymous modules.
+ context.completeLoad(moduleName);
+
+ //Bind the value of that module to the value for this
+ //resource ID.
+ localRequire([moduleName], load);
+ });
+
+ //Use parentName here since the plugin's name is not reliable,
+ //could be some weird string with no path that actually wants to
+ //reference the parentName's path.
+ plugin.load(map.name, localRequire, load, config);
+ }));
+
+ context.enable(pluginMap, this);
+ this.pluginMaps[pluginMap.id] = pluginMap;
+ },
+
+ enable: function () {
+ this.enabled = true;
+
+ //Set flag mentioning that the module is enabling,
+ //so that immediate calls to the defined callbacks
+ //for dependencies do not trigger inadvertent load
+ //with the depCount still being zero.
+ this.enabling = true;
+
+ //Enable each dependency
+ each(this.depMaps, bind(this, function (depMap, i) {
+ var id, mod, handler;
+
+ if (typeof depMap === 'string') {
+ //Dependency needs to be converted to a depMap
+ //and wired up to this module.
+ depMap = makeModuleMap(depMap,
+ (this.map.isDefine ? this.map : this.map.parentMap),
+ false,
+ !this.skipMap);
+ this.depMaps[i] = depMap;
+
+ handler = getOwn(handlers, depMap.id);
+
+ if (handler) {
+ this.depExports[i] = handler(this);
+ return;
+ }
+
+ this.depCount += 1;
+
+ on(depMap, 'defined', bind(this, function (depExports) {
+ this.defineDep(i, depExports);
+ this.check();
+ }));
+
+ if (this.errback) {
+ on(depMap, 'error', this.errback);
+ }
+ }
+
+ id = depMap.id;
+ mod = registry[id];
+
+ //Skip special modules like 'require', 'exports', 'module'
+ //Also, don't call enable if it is already enabled,
+ //important in circular dependency cases.
+ if (!hasProp(handlers, id) && mod && !mod.enabled) {
+ context.enable(depMap, this);
+ }
+ }));
+
+ //Enable each plugin that is used in
+ //a dependency
+ eachProp(this.pluginMaps, bind(this, function (pluginMap) {
+ var mod = getOwn(registry, pluginMap.id);
+ if (mod && !mod.enabled) {
+ context.enable(pluginMap, this);
+ }
+ }));
+
+ this.enabling = false;
+
+ this.check();
+ },
+
+ on: function (name, cb) {
+ var cbs = this.events[name];
+ if (!cbs) {
+ cbs = this.events[name] = [];
+ }
+ cbs.push(cb);
+ },
+
+ emit: function (name, evt) {
+ each(this.events[name], function (cb) {
+ cb(evt);
+ });
+ if (name === 'error') {
+ //Now that the error handler was triggered, remove
+ //the listeners, since this broken Module instance
+ //can stay around for a while in the registry.
+ delete this.events[name];
+ }
+ }
+ };
+
+ function callGetModule(args) {
+ //Skip modules already defined.
+ if (!hasProp(defined, args[0])) {
+ getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]);
+ }
+ }
+
+ function removeListener(node, func, name, ieName) {
+ //Favor detachEvent because of IE9
+ //issue, see attachEvent/addEventListener comment elsewhere
+ //in this file.
+ if (node.detachEvent && !isOpera) {
+ //Probably IE. If not it will throw an error, which will be
+ //useful to know.
+ if (ieName) {
+ node.detachEvent(ieName, func);
+ }
+ } else {
+ node.removeEventListener(name, func, false);
+ }
+ }
+
+ /**
+ * Given an event from a script node, get the requirejs info from it,
+ * and then removes the event listeners on the node.
+ * @param {Event} evt
+ * @returns {Object}
+ */
+ function getScriptData(evt) {
+ //Using currentTarget instead of target for Firefox 2.0's sake. Not
+ //all old browsers will be supported, but this one was easy enough
+ //to support and still makes sense.
+ var node = evt.currentTarget || evt.srcElement;
+
+ //Remove the listeners once here.
+ removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange');
+ removeListener(node, context.onScriptError, 'error');
+
+ return {
+ node: node,
+ id: node && node.getAttribute('data-requiremodule')
+ };
+ }
+
+ function intakeDefines() {
+ var args;
+
+ //Any defined modules in the global queue, intake them now.
+ takeGlobalQueue();
+
+ //Make sure any remaining defQueue items get properly processed.
+ while (defQueue.length) {
+ args = defQueue.shift();
+ if (args[0] === null) {
+ return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));
+ } else {
+ //args are id, deps, factory. Should be normalized by the
+ //define() function.
+ callGetModule(args);
+ }
+ }
+ }
+
+ context = {
+ config: config,
+ contextName: contextName,
+ registry: registry,
+ defined: defined,
+ urlFetched: urlFetched,
+ defQueue: defQueue,
+ Module: Module,
+ makeModuleMap: makeModuleMap,
+ nextTick: req.nextTick,
+
+ /**
+ * Set a configuration for the context.
+ * @param {Object} cfg config object to integrate.
+ */
+ configure: function (cfg) {
+ //Make sure the baseUrl ends in a slash.
+ if (cfg.baseUrl) {
+ if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') {
+ cfg.baseUrl += '/';
+ }
+ }
+
+ //Save off the paths and packages since they require special processing,
+ //they are additive.
+ var pkgs = config.pkgs,
+ shim = config.shim,
+ objs = {
+ paths: true,
+ config: true,
+ map: true
+ };
+
+ eachProp(cfg, function (value, prop) {
+ if (objs[prop]) {
+ if (prop === 'map') {
+ mixin(config[prop], value, true, true);
+ } else {
+ mixin(config[prop], value, true);
+ }
+ } else {
+ config[prop] = value;
+ }
+ });
+
+ //Merge shim
+ if (cfg.shim) {
+ eachProp(cfg.shim, function (value, id) {
+ //Normalize the structure
+ if (isArray(value)) {
+ value = {
+ deps: value
+ };
+ }
+ if ((value.exports || value.init) && !value.exportsFn) {
+ value.exportsFn = context.makeShimExports(value);
+ }
+ shim[id] = value;
+ });
+ config.shim = shim;
+ }
+
+ //Adjust packages if necessary.
+ if (cfg.packages) {
+ each(cfg.packages, function (pkgObj) {
+ var location;
+
+ pkgObj = typeof pkgObj === 'string' ? { name: pkgObj } : pkgObj;
+ location = pkgObj.location;
+
+ //Create a brand new object on pkgs, since currentPackages can
+ //be passed in again, and config.pkgs is the internal transformed
+ //state for all package configs.
+ pkgs[pkgObj.name] = {
+ name: pkgObj.name,
+ location: location || pkgObj.name,
+ //Remove leading dot in main, so main paths are normalized,
+ //and remove any trailing .js, since different package
+ //envs have different conventions: some use a module name,
+ //some use a file name.
+ main: (pkgObj.main || 'main')
+ .replace(currDirRegExp, '')
+ .replace(jsSuffixRegExp, '')
+ };
+ });
+
+ //Done with modifications, assing packages back to context config
+ config.pkgs = pkgs;
+ }
+
+ //If there are any "waiting to execute" modules in the registry,
+ //update the maps for them, since their info, like URLs to load,
+ //may have changed.
+ eachProp(registry, function (mod, id) {
+ //If module already has init called, since it is too
+ //late to modify them, and ignore unnormalized ones
+ //since they are transient.
+ if (!mod.inited && !mod.map.unnormalized) {
+ mod.map = makeModuleMap(id);
+ }
+ });
+
+ //If a deps array or a config callback is specified, then call
+ //require with those args. This is useful when require is defined as a
+ //config object before require.js is loaded.
+ if (cfg.deps || cfg.callback) {
+ context.require(cfg.deps || [], cfg.callback);
+ }
+ },
+
+ makeShimExports: function (value) {
+ function fn() {
+ var ret;
+ if (value.init) {
+ ret = value.init.apply(global, arguments);
+ }
+ return ret || (value.exports && getGlobal(value.exports));
+ }
+ return fn;
+ },
+
+ makeRequire: function (relMap, options) {
+ options = options || {};
+
+ function localRequire(deps, callback, errback) {
+ var id, map, requireMod;
+
+ if (options.enableBuildCallback && callback && isFunction(callback)) {
+ callback.__requireJsBuild = true;
+ }
+
+ if (typeof deps === 'string') {
+ if (isFunction(callback)) {
+ //Invalid call
+ return onError(makeError('requireargs', 'Invalid require call'), errback);
+ }
+
+ //If require|exports|module are requested, get the
+ //value for them from the special handlers. Caveat:
+ //this only works while module is being defined.
+ if (relMap && hasProp(handlers, deps)) {
+ return handlers[deps](registry[relMap.id]);
+ }
+
+ //Synchronous access to one module. If require.get is
+ //available (as in the Node adapter), prefer that.
+ if (req.get) {
+ return req.get(context, deps, relMap);
+ }
+
+ //Normalize module name, if it contains . or ..
+ map = makeModuleMap(deps, relMap, false, true);
+ id = map.id;
+
+ if (!hasProp(defined, id)) {
+ return onError(makeError('notloaded', 'Module name "' +
+ id +
+ '" has not been loaded yet for context: ' +
+ contextName +
+ (relMap ? '' : '. Use require([])')));
+ }
+ return defined[id];
+ }
+
+ //Grab defines waiting in the global queue.
+ intakeDefines();
+
+ //Mark all the dependencies as needing to be loaded.
+ context.nextTick(function () {
+ //Some defines could have been added since the
+ //require call, collect them.
+ intakeDefines();
+
+ requireMod = getModule(makeModuleMap(null, relMap));
+
+ //Store if map config should be applied to this require
+ //call for dependencies.
+ requireMod.skipMap = options.skipMap;
+
+ requireMod.init(deps, callback, errback, {
+ enabled: true
+ });
+
+ checkLoaded();
+ });
+
+ return localRequire;
+ }
+
+ mixin(localRequire, {
+ isBrowser: isBrowser,
+
+ /**
+ * Converts a module name + .extension into an URL path.
+ * *Requires* the use of a module name. It does not support using
+ * plain URLs like nameToUrl.
+ */
+ toUrl: function (moduleNamePlusExt) {
+ var index = moduleNamePlusExt.lastIndexOf('.'),
+ ext = null;
+
+ if (index !== -1) {
+ ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);
+ moduleNamePlusExt = moduleNamePlusExt.substring(0, index);
+ }
+
+ return context.nameToUrl(normalize(moduleNamePlusExt,
+ relMap && relMap.id, true), ext);
+ },
+
+ defined: function (id) {
+ return hasProp(defined, makeModuleMap(id, relMap, false, true).id);
+ },
+
+ specified: function (id) {
+ id = makeModuleMap(id, relMap, false, true).id;
+ return hasProp(defined, id) || hasProp(registry, id);
+ }
+ });
+
+ //Only allow undef on top level require calls
+ if (!relMap) {
+ localRequire.undef = function (id) {
+ //Bind any waiting define() calls to this context,
+ //fix for #408
+ takeGlobalQueue();
+
+ var map = makeModuleMap(id, relMap, true),
+ mod = getOwn(registry, id);
+
+ delete defined[id];
+ delete urlFetched[map.url];
+ delete undefEvents[id];
+
+ if (mod) {
+ //Hold on to listeners in case the
+ //module will be attempted to be reloaded
+ //using a different config.
+ if (mod.events.defined) {
+ undefEvents[id] = mod.events;
+ }
+
+ cleanRegistry(id);
+ }
+ };
+ }
+
+ return localRequire;
+ },
+
+ /**
+ * Called to enable a module if it is still in the registry
+ * awaiting enablement. parent module is passed in for context,
+ * used by the optimizer.
+ */
+ enable: function (depMap, parent) {
+ var mod = getOwn(registry, depMap.id);
+ if (mod) {
+ getModule(depMap).enable();
+ }
+ },
+
+ /**
+ * Internal method used by environment adapters to complete a load event.
+ * A load event could be a script load or just a load pass from a synchronous
+ * load call.
+ * @param {String} moduleName the name of the module to potentially complete.
+ */
+ completeLoad: function (moduleName) {
+ var found, args, mod,
+ shim = getOwn(config.shim, moduleName) || {},
+ shExports = shim.exports;
+
+ takeGlobalQueue();
+
+ while (defQueue.length) {
+ args = defQueue.shift();
+ if (args[0] === null) {
+ args[0] = moduleName;
+ //If already found an anonymous module and bound it
+ //to this name, then this is some other anon module
+ //waiting for its completeLoad to fire.
+ if (found) {
+ break;
+ }
+ found = true;
+ } else if (args[0] === moduleName) {
+ //Found matching define call for this script!
+ found = true;
+ }
+
+ callGetModule(args);
+ }
+
+ //Do this after the cycle of callGetModule in case the result
+ //of those calls/init calls changes the registry.
+ mod = getOwn(registry, moduleName);
+
+ if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) {
+ if (config.enforceDefine && (!shExports || !getGlobal(shExports))) {
+ if (hasPathFallback(moduleName)) {
+ return;
+ } else {
+ return onError(makeError('nodefine',
+ 'No define call for ' + moduleName,
+ null,
+ [moduleName]));
+ }
+ } else {
+ //A script that does not call define(), so just simulate
+ //the call for it.
+ callGetModule([moduleName, (shim.deps || []), shim.exportsFn]);
+ }
+ }
+
+ checkLoaded();
+ },
+
+ /**
+ * Converts a module name to a file path. Supports cases where
+ * moduleName may actually be just an URL.
+ * Note that it **does not** call normalize on the moduleName,
+ * it is assumed to have already been normalized. This is an
+ * internal API, not a public one. Use toUrl for the public API.
+ */
+ nameToUrl: function (moduleName, ext) {
+ var paths, pkgs, pkg, pkgPath, syms, i, parentModule, url,
+ parentPath;
+
+ //If a colon is in the URL, it indicates a protocol is used and it is just
+ //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?)
+ //or ends with .js, then assume the user meant to use an url and not a module id.
+ //The slash is important for protocol-less URLs as well as full paths.
+ if (req.jsExtRegExp.test(moduleName)) {
+ //Just a plain path, not module name lookup, so just return it.
+ //Add extension if it is included. This is a bit wonky, only non-.js things pass
+ //an extension, this method probably needs to be reworked.
+ url = moduleName + (ext || '');
+ } else {
+ //A module that needs to be converted to a path.
+ paths = config.paths;
+ pkgs = config.pkgs;
+
+ syms = moduleName.split('/');
+ //For each module name segment, see if there is a path
+ //registered for it. Start with most specific name
+ //and work up from it.
+ for (i = syms.length; i > 0; i -= 1) {
+ parentModule = syms.slice(0, i).join('/');
+ pkg = getOwn(pkgs, parentModule);
+ parentPath = getOwn(paths, parentModule);
+ if (parentPath) {
+ //If an array, it means there are a few choices,
+ //Choose the one that is desired
+ if (isArray(parentPath)) {
+ parentPath = parentPath[0];
+ }
+ syms.splice(0, i, parentPath);
+ break;
+ } else if (pkg) {
+ //If module name is just the package name, then looking
+ //for the main module.
+ if (moduleName === pkg.name) {
+ pkgPath = pkg.location + '/' + pkg.main;
+ } else {
+ pkgPath = pkg.location;
+ }
+ syms.splice(0, i, pkgPath);
+ break;
+ }
+ }
+
+ //Join the path parts together, then figure out if baseUrl is needed.
+ url = syms.join('/');
+ url += (ext || (/\?/.test(url) ? '' : '.js'));
+ url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url;
+ }
+
+ return config.urlArgs ? url +
+ ((url.indexOf('?') === -1 ? '?' : '&') +
+ config.urlArgs) : url;
+ },
+
+ //Delegates to req.load. Broken out as a separate function to
+ //allow overriding in the optimizer.
+ load: function (id, url) {
+ req.load(context, id, url);
+ },
+
+ /**
+ * Executes a module callack function. Broken out as a separate function
+ * solely to allow the build system to sequence the files in the built
+ * layer in the right sequence.
+ *
+ * @private
+ */
+ execCb: function (name, callback, args, exports) {
+ return callback.apply(exports, args);
+ },
+
+ /**
+ * callback for script loads, used to check status of loading.
+ *
+ * @param {Event} evt the event from the browser for the script
+ * that was loaded.
+ */
+ onScriptLoad: function (evt) {
+ //Using currentTarget instead of target for Firefox 2.0's sake. Not
+ //all old browsers will be supported, but this one was easy enough
+ //to support and still makes sense.
+ if (evt.type === 'load' ||
+ (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) {
+ //Reset interactive script so a script node is not held onto for
+ //to long.
+ interactiveScript = null;
+
+ //Pull out the name of the module and the context.
+ var data = getScriptData(evt);
+ context.completeLoad(data.id);
+ }
+ },
+
+ /**
+ * Callback for script errors.
+ */
+ onScriptError: function (evt) {
+ var data = getScriptData(evt);
+ if (!hasPathFallback(data.id)) {
+ return onError(makeError('scripterror', 'Script error', evt, [data.id]));
+ }
+ }
+ };
+
+ context.require = context.makeRequire();
+ return context;
+ }
+
+ /**
+ * Main entry point.
+ *
+ * If the only argument to require is a string, then the module that
+ * is represented by that string is fetched for the appropriate context.
+ *
+ * If the first argument is an array, then it will be treated as an array
+ * of dependency string names to fetch. An optional function callback can
+ * be specified to execute when all of those dependencies are available.
+ *
+ * Make a local req variable to help Caja compliance (it assumes things
+ * on a require that are not standardized), and to give a short
+ * name for minification/local scope use.
+ */
+ req = requirejs = function (deps, callback, errback, optional) {
+
+ //Find the right context, use default
+ var context, config,
+ contextName = defContextName;
+
+ // Determine if have config object in the call.
+ if (!isArray(deps) && typeof deps !== 'string') {
+ // deps is a config object
+ config = deps;
+ if (isArray(callback)) {
+ // Adjust args if there are dependencies
+ deps = callback;
+ callback = errback;
+ errback = optional;
+ } else {
+ deps = [];
+ }
+ }
+
+ if (config && config.context) {
+ contextName = config.context;
+ }
+
+ context = getOwn(contexts, contextName);
+ if (!context) {
+ context = contexts[contextName] = req.s.newContext(contextName);
+ }
+
+ if (config) {
+ context.configure(config);
+ }
+
+ return context.require(deps, callback, errback);
+ };
+
+ /**
+ * Support require.config() to make it easier to cooperate with other
+ * AMD loaders on globally agreed names.
+ */
+ req.config = function (config) {
+ return req(config);
+ };
+
+ /**
+ * Execute something after the current tick
+ * of the event loop. Override for other envs
+ * that have a better solution than setTimeout.
+ * @param {Function} fn function to execute later.
+ */
+ req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
+ setTimeout(fn, 4);
+ } : function (fn) { fn(); };
+
+ /**
+ * Export require as a global, but only if it does not already exist.
+ */
+ if (!require) {
+ require = req;
+ }
+
+ req.version = version;
+
+ //Used to filter out dependencies that are already paths.
+ req.jsExtRegExp = /^\/|:|\?|\.js$/;
+ req.isBrowser = isBrowser;
+ s = req.s = {
+ contexts: contexts,
+ newContext: newContext
+ };
+
+ //Create default context.
+ req({});
+
+ //Exports some context-sensitive methods on global require.
+ each([
+ 'toUrl',
+ 'undef',
+ 'defined',
+ 'specified'
+ ], function (prop) {
+ //Reference from contexts instead of early binding to default context,
+ //so that during builds, the latest instance of the default context
+ //with its config gets used.
+ req[prop] = function () {
+ var ctx = contexts[defContextName];
+ return ctx.require[prop].apply(ctx, arguments);
+ };
+ });
+
+ if (isBrowser) {
+ head = s.head = document.getElementsByTagName('head')[0];
+ //If BASE tag is in play, using appendChild is a problem for IE6.
+ //When that browser dies, this can be removed. Details in this jQuery bug:
+ //http://dev.jquery.com/ticket/2709
+ baseElement = document.getElementsByTagName('base')[0];
+ if (baseElement) {
+ head = s.head = baseElement.parentNode;
+ }
+ }
+
+ /**
+ * Any errors that require explicitly generates will be passed to this
+ * function. Intercept/override it if you want custom error handling.
+ * @param {Error} err the error object.
+ */
+ req.onError = function (err) {
+ throw err;
+ };
+
+ /**
+ * Does the request to load a module for the browser case.
+ * Make this a separate function to allow other environments
+ * to override it.
+ *
+ * @param {Object} context the require context to find state.
+ * @param {String} moduleName the name of the module.
+ * @param {Object} url the URL to the module.
+ */
+ req.load = function (context, moduleName, url) {
+ var config = (context && context.config) || {},
+ node;
+ if (isBrowser) {
+ //In the browser so use a script tag
+ node = config.xhtml ?
+ document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :
+ document.createElement('script');
+ node.type = config.scriptType || 'text/javascript';
+ node.charset = 'utf-8';
+ node.async = true;
+
+ node.setAttribute('data-requirecontext', context.contextName);
+ node.setAttribute('data-requiremodule', moduleName);
+
+ //Set up load listener. Test attachEvent first because IE9 has
+ //a subtle issue in its addEventListener and script onload firings
+ //that do not match the behavior of all other browsers with
+ //addEventListener support, which fire the onload event for a
+ //script right after the script execution. See:
+ //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution
+ //UNFORTUNATELY Opera implements attachEvent but does not follow the script
+ //script execution mode.
+ if (node.attachEvent &&
+ //Check if node.attachEvent is artificially added by custom script or
+ //natively supported by browser
+ //read https://github.com/jrburke/requirejs/issues/187
+ //if we can NOT find [native code] then it must NOT natively supported.
+ //in IE8, node.attachEvent does not have toString()
+ //Note the test for "[native code" with no closing brace, see:
+ //https://github.com/jrburke/requirejs/issues/273
+ !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) &&
+ !isOpera) {
+ //Probably IE. IE (at least 6-8) do not fire
+ //script onload right after executing the script, so
+ //we cannot tie the anonymous define call to a name.
+ //However, IE reports the script as being in 'interactive'
+ //readyState at the time of the define call.
+ useInteractive = true;
+
+ node.attachEvent('onreadystatechange', context.onScriptLoad);
+ //It would be great to add an error handler here to catch
+ //404s in IE9+. However, onreadystatechange will fire before
+ //the error handler, so that does not help. If addEvenListener
+ //is used, then IE will fire error before load, but we cannot
+ //use that pathway given the connect.microsoft.com issue
+ //mentioned above about not doing the 'script execute,
+ //then fire the script load event listener before execute
+ //next script' that other browsers do.
+ //Best hope: IE10 fixes the issues,
+ //and then destroys all installs of IE 6-9.
+ //node.attachEvent('onerror', context.onScriptError);
+ } else {
+ node.addEventListener('load', context.onScriptLoad, false);
+ node.addEventListener('error', context.onScriptError, false);
+ }
+ node.src = url;
+
+ //For some cache cases in IE 6-8, the script executes before the end
+ //of the appendChild execution, so to tie an anonymous define
+ //call to the module name (which is stored on the node), hold on
+ //to a reference to this node, but clear after the DOM insertion.
+ currentlyAddingScript = node;
+ if (baseElement) {
+ head.insertBefore(node, baseElement);
+ } else {
+ head.appendChild(node);
+ }
+ currentlyAddingScript = null;
+
+ return node;
+ } else if (isWebWorker) {
+ //In a web worker, use importScripts. This is not a very
+ //efficient use of importScripts, importScripts will block until
+ //its script is downloaded and evaluated. However, if web workers
+ //are in play, the expectation that a build has been done so that
+ //only one script needs to be loaded anyway. This may need to be
+ //reevaluated if other use cases become common.
+ importScripts(url);
+
+ //Account for anonymous modules
+ context.completeLoad(moduleName);
+ }
+ };
+
+ function getInteractiveScript() {
+ if (interactiveScript && interactiveScript.readyState === 'interactive') {
+ return interactiveScript;
+ }
+
+ eachReverse(scripts(), function (script) {
+ if (script.readyState === 'interactive') {
+ return (interactiveScript = script);
+ }
+ });
+ return interactiveScript;
+ }
+
+ //Look for a data-main script attribute, which could also adjust the baseUrl.
+ if (isBrowser) {
+ //Figure out baseUrl. Get it from the script tag with require.js in it.
+ eachReverse(scripts(), function (script) {
+ //Set the 'head' where we can append children by
+ //using the script's parent.
+ if (!head) {
+ head = script.parentNode;
+ }
+
+ //Look for a data-main attribute to set main script for the page
+ //to load. If it is there, the path to data main becomes the
+ //baseUrl, if it is not already set.
+ dataMain = script.getAttribute('data-main');
+ if (dataMain) {
+ //Set final baseUrl if there is not already an explicit one.
+ if (!cfg.baseUrl) {
+ //Pull off the directory of data-main for use as the
+ //baseUrl.
+ src = dataMain.split('/');
+ mainScript = src.pop();
+ subPath = src.length ? src.join('/') + '/' : './';
+
+ cfg.baseUrl = subPath;
+ dataMain = mainScript;
+ }
+
+ //Strip off any trailing .js since dataMain is now
+ //like a module name.
+ dataMain = dataMain.replace(jsSuffixRegExp, '');
+
+ //Put the data-main script in the files to load.
+ cfg.deps = cfg.deps ? cfg.deps.concat(dataMain) : [dataMain];
+
+ return true;
+ }
+ });
+ }
+
+ /**
+ * The function that handles definitions of modules. Differs from
+ * require() in that a string for the module should be the first argument,
+ * and the function to execute after dependencies are loaded should
+ * return a value to define the module corresponding to the first argument's
+ * name.
+ */
+ define = function (name, deps, callback) {
+ var node, context;
+
+ //Allow for anonymous modules
+ if (typeof name !== 'string') {
+ //Adjust args appropriately
+ callback = deps;
+ deps = name;
+ name = null;
+ }
+
+ //This module may not have dependencies
+ if (!isArray(deps)) {
+ callback = deps;
+ deps = [];
+ }
+
+ //If no name, and callback is a function, then figure out if it a
+ //CommonJS thing with dependencies.
+ if (!deps.length && isFunction(callback)) {
+ //Remove comments from the callback string,
+ //look for require calls, and pull them into the dependencies,
+ //but only if there are function args.
+ if (callback.length) {
+ callback
+ .toString()
+ .replace(commentRegExp, '')
+ .replace(cjsRequireRegExp, function (match, dep) {
+ deps.push(dep);
+ });
+
+ //May be a CommonJS thing even without require calls, but still
+ //could use exports, and module. Avoid doing exports and module
+ //work though if it just needs require.
+ //REQUIRES the function to expect the CommonJS variables in the
+ //order listed below.
+ deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps);
+ }
+ }
+
+ //If in IE 6-8 and hit an anonymous define() call, do the interactive
+ //work.
+ if (useInteractive) {
+ node = currentlyAddingScript || getInteractiveScript();
+ if (node) {
+ if (!name) {
+ name = node.getAttribute('data-requiremodule');
+ }
+ context = contexts[node.getAttribute('data-requirecontext')];
+ }
+ }
+
+ //Always save off evaluating the def call until the script onload handler.
+ //This allows multiple modules to be in a file without prematurely
+ //tracing dependencies, and allows for anonymous module support,
+ //where the module name is not known until the script onload event
+ //occurs. If no context, use the global queue, and get it processed
+ //in the onscript load callback.
+ (context ? context.defQueue : globalDefQueue).push([name, deps, callback]);
+ };
+
+ define.amd = {
+ jQuery: true
+ };
+
+
+ /**
+ * Executes the text. Normally just uses eval, but can be modified
+ * to use a better, environment-specific call. Only used for transpiling
+ * loader plugins, not for plain JS modules.
+ * @param {String} text the text to execute/evaluate.
+ */
+ req.exec = function (text) {
+ /*jslint evil: true */
+ return eval(text);
+ };
+
+ //Set up with config info.
+ req(cfg);
+}(this)); \ No newline at end of file
diff --git a/addons/im_livechat/static/ext/static/js/to_jsonp.py b/addons/im_livechat/static/ext/static/js/to_jsonp.py
new file mode 100644
index 00000000000..61f1a885768
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/js/to_jsonp.py
@@ -0,0 +1,12 @@
+
+import sys
+import json
+
+file_name = sys.argv[1]
+function_name = sys.argv[2]
+
+with open(file_name) as file_:
+ content = file_.read()
+
+print "window.%s(%s);" % (function_name, json.dumps(content))
+
diff --git a/addons/im_livechat/static/ext/static/js/underscore.js b/addons/im_livechat/static/ext/static/js/underscore.js
new file mode 100644
index 00000000000..c2517054bfb
--- /dev/null
+++ b/addons/im_livechat/static/ext/static/js/underscore.js
@@ -0,0 +1,1221 @@
+// Underscore.js 1.4.3
+// http://underscorejs.org
+// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore may be freely distributed under the MIT license.
+
+(function() {
+
+ // Baseline setup
+ // --------------
+
+ // Establish the root object, `window` in the browser, or `global` on the server.
+ var root = this;
+
+ // Save the previous value of the `_` variable.
+ var previousUnderscore = root._;
+
+ // Establish the object that gets returned to break out of a loop iteration.
+ var breaker = {};
+
+ // Save bytes in the minified (but not gzipped) version:
+ var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
+
+ // Create quick reference variables for speed access to core prototypes.
+ var push = ArrayProto.push,
+ slice = ArrayProto.slice,
+ concat = ArrayProto.concat,
+ toString = ObjProto.toString,
+ hasOwnProperty = ObjProto.hasOwnProperty;
+
+ // All **ECMAScript 5** native function implementations that we hope to use
+ // are declared here.
+ var
+ nativeForEach = ArrayProto.forEach,
+ nativeMap = ArrayProto.map,
+ nativeReduce = ArrayProto.reduce,
+ nativeReduceRight = ArrayProto.reduceRight,
+ nativeFilter = ArrayProto.filter,
+ nativeEvery = ArrayProto.every,
+ nativeSome = ArrayProto.some,
+ nativeIndexOf = ArrayProto.indexOf,
+ nativeLastIndexOf = ArrayProto.lastIndexOf,
+ nativeIsArray = Array.isArray,
+ nativeKeys = Object.keys,
+ nativeBind = FuncProto.bind;
+
+ // Create a safe reference to the Underscore object for use below.
+ var _ = function(obj) {
+ if (obj instanceof _) return obj;
+ if (!(this instanceof _)) return new _(obj);
+ this._wrapped = obj;
+ };
+
+ // Export the Underscore object for **Node.js**, with
+ // backwards-compatibility for the old `require()` API. If we're in
+ // the browser, add `_` as a global object via a string identifier,
+ // for Closure Compiler "advanced" mode.
+ if (typeof exports !== 'undefined') {
+ if (typeof module !== 'undefined' && module.exports) {
+ exports = module.exports = _;
+ }
+ exports._ = _;
+ } else {
+ root._ = _;
+ }
+
+ // Current version.
+ _.VERSION = '1.4.3';
+
+ // Collection Functions
+ // --------------------
+
+ // The cornerstone, an `each` implementation, aka `forEach`.
+ // Handles objects with the built-in `forEach`, arrays, and raw objects.
+ // Delegates to **ECMAScript 5**'s native `forEach` if available.
+ var each = _.each = _.forEach = function(obj, iterator, context) {
+ if (obj == null) return;
+ if (nativeForEach && obj.forEach === nativeForEach) {
+ obj.forEach(iterator, context);
+ } else if (obj.length === +obj.length) {
+ for (var i = 0, l = obj.length; i < l; i++) {
+ if (iterator.call(context, obj[i], i, obj) === breaker) return;
+ }
+ } else {
+ for (var key in obj) {
+ if (_.has(obj, key)) {
+ if (iterator.call(context, obj[key], key, obj) === breaker) return;
+ }
+ }
+ }
+ };
+
+ // Return the results of applying the iterator to each element.
+ // Delegates to **ECMAScript 5**'s native `map` if available.
+ _.map = _.collect = function(obj, iterator, context) {
+ var results = [];
+ if (obj == null) return results;
+ if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
+ each(obj, function(value, index, list) {
+ results[results.length] = iterator.call(context, value, index, list);
+ });
+ return results;
+ };
+
+ var reduceError = 'Reduce of empty array with no initial value';
+
+ // **Reduce** builds up a single result from a list of values, aka `inject`,
+ // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
+ _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
+ var initial = arguments.length > 2;
+ if (obj == null) obj = [];
+ if (nativeReduce && obj.reduce === nativeReduce) {
+ if (context) iterator = _.bind(iterator, context);
+ return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
+ }
+ each(obj, function(value, index, list) {
+ if (!initial) {
+ memo = value;
+ initial = true;
+ } else {
+ memo = iterator.call(context, memo, value, index, list);
+ }
+ });
+ if (!initial) throw new TypeError(reduceError);
+ return memo;
+ };
+
+ // The right-associative version of reduce, also known as `foldr`.
+ // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
+ _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
+ var initial = arguments.length > 2;
+ if (obj == null) obj = [];
+ if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
+ if (context) iterator = _.bind(iterator, context);
+ return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
+ }
+ var length = obj.length;
+ if (length !== +length) {
+ var keys = _.keys(obj);
+ length = keys.length;
+ }
+ each(obj, function(value, index, list) {
+ index = keys ? keys[--length] : --length;
+ if (!initial) {
+ memo = obj[index];
+ initial = true;
+ } else {
+ memo = iterator.call(context, memo, obj[index], index, list);
+ }
+ });
+ if (!initial) throw new TypeError(reduceError);
+ return memo;
+ };
+
+ // Return the first value which passes a truth test. Aliased as `detect`.
+ _.find = _.detect = function(obj, iterator, context) {
+ var result;
+ any(obj, function(value, index, list) {
+ if (iterator.call(context, value, index, list)) {
+ result = value;
+ return true;
+ }
+ });
+ return result;
+ };
+
+ // Return all the elements that pass a truth test.
+ // Delegates to **ECMAScript 5**'s native `filter` if available.
+ // Aliased as `select`.
+ _.filter = _.select = function(obj, iterator, context) {
+ var results = [];
+ if (obj == null) return results;
+ if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
+ each(obj, function(value, index, list) {
+ if (iterator.call(context, value, index, list)) results[results.length] = value;
+ });
+ return results;
+ };
+
+ // Return all the elements for which a truth test fails.
+ _.reject = function(obj, iterator, context) {
+ return _.filter(obj, function(value, index, list) {
+ return !iterator.call(context, value, index, list);
+ }, context);
+ };
+
+ // Determine whether all of the elements match a truth test.
+ // Delegates to **ECMAScript 5**'s native `every` if available.
+ // Aliased as `all`.
+ _.every = _.all = function(obj, iterator, context) {
+ iterator || (iterator = _.identity);
+ var result = true;
+ if (obj == null) return result;
+ if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
+ each(obj, function(value, index, list) {
+ if (!(result = result && iterator.call(context, value, index, list))) return breaker;
+ });
+ return !!result;
+ };
+
+ // Determine if at least one element in the object matches a truth test.
+ // Delegates to **ECMAScript 5**'s native `some` if available.
+ // Aliased as `any`.
+ var any = _.some = _.any = function(obj, iterator, context) {
+ iterator || (iterator = _.identity);
+ var result = false;
+ if (obj == null) return result;
+ if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
+ each(obj, function(value, index, list) {
+ if (result || (result = iterator.call(context, value, index, list))) return breaker;
+ });
+ return !!result;
+ };
+
+ // Determine if the array or object contains a given value (using `===`).
+ // Aliased as `include`.
+ _.contains = _.include = function(obj, target) {
+ if (obj == null) return false;
+ if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
+ return any(obj, function(value) {
+ return value === target;
+ });
+ };
+
+ // Invoke a method (with arguments) on every item in a collection.
+ _.invoke = function(obj, method) {
+ var args = slice.call(arguments, 2);
+ return _.map(obj, function(value) {
+ return (_.isFunction(method) ? method : value[method]).apply(value, args);
+ });
+ };
+
+ // Convenience version of a common use case of `map`: fetching a property.
+ _.pluck = function(obj, key) {
+ return _.map(obj, function(value){ return value[key]; });
+ };
+
+ // Convenience version of a common use case of `filter`: selecting only objects
+ // with specific `key:value` pairs.
+ _.where = function(obj, attrs) {
+ if (_.isEmpty(attrs)) return [];
+ return _.filter(obj, function(value) {
+ for (var key in attrs) {
+ if (attrs[key] !== value[key]) return false;
+ }
+ return true;
+ });
+ };
+
+ // Return the maximum element or (element-based computation).
+ // Can't optimize arrays of integers longer than 65,535 elements.
+ // See: https://bugs.webkit.org/show_bug.cgi?id=80797
+ _.max = function(obj, iterator, context) {
+ if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
+ return Math.max.apply(Math, obj);
+ }
+ if (!iterator && _.isEmpty(obj)) return -Infinity;
+ var result = {computed : -Infinity, value: -Infinity};
+ each(obj, function(value, index, list) {
+ var computed = iterator ? iterator.call(context, value, index, list) : value;
+ computed >= result.computed && (result = {value : value, computed : computed});
+ });
+ return result.value;
+ };
+
+ // Return the minimum element (or element-based computation).
+ _.min = function(obj, iterator, context) {
+ if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
+ return Math.min.apply(Math, obj);
+ }
+ if (!iterator && _.isEmpty(obj)) return Infinity;
+ var result = {computed : Infinity, value: Infinity};
+ each(obj, function(value, index, list) {
+ var computed = iterator ? iterator.call(context, value, index, list) : value;
+ computed < result.computed && (result = {value : value, computed : computed});
+ });
+ return result.value;
+ };
+
+ // Shuffle an array.
+ _.shuffle = function(obj) {
+ var rand;
+ var index = 0;
+ var shuffled = [];
+ each(obj, function(value) {
+ rand = _.random(index++);
+ shuffled[index - 1] = shuffled[rand];
+ shuffled[rand] = value;
+ });
+ return shuffled;
+ };
+
+ // An internal function to generate lookup iterators.
+ var lookupIterator = function(value) {
+ return _.isFunction(value) ? value : function(obj){ return obj[value]; };
+ };
+
+ // Sort the object's values by a criterion produced by an iterator.
+ _.sortBy = function(obj, value, context) {
+ var iterator = lookupIterator(value);
+ return _.pluck(_.map(obj, function(value, index, list) {
+ return {
+ value : value,
+ index : index,
+ criteria : iterator.call(context, value, index, list)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria;
+ var b = right.criteria;
+ if (a !== b) {
+ if (a > b || a === void 0) return 1;
+ if (a < b || b === void 0) return -1;
+ }
+ return left.index < right.index ? -1 : 1;
+ }), 'value');
+ };
+
+ // An internal function used for aggregate "group by" operations.
+ var group = function(obj, value, context, behavior) {
+ var result = {};
+ var iterator = lookupIterator(value || _.identity);
+ each(obj, function(value, index) {
+ var key = iterator.call(context, value, index, obj);
+ behavior(result, key, value);
+ });
+ return result;
+ };
+
+ // Groups the object's values by a criterion. Pass either a string attribute
+ // to group by, or a function that returns the criterion.
+ _.groupBy = function(obj, value, context) {
+ return group(obj, value, context, function(result, key, value) {
+ (_.has(result, key) ? result[key] : (result[key] = [])).push(value);
+ });
+ };
+
+ // Counts instances of an object that group by a certain criterion. Pass
+ // either a string attribute to count by, or a function that returns the
+ // criterion.
+ _.countBy = function(obj, value, context) {
+ return group(obj, value, context, function(result, key) {
+ if (!_.has(result, key)) result[key] = 0;
+ result[key]++;
+ });
+ };
+
+ // Use a comparator function to figure out the smallest index at which
+ // an object should be inserted so as to maintain order. Uses binary search.
+ _.sortedIndex = function(array, obj, iterator, context) {
+ iterator = iterator == null ? _.identity : lookupIterator(iterator);
+ var value = iterator.call(context, obj);
+ var low = 0, high = array.length;
+ while (low < high) {
+ var mid = (low + high) >>> 1;
+ iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
+ }
+ return low;
+ };
+
+ // Safely convert anything iterable into a real, live array.
+ _.toArray = function(obj) {
+ if (!obj) return [];
+ if (_.isArray(obj)) return slice.call(obj);
+ if (obj.length === +obj.length) return _.map(obj, _.identity);
+ return _.values(obj);
+ };
+
+ // Return the number of elements in an object.
+ _.size = function(obj) {
+ if (obj == null) return 0;
+ return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
+ };
+
+ // Array Functions
+ // ---------------
+
+ // Get the first element of an array. Passing **n** will return the first N
+ // values in the array. Aliased as `head` and `take`. The **guard** check
+ // allows it to work with `_.map`.
+ _.first = _.head = _.take = function(array, n, guard) {
+ if (array == null) return void 0;
+ return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
+ };
+
+ // Returns everything but the last entry of the array. Especially useful on
+ // the arguments object. Passing **n** will return all the values in
+ // the array, excluding the last N. The **guard** check allows it to work with
+ // `_.map`.
+ _.initial = function(array, n, guard) {
+ return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
+ };
+
+ // Get the last element of an array. Passing **n** will return the last N
+ // values in the array. The **guard** check allows it to work with `_.map`.
+ _.last = function(array, n, guard) {
+ if (array == null) return void 0;
+ if ((n != null) && !guard) {
+ return slice.call(array, Math.max(array.length - n, 0));
+ } else {
+ return array[array.length - 1];
+ }
+ };
+
+ // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
+ // Especially useful on the arguments object. Passing an **n** will return
+ // the rest N values in the array. The **guard**
+ // check allows it to work with `_.map`.
+ _.rest = _.tail = _.drop = function(array, n, guard) {
+ return slice.call(array, (n == null) || guard ? 1 : n);
+ };
+
+ // Trim out all falsy values from an array.
+ _.compact = function(array) {
+ return _.filter(array, _.identity);
+ };
+
+ // Internal implementation of a recursive `flatten` function.
+ var flatten = function(input, shallow, output) {
+ each(input, function(value) {
+ if (_.isArray(value)) {
+ shallow ? push.apply(output, value) : flatten(value, shallow, output);
+ } else {
+ output.push(value);
+ }
+ });
+ return output;
+ };
+
+ // Return a completely flattened version of an array.
+ _.flatten = function(array, shallow) {
+ return flatten(array, shallow, []);
+ };
+
+ // Return a version of the array that does not contain the specified value(s).
+ _.without = function(array) {
+ return _.difference(array, slice.call(arguments, 1));
+ };
+
+ // Produce a duplicate-free version of the array. If the array has already
+ // been sorted, you have the option of using a faster algorithm.
+ // Aliased as `unique`.
+ _.uniq = _.unique = function(array, isSorted, iterator, context) {
+ if (_.isFunction(isSorted)) {
+ context = iterator;
+ iterator = isSorted;
+ isSorted = false;
+ }
+ var initial = iterator ? _.map(array, iterator, context) : array;
+ var results = [];
+ var seen = [];
+ each(initial, function(value, index) {
+ if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
+ seen.push(value);
+ results.push(array[index]);
+ }
+ });
+ return results;
+ };
+
+ // Produce an array that contains the union: each distinct element from all of
+ // the passed-in arrays.
+ _.union = function() {
+ return _.uniq(concat.apply(ArrayProto, arguments));
+ };
+
+ // Produce an array that contains every item shared between all the
+ // passed-in arrays.
+ _.intersection = function(array) {
+ var rest = slice.call(arguments, 1);
+ return _.filter(_.uniq(array), function(item) {
+ return _.every(rest, function(other) {
+ return _.indexOf(other, item) >= 0;
+ });
+ });
+ };
+
+ // Take the difference between one array and a number of other arrays.
+ // Only the elements present in just the first array will remain.
+ _.difference = function(array) {
+ var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
+ return _.filter(array, function(value){ return !_.contains(rest, value); });
+ };
+
+ // Zip together multiple lists into a single array -- elements that share
+ // an index go together.
+ _.zip = function() {
+ var args = slice.call(arguments);
+ var length = _.max(_.pluck(args, 'length'));
+ var results = new Array(length);
+ for (var i = 0; i < length; i++) {
+ results[i] = _.pluck(args, "" + i);
+ }
+ return results;
+ };
+
+ // Converts lists into objects. Pass either a single array of `[key, value]`
+ // pairs, or two parallel arrays of the same length -- one of keys, and one of
+ // the corresponding values.
+ _.object = function(list, values) {
+ if (list == null) return {};
+ var result = {};
+ for (var i = 0, l = list.length; i < l; i++) {
+ if (values) {
+ result[list[i]] = values[i];
+ } else {
+ result[list[i][0]] = list[i][1];
+ }
+ }
+ return result;
+ };
+
+ // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
+ // we need this function. Return the position of the first occurrence of an
+ // item in an array, or -1 if the item is not included in the array.
+ // Delegates to **ECMAScript 5**'s native `indexOf` if available.
+ // If the array is large and already in sort order, pass `true`
+ // for **isSorted** to use binary search.
+ _.indexOf = function(array, item, isSorted) {
+ if (array == null) return -1;
+ var i = 0, l = array.length;
+ if (isSorted) {
+ if (typeof isSorted == 'number') {
+ i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);
+ } else {
+ i = _.sortedIndex(array, item);
+ return array[i] === item ? i : -1;
+ }
+ }
+ if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
+ for (; i < l; i++) if (array[i] === item) return i;
+ return -1;
+ };
+
+ // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
+ _.lastIndexOf = function(array, item, from) {
+ if (array == null) return -1;
+ var hasIndex = from != null;
+ if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
+ return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
+ }
+ var i = (hasIndex ? from : array.length);
+ while (i--) if (array[i] === item) return i;
+ return -1;
+ };
+
+ // Generate an integer Array containing an arithmetic progression. A port of
+ // the native Python `range()` function. See
+ // [the Python documentation](http://docs.python.org/library/functions.html#range).
+ _.range = function(start, stop, step) {
+ if (arguments.length <= 1) {
+ stop = start || 0;
+ start = 0;
+ }
+ step = arguments[2] || 1;
+
+ var len = Math.max(Math.ceil((stop - start) / step), 0);
+ var idx = 0;
+ var range = new Array(len);
+
+ while(idx < len) {
+ range[idx++] = start;
+ start += step;
+ }
+
+ return range;
+ };
+
+ // Function (ahem) Functions
+ // ------------------
+
+ // Reusable constructor function for prototype setting.
+ var ctor = function(){};
+
+ // Create a function bound to a given object (assigning `this`, and arguments,
+ // optionally). Binding with arguments is also known as `curry`.
+ // Delegates to **ECMAScript 5**'s native `Function.bind` if available.
+ // We check for `func.bind` first, to fail fast when `func` is undefined.
+ _.bind = function(func, context) {
+ var args, bound;
+ if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
+ if (!_.isFunction(func)) throw new TypeError;
+ args = slice.call(arguments, 2);
+ return bound = function() {
+ if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
+ ctor.prototype = func.prototype;
+ var self = new ctor;
+ ctor.prototype = null;
+ var result = func.apply(self, args.concat(slice.call(arguments)));
+ if (Object(result) === result) return result;
+ return self;
+ };
+ };
+
+ // Bind all of an object's methods to that object. Useful for ensuring that
+ // all callbacks defined on an object belong to it.
+ _.bindAll = function(obj) {
+ var funcs = slice.call(arguments, 1);
+ if (funcs.length == 0) funcs = _.functions(obj);
+ each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
+ return obj;
+ };
+
+ // Memoize an expensive function by storing its results.
+ _.memoize = function(func, hasher) {
+ var memo = {};
+ hasher || (hasher = _.identity);
+ return function() {
+ var key = hasher.apply(this, arguments);
+ return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
+ };
+ };
+
+ // Delays a function for the given number of milliseconds, and then calls
+ // it with the arguments supplied.
+ _.delay = function(func, wait) {
+ var args = slice.call(arguments, 2);
+ return setTimeout(function(){ return func.apply(null, args); }, wait);
+ };
+
+ // Defers a function, scheduling it to run after the current call stack has
+ // cleared.
+ _.defer = function(func) {
+ return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
+ };
+
+ // Returns a function, that, when invoked, will only be triggered at most once
+ // during a given window of time.
+ _.throttle = function(func, wait) {
+ var context, args, timeout, result;
+ var previous = 0;
+ var later = function() {
+ previous = new Date;
+ timeout = null;
+ result = func.apply(context, args);
+ };
+ return function() {
+ var now = new Date;
+ var remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0) {
+ clearTimeout(timeout);
+ timeout = null;
+ previous = now;
+ result = func.apply(context, args);
+ } else if (!timeout) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+ };
+
+ // Returns a function, that, as long as it continues to be invoked, will not
+ // be triggered. The function will be called after it stops being called for
+ // N milliseconds. If `immediate` is passed, trigger the function on the
+ // leading edge, instead of the trailing.
+ _.debounce = function(func, wait, immediate) {
+ var timeout, result;
+ return function() {
+ var context = this, args = arguments;
+ var later = function() {
+ timeout = null;
+ if (!immediate) result = func.apply(context, args);
+ };
+ var callNow = immediate && !timeout;
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ if (callNow) result = func.apply(context, args);
+ return result;
+ };
+ };
+
+ // Returns a function that will be executed at most one time, no matter how
+ // often you call it. Useful for lazy initialization.
+ _.once = function(func) {
+ var ran = false, memo;
+ return function() {
+ if (ran) return memo;
+ ran = true;
+ memo = func.apply(this, arguments);
+ func = null;
+ return memo;
+ };
+ };
+
+ // Returns the first function passed as an argument to the second,
+ // allowing you to adjust arguments, run code before and after, and
+ // conditionally execute the original function.
+ _.wrap = function(func, wrapper) {
+ return function() {
+ var args = [func];
+ push.apply(args, arguments);
+ return wrapper.apply(this, args);
+ };
+ };
+
+ // Returns a function that is the composition of a list of functions, each
+ // consuming the return value of the function that follows.
+ _.compose = function() {
+ var funcs = arguments;
+ return function() {
+ var args = arguments;
+ for (var i = funcs.length - 1; i >= 0; i--) {
+ args = [funcs[i].apply(this, args)];
+ }
+ return args[0];
+ };
+ };
+
+ // Returns a function that will only be executed after being called N times.
+ _.after = function(times, func) {
+ if (times <= 0) return func();
+ return function() {
+ if (--times < 1) {
+ return func.apply(this, arguments);
+ }
+ };
+ };
+
+ // Object Functions
+ // ----------------
+
+ // Retrieve the names of an object's properties.
+ // Delegates to **ECMAScript 5**'s native `Object.keys`
+ _.keys = nativeKeys || function(obj) {
+ if (obj !== Object(obj)) throw new TypeError('Invalid object');
+ var keys = [];
+ for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
+ return keys;
+ };
+
+ // Retrieve the values of an object's properties.
+ _.values = function(obj) {
+ var values = [];
+ for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);
+ return values;
+ };
+
+ // Convert an object into a list of `[key, value]` pairs.
+ _.pairs = function(obj) {
+ var pairs = [];
+ for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);
+ return pairs;
+ };
+
+ // Invert the keys and values of an object. The values must be serializable.
+ _.invert = function(obj) {
+ var result = {};
+ for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;
+ return result;
+ };
+
+ // Return a sorted list of the function names available on the object.
+ // Aliased as `methods`
+ _.functions = _.methods = function(obj) {
+ var names = [];
+ for (var key in obj) {
+ if (_.isFunction(obj[key])) names.push(key);
+ }
+ return names.sort();
+ };
+
+ // Extend a given object with all the properties in passed-in object(s).
+ _.extend = function(obj) {
+ each(slice.call(arguments, 1), function(source) {
+ if (source) {
+ for (var prop in source) {
+ obj[prop] = source[prop];
+ }
+ }
+ });
+ return obj;
+ };
+
+ // Return a copy of the object only containing the whitelisted properties.
+ _.pick = function(obj) {
+ var copy = {};
+ var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
+ each(keys, function(key) {
+ if (key in obj) copy[key] = obj[key];
+ });
+ return copy;
+ };
+
+ // Return a copy of the object without the blacklisted properties.
+ _.omit = function(obj) {
+ var copy = {};
+ var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
+ for (var key in obj) {
+ if (!_.contains(keys, key)) copy[key] = obj[key];
+ }
+ return copy;
+ };
+
+ // Fill in a given object with default properties.
+ _.defaults = function(obj) {
+ each(slice.call(arguments, 1), function(source) {
+ if (source) {
+ for (var prop in source) {
+ if (obj[prop] == null) obj[prop] = source[prop];
+ }
+ }
+ });
+ return obj;
+ };
+
+ // Create a (shallow-cloned) duplicate of an object.
+ _.clone = function(obj) {
+ if (!_.isObject(obj)) return obj;
+ return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
+ };
+
+ // Invokes interceptor with the obj, and then returns obj.
+ // The primary purpose of this method is to "tap into" a method chain, in
+ // order to perform operations on intermediate results within the chain.
+ _.tap = function(obj, interceptor) {
+ interceptor(obj);
+ return obj;
+ };
+
+ // Internal recursive comparison function for `isEqual`.
+ var eq = function(a, b, aStack, bStack) {
+ // Identical objects are equal. `0 === -0`, but they aren't identical.
+ // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
+ if (a === b) return a !== 0 || 1 / a == 1 / b;
+ // A strict comparison is necessary because `null == undefined`.
+ if (a == null || b == null) return a === b;
+ // Unwrap any wrapped objects.
+ if (a instanceof _) a = a._wrapped;
+ if (b instanceof _) b = b._wrapped;
+ // Compare `[[Class]]` names.
+ var className = toString.call(a);
+ if (className != toString.call(b)) return false;
+ switch (className) {
+ // Strings, numbers, dates, and booleans are compared by value.
+ case '[object String]':
+ // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+ // equivalent to `new String("5")`.
+ return a == String(b);
+ case '[object Number]':
+ // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
+ // other numeric values.
+ return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
+ case '[object Date]':
+ case '[object Boolean]':
+ // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+ // millisecond representations. Note that invalid dates with millisecond representations
+ // of `NaN` are not equivalent.
+ return +a == +b;
+ // RegExps are compared by their source patterns and flags.
+ case '[object RegExp]':
+ return a.source == b.source &&
+ a.global == b.global &&
+ a.multiline == b.multiline &&
+ a.ignoreCase == b.ignoreCase;
+ }
+ if (typeof a != 'object' || typeof b != 'object') return false;
+ // Assume equality for cyclic structures. The algorithm for detecting cyclic
+ // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+ var length = aStack.length;
+ while (length--) {
+ // Linear search. Performance is inversely proportional to the number of
+ // unique nested structures.
+ if (aStack[length] == a) return bStack[length] == b;
+ }
+ // Add the first object to the stack of traversed objects.
+ aStack.push(a);
+ bStack.push(b);
+ var size = 0, result = true;
+ // Recursively compare objects and arrays.
+ if (className == '[object Array]') {
+ // Compare array lengths to determine if a deep comparison is necessary.
+ size = a.length;
+ result = size == b.length;
+ if (result) {
+ // Deep compare the contents, ignoring non-numeric properties.
+ while (size--) {
+ if (!(result = eq(a[size], b[size], aStack, bStack))) break;
+ }
+ }
+ } else {
+ // Objects with different constructors are not equivalent, but `Object`s
+ // from different frames are.
+ var aCtor = a.constructor, bCtor = b.constructor;
+ if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
+ _.isFunction(bCtor) && (bCtor instanceof bCtor))) {
+ return false;
+ }
+ // Deep compare objects.
+ for (var key in a) {
+ if (_.has(a, key)) {
+ // Count the expected number of properties.
+ size++;
+ // Deep compare each member.
+ if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
+ }
+ }
+ // Ensure that both objects contain the same number of properties.
+ if (result) {
+ for (key in b) {
+ if (_.has(b, key) && !(size--)) break;
+ }
+ result = !size;
+ }
+ }
+ // Remove the first object from the stack of traversed objects.
+ aStack.pop();
+ bStack.pop();
+ return result;
+ };
+
+ // Perform a deep comparison to check if two objects are equal.
+ _.isEqual = function(a, b) {
+ return eq(a, b, [], []);
+ };
+
+ // Is a given array, string, or object empty?
+ // An "empty" object has no enumerable own-properties.
+ _.isEmpty = function(obj) {
+ if (obj == null) return true;
+ if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
+ for (var key in obj) if (_.has(obj, key)) return false;
+ return true;
+ };
+
+ // Is a given value a DOM element?
+ _.isElement = function(obj) {
+ return !!(obj && obj.nodeType === 1);
+ };
+
+ // Is a given value an array?
+ // Delegates to ECMA5's native Array.isArray
+ _.isArray = nativeIsArray || function(obj) {
+ return toString.call(obj) == '[object Array]';
+ };
+
+ // Is a given variable an object?
+ _.isObject = function(obj) {
+ return obj === Object(obj);
+ };
+
+ // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
+ each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
+ _['is' + name] = function(obj) {
+ return toString.call(obj) == '[object ' + name + ']';
+ };
+ });
+
+ // Define a fallback version of the method in browsers (ahem, IE), where
+ // there isn't any inspectable "Arguments" type.
+ if (!_.isArguments(arguments)) {
+ _.isArguments = function(obj) {
+ return !!(obj && _.has(obj, 'callee'));
+ };
+ }
+
+ // Optimize `isFunction` if appropriate.
+ if (typeof (/./) !== 'function') {
+ _.isFunction = function(obj) {
+ return typeof obj === 'function';
+ };
+ }
+
+ // Is a given object a finite number?
+ _.isFinite = function(obj) {
+ return isFinite(obj) && !isNaN(parseFloat(obj));
+ };
+
+ // Is the given value `NaN`? (NaN is the only number which does not equal itself).
+ _.isNaN = function(obj) {
+ return _.isNumber(obj) && obj != +obj;
+ };
+
+ // Is a given value a boolean?
+ _.isBoolean = function(obj) {
+ return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
+ };
+
+ // Is a given value equal to null?
+ _.isNull = function(obj) {
+ return obj === null;
+ };
+
+ // Is a given variable undefined?
+ _.isUndefined = function(obj) {
+ return obj === void 0;
+ };
+
+ // Shortcut function for checking if an object has a given property directly
+ // on itself (in other words, not on a prototype).
+ _.has = function(obj, key) {
+ return hasOwnProperty.call(obj, key);
+ };
+
+ // Utility Functions
+ // -----------------
+
+ // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
+ // previous owner. Returns a reference to the Underscore object.
+ _.noConflict = function() {
+ root._ = previousUnderscore;
+ return this;
+ };
+
+ // Keep the identity function around for default iterators.
+ _.identity = function(value) {
+ return value;
+ };
+
+ // Run a function **n** times.
+ _.times = function(n, iterator, context) {
+ var accum = Array(n);
+ for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
+ return accum;
+ };
+
+ // Return a random integer between min and max (inclusive).
+ _.random = function(min, max) {
+ if (max == null) {
+ max = min;
+ min = 0;
+ }
+ return min + (0 | Math.random() * (max - min + 1));
+ };
+
+ // List of HTML entities for escaping.
+ var entityMap = {
+ escape: {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&quot;',
+ "'": '&#x27;',
+ '/': '&#x2F;'
+ }
+ };
+ entityMap.unescape = _.invert(entityMap.escape);
+
+ // Regexes containing the keys and values listed immediately above.
+ var entityRegexes = {
+ escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
+ unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
+ };
+
+ // Functions for escaping and unescaping strings to/from HTML interpolation.
+ _.each(['escape', 'unescape'], function(method) {
+ _[method] = function(string) {
+ if (string == null) return '';
+ return ('' + string).replace(entityRegexes[method], function(match) {
+ return entityMap[method][match];
+ });
+ };
+ });
+
+ // If the value of the named property is a function then invoke it;
+ // otherwise, return it.
+ _.result = function(object, property) {
+ if (object == null) return null;
+ var value = object[property];
+ return _.isFunction(value) ? value.call(object) : value;
+ };
+
+ // Add your own custom functions to the Underscore object.
+ _.mixin = function(obj) {
+ each(_.functions(obj), function(name){
+ var func = _[name] = obj[name];
+ _.prototype[name] = function() {
+ var args = [this._wrapped];
+ push.apply(args, arguments);
+ return result.call(this, func.apply(_, args));
+ };
+ });
+ };
+
+ // Generate a unique integer id (unique within the entire client session).
+ // Useful for temporary DOM ids.
+ var idCounter = 0;
+ _.uniqueId = function(prefix) {
+ var id = '' + ++idCounter;
+ return prefix ? prefix + id : id;
+ };
+
+ // By default, Underscore uses ERB-style template delimiters, change the
+ // following template settings to use alternative delimiters.
+ _.templateSettings = {
+ evaluate : /<%([\s\S]+?)%>/g,
+ interpolate : /<%=([\s\S]+?)%>/g,
+ escape : /<%-([\s\S]+?)%>/g
+ };
+
+ // When customizing `templateSettings`, if you don't want to define an
+ // interpolation, evaluation or escaping regex, we need one that is
+ // guaranteed not to match.
+ var noMatch = /(.)^/;
+
+ // Certain characters need to be escaped so that they can be put into a
+ // string literal.
+ var escapes = {
+ "'": "'",
+ '\\': '\\',
+ '\r': 'r',
+ '\n': 'n',
+ '\t': 't',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+ };
+
+ var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
+
+ // JavaScript micro-templating, similar to John Resig's implementation.
+ // Underscore templating handles arbitrary delimiters, preserves whitespace,
+ // and correctly escapes quotes within interpolated code.
+ _.template = function(text, data, settings) {
+ settings = _.defaults({}, settings, _.templateSettings);
+
+ // Combine delimiters into one regular expression via alternation.
+ var matcher = new RegExp([
+ (settings.escape || noMatch).source,
+ (settings.interpolate || noMatch).source,
+ (settings.evaluate || noMatch).source
+ ].join('|') + '|$', 'g');
+
+ // Compile the template source, escaping string literals appropriately.
+ var index = 0;
+ var source = "__p+='";
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+ source += text.slice(index, offset)
+ .replace(escaper, function(match) { return '\\' + escapes[match]; });
+
+ if (escape) {
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+ }
+ if (interpolate) {
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+ }
+ if (evaluate) {
+ source += "';\n" + evaluate + "\n__p+='";
+ }
+ index = offset + match.length;
+ return match;
+ });
+ source += "';\n";
+
+ // If a variable is not specified, place data values in local scope.
+ if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
+
+ source = "var __t,__p='',__j=Array.prototype.join," +
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
+ source + "return __p;\n";
+
+ try {
+ var render = new Function(settings.variable || 'obj', '_', source);
+ } catch (e) {
+ e.source = source;
+ throw e;
+ }
+
+ if (data) return render(data, _);
+ var template = function(data) {
+ return render.call(this, data, _);
+ };
+
+ // Provide the compiled function source as a convenience for precompilation.
+ template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
+
+ return template;
+ };
+
+ // Add a "chain" function, which will delegate to the wrapper.
+ _.chain = function(obj) {
+ return _(obj).chain();
+ };
+
+ // OOP
+ // ---------------
+ // If Underscore is called as a function, it returns a wrapped object that
+ // can be used OO-style. This wrapper holds altered versions of all the
+ // underscore functions. Wrapped objects may be chained.
+
+ // Helper function to continue chaining intermediate results.
+ var result = function(obj) {
+ return this._chain ? _(obj).chain() : obj;
+ };
+
+ // Add all of the Underscore functions to the wrapper object.
+ _.mixin(_);
+
+ // Add all mutator Array functions to the wrapper.
+ each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ var obj = this._wrapped;
+ method.apply(obj, arguments);
+ if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
+ return result.call(this, obj);
+ };
+ });
+
+ // Add all accessor Array functions to the wrapper.
+ each(['concat', 'join', 'slice'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ return result.call(this, method.apply(this._wrapped, arguments));
+ };
+ });
+
+ _.extend(_.prototype, {
+
+ // Start chaining a wrapped Underscore object.
+ chain: function() {
+ this._chain = true;
+ return this;
+ },
+
+ // Extracts the result from a wrapped and chained object.
+ value: function() {
+ return this._wrapped;
+ }
+
+ });
+
+}).call(this); \ No newline at end of file
diff --git a/addons/im_livechat/static/ext/test.html b/addons/im_livechat/static/ext/test.html
new file mode 100644
index 00000000000..c6047ded77d
--- /dev/null
+++ b/addons/im_livechat/static/ext/test.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script type="text/javascript" src="http://localhost/im_livechat/static/ext/static/js/require.js"></script>
+ <script type="text/javascript" src='http://localhost/im_livechat/loader?p={"db":"test","channel":1}'></script>
+</head>
+<body style="height:100%; margin:0; padding:0;">
+ <iframe src="http://openerp.com" height="100%" width=100%"></iframe>
+</body>
+</html> \ No newline at end of file
diff --git a/addons/im_livechat/static/src/img/default.png b/addons/im_livechat/static/src/img/default.png
new file mode 100644
index 00000000000..07d2503ce4e
--- /dev/null
+++ b/addons/im_livechat/static/src/img/default.png
Binary files differ
diff --git a/addons/im_livechat/static/src/img/icon.png b/addons/im_livechat/static/src/img/icon.png
new file mode 100644
index 00000000000..07d2503ce4e
--- /dev/null
+++ b/addons/im_livechat/static/src/img/icon.png
Binary files differ
diff --git a/addons/im_livechat/web_page.html b/addons/im_livechat/web_page.html
new file mode 100644
index 00000000000..2e1ea609126
--- /dev/null
+++ b/addons/im_livechat/web_page.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script type="text/javascript">
+ window.oe_im_livechat_auto = true;
+ </script>
+ {{script}}
+ <style type="text/css">
+ body {
+ height: 100%;
+ font-size: 16px;
+ font-weight: 400;
+ font-family: "Lato", "Lucida Grande", "Helvetica neue", "Helvetica", "Verdana", "Arial", sans-serif;
+ overflow: hidden;
+ overflow-y: auto;
+ display: block;
+ margin: 0;
+ padding: 0;
+ border: none;
+ width: 100%;
+ height: 100%;
+ background: #C9C8E0;
+ background-image: -webkit-linear-gradient(top, #7c7bad, #ddddee);
+ background-image: -moz-linear-gradient(top, #7c7bad, #ddddee);
+ background-image: -ms-linear-gradient(top, #7c7bad, #ddddee);
+ background-image: -o-linear-gradient(top, #7c7bad, #ddddee);
+ background-image: linear-gradient(to bottom, #7c7bad, #ddddee);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7c7bad', endColorstr='#ddddee',GradientType=0 );
+ -webkit-background-size: cover;
+ -moz-background-size: cover;
+ -o-background-size: cover;
+ background-size: cover;
+ background-repeat: no-repeat;
+ background-attachment: fixed;
+ }
+ .main {
+ position: absolute;
+ opacity: 0;
+ top: 50%;
+ width: 100%;
+ margin-top: -150px;
+ color: white;
+ text-shadow: 0 1px 0 rgba(34, 52, 72, 0.2);
+ z-index: 10;
+ text-align: center;
+ }
+ .main h1 {
+ font-size: 54px;
+ }
+ .main div {
+ font-style: italic;
+ }
+ </style>
+</head>
+<body>
+ <div class="main" style="opacity: 1;">
+ <h1 class="channel_name">{{channelName | escape}}</h1>
+ <div>Live Chat Powered by <strong>OpenERP</strong>.</div>
+ </div>
+</body>
+</html>
diff --git a/addons/l10n_at/account_wizard.py b/addons/l10n_at/account_wizard.py
index 278837322ac..0aec5392a8a 100644
--- a/addons/l10n_at/account_wizard.py
+++ b/addons/l10n_at/account_wizard.py
@@ -30,7 +30,6 @@ class AccountWizard_cd(osv.osv_memory):
'code_digits' : 0,
}
-AccountWizard_cd()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_be/fiscal_templates.xml b/addons/l10n_be/fiscal_templates.xml
index 5e26a7e67c1..5cf5a21381b 100644
--- a/addons/l10n_be/fiscal_templates.xml
+++ b/addons/l10n_be/fiscal_templates.xml
@@ -22,12 +22,6 @@
<!-- Fiscal Position Account Templates -->
- <record id="fiscal_position_account_template_1" model="account.fiscal.position.account.template">
- <field name="position_id" ref="fiscal_position_template_1" />
- <field name="account_src_id" ref="l10n_be.a7000" />
- <field name="account_dest_id" ref="l10n_be.a_sale" />
- </record>
-
<record id="fiscal_position_account_template_3" model="account.fiscal.position.account.template">
<field name="position_id" ref="fiscal_position_template_3" />
<field name="account_src_id" ref="l10n_be.a7000" />
diff --git a/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py b/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py
index d89d427ef6b..b74cfa21b8a 100644
--- a/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py
+++ b/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py
@@ -209,6 +209,5 @@ class l10n_be_vat_declaration(osv.osv_memory):
'target': 'new',
}
-l10n_be_vat_declaration()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py b/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py
index 7aa612d95ff..29a1a1508a4 100644
--- a/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py
+++ b/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py
@@ -39,7 +39,6 @@ class vat_listing_clients(osv.osv_memory):
'vat_amount': fields.float('VAT Amount'),
}
-vat_listing_clients()
class partner_vat(osv.osv_memory):
""" Vat Listing """
@@ -116,7 +115,6 @@ class partner_vat(osv.osv_memory):
'limit_amount': 250,
}
-partner_vat()
class partner_vat_list(osv.osv_memory):
""" Partner Vat Listing """
@@ -321,7 +319,6 @@ class partner_vat_list(osv.osv_memory):
'datas': datas,
}
-partner_vat_list()
class partner_vat_listing_print(report_sxw.rml_parse):
diff --git a/addons/l10n_be/wizard/l10n_be_vat_intra.py b/addons/l10n_be/wizard/l10n_be_vat_intra.py
index ffd42290ed0..703ab9db59b 100644
--- a/addons/l10n_be/wizard/l10n_be_vat_intra.py
+++ b/addons/l10n_be/wizard/l10n_be_vat_intra.py
@@ -282,7 +282,6 @@ class partner_vat_intra(osv.osv_memory):
'datas': datas,
}
-partner_vat_intra()
class vat_intra_print(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
diff --git a/addons/l10n_be_coda/wizard/account_coda_import.py b/addons/l10n_be_coda/wizard/account_coda_import.py
index 213040d6204..8aabe601bc8 100644
--- a/addons/l10n_be_coda/wizard/account_coda_import.py
+++ b/addons/l10n_be_coda/wizard/account_coda_import.py
@@ -128,6 +128,8 @@ class account_coda_import(osv.osv_memory):
raise osv.except_osv(_('Error') + ' R1004', _("No matching Bank Account (with Account Journal) found.\n\nPlease set-up a Bank Account with as Account Number '%s' and as Currency '%s' and an Account Journal.") % (statement['acc_number'], statement['currency']))
statement['description'] = rmspaces(line[90:125])
statement['balance_start'] = float(rmspaces(line[43:58])) / 1000
+ if line[42] == '1': #1 = Debit, the starting balance is negative
+ statement['balance_start'] = - statement['balance_start']
statement['balance_start_date'] = time.strftime(tools.DEFAULT_SERVER_DATE_FORMAT, time.strptime(rmspaces(line[58:64]), '%d%m%y'))
statement['accountHolder'] = rmspaces(line[64:90])
statement['paperSeqNumber'] = rmspaces(line[2:5])
@@ -389,7 +391,7 @@ class account_coda_import(osv.osv_memory):
if statement['coda_note'] != '':
self.pool.get('account.bank.statement').write(cr, uid, [statement['id']], {'coda_note': statement['coda_note']}, context=context)
model, action_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'account', 'action_bank_statement_tree')
- action = self.pool.get(model).browse(cr, uid, action_id, context=context)
+ action = self.pool[model].browse(cr, uid, action_id, context=context)
return {
'name': action.name,
'view_type': action.view_type,
diff --git a/addons/l10n_be_hr_payroll/l10n_be_hr_payroll.py b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll.py
index 79909cf79af..e62ea076079 100644
--- a/addons/l10n_be_hr_payroll/l10n_be_hr_payroll.py
+++ b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll.py
@@ -39,7 +39,6 @@ class hr_contract_be(osv.osv):
'retained_net_amount': fields.float('Net retained ', digits_compute=dp.get_precision('Payroll')),
}
-hr_contract_be()
class hr_employee_be(osv.osv):
_inherit = 'hr.employee'
@@ -52,6 +51,5 @@ class hr_employee_be(osv.osv):
'disabled_children_number': fields.integer('Number of disabled children'),
}
-hr_employee_be()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_be_invoice_bba/partner.py b/addons/l10n_be_invoice_bba/partner.py
index 9e0eec10713..bf8d5d7a0c3 100644
--- a/addons/l10n_be_invoice_bba/partner.py
+++ b/addons/l10n_be_invoice_bba/partner.py
@@ -44,9 +44,13 @@ class res_partner(osv.osv):
help='Select Algorithm to generate the Structured Communication on Outgoing Invoices.' ),
}
+ def _commercial_fields(self, cr, uid, context=None):
+ return super(res_partner, self)._commercial_fields(cr, uid, context=context) + \
+ ['out_inv_comm_type', 'out_inv_comm_algorithm']
+
+
_default = {
'out_inv_comm_type': 'none',
}
-res_partner()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_fr/l10n_fr.py b/addons/l10n_fr/l10n_fr.py
index c995b44a614..676121b4292 100644
--- a/addons/l10n_fr/l10n_fr.py
+++ b/addons/l10n_fr/l10n_fr.py
@@ -33,7 +33,6 @@ class l10n_fr_report(osv.osv):
('code_uniq', 'unique (code)','The code report must be unique !')
]
-l10n_fr_report()
class l10n_fr_line(osv.osv):
_name = 'l10n.fr.line'
@@ -48,7 +47,6 @@ class l10n_fr_line(osv.osv):
('code_uniq', 'unique (code)', 'The variable name must be unique !')
]
-l10n_fr_line()
class res_company(osv.osv):
_inherit = 'res.company'
@@ -58,6 +56,5 @@ class res_company(osv.osv):
'ape': fields.char('APE', size=64),
}
-res_company()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_fr/test/l10n_fr_report.yml b/addons/l10n_fr/test/l10n_fr_report.yml
index 44db53d0a77..25de74dd313 100644
--- a/addons/l10n_fr/test/l10n_fr_report.yml
+++ b/addons/l10n_fr/test/l10n_fr_report.yml
@@ -3,8 +3,9 @@
-
!python {model: account.move.line}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.l10n.fr.bilan').create(cr, uid, [], {'model':'account.move.line', 'form':{'fiscalyear_id': ref('account.data_fiscalyear')}}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [], 'l10n.fr.bilan', {'model':'account.move.line', 'form':{'fiscalyear_id': ref('account.data_fiscalyear')}}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'l10n_fr-bilan_report.'+format), 'wb+').write(data)
@@ -13,7 +14,8 @@
-
!python {model: account.move.line}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.l10n.fr.compute_resultant').create(cr, uid, [], {'model':'account.move.line', 'form':{'fiscalyear_id': ref('account.data_fiscalyear')}}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [], 'l10n.fr.compute_resultant', {'model':'account.move.line', 'form':{'fiscalyear_id': ref('account.data_fiscalyear')}}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'l10n_fr-compute_resultant_report.'+format), 'wb+').write(data)
diff --git a/addons/l10n_fr/wizard/fr_report_bilan.py b/addons/l10n_fr/wizard/fr_report_bilan.py
index 90e97389eed..291557f8fba 100644
--- a/addons/l10n_fr/wizard/fr_report_bilan.py
+++ b/addons/l10n_fr/wizard/fr_report_bilan.py
@@ -52,6 +52,5 @@ class account_bilan_report(osv.osv_memory):
data['form']['fiscalyear_id'] = self.browse(cr, uid, ids)[0].fiscalyear_id.id
return {'type': 'ir.actions.report.xml', 'report_name': 'l10n.fr.bilan', 'datas': data}
-account_bilan_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_fr/wizard/fr_report_compute_resultant.py b/addons/l10n_fr/wizard/fr_report_compute_resultant.py
index eff52189bc9..8d8aed8baff 100644
--- a/addons/l10n_fr/wizard/fr_report_compute_resultant.py
+++ b/addons/l10n_fr/wizard/fr_report_compute_resultant.py
@@ -52,6 +52,5 @@ class account_cdr_report(osv.osv_memory):
data['form']['fiscalyear_id'] = self.browse(cr, uid, ids)[0].fiscalyear_id.id
return { 'type': 'ir.actions.report.xml', 'report_name': 'l10n.fr.compute_resultant', 'datas': data}
-account_cdr_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_fr_hr_payroll/l10n_fr_hr_payroll.py b/addons/l10n_fr_hr_payroll/l10n_fr_hr_payroll.py
index 0519fd86a47..ec17792dacd 100644
--- a/addons/l10n_fr_hr_payroll/l10n_fr_hr_payroll.py
+++ b/addons/l10n_fr_hr_payroll/l10n_fr_hr_payroll.py
@@ -34,7 +34,6 @@ class res_company(osv.osv):
'conv_coll': fields.char('Convention collective', size=64),
}
-res_company()
class hr_contract(osv.osv):
_inherit = 'hr.contract'
@@ -44,7 +43,6 @@ class hr_contract(osv.osv):
'niveau': fields.char('Niveau', size=64),
'coef': fields.char('Coefficient', size=64),
}
-hr_contract()
class hr_payslip(osv.osv):
_inherit = 'hr.payslip'
@@ -52,6 +50,5 @@ class hr_payslip(osv.osv):
_columns = {
'payment_mode': fields.char('Mode de paiement', size=64),
}
-hr_payslip()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_fr_rib/bank.py b/addons/l10n_fr_rib/bank.py
index 8ad86932a34..1f5264ef5ac 100644
--- a/addons/l10n_fr_rib/bank.py
+++ b/addons/l10n_fr_rib/bank.py
@@ -19,7 +19,6 @@
#
##############################################################################
-from openerp import netsvc
from openerp.osv import fields, osv
from openerp.tools.translate import _
@@ -81,7 +80,6 @@ class res_partner_bank(osv.osv):
_constraints = [(_check_key, 'The RIB and/or IBAN is not valid', ['rib_acc_number', 'bank_code', 'office', 'key'])]
-res_partner_bank()
class res_bank(osv.osv):
"""Add the bank code to make it easier to enter RIB data"""
@@ -103,6 +101,5 @@ class res_bank(osv.osv):
_columns = {
'rib_code': fields.char('RIB Bank Code', size=64),
}
-res_bank()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py b/addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py
index 6a7638d919a..348bb71c95e 100644
--- a/addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py
+++ b/addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py
@@ -48,7 +48,6 @@ class hr_contract(osv.osv):
'supplementary_allowance': fields.float('Supplementary Allowance', digits_compute=dp.get_precision('Payroll')),
}
-hr_contract()
class payroll_advice(osv.osv):
'''
@@ -157,7 +156,6 @@ class payroll_advice(osv.osv):
return {
'value':res
}
-payroll_advice()
class hr_payslip_run(osv.osv):
@@ -216,7 +214,6 @@ class hr_payslip_run(osv.osv):
advice_line_pool.create(cr, uid, advice_line, context=context)
return self.write(cr, uid, ids, {'available_advice' : True})
-hr_payslip_run()
class payroll_advice_line(osv.osv):
'''
@@ -247,7 +244,6 @@ class payroll_advice_line(osv.osv):
'debit_credit': 'C',
}
-payroll_advice_line()
class hr_payslip(osv.osv):
'''
@@ -265,7 +261,6 @@ class hr_payslip(osv.osv):
default.update({'advice_id' : False})
return super(hr_payslip, self).copy(cr, uid, id, default, context=context)
-hr_payslip()
class res_company(osv.osv):
@@ -277,6 +272,5 @@ class res_company(osv.osv):
'dearness_allowance': True,
}
-res_company()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_in_hr_payroll/report/payment_advice_report.py b/addons/l10n_in_hr_payroll/report/payment_advice_report.py
index 59456b13b55..32c589d2a90 100644
--- a/addons/l10n_in_hr_payroll/report/payment_advice_report.py
+++ b/addons/l10n_in_hr_payroll/report/payment_advice_report.py
@@ -82,6 +82,5 @@ class payment_advice_report(osv.osv):
l.employee_id,l.advice_id,l.bysal,l.ifsc_code, l.name
)
""")
-payment_advice_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_in_hr_payroll/report/payslip_report.py b/addons/l10n_in_hr_payroll/report/payslip_report.py
index b44f123547b..2e1a543a80a 100644
--- a/addons/l10n_in_hr_payroll/report/payslip_report.py
+++ b/addons/l10n_in_hr_payroll/report/payslip_report.py
@@ -83,6 +83,5 @@ class payslip_report(osv.osv):
l.employee_id,p.struct_id,l.category_id
)
""")
-payslip_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_in_hr_payroll/test/payment_advice.yml b/addons/l10n_in_hr_payroll/test/payment_advice.yml
index ff391dd5363..0b4b16a629c 100644
--- a/addons/l10n_in_hr_payroll/test/payment_advice.yml
+++ b/addons/l10n_in_hr_payroll/test/payment_advice.yml
@@ -36,7 +36,8 @@
-
!python {model: hr.payroll.advice}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.payroll.advice').create(cr, uid, [ref('l10n_in_hr_payroll.payment_advice_1')], {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('l10n_in_hr_payroll.payment_advice_1')], 'payroll.advice', {}, {})
if tools.config['test_report_directory']:
- file(os.path.join(tools.config['test_report_directory'], 'l10n_in_hr_payroll_summary report'+format), 'wb+').write(data) \ No newline at end of file
+ file(os.path.join(tools.config['test_report_directory'], 'l10n_in_hr_payroll_summary report'+format), 'wb+').write(data)
diff --git a/addons/l10n_in_hr_payroll/wizard/hr_salary_employee_bymonth.py b/addons/l10n_in_hr_payroll/wizard/hr_salary_employee_bymonth.py
index 62d332ea5b8..93594e1dff8 100644
--- a/addons/l10n_in_hr_payroll/wizard/hr_salary_employee_bymonth.py
+++ b/addons/l10n_in_hr_payroll/wizard/hr_salary_employee_bymonth.py
@@ -66,6 +66,5 @@ class hr_salary_employee_bymonth(osv.osv_memory):
'datas': datas,
}
-hr_salary_employee_bymonth()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file
diff --git a/addons/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail.py b/addons/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail.py
index ed2a02e8d42..de3680f2dd3 100644
--- a/addons/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail.py
+++ b/addons/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail.py
@@ -61,6 +61,5 @@ class yearly_salary_detail(osv.osv_memory):
'datas': datas,
}
-yearly_salary_detail()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_lu/test/l10n_lu_report.yml b/addons/l10n_lu/test/l10n_lu_report.yml
index cacb3015ab2..0ee032d581c 100644
--- a/addons/l10n_lu/test/l10n_lu_report.yml
+++ b/addons/l10n_lu/test/l10n_lu_report.yml
@@ -9,8 +9,9 @@
-
!python {model: res.partner}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.l10n_lu.tax.report.print').create(cr, uid, [], {'model':'ir.ui.menu', 'form':{'tax_code_id': ref('account_tax_code_id_r1'), 'period_id': ref('account.period_1')}}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [], 'l10n_lu.tax.report.print', {'model':'ir.ui.menu', 'form':{'tax_code_id': ref('account_tax_code_id_r1'), 'period_id': ref('account.period_1')}}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'l10n_lu-vat_report.'+format), 'wb+').write(data)
diff --git a/addons/l10n_lu/wizard/print_vat.py b/addons/l10n_lu/wizard/print_vat.py
index abd5c7ce298..bfa058720d3 100644
--- a/addons/l10n_lu/wizard/print_vat.py
+++ b/addons/l10n_lu/wizard/print_vat.py
@@ -9,10 +9,10 @@ from __future__ import with_statement
import openerp
from openerp.osv import fields, osv
from openerp import tools
+from openerp.modules.module import get_module_resource
from openerp.tools.translate import _
from openerp.report.render import render
from openerp.report.interface import report_int
-from openerp import addons
import tempfile
import os
@@ -53,7 +53,7 @@ class report_custom(report_int):
try:
tmp_file = tempfile.mkstemp(".pdf")[1]
try:
- tools.pdf_utils.fill_pdf(addons.get_module_resource('l10n_lu','wizard', '2008_DECL_F_M10.pdf'), tmp_file, result)
+ tools.pdf_utils.fill_pdf(get_module_resource('l10n_lu','wizard', '2008_DECL_F_M10.pdf'), tmp_file, result)
with open(tmp_file, "r") as ofile:
self.obj = external_pdf(ofile.read())
finally:
@@ -92,6 +92,5 @@ class vat_declaration_report(osv.osv_memory):
data['form']['period_id'] = self.browse(cr, uid, ids)[0].period_id.id
return { 'type': 'ir.actions.report.xml', 'report_name': 'l10n_lu.tax.report.print', 'datas': data}
-vat_declaration_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_ma/l10n_ma.py b/addons/l10n_ma/l10n_ma.py
index 6321516cf0f..a2a28a21f82 100644
--- a/addons/l10n_ma/l10n_ma.py
+++ b/addons/l10n_ma/l10n_ma.py
@@ -33,7 +33,6 @@ class l10n_ma_report(osv.osv):
_sql_constraints = [
('code_uniq', 'unique (code)','The code report must be unique !')
]
-l10n_ma_report()
class l10n_ma_line(osv.osv):
_name = 'l10n.ma.line'
@@ -47,6 +46,5 @@ class l10n_ma_line(osv.osv):
_sql_constraints = [
('code_uniq', 'unique (code)', 'The variable name must be unique !')
]
-l10n_ma_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_multilang/account.py b/addons/l10n_multilang/account.py
index 4cb0e28b672..55770c5ec14 100644
--- a/addons/l10n_multilang/account.py
+++ b/addons/l10n_multilang/account.py
@@ -31,21 +31,18 @@ class account_account_template(osv.osv):
_columns = {
'name': fields.char('Name', size=128, required=True, select=True, translate=True),
}
-account_account_template()
class account_account(osv.osv):
_inherit = 'account.account'
_columns = {
'name': fields.char('Name', size=128, required=True, select=True, translate=True),
}
-account_account()
class account_tax(osv.osv):
_inherit = 'account.tax'
_columns = {
'name': fields.char('Tax Name', size=128, required=True, select=True, translate=True),
}
-account_tax()
class account_tax_template(osv.osv):
@@ -53,7 +50,6 @@ class account_tax_template(osv.osv):
_columns = {
'name': fields.char('Tax Name', size=128, required=True, select=True, translate=True),
}
-account_tax_template()
class account_tax_code_template(osv.osv):
@@ -61,7 +57,6 @@ class account_tax_code_template(osv.osv):
_columns = {
'name': fields.char('Tax Case Name', size=64, required=True, translate=True),
}
-account_tax_code_template()
class account_chart_template(osv.osv):
@@ -71,7 +66,6 @@ class account_chart_template(osv.osv):
'spoken_languages': fields.char('Spoken Languages', size=64, help="State here the languages for which the translations of templates could be loaded at the time of installation of this localization module and copied in the final object when generating them from templates. You must provide the language codes separated by ';'"),
}
_order = 'name'
-account_chart_template()
class account_fiscal_position(osv.osv):
@@ -79,7 +73,6 @@ class account_fiscal_position(osv.osv):
_columns = {
'name': fields.char('Fiscal Position', size=64, required=True, translate=True),
}
-account_fiscal_position()
class account_fiscal_position_template(osv.osv):
@@ -87,7 +80,6 @@ class account_fiscal_position_template(osv.osv):
_columns = {
'name': fields.char('Fiscal Position Template', size=64, required=True, translate=True),
}
-account_fiscal_position_template()
class account_journal(osv.osv):
@@ -95,7 +87,6 @@ class account_journal(osv.osv):
_columns = {
'name': fields.char('Journal Name', size=64, required=True, translate=True),
}
-account_journal()
class account_analytic_account(osv.osv):
@@ -103,7 +94,6 @@ class account_analytic_account(osv.osv):
_columns = {
'name': fields.char('Account Name', size=128, required=True, translate=True),
}
-account_analytic_account()
class account_analytic_journal(osv.osv):
@@ -111,4 +101,3 @@ class account_analytic_journal(osv.osv):
_columns = {
'name': fields.char('Journal Name', size=64, required=True, translate=True),
}
-account_analytic_journal()
diff --git a/addons/l10n_multilang/l10n_multilang.py b/addons/l10n_multilang/l10n_multilang.py
index 9596b292ff3..b7564a9960a 100644
--- a/addons/l10n_multilang/l10n_multilang.py
+++ b/addons/l10n_multilang/l10n_multilang.py
@@ -78,7 +78,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
else:
#replace the value in the destination object only if it's the user lang
if context.get('lang') == lang:
- self.pool.get(out_obj._name).write(cr, uid, out_ids[j], {in_field: value[in_id]})
+ self.pool[out_obj._name].write(cr, uid, out_ids[j], {in_field: value[in_id]})
else:
_logger.info('Language: %s. Translation from template: there is no translation available for %s!' %(lang, src[in_id]))#out_obj._name))
return True
@@ -150,6 +150,5 @@ class wizard_multi_charts_accounts(osv.osv_memory):
out_ids = obj_fiscal_position.search(cr, uid, [('company_id', '=', company_id)], order='id')
return self.process_translations(cr, uid, langs, obj_fiscal_position_template, field, in_ids, obj_fiscal_position, out_ids, force_write=False, context=context)
-wizard_multi_charts_accounts()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_ro/res_partner.py b/addons/l10n_ro/res_partner.py
index 1cfe7390a77..96de4b4e86a 100755
--- a/addons/l10n_ro/res_partner.py
+++ b/addons/l10n_ro/res_partner.py
@@ -28,10 +28,32 @@ class res_partner(osv.osv):
_columns = {
'nrc' : fields.char('NRC', size=16, help='Registration number at the Registry of Commerce'),
}
+
+ # The SQL constraints are no-ops but present only to display the right error message to the
+ # user when the partial unique indexes defined below raise errors/
+ # The real constraints need to be implemented with PARTIAL UNIQUE INDEXES (see auto_init),
+ # due to the way accounting data is delegated by contacts to their companies in OpenERP 7.0.
_sql_constraints = [
- ('vat_uniq', 'unique (vat)', 'The vat of the partner must be unique !'),
- ('nrc_uniq', 'unique (nrc)', 'The code of the partner must be unique !')
+ ('vat_uniq', 'unique (id)', 'The vat of the partner must be unique !'),
+ ('nrc_uniq', 'unique (id)', 'The code of the partner must be unique !')
]
-res_partner()
+
+ def _auto_init(self, cr, context=None):
+ result = super(res_partner, self)._auto_init(cr, context=context)
+ # Real implementation of the vat/nrc constraints: only "commercial entities" need to have
+ # unique numbers, and the condition for being a commercial entity is "is_company or parent_id IS NULL".
+ # Contacts inside a company automatically have a copy of the company's commercial fields
+ # (see _commercial_fields()), so they are automatically consistent.
+ cr.execute("""
+ DROP INDEX IF EXISTS res_partner_vat_uniq_for_companies;
+ DROP INDEX IF EXISTS res_partner_nrc_uniq_for_companies;
+ CREATE UNIQUE INDEX res_partner_vat_uniq_for_companies ON res_partner (vat) WHERE is_company OR parent_id IS NULL;
+ CREATE UNIQUE INDEX res_partner_nrc_uniq_for_companies ON res_partner (nrc) WHERE is_company OR parent_id IS NULL;
+ """)
+ return result
+
+ def _commercial_fields(self, cr, uid, context=None):
+ return super(res_partner, self)._commercial_fields(cr, uid, context=context) + ['nrc']
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/lunch/lunch.py b/addons/lunch/lunch.py
index 9f18c391eec..efad6fd6944 100644
--- a/addons/lunch/lunch.py
+++ b/addons/lunch/lunch.py
@@ -169,7 +169,7 @@ class lunch_order(osv.Model):
line_ref = self.pool.get("lunch.order.line")
if view_type == 'form':
doc = etree.XML(res['arch'])
- pref_ids = line_ref.search(cr, uid, [('user_id', '=', uid)], order='create_date desc', context=context)
+ pref_ids = line_ref.search(cr, uid, [('user_id', '=', uid)], order='id desc', context=context)
xml_start = etree.Element("div")
#If there are no preference (it's the first time for the user)
if len(pref_ids)==0:
@@ -215,63 +215,70 @@ class lunch_order(osv.Model):
currency = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.currency_id
#For each preferences that we get, we will create the XML structure
- for key,value in categories.items():
+ for key, value in categories.items():
xml_pref_1 = etree.Element("div")
- xml_pref_1.set('class','oe_lunch_30pc')
+ xml_pref_1.set('class', 'oe_lunch_30pc')
xml_pref_2 = etree.Element("h2")
xml_pref_2.text = key
xml_pref_1.append(xml_pref_2)
i = 0
value = value.values()
+ #TODO: sorted_values is used for a quick and dirty hack in order to display the 5 last orders of each categories.
+ #It would be better to fetch only the 5 items to display instead of fetching everything then sorting them in order to keep only the 5 last.
+ #NB: The note could also be ignored + we could fetch the preferences on the most ordered products instead of the last ones...
+ sorted_values = {}
for val in value:
- for pref in val.values():
- #We only show 5 preferences per category (or it will be too long)
- if i==5: break
- i+=1
- xml_pref_3 = etree.Element("div")
- xml_pref_3.set('class','oe_lunch_vignette')
- xml_pref_1.append(xml_pref_3)
-
- xml_pref_4 = etree.Element("span")
- xml_pref_4.set('class','oe_lunch_button')
- xml_pref_3.append(xml_pref_4)
-
- xml_pref_5 = etree.Element("button")
- xml_pref_5.set('name',"add_preference_"+str(pref.id))
- xml_pref_5.set('class','oe_link oe_i oe_button_plus')
- xml_pref_5.set('type','object')
- xml_pref_5.set('string','+')
- xml_pref_4.append(xml_pref_5)
-
- xml_pref_6 = etree.Element("button")
- xml_pref_6.set('name',"add_preference_"+str(pref.id))
- xml_pref_6.set('class','oe_link oe_button_add')
- xml_pref_6.set('type','object')
- xml_pref_6.set('string',_("Add"))
- xml_pref_4.append(xml_pref_6)
-
- xml_pref_7 = etree.Element("div")
- xml_pref_7.set('class','oe_group_text_button')
- xml_pref_3.append(xml_pref_7)
-
- xml_pref_8 = etree.Element("div")
- xml_pref_8.set('class','oe_lunch_text')
- xml_pref_8.text = escape(pref.product_id.name)+str(" ")
- xml_pref_7.append(xml_pref_8)
-
- price = pref.product_id.price or 0.0
- cur = currency.name or ''
- xml_pref_9 = etree.Element("span")
- xml_pref_9.set('class','oe_tag')
- xml_pref_9.text = str(price)+str(" ")+cur
- xml_pref_8.append(xml_pref_9)
-
- xml_pref_10 = etree.Element("div")
- xml_pref_10.set('class','oe_grey')
- xml_pref_10.text = escape(pref.note or '')
- xml_pref_3.append(xml_pref_10)
-
- xml_start.append(xml_pref_1)
+ for elmt in val.values():
+ sorted_values[elmt.id] = elmt
+ for key, pref in sorted(sorted_values.iteritems(), key=lambda (k, v): (k, v), reverse=True):
+ #We only show 5 preferences per category (or it will be too long)
+ if i == 5:
+ break
+ i += 1
+ xml_pref_3 = etree.Element("div")
+ xml_pref_3.set('class','oe_lunch_vignette')
+ xml_pref_1.append(xml_pref_3)
+
+ xml_pref_4 = etree.Element("span")
+ xml_pref_4.set('class','oe_lunch_button')
+ xml_pref_3.append(xml_pref_4)
+
+ xml_pref_5 = etree.Element("button")
+ xml_pref_5.set('name',"add_preference_"+str(pref.id))
+ xml_pref_5.set('class','oe_link oe_i oe_button_plus')
+ xml_pref_5.set('type','object')
+ xml_pref_5.set('string','+')
+ xml_pref_4.append(xml_pref_5)
+
+ xml_pref_6 = etree.Element("button")
+ xml_pref_6.set('name',"add_preference_"+str(pref.id))
+ xml_pref_6.set('class','oe_link oe_button_add')
+ xml_pref_6.set('type','object')
+ xml_pref_6.set('string',_("Add"))
+ xml_pref_4.append(xml_pref_6)
+
+ xml_pref_7 = etree.Element("div")
+ xml_pref_7.set('class','oe_group_text_button')
+ xml_pref_3.append(xml_pref_7)
+
+ xml_pref_8 = etree.Element("div")
+ xml_pref_8.set('class','oe_lunch_text')
+ xml_pref_8.text = escape(pref.product_id.name)+str(" ")
+ xml_pref_7.append(xml_pref_8)
+
+ price = pref.product_id.price or 0.0
+ cur = currency.name or ''
+ xml_pref_9 = etree.Element("span")
+ xml_pref_9.set('class','oe_tag')
+ xml_pref_9.text = str(price)+str(" ")+cur
+ xml_pref_8.append(xml_pref_9)
+
+ xml_pref_10 = etree.Element("div")
+ xml_pref_10.set('class','oe_grey')
+ xml_pref_10.text = escape(pref.note or '')
+ xml_pref_3.append(xml_pref_10)
+
+ xml_start.append(xml_pref_1)
first_node = doc.xpath("//div[@name='preferences']")
if first_node and len(first_node)>0:
diff --git a/addons/lunch/report/report_lunch_order.py b/addons/lunch/report/report_lunch_order.py
index 3a439a4a4dd..13c885e7896 100644
--- a/addons/lunch/report/report_lunch_order.py
+++ b/addons/lunch/report/report_lunch_order.py
@@ -60,6 +60,5 @@ class report_lunch_order(osv.osv):
lo.date,lo.user_id,lo.note
)
""")
-report_lunch_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mail/data/mail_data.xml b/addons/mail/data/mail_data.xml
index 3f517ee7858..02cfd626768 100644
--- a/addons/mail/data/mail_data.xml
+++ b/addons/mail/data/mail_data.xml
@@ -27,6 +27,19 @@
<field name="priority">1000</field>
</record>
+ <record id="ir_cron_mail_garbage_collect_attachments" model="ir.cron">
+ <field name="name">Garbage Collect Mail Attachments</field>
+ <field eval="True" name="active" />
+ <field name="user_id" ref="base.user_root" />
+ <field name="interval_number">1</field>
+ <field name="interval_type">weeks</field>
+ <field name="numbercall">-1</field>
+ <field eval="False" name="doall" />
+ <field name="model">mail.thread</field>
+ <field name="function">_garbage_collect_attachments</field>
+ <field name="args">()</field>
+ </record>
+
<!-- Discussion subtype for messaging / Chatter -->
<record id="mt_comment" model="mail.message.subtype">
<field name="name">Discussions</field>
diff --git a/addons/mail/mail_alias.py b/addons/mail/mail_alias.py
index d5e3b675b56..8730599ad72 100644
--- a/addons/mail/mail_alias.py
+++ b/addons/mail/mail_alias.py
@@ -117,8 +117,13 @@ class mail_alias(osv.Model):
mail catchall domain from config.
e.g. `jobs@openerp.my.openerp.com` or `sales@openerp.my.openerp.com`
"""
- return [(record['id'], "%s@%s" % (record['alias_name'], record['alias_domain']))
- for record in self.read(cr, uid, ids, ['alias_name', 'alias_domain'], context=context)]
+ res = []
+ for record in self.browse(cr, uid, ids, context=context):
+ if record.alias_name and record.alias_domain:
+ res.append((record['id'], "%s@%s" % (record.alias_name, record.alias_domain)))
+ else:
+ res.append((record['id'], False))
+ return res
def _find_unique(self, cr, uid, name, context=None):
"""Find a unique alias name similar to ``name``. If ``name`` is
@@ -155,11 +160,11 @@ class mail_alias(osv.Model):
alias_id_column.required = False
# call _auto_init
- child_model_auto_init_fct(cr, context=context)
+ res = child_model_auto_init_fct(cr, context=context)
registry = RegistryManager.get(cr.dbname)
mail_alias = registry.get('mail.alias')
- child_class_model = registry.get(child_model_name)
+ child_class_model = registry[child_model_name]
no_alias_ids = child_class_model.search(cr, SUPERUSER_ID, [('alias_id', '=', False)], context={'active_test':False})
# Use read() not browse(), to avoid prefetching uninitialized inherited fields
for obj_data in child_class_model.read(cr, SUPERUSER_ID, no_alias_ids, [alias_key]):
@@ -183,6 +188,8 @@ class mail_alias(osv.Model):
# set back the unique alias_id constraint
alias_id_column.required = True
+ return res
+
def create_unique_alias(self, cr, uid, vals, model_name=None, context=None):
"""Creates an email.alias record according to the values provided in ``vals``,
with 2 alterations: the ``alias_name`` value may be suffixed in order to
diff --git a/addons/mail/mail_followers.py b/addons/mail/mail_followers.py
index 450b81dabbf..152b9704fd7 100644
--- a/addons/mail/mail_followers.py
+++ b/addons/mail/mail_followers.py
@@ -118,8 +118,8 @@ class mail_notification(osv.Model):
Administrator
</p>
<div>
- <small>Send by <a ...>Your Company</a> using <a ...>OpenERP</a>.</small> OR
- <small>Send by Administrator using <a ...>OpenERP</a>.</small>
+ <small>Sent by <a ...>Your Company</a> using <a ...>OpenERP</a>.</small> OR
+ <small>Sent by Administrator using <a ...>OpenERP</a>.</small>
</div>
"""
footer = ""
@@ -139,7 +139,7 @@ class mail_notification(osv.Model):
company = user.company_id.website and "<a style='color:inherit' href='%s'>%s</a>" % (user.company_id.website, user.company_id.name) or user.company_id.name
else:
company = user.name
- signature_company = _('<small>Send by %(company)s using %(openerp)s.</small>') % {
+ signature_company = _('<small>Sent by %(company)s using %(openerp)s.</small>') % {
'company': company,
'openerp': "<a style='color:inherit' href='https://www.openerp.com/'>OpenERP</a>"
}
diff --git a/addons/mail/mail_group.py b/addons/mail/mail_group.py
index 24aed942b1b..977608f487e 100644
--- a/addons/mail/mail_group.py
+++ b/addons/mail/mail_group.py
@@ -144,11 +144,19 @@ class mail_group(osv.Model):
search_ref = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'mail', 'view_message_search')
params = {
'search_view_id': search_ref and search_ref[1] or False,
- 'domain': [('model', '=', 'mail.group'), ('res_id', '=', mail_group_id)],
- 'context': {'default_model': 'mail.group', 'default_res_id': mail_group_id, 'search_default_message_unread': True},
+ 'domain': [
+ ('model', '=', 'mail.group'),
+ ('res_id', '=', mail_group_id),
+ ],
+ 'context': {
+ 'default_model': 'mail.group',
+ 'default_res_id': mail_group_id,
+ },
'res_model': 'mail.message',
'thread_level': 1,
- 'header_description': self._generate_header_description(cr, uid, group, context=context)
+ 'header_description': self._generate_header_description(cr, uid, group, context=context),
+ 'view_mailbox': True,
+ 'compose_placeholder': 'Send a message to the group',
}
cobj = self.pool.get('ir.actions.client')
newref = cobj.copy(cr, SUPERUSER_ID, ref[1], default={'params': str(params), 'name': vals['name']}, context=context)
diff --git a/addons/mail/mail_group_view.xml b/addons/mail/mail_group_view.xml
index 77c0b8f6c86..04212b2f58a 100644
--- a/addons/mail/mail_group_view.xml
+++ b/addons/mail/mail_group_view.xml
@@ -7,7 +7,6 @@
<field name="tag">mail.wall</field>
<field name="res_model">mail.message</field>
<field name="context">{
- 'search_default_message_unread': True
}</field>
<field name="params">{
'read_action': 'read'
@@ -30,6 +29,7 @@
<field name="message_is_follower"/>
<field name="message_summary"/>
<field name="description"/>
+ <field name="alias_id"/>
<templates>
<t t-name="kanban-description">
<div class="oe_group_description" t-if="record.description.raw_value">
@@ -43,6 +43,9 @@
</div>
<div class="oe_group_details">
<h4><a type="open"><field name="name"/></a></h4>
+ <div class="oe_kanban_alias" t-if="record.alias_id.value">
+ <span class="oe_e">%%</span><small><field name="alias_id"/></small>
+ </div>
<div class="oe_grey">
<field name="description"/>
</div>
@@ -69,39 +72,43 @@
<field name="arch" type="xml">
<form string="Group Form" version="7.0">
<sheet class="openerp_mail_group_sheet">
- <field name="image" widget='image' class="oe_avatar oe_left" options='{"preview_image": "image_medium"}'/>
+ <field name="image" widget='image' class="oe_avatar oe_left" options='{"preview_image": "image_small"}'/>
<div class="oe_title">
<div class="oe_edit_only">
<label for="name" string="Group Name"/>
</div>
<h1><field name="name" readonly="0"/></h1>
- <div name="alias_box" colspan="4" attrs="{'invisible': [('alias_domain', '=', False)]}">
- <field name="alias_id" invisible="1" required="0"/>
- <label for="alias_name" class="oe_edit_only"/>
- <field name="alias_name" nolabel="1" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" nolabel="1" class="oe_inline"/>
+ <div name="group_alias"
+ attrs="{'invisible': [('alias_domain', '=', False)]}">
+ <label for="alias_id" string="Email Alias"/>
+ <field name="alias_id" class="oe_inline oe_read_only" required="0" nolabel="1"/>
+ <span name="edit_alias" class="oe_edit_only">
+ <field name="alias_name" class="oe_inline"
+ attrs="{'required': [('alias_id', '!=', False)]}"/>
+ @
+ <field name="alias_domain" class="oe_inline" readonly="1"/>
+ </span>
</div>
- <field name="description" placeholder="Topics discussed in this group..."/>
</div>
+ <field name="description" placeholder="Topics discussed in this group..."/>
<div class="oe_clear"/>
- <group>
- <group class="oe_edit_only">
- <field name="public"/>
- <field name="group_public_id"
- attrs="{'invisible': [('public','&lt;&gt;','groups')], 'required': [('public','=','groups')]}"
- />
- <field name="group_ids" widget="many2many_tags"/>
- </group>
- <group>
- <div class="oe_grey" attrs="{'invisible': [('public','&lt;&gt;','public')]}">
- This group is visible by everyone,
- including your customers if you installed
- the portal module.
- </div>
- <div class="oe_grey" attrs="{'invisible': [('public','&lt;&gt;','private')]}">
- Only the invited followers can read the
- discussions on this group.
- </div>
- </group>
+ <group class="oe_edit_only">
+ <field name="public"/>
+ <field name="group_public_id"
+ attrs="{'invisible': [('public','&lt;&gt;','groups')], 'required': [('public','=','groups')]}"
+ />
+ <field name="group_ids" widget="many2many_tags"/>
+ </group>
+ <group attrs="{'invisible': [('public', 'not in', ['public', 'private'])]}">
+ <div class="oe_grey" attrs="{'invisible': [('public','&lt;&gt;','public')]}">
+ This group is visible by everyone,
+ including your customers if you installed
+ the portal module.
+ </div>
+ <div class="oe_grey" attrs="{'invisible': [('public','&lt;&gt;','private')]}">
+ Only the invited followers can read the
+ discussions on this group.
+ </div>
</group>
</sheet>
<div class="oe_chatter">
diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py
index c5a7e227465..3c30a950230 100644
--- a/addons/mail/mail_mail.py
+++ b/addons/mail/mail_mail.py
@@ -108,8 +108,8 @@ class mail_mail(osv.Model):
res_id = message.res_id
# if model and res_id: try to use ``message_get_reply_to`` that returns the document alias
- if model and res_id and hasattr(self.pool.get(model), 'message_get_reply_to'):
- email_reply_to = self.pool.get(model).message_get_reply_to(cr, uid, [res_id], context=context)[0]
+ if model and res_id and hasattr(self.pool[model], 'message_get_reply_to'):
+ email_reply_to = self.pool[model].message_get_reply_to(cr, uid, [res_id], context=context)[0]
# no alias reply_to -> reply_to will be the email_from, only the email part
if not email_reply_to and values.get('email_from'):
emails = tools.email_split(values.get('email_from'))
@@ -118,7 +118,7 @@ class mail_mail(osv.Model):
# format 'Document name <email_address>'
if email_reply_to and model and res_id:
- document_name = self.pool.get(model).name_get(cr, SUPERUSER_ID, [res_id], context=context)[0]
+ document_name = self.pool[model].name_get(cr, SUPERUSER_ID, [res_id], context=context)[0]
if document_name:
# sanitize document name
sanitized_doc_name = re.sub(r'[^\w+.]+', '-', document_name[1])
@@ -217,7 +217,7 @@ class mail_mail(osv.Model):
and self.check_access_rights(cr, partner.user_ids[0].id, 'read', raise_exception=False):
related_user = partner.user_ids[0]
try:
- self.pool.get(mail.model).check_access_rule(cr, related_user.id, [mail.res_id], 'read', context=context)
+ self.pool[mail.model].check_access_rule(cr, related_user.id, [mail.res_id], 'read', context=context)
base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
# the parameters to encode for the query and fragment part of url
query = {'db': cr.dbname}
@@ -256,7 +256,19 @@ class mail_mail(osv.Model):
body = self.send_get_mail_body(cr, uid, mail, partner=partner, context=context)
subject = self.send_get_mail_subject(cr, uid, mail, partner=partner, context=context)
body_alternative = tools.html2plaintext(body)
- email_to = ['%s <%s>' % (partner.name, partner.email)] if partner else tools.email_split(mail.email_to)
+
+ # generate email_to, heuristic:
+ # 1. if 'partner' is specified and there is a related document: Followers of 'Doc' <email>
+ # 2. if 'partner' is specified, but no related document: Partner Name <email>
+ # 3; fallback on mail.email_to that we split to have an email addresses list
+ if partner and mail.record_name:
+ sanitized_record_name = re.sub(r'[^\w+.]+', '-', mail.record_name)
+ email_to = [_('"Followers of %s" <%s>') % (sanitized_record_name, partner.email)]
+ elif partner:
+ email_to = ['%s <%s>' % (partner.name, partner.email)]
+ else:
+ email_to = tools.email_split(mail.email_to)
+
return {
'body': body,
'body_alternative': body_alternative,
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index 8442891f3f9..defc12a2f73 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -76,9 +76,9 @@ class mail_message(osv.Model):
# TDE note: regroup by model/ids, to have less queries to perform
result = dict.fromkeys(ids, False)
for message in self.read(cr, uid, ids, ['model', 'res_id'], context=context):
- if not message.get('model') or not message.get('res_id') or not self.pool.get(message['model']):
+ if not message.get('model') or not message.get('res_id') or message['model'] not in self.pool:
continue
- result[message['id']] = self.pool.get(message['model']).name_get(cr, SUPERUSER_ID, [message['res_id']], context=context)[0][1]
+ result[message['id']] = self.pool[message['model']].name_get(cr, SUPERUSER_ID, [message['res_id']], context=context)[0][1]
return result
def _get_to_read(self, cr, uid, ids, name, arg, context=None):
@@ -268,19 +268,25 @@ class mail_message(osv.Model):
domain = [('partner_id', '=', user_pid), ('message_id', 'in', msg_ids)]
if not create_missing:
domain += [('starred', '=', not starred)]
+ values = {
+ 'starred': starred
+ }
+ if starred:
+ values['read'] = False
+
notif_ids = notification_obj.search(cr, uid, domain, context=context)
# all message have notifications: already set them as (un)starred
if len(notif_ids) == len(msg_ids) or not create_missing:
- notification_obj.write(cr, uid, notif_ids, {'starred': starred}, context=context)
+ notification_obj.write(cr, uid, notif_ids, values, context=context)
return starred
# some messages do not have notifications: find which one, create notification, update starred status
notified_msg_ids = [notification.message_id.id for notification in notification_obj.browse(cr, uid, notif_ids, context=context)]
to_create_msg_ids = list(set(msg_ids) - set(notified_msg_ids))
for msg_id in to_create_msg_ids:
- notification_obj.create(cr, uid, {'partner_id': user_pid, 'starred': starred, 'message_id': msg_id}, context=context)
- notification_obj.write(cr, uid, notif_ids, {'starred': starred}, context=context)
+ notification_obj.create(cr, uid, dict(values, partner_id=user_pid, message_id=msg_id), context=context)
+ notification_obj.write(cr, uid, notif_ids, values, context=context)
return starred
#------------------------------------------------------
@@ -363,6 +369,7 @@ class mail_message(osv.Model):
return {'id': message.id,
'type': message.type,
+ 'subtype': message.subtype_id.name if message.subtype_id else False,
'body': body_html,
'model': message.model,
'res_id': message.res_id,
@@ -563,7 +570,7 @@ class mail_message(osv.Model):
def _find_allowed_model_wise(self, cr, uid, doc_model, doc_dict, context=None):
doc_ids = doc_dict.keys()
- allowed_doc_ids = self.pool.get(doc_model).search(cr, uid, [('id', 'in', doc_ids)], context=context)
+ allowed_doc_ids = self.pool[doc_model].search(cr, uid, [('id', 'in', doc_ids)], context=context)
return set([message_id for allowed_doc_id in allowed_doc_ids for message_id in doc_dict[allowed_doc_id]])
def _find_allowed_doc_ids(self, cr, uid, model_ids, context=None):
@@ -711,7 +718,7 @@ class mail_message(osv.Model):
model_record_ids = _generate_model_record_ids(message_values, other_ids)
document_related_ids = []
for model, doc_dict in model_record_ids.items():
- model_obj = self.pool.get(model)
+ model_obj = self.pool[model]
mids = model_obj.exists(cr, uid, doc_dict.keys())
if operation in ['create', 'write', 'unlink']:
model_obj.check_access_rights(cr, uid, 'write')
@@ -767,7 +774,7 @@ class mail_message(osv.Model):
attachments_to_delete = []
for message in self.browse(cr, uid, ids, context=context):
for attach in message.attachment_ids:
- if attach.res_model == self._name and attach.res_id == message.id:
+ if attach.res_model == self._name and (attach.res_id == message.id or attach.res_id == 0):
attachments_to_delete.append(attach.id)
if attachments_to_delete:
self.pool.get('ir.attachment').unlink(cr, uid, attachments_to_delete, context=context)
diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py
index 778d7d53bd1..5ddf412e66b 100644
--- a/addons/mail/mail_thread.py
+++ b/addons/mail/mail_thread.py
@@ -89,6 +89,46 @@ class mail_thread(osv.AbstractModel):
# :param function lambda: returns whether the tracking should record using this subtype
_track = {}
+ def get_empty_list_help(self, cr, uid, help, context=None):
+ """ Override of BaseModel.get_empty_list_help() to generate an help message
+ that adds alias information. """
+ model = context.get('empty_list_help_model')
+ res_id = context.get('empty_list_help_id')
+ ir_config_parameter = self.pool.get("ir.config_parameter")
+ catchall_domain = ir_config_parameter.get_param(cr, uid, "mail.catchall.domain", context=context)
+ document_name = context.get('empty_list_help_document_name', _('document'))
+ alias = None
+
+ if catchall_domain and model and res_id: # specific res_id -> find its alias (i.e. section_id specified)
+ object_id = self.pool.get(model).browse(cr, uid, res_id, context=context)
+ alias = object_id.alias_id
+ elif catchall_domain and model: # no specific res_id given -> generic help message, take an example alias (i.e. alias of some section_id)
+ model_id = self.pool.get('ir.model').search(cr, uid, [("model", "=", self._name)], context=context)[0]
+ alias_obj = self.pool.get('mail.alias')
+ alias_ids = alias_obj.search(cr, uid, [("alias_model_id", "=", model_id)], context=context, limit=1, order='id ASC')
+ if alias_ids:
+ alias = alias_obj.browse(cr, uid, alias_ids[0], context=context)
+
+ if alias:
+ alias_email = alias.name_get()[0][1]
+ return _("""<p class='oe_view_nocontent_create'>
+ Click here to add a new %(document)s or send an email to: <a href='mailto:%(email)s'>%(email)s</a>
+ </p>
+ %(static_help)s"""
+ ) % {
+ 'document': document_name,
+ 'email': alias_email,
+ 'static_help': help or ''
+ }
+
+ if document_name != 'document' and help and help.find("oe_view_nocontent_create") == -1:
+ return _("<p class='oe_view_nocontent_create'>Click here to add a new %(document)s</p>%(static_help)s") % {
+ 'document': document_name,
+ 'static_help': help or '',
+ }
+
+ return help
+
def _get_message_data(self, cr, uid, ids, name, args, context=None):
""" Computes:
- message_unread: has uid unread message for the document
@@ -368,7 +408,7 @@ class mail_thread(osv.AbstractModel):
posted = False
for subtype in subtypes:
try:
- subtype_rec = self.pool.get('ir.model.data').get_object(cr, uid, subtype.split('.')[0], subtype.split('.')[1])
+ subtype_rec = self.pool.get('ir.model.data').get_object(cr, uid, subtype.split('.')[0], subtype.split('.')[1], context=context)
except ValueError, e:
_logger.debug('subtype %s not found, giving error "%s"' % (subtype, e))
continue
@@ -389,6 +429,26 @@ class mail_thread(osv.AbstractModel):
return [('message_unread', '=', True)]
return []
+ def _garbage_collect_attachments(self, cr, uid, context=None):
+ """ Garbage collect lost mail attachments. Those are attachments
+ - linked to res_model 'mail.compose.message', the composer wizard
+ - with res_id 0, because they were created outside of an existing
+ wizard (typically user input through Chatter or reports
+ created on-the-fly by the templates)
+ - unused since at least one day (create_date and write_date)
+ """
+ limit_date = datetime.datetime.utcnow() - datetime.timedelta(days=1)
+ limit_date_str = datetime.datetime.strftime(limit_date, tools.DEFAULT_SERVER_DATETIME_FORMAT)
+ ir_attachment_obj = self.pool.get('ir.attachment')
+ attach_ids = ir_attachment_obj.search(cr, uid, [
+ ('res_model', '=', 'mail.compose.message'),
+ ('res_id', '=', 0),
+ ('create_date', '<', limit_date_str),
+ ('write_date', '<', limit_date_str),
+ ], context=context)
+ ir_attachment_obj.unlink(cr, uid, attach_ids, context=context)
+ return True
+
#------------------------------------------------------
# Email specific
#------------------------------------------------------
@@ -409,13 +469,15 @@ class mail_thread(osv.AbstractModel):
""" Used by the plugin addon, based for plugin_outlook and others. """
ret_dict = {}
for model_name in self.pool.obj_list():
- model = self.pool.get(model_name)
+ model = self.pool[model_name]
if 'mail.thread' in getattr(model, '_inherit', []):
ret_dict[model_name] = model._description
return ret_dict
def _message_find_partners(self, cr, uid, message, header_fields=['From'], context=None):
- """ Find partners related to some header fields of the message. """
+ """ Find partners related to some header fields of the message.
+
+ TDE TODO: merge me with other partner finding methods in 8.0 """
partner_obj = self.pool.get('res.partner')
partner_ids = []
s = ', '.join([decode(message.get(h)) for h in header_fields if message.get(h)])
@@ -427,6 +489,7 @@ class mail_thread(osv.AbstractModel):
return partner_ids
def _message_find_user_id(self, cr, uid, message, context=None):
+ """ TDE TODO: check and maybe merge me with other user finding methods in 8.0 """
from_local_part = tools.email_split(decode(message.get('From')))[0]
# FP Note: canonification required, the minimu: .lower()
user_ids = self.pool.get('res.users').search(cr, uid, ['|',
@@ -468,6 +531,8 @@ class mail_thread(osv.AbstractModel):
"""
assert isinstance(message, Message), 'message must be an email.message.Message at this point'
message_id = message.get('Message-Id')
+ email_from = decode_header(message, 'From')
+ email_to = decode_header(message, 'To')
references = decode_header(message, 'References')
in_reply_to = decode_header(message, 'In-Reply-To')
@@ -478,12 +543,12 @@ class mail_thread(osv.AbstractModel):
if ref_match:
thread_id = int(ref_match.group(1))
model = ref_match.group(2) or model
- model_pool = self.pool.get(model)
- if thread_id and model and model_pool and model_pool.exists(cr, uid, thread_id) \
- and hasattr(model_pool, 'message_update'):
- _logger.debug('Routing mail with Message-Id %s: direct reply to model: %s, thread_id: %s, custom_values: %s, uid: %s',
- message_id, model, thread_id, custom_values, uid)
- return [(model, thread_id, custom_values, uid)]
+ if thread_id and model in self.pool:
+ model_obj = self.pool[model]
+ if model_obj.exists(cr, uid, thread_id) and hasattr(model_obj, 'message_update'):
+ _logger.info('Routing mail from %s to %s with Message-Id %s: direct reply to model: %s, thread_id: %s, custom_values: %s, uid: %s',
+ email_from, email_to, message_id, model, thread_id, custom_values, uid)
+ return [(model, thread_id, custom_values, uid)]
# Verify whether this is a reply to a private message
if in_reply_to:
@@ -493,8 +558,8 @@ class mail_thread(osv.AbstractModel):
], limit=1, context=context)
if message_ids:
message = self.pool.get('mail.message').browse(cr, uid, message_ids[0], context=context)
- _logger.debug('Routing mail with Message-Id %s: direct reply to a private message: %s, custom_values: %s, uid: %s',
- message_id, message.id, custom_values, uid)
+ _logger.info('Routing mail from %s to %s with Message-Id %s: direct reply to a private message: %s, custom_values: %s, uid: %s',
+ email_from, email_to, message_id, message.id, custom_values, uid)
return [(message.model, message.res_id, custom_values, uid)]
# 2. Look for a matching mail.alias entry
@@ -521,10 +586,11 @@ class mail_thread(osv.AbstractModel):
# Note: recognized partners will be added as followers anyway
# user_id = self._message_find_user_id(cr, uid, message, context=context)
user_id = uid
- _logger.debug('No matching user_id for the alias %s', alias.alias_name)
+ _logger.info('No matching user_id for the alias %s', alias.alias_name)
routes.append((alias.alias_model_id.model, alias.alias_force_thread_id, \
eval(alias.alias_defaults), user_id))
- _logger.debug('Routing mail with Message-Id %s: direct alias match: %r', message_id, routes)
+ _logger.info('Routing mail from %s to %s with Message-Id %s: direct alias match: %r',
+ email_from, email_to, message_id, routes)
return routes
# 3. Fallback to the provided parameters, if they work
@@ -539,14 +605,14 @@ class mail_thread(osv.AbstractModel):
except:
thread_id = False
assert thread_id and hasattr(model_pool, 'message_update') or hasattr(model_pool, 'message_new'), \
- "No possible route found for incoming message with Message-Id %s. " \
- "Create an appropriate mail.alias or force the destination model." % message_id
+ "No possible route found for incoming message from %s to %s (Message-Id %s:)." \
+ "Create an appropriate mail.alias or force the destination model." % (email_from, email_to, message_id)
if thread_id and not model_pool.exists(cr, uid, thread_id):
_logger.warning('Received mail reply to missing document %s! Ignoring and creating new document instead for Message-Id %s',
- thread_id, message_id)
+ thread_id, message_id)
thread_id = None
- _logger.debug('Routing mail with Message-Id %s: fallback to model:%s, thread_id:%s, custom_values:%s, uid:%s',
- message_id, model, thread_id, custom_values, uid)
+ _logger.info('Routing mail from %s to %s with Message-Id %s: fallback to model:%s, thread_id:%s, custom_values:%s, uid:%s',
+ email_from, email_to, message_id, model, thread_id, custom_values, uid)
return [(model, thread_id, custom_values, uid)]
def message_process(self, cr, uid, model, message, custom_values=None,
@@ -596,12 +662,24 @@ class mail_thread(osv.AbstractModel):
if isinstance(message, unicode):
message = message.encode('utf-8')
msg_txt = email.message_from_string(message)
- routes = self.message_route(cr, uid, msg_txt, model,
- thread_id, custom_values,
- context=context)
+
+ # parse the message, verify we are not in a loop by checking message_id is not duplicated
msg = self.message_parse(cr, uid, msg_txt, save_original=save_original, context=context)
if strip_attachments:
msg.pop('attachments', None)
+ if msg.get('message_id'): # should always be True as message_parse generate one if missing
+ existing_msg_ids = self.pool.get('mail.message').search(cr, SUPERUSER_ID, [
+ ('message_id', '=', msg.get('message_id')),
+ ], context=context)
+ if existing_msg_ids:
+ _logger.info('Ignored mail from %s to %s with Message-Id %s:: found duplicated Message-Id during processing',
+ msg.get('from'), msg.get('to'), msg.get('message_id'))
+ return False
+
+ # find possible routes for the message
+ routes = self.message_route(cr, uid, msg_txt, model,
+ thread_id, custom_values,
+ context=context)
# postpone setting msg.partner_ids after message_post, to avoid double notifications
partner_ids = msg.pop('partner_ids', [])
@@ -611,7 +689,7 @@ class mail_thread(osv.AbstractModel):
if self._name == 'mail.thread':
context.update({'thread_model': model})
if model:
- model_pool = self.pool.get(model)
+ model_pool = self.pool[model]
assert thread_id and hasattr(model_pool, 'message_update') or hasattr(model_pool, 'message_new'), \
"Undeliverable mail with Message-Id %s, model %s does not accept incoming emails" % \
(msg['message_id'], model)
@@ -665,7 +743,7 @@ class mail_thread(osv.AbstractModel):
if isinstance(custom_values, dict):
data = custom_values.copy()
model = context.get('thread_model') or self._name
- model_pool = self.pool.get(model)
+ model_pool = self.pool[model]
fields = model_pool.fields_get(cr, uid, context=context)
if 'name' in fields and not data.get('name'):
data['name'] = msg_dict.get('subject', '')
@@ -798,7 +876,7 @@ class mail_thread(osv.AbstractModel):
# as RFC2822 requires timezone offset in Date headers.
stored_date = parsed_date.replace(tzinfo=pytz.utc)
else:
- stored_date = parsed_date.astimezone(pytz.utc)
+ stored_date = parsed_date.astimezone(tz=pytz.utc)
except Exception:
_logger.warning('Failed to parse Date header %r in incoming mail '
'with message-id %r, assuming current date/time.',
@@ -817,7 +895,7 @@ class mail_thread(osv.AbstractModel):
if parent_ids:
msg_dict['parent_id'] = parent_ids[0]
- msg_dict['body'], msg_dict['attachments'] = self._message_extract_payload(message)
+ msg_dict['body'], msg_dict['attachments'] = self._message_extract_payload(message, save_original=save_original)
return msg_dict
#------------------------------------------------------
@@ -837,7 +915,8 @@ class mail_thread(osv.AbstractModel):
recipient in the result dictionary. The form is :
partner_id, partner_name<partner_email> or partner_name, reason """
if email and not partner:
- partner_info = self.message_get_partner_info_from_emails(cr, uid, [email], context=context)[0]
+ # get partner info from email
+ partner_info = self.message_get_partner_info_from_emails(cr, uid, [email], context=context, res_id=obj.id)[0]
if partner_info.get('partner_id'):
partner = self.pool.get('res.partner').browse(cr, SUPERUSER_ID, [partner_info.get('partner_id')], context=context)[0]
if email and email in [val[1] for val in result[obj.id]]: # already existing email -> skip
@@ -865,29 +944,49 @@ class mail_thread(osv.AbstractModel):
self._message_add_suggested_recipient(cr, uid, result, obj, partner=obj.user_id.partner_id, reason=self._all_columns['user_id'].column.string, context=context)
return result
- def message_get_partner_info_from_emails(self, cr, uid, emails, link_mail=False, context=None):
+ def message_get_partner_info_from_emails(self, cr, uid, emails, link_mail=False, context=None, res_id=None):
+ """ Wrapper with weird order parameter because of 7.0 fix.
+
+ TDE TODO: remove me in 8.0 """
+ return self.message_find_partner_from_emails(cr, uid, res_id, emails, link_mail=link_mail, context=context)
+
+ def message_find_partner_from_emails(self, cr, uid, id, emails, link_mail=False, context=None):
""" Convert a list of emails into a list partner_ids and a list
new_partner_ids. The return value is non conventional because
it is meant to be used by the mail widget.
:return dict: partner_ids and new_partner_ids
- """
+
+ TDE TODO: merge me with other partner finding methods in 8.0 """
mail_message_obj = self.pool.get('mail.message')
partner_obj = self.pool.get('res.partner')
result = list()
+ if id and self._name != 'mail.thread':
+ obj = self.browse(cr, SUPERUSER_ID, id, context=context)
+ else:
+ obj = None
for email in emails:
partner_info = {'full_name': email, 'partner_id': False}
m = re.search(r"((.+?)\s*<)?([^<>]+@[^<>]+)>?", email, re.IGNORECASE | re.DOTALL)
if not m:
continue
email_address = m.group(3)
- ids = partner_obj.search(cr, SUPERUSER_ID, [('email', '=', email_address)], context=context)
- if ids:
- partner_info['partner_id'] = ids[0]
+ # first try: check in document's followers
+ if obj:
+ for follower in obj.message_follower_ids:
+ if follower.email == email_address:
+ partner_info['partner_id'] = follower.id
+ # second try: check in partners
+ if not partner_info.get('partner_id'):
+ ids = partner_obj.search(cr, SUPERUSER_ID, [('email', 'ilike', email_address), ('user_ids', '!=', False)], limit=1, context=context)
+ if not ids:
+ ids = partner_obj.search(cr, SUPERUSER_ID, [('email', 'ilike', email_address)], limit=1, context=context)
+ if ids:
+ partner_info['partner_id'] = ids[0]
result.append(partner_info)
# link mail with this from mail to the new partner id
- if link_mail and ids:
+ if link_mail and partner_info['partner_id']:
message_ids = mail_message_obj.search(cr, SUPERUSER_ID, [
'|',
('email_from', '=', email),
@@ -895,7 +994,7 @@ class mail_thread(osv.AbstractModel):
('author_id', '=', False)
], context=context)
if message_ids:
- mail_message_obj.write(cr, SUPERUSER_ID, message_ids, {'author_id': ids[0]}, context=context)
+ mail_message_obj.write(cr, SUPERUSER_ID, message_ids, {'author_id': partner_info['partner_id']}, context=context)
return result
def message_post(self, cr, uid, thread_id, body='', subject=None, type='notification',
@@ -942,7 +1041,7 @@ class mail_thread(osv.AbstractModel):
model = context.get('thread_model', self._name) if self._name == 'mail.thread' else self._name
if model != self._name:
del context['thread_model']
- return self.pool.get(model).message_post(cr, uid, thread_id, body=body, subject=subject, type=type, subtype=subtype, parent_id=parent_id, attachments=attachments, context=context, content_subtype=content_subtype, **kwargs)
+ return self.pool[model].message_post(cr, uid, thread_id, body=body, subject=subject, type=type, subtype=subtype, parent_id=parent_id, attachments=attachments, context=context, content_subtype=content_subtype, **kwargs)
# 0: Parse email-from, try to find a better author_id based on document's followers for incoming emails
email_from = kwargs.get('email_from')
@@ -956,12 +1055,15 @@ class mail_thread(osv.AbstractModel):
], limit=1, context=context)
if author_ids:
kwargs['author_id'] = author_ids[0]
+ author_id = kwargs.get('author_id')
+ if author_id is None: # keep False values
+ author_id = self.pool.get('mail.message')._get_default_author(cr, uid, context=context)
# 1: Handle content subtype: if plaintext, converto into HTML
if content_subtype == 'plaintext':
body = tools.plaintext2html(body)
- # 2: Private message: add recipients (recipients and author of parent message)
+ # 2: Private message: add recipients (recipients and author of parent message) - current author
# + legacy-code management (! we manage only 4 and 6 commands)
partner_ids = set()
kwargs_partner_ids = kwargs.pop('partner_ids', [])
@@ -974,11 +1076,13 @@ class mail_thread(osv.AbstractModel):
partner_ids.add(partner_id)
else:
pass # we do not manage anything else
- if parent_id and model == 'mail.thread':
+ if parent_id and not model:
parent_message = mail_message.browse(cr, uid, parent_id, context=context)
- partner_ids |= set([partner.id for partner in parent_message.partner_ids])
+ private_followers = set([partner.id for partner in parent_message.partner_ids])
if parent_message.author_id:
- partner_ids.add(parent_message.author_id.id)
+ private_followers.add(parent_message.author_id.id)
+ private_followers -= set([author_id])
+ partner_ids |= private_followers
# 3. Attachments
# - HACK TDE FIXME: Chatter: attachments linked to the document (not done JS-side), load the message
@@ -986,7 +1090,6 @@ class mail_thread(osv.AbstractModel):
if attachment_ids:
filtered_attachment_ids = ir_attachment.search(cr, SUPERUSER_ID, [
('res_model', '=', 'mail.compose.message'),
- ('res_id', '=', 0),
('create_uid', '=', uid),
('id', 'in', attachment_ids)], context=context)
if filtered_attachment_ids:
@@ -1039,6 +1142,7 @@ class mail_thread(osv.AbstractModel):
values = kwargs
values.update({
+ 'author_id': author_id,
'model': model,
'res_id': thread_id or False,
'body': body,
diff --git a/addons/mail/res_users.py b/addons/mail/res_users.py
index f7c91939b98..5545745b235 100644
--- a/addons/mail/res_users.py
+++ b/addons/mail/res_users.py
@@ -60,8 +60,9 @@ class res_users(osv.Model):
def _auto_init(self, cr, context=None):
""" Installation hook: aliases, partner following themselves """
# create aliases for all users and avoid constraint errors
- self.pool.get('mail.alias').migrate_to_alias(cr, self._name, self._table, super(res_users, self)._auto_init,
+ res = self.pool.get('mail.alias').migrate_to_alias(cr, self._name, self._table, super(res_users, self)._auto_init,
self._columns['alias_id'], 'login', alias_force_key='id', context=context)
+ return res
def create(self, cr, uid, data, context=None):
# create default alias same as the login
diff --git a/addons/mail/static/src/css/mail.css b/addons/mail/static/src/css/mail.css
index 51306727a09..6bc086a5b58 100644
--- a/addons/mail/static/src/css/mail.css
+++ b/addons/mail/static/src/css/mail.css
@@ -57,6 +57,9 @@
.openerp .oe_mail .oe_msg.oe_msg_nobody{
background: #F8F8F8;
}
+.openerp .oe_mail .oe_msg.oe_msg_notification{
+ background: #F8F8F8;
+}
.openerp .oe_mail .oe_msg .oe_msg_left{
position: absolute;
left:0; top: 0; bottom: 0; width: 40px;
@@ -568,7 +571,6 @@
text-shadow: none;
width: 100%;
}
-.openerp .oe_followers button.oe_invite,
.openerp .oe_followers button.oe_follower.oe_following{
color: white;
background-color: #3465A4;
@@ -626,6 +628,8 @@
height: 32px;
overflow: hidden;
white-space: nowrap;
+ text-overflow: ellipsis;
+ margin-right: 10px;
}
.openerp .oe_followers .oe_partner img{
width: 32px;
diff --git a/addons/mail/static/src/css/mail_group.css b/addons/mail/static/src/css/mail_group.css
index c1cefee9070..4f2b8a16dd0 100644
--- a/addons/mail/static/src/css/mail_group.css
+++ b/addons/mail/static/src/css/mail_group.css
@@ -14,6 +14,10 @@
padding: 0px 18px;
}
+.openerp .oe_form_sheetbg.openerp_mail_group_sheet .oe_avatar {
+ padding-top: 3px;
+}
+
/* Resize footer width */
.openerp .oe_form div.oe_mail_group_footer {
max-width: 80%;
@@ -21,7 +25,7 @@
/* Resize group description */
.openerp .oe_form_sheetbg.openerp_mail_group_sheet .oe_form_field_text > textarea {
- height: 40px;
+ height: 60px;
}
/* ------------------------------ */
diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js
index ad69f7e41c3..b1a579ba057 100644
--- a/addons/mail/static/src/js/mail.js
+++ b/addons/mail/static/src/js/mail.js
@@ -217,6 +217,7 @@ openerp.mail = function (session) {
this.res_id = datasets.res_id || this.context.default_res_id || false,
this.parent_id = datasets.parent_id || false,
this.type = datasets.type || false,
+ this.subtype = datasets.subtype || false,
this.is_author = datasets.is_author || false,
this.is_private = datasets.is_private || false,
this.subject = datasets.subject || false,
@@ -619,7 +620,10 @@ openerp.mail = function (session) {
// have unknown names -> call message_get_partner_info_from_emails to try to find partner_id
var find_done = $.Deferred();
if (names_to_find.length > 0) {
- find_done = self.parent_thread.ds_thread._model.call('message_get_partner_info_from_emails', [names_to_find]);
+ var values = {
+ 'res_id': this.context.default_res_id,
+ }
+ find_done = self.parent_thread.ds_thread._model.call('message_get_partner_info_from_emails', [names_to_find], values);
}
else {
find_done.resolve([]);
@@ -665,7 +669,11 @@ openerp.mail = function (session) {
var new_names_to_find = _.difference(names_to_find, names_to_remove);
find_done = $.Deferred();
if (new_names_to_find.length > 0) {
- find_done = self.parent_thread.ds_thread._model.call('message_get_partner_info_from_emails', [new_names_to_find, true]);
+ var values = {
+ 'link_mail': true,
+ 'res_id': self.context.default_res_id,
+ }
+ find_done = self.parent_thread.ds_thread._model.call('message_get_partner_info_from_emails', [new_names_to_find], values);
}
else {
find_done.resolve([]);
@@ -1208,7 +1216,7 @@ openerp.mail = function (session) {
this.author_id = datasets.author_id || false;
this.thread_level = (datasets.thread_level+1) || 0;
datasets.partner_ids = datasets.partner_ids || [];
- if (datasets.author_id && ! _.contains(datasets.partner_ids, datasets.author_id) && datasets.author_id[0]) {
+ if (datasets.author_id && !_.contains(_.flatten(datasets.partner_ids),datasets.author_id[0]) && datasets.author_id[0]) {
datasets.partner_ids.push(datasets.author_id);
}
this.partner_ids = datasets.partner_ids;
@@ -1389,7 +1397,10 @@ openerp.mail = function (session) {
if (this.options.help) {
no_message.html(this.options.help);
}
- no_message.appendTo(this.$el);
+ if (!this.$el.find(".oe_view_nocontent").length)
+ {
+ no_message.appendTo(this.$el);
+ }
},
/**
@@ -1934,6 +1945,7 @@ openerp.mail = function (session) {
this.$(".oe_write_full").click(function (event) {
event.stopPropagation();
var action = {
+ name: _t('Compose Email'),
type: 'ir.actions.act_window',
res_model: 'mail.compose.message',
view_mode: 'form',
diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js
index 6fc2f0fdfcd..f812844194b 100644
--- a/addons/mail/static/src/js/mail_followers.js
+++ b/addons/mail/static/src/js/mail_followers.js
@@ -148,8 +148,6 @@ openerp_mail_followers = function(session, mail) {
}).then(self.proxy('display_generic'));
},
_format_followers: function(count){
- // TDE note: why redefining _t ?
- function _t(str) { return str; }
var str = '';
if(count <= 0){
str = _t('No followers');
diff --git a/addons/mail/static/src/xml/mail.xml b/addons/mail/static/src/xml/mail.xml
index b26ef06f5e4..7e7d772397a 100644
--- a/addons/mail/static/src/xml/mail.xml
+++ b/addons/mail/static/src/xml/mail.xml
@@ -226,7 +226,7 @@
<!-- default layout -->
<t t-name="mail.thread.message">
- <div t-attf-class="oe_msg #{widget.thread_level and widget.options.display_indented_thread > -1 ? 'oe_msg_indented' : ''} #{widget.partner_ids.length == 0 ? 'oe_msg_nobody' : ''} oe_msg_#{widget.type}">
+ <div t-attf-class="oe_msg #{widget.thread_level and widget.options.display_indented_thread > -1 ? 'oe_msg_indented' : ''} #{widget.subtype ? '' : 'oe_msg_nobody'} oe_msg_#{widget.type}">
<div class='oe_msg_left'>
<a t-if="widget.options.show_link" t-attf-href="#model=res.partner&amp;id=#{widget.author_id[0]}" t-att-title="widget.author_id[1]">
@@ -246,7 +246,11 @@
<!-- message itself -->
<div class="oe_msg_content">
<h1 t-if="(widget.show_record_name or widget.subject) and !widget.thread_level" class="oe_msg_title">
- <a t-if="widget.options.show_link and widget.show_record_name" class="oe_mail_action_model" t-attf-href="#model=#{widget.model}&amp;id=#{widget.res_id}"><t t-raw="widget.record_name"/></a><span t-if="!widget.options.show_link and widget.show_record_name"><t t-raw="widget.record_name"/></span><t t-if="widget.show_record_name">: </t>
+ <a t-if="widget.options.show_link and widget.show_record_name" class="oe_mail_action_model" t-attf-href="#model=#{widget.model}&amp;id=#{widget.res_id}">
+ <t t-raw="widget.record_name"/>
+ </a>
+ <span t-if="!widget.options.show_link and widget.show_record_name"><t t-raw="widget.record_name"/></span>
+ <t t-if="widget.show_record_name and widget.subject">: </t>
<t t-if="widget.subject" t-raw="widget.subject"/>
</h1>
<div class="oe_msg_body">
@@ -259,13 +263,23 @@
</t>
<a t-if="widget.author_id and widget.options.show_link and widget.author_id[0]" t-attf-href="#model=res.partner&amp;id=#{widget.author_id[0]}"><t t-raw="widget.author_id[2]"/></a>
<span t-if="widget.author_id and (!widget.options.show_link or !widget.author_id[0])"><t t-raw="widget.author_id[2]"/></span>
- <t t-if="widget.partner_ids.length == 0">
+ <t t-if="widget.type == 'notification'">
+ updated document
+ <t t-if="widget.partner_ids.length > 0">
+ <span class='oe_subtle'>•</span>
+ </t>
+ </t>
+ <t t-if="widget.type == 'comment' and ! widget.subtype">
logged a note
</t>
- <t t-if="widget.partner_ids.length > 0">
+ <t t-if="(widget.type == 'comment' or widget.type == 'email') and widget.subtype">
to
+ <t t-if="widget.partner_ids.length == 0">
+ nobody
+ </t>
</t>
- <t t-foreach="widget.partner_ids.slice(0, 3)" t-as="partner">
+ <t t-if="widget.type == 'notification' or ( (widget.type == 'email' or widget.type == 'comment') and widget.subtype)"
+ t-foreach="widget.partner_ids.slice(0, 3)" t-as="partner">
<span t-attf-class="oe_partner_follower">
<a t-if="widget.options.show_link" t-attf-href="#model=res.partner&amp;id=#{partner[0]}"><t t-raw="partner[1]"/></a>
<t t-if="!widget.options.show_link" t-raw="partner[1]"/>
@@ -275,6 +289,9 @@
<t t-if="widget.partner_ids.length > 3">
<span t-att-title="widget.extra_partners_str">and <t t-raw="widget.extra_partners_nbr"/> more</span>
</t>
+ <t t-if="widget.type == 'notification' and widget.partner_ids.length > 0">
+ notified
+ </t>
<span class='oe_subtle'>•</span>
<span t-att-title="widget.date"><t t-if="widget.timerelative" t-raw="widget.timerelative"/><t t-if="!widget.timerelative" t-raw="widget.date"/></span>
<span t-if="!widget.options.readonly" class='oe_subtle'>•</span>
diff --git a/addons/mail/static/src/xml/mail_followers.xml b/addons/mail/static/src/xml/mail_followers.xml
index 16bef174470..f3317223f1d 100644
--- a/addons/mail/static/src/xml/mail_followers.xml
+++ b/addons/mail/static/src/xml/mail_followers.xml
@@ -30,7 +30,7 @@
-->
<div t-name="mail.followers.partner" class='oe_partner'>
<img class="oe_mail_thumbnail oe_mail_frame" t-attf-src="{record.avatar_url}"/>
- <a t-attf-href="#model=res.partner&amp;id=#{record.id}"><t t-raw="record.name"/></a>
+ <a t-attf-href="#model=res.partner&amp;id=#{record.id}" t-att-title="record.name"><t t-esc="record.name"/></a>
<span t-if="widget.view_is_editable" class="oe_remove_follower oe_e" title="Remove this follower" t-att-data-id="record.id">X</span>
</div>
diff --git a/addons/mail/tests/test_mail_features.py b/addons/mail/tests/test_mail_features.py
index 2d0019c0b8a..7eea66b3b90 100644
--- a/addons/mail/tests/test_mail_features.py
+++ b/addons/mail/tests/test_mail_features.py
@@ -280,7 +280,8 @@ class test_mail(TestMailBase):
'message_post: mail.mail notifications should have been auto-deleted!')
# Test: notifications emails: to a and b, c is email only, r is author
- test_emailto = ['Administrator <a@a>', 'Bert Tartopoils <b@b>']
+ # test_emailto = ['Administrator <a@a>', 'Bert Tartopoils <b@b>']
+ test_emailto = ['"Followers of -Pigs-" <a@a>', '"Followers of -Pigs-" <b@b>']
self.assertEqual(len(sent_emails), 2,
'message_post: notification emails wrong number of send emails')
self.assertEqual(set([m['email_to'][0] for m in sent_emails]), set(test_emailto),
@@ -353,7 +354,8 @@ class test_mail(TestMailBase):
self.assertFalse(self.mail_mail.search(cr, uid, [('mail_message_id', '=', msg2_id)]), 'mail.mail notifications should have been auto-deleted!')
# Test: emails send by server (to a, b, c, d)
- test_emailto = [u'Administrator <a@a>', u'Bert Tartopoils <b@b>', u'Carine Poilvache <c@c>', u'D\xe9d\xe9 Grosbedon <d@d>']
+ # test_emailto = [u'Administrator <a@a>', u'Bert Tartopoils <b@b>', u'Carine Poilvache <c@c>', u'D\xe9d\xe9 Grosbedon <d@d>']
+ test_emailto = [u'"Followers of Pigs" <a@a>', u'"Followers of Pigs" <b@b>', u'"Followers of Pigs" <c@c>', u'"Followers of Pigs" <d@d>']
# self.assertEqual(len(sent_emails), 3, 'sent_email number of sent emails incorrect')
for sent_email in sent_emails:
self.assertEqual(sent_email['email_from'], 'Raoul Grosbedon <r@r>',
diff --git a/addons/mail/tests/test_mail_gateway.py b/addons/mail/tests/test_mail_gateway.py
index eb6ba22067b..e4269d59d8b 100644
--- a/addons/mail/tests/test_mail_gateway.py
+++ b/addons/mail/tests/test_mail_gateway.py
@@ -83,7 +83,47 @@ Sylvie
class TestMailgateway(TestMailBase):
- def test_00_message_process(self):
+ def test_00_partner_find_from_email(self):
+ """ Tests designed for partner fetch based on emails. """
+ cr, uid, user_raoul, group_pigs = self.cr, self.uid, self.user_raoul, self.group_pigs
+
+ # --------------------------------------------------
+ # Data creation
+ # --------------------------------------------------
+ # 1 - Partner ARaoul
+ p_a_id = self.res_partner.create(cr, uid, {'name': 'ARaoul', 'email': 'test@test.fr'})
+
+ # --------------------------------------------------
+ # CASE1: without object
+ # --------------------------------------------------
+
+ # Do: find partner with email -> first partner should be found
+ partner_info = self.mail_thread.message_find_partner_from_emails(cr, uid, None, ['Maybe Raoul <test@test.fr>'], link_mail=False)[0]
+ self.assertEqual(partner_info['full_name'], 'Maybe Raoul <test@test.fr>',
+ 'mail_thread: message_find_partner_from_emails did not handle email')
+ self.assertEqual(partner_info['partner_id'], p_a_id,
+ 'mail_thread: message_find_partner_from_emails wrong partner found')
+
+ # Data: add some data about partners
+ # 2 - User BRaoul
+ p_b_id = self.res_partner.create(cr, uid, {'name': 'BRaoul', 'email': 'test@test.fr', 'user_ids': [(4, user_raoul.id)]})
+
+ # Do: find partner with email -> first user should be found
+ partner_info = self.mail_thread.message_find_partner_from_emails(cr, uid, None, ['Maybe Raoul <test@test.fr>'], link_mail=False)[0]
+ self.assertEqual(partner_info['partner_id'], p_b_id,
+ 'mail_thread: message_find_partner_from_emails wrong partner found')
+
+ # --------------------------------------------------
+ # CASE1: with object
+ # --------------------------------------------------
+
+ # Do: find partner in group where there is a follower with the email -> should be taken
+ self.mail_group.message_subscribe(cr, uid, [group_pigs.id], [p_b_id])
+ partner_info = self.mail_group.message_find_partner_from_emails(cr, uid, group_pigs.id, ['Maybe Raoul <test@test.fr>'], link_mail=False)[0]
+ self.assertEqual(partner_info['partner_id'], p_b_id,
+ 'mail_thread: message_find_partner_from_emails wrong partner found')
+
+ def test_10_message_process(self):
""" Testing incoming emails processing. """
cr, uid, user_raoul = self.cr, self.uid, self.user_raoul
@@ -116,8 +156,11 @@ class TestMailgateway(TestMailBase):
frog_groups = format_and_process(MAIL_TEMPLATE, to='groups@example.com, other@gmail.com')
sent_emails = self._build_email_kwargs_list
# Test: one group created by mailgateway administrator
- self.assertTrue(len(frog_groups) == 1)
+ self.assertEqual(len(frog_groups), 1, 'message_process: a new mail.group should have been created')
frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
+ res = self.mail_group.perm_read(cr, uid, [frog_group.id], details=False)
+ self.assertEqual(res[0].get('create_uid'), uid,
+ 'message_process: group should have been created by uid as alias_user__id is False on the alias')
# Test: one message that is the incoming email
self.assertEqual(len(frog_group.message_ids), 1,
'message_process: newly created group should have the incoming email in message_ids')
@@ -150,9 +193,12 @@ class TestMailgateway(TestMailBase):
self._init_mock_build_email()
frog_groups = format_and_process(MAIL_TEMPLATE, to='groups@example.com, other@gmail.com')
sent_emails = self._build_email_kwargs_list
- # Test: one group created by raoul
- self.assertTrue(len(frog_groups) == 1)
+ # Test: one group created by Raoul
+ self.assertEqual(len(frog_groups), 1, 'message_process: a new mail.group should have been created')
frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
+ res = self.mail_group.perm_read(cr, uid, [frog_group.id], details=False)
+ self.assertEqual(res[0].get('create_uid'), self.user_raoul_id,
+ 'message_process: group should have been created by alias_user_id')
# Test: one message that is the incoming email
self.assertEqual(len(frog_group.message_ids), 1,
'message_process: newly created group should have the incoming email in message_ids')
@@ -175,8 +221,8 @@ class TestMailgateway(TestMailBase):
# Do: incoming email from a known partner that is also an user that can create a mail.group
self.res_users.create(cr, uid, {'partner_id': p1id, 'login': 'sylvie', 'groups_id': [(6, 0, [self.group_employee_id])]})
frog_groups = format_and_process(MAIL_TEMPLATE, to='groups@example.com, other@gmail.com')
- # Test: one group created by Sylvie
- self.assertTrue(len(frog_groups) == 1)
+ # Test: one group created by Raoul (or Sylvie maybe, if we implement it)
+ self.assertEqual(len(frog_groups), 1, 'message_process: a new mail.group should have been created')
frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
# Test: one message that is the incoming email
self.assertEqual(len(frog_group.message_ids), 1,
@@ -195,6 +241,7 @@ class TestMailgateway(TestMailBase):
# Do: even with a wrong destination, a reply should end up in the correct thread
frog_groups = format_and_process(MAIL_TEMPLATE, email_from='other@gmail.com',
+ msg_id='<1198923581.41972151344608186760.JavaMail.diff1@agrolait.com>',
to='erroneous@example.com>', subject='Re: news',
extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>\n' % frog_group.id)
# Test: no group 'Re: news' created, still only 1 Frogs group
@@ -205,12 +252,30 @@ class TestMailgateway(TestMailBase):
'message_process: reply on Frogs should not have created a duplicate group with old subject')
frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
# Test: one new message
- self.assertTrue(len(frog_group.message_ids) == 2, 'message_process: group should contain 2 messages after reply')
+ self.assertEqual(len(frog_group.message_ids), 2, 'message_process: group should contain 2 messages after reply')
# Test: author (and not recipient) added as follower
frog_follower_ids = set([p.id for p in frog_group.message_follower_ids])
self.assertEqual(frog_follower_ids, set([p1id, p2id]),
'message_process: after reply, group should have 2 followers')
+ # Do: due to some issue, same email goes back into the mailgateway
+ frog_groups = format_and_process(MAIL_TEMPLATE, email_from='other@gmail.com',
+ msg_id='<1198923581.41972151344608186760.JavaMail.diff1@agrolait.com>',
+ subject='Re: news', extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>\n' % frog_group.id)
+ # Test: no group 'Re: news' created, still only 1 Frogs group
+ self.assertEqual(len(frog_groups), 0,
+ 'message_process: reply on Frogs should not have created a new group with new subject')
+ frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')])
+ self.assertEqual(len(frog_groups), 1,
+ 'message_process: reply on Frogs should not have created a duplicate group with old subject')
+ frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
+ # Test: no new message
+ self.assertEqual(len(frog_group.message_ids), 2, 'message_process: message with already existing message_id should not have been duplicated')
+ # Test: message_id is still unique
+ msg_ids = self.mail_message.search(cr, uid, [('message_id', 'ilike', '<1198923581.41972151344608186760.JavaMail.diff1@agrolait.com>')])
+ self.assertEqual(len(msg_ids), 1,
+ 'message_process: message with already existing message_id should not have been duplicated')
+
# --------------------------------------------------
# Test3: email_from and partner finding
# --------------------------------------------------
@@ -223,6 +288,7 @@ class TestMailgateway(TestMailBase):
# Do: post a new message, with a known partner -> duplicate emails -> partner
format_and_process(MAIL_TEMPLATE, email_from='Lombrik Lubrik <test_raoul@email.com>',
to='erroneous@example.com>', subject='Re: news (2)',
+ msg_id='<1198923581.41972151344608186760.JavaMail.new1@agrolait.com>',
extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>\n' % frog_group.id)
frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')])
frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
@@ -236,6 +302,7 @@ class TestMailgateway(TestMailBase):
self.res_users.write(cr, uid, self.user_raoul_id, {'email': 'test_raoul@email.com'})
format_and_process(MAIL_TEMPLATE, email_from='Lombrik Lubrik <test_raoul@email.com>',
to='erroneous@example.com>', subject='Re: news (3)',
+ msg_id='<1198923581.41972151344608186760.JavaMail.new2@agrolait.com>',
extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>\n' % frog_group.id)
frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')])
frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
@@ -250,6 +317,7 @@ class TestMailgateway(TestMailBase):
self.res_users.write(cr, uid, self.user_raoul_id, {'email': 'test_raoul@email.com'})
format_and_process(MAIL_TEMPLATE, email_from='Lombrik Lubrik <test_raoul@email.com>',
to='erroneous@example.com>', subject='Re: news (3)',
+ msg_id='<1198923581.41972151344608186760.JavaMail.new3@agrolait.com>',
extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>\n' % frog_group.id)
frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')])
frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
@@ -265,30 +333,39 @@ class TestMailgateway(TestMailBase):
# Do: incoming email with model that does not accepts incoming emails must raise
self.assertRaises(AssertionError,
- format_and_process,
- MAIL_TEMPLATE, to='noone@example.com', subject='spam', extra='', model='res.country')
+ format_and_process,
+ MAIL_TEMPLATE,
+ to='noone@example.com', subject='spam', extra='', model='res.country',
+ msg_id='<1198923581.41972151344608186760.JavaMail.new4@agrolait.com>')
# Do: incoming email without model and without alias must raise
self.assertRaises(AssertionError,
- format_and_process,
- MAIL_TEMPLATE, to='noone@example.com', subject='spam', extra='')
+ format_and_process,
+ MAIL_TEMPLATE,
+ to='noone@example.com', subject='spam', extra='',
+ msg_id='<1198923581.41972151344608186760.JavaMail.new5@agrolait.com>')
# Do: incoming email with model that accepting incoming emails as fallback
- frog_groups = format_and_process(MAIL_TEMPLATE, to='noone@example.com', subject='Spammy', extra='', model='mail.group')
+ frog_groups = format_and_process(MAIL_TEMPLATE,
+ to='noone@example.com',
+ subject='Spammy', extra='', model='mail.group',
+ msg_id='<1198923581.41972151344608186760.JavaMail.new6@agrolait.com>')
self.assertEqual(len(frog_groups), 1,
'message_process: erroneous email but with a fallback model should have created a new mail.group')
# Do: incoming email in plaintext should be stored as html
- frog_groups = format_and_process(MAIL_TEMPLATE_PLAINTEXT, to='groups@example.com', subject='Frogs Return', extra='', msg_id='<deadcafe.1337@smtp.agrolait.com>')
+ frog_groups = format_and_process(MAIL_TEMPLATE_PLAINTEXT,
+ to='groups@example.com', subject='Frogs Return', extra='',
+ msg_id='<deadcafe.1337@smtp.agrolait.com>')
# Test: one group created with one message
- self.assertTrue(len(frog_groups) == 1)
+ self.assertEqual(len(frog_groups), 1, 'message_process: a new mail.group should have been created')
frog_group = self.mail_group.browse(cr, uid, frog_groups[0])
msg = frog_group.message_ids[0]
# Test: plain text content should be wrapped and stored as html
self.assertEqual(msg.body, '<pre>\nPlease call me as soon as possible this afternoon!\n\n--\nSylvie\n</pre>',
'message_process: plaintext incoming email incorrectly parsed')
- def test_10_thread_parent_resolution(self):
+ def test_20_thread_parent_resolution(self):
""" Testing parent/child relationships are correctly established when processing incoming mails """
cr, uid = self.cr, self.uid
@@ -305,19 +382,27 @@ class TestMailgateway(TestMailBase):
# Reply to msg1, make sure the reply is properly attached using the various reply identification mechanisms
# 0. Direct alias match
- reply_msg1 = format(MAIL_TEMPLATE, to='Pretty Pigs <group+pigs@example.com>', extra='In-Reply-To: %s' % msg1.message_id)
+ reply_msg1 = format(MAIL_TEMPLATE, to='Pretty Pigs <group+pigs@example.com>',
+ extra='In-Reply-To: %s' % msg1.message_id,
+ msg_id='<1198923581.41972151344608186760.JavaMail.2@agrolait.com>')
self.mail_group.message_process(cr, uid, None, reply_msg1)
# 1. In-Reply-To header
- reply_msg2 = format(MAIL_TEMPLATE, to='erroneous@example.com', extra='In-Reply-To: %s' % msg1.message_id)
+ reply_msg2 = format(MAIL_TEMPLATE, to='erroneous@example.com',
+ extra='In-Reply-To: %s' % msg1.message_id,
+ msg_id='<1198923581.41972151344608186760.JavaMail.3@agrolait.com>')
self.mail_group.message_process(cr, uid, None, reply_msg2)
# 2. References header
- reply_msg3 = format(MAIL_TEMPLATE, to='erroneous@example.com', extra='References: <2233@a.com>\r\n\t<3edss_dsa@b.com> %s' % msg1.message_id)
+ reply_msg3 = format(MAIL_TEMPLATE, to='erroneous@example.com',
+ extra='References: <2233@a.com>\r\n\t<3edss_dsa@b.com> %s' % msg1.message_id,
+ msg_id='<1198923581.41972151344608186760.JavaMail.4@agrolait.com>')
self.mail_group.message_process(cr, uid, None, reply_msg3)
# 3. Subject contains [<ID>] + model passed to message+process -> only attached to group, but not to mail (not in msg1.child_ids)
- reply_msg4 = format(MAIL_TEMPLATE, to='erroneous@example.com', extra='', subject='Re: [%s] 1' % self.group_pigs_id)
+ reply_msg4 = format(MAIL_TEMPLATE, to='erroneous@example.com',
+ extra='', subject='Re: [%s] 1' % self.group_pigs_id,
+ msg_id='<1198923581.41972151344608186760.JavaMail.5@agrolait.com>')
self.mail_group.message_process(cr, uid, 'mail.group', reply_msg4)
group_pigs.refresh()
@@ -325,6 +410,57 @@ class TestMailgateway(TestMailBase):
self.assertEqual(6, len(group_pigs.message_ids), 'message_process: group should contain 6 messages')
self.assertEqual(3, len(msg1.child_ids), 'message_process: msg1 should have 3 children now')
- def test_20_private_discussion(self):
+ def test_30_private_discussion(self):
""" Testing private discussion between partners. """
- pass
+ cr, uid = self.cr, self.uid
+
+ # Do: Raoul writes to Bert and Administrator, with a thread_model in context that should not be taken into account
+ msg1_pids = [self.partner_admin_id, self.partner_bert_id]
+ msg1_id = self.mail_thread.message_post(cr, self.user_raoul_id, False,
+ partner_ids=msg1_pids,
+ subtype='mail.mt_comment',
+ context={'thread_model': 'mail.group'})
+
+ # Test: message recipients
+ msg = self.mail_message.browse(cr, uid, msg1_id)
+ msg_pids = [p.id for p in msg.partner_ids]
+ msg_nids = [p.id for p in msg.notified_partner_ids]
+ test_pids = msg1_pids
+ test_nids = msg1_pids
+ self.assertEqual(set(msg_pids), set(test_pids),
+ 'message_post: private discussion: incorrect recipients')
+ self.assertEqual(set(msg_nids), set(test_nids),
+ 'message_post: private discussion: incorrect notified recipients')
+ self.assertEqual(msg.model, False,
+ 'message_post: private discussion: context key "thread_model" not correctly ignored when having no res_id')
+
+ # Do: Bert replies through mailgateway (is a customer)
+ msg2_id = self.mail_thread.message_post(cr, uid, False,
+ author_id=self.partner_bert_id,
+ parent_id=msg1_id, subtype='mail.mt_comment')
+
+ # Test: message recipients
+ msg = self.mail_message.browse(cr, uid, msg2_id)
+ msg_pids = [p.id for p in msg.partner_ids]
+ msg_nids = [p.id for p in msg.notified_partner_ids]
+ test_pids = [self.partner_admin_id, self.partner_raoul_id]
+ test_nids = test_pids
+ self.assertEqual(set(msg_pids), set(test_pids),
+ 'message_post: private discussion: incorrect recipients when replying')
+ self.assertEqual(set(msg_nids), set(test_nids),
+ 'message_post: private discussion: incorrect notified recipients when replying')
+
+ # Do: Administrator replies
+ msg3_id = self.mail_thread.message_post(cr, uid, False,
+ parent_id=msg2_id, subtype='mail.mt_comment')
+
+ # Test: message recipients
+ msg = self.mail_message.browse(cr, uid, msg3_id)
+ msg_pids = [p.id for p in msg.partner_ids]
+ msg_nids = [p.id for p in msg.notified_partner_ids]
+ test_pids = [self.partner_bert_id, self.partner_raoul_id]
+ test_nids = test_pids
+ self.assertEqual(set(msg_pids), set(test_pids),
+ 'message_post: private discussion: incorrect recipients when replying')
+ self.assertEqual(set(msg_nids), set(test_nids),
+ 'message_post: private discussion: incorrect notified recipients when replying')
diff --git a/addons/mail/wizard/invite.py b/addons/mail/wizard/invite.py
index 2eb48f3d998..4ff6584d789 100644
--- a/addons/mail/wizard/invite.py
+++ b/addons/mail/wizard/invite.py
@@ -37,10 +37,10 @@ class invite_wizard(osv.osv_memory):
res_id = result.get('res_id')
if 'message' in fields and model and res_id:
ir_model = self.pool.get('ir.model')
- model_ids = ir_model.search(cr, uid, [('model', '=', self.pool.get(model)._name)], context=context)
+ model_ids = ir_model.search(cr, uid, [('model', '=', self.pool[model]._name)], context=context)
model_name = ir_model.name_get(cr, uid, model_ids, context=context)[0][1]
- document_name = self.pool.get(model).name_get(cr, uid, [res_id], context=context)[0][1]
+ document_name = self.pool[model].name_get(cr, uid, [res_id], context=context)[0][1]
message = _('<div><p>Hello,</p><p>%s invited you to follow %s document: %s.<p></div>') % (user_name, model_name, document_name)
result['message'] = message
elif 'message' in fields:
@@ -63,7 +63,7 @@ class invite_wizard(osv.osv_memory):
def add_followers(self, cr, uid, ids, context=None):
for wizard in self.browse(cr, uid, ids, context=context):
- model_obj = self.pool.get(wizard.res_model)
+ model_obj = self.pool[wizard.res_model]
document = model_obj.browse(cr, uid, wizard.res_id, context=context)
# filter partner_ids to get the new followers, to avoid sending email to already following partners
diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py
index 66e7149ac6d..dfda3038de8 100644
--- a/addons/mail/wizard/mail_compose_message.py
+++ b/addons/mail/wizard/mail_compose_message.py
@@ -19,10 +19,8 @@
#
##############################################################################
-import base64
import re
from openerp import tools
-
from openerp import SUPERUSER_ID
from openerp.osv import osv
from openerp.osv import fields
@@ -174,12 +172,18 @@ class mail_compose_message(osv.TransientModel):
related to.
:param int res_id: id of the document record this mail is related to
"""
- doc_name_get = self.pool.get(model).name_get(cr, uid, [res_id], context=context)
+ doc_name_get = self.pool[model].name_get(cr, uid, [res_id], context=context)
+ record_name = False
if doc_name_get:
record_name = doc_name_get[0][1]
- else:
- record_name = False
- return {'model': model, 'res_id': res_id, 'record_name': record_name}
+ values = {
+ 'model': model,
+ 'res_id': res_id,
+ 'record_name': record_name,
+ }
+ if record_name:
+ values['subject'] = 'Re: %s' % record_name
+ return values
def get_message_data(self, cr, uid, message_id, context=None):
""" Returns a defaults-like dict with initial values for the composition
@@ -197,7 +201,7 @@ class mail_compose_message(osv.TransientModel):
# create subject
re_prefix = _('Re:')
- reply_subject = tools.ustr(message_data.subject or '')
+ reply_subject = tools.ustr(message_data.subject or message_data.record_name or '')
if not (reply_subject.startswith('Re:') or reply_subject.startswith(re_prefix)) and message_data.subject:
reply_subject = "%s %s" % (re_prefix, reply_subject)
# get partner_ids from original message
@@ -224,33 +228,35 @@ class mail_compose_message(osv.TransientModel):
email(s), rendering any template patterns on the fly if needed. """
if context is None:
context = {}
+ ir_attachment_obj = self.pool.get('ir.attachment')
active_ids = context.get('active_ids')
is_log = context.get('mail_compose_log', False)
for wizard in self.browse(cr, uid, ids, context=context):
mass_mail_mode = wizard.composition_mode == 'mass_mail'
- if mass_mail_mode: # mass mail: avoid any auto subscription because this could lead to people being follower of plenty of documents
- context['mail_create_nosubscribe'] = True
- active_model_pool = self.pool.get(wizard.model if wizard.model else 'mail.thread')
+ active_model_pool = self.pool[wizard.model if wizard.model else 'mail.thread']
# wizard works in batch mode: [res_id] or active_ids
res_ids = active_ids if mass_mail_mode and wizard.model and active_ids else [wizard.res_id]
for res_id in res_ids:
- # default values, according to the wizard options
+ # mail.message values, according to the wizard options
post_values = {
'subject': wizard.subject,
'body': wizard.body,
'parent_id': wizard.parent_id and wizard.parent_id.id,
'partner_ids': [partner.id for partner in wizard.partner_ids],
- 'attachments': [(attach.datas_fname or attach.name, base64.b64decode(attach.datas)) for attach in wizard.attachment_ids],
+ 'attachment_ids': [attach.id for attach in wizard.attachment_ids],
}
# mass mailing: render and override default values
if mass_mail_mode and wizard.model:
email_dict = self.render_message(cr, uid, wizard, res_id, context=context)
- new_partner_ids = email_dict.pop('partner_ids', [])
- post_values['partner_ids'] += new_partner_ids
- new_attachments = email_dict.pop('attachments', [])
- post_values['attachments'] += new_attachments
+ post_values['partner_ids'] += email_dict.pop('partner_ids', [])
+ post_values['attachments'] = email_dict.pop('attachments', [])
+ attachment_ids = []
+ for attach_id in post_values.pop('attachment_ids'):
+ new_attach_id = ir_attachment_obj.copy(cr, uid, attach_id, {'res_model': self._name, 'res_id': wizard.id}, context=context)
+ attachment_ids.append(new_attach_id)
+ post_values['attachment_ids'] = attachment_ids
post_values.update(email_dict)
# email_from: mass mailing only can specify another email_from
if email_dict.get('email_from'):
@@ -313,7 +319,7 @@ class mail_compose_message(osv.TransientModel):
exp = str(match.group()[2:-1]).strip()
result = eval(exp, {
'user': self.pool.get('res.users').browse(cr, uid, uid, context=context),
- 'object': self.pool.get(model).browse(cr, uid, res_id, context=context),
+ 'object': self.pool[model].browse(cr, uid, res_id, context=context),
'context': dict(context), # copy context to prevent side-effects of eval
})
return result and tools.ustr(result) or ''
diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py
index d4b05c50127..fdec2fb39e0 100644
--- a/addons/marketing_campaign/marketing_campaign.py
+++ b/addons/marketing_campaign/marketing_campaign.py
@@ -32,7 +32,6 @@ import re
from openerp.addons.decimal_precision import decimal_precision as dp
from openerp.osv import fields, osv
-from openerp import netsvc
from openerp.tools.translate import _
_intervalTypes = {
@@ -166,7 +165,7 @@ Normal - the campaign runs normally and automatically sends all emails and repor
# dead code
def signal(self, cr, uid, model, res_id, signal, run_existing=True, context=None):
- record = self.pool.get(model).browse(cr, uid, res_id, context)
+ record = self.pool[model].browse(cr, uid, res_id, context)
return self._signal(cr, uid, record, signal, run_existing, context)
#dead code
@@ -229,7 +228,7 @@ Normal - the campaign runs normally and automatically sends all emails and repor
if unique_value:
if unique_field.ttype == 'many2one':
unique_value = unique_value.id
- similar_res_ids = self.pool.get(campaign_rec.object_id.model).search(cr, uid,
+ similar_res_ids = self.pool[campaign_rec.object_id.model].search(cr, uid,
[(unique_field.name, '=', unique_value)], context=context)
if similar_res_ids:
duplicate_workitem_domain = [('res_id','in', similar_res_ids),
@@ -237,7 +236,6 @@ Normal - the campaign runs normally and automatically sends all emails and repor
return Workitems.search(cr, uid, duplicate_workitem_domain, context=context)
-marketing_campaign()
class marketing_campaign_segment(osv.osv):
_name = "marketing.campaign.segment"
@@ -350,7 +348,7 @@ class marketing_campaign_segment(osv.osv):
act_ids = self.pool.get('marketing.campaign.activity').search(cr,
uid, [('start', '=', True), ('campaign_id', '=', segment.campaign_id.id)], context=context)
- model_obj = self.pool.get(segment.object_id.model)
+ model_obj = self.pool[segment.object_id.model]
criteria = []
if segment.sync_last_date and segment.sync_mode != 'all':
criteria += [(segment.sync_mode, '>', segment.sync_last_date)]
@@ -384,7 +382,6 @@ class marketing_campaign_segment(osv.osv):
Workitems.process_all(cr, uid, list(campaigns), context=context)
return True
-marketing_campaign_segment()
class marketing_campaign_activity(osv.osv):
_name = "marketing.campaign.activity"
@@ -511,7 +508,6 @@ class marketing_campaign_activity(osv.osv):
workitem = workitem_obj.browse(cr, uid, wi_id, context=context)
return action(cr, uid, activity, workitem, context=context)
-marketing_campaign_activity()
class marketing_campaign_transition(osv.osv):
_name = "marketing.campaign.transition"
@@ -583,7 +579,6 @@ class marketing_campaign_transition(osv.osv):
('interval_positive', 'CHECK(interval_nbr >= 0)', 'The interval must be positive or zero')
]
-marketing_campaign_transition()
class marketing_campaign_workitem(osv.osv):
_name = "marketing.campaign.workitem"
@@ -595,7 +590,7 @@ class marketing_campaign_workitem(osv.osv):
if not wi.res_id:
continue
- proxy = self.pool.get(wi.object_id.model)
+ proxy = self.pool[wi.object_id.model]
if not proxy.exists(cr, uid, [wi.res_id]):
continue
ng = proxy.name_get(cr, uid, [wi.res_id], context=context)
@@ -629,7 +624,7 @@ class marketing_campaign_workitem(osv.osv):
for id, res_id, model in res:
workitem_map.setdefault(model,{}).setdefault(res_id,set()).add(id)
for model, id_map in workitem_map.iteritems():
- model_pool = self.pool.get(model)
+ model_pool = self.pool[model]
condition_name[0] = model_pool._rec_name
condition = [('id', 'in', id_map.keys()), condition_name]
for res_id in model_pool.search(cr, uid, condition, context=context):
@@ -677,7 +672,7 @@ class marketing_campaign_workitem(osv.osv):
return False
activity = workitem.activity_id
- proxy = self.pool.get(workitem.object_id.model)
+ proxy = self.pool[workitem.object_id.model]
object_id = proxy.browse(cr, uid, workitem.res_id, context=context)
eval_context = {
@@ -819,7 +814,6 @@ class marketing_campaign_workitem(osv.osv):
raise osv.except_osv(_('No preview'),_('The current step for this item has no email or report to preview.'))
return res
-marketing_campaign_workitem()
class email_template(osv.osv):
_inherit = "email.template"
@@ -829,7 +823,6 @@ class email_template(osv.osv):
# TODO: add constraint to prevent disabling / disapproving an email account used in a running campaign
-email_template()
class report_xml(osv.osv):
_inherit = 'ir.actions.report.xml'
@@ -842,7 +835,6 @@ class report_xml(osv.osv):
args.append(('model', '=', model))
return super(report_xml, self).search(cr, uid, args, offset, limit, order, context, count)
-report_xml()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/marketing_campaign/report/campaign_analysis.py b/addons/marketing_campaign/report/campaign_analysis.py
index 1fc8a5f1dc7..f09ed966857 100644
--- a/addons/marketing_campaign/report/campaign_analysis.py
+++ b/addons/marketing_campaign/report/campaign_analysis.py
@@ -98,6 +98,5 @@ class campaign_analysis(osv.osv):
wi.date::date
)
""")
-campaign_analysis()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/marketing_campaign/res_partner.py b/addons/marketing_campaign/res_partner.py
index c151c2f4050..b012cbb7181 100644
--- a/addons/marketing_campaign/res_partner.py
+++ b/addons/marketing_campaign/res_partner.py
@@ -36,7 +36,6 @@ class res_partner(osv.osv):
})
return super(res_partner, self).copy(cr, uid, id, default=default, context=context)
-res_partner()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/membership/membership.py b/addons/membership/membership.py
index ae7f4948d72..b75284637c9 100644
--- a/addons/membership/membership.py
+++ b/addons/membership/membership.py
@@ -169,7 +169,6 @@ class membership_line(osv.osv):
(_check_membership_date, 'Error, this membership product is out of date', [])
]
-membership_line()
class Partner(osv.osv):
@@ -442,7 +441,6 @@ class Partner(osv.osv):
self.pool.get('res.partner').write(cr, uid, ids, {})
return invoice_list
-Partner()
class Product(osv.osv):
@@ -476,7 +474,6 @@ class Product(osv.osv):
'membership': False,
}
-Product()
class Invoice(osv.osv):
@@ -494,7 +491,6 @@ class Invoice(osv.osv):
member_line_obj.write(cr, uid, mlines, {'date_cancel': today})
return super(Invoice, self).action_cancel(cr, uid, ids, context=context)
-Invoice()
class account_invoice_line(osv.osv):
_inherit='account.invoice.line'
@@ -561,6 +557,5 @@ class account_invoice_line(osv.osv):
}, context=context)
return result
-account_invoice_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/membership/report/report_membership.py b/addons/membership/report/report_membership.py
index f68e52992af..081a2f0d8a5 100644
--- a/addons/membership/report/report_membership.py
+++ b/addons/membership/report/report_membership.py
@@ -139,6 +139,5 @@ class report_membership(osv.osv):
membership_amount
)""")
-report_membership()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/membership/wizard/membership_invoice.py b/addons/membership/wizard/membership_invoice.py
index 2425cd648ea..a1e07146da0 100644
--- a/addons/membership/wizard/membership_invoice.py
+++ b/addons/membership/wizard/membership_invoice.py
@@ -73,6 +73,5 @@ class membership_invoice(osv.osv_memory):
'search_view_id': search_view_id,
}
-membership_invoice()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp/company.py b/addons/mrp/company.py
index af8a21f4934..375a318c9d0 100644
--- a/addons/mrp/company.py
+++ b/addons/mrp/company.py
@@ -30,7 +30,6 @@ class company(osv.osv):
_defaults = {
'manufacturing_lead': lambda *a: 1.0,
}
-company()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index 58fcacaa1f5..7fb40ce12af 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -70,7 +70,6 @@ class mrp_workcenter(osv.osv):
value = {'costs_hour': cost.standard_price}
return {'value': value}
-mrp_workcenter()
class mrp_routing(osv.osv):
@@ -98,7 +97,6 @@ class mrp_routing(osv.osv):
'active': lambda *a: 1,
'company_id': lambda self, cr, uid, context: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.routing', context=context)
}
-mrp_routing()
class mrp_routing_workcenter(osv.osv):
"""
@@ -124,7 +122,6 @@ class mrp_routing_workcenter(osv.osv):
'cycle_nbr': lambda *a: 1.0,
'hour_nbr': lambda *a: 0.0,
}
-mrp_routing_workcenter()
class mrp_bom(osv.osv):
"""
diff --git a/addons/mrp/procurement.py b/addons/mrp/procurement.py
index 1f94f0034ad..3ad7155dad6 100644
--- a/addons/mrp/procurement.py
+++ b/addons/mrp/procurement.py
@@ -122,6 +122,5 @@ class procurement_order(osv.osv):
body = _("Manufacturing Order <em>%s</em> created.") % ( procurement.production_id.name,)
self.message_post(cr, uid, [procurement.id], body=body, context=context)
-procurement_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp/product.py b/addons/mrp/product.py
index f5e29a1d103..d7a19c718fa 100644
--- a/addons/mrp/product.py
+++ b/addons/mrp/product.py
@@ -37,6 +37,5 @@ class product_product(osv.osv):
return super(product_product, self).copy(cr, uid, id, default, context=context)
-product_product()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp/report/mrp_report.py b/addons/mrp/report/mrp_report.py
index 7dff886a4ba..76474ccb6ab 100644
--- a/addons/mrp/report/mrp_report.py
+++ b/addons/mrp/report/mrp_report.py
@@ -52,7 +52,6 @@ class report_workcenter_load(osv.osv):
to_char(p.date_planned,'YYYY:mm:dd')
)""")
-report_workcenter_load()
class report_mrp_inout(osv.osv):
@@ -97,7 +96,6 @@ class report_mrp_inout(osv.osv):
to_char(sm.date,'YYYY:IW')
)""")
-report_mrp_inout()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp/stock.py b/addons/mrp/stock.py
index 1ff121c78bd..0ebc7bd199d 100644
--- a/addons/mrp/stock.py
+++ b/addons/mrp/stock.py
@@ -45,7 +45,7 @@ class StockMove(osv.osv):
procurement_obj = self.pool.get('procurement.order')
product_obj = self.pool.get('product.product')
processed_ids = [move.id]
- if move.product_id.supply_method == 'produce' and move.product_id.procure_method == 'make_to_order':
+ if move.product_id.supply_method == 'produce':
bis = bom_obj.search(cr, uid, [
('product_id','=',move.product_id.id),
('bom_id','=',False),
@@ -145,7 +145,6 @@ class StockMove(osv.osv):
res.append(new_move)
return res
-StockMove()
class StockPicking(osv.osv):
@@ -162,7 +161,6 @@ class StockPicking(osv.osv):
todo.extend(move_obj._action_explode(cr, uid, move))
return list(set(todo))
-StockPicking()
class split_in_production_lot(osv.osv_memory):
@@ -179,6 +177,5 @@ class split_in_production_lot(osv.osv_memory):
production_obj.write(cr, uid, production_ids, {'move_lines': [(4, m) for m in new_moves]})
return new_moves
-split_in_production_lot()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp/test/order_process.yml b/addons/mrp/test/order_process.yml
index 89331d5c255..acbfea48182 100644
--- a/addons/mrp/test/order_process.yml
+++ b/addons/mrp/test/order_process.yml
@@ -215,9 +215,10 @@
-
!python {model: mrp.production}: |
import os
- from openerp import netsvc, tools
+ import openerp.report
+ from openerp import tools
order = self.browse(cr, uid, ref("mrp_production_test1"))
- (data, format) = netsvc.LocalService('report.bom.structure').create(cr, uid, [order.bom_id.id], {}, {})
+ data, format = openerp.report.render_report(cr, uid, [order.bom_id.id], 'bom.structure', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'mrp-bom_structure_report.'+format), 'wb+').write(data)
-
@@ -225,8 +226,9 @@
-
!python {model: mrp.production}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.mrp.production.order').create(cr, uid, [ref("mrp_production_test1")], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref("mrp_production_test1")], 'mrp.production.order', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'mrp-production_order_report.'+format), 'wb+').write(data)
-
diff --git a/addons/mrp/wizard/change_production_qty.py b/addons/mrp/wizard/change_production_qty.py
index 74309b50825..41b6022a178 100644
--- a/addons/mrp/wizard/change_production_qty.py
+++ b/addons/mrp/wizard/change_production_qty.py
@@ -101,6 +101,5 @@ class change_production_qty(osv.osv_memory):
self._update_product_to_produce(cr, uid, prod, wiz_qty.product_qty, context=context)
return {}
-change_production_qty()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp/wizard/mrp_price.py b/addons/mrp/wizard/mrp_price.py
index 08506ccf0e2..70b4482b019 100644
--- a/addons/mrp/wizard/mrp_price.py
+++ b/addons/mrp/wizard/mrp_price.py
@@ -52,6 +52,5 @@ class mrp_price(osv.osv_memory):
'datas' : datas,
}
-mrp_price()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp/wizard/mrp_product_produce.py b/addons/mrp/wizard/mrp_product_produce.py
index 3a3c5961d1e..0851657587c 100644
--- a/addons/mrp/wizard/mrp_product_produce.py
+++ b/addons/mrp/wizard/mrp_product_produce.py
@@ -67,6 +67,5 @@ class mrp_product_produce(osv.osv_memory):
data.product_qty, data.mode, context=context)
return {}
-mrp_product_produce()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp/wizard/mrp_workcenter_load.py b/addons/mrp/wizard/mrp_workcenter_load.py
index 265c6ddcea0..79905673a6b 100644
--- a/addons/mrp/wizard/mrp_workcenter_load.py
+++ b/addons/mrp/wizard/mrp_workcenter_load.py
@@ -51,6 +51,5 @@ class mrp_workcenter_load(osv.osv_memory):
'datas' : datas,
}
-mrp_workcenter_load()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp_byproduct/mrp_byproduct.py b/addons/mrp_byproduct/mrp_byproduct.py
index 22bbface59d..2425c2d8fea 100644
--- a/addons/mrp_byproduct/mrp_byproduct.py
+++ b/addons/mrp_byproduct/mrp_byproduct.py
@@ -64,7 +64,6 @@ class mrp_subproduct(osv.osv):
res['value'].update({'product_uom': product.uom_id.id})
return res
-mrp_subproduct()
class mrp_bom(osv.osv):
_name = 'mrp.bom'
@@ -75,7 +74,6 @@ class mrp_bom(osv.osv):
'sub_products':fields.one2many('mrp.subproduct', 'bom_id', 'Byproducts'),
}
-mrp_bom()
class mrp_production(osv.osv):
_description = 'Production'
@@ -143,7 +141,6 @@ class mrp_production(osv.osv):
return subproduct_factor
return super(mrp_production, self)._get_subproduct_factor(cr, uid, production_id, move_id, context=context)
-mrp_production()
class change_production_qty(osv.osv_memory):
_inherit = 'change.production.qty'
diff --git a/addons/mrp_operations/mrp_operations.py b/addons/mrp_operations/mrp_operations.py
index cce27d3a6c2..d6f026530dc 100644
--- a/addons/mrp_operations/mrp_operations.py
+++ b/addons/mrp_operations/mrp_operations.py
@@ -21,7 +21,6 @@
from openerp.osv import fields
from openerp.osv import osv
-from openerp import netsvc
import time
from datetime import datetime
from openerp.tools.translate import _
@@ -47,7 +46,6 @@ class stock_move(osv.osv):
})
return super(stock_move, self).copy(cr, uid, id, default, context)
-stock_move()
class mrp_production_workcenter_line(osv.osv):
@@ -372,7 +370,6 @@ class mrp_production(osv.osv):
self._compute_planned_workcenter(cr, uid, ids, context=context)
return result
-mrp_production()
class mrp_operations_operation_code(osv.osv):
_name="mrp_operations.operation.code"
@@ -381,7 +378,6 @@ class mrp_operations_operation_code(osv.osv):
'code': fields.char('Code', size=16, required=True),
'start_stop': fields.selection([('start','Start'),('pause','Pause'),('resume','Resume'),('cancel','Cancelled'),('done','Done')], 'Status', required=True),
}
-mrp_operations_operation_code()
class mrp_operations_operation(osv.osv):
_name="mrp_operations.operation"
@@ -561,6 +557,5 @@ class mrp_operations_operation(osv.osv):
'date_start': lambda *a:datetime.now().strftime('%Y-%m-%d %H:%M:%S')
}
-mrp_operations_operation()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp_operations/report/mrp_workorder_analysis.py b/addons/mrp_operations/report/mrp_workorder_analysis.py
index 73982b09f8b..f91961ad74c 100644
--- a/addons/mrp_operations/report/mrp_workorder_analysis.py
+++ b/addons/mrp_operations/report/mrp_workorder_analysis.py
@@ -71,6 +71,5 @@ class mrp_workorder(osv.osv):
w.costs_hour, mp.product_id, mp.name, wl.state, wl.date_planned, wl.production_id, wl.workcenter_id
)""")
-mrp_workorder()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp_repair/mrp_repair.py b/addons/mrp_repair/mrp_repair.py
index 6c3f0ce21e1..43ee34b0c05 100644
--- a/addons/mrp_repair/mrp_repair.py
+++ b/addons/mrp_repair/mrp_repair.py
@@ -699,7 +699,6 @@ class mrp_repair_line(osv.osv, ProductChangeMixin):
'location_dest_id': scrap_location_ids and scrap_location_ids[0] or False,
}}
-mrp_repair_line()
class mrp_repair_fee(osv.osv, ProductChangeMixin):
_name = 'mrp.repair.fee'
@@ -741,5 +740,4 @@ class mrp_repair_fee(osv.osv, ProductChangeMixin):
'to_invoice': lambda *a: True,
}
-mrp_repair_fee()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp_repair/mrp_repair_view.xml b/addons/mrp_repair/mrp_repair_view.xml
index d35a9ebcf1d..a4526b5b581 100644
--- a/addons/mrp_repair/mrp_repair_view.xml
+++ b/addons/mrp_repair/mrp_repair_view.xml
@@ -210,7 +210,7 @@
<separator/>
<filter icon="terp-dolar" string="Invoiced" domain="[('invoiced','=',True)]"/>
<field name="product_id"/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/>
<group expand="0" string="Group By...">
<filter string="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
<filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
diff --git a/addons/mrp_repair/test/mrp_repair_report.yml b/addons/mrp_repair/test/mrp_repair_report.yml
index 5d66064f61d..166ace684d3 100644
--- a/addons/mrp_repair/test/mrp_repair_report.yml
+++ b/addons/mrp_repair/test/mrp_repair_report.yml
@@ -3,7 +3,8 @@
-
!python {model: mrp.repair}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.repair.order').create(cr, uid, [ref('mrp_repair.mrp_repair_rmrp0')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('mrp_repair.mrp_repair_rmrp0')], 'repair.order', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'mrp_repair-order_report.'+format), 'wb+').write(data)
diff --git a/addons/mrp_repair/wizard/cancel_repair.py b/addons/mrp_repair/wizard/cancel_repair.py
index 12b85efd202..4c60f6c3251 100644
--- a/addons/mrp_repair/wizard/cancel_repair.py
+++ b/addons/mrp_repair/wizard/cancel_repair.py
@@ -81,7 +81,6 @@ class repair_cancel(osv.osv_memory):
"""
return res
-repair_cancel()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp_repair/wizard/make_invoice.py b/addons/mrp_repair/wizard/make_invoice.py
index 9442746d68e..f9c84cb7bdb 100644
--- a/addons/mrp_repair/wizard/make_invoice.py
+++ b/addons/mrp_repair/wizard/make_invoice.py
@@ -68,7 +68,6 @@ class make_invoice(osv.osv_memory):
'type': 'ir.actions.act_window'
}
-make_invoice()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/note/i18n/cs.po b/addons/note/i18n/cs.po
new file mode 100644
index 00000000000..9d4cc3a298a
--- /dev/null
+++ b/addons/note/i18n/cs.po
@@ -0,0 +1,284 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:04+0000\n"
+"PO-Revision-Date: 2013-03-27 09:45+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-28 04:41+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: note
+#: field:note.note,memo:0
+msgid "Note Content"
+msgstr ""
+
+#. module: note
+#: view:note.stage:0
+msgid "Stages of Notes"
+msgstr ""
+
+#. module: note
+#: model:note.stage,name:note.demo_note_stage_04
+#: model:note.stage,name:note.note_stage_02
+msgid "This Week"
+msgstr ""
+
+#. module: note
+#: model:ir.model,name:note.model_base_config_settings
+msgid "base.config.settings"
+msgstr ""
+
+#. module: note
+#: model:ir.model,name:note.model_note_tag
+msgid "Note Tag"
+msgstr ""
+
+#. module: note
+#: model:res.groups,name:note.group_note_fancy
+msgid "Notes / Fancy mode"
+msgstr ""
+
+#. module: note
+#: model:ir.model,name:note.model_note_note
+#: view:note.note:0
+msgid "Note"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+msgid "Group By..."
+msgstr ""
+
+#. module: note
+#: field:note.note,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: note
+#: model:ir.actions.act_window,help:note.action_note_note
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a personal note.\n"
+" </p><p>\n"
+" Use notes to organize personal tasks or notes. All\n"
+" notes are private; no one else will be able to see them. "
+"However\n"
+" you can share some notes with other people by inviting "
+"followers\n"
+" on the note. (Useful for meeting minutes, especially if\n"
+" you activate the pad feature for collaborative writings).\n"
+" </p><p>\n"
+" You can customize how you process your notes/tasks by adding,\n"
+" removing or modifying columns.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: note
+#: model:note.stage,name:note.demo_note_stage_01
+#: model:note.stage,name:note.note_stage_01
+msgid "Today"
+msgstr ""
+
+#. module: note
+#: model:ir.model,name:note.model_res_users
+msgid "Users"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+msgid "í"
+msgstr ""
+
+#. module: note
+#: view:note.stage:0
+msgid "Stage of Notes"
+msgstr ""
+
+#. module: note
+#: field:note.note,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: note
+#: field:note.note,current_partner_id:0
+msgid "unknown"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+msgid "By sticky note Category"
+msgstr ""
+
+#. module: note
+#: help:note.note,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: note
+#: field:note.stage,name:0
+msgid "Stage Name"
+msgstr ""
+
+#. module: note
+#: field:note.note,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: note
+#: model:note.stage,name:note.demo_note_stage_02
+msgid "Tomorrow"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+#: field:note.note,open:0
+msgid "Active"
+msgstr ""
+
+#. module: note
+#: help:note.stage,user_id:0
+msgid "Owner of the note stage."
+msgstr ""
+
+#. module: note
+#: model:ir.ui.menu,name:note.menu_notes_stage
+msgid "Categories"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+#: field:note.note,stage_id:0
+msgid "Stage"
+msgstr ""
+
+#. module: note
+#: field:note.tag,name:0
+msgid "Tag Name"
+msgstr ""
+
+#. module: note
+#: field:note.note,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: note
+#: view:base.config.settings:0
+#: model:ir.actions.act_window,name:note.action_note_note
+#: model:ir.ui.menu,name:note.menu_note_notes
+#: view:note.note:0
+#: model:note.stage,name:note.note_stage_04
+msgid "Notes"
+msgstr ""
+
+#. module: note
+#: model:note.stage,name:note.demo_note_stage_03
+#: model:note.stage,name:note.note_stage_03
+msgid "Later"
+msgstr ""
+
+#. module: note
+#: model:ir.model,name:note.model_note_stage
+msgid "Note Stage"
+msgstr ""
+
+#. module: note
+#: field:note.note,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: note
+#: field:note.note,stage_ids:0
+msgid "Stages of Users"
+msgstr ""
+
+#. module: note
+#: field:note.note,name:0
+msgid "Note Summary"
+msgstr ""
+
+#. module: note
+#: model:ir.actions.act_window,name:note.action_note_stage
+#: view:note.note:0
+msgid "Stages"
+msgstr ""
+
+#. module: note
+#: help:note.note,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+msgid "Delete"
+msgstr ""
+
+#. module: note
+#: field:note.note,color:0
+msgid "Color Index"
+msgstr ""
+
+#. module: note
+#: field:note.note,sequence:0
+#: field:note.stage,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+#: field:note.note,tag_ids:0
+msgid "Tags"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+msgid "Archive"
+msgstr ""
+
+#. module: note
+#: field:base.config.settings,module_note_pad:0
+msgid "Use collaborative pads (etherpad)"
+msgstr ""
+
+#. module: note
+#: help:note.note,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: note
+#: field:base.config.settings,group_note_fancy:0
+msgid "Use fancy layouts for notes"
+msgstr ""
+
+#. module: note
+#: field:note.note,current_partner_id:0
+#: field:note.stage,user_id:0
+msgid "Owner"
+msgstr ""
+
+#. module: note
+#: help:note.stage,sequence:0
+msgid "Used to order the note stages"
+msgstr ""
+
+#. module: note
+#: field:note.note,date_done:0
+msgid "Date done"
+msgstr ""
+
+#. module: note
+#: field:note.stage,fold:0
+msgid "Folded by Default"
+msgstr ""
diff --git a/addons/note/i18n/lt.po b/addons/note/i18n/lt.po
new file mode 100644
index 00000000000..3e030054520
--- /dev/null
+++ b/addons/note/i18n/lt.po
@@ -0,0 +1,284 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:04+0000\n"
+"PO-Revision-Date: 2013-04-29 15:23+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: note
+#: field:note.note,memo:0
+msgid "Note Content"
+msgstr ""
+
+#. module: note
+#: view:note.stage:0
+msgid "Stages of Notes"
+msgstr ""
+
+#. module: note
+#: model:note.stage,name:note.demo_note_stage_04
+#: model:note.stage,name:note.note_stage_02
+msgid "This Week"
+msgstr ""
+
+#. module: note
+#: model:ir.model,name:note.model_base_config_settings
+msgid "base.config.settings"
+msgstr ""
+
+#. module: note
+#: model:ir.model,name:note.model_note_tag
+msgid "Note Tag"
+msgstr ""
+
+#. module: note
+#: model:res.groups,name:note.group_note_fancy
+msgid "Notes / Fancy mode"
+msgstr ""
+
+#. module: note
+#: model:ir.model,name:note.model_note_note
+#: view:note.note:0
+msgid "Note"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+msgid "Group By..."
+msgstr ""
+
+#. module: note
+#: field:note.note,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: note
+#: model:ir.actions.act_window,help:note.action_note_note
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a personal note.\n"
+" </p><p>\n"
+" Use notes to organize personal tasks or notes. All\n"
+" notes are private; no one else will be able to see them. "
+"However\n"
+" you can share some notes with other people by inviting "
+"followers\n"
+" on the note. (Useful for meeting minutes, especially if\n"
+" you activate the pad feature for collaborative writings).\n"
+" </p><p>\n"
+" You can customize how you process your notes/tasks by adding,\n"
+" removing or modifying columns.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: note
+#: model:note.stage,name:note.demo_note_stage_01
+#: model:note.stage,name:note.note_stage_01
+msgid "Today"
+msgstr ""
+
+#. module: note
+#: model:ir.model,name:note.model_res_users
+msgid "Users"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+msgid "í"
+msgstr ""
+
+#. module: note
+#: view:note.stage:0
+msgid "Stage of Notes"
+msgstr ""
+
+#. module: note
+#: field:note.note,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: note
+#: field:note.note,current_partner_id:0
+msgid "unknown"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+msgid "By sticky note Category"
+msgstr ""
+
+#. module: note
+#: help:note.note,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: note
+#: field:note.stage,name:0
+msgid "Stage Name"
+msgstr ""
+
+#. module: note
+#: field:note.note,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: note
+#: model:note.stage,name:note.demo_note_stage_02
+msgid "Tomorrow"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+#: field:note.note,open:0
+msgid "Active"
+msgstr ""
+
+#. module: note
+#: help:note.stage,user_id:0
+msgid "Owner of the note stage."
+msgstr ""
+
+#. module: note
+#: model:ir.ui.menu,name:note.menu_notes_stage
+msgid "Categories"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+#: field:note.note,stage_id:0
+msgid "Stage"
+msgstr ""
+
+#. module: note
+#: field:note.tag,name:0
+msgid "Tag Name"
+msgstr ""
+
+#. module: note
+#: field:note.note,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: note
+#: view:base.config.settings:0
+#: model:ir.actions.act_window,name:note.action_note_note
+#: model:ir.ui.menu,name:note.menu_note_notes
+#: view:note.note:0
+#: model:note.stage,name:note.note_stage_04
+msgid "Notes"
+msgstr ""
+
+#. module: note
+#: model:note.stage,name:note.demo_note_stage_03
+#: model:note.stage,name:note.note_stage_03
+msgid "Later"
+msgstr ""
+
+#. module: note
+#: model:ir.model,name:note.model_note_stage
+msgid "Note Stage"
+msgstr ""
+
+#. module: note
+#: field:note.note,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: note
+#: field:note.note,stage_ids:0
+msgid "Stages of Users"
+msgstr ""
+
+#. module: note
+#: field:note.note,name:0
+msgid "Note Summary"
+msgstr ""
+
+#. module: note
+#: model:ir.actions.act_window,name:note.action_note_stage
+#: view:note.note:0
+msgid "Stages"
+msgstr ""
+
+#. module: note
+#: help:note.note,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+msgid "Delete"
+msgstr ""
+
+#. module: note
+#: field:note.note,color:0
+msgid "Color Index"
+msgstr ""
+
+#. module: note
+#: field:note.note,sequence:0
+#: field:note.stage,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+#: field:note.note,tag_ids:0
+msgid "Tags"
+msgstr ""
+
+#. module: note
+#: view:note.note:0
+msgid "Archive"
+msgstr ""
+
+#. module: note
+#: field:base.config.settings,module_note_pad:0
+msgid "Use collaborative pads (etherpad)"
+msgstr ""
+
+#. module: note
+#: help:note.note,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: note
+#: field:base.config.settings,group_note_fancy:0
+msgid "Use fancy layouts for notes"
+msgstr ""
+
+#. module: note
+#: field:note.note,current_partner_id:0
+#: field:note.stage,user_id:0
+msgid "Owner"
+msgstr ""
+
+#. module: note
+#: help:note.stage,sequence:0
+msgid "Used to order the note stages"
+msgstr ""
+
+#. module: note
+#: field:note.note,date_done:0
+msgid "Date done"
+msgstr ""
+
+#. module: note
+#: field:note.stage,fold:0
+msgid "Folded by Default"
+msgstr ""
diff --git a/addons/note_pad/i18n/cs.po b/addons/note_pad/i18n/cs.po
new file mode 100644
index 00000000000..bb2502ee2d1
--- /dev/null
+++ b/addons/note_pad/i18n/cs.po
@@ -0,0 +1,28 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-30 09:13+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-31 05:27+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: note_pad
+#: model:ir.model,name:note_pad.model_note_note
+msgid "Note"
+msgstr ""
+
+#. module: note_pad
+#: field:note.note,note_pad_url:0
+msgid "Pad Url"
+msgstr ""
diff --git a/addons/note_pad/i18n/lt.po b/addons/note_pad/i18n/lt.po
new file mode 100644
index 00000000000..3c814e3f7eb
--- /dev/null
+++ b/addons/note_pad/i18n/lt.po
@@ -0,0 +1,28 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-24 18:32+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-25 05:20+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: note_pad
+#: model:ir.model,name:note_pad.model_note_note
+msgid "Note"
+msgstr "Užrašinė"
+
+#. module: note_pad
+#: field:note.note,note_pad_url:0
+msgid "Pad Url"
+msgstr "Nuorodą į užrašinę"
diff --git a/addons/pad/pad.py b/addons/pad/pad.py
index 90f5354054c..4cd9e91b76e 100644
--- a/addons/pad/pad.py
+++ b/addons/pad/pad.py
@@ -42,7 +42,7 @@ class pad_common(osv.osv_memory):
myPad.createPad(path)
#get attr on the field model
- model = self.pool.get(context["model"])
+ model = self.pool[context["model"]]
field = model._all_columns[context['field_name']]
real_field = field.column.pad_content_field
diff --git a/addons/pad/static/src/js/pad.js b/addons/pad/static/src/js/pad.js
index b96047340ad..1a2de41745b 100644
--- a/addons/pad/static/src/js/pad.js
+++ b/addons/pad/static/src/js/pad.js
@@ -1,67 +1,63 @@
openerp.pad = function(instance) {
- instance.web.form.FieldPad = instance.web.form.AbstractField.extend({
+ instance.web.form.FieldPad = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeWidgetMixin, {
template: 'FieldPad',
- configured: false,
content: "",
- start: function() {
- this._super();
- var self = this;
- this.on('change:effective_readonly',this,function(){
- self.renderElement();
+ init: function() {
+ this._super.apply(this, arguments);
+ this.set("configured", true);
+ this.on("change:configured", this, this.switch_configured);
+ },
+ initialize_content: function() {
+ this.switch_configured();
+ this.$('.oe_pad_switch').click(function() {
+ self.$el.toggleClass('oe_pad_fullscreen');
});
+ this.render_value();
+ },
+ switch_configured: function() {
+ this.$(".oe_unconfigured").toggle(! this.get("configured"));
+ this.$(".oe_configured").toggle(this.get("configured"));
},
render_value: function() {
- var self = this;
- var _super = _.bind(this._super, this);
- if (this.get("value") === false || this.get("value") === "") {
- self.view.dataset.call('pad_generate_url',{context:{
+ var self = this;
+ if (this.get("configured") && ! this.get("value")) {
+ self.view.dataset.call('pad_generate_url', {
+ context: {
model: self.view.model,
field_name: self.name,
object_id: self.view.datarecord.id
- }}).done(function(data) {
- if(data&&data.url){
- self.set({value: data.url});
- _super(data.url);
- self.renderElement();
+ },
+ }).done(function(data) {
+ if (! data.url) {
+ self.set("configured", false);
+ } else {
+ self.set("value", data.url);
}
});
- } else {
- self.renderElement();
}
- this._dirty_flag = true;
- },
- renderElement: function(){
- var self = this;
+ this.$('.oe_pad_content').html("");
var value = this.get('value');
if (this.pad_loading_request) {
this.pad_loading_request.abort();
}
- if(!_.str.startsWith(value,'http')){
- this.configured = false;
- this.content = "";
- }else{
- this.configured = true;
- if(!this.get('effective_readonly')){
- this.content = '<iframe width="100%" height="100%" frameborder="0" src="'+value+'?showChat=false&userName='+this.session.username+'"></iframe>';
- }else{
+ if (_.str.startsWith(value, 'http')) {
+ if (! this.get('effective_readonly')) {
+ var content = '<iframe width="100%" height="100%" frameborder="0" src="' + value + '?showChat=false&userName=' + this.session.username + '"></iframe>';
+ this.$('.oe_pad_content').html(content);
+ this._dirty_flag = true;
+ } else {
this.content = '<div class="oe_pad_loading">... Loading pad ...</div>';
- this.pad_loading_request = $.get(value+'/export/html')
- .done(function(data){
+ this.pad_loading_request = $.get(value + '/export/html').done(function(data) {
groups = /\<\s*body\s*\>(.*?)\<\s*\/body\s*\>/.exec(data);
data = (groups || []).length >= 2 ? groups[1] : '';
self.$('.oe_pad_content').html('<div class="oe_pad_readonly"><div>');
self.$('.oe_pad_readonly').html(data);
- }).error(function(){
+ }).fail(function() {
self.$('.oe_pad_content').text('Unable to load pad');
});
}
}
- this._super();
- this.$('.oe_pad_content').html(this.content);
- this.$('.oe_pad_switch').click(function(){
- self.$el.toggleClass('oe_pad_fullscreen');
- });
},
});
diff --git a/addons/pad/static/src/xml/pad.xml b/addons/pad/static/src/xml/pad.xml
index bd3e296f9b3..f915e867b35 100644
--- a/addons/pad/static/src/xml/pad.xml
+++ b/addons/pad/static/src/xml/pad.xml
@@ -5,32 +5,25 @@
<t t-name="FieldPad">
- <t t-if="!widget.configured">
- <div class="oe_form_field_text oe_pad oe_unconfigured">
- <p>
- You must configure the etherpad through the menu Settings > Companies > Companies, in the configuration tab of your company.
- </p>
- </div>
- </t>
-
- <t t-if="widget.configured">
+ <div class="oe_form_field_text oe_pad">
+ <p class="oe_unconfigured">
+ You must configure the etherpad through the menu Settings > Companies > Companies, in the configuration tab of your company.
+ </p>
<t t-if="widget.get('effective_readonly')">
- <div class="oe_form_field_text oe_pad oe_configured">
- <div class="oe_pad_content etherpad_readonly">
- </div>
+ <div class="oe_pad_content etherpad_readonly oe_configured">
</div>
</t>
-
- <t t-if="!widget.get('effective_readonly')">
- <div class="oe_form_field_text oe_pad oe_configured">
- <div class="oe_pad_switch_positioner">
- <span class="oe_pad_switch oe_e">&amp;Ntilde;</span>
- </div>
- <div class="oe_pad_content oe_editing">
- </div>
+ <t t-if="! widget.get('effective_readonly')">
+ <div class="oe_pad_switch_positioner oe_configured">
+ <span class="oe_pad_switch oe_e">&amp;Ntilde;</span>
+ </div>
+ <div class="oe_pad_content oe_editing oe_configured">
</div>
</t>
- </t>
+ </div>
+
+
+
</t>
</templates>
diff --git a/addons/pad_project/i18n/lt.po b/addons/pad_project/i18n/lt.po
new file mode 100644
index 00000000000..2f7340a36e2
--- /dev/null
+++ b/addons/pad_project/i18n/lt.po
@@ -0,0 +1,39 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-24 18:35+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-25 05:20+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: pad_project
+#: constraint:project.task:0
+msgid "Error ! Task end-date must be greater then task start-date"
+msgstr ""
+"Klaida! Užduotės pabaigos data negali būti ankstesnė nei pradžios data"
+
+#. module: pad_project
+#: field:project.task,description_pad:0
+msgid "Description PAD"
+msgstr ""
+
+#. module: pad_project
+#: model:ir.model,name:pad_project.model_project_task
+msgid "Task"
+msgstr "Užduotis"
+
+#. module: pad_project
+#: constraint:project.task:0
+msgid "Error ! You cannot create recursive tasks."
+msgstr "Klaida! Negalima sukurti rekursinių užduočių."
diff --git a/addons/plugin/i18n/lt.po b/addons/plugin/i18n/lt.po
new file mode 100644
index 00000000000..dc120cadcf2
--- /dev/null
+++ b/addons/plugin/i18n/lt.po
@@ -0,0 +1,23 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-24 18:14+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-25 05:20+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: plugin
+#: model:ir.model,name:plugin.model_plugin_handler
+msgid "plugin.handler"
+msgstr "plugin.handler"
diff --git a/addons/plugin/plugin_handler.py b/addons/plugin/plugin_handler.py
index 0664af1c92e..c278db2f19a 100644
--- a/addons/plugin/plugin_handler.py
+++ b/addons/plugin/plugin_handler.py
@@ -4,7 +4,8 @@ Created on 18 oct. 2011
@author: openerp
'''
-from openerp.osv import fields, osv
+from openerp.osv import osv
+from openerp.tools.translate import _
class plugin_handler(osv.osv_memory):
_name = 'plugin.handler'
@@ -29,7 +30,7 @@ class plugin_handler(osv.osv_memory):
partner_ids = partner_obj.search(cr, uid, [('email', 'like', address_email)])
res_id = partner_ids and partner_ids[0] or 0
url = self._make_url(cr, uid, res_id, 'res.partner')
- return ('res.partner', res_id , url)
+ return ('res.partner', res_id, url)
def document_get(self, cr, uid, email):
"""
@@ -48,7 +49,7 @@ class plugin_handler(osv.osv_memory):
message_id = msg.get('message_id')
msg_id = False
if message_id:
- msg_ids = mail_message_obj.search(cr, uid, [('message_id','=', message_id)])
+ msg_ids = mail_message_obj.search(cr, uid, [('message_id', '=', message_id)])
msg_id = len(msg_ids) and msg_ids[0] or False
if not msg_id and parent_id:
msg_id = parent_id
@@ -57,8 +58,8 @@ class plugin_handler(osv.osv_memory):
res_id = msg.res_id
model = msg.model
url = self._make_url(cr, uid, res_id, model)
- name = self.pool.get(model).name_get(cr, uid, [res_id])[0][1]
- return (model,res_id, url,name)
+ name = self.pool[model].name_get(cr, uid, [res_id])[0][1]
+ return (model, res_id, url, name)
def document_type(self, cr, uid, context=None):
"""
@@ -81,7 +82,7 @@ class plugin_handler(osv.osv_memory):
@return : the result of name_search a list of tuple
[(id, 'name')]
"""
- return self.pool.get(model).name_search(cr, uid, name)
+ return self.pool[model].name_search(cr, uid, name)
def push_message(self, cr, uid, model, email, res_id=0):
"""
@@ -91,29 +92,28 @@ class plugin_handler(osv.osv_memory):
@return Dictionary which contain model , url and resource id.
"""
mail_message = self.pool.get('mail.message')
- model_obj = self.pool.get(model)
+ model_obj = self.pool[model]
msg = self.pool.get('mail.thread').message_parse(cr, uid, email)
message_id = msg.get('message-id')
- mail_ids = mail_message.search(cr, uid, [('message_id','=',message_id),('res_id','=',res_id),('model','=',model)])
-
- if message_id and mail_ids :
+ mail_ids = mail_message.search(cr, uid, [('message_id', '=', message_id), ('res_id', '=', res_id), ('model', '=', model)])
+ if message_id and mail_ids:
mail_record = mail_message.browse(cr, uid, mail_ids)[0]
res_id = mail_record.res_id
- notify = "Email already pushed"
+ notify = _("Email already pushed")
elif res_id == 0:
if model == 'res.partner':
- notify = 'User the Partner button to create a new partner'
+ notify = _('Use the Partner button to create a new partner')
else:
res_id = model_obj.message_process(cr, uid, model, email)
- notify = "Mail successfully pushed, a new %s has been created " % model
+ notify = _("Mail successfully pushed, a new %s has been created.") % model
else:
model_obj.message_post(cr, uid, [res_id],
- body= msg.get('body'),
- subject= msg.get('subject'),
- type= 'email',
- parent_id= msg.get('parent_id'),
- attachments= msg.get('attachments'))
- notify = "Mail successfully pushed"
+ body=msg.get('body'),
+ subject=msg.get('subject'),
+ type='email',
+ parent_id=msg.get('parent_id'),
+ attachments=msg.get('attachments'))
+ notify = _("Mail successfully pushed")
url = self._make_url(cr, uid, res_id, model)
return (model, res_id, url, notify)
@@ -154,16 +154,17 @@ class plugin_handler(osv.osv_memory):
message_id = msg.get('message-id')
push_mail = self.push_message(cr, uid, model, headers, res_id)
res_id = push_mail[1]
- model = push_mail[0]
+ model = push_mail[0]
+ notify = push_mail[3]
for name in attachments.keys():
attachment_ids = ir_attachment_obj.search(cr, uid, [('res_model', '=', model), ('res_id', '=', res_id), ('datas_fname', '=', name)])
if attachment_ids:
- attach_ids.append( attachment_ids[0])
+ attach_ids.append(attachment_ids[0])
else:
- vals = {"res_model": model, "res_id": res_id, "name": name, "datas" :attachments[name], "datas_fname" : name}
+ vals = {"res_model": model, "res_id": res_id, "name": name, "datas": attachments[name], "datas_fname": name}
attach_ids.append(ir_attachment_obj.create(cr, uid, vals))
- mail_ids = mail_message.search(cr, uid, [('message_id','=',message_id),('res_id','=',res_id),('model','=',model)])
+ mail_ids = mail_message.search(cr, uid, [('message_id', '=', message_id), ('res_id', '=', res_id), ('model', '=', model)])
if mail_ids:
- ids = mail_message.write(cr, uid, mail_ids[0], { 'attachment_ids': [(6, 0, attach_ids)],'body':body,'body_html':body_html})
+ mail_message.write(cr, uid, mail_ids[0], {'attachment_ids': [(6, 0, attach_ids)], 'body': body, 'body_html': body_html})
url = self._make_url(cr, uid, res_id, model)
- return (model, res_id, url)
+ return (model, res_id, url, notify)
diff --git a/addons/plugin_outlook/i18n/cs.po b/addons/plugin_outlook/i18n/cs.po
new file mode 100644
index 00000000000..b095bfb469c
--- /dev/null
+++ b/addons/plugin_outlook/i18n/cs.po
@@ -0,0 +1,89 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-31 16:52+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: plugin_outlook
+#: field:outlook.installer,plugin32:0
+msgid "Outlook Plug-in 32bits"
+msgstr ""
+
+#. module: plugin_outlook
+#: view:sale.config.settings:0
+msgid "Download and install the plug-in"
+msgstr ""
+
+#. module: plugin_outlook
+#: model:ir.model,name:plugin_outlook.model_outlook_installer
+msgid "outlook.installer"
+msgstr ""
+
+#. module: plugin_outlook
+#: view:outlook.installer:0
+msgid "MS .Net Framework 3.5 or above."
+msgstr ""
+
+#. module: plugin_outlook
+#: model:ir.actions.act_window,name:plugin_outlook.action_outlook_installer
+#: model:ir.actions.act_window,name:plugin_outlook.action_outlook_wizard
+#: model:ir.ui.menu,name:plugin_outlook.menu_base_config_plugins_outlook
+#: view:outlook.installer:0
+msgid "Install Outlook Plug-In"
+msgstr ""
+
+#. module: plugin_outlook
+#: view:outlook.installer:0
+msgid "System requirements:"
+msgstr ""
+
+#. module: plugin_outlook
+#: view:outlook.installer:0
+msgid "title"
+msgstr ""
+
+#. module: plugin_outlook
+#: view:outlook.installer:0
+msgid ""
+"Click on the link above to download the installer for either 32 or 64 bits, "
+"and execute it."
+msgstr ""
+
+#. module: plugin_outlook
+#: view:outlook.installer:0
+msgid "MS Outlook 2005 or above."
+msgstr ""
+
+#. module: plugin_outlook
+#: view:outlook.installer:0
+msgid "Close"
+msgstr ""
+
+#. module: plugin_outlook
+#: field:outlook.installer,plugin64:0
+msgid "Outlook Plug-in 64bits"
+msgstr ""
+
+#. module: plugin_outlook
+#: view:outlook.installer:0
+msgid "Installation and Configuration Steps"
+msgstr ""
+
+#. module: plugin_outlook
+#: help:outlook.installer,plugin32:0
+#: help:outlook.installer,plugin64:0
+msgid "Outlook plug-in file. Save this file and install it in Outlook."
+msgstr ""
diff --git a/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPClient/OpenERPClient.csproj b/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPClient/OpenERPClient.csproj
index 75fe271e5d6..f9ac3e31553 100644
--- a/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPClient/OpenERPClient.csproj
+++ b/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPClient/OpenERPClient.csproj
@@ -17,6 +17,7 @@
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>3.5</OldToolsVersion>
+ <IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
@@ -29,7 +30,6 @@
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
- <IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
@@ -53,9 +53,8 @@
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
- <Reference Include="CookComputing.XmlRpcV2, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\OpenERPOutlookPlugin\bin\Release\CookComputing.XmlRpcV2.dll</HintPath>
+ <Reference Include="CookComputing.XmlRpcV2">
+ <HintPath>..\CookComputing.XmlRpcV2.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
@@ -81,7 +80,7 @@
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
- <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+ <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
@@ -91,7 +90,7 @@
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
<Visible>False</Visible>
- <ProductName>Windows Installer 3.1</ProductName>
+ <ProductName>Windows Installer 3.1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
diff --git a/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin.sln b/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin.sln
index f4705664cf4..ad53769e5b4 100644
--- a/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin.sln
+++ b/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin.sln
@@ -1,6 +1,6 @@

-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenERPOutlookPlugin", "OpenERPOutlookPlugin\OpenERPOutlookPlugin.csproj", "{F4B2219B-F235-400F-81B4-92F15250BBA4}"
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "OpenERPOutlookPluginSetup", "OpenERPOutlookPluginSetup\OpenERPOutlookPluginSetup.vdproj", "{96333293-0156-4998-9065-42721CEB0368}"
diff --git a/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin/Connect.cs b/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin/Connect.cs
index 1336c7f7695..dae4db88aa2 100644
--- a/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin/Connect.cs
+++ b/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin/Connect.cs
@@ -303,6 +303,7 @@ namespace OpenERPOutlookPlugin
foreach (outlook.MailItem mailitem in Tools.MailItems())
{
+
Object[] contact = Cache.OpenERPOutlookPlugin.RedirectPartnerPage(mailitem);
if ((int)contact[1] > 0)
diff --git a/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin/OpenERPOutlookPlugin.cs b/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin/OpenERPOutlookPlugin.cs
index b057201b8d1..e1d45318ee4 100644
--- a/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin/OpenERPOutlookPlugin.cs
+++ b/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPlugin/OpenERPOutlookPlugin.cs
@@ -95,7 +95,6 @@ namespace OpenERPOutlookPlugin
/*
* Will open the url into the web browser.
*/
-
System.Diagnostics.Process.Start(web_url.ToString());
}
@@ -163,9 +162,16 @@ namespace OpenERPOutlookPlugin
args.Add(attachments);
object push_mail = this.Connection.Execute("plugin.handler", "push_message_outlook", args.ToArray());
object[] push = (object[])push_mail;
- this.RedirectWeb(push[2].ToString());
- return true;
+ if (Convert.ToInt32(push[1]) == 0)
+ {
+ MessageBox.Show(push[3].ToString());
+ }
+ else
+ {
+ this.RedirectWeb(push[2].ToString());
+ }
+ return true;
}
public long CreatePartnerRecord(string name)
{
diff --git a/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPluginSetup32.msi b/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPluginSetup32.msi
index a31471c28ba..9d9dd5d3ad3 100644
--- a/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPluginSetup32.msi
+++ b/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPluginSetup32.msi
Binary files differ
diff --git a/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPluginSetup64.msi b/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPluginSetup64.msi
index 87cac88be70..0c2fa88bb24 100644
--- a/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPluginSetup64.msi
+++ b/addons/plugin_outlook/static/openerp-outlook-plugin/OpenERPOutlookPluginSetup64.msi
Binary files differ
diff --git a/addons/point_of_sale/account_bank_statement.py b/addons/point_of_sale/account_bank_statement.py
index 31415bb847c..9275b975d46 100644
--- a/addons/point_of_sale/account_bank_statement.py
+++ b/addons/point_of_sale/account_bank_statement.py
@@ -34,7 +34,6 @@ class account_journal(osv.osv):
'self_checkout_payment_method' : False,
}
-account_journal()
class account_cash_statement(osv.osv):
_inherit = 'account.bank.statement'
@@ -42,6 +41,5 @@ class account_cash_statement(osv.osv):
'pos_session_id' : fields.many2one('pos.session'),
}
-account_cash_statement()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/i18n/pt_BR.po b/addons/point_of_sale/i18n/pt_BR.po
index eac24526afc..4d4efabdec3 100644
--- a/addons/point_of_sale/i18n/pt_BR.po
+++ b/addons/point_of_sale/i18n/pt_BR.po
@@ -7,19 +7,19 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2012-10-17 00:01+0000\n"
-"Last-Translator: Syllas F. de O. Neto <syllasneto@gmail.com>\n"
+"PO-Revision-Date: 2013-04-18 18:07+0000\n"
+"Last-Translator: Thiago Tognoli <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:07+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-19 05:24+0000\n"
+"X-Generator: Launchpad (build 16567)\n"
#. module: point_of_sale
#: field:report.transaction.pos,product_nb:0
msgid "Product Nb."
-msgstr "Produto No."
+msgstr "Núm. Produto"
#. module: point_of_sale
#: model:ir.actions.act_window,name:point_of_sale.action_trans_pos_tree_today
@@ -286,7 +286,7 @@ msgstr "Desconto (%)"
#: report:pos.details:0
#: report:pos.details_summary:0
msgid "Total discount"
-msgstr "Total de Desconto"
+msgstr "Desconto total"
#. module: point_of_sale
#. openerp-web
@@ -354,6 +354,9 @@ msgid ""
"Check this if this point of sale should open by default in a self checkout "
"mode. If unchecked, OpenERP uses the normal cashier mode by default."
msgstr ""
+"Marque esta opção se este ponto de venda deve ser aberto por padrão em modo "
+"de auto atendimento. Se não marcada, o OpenERP irá usar o modo normal por "
+"padrão."
#. module: point_of_sale
#: model:ir.actions.report.xml,name:point_of_sale.pos_sales_user
@@ -444,7 +447,7 @@ msgstr "Você precisa associar um Ponto de Vendas a sua sessão."
#. module: point_of_sale
#: view:pos.order.line:0
msgid "Total qty"
-msgstr "Total de Qtd"
+msgstr "Qtd Total"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.fanta_orange_33cl_product_template
@@ -460,6 +463,10 @@ msgid ""
"close this session, you can update the 'Closing Cash Control' to avoid any "
"difference."
msgstr ""
+"Por favor, defina suas contas de lucros e perdas no seu método de pagamento "
+"'%s'. Isso permitirá o OpenERP colocar a diferença de %.2f em seu saldo "
+"final. Para fechar a sessão, você pode atualizar o 'Fechando Controle de "
+"Caixa'para evitar qualquer diferença."
#. module: point_of_sale
#: code:addons/point_of_sale/point_of_sale.py:315
@@ -777,7 +784,7 @@ msgstr "Imprimir Relatório"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.oetker_bolognese_product_template
msgid "Dr. Oetker Ristorante Bolognese"
-msgstr ""
+msgstr "Dr. Oetker Ristorante Bolognese"
#. module: point_of_sale
#: model:pos.category,name:point_of_sale.pizza
@@ -787,7 +794,7 @@ msgstr "Pizza"
#. module: point_of_sale
#: view:pos.session:0
msgid "= Theoretical Balance"
-msgstr ""
+msgstr "= Balanço Teórico"
#. module: point_of_sale
#: code:addons/point_of_sale/wizard/pos_return.py:85
@@ -974,7 +981,7 @@ msgstr "Lista de Caixas Registradoras"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.maes_50cl_product_template
msgid "Maes 50cl"
-msgstr ""
+msgstr "Maes 50cl"
#. module: point_of_sale
#: view:report.pos.order:0
@@ -1030,7 +1037,7 @@ msgstr "Spa Reine 33cl"
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_pos_discount
msgid "Add a Global Discount"
-msgstr "Adicionar Desconto Global"
+msgstr "Adicionar um Desconto Global"
#. module: point_of_sale
#: view:pos.config:0
@@ -1040,7 +1047,7 @@ msgstr "Diários"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.oetker_prosciutto_product_template
msgid "Dr. Oetker Ristorante Prosciutto"
-msgstr ""
+msgstr "Dr. Oetker Ristorante Prosciutto"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.lays_light_paprika_170g_product_template
@@ -1126,7 +1133,7 @@ msgstr "Re-impressão"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.chimay_bleu_75cl_product_template
msgid "Chimay Bleu 75cl"
-msgstr ""
+msgstr "Chimay Bleu 75cl"
#. module: point_of_sale
#: report:pos.payment.report.user:0
@@ -1156,7 +1163,7 @@ msgstr "No. de Linhas"
#: code:addons/point_of_sale/static/src/xml/pos.xml:89
#, python-format
msgid "Disc"
-msgstr "Disco"
+msgstr "Desc."
#. module: point_of_sale
#: view:pos.order:0
@@ -1166,7 +1173,7 @@ msgstr "(atualizar)"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.ijsboerke_vanille_2,5l_product_template
msgid "IJsboerke Vanilla 2.5L"
-msgstr ""
+msgstr "IJsboerke Vanilla 2.5L"
#. module: point_of_sale
#: model:ir.actions.act_window,name:point_of_sale.action_report_pos_details
@@ -1177,7 +1184,7 @@ msgstr "Detalhes da Venda"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.evian_2l_product_template
msgid "2L Evian"
-msgstr ""
+msgstr "2L Evian"
#. module: point_of_sale
#: code:addons/point_of_sale/point_of_sale.py:373
@@ -1185,7 +1192,7 @@ msgstr ""
#: code:addons/point_of_sale/wizard/pos_session_opening.py:34
#, python-format
msgid "Start Point Of Sale"
-msgstr ""
+msgstr "Iniciar Ponto de Venda"
#. module: point_of_sale
#: model:pos.category,name:point_of_sale.pils
@@ -1195,7 +1202,7 @@ msgstr ""
#. module: point_of_sale
#: help:pos.session,cash_register_balance_end_real:0
msgid "Computed using the cash control lines"
-msgstr ""
+msgstr "Calculado usando as linhas de controle de caixa"
#. module: point_of_sale
#: report:all.closed.cashbox.of.the.day:0
@@ -1217,7 +1224,7 @@ msgstr "ABC"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.ijsboerke_dame_blanche_2,5l_product_template
msgid "IJsboerke 2.5L White Lady"
-msgstr ""
+msgstr "IJsboerke 2.5L White Lady"
#. module: point_of_sale
#: field:pos.order,lines:0
@@ -1239,7 +1246,7 @@ msgstr ""
#: code:addons/point_of_sale/static/src/xml/pos.xml:485
#, python-format
msgid "Read Weighting Scale"
-msgstr ""
+msgstr "Lendo a Balança"
#. module: point_of_sale
#. openerp-web
@@ -1302,7 +1309,7 @@ msgstr "Marcar como Obsoleto"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.limon_product_template
msgid "Stringers"
-msgstr ""
+msgstr "Limões"
#. module: point_of_sale
#: field:pos.order,pricelist_id:0
@@ -1369,19 +1376,19 @@ msgstr "Stella Artois 33cl"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.lays_naturel_300g_product_template
msgid "Lays Natural XXL 300g"
-msgstr ""
+msgstr "Lays Natural XXL 300g"
#. module: point_of_sale
#. openerp-web
#: code:addons/point_of_sale/static/src/xml/pos.xml:479
#, python-format
msgid "Scan Item Unrecognized"
-msgstr ""
+msgstr "item Escaneado não Reconhecido"
#. module: point_of_sale
#: report:all.closed.cashbox.of.the.day:0
msgid "Today's Closed Cashbox"
-msgstr "Fechamento de Caixa do dia"
+msgstr "Fechamento de Caixa do Dia"
#. module: point_of_sale
#: code:addons/point_of_sale/point_of_sale.py:897
@@ -1397,7 +1404,7 @@ msgstr "Fatura Provisória"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.lays_paprika_oven_150g_product_template
msgid "Oven Baked Lays Paprika 150g"
-msgstr ""
+msgstr "Oven Baked Lays Paprika 150g"
#. module: point_of_sale
#: report:pos.invoice:0
@@ -1449,7 +1456,7 @@ msgstr "Coca-Cola Light 2L"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.oetker_funghi_product_template
msgid "Dr. Oetker Ristorante Funghi"
-msgstr ""
+msgstr "Dr. Oetker Ristorante Funghi"
#. module: point_of_sale
#: model:ir.actions.act_window,name:point_of_sale.pos_category_action
@@ -1477,7 +1484,7 @@ msgstr "Ean Inválido"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.lindemans_kriek_37,5cl_product_template
msgid "Lindemans Kriek 37.5cl"
-msgstr ""
+msgstr "Lindemans Kriek 37.5cl"
#. module: point_of_sale
#: view:pos.config:0
@@ -1494,7 +1501,7 @@ msgstr "Coca-Cola Zero 33cl"
#: code:addons/point_of_sale/static/src/xml/pos.xml:405
#, python-format
msgid "&auml;"
-msgstr ""
+msgstr "&auml;"
#. module: point_of_sale
#: report:pos.invoice:0
@@ -1523,7 +1530,7 @@ msgstr "Desconhecido"
#. module: point_of_sale
#: field:product.product,income_pdt:0
msgid "Point of Sale Cash In"
-msgstr ""
+msgstr "Colocar dinheiro no Ponto de Venda"
#. module: point_of_sale
#. openerp-web
@@ -1608,7 +1615,7 @@ msgstr ""
#. module: point_of_sale
#: model:product.template,name:point_of_sale.boon_framboise_37,5cl_product_template
msgid "Boon Framboise 37.5cl"
-msgstr ""
+msgstr "Boon Framboise 37.5cl"
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_pos_config
@@ -1627,7 +1634,7 @@ msgstr ""
#. module: point_of_sale
#: field:product.product,expense_pdt:0
msgid "Point of Sale Cash Out"
-msgstr ""
+msgstr "Sacar do Ponto de Venda"
#. module: point_of_sale
#: selection:report.pos.order,month:0
@@ -1639,7 +1646,7 @@ msgstr "Novembro"
#: code:addons/point_of_sale/static/src/xml/pos.xml:267
#, python-format
msgid "Please scan an item or your member card"
-msgstr ""
+msgstr "Por favor escaneie um item ou seu cartão de associado"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.poivron_verts_product_template
@@ -1649,7 +1656,7 @@ msgstr "Pimentões Verdes"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.timmermans_faro_37,5cl_product_template
msgid "Timmermans Faro 37.5cl"
-msgstr ""
+msgstr "Timmermans Faro 37.5cl"
#. module: point_of_sale
#: code:addons/point_of_sale/point_of_sale.py:410
@@ -1662,7 +1669,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.session:0
msgid "Validate Closing & Post Entries"
-msgstr ""
+msgstr "Validar Encerramento e Lançar Entradas"
#. module: point_of_sale
#: field:report.transaction.pos,no_trans:0
@@ -1705,7 +1712,7 @@ msgstr "Cancelar"
#: code:addons/point_of_sale/static/src/xml/pos.xml:296
#, python-format
msgid "Please put your product on the scale"
-msgstr ""
+msgstr "Por favor, coloque seu produto na balança"
#. module: point_of_sale
#: model:ir.actions.report.xml,name:point_of_sale.pos_details_summary
@@ -1715,12 +1722,12 @@ msgstr "Vendas(Resumo)"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.nectarine_product_template
msgid "Peach"
-msgstr ""
+msgstr "Pêssego"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.timmermans_kriek_37,5cl_product_template
msgid "Timmermans Kriek 37.5cl"
-msgstr ""
+msgstr "Timmermans Kriek 37.5cl"
#. module: point_of_sale
#: field:pos.config,sequence_id:0
@@ -1753,7 +1760,7 @@ msgstr "fechar"
#. module: point_of_sale
#: model:ir.actions.report.xml,name:point_of_sale.report_user_label
msgid "User Labels"
-msgstr ""
+msgstr "Etiquetas do Usuário"
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_pos_order_line
@@ -1897,6 +1904,9 @@ msgid ""
"complete\n"
" your purchase"
msgstr ""
+"Por favor, insira seu cartão no leitor e aguarde as instruções para "
+"completar\n"
+" sua compra"
#. module: point_of_sale
#: help:product.product,income_pdt:0
@@ -1935,6 +1945,8 @@ msgid ""
"Unable to open the session. You have to assign a sale journal to your point "
"of sale."
msgstr ""
+"Não é possível abrir a sessão. Você tem que atribuir um diário de venda para "
+"o seu ponto de venda."
#. module: point_of_sale
#: view:report.pos.order:0
@@ -1988,7 +2000,7 @@ msgstr "Estabelecimento:"
#. module: point_of_sale
#: field:account.journal,self_checkout_payment_method:0
msgid "Self Checkout Payment Method"
-msgstr ""
+msgstr "Forma de Pagamento do Auto Atendimento"
#. module: point_of_sale
#: view:pos.order:0
@@ -2124,7 +2136,7 @@ msgstr "Produtos"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.oetker_4formaggi_product_template
msgid "Dr. Oetker Ristorante Quattro Formaggi"
-msgstr ""
+msgstr "Dr. Oetker Ristorante Quattro Formaggi"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.croky_naturel_45g_product_template
@@ -2654,7 +2666,7 @@ msgstr "Fatura"
#: code:addons/point_of_sale/static/src/xml/pos.xml:701
#, python-format
msgid "shift"
-msgstr ""
+msgstr "shift"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.rochefort_8_33cl_product_template
@@ -2786,7 +2798,7 @@ msgstr "Produto"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.oetker_pollo_product_template
msgid "Dr. Oetker Ristorante Pollo"
-msgstr ""
+msgstr "Dr. Oetker Ristorante Pollo"
#. module: point_of_sale
#: constraint:pos.session:0
@@ -2836,7 +2848,7 @@ msgstr ""
#. module: point_of_sale
#: model:product.template,name:point_of_sale.oetker_margherita_product_template
msgid "Dr. Oetker La Margherita"
-msgstr ""
+msgstr "Dr. Oetker La Margherita"
#. module: point_of_sale
#: view:pos.order:0
@@ -2936,7 +2948,7 @@ msgstr "Gerente"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.lays_poivre_sel_oven_150g_product_template
msgid "Lays Salt and Pepper Oven Baked 150g"
-msgstr ""
+msgstr "Lays Salt and Pepper Oven Baked 150g"
#. module: point_of_sale
#: field:pos.details,date_start:0
@@ -2993,7 +3005,7 @@ msgstr "Procurar Pedido de Venda"
#. module: point_of_sale
#: field:pos.config,iface_self_checkout:0
msgid "Self Checkout Mode"
-msgstr ""
+msgstr "Modo de Auto Atendimento"
#. module: point_of_sale
#: field:account.journal,journal_user:0
@@ -3027,7 +3039,7 @@ msgstr "Relatório de Pagamento"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.fanta_orange_25cl_product_template
msgid "Fanta Orange 25cl"
-msgstr ""
+msgstr "Fanta Laranja 25cl"
#. module: point_of_sale
#: view:pos.confirm:0
@@ -3063,7 +3075,7 @@ msgstr "Motivo"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.orangina_33cl_product_template
msgid "Orangina 33cl"
-msgstr ""
+msgstr "Orangina 33cl"
#. module: point_of_sale
#: view:pos.config:0
@@ -3073,7 +3085,7 @@ msgstr "Definir como Inativo"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.chimay_bleu_33cl_product_template
msgid "Chimay Bleu 33cl"
-msgstr ""
+msgstr "Chimay Bleu 33cl"
#. module: point_of_sale
#: model:ir.actions.act_window,name:point_of_sale.action_account_journal_form
@@ -3089,7 +3101,7 @@ msgstr "Fritas"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.oetker_spinaci_product_template
msgid "Dr. Oetker Ristorante Spinaci"
-msgstr ""
+msgstr "Dr. Oetker Ristorante Spinaci"
#. module: point_of_sale
#. openerp-web
@@ -3121,7 +3133,7 @@ msgstr "Colocar dinheiro em"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.fanta_zero_orange_1,5l_product_template
msgid "Fanta Orange Zero 1.5L"
-msgstr ""
+msgstr "Fanta Laranja Zero 1.5L"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.boni_orange_product_template
@@ -3234,7 +3246,7 @@ msgstr "Relatório do PDV"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.chaudfontaine_1,5l_product_template
msgid "Chaudfontaine 1.5l"
-msgstr ""
+msgstr "Chaudfontaine 1.5l"
#. module: point_of_sale
#: code:addons/point_of_sale/point_of_sale.py:1069
@@ -3304,7 +3316,7 @@ msgstr "Coca-Cola Zero 50cl"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.oetker_tonno_product_template
msgid "Dr. Oetker Ristorante Tonno"
-msgstr ""
+msgstr "Dr. Oetker Ristorante Tonno"
#. module: point_of_sale
#: report:pos.invoice:0
@@ -3346,7 +3358,7 @@ msgstr "cash.box.out"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.fanta_zero_orange_33cl_product_template
msgid "Fanta Zero Orange 33cl"
-msgstr ""
+msgstr "Fanta Laranja Zero 33cl"
#. module: point_of_sale
#: help:product.product,available_in_pos:0
@@ -3361,7 +3373,7 @@ msgstr "Dia da data do pedido"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.maes_33cl_product_template
msgid "Maes 33cl"
-msgstr ""
+msgstr "Maes 33cl"
#. module: point_of_sale
#. openerp-web
@@ -3378,7 +3390,7 @@ msgstr "Configuração"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.orval_33cl_product_template
msgid "Orval 33cl"
-msgstr ""
+msgstr "Orval 33cl"
#. module: point_of_sale
#. openerp-web
@@ -3411,7 +3423,7 @@ msgstr "Frutas Frescas"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.lindemans_pecheresse_37,,5cl_product_template
msgid "Lindemans sinful 37.5cl"
-msgstr ""
+msgstr "Lindemans sinful 37.5cl"
#. module: point_of_sale
#: model:ir.actions.act_window,name:point_of_sale.action_pos_invoice
@@ -3431,7 +3443,7 @@ msgstr "Imagem"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.spa_gazeuse_1,5l_product_template
msgid "Spa Barisart 1.5l"
-msgstr ""
+msgstr "Spa Barisart 1.5l"
#. module: point_of_sale
#: code:addons/point_of_sale/point_of_sale.py:789
@@ -3443,7 +3455,7 @@ msgstr "Retornar Produtos"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.jupiler_33cl_product_template
msgid "Jupiler 33cl"
-msgstr ""
+msgstr "Jupiler 33cl"
#. module: point_of_sale
#. openerp-web
@@ -3551,7 +3563,7 @@ msgstr "Balança Eletrônica"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.spa_gazeuse_50cl_product_template
msgid "Spa Barisart 50cl"
-msgstr ""
+msgstr "Spa Barisart 50cl"
#. module: point_of_sale
#: field:res.users,pos_config:0
@@ -3595,7 +3607,7 @@ msgstr "Pago"
#: code:addons/point_of_sale/static/src/xml/pos.xml:464
#, python-format
msgid "3.141Kg Oranges"
-msgstr ""
+msgstr "3.141Kg de Laranjas"
#. module: point_of_sale
#: report:pos.invoice:0
@@ -3611,7 +3623,7 @@ msgstr "Por favor informe um parceiro para a venda"
#. module: point_of_sale
#: model:pos.category,name:point_of_sale.fruity_beers
msgid "Fruity Beers"
-msgstr ""
+msgstr "Cerveja de Frutas"
#. module: point_of_sale
#: view:pos.session:0
@@ -3623,7 +3635,7 @@ msgstr ""
#: code:addons/point_of_sale/static/src/xml/pos.xml:463
#, python-format
msgid "Soda 33cl"
-msgstr ""
+msgstr "Soda 33cl"
#. module: point_of_sale
#: help:pos.session,cash_register_balance_start:0
@@ -3644,7 +3656,7 @@ msgstr "Vendas do Usuário"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.oetker_hawaii_product_template
msgid "Dr. Oetker Ristorante Hawaii"
-msgstr ""
+msgstr "Dr. Oetker Ristorante Hawaii"
#. module: point_of_sale
#. openerp-web
@@ -3678,12 +3690,12 @@ msgstr ""
#. module: point_of_sale
#: model:product.template,name:point_of_sale.chaudfontaine_petillante_33cl_product_template
msgid "Chaudfontaine Petillante 33cl"
-msgstr ""
+msgstr "Chaudfontaine Petillante 33cl"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.pepsi_max_2l_product_template
msgid "Pepsi Max 2L"
-msgstr ""
+msgstr "Pepsi Max 2L"
#. module: point_of_sale
#: field:pos.session,details_ids:0
@@ -3693,17 +3705,17 @@ msgstr "Controle de Caixa"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.oetker_vegetale_product_template
msgid "Dr. Oetker Ristorante Vegetable"
-msgstr ""
+msgstr "Dr. Oetker Ristorante Vegetable"
#. module: point_of_sale
#: model:pos.category,name:point_of_sale.soda
msgid "Soda"
-msgstr ""
+msgstr "Soda"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.lays_paprika_300g_product_template
msgid "Lays Paprika XXL 300g"
-msgstr ""
+msgstr "Lays Paprika XXL 300g"
#. module: point_of_sale
#: report:pos.invoice:0
@@ -3715,7 +3727,7 @@ msgstr "Reembolso"
#: code:addons/point_of_sale/static/src/xml/pos.xml:417
#, python-format
msgid "Your shopping cart is empty"
-msgstr ""
+msgstr "Seu Carrinho de Compras está vazio"
#. module: point_of_sale
#: code:addons/point_of_sale/report/pos_invoice.py:46
@@ -3726,7 +3738,7 @@ msgstr "Por favor crie uma fatura para esta venda."
#. module: point_of_sale
#: model:product.template,name:point_of_sale.oetker_mozzarella_product_template
msgid "Dr. Oetker Ristorante Mozzarella"
-msgstr ""
+msgstr "Dr. Oetker Ristorante Mozzarella"
#. module: point_of_sale
#: report:pos.details:0
@@ -3737,7 +3749,7 @@ msgstr "Desc(%)"
#. module: point_of_sale
#: view:pos.session.opening:0
msgid "The session"
-msgstr ""
+msgstr "A sessão"
#. module: point_of_sale
#: view:pos.order:0
@@ -3762,7 +3774,7 @@ msgstr "Ordem de Linhas"
#. module: point_of_sale
#: view:pos.session.opening:0
msgid "PoS Session Opening"
-msgstr ""
+msgstr "Abrindo Sessão do PDV"
#. module: point_of_sale
#: field:pos.order.line,price_subtotal:0
@@ -3780,7 +3792,7 @@ msgstr "excluir"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.spa_50cl_product_template
msgid "Spa Reine 50cl"
-msgstr ""
+msgstr "Spa Reine 50cl"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.chicon_flandria_extra_product_template
@@ -3791,22 +3803,22 @@ msgstr ""
#: model:product.template,name:point_of_sale.lays_light_naturel_170g_product_template
#: model:product.template,name:point_of_sale.lays_naturel_170g_product_template
msgid "Lays Natural Light 170g"
-msgstr ""
+msgstr "Lays Natural Light 170g"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.leffe_blonde_33cl_product_template
msgid "Leffe Blonde 33cl"
-msgstr ""
+msgstr "Leffe Blonde 33cl"
#. module: point_of_sale
#: model:ir.actions.act_window,name:point_of_sale.action_report_pos_payment
msgid "Pyament Report"
-msgstr ""
+msgstr "Relatório de Pagamento"
#. module: point_of_sale
#: field:report.transaction.pos,jl_id:0
msgid "Cash Journals"
-msgstr ""
+msgstr "Diários de Dinheiro"
#. module: point_of_sale
#: view:pos.session:0
@@ -3816,12 +3828,12 @@ msgstr "Sessão:"
#. module: point_of_sale
#: field:pos.config,iface_print_via_proxy:0
msgid "Print via Proxy"
-msgstr ""
+msgstr "Imprimir via Proxy"
#. module: point_of_sale
#: report:pos.sales.user.today:0
msgid "Today's Sales By User"
-msgstr ""
+msgstr "Vendas de hoje por Usuário"
#. module: point_of_sale
#: report:pos.invoice:0
@@ -3858,7 +3870,7 @@ msgstr "Anotações Internas"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.ijsboerke_chocolat_2,5l_product_template
msgid "IJsboerke Chocolat 2.5L"
-msgstr ""
+msgstr "IJsboerke Chocolat 2.5L"
#. module: point_of_sale
#: help:pos.category,image_small:0
@@ -3871,7 +3883,7 @@ msgstr ""
#. module: point_of_sale
#: field:pos.session.opening,pos_state:0
msgid "Session Status"
-msgstr ""
+msgstr "Status da Sessão"
#. module: point_of_sale
#: field:pos.order,picking_id:0
@@ -3915,7 +3927,7 @@ msgstr "Editar"
#. module: point_of_sale
#: view:pos.session.opening:0
msgid "Click to continue the session."
-msgstr ""
+msgstr "Clique para continuar a sessão."
#. module: point_of_sale
#: view:pos.config:0
@@ -3930,7 +3942,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.session.opening:0
msgid "Start Selling"
-msgstr ""
+msgstr "Começar a Vender"
#. module: point_of_sale
#: selection:report.pos.order,month:0
@@ -3963,7 +3975,7 @@ msgstr ""
#. module: point_of_sale
#: model:product.template,name:point_of_sale.leffe_9_33cl_product_template
msgid "Leffe Brune \"9\" 33cl"
-msgstr ""
+msgstr "Leffe Brune \"9\" 33cl"
#. module: point_of_sale
#: help:account.journal,journal_user:0
@@ -4011,7 +4023,7 @@ msgstr ""
#: code:addons/point_of_sale/static/src/xml/pos.xml:351
#, python-format
msgid "Sorry, we could not create a session for this user."
-msgstr ""
+msgstr "Desculpe, não podemos criar uma sessão para esse usuário."
#. module: point_of_sale
#: code:addons/point_of_sale/point_of_sale.py:98
@@ -4019,7 +4031,7 @@ msgstr ""
#: selection:pos.session.opening,pos_state:0
#, python-format
msgid "Opening Control"
-msgstr ""
+msgstr "Abrindo Controle"
#. module: point_of_sale
#: view:report.pos.order:0
diff --git a/addons/point_of_sale/i18n/zh_CN.po b/addons/point_of_sale/i18n/zh_CN.po
index e4d914ae56e..23dc97f2376 100644
--- a/addons/point_of_sale/i18n/zh_CN.po
+++ b/addons/point_of_sale/i18n/zh_CN.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2012-05-10 18:26+0000\n"
-"Last-Translator: 开阖软件 Jeff Wang <jeff@osbzr.com>\n"
+"PO-Revision-Date: 2013-04-24 06:41+0000\n"
+"Last-Translator: viney <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:07+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-25 05:20+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
#. module: point_of_sale
#: field:report.transaction.pos,product_nb:0
@@ -67,7 +67,7 @@ msgstr ""
#. module: point_of_sale
#: model:pos.category,name:point_of_sale.plain_water
msgid "Plain Water"
-msgstr "白开水"
+msgstr "纯净水"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.poire_conference_product_template
@@ -2269,7 +2269,7 @@ msgstr "7月"
#: model:ir.ui.menu,name:point_of_sale.menu_pos_config_pos
#: view:pos.session:0
msgid "Point of Sales"
-msgstr ""
+msgstr "零售"
#. module: point_of_sale
#: report:pos.details:0
@@ -2303,7 +2303,7 @@ msgstr "打印数"
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_pos_make_payment
msgid "Point of Sale Payment"
-msgstr "POS付款"
+msgstr "付款"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.coca_light_50cl_product_template
@@ -2407,7 +2407,7 @@ msgstr ""
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_pos_receipt
msgid "Point of sale receipt"
-msgstr "POS收银条"
+msgstr "收银条"
#. module: point_of_sale
#: model:ir.actions.act_window,name:point_of_sale.action_report_sales_by_margin_pos_today
diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py
index 7e8487b2b2b..349ad8b4f81 100644
--- a/addons/point_of_sale/point_of_sale.py
+++ b/addons/point_of_sale/point_of_sale.py
@@ -50,7 +50,7 @@ class pos_config(osv.osv):
required=True, help="An internal identification of the point of sale"),
'journal_ids' : fields.many2many('account.journal', 'pos_config_journal_rel',
'pos_config_id', 'journal_id', 'Available Payment Methods',
- domain="[('journal_user', '=', True )]",),
+ domain="[('journal_user', '=', True ), ('type', 'in', ['bank', 'cash'])]",),
'shop_id' : fields.many2one('sale.shop', 'Shop',
required=True),
'journal_id' : fields.many2one('account.journal', 'Sale Journal',
@@ -408,6 +408,9 @@ class pos_session(osv.osv):
if not self.pool.get('ir.model.access').check_groups(cr, uid, "point_of_sale.group_pos_manager"):
raise osv.except_osv( _('Error!'),
_("Your ending balance is too different from the theorical cash closing (%.2f), the maximum allowed is: %.2f. You can contact your manager to force it.") % (st.difference, st.journal_id.amount_authorized_diff))
+ if (st.journal_id.type not in ['bank', 'cash']):
+ raise osv.except_osv(_('Error!'),
+ _("The type of the journal for your payment method should be bank or cash "))
if st.difference and st.journal_id.cash_control == True:
if st.difference > 0.0:
name= _('Point of Sale Profit')
@@ -428,7 +431,6 @@ class pos_session(osv.osv):
if st.journal_id.type == 'bank':
st.write({'balance_end_real' : st.balance_end})
-
getattr(st, 'button_confirm_%s' % st.journal_id.type)(context=context)
self._confirm_orders(cr, uid, ids, context=context)
self.write(cr, uid, ids, {'state' : 'closed'}, context=context)
@@ -522,6 +524,24 @@ class pos_order(osv.osv):
self.signal_paid(cr, uid, [order_id])
return order_ids
+ def write(self, cr, uid, ids, vals, context=None):
+ res = super(pos_order, self).write(cr, uid, ids, vals, context=context)
+ #If you change the partner of the PoS order, change also the partner of the associated bank statement lines
+ partner_obj = self.pool.get('res.partner')
+ bsl_obj = self.pool.get("account.bank.statement.line")
+ if 'partner_id' in vals:
+ for posorder in self.browse(cr, uid, ids, context=context):
+ if posorder.invoice_id:
+ raise osv.except_osv( _('Error!'), _("You cannot change the partner of a POS order for which an invoice has already been issued."))
+ if vals['partner_id']:
+ p_id = partner_obj.browse(cr, uid, vals['partner_id'], context=context)
+ part_id = partner_obj._find_accounting_partner(p_id).id
+ else:
+ part_id = False
+ bsl_ids = [x.id for x in posorder.statement_ids]
+ bsl_obj.write(cr, uid, bsl_ids, {'partner_id': part_id}, context=context)
+ return res
+
def unlink(self, cr, uid, ids, context=None):
for rec in self.browse(cr, uid, ids, context=context):
if rec.state not in ('draft','cancel'):
@@ -886,6 +906,7 @@ class pos_order(osv.osv):
account_tax_obj = self.pool.get('account.tax')
user_proxy = self.pool.get('res.users')
property_obj = self.pool.get('ir.property')
+ cur_obj = self.pool.get('res.currency')
period = account_period_obj.find(cr, uid, context=context)[0]
@@ -948,9 +969,9 @@ class pos_order(osv.osv):
})
if data_type == 'product':
- key = ('product', values['product_id'],)
+ key = ('product', values['partner_id'], values['product_id'])
elif data_type == 'tax':
- key = ('tax', values['tax_code_id'],)
+ key = ('tax', values['partner_id'], values['tax_code_id'],)
elif data_type == 'counter_part':
key = ('counter_part', values['partner_id'], values['account_id'])
else:
@@ -981,17 +1002,19 @@ class pos_order(osv.osv):
#TOFIX: a deep refactoring of this method (and class!) is needed in order to get rid of this stupid hack
assert order.lines, _('The POS order must have lines when calling this method')
# Create an move for each order line
+
+ cur = order.pricelist_id.currency_id
for line in order.lines:
tax_amount = 0
taxes = [t for t in line.product_id.taxes_id]
computed_taxes = account_tax_obj.compute_all(cr, uid, taxes, line.price_unit * (100.0-line.discount) / 100.0, line.qty)['taxes']
for tax in computed_taxes:
- tax_amount += round(tax['amount'], 2)
+ tax_amount += cur_obj.round(cr, uid, cur, tax['amount'])
group_key = (tax['tax_code_id'], tax['base_code_id'], tax['account_collected_id'], tax['id'])
group_tax.setdefault(group_key, 0)
- group_tax[group_key] += round(tax['amount'], 2)
+ group_tax[group_key] += cur_obj.round(cr, uid, cur, tax['amount'])
amount = line.price_subtotal
@@ -1026,7 +1049,7 @@ class pos_order(osv.osv):
'debit': ((amount<0) and -amount) or 0.0,
'tax_code_id': tax_code_id,
'tax_amount': tax_amount,
- 'partner_id': order.partner_id and order.partner_id.id or False
+ 'partner_id': order.partner_id and self.pool.get("res.partner")._find_accounting_partner(order.partner_id).id or False
})
# For each remaining tax with a code, whe create a move line
@@ -1044,6 +1067,7 @@ class pos_order(osv.osv):
'debit': 0.0,
'tax_code_id': tax_code_id,
'tax_amount': tax_amount,
+ 'partner_id': order.partner_id and self.pool.get("res.partner")._find_accounting_partner(order.partner_id).id or False
})
# Create a move for each tax group
@@ -1060,6 +1084,7 @@ class pos_order(osv.osv):
'debit': ((tax_amount<0) and -tax_amount) or 0.0,
'tax_code_id': key[tax_code_pos],
'tax_amount': tax_amount,
+ 'partner_id': order.partner_id and self.pool.get("res.partner")._find_accounting_partner(order.partner_id).id or False
})
# counterpart
@@ -1068,14 +1093,17 @@ class pos_order(osv.osv):
'account_id': order_account,
'credit': ((order.amount_total < 0) and -order.amount_total) or 0.0,
'debit': ((order.amount_total > 0) and order.amount_total) or 0.0,
- 'partner_id': order.partner_id and order.partner_id.id or False
+ 'partner_id': order.partner_id and self.pool.get("res.partner")._find_accounting_partner(order.partner_id).id or False
})
order.write({'state':'done', 'account_move': move_id})
+ all_lines = []
for group_key, group_data in grouped_data.iteritems():
for value in group_data:
- account_move_line_obj.create(cr, uid, value, context=context)
+ all_lines.append((0, 0, value),)
+ if move_id: #In case no order was changed
+ self.pool.get("account.move").write(cr, uid, [move_id], {'line_id':all_lines}, context=context)
return True
@@ -1103,7 +1131,6 @@ class account_bank_statement(osv.osv):
_defaults = {
'user_id': lambda self,cr,uid,c={}: uid
}
-account_bank_statement()
class account_bank_statement_line(osv.osv):
_inherit = 'account.bank.statement.line'
@@ -1111,7 +1138,6 @@ class account_bank_statement_line(osv.osv):
'pos_statement_id': fields.many2one('pos.order', ondelete='cascade'),
}
-account_bank_statement_line()
class pos_order_line(osv.osv):
_name = "pos.order.line"
@@ -1279,7 +1305,7 @@ class ean_wizard(osv.osv_memory):
ean13 = openerp.addons.product.product.sanitize_ean13(r.ean13_pattern)
m = context.get('active_model')
m_id = context.get('active_id')
- self.pool.get(m).write(cr,uid,[m_id],{'ean13':ean13})
+ self.pool[m].write(cr,uid,[m_id],{'ean13':ean13})
return { 'type' : 'ir.actions.act_window_close' }
class product_product(osv.osv):
diff --git a/addons/point_of_sale/point_of_sale_demo.xml b/addons/point_of_sale/point_of_sale_demo.xml
index 011c6d81bfc..1c61218a4cb 100644
--- a/addons/point_of_sale/point_of_sale_demo.xml
+++ b/addons/point_of_sale/point_of_sale_demo.xml
@@ -430,6 +430,7 @@
<field name="available_in_pos">True</field>
<field name="list_price">1.49</field>
<field name="name">Coca-Cola Regular 1L</field>
+ <field name="ean13">5449000054227</field>
<field name="pos_categ_id" ref="coke"/>
<field name="image">/9j/4AAQSkZJRgABAAEBLAEsAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCwoKDg0OHBYWHCgoKCgoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAGQAIgMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZqYHHfEPXNS0W3sjp0zRGUvvKqD0246g+tc+InKNrHqZVhaVdy5+ljlPCfjPxBf65aW1xevLFJOqOCi8gn6cVnGrPnSPRxuW4elRlJLWx65XWfNENusizXJcMFaUFMngjYo4+Y8ZB7L34/iKW7NKjTjG3b9X5L9fXopqozMPX9Kt9YvtPtp9+AZHbbj7oA9fcrUyipbmtGvOldxdjPPhPS9G1PT7q2EiKbkK3Ixkqdp4H97ApKnFO9jWpja1SNpSOsqzlCgAoArwx77mS6JyGUJH7KOSfxP8hSAW9thd2rRZ2tkMjf3WByp/AgUASROZIwxG1v4l9D3FAD6YHLeN/FqeHFsLSMj7VqMxRSULhEAyzFQRnqB17+1IaKUnjCyaBmHiSOHaMk+SqY/wC+gaGmBHY+NLCWUr/wlUE5AztAjb/0FaSuN2J7PxvAfFNnpj3Kzw3yskcyxFMSDkAknnIyBxT2EdnTEeQ/EzzW8eRSNG7Rw6avl4GQCXbd+PSlzJM1jRqShzJNo4TVZlawmRchihzuBH86pmRz+hXH2bUN57rjHryKSA7RLl7i805rdJfNivoJI2CHghx/TNKTRpCnOeyufQtMzPMvH8ck3jWyjQqubQl2Y4CqNxJPsAP0rlrrmkkfSZI4xw1RvuvvOQ1jRb2S58mGzmmQkKD5RBZiM4xzyKy5ZR0R69OthpQvNxKFt4fZIvtV1ss4wCy7kyzD1A9O2TjJ49cP3t2yFKgp8sIJv5HQabZJb+INMiNys7M+4IsZXCkcE5789O1OEUpIxxc+fC1Go2S8/P8AI9rrtPjThvFMFtc+Kmha4SC+axQ2pkfarne+VyQQD909OcVhUScj2MvlOFHmSvHm1t6b/mcnfalqOk2k8F9ptxb3e3y0meMMm3LHgjA6uemRwOOKxcnFao9inh6NealCacd7Xs+nr28iD/hINMnu/Mj0ySaNGjWNTCPljHDLwTzjAB7jPAycnPG+wLA1oxs5pb9evQ07RpNV8R6fcxyQxrEwHkyTqZXy3zPtHT6HFVH3pI5sRy0MJOLTd+ttF2V2epW/2jz7rzs+X5o8jgfc2Lnp/tbuvP4YrojzXd++n3L9bnztTk5Ycu9tfW7/AEtt+Z458X9Xaw8ZRwTQxvFLYIUZs5U73yQR9KmpT5zuy7M3hNLO1+hx8fim5ih2pqF1GmMbUnOPyBrH2NRdT2f7Wy+erhr5pFV9eS4bDzyyn/bJP86n2M2aRznBw2/I2YPFLat4u0JIIFidbi3t9qvnOJBzxxznpWypu6b6Hj1MypqjOnFN8zbu/P7z6Lrc8c8S/aBtNuoaLegf6yKWIn/dKkf+hGkB5ZkGIY9KBobH1pgdJ8NLM6h8SdJTGRHMZT7bFLD9QKQj6epgeQftAzxCy0W3JBmMkrj2UBQf1I/KkB44n+pH0oGgi5NAHafBiWKL4jQLKQGkglVM/wB7Gf5A0CPo6mB4P8ab42/jy286FZol09Aqt2y75IpDOEuZ7CaycwwBJCOMKP6UwKWnNCs5NwhdMdMZ7ikgOi8J3UMnjrQ/sNsIdt/EC4PJBYAj8iaGB9PUxHkXx50Ca4srDXYI2cWxaCcgZ2q3Kk+2cj8RSYHj39najb6d/aD2c62bSeWJmjIRm54DdCeDQncbTTG2lle6iJhY2k0/kx+ZL5SFiq5AycdByKLgdr8H9BuNS8ZwXJhb7PYjzpHK8A4+UZ9SSD9AaSdxuLW59F1RIjKrqVdQykYIIyDQBR1nRNP13SJdL1C3EtrKACg4xjkEEdCKTApeGPBuieEYpk0i2MZuGBkd3LscdBk9vb3oSA2Y4YoQwijSPcdzbVAyfU0wH0AA/9k=</field>
</record>
@@ -716,6 +717,7 @@
<record id="chaudfontaine_50cl" model="product.product">
<field name="available_in_pos">True</field>
<field name="list_price">0.44</field>
+ <field name="ean13">5449000111715</field>
<field name="name">Chaudfontaine 50cl</field>
<field name="pos_categ_id" ref="plain_water"/>
<field name="image">/9j/4AAQSkZJRgABAAEBLAEsAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCwoKDg0OHBYWHCgoKCgoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAGQAJAMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZqYHnfj34gaj4a1xdPtYU8vyVkLkckkn1+ld2EwsKsbswq1XF2Oa/4XBqwmUxwqVHVWAwf6/rXQ8DTSIVeVz2KxuGurC3uGXa0sSuR6EjNeVJWbR0rYnpDCgDjvFfhCw8Qaul1PJIJEiEeF6dSR05712Yau6cLW6nLXg5S0ZjS/DLS127pJl7jk5/Umt/rjfQy9jJPc9Ht0WK3jjQ5VVAB9gK8x7neh9AEVxN5SD1PApxVxN2M6Kzja5EsjMxJyd2TWzm7GSpJu5NfWkE6qehHGRkVMJtDnTUh1o/kAQlmYE8Fj0pT11Kh7uheFZllG/fFzChHBBOffitILRkyeqEQ9xxTAVizD5jxRawEEj7GTC7jvUYzzyadrkt2NWsTQp34O6I4yMkGrh1JkInTjiqBDj065pAQMf38YC/xin0F1NIVkWUdVuBbQxOy5UyYJ/u8HmtKUeZsipLlRQj1WFpBGJV3HoCwAP0zWrpSS2M1VVy5HOZc8AAdwwNQ1YtSuRifddQBFMgdyCw6LgHn9KbjowUtUaorA0KGsqr2O1hkFhWtF+8Z1fhOM8Q38+lWEUtoUWR5QnIz8pB/wr08LSjVk1LscdRuK0LHhi9uzqd7b3dzHMsUalWRcA5J/wAKjFwhyRcVbU0otxk02dJFJvvIdvIyc4PHSuGStFnRF3ZrVgaFLVl3WWP9qtKPxGdX4Th/Elk11p8fzJEsEnms7HBAAPAHfqK9TCVFGb63VjkqQukL4fkeTxDqIJP3IhyMdvTJ/nRiElRh8xxbdRnWWg/02PA9ea86psdNPc2KwNSrqS7rNuM4NXS+Iip8JwvimSKKxhMi7gJRhcZ5wSMj0yK9XBpuTt2OOrbQk8NKy+JNRXbjbHFngZ6Z55NTiv4EPVl0v4jOsgx9uiA9D0rz5fCzoW5qViaFe9lSKEbj944qoK7Jk0jkvFGmTahZW4trbzylwruowCVwc9cZ/OvQwdZU5O7toc1aDklZdSPwxp99aahfXN5bvH5qxhS5zkgHOOTxVYurCUIqL2uFGMlJto6W3KLex5IBOQAK4ZX5WbppM1KxNDP1faYUDlQuTkscCtKZnUa6meiyKoUF9o7A5qxaj2LqNyll/wA+9AbDLfbFfRscb5HHfJNNq8WSnaR0Fc5uVdRhaa3wq7sHp61dN2ZM1dGBftLDAipByuemRg4rqppNnJVbtYjmYyuskI81VOMEkD8hjNacqWj0MeZ3utTWsIJXlVzEyqDksx61y1Gl1Oyld62NesDcOtAAQD1FAAFA6AUBYKACgAD/2Q==</field>
@@ -830,6 +832,7 @@
<record id="jupiler_33cl" model="product.product">
<field name="available_in_pos">True</field>
<field name="list_price">0.77</field>
+ <field name="ean13">5410228142027</field>
<field name="name">Jupiler 33cl</field>
<field name="pos_categ_id" ref="pils"/>
<field name="image">/9j/4AAQSkZJRgABAAEBLAEsAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCwoKDg0OHBYWHCgoKCgoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAGQAPQMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZqYGdqet2+myJE6tJK4yFXgAepNACJqrPD5reTEvbc+aVwKU2vyR7mDx7FOCxUj+dMC3Z61bzxF5LuFAOu4hcfnQBZmv444fNSSKVc4+Vuv40gH2l7Hdq20FXX7yt1FMCduq/X+hrCs7Tp6/a/9tf9df1TXUWtxHlnjvxjFDrotYbWG6jiUBw5Iyc+oNc1XEckrI9vA5OsRS5pNrsT6ZrM2q2izw6LdqgGP9HuQR+RIq41m1sYYjK1Slb2i+af/BM+58UwaTcukkWqW7scssipyfzxSdeK3TFDJ681eLi/n/wCH/hOLa/22wtbmY9gIkGfxzmhYiL2uOWT14q7cV/XoQax4pvbWJ3fT3O8/wDLWXp+A/xode3QKWVqb1kbPwv8YG/1G6sL3y0lmw0RGecdsk06VXm3IxuCVGKcT05vvJ9f6GprtKdP/F/7bLz/AM/TqvPWzKmsySQ6PdyRNtdYjg1tLYuik6kU+58838N4buSW5Us7sSWHIry5KV9T7yg6fIlE9M8JXsen+H4kKHcFy2EJH5gV2UmlE+fzCnKdZtHCeM9QF/rDPECwAxjpzWNWze56GB56VKzgzM0afyNRjlcbcHpmpgkpbmuIc50n7up0Wul9TtnjghZnK/KAh6/lW7SaPLp88HrZfMx9K8O+ILO4g1EW0losci/vJPl6kDp170owknew8RiqDg4tpu3Q+homZoYWJySASfXitat+aFv5v/bX56/j3t1Xz3cr60M6Ld/9cjWstmXQ/iR9TxS6P71vrXDI+upbGTqSkBJF4PQkVnJaHXRe6MwmoNGy3owDa7YqwyDcICD3+YVrRXvo4ce2qEj2Hw8Uj8L6YzFUBtYuTxztFejT+Beh8ljP48/8T/Mi190bTmQMCyzRbh6fOKU/hIpb/I7WH/UQf7o/lWVX46f+L/21+f8An6dVK6kGsDOkXQ/6ZGtpbF0vjXqeXaZ4f1K71CC7TTftNoJfnDFQrKDg9T9a5I05N3sfQVcZShTceazsdhqWhaBoqTakdKNwXQQpaxoH3seyqe5/kK6lSgnseJLHYiUbOTOZ8PQ21zo+owaX4PvLO8jjkMU2pxKMyH7qhm5wM+nQeppRpQjsgqY7EVLc02YGl/D3xDY6nZzSwR+XDKjM3nKTgEZNYRoz57nq1cwoPDezTbdkburo1z8MrAQW0106Jb/u4SQxKldwyBkdDz2rpirRR4uIkp1pNbNsWHUtW1Pw9LcarZRWZNxH5KRybyU3DknJ759OlKfwip7v0PUIR+4i/wB0fyqZptxt3/R+a/X06qSDVf8AkFXX/XI/yq5bFU/jXqeY6tPdJHYQQ3j2sCWrSyuHKqo8x8scdew9+BXM1JtJHuUp0qcJzmk9f0RVXSfEGsWC3OnWV89rIuY557tAz88OEJ4/M8d619k0tGcX1+M5WcUtdLLb17nHajNr2l3T292buKVeShmYE/nXLKLT1bR7sainDmjTjJeVv1sbPgDWLyfxbaRS3VwyP5iPHJITg7CeQT64rSkpRqJNnBjJUK+EnKEbNNdLNanRatb3E3w/ms4LaW4KX8kbwxEgui3DZGe3A611vY+e6lLw1Hcx+D5Eu3jEsd1FGIo5Ffy1XbgEgnBPJx71MvhNIbv0PYoT+4i91H8qUpNOPm/0ZJDqn/ILuf8Ark38qp7Dh8SPJ/EsTXel2VvE+17tUtwScLxLITk+nCn8Kzprr5HbjJWjy/3r/gjF/wCElN5pVroOq2Yc2JKQXK3PkFAOMHPB6Y5x0FanCVNZ8aXceiadp+o6ba3v+jbkmuA/nINzAHII4KhSCRzU1KfMjpweKeHldX+T/wCAxvw/lF740tLhE27mAK5zjbERn8cGs7WlFHWqiqUa89rtafM3NY0qLUXurlrPUrsxySukMEmyJs3Eg5O089z7YrZnlFvQ7c23hSbdY21mjXiYjgm80nkZ3NuPze3H0qJfCaQ+J+h69EMwxc9FB/SpnTcpRd9nf8GvluRfcS72/ZJdy7l2HK+taivY8f8AEjJNbQadE2xlvrhY+efu/uxn/eJH41nT6rzO3Gp+4+8UcncPZalCj30/2K8OS8phJSYdmOOQ3XoMHj3NaI4zIuYF1rWb+5UMIHaTyAeMsQxjTH0XAHtincVjp/hParFqF5qk3ENjAzsfQ4I/kT+VRb3jojLloyXdr/M63V4vtPw8s4xazXLS+TI0UOdzksGb6ZyeardGEo8smjI0611Kz0+7VtOj0/TmuIylv5xkkWT5Ov1HPOOtRPYunu/Q9oh/1Ef+6P5VZmNu/wDj0lz/AHDQB5JNHZ3Pis219lYnaZRMT/qpXOFb8MD8zWF46q+7PWUKzcJqN1GK+fcxNa0ud/EHkajClvDZKwIUZLrlm4Hc/Mfr+NNztp1M44duXtOW8fLr8vzMfyZ7283xwt9onYBIkB+QfwoBWdWbbsj08twsKdN1Zqzf4I7O/wDJ8MaTa6CRG2papKkt+V7LkcH3OMe/zHvW6fKknueNVjGtVnOCtFFzUvL/AOEBsvOe8SPyoQfsY/eNwOBVR+FHPW/iS9WZ+nW32XwpdqlhcWSNfRskdy2ZCMKMngdSD2qanwhT3foewwf6iP8A3R/KrM2Nuji0lPohoA8W17jVrv8A67P/AOhGuGp8TPrcD/Bj6I1LTV9L1uyjsPEJaOWJdsN8n3gPRvX/AD9auMozVpfec1bD1cPJzo6p7x/yIZfEPh7w0jjw7aSXt8wx9ruV+VPp0P5AfWrUqdPY55Ucbi/j91djlbFp9R8R29xeytLLNcKXYnk81EZ80zorYRUsO0tEdwNF1XVf7Nt4dWudP08aZE2Lfgu/RhnIxwR611Q+Feh4GI0qy9WR3nhyPw/bTrbSTSQTmAs0r7maQO2SfwIqanwipbv0PUrf/j2i/wBwfyqzNjpE3xsp/iGKAPHfEqyWus3aXNu2Gkcpu9CSQQT1riqpqTPp8DaVGPK+xjEQvKRuKR46kZNZna3NR7spSQQszE3IHJH3fyoKdSaXwk2kRxrq1kwlDN56ZXB45q6fxI5cbKToyTX9XPXNGH/Eh0//AK9Y/wD0EV2w+FHzGJ/jT/xP8yvr1jcajZx2tsm+Rpk/AZ5NE1dEUmk36HXRp5capnO0AZpkjqAKt/p1tqEJjuIY5R6SKGFJpMuFSUHeLaOUvvAmkuWJtJ4Ae9vJkfrmsnRh2O2nmuIj1T9TDn+H+kBj/p92nsyg/wBKn2MfM6Fndb+VDLXwZpFldxXC3t5K8ThgoQDJH4U404p31M6+bVasHFxSudbYwXn2WG1tLORYoY1jWS5O3gDAPv8AhWqemh5s5OcnJ9Wb9naC1j+Zt8h+82MfkPSqJLFABQAUAFAAQD1GaACgAoAKACgA/9k=</field>
diff --git a/addons/point_of_sale/report/pos_order_report.py b/addons/point_of_sale/report/pos_order_report.py
index 62250f11e17..f4df5f0f5f6 100644
--- a/addons/point_of_sale/report/pos_order_report.py
+++ b/addons/point_of_sale/report/pos_order_report.py
@@ -84,6 +84,5 @@ class pos_order_report(osv.osv):
having
sum(l.qty * u.factor) != 0)""")
-pos_order_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/report/pos_report.py b/addons/point_of_sale/report/pos_report.py
index f0dbcfcad88..96b056fb0fc 100644
--- a/addons/point_of_sale/report/pos_report.py
+++ b/addons/point_of_sale/report/pos_report.py
@@ -21,7 +21,6 @@
from openerp.osv import fields, osv
import time
-from openerp import netsvc
from openerp import tools
class report_transaction_pos(osv.osv):
@@ -75,7 +74,6 @@ class report_transaction_pos(osv.osv):
""")
#to_char(date_trunc('day',absl.create_date),'YYYY-MM-DD')
#to_char(date_trunc('day',absl.create_date),'YYYY-MM-DD')::text as date_create,
-report_transaction_pos()
class report_sales_by_user_pos(osv.osv):
_name = "report.sales.by.user.pos"
@@ -108,7 +106,6 @@ class report_sales_by_user_pos(osv.osv):
)
""")
-report_sales_by_user_pos()
class report_sales_by_user_pos_month(osv.osv):
_name = "report.sales.by.user.pos.month"
@@ -141,7 +138,6 @@ class report_sales_by_user_pos_month(osv.osv):
)
""")
-report_sales_by_user_pos_month()
class report_sales_by_margin_pos(osv.osv):
_name = "report.sales.by.margin.pos"
@@ -188,7 +184,6 @@ class report_sales_by_margin_pos(osv.osv):
)
""")
-report_sales_by_margin_pos()
class report_sales_by_margin_pos_month(osv.osv):
_name = "report.sales.by.margin.pos.month"
@@ -234,6 +229,5 @@ class report_sales_by_margin_pos_month(osv.osv):
)
""")
-report_sales_by_margin_pos_month()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js
index d2cf15b54f3..98ba49c8856 100644
--- a/addons/point_of_sale/static/src/js/models.js
+++ b/addons/point_of_sale/static/src/js/models.js
@@ -1,24 +1,8 @@
function openerp_pos_models(instance, module){ //module is instance.point_of_sale
var QWeb = instance.web.qweb;
- // rounds a value with a fixed number of decimals.
- // round(3.141492,2) -> 3.14
- function round(value,decimals){
- var mult = Math.pow(10,decimals || 0);
- return Math.round(value*mult)/mult;
- }
- window.round = round;
-
- // rounds a value with decimal form precision
- // round(3.141592,0.025) ->3.125
- function round_pr(value,precision){
- if(!precision || precision < 0){
- throw new Error('round_pr(): needs a precision greater than zero, got '+precision+' instead');
- }
- return Math.round(value / precision) * precision;
- }
- window.round_pr = round_pr;
-
+ var round_di = instance.web.round_decimals;
+ var round_pr = instance.web.round_precision
// The PosModel contains the Point Of Sale's representation of the backend.
// Since the PoS must work in standalone ( Without connection to the server )
@@ -295,7 +279,8 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
return;
}
//try to push an order to the server
- (new instance.web.Model('pos.order')).get_func('create_from_ui')([order])
+ // shadow : true is to prevent a spinner to appear in case of timeout
+ (new instance.web.Model('pos.order')).call('create_from_ui',[[order]],undefined,{ shadow:true })
.fail(function(unused, event){
//don't show error popup if it fails
event.preventDefault();
@@ -390,7 +375,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
var quant = Math.max(parseFloat(quantity) || 0, 0);
var unit = this.get_unit();
if(unit){
- this.quantity = Math.max(unit.rounding, Math.round(quant / unit.rounding) * unit.rounding);
+ this.quantity = Math.max(unit.rounding, round_pr(quant, unit.rounding));
this.quantityStr = this.quantity.toFixed(Math.max(0,Math.ceil(Math.log(1.0 / unit.rounding) / Math.log(10))));
}else{
this.quantity = quant;
@@ -483,7 +468,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
},
// changes the base price of the product for this orderline
set_unit_price: function(price){
- this.price = round(parseFloat(price) || 0, 2);
+ this.price = round_di(parseFloat(price) || 0, 2);
this.trigger('change');
},
get_unit_price: function(){
diff --git a/addons/point_of_sale/static/src/js/screens.js b/addons/point_of_sale/static/src/js/screens.js
index eca4a3c5915..0bd399428ed 100644
--- a/addons/point_of_sale/static/src/js/screens.js
+++ b/addons/point_of_sale/static/src/js/screens.js
@@ -983,7 +983,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
}
if(this.pos_widget.action_bar){
- this.pos_widget.action_bar.set_button_disabled('validation', remaining > 0);
+ this.pos_widget.action_bar.set_button_disabled('validation', remaining > 0.000001);
}
},
set_numpad_state: function(numpadState) {
diff --git a/addons/point_of_sale/static/src/js/widgets.js b/addons/point_of_sale/static/src/js/widgets.js
index 874c387ea23..cec48dbe72f 100644
--- a/addons/point_of_sale/static/src/js/widgets.js
+++ b/addons/point_of_sale/static/src/js/widgets.js
@@ -794,7 +794,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
renderElement: function() {
var self = this;
this._super();
- this.$('.oe_pos_synch-notification-button').click(function(){
+ this.$el.click(function(){
self.pos.flush();
});
},
@@ -879,6 +879,8 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
instance.web.unblockUI();
self.$('.loader').animate({opacity:0},1500,'swing',function(){self.$('.loader').hide();});
+ self.pos.flush();
+
}).fail(function(){ // error when loading models data from the backend
instance.web.unblockUI();
return new instance.web.Model("ir.model.data").get_func("search_read")([['name', '=', 'action_pos_session_opening']], ['res_id'])
diff --git a/addons/point_of_sale/test/point_of_sale_report.yml b/addons/point_of_sale/test/point_of_sale_report.yml
index 00a675ac152..af034c8f23e 100644
--- a/addons/point_of_sale/test/point_of_sale_report.yml
+++ b/addons/point_of_sale/test/point_of_sale_report.yml
@@ -3,8 +3,9 @@
-
!python {model: pos.order}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.pos.details_summary').create(cr, uid, [ref('point_of_sale.pos_order_pos1')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('point_of_sale.pos_order_pos1')], 'pos.details_summary', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-details_summary report'+format), 'wb+').write(data)
@@ -13,8 +14,9 @@
-
!python {model: pos.order}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.pos.invoice').create(cr, uid, [ref('point_of_sale.pos_order_pos1')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('point_of_sale.pos_order_pos1')], 'pos.invoice', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-invoice report'+format), 'wb+').write(data)
@@ -23,8 +25,9 @@
-
!python {model: pos.order}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.pos.lines').create(cr, uid, [ref('point_of_sale.pos_order_pos1')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('point_of_sale.pos_order_pos1')], 'pos.lines', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-lines report'+format), 'wb+').write(data)
@@ -33,8 +36,9 @@
-
!python {model: pos.order}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.pos.receipt').create(cr, uid, [ref('point_of_sale.pos_order_pos1')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('point_of_sale.pos_order_pos1')], 'pos.receipt', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-receipt report'+format), 'wb+').write(data)
@@ -54,9 +58,10 @@
-
!python {model: pos.order}: |
import os, time
- from openerp import netsvc, tools
+ import openerp.report
+ from openerp import tools
data_dict = {'model':'ir.ui.menu', 'form':{'date_start': time.strftime('%Y-%m-%d'), 'date_end': time.strftime('%Y-%m-%d'),'user_id':[ref('base.user_root')] }}
- (data, format) = netsvc.LocalService('report.pos.sales.user').create(cr, uid, [ref('point_of_sale.pos_order_pos1')], data_dict, {})
+ data, format = openerp.report.render_report(cr, uid, [ref('point_of_sale.pos_order_pos1')], 'pos.sales.user', data_dict, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-sales_user_report'+format), 'wb+').write(data)
-
@@ -64,8 +69,9 @@
-
!python {model: pos.order}: |
import os, time
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.pos.payment.report').create(cr, uid, [ref('point_of_sale.pos_order_pos0')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('point_of_sale.pos_order_pos0')], 'pos.payment.report', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-payment_report'+format), 'wb+').write(data)
-
@@ -73,8 +79,9 @@
-
!python {model: pos.order}: |
import os, time
- from openerp import netsvc, tools
+ import openerp.report
+ from openerp import tools
data_dict = {'model':'ir.ui.menu', 'form':{'user_id':[ref('base.user_root'),ref('base.user_demo')] }}
- (data, format) = netsvc.LocalService('report.pos.payment.report.user').create(cr, uid, [ref('point_of_sale.pos_order_pos1')], data_dict, {})
+ data, format = openerp.report.render_report(cr, uid, [ref('point_of_sale.pos_order_pos1')], 'pos.payment.report.user', data_dict, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-payment_user_report'+format), 'wb+').write(data)
diff --git a/addons/point_of_sale/wizard/pos_box.py b/addons/point_of_sale/wizard/pos_box.py
index 776d962a3a8..471153695f4 100644
--- a/addons/point_of_sale/wizard/pos_box.py
+++ b/addons/point_of_sale/wizard/pos_box.py
@@ -16,7 +16,7 @@ class PosBox(CashBox):
active_ids = context.get('active_ids', []) or []
if active_model == 'pos.session':
- records = self.pool.get(active_model).browse(cr, uid, active_ids, context=context)
+ records = self.pool[active_model].browse(cr, uid, active_ids, context=context)
bank_statements = [record.cash_register_id for record in records if record.cash_register_id]
if not bank_statements:
@@ -41,7 +41,7 @@ class PosBoxIn(PosBox):
active_ids = context.get('active_ids', []) or []
if active_model == 'pos.session':
- session = self.pool.get(active_model).browse(cr, uid, active_ids, context=context)[0]
+ session = self.pool[active_model].browse(cr, uid, active_ids, context=context)[0]
values['ref'] = session.name
return values
@@ -57,7 +57,7 @@ class PosBoxOut(PosBox):
active_ids = context.get('active_ids', []) or []
if active_model == 'pos.session':
- session = self.pool.get(active_model).browse(cr, uid, active_ids, context=context)[0]
+ session = self.pool[active_model].browse(cr, uid, active_ids, context=context)[0]
values['ref'] = session.name
return values
diff --git a/addons/point_of_sale/wizard/pos_box_entries.py b/addons/point_of_sale/wizard/pos_box_entries.py
index ff6af8e1f62..8ca4f01b006 100644
--- a/addons/point_of_sale/wizard/pos_box_entries.py
+++ b/addons/point_of_sale/wizard/pos_box_entries.py
@@ -141,7 +141,6 @@ class pos_box_entries(osv.osv_memory):
bank_statement.create(cr, uid, vals, context=context)
return {}
-pos_box_entries()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_box_out.py b/addons/point_of_sale/wizard/pos_box_out.py
index 6b0b9ee4755..51c3993183b 100644
--- a/addons/point_of_sale/wizard/pos_box_out.py
+++ b/addons/point_of_sale/wizard/pos_box_out.py
@@ -100,7 +100,6 @@ class pos_box_out(osv.osv_memory):
statement_line_obj.create(cr, uid, vals, context=context)
return {}
-pos_box_out()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_confirm.py b/addons/point_of_sale/wizard/pos_confirm.py
index f37bdd9f8b8..6a031f54f61 100644
--- a/addons/point_of_sale/wizard/pos_confirm.py
+++ b/addons/point_of_sale/wizard/pos_confirm.py
@@ -48,7 +48,6 @@ class pos_confirm(osv.osv_memory):
data_lines += [x.id for x in move.line_id if x.account_id.id == invoice.account_id.id]
self.pool.get('account.move.line').reconcile(cr, uid, data_lines, context=context)
return {}
-pos_confirm()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_details.py b/addons/point_of_sale/wizard/pos_details.py
index 3f06dc57a46..bfd6e7c4ca7 100644
--- a/addons/point_of_sale/wizard/pos_details.py
+++ b/addons/point_of_sale/wizard/pos_details.py
@@ -60,7 +60,6 @@ class pos_details(osv.osv_memory):
'datas': datas,
}
-pos_details()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_discount.py b/addons/point_of_sale/wizard/pos_discount.py
index d2703b21ad7..d60b2766644 100644
--- a/addons/point_of_sale/wizard/pos_discount.py
+++ b/addons/point_of_sale/wizard/pos_discount.py
@@ -68,6 +68,5 @@ class pos_discount(osv.osv_memory):
order_line_ref.write(cr, uid, [x.id for x in order.lines], {'discount':this.discount}, context=context)
return {}
-pos_discount()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_open_statement.py b/addons/point_of_sale/wizard/pos_open_statement.py
index 750a5519865..97ffad805b7 100644
--- a/addons/point_of_sale/wizard/pos_open_statement.py
+++ b/addons/point_of_sale/wizard/pos_open_statement.py
@@ -86,6 +86,5 @@ class pos_open_statement(osv.osv_memory):
'search_view_id': search_id,
}
-pos_open_statement()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_payment.py b/addons/point_of_sale/wizard/pos_payment.py
index 47814761b20..02223153290 100644
--- a/addons/point_of_sale/wizard/pos_payment.py
+++ b/addons/point_of_sale/wizard/pos_payment.py
@@ -128,7 +128,6 @@ class pos_make_payment(osv.osv_memory):
'amount': _default_amount,
}
-pos_make_payment()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_payment_report.py b/addons/point_of_sale/wizard/pos_payment_report.py
index b28af5a3fff..a591fd4ce5f 100644
--- a/addons/point_of_sale/wizard/pos_payment_report.py
+++ b/addons/point_of_sale/wizard/pos_payment_report.py
@@ -43,7 +43,6 @@ class pos_payment_report(osv.osv_memory):
'datas': datas,
}
-pos_payment_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_payment_report_user.py b/addons/point_of_sale/wizard/pos_payment_report_user.py
index 06e224f39bc..37a62783ed2 100644
--- a/addons/point_of_sale/wizard/pos_payment_report_user.py
+++ b/addons/point_of_sale/wizard/pos_payment_report_user.py
@@ -49,7 +49,6 @@ class pos_payment_report_user(osv.osv_memory):
'user_id': fields.many2many('res.users', 'res_user_sale', 'user_id', 'sale_id', 'Salesperson')
}
-pos_payment_report_user()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_receipt.py b/addons/point_of_sale/wizard/pos_receipt.py
index 2a62b74bb30..3e6714f3ac7 100644
--- a/addons/point_of_sale/wizard/pos_receipt.py
+++ b/addons/point_of_sale/wizard/pos_receipt.py
@@ -55,6 +55,5 @@ class pos_receipt(osv.osv_memory):
'datas': datas,
}
-pos_receipt()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_return.py b/addons/point_of_sale/wizard/pos_return.py
index b4e0e7b2041..f0624948ed5 100644
--- a/addons/point_of_sale/wizard/pos_return.py
+++ b/addons/point_of_sale/wizard/pos_return.py
@@ -171,7 +171,6 @@ class pos_return(osv.osv_memory):
}
return act
-pos_return()
class add_product(osv.osv_memory):
_inherit = 'pos.add.product'
@@ -321,5 +320,4 @@ class add_product(osv.osv_memory):
}
return True
-add_product()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_sales_user.py b/addons/point_of_sale/wizard/pos_sales_user.py
index f2f56d6e35c..e8ece7a7953 100644
--- a/addons/point_of_sale/wizard/pos_sales_user.py
+++ b/addons/point_of_sale/wizard/pos_sales_user.py
@@ -55,7 +55,6 @@ class pos_sale_user(osv.osv_memory):
'datas': datas,
}
-pos_sale_user()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_sales_user_current_user.py b/addons/point_of_sale/wizard/pos_sales_user_current_user.py
index d3da6a9ad42..d6178ff6a50 100644
--- a/addons/point_of_sale/wizard/pos_sales_user_current_user.py
+++ b/addons/point_of_sale/wizard/pos_sales_user_current_user.py
@@ -53,7 +53,6 @@ class pos_sales_user_today_current_user(osv.osv_memory):
'datas': datas,
}
-pos_sales_user_today_current_user()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_sales_user_today.py b/addons/point_of_sale/wizard/pos_sales_user_today.py
index dfc40c863b0..65e4182daed 100644
--- a/addons/point_of_sale/wizard/pos_sales_user_today.py
+++ b/addons/point_of_sale/wizard/pos_sales_user_today.py
@@ -52,7 +52,6 @@ class pos_sales_user_today(osv.osv_memory):
'datas': datas,
}
-pos_sales_user_today()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/point_of_sale/wizard/pos_session_opening.py b/addons/point_of_sale/wizard/pos_session_opening.py
index e0135de0cdb..039dd90ae6b 100644
--- a/addons/point_of_sale/wizard/pos_session_opening.py
+++ b/addons/point_of_sale/wizard/pos_session_opening.py
@@ -115,4 +115,3 @@ class pos_session_opening(osv.osv_memory):
'pos_config_id' : result,
'show_config' : show_config,
}
-pos_session_opening()
diff --git a/addons/portal/mail_mail.py b/addons/portal/mail_mail.py
index 3810ddd2540..bc982671bfe 100644
--- a/addons/portal/mail_mail.py
+++ b/addons/portal/mail_mail.py
@@ -45,7 +45,7 @@ class mail_mail(osv.Model):
and self.check_access_rights(cr, partner.user_ids[0].id, 'read', raise_exception=False):
related_user = partner.user_ids[0]
try:
- self.pool.get(mail.model).check_access_rule(cr, related_user.id, [mail.res_id], 'read', context=context)
+ self.pool[mail.model].check_access_rule(cr, related_user.id, [mail.res_id], 'read', context=context)
url = partner_obj._get_signup_url_for_action(cr, related_user.id, [partner.id], action='', res_id=mail.res_id, model=mail.model, context=context)[partner.id]
text = _("""<small>Access this document <a style='color:inherit' href="%s">directly in OpenERP</a></small>""") % url
except except_orm, e:
diff --git a/addons/portal/portal_view.xml b/addons/portal/portal_view.xml
index d56e277c3fb..1ff98bdc77f 100644
--- a/addons/portal/portal_view.xml
+++ b/addons/portal/portal_view.xml
@@ -21,7 +21,6 @@
<field name="params" eval="&quot;{
'domain': [
('to_read', '=', True),
- ('starred', '=', False),
],
'show_compose_message': False,
'show_link': False,
@@ -40,6 +39,7 @@
</field>
</record>
+ <!-- TODO: remove me in 8.0 -->
<record id="action_mail_star_feeds_portal" model="ir.actions.client">
<field name="name">To-do</field>
<field name="tag">mail.wall</field>
@@ -67,6 +67,9 @@
</p>
</field>
</record>
+ <menuitem name="To-do" id="portal_mail_starfeeds" parent="portal_messages"
+ action="action_mail_star_feeds_portal" sequence="20" groups="base.group_no_one"/>
+ <!-- end -->
<record id="action_mail_archives_feeds_portal" model="ir.actions.client">
<field name="name">Archives</field>
@@ -84,7 +87,6 @@
'show_compose_message': False,
'show_link': False,
'view_mailbox': True,
- 'read_action': 'read'
}&quot;"/>
<field name="help" type="html">
<p>
@@ -98,8 +100,6 @@
<menuitem name="Inbox" id="portal_inbox" parent="portal_messages"
action="action_mail_inbox_feeds_portal" sequence="10" groups="portal.group_portal"/>
- <menuitem name="To-do" id="portal_mail_starfeeds" parent="portal_messages"
- action="action_mail_star_feeds_portal" sequence="20" groups="portal.group_portal"/>
<menuitem name="Archives" id="portal_mail_archivesfeeds" parent="portal_messages"
action="action_mail_archives_feeds_portal" sequence="30" groups="portal.group_portal"/>
@@ -107,7 +107,7 @@
Create menu items that we'll leave empty for now - they'll be
filled up by other portal modules.
-->
- <menuitem name="Quotations and Sales Orders" id="portal_orders" parent="portal_menu" sequence="20"/>
+ <menuitem name="Billing" id="portal_orders" parent="portal_menu" sequence="20"/>
<menuitem name="After Sale Services" id="portal_after_sales" parent="portal_menu" sequence="30"/>
<menuitem name="Projects" id="portal_projects" parent="portal_menu" sequence="40"/>
diff --git a/addons/portal/wizard/share_wizard.py b/addons/portal/wizard/share_wizard.py
index d983bf11ee1..0ffae804f07 100644
--- a/addons/portal/wizard/share_wizard.py
+++ b/addons/portal/wizard/share_wizard.py
@@ -179,7 +179,6 @@ class share_wizard_portal(osv.TransientModel):
super(share_wizard_portal,self)._finish_result_lines(cr, uid, wizard_data, share_group_id, context=context)
self.copy_share_group_access_and_delete(cr, wizard_data, share_group_id, context=context)
-share_wizard_portal()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/portal_anonymous/i18n/lt.po b/addons/portal_anonymous/i18n/lt.po
new file mode 100644
index 00000000000..60643c7f356
--- /dev/null
+++ b/addons/portal_anonymous/i18n/lt.po
@@ -0,0 +1,25 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-24 18:34+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-25 05:20+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: portal_anonymous
+#. openerp-web
+#: code:addons/portal_anonymous/static/src/xml/portal_anonymous.xml:8
+#, python-format
+msgid "Login"
+msgstr "Prisijungti"
diff --git a/addons/portal_anonymous/i18n/ru.po b/addons/portal_anonymous/i18n/ru.po
new file mode 100644
index 00000000000..5ae80dfe490
--- /dev/null
+++ b/addons/portal_anonymous/i18n/ru.po
@@ -0,0 +1,25 @@
+# Russian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-09 13:04+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Russian <ru@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-10 05:21+0000\n"
+"X-Generator: Launchpad (build 16550)\n"
+
+#. module: portal_anonymous
+#. openerp-web
+#: code:addons/portal_anonymous/static/src/xml/portal_anonymous.xml:8
+#, python-format
+msgid "Login"
+msgstr "Вход"
diff --git a/addons/portal_crm/i18n/cs.po b/addons/portal_crm/i18n/cs.po
new file mode 100644
index 00000000000..985d487adbc
--- /dev/null
+++ b/addons/portal_crm/i18n/cs.po
@@ -0,0 +1,546 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-29 18:40+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-30 05:27+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,type:0
+msgid "Lead"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,title:0
+msgid "Title"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,probability:0
+msgid "Success Rate (%)"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Contact us"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_action:0
+msgid "Next Action Date"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,fax:0
+msgid "Fax"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,zip:0
+msgid "Zip"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,day_open:0
+msgid "Days to Open"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Thank you for your interest, we'll respond to your request shortly."
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,priority:0
+msgid "Highest"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,mobile:0
+msgid "Mobile"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,description:0
+msgid "Notes"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,color:0
+msgid "Color Index"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_latitude:0
+msgid "Geo Latitude"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_name:0
+msgid "Customer Name"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,channel_id:0
+msgid "Communication channel (mail, direct, phone, ...)"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,type_id:0
+msgid "Campaign"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,ref:0
+msgid "Reference"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_action_next:0
+#: field:portal_crm.crm_contact_us,title_action:0
+msgid "Next Action"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: portal_crm
+#: model:ir.actions.act_window,name:portal_crm.action_contact_us
+msgid "Contact Us"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,opt_out:0
+msgid "Opt-Out"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,priority:0
+msgid "Priority"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,state_id:0
+msgid "State"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,partner_id:0
+msgid "Linked partner (optional). Usually created when converting the lead."
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,payment_mode:0
+msgid "Payment Mode"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,state:0
+msgid "New"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,type:0
+msgid "Type"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,email_from:0
+msgid "Email"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,channel_id:0
+msgid "Channel"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Name"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,priority:0
+msgid "Lowest"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,create_date:0
+msgid "Creation Date"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Close"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,state:0
+msgid "Pending"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,type:0
+msgid "Type is used to separate Leads and Opportunities"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,categ_ids:0
+msgid "Categories"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,stage_id:0
+msgid "Stage"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,user_login:0
+msgid "User Login"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,opt_out:0
+msgid ""
+"If opt-out is checked, this contact has refused to receive emails or "
+"unsubscribed to a campaign."
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,contact_name:0
+msgid "Contact Name"
+msgstr ""
+
+#. module: portal_crm
+#: model:ir.ui.menu,name:portal_crm.portal_company_contact
+msgid "Contact"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_address_email:0
+msgid "Partner Contact Email"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,planned_revenue:0
+msgid "Expected Revenue"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,task_ids:0
+msgid "Tasks"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Contact form"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,company_currency:0
+msgid "Currency"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,write_date:0
+msgid "Update Date"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_deadline:0
+msgid "Expected Closing"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,ref2:0
+msgid "Reference 2"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,user_email:0
+msgid "User Email"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_open:0
+msgid "Opened"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,state:0
+msgid "In Progress"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,partner_name:0
+msgid ""
+"The name of the future partner company that will be created while converting "
+"the lead into opportunity"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,planned_cost:0
+msgid "Planned Costs"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,date_deadline:0
+msgid "Estimate of the date on which the opportunity will be won."
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,email_cc:0
+msgid ""
+"These email addresses will be added to the CC field of all inbound and "
+"outbound emails for this record before being sent. Separate multiple email "
+"addresses with a comma"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,priority:0
+msgid "Low"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_closed:0
+#: selection:portal_crm.crm_contact_us,state:0
+msgid "Closed"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_assign:0
+msgid "Assignation Date"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,state:0
+msgid "Status"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,priority:0
+msgid "Normal"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,email_cc:0
+msgid "Global CC"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,street2:0
+msgid "Street2"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,id:0
+msgid "ID"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,phone:0
+msgid "Phone"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,active:0
+msgid "Active"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,user_id:0
+msgid "Salesperson"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,day_close:0
+msgid "Days to Close"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,company_ids:0
+msgid "Companies"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,section_id:0
+msgid ""
+"When sending mails, the default email address is taken from the sales team."
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_address_name:0
+msgid "Partner Contact Name"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_longitude:0
+msgid "Geo Longitude"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,date_assign:0
+msgid "Last date this case was forwarded/assigned to a partner"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,email_from:0
+msgid "Email address of the contact"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,city:0
+msgid "City"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Submit"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,function:0
+msgid "Function"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,referred:0
+msgid "Referred By"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_assigned_id:0
+msgid "Assigned Partner"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,type:0
+msgid "Opportunity"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,partner_assigned_id:0
+msgid "Partner this case has been forwarded/assigned to."
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,country_id:0
+msgid "Country"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Thank you"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,state:0
+msgid ""
+"The Status is set to 'Draft', when a case is created. If the case is in "
+"progress the Status is set to 'Open'. When the case is over, the Status is "
+"set to 'Done'. If the case needs to be reviewed then the Status is set to "
+"'Pending'."
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,type_id:0
+msgid ""
+"From which campaign (seminar, marketing campaign, mass mailing, ...) did "
+"this contact come from?"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,priority:0
+msgid "High"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,section_id:0
+msgid "Sales Team"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,street:0
+msgid "Street"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_action_last:0
+msgid "Last Action"
+msgstr ""
+
+#. module: portal_crm
+#: model:ir.model,name:portal_crm.model_portal_crm_crm_contact_us
+msgid "Contact form for the portal"
+msgstr ""
diff --git a/addons/portal_crm/i18n/lt.po b/addons/portal_crm/i18n/lt.po
new file mode 100644
index 00000000000..b2b223c6124
--- /dev/null
+++ b/addons/portal_crm/i18n/lt.po
@@ -0,0 +1,546 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-29 15:24+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,type:0
+msgid "Lead"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,title:0
+msgid "Title"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,probability:0
+msgid "Success Rate (%)"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Contact us"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_action:0
+msgid "Next Action Date"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,fax:0
+msgid "Fax"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,zip:0
+msgid "Zip"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,day_open:0
+msgid "Days to Open"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Thank you for your interest, we'll respond to your request shortly."
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,priority:0
+msgid "Highest"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,mobile:0
+msgid "Mobile"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,description:0
+msgid "Notes"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,color:0
+msgid "Color Index"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_latitude:0
+msgid "Geo Latitude"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_name:0
+msgid "Customer Name"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,channel_id:0
+msgid "Communication channel (mail, direct, phone, ...)"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,type_id:0
+msgid "Campaign"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,ref:0
+msgid "Reference"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_action_next:0
+#: field:portal_crm.crm_contact_us,title_action:0
+msgid "Next Action"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: portal_crm
+#: model:ir.actions.act_window,name:portal_crm.action_contact_us
+msgid "Contact Us"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,opt_out:0
+msgid "Opt-Out"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,priority:0
+msgid "Priority"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,state_id:0
+msgid "State"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,partner_id:0
+msgid "Linked partner (optional). Usually created when converting the lead."
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,payment_mode:0
+msgid "Payment Mode"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,state:0
+msgid "New"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,type:0
+msgid "Type"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,email_from:0
+msgid "Email"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,channel_id:0
+msgid "Channel"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Name"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,priority:0
+msgid "Lowest"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,create_date:0
+msgid "Creation Date"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Close"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,state:0
+msgid "Pending"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,type:0
+msgid "Type is used to separate Leads and Opportunities"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,categ_ids:0
+msgid "Categories"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,stage_id:0
+msgid "Stage"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,user_login:0
+msgid "User Login"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,opt_out:0
+msgid ""
+"If opt-out is checked, this contact has refused to receive emails or "
+"unsubscribed to a campaign."
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,contact_name:0
+msgid "Contact Name"
+msgstr ""
+
+#. module: portal_crm
+#: model:ir.ui.menu,name:portal_crm.portal_company_contact
+msgid "Contact"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_address_email:0
+msgid "Partner Contact Email"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,planned_revenue:0
+msgid "Expected Revenue"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,task_ids:0
+msgid "Tasks"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Contact form"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,company_currency:0
+msgid "Currency"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,write_date:0
+msgid "Update Date"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_deadline:0
+msgid "Expected Closing"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,ref2:0
+msgid "Reference 2"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,user_email:0
+msgid "User Email"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_open:0
+msgid "Opened"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,state:0
+msgid "In Progress"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,partner_name:0
+msgid ""
+"The name of the future partner company that will be created while converting "
+"the lead into opportunity"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,planned_cost:0
+msgid "Planned Costs"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,date_deadline:0
+msgid "Estimate of the date on which the opportunity will be won."
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,email_cc:0
+msgid ""
+"These email addresses will be added to the CC field of all inbound and "
+"outbound emails for this record before being sent. Separate multiple email "
+"addresses with a comma"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,priority:0
+msgid "Low"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_closed:0
+#: selection:portal_crm.crm_contact_us,state:0
+msgid "Closed"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_assign:0
+msgid "Assignation Date"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,state:0
+msgid "Status"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,priority:0
+msgid "Normal"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,email_cc:0
+msgid "Global CC"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,street2:0
+msgid "Street2"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,id:0
+msgid "ID"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,phone:0
+msgid "Phone"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,active:0
+msgid "Active"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,user_id:0
+msgid "Salesperson"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,day_close:0
+msgid "Days to Close"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,company_ids:0
+msgid "Companies"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,section_id:0
+msgid ""
+"When sending mails, the default email address is taken from the sales team."
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_address_name:0
+msgid "Partner Contact Name"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_longitude:0
+msgid "Geo Longitude"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,date_assign:0
+msgid "Last date this case was forwarded/assigned to a partner"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,email_from:0
+msgid "Email address of the contact"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,city:0
+msgid "City"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Submit"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,function:0
+msgid "Function"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,referred:0
+msgid "Referred By"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,partner_assigned_id:0
+msgid "Assigned Partner"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,type:0
+msgid "Opportunity"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,partner_assigned_id:0
+msgid "Partner this case has been forwarded/assigned to."
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,country_id:0
+msgid "Country"
+msgstr ""
+
+#. module: portal_crm
+#: view:portal_crm.crm_contact_us:0
+msgid "Thank you"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,state:0
+msgid ""
+"The Status is set to 'Draft', when a case is created. If the case is in "
+"progress the Status is set to 'Open'. When the case is over, the Status is "
+"set to 'Done'. If the case needs to be reviewed then the Status is set to "
+"'Pending'."
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: portal_crm
+#: help:portal_crm.crm_contact_us,type_id:0
+msgid ""
+"From which campaign (seminar, marketing campaign, mass mailing, ...) did "
+"this contact come from?"
+msgstr ""
+
+#. module: portal_crm
+#: selection:portal_crm.crm_contact_us,priority:0
+msgid "High"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,section_id:0
+msgid "Sales Team"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,street:0
+msgid "Street"
+msgstr ""
+
+#. module: portal_crm
+#: field:portal_crm.crm_contact_us,date_action_last:0
+msgid "Last Action"
+msgstr ""
+
+#. module: portal_crm
+#: model:ir.model,name:portal_crm.model_portal_crm_crm_contact_us
+msgid "Contact form for the portal"
+msgstr ""
diff --git a/addons/portal_hr_employees/i18n/cs.po b/addons/portal_hr_employees/i18n/cs.po
new file mode 100644
index 00000000000..367029b7a38
--- /dev/null
+++ b/addons/portal_hr_employees/i18n/cs.po
@@ -0,0 +1,95 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-03-30 09:15+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-31 05:28+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+msgid "Coach"
+msgstr ""
+
+#. module: portal_hr_employees
+#: model:ir.actions.act_window,name:portal_hr_employees.action_team
+#: view:portal_crm.crm_contact_us:0
+msgid "Our Team"
+msgstr ""
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+msgid "Group By..."
+msgstr ""
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+msgid "Company"
+msgstr ""
+
+#. module: portal_hr_employees
+#: selection:hr.employee,visibility:0
+msgid "Public"
+msgstr ""
+
+#. module: portal_hr_employees
+#: help:hr.employee,visibility:0
+msgid "Employee's visibility in the portal's contact page"
+msgstr ""
+
+#. module: portal_hr_employees
+#: selection:hr.employee,visibility:0
+msgid "Private"
+msgstr ""
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+msgid "Manager"
+msgstr ""
+
+#. module: portal_hr_employees
+#: model:ir.model,name:portal_hr_employees.model_hr_employee
+msgid "Employee"
+msgstr ""
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+msgid "Job"
+msgstr ""
+
+#. module: portal_hr_employees
+#: field:hr.employee,visibility:0
+msgid "Visibility"
+msgstr ""
+
+#. module: portal_hr_employees
+#: field:hr.employee,public_info:0
+msgid "Public Info"
+msgstr ""
+
+#. module: portal_hr_employees
+#: model:ir.model,name:portal_hr_employees.model_portal_crm_crm_contact_us
+msgid "Contact form for the portal"
+msgstr ""
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+msgid "Department"
+msgstr ""
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+#: field:portal_crm.crm_contact_us,employee_ids:0
+msgid "Employees"
+msgstr ""
diff --git a/addons/portal_hr_employees/i18n/lt.po b/addons/portal_hr_employees/i18n/lt.po
new file mode 100644
index 00000000000..50a5a872eac
--- /dev/null
+++ b/addons/portal_hr_employees/i18n/lt.po
@@ -0,0 +1,95 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-04-29 15:24+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+msgid "Coach"
+msgstr ""
+
+#. module: portal_hr_employees
+#: model:ir.actions.act_window,name:portal_hr_employees.action_team
+#: view:portal_crm.crm_contact_us:0
+msgid "Our Team"
+msgstr ""
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+msgid "Group By..."
+msgstr ""
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+msgid "Company"
+msgstr ""
+
+#. module: portal_hr_employees
+#: selection:hr.employee,visibility:0
+msgid "Public"
+msgstr ""
+
+#. module: portal_hr_employees
+#: help:hr.employee,visibility:0
+msgid "Employee's visibility in the portal's contact page"
+msgstr ""
+
+#. module: portal_hr_employees
+#: selection:hr.employee,visibility:0
+msgid "Private"
+msgstr ""
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+msgid "Manager"
+msgstr ""
+
+#. module: portal_hr_employees
+#: model:ir.model,name:portal_hr_employees.model_hr_employee
+msgid "Employee"
+msgstr ""
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+msgid "Job"
+msgstr ""
+
+#. module: portal_hr_employees
+#: field:hr.employee,visibility:0
+msgid "Visibility"
+msgstr ""
+
+#. module: portal_hr_employees
+#: field:hr.employee,public_info:0
+msgid "Public Info"
+msgstr ""
+
+#. module: portal_hr_employees
+#: model:ir.model,name:portal_hr_employees.model_portal_crm_crm_contact_us
+msgid "Contact form for the portal"
+msgstr ""
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+msgid "Department"
+msgstr ""
+
+#. module: portal_hr_employees
+#: view:hr.employee:0
+#: field:portal_crm.crm_contact_us,employee_ids:0
+msgid "Employees"
+msgstr ""
diff --git a/addons/portal_project/__init__.py b/addons/portal_project/__init__.py
index 26c654db9dd..164c7826e47 100644
--- a/addons/portal_project/__init__.py
+++ b/addons/portal_project/__init__.py
@@ -19,3 +19,4 @@
#
##############################################################################
+import project
diff --git a/addons/portal_project/project.py b/addons/portal_project/project.py
new file mode 100644
index 00000000000..fb783c8a531
--- /dev/null
+++ b/addons/portal_project/project.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2013-TODAY OpenERP S.A (<http://www.openerp.com>).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.osv import osv
+
+
+class portal_project(osv.Model):
+ """ Update of mail_mail class, to add the signin URL to notifications. """
+ _inherit = 'project.project'
+
+ def _get_visibility_selection(self, cr, uid, context=None):
+ """ Override to add portal option. """
+ selection = super(portal_project, self)._get_visibility_selection(cr, uid, context=context)
+ idx = [item[0] for item in selection].index('public')
+ selection.insert((idx + 1), ('portal', 'Portal Users and Employees'))
+ return selection
+ # return [('public', 'All Users'),
+ # ('portal', 'Portal Users and Employees'),
+ # ('employees', 'Employees Only'),
+ # ('followers', 'Followers Only')]
diff --git a/addons/portal_project/security/ir.model.access.csv b/addons/portal_project/security/ir.model.access.csv
index 0e743050568..a999f5555d9 100644
--- a/addons/portal_project/security/ir.model.access.csv
+++ b/addons/portal_project/security/ir.model.access.csv
@@ -5,3 +5,9 @@ access_task_type,task_type,project.model_project_task_type,portal.group_portal,1
access_task_work,task_work,project.model_project_task_work,portal.group_portal,1,0,0,0
access_project_category,project_category,project.model_project_category,portal.group_portal,1,0,0,0
access_account_analytic_account,account_analytic_account,analytic.model_account_analytic_account,portal.group_portal,1,0,0,0
+access_project_anonymous,project,project.model_project_project,portal.group_anonymous,1,0,0,0
+access_task_anonymous,task,project.model_project_task,portal.group_anonymous,1,0,0,0
+access_task_type_anonymous,task_type,project.model_project_task_type,portal.group_anonymous,1,0,0,0
+access_task_work_anonymous,task_work,project.model_project_task_work,portal.group_anonymous,1,0,0,0
+access_project_category_anonymous,project_category,project.model_project_category,portal.group_anonymous,1,0,0,0
+access_account_analytic_account_anonymous,account_analytic_account,analytic.model_account_analytic_account,portal.group_anonymous,1,0,0,0 \ No newline at end of file
diff --git a/addons/portal_project/security/portal_security.xml b/addons/portal_project/security/portal_security.xml
index 0d995cfd70b..8d58ed70aeb 100644
--- a/addons/portal_project/security/portal_security.xml
+++ b/addons/portal_project/security/portal_security.xml
@@ -2,19 +2,68 @@
<openerp>
<data noupdate="1">
+ <record model="ir.rule" id="project.project_public_members_rule">
+ <field name="name">Project: employees: public, portal, employees or following</field>
+ <field name="domain_force">['|',
+ ('privacy_visibility', 'in', ['public', 'portal', 'employees']),
+ '&amp;',
+ ('privacy_visibility', '=', 'followers'),
+ ('message_follower_ids', 'in', [user.partner_id.id]),
+ ]</field>
+ <field name="groups" eval="[(4, ref('base.group_user'))]"/>
+ </record>
+
<record id="portal_project_rule" model="ir.rule">
- <field name="name">Portal Projects</field>
- <field ref="project.model_project_project" name="model_id"/>
- <field name="domain_force">['|', ('privacy_visibility', '=', 'public'), ('message_follower_ids', 'in', [user.partner_id.id])]</field>
+ <field name="name">Project: portal users: public, portal or following</field>
+ <field name="model_id" ref="project.model_project_project"/>
+ <field name="domain_force">['|',
+ ('privacy_visibility', 'in', ['public', 'portal']),
+ '&amp;',
+ ('privacy_visibility', '=', 'followers'),
+ ('message_follower_ids', 'in', [user.partner_id.id]),
+ ]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
+ <record model="ir.rule" id="project_anonymous_rule">
+ <field name="name">Project: anonymous users: public only</field>
+ <field name="model_id" ref="project.model_project_project"/>
+ <field name="domain_force">[('privacy_visibility', '=', 'public')]</field>
+ <field name="groups" eval="[(4, ref('portal.group_anonymous'))]"/>
+ </record>
+
+ <record model="ir.rule" id="project.task_visibility_rule">
+ <field name="name">Project/Task: employees: public, portal, employee or following or assigned</field>
+ <field name="domain_force">['|',
+ ('user_id', '=', user.id),
+ '|',
+ ('project_id.privacy_visibility', 'in', ['public', 'portal', 'employees']),
+ '&amp;',
+ ('project_id.privacy_visibility', '=', 'followers'),
+ ('message_follower_ids', 'in', [user.partner_id.id]),
+ ]</field>
+ </record>
+
<record id="portal_task_rule" model="ir.rule">
- <field name="name">Portal Tasks</field>
- <field ref="project.model_project_task" name="model_id"/>
- <field name="domain_force">[('message_follower_ids','in', [user.partner_id.id])]</field>
+ <field name="name">Project/Task: portal users: public or portal and following</field>
+ <field name="model_id" ref="project.model_project_task"/>
+ <field name="domain_force">['|',
+ ('project_id.privacy_visibility', '=', 'public'),
+ '&amp;',
+ ('project_id.privacy_visibility', 'in', ['portal', 'followers']),
+ '|',
+ ('message_follower_ids','in', [user.partner_id.id]),
+ ('user_id', '=', user.id),
+ ]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
+ <record model="ir.rule" id="task_anonymous_rule">
+ <field name="name">Project/Task: anonymous users: public only</field>
+ <field name="model_id" ref="project.model_project_task"/>
+ <field name="domain_force">[('project_id.privacy_visibility', '=', 'public')]</field>
+ <field name="groups" eval="[(4, ref('portal.group_anonymous'))]"/>
+ </record>
+
</data>
</openerp>
diff --git a/addons/crm_claim/res_config.py b/addons/portal_project/tests/__init__.py
index aa0cb7ffa20..c79181f7710 100644
--- a/addons/crm_claim/res_config.py
+++ b/addons/portal_project/tests/__init__.py
@@ -2,7 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Business Applications
-# Copyright (C) 2004-2012 OpenERP S.A. (<http://openerp.com>).
+# Copyright (c) 2012-TODAY OpenERP S.A. <http://openerp.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -19,14 +19,10 @@
#
##############################################################################
-from openerp.osv import fields, osv
+from . import test_access_rights
-class crm_claim_settings(osv.osv_memory):
- _name = 'sale.config.settings'
- _inherit = ['sale.config.settings', 'fetchmail.config.settings']
+checks = [
+ test_access_rights,
+]
- _columns = {
- 'fetchmail_claim': fields.boolean("Create claims from incoming mails",
- fetchmail_model='crm.claim', fetchmail_name='Incoming Claims',
- help="""Allows you to configure your incoming mail server, and create claims from incoming emails."""),
- }
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/portal_project/tests/test_access_rights.py b/addons/portal_project/tests/test_access_rights.py
new file mode 100644
index 00000000000..a7d56cb3895
--- /dev/null
+++ b/addons/portal_project/tests/test_access_rights.py
@@ -0,0 +1,300 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2013-TODAY OpenERP S.A. <http://openerp.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.osv.orm import except_orm
+from openerp.tests import common
+from openerp.tools import mute_logger
+
+
+class TestPortalProject(common.TransactionCase):
+
+ def setUp(self):
+ super(TestPortalProject, self).setUp()
+ cr, uid = self.cr, self.uid
+
+ # Useful models
+ self.project_project = self.registry('project.project')
+ self.project_task = self.registry('project.task')
+ self.res_users = self.registry('res.users')
+ self.res_partner = self.registry('res.partner')
+
+ # Find Employee group
+ group_employee_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'base', 'group_user')
+ self.group_employee_id = group_employee_ref and group_employee_ref[1] or False
+
+ # Find Project User group
+ group_project_user_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'project', 'group_project_user')
+ self.group_project_user_id = group_project_user_ref and group_project_user_ref[1] or False
+
+ # Find Project Manager group
+ group_project_manager_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'project', 'group_project_manager')
+ self.group_project_manager_id = group_project_manager_ref and group_project_manager_ref[1] or False
+
+ # Find Portal group
+ group_portal_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'portal', 'group_portal')
+ self.group_portal_id = group_portal_ref and group_portal_ref[1] or False
+
+ # Find Anonymous group
+ group_anonymous_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'portal', 'group_anonymous')
+ self.group_anonymous_id = group_anonymous_ref and group_anonymous_ref[1] or False
+
+ # Test users to use through the various tests
+ self.user_alfred_id = self.res_users.create(cr, uid, {
+ 'name': 'Alfred EmployeeUser',
+ 'login': 'alfred',
+ 'alias_name': 'alfred',
+ 'groups_id': [(6, 0, [self.group_employee_id, self.group_project_user_id])]
+ })
+ self.user_bert_id = self.res_users.create(cr, uid, {
+ 'name': 'Bert Nobody',
+ 'login': 'bert',
+ 'alias_name': 'bert',
+ 'groups_id': [(6, 0, [])]
+ })
+ self.user_chell_id = self.res_users.create(cr, uid, {
+ 'name': 'Chell Portal',
+ 'login': 'chell',
+ 'alias_name': 'chell',
+ 'groups_id': [(6, 0, [self.group_portal_id])]
+ })
+ self.user_donovan_id = self.res_users.create(cr, uid, {
+ 'name': 'Donovan Anonymous',
+ 'login': 'donovan',
+ 'alias_name': 'donovan',
+ 'groups_id': [(6, 0, [self.group_anonymous_id])]
+ })
+ self.user_ernest_id = self.res_users.create(cr, uid, {
+ 'name': 'Ernest Manager',
+ 'login': 'ernest',
+ 'alias_name': 'ernest',
+ 'groups_id': [(6, 0, [self.group_project_manager_id])]
+ })
+
+ # Test 'Pigs' project
+ self.project_pigs_id = self.project_project.create(cr, uid,
+ {'name': 'Pigs', 'privacy_visibility': 'public'},
+ {'mail_create_nolog': True})
+ # Various test tasks
+ self.task_1_id = self.project_task.create(cr, uid,
+ {'name': 'Test1', 'user_id': False, 'project_id': self.project_pigs_id},
+ {'mail_create_nolog': True})
+ self.task_2_id = self.project_task.create(cr, uid,
+ {'name': 'Test2', 'user_id': False, 'project_id': self.project_pigs_id},
+ {'mail_create_nolog': True})
+ self.task_3_id = self.project_task.create(cr, uid,
+ {'name': 'Test3', 'user_id': False, 'project_id': self.project_pigs_id},
+ {'mail_create_nolog': True})
+ self.task_4_id = self.project_task.create(cr, uid,
+ {'name': 'Test4', 'user_id': self.user_alfred_id, 'project_id': self.project_pigs_id},
+ {'mail_create_nolog': True})
+ self.task_5_id = self.project_task.create(cr, uid,
+ {'name': 'Test5', 'user_id': self.user_chell_id, 'project_id': self.project_pigs_id},
+ {'mail_create_nolog': True})
+ self.task_6_id = self.project_task.create(cr, uid,
+ {'name': 'Test6', 'user_id': self.user_donovan_id, 'project_id': self.project_pigs_id},
+ {'mail_create_nolog': True})
+
+ @mute_logger('openerp.addons.base.ir.ir_model', 'openerp.osv.orm')
+ def test_00_project_access_rights(self):
+ """ Test basic project access rights, for project and portal_project """
+ cr, uid, pigs_id = self.cr, self.uid, self.project_pigs_id
+
+ # ----------------------------------------
+ # CASE1: public project
+ # ----------------------------------------
+
+ # Do: Alfred reads project -> ok (employee ok public)
+ self.project_project.read(cr, self.user_alfred_id, pigs_id, ['name'])
+ # Test: all project tasks visible
+ task_ids = self.project_task.search(cr, self.user_alfred_id, [('project_id', '=', pigs_id)])
+ test_task_ids = set([self.task_1_id, self.task_2_id, self.task_3_id, self.task_4_id, self.task_5_id, self.task_6_id])
+ self.assertEqual(set(task_ids), test_task_ids,
+ 'access rights: project user cannot see all tasks of a public project')
+ # Test: all project tasks readable
+ self.project_task.read(cr, self.user_alfred_id, task_ids, ['name'])
+ # Test: all project tasks writable
+ self.project_task.write(cr, self.user_alfred_id, task_ids, {'description': 'TestDescription'})
+
+ # Do: Bert reads project -> crash, no group
+ self.assertRaises(except_orm, self.project_project.read,
+ cr, self.user_bert_id, pigs_id, ['name'])
+ # Test: no project task visible
+ self.assertRaises(except_orm, self.project_task.search,
+ cr, self.user_bert_id, [('project_id', '=', pigs_id)])
+ # Test: no project task readable
+ self.assertRaises(except_orm, self.project_task.read,
+ cr, self.user_bert_id, task_ids, ['name'])
+ # Test: no project task writable
+ self.assertRaises(except_orm, self.project_task.write,
+ cr, self.user_bert_id, task_ids, {'description': 'TestDescription'})
+
+ # Do: Chell reads project -> ok (portal ok public)
+ self.project_project.read(cr, self.user_chell_id, pigs_id, ['name'])
+ # Test: all project tasks visible
+ task_ids = self.project_task.search(cr, self.user_chell_id, [('project_id', '=', pigs_id)])
+ self.assertEqual(set(task_ids), test_task_ids,
+ 'access rights: project user cannot see all tasks of a public project')
+ # Test: all project tasks readable
+ self.project_task.read(cr, self.user_chell_id, task_ids, ['name'])
+ # Test: no project task writable
+ self.assertRaises(except_orm, self.project_task.write,
+ cr, self.user_chell_id, task_ids, {'description': 'TestDescription'})
+
+ # Do: Donovan reads project -> ok (anonymous ok public)
+ self.project_project.read(cr, self.user_donovan_id, pigs_id, ['name'])
+ # Test: all project tasks visible
+ task_ids = self.project_task.search(cr, self.user_donovan_id, [('project_id', '=', pigs_id)])
+ self.assertEqual(set(task_ids), test_task_ids,
+ 'access rights: anonymous user cannot see all tasks of a public project')
+ # Test: all project tasks readable
+ self.project_task.read(cr, self.user_donovan_id, task_ids, ['name'])
+ # Test: no project task writable
+ self.assertRaises(except_orm, self.project_task.write,
+ cr, self.user_donovan_id, task_ids, {'description': 'TestDescription'})
+
+ # ----------------------------------------
+ # CASE2: portal project
+ # ----------------------------------------
+ self.project_project.write(cr, uid, [pigs_id], {'privacy_visibility': 'portal'})
+
+ # Do: Alfred reads project -> ok (employee ok public)
+ self.project_project.read(cr, self.user_alfred_id, pigs_id, ['name'])
+ # Test: all project tasks visible
+ task_ids = self.project_task.search(cr, self.user_alfred_id, [('project_id', '=', pigs_id)])
+ self.assertEqual(set(task_ids), test_task_ids,
+ 'access rights: project user cannot see all tasks of a portal project')
+
+ # Do: Bert reads project -> crash, no group
+ self.assertRaises(except_orm, self.project_project.read,
+ cr, self.user_bert_id, pigs_id, ['name'])
+ # Test: no project task searchable
+ self.assertRaises(except_orm, self.project_task.search,
+ cr, self.user_bert_id, [('project_id', '=', pigs_id)])
+
+ # Data: task follower
+ self.project_task.message_subscribe_users(cr, self.user_alfred_id, [self.task_1_id, self.task_3_id], [self.user_chell_id])
+
+ # Do: Chell reads project -> ok (portal ok public)
+ self.project_project.read(cr, self.user_chell_id, pigs_id, ['name'])
+ # Test: only followed project tasks visible + assigned
+ task_ids = self.project_task.search(cr, self.user_chell_id, [('project_id', '=', pigs_id)])
+ test_task_ids = set([self.task_1_id, self.task_3_id, self.task_5_id])
+ self.assertEqual(set(task_ids), test_task_ids,
+ 'access rights: portal user should see the followed tasks of a portal project')
+
+ # Do: Donovan reads project -> ko (anonymous ko portal)
+ self.assertRaises(except_orm, self.project_project.read,
+ cr, self.user_donovan_id, pigs_id, ['name'])
+ # Test: no project task visible
+ task_ids = self.project_task.search(cr, self.user_donovan_id, [('project_id', '=', pigs_id)])
+ self.assertFalse(task_ids, 'access rights: anonymous user should not see tasks of a portal project')
+
+ # Data: task follower cleaning
+ self.project_task.message_unsubscribe_users(cr, self.user_alfred_id, [self.task_1_id, self.task_3_id], [self.user_chell_id])
+
+ # ----------------------------------------
+ # CASE3: employee project
+ # ----------------------------------------
+ self.project_project.write(cr, uid, [pigs_id], {'privacy_visibility': 'employees'})
+
+ # Do: Alfred reads project -> ok (employee ok employee)
+ self.project_project.read(cr, self.user_alfred_id, pigs_id, ['name'])
+ # Test: all project tasks visible
+ task_ids = self.project_task.search(cr, self.user_alfred_id, [('project_id', '=', pigs_id)])
+ test_task_ids = set([self.task_1_id, self.task_2_id, self.task_3_id, self.task_4_id, self.task_5_id, self.task_6_id])
+ self.assertEqual(set(task_ids), test_task_ids,
+ 'access rights: project user cannot see all tasks of an employees project')
+
+ # Do: Bert reads project -> crash, no group
+ self.assertRaises(except_orm, self.project_project.read,
+ cr, self.user_bert_id, pigs_id, ['name'])
+
+ # Do: Chell reads project -> ko (portal ko employee)
+ self.assertRaises(except_orm, self.project_project.read,
+ cr, self.user_chell_id, pigs_id, ['name'])
+ # Test: no project task visible + assigned
+ task_ids = self.project_task.search(cr, self.user_chell_id, [('project_id', '=', pigs_id)])
+ self.assertFalse(task_ids, 'access rights: portal user should not see tasks of an employees project, even if assigned')
+
+ # Do: Donovan reads project -> ko (anonymous ko employee)
+ self.assertRaises(except_orm, self.project_project.read,
+ cr, self.user_donovan_id, pigs_id, ['name'])
+ # Test: no project task visible
+ task_ids = self.project_task.search(cr, self.user_donovan_id, [('project_id', '=', pigs_id)])
+ self.assertFalse(task_ids, 'access rights: anonymous user should not see tasks of an employees project')
+
+ # ----------------------------------------
+ # CASE4: followers project
+ # ----------------------------------------
+ self.project_project.write(cr, uid, [pigs_id], {'privacy_visibility': 'followers'})
+
+ # Do: Alfred reads project -> ko (employee ko followers)
+ self.assertRaises(except_orm, self.project_project.read,
+ cr, self.user_alfred_id, pigs_id, ['name'])
+ # Test: no project task visible
+ task_ids = self.project_task.search(cr, self.user_alfred_id, [('project_id', '=', pigs_id)])
+ test_task_ids = set([self.task_4_id])
+ self.assertEqual(set(task_ids), test_task_ids,
+ 'access rights: employee user should not see tasks of a not-followed followers project, only assigned')
+
+ # Do: Bert reads project -> crash, no group
+ self.assertRaises(except_orm, self.project_project.read,
+ cr, self.user_bert_id, pigs_id, ['name'])
+
+ # Do: Chell reads project -> ko (portal ko employee)
+ self.assertRaises(except_orm, self.project_project.read,
+ cr, self.user_chell_id, pigs_id, ['name'])
+ # Test: no project task visible
+ task_ids = self.project_task.search(cr, self.user_chell_id, [('project_id', '=', pigs_id)])
+ test_task_ids = set([self.task_5_id])
+ self.assertEqual(set(task_ids), test_task_ids,
+ 'access rights: portal user should not see tasks of a not-followed followers project, only assigned')
+
+ # Do: Donovan reads project -> ko (anonymous ko employee)
+ self.assertRaises(except_orm, self.project_project.read,
+ cr, self.user_donovan_id, pigs_id, ['name'])
+ # Test: no project task visible
+ task_ids = self.project_task.search(cr, self.user_donovan_id, [('project_id', '=', pigs_id)])
+ self.assertFalse(task_ids, 'access rights: anonymous user should not see tasks of a followers project')
+
+ # Data: subscribe Alfred, Chell and Donovan as follower
+ self.project_project.message_subscribe_users(cr, uid, [pigs_id], [self.user_alfred_id, self.user_chell_id, self.user_donovan_id])
+ self.project_task.message_subscribe_users(cr, self.user_alfred_id, [self.task_1_id, self.task_3_id], [self.user_chell_id, self.user_alfred_id])
+
+ # Do: Alfred reads project -> ok (follower ok followers)
+ self.project_project.read(cr, self.user_alfred_id, pigs_id, ['name'])
+ # Test: followed + assigned tasks visible
+ task_ids = self.project_task.search(cr, self.user_alfred_id, [('project_id', '=', pigs_id)])
+ test_task_ids = set([self.task_1_id, self.task_3_id, self.task_4_id])
+ self.assertEqual(set(task_ids), test_task_ids,
+ 'access rights: employee user should not see followed + assigned tasks of a follower project')
+
+ # Do: Chell reads project -> ok (follower ok follower)
+ self.project_project.read(cr, self.user_chell_id, pigs_id, ['name'])
+ # Test: followed + assigned tasks visible
+ task_ids = self.project_task.search(cr, self.user_chell_id, [('project_id', '=', pigs_id)])
+ test_task_ids = set([self.task_1_id, self.task_3_id, self.task_5_id])
+ self.assertEqual(set(task_ids), test_task_ids,
+ 'access rights: employee user should not see followed + assigned tasks of a follower project')
+
+ # Do: Donovan reads project -> ko (anonymous ko follower even if follower)
+ self.assertRaises(except_orm, self.project_project.read,
+ cr, self.user_donovan_id, pigs_id, ['name'])
diff --git a/addons/portal_project_issue/security/ir.model.access.csv b/addons/portal_project_issue/security/ir.model.access.csv
index 80a38366b51..7355f7a9b1d 100644
--- a/addons/portal_project_issue/security/ir.model.access.csv
+++ b/addons/portal_project_issue/security/ir.model.access.csv
@@ -1,3 +1,4 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_issues,project_issue,project_issue.model_project_issue,portal.group_portal,1,0,0,0
access_case_section,crm_case_section,crm.model_crm_case_section,portal.group_portal,1,0,0,0
+access_issues_anonymous,project_issue,project_issue.model_project_issue,portal.group_anonymous,1,0,0,0 \ No newline at end of file
diff --git a/addons/portal_project_issue/security/portal_security.xml b/addons/portal_project_issue/security/portal_security.xml
index a121eeb593e..f6cd8d89be7 100644
--- a/addons/portal_project_issue/security/portal_security.xml
+++ b/addons/portal_project_issue/security/portal_security.xml
@@ -3,14 +3,36 @@
<data noupdate="1">
<record id="portal_issue_rule" model="ir.rule">
- <field name="name">Portal Personal Issues</field>
- <field ref="project_issue.model_project_issue" name="model_id"/>
- <field name="domain_force">[('message_follower_ids','in', [user.partner_id.id])]</field>
+ <field name="name">Project/Issue: portal users: public or portal and following</field>
+ <field name="model_id" ref="project_issue.model_project_issue"/>
+ <field name="domain_force">['|',
+ ('project_id.privacy_visibility', '=', 'public'),
+ '&amp;',
+ ('project_id.privacy_visibility', 'in', ['portal', 'followers']),
+ '|',
+ ('message_follower_ids','in', [user.partner_id.id]),
+ ('user_id', '=', user.id),
+ ]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
- <field eval="1" name="perm_unlink"/>
- <field eval="1" name="perm_write"/>
- <field eval="1" name="perm_read"/>
- <field eval="0" name="perm_create"/>
+ </record>
+
+ <record model="ir.rule" id="project_issue.issue_user_rule">
+ <field name="name">Project/Issue: employees: public, portal, employee or following or assigned</field>
+ <field name="domain_force">['|',
+ ('user_id', '=', user.id),
+ '|',
+ ('project_id.privacy_visibility', 'in', ['public', 'portal', 'employees']),
+ '&amp;',
+ ('project_id.privacy_visibility', '=', 'followers'),
+ ('message_follower_ids', 'in', [user.partner_id.id]),
+ ]</field>
+ </record>
+
+ <record model="ir.rule" id="issue_anonymous_rule">
+ <field name="name">Project/Issue: anonymous users: public only</field>
+ <field name="model_id" ref="project_issue.model_project_issue"/>
+ <field name="domain_force">[('project_id.privacy_visibility', '=', 'public')]</field>
+ <field name="groups" eval="[(4, ref('portal.group_anonymous'))]"/>
</record>
</data>
diff --git a/addons/portal_project_issue/tests/__init__.py b/addons/portal_project_issue/tests/__init__.py
new file mode 100644
index 00000000000..fa5b47ac535
--- /dev/null
+++ b/addons/portal_project_issue/tests/__init__.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2013-TODAY OpenERP S.A. <http://openerp.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from . import test_access_rights
+
+checks = [
+ test_access_rights,
+]
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/portal_project_issue/tests/test_access_rights.py b/addons/portal_project_issue/tests/test_access_rights.py
new file mode 100644
index 00000000000..28d337a4965
--- /dev/null
+++ b/addons/portal_project_issue/tests/test_access_rights.py
@@ -0,0 +1,185 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2013-TODAY OpenERP S.A. <http://openerp.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.addons.portal_project.tests.test_access_rights import TestPortalProject
+from openerp.osv.orm import except_orm
+from openerp.tools import mute_logger
+
+
+class TestPortalIssueProject(TestPortalProject):
+
+ def setUp(self):
+ super(TestPortalIssueProject, self).setUp()
+ cr, uid = self.cr, self.uid
+
+ # Useful models
+ self.project_issue = self.registry('project.issue')
+
+ # Various test issues
+ self.issue_1_id = self.project_issue.create(cr, uid,
+ {'name': 'Test1', 'user_id': False, 'project_id': self.project_pigs_id},
+ {'mail_create_nolog': True})
+ self.issue_2_id = self.project_issue.create(cr, uid,
+ {'name': 'Test2', 'user_id': False, 'project_id': self.project_pigs_id},
+ {'mail_create_nolog': True})
+ self.issue_3_id = self.project_issue.create(cr, uid,
+ {'name': 'Test3', 'user_id': False, 'project_id': self.project_pigs_id},
+ {'mail_create_nolog': True})
+ self.issue_4_id = self.project_issue.create(cr, uid,
+ {'name': 'Test4', 'user_id': self.user_alfred_id, 'project_id': self.project_pigs_id},
+ {'mail_create_nolog': True})
+ self.issue_5_id = self.project_issue.create(cr, uid,
+ {'name': 'Test5', 'user_id': self.user_chell_id, 'project_id': self.project_pigs_id},
+ {'mail_create_nolog': True})
+ self.issue_6_id = self.project_issue.create(cr, uid,
+ {'name': 'Test6', 'user_id': self.user_donovan_id, 'project_id': self.project_pigs_id},
+ {'mail_create_nolog': True})
+
+ @mute_logger('openerp.addons.base.ir.ir_model', 'openerp.osv.orm')
+ def test_00_project_access_rights(self):
+ """ Test basic project access rights, for project and portal_project """
+ cr, uid, pigs_id = self.cr, self.uid, self.project_pigs_id
+
+ # ----------------------------------------
+ # CASE1: public project
+ # ----------------------------------------
+
+ # Do: Alfred reads project -> ok (employee ok public)
+ # Test: all project issues visible
+ issue_ids = self.project_issue.search(cr, self.user_alfred_id, [('project_id', '=', pigs_id)])
+ test_issue_ids = set([self.issue_1_id, self.issue_2_id, self.issue_3_id, self.issue_4_id, self.issue_5_id, self.issue_6_id])
+ self.assertEqual(set(issue_ids), test_issue_ids,
+ 'access rights: project user cannot see all issues of a public project')
+ # Test: all project issues readable
+ self.project_issue.read(cr, self.user_alfred_id, issue_ids, ['name'])
+ # Test: all project issues writable
+ self.project_issue.write(cr, self.user_alfred_id, issue_ids, {'description': 'TestDescription'})
+
+ # Do: Bert reads project -> crash, no group
+ # Test: no project issue visible
+ self.assertRaises(except_orm, self.project_issue.search,
+ cr, self.user_bert_id, [('project_id', '=', pigs_id)])
+ # Test: no project issue readable
+ self.assertRaises(except_orm, self.project_issue.read,
+ cr, self.user_bert_id, issue_ids, ['name'])
+ # Test: no project issue writable
+ self.assertRaises(except_orm, self.project_issue.write,
+ cr, self.user_bert_id, issue_ids, {'description': 'TestDescription'})
+
+ # Do: Chell reads project -> ok (portal ok public)
+ # Test: all project issues visible
+ issue_ids = self.project_issue.search(cr, self.user_chell_id, [('project_id', '=', pigs_id)])
+ self.assertEqual(set(issue_ids), test_issue_ids,
+ 'access rights: project user cannot see all issues of a public project')
+ # Test: all project issues readable
+ self.project_issue.read(cr, self.user_chell_id, issue_ids, ['name'])
+ # Test: no project issue writable
+ self.assertRaises(except_orm, self.project_issue.write,
+ cr, self.user_chell_id, issue_ids, {'description': 'TestDescription'})
+
+ # Do: Donovan reads project -> ok (anonymous ok public)
+ # Test: all project issues visible
+ issue_ids = self.project_issue.search(cr, self.user_donovan_id, [('project_id', '=', pigs_id)])
+ self.assertEqual(set(issue_ids), test_issue_ids,
+ 'access rights: project user cannot see all issues of a public project')
+
+ # ----------------------------------------
+ # CASE2: portal project
+ # ----------------------------------------
+ self.project_project.write(cr, uid, [pigs_id], {'privacy_visibility': 'portal'})
+
+ # Do: Alfred reads project -> ok (employee ok public)
+ # Test: all project issues visible
+ issue_ids = self.project_issue.search(cr, self.user_alfred_id, [('project_id', '=', pigs_id)])
+ self.assertEqual(set(issue_ids), test_issue_ids,
+ 'access rights: project user cannot see all issues of a portal project')
+
+ # Do: Bert reads project -> crash, no group
+ # Test: no project issue searchable
+ self.assertRaises(except_orm, self.project_issue.search,
+ cr, self.user_bert_id, [('project_id', '=', pigs_id)])
+
+ # Data: issue follower
+ self.project_issue.message_subscribe_users(cr, self.user_alfred_id, [self.issue_1_id, self.issue_3_id], [self.user_chell_id])
+
+ # Do: Chell reads project -> ok (portal ok public)
+ # Test: only followed project issues visible + assigned
+ issue_ids = self.project_issue.search(cr, self.user_chell_id, [('project_id', '=', pigs_id)])
+ test_issue_ids = set([self.issue_1_id, self.issue_3_id, self.issue_5_id])
+ self.assertEqual(set(issue_ids), test_issue_ids,
+ 'access rights: portal user should see the followed issues of a portal project')
+
+ # Data: issue follower cleaning
+ self.project_issue.message_unsubscribe_users(cr, self.user_alfred_id, [self.issue_1_id, self.issue_3_id], [self.user_chell_id])
+
+ # ----------------------------------------
+ # CASE3: employee project
+ # ----------------------------------------
+ self.project_project.write(cr, uid, [pigs_id], {'privacy_visibility': 'employees'})
+
+ # Do: Alfred reads project -> ok (employee ok employee)
+ # Test: all project issues visible
+ issue_ids = self.project_issue.search(cr, self.user_alfred_id, [('project_id', '=', pigs_id)])
+ test_issue_ids = set([self.issue_1_id, self.issue_2_id, self.issue_3_id, self.issue_4_id, self.issue_5_id, self.issue_6_id])
+ self.assertEqual(set(issue_ids), test_issue_ids,
+ 'access rights: project user cannot see all issues of an employees project')
+
+ # Do: Chell reads project -> ko (portal ko employee)
+ # Test: no project issue visible + assigned
+ issue_ids = self.project_issue.search(cr, self.user_chell_id, [('project_id', '=', pigs_id)])
+ self.assertFalse(issue_ids, 'access rights: portal user should not see issues of an employees project, even if assigned')
+
+ # ----------------------------------------
+ # CASE4: followers project
+ # ----------------------------------------
+ self.project_project.write(cr, uid, [pigs_id], {'privacy_visibility': 'followers'})
+
+ # Do: Alfred reads project -> ko (employee ko followers)
+ # Test: no project issue visible
+ issue_ids = self.project_issue.search(cr, self.user_alfred_id, [('project_id', '=', pigs_id)])
+ test_issue_ids = set([self.issue_4_id])
+ self.assertEqual(set(issue_ids), test_issue_ids,
+ 'access rights: employee user should not see issues of a not-followed followers project, only assigned')
+
+ # Do: Chell reads project -> ko (portal ko employee)
+ # Test: no project issue visible
+ issue_ids = self.project_issue.search(cr, self.user_chell_id, [('project_id', '=', pigs_id)])
+ test_issue_ids = set([self.issue_5_id])
+ self.assertEqual(set(issue_ids), test_issue_ids,
+ 'access rights: portal user should not see issues of a not-followed followers project, only assigned')
+
+ # Data: subscribe Alfred, Chell and Donovan as follower
+ self.project_project.message_subscribe_users(cr, uid, [pigs_id], [self.user_alfred_id, self.user_chell_id, self.user_donovan_id])
+ self.project_issue.message_subscribe_users(cr, self.user_alfred_id, [self.issue_1_id, self.issue_3_id], [self.user_chell_id, self.user_alfred_id])
+
+ # Do: Alfred reads project -> ok (follower ok followers)
+ # Test: followed + assigned issues visible
+ issue_ids = self.project_issue.search(cr, self.user_alfred_id, [('project_id', '=', pigs_id)])
+ test_issue_ids = set([self.issue_1_id, self.issue_3_id, self.issue_4_id])
+ self.assertEqual(set(issue_ids), test_issue_ids,
+ 'access rights: employee user should not see followed + assigned issues of a follower project')
+
+ # Do: Chell reads project -> ok (follower ok follower)
+ # Test: followed + assigned issues visible
+ issue_ids = self.project_issue.search(cr, self.user_chell_id, [('project_id', '=', pigs_id)])
+ test_issue_ids = set([self.issue_1_id, self.issue_3_id, self.issue_5_id])
+ self.assertEqual(set(issue_ids), test_issue_ids,
+ 'access rights: employee user should not see followed + assigned issues of a follower project')
diff --git a/addons/portal_project_long_term/security/ir.model.access.csv b/addons/portal_project_long_term/security/ir.model.access.csv
index 738c264a71c..efbc4fc2418 100644
--- a/addons/portal_project_long_term/security/ir.model.access.csv
+++ b/addons/portal_project_long_term/security/ir.model.access.csv
@@ -1,2 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_issues,project_phase,project_long_term.model_project_phase,portal.group_portal,1,0,0,0
+access_issues_anonymous,project_phase_anonymous,project_long_term.model_project_phase,portal.group_anonymous,1,0,0,0
diff --git a/addons/portal_project_long_term/security/portal_security.xml b/addons/portal_project_long_term/security/portal_security.xml
index b46d277e4ee..eab70ebe734 100644
--- a/addons/portal_project_long_term/security/portal_security.xml
+++ b/addons/portal_project_long_term/security/portal_security.xml
@@ -3,14 +3,24 @@
<data>
<record id="portal_project_long_term_rule" model="ir.rule">
- <field name="name">Portal Personal Long term project</field>
- <field ref="project_long_term.model_project_phase" name="model_id"/>
- <field name="domain_force">['|',('project_id.message_follower_ids','in', [user.partner_id.id]),('task_ids.message_follower_ids','in', [user.partner_id.id])]</field>
+ <field name="name">Project/Phase: portal users: public or portal and following</field>
+ <field name="model_id" ref="project_long_term.model_project_phase"/>
+ <field name="domain_force">['|',
+ ('project_id.privacy_visibility', '=', 'public'),
+ '&amp;',
+ ('project_id.privacy_visibility', 'in', ['portal', 'followers']),
+ '|',
+ ('message_follower_ids','in', [user.partner_id.id]),
+ ('user_id', '=', user.id),
+ ]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
- <field eval="1" name="perm_unlink"/>
- <field eval="1" name="perm_write"/>
- <field eval="1" name="perm_read"/>
- <field eval="0" name="perm_create"/>
+ </record>
+
+ <record model="ir.rule" id="project_phase_anonymous_rule">
+ <field name="name">Project/Phase: anonymous users: public only</field>
+ <field name="model_id" ref="project_long_term.model_project_phase"/>
+ <field name="domain_force">[('project_id.privacy_visibility', '=', 'public')]</field>
+ <field name="groups" eval="[(4, ref('portal.group_anonymous'))]"/>
</record>
</data>
diff --git a/addons/portal_sale/i18n/lt.po b/addons/portal_sale/i18n/lt.po
new file mode 100644
index 00000000000..92db39babce
--- /dev/null
+++ b/addons/portal_sale/i18n/lt.po
@@ -0,0 +1,344 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-04-29 15:25+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: portal_sale
+#: model:ir.model,name:portal_sale.model_account_config_settings
+msgid "account.config.settings"
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.actions.act_window,help:portal_sale.portal_action_invoices
+msgid "We haven't sent you any invoice."
+msgstr ""
+
+#. module: portal_sale
+#: model:email.template,report_name:portal_sale.email_template_edi_sale
+msgid ""
+"${(object.name or '').replace('/','_')}_${object.state == 'draft' and "
+"'draft' or ''}"
+msgstr ""
+
+#. module: portal_sale
+#: model:res.groups,name:portal_sale.group_payment_options
+msgid "View Online Payment Options"
+msgstr ""
+
+#. module: portal_sale
+#: field:account.config.settings,group_payment_options:0
+msgid "Show payment buttons to employees too"
+msgstr ""
+
+#. module: portal_sale
+#: model:email.template,subject:portal_sale.email_template_edi_sale
+msgid ""
+"${object.company_id.name} ${object.state in ('draft', 'sent') and "
+"'Quotation' or 'Order'} (Ref ${object.name or 'n/a' })"
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.actions.act_window,help:portal_sale.action_quotations_portal
+msgid "We haven't sent you any quotation."
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.ui.menu,name:portal_sale.portal_sales_orders
+msgid "Sales Orders"
+msgstr ""
+
+#. module: portal_sale
+#: model:res.groups,comment:portal_sale.group_payment_options
+msgid ""
+"Members of this group see the online payment options\n"
+"on Sale Orders and Customer Invoices. These options are meant for customers "
+"who are accessing\n"
+"their documents through the portal."
+msgstr ""
+
+#. module: portal_sale
+#: model:email.template,body_html:portal_sale.email_template_edi_sale
+msgid ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+"\n"
+" <p>Hello ${object.partner_id.name},</p>\n"
+" \n"
+" <p>Here is your ${object.state in ('draft', 'sent') and 'quotation' or "
+"'order confirmation'} from ${object.company_id.name}: </p>\n"
+"\n"
+" <p style=\"border-left: 1px solid #8e0000; margin-left: 30px;\">\n"
+" &nbsp;&nbsp;<strong>REFERENCES</strong><br />\n"
+" &nbsp;&nbsp;Order number: <strong>${object.name}</strong><br />\n"
+" &nbsp;&nbsp;Order total: <strong>${object.amount_total} "
+"${object.pricelist_id.currency_id.name}</strong><br />\n"
+" &nbsp;&nbsp;Order date: ${object.date_order}<br />\n"
+" % if object.origin:\n"
+" &nbsp;&nbsp;Order reference: ${object.origin}<br />\n"
+" % endif\n"
+" % if object.client_order_ref:\n"
+" &nbsp;&nbsp;Your reference: ${object.client_order_ref}<br />\n"
+" % endif\n"
+" % if object.user_id:\n"
+" &nbsp;&nbsp;Your contact: <a href=\"mailto:${object.user_id.email or "
+"''}?subject=Order%20${object.name}\">${object.user_id.name}</a>\n"
+" % endif\n"
+" </p>\n"
+"\n"
+" <% set signup_url = object.get_signup_url() %>\n"
+" % if signup_url:\n"
+" <p>\n"
+" You can access this document and pay online via our Customer Portal:\n"
+" </p>\n"
+" <a style=\"display:block; width: 150px; height:20px; margin-left: "
+"120px; color: #DDD; font-family: 'Lucida Grande', Helvetica, Arial, sans-"
+"serif; font-size: 13px; font-weight: bold; text-align: center; text-"
+"decoration: none !important; line-height: 1; padding: 5px 0px 0px 0px; "
+"background-color: #8E0000; border-radius: 5px 5px; background-repeat: repeat "
+"no-repeat;\"\n"
+" href=\"${signup_url}\">View ${object.state in ('draft', 'sent') "
+"and 'Quotation' or 'Order'}</a>\n"
+" % endif\n"
+"\n"
+" % if object.paypal_url:\n"
+" <br/>\n"
+" <p>It is also possible to directly pay with Paypal:</p>\n"
+" <a style=\"margin-left: 120px;\" href=\"${object.paypal_url}\">\n"
+" <img class=\"oe_edi_paypal_button\" "
+"src=\"https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif\"/>\n"
+" </a>\n"
+" % endif\n"
+"\n"
+" <br/>\n"
+" <p>If you have any question, do not hesitate to contact us.</p>\n"
+" <p>Thank you for choosing ${object.company_id.name or 'us'}!</p>\n"
+" <br/>\n"
+" <br/>\n"
+" <div style=\"width: 375px; margin: 0px; padding: 0px; background-color: "
+"#8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; "
+"background-repeat: repeat no-repeat;\">\n"
+" <h3 style=\"margin: 0px; padding: 2px 14px; font-size: 12px; color: "
+"#DDD;\">\n"
+" <strong style=\"text-"
+"transform:uppercase;\">${object.company_id.name}</strong></h3>\n"
+" </div>\n"
+" <div style=\"width: 347px; margin: 0px; padding: 5px 14px; line-height: "
+"16px; background-color: #F2F2F2;\">\n"
+" <span style=\"color: #222; margin-bottom: 5px; display: block; \">\n"
+" % if object.company_id.street:\n"
+" ${object.company_id.street}<br/>\n"
+" % endif\n"
+" % if object.company_id.street2:\n"
+" ${object.company_id.street2}<br/>\n"
+" % endif\n"
+" % if object.company_id.city or object.company_id.zip:\n"
+" ${object.company_id.zip} ${object.company_id.city}<br/>\n"
+" % endif\n"
+" % if object.company_id.country_id:\n"
+" ${object.company_id.state_id and ('%s, ' % "
+"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name "
+"or ''}<br/>\n"
+" % endif\n"
+" </span>\n"
+" % if object.company_id.phone:\n"
+" <div style=\"margin-top: 0px; margin-right: 0px; margin-bottom: "
+"0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: "
+"0px; padding-left: 0px; \">\n"
+" Phone:&nbsp; ${object.company_id.phone}\n"
+" </div>\n"
+" % endif\n"
+" % if object.company_id.website:\n"
+" <div>\n"
+" Web :&nbsp;<a "
+"href=\"${object.company_id.website}\">${object.company_id.website}</a>\n"
+" </div>\n"
+" % endif\n"
+" <p></p>\n"
+" </div>\n"
+"</div>\n"
+" "
+msgstr ""
+
+#. module: portal_sale
+#: model:email.template,report_name:portal_sale.email_template_edi_invoice
+msgid ""
+"Invoice_${(object.number or '').replace('/','_')}_${object.state == 'draft' "
+"and 'draft' or ''}"
+msgstr ""
+
+#. module: portal_sale
+#: model:email.template,subject:portal_sale.email_template_edi_invoice
+msgid "${object.company_id.name} Invoice (Ref ${object.number or 'n/a' })"
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.model,name:portal_sale.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.actions.act_window,name:portal_sale.action_quotations_portal
+#: model:ir.ui.menu,name:portal_sale.portal_quotations
+msgid "Quotations"
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.model,name:portal_sale.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
+#. module: portal_sale
+#: field:account.invoice,portal_payment_options:0
+#: field:sale.order,portal_payment_options:0
+msgid "Portal Payment Options"
+msgstr ""
+
+#. module: portal_sale
+#: help:account.config.settings,group_payment_options:0
+msgid ""
+"Show online payment options on Sale Orders and Customer Invoices to "
+"employees. If not checked, these options are only visible to portal users."
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.actions.act_window,name:portal_sale.portal_action_invoices
+#: model:ir.ui.menu,name:portal_sale.portal_invoices
+msgid "Invoices"
+msgstr ""
+
+#. module: portal_sale
+#: view:account.config.settings:0
+msgid "Configure payment acquiring methods"
+msgstr ""
+
+#. module: portal_sale
+#: model:email.template,body_html:portal_sale.email_template_edi_invoice
+msgid ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+"\n"
+" <p>Hello ${object.partner_id.name},</p>\n"
+"\n"
+" <p>A new invoice is available for you: </p>\n"
+" \n"
+" <p style=\"border-left: 1px solid #8e0000; margin-left: 30px;\">\n"
+" &nbsp;&nbsp;<strong>REFERENCES</strong><br />\n"
+" &nbsp;&nbsp;Invoice number: <strong>${object.number}</strong><br />\n"
+" &nbsp;&nbsp;Invoice total: <strong>${object.amount_total} "
+"${object.currency_id.name}</strong><br />\n"
+" &nbsp;&nbsp;Invoice date: ${object.date_invoice}<br />\n"
+" % if object.origin:\n"
+" &nbsp;&nbsp;Order reference: ${object.origin}<br />\n"
+" % endif\n"
+" % if object.user_id:\n"
+" &nbsp;&nbsp;Your contact: <a href=\"mailto:${object.user_id.email or "
+"''}?subject=Invoice%20${object.number}\">${object.user_id.name}</a>\n"
+" % endif\n"
+" </p> \n"
+"\n"
+" <% set signup_url = object.get_signup_url() %>\n"
+" % if signup_url:\n"
+" <p>\n"
+" You can access the invoice document and pay online via our Customer "
+"Portal:\n"
+" </p>\n"
+" <a style=\"display:block; width: 150px; height:20px; margin-left: "
+"120px; color: #DDD; font-family: 'Lucida Grande', Helvetica, Arial, sans-"
+"serif; font-size: 13px; font-weight: bold; text-align: center; text-"
+"decoration: none !important; line-height: 1; padding: 5px 0px 0px 0px; "
+"background-color: #8E0000; border-radius: 5px 5px; background-repeat: repeat "
+"no-repeat;\"\n"
+" href=\"${signup_url}\">View Invoice</a>\n"
+" % endif\n"
+" \n"
+" % if object.paypal_url:\n"
+" <br/>\n"
+" <p>It is also possible to directly pay with Paypal:</p>\n"
+" <a style=\"margin-left: 120px;\" href=\"${object.paypal_url}\">\n"
+" <img class=\"oe_edi_paypal_button\" "
+"src=\"https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif\"/>\n"
+" </a>\n"
+" % endif\n"
+" \n"
+" <br/>\n"
+" <p>If you have any question, do not hesitate to contact us.</p>\n"
+" <p>Thank you for choosing ${object.company_id.name or 'us'}!</p>\n"
+" <br/>\n"
+" <br/>\n"
+" <div style=\"width: 375px; margin: 0px; padding: 0px; background-color: "
+"#8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; "
+"background-repeat: repeat no-repeat;\">\n"
+" <h3 style=\"margin: 0px; padding: 2px 14px; font-size: 12px; color: "
+"#DDD;\">\n"
+" <strong style=\"text-"
+"transform:uppercase;\">${object.company_id.name}</strong></h3>\n"
+" </div>\n"
+" <div style=\"width: 347px; margin: 0px; padding: 5px 14px; line-height: "
+"16px; background-color: #F2F2F2;\">\n"
+" <span style=\"color: #222; margin-bottom: 5px; display: block; \">\n"
+" % if object.company_id.street:\n"
+" ${object.company_id.street}<br/>\n"
+" % endif\n"
+" % if object.company_id.street2:\n"
+" ${object.company_id.street2}<br/>\n"
+" % endif\n"
+" % if object.company_id.city or object.company_id.zip:\n"
+" ${object.company_id.zip} ${object.company_id.city}<br/>\n"
+" % endif\n"
+" % if object.company_id.country_id:\n"
+" ${object.company_id.state_id and ('%s, ' % "
+"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name "
+"or ''}<br/>\n"
+" % endif\n"
+" </span>\n"
+" % if object.company_id.phone:\n"
+" <div style=\"margin-top: 0px; margin-right: 0px; margin-bottom: "
+"0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: "
+"0px; padding-left: 0px; \">\n"
+" Phone:&nbsp; ${object.company_id.phone}\n"
+" </div>\n"
+" % endif\n"
+" % if object.company_id.website:\n"
+" <div>\n"
+" Web :&nbsp;<a "
+"href=\"${object.company_id.website}\">${object.company_id.website}</a>\n"
+" </div>\n"
+" % endif\n"
+" <p></p>\n"
+" </div>\n"
+"</div>\n"
+" "
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.actions.act_window,help:portal_sale.action_orders_portal
+msgid "We haven't sent you any sales order."
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.model,name:portal_sale.model_account_invoice
+msgid "Invoice"
+msgstr ""
+
+#. module: portal_sale
+#: model:ir.actions.act_window,name:portal_sale.action_orders_portal
+msgid "Sale Orders"
+msgstr ""
diff --git a/addons/portal_sale/portal_sale.py b/addons/portal_sale/portal_sale.py
index a6ca616ad2f..cd3b702d3c5 100644
--- a/addons/portal_sale/portal_sale.py
+++ b/addons/portal_sale/portal_sale.py
@@ -59,19 +59,8 @@ class sale_order(osv.Model):
assert len(ids) == 1
document = self.browse(cr, uid, ids[0], context=context)
partner = document.partner_id
- # TDE note: this code should be improved: used a real invite wizard instead of an ugly email
if partner.id not in document.message_follower_ids:
self.message_subscribe(cr, uid, ids, [partner.id], context=context)
- mail_values = {
- 'recipient_ids': [(4, partner.id)],
- 'subject': 'Invitation to follow %s' % document.name_get()[0][1],
- 'body_html': 'You have been invited to follow %s' % document.name_get()[0][1],
- 'auto_delete': True,
- 'type': 'email',
- }
- mail_obj = self.pool.get('mail.mail')
- mail_id = mail_obj.create(cr, uid, mail_values, context=context)
- mail_obj.send(cr, uid, [mail_id], context=context)
return super(sale_order, self).action_button_confirm(cr, uid, ids, context=context)
def get_signup_url(self, cr, uid, ids, context=None):
diff --git a/addons/portal_stock/security/portal_security.xml b/addons/portal_stock/security/portal_security.xml
index 154a7fc9ddd..c5587453e40 100644
--- a/addons/portal_stock/security/portal_security.xml
+++ b/addons/portal_stock/security/portal_security.xml
@@ -17,19 +17,5 @@
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
- <record id="portal_stock_move_user_rule" model="ir.rule">
- <field name="name">Portal Personal Stock Moves</field>
- <field name="model_id" ref="stock.model_stock_move"/>
- <field name="domain_force">[('message_follower_ids','in',[user.partner_id.id])]</field>
- <field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
- </record>
-
- <record id="portal_stock_warehouse_orderpoint_user_rule" model="ir.rule">
- <field name="name">Portal Personal Stock Warehouse Orderpoints</field>
- <field name="model_id" ref="procurement.model_stock_warehouse_orderpoint"/>
- <field name="domain_force">[('message_follower_ids','in',[user.partner_id.id])]</field>
- <field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
- </record>
-
</data>
</openerp>
diff --git a/addons/process/process.py b/addons/process/process.py
index 30a1865af4b..d6a72148fa6 100644
--- a/addons/process/process.py
+++ b/addons/process/process.py
@@ -288,7 +288,6 @@ class process_process(osv.osv):
})
return super(process_process, self).copy(cr, uid, id, default, context)
-process_process()
class process_node(osv.osv):
_name = 'process.node'
@@ -323,7 +322,6 @@ class process_node(osv.osv):
})
return super(process_node, self).copy_data(cr, uid, id, default, context=context)
-process_node()
class process_node_condition(osv.osv):
_name = 'process.condition'
@@ -334,7 +332,6 @@ class process_node_condition(osv.osv):
'model_id': fields.many2one('ir.model', 'Object', ondelete='set null'),
'model_states': fields.char('Expression', required=True, size=128)
}
-process_node_condition()
class process_transition(osv.osv):
_name = 'process.transition'
@@ -348,7 +345,6 @@ class process_transition(osv.osv):
'group_ids': fields.many2many('res.groups', 'process_transition_group_rel', 'tid', 'rid', string='Required Groups'),
'note': fields.text('Description', translate=True),
}
-process_transition()
class process_transition_action(osv.osv):
_name = 'process.transition.action'
@@ -381,6 +377,5 @@ class process_transition_action(osv.osv):
return super(process_transition_action, self).copy_data(cr, uid, id, default, context)
-process_transition_action()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/procurement/company.py b/addons/procurement/company.py
index 60e2db873e2..1fd08d967f1 100644
--- a/addons/procurement/company.py
+++ b/addons/procurement/company.py
@@ -33,6 +33,5 @@ class company(osv.osv):
'schedule_range': 730.0,
}
-company()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/procurement/i18n/lt.po b/addons/procurement/i18n/lt.po
new file mode 100644
index 00000000000..6b2ac1a24be
--- /dev/null
+++ b/addons/procurement/i18n/lt.po
@@ -0,0 +1,1005 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-04-29 15:26+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: procurement
+#: model:ir.ui.menu,name:procurement.menu_stock_sched
+msgid "Schedulers"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_make_procurement
+msgid "Make Procurements"
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order.compute.all,automatic:0
+msgid ""
+"Triggers an automatic procurement for all products that have a virtual stock "
+"under 0. You should probably not use this option, we suggest using a MTO "
+"configuration on products."
+msgstr ""
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "Group By..."
+msgstr ""
+
+#. module: procurement
+#: help:stock.warehouse.orderpoint,procurement_draft_ids:0
+msgid "Draft procurement of the product and location of that orderpoint"
+msgstr ""
+
+#. module: procurement
+#: view:product.product:0
+msgid ""
+"required quantities are always\n"
+" available"
+msgstr ""
+
+#. module: procurement
+#: view:product.product:0
+msgid ""
+"If there are not enough quantities available, the delivery order\n"
+" will wait for new products. To fulfill the "
+"inventory, you should\n"
+" create others rules like orderpoints."
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,procure_method:0
+#: field:product.template,procure_method:0
+msgid "Procurement Method"
+msgstr ""
+
+#. module: procurement
+#: selection:product.template,supply_method:0
+msgid "Manufacture"
+msgstr ""
+
+#. module: procurement
+#: model:process.process,name:procurement.process_process_serviceproductprocess0
+msgid "Service"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.action_procurement_compute
+msgid "Compute Stock Minimum Rules Only"
+msgstr ""
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "Rules"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,company_id:0
+#: field:stock.warehouse.orderpoint,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,product_uos_qty:0
+msgid "UoS Quantity"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Reason"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order.compute:0
+msgid "Compute Procurements"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,message:0
+msgid "Latest error"
+msgstr ""
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,product_min_qty:0
+msgid "Minimum Quantity"
+msgstr ""
+
+#. module: procurement
+#: help:mrp.property,composition:0
+msgid "Not used in computations, for information purpose only."
+msgstr ""
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,procurement_id:0
+msgid "Latest procurement"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,help:procurement.action_orderpoint_form
+msgid ""
+"You can define your minimum stock rules, so that OpenERP will automatically "
+"create draft manufacturing orders or purchase quotations according to the "
+"stock level. Once the virtual stock of a product (= stock on hand minus all "
+"confirmed orders and reservations) is below the minimum quantity, OpenERP "
+"will generate a procurement request to increase the stock up to the maximum "
+"quantity."
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order,message:0
+msgid "Exception occurred while computing procurement orders."
+msgstr ""
+
+#. module: procurement
+#: view:product.product:0
+msgid "Products"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Permanent Procurement Exceptions"
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order.compute.all:0
+msgid "Scheduler Parameters"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_stock_move
+msgid "Stock Move"
+msgstr ""
+
+#. module: procurement
+#: view:product.product:0
+msgid "Stockable products"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:138
+#, python-format
+msgid "Invalid Action!"
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Ready"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order.compute.all,automatic:0
+msgid "Automatic orderpoint"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,help:procurement.procurement_exceptions
+msgid ""
+"<p>\n"
+" Procurement Orders represent the need for a certain quantity "
+"of products, at a given time, in a given location. Sales Orders are one "
+"typical source of Procurement Orders (but these are distinct documents). "
+"Depending on the procurement parameters and the product configuration, the "
+"procurement engine will attempt to satisfy the need by reserving products "
+"from stock, ordering products from a supplier, or passing a manufacturing "
+"order, etc. A Procurement Exception occurs when the system cannot find a way "
+"to fulfill a procurement. Some exceptions will resolve themselves "
+"automatically, but others require manual intervention (those are identified "
+"by a specific error message).\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Confirmed"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Retry"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order.compute:0
+#: view:procurement.orderpoint.compute:0
+msgid "Parameters"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Confirm"
+msgstr ""
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "Quantity Multiple"
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order,origin:0
+msgid ""
+"Reference of the document that created this Procurement.\n"
+"This is automatically completed by OpenERP."
+msgstr ""
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "Procurement Orders to Process"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_stock_warehouse_orderpoint
+msgid "Minimum Inventory Rule"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:370
+#, python-format
+msgid "Procurement '%s' is in exception: "
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,priority:0
+msgid "Priority"
+msgstr ""
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "Reordering Rules Search"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Waiting"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,location_id:0
+#: view:stock.warehouse.orderpoint:0
+#: field:stock.warehouse.orderpoint,location_id:0
+msgid "Location"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_stock_picking
+msgid "Picking List"
+msgstr ""
+
+#. module: procurement
+#: field:make.procurement,warehouse_id:0
+#: view:stock.warehouse.orderpoint:0
+#: field:stock.warehouse.orderpoint,warehouse_id:0
+msgid "Warehouse"
+msgstr ""
+
+#. module: procurement
+#: selection:stock.warehouse.orderpoint,logic:0
+msgid "Best price (not yet active!)"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/schedulers.py:110
+#, python-format
+msgid "PROC %d: from stock - %3.2f %-5s - %s"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_procurement_order_compute
+msgid "Compute Procurement"
+msgstr ""
+
+#. module: procurement
+#: field:res.company,schedule_range:0
+msgid "Scheduler Range Days"
+msgstr ""
+
+#. module: procurement
+#: view:make.procurement:0
+msgid "Ask New Products"
+msgstr ""
+
+#. module: procurement
+#: field:make.procurement,date_planned:0
+msgid "Planned Date"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Group By"
+msgstr ""
+
+#. module: procurement
+#: field:make.procurement,qty:0
+#: field:procurement.order,product_qty:0
+msgid "Quantity"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:365
+#, python-format
+msgid "Not enough stock and no minimum orderpoint rule defined."
+msgstr ""
+
+#. module: procurement
+#: field:make.procurement,uom_id:0
+#: view:procurement.order:0
+msgid "Unit of Measure"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,procure_method:0
+#: selection:product.template,procure_method:0
+msgid "Make to Stock"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,help:procurement.procurement_action
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to create a procurement order. \n"
+" </p><p>\n"
+" A procurement order is used to record a need for a specific\n"
+" product at a specific location. Procurement orders are "
+"usually\n"
+" created automatically from sales orders, pull logistic rules "
+"or\n"
+" minimum stock rules.\n"
+" </p><p>\n"
+" When the procurement order is confirmed, it automatically\n"
+" creates the necessary operations to fullfil the need: "
+"purchase\n"
+" order proposition, manufacturing order, etc.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order,procure_method:0
+msgid ""
+"If you encode manually a Procurement, you probably want to use a make to "
+"order method."
+msgstr ""
+
+#. module: procurement
+#: model:ir.ui.menu,name:procurement.menu_stock_procurement
+msgid "Automatic Procurements"
+msgstr ""
+
+#. module: procurement
+#: view:product.product:0
+msgid ""
+"use the available\n"
+" inventory"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_procurement_order
+#: model:process.process,name:procurement.process_process_procurementprocess0
+#: view:procurement.order:0
+msgid "Procurement"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.procurement_action
+msgid "Procurement Orders"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "To Fix"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Exceptions"
+msgstr ""
+
+#. module: procurement
+#: model:process.node,note:procurement.process_node_serviceonorder0
+msgid "Assignment from Production or Purchase Order."
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_mrp_property
+msgid "Property"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.act_make_procurement
+#: view:make.procurement:0
+msgid "Procurement Request"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.orderpoint.compute:0
+msgid "Compute Stock"
+msgstr ""
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,procurement_draft_ids:0
+msgid "Related Procurement Orders"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: procurement
+#: selection:mrp.property,composition:0
+msgid "plus"
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order,state:0
+msgid ""
+"When a procurement is created the status is set to 'Draft'.\n"
+" If the procurement is confirmed, the status is set to 'Confirmed'. "
+" \n"
+"After confirming the status is set to 'Running'.\n"
+" If any exception arises in the order then the status is set to "
+"'Exception'.\n"
+" Once the exception is removed the status becomes 'Ready'.\n"
+" It is in 'Waiting'. status when the procurement is waiting for another one "
+"to finish."
+msgstr ""
+
+#. module: procurement
+#: help:stock.warehouse.orderpoint,active:0
+msgid ""
+"If the active field is set to False, it will allow you to hide the "
+"orderpoint without removing it."
+msgstr ""
+
+#. module: procurement
+#: view:product.product:0
+msgid ""
+"When you sell this service, nothing special will be triggered\n"
+" to deliver the customer, as you set the "
+"procurement method as\n"
+" 'Make to Stock'."
+msgstr ""
+
+#. module: procurement
+#: help:procurement.orderpoint.compute,automatic:0
+msgid "If the stock of a product is under 0, it will act like an orderpoint"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,product_uom:0
+#: field:stock.warehouse.orderpoint,product_uom:0
+msgid "Product Unit of Measure"
+msgstr ""
+
+#. module: procurement
+#: constraint:stock.warehouse.orderpoint:0
+msgid ""
+"You have to select a product unit of measure in the same category than the "
+"default unit of measure of the product"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Procurement Lines"
+msgstr ""
+
+#. module: procurement
+#: view:product.product:0
+msgid ""
+"as it's a consumable (as a result of this, the quantity\n"
+" on hand may become negative)."
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,note:0
+msgid "Note"
+msgstr ""
+
+#. module: procurement
+#: help:stock.warehouse.orderpoint,product_min_qty:0
+msgid ""
+"When the virtual stock goes below the Min Quantity specified for this field, "
+"OpenERP generates a procurement to bring the forecasted quantity to the Max "
+"Quantity."
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.action_compute_schedulers
+#: model:ir.ui.menu,name:procurement.menu_stock_proc_schedulers
+#: view:procurement.order.compute.all:0
+msgid "Run Schedulers"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order.compute:0
+msgid "This wizard will schedule procurements."
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+#: field:procurement.order,state:0
+msgid "Status"
+msgstr ""
+
+#. module: procurement
+#: selection:product.template,supply_method:0
+msgid "Buy"
+msgstr ""
+
+#. module: procurement
+#: view:product.product:0
+msgid "for the delivery order."
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,priority:0
+msgid "Normal"
+msgstr ""
+
+#. module: procurement
+#: help:product.template,supply_method:0
+msgid ""
+"Manufacture: When procuring the product, a manufacturing order or a task "
+"will be generated, depending on the product type. \n"
+"Buy: When procuring the product, a purchase order will be generated."
+msgstr ""
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,product_max_qty:0
+msgid "Maximum Quantity"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:367
+#, python-format
+msgid "Not enough stock."
+msgstr ""
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,active:0
+msgid "Active"
+msgstr ""
+
+#. module: procurement
+#: model:process.node,name:procurement.process_node_procureproducts0
+msgid "Procure Products"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:312
+#, python-format
+msgid ""
+"Please check the quantity in procurement order(s) for the product \"%s\", it "
+"should not be 0 or less!"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,date_planned:0
+msgid "Scheduled date"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Exception"
+msgstr ""
+
+#. module: procurement
+#: view:product.product:0
+msgid ""
+"When you sell this product, a delivery order will be created.\n"
+" OpenERP will consider that the"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/schedulers.py:133
+#, python-format
+msgid "Automatic OP: %s"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_procurement_orderpoint_compute
+msgid "Automatic Order Point"
+msgstr ""
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,qty_multiple:0
+msgid "Qty Multiple"
+msgstr ""
+
+#. module: procurement
+#: help:stock.warehouse.orderpoint,qty_multiple:0
+msgid "The procurement quantity will be rounded up to this multiple."
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Extra Information"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: procurement
+#: sql_constraint:stock.warehouse.orderpoint:0
+msgid "Qty Multiple must be greater than zero."
+msgstr ""
+
+#. module: procurement
+#: selection:stock.warehouse.orderpoint,logic:0
+msgid "Order to Max"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,date_close:0
+msgid "Date Closed"
+msgstr ""
+
+#. module: procurement
+#: view:res.company:0
+msgid "Logistics"
+msgstr ""
+
+#. module: procurement
+#: help:product.template,procure_method:0
+msgid ""
+"Make to Stock: When needed, the product is taken from the stock or we wait "
+"for replenishment. \n"
+"Make to Order: When needed, the product is purchased or produced."
+msgstr ""
+
+#. module: procurement
+#: field:mrp.property,composition:0
+msgid "Properties composition"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:311
+#, python-format
+msgid "Data Insufficient !"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_mrp_property_group
+#: field:mrp.property,group_id:0
+#: field:mrp.property.group,name:0
+msgid "Property Group"
+msgstr ""
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "Misc"
+msgstr ""
+
+#. module: procurement
+#: field:stock.move,procurements:0
+msgid "Procurements"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Run Procurement"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Done"
+msgstr ""
+
+#. module: procurement
+#: view:make.procurement:0
+#: view:procurement.order.compute:0
+#: view:procurement.order.compute.all:0
+#: view:procurement.orderpoint.compute:0
+msgid "Cancel"
+msgstr ""
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,logic:0
+msgid "Reordering Mode"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,origin:0
+msgid "Source Document"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,priority:0
+msgid "Not urgent"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.product_open_orderpoint
+#: view:product.product:0
+msgid "Orderpoints"
+msgstr ""
+
+#. module: procurement
+#: help:stock.warehouse.orderpoint,product_max_qty:0
+msgid ""
+"When the virtual stock goes below the Min Quantity, OpenERP generates a "
+"procurement to bring the forecasted quantity to the Quantity specified as "
+"Max Quantity."
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_procurement_order_compute_all
+msgid "Compute all schedulers"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Late"
+msgstr ""
+
+#. module: procurement
+#: view:board.board:0
+msgid "Procurements in Exception"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.procurement_action5
+#: model:ir.actions.act_window,name:procurement.procurement_action_board
+#: model:ir.actions.act_window,name:procurement.procurement_exceptions
+#: model:ir.ui.menu,name:procurement.menu_stock_procurement_action
+#: view:procurement.order:0
+msgid "Procurement Exceptions"
+msgstr ""
+
+#. module: procurement
+#: field:product.product,orderpoint_ids:0
+msgid "Minimum Stock Rules"
+msgstr ""
+
+#. module: procurement
+#: view:make.procurement:0
+msgid ""
+"Fill is this for to launch a procurement request for this\n"
+" product. According to the product configuration, "
+"this may\n"
+" trigger a draft purchase order, a manufacturing "
+"order or\n"
+" a new task."
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,close_move:0
+msgid "Close Move at end"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Scheduled Date"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_product_product
+#: field:make.procurement,product_id:0
+#: view:procurement.order:0
+#: field:procurement.order,product_id:0
+#: field:stock.warehouse.orderpoint,product_id:0
+msgid "Product"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Temporary"
+msgstr ""
+
+#. module: procurement
+#: field:mrp.property,description:0
+#: field:mrp.property.group,description:0
+#: field:procurement.order,name:0
+msgid "Description"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,priority:0
+msgid "Urgent"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Running"
+msgstr ""
+
+#. module: procurement
+#: model:process.node,name:procurement.process_node_serviceonorder0
+#: selection:procurement.order,procure_method:0
+#: selection:product.template,procure_method:0
+msgid "Make to Order"
+msgstr ""
+
+#. module: procurement
+#: field:product.template,supply_method:0
+msgid "Supply Method"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,move_id:0
+msgid "Reservation"
+msgstr ""
+
+#. module: procurement
+#: model:process.node,note:procurement.process_node_procureproducts0
+msgid "The way to procurement depends on the product type."
+msgstr ""
+
+#. module: procurement
+#: view:product.product:0
+msgid "When you sell this product, OpenERP will"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Temporary Procurement Exceptions"
+msgstr ""
+
+#. module: procurement
+#: field:mrp.property,name:0
+#: field:stock.warehouse.orderpoint,name:0
+msgid "Name"
+msgstr ""
+
+#. module: procurement
+#: selection:mrp.property,composition:0
+msgid "max"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.act_procurement_2_stock_warehouse_orderpoint
+#: model:ir.actions.act_window,name:procurement.act_stock_warehouse_2_stock_warehouse_orderpoint
+#: model:ir.actions.act_window,name:procurement.action_orderpoint_form
+#: model:ir.ui.menu,name:procurement.menu_stock_order_points
+#: view:stock.warehouse.orderpoint:0
+msgid "Reordering Rules"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:139
+#, python-format
+msgid "Cannot delete Procurement Order(s) which are in %s state."
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,product_uos:0
+msgid "Product UoS"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_product_template
+msgid "Product Template"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.orderpoint.compute:0
+msgid ""
+"Wizard checks all the stock minimum rules and generate procurement order."
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Search Procurement"
+msgstr ""
+
+#. module: procurement
+#: help:res.company,schedule_range:0
+msgid ""
+"This is the time frame analysed by the scheduler when computing "
+"procurements. All procurements that are not between today and today+range "
+"are skipped for future computation."
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,priority:0
+msgid "Very Urgent"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.orderpoint.compute,automatic:0
+msgid "Automatic Orderpoint"
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Procurement started late"
+msgstr ""
+
+#. module: procurement
+#: selection:mrp.property,composition:0
+msgid "min"
+msgstr ""
+
+#. module: procurement
+#: view:make.procurement:0
+#: view:procurement.order.compute:0
+#: view:procurement.order.compute.all:0
+#: view:procurement.orderpoint.compute:0
+msgid "or"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/schedulers.py:134
+#, python-format
+msgid "SCHEDULER"
+msgstr ""
+
+#. module: procurement
+#: view:product.product:0
+msgid "Request Procurement"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/schedulers.py:87
+#, python-format
+msgid "PROC %d: on order - %3.2f %-5s - %s"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:339
+#, python-format
+msgid "Products reserved from stock."
+msgstr ""
diff --git a/addons/procurement/i18n/pt_BR.po b/addons/procurement/i18n/pt_BR.po
index 626e66dc827..9e425149ee3 100644
--- a/addons/procurement/i18n/pt_BR.po
+++ b/addons/procurement/i18n/pt_BR.po
@@ -8,15 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-12-21 00:27+0000\n"
-"Last-Translator: Fábio Martinelli - http://zupy.com.br "
-"<webmaster@guaru.net>\n"
+"PO-Revision-Date: 2013-04-18 17:42+0000\n"
+"Last-Translator: Thiago Tognoli <Unknown>\n"
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:43+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-04-19 05:24+0000\n"
+"X-Generator: Launchpad (build 16567)\n"
#. module: procurement
#: model:ir.ui.menu,name:procurement.menu_stock_sched
@@ -57,7 +56,7 @@ msgid ""
" available"
msgstr ""
"quantidades necessárias estão sempre\n"
-"                            disponíveis"
+" disponíveis"
#. module: procurement
#: view:product.product:0
@@ -68,9 +67,9 @@ msgid ""
" create others rules like orderpoints."
msgstr ""
"Se não houver quantidade suficiente disponível, a ordem de entrega\n"
-"                            vai esperar por novos produtos. Para cumprir o "
+" vai esperar por novos produtos. Para cumprir o "
"inventário, você deve\n"
-"                            criar outras regras como ponto de compra."
+" criar outras regras como ponto de compra."
#. module: procurement
#: field:procurement.order,procure_method:0
@@ -632,7 +631,7 @@ msgstr "Provisório"
#: model:ir.ui.menu,name:procurement.menu_stock_proc_schedulers
#: view:procurement.order.compute.all:0
msgid "Run Schedulers"
-msgstr "executar Agendadores"
+msgstr "Executar Agendadores"
#. module: procurement
#: view:procurement.order.compute:0
diff --git a/addons/procurement/schedulers.py b/addons/procurement/schedulers.py
index 1009873beb2..7c9d5ec3290 100644
--- a/addons/procurement/schedulers.py
+++ b/addons/procurement/schedulers.py
@@ -155,7 +155,7 @@ class procurement_order(osv.osv):
warehouse_obj = self.pool.get('stock.warehouse')
warehouse_ids = warehouse_obj.search(cr, uid, [], context=context)
- products_ids = product_obj.search(cr, uid, [('purchase_ok', '=', True)], order='id', context=context)
+ products_ids = product_obj.search(cr, uid, [], order='id', context=context)
for warehouse in warehouse_obj.browse(cr, uid, warehouse_ids, context=context):
context['warehouse'] = warehouse
diff --git a/addons/procurement/wizard/make_procurement_product.py b/addons/procurement/wizard/make_procurement_product.py
index aab49bf8e80..bf83bc73f1a 100644
--- a/addons/procurement/wizard/make_procurement_product.py
+++ b/addons/procurement/wizard/make_procurement_product.py
@@ -126,6 +126,5 @@ class make_procurement(osv.osv_memory):
return res
-make_procurement()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/procurement/wizard/mrp_procurement.py b/addons/procurement/wizard/mrp_procurement.py
index 56386bf234e..fd5a9b530b6 100644
--- a/addons/procurement/wizard/mrp_procurement.py
+++ b/addons/procurement/wizard/mrp_procurement.py
@@ -46,7 +46,6 @@ class procurement_compute(osv.osv_memory):
threaded_calculation.start()
return {}
-procurement_compute()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/procurement/wizard/orderpoint_procurement.py b/addons/procurement/wizard/orderpoint_procurement.py
index 2d5b91d4c81..afc8e2a721f 100644
--- a/addons/procurement/wizard/orderpoint_procurement.py
+++ b/addons/procurement/wizard/orderpoint_procurement.py
@@ -68,6 +68,5 @@ class procurement_compute(osv.osv_memory):
threaded_calculation.start()
return {'type': 'ir.actions.act_window_close'}
-procurement_compute()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/procurement/wizard/schedulers_all.py b/addons/procurement/wizard/schedulers_all.py
index c60ac989274..aab9657ae5d 100644
--- a/addons/procurement/wizard/schedulers_all.py
+++ b/addons/procurement/wizard/schedulers_all.py
@@ -65,6 +65,5 @@ class procurement_compute_all(osv.osv_memory):
threaded_calculation.start()
return {'type': 'ir.actions.act_window_close'}
-procurement_compute_all()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/product/partner.py b/addons/product/partner.py
index 1d11e909346..fbfee76d0b2 100644
--- a/addons/product/partner.py
+++ b/addons/product/partner.py
@@ -36,7 +36,9 @@ class res_partner(osv.osv):
help="This pricelist will be used, instead of the default one, for sales to the current partner"),
}
-res_partner()
+ def _commercial_fields(self, cr, uid, context=None):
+ return super(res_partner, self)._commercial_fields(cr, uid, context=context) + ['property_product_pricelist']
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/product/partner_view.xml b/addons/product/partner_view.xml
index acb087533ac..5117da6044e 100644
--- a/addons/product/partner_view.xml
+++ b/addons/product/partner_view.xml
@@ -8,9 +8,12 @@
<field name="arch" type="xml">
<page string="Sales &amp; Purchases" position="inside">
<group>
- <group name="pricelists" groups="product.group_sale_pricelist">
+ <group name="pricelists" groups="product.group_sale_pricelist" attrs="{'invisible': [('is_company','=',False),('parent_id','!=',False)]}">
<field name="property_product_pricelist"/>
</group>
+ <div name="parent_pricelists" groups="product.group_sale_pricelist" attrs="{'invisible': ['|',('is_company','=',True),('parent_id','=',False)]}">
+ <p>Pricelists are managed on <button name="open_commercial_entity" type="object" string="the parent company" class="oe_link"/></p>
+ </div>
</group>
</page>
</field>
diff --git a/addons/product/pricelist.py b/addons/product/pricelist.py
index 73707e39807..6fc926980dd 100644
--- a/addons/product/pricelist.py
+++ b/addons/product/pricelist.py
@@ -64,7 +64,6 @@ class price_type(osv.osv):
"currency_id": _get_currency
}
-price_type()
#----------------------------------------------------------
# Price lists
@@ -77,7 +76,6 @@ class product_pricelist_type(osv.osv):
'name': fields.char('Name',size=64, required=True, translate=True),
'key': fields.char('Key', size=64, required=True, help="Used in the code to select specific prices based on the context. Keep unchanged."),
}
-product_pricelist_type()
class product_pricelist(osv.osv):
@@ -236,7 +234,10 @@ class product_pricelist(osv.osv):
qty, context=context)[res['base_pricelist_id']]
ptype_src = self.browse(cr, uid, res['base_pricelist_id']).currency_id.id
uom_price_already_computed = True
- price = currency_obj.compute(cr, uid, ptype_src, res['currency_id'], price_tmp, round=False)
+ price = currency_obj.compute(cr, uid,
+ ptype_src, res['currency_id'],
+ price_tmp, round=False,
+ context=context)
elif res['base'] == -2:
# this section could be improved by moving the queries outside the loop:
where = []
@@ -305,7 +306,6 @@ class product_pricelist(osv.osv):
res.update({'item_id': {ids[-1]: res_multi.get('item_id', ids[-1])}})
return res
-product_pricelist()
class product_pricelist_version(osv.osv):
@@ -363,7 +363,6 @@ class product_pricelist_version(osv.osv):
['date_start', 'date_end'])
]
-product_pricelist_version()
class product_pricelist_item(osv.osv):
def _price_field_get(self, cr, uid, context=None):
@@ -374,7 +373,7 @@ class product_pricelist_item(osv.osv):
result.append((line.id, line.name))
result.append((-1, _('Other Pricelist')))
- result.append((-2, _('Partner section of the product form')))
+ result.append((-2, _('Supplier Prices on the product form')))
return result
_name = "product.pricelist.item"
@@ -443,7 +442,6 @@ class product_pricelist_item(osv.osv):
if prod[0]['code']:
return {'value': {'name': prod[0]['code']}}
return {}
-product_pricelist_item()
diff --git a/addons/product/product.py b/addons/product/product.py
index 33225c92c6f..518e455ddc1 100644
--- a/addons/product/product.py
+++ b/addons/product/product.py
@@ -84,7 +84,6 @@ class product_uom_categ(osv.osv):
_columns = {
'name': fields.char('Name', size=64, required=True, translate=True),
}
-product_uom_categ()
class product_uom(osv.osv):
_name = 'product.uom'
@@ -208,7 +207,6 @@ class product_uom(osv.osv):
raise osv.except_osv(_('Warning!'),_("Cannot change the category of existing Unit of Measure '%s'.") % (uom.name,))
return super(product_uom, self).write(cr, uid, ids, vals, context=context)
-product_uom()
class product_ul(osv.osv):
@@ -218,7 +216,6 @@ class product_ul(osv.osv):
'name' : fields.char('Name', size=64,select=True, required=True, translate=True),
'type' : fields.selection([('unit','Unit'),('pack','Pack'),('box', 'Box'), ('pallet', 'Pallet')], 'Type', required=True),
}
-product_ul()
#----------------------------------------------------------
@@ -283,7 +280,6 @@ class product_category(osv.osv):
def child_get(self, cr, uid, ids):
return [ids]
-product_category()
#----------------------------------------------------------
@@ -401,7 +397,6 @@ class product_template(osv.osv):
pass
return super(product_template, self).name_get(cr, user, ids, context)
-product_template()
class product_product(osv.osv):
def view_header_get(self, cr, uid, view_id, view_type, context=None):
@@ -523,6 +518,13 @@ class product_product(osv.osv):
def _set_image(self, cr, uid, id, name, value, args, context=None):
return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)
+ def _get_name_template_ids(self, cr, uid, ids, context=None):
+ result = set()
+ template_ids = self.pool.get('product.product').search(cr, uid, [('product_tmpl_id', 'in', ids)])
+ for el in template_ids:
+ result.add(el)
+ return list(result)
+
_defaults = {
'active': lambda *a: 1,
'price_extra': lambda *a: 0.0,
@@ -554,7 +556,11 @@ class product_product(osv.osv):
'price_extra': fields.float('Variant Price Extra', digits_compute=dp.get_precision('Product Price')),
'price_margin': fields.float('Variant Price Margin', digits_compute=dp.get_precision('Product Price')),
'pricelist_id': fields.dummy(string='Pricelist', relation='product.pricelist', type='many2one'),
- 'name_template': fields.related('product_tmpl_id', 'name', string="Template Name", type='char', size=128, store=True, select=True),
+ 'name_template': fields.related('product_tmpl_id', 'name', string="Template Name", type='char', size=128, store={
+ 'product.template': (_get_name_template_ids, ['name'], 10),
+ 'product.product': (lambda self, cr, uid, ids, c=None: ids, [], 10),
+
+ }, select=True),
'color': fields.integer('Color Index'),
# image: all image fields are base64 encoded and PIL-supported
'image': fields.binary("Image",
@@ -588,10 +594,13 @@ class product_product(osv.osv):
# Check if the product is last product of this template
other_product_ids = self.search(cr, uid, [('product_tmpl_id', '=', tmpl_id), ('id', '!=', product.id)], context=context)
if not other_product_ids:
- unlink_product_tmpl_ids.append(tmpl_id)
+ unlink_product_tmpl_ids.append(tmpl_id)
unlink_ids.append(product.id)
+ res = super(product_product, self).unlink(cr, uid, unlink_ids, context=context)
+ # delete templates after calling super, as deleting template could lead to deleting
+ # products due to ondelete='cascade'
self.pool.get('product.template').unlink(cr, uid, unlink_product_tmpl_ids, context=context)
- return super(product_product, self).unlink(cr, uid, unlink_ids, context=context)
+ return res
def onchange_uom(self, cursor, user, ids, uom_id, uom_po_id):
if uom_id and uom_po_id:
@@ -750,7 +759,6 @@ class product_product(osv.osv):
args.append((('categ_id', 'child_of', context['search_default_categ_id'])))
return super(product_product, self).search(cr, uid, args, offset=offset, limit=limit, order=order, context=context, count=False)
-product_product()
class product_packaging(osv.osv):
_name = "product.packaging"
@@ -816,7 +824,6 @@ class product_packaging(osv.osv):
return (10 - (sum % 10)) % 10
checksum = staticmethod(checksum)
-product_packaging()
class product_supplierinfo(osv.osv):
@@ -890,7 +897,6 @@ class product_supplierinfo(osv.osv):
res[supplier.id] = price
return res
_order = 'sequence'
-product_supplierinfo()
class pricelist_partnerinfo(osv.osv):
@@ -902,7 +908,6 @@ class pricelist_partnerinfo(osv.osv):
'price': fields.float('Unit Price', required=True, digits_compute=dp.get_precision('Product Price'), help="This price will be considered as a price for the supplier Unit of Measure if any or the default Unit of Measure of the product otherwise"),
}
_order = 'min_quantity asc'
-pricelist_partnerinfo()
class res_currency(osv.osv):
_inherit = 'res.currency'
diff --git a/addons/product/product_report.xml b/addons/product/product_report.xml
index 6135fe64bca..791063696c4 100644
--- a/addons/product/product_report.xml
+++ b/addons/product/product_report.xml
@@ -9,6 +9,7 @@
name="product.pricelist"
rml="product/report/product_pricelist.rml"
menu="False"
- auto="False"/>
+ parser="product.report.product_pricelist.product_pricelist"
+ />
</data>
</openerp>
diff --git a/addons/product/product_view.xml b/addons/product/product_view.xml
index ddb1ab3809f..00e925fd6a0 100644
--- a/addons/product/product_view.xml
+++ b/addons/product/product_view.xml
@@ -581,6 +581,7 @@
<field name="delay"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
</group>
+ <p groups="product.group_purchase_pricelist" class="oe_grey">The prices below will only be taken into account when your pricelist is set as based on supplier prices.</p>
<field groups="product.group_purchase_pricelist" name="pricelist_ids">
<tree editable="bottom" string="Pricelist">
<field name="min_quantity"/>
diff --git a/addons/product/report/product_pricelist.py b/addons/product/report/product_pricelist.py
index 9b0708f5d4a..44433f39055 100644
--- a/addons/product/report/product_pricelist.py
+++ b/addons/product/report/product_pricelist.py
@@ -120,6 +120,4 @@ class product_pricelist(report_sxw.rml_parse):
price = self.formatLang(res[0]['list_price'], digits=sale_price_digits, currency_obj=pricelist.currency_id)
return price
-report_sxw.report_sxw('report.product.pricelist','product.product','addons/product/report/product_pricelist.rml',parser=product_pricelist)
-
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/product/wizard/product_price.py b/addons/product/wizard/product_price.py
index 8989e97d656..5b5c4ccd834 100644
--- a/addons/product/wizard/product_price.py
+++ b/addons/product/wizard/product_price.py
@@ -60,6 +60,5 @@ class product_price_list(osv.osv_memory):
'report_name': 'product.pricelist',
'datas': datas,
}
-product_price_list()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/product_expiry/product_expiry.py b/addons/product_expiry/product_expiry.py
index 457b4428522..4d8fd49ec4f 100644
--- a/addons/product_expiry/product_expiry.py
+++ b/addons/product_expiry/product_expiry.py
@@ -74,7 +74,6 @@ class stock_production_lot(osv.osv):
'removal_date': _get_date('removal_time'),
'alert_date': _get_date('alert_time'),
}
-stock_production_lot()
class product_product(osv.osv):
_inherit = 'product.product'
@@ -88,5 +87,4 @@ class product_product(osv.osv):
'alert_time': fields.integer('Product Alert Time',
help='When a new a Serial Number is issued, this is the number of days before an alert should be notified.'),
}
-product_product()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/product_manufacturer/product_manufacturer.py b/addons/product_manufacturer/product_manufacturer.py
index fdd25133433..ea7acf66670 100644
--- a/addons/product_manufacturer/product_manufacturer.py
+++ b/addons/product_manufacturer/product_manufacturer.py
@@ -28,7 +28,6 @@ class product_product(osv.osv):
'manufacturer_pref' : fields.char('Manufacturer Product Code', size=64),
'attribute_ids': fields.one2many('product.manufacturer.attribute', 'product_id', 'Attributes'),
}
-product_product()
class product_attribute(osv.osv):
_name = "product.manufacturer.attribute"
@@ -38,6 +37,5 @@ class product_attribute(osv.osv):
'value' : fields.char('Value', size=64),
'product_id': fields.many2one('product.product', 'Product', ondelete='cascade'),
}
-product_attribute()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/product_margin/product_margin.py b/addons/product_margin/product_margin.py
index f9187647f35..1bbfe8c285b 100644
--- a/addons/product_margin/product_margin.py
+++ b/addons/product_margin/product_margin.py
@@ -128,6 +128,5 @@ class product_product(osv.osv):
help="Expected margin * 100 / Expected Sale"),
}
-product_product()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/product_margin/wizard/product_margin.py b/addons/product_margin/wizard/product_margin.py
index 6c54bd72be3..7a56ed2e13d 100644
--- a/addons/product_margin/wizard/product_margin.py
+++ b/addons/product_margin/wizard/product_margin.py
@@ -81,6 +81,5 @@ class product_margin(osv.osv_memory):
'search_view_id': id['res_id']
}
-product_margin()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/product_visible_discount/product_visible_discount.py b/addons/product_visible_discount/product_visible_discount.py
index 3928c2e4676..4f8a7b0b9cc 100644
--- a/addons/product_visible_discount/product_visible_discount.py
+++ b/addons/product_visible_discount/product_visible_discount.py
@@ -33,7 +33,6 @@ class product_pricelist(osv.osv):
'visible_discount': True,
}
-product_pricelist()
class sale_order_line(osv.osv):
_inherit = "sale.order.line"
@@ -95,7 +94,6 @@ class sale_order_line(osv.osv):
result['discount'] = 0.0
return res
-sale_order_line()
class account_invoice_line(osv.osv):
_inherit = "account.invoice.line"
@@ -161,6 +159,5 @@ class account_invoice_line(osv.osv):
result['discount']=0.0
return res
-account_invoice_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project/company.py b/addons/project/company.py
index 459c24e7b8a..19f40436070 100644
--- a/addons/project/company.py
+++ b/addons/project/company.py
@@ -31,7 +31,6 @@ class res_company(osv.osv):
"forget to setup the right unit of measure in your employees.",
),
}
-res_company()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project/project.py b/addons/project/project.py
index 0751865d9c4..0b99356a9de 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -208,6 +208,12 @@ class project(osv.osv):
"""Overriden in project_issue to offer more options"""
return [('project.task', "Tasks")]
+ def _get_visibility_selection(self, cr, uid, context=None):
+ """ Overriden in portal_project to offer more options """
+ return [('public', 'All Users'),
+ ('employees', 'Employees Only'),
+ ('followers', 'Followers Only')]
+
def attachment_tree_view(self, cr, uid, ids, context):
task_ids = self.pool.get('project.task').search(cr, uid, [('project_id', 'in', ids)])
domain = [
@@ -229,6 +235,8 @@ class project(osv.osv):
}
# Lambda indirection method to avoid passing a copy of the overridable method when declaring the field
_alias_models = lambda self, *args, **kwargs: self._get_alias_models(*args, **kwargs)
+ _visibility_selection = lambda self, *args, **kwargs: self._get_visibility_selection(*args, **kwargs)
+
_columns = {
'complete_name': fields.function(_complete_name, string="Project Name", type='char', size=250),
'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the project without removing it."),
@@ -267,7 +275,7 @@ class project(osv.osv):
"with Tasks (or optionally Issues if the Issue Tracker module is installed)."),
'alias_model': fields.selection(_alias_models, "Alias Model", select=True, required=True,
help="The kind of document created when an email is received on this project's email alias"),
- 'privacy_visibility': fields.selection([('public','All Users'), ('followers','Followers Only')], 'Privacy / Visibility', required=True),
+ 'privacy_visibility': fields.selection(_visibility_selection, 'Privacy / Visibility', required=True),
'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'), ('cancelled', 'Cancelled'),('pending','Pending'),('close','Closed')], 'Status', required=True,),
'doc_count':fields.function(_get_attached_docs, string="Number of documents attached", type='int')
}
@@ -286,7 +294,6 @@ class project(osv.osv):
'type_ids': _get_type_common,
'alias_model': 'project.task',
'privacy_visibility': 'public',
- 'alias_domain': False, # always hide alias during creation
}
# TODO: Why not using a SQL contraints ?
@@ -531,11 +538,11 @@ def Project():
context = dict(context, project_creation_in_progress=True)
mail_alias = self.pool.get('mail.alias')
if not vals.get('alias_id') and vals.get('name', False):
- vals.pop('alias_name', None) # prevent errors during copy()
+ alias_name = vals.pop('alias_name', None) # prevent errors during copy()
alias_id = mail_alias.create_unique_alias(cr, uid,
# Using '+' allows using subaddressing for those who don't
# have a catchall domain setup.
- {'alias_name': "project+"+short_name(vals['name'])},
+ {'alias_name': alias_name or "project+"+short_name(vals['name'])},
model_name=vals.get('alias_model', 'project.task'),
context=context)
vals['alias_id'] = alias_id
@@ -605,8 +612,7 @@ class task(base_stage, osv.osv):
search_domain = []
project_id = self._resolve_project_id_from_context(cr, uid, context=context)
if project_id:
- search_domain += ['|', ('project_ids', '=', project_id)]
- search_domain += [('id', 'in', ids)]
+ search_domain += [('project_ids', '=', project_id)]
stage_ids = stage_obj._search(cr, uid, search_domain, order=order, access_rights_uid=access_rights_uid, context=context)
result = stage_obj.name_get(cr, access_rights_uid, stage_ids, context=context)
# restore order of the search
@@ -889,6 +895,12 @@ class task(base_stage, osv.osv):
res['fields'][f]['string'] = res['fields'][f]['string'].replace('Hours',tm)
return res
+ def get_empty_list_help(self, cr, uid, help, context=None):
+ context['empty_list_help_id'] = context.get('default_project_id')
+ context['empty_list_help_model'] = 'project.project'
+ context['empty_list_help_document_name'] = _("tasks")
+ return super(task, self).get_empty_list_help(cr, uid, help, context=context)
+
# ----------------------------------------
# Case management
# ----------------------------------------
diff --git a/addons/project/project_data.xml b/addons/project/project_data.xml
index 025327d70b3..7bf1a623a2c 100644
--- a/addons/project/project_data.xml
+++ b/addons/project/project_data.xml
@@ -21,6 +21,7 @@
<record id="all_projects_account" model="account.analytic.account">
<field name="name">Projects</field>
<field name="code">3</field>
+ <field name="type">view</field>
</record>
<function id="parent_project_default_set" model="ir.values" name="set" eval="('default',False,'parent_id', [('project.project', False)], all_projects_account, True, False, False, False, True)"/>
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 16dbe44ccc1..298355d4c82 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -50,16 +50,17 @@
<field name="name">Tasks</field>
<field name="res_model">project.task</field>
<field name="view_mode">kanban,tree,form,calendar,gantt,graph</field>
- <field name="context">{'search_default_project_id': [active_id], 'default_project_id': active_id}</field>
+ <field name="context">{
+ 'search_default_project_id': [active_id],
+ 'default_project_id': active_id,
+ }</field>
<field name="search_view_id" ref="view_task_search_form"/>
<field name="help" type="html">
- <p class="oe_view_nocontent_create">
- Click to create a new task.
- </p><p>
- OpenERP's project management allows you to manage the pipeline
- of tasks in order to get things done efficiently. You can
- track progress, discuss on tasks, attach documents, etc.
- </p>
+ <p>
+ OpenERP's project management allows you to manage the pipeline
+ of tasks in order to get things done efficiently. You can
+ track progress, discuss on tasks, attach documents, etc.
+ </p>
</field>
</record>
@@ -87,6 +88,17 @@
<h1>
<field name="name" string="Project Name"/>
</h1>
+ <div name="group_alias"
+ attrs="{'invisible': [('alias_domain', '=', False)]}">
+ <label for="alias_id" string="Email Alias"/>
+ <field name="alias_id" class="oe_inline oe_read_only" required="0" nolabel="1"/>
+ <span name="edit_alias" class="oe_edit_only">
+ <field name="alias_name" class="oe_inline"
+ attrs="{'required': [('alias_id', '!=', False)]}"/>
+ @
+ <field name="alias_domain" class="oe_inline" readonly="1"/>
+ </span>
+ </div>
<div name="options_active">
<field name="use_tasks" class="oe_inline"/>
<label for="use_tasks"/>
@@ -133,13 +145,6 @@
</page>
<page string="Other Info">
<group>
- <group string="Email Interface" attrs="{'invisible': [('alias_domain', '=', False)]}">
- <div>
- <field name="alias_id" invisible="1" required="0"/>
- <label for="alias_name" class="oe_edit_only "/>
- <field name="alias_name" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" class="oe_inline"/>
- </div>
- </group>
<group string="Administration" groups="project.group_time_work_estimation_tasks">
<field name="planned_hours" widget="float_time"/>
<field name="effective_hours" widget="float_time"/>
@@ -184,7 +189,7 @@
<separator/>
<filter string="Project(s) Manager" domain="[('user_id','=',uid)]" help="Projects in which I am a manager" icon="terp-personal"/>
<field name="user_id" string="Project Manager"/>
- <field name="partner_id" string="Contact"/>
+ <field name="partner_id" string="Contact" filter_domain="[('partner_id', 'child_of', self)]"/>
<group expand="0" string="Group By...">
<filter string="Manager" name="Manager" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
<filter string="Contact" name="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
@@ -231,7 +236,6 @@
<field name="color"/>
<field name="task_count"/>
<field name="alias_id"/>
- <field name="alias_domain"/>
<field name="doc_count"/>
<templates>
<t t-name="kanban-box">
@@ -245,8 +249,10 @@
</ul>
</div>
<div class="oe_kanban_content">
-
<h4><field name="name"/></h4>
+ <div class="oe_kanban_alias" t-if="record.alias_id.value">
+ <span class="oe_e">%%</span><small><field name="alias_id"/></small>
+ </div>
<div class="oe_kanban_project_list">
<a t-if="record.use_tasks.raw_value" name="%(act_project_project_2_project_task_all)d" type="action" style="margin-right: 10px">
<span t-if="record.task_count.raw_value gt 1"><field name="task_count"/> Tasks</span>
@@ -622,13 +628,11 @@
<field name="view_mode">kanban,tree,form,calendar,gantt,graph</field>
<field name="search_view_id" ref="view_task_search_form"/>
<field name="help" type="html">
- <p class="oe_view_nocontent_create">
- Click to create a new task.
- </p><p>
- OpenERP's project management allows you to manage the pipeline
- of tasks in order to get things done efficiently. You can
- track progress, discuss on tasks, attach documents, etc.
- </p>
+ <p>
+ OpenERP's project management allows you to manage the pipeline
+ of tasks in order to get things done efficiently. You can
+ track progress, discuss on tasks, attach documents, etc.
+ </p>
</field>
</record>
<record id="open_view_task_list_kanban" model="ir.actions.act_window.view">
diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py
index 8e7dca059f9..006aae1085c 100644
--- a/addons/project/report/project_report.py
+++ b/addons/project/report/project_report.py
@@ -117,5 +117,4 @@ class report_project_task_user(osv.osv):
""")
-report_project_task_user()
diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml
index 10f3f4a8c7c..d9650e165ce 100644
--- a/addons/project/report/project_report_view.xml
+++ b/addons/project/report/project_report_view.xml
@@ -69,7 +69,7 @@
<filter icon="terp-personal-" string="Non Assigned Tasks to users" help="Non Assigned Tasks to users" domain="[('user_id','=',False)]"/>
<field name="project_id"/>
<field name="user_id"/>
- <field name="partner_id" />
+ <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/>
<group expand="0" string="Extended Filters...">
<field name="priority"/>
<field name="company_id" groups="base.group_multi_company"/>
diff --git a/addons/project/res_partner.py b/addons/project/res_partner.py
index 97fca8c459f..e4ca63d79d8 100644
--- a/addons/project/res_partner.py
+++ b/addons/project/res_partner.py
@@ -29,7 +29,6 @@ class res_partner(osv.osv):
'task_ids': fields.one2many('project.task', 'partner_id', 'Tasks'),
}
-res_partner()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project/security/project_security.xml b/addons/project/security/project_security.xml
index f1d8c7e760f..4bbaa9b788e 100644
--- a/addons/project/security/project_security.xml
+++ b/addons/project/security/project_security.xml
@@ -38,39 +38,62 @@
<data noupdate="1">
<record model="ir.rule" id="project_comp_rule">
- <field name="name">Project multi-company</field>
+ <field name="name">Project: multi-company</field>
<field name="model_id" ref="model_project_project"/>
<field name="global" eval="True"/>
- <field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
+ <field name="domain_force">['|',
+ ('company_id', '=', False),
+ ('company_id', 'child_of', [user.company_id.id]),
+ ]</field>
+ </record>
+
+ <record model="ir.rule" id="project_project_manager_rule">
+ <field name="name">Project: project manager: see all</field>
+ <field name="model_id" ref="model_project_project"/>
+ <field name="domain_force">[(1, '=', 1)]</field>
+ <field name="groups" eval="[(4,ref('project.group_project_manager'))]"/>
</record>
<record model="ir.rule" id="project_public_members_rule">
- <field name="name">Public Members</field>
+ <field name="name">Project: employees: public, employees or followers</field>
<field name="model_id" ref="model_project_project"/>
- <field name="global" eval="True"/>
- <field name="domain_force">['|',('privacy_visibility','in',[False,'public']),('message_follower_ids','in',[user.partner_id.id])]</field>
+ <field name="domain_force">['|',
+ ('privacy_visibility', 'in', ['public', 'employees']),
+ ('message_follower_ids', 'in', [user.partner_id.id])
+ ]</field>
+ <field name="groups" eval="[(4, ref('base.group_user'))]"/>
</record>
<record model="ir.rule" id="task_comp_rule">
- <field name="name" >Task multi-company</field>
+ <field name="name">Project/Task: multi-company</field>
<field name="model_id" ref="model_project_task"/>
<field name="global" eval="True"/>
- <field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
+ <field name="domain_force">['|',
+ ('company_id', '=', False),
+ ('company_id', 'child_of', [user.company_id.id]),
+ ]</field>
</record>
<record model="ir.rule" id="task_visibility_rule">
- <field name="name" >Tasks According to User and Project</field>
+ <field name="name">Project/Task: employees: public or employee or following or assigned</field>
<field name="model_id" ref="model_project_task"/>
- <field name="global" eval="True"/>
- <field name="domain_force">['|','|','|',('user_id','=',False),('user_id','=',user.id),('project_id.members','in', [user.id]),('project_id.user_id','=',user.id)]</field>
- <field name="groups" eval="[(4,ref('project.group_project_user'))]"/>
+ <field name="domain_force">['|',
+ ('user_id', '=', user.id),
+ '|',
+ ('project_id.privacy_visibility', 'in', ['public', 'employees']),
+ '&amp;',
+ ('project_id.privacy_visibility', '=', 'followers'),
+ ('message_follower_ids', 'in', [user.partner_id.id]),
+ ]</field>
+ <field name="groups" eval="[(4,ref('base.group_user'))]"/>
</record>
<record model="ir.rule" id="project_manager_all_project_tasks_rule">
- <field name="name">Project Managers: all tasks from all projects</field>
+ <field name="name">Project/Task: project manager: see all</field>
<field name="model_id" ref="model_project_task"/>
- <field name="domain_force">[(1,'=',1)]</field>
+ <field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4,ref('project.group_project_manager'))]"/>
</record>
+
</data>
</openerp>
diff --git a/addons/project/wizard/project_task_delegate.py b/addons/project/wizard/project_task_delegate.py
index bb15c62db1f..6a26868557e 100644
--- a/addons/project/wizard/project_task_delegate.py
+++ b/addons/project/wizard/project_task_delegate.py
@@ -125,13 +125,12 @@ class project_task_delegate(osv.osv_memory):
action_model, action_id = models_data.get_object_reference(cr, uid, 'project', 'action_view_task')
view_model, task_view_form_id = models_data.get_object_reference(cr, uid, 'project', 'view_task_form2')
view_model, task_view_tree_id = models_data.get_object_reference(cr, uid, 'project', 'view_task_tree2')
- action = self.pool.get(action_model).read(cr, uid, action_id, context=context)
+ action = self.pool[action_model].read(cr, uid, action_id, context=context)
action['res_id'] = delegated_tasks[task_id]
action['view_id'] = False
action['views'] = [(task_view_form_id, 'form'), (task_view_tree_id, 'tree')]
action['help'] = False
return action
-project_task_delegate()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project/wizard/project_task_reevaluate.py b/addons/project/wizard/project_task_reevaluate.py
index 1cbea397d5e..eeb8cccc5d2 100644
--- a/addons/project/wizard/project_task_reevaluate.py
+++ b/addons/project/wizard/project_task_reevaluate.py
@@ -80,6 +80,5 @@ class project_task_reevaluate(osv.osv_memory):
if context.get('button_reactivate'):
task_pool.do_reopen(cr, uid, [task_id], context=context)
return {'type': 'ir.actions.act_window_close'}
-project_task_reevaluate()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_gtd/project_gtd.py b/addons/project_gtd/project_gtd.py
index 715544cf4fc..47569e863aa 100644
--- a/addons/project_gtd/project_gtd.py
+++ b/addons/project_gtd/project_gtd.py
@@ -37,7 +37,6 @@ class project_gtd_context(osv.osv):
}
_order = "sequence, name"
-project_gtd_context()
class project_gtd_timebox(osv.osv):
@@ -49,7 +48,6 @@ class project_gtd_timebox(osv.osv):
'icon': fields.selection(tools.icons, 'Icon', size=64),
}
-project_gtd_timebox()
class project_task(osv.osv):
_inherit = "project.task"
@@ -120,6 +118,5 @@ class project_task(osv.osv):
return res
-project_task()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_gtd/wizard/project_gtd_empty.py b/addons/project_gtd/wizard/project_gtd_empty.py
index 26e438b789e..36c64cbc224 100644
--- a/addons/project_gtd/wizard/project_gtd_empty.py
+++ b/addons/project_gtd/wizard/project_gtd_empty.py
@@ -62,6 +62,5 @@ class project_timebox_empty(osv.osv_memory):
obj_task.write(cr, uid, close, {'timebox_id':False})
return {}
-project_timebox_empty()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_gtd/wizard/project_gtd_fill.py b/addons/project_gtd/wizard/project_gtd_fill.py
index ae8fea61e1c..121bd7efdac 100644
--- a/addons/project_gtd/wizard/project_gtd_fill.py
+++ b/addons/project_gtd/wizard/project_gtd_fill.py
@@ -56,6 +56,5 @@ class project_timebox_fill(osv.osv_memory):
self.pool.get('project.task').write(cr, uid, data[0]['task_ids'], {'timebox_id':data[0]['timebox_to_id'][0]})
return {'type': 'ir.actions.act_window_close'}
-project_timebox_fill()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_issue/i18n/cs.po b/addons/project_issue/i18n/cs.po
new file mode 100644
index 00000000000..cab9361dc60
--- /dev/null
+++ b/addons/project_issue/i18n/cs.po
@@ -0,0 +1,984 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:04+0000\n"
+"PO-Revision-Date: 2013-03-31 16:53+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: project_issue
+#: model:project.category,name:project_issue.project_issue_category_03
+msgid "Deadly bug"
+msgstr ""
+
+#. module: project_issue
+#: help:project.config.settings,fetchmail_issue:0
+msgid ""
+"Allows you to configure your incoming mail server, and create issues from "
+"incoming emails."
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue.report,delay_open:0
+msgid "Avg. Delay to Open"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: view:project.issue.report:0
+msgid "Group By..."
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,working_hours_open:0
+msgid "Working Hours to Open the Issue"
+msgstr ""
+
+#. module: project_issue
+#: model:mail.message.subtype,description:project_issue.mt_issue_started
+msgid "Issue started"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,date_open:0
+msgid "Opened"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue.report,opening_date:0
+msgid "Date of Opening"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,month:0
+msgid "March"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,progress:0
+msgid "Progress (%)"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: field:project.issue,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,company_id:0
+#: view:project.issue.report:0
+#: field:project.issue.report,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,email_cc:0
+msgid "Watchers Emails"
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue,kanban_state:0
+msgid ""
+"A Issue's kanban state indicates special situations affecting it:\n"
+" * Normal is the default situation\n"
+" * Blocked indicates something is preventing the progress of this issue\n"
+" * Ready for next stage indicates the issue is ready to be pulled to the "
+"next stage"
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: project_issue
+#: help:account.analytic.account,use_issues:0
+msgid "Check this field if this project manages issues"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,day_open:0
+msgid "Days to Open"
+msgstr ""
+
+#. module: project_issue
+#: code:addons/project_issue/project_issue.py:473
+#, python-format
+msgid ""
+"You cannot escalate this issue.\n"
+"The relevant Project has not configured the Escalation Project!"
+msgstr ""
+
+#. module: project_issue
+#: constraint:project.project:0
+msgid "Error! You cannot assign escalation to the same project!"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue,priority:0
+#: selection:project.issue.report,priority:0
+msgid "Highest"
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue,inactivity_days:0
+msgid "Difference in days between last action and current date"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue.report:0
+#: field:project.issue.report,day:0
+msgid "Day"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,days_since_creation:0
+msgid "Days since creation date"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,task_id:0
+#: view:project.issue.report:0
+#: field:project.issue.report,task_id:0
+msgid "Task"
+msgstr ""
+
+#. module: project_issue
+#: model:mail.message.subtype,name:project_issue.mt_project_issue_stage
+msgid "Issue Stage Changed"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,inactivity_days:0
+msgid "Days since last action"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.model,name:project_issue.model_project_project
+#: view:project.issue:0
+#: field:project.issue,project_id:0
+#: view:project.issue.report:0
+#: field:project.issue.report,project_id:0
+msgid "Project"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.actions.act_window,help:project_issue.project_issue_categ_act0
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to report a new issue.\n"
+" </p><p>\n"
+" The OpenERP issues tacker allows you to efficiantly manage "
+"things\n"
+" like internal requests, software development bugs, customer\n"
+" complaints, project troubles, material breakdowns, etc.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue,state:0
+#: selection:project.issue.report,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,description:0
+msgid "Private Note"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue.report,date_closed:0
+msgid "Date of Closing"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Issue Tracker Search"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,color:0
+msgid "Color Index"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue.report,working_hours_open:0
+msgid "Avg. Working Hours to Open"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.model,name:project_issue.model_account_analytic_account
+msgid "Analytic Account"
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: project_issue
+#: help:project.project,project_escalation_id:0
+msgid ""
+"If any issue is escalated from the current Project, it will be listed under "
+"the project selected here."
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Extra Info"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.actions.act_window,help:project_issue.action_project_issue_report
+msgid ""
+"This report on the project issues allows you to analyse the quality of your "
+"support or after-sales services. You can track the issues per age. You can "
+"analyse the time required to open or close an issue, the number of email to "
+"exchange and the time spent on average by issues."
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Edit..."
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Responsible"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Statistics"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,kanban_state:0
+msgid "Kanban State"
+msgstr ""
+
+#. module: project_issue
+#: code:addons/project_issue/project_issue.py:368
+#, python-format
+msgid "Project issue <b>converted</b> to task."
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: field:project.issue,priority:0
+#: view:project.issue.report:0
+#: field:project.issue.report,priority:0
+msgid "Priority"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: field:project.issue,version_id:0
+#: view:project.issue.report:0
+#: field:project.issue.report,version_id:0
+msgid "Version"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: selection:project.issue,state:0
+#: view:project.issue.report:0
+msgid "New"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.actions.act_window,name:project_issue.project_issue_categ_action
+msgid "Issue Categories"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,email_from:0
+msgid "Email"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,channel_id:0
+#: field:project.issue.report,channel_id:0
+msgid "Channel"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue,priority:0
+#: selection:project.issue.report,priority:0
+msgid "Lowest"
+msgstr ""
+
+#. module: project_issue
+#: code:addons/project_issue/project_issue.py:390
+#, python-format
+msgid "%s (copy)"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Unassigned Issues"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,create_date:0
+#: view:project.issue.report:0
+#: field:project.issue.report,creation_date:0
+msgid "Creation Date"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.actions.act_window,name:project_issue.project_issue_version_action
+#: model:ir.ui.menu,name:project_issue.menu_project_issue_version_act
+msgid "Versions"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "To Do Issues"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.model,name:project_issue.model_project_issue_version
+msgid "project.issue.version"
+msgstr ""
+
+#. module: project_issue
+#: field:project.config.settings,fetchmail_issue:0
+msgid "Create issues from an incoming email account "
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: selection:project.issue,state:0
+#: view:project.issue.report:0
+msgid "Done"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,month:0
+msgid "July"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.ui.menu,name:project_issue.menu_project_issue_category_act
+msgid "Categories"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: field:project.issue,stage_id:0
+#: view:project.issue.report:0
+#: field:project.issue.report,stage_id:0
+msgid "Stage"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.actions.act_window,name:project_issue.action_project_issue_report
+#: model:ir.ui.menu,name:project_issue.menu_project_issue_report_tree
+#: view:project.issue.report:0
+msgid "Issues Analysis"
+msgstr ""
+
+#. module: project_issue
+#: code:addons/project_issue/project_issue.py:507
+#, python-format
+msgid "No Subject"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.actions.act_window,name:project_issue.action_view_my_project_issue_tree
+msgid "My Project Issues"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: field:project.issue,partner_id:0
+#: view:project.issue.report:0
+#: field:project.issue.report,partner_id:0
+msgid "Contact"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Delete"
+msgstr ""
+
+#. module: project_issue
+#: code:addons/project_issue/project_issue.py:373
+#, python-format
+msgid "Tasks"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue.report,nbr:0
+msgid "# of Issues"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,month:0
+msgid "September"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,month:0
+msgid "December"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,categ_ids:0
+msgid "Tags"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Issue Tracker Tree"
+msgstr ""
+
+#. module: project_issue
+#: model:project.category,name:project_issue.project_issue_category_01
+msgid "Little problem"
+msgstr ""
+
+#. module: project_issue
+#: view:project.project:0
+msgid "creates"
+msgstr ""
+
+#. module: project_issue
+#: model:crm.case.categ,name:project_issue.feature_request_categ
+msgid "Feature Requests"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,write_date:0
+msgid "Update Date"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Project:"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Open Features"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,date_action_next:0
+msgid "Next Action"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: selection:project.issue,kanban_state:0
+msgid "Blocked"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,user_email:0
+msgid "User Email"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue.report:0
+msgid "#Number of Project Issues"
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue,channel_id:0
+msgid "Communication channel."
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue,email_cc:0
+msgid ""
+"These email addresses will be added to the CC field of all inbound and "
+"outbound emails for this record before being sent. Separate multiple email "
+"addresses with a comma"
+msgstr ""
+
+#. module: project_issue
+#: model:crm.case.categ,name:project_issue.bug_categ
+msgid "Maintenance"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue,priority:0
+#: selection:project.issue.report,priority:0
+msgid "Low"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,date_closed:0
+#: selection:project.issue.report,state:0
+msgid "Closed"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue.report,delay_close:0
+msgid "Avg. Delay to Close"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue,state:0
+#: view:project.issue.report:0
+#: selection:project.issue.report,state:0
+msgid "Pending"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: field:project.issue,state:0
+#: field:project.issue.report,state:0
+msgid "Status"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue.report:0
+msgid "#Project Issues"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,month:0
+msgid "August"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue,kanban_state:0
+#: selection:project.issue,priority:0
+#: selection:project.issue.report,priority:0
+msgid "Normal"
+msgstr ""
+
+#. module: project_issue
+#: field:project.project,issue_count:0
+msgid "unknown"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Category:"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,month:0
+msgid "June"
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "New Issues"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,day_close:0
+msgid "Days to Close"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue,state:0
+msgid ""
+"The status is set to 'Draft', when a case is created. "
+"If the case is in progress the status is set to 'Open'. "
+"When the case is over, the status is set to 'Done'. If "
+"the case needs to be reviewed then the status is set "
+"to 'Pending'."
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,active:0
+#: field:project.issue.version,active:0
+msgid "Active"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,month:0
+msgid "November"
+msgstr ""
+
+#. module: project_issue
+#: code:addons/project_issue/project_issue.py:473
+#, python-format
+msgid "Warning!"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue.report:0
+msgid "Search"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,month:0
+msgid "October"
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue,days_since_creation:0
+msgid "Difference in days between creation date and current date"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,month:0
+msgid "January"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Feature Tracker Tree"
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue,email_from:0
+msgid "These people will receive email."
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,date:0
+msgid "Date"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,user_id:0
+#: view:project.issue.report:0
+#: field:project.issue.report,user_id:0
+msgid "Assigned to"
+msgstr ""
+
+#. module: project_issue
+#: view:project.config.settings:0
+msgid "Configure"
+msgstr ""
+
+#. module: project_issue
+#: model:mail.message.subtype,description:project_issue.mt_issue_closed
+msgid "Issue closed"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Current Features"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue.version:0
+msgid "Issue Version"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue.version,name:0
+msgid "Version Number"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Cancel"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,state:0
+msgid "Open"
+msgstr ""
+
+#. module: project_issue
+#: field:account.analytic.account,use_issues:0
+#: model:ir.actions.act_window,name:project_issue.act_project_project_2_project_issue_all
+#: model:ir.actions.act_window,name:project_issue.project_issue_categ_act0
+#: model:ir.ui.menu,name:project_issue.menu_project_confi
+#: model:ir.ui.menu,name:project_issue.menu_project_issue_track
+#: view:project.issue:0
+#: view:project.project:0
+msgid "Issues"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: selection:project.issue,state:0
+msgid "In Progress"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: view:project.issue.report:0
+msgid "To Do"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.model,name:project_issue.model_project_issue
+#: view:project.issue.report:0
+msgid "Project Issue"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Creation Month"
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue,progress:0
+msgid "Computed as: Time Spent / Total Time."
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: selection:project.issue,kanban_state:0
+msgid "Ready for next stage"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue.report:0
+#: field:project.issue.report,section_id:0
+msgid "Sale Team"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: view:project.issue.report:0
+#: field:project.issue.report,month:0
+msgid "Month"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+#: field:project.issue,name:0
+#: view:project.project:0
+msgid "Issue"
+msgstr ""
+
+#. module: project_issue
+#: model:project.category,name:project_issue.project_issue_category_02
+msgid "PBCK"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Feature Tracker Search"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Description"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,section_id:0
+msgid "Sales Team"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,month:0
+msgid "May"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.model,name:project_issue.model_project_config_settings
+msgid "project.config.settings"
+msgstr ""
+
+#. module: project_issue
+#: model:mail.message.subtype,name:project_issue.mt_issue_closed
+#: model:mail.message.subtype,name:project_issue.mt_project_issue_closed
+msgid "Issue Closed"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue.report:0
+#: field:project.issue.report,email:0
+msgid "# Emails"
+msgstr ""
+
+#. module: project_issue
+#: model:mail.message.subtype,name:project_issue.mt_issue_new
+#: model:mail.message.subtype,name:project_issue.mt_project_issue_new
+msgid "Issue Created"
+msgstr ""
+
+#. module: project_issue
+#: model:mail.message.subtype,name:project_issue.mt_issue_blocked
+#: model:mail.message.subtype,name:project_issue.mt_project_issue_blocked
+msgid "Issue Blocked"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,month:0
+msgid "February"
+msgstr ""
+
+#. module: project_issue
+#: model:mail.message.subtype,description:project_issue.mt_issue_stage
+#: model:mail.message.subtype,description:project_issue.mt_project_issue_stage
+msgid "Stage changed"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "Feature description"
+msgstr ""
+
+#. module: project_issue
+#: field:project.project,project_escalation_id:0
+msgid "Project Escalation"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.actions.act_window,help:project_issue.project_issue_version_action
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to add a new version.\n"
+" </p><p>\n"
+" Define here the different versions of your products on "
+"which\n"
+" you can work on issues.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue,section_id:0
+msgid ""
+"Sales team to which Case belongs to. Define "
+"Responsible user and Email account for mail gateway."
+msgstr ""
+
+#. module: project_issue
+#: view:board.board:0
+msgid "My Issues"
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue.report,delay_open:0
+msgid "Number of Days to open the project issue."
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue.report,month:0
+msgid "April"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "⇒ Escalate"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue:0
+msgid "References"
+msgstr ""
+
+#. module: project_issue
+#: model:mail.message.subtype,description:project_issue.mt_issue_new
+msgid "Issue created"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,working_hours_close:0
+msgid "Working Hours to Close the Issue"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,id:0
+msgid "ID"
+msgstr ""
+
+#. module: project_issue
+#: model:mail.message.subtype,description:project_issue.mt_issue_blocked
+msgid "Issue blocked"
+msgstr ""
+
+#. module: project_issue
+#: model:ir.model,name:project_issue.model_project_issue_report
+msgid "project.issue.report"
+msgstr ""
+
+#. module: project_issue
+#: help:project.issue.report,delay_close:0
+msgid "Number of Days to close the project issue"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue.report,working_hours_close:0
+msgid "Avg. Working Hours to Close"
+msgstr ""
+
+#. module: project_issue
+#: model:mail.message.subtype,name:project_issue.mt_issue_stage
+msgid "Stage Changed"
+msgstr ""
+
+#. module: project_issue
+#: selection:project.issue,priority:0
+#: selection:project.issue.report,priority:0
+msgid "High"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,date_deadline:0
+msgid "Deadline"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,date_action_last:0
+msgid "Last Action"
+msgstr ""
+
+#. module: project_issue
+#: view:project.issue.report:0
+#: field:project.issue.report,name:0
+msgid "Year"
+msgstr ""
+
+#. module: project_issue
+#: field:project.issue,duration:0
+msgid "Duration"
+msgstr ""
+
+#. module: project_issue
+#: model:mail.message.subtype,name:project_issue.mt_issue_started
+#: model:mail.message.subtype,name:project_issue.mt_project_issue_started
+msgid "Issue Started"
+msgstr ""
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index 01dab2962f3..69792322ab3 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -40,7 +40,6 @@ class project_issue_version(osv.osv):
_defaults = {
'active': 1,
}
-project_issue_version()
class project_issue(base_stage, osv.osv):
_name = "project.issue"
@@ -137,6 +136,13 @@ class project_issue(base_stage, osv.osv):
res = {}
for issue in self.browse(cr, uid, ids, context=context):
+
+ # if the working hours on the project are not defined, use default ones (8 -> 12 and 13 -> 17 * 5), represented by None
+ if not issue.project_id or not issue.project_id.resource_calendar_id:
+ working_hours = None
+ else:
+ working_hours = issue.project_id.resource_calendar_id.id
+
res[issue.id] = {}
for field in fields:
duration = 0
@@ -150,20 +156,24 @@ class project_issue(base_stage, osv.osv):
ans = date_open - date_create
date_until = issue.date_open
#Calculating no. of working hours to open the issue
- if issue.project_id.resource_calendar_id:
- hours = cal_obj.interval_hours_get(cr, uid, issue.project_id.resource_calendar_id.id,
+ hours = cal_obj._interval_hours_get(cr, uid, working_hours,
date_create,
- date_open)
+ date_open,
+ timezone_from_uid=issue.user_id.id or uid,
+ exclude_leaves=False,
+ context=context)
elif field in ['working_hours_close','day_close']:
if issue.date_closed:
date_close = datetime.strptime(issue.date_closed, "%Y-%m-%d %H:%M:%S")
date_until = issue.date_closed
ans = date_close - date_create
#Calculating no. of working hours to close the issue
- if issue.project_id.resource_calendar_id:
- hours = cal_obj.interval_hours_get(cr, uid, issue.project_id.resource_calendar_id.id,
- date_create,
- date_close)
+ hours = cal_obj._interval_hours_get(cr, uid, working_hours,
+ date_create,
+ date_close,
+ timezone_from_uid=issue.user_id.id or uid,
+ exclude_leaves=False,
+ context=context)
elif field in ['days_since_creation']:
if issue.create_date:
days_since_creation = datetime.today() - datetime.strptime(issue.create_date, "%Y-%m-%d %H:%M:%S")
@@ -182,27 +192,12 @@ class project_issue(base_stage, osv.osv):
resource_ids = res_obj.search(cr, uid, [('user_id','=',issue.user_id.id)])
if resource_ids and len(resource_ids):
resource_id = resource_ids[0]
- duration = float(ans.days)
- if issue.project_id and issue.project_id.resource_calendar_id:
- duration = float(ans.days) * 24
-
- new_dates = cal_obj.interval_min_get(cr, uid,
- issue.project_id.resource_calendar_id.id,
- date_create,
- duration, resource=resource_id)
- no_days = []
- date_until = datetime.strptime(date_until, '%Y-%m-%d %H:%M:%S')
- for in_time, out_time in new_dates:
- if in_time.date not in no_days:
- no_days.append(in_time.date)
- if out_time > date_until:
- break
- duration = len(no_days)
+ duration = float(ans.days) + float(ans.seconds)/(24*3600)
if field in ['working_hours_open','working_hours_close']:
res[issue.id][field] = hours
- else:
- res[issue.id][field] = abs(float(duration))
+ elif field in ['day_open','day_close']:
+ res[issue.id][field] = duration
return res
@@ -420,6 +415,12 @@ class project_issue(base_stage, osv.osv):
self.write(cr, uid, ids, {'date_open': False, 'date_closed': False})
return res
+ def get_empty_list_help(self, cr, uid, help, context=None):
+ context['empty_list_help_model'] = 'project.project'
+ context['empty_list_help_id'] = context.get('default_project_id')
+ context['empty_list_help_document_name'] = _("issues")
+ return super(project_issue, self).get_empty_list_help(cr, uid, help, context=context)
+
# -------------------------------------------------------
# Stage management
# -------------------------------------------------------
@@ -567,7 +568,8 @@ class project_issue(base_stage, osv.osv):
return res
-class project(osv.osv):
+
+class project(osv.Model):
_inherit = "project.project"
def _get_alias_models(self, cr, uid, context=None):
@@ -582,7 +584,9 @@ class project(osv.osv):
return res
_columns = {
- 'project_escalation_id' : fields.many2one('project.project','Project Escalation', help='If any issue is escalated from the current Project, it will be listed under the project selected here.', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}),
+ 'project_escalation_id': fields.many2one('project.project', 'Project Escalation',
+ help='If any issue is escalated from the current Project, it will be listed under the project selected here.',
+ states={'close': [('readonly', True)], 'cancelled': [('readonly', True)]}),
'issue_count': fields.function(_issue_count, type='integer', string="Unclosed Issues"),
}
@@ -597,14 +601,13 @@ class project(osv.osv):
(_check_escalation, 'Error! You cannot assign escalation to the same project!', ['project_escalation_id'])
]
-project()
-class account_analytic_account(osv.osv):
+class account_analytic_account(osv.Model):
_inherit = 'account.analytic.account'
_description = 'Analytic Account'
_columns = {
- 'use_issues' : fields.boolean('Issues', help="Check this field if this project manages issues"),
+ 'use_issues': fields.boolean('Issues', help="Check this field if this project manages issues"),
}
def on_change_template(self, cr, uid, ids, template_id, context=None):
@@ -615,16 +618,34 @@ class account_analytic_account(osv.osv):
return res
def _trigger_project_creation(self, cr, uid, vals, context=None):
- if context is None: context = {}
+ if context is None:
+ context = {}
res = super(account_analytic_account, self)._trigger_project_creation(cr, uid, vals, context=context)
return res or (vals.get('use_issues') and not 'project_creation_in_progress' in context)
-account_analytic_account()
-class project_project(osv.osv):
+class project_project(osv.Model):
_inherit = 'project.project'
+
_defaults = {
'use_issues': True
}
+ def _check_create_write_values(self, cr, uid, vals, context=None):
+ """ Perform some check on values given to create or write. """
+ # Handle use_tasks / use_issues: if only one is checked, alias should take the same model
+ if vals.get('use_tasks') and not vals.get('use_issues'):
+ vals['alias_model'] = 'project.task'
+ elif vals.get('use_issues') and not vals.get('use_tasks'):
+ vals['alias_model'] = 'project.issue'
+
+ def create(self, cr, uid, vals, context=None):
+ self._check_create_write_values(cr, uid, vals, context=context)
+ return super(project_project, self).create(cr, uid, vals, context=context)
+
+ def write(self, cr, uid, ids, vals, context=None):
+ self._check_create_write_values(cr, uid, vals, context=context)
+ return super(project_project, self).write(cr, uid, ids, vals, context=context)
+
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_issue/project_issue_menu.xml b/addons/project_issue/project_issue_menu.xml
index 78841f56156..308b4884844 100644
--- a/addons/project_issue/project_issue_menu.xml
+++ b/addons/project_issue/project_issue_menu.xml
@@ -14,13 +14,11 @@
<field name="domain" eval=""/>
<field name="search_view_id" ref="view_project_issue_filter"/>
<field name="help" type="html">
- <p class="oe_view_nocontent_create">
- Click to report a new issue.
- </p><p>
- The OpenERP issues tacker allows you to efficiantly manage things
- like internal requests, software development bugs, customer
- complaints, project troubles, material breakdowns, etc.
- </p>
+ <p>
+ The OpenERP issues tacker allows you to efficiantly manage things
+ like internal requests, software development bugs, customer
+ complaints, project troubles, material breakdowns, etc.
+ </p>
</field>
</record>
diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml
index 500a1376422..f15355e9cc8 100644
--- a/addons/project_issue/project_issue_view.xml
+++ b/addons/project_issue/project_issue_view.xml
@@ -146,7 +146,7 @@
<field name="model">project.issue</field>
<field name="arch" type="xml">
<search string="Issue Tracker Search">
- <field name="name" string="Issue" filter_domain="['|', '|',('description','ilike',self),('email_from','ilike',self),('name','ilike',self)]"/>
+ <field name="name" string="Issue" filter_domain="['|', '|', '|', ('partner_id','child_of',self), ('description','ilike',self),('email_from','ilike',self),('name','ilike',self)]"/>
<field name="id"/>
<filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
@@ -154,10 +154,11 @@
<filter string="To Do" domain="[('state','=','open')]" help="To Do Issues" icon="terp-check"/>
<separator/>
<filter string="Unassigned Issues" domain="[('user_id','=',False)]" help="Unassigned Issues" icon="terp-personal-"/>
- <field name="partner_id"/>
+ <separator/>
<field name="user_id"/>
<field name="project_id"/>
<field name="categ_ids"/>
+ <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/>
<group expand="0" string="Group By..." >
<filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
<filter string="Contact" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
@@ -302,7 +303,18 @@
<field name="view_type">form</field>
<field name="name">Issues</field>
<field name="view_mode">kanban,tree,form,calendar,graph</field>
- <field name="context">{'search_default_project_id': [active_id], 'default_project_id': active_id}</field>
+ <field name="context">{
+ 'search_default_project_id': [active_id],
+ 'default_project_id': active_id,
+ }
+ </field>
+ <field name="help" type="html">
+ <p>
+ The OpenERP issues tacker allows you to efficiantly manage things
+ like internal requests, software development bugs, customer
+ complaints, project troubles, material breakdowns, etc.
+ </p>
+ </field>
</record>
<!-- Project -->
@@ -324,9 +336,18 @@
<field name="priority" position="before">
<field name="project_escalation_id"/>
</field>
- <field name="alias_domain" position="after">
- <label for="alias_model" class="oe_edit_only" string="creates"/><field name="alias_model" class="oe_edit_only oe_inline"/>
- </field>
+ <xpath expr='//span[@name="edit_alias"]' position='replace'>
+ <span class="oe_edit_only" name="edit_alias">
+ <field name="alias_name" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>
+ @
+ <field class="oe_inline" name="alias_domain"/>
+ <span class="oe_inline"
+ attrs="{'invisible': ['|', ('use_issues', '!=', True), ('use_tasks', '!=', True)]}">
+ <label for="alias_model" string="creates"/>
+ <field name="alias_model" class="oe_inline"/>
+ </span>
+ </span>
+ </xpath>
</field>
</record>
diff --git a/addons/project_issue/report/project_issue_report.py b/addons/project_issue/report/project_issue_report.py
index a5eb903a742..5cca0ff8689 100644
--- a/addons/project_issue/report/project_issue_report.py
+++ b/addons/project_issue/report/project_issue_report.py
@@ -63,9 +63,9 @@ class project_issue_report(osv.osv):
'project_id':fields.many2one('project.project', 'Project',readonly=True),
'version_id': fields.many2one('project.issue.version', 'Version'),
'user_id' : fields.many2one('res.users', 'Assigned to',readonly=True),
- 'partner_id': fields.many2one('res.partner','Contact',domain="[('object_id.model', '=', 'project.issue')]"),
+ 'partner_id': fields.many2one('res.partner','Contact'),
'channel_id': fields.many2one('crm.case.channel', 'Channel',readonly=True),
- 'task_id': fields.many2one('project.task', 'Task',domain="[('object_id.model', '=', 'project.issue')]" ),
+ 'task_id': fields.many2one('project.task', 'Task'),
'email': fields.integer('# Emails', size=128, readonly=True),
}
@@ -96,8 +96,8 @@ class project_issue_report(osv.osv):
c.channel_id,
c.task_id,
date_trunc('day',c.create_date) as create_date,
- extract('epoch' from (c.date_open-c.create_date))/(3600*24) as delay_open,
- extract('epoch' from (c.date_closed-c.date_open))/(3600*24) as delay_close,
+ c.day_open as delay_open,
+ c.day_close as delay_close,
(SELECT count(id) FROM mail_message WHERE model='project.issue' AND res_id=c.id) AS email
FROM
@@ -105,6 +105,5 @@ class project_issue_report(osv.osv):
WHERE c.active= 'true'
)""")
-project_issue_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_issue/report/project_issue_report_view.xml b/addons/project_issue/report/project_issue_report_view.xml
index 47ea91fad5f..a885dcd8a7f 100644
--- a/addons/project_issue/report/project_issue_report_view.xml
+++ b/addons/project_issue/report/project_issue_report_view.xml
@@ -14,7 +14,7 @@
<field name="version_id" string="Version" invisible="1"/>
<field name="priority" invisible="1"/>
<field name="company_id" invisible="1" groups="base.group_multi_company"/>
- <field name="section_id" invisible="1"/>
+ <field name="section_id" invisible="1" groups="base.group_multi_salesteams"/>
<field name="user_id" invisible="1"/>
<field name="channel_id" invisible="1"/>
<field name="partner_id" invisible="1"/>
@@ -55,7 +55,7 @@
<filter icon="terp-dialog-close" string="Done" domain="[('state','=','done')]"/>
<field name="project_id"/>
<field name="user_id"/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/>
<field name="version_id"/>
<group expand="1" string="Group By...">
<filter string="Assigned to" name="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}" />
diff --git a/addons/project_issue/security/project_issue_security.xml b/addons/project_issue/security/project_issue_security.xml
index c3119073a75..5215a94a8b7 100644
--- a/addons/project_issue/security/project_issue_security.xml
+++ b/addons/project_issue/security/project_issue_security.xml
@@ -1,5 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
+
+ <record model="ir.rule" id="issue_project_manager_rule">
+ <field name="name">Project/Issue: project manager: see all</field>
+ <field name="model_id" ref="model_project_issue"/>
+ <field name="domain_force">[(1, '=', 1)]</field>
+ <field name="groups" eval="[(4,ref('project.group_project_manager'))]"/>
+ </record>
+
+ <record model="ir.rule" id="issue_user_rule">
+ <field name="name">Project/Issue: employees: public or employee or following or assigned</field>
+ <field name="model_id" ref="model_project_issue"/>
+ <field name="domain_force">['|',
+ '|',
+ ('project_id.privacy_visibility', 'in', ['public', 'employees']),
+ '&amp;',
+ ('project_id.privacy_visibility', '=', 'followers'),
+ ('message_follower_ids', 'in', [user.id]),
+ ('user_id', '=', user.id),
+ ]</field>
+ <field name="groups" eval="[(4,ref('base.group_user'))]"/>
+ </record>
+
</data>
</openerp>
diff --git a/addons/project_issue/test/subscribe_issue.yml b/addons/project_issue/test/subscribe_issue.yml
index 9f16dc80b97..af81ff4d295 100644
--- a/addons/project_issue/test/subscribe_issue.yml
+++ b/addons/project_issue/test/subscribe_issue.yml
@@ -2,8 +2,7 @@
In Order to test process of Issue in OpenERP, Custmer send the issue by email.
-
!python {model: mail.thread}: |
- from openerp import addons
- request_file = open(addons.get_module_resource('project_issue','test', 'issue.eml'),'rb')
+ request_file = open(openerp.modules.module.get_module_resource('project_issue','test', 'issue.eml'),'rb')
request_message = request_file.read()
self.message_process(cr, uid, 'project.issue', request_message)
-
@@ -14,4 +13,4 @@
assert issue_ids and len(issue_ids), "issue is not created after getting request"
issue = self.browse(cr, uid, issue_ids[0], context=context)
assert not issue.partner_id, "Customer should be a new"
- assert issue.name == "Error in the account module", "Subject does not match" \ No newline at end of file
+ assert issue.name == "Error in the account module", "Subject does not match"
diff --git a/addons/project_issue_sheet/i18n/cs.po b/addons/project_issue_sheet/i18n/cs.po
new file mode 100644
index 00000000000..606e4246807
--- /dev/null
+++ b/addons/project_issue_sheet/i18n/cs.po
@@ -0,0 +1,72 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-03-31 16:53+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: project_issue_sheet
+#: code:addons/project_issue_sheet/project_issue_sheet.py:57
+#, python-format
+msgid "The Analytic Account is pending !"
+msgstr ""
+
+#. module: project_issue_sheet
+#: model:ir.model,name:project_issue_sheet.model_account_analytic_line
+msgid "Analytic Line"
+msgstr ""
+
+#. module: project_issue_sheet
+#: model:ir.model,name:project_issue_sheet.model_project_issue
+msgid "Project Issue"
+msgstr ""
+
+#. module: project_issue_sheet
+#: model:ir.model,name:project_issue_sheet.model_hr_analytic_timesheet
+msgid "Timesheet Line"
+msgstr ""
+
+#. module: project_issue_sheet
+#: view:project.issue:0
+msgid "on_change_project(project_id)"
+msgstr ""
+
+#. module: project_issue_sheet
+#: code:addons/project_issue_sheet/project_issue_sheet.py:57
+#: field:project.issue,analytic_account_id:0
+#, python-format
+msgid "Analytic Account"
+msgstr ""
+
+#. module: project_issue_sheet
+#: view:project.issue:0
+msgid "Worklogs"
+msgstr ""
+
+#. module: project_issue_sheet
+#: field:account.analytic.line,create_date:0
+msgid "Create Date"
+msgstr ""
+
+#. module: project_issue_sheet
+#: view:project.issue:0
+#: field:project.issue,timesheet_ids:0
+msgid "Timesheets"
+msgstr ""
+
+#. module: project_issue_sheet
+#: field:hr.analytic.timesheet,issue_id:0
+msgid "Issue"
+msgstr ""
diff --git a/addons/project_issue_sheet/project_issue_sheet.py b/addons/project_issue_sheet/project_issue_sheet.py
index 8fe645e19fe..551ef3c8194 100644
--- a/addons/project_issue_sheet/project_issue_sheet.py
+++ b/addons/project_issue_sheet/project_issue_sheet.py
@@ -58,7 +58,6 @@ class project_issue(osv.osv):
return result
-project_issue()
class account_analytic_line(osv.osv):
_inherit = 'account.analytic.line'
@@ -67,7 +66,6 @@ class account_analytic_line(osv.osv):
'create_date' : fields.datetime('Create Date', readonly=True),
}
-account_analytic_line()
class hr_analytic_issue(osv.osv):
@@ -77,6 +75,5 @@ class hr_analytic_issue(osv.osv):
'issue_id' : fields.many2one('project.issue', 'Issue'),
}
-hr_analytic_issue()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_long_term/i18n/cs.po b/addons/project_long_term/i18n/cs.po
new file mode 100644
index 00000000000..fb1fb15f3a2
--- /dev/null
+++ b/addons/project_long_term/i18n/cs.po
@@ -0,0 +1,502 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-03-31 16:54+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: project_long_term
+#: help:project.phase,constraint_date_end:0
+msgid "force the phase to finish before this date"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: selection:project.phase,state:0
+msgid "In Progress"
+msgstr ""
+
+#. module: project_long_term
+#: field:account.analytic.account,use_phases:0
+#: model:ir.actions.act_window,name:project_long_term.act_project_phases
+#: view:project.project:0
+msgid "Phases"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.actions.act_window,name:project_long_term.act_resouce_allocation
+#: model:ir.ui.menu,name:project_long_term.menu_resouce_allocation
+#: view:project.phase:0
+#: view:project.user.allocation:0
+msgid "Team Planning"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,user_ids:0
+msgid "Assigned Users"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: field:project.phase,next_phase_ids:0
+msgid "Next Phases"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.model,name:project_long_term.model_project_user_allocation
+msgid "Phase User Allocation"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Project's Tasks"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.actions.act_window,help:project_long_term.action_project_compute_phases
+msgid ""
+"To schedule phases of all or a specified project. It then open a gantt "
+"view.\n"
+" "
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,task_ids:0
+msgid "Project Tasks"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.actions.act_window,name:project_long_term.action_project_compute_phases
+#: model:ir.ui.menu,name:project_long_term.menu_compute_phase
+#: view:project.compute.phases:0
+msgid "Schedule Phases"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: field:project.phase,state:0
+msgid "Status"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.compute.phases,target_project:0
+msgid "Action"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Start Phase"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.model,name:project_long_term.model_project_task
+msgid "Task"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Draft"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.compute.phases:0
+#: view:project.compute.tasks:0
+msgid "C_ompute"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: selection:project.phase,state:0
+msgid "New"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,product_uom:0
+msgid "Duration Unit of Measure"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar_leaves
+msgid "Resource Leaves"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: selection:project.phase,state:0
+msgid "Pending"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,progress:0
+msgid "Computed based on related tasks"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "In Progress Phases"
+msgstr ""
+
+#. module: project_long_term
+#: code:addons/project_long_term/project_long_term.py:140
+#, python-format
+msgid "%s (copy)"
+msgstr ""
+
+#. module: project_long_term
+#: code:addons/project_long_term/wizard/project_compute_phases.py:48
+#, python-format
+msgid "Please specify a project to schedule."
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: view:project.user.allocation:0
+msgid "Group By..."
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Remaining Hours"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,constraint_date_start:0
+msgid "Minimum Start Date"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,product_uom:0
+msgid ""
+"Unit of Measure (Unit of Measure) is the unit of measurement for Duration"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,user_ids:0
+msgid ""
+"The resources on the project can be computed automatically by the scheduler."
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: project_long_term
+#: help:account.analytic.account,use_phases:0
+msgid "Check this field if you plan to use phase-based scheduling"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,state:0
+msgid ""
+"If the phase is created the status 'Draft'.\n"
+" If the phase is started, the status becomes 'In Progress'.\n"
+" If review is needed the phase is in 'Pending' status. "
+" \n"
+" If the phase is over, the status is set to 'Done'."
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,progress:0
+msgid "Progress"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.ui.menu,name:project_long_term.menu_pm_users_project1
+#: model:ir.ui.menu,name:project_long_term.menu_view_resource
+msgid "Resources"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "My Projects"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.project:0
+#: view:project.user.allocation:0
+msgid "Phase"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,duration:0
+msgid "By default in days"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar
+msgid "Working Time"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Pending Phases"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.user.allocation,date_start:0
+msgid "Starting Date"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Related Tasks"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Start Month"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,date_end:0
+#: field:project.user.allocation,date_end:0
+msgid "End Date"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.model,name:project_long_term.model_project_compute_tasks
+msgid "Project Compute Tasks"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.actions.act_window,help:project_long_term.act_project_phase
+msgid ""
+"A project can be split into the different phases. For each phase, you can "
+"define your users allocation, describe different tasks and link your phase "
+"to previous and next phases, add date constraints for the automated "
+"scheduling. Use the long term planning in order to planify your available "
+"users, convert your phases into a series of tasks when you start working on "
+"the project."
+msgstr ""
+
+#. module: project_long_term
+#: selection:project.compute.phases,target_project:0
+msgid "Compute a Single Project"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: field:project.phase,previous_phase_ids:0
+msgid "Previous Phases"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "New Phases"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Tasks Details"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.project,phase_count:0
+msgid "Open Phases"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,date_end:0
+msgid ""
+" It's computed by the scheduler according to the start date and the duration."
+msgstr ""
+
+#. module: project_long_term
+#: constraint:project.phase:0
+msgid "Loops in phases not allowed"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.user.allocation:0
+#: field:project.user.allocation,user_id:0
+msgid "User"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.model,name:project_long_term.model_project_project
+#: field:project.compute.phases,project_id:0
+#: field:project.compute.tasks,project_id:0
+#: view:project.phase:0
+#: field:project.phase,project_id:0
+#: view:project.task:0
+#: view:project.user.allocation:0
+#: field:project.user.allocation,project_id:0
+msgid "Project"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.compute.phases:0
+#: view:project.compute.tasks:0
+msgid "Cancel"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Project Users"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.model,name:project_long_term.model_project_phase
+#: view:project.phase:0
+#: view:project.task:0
+#: field:project.task,phase_id:0
+#: field:project.user.allocation,phase_id:0
+msgid "Project Phase"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.ui.menu,name:project_long_term.menu_phase_schedule
+msgid "Scheduling"
+msgstr ""
+
+#. module: project_long_term
+#: constraint:project.phase:0
+msgid "Phase start-date must be lower than phase end-date."
+msgstr ""
+
+#. module: project_long_term
+#: selection:project.phase,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Total Hours"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.model,name:project_long_term.model_project_compute_phases
+msgid "Project Compute Phases"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,date_start:0
+#: field:project.user.allocation,date_start:0
+msgid "Start Date"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Constraints"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,sequence:0
+msgid "Gives the sequence order when displaying a list of phases."
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.actions.act_window,name:project_long_term.project_phase_task_list
+msgid "Tasks"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.user.allocation,date_end:0
+msgid "Ending Date"
+msgstr ""
+
+#. module: project_long_term
+#: code:addons/project_long_term/wizard/project_compute_phases.py:48
+#, python-format
+msgid "Error!"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,date_start:0
+msgid ""
+"It's computed by the scheduler according the project date or the end date of "
+"the previous phase."
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.actions.act_window,name:project_long_term.act_project_phase
+#: model:ir.actions.act_window,name:project_long_term.act_project_phase_list
+#: model:ir.ui.menu,name:project_long_term.menu_project_phase
+#: model:ir.ui.menu,name:project_long_term.menu_project_phase_list
+#: view:project.phase:0
+#: field:project.project,phase_ids:0
+msgid "Project Phases"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,constraint_date_start:0
+msgid "force the phase to start after this date"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Month"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.model,name:project_long_term.model_account_analytic_account
+msgid "Analytic Account"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,constraint_date_end:0
+msgid "Deadline"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.user.allocation:0
+msgid "Project User Allocation"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.actions.act_window,name:project_long_term.action_project_compute_tasks
+#: model:ir.ui.menu,name:project_long_term.menu_compute_tasks
+#: view:project.compute.tasks:0
+msgid "Schedule Tasks"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: selection:project.phase,state:0
+msgid "Done"
+msgstr ""
+
+#. module: project_long_term
+#: selection:project.compute.phases,target_project:0
+msgid "Compute All My Projects"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,user_force_ids:0
+msgid "Force Assigned Users"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: field:project.phase,duration:0
+msgid "Duration"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.user.allocation:0
+msgid "Users"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,name:0
+msgid "Name"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.compute.phases:0
+#: view:project.compute.tasks:0
+msgid "or"
+msgstr ""
diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py
index e53ff9ed253..a950907fb69 100644
--- a/addons/project_long_term/project_long_term.py
+++ b/addons/project_long_term/project_long_term.py
@@ -198,7 +198,6 @@ class project_phase(osv.osv):
result += "\n"
return result
-project_phase()
class project_user_allocation(osv.osv):
_name = 'project.user.allocation'
@@ -211,7 +210,6 @@ class project_user_allocation(osv.osv):
'date_start': fields.datetime('Start Date', help="Starting Date"),
'date_end': fields.datetime('End Date', help="Ending Date"),
}
-project_user_allocation()
class project(osv.osv):
_inherit = "project.project"
@@ -267,7 +265,6 @@ class project(osv.osv):
'date_end': p.end.strftime('%Y-%m-%d %H:%M:%S')
}, context=context)
return True
-project()
class account_analytic_account(osv.osv):
_inherit = 'account.analytic.account'
@@ -283,17 +280,17 @@ class account_analytic_account(osv.osv):
res['value']['use_phases'] = template.use_phases
return res
+
def _trigger_project_creation(self, cr, uid, vals, context=None):
- res= super(account_analytic_account, self)._trigger_project_creation(cr, uid, vals, context=context)
- return res or vals.get('use_phases')
+ if context is None: context = {}
+ res = super(account_analytic_account, self)._trigger_project_creation(cr, uid, vals, context=context)
+ return res or (vals.get('use_phases') and not 'project_creation_in_progress' in context)
-account_analytic_account()
class project_task(osv.osv):
_inherit = "project.task"
_columns = {
'phase_id': fields.many2one('project.phase', 'Project Phase', domain="[('project_id', '=', project_id)]"),
}
-project_task()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_long_term/wizard/project_compute_phases.py b/addons/project_long_term/wizard/project_compute_phases.py
index c9aa7eb3573..5ac89e2def2 100644
--- a/addons/project_long_term/wizard/project_compute_phases.py
+++ b/addons/project_long_term/wizard/project_compute_phases.py
@@ -71,6 +71,5 @@ class project_compute_phases(osv.osv_memory):
result['context'] = {"search_default_project_id":project_id, "default_project_id":project_id, "search_default_current": 1}
return result
-project_compute_phases()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_long_term/wizard/project_compute_tasks.py b/addons/project_long_term/wizard/project_compute_tasks.py
index f21dab8a6d2..d442aee7790 100644
--- a/addons/project_long_term/wizard/project_compute_tasks.py
+++ b/addons/project_long_term/wizard/project_compute_tasks.py
@@ -59,6 +59,5 @@ class project_compute_tasks(osv.osv_memory):
result['target'] = 'current'
return result
-project_compute_tasks()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_mrp/project_mrp.py b/addons/project_mrp/project_mrp.py
index a6f0495a962..bb25b4aae24 100644
--- a/addons/project_mrp/project_mrp.py
+++ b/addons/project_mrp/project_mrp.py
@@ -45,14 +45,12 @@ class project_task(osv.osv):
res = super(project_task, self).do_cancel(cr, uid, ids, *args, **kwargs)
self._validate_subflows(cr, uid, ids)
return res
-project_task()
class product_product(osv.osv):
_inherit = "product.product"
_columns = {
'project_id': fields.many2one('project.project', 'Project', ondelete='set null',)
}
-product_product()
class sale_order(osv.osv):
_inherit ='sale.order'
@@ -108,5 +106,4 @@ class sale_order(osv.osv):
'picked_rate': fields.function(_picked_rate, method=True, string='Picked', type='float'),
}
-sale_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_mrp/project_procurement.py b/addons/project_mrp/project_procurement.py
index 79228fe3285..f4b4a28db46 100644
--- a/addons/project_mrp/project_procurement.py
+++ b/addons/project_mrp/project_procurement.py
@@ -94,6 +94,5 @@ class procurement_order(osv.osv):
if procurement.sale_line_id and procurement.sale_line_id.order_id:
procurement.sale_line_id.order_id.message_post(body=body)
-procurement_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_mrp/test/project_task_procurement.yml b/addons/project_mrp/test/project_task_procurement.yml
index 8854ce20c80..967461ca30a 100644
--- a/addons/project_mrp/test/project_task_procurement.yml
+++ b/addons/project_mrp/test/project_task_procurement.yml
@@ -27,7 +27,7 @@
assert (not project and not account) or project.analytic_account_id == account, "Project does not correspond."
planned_hours = self._convert_qty_company_hours(cr, uid, procurement, context=context)
assert task.planned_hours == planned_hours, 'Planned Hours do not correspond.'
- assert datetime.strptime(task.date_deadline, '%Y-%m-%d') == datetime.strptime(procurement.date_planned, '%Y-%m-%d %H:%M:%S'), 'Deadline does not correspond.'
+ assert datetime.strptime(task.date_deadline, '%Y-%m-%d') == datetime.strptime(procurement.date_planned[:10], '%Y-%m-%d'), 'Deadline does not correspond.'
if procurement.product_id.product_manager:
assert task.user_id.id == procurement.product_id.product_manager.id, 'Allocated Person does not correspond with Service Product Manager.'
-
diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py
index 6c2b2b0e13b..ffee600f5a7 100644
--- a/addons/project_timesheet/project_timesheet.py
+++ b/addons/project_timesheet/project_timesheet.py
@@ -69,7 +69,6 @@ class project_project(osv.osv):
result['help'] = help
return result
-project_project()
class project_work(osv.osv):
_inherit = "project.task.work"
@@ -218,7 +217,6 @@ class project_work(osv.osv):
'hr_analytic_timesheet_id':fields.many2one('hr.analytic.timesheet','Related Timeline Id', ondelete='set null'),
}
-project_work()
class task(osv.osv):
_inherit = "project.task"
@@ -254,7 +252,6 @@ class task(osv.osv):
hr_anlytic_timesheet.write(cr, uid, [line_id], vals_line, {})
return super(task,self).write(cr, uid, ids, vals, context)
-task()
class res_partner(osv.osv):
_inherit = 'res.partner'
@@ -266,7 +263,6 @@ class res_partner(osv.osv):
return super(res_partner,self).unlink(cursor, user, ids,
context=context)
-res_partner()
class account_analytic_line(osv.osv):
_inherit = "account.analytic.line"
@@ -293,6 +289,5 @@ class account_analytic_line(osv.osv):
raise osv.except_osv(_('Invalid Analytic Account !'), _('You cannot select a Analytic Account which is in Close or Cancelled state.'))
return res
-account_analytic_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_timesheet/report/task_report.py b/addons/project_timesheet/report/task_report.py
index c4945e942f6..3411a73a239 100644
--- a/addons/project_timesheet/report/task_report.py
+++ b/addons/project_timesheet/report/task_report.py
@@ -79,6 +79,5 @@ class report_timesheet_task_user(osv.osv):
to_char(to_date(months.name, 'YYYY/MM/DD'),'MM')
) """)
-report_timesheet_task_user()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/purchase/company.py b/addons/purchase/company.py
index 275f5ea200d..cc98c200458 100644
--- a/addons/purchase/company.py
+++ b/addons/purchase/company.py
@@ -24,13 +24,16 @@ from openerp.osv import osv,fields
class company(osv.osv):
_inherit = 'res.company'
_columns = {
- 'po_lead': fields.float('Purchase Lead Time', required=True,
- help="This is the leads/security time for each purchase order."),
+ 'po_lead': fields.float(
+ 'Purchase Lead Time', required=True,
+ help="Margin of error for supplier lead times. When the system"\
+ "generates Purchase Orders for procuring products,"\
+ "they will be scheduled that many days earlier "\
+ "to cope with unexpected supplier delays."),
}
_defaults = {
'po_lead': lambda *a: 1.0,
}
-company()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/purchase/partner.py b/addons/purchase/partner.py
index 56eaf288fe6..5e5af0815e3 100644
--- a/addons/purchase/partner.py
+++ b/addons/purchase/partner.py
@@ -43,6 +43,9 @@ class res_partner(osv.osv):
super(res_partner, self).copy(cr, uid, id, default=default, context=context)
+ def _commercial_fields(self, cr, uid, context=None):
+ return super(res_partner, self)._commercial_fields(cr, uid, context=context) + ['property_product_pricelist_purchase']
+
_columns = {
'property_product_pricelist_purchase': fields.property(
'product.pricelist',
@@ -55,7 +58,6 @@ class res_partner(osv.osv):
'purchase_order_count': fields.function(_purchase_order_count, string='# of Purchase Order', type='integer'),
'purchase_order_ids': fields.one2many('purchase.order','partner_id','Purchase Order')
}
-res_partner()
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index 6258a18e399..26e34048b40 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -20,6 +20,8 @@
##############################################################################
import time
+import pytz
+from openerp import SUPERUSER_ID
from datetime import datetime
from dateutil.relativedelta import relativedelta
from operator import attrgetter
@@ -371,7 +373,7 @@ class purchase_order(osv.osv):
pick_ids += [picking.id for picking in po.picking_ids]
action_model, action_id = tuple(mod_obj.get_object_reference(cr, uid, 'stock', 'action_picking_tree4'))
- action = self.pool.get(action_model).read(cr, uid, action_id, context=context)
+ action = self.pool[action_model].read(cr, uid, action_id, context=context)
ctx = eval(action['context'])
ctx.update({
'search_default_purchase_id': ids[0]
@@ -426,6 +428,7 @@ class purchase_order(osv.osv):
'default_composition_mode': 'comment',
})
return {
+ 'name': _('Compose Email'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
@@ -591,11 +594,34 @@ class purchase_order(osv.osv):
self.signal_purchase_cancel(cr, uid, ids)
return True
+ def date_to_datetime(self, cr, uid, userdate, context=None):
+ """ Convert date values expressed in user's timezone to
+ server-side UTC timestamp, assuming a default arbitrary
+ time of 12:00 AM - because a time is needed.
+
+ :param str userdate: date string in in user time zone
+ :return: UTC datetime string for server-side use
+ """
+ # TODO: move to fields.datetime in server after 7.0
+ user_date = datetime.strptime(userdate, DEFAULT_SERVER_DATE_FORMAT)
+ if context and context.get('tz'):
+ tz_name = context['tz']
+ else:
+ tz_name = self.pool.get('res.users').read(cr, SUPERUSER_ID, uid, ['tz'])['tz']
+ if tz_name:
+ utc = pytz.timezone('UTC')
+ context_tz = pytz.timezone(tz_name)
+ user_datetime = user_date + relativedelta(hours=12.0)
+ local_timestamp = context_tz.localize(user_datetime, is_dst=False)
+ user_datetime = local_timestamp.astimezone(utc)
+ return user_datetime.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
+ return user_date.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
+
def _prepare_order_picking(self, cr, uid, order, context=None):
return {
'name': self.pool.get('ir.sequence').get(cr, uid, 'stock.picking.in'),
'origin': order.name + ((order.origin and (':' + order.origin)) or ''),
- 'date': order.date_order,
+ 'date': self.date_to_datetime(cr, uid, order.date_order, context),
'partner_id': order.dest_address_id.id or order.partner_id.id,
'invoice_state': '2binvoiced' if order.invoice_method == 'picking' else 'none',
'type': 'in',
@@ -613,8 +639,8 @@ class purchase_order(osv.osv):
'product_uos_qty': order_line.product_qty,
'product_uom': order_line.product_uom.id,
'product_uos': order_line.product_uom.id,
- 'date': order_line.date_planned,
- 'date_expected': order_line.date_planned,
+ 'date': self.date_to_datetime(cr, uid, order.date_order, context),
+ 'date_expected': self.date_to_datetime(cr, uid, order.date_order, context),
'location_id': order.partner_id.property_stock_supplier.id,
'location_dest_id': order.location_id.id,
'picking_id': picking_id,
@@ -989,7 +1015,6 @@ class purchase_order_line(osv.osv):
self.write(cr, uid, ids, {'state': 'confirmed'}, context=context)
return True
-purchase_order_line()
class procurement_order(osv.osv):
_inherit = 'procurement.order'
diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml
index 056a06f0750..4432d2b3200 100644
--- a/addons/purchase/purchase_view.xml
+++ b/addons/purchase/purchase_view.xml
@@ -270,7 +270,7 @@
<filter icon="terp-emblem-important" name="exception" string="Exception" domain="[('state','in',('except_invoice','except_picking'))]" help="Purchase order which are in the exception state"/>
<separator/>
<filter icon="terp-gtk-go-back-rtl" name="not_invoiced" string="Not Invoiced" domain="[('invoice_ids','=', False)]" help="Purchase orders that include lines not invoiced."/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/>
<field name="product_id"/>
<field name="create_uid"/>
<group expand="0" string="Group By...">
@@ -297,7 +297,7 @@
<filter icon="terp-emblem-important" name="exception" string="Exception" domain="[('state','in',('except_invoice','except_picking'))]" help="Purchase orders which are in exception state"/>
<separator/>
<filter icon="terp-gtk-go-back-rtl" name="not_invoiced" string="Not Invoiced" domain="[('invoice_ids','=', False)]" help="Purchase orders that include lines not invoiced."/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/>
<field name="product_id"/>
<field name="create_uid"/>
<group expand="0" string="Group By...">
@@ -335,7 +335,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.order</field>
<field name="context">{}</field>
- <field name="domain">[('state','in',('draft','sent','cancel'))]</field>
+ <field name="domain">[('state','in',('draft','sent','cancel', 'confirmed'))]</field>
<field name="view_mode">tree,form,graph,calendar</field>
<field name="search_view_id" ref="view_purchase_order_filter"/>
<field name="help" type="html">
@@ -481,7 +481,7 @@
<search string="Search Purchase Order">
<field name="order_id"/>
<field name="product_id"/>
- <field name="partner_id" string="Supplier"/>
+ <field name="partner_id" string="Supplier" filter_domain="[('partner_id', 'child_of', self)]"/>
<group expand="0" string="Group By...">
<filter string="Supplier" icon="terp-partner" domain="[]" context="{'group_by' : 'partner_id'}" />
<filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by' : 'product_id'}" />
diff --git a/addons/purchase/report/purchase_report.py b/addons/purchase/report/purchase_report.py
index 1855ed173ca..5af74b23495 100644
--- a/addons/purchase/report/purchase_report.py
+++ b/addons/purchase/report/purchase_report.py
@@ -136,7 +136,6 @@ class purchase_report(osv.osv):
u2.factor
)
""")
-purchase_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/purchase/res_config.py b/addons/purchase/res_config.py
index b773c57adb1..f5f2dfcdda5 100644
--- a/addons/purchase/res_config.py
+++ b/addons/purchase/res_config.py
@@ -65,6 +65,11 @@ Example: Product: this product is deprecated, do not purchase more than 5.
'default_invoice_method': 'manual',
}
+ def onchange_purchase_analytic_plans(self, cr, uid, ids, module_purchase_analytic_plans, context=None):
+ """ change group_analytic_account_for_purchases following module_purchase_analytic_plans """
+ if not module_purchase_analytic_plans:
+ return {}
+ return {'value': {'group_analytic_account_for_purchases': module_purchase_analytic_plans}}
@@ -81,6 +86,8 @@ class account_config_settings(osv.osv_memory):
def onchange_purchase_analytic_plans(self, cr, uid, ids, module_purchase_analytic_plans, context=None):
""" change group_analytic_account_for_purchases following module_purchase_analytic_plans """
+ if not module_purchase_analytic_plans:
+ return {}
return {'value': {'group_analytic_account_for_purchases': module_purchase_analytic_plans}}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/purchase/res_config_view.xml b/addons/purchase/res_config_view.xml
index 7f1cfc64f39..276dc892392 100644
--- a/addons/purchase/res_config_view.xml
+++ b/addons/purchase/res_config_view.xml
@@ -67,7 +67,7 @@
<label for="module_purchase_requisition"/>
</div>
<div>
- <field name="module_purchase_analytic_plans" class="oe_inline"/>
+ <field name="module_purchase_analytic_plans" on_change="onchange_purchase_analytic_plans(module_purchase_analytic_plans, context)" class="oe_inline"/>
<label for="module_purchase_analytic_plans"/>
</div>
<div>
@@ -109,7 +109,7 @@
<label for="group_analytic_account_for_purchases"/>
</div>
<div>
- <field name="module_purchase_analytic_plans" on_change="onchange_purchase_analytic_plans(module_purchase_analytic_plans)" class="oe_inline"/>
+ <field name="module_purchase_analytic_plans" on_change="onchange_purchase_analytic_plans(module_purchase_analytic_plans, context)" class="oe_inline"/>
<label for="module_purchase_analytic_plans"/>
</div>
</xpath>
diff --git a/addons/purchase/stock.py b/addons/purchase/stock.py
index 60b439a2097..e64c12a2359 100644
--- a/addons/purchase/stock.py
+++ b/addons/purchase/stock.py
@@ -29,7 +29,6 @@ class stock_move(osv.osv):
readonly=True),
}
-stock_move()
#
# Inherit of picking to add the link to the PO
diff --git a/addons/purchase/test/ui/print_report.yml b/addons/purchase/test/ui/print_report.yml
index c5a9448e497..94cf49655b6 100644
--- a/addons/purchase/test/ui/print_report.yml
+++ b/addons/purchase/test/ui/print_report.yml
@@ -3,8 +3,9 @@
-
!python {model: purchase.order}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.purchase.quotation').create(cr, uid, [ref('purchase.purchase_order_1'),ref('purchase.purchase_order_2')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('purchase.purchase_order_1'), ref('purchase.purchase_order_2')], 'purchase.quotation', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'purchase-request_quotation'+format), 'wb+').write(data)
-
diff --git a/addons/purchase/wizard/purchase_line_invoice.py b/addons/purchase/wizard/purchase_line_invoice.py
index 12dbf4a09f6..f97d82a8456 100644
--- a/addons/purchase/wizard/purchase_line_invoice.py
+++ b/addons/purchase/wizard/purchase_line_invoice.py
@@ -142,7 +142,6 @@ class purchase_line_invoice(osv.osv_memory):
'context': "{'type':'in_invoice', 'journal_type': 'purchase'}",
'type': 'ir.actions.act_window'
}
-purchase_line_invoice()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/purchase/wizard/purchase_order_group.py b/addons/purchase/wizard/purchase_order_group.py
index 57875bc6acb..243f27efea4 100644
--- a/addons/purchase/wizard/purchase_order_group.py
+++ b/addons/purchase/wizard/purchase_order_group.py
@@ -21,7 +21,6 @@
import time
from openerp.osv import fields, osv
-from openerp.osv.orm import browse_record, browse_null
from openerp.tools.translate import _
class purchase_order_group(osv.osv_memory):
@@ -84,6 +83,5 @@ class purchase_order_group(osv.osv_memory):
'search_view_id': id['res_id']
}
-purchase_order_group()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/purchase_analytic_plans/purchase_analytic_plans.py b/addons/purchase_analytic_plans/purchase_analytic_plans.py
index c80beddd20f..a654de83253 100644
--- a/addons/purchase_analytic_plans/purchase_analytic_plans.py
+++ b/addons/purchase_analytic_plans/purchase_analytic_plans.py
@@ -29,7 +29,6 @@ class purchase_order_line(osv.osv):
'analytics_id':fields.many2one('account.analytic.plan.instance','Analytic Distribution'),
}
-purchase_order_line()
class purchase_order(osv.osv):
_name='purchase.order'
@@ -40,6 +39,5 @@ class purchase_order(osv.osv):
res['analytics_id'] = order_line.analytics_id.id
return res
-purchase_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/purchase_analytic_plans/purchase_analytic_plans_view.xml b/addons/purchase_analytic_plans/purchase_analytic_plans_view.xml
index bcc67a2a215..d1db411f68c 100644
--- a/addons/purchase_analytic_plans/purchase_analytic_plans_view.xml
+++ b/addons/purchase_analytic_plans/purchase_analytic_plans_view.xml
@@ -38,5 +38,22 @@
</field>
</record>
+
+
+ <!-- Replace analytic_id with analytics_id in account.invoice.line -->
+
+
+
+ <record model="ir.ui.view" id="invoice_supplier_form_inherit">
+ <field name="name">account.invoice.supplier.form.inherit</field>
+ <field name="model">account.invoice</field>
+ <field name="inherit_id" ref="account.invoice_supplier_form"/>
+ <field name="priority">2</field>
+ <field name="arch" type="xml">
+ <field name="account_analytic_id" position="replace">
+ <field name="analytics_id" domain="[('plan_id','&lt;&gt;',False)]" context="{'journal_id':parent.journal_id}" groups="analytic.group_analytic_accounting"/>
+ </field>
+ </field>
+ </record>
</data>
</openerp>
diff --git a/addons/purchase_double_validation/i18n/cs.po b/addons/purchase_double_validation/i18n/cs.po
new file mode 100644
index 00000000000..70256f5adc4
--- /dev/null
+++ b/addons/purchase_double_validation/i18n/cs.po
@@ -0,0 +1,49 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-03-31 16:54+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: purchase_double_validation
+#: model:ir.model,name:purchase_double_validation.model_purchase_config_settings
+msgid "purchase.config.settings"
+msgstr ""
+
+#. module: purchase_double_validation
+#: view:purchase.order:0
+msgid "Purchase orders which are not approved yet."
+msgstr ""
+
+#. module: purchase_double_validation
+#: field:purchase.config.settings,limit_amount:0
+msgid "limit to require a second approval"
+msgstr ""
+
+#. module: purchase_double_validation
+#: view:board.board:0
+#: model:ir.actions.act_window,name:purchase_double_validation.purchase_waiting
+msgid "Purchase Orders Waiting Approval"
+msgstr ""
+
+#. module: purchase_double_validation
+#: view:purchase.order:0
+msgid "To Approve"
+msgstr ""
+
+#. module: purchase_double_validation
+#: help:purchase.config.settings,limit_amount:0
+msgid "Amount after which validation of purchase is required."
+msgstr ""
diff --git a/addons/purchase_double_validation/i18n/lt.po b/addons/purchase_double_validation/i18n/lt.po
new file mode 100644
index 00000000000..7205a152f84
--- /dev/null
+++ b/addons/purchase_double_validation/i18n/lt.po
@@ -0,0 +1,49 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-04-29 15:27+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: purchase_double_validation
+#: model:ir.model,name:purchase_double_validation.model_purchase_config_settings
+msgid "purchase.config.settings"
+msgstr ""
+
+#. module: purchase_double_validation
+#: view:purchase.order:0
+msgid "Purchase orders which are not approved yet."
+msgstr ""
+
+#. module: purchase_double_validation
+#: field:purchase.config.settings,limit_amount:0
+msgid "limit to require a second approval"
+msgstr ""
+
+#. module: purchase_double_validation
+#: view:board.board:0
+#: model:ir.actions.act_window,name:purchase_double_validation.purchase_waiting
+msgid "Purchase Orders Waiting Approval"
+msgstr ""
+
+#. module: purchase_double_validation
+#: view:purchase.order:0
+msgid "To Approve"
+msgstr ""
+
+#. module: purchase_double_validation
+#: help:purchase.config.settings,limit_amount:0
+msgid "Amount after which validation of purchase is required."
+msgstr ""
diff --git a/addons/purchase_requisition/i18n/cs.po b/addons/purchase_requisition/i18n/cs.po
new file mode 100644
index 00000000000..ab1ba503fe7
--- /dev/null
+++ b/addons/purchase_requisition/i18n/cs.po
@@ -0,0 +1,473 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-03-31 16:55+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Request a Quotation"
+msgstr ""
+
+#. module: purchase_requisition
+#: selection:purchase.requisition,exclusive:0
+msgid "Multiple Requisitions"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition.line,product_uom_id:0
+msgid "Product Unit of Measure"
+msgstr ""
+
+#. module: purchase_requisition
+#: model:ir.actions.act_window,help:purchase_requisition.action_purchase_requisition
+msgid ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Click to start a new purchase requisition process. \n"
+" </p><p>\n"
+" A purchase requisition is the step before a request for "
+"quotation.\n"
+" In a purchase requisition (or purchase tender), you can record "
+"the\n"
+" products you need to buy and trigger the creation of RfQs to\n"
+" suppliers. After the negotiation, once you have reviewed all "
+"the\n"
+" supplier's offers, you can validate some and cancel others.\n"
+" </p>\n"
+" "
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+#: field:purchase.requisition,user_id:0
+msgid "Responsible"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+#: field:purchase.requisition,state:0
+msgid "Status"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Send to Suppliers"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Group By..."
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+#: selection:purchase.requisition,state:0
+msgid "Purchase Done"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition,message_follower_ids:0
+msgid "Followers"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Purchase Requisition in negociation"
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+#: field:purchase.requisition.partner,partner_id:0
+msgid "Supplier"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+#: selection:purchase.requisition,state:0
+msgid "New"
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+msgid "Product Detail"
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+msgid "Qty"
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+msgid "Type"
+msgstr ""
+
+#. module: purchase_requisition
+#: model:ir.actions.act_window,name:purchase_requisition.action_purchase_requisition_partner
+#: model:ir.actions.report.xml,name:purchase_requisition.report_purchase_requisition
+#: model:ir.model,name:purchase_requisition.model_purchase_requisition
+#: model:ir.module.category,name:purchase_requisition.module_category_purchase_requisition
+#: field:product.product,purchase_requisition:0
+#: field:purchase.order,requisition_id:0
+#: view:purchase.requisition:0
+#: field:purchase.requisition.line,requisition_id:0
+#: view:purchase.requisition.partner:0
+msgid "Purchase Requisition"
+msgstr ""
+
+#. module: purchase_requisition
+#: model:ir.model,name:purchase_requisition.model_purchase_requisition_line
+msgid "Purchase Requisition Line"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.order:0
+msgid "Purchase Orders with requisition"
+msgstr ""
+
+#. module: purchase_requisition
+#: model:ir.model,name:purchase_requisition.model_product_product
+#: field:purchase.requisition.line,product_id:0
+msgid "Product"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Quotations"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Terms and Conditions"
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+#: field:purchase.requisition,description:0
+msgid "Description"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition,message_unread:0
+msgid "Unread Messages"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition,company_id:0
+#: field:purchase.requisition.line,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition.partner:0
+msgid "Create Quotation"
+msgstr ""
+
+#. module: purchase_requisition
+#: help:purchase.requisition,message_ids:0
+msgid "Messages and communication history"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Approved by Supplier"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition.partner:0
+msgid "or"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Reset to Draft"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Current Purchase Requisition"
+msgstr ""
+
+#. module: purchase_requisition
+#: model:res.groups,name:purchase_requisition.group_purchase_requisition_user
+msgid "User"
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+msgid "Order Reference"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition,message_is_follower:0
+msgid "Is a Follower"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition.line,product_qty:0
+msgid "Quantity"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Unassigned Requisition"
+msgstr ""
+
+#. module: purchase_requisition
+#: model:ir.actions.act_window,name:purchase_requisition.action_purchase_requisition
+#: model:ir.ui.menu,name:purchase_requisition.menu_purchase_requisition_pro_mgt
+msgid "Purchase Requisitions"
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+msgid "Quotation Detail"
+msgstr ""
+
+#. module: purchase_requisition
+#: code:addons/purchase_requisition/purchase_requisition.py:134
+#, python-format
+msgid ""
+"You have already one %s purchase order for this partner, you must cancel "
+"this purchase order to create a new quotation."
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "End Date"
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+#: field:purchase.requisition,name:0
+msgid "Requisition Reference"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition,line_ids:0
+msgid "Products to Purchase"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+#: selection:purchase.requisition,state:0
+msgid "Sent to Suppliers"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Search Purchase Requisition"
+msgstr ""
+
+#. module: purchase_requisition
+#: code:addons/purchase_requisition/wizard/purchase_requisition_partner.py:41
+#, python-format
+msgid "No Product in Tender."
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+msgid "Date Ordered"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition,message_ids:0
+msgid "Messages"
+msgstr ""
+
+#. module: purchase_requisition
+#: help:purchase.requisition,exclusive:0
+msgid ""
+"Purchase Requisition (exclusive): On the confirmation of a purchase order, "
+"it cancels the remaining purchase order.\n"
+"Purchase Requisition(Multiple): It allows to have multiple purchase "
+"orders.On confirmation of a purchase order it does not cancel the remaining "
+"orders"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Cancel Purchase Order"
+msgstr ""
+
+#. module: purchase_requisition
+#: model:ir.model,name:purchase_requisition.model_purchase_order
+#: view:purchase.requisition:0
+msgid "Purchase Order"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition,origin:0
+msgid "Source Document"
+msgstr ""
+
+#. module: purchase_requisition
+#: code:addons/purchase_requisition/wizard/purchase_requisition_partner.py:41
+#, python-format
+msgid "Error!"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition,exclusive:0
+msgid "Requisition Type"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "New Purchase Requisition"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Products"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Order Date"
+msgstr ""
+
+#. module: purchase_requisition
+#: selection:purchase.requisition,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: purchase_requisition
+#: model:ir.model,name:purchase_requisition.model_purchase_requisition_partner
+msgid "Purchase Requisition Partner"
+msgstr ""
+
+#. module: purchase_requisition
+#: help:purchase.requisition,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+msgid "Purchase for Requisitions"
+msgstr ""
+
+#. module: purchase_requisition
+#: model:ir.actions.act_window,name:purchase_requisition.act_res_partner_2_purchase_order
+msgid "Purchase orders"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition,date_end:0
+msgid "Requisition Deadline"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition,message_summary:0
+msgid "Summary"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Reference"
+msgstr ""
+
+#. module: purchase_requisition
+#: model:ir.model,name:purchase_requisition.model_procurement_order
+msgid "Procurement"
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+#: view:purchase.requisition:0
+msgid "Source"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition,warehouse_id:0
+msgid "Warehouse"
+msgstr ""
+
+#. module: purchase_requisition
+#: field:procurement.order,requisition_id:0
+msgid "Latest Requisition"
+msgstr ""
+
+#. module: purchase_requisition
+#: model:res.groups,name:purchase_requisition.group_purchase_requisition_manager
+msgid "Manager"
+msgstr ""
+
+#. module: purchase_requisition
+#: selection:purchase.requisition,exclusive:0
+msgid "Purchase Requisition (exclusive)"
+msgstr ""
+
+#. module: purchase_requisition
+#: help:purchase.requisition,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+msgid "Product UoM"
+msgstr ""
+
+#. module: purchase_requisition
+#: code:addons/purchase_requisition/purchase_requisition.py:134
+#, python-format
+msgid "Warning!"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Confirm Purchase Order"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition.partner:0
+msgid "Cancel"
+msgstr ""
+
+#. module: purchase_requisition
+#: report:purchase.requisition:0
+#: field:purchase.requisition,date_start:0
+msgid "Requisition Date"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Start Date"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.requisition:0
+msgid "Unassigned"
+msgstr ""
+
+#. module: purchase_requisition
+#: view:purchase.order:0
+msgid "Requisition"
+msgstr ""
+
+#. module: purchase_requisition
+#: help:product.product,purchase_requisition:0
+msgid ""
+"Check this box to generates purchase requisition instead of generating "
+"requests for quotation from procurement."
+msgstr ""
+
+#. module: purchase_requisition
+#: field:purchase.requisition,purchase_ids:0
+msgid "Purchase Orders"
+msgstr ""
diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py
index b213f958736..c5d32136a7a 100644
--- a/addons/purchase_requisition/purchase_requisition.py
+++ b/addons/purchase_requisition/purchase_requisition.py
@@ -194,7 +194,6 @@ class purchase_requisition_line(osv.osv):
_defaults = {
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'purchase.requisition.line', context=c),
}
-purchase_requisition_line()
class purchase_order(osv.osv):
_inherit = "purchase.order"
@@ -216,7 +215,6 @@ class purchase_order(osv.osv):
po.requisition_id.tender_done(context=context)
return res
-purchase_order()
class product_product(osv.osv):
_inherit = 'product.product'
@@ -228,7 +226,6 @@ class product_product(osv.osv):
'purchase_requisition': False
}
-product_product()
class procurement_order(osv.osv):
@@ -261,6 +258,5 @@ class procurement_order(osv.osv):
res = super(procurement_order, self).make_po(cr, uid, ids, context=context)
return res
-procurement_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/purchase_requisition/test/purchase_requisition.yml b/addons/purchase_requisition/test/purchase_requisition.yml
index bb6daf9eec1..808b2eb5350 100644
--- a/addons/purchase_requisition/test/purchase_requisition.yml
+++ b/addons/purchase_requisition/test/purchase_requisition.yml
@@ -84,7 +84,8 @@
-
!python {model: purchase.requisition}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.purchase.requisition').create(cr, uid, [ref('purchase_requisition.requisition1')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('purchase_requisition.requisition1')], 'purchase.requisition', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'purchase_requisition-purchase_requisition_report.'+format), 'wb+').write(data)
diff --git a/addons/purchase_requisition/wizard/purchase_requisition_partner.py b/addons/purchase_requisition/wizard/purchase_requisition_partner.py
index 58a72556b22..0fee8745931 100644
--- a/addons/purchase_requisition/wizard/purchase_requisition_partner.py
+++ b/addons/purchase_requisition/wizard/purchase_requisition_partner.py
@@ -47,7 +47,6 @@ class purchase_requisition_partner(osv.osv_memory):
self.pool.get('purchase.requisition').make_purchase_order(cr, uid, active_ids, data.partner_id.id, context=context)
return {'type': 'ir.actions.act_window_close'}
-purchase_requisition_partner()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/report_intrastat/report_intrastat.py b/addons/report_intrastat/report_intrastat.py
index 2d11151cb5b..003aaec8447 100644
--- a/addons/report_intrastat/report_intrastat.py
+++ b/addons/report_intrastat/report_intrastat.py
@@ -34,7 +34,6 @@ class res_country(osv.osv):
'intrastat': lambda *a: False,
}
-res_country()
class report_intrastat_code(osv.osv):
@@ -45,7 +44,6 @@ class report_intrastat_code(osv.osv):
'description': fields.char('Description', size=64),
}
-report_intrastat_code()
class product_template(osv.osv):
@@ -55,7 +53,6 @@ class product_template(osv.osv):
'intrastat_id': fields.many2one('report.intrastat.code', 'Intrastat code'),
}
-product_template()
class report_intrastat(osv.osv):
_name = "report.intrastat"
@@ -122,6 +119,5 @@ class report_intrastat(osv.osv):
group by to_char(inv.create_date, 'YYYY'), to_char(inv.create_date, 'MM'),intrastat.id,inv.type,pt.intrastat_id, inv_country.code,inv.number, inv.currency_id
)""")
-report_intrastat()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/report_intrastat/test/report_intrastat_report.yml b/addons/report_intrastat/test/report_intrastat_report.yml
index e51bfbbe748..687f605b901 100644
--- a/addons/report_intrastat/test/report_intrastat_report.yml
+++ b/addons/report_intrastat/test/report_intrastat_report.yml
@@ -14,7 +14,8 @@
-
!python {model: account.invoice}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.account.invoice.intrastat').create(cr, uid, [ref('test_invoice_1')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('test_invoice_1')], 'account.invoice.intrastat', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'report_intrastat-intrastat_report.'+format), 'wb+').write(data)
diff --git a/addons/report_webkit/header.py b/addons/report_webkit/header.py
index 71deb57c370..9713efc5382 100644
--- a/addons/report_webkit/header.py
+++ b/addons/report_webkit/header.py
@@ -87,7 +87,6 @@ class HeaderHTML(osv.osv):
help="Select Proper Paper size"
)
}
-HeaderHTML()
class HeaderImage(osv.osv):
"""Logo allows you to define multiple logo per company"""
@@ -98,6 +97,5 @@ class HeaderImage(osv.osv):
'name' : fields.char('Name', size=128, required =True, help="Name of Image"),
'type' : fields.char('Type', size=32, required =True, help="Image type(png,gif,jpeg)")
}
-HeaderImage()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/report_webkit/i18n/cs.po b/addons/report_webkit/i18n/cs.po
new file mode 100644
index 00000000000..bacda6d4bdf
--- /dev/null
+++ b/addons/report_webkit/i18n/cs.po
@@ -0,0 +1,517 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-03-31 16:55+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-01 05:06+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: report_webkit
+#: view:ir.actions.report.xml:0
+msgid "Webkit Template (used if Report File is not found)"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "Tabloid 29 279.4 x 431.8 mm"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "Ledger 28 431.8 x 279.4 mm"
+msgstr ""
+
+#. module: report_webkit
+#: code:addons/report_webkit/webkit_report.py:233
+#, python-format
+msgid "No header defined for this Webkit report!"
+msgstr ""
+
+#. module: report_webkit
+#: help:ir.header_img,type:0
+msgid "Image type(png,gif,jpeg)"
+msgstr ""
+
+#. module: report_webkit
+#: help:ir.actions.report.xml,precise_mode:0
+msgid ""
+"This mode allow more precise element "
+" position as each object is printed on a separate HTML. "
+" but memory and disk "
+"usage is wider"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "Executive 4 7.5 x 10 inches, 190.5 x 254 mm"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_img,company_id:0
+#: field:ir.header_webkit,company_id:0
+msgid "Company"
+msgstr ""
+
+#. module: report_webkit
+#: code:addons/report_webkit/webkit_report.py:234
+#, python-format
+msgid "Please set a header in company settings."
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "DLE 26 110 x 220 mm"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "B7 21 88 x 125 mm"
+msgstr ""
+
+#. module: report_webkit
+#: view:res.company:0
+msgid "Headers"
+msgstr ""
+
+#. module: report_webkit
+#: help:ir.header_img,name:0
+msgid "Name of Image"
+msgstr ""
+
+#. module: report_webkit
+#: model:ir.actions.act_window,name:report_webkit.action_header_webkit
+#: model:ir.ui.menu,name:report_webkit.menu_header_webkit
+msgid "Webkit Headers/Footers"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "Legal 3 8.5 x 14 inches, 215.9 x 355.6 mm"
+msgstr ""
+
+#. module: report_webkit
+#: model:ir.model,name:report_webkit.model_ir_header_webkit
+msgid "ir.header_webkit"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "A4 0 210 x 297 mm, 8.26 x 11.69 inches"
+msgstr ""
+
+#. module: report_webkit
+#: code:addons/report_webkit/webkit_report.py:176
+#, python-format
+msgid "Webkit error"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "B2 17 500 x 707 mm"
+msgstr ""
+
+#. module: report_webkit
+#: code:addons/report_webkit/webkit_report.py:260
+#: code:addons/report_webkit/webkit_report.py:271
+#: code:addons/report_webkit/webkit_report.py:280
+#: code:addons/report_webkit/webkit_report.py:293
+#: code:addons/report_webkit/webkit_report.py:304
+#, python-format
+msgid "Webkit render!"
+msgstr ""
+
+#. module: report_webkit
+#: model:ir.model,name:report_webkit.model_ir_header_img
+msgid "ir.header_img"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.actions.report.xml,precise_mode:0
+msgid "Precise Mode"
+msgstr ""
+
+#. module: report_webkit
+#: code:addons/report_webkit/webkit_report.py:96
+#, python-format
+msgid ""
+"Please install executable on your system (sudo apt-get install wkhtmltopdf) "
+"or download it from here: "
+"http://code.google.com/p/wkhtmltopdf/downloads/list and set the path in the "
+"ir.config_parameter with the webkit_path key.Minimal version is 0.9.9"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "A0 5 841 x 1189 mm"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "C5E 24 163 x 229 mm"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_img,type:0
+msgid "Type"
+msgstr ""
+
+#. module: report_webkit
+#: code:addons/report_webkit/wizard/report_webkit_actions.py:133
+#, python-format
+msgid "Client Actions Connections"
+msgstr ""
+
+#. module: report_webkit
+#: field:res.company,header_image:0
+msgid "Available Images"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_webkit,html:0
+msgid "webkit header"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "B1 15 707 x 1000 mm"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "A1 6 594 x 841 mm"
+msgstr ""
+
+#. module: report_webkit
+#: help:ir.actions.report.xml,webkit_header:0
+msgid "The header linked to the report"
+msgstr ""
+
+#. module: report_webkit
+#: code:addons/report_webkit/webkit_report.py:95
+#, python-format
+msgid "Wkhtmltopdf library path is not set"
+msgstr ""
+
+#. module: report_webkit
+#: view:ir.actions.report.xml:0
+#: view:res.company:0
+msgid "Webkit"
+msgstr ""
+
+#. module: report_webkit
+#: help:ir.header_webkit,format:0
+msgid "Select Proper Paper size"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "B5 1 176 x 250 mm, 6.93 x 9.84 inches"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "A7 11 74 x 105 mm"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "A6 10 105 x 148 mm"
+msgstr ""
+
+#. module: report_webkit
+#: help:ir.actions.report.xml,report_webkit_data:0
+msgid "This template will be used if the main report file is not found"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "Folio 27 210 x 330 mm"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_webkit,margin_top:0
+msgid "Top Margin (mm)"
+msgstr ""
+
+#. module: report_webkit
+#: view:report.webkit.actions:0
+msgid "_Ok"
+msgstr ""
+
+#. module: report_webkit
+#: help:report.webkit.actions,print_button:0
+msgid ""
+"Check this to add a Print action for this Report in the sidebar of the "
+"corresponding document types"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "B3 18 353 x 500 mm"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.actions.report.xml,webkit_header:0
+msgid "Webkit Header"
+msgstr ""
+
+#. module: report_webkit
+#: help:ir.actions.report.xml,webkit_debug:0
+msgid "Enable the webkit engine debugger"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_img,img:0
+msgid "Image"
+msgstr ""
+
+#. module: report_webkit
+#: view:ir.header_img:0
+msgid "Header Image"
+msgstr ""
+
+#. module: report_webkit
+#: field:res.company,header_webkit:0
+msgid "Available html"
+msgstr ""
+
+#. module: report_webkit
+#: help:report.webkit.actions,open_action:0
+msgid ""
+"Check this to view the newly added internal print action after creating it "
+"(technical view) "
+msgstr ""
+
+#. module: report_webkit
+#: view:res.company:0
+msgid "Images"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,orientation:0
+msgid "Portrait"
+msgstr ""
+
+#. module: report_webkit
+#: view:report.webkit.actions:0
+msgid "or"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,orientation:0
+msgid "Landscape"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "B8 22 62 x 88 mm"
+msgstr ""
+
+#. module: report_webkit
+#: code:addons/report_webkit/webkit_report.py:177
+#, python-format
+msgid "The command 'wkhtmltopdf' failed with error code = %s. Message: %s"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "A2 7 420 x 594 mm"
+msgstr ""
+
+#. module: report_webkit
+#: field:report.webkit.actions,print_button:0
+msgid "Add print button"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "A9 13 37 x 52 mm"
+msgstr ""
+
+#. module: report_webkit
+#: model:ir.model,name:report_webkit.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_webkit,margin_bottom:0
+msgid "Bottom Margin (mm)"
+msgstr ""
+
+#. module: report_webkit
+#: model:ir.model,name:report_webkit.model_report_webkit_actions
+msgid "Webkit Actions"
+msgstr ""
+
+#. module: report_webkit
+#: field:report.webkit.actions,open_action:0
+msgid "Open added action"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_webkit,margin_right:0
+msgid "Right Margin (mm)"
+msgstr ""
+
+#. module: report_webkit
+#: code:addons/report_webkit/webkit_report.py:228
+#, python-format
+msgid "Webkit report template not found!"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_webkit,orientation:0
+msgid "Orientation"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "B6 20 125 x 176 mm"
+msgstr ""
+
+#. module: report_webkit
+#: help:ir.header_webkit,html:0
+msgid "Set Webkit Report Header"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_webkit,format:0
+msgid "Paper size"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid ":B10 16 31 x 44 mm"
+msgstr ""
+
+#. module: report_webkit
+#: view:report.webkit.actions:0
+msgid "Cancel"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_webkit,css:0
+msgid "Header CSS"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "B4 19 250 x 353 mm"
+msgstr ""
+
+#. module: report_webkit
+#: model:ir.actions.act_window,name:report_webkit.action_header_img
+#: model:ir.ui.menu,name:report_webkit.menu_header_img
+msgid "Webkit Logos"
+msgstr ""
+
+#. module: report_webkit
+#: code:addons/report_webkit/webkit_report.py:172
+#, python-format
+msgid "No diagnosis message was provided"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "A3 8 297 x 420 mm"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.actions.report.xml,report_webkit_data:0
+msgid "Webkit Template"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_webkit,footer_html:0
+msgid "webkit footer"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.actions.report.xml,webkit_debug:0
+msgid "Webkit debug"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "Letter 2 8.5 x 11 inches, 215.9 x 279.4 mm"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "B0 14 1000 x 1414 mm"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_img,name:0
+#: field:ir.header_webkit,name:0
+msgid "Name"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "A5 9 148 x 210 mm"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "A8 12 52 x 74 mm"
+msgstr ""
+
+#. module: report_webkit
+#: model:ir.actions.act_window,name:report_webkit.wizard_ofdo_report_actions
+#: view:report.webkit.actions:0
+msgid "Add Print Buttons"
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "Comm10E 25 105 x 241 mm, U.S. Common 10 Envelope"
+msgstr ""
+
+#. module: report_webkit
+#: field:ir.header_webkit,margin_left:0
+msgid "Left Margin (mm)"
+msgstr ""
+
+#. module: report_webkit
+#: code:addons/report_webkit/webkit_report.py:228
+#, python-format
+msgid "Error!"
+msgstr ""
+
+#. module: report_webkit
+#: help:ir.header_webkit,footer_html:0
+msgid "Set Webkit Report Footer."
+msgstr ""
+
+#. module: report_webkit
+#: selection:ir.header_webkit,format:0
+msgid "B9 23 33 x 62 mm"
+msgstr ""
+
+#. module: report_webkit
+#: model:ir.model,name:report_webkit.model_ir_actions_report_xml
+msgid "ir.actions.report.xml"
+msgstr ""
+
+#. module: report_webkit
+#: code:addons/report_webkit/webkit_report.py:174
+#, python-format
+msgid "The following diagnosis message was provided:\n"
+msgstr ""
+
+#. module: report_webkit
+#: view:ir.header_webkit:0
+msgid "HTML Header"
+msgstr ""
diff --git a/addons/report_webkit/ir_report.py b/addons/report_webkit/ir_report.py
index 8b8f99b8ebf..4b64a54c420 100644
--- a/addons/report_webkit/ir_report.py
+++ b/addons/report_webkit/ir_report.py
@@ -29,113 +29,61 @@
#
##############################################################################
-from openerp.osv import fields, osv
-import openerp.report.interface
-from openerp.report.report_sxw import rml_parse
+import openerp
+from openerp.osv import fields, orm
from webkit_report import WebKitParser
-def register_report(name, model, tmpl_path, parser=rml_parse):
- """Register the report into the services"""
- name = 'report.%s' % name
- if name in openerp.report.interface.report_int._reports:
- service = openerp.report.interface.report_int._reports[name]
- if isinstance(service, WebKitParser):
- #already instantiated properly, skip it
- return
- if hasattr(service, 'parser'):
- parser = service.parser
- del openerp.report.interface.report_int._reports[name]
- WebKitParser(name, model, tmpl_path, parser=parser)
-
-
-class ReportXML(osv.osv):
-
- def __init__(self, pool, cr):
- super(ReportXML, self).__init__(pool, cr)
-
- def register_all(self,cursor):
- value = super(ReportXML, self).register_all(cursor)
- cursor.execute("SELECT * FROM ir_act_report_xml WHERE report_type = 'webkit'")
- records = cursor.dictfetchall()
- for record in records:
- register_report(record['report_name'], record['model'], record['report_rml'])
- return value
-
- def unlink(self, cursor, user, ids, context=None):
- """Delete report and unregister it"""
- trans_obj = self.pool.get('ir.translation')
- trans_ids = trans_obj.search(
- cursor,
- user,
- [('type', '=', 'report'), ('res_id', 'in', ids)]
- )
- trans_obj.unlink(cursor, user, trans_ids)
-
- # Warning: we cannot unregister the services at the moment
- # because they are shared across databases. Calling a deleted
- # report will fail so it's ok.
-
- res = super(ReportXML, self).unlink(
- cursor,
- user,
- ids,
- context
- )
- return res
-
- def create(self, cursor, user, vals, context=None):
- "Create report and register it"
- res = super(ReportXML, self).create(cursor, user, vals, context)
- if vals.get('report_type','') == 'webkit':
- # I really look forward to virtual functions :S
- register_report(
- vals['report_name'],
- vals['model'],
- vals.get('report_rml', False)
- )
- return res
-
- def write(self, cr, uid, ids, vals, context=None):
- "Edit report and manage it registration"
- if isinstance(ids, (int, long)):
- ids = [ids,]
- for rep in self.browse(cr, uid, ids, context=context):
- if rep.report_type != 'webkit':
- continue
- if vals.get('report_name', False) and \
- vals['report_name'] != rep.report_name:
- report_name = vals['report_name']
- else:
- report_name = rep.report_name
-
- register_report(
- report_name,
- vals.get('model', rep.model),
- vals.get('report_rml', rep.report_rml)
- )
- res = super(ReportXML, self).write(cr, uid, ids, vals, context)
- return res
-
- _name = 'ir.actions.report.xml'
+class ir_actions_report_xml(orm.Model):
_inherit = 'ir.actions.report.xml'
_columns = {
- 'webkit_header': fields.property(
- 'ir.header_webkit',
- type='many2one',
- relation='ir.header_webkit',
- string='Webkit Header',
- help="The header linked to the report",
- view_load=True,
- required=True
- ),
- 'webkit_debug' : fields.boolean('Webkit debug', help="Enable the webkit engine debugger"),
- 'report_webkit_data': fields.text('Webkit Template', help="This template will be used if the main report file is not found"),
- 'precise_mode':fields.boolean('Precise Mode', help='This mode allow more precise element \
- position as each object is printed on a separate HTML.\
- but memory and disk usage is wider')
+ 'webkit_header': fields.property('ir.header_webkit',
+ type='many2one', relation='ir.header_webkit',
+ string='Webkit Header', help="The header linked to the report",
+ view_load=True, required=True),
+ 'webkit_debug': fields.boolean('Webkit debug',
+ help="Enable the webkit engine debugger"),
+ 'report_webkit_data': fields.text('Webkit Template',
+ help="This template will be used if the main report file is not found"),
+ 'precise_mode': fields.boolean('Precise Mode',
+ help="This mode allow more precise element position as each object"
+ " is printed on a separate HTML but memory and disk usage are wider.")
}
-ReportXML()
+ def _lookup_report(self, cr, name):
+ """
+ Look up a report definition.
+ """
+ import operator
+ import os
+ opj = os.path.join
+
+ # First lookup in the deprecated place, because if the report definition
+ # has not been updated, it is more likely the correct definition is there.
+ # Only reports with custom parser specified in Python are still there.
+ if 'report.' + name in openerp.report.interface.report_int._reports:
+ new_report = openerp.report.interface.report_int._reports['report.' + name]
+ if not isinstance(new_report, WebKitParser):
+ new_report = None
+ else:
+ cr.execute("SELECT * FROM ir_act_report_xml WHERE report_name=%s and report_type=%s", (name, 'webkit'))
+ r = cr.dictfetchone()
+ if r:
+ if r['parser']:
+ parser = operator.attrgetter(r['parser'])(openerp.addons)
+ kwargs = { 'parser': parser }
+ else:
+ kwargs = {}
+
+ new_report = WebKitParser('report.'+r['report_name'],
+ r['model'], opj('addons',r['report_rml'] or '/'),
+ header=r['header'], register=False, **kwargs)
+ else:
+ new_report = None
+
+ if new_report:
+ return new_report
+ else:
+ return super(ir_actions_report_xml, self)._lookup_report(cr, name)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/report_webkit/webkit_report.py b/addons/report_webkit/webkit_report.py
index 65ce0b7f707..3d8e41c42ff 100644
--- a/addons/report_webkit/webkit_report.py
+++ b/addons/report_webkit/webkit_report.py
@@ -38,10 +38,10 @@ import tempfile
import time
import logging
-from openerp import netsvc
from report_helper import WebKitHelper
+import openerp
+from openerp.modules.module import get_module_resource
from openerp.report.report_sxw import *
-from openerp import addons
from openerp import tools
from openerp.tools.translate import _
from openerp.osv.osv import except_osv
@@ -116,12 +116,12 @@ class WebKitParser(report_sxw):
"""Custom class that use webkit to render HTML reports
Code partially taken from report openoffice. Thanks guys :)
"""
- def __init__(self, name, table, rml=False, parser=False,
- header=True, store=False):
+ def __init__(self, name, table, rml=False, parser=rml_parse,
+ header=True, store=False, register=True):
self.parser_instance = False
self.localcontext = {}
report_sxw.__init__(self, name, table, rml, parser,
- header, store)
+ header, store, register=register)
def get_lib(self, cursor, uid):
"""Return the lib wkhtml path"""
@@ -280,7 +280,7 @@ class WebKitParser(report_sxw):
template = False
if report_xml.report_file :
- path = addons.get_module_resource(*report_xml.report_file.split(os.path.sep))
+ path = get_module_resource(*report_xml.report_file.split(os.path.sep))
if path and os.path.exists(path) :
template = file(path).read()
if not template and report_xml.report_webkit_data :
@@ -296,7 +296,7 @@ class WebKitParser(report_sxw):
)
if not report_xml.header :
header = ''
- default_head = addons.get_module_resource('report_webkit', 'default_header.html')
+ default_head = get_module_resource('report_webkit', 'default_header.html')
with open(default_head,'r') as f:
header = f.read()
css = report_xml.webkit_header.css
diff --git a/addons/report_webkit/wizard/report_webkit_actions.py b/addons/report_webkit/wizard/report_webkit_actions.py
index 4080d0a4034..5f91d05d671 100644
--- a/addons/report_webkit/wizard/report_webkit_actions.py
+++ b/addons/report_webkit/wizard/report_webkit_actions.py
@@ -138,6 +138,5 @@ class report_webkit_actions(osv.osv_memory):
'type': 'ir.actions.act_window',
}
-report_webkit_actions()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/resource/resource.py b/addons/resource/resource.py
index 727ca93d7c9..944c90a3749 100644
--- a/addons/resource/resource.py
+++ b/addons/resource/resource.py
@@ -19,7 +19,9 @@
#
##############################################################################
+import pytz
from datetime import datetime, timedelta
+from dateutil import rrule
import math
from faces import *
from openerp.osv import fields, osv
@@ -212,47 +214,109 @@ class resource_calendar(osv.osv):
@return : Total number of working hours based dt_from and dt_end and
resource if supplied.
"""
- if not id:
- return 0.0
- dt_leave = self._get_leaves(cr, uid, id, resource)
- hours = 0.0
-
- current_hour = dt_from.hour
-
- while (dt_from <= dt_to):
- cr.execute("select hour_from,hour_to from resource_calendar_attendance where dayofweek='%s' and calendar_id=%s order by hour_from", (dt_from.weekday(),id))
- der = cr.fetchall()
- for (hour_from,hour_to) in der:
- if hours != 0.0:#For first time of the loop only,hours will be 0
- current_hour = hour_from
- leave_flag = False
- if (hour_to>=current_hour):
- dt_check = dt_from.strftime('%Y-%m-%d')
- for leave in dt_leave:
- if dt_check == leave:
- dt_check = datetime.strptime(dt_check, "%Y-%m-%d") + timedelta(days=1)
- leave_flag = True
-
- if leave_flag:
- break
- else:
- d1 = dt_from
- d2 = datetime(dt_from.year, dt_from.month, dt_from.day, int(math.floor(hour_to)), int((hour_to%1) * 60))
+ return self._interval_hours_get(cr, uid, id, dt_from, dt_to, resource_id=resource)
- if hours != 0.0:#For first time of the loop only,hours will be 0
- d1 = datetime(dt_from.year, dt_from.month, dt_from.day, int(math.floor(current_hour)), int((current_hour%1) * 60))
-
- if dt_from.day == dt_to.day:
- if hour_from <= dt_to.hour <= hour_to:
- d2 = dt_to
- dt_from = d2
- hours += (d2-d1).seconds
- dt_from = datetime(dt_from.year, dt_from.month, dt_from.day, int(math.floor(current_hour)), int((current_hour%1) * 60)) + timedelta(days=1)
- current_hour = 0.0
+ def _interval_hours_get(self, cr, uid, id, dt_from, dt_to, resource_id=False, timezone_from_uid=None, exclude_leaves=True, context=None):
+ """ Calculates the Total Working hours based on given start_date to
+ end_date, If resource id is supplied that it will consider the source
+ leaves also in calculating the hours.
- return (hours/3600)
+ @param dt_from : date start to calculate hours
+ @param dt_end : date end to calculate hours
+ @param resource_id: optional resource id, If given resource leave will be
+ considered.
+ @param timezone_from_uid: optional uid, if given we will considerer
+ working hours in that user timezone
+ @param exclude_leaves: optionnal, if set to True (default) we will exclude
+ resource leaves from working hours
+ @param context: current request context
+ @return : Total number of working hours based dt_from and dt_end and
+ resource if supplied.
+ """
+ utc_tz = pytz.timezone('UTC')
+ local_tz = utc_tz
+
+ if timezone_from_uid:
+ users_obj = self.pool.get('res.users')
+ user_timezone = users_obj.browse(cr, uid, timezone_from_uid, context=context).partner_id.tz
+ if user_timezone:
+ try:
+ local_tz = pytz.timezone(user_timezone)
+ except pytz.UnknownTimeZoneError:
+ pass # fallback to UTC as local timezone
+
+ def utc_to_local_zone(naive_datetime):
+ utc_dt = utc_tz.localize(naive_datetime, is_dst=False)
+ return utc_dt.astimezone(local_tz)
+
+ def float_time_convert(float_val):
+ factor = float_val < 0 and -1 or 1
+ val = abs(float_val)
+ return (factor * int(math.floor(val)), int(round((val % 1) * 60)))
+
+ # Get slots hours per day
+ # {day_of_week: [(8, 12), (13, 17), ...], ...}
+ hours_range_per_weekday = {}
+ if id:
+ cr.execute("select dayofweek, hour_from,hour_to from resource_calendar_attendance where calendar_id=%s order by hour_from", (id,))
+ for weekday, hour_from, hour_to in cr.fetchall():
+ weekday = int(weekday)
+ hours_range_per_weekday.setdefault(weekday, [])
+ hours_range_per_weekday[weekday].append((hour_from, hour_to))
+ else:
+ # considering default working hours (Monday -> Friday, 8 -> 12, 13 -> 17)
+ for weekday in range(5):
+ hours_range_per_weekday[weekday] = [(8, 12), (13, 17)]
+
+ ## Interval between dt_from - dt_to
+ ##
+ ## dt_from dt_to
+ ## =============|==================|============
+ ## [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ]
+ ##
+ ## [ : start of range
+ ## ] : end of range
+ ##
+ ## case 1: range end before interval start (skip)
+ ## case 2: range overlap interval start (fit start to internal)
+ ## case 3: range within interval
+ ## case 4: range overlap interval end (fit end to interval)
+ ## case 5: range start after interval end (skip)
+
+ interval_start = utc_to_local_zone(dt_from)
+ interval_end = utc_to_local_zone(dt_to)
+ hours_timedelta = timedelta()
+
+ # Get leaves for requested resource
+ dt_leaves = set([])
+ if exclude_leaves and id:
+ dt_leaves = set(self._get_leaves(cr, uid, id, resource=resource_id))
+
+ for day in rrule.rrule(rrule.DAILY, dtstart=interval_start,
+ until=interval_end+timedelta(days=1),
+ byweekday=hours_range_per_weekday.keys()):
+ if exclude_leaves and day.strftime('%Y-%m-%d') in dt_leaves:
+ # XXX: futher improve leave management to allow for partial day leave
+ continue
+ for (range_from, range_to) in hours_range_per_weekday.get(day.weekday(), []):
+ range_from_hour, range_from_min = float_time_convert(range_from)
+ range_to_hour, range_to_min = float_time_convert(range_to)
+ daytime_start = local_tz.localize(day.replace(hour=range_from_hour, minute=range_from_min, second=0, tzinfo=None))
+ daytime_end = local_tz.localize(day.replace(hour=range_to_hour, minute=range_to_min, second=0, tzinfo=None))
+
+ # case 1 & 5: time range out of interval
+ if daytime_end < interval_start or daytime_start > interval_end:
+ continue
+ # case 2 & 4: adjust start, end to fit within interval
+ daytime_start = max(daytime_start, interval_start)
+ daytime_end = min(daytime_end, interval_end)
+
+ # case 2+, 4+, 3
+ hours_timedelta += (daytime_end - daytime_start)
+
+ # return timedelta converted to hours
+ return (hours_timedelta.days * 24.0 + hours_timedelta.seconds / 3600.0)
-resource_calendar()
class resource_calendar_attendance(osv.osv):
_name = "resource.calendar.attendance"
@@ -272,7 +336,6 @@ class resource_calendar_attendance(osv.osv):
_defaults = {
'dayofweek' : '0'
}
-resource_calendar_attendance()
def hours_time_string(hours):
""" convert a number of hours (float) into a string with format '%H:%M' """
@@ -410,7 +473,6 @@ class resource_resource(osv.osv):
wktime_cal.append((non_working[:-1], time_range))
return wktime_cal
-resource_resource()
class resource_calendar_leaves(osv.osv):
_name = "resource.calendar.leaves"
@@ -443,6 +505,5 @@ class resource_calendar_leaves(osv.osv):
return {'value': result}
return {'value': {'calendar_id': []}}
-resource_calendar_leaves()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/resource/test/resource.yml b/addons/resource/test/resource.yml
index 5b7fa108101..28604518b7b 100644
--- a/addons/resource/test/resource.yml
+++ b/addons/resource/test/resource.yml
@@ -40,12 +40,13 @@
I check Actual working hours on resource 'Developer' from this week
-
!python {model: resource.calendar}: |
- from datetime import datetime, timedelta
+ from datetime import datetime
+ from dateutil.relativedelta import relativedelta
now = datetime.now()
- dt_from = now - timedelta(days=now.weekday())
- dt_to = dt_from+ timedelta(days=6)
+ dt_from = now - relativedelta(days=now.weekday(), hour=8, minute=30)
+ dt_to = dt_from + relativedelta(days=6, hour=17)
hours = self.interval_hours_get(cr, uid, ref('timesheet_group1'), dt_from, dt_to, resource=ref('resource_developer'))
- assert hours > 27 , 'Invalid Total Week working hour calculated'
+ assert hours > 27 , 'Invalid Total Week working hour calculated, got %r, expected > 27' % hours
-
Project Analysis work is of 20 hours which will start from Week start so i will calculate working schedule for resource Analyst for the same.
-
diff --git a/addons/sale/report/sale_report.py b/addons/sale/report/sale_report.py
index 070e9c4336f..80143379247 100644
--- a/addons/sale/report/sale_report.py
+++ b/addons/sale/report/sale_report.py
@@ -110,6 +110,5 @@ class sale_report(osv.osv):
s.project_id
)
""")
-sale_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale/res_config.py b/addons/sale/res_config.py
index 6548591da1e..bfbaa5f0a6f 100644
--- a/addons/sale/res_config.py
+++ b/addons/sale/res_config.py
@@ -58,7 +58,7 @@ Example: 10% for retailers, promotion of 5 EUR on this product, etc."""),
implied_group='product.group_product_variant',
help="""Allow to manage several variants per product. As an example, if you sell T-Shirts, for the same "Linux T-Shirt", you may have variants on sizes or colors; S, M, L, XL, XXL."""),
'module_warning': fields.boolean("Allow configuring alerts by customer or products",
- help="""Allow to configure notification on products and trigger them when a user wants to sale a given product or a given customer.
+ help="""Allow to configure notification on products and trigger them when a user wants to sell a given product or a given customer.
Example: Product: this product is deprecated, do not purchase more than 5.
Supplier: don't forget to ask for an express delivery."""),
'module_sale_margin': fields.boolean("Display margins on sales orders",
@@ -143,6 +143,8 @@ class account_config_settings(osv.osv_memory):
def onchange_sale_analytic_plans(self, cr, uid, ids, module_sale_analytic_plans, context=None):
""" change group_analytic_account_for_sales following module_sale_analytic_plans """
+ if not module_sale_analytic_plans:
+ return {}
return {'value': {'group_analytic_account_for_sales': module_sale_analytic_plans}}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale/res_partner_view.xml b/addons/sale/res_partner_view.xml
index 54a9813eea9..40ac119fdee 100644
--- a/addons/sale/res_partner_view.xml
+++ b/addons/sale/res_partner_view.xml
@@ -63,14 +63,34 @@
<field name="arch" type="xml">
<xpath expr="//label[@for='type']" position="attributes">
<attribute name="groups">sale.group_delivery_invoice_address</attribute>
- </xpath>
- <xpath expr="//label[@for='type']" position="attributes">
<attribute name="invisible">False</attribute>
</xpath>
<xpath expr="//div[@name='div_type']" position="attributes">
<attribute name="invisible">False</attribute>
+ <attribute name="groups">sale.group_delivery_invoice_address</attribute>
</xpath>
- <xpath expr="//div[@name='div_type']" position="attributes">
+ <xpath expr="//field[@name='use_parent_address']" position="attributes">
+ <attribute name="invisible">False</attribute>
+ <attribute name="groups">sale.group_delivery_invoice_address</attribute>
+ </xpath>
+ <xpath expr="//label[@for='use_parent_address']" position="attributes">
+ <attribute name="invisible">False</attribute>
+ <attribute name="groups">sale.group_delivery_invoice_address</attribute>
+ </xpath>
+ <xpath expr="//field[@name='child_ids']//field[@name='use_parent_address']" position="attributes">
+ <attribute name="invisible">False</attribute>
+ <attribute name="groups">sale.group_delivery_invoice_address</attribute>
+ </xpath>
+ <xpath expr="//field[@name='child_ids']//label[@for='use_parent_address']" position="attributes">
+ <attribute name="invisible">False</attribute>
+ <attribute name="groups">sale.group_delivery_invoice_address</attribute>
+ </xpath>
+ <xpath expr="//field[@name='child_ids']//div[@name='div_type']" position="attributes">
+ <attribute name="invisible">False</attribute>
+ <attribute name="groups">sale.group_delivery_invoice_address</attribute>
+ </xpath>
+ <xpath expr="//field[@name='child_ids']//label[@for='type']" position="attributes">
+ <attribute name="invisible">False</attribute>
<attribute name="groups">sale.group_delivery_invoice_address</attribute>
</xpath>
</field>
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 5ee22f3c569..210e4dd3be6 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -42,7 +42,6 @@ class sale_shop(osv.osv):
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'sale.shop', context=c),
}
-sale_shop()
class sale_order(osv.osv):
_name = "sale.order"
@@ -211,8 +210,7 @@ class sale_order(osv.osv):
'order_policy': fields.selection([
('manual', 'On Demand'),
], 'Create Invoice', required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},
- help="""This field controls how invoice and delivery operations are synchronized.
- - With 'Before Delivery', a draft invoice is created, and it must be paid before delivery."""),
+ help="""This field controls how invoice and delivery operations are synchronized."""),
'pricelist_id': fields.many2one('product.pricelist', 'Pricelist', required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Pricelist for current sales order."),
'currency_id': fields.related('pricelist_id', 'currency_id', type="many2one", relation="res.currency", string="Currency", readonly=True, required=True),
'project_id': fields.many2one('account.analytic.account', 'Contract / Analytic', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="The analytic account related to a sales order."),
@@ -322,10 +320,6 @@ class sale_order(osv.osv):
return {'value': {'partner_invoice_id': False, 'partner_shipping_id': False, 'payment_term': False, 'fiscal_position': False}}
part = self.pool.get('res.partner').browse(cr, uid, part, context=context)
- #if the chosen partner is not a company and has a parent company, use the parent to choose the delivery, the
- #invoicing addresses and all the fields related to the partner.
- if part.parent_id and not part.is_company:
- part = part.parent_id
addr = self.pool.get('res.partner').address_get(cr, uid, [part.id], ['delivery', 'invoice', 'contact'])
pricelist = part.property_product_pricelist and part.property_product_pricelist.id or False
payment_term = part.property_payment_term and part.property_payment_term.id or False
@@ -543,6 +537,9 @@ class sale_order(osv.osv):
invoice_ref += o.name + '|'
self.write(cr, uid, [o.id], {'state': 'progress'})
cr.execute('insert into sale_order_invoice_rel (order_id,invoice_id) values (%s,%s)', (o.id, res))
+ #remove last '|' in invoice_ref
+ if len(invoice_ref) >= 1:
+ invoice_ref = invoice_ref[:-1]
invoice.write(cr, uid, [res], {'origin': invoice_ref, 'name': invoice_ref})
else:
for order, il in val:
@@ -1023,4 +1020,16 @@ class account_invoice(osv.Model):
sale_order_obj.message_post(cr, uid, so_ids, body=_("Invoice paid"), context=context)
return res
+ def unlink(self, cr, uid, ids, context=None):
+ """ Overwrite unlink method of account invoice to send a trigger to the sale workflow upon invoice deletion """
+ invoice_ids = self.search(cr, uid, [('id', 'in', ids), ('state', 'in', ['draft', 'cancel'])], context=context)
+ #if we can't cancel all invoices, do nothing
+ if len(invoice_ids) == len(ids):
+ #Cancel invoice(s) first before deleting them so that if any sale order is associated with them
+ #it will trigger the workflow to put the sale order in an 'invoice exception' state
+ wf_service = netsvc.LocalService("workflow")
+ for id in ids:
+ wf_service.trg_validate(uid, 'account.invoice', id, 'invoice_cancel', cr)
+ return super(account_invoice, self).unlink(cr, uid, ids, context=context)
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index e3a393666b4..e24a6e45fe0 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -156,7 +156,7 @@
<field name="partner_id" on_change="onchange_partner_id(partner_id, context)" domain="[('customer','=',True)]" context="{'search_default_customer':1, 'show_address': 1}" options='{"always_reload": True}'/>
<field name="partner_invoice_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'invoice'}"/>
<field name="partner_shipping_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'delivery'}"/>
- <field name="project_id" context="{'partner_id':partner_id, 'default_pricelist_id':pricelist_id, 'default_name':name, 'default_type': 'contract'}" groups="sale.group_analytic_accounting" domain="[('type','in',['view','normal','contract'])]"/>
+ <field name="project_id" context="{'partner_id':partner_invoice_id, 'default_pricelist_id':pricelist_id, 'default_name':name, 'default_type': 'contract'}" groups="sale.group_analytic_accounting" domain="[('type','in',['view','normal','contract'])]"/>
</group>
<group>
<field name="date_order"/>
@@ -308,7 +308,7 @@
<filter icon="terp-dolar_ok!" string="Done" domain="[('state','=','done')]" help="Sales Order done"/>
<separator/>
<filter string="My Sales Orders" domain="[('user_id','=',uid)]" help="My Sales Orders" icon="terp-personal" name="my_sale_orders_filter"/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/>
<field name="user_id"/>
<field name="project_id"/>
<group expand="0" string="Group By...">
@@ -328,19 +328,23 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="search_view_id" ref="view_sales_order_filter"/>
- <field name="context">{'show_address': 1}</field>
- <field name="domain">[('state','not in',('draft','sent','cancel'))]</field>
+ <field name="context">{
+ 'search_default_my_sale_orders_filter': 1
+ }
+ </field>
+ <field name="domain">[('state', 'not in', ('draft', 'sent', 'cancel'))]</field>
<field name="help" type="html">
- <p class="oe_view_nocontent_create">
- Click to create a quotation that can be converted into a sales
- order.
- </p><p>
- OpenERP will help you efficiently handle the complete sales flow:
- quotation, sales order, delivery, invoicing and payment.
- </p>
+ <p class="oe_view_nocontent_create">
+ Click to create a quotation that can be converted into a sales
+ order.
+ </p><p>
+ OpenERP will help you efficiently handle the complete sales flow:
+ quotation, sales order, delivery, invoicing and payment.
+ </p>
</field>
</record>
- <menuitem action="action_orders" id="menu_sale_order" parent="base.menu_sales" sequence="5" groups="base.group_sale_salesman,base.group_sale_manager"/>
+
+ <menuitem action="action_orders" id="menu_sale_order" parent="base.menu_sales" sequence="6" groups="base.group_sale_salesman,base.group_sale_manager"/>
<record id="action_orders_exception" model="ir.actions.act_window">
<field name="name">Sales in Exception</field>
@@ -371,7 +375,7 @@
<field name="view_type">form</field>
<field name="view_id" ref="view_quotation_tree"/>
<field name="view_mode">tree,form,calendar,graph</field>
- <field name="context">{'show_address': 1}</field>
+ <field name="context">{'search_default_my_sale_orders_filter': 1}</field>
<field name="domain">[('state','in',('draft','sent','cancel'))]</field>
<field name="search_view_id" ref="view_sales_order_filter"/>
<field name="help" type="html">
@@ -390,8 +394,8 @@
</record>
<menuitem id="menu_sale_quotations"
- action="action_quotations" parent="base.menu_sales"
- sequence="4"/>
+ action="action_quotations" parent="base.menu_sales"
+ sequence="5"/>
<record id="action_order_tree" model="ir.actions.act_window">
<field name="name">Old Quotations</field>
@@ -472,7 +476,7 @@
<separator/>
<filter string="My Sales Order Lines" icon="terp-personnal" domain="[('salesman_id','=',uid)]" help="Sales Order Lines related to a Sales Order of mine"/>
<field name="order_id"/>
- <field name="order_partner_id"/>
+ <field name="order_partner_id" filter_domain="[('order_partner_id', 'child_of', self)]"/>
<field name="product_id"/>
<field name="salesman_id"/>
<group expand="0" string="Group By...">
@@ -498,7 +502,7 @@
<separator/>
<filter string="My Sales Order Lines" icon="terp-personal" domain="[('salesman_id','=',uid)]" help="My Sales Order Lines"/>
<field name="order_id"/>
- <field name="order_partner_id"/>
+ <field name="order_partner_id" filter_domain="[('order_partner_id', 'child_of', self)]"/>
<field name="product_id"/>
<field name="salesman_id"/>
<group expand="0" string="Group By...">
diff --git a/addons/sale/wizard/sale_line_invoice.py b/addons/sale/wizard/sale_line_invoice.py
index bed474728d7..83b953cc4d5 100644
--- a/addons/sale/wizard/sale_line_invoice.py
+++ b/addons/sale/wizard/sale_line_invoice.py
@@ -21,11 +21,11 @@
from openerp.osv import osv, fields
from openerp.tools.translate import _
-from openerp import netsvc
class sale_order_line_make_invoice(osv.osv_memory):
_name = "sale.order.line.make.invoice"
_description = "Sale OrderLine Make_invoice"
+
def make_invoices(self, cr, uid, ids, context=None):
"""
To make invoices.
@@ -82,34 +82,30 @@ class sale_order_line_make_invoice(osv.osv_memory):
sales_order_obj = self.pool.get('sale.order')
for line in sales_order_line_obj.browse(cr, uid, context.get('active_ids', []), context=context):
if (not line.invoiced) and (line.state not in ('draft', 'cancel')):
- if not line.order_id.id in invoices:
- invoices[line.order_id.id] = []
- line_id = sales_order_line_obj.invoice_line_create(cr, uid,
- [line.id])
+ if not line.order_id in invoices:
+ invoices[line.order_id] = []
+ line_id = sales_order_line_obj.invoice_line_create(cr, uid, [line.id])
for lid in line_id:
- invoices[line.order_id.id].append((line, lid))
- for result in invoices.values():
- order = result[0][0].order_id
- il = map(lambda x: x[1], result)
+ invoices[line.order_id].append(lid)
+ for order, il in invoices.items():
res = make_invoice(order, il)
cr.execute('INSERT INTO sale_order_invoice_rel \
(order_id,invoice_id) values (%s,%s)', (order.id, res))
-
flag = True
- data_sale = sales_order_obj.browse(cr, uid, line.order_id.id, context=context)
sales_order_obj.message_post(cr, uid, [order.id], body=_("Invoice created"), context=context)
+ data_sale = sales_order_obj.browse(cr, uid, order.id, context=context)
for line in data_sale.order_line:
if not line.invoiced:
flag = False
break
if flag:
- sales_order_obj.signal_manual_invoice(cr, uid, [line.order_id.id])
- sales_order_obj.write(cr, uid, [line.order_id.id], {'state': 'progress'})
+ wf_service.trg_validate(uid, 'sale.order', order.id, 'manual_invoice', cr)
+ sales_order_obj.write(cr, uid, [order.id], {'state': 'progress'})
if not invoices:
raise osv.except_osv(_('Warning!'), _('Invoice cannot be created for this Sales Order Line due to one of the following reasons:\n1.The state of this sales order line is either "draft" or "cancel"!\n2.The Sales Order Line is Invoiced!'))
if context.get('open_invoices', False):
- return self.open_invoices( cr, uid, ids, res, context=context)
+ return self.open_invoices(cr, uid, ids, res, context=context)
return {'type': 'ir.actions.act_window_close'}
def open_invoices(self, cr, uid, ids, invoice_ids, context=None):
@@ -119,7 +115,7 @@ class sale_order_line_make_invoice(osv.osv_memory):
form_id = form_res and form_res[1] or False
tree_res = ir_model_data.get_object_reference(cr, uid, 'account', 'invoice_tree')
tree_id = tree_res and tree_res[1] or False
-
+
return {
'name': _('Invoice'),
'view_type': 'form',
@@ -132,6 +128,5 @@ class sale_order_line_make_invoice(osv.osv_memory):
'type': 'ir.actions.act_window',
}
-sale_order_line_make_invoice()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale/wizard/sale_make_invoice.py b/addons/sale/wizard/sale_make_invoice.py
index 1b885998f83..3712feda20b 100644
--- a/addons/sale/wizard/sale_make_invoice.py
+++ b/addons/sale/wizard/sale_make_invoice.py
@@ -20,7 +20,6 @@
from openerp.osv import fields, osv
from openerp.tools.translate import _
-from openerp import netsvc
class sale_make_invoice(osv.osv_memory):
_name = "sale.make.invoice"
@@ -40,7 +39,7 @@ class sale_make_invoice(osv.osv_memory):
record_id = context and context.get('active_id', False)
order = self.pool.get('sale.order').browse(cr, uid, record_id, context=context)
if order.state == 'draft':
- raise osv.except_osv(_('Warning!'),'You cannot create invoice when sales order is not confirmed.')
+ raise osv.except_osv(_('Warning!'), _('You cannot create invoice when sales order is not confirmed.'))
return False
def make_invoices(self, cr, uid, ids, context=None):
@@ -51,8 +50,11 @@ class sale_make_invoice(osv.osv_memory):
if context is None:
context = {}
data = self.read(cr, uid, ids)[0]
- order_obj.action_invoice_create(cr, uid, context.get(('active_ids'), []), data['grouped'], date_invoice = data['invoice_date'])
- order_obj.signal_manual_invoice(cr, uid, context.get(('active_ids'), []))
+ for sale_order in order_obj.browse(cr, uid, context.get(('active_ids'), []), context=context):
+ if sale_order.state != 'manual':
+ raise osv.except_osv(_('Warning!'), _("You shouldn't manually invoice the following sale order %s") % (sale_order.name))
+
+ order_obj.action_invoice_create(cr, uid, context.get(('active_ids'), []), data['grouped'], date_invoice=data['invoice_date'])
for o in order_obj.browse(cr, uid, context.get(('active_ids'), []), context=context):
for i in o.invoice_ids:
@@ -61,10 +63,9 @@ class sale_make_invoice(osv.osv_memory):
result = mod_obj.get_object_reference(cr, uid, 'account', 'action_invoice_tree1')
id = result and result[1] or False
result = act_obj.read(cr, uid, [id], context=context)[0]
- result['domain'] = "[('id','in', ["+','.join(map(str,newinv))+"])]"
+ result['domain'] = "[('id','in', [" + ','.join(map(str, newinv)) + "])]"
return result
-sale_make_invoice()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale/wizard/sale_make_invoice.xml b/addons/sale/wizard/sale_make_invoice.xml
index ced64a0f79d..de680feb049 100644
--- a/addons/sale/wizard/sale_make_invoice.xml
+++ b/addons/sale/wizard/sale_make_invoice.xml
@@ -6,16 +6,16 @@
<field name="model">sale.make.invoice</field>
<field name="arch" type="xml">
<form string="Create invoices" version="7.0">
- <header>
- <button name="make_invoices" string="Create Invoices" type="object" class="oe_highlight" />
- or
- <button string="Cancel" class="oe_link" special="cancel" />
- </header>
<separator colspan="4" string="Do you really want to create the invoice(s)?" />
<group>
<field name="grouped"/>
<field name="invoice_date"/>
</group>
+ <footer>
+ <button name="make_invoices" string="Create Invoices" type="object" class="oe_highlight"/>
+ or
+ <button string="Cancel" class="oe_link" special="cancel" />
+ </footer>
</form>
</field>
</record>
diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py
index 5d3cc165b46..4cb00245ade 100644
--- a/addons/sale/wizard/sale_make_invoice_advance.py
+++ b/addons/sale/wizard/sale_make_invoice_advance.py
@@ -210,6 +210,5 @@ class sale_advance_payment_inv(osv.osv_memory):
'type': 'ir.actions.act_window',
}
-sale_advance_payment_inv()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_analytic_plans/sale_analytic_plans.py b/addons/sale_analytic_plans/sale_analytic_plans.py
index 2abbab7ab38..522f6b6f0fb 100644
--- a/addons/sale_analytic_plans/sale_analytic_plans.py
+++ b/addons/sale_analytic_plans/sale_analytic_plans.py
@@ -37,7 +37,6 @@ class sale_order_line(osv.osv):
i = i + 1
return create_ids
-sale_order_line()
class sale_order(osv.osv):
_inherit = "sale.order"
diff --git a/addons/sale_analytic_plans/sale_analytic_plans_view.xml b/addons/sale_analytic_plans/sale_analytic_plans_view.xml
index 6c788866520..3600d71b7d4 100644
--- a/addons/sale_analytic_plans/sale_analytic_plans_view.xml
+++ b/addons/sale_analytic_plans/sale_analytic_plans_view.xml
@@ -38,5 +38,19 @@
</field>
</record>
+
+ <!-- Replace analytic_id with analytics_id in account.invoice.line -->
+
+ <record model="ir.ui.view" id="view_invoice_line_form_inherit">
+ <field name="name">account.invoice.line.form.inherit</field>
+ <field name="model">account.invoice.line</field>
+ <field name="inherit_id" ref="account.view_invoice_line_form"/>
+ <field name="arch" type="xml">
+ <field name="account_analytic_id" position="replace">
+ <field name="analytics_id" context="{'journal_id':parent.journal_id}" domain="[('plan_id','&lt;&gt;',False)]" groups="analytic.group_analytic_accounting"/>
+ </field>
+ </field>
+ </record>
+
</data>
</openerp>
diff --git a/addons/sale_crm/report/sale_crm_account_invoice_report_view.xml b/addons/sale_crm/report/sale_crm_account_invoice_report_view.xml
index 41166d56713..983701d9690 100644
--- a/addons/sale_crm/report/sale_crm_account_invoice_report_view.xml
+++ b/addons/sale_crm/report/sale_crm_account_invoice_report_view.xml
@@ -10,7 +10,7 @@
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='date']" position="after">
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</xpath>
</data>
</field>
diff --git a/addons/sale_crm/sale_crm.py b/addons/sale_crm/sale_crm.py
index 1f3f85d5ed1..d0899729050 100644
--- a/addons/sale_crm/sale_crm.py
+++ b/addons/sale_crm/sale_crm.py
@@ -19,8 +19,10 @@
#
##############################################################################
+from datetime import datetime
from openerp.osv import osv, fields
+
class sale_order(osv.osv):
_inherit = 'sale.order'
_columns = {
@@ -30,19 +32,64 @@ class sale_order(osv.osv):
}
+class crm_case_section(osv.osv):
+ _inherit = 'crm.case.section'
+
+ def _get_sum_month_invoice(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict.fromkeys(ids, 0)
+ obj = self.pool.get('account.invoice.report')
+ when = datetime.today()
+ for section_id in ids:
+ invoice_ids = obj.search(cr, uid, [("section_id", "=", section_id), ('state', 'not in', ['draft', 'cancel']), ('year', '=', when.year), ('month', '=', when.month > 9 and when.month or "0%s" % when.month)], context=context)
+ for invoice in obj.browse(cr, uid, invoice_ids, context=context):
+ res[section_id] += invoice.price_total
+ return res
+
+ _columns = {
+ 'quotation_ids': fields.one2many('sale.order', 'section_id',
+ string='Quotations', readonly=True,
+ domain=[('state', 'in', ['draft', 'sent', 'cancel'])]),
+ 'sale_order_ids': fields.one2many('sale.order', 'section_id',
+ string='Sale Orders', readonly=True,
+ domain=[('state', 'not in', ['draft', 'sent', 'cancel'])]),
+ 'invoice_ids': fields.one2many('account.invoice', 'section_id',
+ string='Invoices', readonly=True,
+ domain=[('state', 'not in', ['draft', 'cancel'])]),
+ 'sum_month_invoice': fields.function(_get_sum_month_invoice,
+ string='Total invoiced this month',
+ type='integer', readonly=True),
+ }
+
+
class res_users(osv.Model):
_inherit = 'res.users'
_columns = {
'default_section_id': fields.many2one('crm.case.section', 'Default Sales Team'),
}
+
+class sale_crm_lead(osv.Model):
+ _inherit = 'crm.lead'
+
+ def on_change_user(self, cr, uid, ids, user_id, context=None):
+ """ Override of on change user_id on lead/opportunity; when having sale
+ the new logic is :
+ - use user.default_section_id
+ - or fallback on previous behavior """
+ if user_id:
+ user = self.pool.get('res.users').browse(cr, uid, user_id, context=context)
+ if user.default_section_id and user.default_section_id.id:
+ return {'value': {'section_id': user.default_section_id.id}}
+ return super(sale_crm_lead, self).on_change_user(cr, uid, ids, user_id, context=context)
+
+
class account_invoice(osv.osv):
_inherit = 'account.invoice'
_columns = {
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
}
_defaults = {
- 'section_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).default_section_id.id or False,
+ 'section_id': lambda self, cr, uid, c=None: self.pool.get('res.users').browse(cr, uid, uid, c).default_section_id.id or False,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_crm/sale_crm_view.xml b/addons/sale_crm/sale_crm_view.xml
index 0b5fce2f5cd..f8b4228334e 100644
--- a/addons/sale_crm/sale_crm_view.xml
+++ b/addons/sale_crm/sale_crm_view.xml
@@ -22,7 +22,7 @@
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<field name="user_id" position="after">
- <field name="section_id" widget="selection"/>
+ <field name="section_id" widget="selection" groups="base.group_multi_salesteams"/>
<field name="categ_ids" widget="many2many_tags"/>
</field>
</field>
@@ -41,7 +41,7 @@
help="My Sales Team(s)"/>
</xpath>
<xpath expr="//field[@name='user_id']" position="after">
- <field name="section_id" string="Sales Team"/>
+ <field name="section_id" string="Sales Team" groups="base.group_multi_salesteams"/>
</xpath>
</field>
</record>
@@ -53,18 +53,22 @@
<field name="inherit_id" ref="account.invoice_tree"/>
<field name="arch" type="xml">
<data>
- <xpath expr="//field[@name='date_invoice']" position="after">
- <field name="section_id" invisible="1"/>
+ <xpath expr="//field[@name='user_id']" position="after">
+ <field name="section_id" string="Sales Team" groups="base.group_multi_salesteams"/>
</xpath>
</data>
</field>
</record>
+ <!-- Update account invoice search view!-->
<record id="account_invoice_groupby_inherit" model="ir.ui.view">
<field name="name">account.invoice.groupby</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.view_account_invoice_filter"/>
<field name="arch" type="xml">
+ <xpath expr="//field[@name='user_id']" position="after">
+ <field name="section_id"/>
+ </xpath>
<xpath expr="//group/filter[@string='Due Date']" position="after">
<filter string="Sales Team" domain="[]" context="{'group_by':'section_id'}"/>
</xpath>
@@ -79,7 +83,7 @@
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='user_id']" position="after">
- <field name="section_id"/>
+ <field name="section_id" groups="base.group_multi_salesteams"/>
</xpath>
</data>
</field>
@@ -113,5 +117,132 @@
</field>
</record>
+ <!-- search by Salesteams -->
+
+ <record id="action_orders_salesteams" model="ir.actions.act_window">
+ <field name="name">Sales Orders</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">sale.order</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form,calendar,graph</field>
+ <field name="search_view_id" ref="sale.view_sales_order_filter"/>
+ <field name="domain">[('state','not in',('draft','sent','cancel'))]</field>
+ <field name="context">{
+ 'search_default_section_id': [active_id],
+ 'default_section_id': active_id,
+ 'search_default_my_sale_orders_filter': 1,
+ }
+ </field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click to create a quotation that can be converted into a sales
+ order.
+ </p><p>
+ OpenERP will help you efficiently handle the complete sales flow:
+ quotation, sales order, delivery, invoicing and payment.
+ </p>
+ </field>
+ </record>
+
+ <record id="action_quotations_salesteams" model="ir.actions.act_window">
+ <field name="name">Quotations</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">sale.order</field>
+ <field name="view_type">form</field>
+ <field name="view_id" ref="sale.view_quotation_tree"/>
+ <field name="view_mode">tree,form,calendar,graph</field>
+ <field name="context">{
+ 'search_default_section_id': [active_id],
+ 'default_section_id': active_id, 'show_address': 1,
+ 'search_default_my_sale_orders_filter': 1
+ }
+ </field>
+ <field name="domain">[('state','in',('draft','sent','cancel'))]</field>
+ <field name="search_view_id" ref="sale.view_sales_order_filter"/>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click to create a quotation, the first step of a new sale.
+ </p><p>
+ OpenERP will help you handle efficiently the complete sale flow:
+ from the quotation to the sales order, the
+ delivery, the invoicing and the payment collection.
+ </p><p>
+ The social feature helps you organize discussions on each sales
+ order, and allow your customers to keep track of the evolution
+ of the sales order.
+ </p>
+ </field>
+ </record>
+
+ <record id="action_invoice_salesteams" model="ir.actions.act_window">
+ <field name="name">Invoices</field>
+ <field name="res_model">account.invoice</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form,calendar,graph</field>
+ <field name="view_id" ref="account.invoice_tree"/>
+ <field name="domain">[
+ ('state', 'not in', ['draft', 'cancel']),
+ ('type', '=', 'out_invoice')]</field>
+ <field name="context">{
+ 'search_default_section_id': [active_id],
+ 'default_section_id': active_id},
+ 'default_type':'out_invoice',
+ 'type':'out_invoice',
+ 'journal_type': 'sale',
+ }
+ </field>
+ <field name="search_view_id" ref="account.view_account_invoice_filter"/>
+ </record>
+
+ <record id="action_invoice_salesteams_view_tree" model="ir.actions.act_window.view">
+ <field name="sequence">1</field>
+ <field name="view_mode">tree</field>
+ <field name="act_window_id" ref="sale_crm.action_invoice_salesteams"/>
+ </record>
+
+ <record id="action_invoice_salesteams_view_form" model="ir.actions.act_window.view">
+ <field name="sequence">2</field>
+ <field name="view_mode">form</field>
+ <field name="view_id" ref="account.invoice_form"/>
+ <field name="act_window_id" ref="sale_crm.action_invoice_salesteams"/>
+ </record>
+
+ <record id="crm_case_section_salesteams_view_kanban" model="ir.ui.view">
+ <field name="name">crm.case.section.kanban</field>
+ <field name="model">crm.case.section</field>
+ <field name="inherit_id" ref="crm.crm_case_section_salesteams_view_kanban"/>
+ <field name="arch" type="xml">
+ <data>
+ <xpath expr="//field[@name='open_opportunity_ids']" position="after">
+ <field name="quotation_ids"/>
+ <field name="sale_order_ids"/>
+ <field name="invoice_ids"/>
+ </xpath>
+ <xpath expr="//div[@class='oe_items_list']" position="inside">
+ <a name="%(action_quotations_salesteams)d" type="action">
+ <t t-raw="record.quotation_ids.raw_value.length"/>
+ <t t-if="record.quotation_ids.raw_value.length &gt;= 2">Quotations</t>
+ <t t-if="record.quotation_ids.raw_value.length &lt; 2">Quotation</t>
+ </a>
+ <a name="%(action_orders_salesteams)d" type="action">
+ <t t-raw="record.sale_order_ids.raw_value.length"/>
+ <t t-if="record.sale_order_ids.raw_value.length &gt;= 2">Sales Orders</t>
+ <t t-if="record.sale_order_ids.raw_value.length &lt; 2">Sales Order</t>
+ </a>
+ <a name="%(action_invoice_salesteams)d" type="action" groups="account.group_account_invoice">
+ <t t-raw="record.invoice_ids.raw_value.length"/>
+ <t t-if="record.invoice_ids.raw_value.length &gt;= 2">Invoices</t>
+ <t t-if="record.invoice_ids.raw_value.length &lt; 2">Invoice</t>
+ </a>
+ </xpath>
+ <xpath expr="//div[@class='oe_items_list']" position="after">
+ <div class="oe_center">
+ <div class="oe_sum"><field name="sum_month_invoice"/></div>
+ <div class="oe_subsum">Invoiced this month</div>
+ </div>
+ </xpath>
+ </data>
+ </field>
+ </record>
</data>
</openerp>
diff --git a/addons/sale_crm/wizard/crm_make_sale.py b/addons/sale_crm/wizard/crm_make_sale.py
index a052f47ca1f..6bea6286456 100644
--- a/addons/sale_crm/wizard/crm_make_sale.py
+++ b/addons/sale_crm/wizard/crm_make_sale.py
@@ -153,6 +153,5 @@ class crm_make_sale(osv.osv_memory):
'partner_id': _selectPartner,
}
-crm_make_sale()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_journal/sale_journal.py b/addons/sale_journal/sale_journal.py
index 8463ab3f3bd..9e10c826898 100644
--- a/addons/sale_journal/sale_journal.py
+++ b/addons/sale_journal/sale_journal.py
@@ -34,7 +34,6 @@ class sale_journal_invoice_type(osv.osv):
'active': True,
'invoicing_method': 'simple'
}
-sale_journal_invoice_type()
#==============================================
# sale journal inherit
@@ -52,28 +51,28 @@ class res_partner(osv.osv):
group_name = "Accounting Properties",
help = "This invoicing type will be used, by default, to invoice the current partner."),
}
-res_partner()
+
+ def _commercial_fields(self, cr, uid, context=None):
+ return super(res_partner, self)._commercial_fields(cr, uid, context=context) + ['property_invoice_type']
+
class picking(osv.osv):
_inherit = "stock.picking"
_columns = {
'invoice_type_id': fields.many2one('sale_journal.invoice.type', 'Invoice Type', readonly=True)
}
-picking()
class stock_picking_in(osv.osv):
_inherit = "stock.picking.in"
_columns = {
'invoice_type_id': fields.many2one('sale_journal.invoice.type', 'Invoice Type', readonly=True)
}
-stock_picking_in()
class stock_picking_out(osv.osv):
_inherit = "stock.picking.out"
_columns = {
'invoice_type_id': fields.many2one('sale_journal.invoice.type', 'Invoice Type', readonly=True)
}
-stock_picking_out()
class sale(osv.osv):
@@ -95,6 +94,5 @@ class sale(osv.osv):
result['value']['invoice_type_id'] = itype.id
return result
-sale()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_journal/sale_journal_view.xml b/addons/sale_journal/sale_journal_view.xml
index bcd83b5be84..9d41103252e 100644
--- a/addons/sale_journal/sale_journal_view.xml
+++ b/addons/sale_journal/sale_journal_view.xml
@@ -146,7 +146,7 @@
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<page string="Sales &amp; Purchases" position="inside">
- <group colspan="2" col="2">
+ <group colspan="2" col="2" attrs="{'invisible': [('is_company','=',False),('parent_id','!=',False)]}">
<separator string="Invoicing" colspan="2"/>
<field name="property_invoice_type"/>
</group>
diff --git a/addons/sale_margin/i18n/cs.po b/addons/sale_margin/i18n/cs.po
new file mode 100644
index 00000000000..dd01e0973bc
--- /dev/null
+++ b/addons/sale_margin/i18n/cs.po
@@ -0,0 +1,46 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-03-30 12:41+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-31 05:27+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: sale_margin
+#: field:sale.order.line,purchase_price:0
+msgid "Cost Price"
+msgstr ""
+
+#. module: sale_margin
+#: model:ir.model,name:sale_margin.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
+#. module: sale_margin
+#: field:sale.order,margin:0
+#: field:sale.order.line,margin:0
+msgid "Margin"
+msgstr ""
+
+#. module: sale_margin
+#: model:ir.model,name:sale_margin.model_sale_order_line
+msgid "Sales Order Line"
+msgstr ""
+
+#. module: sale_margin
+#: help:sale.order,margin:0
+msgid ""
+"It gives profitability by calculating the difference between the Unit Price "
+"and the cost price."
+msgstr ""
diff --git a/addons/sale_margin/sale_margin.py b/addons/sale_margin/sale_margin.py
index dc8c4dfff3c..4c2e9ffc4f4 100644
--- a/addons/sale_margin/sale_margin.py
+++ b/addons/sale_margin/sale_margin.py
@@ -56,7 +56,6 @@ class sale_order_line(osv.osv):
'purchase_price': fields.float('Cost Price', digits=(16,2))
}
-sale_order_line()
class sale_order(osv.osv):
_inherit = "sale.order"
@@ -82,6 +81,5 @@ class sale_order(osv.osv):
}),
}
-sale_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file
diff --git a/addons/sale_mrp/i18n/cs.po b/addons/sale_mrp/i18n/cs.po
new file mode 100644
index 00000000000..78ae9292dbd
--- /dev/null
+++ b/addons/sale_mrp/i18n/cs.po
@@ -0,0 +1,43 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-03-30 12:41+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-31 05:27+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: sale_mrp
+#: model:ir.model,name:sale_mrp.model_mrp_production
+msgid "Manufacturing Order"
+msgstr ""
+
+#. module: sale_mrp
+#: help:mrp.production,sale_name:0
+msgid "Indicate the name of sales order."
+msgstr ""
+
+#. module: sale_mrp
+#: help:mrp.production,sale_ref:0
+msgid "Indicate the Customer Reference from sales order."
+msgstr ""
+
+#. module: sale_mrp
+#: field:mrp.production,sale_ref:0
+msgid "Sale Reference"
+msgstr ""
+
+#. module: sale_mrp
+#: field:mrp.production,sale_name:0
+msgid "Sale Name"
+msgstr ""
diff --git a/addons/sale_mrp/i18n/lt.po b/addons/sale_mrp/i18n/lt.po
new file mode 100644
index 00000000000..185753c3663
--- /dev/null
+++ b/addons/sale_mrp/i18n/lt.po
@@ -0,0 +1,43 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-04-29 15:30+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: sale_mrp
+#: model:ir.model,name:sale_mrp.model_mrp_production
+msgid "Manufacturing Order"
+msgstr ""
+
+#. module: sale_mrp
+#: help:mrp.production,sale_name:0
+msgid "Indicate the name of sales order."
+msgstr ""
+
+#. module: sale_mrp
+#: help:mrp.production,sale_ref:0
+msgid "Indicate the Customer Reference from sales order."
+msgstr ""
+
+#. module: sale_mrp
+#: field:mrp.production,sale_ref:0
+msgid "Sale Reference"
+msgstr ""
+
+#. module: sale_mrp
+#: field:mrp.production,sale_name:0
+msgid "Sale Name"
+msgstr ""
diff --git a/addons/sale_mrp/sale_mrp.py b/addons/sale_mrp/sale_mrp.py
index a5043d3b7d5..77a35972638 100644
--- a/addons/sale_mrp/sale_mrp.py
+++ b/addons/sale_mrp/sale_mrp.py
@@ -74,6 +74,5 @@ class mrp_production(osv.osv):
'sale_ref': fields.function(_ref_calc, multi='sale_name', type='char', string='Sale Reference', help='Indicate the Customer Reference from sales order.'),
}
-mrp_production()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_order_dates/i18n/cs.po b/addons/sale_order_dates/i18n/cs.po
new file mode 100644
index 00000000000..a1583d48efe
--- /dev/null
+++ b/addons/sale_order_dates/i18n/cs.po
@@ -0,0 +1,58 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-03-30 12:41+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-31 05:27+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: sale_order_dates
+#: view:sale.order:0
+msgid "Dates"
+msgstr ""
+
+#. module: sale_order_dates
+#: field:sale.order,commitment_date:0
+msgid "Commitment Date"
+msgstr ""
+
+#. module: sale_order_dates
+#: field:sale.order,effective_date:0
+msgid "Effective Date"
+msgstr ""
+
+#. module: sale_order_dates
+#: help:sale.order,effective_date:0
+msgid "Date on which picking is created."
+msgstr ""
+
+#. module: sale_order_dates
+#: help:sale.order,requested_date:0
+msgid "Date requested by the customer for the sale."
+msgstr ""
+
+#. module: sale_order_dates
+#: field:sale.order,requested_date:0
+msgid "Requested Date"
+msgstr ""
+
+#. module: sale_order_dates
+#: model:ir.model,name:sale_order_dates.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
+#. module: sale_order_dates
+#: help:sale.order,commitment_date:0
+msgid "Committed date for delivery."
+msgstr ""
diff --git a/addons/sale_order_dates/sale_order_dates.py b/addons/sale_order_dates/sale_order_dates.py
index d54eca88ca5..64b939de088 100644
--- a/addons/sale_order_dates/sale_order_dates.py
+++ b/addons/sale_order_dates/sale_order_dates.py
@@ -59,6 +59,5 @@ class sale_order_dates(osv.osv):
'effective_date': fields.function(_get_effective_date, type='date', store=True, string='Effective Date',help="Date on which picking is created."),
}
-sale_order_dates()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_stock/company.py b/addons/sale_stock/company.py
index 67440ed6c67..5be1dbd524d 100644
--- a/addons/sale_stock/company.py
+++ b/addons/sale_stock/company.py
@@ -24,13 +24,15 @@ from openerp.osv import fields, osv
class company(osv.osv):
_inherit = 'res.company'
_columns = {
- 'security_lead': fields.float('Security Days', required=True,
- help="This is the days added to what you promise to customers "\
- "for security purpose"),
+ 'security_lead': fields.float(
+ 'Security Days', required=True,
+ help="Margin of error for dates promised to customers. "\
+ "Products will be scheduled for procurement and delivery "\
+ "that many days earlier than the actual promised date, to "\
+ "cope with unexpected delays in the supply chain."),
}
_defaults = {
'security_lead': 0.0,
}
-company()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_stock/process/sale_stock_process.xml b/addons/sale_stock/process/sale_stock_process.xml
index 666f6ba6502..c10b34c8866 100644
--- a/addons/sale_stock/process/sale_stock_process.xml
+++ b/addons/sale_stock/process/sale_stock_process.xml
@@ -65,17 +65,6 @@
<!--
- Process Condition
- -->
-
- <record id="process_condition_conditionafterdelivery0" model="process.condition">
- <field name="model_id" ref="sale.model_sale_order"/>
- <field name="node_id" ref="process_node_invoiceafterdelivery0"/>
- <field eval="&quot;&quot;&quot;object.order_policy=='postpaid'&quot;&quot;&quot;" name="model_states"/>
- <field eval="&quot;&quot;&quot;condition_after_delivery&quot;&quot;&quot;" name="name"/>
- </record>
-
- <!--
Process Transition
-->
@@ -106,7 +95,7 @@
<record id="process_transition_invoiceafterdelivery0" model="process.transition">
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Create Invoice&quot;&quot;&quot;" name="name"/>
- <field eval="&quot;&quot;&quot;The invoice is created automatically if the shipping policy is 'Invoice from pick' or 'Invoice on order after delivery'.&quot;&quot;&quot;" name="note"/>
+ <field eval="&quot;&quot;&quot;If the sale order was set to create the invoice 'On Delivery Order', then an invoice is automatically created based on what you delivered. If you rather want to create your invoice based on your sale order, you can set the sale order to create invoice 'On Demand', then track and process the sales order that have been fully delivered and invoice them from there.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_invoiceafterdelivery0"/>
<field model="process.node" name="source_node_id" ref="process_node_packinglist0"/>
</record>
diff --git a/addons/sale_stock/report/sale_report.py b/addons/sale_stock/report/sale_report.py
index 1f1e4a625be..63641020d98 100644
--- a/addons/sale_stock/report/sale_report.py
+++ b/addons/sale_stock/report/sale_report.py
@@ -91,6 +91,5 @@ class sale_report(osv.osv):
s.project_id
)
""")
-sale_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py
index bd4eb2b8256..e71fb92f842 100644
--- a/addons/sale_stock/sale_stock.py
+++ b/addons/sale_stock/sale_stock.py
@@ -24,6 +24,8 @@ from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FO
from dateutil.relativedelta import relativedelta
from openerp.osv import fields, osv
from openerp.tools.translate import _
+import pytz
+from openerp import SUPERUSER_ID
class sale_shop(osv.osv):
_inherit = "sale.shop"
@@ -31,7 +33,6 @@ class sale_shop(osv.osv):
'warehouse_id': fields.many2one('stock.warehouse', 'Warehouse'),
}
-sale_shop()
class sale_order(osv.osv):
_inherit = "sale.order"
@@ -229,6 +230,29 @@ class sale_order(osv.osv):
res.append(line.procurement_id.id)
return res
+ def date_to_datetime(self, cr, uid, userdate, context=None):
+ """ Convert date values expressed in user's timezone to
+ server-side UTC timestamp, assuming a default arbitrary
+ time of 12:00 AM - because a time is needed.
+
+ :param str userdate: date string in in user time zone
+ :return: UTC datetime string for server-side use
+ """
+ # TODO: move to fields.datetime in server after 7.0
+ user_date = datetime.strptime(userdate, DEFAULT_SERVER_DATE_FORMAT)
+ if context and context.get('tz'):
+ tz_name = context['tz']
+ else:
+ tz_name = self.pool.get('res.users').read(cr, SUPERUSER_ID, uid, ['tz'])['tz']
+ if tz_name:
+ utc = pytz.timezone('UTC')
+ context_tz = pytz.timezone(tz_name)
+ user_datetime = user_date + relativedelta(hours=12.0)
+ local_timestamp = context_tz.localize(user_datetime, is_dst=False)
+ user_datetime = local_timestamp.astimezone(utc)
+ return user_datetime.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
+ return user_date.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
+
# if mode == 'finished':
# returns True if all lines are done, False otherwise
# if mode == 'canceled':
@@ -311,7 +335,7 @@ class sale_order(osv.osv):
return {
'name': pick_name,
'origin': order.name,
- 'date': order.date_order,
+ 'date': self.date_to_datetime(cr, uid, order.date_order, context),
'type': 'out',
'state': 'auto',
'move_type': order.picking_policy,
@@ -345,7 +369,8 @@ class sale_order(osv.osv):
return True
def _get_date_planned(self, cr, uid, order, line, start_date, context=None):
- date_planned = datetime.strptime(start_date, DEFAULT_SERVER_DATE_FORMAT) + relativedelta(days=line.delay or 0.0)
+ start_date = self.date_to_datetime(cr, uid, start_date, context)
+ date_planned = datetime.strptime(start_date, DEFAULT_SERVER_DATETIME_FORMAT) + relativedelta(days=line.delay or 0.0)
date_planned = (date_planned - timedelta(days=order.company_id.security_lead)).strftime(DEFAULT_SERVER_DATETIME_FORMAT)
return date_planned
@@ -605,11 +630,6 @@ class sale_advance_payment_inv(osv.osv_memory):
sale_line_obj = self.pool.get('sale.order.line')
wizard = self.browse(cr, uid, [result], context)
sale = sale_obj.browse(cr, uid, sale_id, context=context)
- if sale.order_policy == 'postpaid':
- raise osv.except_osv(
- _('Error!'),
- _("You cannot make an advance on a sales order \
- that is defined as 'Automatic Invoice after delivery'."))
# If invoice on picking: add the cost on the SO
# If not, the advance will be deduced when generating the final invoice
diff --git a/addons/sale_stock/stock.py b/addons/sale_stock/stock.py
index e1070998ae8..ad19684c4cf 100644
--- a/addons/sale_stock/stock.py
+++ b/addons/sale_stock/stock.py
@@ -54,7 +54,7 @@ class stock_picking(osv.osv):
We select the partner of the sales order as the partner of the customer invoice
"""
if picking.sale_id:
- return picking.sale_id.partner_id
+ return picking.sale_id.partner_invoice_id
return super(stock_picking, self)._get_partner_to_invoice(cr, uid, picking, context=context)
def _get_comment_invoice(self, cursor, user, picking):
diff --git a/addons/sale_stock/test/picking_order_policy.yml b/addons/sale_stock/test/picking_order_policy.yml
index f761dfb65db..afffda1ef21 100644
--- a/addons/sale_stock/test/picking_order_policy.yml
+++ b/addons/sale_stock/test/picking_order_policy.yml
@@ -5,6 +5,12 @@
-
!assert {model: sale.order, id: sale.sale_order_6, string: The amount of the Quotation is not correctly computed}:
- sum([l.price_subtotal for l in order_line]) == amount_untaxed
+-
+ I set an explicit invoicing partner that is different from the main SO Customer
+-
+ !python {model: sale.order, id: sale.sale_order_6}: |
+ order = self.browse(cr, uid, ref("sale.sale_order_6"))
+ order.write({'partner_invoice_id': ref('base.res_partner_address_29')})
-
I confirm the quotation with Invoice based on deliveries policy.
-
@@ -26,7 +32,8 @@
order = self.browse(cr, uid, ref("sale.sale_order_6"))
for order_line in order.order_line:
procurement = order_line.procurement_id
- date_planned = datetime.strptime(order.date_order, DEFAULT_SERVER_DATE_FORMAT) + relativedelta(days=order_line.delay or 0.0)
+ sale_order_date = self.date_to_datetime(cr, uid, order.date_order, context)
+ date_planned = datetime.strptime(sale_order_date, DEFAULT_SERVER_DATETIME_FORMAT) + relativedelta(days=order_line.delay or 0.0)
date_planned = (date_planned - timedelta(days=order.company_id.security_lead)).strftime(DEFAULT_SERVER_DATETIME_FORMAT)
assert procurement.date_planned == date_planned, "Scheduled date is not correspond."
assert procurement.product_id.id == order_line.product_id.id, "Product is not correspond."
@@ -60,7 +67,8 @@
output_id = sale_order.shop_id.warehouse_id.lot_output_id.id
for move in picking.move_lines:
order_line = move.sale_line_id
- date_planned = datetime.strptime(sale_order.date_order, DEFAULT_SERVER_DATE_FORMAT) + relativedelta(days=order_line.delay or 0.0)
+ sale_order_date = self.date_to_datetime(cr, uid, sale_order.date_order, context)
+ date_planned = datetime.strptime(sale_order_date, DEFAULT_SERVER_DATETIME_FORMAT) + relativedelta(days=order_line.delay or 0.0)
date_planned = (date_planned - timedelta(days=sale_order.company_id.security_lead)).strftime(DEFAULT_SERVER_DATETIME_FORMAT)
assert datetime.strptime(move.date_expected, DEFAULT_SERVER_DATETIME_FORMAT) == datetime.strptime(date_planned, DEFAULT_SERVER_DATETIME_FORMAT), "Excepted Date is not correspond with Planned Date."
assert move.product_id.id == order_line.product_id.id,"Product is not correspond."
@@ -108,13 +116,13 @@
!python {model: sale.order}: |
order = self.browse(cr, uid, ref("sale.sale_order_6"))
assert order.invoice_ids, "Invoice is not created."
- ac = order.partner_id.property_account_receivable.id
+ ac = order.partner_invoice_id.property_account_receivable.id
journal_ids = self.pool.get('account.journal').search(cr, uid, [('type', '=', 'sale'), ('company_id', '=', order.company_id.id)])
for invoice in order.invoice_ids:
assert invoice.type == 'out_invoice',"Invoice should be Customer Invoice."
assert invoice.account_id.id == ac,"Invoice account is not correspond."
assert invoice.reference == order.client_order_ref or order.name,"Reference is not correspond."
- assert invoice.partner_id.id == order.partner_id.id,"Customer is not correspond."
+ assert invoice.partner_id.id == order.partner_invoice_id.id,"Customer does not correspond."
assert invoice.currency_id.id == order.pricelist_id.currency_id.id, "Currency is not correspond."
assert invoice.comment == (order.note or ''),"Note is not correspond."
assert invoice.journal_id.id in journal_ids,"Sales Journal is not link on Invoice."
@@ -162,8 +170,9 @@
-
!python {model: sale.order}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.sale.order').create(cr, uid, [ref('sale.sale_order_6')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('sale.sale_order_6')], 'sale.order', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'sale-sale_order.'+format), 'wb+').write(data)
diff --git a/addons/share/i18n/lt.po b/addons/share/i18n/lt.po
new file mode 100644
index 00000000000..497de8b405d
--- /dev/null
+++ b/addons/share/i18n/lt.po
@@ -0,0 +1,617 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-04-29 15:32+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:841
+#, python-format
+msgid "Invitation to collaborate about %s"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:779
+#, python-format
+msgid ""
+"The share engine has not been able to fetch a record_id for your invitation."
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "Include an Optional Personal Message"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,embed_option_title:0
+msgid "Display title"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "Access granted!"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,record_name:0
+msgid "Record name"
+msgstr ""
+
+#. module: share
+#: help:share.wizard,message:0
+msgid ""
+"An optional personal message, to be included in the email notification."
+msgstr ""
+
+#. module: share
+#: field:share.wizard,user_type:0
+msgid "Sharing method"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,name:0
+msgid "Share Title"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:847
+#: code:addons/share/wizard/share_wizard.py:876
+#, python-format
+msgid ""
+"The documents are not attached, you can view them online directly on my "
+"OpenERP server at:\n"
+" %s\n"
+"\n"
+msgstr ""
+
+#. module: share
+#: model:ir.module.category,name:share.module_category_share
+msgid "Sharing"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:842
+#: code:addons/share/wizard/share_wizard.py:874
+#, python-format
+msgid ""
+"Hello,\n"
+"\n"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,share_root_url:0
+msgid "Share Access URL"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,email_1:0
+#: field:share.wizard,email_2:0
+#: field:share.wizard,email_3:0
+msgid "New user email"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:886
+#, python-format
+msgid "You may use your current login (%s) and password to view them.\n"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:620
+#, python-format
+msgid "(Modified)"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:664
+#, python-format
+msgid "You must be a member of the Share/User group to use the share wizard."
+msgstr ""
+
+#. module: share
+#. openerp-web
+#: code:addons/share/static/src/js/share.js:63
+#, python-format
+msgid "Embed"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:598
+#, python-format
+msgid "Sharing filter created by user %s (%s) for group %s"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,embed_url:0
+#: field:share.wizard.result.line,share_url:0
+msgid "Share URL"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:848
+#: code:addons/share/wizard/share_wizard.py:880
+#, python-format
+msgid "These are your credentials to access this protected area:\n"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "Access info"
+msgstr ""
+
+#. module: share
+#. openerp-web
+#: code:addons/share/static/src/js/share.js:60
+#: view:share.wizard:0
+#, python-format
+msgid "Share"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:570
+#, python-format
+msgid "(Duplicated for modified sharing permissions)"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:668
+#, python-format
+msgid ""
+"Please indicate the emails of the persons to share with, one per line."
+msgstr ""
+
+#. module: share
+#: help:share.wizard,domain:0
+msgid "Optional domain for further data filtering"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "Next"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:661
+#, python-format
+msgid "Action and Access Mode are required to create a shared access."
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:849
+#: code:addons/share/wizard/share_wizard.py:881
+#, python-format
+msgid "Username"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "Sharing Options"
+msgstr ""
+
+#. module: share
+#. openerp-web
+#: code:addons/share/static/src/xml/share.xml:9
+#, python-format
+msgid "Invite"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "Embedded code options"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "Configuration"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid ""
+"Please select the action that opens the screen containing the data you want "
+"to share."
+msgstr ""
+
+#. module: share
+#: field:res.groups,share:0
+msgid "Share Group"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:834
+#: code:addons/share/wizard/share_wizard.py:865
+#, python-format
+msgid "Email required"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid ""
+"Optionally, you may specify an additional domain restriction that will be "
+"applied to the shared data."
+msgstr ""
+
+#. module: share
+#: view:res.groups:0
+msgid "Non-Share Groups"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid ""
+"An email notification with instructions has been sent to the following "
+"people:"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:77
+#, python-format
+msgid "Direct link or embed code"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:855
+#: code:addons/share/wizard/share_wizard.py:889
+#, python-format
+msgid ""
+"OpenERP is a powerful and user-friendly suite of Business Applications (CRM, "
+"Sales, HR, etc.)\n"
+"It is open source and can be found on http://www.openerp.com."
+msgstr ""
+
+#. module: share
+#: field:share.wizard,action_id:0
+msgid "Action to share"
+msgstr ""
+
+#. module: share
+#: help:share.wizard,record_name:0
+msgid "Name of the shared record, if sharing a precise record"
+msgstr ""
+
+#. module: share
+#: field:res.users,share:0
+msgid "Share User"
+msgstr ""
+
+#. module: share
+#: field:share.wizard.result.line,user_id:0
+msgid "unknown"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:61
+#: code:addons/share/wizard/share_wizard.py:656
+#, python-format
+msgid "Sharing access cannot be created."
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:779
+#, python-format
+msgid "Record id not found"
+msgstr ""
+
+#. module: share
+#: help:res.groups,share:0
+msgid "Group created to set access rights for sharing data with some users."
+msgstr ""
+
+#. module: share
+#: view:res.groups:0
+msgid "Share Groups"
+msgstr ""
+
+#. module: share
+#: help:share.wizard,action_id:0
+msgid ""
+"The action that opens the screen containing the data you wish to share."
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:545
+#, python-format
+msgid "(Copy for sharing)"
+msgstr ""
+
+#. module: share
+#: field:share.wizard.result.line,newly_created:0
+msgid "Newly created"
+msgstr ""
+
+#. module: share
+#: help:share.wizard,name:0
+msgid "Title for the share (displayed to users as menu and shortcut name)"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:635
+#, python-format
+msgid "Indirect sharing filter created by user %s (%s) for group %s"
+msgstr ""
+
+#. module: share
+#: help:share.wizard,share_root_url:0
+msgid "Main access page for users that are granted shared access"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:206
+#, python-format
+msgid ""
+"You must configure your email address in the user preferences before using "
+"the Share button."
+msgstr ""
+
+#. module: share
+#: model:res.groups,name:share.group_share_user
+msgid "User"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:657
+#, python-format
+msgid ""
+"Sorry, the current screen and filter you are trying to share are not "
+"supported at the moment.\n"
+"You may want to try a simpler filter."
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "Use this link"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:851
+#: code:addons/share/wizard/share_wizard.py:883
+#, python-format
+msgid "Database"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "Share with these People (one email per line)"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,domain:0
+msgid "Domain"
+msgstr ""
+
+#. module: share
+#: view:res.groups:0
+msgid "{'search_default_no_share':1}"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+#: field:share.wizard,result_line_ids:0
+msgid "Summary"
+msgstr ""
+
+#. module: share
+#: help:share.wizard,embed_code:0
+msgid ""
+"Embed this code in your documents to provide a link to the shared document."
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:512
+#, python-format
+msgid "Copied access for sharing"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:816
+#, python-format
+msgid "Invitation"
+msgstr ""
+
+#. module: share
+#: model:ir.actions.act_window,name:share.action_share_wizard_step1
+msgid "Share your documents"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "Or insert the following code where you want to embed your documents"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:885
+#, python-format
+msgid ""
+"The documents have been automatically added to your current OpenERP "
+"documents.\n"
+msgstr ""
+
+#. module: share
+#: model:ir.model,name:share.model_share_wizard_result_line
+msgid "share.wizard.result.line"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,embed_code:0
+msgid "Code"
+msgstr ""
+
+#. module: share
+#: help:share.wizard,user_type:0
+msgid "Select the type of user(s) you would like to share data with."
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:843
+#, python-format
+msgid ""
+"I have shared %s (%s) with you!\n"
+"\n"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,view_type:0
+msgid "Current View Type"
+msgstr ""
+
+#. module: share
+#: selection:share.wizard,access_mode:0
+msgid "Can view"
+msgstr ""
+
+#. module: share
+#: selection:share.wizard,access_mode:0
+msgid "Can edit"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "Cancel"
+msgstr ""
+
+#. module: share
+#: help:res.users,share:0
+msgid ""
+"External user with limited access, created only for the purpose of sharing "
+"data."
+msgstr ""
+
+#. module: share
+#: model:ir.actions.act_window,name:share.action_share_wizard
+#: model:ir.model,name:share.model_share_wizard
+#: field:share.wizard.result.line,share_wizard_id:0
+msgid "Share Wizard"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:792
+#, python-format
+msgid "Shared access created!"
+msgstr ""
+
+#. module: share
+#: model:res.groups,comment:share.group_share_user
+msgid ""
+"\n"
+"Members of this groups have access to the sharing wizard, which allows them "
+"to invite external users to view or edit some of their documents."
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:852
+#, python-format
+msgid ""
+"The documents have been automatically added to your subscriptions.\n"
+"\n"
+msgstr ""
+
+#. module: share
+#: model:ir.model,name:share.model_res_users
+msgid "Users"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:875
+#, python-format
+msgid ""
+"I've shared %s with you!\n"
+"\n"
+msgstr ""
+
+#. module: share
+#: model:ir.model,name:share.model_res_groups
+msgid "Access Groups"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,invite:0
+msgid "Invite users to OpenSocial record"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:850
+#: code:addons/share/wizard/share_wizard.py:882
+#: field:share.wizard.result.line,password:0
+#, python-format
+msgid "Password"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:77
+#: field:share.wizard,new_users:0
+#, python-format
+msgid "Emails"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,embed_option_search:0
+msgid "Display search view"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,message:0
+msgid "Personal Message"
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:834
+#: code:addons/share/wizard/share_wizard.py:865
+#, python-format
+msgid ""
+"The current user must have an email address configured in User Preferences "
+"to be able to send outgoing emails."
+msgstr ""
+
+#. module: share
+#: code:addons/share/wizard/share_wizard.py:205
+#, python-format
+msgid "No email address configured"
+msgstr ""
+
+#. module: share
+#: field:share.wizard.result.line,login:0
+msgid "Login"
+msgstr ""
+
+#. module: share
+#: view:res.users:0
+msgid "Regular users only (no share user)"
+msgstr ""
+
+#. module: share
+#: field:share.wizard,access_mode:0
+msgid "Access Mode"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "Sharing: preparation"
+msgstr ""
+
+#. module: share
+#: model:ir.model,name:share.model_ir_model_access
+msgid "ir.model.access"
+msgstr ""
+
+#. module: share
+#: view:share.wizard:0
+msgid "or"
+msgstr ""
+
+#. module: share
+#: help:share.wizard,access_mode:0
+msgid "Access rights to be granted on the shared documents."
+msgstr ""
diff --git a/addons/share/res_users.py b/addons/share/res_users.py
index 25fd25c234f..30200133f8e 100644
--- a/addons/share/res_users.py
+++ b/addons/share/res_users.py
@@ -34,7 +34,6 @@ class res_groups(osv.osv):
domain.append(('share', '=', False))
return super(res_groups, self).get_application_groups(cr, uid, domain=domain, context=context)
-res_groups()
class res_users(osv.osv):
_name = 'res.users'
@@ -43,6 +42,5 @@ class res_users(osv.osv):
'share': fields.boolean('Share User', readonly=True,
help="External user with limited access, created only for the purpose of sharing data.")
}
-res_users()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/share/wizard/share_wizard.py b/addons/share/wizard/share_wizard.py
index 429a1dc2f08..3a26dcb9e6b 100644
--- a/addons/share/wizard/share_wizard.py
+++ b/addons/share/wizard/share_wizard.py
@@ -205,7 +205,7 @@ class share_wizard(osv.TransientModel):
raise osv.except_osv(_('No email address configured'),
_('You must configure your email address in the user preferences before using the Share button.'))
model, res_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'share', 'action_share_wizard_step1')
- action = self.pool.get(model).read(cr, uid, res_id, context=context)
+ action = self.pool[model].read(cr, uid, res_id, context=context)
action['res_id'] = ids[0]
action.pop('context', '')
return action
@@ -404,7 +404,7 @@ class share_wizard(osv.TransientModel):
local_rel_fields = []
models = [x[1].model for x in relation_fields]
model_obj = self.pool.get('ir.model')
- model_osv = self.pool.get(model.model)
+ model_osv = self.pool[model.model]
for colinfo in model_osv._all_columns.itervalues():
coldef = colinfo.column
coltype = coldef._type
@@ -412,7 +412,7 @@ class share_wizard(osv.TransientModel):
if coltype in ttypes and colinfo.column._obj not in models:
relation_model_id = model_obj.search(cr, UID_ROOT, [('model','=',coldef._obj)])[0]
relation_model_browse = model_obj.browse(cr, UID_ROOT, relation_model_id, context=context)
- relation_osv = self.pool.get(coldef._obj)
+ relation_osv = self.pool[coldef._obj]
if coltype == 'one2many':
# don't record reverse path if it's not a real m2o (that happens, but rarely)
dest_model_ci = relation_osv._all_columns
@@ -422,7 +422,7 @@ class share_wizard(osv.TransientModel):
local_rel_fields.append((relation_field, relation_model_browse))
for parent in relation_osv._inherits:
if parent not in models:
- parent_model = self.pool.get(parent)
+ parent_model = self.pool[parent]
parent_colinfos = parent_model._all_columns
parent_model_browse = model_obj.browse(cr, UID_ROOT,
model_obj.search(cr, UID_ROOT, [('model','=',parent)]))[0]
@@ -458,7 +458,7 @@ class share_wizard(osv.TransientModel):
"""
# obj0 class and its parents
obj0 = [(None, model)]
- model_obj = self.pool.get(model.model)
+ model_obj = self.pool[model.model]
ir_model_obj = self.pool.get('ir.model')
for parent in model_obj._inherits:
parent_model_browse = ir_model_obj.browse(cr, UID_ROOT,
@@ -777,7 +777,7 @@ class share_wizard(osv.TransientModel):
# Record id not found: issue
if res_id <= 0:
raise osv.except_osv(_('Record id not found'), _('The share engine has not been able to fetch a record_id for your invitation.'))
- self.pool.get(model.model).message_subscribe(cr, uid, [res_id], new_ids + existing_ids, context=context)
+ self.pool[model.model].message_subscribe(cr, uid, [res_id], new_ids + existing_ids, context=context)
# self.send_invite_email(cr, uid, wizard_data, context=context)
# self.send_invite_note(cr, uid, model.model, res_id, wizard_data, context=context)
@@ -823,7 +823,7 @@ class share_wizard(osv.TransientModel):
elif tmp_idx == len(wizard_data.result_line_ids)-2:
body += ' and'
body += '.'
- return self.pool.get(model_name).message_post(cr, uid, [res_id], body=body, context=context)
+ return self.pool[model_name].message_post(cr, uid, [res_id], body=body, context=context)
def send_invite_email(self, cr, uid, wizard_data, context=None):
# TDE Note: not updated because will disappear
@@ -902,7 +902,6 @@ class share_wizard(osv.TransientModel):
options = dict(title=opt_title, search=opt_search)
return {'value': {'embed_code': self._generate_embedded_code(wizard, options)}}
-share_wizard()
class share_result_line(osv.osv_memory):
_name = 'share.wizard.result.line'
diff --git a/addons/stock/partner.py b/addons/stock/partner.py
index f5f02b7cd19..b8bad4faf95 100644
--- a/addons/stock/partner.py
+++ b/addons/stock/partner.py
@@ -41,6 +41,5 @@ class res_partner(osv.osv):
help="This stock location will be used, instead of the default one, as the source location for goods you receive from the current partner"),
}
-res_partner()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock/product.py b/addons/stock/product.py
index 1d56ce64988..29445f671ee 100644
--- a/addons/stock/product.py
+++ b/addons/stock/product.py
@@ -479,7 +479,6 @@ class product_product(osv.osv):
res['fields']['qty_available']['string'] = _('Produced Qty')
return res
-product_product()
class product_template(osv.osv):
_name = 'product.template'
@@ -528,7 +527,6 @@ class product_template(osv.osv):
_defaults = {
'sale_delay': 7,
}
-product_template()
class product_category(osv.osv):
@@ -558,6 +556,5 @@ class product_category(osv.osv):
help="When real-time inventory valuation is enabled on a product, this account will hold the current value of the products.",),
}
-product_category()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock/report/product_stock.py b/addons/stock/report/product_stock.py
index 0315c44281b..d213db673dc 100644
--- a/addons/stock/report/product_stock.py
+++ b/addons/stock/report/product_stock.py
@@ -30,6 +30,7 @@ from openerp.report.render import render
import stock_graph
import StringIO
+import unicodedata
class external_pdf(render):
def __init__(self, pdf):
@@ -107,7 +108,12 @@ class report_stock(report_int):
io = StringIO.StringIO()
gt = stock_graph.stock_graph(io)
for prod_id in products:
- gt.add(prod_id, names.get(prod_id, 'Unknown'), products[prod_id])
+ prod_name = names.get(prod_id,'Unknown')
+ if isinstance(prod_name, str):
+ prod_name = prod_name.decode('utf-8')
+ prod_name = unicodedata.normalize('NFKD',prod_name)
+ prod_name = prod_name.encode('ascii','replace')
+ gt.add(prod_id, prod_name, products[prod_id])
gt.draw()
gt.close()
self.obj = external_pdf(io.getvalue())
diff --git a/addons/stock/report/report_stock.py b/addons/stock/report/report_stock.py
index 0aac0d6599b..d4bbb3ab127 100644
--- a/addons/stock/report/report_stock.py
+++ b/addons/stock/report/report_stock.py
@@ -77,7 +77,6 @@ class stock_report_prodlots(osv.osv):
def unlink(self, cr, uid, ids, context=None):
raise osv.except_osv(_('Error!'), _('You cannot delete any record!'))
-stock_report_prodlots()
class stock_report_tracklots(osv.osv):
_name = "stock.report.tracklots"
@@ -133,7 +132,6 @@ class stock_report_tracklots(osv.osv):
def unlink(self, cr, uid, ids, context=None):
raise osv.except_osv(_('Error!'), _('You cannot delete any record!'))
-stock_report_tracklots()
class report_stock_lines_date(osv.osv):
_name = "report.stock.lines.date"
@@ -162,6 +160,5 @@ class report_stock_lines_date(osv.osv):
group by p.id
)""")
-report_stock_lines_date()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock/report/report_stock_move.py b/addons/stock/report/report_stock_move.py
index 39591021735..b8c22062fa5 100644
--- a/addons/stock/report/report_stock_move.py
+++ b/addons/stock/report/report_stock_move.py
@@ -142,7 +142,6 @@ class report_stock_move(osv.osv):
)
""")
-report_stock_move()
class report_stock_inventory(osv.osv):
@@ -193,6 +192,7 @@ CREATE OR REPLACE view report_stock_inventory AS (
LEFT JOIN product_uom pu2 ON (m.product_uom=pu2.id)
LEFT JOIN product_uom u ON (m.product_uom=u.id)
LEFT JOIN stock_location l ON (m.location_id=l.id)
+ WHERE m.state != 'cancel'
GROUP BY
m.id, m.product_id, m.product_uom, pt.categ_id, m.partner_id, m.location_id, m.location_dest_id,
m.prodlot_id, m.date, m.state, l.usage, l.scrap_location, m.company_id, pt.uom_id, to_char(m.date, 'YYYY'), to_char(m.date, 'MM')
@@ -216,13 +216,13 @@ CREATE OR REPLACE view report_stock_inventory AS (
LEFT JOIN product_uom pu2 ON (m.product_uom=pu2.id)
LEFT JOIN product_uom u ON (m.product_uom=u.id)
LEFT JOIN stock_location l ON (m.location_dest_id=l.id)
+ WHERE m.state != 'cancel'
GROUP BY
m.id, m.product_id, m.product_uom, pt.categ_id, m.partner_id, m.location_id, m.location_dest_id,
m.prodlot_id, m.date, m.state, l.usage, l.scrap_location, m.company_id, pt.uom_id, to_char(m.date, 'YYYY'), to_char(m.date, 'MM')
)
);
""")
-report_stock_inventory()
diff --git a/addons/stock/report/report_stock_move_view.xml b/addons/stock/report/report_stock_move_view.xml
index 4f3e256389c..fcf99f6e51e 100644
--- a/addons/stock/report/report_stock_move_view.xml
+++ b/addons/stock/report/report_stock_move_view.xml
@@ -149,7 +149,7 @@
<field name="location_id" filter_domain="[('location_id', 'child_of', self)]"/>
<field name="company_id" groups="base.group_multi_company"/>
<group expand="0" string="Extended Filters...">
- <field name="partner_id" context="{'contact_display':'partner'}"/>
+ <field name="partner_id" context="{'contact_display':'partner'}" filter_domain="[('partner_id', 'child_of', self)]"/>
<field name="product_categ_id" />
<field name="prodlot_id"/>
<field name="state"/>
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index be0dd59468c..764d9de453e 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -49,7 +49,6 @@ class stock_incoterms(osv.osv):
'active': True,
}
-stock_incoterms()
class stock_journal(osv.osv):
_name = "stock.journal"
@@ -62,7 +61,6 @@ class stock_journal(osv.osv):
'user_id': lambda s, c, u, ctx: u
}
-stock_journal()
#----------------------------------------------------------
# Stock Location
@@ -472,7 +470,6 @@ class stock_location(osv.osv):
continue
return False
-stock_location()
class stock_tracking(osv.osv):
@@ -538,7 +535,6 @@ class stock_tracking(osv.osv):
"""
return self.pool.get('action.traceability').action_traceability(cr,uid,ids,context)
-stock_tracking()
#----------------------------------------------------------
# Stock Picking
@@ -1491,7 +1487,6 @@ class stock_production_lot(osv.osv):
default.update(date=time.strftime('%Y-%m-%d %H:%M:%S'), move_ids=[])
return super(stock_production_lot, self).copy(cr, uid, id, default=default, context=context)
-stock_production_lot()
class stock_production_lot_revision(osv.osv):
_name = 'stock.production.lot.revision'
@@ -1512,7 +1507,6 @@ class stock_production_lot_revision(osv.osv):
'date': fields.date.context_today,
}
-stock_production_lot_revision()
# ----------------------------------------------------
# Move
@@ -2737,7 +2731,6 @@ class stock_move(osv.osv):
return [move.id for move in complete]
-stock_move()
class stock_inventory(osv.osv):
_name = "stock.inventory"
@@ -2860,7 +2853,6 @@ class stock_inventory(osv.osv):
self.write(cr, uid, [inv.id], {'state': 'cancel'}, context=context)
return True
-stock_inventory()
class stock_inventory_line(osv.osv):
_name = "stock.inventory.line"
@@ -2900,7 +2892,6 @@ class stock_inventory_line(osv.osv):
result = {'product_qty': amount, 'product_uom': uom, 'prod_lot_id': False}
return {'value': result}
-stock_inventory_line()
#----------------------------------------------------------
# Stock Warehouse
@@ -2932,7 +2923,6 @@ class stock_warehouse(osv.osv):
'lot_output_id': _default_lot_output_id,
}
-stock_warehouse()
#----------------------------------------------------------
# "Empty" Classes that are used to vary from the original stock.picking (that are dedicated to the internal pickings)
@@ -2944,6 +2934,12 @@ class stock_picking_in(osv.osv):
_table = "stock_picking"
_description = "Incoming Shipments"
+ def search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False):
+ return self.pool.get('stock.picking').search(cr, user, args, offset, limit, order, context, count)
+
+ def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
+ return self.pool.get('stock.picking').read(cr, uid, ids, fields=fields, context=context, load=load)
+
def check_access_rights(self, cr, uid, operation, raise_exception=True):
#override in order to redirect the check of acces rights on the stock.picking object
return self.pool.get('stock.picking').check_access_rights(cr, uid, operation, raise_exception=raise_exception)
@@ -2999,6 +2995,12 @@ class stock_picking_out(osv.osv):
_table = "stock_picking"
_description = "Delivery Orders"
+ def search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False):
+ return self.pool.get('stock.picking').search(cr, user, args, offset, limit, order, context, count)
+
+ def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
+ return self.pool.get('stock.picking').read(cr, uid, ids, fields=fields, context=context, load=load)
+
def check_access_rights(self, cr, uid, operation, raise_exception=True):
#override in order to redirect the check of acces rights on the stock.picking object
return self.pool.get('stock.picking').check_access_rights(cr, uid, operation, raise_exception=raise_exception)
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index 6162d073fde..6097885175b 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -817,7 +817,7 @@
<filter icon="terp-check" name="available" string="Ready" domain="[('state','=','assigned')]" help="Assigned Internal Moves"/>
<filter icon="terp-camera_test" name="confirmed" string="Waiting" domain="[('state','=','confirmed')]" help="Confirmed Internal Moves"/>
<filter icon="terp-dialog-close" name="done" string="Done" domain="[('state','=','done')]" help="Pickings already processed"/>
- <field name="partner_id"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="product_id"/>
<field name="stock_journal_id"/>
<group expand="0" string="Group By...">
@@ -944,6 +944,7 @@
<filter icon="terp-accessories-archiver-minus" string="Back Orders" domain="[('backorder_id', '!=', False)]" help="Is a Back Order"/>
<separator/>
<filter icon="terp-dolar" name="to_invoice" string="To Invoice" domain="[('invoice_state','=','2binvoiced')]" help="Delivery orders to invoice"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="stock_journal_id"/>
<field name="company_id" groups="base.group_multi_company"/>
<group expand="0" string="Group By...">
@@ -1069,6 +1070,7 @@
<filter icon="terp-accessories-archiver-minus" string="Back Orders" domain="[('backorder_id', '!=', False)]" help="Is a Back Order"/>
<separator/>
<filter string="To Invoice" name="to_invoice" icon="terp-dolar" domain="[('invoice_state', '=', '2binvoiced')]"/>
+ <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="stock_journal_id"/>
<field name="product_id"/>
<group expand="0" string="Group By...">
@@ -1380,7 +1382,7 @@
<filter icon="terp-go-today" string="Today" domain="[('date','&lt;=',time.strftime('%%Y-%%m-%%d 23:59:59')),('date','&gt;=',time.strftime('%%Y-%%m-%%d 00:00:00'))]" help="Orders processed Today or planned for Today"/>
<field name="product_id"/>
<field name="name" string="Location" filter_domain="['|',('location_id','ilike',self),('location_dest_id','ilike',self)]"/>
- <field name="partner_id" string="Partner" filter_domain="[('picking_id.partner_id','ilike',self)]"/>
+ <field name="partner_id" string="Partner" filter_domain="[('picking_id.partner_id','child_of',self)]"/>
<field name="prodlot_id"/>
<group expand="0" string="Group By...">
<filter string="Product" name="by_product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
diff --git a/addons/stock/test/stock_report.yml b/addons/stock/test/stock_report.yml
index b1590a4d819..2b062742294 100644
--- a/addons/stock/test/stock_report.yml
+++ b/addons/stock/test/stock_report.yml
@@ -3,8 +3,9 @@
-
!python {model: stock.location}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.lot.stock.overview').create(cr, uid, [ref('location_refrigerator')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('location_refrigerator')], 'lot.stock.overview', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-overview'+format), 'wb+').write(data)
-
@@ -12,8 +13,9 @@
-
!python {model: stock.location}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.lot.stock.overview_all').create(cr, uid, [ref('location_refrigerator')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('location_refrigerator')], 'lot.stock.overview_all', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-overviewall'+format), 'wb+').write(data)
-
@@ -21,8 +23,9 @@
-
!python {model: stock.inventory}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.stock.inventory.move').create(cr, uid, [ref('stock_inventory_icecream')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('stock_inventory_icecream')], 'stock.inventory.move', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-stock_inventory_move.'+format), 'wb+').write(data)
-
@@ -30,8 +33,9 @@
-
!python {model: stock.picking}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.stock.picking.list').create(cr, uid, [ref('outgoing_shipment')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('outgoing_shipment')], 'stock.picking.list', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-picking_list'+format), 'wb+').write(data)
-
@@ -39,8 +43,9 @@
-
!python {model: product.product}: |
import os
- from openerp import netsvc, tools
- (data, format) = netsvc.LocalService('report.stock.product.history').create(cr, uid, [ref('product_icecream')], {}, {})
+ import openerp.report
+ from openerp import tools
+ data, format = openerp.report.render_report(cr, uid, [ref('product_icecream')], 'stock.product.history', {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-product_stock_report.'+format), 'wb+').write(data)
diff --git a/addons/stock/wizard/stock_change_standard_price.py b/addons/stock/wizard/stock_change_standard_price.py
index 881b5fd9af7..e6614724454 100644
--- a/addons/stock/wizard/stock_change_standard_price.py
+++ b/addons/stock/wizard/stock_change_standard_price.py
@@ -116,6 +116,5 @@ class change_standard_price(osv.osv_memory):
prod_obj.do_change_standard_price(cr, uid, [rec_id], datas, context)
return {'type': 'ir.actions.act_window_close'}
-change_standard_price()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock/wizard/stock_fill_inventory.py b/addons/stock/wizard/stock_fill_inventory.py
index 237033bb7b0..e3341bd6a80 100644
--- a/addons/stock/wizard/stock_fill_inventory.py
+++ b/addons/stock/wizard/stock_fill_inventory.py
@@ -143,6 +143,5 @@ class stock_fill_inventory(osv.osv_memory):
return {'type': 'ir.actions.act_window_close'}
-stock_fill_inventory()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock/wizard/stock_inventory_merge.py b/addons/stock/wizard/stock_inventory_merge.py
index 171a193e173..e2b5cff513d 100644
--- a/addons/stock/wizard/stock_inventory_merge.py
+++ b/addons/stock/wizard/stock_inventory_merge.py
@@ -86,7 +86,6 @@ class stock_inventory_merge(osv.osv_memory):
return {'type': 'ir.actions.act_window_close'}
-stock_inventory_merge()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock/wizard/stock_invoice_onshipping.py b/addons/stock/wizard/stock_invoice_onshipping.py
index 7c960c5e617..c95508cd71b 100644
--- a/addons/stock/wizard/stock_invoice_onshipping.py
+++ b/addons/stock/wizard/stock_invoice_onshipping.py
@@ -39,7 +39,7 @@ class stock_invoice_onshipping(osv.osv_memory):
if not model or 'stock.picking' not in model:
return []
- model_pool = self.pool.get(model)
+ model_pool = self.pool[model]
journal_obj = self.pool.get('account.journal')
res_ids = context and context.get('active_ids', [])
vals = []
@@ -119,7 +119,7 @@ class stock_invoice_onshipping(osv.osv_memory):
elif inv_type == "in_refund":
action_model,action_id = data_pool.get_object_reference(cr, uid, 'account', "action_invoice_tree4")
if action_model:
- action_pool = self.pool.get(action_model)
+ action_pool = self.pool[action_model]
action = action_pool.read(cr, uid, action_id, context=context)
action['domain'] = "[('id','in', ["+','.join(map(str,invoice_ids))+"])]"
return action
@@ -146,6 +146,5 @@ class stock_invoice_onshipping(osv.osv_memory):
context=context)
return res
-stock_invoice_onshipping()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock/wizard/stock_location_product.py b/addons/stock/wizard/stock_location_product.py
index 59d99167e6a..ef7c9848160 100644
--- a/addons/stock/wizard/stock_location_product.py
+++ b/addons/stock/wizard/stock_location_product.py
@@ -57,6 +57,5 @@ class stock_location_product(osv.osv_memory):
'domain': [('type', '<>', 'service')],
}
-stock_location_product()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock/wizard/stock_move.py b/addons/stock/wizard/stock_move.py
index 09f684aa691..a98d0ebda02 100644
--- a/addons/stock/wizard/stock_move.py
+++ b/addons/stock/wizard/stock_move.py
@@ -78,7 +78,6 @@ class stock_move_consume(osv.osv_memory):
context=context)
return {'type': 'ir.actions.act_window_close'}
-stock_move_consume()
class stock_move_scrap(osv.osv_memory):
@@ -139,7 +138,6 @@ class stock_move_scrap(osv.osv_memory):
context=context)
return {'type': 'ir.actions.act_window_close'}
-stock_move_scrap()
class split_in_production_lot(osv.osv_memory):
@@ -255,7 +253,6 @@ class split_in_production_lot(osv.osv_memory):
return new_move
-split_in_production_lot()
class stock_move_split_lines_exist(osv.osv_memory):
_name = "stock.move.split.lines"
diff --git a/addons/stock/wizard/stock_return_picking.py b/addons/stock/wizard/stock_return_picking.py
index 4eb817e9c71..c51e1415249 100644
--- a/addons/stock/wizard/stock_return_picking.py
+++ b/addons/stock/wizard/stock_return_picking.py
@@ -19,7 +19,6 @@
#
##############################################################################
-from openerp import netsvc
import time
from openerp.osv import osv,fields
@@ -39,7 +38,6 @@ class stock_return_picking_memory(osv.osv_memory):
}
-stock_return_picking_memory()
class stock_return_picking(osv.osv_memory):
@@ -226,6 +224,5 @@ class stock_return_picking(osv.osv_memory):
'context':context,
}
-stock_return_picking()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock/wizard/stock_splitinto.py b/addons/stock/wizard/stock_splitinto.py
index 3485a6e8264..76a80595be6 100644
--- a/addons/stock/wizard/stock_splitinto.py
+++ b/addons/stock/wizard/stock_splitinto.py
@@ -80,7 +80,6 @@ class stock_split_into(osv.osv_memory):
return {'type': 'ir.actions.act_window_close'}
-stock_split_into()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock/wizard/stock_traceability.py b/addons/stock/wizard/stock_traceability.py
index 123a76acd43..c13fc1cf7a6 100644
--- a/addons/stock/wizard/stock_traceability.py
+++ b/addons/stock/wizard/stock_traceability.py
@@ -53,6 +53,7 @@ class action_traceability(osv.osv_memory):
'domain': "[('id','in',["+','.join(map(str, ids))+"])]",
'name': ((type1=='move_history_ids2') and _('Upstream Traceability')) or _('Downstream Traceability'),
'view_mode': 'tree',
+ 'view_type': 'tree',
'res_model': 'stock.move',
'field_parent': type1,
'view_id': (view_id,'View'),
@@ -61,7 +62,6 @@ class action_traceability(osv.osv_memory):
}
return value
-action_traceability()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock_invoice_directly/wizard/stock_invoice.py b/addons/stock_invoice_directly/wizard/stock_invoice.py
index 5de6490dc0f..ba41de626da 100644
--- a/addons/stock_invoice_directly/wizard/stock_invoice.py
+++ b/addons/stock_invoice_directly/wizard/stock_invoice.py
@@ -45,6 +45,5 @@ class invoice_directly(osv.osv_memory):
}
return {'type': 'ir.actions.act_window_close'}
-invoice_directly()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock_location/procurement_pull.py b/addons/stock_location/procurement_pull.py
index 9f5dfb77375..5b030b5befe 100644
--- a/addons/stock_location/procurement_pull.py
+++ b/addons/stock_location/procurement_pull.py
@@ -19,7 +19,6 @@
##############################################################################
from openerp.osv import osv
-from openerp import netsvc
from openerp.tools.translate import _
class procurement_order(osv.osv):
diff --git a/addons/stock_location/stock_location.py b/addons/stock_location/stock_location.py
index 1258ddb529f..e22ccf80f8f 100644
--- a/addons/stock_location/stock_location.py
+++ b/addons/stock_location/stock_location.py
@@ -54,7 +54,6 @@ class stock_location_path(osv.osv):
'invoice_state': 'none',
'picking_type': 'internal',
}
-stock_location_path()
class product_pulled_flow(osv.osv):
_name = 'product.pulled.flow'
@@ -85,7 +84,6 @@ class product_pulled_flow(osv.osv):
'invoice_state': 'none',
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'product.pulled.flow', context=c),
}
-product_pulled_flow()
class product_product(osv.osv):
_inherit = 'product.product'
@@ -96,7 +94,6 @@ class product_product(osv.osv):
help="These rules set the right path of the product in the "\
"whole location tree.")
}
-product_product()
class stock_move(osv.osv):
_inherit = 'stock.move'
@@ -114,7 +111,6 @@ class stock_move(osv.osv):
res = super(stock_move, self)._prepare_chained_picking(cr, uid, picking_name, picking, picking_type, moves_todo, context=context)
res.update({'invoice_state': moves_todo[0][1][6] or 'none'})
return res
-stock_move()
class stock_location(osv.osv):
_inherit = 'stock.location'
@@ -124,5 +120,4 @@ class stock_location(osv.osv):
if path.location_from_id.id == location.id:
return path.location_dest_id, path.auto, path.delay, path.journal_id and path.journal_id.id or False, path.company_id and path.company_id.id or False, path.picking_type, path.invoice_state
return super(stock_location, self).chained_location_get(cr, uid, location, partner, product, context)
-stock_location()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock_no_autopicking/stock_no_autopicking.py b/addons/stock_no_autopicking/stock_no_autopicking.py
index 904854f3533..dd8fb31f59f 100644
--- a/addons/stock_no_autopicking/stock_no_autopicking.py
+++ b/addons/stock_no_autopicking/stock_no_autopicking.py
@@ -29,12 +29,10 @@ class product(osv.osv):
_defaults = {
'auto_pick': True
}
-product()
class mrp_production(osv.osv):
_inherit = "mrp.production"
def _get_auto_picking(self, cr, uid, production):
return production.product_id.auto_pick
-mrp_production()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/subscription/subscription.py b/addons/subscription/subscription.py
index 92bde135bc6..b7ae720c187 100644
--- a/addons/subscription/subscription.py
+++ b/addons/subscription/subscription.py
@@ -38,7 +38,6 @@ class subscription_document(osv.osv):
_defaults = {
'active' : lambda *a: True,
}
-subscription_document()
class subscription_document_fields(osv.osv):
_name = "subscription.document.fields"
@@ -50,7 +49,6 @@ class subscription_document_fields(osv.osv):
'document_id': fields.many2one('subscription.document', 'Subscription Document', ondelete='cascade'),
}
_defaults = {}
-subscription_document_fields()
def _get_document_types(self, cr, uid, context=None):
cr.execute('select m.model, s.name from subscription_document s, ir_model m WHERE s.model = m.id order by s.name')
@@ -115,7 +113,7 @@ class subscription_subscription(osv.osv):
try:
(model_name, id) = row['doc_source'].split(',')
id = int(id)
- model = self.pool.get(model_name)
+ model = self.pool[model_name]
except:
raise osv.except_osv(_('Wrong Source Document !'), _('Please provide another source document.\nThis one does not exist !'))
@@ -136,7 +134,7 @@ class subscription_subscription(osv.osv):
# the subscription is over and we mark it as being done
if remaining == 1:
state = 'done'
- id = self.pool.get(model_name).copy(cr, uid, id, default, context)
+ id = self.pool[model_name].copy(cr, uid, id, default, context)
self.pool.get('subscription.subscription.history').create(cr, uid, {'subscription_id': row['id'], 'date':time.strftime('%Y-%m-%d %H:%M:%S'), 'document_id': model_name+','+str(id)})
self.write(cr, uid, [row['id']], {'state':state})
return True
@@ -157,7 +155,6 @@ class subscription_subscription(osv.osv):
def set_draft(self, cr, uid, ids, context=None):
self.write(cr, uid, ids, {'state':'draft'})
return True
-subscription_subscription()
class subscription_subscription_history(osv.osv):
_name = "subscription.subscription.history"
@@ -168,7 +165,6 @@ class subscription_subscription_history(osv.osv):
'subscription_id': fields.many2one('subscription.subscription', 'Subscription', ondelete='cascade'),
'document_id': fields.reference('Source Document', required=True, selection=_get_document_types, size=128),
}
-subscription_subscription_history()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/survey/survey.py b/addons/survey/survey.py
index 241b9739016..ad96145741b 100644
--- a/addons/survey/survey.py
+++ b/addons/survey/survey.py
@@ -25,7 +25,7 @@ from dateutil.relativedelta import relativedelta
from time import strftime
import os
-from openerp import netsvc, tools
+from openerp import tools
from openerp.osv import fields, osv
from openerp.tools.translate import _
@@ -36,7 +36,6 @@ class survey_type(osv.osv):
'name': fields.char("Name", size=128, required=1, translate=True),
'code': fields.char("Code", size=64),
}
-survey_type()
class survey(osv.osv):
_name = 'survey'
@@ -196,7 +195,6 @@ class survey(osv.osv):
'context': context
}
-survey()
class survey_history(osv.osv):
_name = 'survey.history'
@@ -210,7 +208,6 @@ class survey_history(osv.osv):
_defaults = {
'date': lambda * a: datetime.datetime.now()
}
-survey_history()
class survey_page(osv.osv):
_name = 'survey.page'
@@ -260,7 +257,6 @@ class survey_page(osv.osv):
vals.update({'title':title})
return super(survey_page, self).copy(cr, uid, ids, vals, context=context)
-survey_page()
class survey_question(osv.osv):
_name = 'survey.question'
@@ -561,7 +557,6 @@ class survey_question(osv.osv):
data['page_id']= context.get('page_id', False)
return data
-survey_question()
class survey_question_column_heading(osv.osv):
@@ -594,7 +589,6 @@ class survey_question_column_heading(osv.osv):
'in_visible_rating_weight': _get_in_visible_rating_weight,
'in_visible_menu_choice': _get_in_visible_menu_choice,
}
-survey_question_column_heading()
class survey_answer(osv.osv):
_name = 'survey.answer'
@@ -651,7 +645,6 @@ class survey_answer(osv.osv):
data = super(survey_answer, self).default_get(cr, uid, fields, context)
return data
-survey_answer()
class survey_response(osv.osv):
_name = "survey.response"
@@ -684,7 +677,6 @@ class survey_response(osv.osv):
def copy(self, cr, uid, id, default=None, context=None):
raise osv.except_osv(_('Warning!'),_('You cannot duplicate the resource!'))
-survey_response()
class survey_response_line(osv.osv):
_name = 'survey.response.line'
@@ -708,7 +700,6 @@ class survey_response_line(osv.osv):
'state' : lambda * a: "draft",
}
-survey_response_line()
class survey_tbl_column_heading(osv.osv):
_name = 'survey.tbl.column.heading'
@@ -720,7 +711,6 @@ class survey_tbl_column_heading(osv.osv):
'response_table_id': fields.many2one('survey.response.line', 'Answer', ondelete='cascade'),
}
-survey_tbl_column_heading()
class survey_response_answer(osv.osv):
_name = 'survey.response.answer'
@@ -736,7 +726,6 @@ class survey_response_answer(osv.osv):
'comment_field': fields.char('Comment', size = 255)
}
-survey_response_answer()
class res_users(osv.osv):
_inherit = "res.users"
@@ -745,7 +734,6 @@ class res_users(osv.osv):
'survey_id': fields.many2many('survey', 'survey_users_rel', 'uid', 'sid', 'Groups'),
}
-res_users()
class survey_request(osv.osv):
_name = "survey.request"
@@ -786,6 +774,5 @@ class survey_request(osv.osv):
return {'value': {'email': user.email}}
return {}
-survey_request()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/survey/wizard/survey_answer.py b/addons/survey/wizard/survey_answer.py
index d935eb92ade..6d473754988 100644
--- a/addons/survey/wizard/survey_answer.py
+++ b/addons/survey/wizard/survey_answer.py
@@ -25,8 +25,10 @@ from lxml import etree
import os
from time import strftime
-from openerp import addons, netsvc, tools
+from openerp import tools
+from openerp.modules.module import get_module_resource
from openerp.osv import fields, osv
+import openerp.report
from openerp.tools import to_xml
from openerp.tools.translate import _
from openerp.tools.safe_eval import safe_eval
@@ -401,16 +403,17 @@ class survey_question_wiz(osv.osv_memory):
sur_response_obj.write(cr, uid, [sur_name_read.response], {'state' : 'done'})
# mark the survey request as done; call 'survey_req_done' on its actual model
- survey_req_obj = self.pool.get(context.get('active_model'))
- if survey_req_obj and hasattr(survey_req_obj, 'survey_req_done'):
- survey_req_obj.survey_req_done(cr, uid, context.get('active_ids', []), context=context)
+ if context.get('active_model') in self.pool:
+ survey_req_obj = self.pool[context.get('active_model')]
+ if hasattr(survey_req_obj, 'survey_req_done'):
+ survey_req_obj.survey_req_done(cr, uid, context.get('active_ids', []), context=context)
if sur_rec.send_response:
survey_data = survey_obj.browse(cr, uid, survey_id)
response_id = surv_name_wiz.read(cr, uid, context.get('sur_name_id',False))['response']
report = self.create_report(cr, uid, [survey_id], 'report.survey.browse.response', survey_data.title,context)
attachments = {}
- pdf_filename = addons.get_module_resource('survey', 'report') + survey_data.title + ".pdf"
+ pdf_filename = get_module_resource('survey', 'report') + survey_data.title + ".pdf"
if os.path.exists(pdf_filename):
file = open(pdf_filename)
file_data = ""
@@ -422,7 +425,7 @@ class survey_question_wiz(osv.osv_memory):
attachments[survey_data.title + ".pdf"] = file_data
file.close()
- os.remove(addons.get_module_resource('survey', 'report') + survey_data.title + ".pdf")
+ os.remove(get_module_resource('survey', 'report') + survey_data.title + ".pdf")
context.update({'response_id':response_id})
user_email = user_obj.browse(cr, uid, uid, context).email
resp_email = survey_data.responsible_id and survey_data.responsible_id.email or False
@@ -463,9 +466,8 @@ class survey_question_wiz(osv.osv_memory):
return (False, Exception('Report name and Resources ids are required !!!'))
try:
uid = 1
- service = netsvc.LocalService(report_name);
- (result, format) = service.create(cr, uid, res_ids, {}, context)
- ret_file_name = addons.get_module_resource('survey', 'report') + file_name + '.pdf'
+ result, format = openerp.report.render_report(cr, uid, res_ids, report_name[len('report.'):], {}, context)
+ ret_file_name = get_module_resource('survey', 'report') + file_name + '.pdf'
fp = open(ret_file_name, 'wb+');
fp.write(result);
fp.close();
@@ -609,10 +611,10 @@ class survey_question_wiz(osv.osv_memory):
survey_obj.write(cr, uid, survey_id, {'tot_start_survey' : sur_rec['tot_start_survey'] + 1})
if context.has_key('cur_id'):
if context.has_key('request') and context.get('request',False):
- self.pool.get(context.get('object',False)).write(cr, uid, [int(context.get('cur_id',False))], {'response' : response_id})
- self.pool.get(context.get('object',False)).survey_req_done(cr, uid, [int(context.get('cur_id'))], context)
+ self.pool[context.get('object')].write(cr, uid, [int(context.get('cur_id',False))], {'response' : response_id})
+ self.pool[context.get('object')].survey_req_done(cr, uid, [int(context.get('cur_id'))], context)
else:
- self.pool.get(context.get('object',False)).write(cr, uid, [int(context.get('cur_id',False))], {'response' : response_id})
+ self.pool[context.get('object')].write(cr, uid, [int(context.get('cur_id',False))], {'response' : response_id})
if sur_name_read['store_ans'] and type(safe_eval(sur_name_read['store_ans'])) == dict:
sur_name_read['store_ans'] = safe_eval(sur_name_read['store_ans'])
for key,val in sur_name_read['store_ans'].items():
@@ -1252,6 +1254,5 @@ class survey_question_wiz(osv.osv_memory):
'context': context
}
-survey_question_wiz()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/survey/wizard/survey_browse_answer.py b/addons/survey/wizard/survey_browse_answer.py
index a37a4e4f7ca..1b461761bb5 100644
--- a/addons/survey/wizard/survey_browse_answer.py
+++ b/addons/survey/wizard/survey_browse_answer.py
@@ -55,6 +55,5 @@ class survey_browse_answer(osv.osv_memory):
'context' : context
}
-survey_browse_answer()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/survey/wizard/survey_print.py b/addons/survey/wizard/survey_print.py
index 9f0b21affa6..f0e39f99cb9 100644
--- a/addons/survey/wizard/survey_print.py
+++ b/addons/survey/wizard/survey_print.py
@@ -63,6 +63,5 @@ class survey_print(osv.osv_memory):
'report_name': 'survey.form',
'datas': datas,
}
-survey_print()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/survey/wizard/survey_print_answer.py b/addons/survey/wizard/survey_print_answer.py
index 0cadd6bf832..417d1bb732f 100644
--- a/addons/survey/wizard/survey_print_answer.py
+++ b/addons/survey/wizard/survey_print_answer.py
@@ -68,6 +68,5 @@ class survey_print_answer(osv.osv_memory):
'datas': datas,
}
-survey_print_answer()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/survey/wizard/survey_print_statistics.py b/addons/survey/wizard/survey_print_statistics.py
index f2e25eb8d53..d005dbee31a 100644
--- a/addons/survey/wizard/survey_print_statistics.py
+++ b/addons/survey/wizard/survey_print_statistics.py
@@ -45,6 +45,5 @@ class survey_print_statistics(osv.osv_memory):
'datas': datas,
}
-survey_print_statistics()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/survey/wizard/survey_send_invitation.py b/addons/survey/wizard/survey_send_invitation.py
index 4913ca09eab..ca6a8e4b15d 100644
--- a/addons/survey/wizard/survey_send_invitation.py
+++ b/addons/survey/wizard/survey_send_invitation.py
@@ -26,8 +26,10 @@ import os
import datetime
import socket
-from openerp import addons, netsvc, tools
+from openerp import tools
+from openerp.modules.module import get_module_resource
from openerp.osv import fields, osv
+import openerp.report
from openerp.tools.translate import _
@@ -84,9 +86,8 @@ Thanks,''') % (name, self.pool.get('ir.config_parameter').get_param(cr, uid, 'we
if not report_name or not res_ids:
return (False, Exception('Report name and Resources ids are required !!!'))
try:
- ret_file_name = addons.get_module_resource('survey', 'report') + file_name + '.pdf'
- service = netsvc.LocalService(report_name);
- (result, format) = service.create(cr, uid, res_ids, {}, {})
+ ret_file_name = get_module_resource('survey', 'report') + file_name + '.pdf'
+ result, format = openerp.report.render_report(cr, uid, res_ids, report_name[len('report.'):], {}, {})
fp = open(ret_file_name, 'wb+');
fp.write(result);
fp.close();
@@ -128,7 +129,7 @@ Thanks,''') % (name, self.pool.get('ir.config_parameter').get_param(cr, uid, 'we
new_user.append(use.id)
for id in survey_ref.browse(cr, uid, survey_ids):
report = self.create_report(cr, uid, [id.id], 'report.survey.form', id.title)
- file = open(addons.get_module_resource('survey', 'report') + id.title +".pdf")
+ file = open(get_module_resource('survey', 'report') + id.title +".pdf")
file_data = ""
while 1:
line = file.readline()
@@ -137,7 +138,7 @@ Thanks,''') % (name, self.pool.get('ir.config_parameter').get_param(cr, uid, 'we
break
file.close()
attachments[id.title +".pdf"] = file_data
- os.remove(addons.get_module_resource('survey', 'report') + id.title +".pdf")
+ os.remove(get_module_resource('survey', 'report') + id.title +".pdf")
for partner in self.pool.get('res.partner').browse(cr, uid, partner_ids):
if not partner.email:
@@ -220,7 +221,6 @@ Thanks,''') % (name, self.pool.get('ir.config_parameter').get_param(cr, uid, 'we
'target': 'new',
'context': context
}
-survey_send_invitation()
class survey_send_invitation_log(osv.osv_memory):
_name = 'survey.send.invitation.log'
@@ -235,6 +235,5 @@ class survey_send_invitation_log(osv.osv_memory):
data['note'] = context.get('note', '')
return data
-survey_send_invitation_log()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/warning/warning.py b/addons/warning/warning.py
index 4bdada396bc..e9e9161bacb 100644
--- a/addons/warning/warning.py
+++ b/addons/warning/warning.py
@@ -50,7 +50,6 @@ class res_partner(osv.osv):
'invoice_warn' : 'no-message',
}
-res_partner()
class sale_order(osv.osv):
@@ -79,7 +78,6 @@ class sale_order(osv.osv):
warning['message'] = message and message + ' ' + result['warning']['message'] or result['warning']['message']
return {'value': result.get('value',{}), 'warning':warning}
-sale_order()
class purchase_order(osv.osv):
@@ -108,7 +106,6 @@ class purchase_order(osv.osv):
return {'value': result.get('value',{}), 'warning':warning}
-purchase_order()
class account_invoice(osv.osv):
@@ -145,7 +142,6 @@ class account_invoice(osv.osv):
return {'value': result.get('value',{}), 'warning':warning}
-account_invoice()
class stock_picking(osv.osv):
_inherit = 'stock.picking'
@@ -173,7 +169,6 @@ class stock_picking(osv.osv):
return {'value': result.get('value',{}), 'warning':warning}
-stock_picking()
# FIXME:(class stock_picking_in and stock_picking_out) this is a temporary workaround because of a framework bug (ref: lp:996816).
# It should be removed as soon as the bug is fixed
@@ -243,7 +238,6 @@ class product_product(osv.osv):
'purchase_line_warn' : 'no-message',
}
-product_product()
class sale_order_line(osv.osv):
_inherit = 'sale.order.line'
@@ -279,7 +273,6 @@ class sale_order_line(osv.osv):
return {'value': result.get('value',{}), 'warning':warning}
-sale_order_line()
class purchase_order_line(osv.osv):
_inherit = 'purchase.order.line'
@@ -311,7 +304,6 @@ class purchase_order_line(osv.osv):
return {'value': result.get('value',{}), 'warning':warning}
-purchase_order_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/web_linkedin/i18n/cs.po b/addons/web_linkedin/i18n/cs.po
new file mode 100644
index 00000000000..6057606cdf4
--- /dev/null
+++ b/addons/web_linkedin/i18n/cs.po
@@ -0,0 +1,137 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-03-30 21:01+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-03-31 05:28+0000\n"
+"X-Generator: Launchpad (build 16546)\n"
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "here:"
+msgstr ""
+
+#. module: web_linkedin
+#: field:sale.config.settings,api_key:0
+msgid "API Key"
+msgstr ""
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/js/linkedin.js:249
+#, python-format
+msgid "No results found"
+msgstr ""
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/js/linkedin.js:84
+#, python-format
+msgid "Ok"
+msgstr ""
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "Log into LinkedIn."
+msgstr ""
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/xml/linkedin.xml:13
+#, python-format
+msgid "People"
+msgstr ""
+
+#. module: web_linkedin
+#: model:ir.model,name:web_linkedin.model_sale_config_settings
+msgid "sale.config.settings"
+msgstr ""
+
+#. module: web_linkedin
+#: field:sale.config.settings,server_domain:0
+msgid "unknown"
+msgstr ""
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "https://www.linkedin.com/secure/developer"
+msgstr ""
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/xml/linkedin.xml:15
+#, python-format
+msgid "Companies"
+msgstr ""
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "API key"
+msgstr ""
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "Copy the"
+msgstr ""
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/js/linkedin.js:181
+#, python-format
+msgid "LinkedIn search"
+msgstr ""
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/xml/linkedin.xml:31
+#, python-format
+msgid ""
+"LinkedIn access was not enabled on this server.\n"
+" Please ask your administrator to configure it in Settings > "
+"Configuration > Sales > Social Network Integration."
+msgstr ""
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid ""
+"To use the LinkedIn module with this database, an API Key is required. "
+"Please follow this procedure:"
+msgstr ""
+
+#. module: web_linkedin
+#. openerp-web
+#: code:addons/web_linkedin/static/src/js/linkedin.js:82
+#, python-format
+msgid "LinkedIn is not enabled"
+msgstr ""
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "Add a new application and fill the form:"
+msgstr ""
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "Go to this URL:"
+msgstr ""
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "The programming tool is Javascript"
+msgstr ""
+
+#. module: web_linkedin
+#: view:sale.config.settings:0
+msgid "JavaScript API Domain:"
+msgstr ""
diff --git a/addons/web_shortcuts/i18n/lt.po b/addons/web_shortcuts/i18n/lt.po
new file mode 100644
index 00000000000..70fc0a04b6c
--- /dev/null
+++ b/addons/web_shortcuts/i18n/lt.po
@@ -0,0 +1,25 @@
+# Lithuanian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-04-24 18:29+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Lithuanian <lt@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-04-25 05:20+0000\n"
+"X-Generator: Launchpad (build 16580)\n"
+
+#. module: web_shortcuts
+#. openerp-web
+#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
+#, python-format
+msgid "Add / Remove Shortcut..."
+msgstr "Pridėti / pašalinti trumpinį..."