[MERGE]: Merged with addons
bzr revid: atp@tinyerp.com-20130812043810-y14dmqwvuxrxkuag
This commit is contained in:
commit
1a382f268c
|
@ -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-21 17:04+0000\n"
|
||||
"PO-Revision-Date: 2012-04-13 22:35+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"PO-Revision-Date: 2013-07-30 22:25+0000\n"
|
||||
"Last-Translator: Masaki Yamaya <Unknown>\n"
|
||||
"Language-Team: Japanese <ja@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:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
"X-Launchpad-Export-Date: 2013-07-31 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16718)\n"
|
||||
|
||||
#. module: account_accountant
|
||||
#: model:ir.actions.client,name:account_accountant.action_client_account_menu
|
||||
msgid "Open Accounting Menu"
|
||||
msgstr ""
|
||||
msgstr "会計メニューを開く"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
|
|
|
@ -0,0 +1,361 @@
|
|||
# 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-08-05 10:40+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-08-06 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16718)\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 "ISO 20022"
|
||||
|
||||
#. 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 ""
|
|
@ -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-06-13 17:16+0000\n"
|
||||
"Last-Translator: Akira Hiyama <Unknown>\n"
|
||||
"PO-Revision-Date: 2013-07-30 22:29+0000\n"
|
||||
"Last-Translator: Masaki Yamaya <Unknown>\n"
|
||||
"Language-Team: Japanese <ja@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:34+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
"X-Launchpad-Export-Date: 2013-07-31 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16718)\n"
|
||||
|
||||
#. module: account_budget
|
||||
#: view:account.budget.analytic:0
|
||||
|
@ -418,7 +418,7 @@ msgstr "からの分析"
|
|||
#. module: account_budget
|
||||
#: view:crossovered.budget:0
|
||||
msgid "Draft Budgets"
|
||||
msgstr "ドラフト予算"
|
||||
msgstr "予算案"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "The General Budget '%s' has no Accounts!"
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
# Ukrainian 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-08-01 11:11+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Ukrainian <uk@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-08-02 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16718)\n"
|
||||
|
||||
#. module: account_cancel
|
||||
#: view:account.invoice:0
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
|
@ -0,0 +1,246 @@
|
|||
# Bosnian 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-08-08 22:05+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Bosnian <bs@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-08-09 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16723)\n"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: selection:res.company,check_layout:0
|
||||
msgid "Check on Top"
|
||||
msgstr "Ček na vrhu"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: report:account.print.check.top:0
|
||||
msgid "Open Balance"
|
||||
msgstr "Otvoreno saldo"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: view:account.check.write:0
|
||||
#: view:account.voucher:0
|
||||
msgid "Print Check"
|
||||
msgstr "Štampaj ček"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: selection:res.company,check_layout:0
|
||||
msgid "Check in middle"
|
||||
msgstr "Ćek u sredini"
|
||||
|
||||
#. 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 ""
|
||||
"Ček na vrhu je kompatibilan sa Quicken, QuickBooks i Microsoft Money. Ček u "
|
||||
"sredini je kompatibilan sa Peachtree, ACCPAC i DacEasy. Ček na dnu je "
|
||||
"kompatibilan sa Peachtree, ACCPAC i DacEasy samo"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: selection:res.company,check_layout:0
|
||||
msgid "Check on bottom"
|
||||
msgstr "Ćek na dnu"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: model:ir.actions.act_window,name:account_check_writing.action_account_check_write
|
||||
msgid "Print Check in Batch"
|
||||
msgstr "Štampaj čekove grupno"
|
||||
|
||||
#. 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 "Jedan od odštampanih čekova je već dobio broj."
|
||||
|
||||
#. 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 ""
|
||||
"Označite ovo ako će se za pisanje čekova koristiti dnevnik knjiženja."
|
||||
|
||||
#. module: account_check_writing
|
||||
#: field:account.journal,allow_check_writing:0
|
||||
msgid "Allow Check writing"
|
||||
msgstr "Dozvoli pisanje čekova"
|
||||
|
||||
#. 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 "Opis"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: model:ir.model,name:account_check_writing.model_account_journal
|
||||
msgid "Journal"
|
||||
msgstr "Dnevnik knjiženja"
|
||||
|
||||
#. 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 "Piši čekove"
|
||||
|
||||
#. 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 "Popust"
|
||||
|
||||
#. 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 "Originalni iznos"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: field:res.company,check_layout:0
|
||||
msgid "Check Layout"
|
||||
msgstr "Raspored čeka"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: field:account.voucher,allow_check:0
|
||||
msgid "Allow Check Writing"
|
||||
msgstr "Dozvoli pisanje čeka"
|
||||
|
||||
#. 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 "Plaćanje"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: field:account.journal,use_preprint_check:0
|
||||
msgid "Use Preprinted Check"
|
||||
msgstr "Koristi pred-odštampane čekove"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: model:ir.actions.report.xml,name:account_check_writing.account_print_check_bottom
|
||||
msgid "Print Check (Bottom)"
|
||||
msgstr "Štampaj ček (donji)"
|
||||
|
||||
#. 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"
|
||||
" Kliknite da kreirate nove čekove. \n"
|
||||
" </p><p>\n"
|
||||
" Forma plaćanje čekom omogućava vam da pratite plaćanja koja "
|
||||
"izvršavate\n"
|
||||
" vašim dobavljačima koristeći čekove. Kada odaberete "
|
||||
"dobavljača,\n"
|
||||
" metodu plaćanja i iznos za plaćanje, OpenERP će predložiti "
|
||||
"da izravna\n"
|
||||
" vašu uplatu sa otvorenom fakturom ili računom dobavljača.\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 "Datum dospijeća"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: model:ir.actions.report.xml,name:account_check_writing.account_print_check_middle
|
||||
msgid "Print Check (Middle)"
|
||||
msgstr "Štampaj ček (srednji)"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: model:ir.model,name:account_check_writing.model_res_company
|
||||
msgid "Companies"
|
||||
msgstr "Kompanije"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: code:addons/account_check_writing/wizard/account_check_batch_printing.py:59
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Greška!"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: help:account.check.write,check_number:0
|
||||
msgid "The number of the next check number to be printed."
|
||||
msgstr "Broj sljedećeg čeka za štampanje."
|
||||
|
||||
#. module: account_check_writing
|
||||
#: report:account.print.check.bottom:0
|
||||
#: report:account.print.check.middle:0
|
||||
msgid "Balance Due"
|
||||
msgstr "Saldo valute"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: model:ir.actions.report.xml,name:account_check_writing.account_print_check_top
|
||||
msgid "Print Check (Top)"
|
||||
msgstr "Štampaj ček (na vrhu)"
|
||||
|
||||
#. 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 "Iznos čeka"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: model:ir.model,name:account_check_writing.model_account_voucher
|
||||
msgid "Accounting Voucher"
|
||||
msgstr "Računovodstveni vaučer"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: view:account.check.write:0
|
||||
msgid "or"
|
||||
msgstr "ili"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: field:account.voucher,amount_in_word:0
|
||||
msgid "Amount in Word"
|
||||
msgstr "Pisani iznos"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: model:ir.model,name:account_check_writing.model_account_check_write
|
||||
msgid "Prin Check in Batch"
|
||||
msgstr "Štampaj čekove grupno"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: view:account.check.write:0
|
||||
msgid "Cancel"
|
||||
msgstr "Otkaži"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: field:account.check.write,check_number:0
|
||||
msgid "Next Check Number"
|
||||
msgstr "Sljedeći broj čeka"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: view:account.check.write:0
|
||||
msgid "Check"
|
||||
msgstr "Ček"
|
|
@ -0,0 +1,80 @@
|
|||
# Bosnian 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-08-08 22:20+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Bosnian <bs@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-08-09 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16723)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Greška !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s je bio <b>otvoren</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s je bio <b>obnovljen</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Greška!"
|
||||
|
||||
#. 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 ""
|
||||
"Ne možete eskalirati, već ste na najvišem nivou u odnosu na kategoriju "
|
||||
"prodajnog tima."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s je sad <b>Na čekanju</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s je bio <b>otkazan</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 ""
|
||||
"Već ste na najvišem nivou vaše kategorije prodajnog tima.\n"
|
||||
"Zato ne možete dalje eskalirati."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s je bio <b>zatvoren</b>."
|
|
@ -14,13 +14,7 @@
|
|||
<field name="condition">True</field>
|
||||
<field name="type">ir.actions.server</field>
|
||||
<field name="state">email</field>
|
||||
<field name="email">object.user_id.email</field>
|
||||
<field name="subject">Reminder on Lead: [[object.id ]] [[object.partner_id and 'of ' +object.partner_id.name or '']]</field>
|
||||
<field name="message">Warning unprocessed incoming lead is more than 5 day old.
|
||||
Name: [[object.name ]]
|
||||
ID: [[object.id ]]
|
||||
Description: [[object.description]]
|
||||
</field>
|
||||
<field name="template_id" ref="email_template_opportunity_reminder_mail"/>
|
||||
</record>
|
||||
<record id="rule_set_reminder_lead" model="base.action.rule">
|
||||
<field name="name">Set Auto Reminder on leads which are not open since 5 days.</field>
|
||||
|
|
|
@ -945,42 +945,6 @@ class crm_lead(format_address, osv.osv):
|
|||
vals.update(onchange_stage_values)
|
||||
return super(crm_lead, self).write(cr, uid, ids, vals, context=context)
|
||||
|
||||
def new_mail_send(self, cr, uid, ids, context=None):
|
||||
'''
|
||||
This function opens a window to compose an email, with the edi sale template message loaded by default
|
||||
'''
|
||||
assert len(ids) == 1, 'This option should only be used for a single id at a time.'
|
||||
ir_model_data = self.pool.get('ir.model.data')
|
||||
try:
|
||||
template_id = ir_model_data.get_object_reference(cr, uid, 'crm', 'email_template_opportunity_mail')[1]
|
||||
except ValueError:
|
||||
template_id = False
|
||||
try:
|
||||
compose_form_id = ir_model_data.get_object_reference(cr, uid, 'mail', 'email_compose_message_wizard_form')[1]
|
||||
except ValueError:
|
||||
compose_form_id = False
|
||||
if context is None:
|
||||
context = {}
|
||||
ctx = context.copy()
|
||||
ctx.update({
|
||||
'default_model': 'crm.lead',
|
||||
'default_res_id': ids[0],
|
||||
'default_use_template': bool(template_id),
|
||||
'default_template_id': template_id,
|
||||
'default_composition_mode': 'comment',
|
||||
})
|
||||
return {
|
||||
'name': _('Compose Email'),
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'mail.compose.message',
|
||||
'views': [(compose_form_id, 'form')],
|
||||
'view_id': compose_form_id,
|
||||
'target': 'new',
|
||||
'context': ctx,
|
||||
}
|
||||
|
||||
# ----------------------------------------
|
||||
# Mail Gateway
|
||||
# ----------------------------------------
|
||||
|
|
|
@ -220,6 +220,20 @@
|
|||
<field name="email_to">${not object.partner_id and object.email_from}</field>
|
||||
<field name="body_html"></field>
|
||||
</record>
|
||||
<record id="email_template_opportunity_reminder_mail" model="email.template">
|
||||
<field name="name">Reminder to User</field>
|
||||
<field name="model_id" ref="crm.model_crm_lead"/>
|
||||
<field name="auto_delete" eval="True"/>
|
||||
<field name="email_from">admin@example.com</field>
|
||||
<field name="email_to">${object.user_id != False and object.user_id.email}</field>
|
||||
<field name="subject">Reminder on Lead: ${object.id} from ${object.partner_id != False and object.partner_id.name or object.contact_name}</field>
|
||||
<field name="body_html"><![CDATA[<p>This opportunity did not have any activity since at least 5 days. Here are some details:</p>
|
||||
<ul>
|
||||
<li>Name: ${object.name}</li>
|
||||
<li>ID: ${object.id}</li>
|
||||
<li>Description: ${object.description}</field></li>
|
||||
</ul>]]></field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -408,7 +408,7 @@
|
|||
<group>
|
||||
<group>
|
||||
<field name="partner_id"
|
||||
on_change="onchange_partner_id(partner_id, email_from)"
|
||||
on_change="on_change_partner_id(partner_id)"
|
||||
string="Customer"
|
||||
context="{'default_name': partner_name, 'default_email': email_from, 'default_phone': phone}"/>
|
||||
<field name="email_from" string="Email"/>
|
||||
|
|
|
@ -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-07-09 07:36+0000\n"
|
||||
"PO-Revision-Date: 2013-07-25 13:52+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-07-10 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16696)\n"
|
||||
"X-Launchpad-Export-Date: 2013-07-26 05:14+0000\n"
|
||||
"X-Generator: Launchpad (build 16700)\n"
|
||||
|
||||
#. module: crm
|
||||
#: model:crm.case.stage,name:crm.stage_lead3
|
||||
|
@ -241,7 +241,7 @@ msgstr "Kilép"
|
|||
#: view:crm.lead:0
|
||||
#: field:crm.lead,state_id:0
|
||||
msgid "State"
|
||||
msgstr "Állapot"
|
||||
msgstr "Állam/Megye"
|
||||
|
||||
#. module: crm
|
||||
#: field:res.partner,meeting_count:0
|
||||
|
|
|
@ -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-07-23 03:21+0000\n"
|
||||
"PO-Revision-Date: 2013-08-06 09:41+0000\n"
|
||||
"Last-Translator: fanvil <fanvil@hotmail.com>\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-07-24 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 16700)\n"
|
||||
"X-Launchpad-Export-Date: 2013-08-07 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16721)\n"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead.report:0
|
||||
|
@ -185,7 +185,7 @@ msgstr "预计结束月份"
|
|||
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格式。"
|
||||
msgstr "保留复杂的摘要(消息数量,……等)。这一摘要直接是是HTML格式,以便插入到看板视图。"
|
||||
|
||||
#. module: crm
|
||||
#: code:addons/crm/crm_lead.py:640
|
||||
|
@ -583,6 +583,7 @@ msgid ""
|
|||
" If the call needs to be done then the status is set "
|
||||
"to 'Not Held'."
|
||||
msgstr ""
|
||||
"当一个案子新建时,状态被设为‘待处理’,当案子进行中,状态被设为‘打开’,当电话结束,状态被设为‘挂起’。如果需要电话,状态设为‘未挂起’"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.case.section,message_summary:0
|
||||
|
@ -843,7 +844,7 @@ msgstr "参考2"
|
|||
msgid ""
|
||||
"Link between stages and sales teams. When set, this limitate the current "
|
||||
"stage to the selected sales teams."
|
||||
msgstr ""
|
||||
msgstr "在阶段和销售团队之间建立链接。设置后将限制此阶段只能用于被选中的销售团队。"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.case.stage:0
|
||||
|
@ -979,7 +980,7 @@ msgstr "下一动作"
|
|||
#: code:addons/crm/crm_lead.py:780
|
||||
#, python-format
|
||||
msgid "<b>Partner</b> set to <em>%s</em>."
|
||||
msgstr ""
|
||||
msgstr "<b>业务伙伴</b> 设给 <em>%s</em>."
|
||||
|
||||
#. module: crm
|
||||
#: selection:crm.lead.report,state:0
|
||||
|
@ -1338,7 +1339,7 @@ msgstr "发送邮件的时候,默认的邮件地址来自销售团队。"
|
|||
msgid ""
|
||||
"Phone Calls Assigned to the current user or with a team having the current "
|
||||
"user as team leader"
|
||||
msgstr ""
|
||||
msgstr "被分配给当前用户或者当前用户领导的销售团队的电话沟通任务。"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.segmentation:0
|
||||
|
@ -2884,7 +2885,7 @@ msgstr "发现日期"
|
|||
#. module: crm
|
||||
#: view:crm.lead:0
|
||||
msgid "at"
|
||||
msgstr ""
|
||||
msgstr "在"
|
||||
|
||||
#. module: crm
|
||||
#: model:crm.case.stage,name:crm.stage_lead1
|
||||
|
|
|
@ -22,5 +22,6 @@
|
|||
import email_template
|
||||
import wizard
|
||||
import res_partner
|
||||
import ir_actions
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -59,6 +59,7 @@ campaigns on any OpenERP document.
|
|||
'wizard/email_template_preview_view.xml',
|
||||
'email_template_view.xml',
|
||||
'res_partner_view.xml',
|
||||
'ir_actions_view.xml',
|
||||
'wizard/mail_compose_message_view.xml',
|
||||
'security/ir.model.access.csv'
|
||||
],
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
.. _changelog:
|
||||
|
||||
Changelog
|
||||
=========
|
||||
|
||||
`trunk (saas-2)`
|
||||
----------------
|
||||
|
||||
- ``mail.compose.message``: added support of ``mail_server_id`` from template
|
||||
- Server action update
|
||||
|
||||
- added `email` server action type, now entirely based on email templates.
|
|
@ -0,0 +1,13 @@
|
|||
Email Template module documentation
|
||||
===================================
|
||||
|
||||
Email Template documentation topics
|
||||
'''''''''''''''''''''''''''''''''''
|
||||
|
||||
Changelog
|
||||
'''''''''
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
changelog.rst
|
|
@ -0,0 +1,86 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Business Applications
|
||||
# Copyright (c) 2013 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 fields, osv
|
||||
|
||||
|
||||
class actions_server(osv.Model):
|
||||
""" Add email option in server actions. """
|
||||
_name = 'ir.actions.server'
|
||||
_inherit = ['ir.actions.server']
|
||||
|
||||
def _get_states(self, cr, uid, context=None):
|
||||
res = super(actions_server, self)._get_states(cr, uid, context=context)
|
||||
res.insert(0, ('email', 'Send Email'))
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
'email_from': fields.char('From',
|
||||
help="Sender address; define the template to see its value. If not set, the default "
|
||||
"value will be the author's email alias if configured, or email address."),
|
||||
'email_to': fields.char('To (Emails)',
|
||||
help="Comma-separated recipient addresses; define the template to see its value"),
|
||||
'partner_to': fields.char('To (Partners)',
|
||||
help="Comma-separated ids of recipient partners; define the template to see its value"),
|
||||
'subject': fields.char('Subject',
|
||||
help="Email subject; define the template to see its value"),
|
||||
'body_html': fields.text('Body',
|
||||
help="Rich-text/HTML version of the message; define the template to see its value"),
|
||||
'template_id': fields.many2one('email.template', 'Email Template', ondelete='set null',
|
||||
help="Define the email template to use for the email to send.")
|
||||
}
|
||||
|
||||
def on_change_template_id(self, cr, uid, ids, template_id, context=None):
|
||||
""" Render the raw template in the server action fields. """
|
||||
if template_id:
|
||||
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))
|
||||
if not values.get('email_from'):
|
||||
return {'warning': {'title': 'Incomplete template', 'message': 'Your template should define email_from'}, 'value': values}
|
||||
else:
|
||||
values = self.default_get(cr, uid, ['subject', 'body_html', 'email_from', 'email_to', 'partner_to'], context=context)
|
||||
|
||||
return {'value': values}
|
||||
|
||||
def create(self, cr, uid, values, context=None):
|
||||
if values.get('template_id'):
|
||||
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, values.get('template_id'), fields, context)
|
||||
values.update(dict((field, template_values[field]) for field in fields if template_values.get(field)))
|
||||
return super(actions_server, self).create(cr, uid, values, context=context)
|
||||
|
||||
def write(self, cr, uid, ids, values, context=None):
|
||||
if values.get('template_id'):
|
||||
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, values.get('template_id'), fields, context)
|
||||
values.update(dict((field, template_values[field]) for field in fields if template_values.get(field)))
|
||||
return super(actions_server, self).write(cr, uid, ids, values, context=context)
|
||||
|
||||
def run_action_email(self, cr, uid, action, eval_context=None, context=None):
|
||||
if not action.template_id or not context.get('active_id'):
|
||||
return False
|
||||
self.pool['email.template'].send_mail(cr, uid, action.template_id.id, context.get('active_id'),
|
||||
force_send=False, raise_exception=False, context=context)
|
||||
return False
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<record model="ir.ui.view" id="view_server_action_form_template">
|
||||
<field name="name">ir.actions.server.form</field>
|
||||
<field name="model">ir.actions.server</field>
|
||||
<field name="inherit_id" ref="base.view_server_action_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//page[@name='code']" position="after">
|
||||
<page string="Email" autofocus="autofocus"
|
||||
attrs="{'invisible': [('state', '!=', 'email')]}">
|
||||
<p attrs="{'invisible': [('model_id', '!=', False)]}">
|
||||
Please set the Base Model before setting the action details.
|
||||
</p>
|
||||
<group attrs="{'invisible': [('model_id', '=', False)]}">
|
||||
<field name="template_id"
|
||||
on_change='on_change_template_id(template_id)'
|
||||
domain="[('model_id', '=', model_id)]"
|
||||
attrs="{'required': [('state', '=', 'email')]}"/>
|
||||
<p colspan="2" attrs="{'invisible': [('template_id', '!=', False)]}">
|
||||
Choose a template to display its values.
|
||||
</p>
|
||||
<p colspan="2" attrs="{'invisible': [('template_id', '=', False)]}">
|
||||
The values displayed hereunder are informative. When sending the email, the values
|
||||
will be taken from the email template.
|
||||
</p>
|
||||
</group>
|
||||
<group attrs="{'invisible': ['|', ('model_id', '=', False), ('template_id', '=', False)]}">
|
||||
<label for="email_from"/>
|
||||
<div>
|
||||
<field name="email_from" nolabel="1'" readonly="1"
|
||||
attrs="{'required': [('state', '=', 'email')]}"/>
|
||||
<p attrs="{'invisible': [('email_from', '!=', False)]}">
|
||||
Your template does not defined any email_from. Please update your template.
|
||||
</p>
|
||||
</div>
|
||||
<field name="email_to" readonly="1"/>
|
||||
<field name="partner_to" readonly="1"/>
|
||||
<field name="subject" readonly="1" attrs="{'required': [('state', '=', 'email')]}"/>
|
||||
<field name="body_html" readonly="1" attrs="{'required': [('state', '=', 'email')]}"/>
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
|
@ -18,10 +18,11 @@
|
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
from . import test_mail
|
||||
from . import test_mail, test_ir_actions
|
||||
|
||||
checks = [
|
||||
test_mail,
|
||||
test_ir_actions,
|
||||
]
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -0,0 +1,55 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Business Applications
|
||||
# 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.addons.base.tests.test_ir_actions import TestServerActionsBase
|
||||
|
||||
|
||||
class TestServerActionsEmail(TestServerActionsBase):
|
||||
|
||||
def test_00_state_email(self):
|
||||
""" Test ir.actions.server email type """
|
||||
cr, uid = self.cr, self.uid
|
||||
|
||||
# create email_template
|
||||
template_id = self.registry('email.template').create(cr, uid, {
|
||||
'name': 'TestTemplate',
|
||||
'email_from': 'myself@example.com',
|
||||
'email_to': 'brigitte@example.com',
|
||||
'partner_to': '[%s]' % self.test_partner_id,
|
||||
'model_id': self.res_partner_model_id,
|
||||
'subject': 'About ${object.name}',
|
||||
'body_html': '<p>Dear ${object.name}, your parent is ${object.parent_id and object.parent_id.name or "False"}</p>',
|
||||
})
|
||||
|
||||
self.ir_actions_server.write(cr, uid, self.act_id, {
|
||||
'state': 'email',
|
||||
'template_id': template_id,
|
||||
})
|
||||
run_res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)
|
||||
self.assertFalse(run_res, 'ir_actions_server: email server action correctly finished should return False')
|
||||
|
||||
# check an email is waiting for sending
|
||||
mail_ids = self.registry('mail.mail').search(cr, uid, [('subject', '=', 'About TestingPartner')])
|
||||
self.assertEqual(len(mail_ids), 1, 'ir_actions_server: TODO')
|
||||
# check email content
|
||||
mail = self.registry('mail.mail').browse(cr, uid, mail_ids[0])
|
||||
self.assertEqual(mail.body, '<p>Dear TestingPartner, your parent is False</p>',
|
||||
'ir_actions_server: TODO')
|
|
@ -22,6 +22,7 @@
|
|||
from openerp import tools
|
||||
from openerp.osv import osv, fields
|
||||
|
||||
|
||||
def _reopen(self, res_id, model):
|
||||
return {'type': 'ir.actions.act_window',
|
||||
'view_mode': 'form',
|
||||
|
@ -34,7 +35,8 @@ def _reopen(self, res_id, model):
|
|||
'context': {
|
||||
'default_model': model,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class mail_compose_message(osv.TransientModel):
|
||||
_inherit = 'mail.compose.message'
|
||||
|
@ -58,7 +60,7 @@ class mail_compose_message(osv.TransientModel):
|
|||
context = {}
|
||||
wizard_context = dict(context)
|
||||
for wizard in self.browse(cr, uid, ids, context=context):
|
||||
if wizard.template_id and not wizard.template_id.user_signature:
|
||||
if wizard.template_id:
|
||||
wizard_context['mail_notify_user_signature'] = False # template user_signature is added when generating body_html
|
||||
if not wizard.attachment_ids or wizard.composition_mode == 'mass_mail' or not wizard.template_id:
|
||||
continue
|
||||
|
@ -75,7 +77,7 @@ class mail_compose_message(osv.TransientModel):
|
|||
""" - 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', 'attachment_ids']
|
||||
fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids', 'mail_server_id']
|
||||
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:
|
||||
|
@ -95,7 +97,7 @@ class mail_compose_message(osv.TransientModel):
|
|||
}
|
||||
values['attachment_ids'].append(ir_attach_obj.create(cr, uid, data_attach, context=context))
|
||||
else:
|
||||
values = self.default_get(cr, uid, ['subject', 'body', 'email_from', 'email_to', 'email_cc', 'partner_to', 'reply_to', 'attachment_ids'], context=context)
|
||||
values = self.default_get(cr, uid, ['subject', 'body', 'email_from', 'email_to', 'email_cc', 'partner_to', 'reply_to', 'attachment_ids', 'mail_server_id'], context=context)
|
||||
|
||||
if values.get('body_html'):
|
||||
values['body'] = values.pop('body_html')
|
||||
|
@ -150,7 +152,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', 'attachment_ids', 'attachments']
|
||||
fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids', 'attachments', 'mail_server_id']
|
||||
values = dict((field, template_values[field]) for field in fields if template_values.get(field))
|
||||
values['body'] = values.pop('body_html', '')
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ import urllib2
|
|||
import simplejson
|
||||
|
||||
|
||||
class google_service(osv.osv):
|
||||
class google_service(osv.osv_memory):
|
||||
_name = 'google.service'
|
||||
|
||||
def generate_refresh_token(self, cr, uid, service, authorization_code, context=None):
|
||||
|
@ -51,10 +51,10 @@ class google_service(osv.osv):
|
|||
content = simplejson.loads(content)
|
||||
return content.get('refresh_token')
|
||||
|
||||
def _get_google_token_uri(self, cr, uid, service, context=None):
|
||||
def _get_google_token_uri(self, cr, uid, service, scope, context=None):
|
||||
ir_config = self.pool['ir.config_parameter']
|
||||
params = {
|
||||
'scope': 'https://www.googleapis.com/auth/drive',
|
||||
'scope': scope,
|
||||
'redirect_uri': ir_config.get_param(cr, SUPERUSER_ID, 'google_redirect_uri'),
|
||||
'client_id': ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_id' % service),
|
||||
'response_type': 'code',
|
||||
|
|
|
@ -54,58 +54,69 @@ class config(osv.osv):
|
|||
attachment = attach_pool.browse(cr, uid, attach_ids[0], context)
|
||||
url = attachment.url
|
||||
else:
|
||||
url = self.copy_doc(cr, uid, res_id, template_id, name_gdocs, model.model, context)
|
||||
url = self.copy_doc(cr, uid, res_id, template_id, name_gdocs, model.model, context).get('url')
|
||||
return url
|
||||
|
||||
def copy_doc(self, cr, uid, res_id, template_id, name_gdocs, res_model, context=None):
|
||||
def get_access_token(self, cr, uid, scope=None, context=None):
|
||||
ir_config = self.pool['ir.config_parameter']
|
||||
google_drive_refresh_token = ir_config.get_param(cr, SUPERUSER_ID, 'google_drive_refresh_token')
|
||||
group_config = self.pool['ir.model.data'].get_object_reference(cr, uid, 'base', 'group_erp_manager')[1]
|
||||
user = self.pool['res.users'].read(cr, uid, uid, "groups_id")
|
||||
if not google_drive_refresh_token:
|
||||
raise self.pool.get('res.config.settings').get_config_warning(cr, _("You haven't configured 'Authorization Code' generated from google, Please generate and configure it in %(menu:base_setup.menu_general_configuration)s."), context=context)
|
||||
if group_config in user['groups_id']:
|
||||
raise self.pool.get('res.config.settings').get_config_warning(cr, _("You haven't configured 'Authorization Code' generated from google, Please generate and configure it in %(menu:base_setup.menu_general_configuration)s."), context=context)
|
||||
else:
|
||||
raise osv.except_osv(_('Error!'), _("Google Drive is not yet configured. Please contact your administrator."))
|
||||
google_drive_client_id = ir_config.get_param(cr, SUPERUSER_ID, 'google_drive_client_id')
|
||||
google_drive_client_secret = ir_config.get_param(cr, SUPERUSER_ID, 'google_drive_client_secret')
|
||||
google_web_base_url = ir_config.get_param(cr, SUPERUSER_ID, 'web.base.url')
|
||||
|
||||
#For Getting New Access Token With help of old Refresh Token
|
||||
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept-Encoding": "gzip, deflate"}
|
||||
data = dict(client_id=google_drive_client_id,
|
||||
refresh_token=google_drive_refresh_token,
|
||||
client_secret=google_drive_client_secret,
|
||||
grant_type="refresh_token")
|
||||
|
||||
data = urllib.urlencode(data)
|
||||
data = urllib.urlencode(dict(client_id=google_drive_client_id,
|
||||
refresh_token=google_drive_refresh_token,
|
||||
client_secret=google_drive_client_secret,
|
||||
grant_type="refresh_token",
|
||||
scope=scope or 'https://www.googleapis.com/auth/drive'))
|
||||
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept-Encoding": "gzip, deflate"}
|
||||
try:
|
||||
req = urllib2.Request('https://accounts.google.com/o/oauth2/token', data, headers)
|
||||
content = urllib2.urlopen(req).read()
|
||||
except urllib2.HTTPError:
|
||||
raise self.pool.get('res.config.settings').get_config_warning(cr, _("Something went wrong during the token generation. Please request again an authorization code in %(menu:base_setup.menu_general_configuration)s."), context=context)
|
||||
if group_config in user['groups_id']:
|
||||
raise self.pool.get('res.config.settings').get_config_warning(cr, _("Something went wrong during the token generation. Please request again an authorization code in %(menu:base_setup.menu_general_configuration)s."), context=context)
|
||||
else:
|
||||
raise osv.except_osv(_('Error!'), _("Google Drive is not yet configured. Please contact your administrator."))
|
||||
content = json.loads(content)
|
||||
return content.get('access_token')
|
||||
|
||||
def copy_doc(self, cr, uid, res_id, template_id, name_gdocs, res_model, context=None):
|
||||
ir_config = self.pool['ir.config_parameter']
|
||||
google_web_base_url = ir_config.get_param(cr, SUPERUSER_ID, 'web.base.url')
|
||||
access_token = self.get_access_token(cr, uid, context=context)
|
||||
# Copy template in to drive with help of new access token
|
||||
if 'access_token' in content:
|
||||
request_url = "https://www.googleapis.com/drive/v2/files/%s?fields=parents/id&access_token=%s" % (template_id, content['access_token'])
|
||||
try:
|
||||
req = urllib2.Request(request_url, None, headers)
|
||||
parents = urllib2.urlopen(req).read()
|
||||
except urllib2.HTTPError:
|
||||
raise self.pool.get('res.config.settings').get_config_warning(cr, _("The Google Template cannot be found. Maybe it has been deleted."), context=context)
|
||||
parents_dict = json.loads(parents)
|
||||
request_url = "https://www.googleapis.com/drive/v2/files/%s?fields=parents/id&access_token=%s" % (template_id, access_token)
|
||||
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept-Encoding": "gzip, deflate"}
|
||||
try:
|
||||
req = urllib2.Request(request_url, None, headers)
|
||||
parents = urllib2.urlopen(req).read()
|
||||
except urllib2.HTTPError:
|
||||
raise self.pool.get('res.config.settings').get_config_warning(cr, _("The Google Template cannot be found. Maybe it has been deleted."), context=context)
|
||||
parents_dict = json.loads(parents)
|
||||
|
||||
record_url = "Click on link to open Record in OpenERP\n %s/?db=%s#id=%s&model=%s" % (google_web_base_url, cr.dbname, res_id, res_model)
|
||||
data = {"title": name_gdocs, "description": record_url, "parents": parents_dict['parents']}
|
||||
request_url = "https://www.googleapis.com/drive/v2/files/%s/copy?access_token=%s" % (template_id, content['access_token'])
|
||||
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
|
||||
data_json = json.dumps(data)
|
||||
# resp, content = Http().request(request_url, "POST", data_json, headers)
|
||||
req = urllib2.Request(request_url, data_json, headers)
|
||||
content = urllib2.urlopen(req).read()
|
||||
content = json.loads(content)
|
||||
res = False
|
||||
if 'alternateLink' in content.keys():
|
||||
attach_pool = self.pool.get("ir.attachment")
|
||||
attach_vals = {'res_model': res_model, 'name': name_gdocs, 'res_id': res_id, 'type': 'url', 'url': content['alternateLink']}
|
||||
attach_pool.create(cr, uid, attach_vals)
|
||||
res = content['alternateLink']
|
||||
record_url = "Click on link to open Record in OpenERP\n %s/?db=%s#id=%s&model=%s" % (google_web_base_url, cr.dbname, res_id, res_model)
|
||||
data = {"title": name_gdocs, "description": record_url, "parents": parents_dict['parents']}
|
||||
request_url = "https://www.googleapis.com/drive/v2/files/%s/copy?access_token=%s" % (template_id, access_token)
|
||||
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
|
||||
data_json = json.dumps(data)
|
||||
# resp, content = Http().request(request_url, "POST", data_json, headers)
|
||||
req = urllib2.Request(request_url, data_json, headers)
|
||||
content = urllib2.urlopen(req).read()
|
||||
content = json.loads(content)
|
||||
res = {}
|
||||
if content.get('alternateLink'):
|
||||
attach_pool = self.pool.get("ir.attachment")
|
||||
attach_vals = {'res_model': res_model, 'name': name_gdocs, 'res_id': res_id, 'type': 'url', 'url': content['alternateLink']}
|
||||
res['id'] = attach_pool.create(cr, uid, attach_vals)
|
||||
res['url'] = content['alternateLink']
|
||||
return res
|
||||
|
||||
def get_google_drive_config(self, cr, uid, res_model, res_id, context=None):
|
||||
|
@ -166,6 +177,7 @@ class config(osv.osv):
|
|||
'google_drive_resource_id': fields.function(_resource_get, type="char", string='Resource Id'),
|
||||
'google_drive_client_id': fields.function(_client_id_get, type="char", string='Google Client '),
|
||||
'name_template': fields.char('Google Drive Name Pattern', size=64, help='Choose how the new google drive will be named, on google side. Eg. gdoc_%(field_name)s', required=True),
|
||||
'active': fields.boolean('Active'),
|
||||
}
|
||||
|
||||
def onchange_model_id(self, cr, uid, ids, model_id, context=None):
|
||||
|
@ -179,6 +191,7 @@ class config(osv.osv):
|
|||
|
||||
_defaults = {
|
||||
'name_template': 'Document %(name)s',
|
||||
'active': True,
|
||||
}
|
||||
|
||||
def _check_model_id(self, cr, uid, ids, context=None):
|
||||
|
@ -191,6 +204,9 @@ class config(osv.osv):
|
|||
(_check_model_id, 'Model of selected filter is not matching with model of current template.', ['model_id', 'filter_id']),
|
||||
]
|
||||
|
||||
def get_google_scope(self):
|
||||
return 'https://www.googleapis.com/auth/drive'
|
||||
|
||||
config()
|
||||
|
||||
|
||||
|
@ -202,7 +218,7 @@ class base_config_settings(osv.osv):
|
|||
'google_drive_uri': fields.char('URI', readonly=True, help="The URL to generate the authorization code from Google"),
|
||||
}
|
||||
_defaults = {
|
||||
'google_drive_uri': lambda s, cr, uid, c: s.pool['google.service']._get_google_token_uri(cr, uid, 'drive', context=c),
|
||||
'google_drive_uri': lambda s, cr, uid, c: s.pool['google.service']._get_google_token_uri(cr, uid, 'drive', scope=s.pool['google.drive.config'].get_google_scope(), context=c),
|
||||
}
|
||||
|
||||
def set_google_authorization_code(self, cr, uid, ids, context=None):
|
||||
|
|
|
@ -4,12 +4,12 @@
|
|||
|
||||
<record id="config_google_drive_client_id" model="ir.config_parameter">
|
||||
<field name="key">google_drive_client_id</field>
|
||||
<field name="value">39623646228-eg3ggo3mk6o40m7rguobi3rkl9frh4tb.apps.googleusercontent.com</field>
|
||||
<field name="value">598905559630.apps.googleusercontent.com</field>
|
||||
</record>
|
||||
|
||||
<record id="config_google_drive_client_secret" model="ir.config_parameter">
|
||||
<field name="key">google_drive_client_secret</field>
|
||||
<field name="value">Ul-PtmnSWs3euWs20fdono0e</field>
|
||||
<field name="value">vTmou73c-njP-1qCxm7qx7QE</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
|
|
|
@ -8,19 +8,19 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2013-06-27 16:03+0000\n"
|
||||
"PO-Revision-Date: 2012-12-12 12:51+0000\n"
|
||||
"Last-Translator: Pedro Manuel Baeza <pedro.baeza@gmail.com>\n"
|
||||
"PO-Revision-Date: 2013-08-07 02:00+0000\n"
|
||||
"Last-Translator: Alejandro Santana <alejandrosantana@anubia.es>\n"
|
||||
"Language-Team: Spanish <es@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-06-28 05:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16681)\n"
|
||||
"X-Launchpad-Export-Date: 2013-08-08 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16723)\n"
|
||||
|
||||
#. module: google_drive
|
||||
#: model:ir.ui.menu,name:google_drive.menu_google_drive_config
|
||||
msgid "Google Drive configuration"
|
||||
msgstr ""
|
||||
msgstr "Configuración de Google Drive"
|
||||
|
||||
#. module: google_drive
|
||||
#: code:addons/google_drive/google_drive.py:48
|
||||
|
@ -39,6 +39,11 @@ msgid ""
|
|||
"in your Google Drive and in OpenERP attachment will be named\n"
|
||||
" 'Agrolait_SO0001_Sales'."
|
||||
msgstr ""
|
||||
"El nombre del documento adjunto puede contener información fija o variable. "
|
||||
"Para distinguir documentos en Google Drive, use palabras y campos fijos. "
|
||||
"Así, en el ejemplo anterior, si se escribió 'Agrolait_%(name)s_Sales' en el "
|
||||
"campo de nombre de GoogleDrive, el documento en su Google Drive y en los "
|
||||
"adjuntos de OpenERP se llamarán 'Agrolait_SO0001_Sales'."
|
||||
|
||||
#. module: google_drive
|
||||
#: view:google.drive.config:0
|
||||
|
@ -46,16 +51,18 @@ msgid ""
|
|||
"- If filter is not specified, link of google document will appear in "
|
||||
"\"More\" option for all users for all opportunities."
|
||||
msgstr ""
|
||||
"- Si no especifica un filtro, el enlace del documento de Google aparecerá en "
|
||||
"la opción \"Más\" para todos los usuarios para todas las oportunidades."
|
||||
|
||||
#. module: google_drive
|
||||
#: view:google.drive.config:0
|
||||
msgid "To create a new filter:"
|
||||
msgstr ""
|
||||
msgstr "Para crear un nuevo filtro:"
|
||||
|
||||
#. module: google_drive
|
||||
#: model:ir.model,name:google_drive.model_base_config_settings
|
||||
msgid "base.config.settings"
|
||||
msgstr ""
|
||||
msgstr "base.config.settings"
|
||||
|
||||
#. module: google_drive
|
||||
#: model:ir.actions.act_window,help:google_drive.action_google_drive_users_config
|
||||
|
@ -73,17 +80,29 @@ msgid ""
|
|||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
" Pulse para añadir una plantilla.\n"
|
||||
" </p>\n"
|
||||
" <p>\n"
|
||||
" Enlace sus propias plantillas de Google Drive a "
|
||||
"cualquier registro de OpenERP. Si tiene documentos realmente específicos que "
|
||||
"quiere que su colaborador rellene (como usar una hoja de cálculo para "
|
||||
"controlar la calidad de su producto o revisar los detalles de entrega de "
|
||||
"cada pedido en un país extranjero,...) es muy sencillo gestionarlo. "
|
||||
"Enlácelos en OpenERP y úselos para colaborar con sus empleados.\n"
|
||||
" </p>\n"
|
||||
" "
|
||||
|
||||
#. module: google_drive
|
||||
#: code:addons/google_drive/google_drive.py:150
|
||||
#, python-format
|
||||
msgid "Incorrect URL!"
|
||||
msgstr ""
|
||||
msgstr "¡URL incorrecta!"
|
||||
|
||||
#. module: google_drive
|
||||
#: view:base.config.settings:0
|
||||
msgid "Configure your templates"
|
||||
msgstr ""
|
||||
msgstr "Configure sus plantillas"
|
||||
|
||||
#. module: google_drive
|
||||
#: help:google.drive.config,name_template:0
|
||||
|
@ -91,6 +110,8 @@ msgid ""
|
|||
"Choose how the new google drive will be named, on google side. Eg. "
|
||||
"gdoc_%(field_name)s"
|
||||
msgstr ""
|
||||
"Elija el nombre de la nueva unidad de Google Drive, en el lado de Google. "
|
||||
"P.ej.: gdoc_%(field_name)s"
|
||||
|
||||
#. module: google_drive
|
||||
#: view:google.drive.config:0
|
||||
|
@ -98,6 +119,8 @@ msgid ""
|
|||
"- Go to the OpenERP document you want to filter. For instance, go to "
|
||||
"Opportunities and search on Sales Department."
|
||||
msgstr ""
|
||||
"- Vaya al documento de OpenERP que quiera filtrar. Por ejemplo, vaya a "
|
||||
"Oportunidades y busque en el Departamento de ventas."
|
||||
|
||||
#. module: google_drive
|
||||
#: view:google.drive.config:0
|
||||
|
@ -105,6 +128,8 @@ msgid ""
|
|||
"- In this \"Search\" view, select the option \"Save Current Filter\", enter "
|
||||
"the name (Ex: Sales Department)"
|
||||
msgstr ""
|
||||
"- En esta vista de \"Búsqueda\", seleccione la opción \"Guardar filtro "
|
||||
"actual\" e introduzca el nombre (p.ej.: Departamento de ventas)"
|
||||
|
||||
#. module: google_drive
|
||||
#: view:google.drive.config:0
|
||||
|
@ -113,6 +138,9 @@ msgid ""
|
|||
"\"More\" options will appear for all users in opportunities of Sales "
|
||||
"Department."
|
||||
msgstr ""
|
||||
"- Si selecciona \"Compartir con todos los usuarios\", el enlace al documento "
|
||||
"de Google en la opción \"Más\" aparecerá para todos los usuarios en las "
|
||||
"oportunidades del Departamento de ventas."
|
||||
|
||||
#. module: google_drive
|
||||
#: view:google.drive.config:0
|
||||
|
@ -121,23 +149,28 @@ msgid ""
|
|||
"\"More\" options will not appear for other users in opportunities of Sales "
|
||||
"Department."
|
||||
msgstr ""
|
||||
"- Si no selecciona \"Compartir con todos los usuarios\", el enlace al "
|
||||
"documento de Google en la opción \"Más\" no aparecerá para otros usuarios en "
|
||||
"las oportunidades del Departamento de ventas."
|
||||
|
||||
#. module: google_drive
|
||||
#: code:addons/google_drive/google_drive.py:48
|
||||
#, python-format
|
||||
msgid "At least one key cannot be found in your Google Drive name pattern"
|
||||
msgstr ""
|
||||
"No se ha podido encontrar al menos una clave de su patrón de nombres de "
|
||||
"Google Drive"
|
||||
|
||||
#. module: google_drive
|
||||
#: code:addons/google_drive/google_drive.py:150
|
||||
#, python-format
|
||||
msgid "Please enter a valid Google Document URL."
|
||||
msgstr ""
|
||||
msgstr "Por favor, introduzca una URL de documento de Google válida."
|
||||
|
||||
#. module: google_drive
|
||||
#: field:google.drive.config,google_drive_client_id:0
|
||||
msgid "Google Client "
|
||||
msgstr ""
|
||||
msgstr "Cliente de Google "
|
||||
|
||||
#. module: google_drive
|
||||
#: view:google.drive.config:0
|
||||
|
@ -145,43 +178,45 @@ msgid ""
|
|||
"https://docs.google.com/document/d/1vOtpJK9scIQz6taD9tJRIETWbEw3fSiaQHArsJYcu"
|
||||
"a4/edit"
|
||||
msgstr ""
|
||||
"https://docs.google.com/document/d/1vOtpJK9scIQz6taD9tJRIETWbEw3fSiaQHArsJYcu"
|
||||
"a4/edit"
|
||||
|
||||
#. module: google_drive
|
||||
#: field:google.drive.config,filter_id:0
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filtro"
|
||||
|
||||
#. module: google_drive
|
||||
#: field:google.drive.config,name_template:0
|
||||
msgid "Google Drive Name Pattern"
|
||||
msgstr ""
|
||||
msgstr "Patrón de nombres de Google Drive"
|
||||
|
||||
#. module: google_drive
|
||||
#: help:base.config.settings,google_drive_uri:0
|
||||
msgid "The URL to generate the authorization code from Google"
|
||||
msgstr ""
|
||||
msgstr "La URL para generar el código de autorización de Google"
|
||||
|
||||
#. module: google_drive
|
||||
#: model:ir.filters,name:google_drive.filter_partner
|
||||
msgid "Customer"
|
||||
msgstr ""
|
||||
msgstr "Cliente"
|
||||
|
||||
#. module: google_drive
|
||||
#: field:google.drive.config,google_drive_resource_id:0
|
||||
msgid "Resource Id"
|
||||
msgstr ""
|
||||
msgstr "ID del recurso"
|
||||
|
||||
#. module: google_drive
|
||||
#: code:addons/google_drive/google_drive.py:91
|
||||
#, python-format
|
||||
msgid "The Google Template cannot be found. Maybe it has been deleted."
|
||||
msgstr ""
|
||||
msgstr "No se encuentra la plantilla de Google. Tal vez se haya eliminado."
|
||||
|
||||
#. module: google_drive
|
||||
#: model:ir.actions.act_window,name:google_drive.action_google_drive_users_config
|
||||
#: model:ir.ui.menu,name:google_drive.menu_google_drive_model_config
|
||||
msgid "Google Drive Templates"
|
||||
msgstr ""
|
||||
msgstr "Plantillas de Google Drive"
|
||||
|
||||
#. module: google_drive
|
||||
#: code:addons/google_drive/google_drive.py:81
|
||||
|
@ -190,23 +225,27 @@ msgid ""
|
|||
"Something went wrong during the token generation. Please request again an "
|
||||
"authorization code in %(menu:base_setup.menu_general_configuration)s."
|
||||
msgstr ""
|
||||
"Algo ha ido mal durante la creación del testigo. Por favor, solicite un "
|
||||
"código de autorización otra vez en "
|
||||
"%(menu:base_setup.menu_general_configuration)s."
|
||||
|
||||
#. module: google_drive
|
||||
#: code:addons/google_drive/google_drive.py:124
|
||||
#, python-format
|
||||
msgid "Google Drive Error!"
|
||||
msgstr ""
|
||||
msgstr "¡Error de Google Drive!"
|
||||
|
||||
#. module: google_drive
|
||||
#: field:base.config.settings,google_drive_uri:0
|
||||
msgid "URI"
|
||||
msgstr ""
|
||||
msgstr "URI"
|
||||
|
||||
#. module: google_drive
|
||||
#: code:addons/google_drive/google_drive.py:124
|
||||
#, python-format
|
||||
msgid "Creating google drive may only be done by one at a time."
|
||||
msgstr ""
|
||||
"Es posible que la creación de Google Drive sólo se pueda hacer de una en una."
|
||||
|
||||
#. module: google_drive
|
||||
#: field:google.drive.config,model:0
|
||||
|
@ -217,38 +256,40 @@ msgstr "Modelo"
|
|||
#. module: google_drive
|
||||
#: view:google.drive.config:0
|
||||
msgid "Google Drive Configuration"
|
||||
msgstr ""
|
||||
msgstr "Configuración de Google Drive"
|
||||
|
||||
#. module: google_drive
|
||||
#: field:google.drive.config,name:0
|
||||
msgid "Template Name"
|
||||
msgstr ""
|
||||
msgstr "Nombre de la plantilla"
|
||||
|
||||
#. module: google_drive
|
||||
#: constraint:google.drive.config:0
|
||||
msgid ""
|
||||
"Model of selected filter is not matching with model of current template."
|
||||
msgstr ""
|
||||
"El modelo del filtro seleccionado no coincide con el modelo de la plantilla "
|
||||
"actual."
|
||||
|
||||
#. module: google_drive
|
||||
#: field:google.drive.config,google_drive_template_url:0
|
||||
msgid "Template URL"
|
||||
msgstr ""
|
||||
msgstr "URL de la plantilla"
|
||||
|
||||
#. module: google_drive
|
||||
#: view:base.config.settings:0
|
||||
msgid "and paste it here"
|
||||
msgstr ""
|
||||
msgstr "y péguela aquí"
|
||||
|
||||
#. module: google_drive
|
||||
#: field:base.config.settings,google_drive_authorization_code:0
|
||||
msgid "Authorization Code"
|
||||
msgstr ""
|
||||
msgstr "Cídigo de autorización"
|
||||
|
||||
#. module: google_drive
|
||||
#: model:ir.model,name:google_drive.model_google_drive_config
|
||||
msgid "Google Drive templates config"
|
||||
msgstr ""
|
||||
msgstr "Configuración de plantillas de Google Drive"
|
||||
|
||||
#. module: google_drive
|
||||
#: code:addons/google_drive/google_drive.py:64
|
||||
|
@ -257,3 +298,6 @@ msgid ""
|
|||
"You haven't configured 'Authorization Code' generated from google, Please "
|
||||
"generate and configure it in %(menu:base_setup.menu_general_configuration)s."
|
||||
msgstr ""
|
||||
"No ha configurado el 'código de autorización' generado por Google. Por "
|
||||
"favor, genérelo y configúrelo en "
|
||||
"%(menu:base_setup.menu_general_configuration)s."
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
<field name="model" invisible="1" />
|
||||
<group>
|
||||
<field name="name" />
|
||||
<field name="active" />
|
||||
<field name="model_id" on_change="onchange_model_id(model_id)" />
|
||||
<label for='filter_id' />
|
||||
<div>
|
||||
|
@ -54,7 +55,7 @@
|
|||
</record>
|
||||
|
||||
<record model='ir.actions.act_window' id='action_google_drive_users_config'>
|
||||
<field name='name'>Google Drive Templates</field>
|
||||
<field name='name'>Templates</field>
|
||||
<field name='res_model'>google.drive.config</field>
|
||||
<field name='type'>ir.actions.act_window</field>
|
||||
<field name='view_type'>form</field>
|
||||
|
@ -87,7 +88,7 @@
|
|||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem name='Google Drive configuration' id='menu_google_drive_config' parent='base.menu_administration' />
|
||||
<menuitem name='Google Drive' id='menu_google_drive_config' parent='base.menu_administration' />
|
||||
<menuitem id='menu_google_drive_model_config' parent='menu_google_drive_config' action='action_google_drive_users_config' />
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -29,19 +29,24 @@ openerp.google_drive = function (instance, m) {
|
|||
ds.call('get_google_drive_config', [view.dataset.model, res_id, context]).done(function (r) {
|
||||
if (!_.isEmpty(r)) {
|
||||
_.each(r, function (res) {
|
||||
var g_item = _.indexOf(_.pluck(self.items.other, 'label'), res.name);
|
||||
if (g_item !== -1) {
|
||||
self.items.other.splice(g_item, 1);
|
||||
var already_there = false;
|
||||
for (var i = 0;i < self.items.other.length;i++){
|
||||
if (self.items.other[i].classname === "oe_share_gdoc" && self.items.other[i].label.indexOf(res.name) > -1){
|
||||
already_there = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!already_there){
|
||||
self.add_items('other', [{
|
||||
label: res.name+ '<img style="position:absolute;right:5px;height:20px;width:20px;" title="Google Drive" src="google_drive/static/src/img/drive_icon.png"/>',
|
||||
config_id: res.id,
|
||||
res_id: res_id,
|
||||
res_model: view.dataset.model,
|
||||
callback: self.on_google_doc,
|
||||
classname: 'oe_share_gdoc'
|
||||
},
|
||||
]);
|
||||
}
|
||||
self.add_items('other', [{
|
||||
label: res.name+ '<img style="position:absolute;right:5px;height:20px;width:20px;" title="Google Drive" src="google_drive/static/src/img/drive_icon.png"/>',
|
||||
config_id: res.id,
|
||||
res_id: res_id,
|
||||
res_model: view.dataset.model,
|
||||
callback: self.on_google_doc,
|
||||
classname: 'oe_share_gdoc'
|
||||
},
|
||||
]);
|
||||
})
|
||||
}
|
||||
});
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
import google_spreadsheet
|
|
@ -0,0 +1,43 @@
|
|||
# -*- 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/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
|
||||
{
|
||||
'name': 'Google Spreadsheet',
|
||||
'version': '1.0',
|
||||
'category': 'Tools',
|
||||
'description': """
|
||||
The module adds the possibility to display data from OpenERP in Google Spreadsheets in real time.
|
||||
========================================
|
||||
""",
|
||||
'author': 'OpenERP SA',
|
||||
'website': 'http://www.openerp.com',
|
||||
'depends': ['board', 'google_drive'],
|
||||
'js': [
|
||||
'static/src/js/search.js',
|
||||
],
|
||||
'qweb': ['static/src/xml/*.xml'],
|
||||
'data': ['google_spreadsheet_view.xml', 'google_spreadsheet_data.xml'],
|
||||
'demo': [],
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
}
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -0,0 +1,119 @@
|
|||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2012 OpenERP SA (<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/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import simplejson
|
||||
import logging
|
||||
from lxml import etree
|
||||
import re
|
||||
import urllib
|
||||
import urllib2
|
||||
|
||||
from openerp.osv import osv
|
||||
from openerp import SUPERUSER_ID
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class config(osv.osv):
|
||||
_inherit = 'google.drive.config'
|
||||
|
||||
def get_google_scope(self):
|
||||
scope = super(config, self).get_google_scope()
|
||||
return '%s https://spreadsheets.google.com/feeds' % scope
|
||||
|
||||
def write_config_formula(self, cr, uid, attachment_id, spreadsheet_key, model, domain, groupbys, view_id, context=None):
|
||||
access_token = self.get_access_token(cr, uid, scope='https://spreadsheets.google.com/feeds', context=context)
|
||||
|
||||
fields = self.pool.get(model).fields_view_get(cr, uid, view_id=view_id, view_type='tree')
|
||||
doc = etree.XML(fields.get('arch'))
|
||||
display_fields = []
|
||||
for node in doc.xpath("//field"):
|
||||
if node.get('modifiers'):
|
||||
modifiers = simplejson.loads(node.get('modifiers'))
|
||||
if not modifiers.get('invisible') and not modifiers.get('tree_invisible'):
|
||||
display_fields.append(node.get('name'))
|
||||
fields = " ".join(display_fields)
|
||||
domain = domain.replace("'", r"\'").replace('"', "'")
|
||||
if groupbys:
|
||||
fields = "%s %s" % (groupbys, fields)
|
||||
formula = '=oe_read_group("%s";"%s";"%s";"%s")' % (model, fields, groupbys, domain)
|
||||
else:
|
||||
formula = '=oe_browse("%s";"%s";"%s")' % (model, fields, domain)
|
||||
url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
|
||||
dbname = cr.dbname
|
||||
user = self.pool['res.users'].read(cr, uid, uid, ['login', 'password'], context=context)
|
||||
username = user['login']
|
||||
password = user['password']
|
||||
if self.pool['ir.module.module'].search_count(cr, SUPERUSER_ID, ['&', ('name', '=', 'auth_crypt'), ('state', '=', 'installed')]) == 1:
|
||||
config_formula = '=oe_settings("%s";"%s")' % (url, dbname)
|
||||
else:
|
||||
config_formula = '=oe_settings("%s";"%s";"%s";"%s")' % (url, dbname, username, password)
|
||||
request = '''<feed xmlns="http://www.w3.org/2005/Atom"
|
||||
xmlns:batch="http://schemas.google.com/gdata/batch"
|
||||
xmlns:gs="http://schemas.google.com/spreadsheets/2006">
|
||||
<id>https://spreadsheets.google.com/feeds/cells/%s/od6/private/full</id>
|
||||
<entry>
|
||||
<batch:id>A1</batch:id>
|
||||
<batch:operation type="update"/>
|
||||
<id>https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R1C1</id>
|
||||
<link rel="edit" type="application/atom+xml"
|
||||
href="https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R1C1"/>
|
||||
<gs:cell row="1" col="1" inputValue="%s"/>
|
||||
</entry>
|
||||
<entry>
|
||||
<batch:id>A2</batch:id>
|
||||
<batch:operation type="update"/>
|
||||
<id>https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R60C15</id>
|
||||
<link rel="edit" type="application/atom+xml"
|
||||
href="https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R60C15"/>
|
||||
<gs:cell row="60" col="15" inputValue="%s"/>
|
||||
</entry>
|
||||
</feed>''' % (spreadsheet_key, spreadsheet_key, spreadsheet_key, formula.replace('"', '"'), spreadsheet_key, spreadsheet_key, config_formula.replace('"', '"'))
|
||||
|
||||
try:
|
||||
req = urllib2.Request(
|
||||
'https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/batch?%s' % (spreadsheet_key, urllib.urlencode({'v': 3, 'access_token': access_token})),
|
||||
data=request,
|
||||
headers={'content-type': 'application/atom+xml', 'If-Match': '*'})
|
||||
urllib2.urlopen(req)
|
||||
except (urllib2.HTTPError, urllib2.URLError):
|
||||
_logger.warning("An error occured while writting the formula on the Google Spreadsheet.")
|
||||
|
||||
description = '''
|
||||
formula: %s
|
||||
''' % formula
|
||||
if attachment_id:
|
||||
self.pool['ir.attachment'].write(cr, uid, attachment_id, {'description': description}, context=context)
|
||||
return True
|
||||
|
||||
def set_spreadsheet(self, cr, uid, model, domain, groupbys, view_id, context=None):
|
||||
try:
|
||||
config_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'google_spreadsheet', 'google_spreadsheet_template')[1]
|
||||
except ValueError:
|
||||
raise
|
||||
config = self.browse(cr, uid, config_id, context=context)
|
||||
title = 'Spreadsheet %s' % model
|
||||
res = self.copy_doc(cr, uid, False, config.google_drive_resource_id, title, model, context=context)
|
||||
|
||||
mo = re.search("(key=|/d/)([A-Za-z0-9-_]+)", res['url'])
|
||||
if mo:
|
||||
key = mo.group(2)
|
||||
|
||||
self.write_config_formula(cr, uid, res.get('id'), key, model, domain, groupbys, view_id, context=context)
|
||||
return res
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<record id="google_spreadsheet_template" model="google.drive.config">
|
||||
<field name="name">Base Spreadsheet Template</field>
|
||||
<field name="model_id" ref="base.model_res_partner"/>
|
||||
<field name="google_drive_template_url">https://docs.google.com/spreadsheet/ccc?key=0ApGVjjwUC-ygdDZ0TG5EQnRlLVFQNlFGdFN5b1ZrY1E</field>
|
||||
<field name="name_template">Reporting %(name)s</field>
|
||||
<field name="active" eval="0" />
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
|
@ -0,0 +1,65 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!-- add google drive config field in user form -->
|
||||
|
||||
<record model="ir.ui.view" id="view_ir_attachment_google_spreadsheet_tree">
|
||||
<field name="name">ir.attachment.google.spreadsheet.tree</field>
|
||||
<field name="model">ir.attachment</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Google Spreadsheets" version="7.0">
|
||||
<field name="name" string="Name"/>
|
||||
<field name="url" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_ir_attachment_google_spreadsheet_form">
|
||||
<field name="name">ir.attachment.google.spreadsheet.form</field>
|
||||
<field name="model">ir.attachment</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Google Spreadsheets" version="7.0">
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="name" string="Name"/>
|
||||
<field name="url" widget="url"/>
|
||||
</group>
|
||||
<group colspan="2">
|
||||
<label for="description" colspan="2"/>
|
||||
<field name="description" nolabel="1" colspan="2"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_ir_attachment_google_spreadsheet_tree" model="ir.actions.act_window">
|
||||
<field name="name">Google Spreadsheets</field>
|
||||
<field name="res_model">ir.attachment</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="context">{}</field>
|
||||
<field name="domain">[('url', 'like', '/spreadsheet/')]</field>
|
||||
<field name="help">Google Spreadsheets</field>
|
||||
</record>
|
||||
|
||||
<record id="action_ir_attachment_google_spreadsheet_tree_view" model="ir.actions.act_window.view">
|
||||
<field eval="1" name="sequence"/>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="view_ir_attachment_google_spreadsheet_tree"/>
|
||||
<field name="act_window_id" ref="action_ir_attachment_google_spreadsheet_tree"/>
|
||||
</record>
|
||||
|
||||
<record id="action_ir_attachment_google_spreadsheet_form_view" model="ir.actions.act_window.view">
|
||||
<field eval="2" name="sequence"/>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="view_id" ref="view_ir_attachment_google_spreadsheet_form"/>
|
||||
<field name="act_window_id" ref="action_ir_attachment_google_spreadsheet_tree"/>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_reporting_dashboard_google_spreadsheets" parent="base.menu_reporting_dashboard" action="action_ir_attachment_google_spreadsheet_tree"/>
|
||||
</data>
|
||||
</openerp>
|
|
@ -0,0 +1,42 @@
|
|||
# Translation of OpenERP Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * google_spreadsheet
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 8.0alpha1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-07-25 12:39+0000\n"
|
||||
"PO-Revision-Date: 2013-07-25 12:39+0000\n"
|
||||
"Last-Translator: <>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: google_spreadsheet
|
||||
#: model:ir.actions.act_window,help:google_spreadsheet.action_ir_attachment_google_spreadsheet_tree
|
||||
#: model:ir.actions.act_window,name:google_spreadsheet.action_ir_attachment_google_spreadsheet_tree
|
||||
#: view:ir.attachment:0
|
||||
#: model:ir.ui.menu,name:google_spreadsheet.menu_reporting_dashboard_google_spreadsheets
|
||||
msgid "Google Spreadsheets"
|
||||
msgstr ""
|
||||
|
||||
#. module: google_spreadsheet
|
||||
#. openerp-web
|
||||
#: code:addons/google_spreadsheet/static/src/xml/addtospreadsheet.xml:3
|
||||
#, python-format
|
||||
msgid "Add to Google Spreadsheet"
|
||||
msgstr ""
|
||||
|
||||
#. module: google_spreadsheet
|
||||
#: view:ir.attachment:0
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: google_spreadsheet
|
||||
#: model:ir.model,name:google_spreadsheet.model_google_drive_config
|
||||
msgid "Google Drive templates config"
|
||||
msgstr ""
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
openerp.google_spreadsheet = function(instance) {
|
||||
var _t = instance.web._t;
|
||||
instance.web.FormView.include({
|
||||
on_processed_onchange: function(result, processed) {
|
||||
var self = this;
|
||||
|
||||
var fields = self.fields;
|
||||
_(result.selection).each(function (selection, fieldname) {
|
||||
var field = fields[fieldname];
|
||||
if (!field) { return; }
|
||||
field.field.selection = selection;
|
||||
field.values = selection;
|
||||
field.renderElement();
|
||||
});
|
||||
return this._super(result, processed);
|
||||
},
|
||||
});
|
||||
instance.board.AddToGoogleSpreadsheet = instance.web.search.Input.extend({
|
||||
template: 'SearchView.addtogooglespreadsheet',
|
||||
_in_drawer: true,
|
||||
start: function () {
|
||||
var self = this;
|
||||
this.$el.on('click', 'h4', function(){
|
||||
var view = self.view;
|
||||
var data = view.build_search_data();
|
||||
var model = view.model;
|
||||
var list_view = self.view.getParent().views['list'];
|
||||
var view_id = list_view ? list_view.view_id : false;
|
||||
var context = new instance.web.CompoundContext(view.dataset.get_context() || []);
|
||||
var domain = new instance.web.CompoundDomain(view.dataset.get_domain() || []);
|
||||
_.each(data.contexts, context.add, context);
|
||||
_.each(data.domains, domain.add, domain);
|
||||
domain = JSON.stringify(domain.eval());
|
||||
var groupbys = instance.web.pyeval.eval('groupbys', data.groupbys).join(" ");
|
||||
var view_id = view_id;
|
||||
var ds = new instance.web.DataSet(self, 'google.drive.config');
|
||||
ds.call('set_spreadsheet', [model, domain, groupbys, view_id]).done(function (res) {
|
||||
if (res['url']){
|
||||
window.open(res['url'], '_blank');
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
});
|
||||
instance.web.SearchView.include({
|
||||
add_common_inputs: function() {
|
||||
this._super();
|
||||
var vm = this.getParent().getParent();
|
||||
if (vm.inner_action && vm.inner_action.views) {
|
||||
(new instance.board.AddToGoogleSpreadsheet(this));
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
|
@ -0,0 +1,5 @@
|
|||
<template>
|
||||
<div t-name="SearchView.addtogooglespreadsheet" class="oe_searchview_dashboard">
|
||||
<h4>Add to Google Spreadsheet</h4>
|
||||
</div>
|
||||
</template>
|
|
@ -83,7 +83,6 @@ Main Features
|
|||
'static/src/css/mail_group.css',
|
||||
],
|
||||
'js': [
|
||||
'static/lib/jquery.expander/jquery.expander.js',
|
||||
'static/src/js/mail.js',
|
||||
'static/src/js/mail_followers.js',
|
||||
'static/src/js/many2many_tags_email.js',
|
||||
|
|
|
@ -6,6 +6,12 @@ Changelog
|
|||
`trunk (saas-2)`
|
||||
----------------
|
||||
|
||||
- added support of ``active_domain`` form context, coming from the list view.
|
||||
When checking the header hook, the mass mailing will be done on all records
|
||||
matching the ``active_domain``.
|
||||
- added ``mail_server_id`` to mail_message, removing it from mail_mail. This allows
|
||||
to set the preferred mail server to use for notifications emails, when using
|
||||
templates.
|
||||
- added ``_mail_post_access`` attribute that specifies the access right that
|
||||
should have the user in order to post a new message on a given model. Values
|
||||
are ``read`` (portal documents), ``write`` (default value), ``unlink`` or ``create``.
|
||||
are ``read`` (portal documents), ``write`` (default value), ``unlink`` or ``create``.
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -151,7 +151,7 @@ class mail_notification(osv.Model):
|
|||
return footer
|
||||
|
||||
def _notify(self, cr, uid, msg_id, partners_to_notify=None, context=None,
|
||||
force_send=False, user_signature=True):
|
||||
force_send=False, user_signature=True):
|
||||
""" Send by email the notification depending on the user preferences
|
||||
|
||||
:param list partners_to_notify: optional list of partner ids restricting
|
||||
|
|
|
@ -44,7 +44,6 @@ class mail_mail(osv.Model):
|
|||
|
||||
_columns = {
|
||||
'mail_message_id': fields.many2one('mail.message', 'Message', required=True, ondelete='cascade'),
|
||||
'mail_server_id': fields.many2one('ir.mail_server', 'Outgoing mail server', readonly=1),
|
||||
'state': fields.selection([
|
||||
('outgoing', 'Outgoing'),
|
||||
('sent', 'Sent'),
|
||||
|
@ -140,10 +139,16 @@ class mail_mail(osv.Model):
|
|||
# notification field: if not set, set if mail comes from an existing mail.message
|
||||
if 'notification' not in values and values.get('mail_message_id'):
|
||||
values['notification'] = True
|
||||
mail_id = super(mail_mail, self).create(cr, uid, values, context=context)
|
||||
|
||||
# reply_to: if not set, set with default values that require creation values
|
||||
# but delegate after creation because of mail_message.message_id automatic
|
||||
# creation using existence of reply_to
|
||||
if not values.get('reply_to'):
|
||||
values['reply_to'] = self._get_reply_to(cr, uid, values, context=context)
|
||||
return super(mail_mail, self).create(cr, uid, values, context=context)
|
||||
reply_to = self._get_reply_to(cr, uid, values, context=context)
|
||||
if reply_to:
|
||||
self.write(cr, uid, [mail_id], {'reply_to': reply_to}, context=context)
|
||||
return mail_id
|
||||
|
||||
def unlink(self, cr, uid, ids, context=None):
|
||||
# cascade-delete the parent message for all mails that are not created for a notification
|
||||
|
|
|
@ -191,6 +191,7 @@ class mail_message(osv.Model):
|
|||
'vote_user_ids': fields.many2many('res.users', 'mail_vote',
|
||||
'message_id', 'user_id', string='Votes',
|
||||
help='Users that voted for this message'),
|
||||
'mail_server_id': fields.many2one('ir.mail_server', 'Outgoing mail server', readonly=1),
|
||||
}
|
||||
|
||||
def _needaction_domain_get(self, cr, uid, context=None):
|
||||
|
@ -395,15 +396,21 @@ class mail_message(osv.Model):
|
|||
has_voted = uid in [user.id for user in message.vote_user_ids]
|
||||
|
||||
try:
|
||||
body_html = html_email_clean(message.body)
|
||||
if parent_id:
|
||||
max_length = 300
|
||||
else:
|
||||
max_length = 100
|
||||
body_short = html_email_clean(message.body, remove=False, shorten=True, max_length=max_length)
|
||||
|
||||
except Exception:
|
||||
body_html = '<p><b>Encoding Error : </b><br/>Unable to convert this message (id: %s).</p>' % message.id
|
||||
body_short = '<p><b>Encoding Error : </b><br/>Unable to convert this message (id: %s).</p>' % message.id
|
||||
_logger.exception(Exception)
|
||||
|
||||
return {'id': message.id,
|
||||
'type': message.type,
|
||||
'subtype': message.subtype_id.name if message.subtype_id else False,
|
||||
'body': body_html,
|
||||
'body': message.body,
|
||||
'body_short': body_short,
|
||||
'model': message.model,
|
||||
'res_id': message.res_id,
|
||||
'record_name': message.record_name,
|
||||
|
@ -781,8 +788,8 @@ class mail_message(osv.Model):
|
|||
values['message_id'] = tools.generate_tracking_message_id('private')
|
||||
newid = super(mail_message, self).create(cr, uid, values, context)
|
||||
self._notify(cr, uid, newid, context=context,
|
||||
force_send=context.get('mail_notify_force_send', True),
|
||||
user_signature=context.get('mail_notify_user_signature', True))
|
||||
force_send=context.get('mail_notify_force_send', True),
|
||||
user_signature=context.get('mail_notify_user_signature', True))
|
||||
# TDE FIXME: handle default_starred. Why not setting an inv on starred ?
|
||||
# Because starred will call set_message_starred, that looks for notifications.
|
||||
# When creating a new mail_message, it will create a notification to a message
|
||||
|
|
|
@ -682,6 +682,12 @@ class mail_thread(osv.AbstractModel):
|
|||
assert thread_id == 0, 'Routing: posting a message without model should be with a null res_id (private message).'
|
||||
_warn('posting a message without model should be with a null res_id (private message), resetting thread_id')
|
||||
thread_id = 0
|
||||
# Private message: should have a parent_id (only answers)
|
||||
if not model and not message_dict.get('parent_id'):
|
||||
if assert_model:
|
||||
assert message_dict.get('parent_id'), 'Routing: posting a message without model should be with a parent_id (private mesage).'
|
||||
_warn('posting a message without model should be with a parent_id (private mesage), skipping')
|
||||
return ()
|
||||
|
||||
# Existing Document: check if exists; if not, fallback on create if allowed
|
||||
if thread_id and not model_pool.exists(cr, uid, thread_id):
|
||||
|
@ -695,7 +701,7 @@ class mail_thread(osv.AbstractModel):
|
|||
return ()
|
||||
|
||||
# Existing Document: check model accepts the mailgateway
|
||||
if thread_id and not hasattr(model_pool, 'message_update'):
|
||||
if thread_id and model and not hasattr(model_pool, 'message_update'):
|
||||
if create_fallback:
|
||||
_warn('model %s does not accept document update, fall back on document creation' % model)
|
||||
thread_id = None
|
||||
|
@ -706,7 +712,7 @@ class mail_thread(osv.AbstractModel):
|
|||
return ()
|
||||
|
||||
# New Document: check model accepts the mailgateway
|
||||
if not thread_id and not hasattr(model_pool, 'message_new'):
|
||||
if not thread_id and model and not hasattr(model_pool, 'message_new'):
|
||||
if assert_model:
|
||||
assert hasattr(model_pool, 'message_new'), 'Model %s does not accept document creation, crashing' % model
|
||||
_warn('model %s does not accept document creation, skipping' % model)
|
||||
|
@ -798,16 +804,16 @@ class mail_thread(osv.AbstractModel):
|
|||
|
||||
# 2. Reply to a private message
|
||||
if in_reply_to:
|
||||
message_ids = self.pool.get('mail.message').search(cr, uid, [
|
||||
mail_message_ids = self.pool.get('mail.message').search(cr, uid, [
|
||||
('message_id', '=', in_reply_to),
|
||||
'!', ('message_id', 'ilike', 'reply_to')
|
||||
], limit=1, context=context)
|
||||
if message_ids:
|
||||
message = self.pool.get('mail.message').browse(cr, uid, message_ids[0], context=context)
|
||||
if mail_message_ids:
|
||||
mail_message = self.pool.get('mail.message').browse(cr, uid, mail_message_ids[0], context=context)
|
||||
_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)
|
||||
email_from, email_to, message_id, mail_message.id, custom_values, uid)
|
||||
route = self.message_route_verify(cr, uid, message, message_dict,
|
||||
(message.model, message.res_id, custom_values, uid, None),
|
||||
(mail_message.model, mail_message.res_id, custom_values, uid, None),
|
||||
update_author=True, assert_model=True, create_fallback=True, context=context)
|
||||
return route and [route] or []
|
||||
|
||||
|
|
|
@ -1,385 +0,0 @@
|
|||
/*!
|
||||
* jQuery Expander Plugin v1.4.2
|
||||
*
|
||||
* Date: Fri Mar 16 14:29:56 2012 EDT
|
||||
* Requires: jQuery v1.3+
|
||||
*
|
||||
* Copyright 2011, Karl Swedberg
|
||||
* Dual licensed under the MIT and GPL licenses (just like jQuery):
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
$.expander = {
|
||||
version: '1.4.2',
|
||||
defaults: {
|
||||
// the number of characters at which the contents will be sliced into two parts.
|
||||
slicePoint: 100,
|
||||
|
||||
// whether to keep the last word of the summary whole (true) or let it slice in the middle of a word (false)
|
||||
preserveWords: true,
|
||||
|
||||
// a threshold of sorts for whether to initially hide/collapse part of the element's contents.
|
||||
// If after slicing the contents in two there are fewer words in the second part than
|
||||
// the value set by widow, we won't bother hiding/collapsing anything.
|
||||
widow: 4,
|
||||
|
||||
// text displayed in a link instead of the hidden part of the element.
|
||||
// clicking this will expand/show the hidden/collapsed text
|
||||
expandText: 'read more',
|
||||
expandPrefix: '… ',
|
||||
|
||||
expandAfterSummary: false,
|
||||
|
||||
// class names for summary element and detail element
|
||||
summaryClass: 'summary',
|
||||
detailClass: 'details',
|
||||
|
||||
// class names for <span> around "read-more" link and "read-less" link
|
||||
moreClass: 'read-more',
|
||||
lessClass: 'read-less',
|
||||
|
||||
// number of milliseconds after text has been expanded at which to collapse the text again.
|
||||
// when 0, no auto-collapsing
|
||||
collapseTimer: 0,
|
||||
|
||||
// effects for expanding and collapsing
|
||||
expandEffect: 'fadeIn',
|
||||
expandSpeed: 250,
|
||||
collapseEffect: 'fadeOut',
|
||||
collapseSpeed: 200,
|
||||
|
||||
// allow the user to re-collapse the expanded text.
|
||||
userCollapse: true,
|
||||
|
||||
// text to use for the link to re-collapse the text
|
||||
userCollapseText: 'read less',
|
||||
userCollapsePrefix: ' ',
|
||||
|
||||
|
||||
// all callback functions have the this keyword mapped to the element in the jQuery set when .expander() is called
|
||||
|
||||
onSlice: null, // function() {}
|
||||
beforeExpand: null, // function() {},
|
||||
afterExpand: null, // function() {},
|
||||
onCollapse: null // function(byUser) {}
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.expander = function(options) {
|
||||
var meth = 'init';
|
||||
|
||||
if (typeof options == 'string') {
|
||||
meth = options;
|
||||
options = {};
|
||||
}
|
||||
|
||||
var opts = $.extend({}, $.expander.defaults, options),
|
||||
rSelfClose = /^<(?:area|br|col|embed|hr|img|input|link|meta|param).*>$/i,
|
||||
rAmpWordEnd = opts.wordEnd || /(&(?:[^;]+;)?|[a-zA-Z\u00C0-\u0100]+)$/,
|
||||
rOpenCloseTag = /<\/?(\w+)[^>]*>/g,
|
||||
rOpenTag = /<(\w+)[^>]*>/g,
|
||||
rCloseTag = /<\/(\w+)>/g,
|
||||
rLastCloseTag = /(<\/[^>]+>)\s*$/,
|
||||
rTagPlus = /^<[^>]+>.?/,
|
||||
delayedCollapse;
|
||||
|
||||
var methods = {
|
||||
init: function() {
|
||||
this.each(function() {
|
||||
var i, l, tmp, newChar, summTagless, summOpens, summCloses,
|
||||
lastCloseTag, detailText, detailTagless,
|
||||
$thisDetails, $readMore,
|
||||
openTagsForDetails = [],
|
||||
closeTagsForsummaryText = [],
|
||||
defined = {},
|
||||
thisEl = this,
|
||||
$this = $(this),
|
||||
$summEl = $([]),
|
||||
o = $.meta ? $.extend({}, opts, $this.data()) : opts,
|
||||
hasDetails = !!$this.find('.' + o.detailClass).length,
|
||||
hasBlocks = !!$this.find('*').filter(function() {
|
||||
var display = $(this).css('display');
|
||||
return (/^block|table|list/).test(display);
|
||||
}).length,
|
||||
el = hasBlocks ? 'div' : 'span',
|
||||
detailSelector = el + '.' + o.detailClass,
|
||||
moreSelector = 'span.' + o.moreClass,
|
||||
expandSpeed = o.expandSpeed || 0,
|
||||
allHtml = $.trim( $this.html() ),
|
||||
allText = $.trim( $this.text() ),
|
||||
summaryText = allHtml.slice(0, o.slicePoint);
|
||||
|
||||
// bail out if we've already set up the expander on this element
|
||||
if ( $.data(this, 'expander') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$.data(this, 'expander', true);
|
||||
|
||||
// determine which callback functions are defined
|
||||
$.each(['onSlice','beforeExpand', 'afterExpand', 'onCollapse'], function(index, val) {
|
||||
defined[val] = $.isFunction(o[val]);
|
||||
});
|
||||
|
||||
// back up if we're in the middle of a tag or word
|
||||
summaryText = backup(summaryText);
|
||||
|
||||
// summary text sans tags length
|
||||
summTagless = summaryText.replace(rOpenCloseTag, '').length;
|
||||
|
||||
// add more characters to the summary, one for each character in the tags
|
||||
while (summTagless < o.slicePoint) {
|
||||
newChar = allHtml.charAt(summaryText.length);
|
||||
if (newChar == '<') {
|
||||
newChar = allHtml.slice(summaryText.length).match(rTagPlus)[0];
|
||||
}
|
||||
summaryText += newChar;
|
||||
summTagless++;
|
||||
}
|
||||
|
||||
summaryText = backup(summaryText, o.preserveWords);
|
||||
|
||||
// separate open tags from close tags and clean up the lists
|
||||
summOpens = summaryText.match(rOpenTag) || [];
|
||||
summCloses = summaryText.match(rCloseTag) || [];
|
||||
|
||||
// filter out self-closing tags
|
||||
tmp = [];
|
||||
$.each(summOpens, function(index, val) {
|
||||
if ( !rSelfClose.test(val) ) {
|
||||
tmp.push(val);
|
||||
}
|
||||
});
|
||||
summOpens = tmp;
|
||||
|
||||
// strip close tags to just the tag name
|
||||
l = summCloses.length;
|
||||
for (i = 0; i < l; i++) {
|
||||
summCloses[i] = summCloses[i].replace(rCloseTag, '$1');
|
||||
}
|
||||
|
||||
// tags that start in summary and end in detail need:
|
||||
// a). close tag at end of summary
|
||||
// b). open tag at beginning of detail
|
||||
$.each(summOpens, function(index, val) {
|
||||
var thisTagName = val.replace(rOpenTag, '$1');
|
||||
var closePosition = $.inArray(thisTagName, summCloses);
|
||||
if (closePosition === -1) {
|
||||
openTagsForDetails.push(val);
|
||||
closeTagsForsummaryText.push('</' + thisTagName + '>');
|
||||
|
||||
} else {
|
||||
summCloses.splice(closePosition, 1);
|
||||
}
|
||||
});
|
||||
|
||||
// reverse the order of the close tags for the summary so they line up right
|
||||
closeTagsForsummaryText.reverse();
|
||||
|
||||
// create necessary summary and detail elements if they don't already exist
|
||||
if ( !hasDetails ) {
|
||||
|
||||
// end script if there is no detail text or if detail has fewer words than widow option
|
||||
detailText = allHtml.slice(summaryText.length);
|
||||
detailTagless = $.trim( detailText.replace(rOpenCloseTag, '') );
|
||||
|
||||
if ( detailTagless === '' || detailTagless.split(/\s+/).length < o.widow ) {
|
||||
return;
|
||||
}
|
||||
// otherwise, continue...
|
||||
lastCloseTag = closeTagsForsummaryText.pop() || '';
|
||||
summaryText += closeTagsForsummaryText.join('');
|
||||
detailText = openTagsForDetails.join('') + detailText;
|
||||
|
||||
} else {
|
||||
// assume that even if there are details, we still need readMore/readLess/summary elements
|
||||
// (we already bailed out earlier when readMore el was found)
|
||||
// but we need to create els differently
|
||||
|
||||
// remove the detail from the rest of the content
|
||||
detailText = $this.find(detailSelector).remove().html();
|
||||
|
||||
// The summary is what's left
|
||||
summaryText = $this.html();
|
||||
|
||||
// allHtml is the summary and detail combined (this is needed when content has block-level elements)
|
||||
allHtml = summaryText + detailText;
|
||||
|
||||
lastCloseTag = '';
|
||||
}
|
||||
o.moreLabel = $this.find(moreSelector).length ? '' : buildMoreLabel(o);
|
||||
|
||||
if (hasBlocks) {
|
||||
detailText = allHtml;
|
||||
}
|
||||
summaryText += lastCloseTag;
|
||||
|
||||
// onSlice callback
|
||||
o.summary = summaryText;
|
||||
o.details = detailText;
|
||||
o.lastCloseTag = lastCloseTag;
|
||||
|
||||
if (defined.onSlice) {
|
||||
// user can choose to return a modified options object
|
||||
// one last chance for user to change the options. sneaky, huh?
|
||||
// but could be tricky so use at your own risk.
|
||||
tmp = o.onSlice.call(thisEl, o);
|
||||
|
||||
// so, if the returned value from the onSlice function is an object with a details property, we'll use that!
|
||||
o = tmp && tmp.details ? tmp : o;
|
||||
}
|
||||
|
||||
// build the html with summary and detail and use it to replace old contents
|
||||
var html = buildHTML(o, hasBlocks);
|
||||
|
||||
$this.html( html );
|
||||
|
||||
// set up details and summary for expanding/collapsing
|
||||
$thisDetails = $this.find(detailSelector);
|
||||
$readMore = $this.find(moreSelector);
|
||||
$thisDetails.hide();
|
||||
$readMore.find('a').unbind('click.expander').bind('click.expander', expand);
|
||||
|
||||
$summEl = $this.find('div.' + o.summaryClass);
|
||||
|
||||
if ( o.userCollapse && !$this.find('span.' + o.lessClass).length ) {
|
||||
$this
|
||||
.find(detailSelector)
|
||||
.append('<span class="' + o.lessClass + '">' + o.userCollapsePrefix + '<a href="#">' + o.userCollapseText + '</a></span>');
|
||||
}
|
||||
|
||||
$this
|
||||
.find('span.' + o.lessClass + ' a')
|
||||
.unbind('click.expander')
|
||||
.bind('click.expander', function(event) {
|
||||
event.preventDefault();
|
||||
clearTimeout(delayedCollapse);
|
||||
var $detailsCollapsed = $(this).closest(detailSelector);
|
||||
reCollapse(o, $detailsCollapsed);
|
||||
if (defined.onCollapse) {
|
||||
o.onCollapse.call(thisEl, true);
|
||||
}
|
||||
});
|
||||
|
||||
function expand(event) {
|
||||
event.preventDefault();
|
||||
$readMore.hide();
|
||||
$summEl.hide();
|
||||
if (defined.beforeExpand) {
|
||||
o.beforeExpand.call(thisEl);
|
||||
}
|
||||
|
||||
$thisDetails.stop(false, true)[o.expandEffect](expandSpeed, function() {
|
||||
$thisDetails.css({zoom: ''});
|
||||
if (defined.afterExpand) {o.afterExpand.call(thisEl);}
|
||||
delayCollapse(o, $thisDetails, thisEl);
|
||||
});
|
||||
}
|
||||
|
||||
}); // this.each
|
||||
},
|
||||
destroy: function() {
|
||||
if ( !this.data('expander') ) {
|
||||
return;
|
||||
}
|
||||
this.removeData('expander');
|
||||
this.each(function() {
|
||||
var $this = $(this),
|
||||
o = $.meta ? $.extend({}, opts, $this.data()) : opts,
|
||||
details = $this.find('.' + o.detailClass).contents();
|
||||
|
||||
$this.find('.' + o.moreClass).remove();
|
||||
$this.find('.' + o.summaryClass).remove();
|
||||
$this.find('.' + o.detailClass).after(details).remove();
|
||||
$this.find('.' + o.lessClass).remove();
|
||||
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// run the methods (almost always "init")
|
||||
if ( methods[meth] ) {
|
||||
methods[ meth ].call(this);
|
||||
}
|
||||
|
||||
// utility functions
|
||||
function buildHTML(o, blocks) {
|
||||
var el = 'span',
|
||||
summary = o.summary;
|
||||
if ( blocks ) {
|
||||
el = 'div';
|
||||
// if summary ends with a close tag, tuck the moreLabel inside it
|
||||
if ( rLastCloseTag.test(summary) && !o.expandAfterSummary) {
|
||||
summary = summary.replace(rLastCloseTag, o.moreLabel + '$1');
|
||||
} else {
|
||||
// otherwise (e.g. if ends with self-closing tag) just add moreLabel after summary
|
||||
// fixes #19
|
||||
summary += o.moreLabel;
|
||||
}
|
||||
|
||||
// and wrap it in a div
|
||||
summary = '<div class="' + o.summaryClass + '">' + summary + '</div>';
|
||||
} else {
|
||||
summary += o.moreLabel;
|
||||
}
|
||||
|
||||
return [
|
||||
summary,
|
||||
'<',
|
||||
el + ' class="' + o.detailClass + '"',
|
||||
'>',
|
||||
o.details,
|
||||
'</' + el + '>'
|
||||
].join('');
|
||||
}
|
||||
|
||||
function buildMoreLabel(o) {
|
||||
var ret = '<span class="' + o.moreClass + '">' + o.expandPrefix;
|
||||
ret += '<a href="#">' + o.expandText + '</a></span>';
|
||||
return ret;
|
||||
}
|
||||
|
||||
function backup(txt, preserveWords) {
|
||||
if ( txt.lastIndexOf('<') > txt.lastIndexOf('>') ) {
|
||||
txt = txt.slice( 0, txt.lastIndexOf('<') );
|
||||
}
|
||||
if (preserveWords) {
|
||||
txt = txt.replace(rAmpWordEnd,'');
|
||||
}
|
||||
|
||||
return $.trim(txt);
|
||||
}
|
||||
|
||||
function reCollapse(o, el) {
|
||||
el.stop(true, true)[o.collapseEffect](o.collapseSpeed, function() {
|
||||
var prevMore = el.prev('span.' + o.moreClass).show();
|
||||
if (!prevMore.length) {
|
||||
el.parent().children('div.' + o.summaryClass).show()
|
||||
.find('span.' + o.moreClass).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function delayCollapse(option, $collapseEl, thisEl) {
|
||||
if (option.collapseTimer) {
|
||||
delayedCollapse = setTimeout(function() {
|
||||
reCollapse(option, $collapseEl);
|
||||
if ( $.isFunction(option.onCollapse) ) {
|
||||
option.onCollapse.call(thisEl, false);
|
||||
}
|
||||
}, option.collapseTimer);
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
// plugin defaults
|
||||
$.fn.expander.defaults = $.expander.defaults;
|
||||
})(jQuery);
|
|
@ -121,6 +121,9 @@
|
|||
text-overflow:ellipsis;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
.openerp .oe_mail .oe_msg .oe_msg_content .oe_msg_body .oe_mail_cleaned {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* a) Indented Messages */
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ openerp.mail = function (session) {
|
|||
var _t = session.web._t,
|
||||
_lt = session.web._lt;
|
||||
|
||||
var mail = session.mail = {};
|
||||
var mail = session.mail;
|
||||
|
||||
openerp_mail_followers(session, mail); // import mail_followers.js
|
||||
openerp_FieldMany2ManyTagsEmail(session); // import manyy2many_tags_email.js
|
||||
|
@ -225,6 +225,7 @@ openerp.mail = function (session) {
|
|||
this.name = datasets.name || false,
|
||||
this.record_name = datasets.record_name || false,
|
||||
this.body = datasets.body || '',
|
||||
this.body_short = datasets.body_short || '',
|
||||
this.vote_nb = datasets.vote_nb || 0,
|
||||
this.has_voted = datasets.has_voted || false,
|
||||
this.is_favorite = datasets.is_favorite || false,
|
||||
|
@ -945,7 +946,6 @@ openerp.mail = function (session) {
|
|||
|
||||
start: function () {
|
||||
this._super.apply(this, arguments);
|
||||
this.expender();
|
||||
this.bind_events();
|
||||
if(this.thread_level < this.options.display_indented_thread) {
|
||||
this.create_thread();
|
||||
|
@ -968,6 +968,8 @@ openerp.mail = function (session) {
|
|||
this.$('.oe_reply').on('click', this.on_message_reply);
|
||||
this.$('.oe_star').on('click', this.on_star);
|
||||
this.$('.oe_msg_vote').on('click', this.on_vote);
|
||||
this.$('.oe_mail_expand').on('click', this.on_expand);
|
||||
this.$('.oe_mail_reduce').on('click', this.on_expand);
|
||||
this.$('.oe_mail_action_model').on('click', this.on_record_clicked);
|
||||
},
|
||||
|
||||
|
@ -996,15 +998,11 @@ openerp.mail = function (session) {
|
|||
return false;
|
||||
},
|
||||
|
||||
expender: function () {
|
||||
this.$('.oe_msg_body:first').expander({
|
||||
slicePoint: this.options.truncate_limit,
|
||||
expandText: _t('read more'),
|
||||
userCollapseText: _t('read less'),
|
||||
detailClass: 'oe_msg_tail',
|
||||
moreClass: 'oe_mail_expand',
|
||||
lessClass: 'oe_mail_reduce',
|
||||
});
|
||||
on_expand: function (event) {
|
||||
event.stopPropagation();
|
||||
this.$('.oe_msg_body_short:first').toggle();
|
||||
this.$('.oe_msg_body_long:first').toggle();
|
||||
return false;
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
@ -268,7 +268,13 @@
|
|||
<t t-if="widget.subject" t-raw="widget.subject"/>
|
||||
</h1>
|
||||
<div class="oe_msg_body">
|
||||
<t t-raw="widget.body"/>
|
||||
<t t-if="widget.body_short">
|
||||
<div class="oe_msg_body_short"><t t-raw="widget.body_short"/></div>
|
||||
<div class="oe_msg_body_long" style="display: none;"><t t-raw="widget.body"/><span class="oe_mail_reduce"><a href="#">read less</a></span></div>
|
||||
</t>
|
||||
<t t-if="! widget.body_short">
|
||||
<t t-raw="widget.body"/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
<div class="oe_msg_footer">
|
||||
|
|
|
@ -640,7 +640,7 @@ class test_mail(TestMailBase):
|
|||
})
|
||||
compose = mail_compose.browse(cr, uid, compose_id)
|
||||
|
||||
# D: Post the comment, get created message for each group
|
||||
# Do: Post the comment, get created message for each group
|
||||
mail_compose.send_mail(cr, user_raoul.id, [compose_id], context={
|
||||
'default_res_id': -1,
|
||||
'active_ids': [self.group_pigs_id, group_bird_id]
|
||||
|
@ -679,6 +679,37 @@ class test_mail(TestMailBase):
|
|||
self.assertEqual(set(bird_pids), set(test_pids),
|
||||
'compose wizard: mail_post_autofollow and mail_create_nosubscribe context keys not correctly taken into account')
|
||||
|
||||
# Do: Compose in mass_mail, coming from list_view, we have an active_domain that should be supported
|
||||
compose_id = mail_compose.create(cr, user_raoul.id,
|
||||
{
|
||||
'subject': _subject,
|
||||
'body': '${object.description}',
|
||||
'partner_ids': [(4, p_c_id), (4, p_d_id)],
|
||||
}, context={
|
||||
'default_composition_mode': 'mass_mail',
|
||||
'default_model': 'mail.group',
|
||||
'default_res_id': False,
|
||||
'active_ids': [self.group_pigs_id],
|
||||
'active_domain': [('name', 'in', ['Pigs', 'Bird'])],
|
||||
})
|
||||
compose = mail_compose.browse(cr, uid, compose_id)
|
||||
|
||||
# Do: Post the comment, get created message for each group
|
||||
mail_compose.send_mail(
|
||||
cr, user_raoul.id, [compose_id], context={
|
||||
'default_res_id': -1,
|
||||
'active_ids': [self.group_pigs_id, group_bird_id]
|
||||
})
|
||||
group_pigs.refresh()
|
||||
group_bird.refresh()
|
||||
message1 = group_pigs.message_ids[0]
|
||||
message2 = group_bird.message_ids[0]
|
||||
|
||||
# Test: Pigs and Bird did receive their message
|
||||
test_msg_ids = self.mail_message.search(cr, uid, [], limit=2)
|
||||
self.assertIn(message1.id, test_msg_ids, 'compose wizard: Pigs did not receive its mass mailing message')
|
||||
self.assertIn(message2.id, test_msg_ids, 'compose wizard: Bird did not receive its mass mailing message')
|
||||
|
||||
def test_30_needaction(self):
|
||||
""" Tests for mail.message needaction. """
|
||||
cr, uid, user_admin, user_raoul, group_pigs = self.cr, self.uid, self.user_admin, self.user_raoul, self.group_pigs
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
##############################################################################
|
||||
|
||||
from openerp.addons.mail.tests.test_mail_base import TestMailBase
|
||||
from openerp.tools import mute_logger, email_split
|
||||
from openerp.tools import mute_logger
|
||||
|
||||
MAIL_TEMPLATE = """Return-Path: <whatever-2a840@postmaster.twitter.com>
|
||||
To: {to}
|
||||
|
@ -101,9 +101,9 @@ class TestMailgateway(TestMailBase):
|
|||
# Do: find partner with email -> first partner should be found
|
||||
partner_info = self.mail_thread.message_partner_info_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_partner_info_from_emails did not handle email')
|
||||
'mail_thread: message_partner_info_from_emails did not handle email')
|
||||
self.assertEqual(partner_info['partner_id'], p_a_id,
|
||||
'mail_thread: message_partner_info_from_emails wrong partner found')
|
||||
'mail_thread: message_partner_info_from_emails wrong partner found')
|
||||
|
||||
# Data: add some data about partners
|
||||
# 2 - User BRaoul
|
||||
|
@ -112,7 +112,7 @@ class TestMailgateway(TestMailBase):
|
|||
# Do: find partner with email -> first user should be found
|
||||
partner_info = self.mail_thread.message_partner_info_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_partner_info_from_emails wrong partner found')
|
||||
'mail_thread: message_partner_info_from_emails wrong partner found')
|
||||
|
||||
# --------------------------------------------------
|
||||
# CASE1: with object
|
||||
|
@ -122,7 +122,7 @@ class TestMailgateway(TestMailBase):
|
|||
self.mail_group.message_subscribe(cr, uid, [group_pigs.id], [p_b_id])
|
||||
partner_info = self.mail_group.message_partner_info_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_partner_info_from_emails wrong partner found')
|
||||
'mail_thread: message_partner_info_from_emails wrong partner found')
|
||||
|
||||
def test_05_mail_message_mail_mail(self):
|
||||
""" Tests designed for testing email values based on mail.message, aliases, ... """
|
||||
|
@ -146,46 +146,46 @@ class TestMailgateway(TestMailBase):
|
|||
msg = self.mail_message.browse(cr, user_raoul_id, msg_id)
|
||||
# Test: message content
|
||||
self.assertIn('reply_to', msg.message_id,
|
||||
'mail_message: message_id should be specific to a mail_message with a given reply_to')
|
||||
'mail_message: message_id should be specific to a mail_message with a given reply_to')
|
||||
self.assertEqual(msg.reply_to, reply_to1,
|
||||
'mail_message: incorrect reply_to: should come from values')
|
||||
'mail_message: incorrect reply_to: should come from values')
|
||||
self.assertEqual(msg.email_from, email_from1,
|
||||
'mail_message: incorrect email_from: should come from values')
|
||||
'mail_message: incorrect email_from: should come from values')
|
||||
# Do: create a mail_mail with the previous mail_message
|
||||
mail_id = self.mail_mail.create(cr, user_raoul_id, {'mail_message_id': msg_id, 'state': 'cancel'})
|
||||
mail = self.mail_mail.browse(cr, user_raoul_id, mail_id)
|
||||
# Test: mail_mail content
|
||||
self.assertEqual(mail.reply_to, reply_to1,
|
||||
'mail_mail: incorrect reply_to: should come from mail.message')
|
||||
'mail_mail: incorrect reply_to: should come from mail.message')
|
||||
self.assertEqual(mail.email_from, email_from1,
|
||||
'mail_mail: incorrect email_from: should come from mail.message')
|
||||
'mail_mail: incorrect email_from: should come from mail.message')
|
||||
# Do: create a mail_mail with the previous mail_message + specified reply_to
|
||||
mail_id = self.mail_mail.create(cr, user_raoul_id, {'mail_message_id': msg_id, 'state': 'cancel', 'reply_to': reply_to2})
|
||||
mail = self.mail_mail.browse(cr, user_raoul_id, mail_id)
|
||||
# Test: mail_mail content
|
||||
self.assertEqual(mail.reply_to, reply_to2,
|
||||
'mail_mail: incorrect reply_to: should come from values')
|
||||
'mail_mail: incorrect reply_to: should come from values')
|
||||
self.assertEqual(mail.email_from, email_from1,
|
||||
'mail_mail: incorrect email_from: should come from mail.message')
|
||||
'mail_mail: incorrect email_from: should come from mail.message')
|
||||
|
||||
# Do: mail_message attached to a document
|
||||
msg_id = self.mail_message.create(cr, user_raoul_id, {'model': 'mail.group', 'res_id': self.group_pigs_id})
|
||||
msg = self.mail_message.browse(cr, user_raoul_id, msg_id)
|
||||
# Test: message content
|
||||
self.assertIn('mail.group', msg.message_id,
|
||||
'mail_message: message_id should contain model')
|
||||
'mail_message: message_id should contain model')
|
||||
self.assertIn('%s' % self.group_pigs_id, msg.message_id,
|
||||
'mail_message: message_id should contain res_id')
|
||||
'mail_message: message_id should contain res_id')
|
||||
self.assertFalse(msg.reply_to,
|
||||
'mail_message: incorrect reply_to: should not be generated if not specified')
|
||||
'mail_message: incorrect reply_to: should not be generated if not specified')
|
||||
self.assertEqual(msg.email_from, raoul_from,
|
||||
'mail_message: incorrect email_from: should be Raoul')
|
||||
'mail_message: incorrect email_from: should be Raoul')
|
||||
# Do: create a mail_mail based on the previous mail_message
|
||||
mail_id = self.mail_mail.create(cr, user_raoul_id, {'mail_message_id': msg_id, 'state': 'cancel'})
|
||||
mail = self.mail_mail.browse(cr, user_raoul_id, mail_id)
|
||||
# Test: mail_mail content
|
||||
self.assertEqual(mail.reply_to, raoul_reply,
|
||||
'mail_mail: incorrect reply_to: should be Raoul')
|
||||
'mail_mail: incorrect reply_to: should be Raoul')
|
||||
|
||||
# Data: set catchall domain
|
||||
self.registry('ir.config_parameter').set_param(cr, uid, 'mail.catchall.domain', alias_domain)
|
||||
|
@ -199,7 +199,7 @@ class TestMailgateway(TestMailBase):
|
|||
mail = self.mail_mail.browse(cr, user_raoul_id, mail_id)
|
||||
# Test: mail_mail content
|
||||
self.assertEqual(mail.reply_to, raoul_reply_alias,
|
||||
'mail_mail: incorrect reply_to: should be Pigs alias')
|
||||
'mail_mail: incorrect reply_to: should be Pigs alias')
|
||||
|
||||
# Update message: test alias on email_from
|
||||
msg_id = self.mail_message.create(cr, user_raoul_id, {})
|
||||
|
@ -209,7 +209,7 @@ class TestMailgateway(TestMailBase):
|
|||
mail = self.mail_mail.browse(cr, user_raoul_id, mail_id)
|
||||
# Test: mail_mail content
|
||||
self.assertEqual(mail.reply_to, raoul_from_alias,
|
||||
'mail_mail: incorrect reply_to: should be message email_from using Raoul alias')
|
||||
'mail_mail: incorrect reply_to: should be message email_from using Raoul alias')
|
||||
|
||||
# Update message
|
||||
self.mail_message.write(cr, user_raoul_id, [msg_id], {'res_id': False, 'email_from': 'someone@schlouby.fr', 'reply_to': False})
|
||||
|
@ -219,7 +219,7 @@ class TestMailgateway(TestMailBase):
|
|||
mail = self.mail_mail.browse(cr, user_raoul_id, mail_id)
|
||||
# Test: mail_mail content
|
||||
self.assertEqual(mail.reply_to, msg.email_from,
|
||||
'mail_mail: incorrect reply_to: should be message email_from')
|
||||
'mail_mail: incorrect reply_to: should be message email_from')
|
||||
|
||||
# Data: set catchall alias
|
||||
self.registry('ir.config_parameter').set_param(self.cr, self.uid, 'mail.catchall.alias', 'gateway')
|
||||
|
@ -232,21 +232,21 @@ class TestMailgateway(TestMailBase):
|
|||
mail = self.mail_mail.browse(cr, uid, mail_id)
|
||||
# Test: mail_mail Content-Type
|
||||
self.assertEqual(mail.reply_to, 'gateway@schlouby.fr',
|
||||
'mail_mail: reply_to should equal the catchall email alias')
|
||||
'mail_mail: reply_to should equal the catchall email alias')
|
||||
|
||||
# Do: create a mail_mail
|
||||
mail_id = self.mail_mail.create(cr, uid, {'state': 'cancel'})
|
||||
mail = self.mail_mail.browse(cr, uid, mail_id)
|
||||
# Test: mail_mail content
|
||||
self.assertEqual(mail.reply_to, 'gateway@schlouby.fr',
|
||||
'mail_mail: reply_to should equal the catchall email alias')
|
||||
'mail_mail: reply_to should equal the catchall email alias')
|
||||
|
||||
# Do: create a mail_mail
|
||||
mail_id = self.mail_mail.create(cr, uid, {'state': 'cancel', 'reply_to': 'someone@example.com'})
|
||||
mail = self.mail_mail.browse(cr, uid, mail_id)
|
||||
# Test: mail_mail content
|
||||
self.assertEqual(mail.reply_to, 'someone@example.com',
|
||||
'mail_mail: reply_to should equal the rpely_to given to create')
|
||||
'mail_mail: reply_to should equal the rpely_to given to create')
|
||||
|
||||
@mute_logger('openerp.addons.mail.mail_thread', 'openerp.osv.orm')
|
||||
def test_10_message_process(self):
|
||||
|
@ -254,9 +254,9 @@ class TestMailgateway(TestMailBase):
|
|||
cr, uid, user_raoul = self.cr, self.uid, self.user_raoul
|
||||
|
||||
def format_and_process(template, to='groups@example.com, other@gmail.com', subject='Frogs',
|
||||
extra='', email_from='Sylvie Lelitre <test.sylvie.lelitre@agrolait.com>',
|
||||
msg_id='<1198923581.41972151344608186760.JavaMail@agrolait.com>',
|
||||
model=None):
|
||||
extra='', email_from='Sylvie Lelitre <test.sylvie.lelitre@agrolait.com>',
|
||||
msg_id='<1198923581.41972151344608186760.JavaMail@agrolait.com>',
|
||||
model=None):
|
||||
self.assertEqual(self.mail_group.search(cr, uid, [('name', '=', subject)]), [])
|
||||
mail = template.format(to=to, subject=subject, extra=extra, email_from=email_from, msg_id=msg_id)
|
||||
self.mail_thread.message_process(cr, uid, model, mail)
|
||||
|
@ -289,29 +289,29 @@ class TestMailgateway(TestMailBase):
|
|||
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')
|
||||
'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')
|
||||
'message_process: newly created group should have the incoming email in message_ids')
|
||||
msg = frog_group.message_ids[0]
|
||||
self.assertEqual('Frogs', msg.subject,
|
||||
'message_process: newly created group should have the incoming email as first message')
|
||||
'message_process: newly created group should have the incoming email as first message')
|
||||
self.assertIn('Please call me as soon as possible this afternoon!', msg.body,
|
||||
'message_process: newly created group should have the incoming email as first message')
|
||||
'message_process: newly created group should have the incoming email as first message')
|
||||
self.assertEqual('email', msg.type,
|
||||
'message_process: newly created group should have an email as first message')
|
||||
'message_process: newly created group should have an email as first message')
|
||||
self.assertEqual('Discussions', msg.subtype_id.name,
|
||||
'message_process: newly created group should not have a log first message but an email')
|
||||
'message_process: newly created group should not have a log first message but an email')
|
||||
# Test: message: unknown email address -> message has email_from, not author_id
|
||||
self.assertFalse(msg.author_id,
|
||||
'message_process: message on created group should not have an author_id')
|
||||
'message_process: message on created group should not have an author_id')
|
||||
self.assertIn('test.sylvie.lelitre@agrolait.com', msg.email_from,
|
||||
'message_process: message on created group should have an email_from')
|
||||
'message_process: message on created group should have an email_from')
|
||||
# Test: followers: nobody
|
||||
self.assertEqual(len(frog_group.message_follower_ids), 0, 'message_process: newly create group should not have any follower')
|
||||
# Test: sent emails: no-one
|
||||
self.assertEqual(len(sent_emails), 0,
|
||||
'message_process: should create emails without any follower added')
|
||||
'message_process: should create emails without any follower added')
|
||||
# Data: unlink group
|
||||
frog_group.unlink()
|
||||
|
||||
|
@ -324,11 +324,11 @@ class TestMailgateway(TestMailBase):
|
|||
# Test: email bounced
|
||||
sent_emails = self._build_email_kwargs_list
|
||||
self.assertEqual(len(sent_emails), 1,
|
||||
'message_process: incoming email on Partners alias should send a bounce email')
|
||||
'message_process: incoming email on Partners alias should send a bounce email')
|
||||
self.assertIn('Frogs', sent_emails[0].get('subject'),
|
||||
'message_process: bounce email on Partners alias should contain the original subject')
|
||||
'message_process: bounce email on Partners alias should contain the original subject')
|
||||
self.assertIn('test.sylvie.lelitre@agrolait.com', sent_emails[0].get('email_to'),
|
||||
'message_process: bounce email on Partners alias should have original email sender as recipient')
|
||||
'message_process: bounce email on Partners alias should have original email sender as recipient')
|
||||
|
||||
# Do: incoming email from an unknown partner on a Followers only alias -> bounce
|
||||
self._init_mock_build_email()
|
||||
|
@ -339,11 +339,11 @@ class TestMailgateway(TestMailBase):
|
|||
# Test: email bounced
|
||||
sent_emails = self._build_email_kwargs_list
|
||||
self.assertEqual(len(sent_emails), 1,
|
||||
'message_process: incoming email on Followers alias should send a bounce email')
|
||||
'message_process: incoming email on Followers alias should send a bounce email')
|
||||
self.assertIn('Frogs', sent_emails[0].get('subject'),
|
||||
'message_process: bounce email on Followers alias should contain the original subject')
|
||||
'message_process: bounce email on Followers alias should contain the original subject')
|
||||
self.assertIn('test.sylvie.lelitre@agrolait.com', sent_emails[0].get('email_to'),
|
||||
'message_process: bounce email on Followers alias should have original email sender as recipient')
|
||||
'message_process: bounce email on Followers alias should have original email sender as recipient')
|
||||
|
||||
# Do: incoming email from a known partner on a Partners alias -> ok (+ test on alias.user_id)
|
||||
self.mail_alias.write(cr, uid, [alias_id], {'alias_user_id': self.user_raoul_id, 'alias_contact': 'partners'})
|
||||
|
@ -357,24 +357,24 @@ class TestMailgateway(TestMailBase):
|
|||
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')
|
||||
'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')
|
||||
'message_process: newly created group should have the incoming email in message_ids')
|
||||
msg = frog_group.message_ids[0]
|
||||
# Test: message: author found
|
||||
self.assertEqual(p1id, msg.author_id.id,
|
||||
'message_process: message on created group should have Sylvie as author_id')
|
||||
'message_process: message on created group should have Sylvie as author_id')
|
||||
self.assertIn('Sylvie Lelitre <test.sylvie.lelitre@agrolait.com>', msg.email_from,
|
||||
'message_process: message on created group should have have an email_from')
|
||||
'message_process: message on created group should have have an email_from')
|
||||
# Test: author (not recipient and not Raoul (as alias owner)) added as follower
|
||||
frog_follower_ids = set([p.id for p in frog_group.message_follower_ids])
|
||||
self.assertEqual(frog_follower_ids, set([p1id]),
|
||||
'message_process: newly created group should have 1 follower (author, not creator, not recipients)')
|
||||
'message_process: newly created group should have 1 follower (author, not creator, not recipients)')
|
||||
# Test: sent emails: no-one, no bounce effet
|
||||
sent_emails = self._build_email_kwargs_list
|
||||
self.assertEqual(len(sent_emails), 0,
|
||||
'message_process: should not bounce incoming emails')
|
||||
'message_process: should not bounce incoming emails')
|
||||
# Data: unlink group
|
||||
frog_group.unlink()
|
||||
|
||||
|
@ -387,7 +387,7 @@ class TestMailgateway(TestMailBase):
|
|||
# Test: email bounced
|
||||
sent_emails = self._build_email_kwargs_list
|
||||
self.assertEqual(len(sent_emails), 1,
|
||||
'message_process: incoming email on Partners alias should send a bounce email')
|
||||
'message_process: incoming email on Partners alias should send a bounce email')
|
||||
|
||||
# Do: incoming email from a parent document follower on a Followers only alias -> ok
|
||||
self._init_mock_build_email()
|
||||
|
@ -398,15 +398,15 @@ class TestMailgateway(TestMailBase):
|
|||
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,
|
||||
'message_process: newly created group should have the incoming email in message_ids')
|
||||
'message_process: newly created group should have the incoming email in message_ids')
|
||||
# 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]),
|
||||
'message_process: newly created group should have 1 follower (author, not creator, not recipients)')
|
||||
'message_process: newly created group should have 1 follower (author, not creator, not recipients)')
|
||||
# Test: sent emails: no-one, no bounce effet
|
||||
sent_emails = self._build_email_kwargs_list
|
||||
self.assertEqual(len(sent_emails), 0,
|
||||
'message_process: should not bounce incoming emails')
|
||||
'message_process: should not bounce incoming emails')
|
||||
|
||||
# --------------------------------------------------
|
||||
# Test2: update-like alias
|
||||
|
@ -416,43 +416,43 @@ class TestMailgateway(TestMailBase):
|
|||
self._init_mock_build_email()
|
||||
self.mail_group.write(cr, uid, [frog_group.id], {'alias_name': 'frogs', 'alias_contact': 'followers', 'alias_force_thread_id': frog_group.id})
|
||||
frog_groups = format_and_process(MAIL_TEMPLATE, email_from='other4@gmail.com',
|
||||
msg_id='<1198923581.41972151344608186760.JavaMail.diff1@agrolait.com>',
|
||||
to='frogs@example.com>', subject='Re: news')
|
||||
msg_id='<1198923581.41972151344608186760.JavaMail.diff1@agrolait.com>',
|
||||
to='frogs@example.com>', subject='Re: news')
|
||||
# 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')
|
||||
'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')
|
||||
'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: email bounced
|
||||
sent_emails = self._build_email_kwargs_list
|
||||
self.assertEqual(len(sent_emails), 1,
|
||||
'message_process: incoming email on Followers alias should send a bounce email')
|
||||
'message_process: incoming email on Followers alias should send a bounce email')
|
||||
self.assertIn('Re: news', sent_emails[0].get('subject'),
|
||||
'message_process: bounce email on Followers alias should contain the original subject')
|
||||
'message_process: bounce email on Followers alias should contain the original subject')
|
||||
|
||||
# Do: Pigs alias is restricted, should accept Followers
|
||||
self._init_mock_build_email()
|
||||
self.mail_group.message_subscribe(cr, uid, [frog_group.id], [p2id])
|
||||
frog_groups = format_and_process(MAIL_TEMPLATE, email_from='other4@gmail.com',
|
||||
msg_id='<1198923581.41972151344608186799.JavaMail.diff1@agrolait.com>',
|
||||
to='frogs@example.com>', subject='Re: cats')
|
||||
msg_id='<1198923581.41972151344608186799.JavaMail.diff1@agrolait.com>',
|
||||
to='frogs@example.com>', subject='Re: cats')
|
||||
# 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')
|
||||
'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')
|
||||
'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.assertEqual(len(frog_group.message_ids), 2, 'message_process: group should contain 2 messages after reply')
|
||||
# Test: sent emails: 1 (Sylvie copy of the incoming email, but no bounce)
|
||||
sent_emails = self._build_email_kwargs_list
|
||||
self.assertEqual(len(sent_emails), 1,
|
||||
'message_process: one email should have been generated')
|
||||
'message_process: one email should have been generated')
|
||||
self.assertIn('test.sylvie.lelitre@agrolait.com', sent_emails[0].get('email_to')[0],
|
||||
'message_process: email should be sent to Sylvie')
|
||||
'message_process: email should be sent to Sylvie')
|
||||
self.mail_group.message_unsubscribe(cr, uid, [frog_group.id], [p2id])
|
||||
|
||||
# --------------------------------------------------
|
||||
|
@ -461,40 +461,40 @@ 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='other4@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)
|
||||
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
|
||||
self.assertEqual(len(frog_groups), 0,
|
||||
'message_process: reply on Frogs should not have created a new group with new subject')
|
||||
'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')
|
||||
'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.assertEqual(len(frog_group.message_ids), 3, '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')
|
||||
'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='other4@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)
|
||||
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')
|
||||
'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')
|
||||
'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), 3, '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')
|
||||
'message_process: message with already existing message_id should not have been duplicated')
|
||||
|
||||
# --------------------------------------------------
|
||||
# Test4: email_from and partner finding
|
||||
|
@ -505,28 +505,28 @@ 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)
|
||||
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])
|
||||
# Test: author is A-Raoul (only existing)
|
||||
self.assertEqual(frog_group.message_ids[0].author_id.id, extra_partner_id,
|
||||
'message_process: email_from -> author_id wrong')
|
||||
'message_process: email_from -> author_id wrong')
|
||||
|
||||
# Do: post a new message, with a known partner -> duplicate emails -> user
|
||||
frog_group.message_unsubscribe([extra_partner_id])
|
||||
raoul_email = self.user_raoul.email
|
||||
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)
|
||||
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])
|
||||
# Test: author is Raoul (user), not A-Raoul
|
||||
self.assertEqual(frog_group.message_ids[0].author_id.id, self.partner_raoul_id,
|
||||
'message_process: email_from -> author_id wrong')
|
||||
'message_process: email_from -> author_id wrong')
|
||||
|
||||
# Do: post a new message, with a known partner -> duplicate emails -> partner because is follower
|
||||
frog_group.message_unsubscribe([self.partner_raoul_id])
|
||||
|
@ -534,14 +534,14 @@ class TestMailgateway(TestMailBase):
|
|||
raoul_email = self.user_raoul.email
|
||||
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)
|
||||
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])
|
||||
# Test: author is Raoul (user), not A-Raoul
|
||||
self.assertEqual(frog_group.message_ids[0].author_id.id, extra_partner_id,
|
||||
'message_process: email_from -> author_id wrong')
|
||||
'message_process: email_from -> author_id wrong')
|
||||
|
||||
self.res_users.write(cr, uid, self.user_raoul_id, {'email': raoul_email})
|
||||
|
||||
|
@ -551,37 +551,37 @@ 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',
|
||||
msg_id='<1198923581.41972151344608186760.JavaMail.new4@agrolait.com>')
|
||||
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='',
|
||||
msg_id='<1198923581.41972151344608186760.JavaMail.new5@agrolait.com>')
|
||||
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',
|
||||
msg_id='<1198923581.41972151344608186760.JavaMail.new6@agrolait.com>')
|
||||
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')
|
||||
'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>')
|
||||
to='groups@example.com', subject='Frogs Return', extra='',
|
||||
msg_id='<deadcafe.1337@smtp.agrolait.com>')
|
||||
# Test: one group created with one message
|
||||
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.assertIn('<pre>\nPlease call me as soon as possible this afternoon!\n\n--\nSylvie\n</pre>', msg.body,
|
||||
'message_process: plaintext incoming email incorrectly parsed')
|
||||
'message_process: plaintext incoming email incorrectly parsed')
|
||||
|
||||
@mute_logger('openerp.addons.mail.mail_thread', 'openerp.osv.orm')
|
||||
def test_20_thread_parent_resolution(self):
|
||||
|
@ -602,26 +602,26 @@ 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,
|
||||
msg_id='<1198923581.41972151344608186760.JavaMail.2@agrolait.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,
|
||||
msg_id='<1198923581.41972151344608186760.JavaMail.3@agrolait.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,
|
||||
msg_id='<1198923581.41972151344608186760.JavaMail.4@agrolait.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,
|
||||
msg_id='<1198923581.41972151344608186760.JavaMail.5@agrolait.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()
|
||||
|
@ -633,12 +633,19 @@ class TestMailgateway(TestMailBase):
|
|||
""" Testing private discussion between partners. """
|
||||
cr, uid = self.cr, self.uid
|
||||
|
||||
def format(template, to='Pretty Pigs <group+pigs@example.com>, other@gmail.com', subject='Re: 1',
|
||||
extra='', email_from='Sylvie Lelitre <test.sylvie.lelitre@agrolait.com>',
|
||||
msg_id='<1198923581.41972151344608186760.JavaMail@agrolait.com>'):
|
||||
return template.format(to=to, subject=subject, extra=extra, email_from=email_from, msg_id=msg_id)
|
||||
|
||||
# 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'})
|
||||
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)
|
||||
|
@ -647,16 +654,26 @@ class TestMailgateway(TestMailBase):
|
|||
test_pids = msg1_pids
|
||||
test_nids = msg1_pids
|
||||
self.assertEqual(set(msg_pids), set(test_pids),
|
||||
'message_post: private discussion: incorrect recipients')
|
||||
'message_post: private discussion: incorrect recipients')
|
||||
self.assertEqual(set(msg_nids), set(test_nids),
|
||||
'message_post: private discussion: incorrect notified recipients')
|
||||
'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')
|
||||
'message_post: private discussion: context key "thread_model" not correctly ignored when having no res_id')
|
||||
# Test: message reply_to and message-id
|
||||
self.assertFalse(msg.reply_to,
|
||||
'message_post: private discussion: initial message should not have any reply_to specified')
|
||||
self.assertIn('openerp-private', msg.message_id,
|
||||
'message_post: private discussion: message-id should contain the private keyword')
|
||||
|
||||
# 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')
|
||||
reply_message = format(MAIL_TEMPLATE, to='not_important@mydomain.com',
|
||||
email_from='bert@bert.fr',
|
||||
extra='In-Reply-To: %s' % msg.message_id,
|
||||
msg_id='<test30.JavaMail.0@agrolait.com>')
|
||||
self.mail_thread.message_process(cr, uid, None, reply_message)
|
||||
|
||||
# Test: last mail_message created
|
||||
msg2_id = self.mail_message.search(cr, uid, [], limit=1)[0]
|
||||
|
||||
# Test: message recipients
|
||||
msg = self.mail_message.browse(cr, uid, msg2_id)
|
||||
|
@ -664,14 +681,32 @@ class TestMailgateway(TestMailBase):
|
|||
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(msg.author_id.id, self.partner_bert_id,
|
||||
'message_post: private discussion: wrong author through mailgatewya based on email')
|
||||
self.assertEqual(set(msg_pids), set(test_pids),
|
||||
'message_post: private discussion: incorrect recipients when replying')
|
||||
'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')
|
||||
'message_post: private discussion: incorrect notified recipients when replying')
|
||||
|
||||
# Do: Bert replies through chatter (is a customer)
|
||||
msg3_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, 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_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')
|
||||
msg3_id = self.mail_thread.message_post(cr, uid, False, parent_id=msg3_id, subtype='mail.mt_comment')
|
||||
|
||||
# Test: message recipients
|
||||
msg = self.mail_message.browse(cr, uid, msg3_id)
|
||||
|
@ -680,6 +715,6 @@ class TestMailgateway(TestMailBase):
|
|||
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')
|
||||
'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')
|
||||
'message_post: private discussion: incorrect notified recipients when replying')
|
||||
|
|
|
@ -72,6 +72,11 @@ class mail_compose_message(osv.TransientModel):
|
|||
res_id = context.get('default_res_id', context.get('active_id'))
|
||||
message_id = context.get('default_parent_id', context.get('message_id', context.get('active_id')))
|
||||
active_ids = context.get('active_ids')
|
||||
if 'active_domain' in context: # not context.get() because we want to keep global [] domains
|
||||
result['use_active_domain'] = True
|
||||
result['active_domain'] = '%s' % context.get('active_domain')
|
||||
else:
|
||||
result['active_domain'] = ''
|
||||
# get default values according to the composition mode
|
||||
if composition_mode == 'reply':
|
||||
vals = self.get_message_data(cr, uid, message_id, context=context)
|
||||
|
@ -110,6 +115,8 @@ class mail_compose_message(osv.TransientModel):
|
|||
'partner_ids': fields.many2many('res.partner',
|
||||
'mail_compose_message_res_partner_rel',
|
||||
'wizard_id', 'partner_id', 'Additional contacts'),
|
||||
'use_active_domain': fields.boolean('Use active domain'),
|
||||
'active_domain': fields.char('Active domain', readonly=True),
|
||||
'post': fields.boolean('Post a copy in the document',
|
||||
help='Post a copy of the message on the document communication history.'),
|
||||
'notify': fields.boolean('Notify followers',
|
||||
|
@ -127,7 +134,6 @@ class mail_compose_message(osv.TransientModel):
|
|||
'body': lambda self, cr, uid, ctx={}: '',
|
||||
'subject': lambda self, cr, uid, ctx={}: False,
|
||||
'partner_ids': lambda self, cr, uid, ctx={}: [],
|
||||
'notify': lambda self, cr, uid, ctx={}: False,
|
||||
'post': lambda self, cr, uid, ctx={}: True,
|
||||
'same_thread': lambda self, cr, uid, ctx={}: True,
|
||||
}
|
||||
|
@ -237,8 +243,14 @@ class mail_compose_message(osv.TransientModel):
|
|||
context['thread_model'] = wizard.model
|
||||
active_model_pool = self.pool['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]
|
||||
# wizard works in batch mode: [res_id] or active_ids or active_domain
|
||||
if mass_mail_mode and wizard.use_active_domain and wizard.model:
|
||||
res_ids = self.pool[wizard.model].search(cr, uid, eval(wizard.active_domain), context=context)
|
||||
elif mass_mail_mode and wizard.model and active_ids:
|
||||
res_ids = active_ids
|
||||
else:
|
||||
res_ids = [wizard.res_id]
|
||||
|
||||
for res_id in res_ids:
|
||||
# mail.message values, according to the wizard options
|
||||
post_values = {
|
||||
|
|
|
@ -12,6 +12,9 @@
|
|||
<field name="model" invisible="1"/>
|
||||
<field name="res_id" invisible="1"/>
|
||||
<field name="parent_id" invisible="1"/>
|
||||
<field name="mail_server_id" invisible="1"/>
|
||||
<field name="use_active_domain" invisible="1"/>
|
||||
<field name="active_domain" invisible="1"/>
|
||||
<!-- visible wizard -->
|
||||
<field name="email_from"
|
||||
attrs="{'invisible':[('composition_mode', '!=', 'mass_mail')]}"/>
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
<openerp>
|
||||
<data>
|
||||
<record id="action_dummy" model="ir.actions.server">
|
||||
<field name="name">Dummy Action</field>
|
||||
<field name="name">Dummy Python Code</field>
|
||||
<field name="model_id" ref="crm.model_crm_lead"/>
|
||||
<field name="state">dummy</field>
|
||||
<field name="code"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">True</field>
|
||||
<field eval="5" name="sequence"/>
|
||||
<field eval="True" name="condition"/>
|
||||
</record>
|
||||
|
|
|
@ -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-11-28 14:03+0000\n"
|
||||
"Last-Translator: hifly <Unknown>\n"
|
||||
"PO-Revision-Date: 2013-08-07 16:09+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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:02+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
"X-Launchpad-Export-Date: 2013-08-08 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16723)\n"
|
||||
|
||||
#. module: mrp
|
||||
#: help:mrp.config.settings,module_mrp_repair:0
|
||||
|
@ -69,7 +69,7 @@ msgstr "周期数"
|
|||
msgid ""
|
||||
"The 'Minimum stock rule' allows the system to create procurement orders "
|
||||
"automatically as soon as the minimum stock is reached."
|
||||
msgstr "最小库存规则允许系统在达到最小库存数量的时候立即创建补货单"
|
||||
msgstr "最小库存规则允许系统在达到最小库存数量的时会自动创建补货单"
|
||||
|
||||
#. module: mrp
|
||||
#: code:addons/mrp/report/price.py:130
|
||||
|
@ -199,7 +199,7 @@ msgstr "用于外购的物料"
|
|||
#. module: mrp
|
||||
#: model:ir.ui.menu,name:mrp.menu_mrp_production_order_action
|
||||
msgid "Order Planning"
|
||||
msgstr ""
|
||||
msgstr "制造单计划"
|
||||
|
||||
#. module: mrp
|
||||
#: field:mrp.config.settings,module_mrp_operations:0
|
||||
|
@ -286,7 +286,7 @@ msgstr "从一个生产订单生产几个产品"
|
|||
msgid ""
|
||||
"The selection of the right Bill of Material to use will depend on the "
|
||||
"properties specified on the sales order and the Bill of Material."
|
||||
msgstr ""
|
||||
msgstr "被正确使用的BOM依赖于销售单和BOM中指定的属性"
|
||||
|
||||
#. module: mrp
|
||||
#: view:mrp.bom:0
|
||||
|
@ -294,7 +294,7 @@ msgid ""
|
|||
"When processing a sales order for this product, the delivery order\n"
|
||||
" will contain the raw materials, instead of "
|
||||
"the finished product."
|
||||
msgstr ""
|
||||
msgstr "当处理该产品的销售单时,发运单将以原料来替代成品"
|
||||
|
||||
#. module: mrp
|
||||
#: report:mrp.production.order:0
|
||||
|
@ -490,6 +490,16 @@ msgid ""
|
|||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
" 创建新属性\n"
|
||||
" </p><p>\n"
|
||||
" 当同一个产品有多种组成的方式,\n"
|
||||
" OpenERP会根据属性来选择合适的BoM。\n"
|
||||
" 你可以给每个物料清单分配若干个属性,\n"
|
||||
" 当销售人员创建销售订单,根据需要指定几个属性,\n"
|
||||
" 然后OpenERP 会根据其来自动选择相应的BoM。\n"
|
||||
" </p>\n"
|
||||
" "
|
||||
|
||||
#. module: mrp
|
||||
#: view:mrp.production:0
|
||||
|
@ -499,7 +509,7 @@ msgid "Scheduled Date"
|
|||
msgstr "下单日期"
|
||||
|
||||
#. module: mrp
|
||||
#: code:addons/mrp/procurement.py:124
|
||||
#: code:addons/mrp/procurement.py:129
|
||||
#, python-format
|
||||
msgid "Manufacturing Order <em>%s</em> created."
|
||||
msgstr "生产订单 <em>%s</em> 创建。"
|
||||
|
@ -684,7 +694,7 @@ msgid "Work Center Load"
|
|||
msgstr "工作中心负载"
|
||||
|
||||
#. module: mrp
|
||||
#: code:addons/mrp/procurement.py:50
|
||||
#: code:addons/mrp/procurement.py:55
|
||||
#, python-format
|
||||
msgid "No BoM defined for this product !"
|
||||
msgstr "该产品尚未定义物料清单!"
|
||||
|
@ -991,7 +1001,7 @@ msgid "BoM Type"
|
|||
msgstr "物料清单类型"
|
||||
|
||||
#. module: mrp
|
||||
#: code:addons/mrp/procurement.py:52
|
||||
#: code:addons/mrp/procurement.py:57
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Procurement '%s' has an exception: 'No BoM defined for this product !'"
|
||||
|
@ -1120,7 +1130,7 @@ msgstr "生产订单"
|
|||
#. module: mrp
|
||||
#: selection:mrp.production,state:0
|
||||
msgid "Awaiting Raw Materials"
|
||||
msgstr ""
|
||||
msgstr "等待原材料"
|
||||
|
||||
#. module: mrp
|
||||
#: field:mrp.bom,position:0
|
||||
|
@ -1629,6 +1639,17 @@ msgid ""
|
|||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
" 点击创建属性组\n"
|
||||
" </p><p>\n"
|
||||
" 可以定义特定的属性组用来分配到BoM和销售订单。\n"
|
||||
" 根据销售人员在销售订单上选取的属性,OpenERP可以\n"
|
||||
" 自动选择相应的BoM。\n"
|
||||
" </p><p>\n"
|
||||
" 例如,在属性组“保修” ,你有两个属性:1年保修,3年保修。\n"
|
||||
" 根据销售订单上的选择,OpenERP会自动选择对应的BoM排单生产。\n"
|
||||
" </p>\n"
|
||||
" "
|
||||
|
||||
#. module: mrp
|
||||
#: field:mrp.workcenter,capacity_per_cycle:0
|
||||
|
@ -1774,8 +1795,8 @@ msgid ""
|
|||
"the quantity selected and it will finish the production order when total "
|
||||
"ordered quantities are produced."
|
||||
msgstr ""
|
||||
"'废料' 模式会仅消耗对应成品数量的原材料而无产成品产出。\n"
|
||||
"'报工' 模式会消耗对应成品数量的原材料而且产出对应数量的产成品。"
|
||||
"'投料' 模式会仅消耗对应成品数量的原材料暂无产成品产出。\n"
|
||||
"'投料并产出' 模式会消耗对应成品数量的原材料并立即产出对应数量的产成品。"
|
||||
|
||||
#. module: mrp
|
||||
#: view:mrp.production:0
|
||||
|
@ -1981,7 +2002,7 @@ msgstr "新建"
|
|||
#. module: mrp
|
||||
#: selection:mrp.product.produce,mode:0
|
||||
msgid "Consume Only"
|
||||
msgstr "废料"
|
||||
msgstr "投料"
|
||||
|
||||
#. module: mrp
|
||||
#: view:mrp.production:0
|
||||
|
@ -2161,7 +2182,7 @@ msgstr "用户"
|
|||
#. module: mrp
|
||||
#: selection:mrp.product.produce,mode:0
|
||||
msgid "Consume & Produce"
|
||||
msgstr "报工"
|
||||
msgstr "投料并产出"
|
||||
|
||||
#. module: mrp
|
||||
#: field:mrp.bom,bom_id:0
|
||||
|
@ -2191,7 +2212,7 @@ msgstr "产品类型是可库存或消耗品"
|
|||
#. module: mrp
|
||||
#: selection:mrp.production,state:0
|
||||
msgid "Production Started"
|
||||
msgstr "生产开始了"
|
||||
msgstr "已开始生产"
|
||||
|
||||
#. module: mrp
|
||||
#: model:process.node,name:mrp.process_node_procureproducts0
|
||||
|
|
|
@ -246,6 +246,7 @@ class mrp_production(osv.osv):
|
|||
""" Cancels work order if production order is canceled.
|
||||
@return: Super method
|
||||
"""
|
||||
workcenter_pool = self.pool.get('mrp.production.workcenter.line')
|
||||
obj = self.browse(cr, uid, ids,context=context)[0]
|
||||
for workcenter_line in obj.workcenter_lines:
|
||||
workcenter_pool.signal_button_cancel(cr, uid, [workcenter_line.id])
|
||||
|
|
|
@ -0,0 +1,284 @@
|
|||
# Bosnian 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-08-06 16:51+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Bosnian <bs@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-08-07 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16721)\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 ""
|
|
@ -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-04-24 06:41+0000\n"
|
||||
"Last-Translator: viney <Unknown>\n"
|
||||
"PO-Revision-Date: 2013-08-06 09:45+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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-04-25 05:20+0000\n"
|
||||
"X-Generator: Launchpad (build 16580)\n"
|
||||
"X-Launchpad-Export-Date: 2013-08-07 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16721)\n"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: field:report.transaction.pos,product_nb:0
|
||||
|
@ -42,6 +42,15 @@ msgid ""
|
|||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
" 单击定义一个新的产品类别。\n"
|
||||
" </p><p>\n"
|
||||
" 产品类别用于通过触摸屏浏览产品。\n"
|
||||
" </p><p>\n"
|
||||
" "
|
||||
"为产品类别上传图片后,触摸屏布局将会自动调整。因此,针对分辨率小于(1024x768)的显示设备,我们建议不要为产品类别上传图片。\n"
|
||||
" </p>\n"
|
||||
" "
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.receipt:0
|
||||
|
@ -51,7 +60,7 @@ msgstr "打印销售订单的收据"
|
|||
#. module: point_of_sale
|
||||
#: field:pos.session,cash_register_balance_end:0
|
||||
msgid "Computed Balance"
|
||||
msgstr ""
|
||||
msgstr "计算余额"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.session:0
|
||||
|
@ -62,7 +71,7 @@ msgstr "今天"
|
|||
#. module: point_of_sale
|
||||
#: field:pos.config,iface_electronic_scale:0
|
||||
msgid "Electronic Scale Interface"
|
||||
msgstr ""
|
||||
msgstr "电子称接口"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:pos.category,name:point_of_sale.plain_water
|
||||
|
@ -85,7 +94,7 @@ msgstr ""
|
|||
#: field:pos.config,journal_id:0
|
||||
#: field:pos.order,sale_journal:0
|
||||
msgid "Sale Journal"
|
||||
msgstr ""
|
||||
msgstr "销售日记账"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.spa_2l_product_template
|
||||
|
@ -102,7 +111,7 @@ msgstr "销售详情"
|
|||
#. module: point_of_sale
|
||||
#: constraint:pos.config:0
|
||||
msgid "You cannot have two cash controls in one Point Of Sale !"
|
||||
msgstr ""
|
||||
msgstr "同一个销售点不能使用两个钱箱"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: field:pos.payment.report.user,user_id:0
|
||||
|
@ -111,7 +120,7 @@ msgstr ""
|
|||
#: view:report.pos.order:0
|
||||
#: field:report.pos.order,user_id:0
|
||||
msgid "Salesperson"
|
||||
msgstr ""
|
||||
msgstr "销售员"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:report.pos.order:0
|
||||
|
@ -128,13 +137,13 @@ msgstr "产品名称"
|
|||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.pamplemousse_rouge_pamplemousse_product_template
|
||||
msgid "Red grapefruit"
|
||||
msgstr ""
|
||||
msgstr "红葡萄柚"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1343
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1373
|
||||
#, python-format
|
||||
msgid "Assign a Custom EAN"
|
||||
msgstr ""
|
||||
msgstr "使用自定义的条码"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.session.opening:0
|
||||
|
@ -164,12 +173,12 @@ msgstr "取钱"
|
|||
#: code:addons/point_of_sale/point_of_sale.py:105
|
||||
#, python-format
|
||||
msgid "not used"
|
||||
msgstr ""
|
||||
msgstr "未被使用"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: field:pos.config,iface_vkeyboard:0
|
||||
msgid "Virtual KeyBoard Interface"
|
||||
msgstr ""
|
||||
msgstr "虚拟键盘接口"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
|
@ -181,11 +190,11 @@ msgstr "+/-"
|
|||
#. module: point_of_sale
|
||||
#: field:pos.ean_wizard,ean13_pattern:0
|
||||
msgid "Reference"
|
||||
msgstr ""
|
||||
msgstr "单号"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1041
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1057
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1066
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1083
|
||||
#: report:pos.invoice:0
|
||||
#: report:pos.lines:0
|
||||
#, python-format
|
||||
|
@ -200,32 +209,32 @@ msgstr "开始日期"
|
|||
#. module: point_of_sale
|
||||
#: constraint:pos.session:0
|
||||
msgid "You cannot create two active sessions with the same responsible!"
|
||||
msgstr ""
|
||||
msgstr "同一个负责人不能创建两个活动销售会话"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
#: code:addons/point_of_sale/static/src/xml/pos.xml:473
|
||||
#, python-format
|
||||
msgid "Weighting"
|
||||
msgstr ""
|
||||
msgstr "称重"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.fenouil_fenouil_product_template
|
||||
msgid "Fennel"
|
||||
msgstr ""
|
||||
msgstr "小茴香"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
#: code:addons/point_of_sale/static/src/xml/pos.xml:472
|
||||
#, python-format
|
||||
msgid "Help needed"
|
||||
msgstr ""
|
||||
msgstr "需要帮助"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:739
|
||||
#: code:addons/point_of_sale/point_of_sale.py:760
|
||||
#, python-format
|
||||
msgid "Configuration Error!"
|
||||
msgstr ""
|
||||
msgstr "设置错误!"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: report:account.statement:0
|
||||
|
@ -237,7 +246,7 @@ msgstr "业务伙伴"
|
|||
#. module: point_of_sale
|
||||
#: view:pos.session:0
|
||||
msgid "Closing Cash Control"
|
||||
msgstr ""
|
||||
msgstr "关闭现金箱"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: report:pos.details:0
|
||||
|
@ -259,7 +268,7 @@ msgstr "会计信息"
|
|||
#. module: point_of_sale
|
||||
#: field:pos.session.opening,show_config:0
|
||||
msgid "Show Config"
|
||||
msgstr ""
|
||||
msgstr "显示配置"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: report:pos.lines:0
|
||||
|
@ -277,7 +286,7 @@ msgstr "折扣合计"
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:441
|
||||
#, python-format
|
||||
msgid "Debug Window"
|
||||
msgstr ""
|
||||
msgstr "调试窗口"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
|
@ -285,7 +294,7 @@ msgstr ""
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:613
|
||||
#, python-format
|
||||
msgid "Change:"
|
||||
msgstr "零钞"
|
||||
msgstr "找零:"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.coca_regular_2l_product_template
|
||||
|
@ -315,10 +324,10 @@ msgid "Disc.(%)"
|
|||
msgstr "折扣(%)"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1006
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1031
|
||||
#, python-format
|
||||
msgid "Please define income account for this product: \"%s\" (id:%d)."
|
||||
msgstr ""
|
||||
msgstr "请为这个产品定义收益科目:\"%s\" (id:%d)."
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:report.pos.order:0
|
||||
|
@ -336,7 +345,7 @@ msgstr "Leffe Brune 33cl"
|
|||
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 ""
|
||||
msgstr "如果需要把自助收银作为默认模式,请选中这里。 如果未选, OpenERP 将使用普通收银员作为默认模式。"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.actions.report.xml,name:point_of_sale.pos_sales_user
|
||||
|
@ -353,7 +362,7 @@ msgstr "饮料类"
|
|||
#: model:ir.actions.act_window,name:point_of_sale.action_pos_session_opening
|
||||
#: model:ir.ui.menu,name:point_of_sale.menu_pos_session_opening
|
||||
msgid "Your Session"
|
||||
msgstr ""
|
||||
msgstr "您的销售会话"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.stella_50cl_product_template
|
||||
|
@ -375,12 +384,12 @@ msgstr "上级类别"
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:482
|
||||
#, python-format
|
||||
msgid "Open Cashbox"
|
||||
msgstr ""
|
||||
msgstr "打开钱箱"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.session.opening:0
|
||||
msgid "Select your Point of Sale"
|
||||
msgstr ""
|
||||
msgstr "选择您的销售点"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: field:report.sales.by.margin.pos,total:0
|
||||
|
@ -404,25 +413,25 @@ msgstr "Dr. Oetker Ristorante Speciale"
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:480
|
||||
#, python-format
|
||||
msgid "Payment Request"
|
||||
msgstr ""
|
||||
msgstr "付款请求"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: field:product.product,to_weight:0
|
||||
msgid "To Weight"
|
||||
msgstr ""
|
||||
msgstr "需要称重"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
#: code:addons/point_of_sale/static/src/xml/pos.xml:476
|
||||
#, python-format
|
||||
msgid "Hardware Events"
|
||||
msgstr ""
|
||||
msgstr "硬件事件"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:301
|
||||
#, python-format
|
||||
msgid "You should assign a Point of Sale to your session."
|
||||
msgstr ""
|
||||
msgstr "您需要为您的销售会话指定一个销售点"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.order.line:0
|
||||
|
@ -435,7 +444,7 @@ msgid "Fanta Orange 33cl"
|
|||
msgstr "Fanta Orange 33cl"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:420
|
||||
#: code:addons/point_of_sale/point_of_sale.py:423
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please set your profit and loss accounts on your payment method '%s'. This "
|
||||
|
@ -446,10 +455,10 @@ msgstr ""
|
|||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:315
|
||||
#: code:addons/point_of_sale/point_of_sale.py:512
|
||||
#: code:addons/point_of_sale/point_of_sale.py:514
|
||||
#, python-format
|
||||
msgid "error!"
|
||||
msgstr ""
|
||||
msgstr "错误!"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.actions.act_window,name:point_of_sale.action_report_sales_by_user_pos_month
|
||||
|
@ -471,12 +480,12 @@ msgstr ""
|
|||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.Onions_product_template
|
||||
msgid "Onions"
|
||||
msgstr ""
|
||||
msgstr "洋葱"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.session:0
|
||||
msgid "Validate & Open Session"
|
||||
msgstr ""
|
||||
msgstr "验证并打开销售会话"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:99
|
||||
|
@ -484,18 +493,18 @@ msgstr ""
|
|||
#: selection:pos.session.opening,pos_state:0
|
||||
#, python-format
|
||||
msgid "In Progress"
|
||||
msgstr ""
|
||||
msgstr "进行中"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.session:0
|
||||
#: field:pos.session,opening_details_ids:0
|
||||
msgid "Opening Cash Control"
|
||||
msgstr ""
|
||||
msgstr "正在打开钱箱"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: help:res.users,ean13:0
|
||||
msgid "BarCode"
|
||||
msgstr ""
|
||||
msgstr "条码"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: help:pos.category,image_medium:0
|
||||
|
@ -508,19 +517,19 @@ msgstr ""
|
|||
#. module: point_of_sale
|
||||
#: view:pos.session.opening:0
|
||||
msgid "Open Session"
|
||||
msgstr ""
|
||||
msgstr "打开销售会话"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.ui.menu,name:point_of_sale.menu_point_of_sale
|
||||
msgid "Daily Operations"
|
||||
msgstr "每天经营"
|
||||
msgstr "日常经营"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
#: code:addons/point_of_sale/static/src/xml/pos.xml:42
|
||||
#, python-format
|
||||
msgid "Google Chrome"
|
||||
msgstr ""
|
||||
msgstr "Google Chrome"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:pos.category,name:point_of_sale.sparkling_water
|
||||
|
@ -543,7 +552,7 @@ msgstr "查询现金对账单"
|
|||
#: field:pos.session.opening,pos_state_str:0
|
||||
#: field:report.pos.order,state:0
|
||||
msgid "Status"
|
||||
msgstr ""
|
||||
msgstr "状态"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: selection:report.pos.order,month:0
|
||||
|
@ -568,14 +577,14 @@ msgstr "POS单明细"
|
|||
#. module: point_of_sale
|
||||
#: view:pos.config:0
|
||||
msgid "Point of Sale Configuration"
|
||||
msgstr ""
|
||||
msgstr "销售点配置"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
#: code:addons/point_of_sale/static/src/xml/pos.xml:359
|
||||
#, python-format
|
||||
msgid "Your order has to be validated by a cashier."
|
||||
msgstr ""
|
||||
msgstr "您的订单已被收银员确认"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.fanta_orange_50cl_product_template
|
||||
|
@ -609,7 +618,7 @@ msgid ""
|
|||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:867
|
||||
#: code:addons/point_of_sale/point_of_sale.py:888
|
||||
#, python-format
|
||||
msgid "Customer Invoice"
|
||||
msgstr "客户发票"
|
||||
|
@ -619,7 +628,7 @@ msgstr "客户发票"
|
|||
msgid ""
|
||||
"You can continue sales from the touchscreen interface by clicking on \"Start "
|
||||
"Selling\" or close the cash register session."
|
||||
msgstr ""
|
||||
msgstr "通过触摸屏幕的“开始销售”或者关闭钱箱之后您就可以继续进行销售。"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: report:account.statement:0
|
||||
|
@ -631,7 +640,7 @@ msgstr "结束日期"
|
|||
#. module: point_of_sale
|
||||
#: view:pos.session:0
|
||||
msgid "Opening Cashbox Lines"
|
||||
msgstr ""
|
||||
msgstr "正在打开钱箱"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: selection:report.pos.order,month:0
|
||||
|
@ -678,7 +687,7 @@ msgstr "行号"
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:453
|
||||
#, python-format
|
||||
msgid "Set Weight"
|
||||
msgstr ""
|
||||
msgstr "设置重量"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:account.bank.statement:0
|
||||
|
@ -693,7 +702,7 @@ msgstr "净合计:"
|
|||
#. module: point_of_sale
|
||||
#: model:ir.actions.client,name:point_of_sale.action_client_pos_menu
|
||||
msgid "Open POS Menu"
|
||||
msgstr ""
|
||||
msgstr "打开销售点菜单"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: report:pos.details_summary:0
|
||||
|
@ -710,12 +719,12 @@ msgstr "发表POS机日记帐分录"
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:457
|
||||
#, python-format
|
||||
msgid "Barcode Scanner"
|
||||
msgstr ""
|
||||
msgstr "条码扫描器"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.pomme_granny_smith_product_template
|
||||
msgid "Granny Smith apples"
|
||||
msgstr ""
|
||||
msgstr "Granny Smith 苹果"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: help:product.product,expense_pdt:0
|
||||
|
@ -739,11 +748,13 @@ msgid ""
|
|||
"use\n"
|
||||
" a modern browser like"
|
||||
msgstr ""
|
||||
"销售点功能不支持 Microsoft Internet Explorer 浏览器,请使用更现代化的浏览器如:Mozilla Firefox 和 "
|
||||
"Google Chrome 等"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.session.opening:0
|
||||
msgid "Click to start a session."
|
||||
msgstr ""
|
||||
msgstr "单击开始销售会话"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.details:0
|
||||
|
@ -778,7 +789,7 @@ msgstr "新增产品"
|
|||
#. module: point_of_sale
|
||||
#: field:pos.config,name:0
|
||||
msgid "Point of Sale Name"
|
||||
msgstr ""
|
||||
msgstr "销售点名称"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: field:report.transaction.pos,invoice_am:0
|
||||
|
@ -825,7 +836,7 @@ msgstr "期末结余"
|
|||
#: code:addons/point_of_sale/wizard/pos_box_out.py:89
|
||||
#, python-format
|
||||
msgid "please check that account is set to %s."
|
||||
msgstr ""
|
||||
msgstr "请检查该科目已经设为为:%s"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: help:pos.category,image:0
|
||||
|
@ -863,7 +874,7 @@ msgstr ""
|
|||
#. module: point_of_sale
|
||||
#: view:pos.ean_wizard:0
|
||||
msgid "Ean13 Generator"
|
||||
msgstr ""
|
||||
msgstr "条码生成器"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.spa_1l_product_template
|
||||
|
@ -879,7 +890,7 @@ msgstr "错误:无效的EAN编码"
|
|||
#. module: point_of_sale
|
||||
#: model:pos.category,name:point_of_sale.legumes_racine
|
||||
msgid "Root vegetables"
|
||||
msgstr ""
|
||||
msgstr "根类蔬菜"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.actions.act_window,name:point_of_sale.act_pos_open_statement
|
||||
|
@ -934,12 +945,12 @@ msgstr "付款合计"
|
|||
#. module: point_of_sale
|
||||
#: model:ir.model,name:point_of_sale.model_pos_session_opening
|
||||
msgid "pos.session.opening"
|
||||
msgstr ""
|
||||
msgstr "pos.session.opening"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:res.users:0
|
||||
msgid "Edit EAN"
|
||||
msgstr ""
|
||||
msgstr "编辑条码"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/wizard/pos_open_statement.py:80
|
||||
|
@ -965,7 +976,7 @@ msgstr ""
|
|||
#. module: point_of_sale
|
||||
#: field:pos.session.opening,pos_session_id:0
|
||||
msgid "PoS Session"
|
||||
msgstr ""
|
||||
msgstr "销售点会话"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: selection:report.pos.order,month:0
|
||||
|
@ -979,7 +990,7 @@ msgid "User's Product"
|
|||
msgstr "用户的产品"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1143
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1173
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You have to select a pricelist in the sale form !\n"
|
||||
|
@ -1011,7 +1022,7 @@ msgstr "增加一个全局折扣"
|
|||
#. module: point_of_sale
|
||||
#: view:pos.config:0
|
||||
msgid "Journals"
|
||||
msgstr ""
|
||||
msgstr "日记账"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.oetker_prosciutto_product_template
|
||||
|
@ -1031,7 +1042,7 @@ msgstr "Coca-Cola Light Lemon 50cl"
|
|||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
#: code:addons/point_of_sale/point_of_sale.py:518
|
||||
#: code:addons/point_of_sale/point_of_sale.py:520
|
||||
#: code:addons/point_of_sale/static/src/xml/pos.xml:689
|
||||
#: code:addons/point_of_sale/static/src/xml/pos.xml:744
|
||||
#, python-format
|
||||
|
@ -1041,7 +1052,7 @@ msgstr ""
|
|||
#. module: point_of_sale
|
||||
#: view:product.product:0
|
||||
msgid "Set a Custom EAN"
|
||||
msgstr ""
|
||||
msgstr "设置自定义条码"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
|
@ -1053,7 +1064,7 @@ msgstr ""
|
|||
#. module: point_of_sale
|
||||
#: model:pos.category,name:point_of_sale.legumes
|
||||
msgid "Fresh vegetables"
|
||||
msgstr ""
|
||||
msgstr "新鲜蔬菜"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.session:0
|
||||
|
@ -1065,7 +1076,7 @@ msgstr ""
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:478
|
||||
#, python-format
|
||||
msgid "Scan Item Success"
|
||||
msgstr ""
|
||||
msgstr "扫描条目成功"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: report:account.statement:0
|
||||
|
@ -1077,22 +1088,22 @@ msgstr "期初余额"
|
|||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.lays_naturel_oven_150g_product_template
|
||||
msgid "Oven Baked Lays Natural 150g"
|
||||
msgstr ""
|
||||
msgstr "Oven Baked Lays Natural 150g"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: sql_constraint:pos.session:0
|
||||
msgid "The name of this POS Session must be unique !"
|
||||
msgstr ""
|
||||
msgstr "销售会话名称必须唯一"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.session:0
|
||||
msgid "Opening Subtotal"
|
||||
msgstr ""
|
||||
msgstr "小计"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.session:0
|
||||
msgid "payment method."
|
||||
msgstr ""
|
||||
msgstr "付款方式"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.order:0
|
||||
|
@ -1137,12 +1148,12 @@ msgstr "折扣"
|
|||
#. module: point_of_sale
|
||||
#: view:pos.order:0
|
||||
msgid "(update)"
|
||||
msgstr ""
|
||||
msgstr "(更新)"
|
||||
|
||||
#. 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
|
||||
|
@ -1153,15 +1164,15 @@ msgstr "销售详情"
|
|||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.evian_2l_product_template
|
||||
msgid "2L Evian"
|
||||
msgstr ""
|
||||
msgstr "2L 依云"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:373
|
||||
#: code:addons/point_of_sale/point_of_sale.py:472
|
||||
#: code:addons/point_of_sale/wizard/pos_session_opening.py:34
|
||||
#: code:addons/point_of_sale/point_of_sale.py:474
|
||||
#: code:addons/point_of_sale/wizard/pos_session_opening.py:33
|
||||
#, python-format
|
||||
msgid "Start Point Of Sale"
|
||||
msgstr ""
|
||||
msgstr "启动销售点"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:pos.category,name:point_of_sale.pils
|
||||
|
@ -1215,14 +1226,14 @@ msgstr "Chaudfontaine Petillante 50cl"
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:485
|
||||
#, python-format
|
||||
msgid "Read Weighting Scale"
|
||||
msgstr ""
|
||||
msgstr "读取电子秤"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
#: code:addons/point_of_sale/static/src/xml/pos.xml:426
|
||||
#, python-format
|
||||
msgid "0.00 €"
|
||||
msgstr ""
|
||||
msgstr "0.00 €"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: field:pos.order.line,create_date:0
|
||||
|
@ -1240,7 +1251,7 @@ msgstr "今天的销售情况"
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:324
|
||||
#, python-format
|
||||
msgid "Welcome"
|
||||
msgstr ""
|
||||
msgstr "欢迎"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/wizard/pos_box_entries.py:46
|
||||
|
@ -1295,7 +1306,7 @@ msgstr "已开票合计"
|
|||
#: model:ir.model,name:point_of_sale.model_pos_category
|
||||
#: field:product.product,pos_categ_id:0
|
||||
msgid "Point of Sale Category"
|
||||
msgstr ""
|
||||
msgstr "销售点商品分类"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:report.pos.order:0
|
||||
|
@ -1315,7 +1326,7 @@ msgstr ""
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:324
|
||||
#, python-format
|
||||
msgid "Choose your type of receipt:"
|
||||
msgstr ""
|
||||
msgstr "选择小票类型"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model,name:point_of_sale.model_report_sales_by_margin_pos_month
|
||||
|
@ -1352,7 +1363,7 @@ msgstr ""
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:479
|
||||
#, python-format
|
||||
msgid "Scan Item Unrecognized"
|
||||
msgstr ""
|
||||
msgstr "未能识别扫描的条目"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: report:all.closed.cashbox.of.the.day:0
|
||||
|
@ -1360,7 +1371,7 @@ msgid "Today's Closed Cashbox"
|
|||
msgstr "今日关闭的钱箱"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:897
|
||||
#: code:addons/point_of_sale/point_of_sale.py:920
|
||||
#, python-format
|
||||
msgid "Selected orders do not have the same session!"
|
||||
msgstr ""
|
||||
|
@ -1396,7 +1407,7 @@ msgstr "开启日期"
|
|||
#: model:ir.actions.act_window,name:point_of_sale.action_pos_session
|
||||
#: model:ir.ui.menu,name:point_of_sale.menu_pos_session_all
|
||||
msgid "All Sessions"
|
||||
msgstr ""
|
||||
msgstr "全部销售会话"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
|
@ -1415,7 +1426,7 @@ msgstr "税:"
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:271
|
||||
#, python-format
|
||||
msgid "Thank you for shopping with us."
|
||||
msgstr ""
|
||||
msgstr "感谢您的光临。"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.coca_light_2l_product_template
|
||||
|
@ -1431,7 +1442,7 @@ msgstr "Dr. Oetker Ristorante Funghi"
|
|||
#: model:ir.actions.act_window,name:point_of_sale.pos_category_action
|
||||
#: model:ir.ui.menu,name:point_of_sale.menu_pos_category
|
||||
msgid "Product Categories"
|
||||
msgstr ""
|
||||
msgstr "商品类别"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: help:pos.config,journal_id:0
|
||||
|
@ -1448,7 +1459,7 @@ msgstr "折扣"
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:467
|
||||
#, python-format
|
||||
msgid "Invalid Ean"
|
||||
msgstr ""
|
||||
msgstr "无效的条码"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.lindemans_kriek_37,5cl_product_template
|
||||
|
@ -1458,7 +1469,7 @@ msgstr "Lindemans Kriek 37.5cl"
|
|||
#. module: point_of_sale
|
||||
#: view:pos.config:0
|
||||
msgid "Point of Sale Config"
|
||||
msgstr ""
|
||||
msgstr "销售点配置"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.coca_zero_33cl_product_template
|
||||
|
@ -1511,7 +1522,7 @@ msgstr "税:"
|
|||
#. module: point_of_sale
|
||||
#: view:pos.session:0
|
||||
msgid "+ Transactions"
|
||||
msgstr ""
|
||||
msgstr "+ 交易"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.actions.act_window,name:point_of_sale.action_pos_discount
|
||||
|
@ -1541,12 +1552,12 @@ msgstr "用户"
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:194
|
||||
#, python-format
|
||||
msgid "Kg"
|
||||
msgstr ""
|
||||
msgstr "千克"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: field:product.product,available_in_pos:0
|
||||
msgid "Available in the Point of Sale"
|
||||
msgstr ""
|
||||
msgstr "可在销售点销售"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: selection:pos.config,state:0
|
||||
|
@ -1563,7 +1574,7 @@ msgstr ""
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:338
|
||||
#, python-format
|
||||
msgid "The scanned product was not recognized"
|
||||
msgstr ""
|
||||
msgstr "无法识别扫描的商品"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model,name:point_of_sale.model_report_transaction_pos
|
||||
|
@ -1613,7 +1624,7 @@ msgstr "11月"
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:267
|
||||
#, python-format
|
||||
msgid "Please scan an item or your member card"
|
||||
msgstr ""
|
||||
msgstr "请扫描商品或您的会员卡"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:product.template,name:point_of_sale.poivron_verts_product_template
|
||||
|
@ -1644,7 +1655,7 @@ msgid "Number of Transaction"
|
|||
msgstr "交易数"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:738
|
||||
#: code:addons/point_of_sale/point_of_sale.py:759
|
||||
#, python-format
|
||||
msgid ""
|
||||
"There is no receivable account defined to make payment for the partner: "
|
||||
|
@ -1655,7 +1666,7 @@ msgstr ""
|
|||
#: view:pos.config:0
|
||||
#: selection:pos.config,state:0
|
||||
msgid "Inactive"
|
||||
msgstr ""
|
||||
msgstr "不活跃的"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
|
@ -1679,7 +1690,7 @@ msgstr "取消"
|
|||
#: code:addons/point_of_sale/static/src/xml/pos.xml:296
|
||||
#, python-format
|
||||
msgid "Please put your product on the scale"
|
||||
msgstr ""
|
||||
msgstr "请将商品放到称上"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.actions.report.xml,name:point_of_sale.pos_details_summary
|
||||
|
@ -1699,7 +1710,7 @@ msgstr "Timmermans Kriek 37.5cl"
|
|||
#. module: point_of_sale
|
||||
#: field:pos.config,sequence_id:0
|
||||
msgid "Order IDs Sequence"
|
||||
msgstr ""
|
||||
msgstr "订单号序列"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: report:pos.invoice:0
|
||||
|
@ -1815,7 +1826,7 @@ msgid "Difference"
|
|||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:529
|
||||
#: code:addons/point_of_sale/point_of_sale.py:549
|
||||
#, python-format
|
||||
msgid "Unable to Delete !"
|
||||
msgstr "不能删除!"
|
||||
|
@ -1978,7 +1989,7 @@ msgid "Salespeople"
|
|||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:756
|
||||
#: code:addons/point_of_sale/point_of_sale.py:777
|
||||
#: code:addons/point_of_sale/wizard/pos_box_entries.py:118
|
||||
#: code:addons/point_of_sale/wizard/pos_box_out.py:91
|
||||
#, python-format
|
||||
|
@ -1986,7 +1997,7 @@ msgid "You have to open at least one cashbox."
|
|||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1142
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1172
|
||||
#, python-format
|
||||
msgid "No Pricelist !"
|
||||
msgstr "没有价格表!"
|
||||
|
@ -2038,7 +2049,7 @@ msgid "No Cash Register Defined !"
|
|||
msgstr "没有定义收银机"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:513
|
||||
#: code:addons/point_of_sale/point_of_sale.py:515
|
||||
#, python-format
|
||||
msgid ""
|
||||
"No cash statement found for this session. Unable to record returned cash."
|
||||
|
@ -2761,7 +2772,7 @@ msgid "Pos Lines"
|
|||
msgstr "销售单明细"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:413
|
||||
#: code:addons/point_of_sale/point_of_sale.py:416
|
||||
#, python-format
|
||||
msgid "Point of Sale Profit"
|
||||
msgstr ""
|
||||
|
@ -2774,7 +2785,7 @@ msgid "Please wait, a cashier is on the way"
|
|||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/wizard/pos_session_opening.py:68
|
||||
#: code:addons/point_of_sale/wizard/pos_session_opening.py:67
|
||||
#: field:pos.box.entries,session_id:0
|
||||
#: view:pos.order:0
|
||||
#: field:pos.order,session_id:0
|
||||
|
@ -3085,15 +3096,17 @@ msgstr ""
|
|||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:300
|
||||
#: code:addons/point_of_sale/point_of_sale.py:409
|
||||
#: code:addons/point_of_sale/point_of_sale.py:419
|
||||
#: code:addons/point_of_sale/point_of_sale.py:457
|
||||
#: code:addons/point_of_sale/point_of_sale.py:712
|
||||
#: code:addons/point_of_sale/point_of_sale.py:756
|
||||
#: code:addons/point_of_sale/point_of_sale.py:818
|
||||
#: code:addons/point_of_sale/point_of_sale.py:897
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1006
|
||||
#: code:addons/point_of_sale/point_of_sale.py:412
|
||||
#: code:addons/point_of_sale/point_of_sale.py:422
|
||||
#: code:addons/point_of_sale/point_of_sale.py:459
|
||||
#: code:addons/point_of_sale/point_of_sale.py:536
|
||||
#: code:addons/point_of_sale/point_of_sale.py:733
|
||||
#: code:addons/point_of_sale/point_of_sale.py:777
|
||||
#: code:addons/point_of_sale/point_of_sale.py:839
|
||||
#: code:addons/point_of_sale/point_of_sale.py:920
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1031
|
||||
#: code:addons/point_of_sale/report/pos_invoice.py:46
|
||||
#: code:addons/point_of_sale/wizard/pos_box.py:23
|
||||
#: code:addons/point_of_sale/wizard/pos_box.py:22
|
||||
#: code:addons/point_of_sale/wizard/pos_box_entries.py:46
|
||||
#: code:addons/point_of_sale/wizard/pos_box_entries.py:118
|
||||
#: code:addons/point_of_sale/wizard/pos_box_entries.py:123
|
||||
|
@ -3187,13 +3200,13 @@ msgid "Chaudfontaine 1.5l"
|
|||
msgstr "Chaudfontaine 1.5l"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1069
|
||||
#: code:addons/point_of_sale/point_of_sale.py:1096
|
||||
#, python-format
|
||||
msgid "Trade Receivables"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:529
|
||||
#: code:addons/point_of_sale/point_of_sale.py:549
|
||||
#, python-format
|
||||
msgid "In order to delete a sale, it must be new or cancelled."
|
||||
msgstr "只有新的或被取消的销售流水可以删除"
|
||||
|
@ -3228,7 +3241,7 @@ msgid "Journal Entry"
|
|||
msgstr "日记账簿"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:736
|
||||
#: code:addons/point_of_sale/point_of_sale.py:757
|
||||
#, python-format
|
||||
msgid "There is no receivable account defined to make payment."
|
||||
msgstr ""
|
||||
|
@ -3259,7 +3272,7 @@ msgid "Supplier Invoice"
|
|||
msgstr "供应商发票"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:458
|
||||
#: code:addons/point_of_sale/point_of_sale.py:460
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You cannot confirm all orders of this session, because they have not the "
|
||||
|
@ -3338,7 +3351,7 @@ msgid "Coca-Cola Regular 1L"
|
|||
msgstr "Coca-Cola Regular 1L"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:712
|
||||
#: code:addons/point_of_sale/point_of_sale.py:733
|
||||
#, python-format
|
||||
msgid "Unable to cancel the picking."
|
||||
msgstr "无法取消发货"
|
||||
|
@ -3379,7 +3392,7 @@ msgid "Spa Barisart 1.5l"
|
|||
msgstr "Spa Barisart 1.5l"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:789
|
||||
#: code:addons/point_of_sale/point_of_sale.py:810
|
||||
#: view:pos.order:0
|
||||
#, python-format
|
||||
msgid "Return Products"
|
||||
|
@ -3418,7 +3431,7 @@ msgstr "销售明细"
|
|||
#: view:res.partner:0
|
||||
#: view:res.users:0
|
||||
msgid "Point of Sale"
|
||||
msgstr "POS"
|
||||
msgstr "销售点"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.order:0
|
||||
|
@ -3495,7 +3508,7 @@ msgid "Default Point of Sale"
|
|||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/wizard/pos_box.py:24
|
||||
#: code:addons/point_of_sale/wizard/pos_box.py:23
|
||||
#, python-format
|
||||
msgid "There is no cash register for this PoS Session"
|
||||
msgstr ""
|
||||
|
@ -3539,7 +3552,7 @@ msgid "PRO-FORMA"
|
|||
msgstr "形式发票"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:818
|
||||
#: code:addons/point_of_sale/point_of_sale.py:839
|
||||
#, python-format
|
||||
msgid "Please provide a partner for the sale."
|
||||
msgstr "请提供业务伙伴。"
|
||||
|
@ -3591,7 +3604,7 @@ msgid "Print Receipt"
|
|||
msgstr "打印收银条"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/point_of_sale.py:417
|
||||
#: code:addons/point_of_sale/point_of_sale.py:420
|
||||
#, python-format
|
||||
msgid "Point of Sale Loss"
|
||||
msgstr ""
|
||||
|
@ -4020,6 +4033,7 @@ msgstr ""
|
|||
#~ msgid "Discount percentage"
|
||||
#~ msgstr "折扣百分比"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "Close"
|
||||
#~ msgstr "关闭"
|
||||
|
||||
|
@ -4843,9 +4857,11 @@ msgstr ""
|
|||
#~ msgid "Subtotal:"
|
||||
#~ msgstr "小计:"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "Validate"
|
||||
#~ msgstr "确认"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "Print"
|
||||
#~ msgstr "打印"
|
||||
|
||||
|
@ -4931,6 +4947,7 @@ msgstr ""
|
|||
#~ msgid "PoS Backend"
|
||||
#~ msgstr "POS后端"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "Next Order"
|
||||
#~ msgstr "下一订单"
|
||||
|
||||
|
|
|
@ -0,0 +1,546 @@
|
|||
# Bosnian 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-08-06 08:35+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Bosnian <bs@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-08-07 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16721)\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 ""
|
|
@ -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:06+0000\n"
|
||||
"PO-Revision-Date: 2012-11-27 09:28+0000\n"
|
||||
"Last-Translator: 盈通 ccdos <ccdos@163.com>\n"
|
||||
"PO-Revision-Date: 2013-07-28 11:18+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
"X-Launchpad-Export-Date: 2013-07-29 05:25+0000\n"
|
||||
"X-Generator: Launchpad (build 16700)\n"
|
||||
|
||||
#. module: product
|
||||
#: field:product.packaging,rows:0
|
||||
|
@ -513,7 +513,7 @@ msgstr "标准耳机"
|
|||
#. module: product
|
||||
#: model:product.uom,name:product.product_uom_day
|
||||
msgid "Day(s)"
|
||||
msgstr ""
|
||||
msgstr "天"
|
||||
|
||||
#. module: product
|
||||
#: help:product.product,incoming_qty:0
|
||||
|
@ -800,7 +800,7 @@ msgstr "结束日期"
|
|||
#. module: product
|
||||
#: model:product.uom,name:product.product_uom_litre
|
||||
msgid "Liter(s)"
|
||||
msgstr ""
|
||||
msgstr "升"
|
||||
|
||||
#. module: product
|
||||
#: view:product.price_list:0
|
||||
|
@ -843,7 +843,7 @@ msgstr "价格表"
|
|||
#. module: product
|
||||
#: model:product.uom,name:product.product_uom_hour
|
||||
msgid "Hour(s)"
|
||||
msgstr ""
|
||||
msgstr "小时"
|
||||
|
||||
#. module: product
|
||||
#: selection:product.template,state:0
|
||||
|
@ -1114,7 +1114,7 @@ msgstr "右父项"
|
|||
#. module: product
|
||||
#: field:product.product,price:0
|
||||
msgid "Price"
|
||||
msgstr ""
|
||||
msgstr "价格"
|
||||
|
||||
#. module: product
|
||||
#: field:product.pricelist.item,price_surcharge:0
|
||||
|
@ -1192,7 +1192,7 @@ msgstr "显示产品列表的顺序号"
|
|||
#. module: product
|
||||
#: model:product.uom,name:product.product_uom_dozen
|
||||
msgid "Dozen(s)"
|
||||
msgstr ""
|
||||
msgstr "打"
|
||||
|
||||
#. module: product
|
||||
#: field:product.uom,factor:0
|
||||
|
@ -1338,7 +1338,7 @@ msgstr "指定一个产品分类 ,规则只被应用在与这个分类以及
|
|||
#. module: product
|
||||
#: view:product.product:0
|
||||
msgid "Inventory"
|
||||
msgstr "盘点"
|
||||
msgstr "库存"
|
||||
|
||||
#. module: product
|
||||
#: field:product.product,seller_info_id:0
|
||||
|
@ -1346,7 +1346,7 @@ msgid "Supplier Info"
|
|||
msgstr "供应商信息"
|
||||
|
||||
#. module: product
|
||||
#: code:addons/product/product.py:729
|
||||
#: code:addons/product/product.py:732
|
||||
#, python-format
|
||||
msgid "%s (copy)"
|
||||
msgstr "%s (副本)"
|
||||
|
@ -1891,7 +1891,7 @@ msgstr "消息"
|
|||
#. module: product
|
||||
#: model:product.uom,name:product.product_uom_unit
|
||||
msgid "Unit(s)"
|
||||
msgstr ""
|
||||
msgstr "件"
|
||||
|
||||
#. module: product
|
||||
#: code:addons/product/product.py:176
|
||||
|
@ -2341,7 +2341,7 @@ msgstr "序列"
|
|||
msgid ""
|
||||
"Average delay in days to produce this product. In the case of multi-level "
|
||||
"BOM, the manufacturing lead times of the components will be added."
|
||||
msgstr ""
|
||||
msgstr "生成该产品的平均延时天数。在多级BoM的情况下,部件的制造提前期将被累加"
|
||||
|
||||
#. module: product
|
||||
#: model:product.template,name:product.product_assembly_product_template
|
||||
|
@ -2364,6 +2364,8 @@ msgid ""
|
|||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"单击以创建一个新的计量单位\n"
|
||||
" "
|
||||
|
||||
#. module: product
|
||||
#: model:product.template,name:product.product_product_11_product_template
|
||||
|
@ -2444,7 +2446,7 @@ msgid "15” LCD Monitor"
|
|||
msgstr "15” LCD 显示器"
|
||||
|
||||
#. module: product
|
||||
#: code:addons/product/pricelist.py:376
|
||||
#: code:addons/product/pricelist.py:379
|
||||
#: field:product.pricelist.item,base_pricelist_id:0
|
||||
#, python-format
|
||||
msgid "Other Pricelist"
|
||||
|
|
|
@ -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-07-14 04:15+0000\n"
|
||||
"Last-Translator: Alan <shuchuan.wu@gmail.com>\n"
|
||||
"PO-Revision-Date: 2013-08-06 09:36+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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-07-15 04:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16696)\n"
|
||||
"X-Launchpad-Export-Date: 2013-08-07 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16721)\n"
|
||||
|
||||
#. module: project
|
||||
#: view:project.project:0
|
||||
|
@ -749,7 +749,7 @@ msgstr "待处理任务草稿"
|
|||
#. module: project
|
||||
#: field:project.project,alias_model:0
|
||||
msgid "Alias Model"
|
||||
msgstr ""
|
||||
msgstr "别名模型"
|
||||
|
||||
#. module: project
|
||||
#: help:report.project.task.user,closing_days:0
|
||||
|
@ -854,7 +854,7 @@ msgstr "增加筛选条件"
|
|||
#. module: project
|
||||
#: model:ir.ui.menu,name:project.menu_tasks_config
|
||||
msgid "GTD"
|
||||
msgstr ""
|
||||
msgstr "GTD"
|
||||
|
||||
#. module: project
|
||||
#: help:project.task,state:0
|
||||
|
@ -1214,7 +1214,7 @@ msgstr "%s (副本)"
|
|||
#. module: project
|
||||
#: model:mail.message.subtype,name:project.mt_project_task_stage
|
||||
msgid "Task Stage Changed"
|
||||
msgstr ""
|
||||
msgstr "任务阶段已改变"
|
||||
|
||||
#. module: project
|
||||
#: view:project.task:0
|
||||
|
@ -1706,6 +1706,12 @@ msgid ""
|
|||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
" 单击创建新任务。\n"
|
||||
" </p><p>\n"
|
||||
"OpenERP 系统的任务管理允许你为了更高效地完成工作而管理任务管道。你可以跟踪任务进度、与他人讨论任务、附加文档附件等。\n"
|
||||
" </p>\n"
|
||||
" "
|
||||
|
||||
#. module: project
|
||||
#: field:project.task,date_end:0
|
||||
|
@ -2013,7 +2019,7 @@ msgstr "准备好下一个阶段"
|
|||
#. module: project
|
||||
#: field:project.task.type,case_default:0
|
||||
msgid "Default for New Projects"
|
||||
msgstr ""
|
||||
msgstr "默认用于新项目"
|
||||
|
||||
#. module: project
|
||||
#: view:project.task:0
|
||||
|
@ -2051,6 +2057,8 @@ msgid ""
|
|||
"resource allocation.\n"
|
||||
" This installs the module project_long_term."
|
||||
msgstr ""
|
||||
"用于长期项目管理的模块,能够跟踪计划、排程和资源控制。\n"
|
||||
" 将会安装模块“project_long_term”。"
|
||||
|
||||
#. module: project
|
||||
#: model:mail.message.subtype,description:project.mt_task_closed
|
||||
|
@ -2083,6 +2091,8 @@ msgid ""
|
|||
"Provides timesheet support for the issues/bugs management in project.\n"
|
||||
" This installs the module project_issue_sheet."
|
||||
msgstr ""
|
||||
"为项目中的问题/错误管理提供时间表支持。\n"
|
||||
" 将安装模块“project_issue_sheet”。"
|
||||
|
||||
#. module: project
|
||||
#: selection:project.project,privacy_visibility:0
|
||||
|
|
|
@ -0,0 +1,984 @@
|
|||
# Bosnian 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-08-06 17:46+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Bosnian <bs@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-08-07 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16721)\n"
|
||||
|
||||
#. module: project_issue
|
||||
#: model:project.category,name:project_issue.project_issue_category_03
|
||||
msgid "Deadly bug"
|
||||
msgstr "Ubojita greška"
|
||||
|
||||
#. 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:479
|
||||
#, 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:366
|
||||
#, 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:388
|
||||
#, 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:516
|
||||
#, 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:371
|
||||
#, 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:479
|
||||
#, 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 ""
|
|
@ -0,0 +1,629 @@
|
|||
# Bosnian 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-08-08 22:26+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Bosnian <bs@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-08-09 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16723)\n"
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:842
|
||||
#, python-format
|
||||
msgid "Invitation to collaborate about %s"
|
||||
msgstr "Poziv za razgovor o %s"
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:780
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The share engine has not been able to fetch a record_id for your invitation."
|
||||
msgstr ""
|
||||
"Sistem za dijeljenje nije bio u mogućnosti da uhvati record_id za vašu "
|
||||
"pozivnicu."
|
||||
|
||||
#. module: share
|
||||
#: view:share.wizard:0
|
||||
msgid "Include an Optional Personal Message"
|
||||
msgstr "Uključi opcionalnu personalnu poruku"
|
||||
|
||||
#. module: share
|
||||
#: field:share.wizard,embed_option_title:0
|
||||
msgid "Display title"
|
||||
msgstr "Prikaži naslov"
|
||||
|
||||
#. module: share
|
||||
#: view:share.wizard:0
|
||||
msgid "Access granted!"
|
||||
msgstr "Pristup odobren!"
|
||||
|
||||
#. module: share
|
||||
#: field:share.wizard,record_name:0
|
||||
msgid "Record name"
|
||||
msgstr "Ime zapisa"
|
||||
|
||||
#. module: share
|
||||
#: help:share.wizard,message:0
|
||||
msgid ""
|
||||
"An optional personal message, to be included in the email notification."
|
||||
msgstr ""
|
||||
"Opcionalna personalna poruka, da bude uključena u email obavještenje."
|
||||
|
||||
#. module: share
|
||||
#: field:share.wizard,user_type:0
|
||||
msgid "Sharing method"
|
||||
msgstr "Metoda djeljenja"
|
||||
|
||||
#. module: share
|
||||
#: field:share.wizard,name:0
|
||||
msgid "Share Title"
|
||||
msgstr "Djeli naslov"
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:848
|
||||
#: code:addons/share/wizard/share_wizard.py:877
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The documents are not attached, you can view them online directly on my "
|
||||
"OpenERP server at:\n"
|
||||
" %s\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Ovi dokumenti nisu zakačeni, možete ih pregledati online direktno na mom "
|
||||
"OpenERP serveru na:\n"
|
||||
" %s\n"
|
||||
"\n"
|
||||
|
||||
#. module: share
|
||||
#: model:ir.module.category,name:share.module_category_share
|
||||
msgid "Sharing"
|
||||
msgstr "Dijeljeno"
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:843
|
||||
#: code:addons/share/wizard/share_wizard.py:875
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Hello,\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Pozdrav,\n"
|
||||
"\n"
|
||||
|
||||
#. module: share
|
||||
#: field:share.wizard,share_root_url:0
|
||||
msgid "Share Access URL"
|
||||
msgstr "Dijeli URL pristupa"
|
||||
|
||||
#. 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 "Novi korisnički email"
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:887
|
||||
#, python-format
|
||||
msgid "You may use your current login (%s) and password to view them.\n"
|
||||
msgstr ""
|
||||
"Možete koristiti vašu trenutnu prijavu (%s) i šifru da ih pregledate..\n"
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:621
|
||||
#, python-format
|
||||
msgid "(Modified)"
|
||||
msgstr "(promjenjeno)"
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:665
|
||||
#, python-format
|
||||
msgid "You must be a member of the Share/User group to use the share wizard."
|
||||
msgstr ""
|
||||
"Morate biti član Dijeli/Korisnik grupe da bi ste koristili čarobnjak "
|
||||
"dijeljenja."
|
||||
|
||||
#. module: share
|
||||
#. openerp-web
|
||||
#: code:addons/share/static/src/js/share.js:63
|
||||
#, python-format
|
||||
msgid "Embed"
|
||||
msgstr "Ugradi"
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:599
|
||||
#, python-format
|
||||
msgid "Sharing filter created by user %s (%s) for group %s"
|
||||
msgstr "Djeljeni filter kreiran od strane korisnika %s (%s) za grupu %s"
|
||||
|
||||
#. module: share
|
||||
#: field:share.wizard,embed_url:0
|
||||
#: field:share.wizard.result.line,share_url:0
|
||||
msgid "Share URL"
|
||||
msgstr "URL djeljenja"
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:849
|
||||
#: code:addons/share/wizard/share_wizard.py:881
|
||||
#, 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:571
|
||||
#, python-format
|
||||
msgid "(Duplicated for modified sharing permissions)"
|
||||
msgstr ""
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:669
|
||||
#, 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:662
|
||||
#, python-format
|
||||
msgid "Action and Access Mode are required to create a shared access."
|
||||
msgstr ""
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:850
|
||||
#: code:addons/share/wizard/share_wizard.py:882
|
||||
#, 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:835
|
||||
#: code:addons/share/wizard/share_wizard.py:866
|
||||
#, 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:856
|
||||
#: code:addons/share/wizard/share_wizard.py:890
|
||||
#, 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:657
|
||||
#, python-format
|
||||
msgid "Sharing access cannot be created."
|
||||
msgstr ""
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:780
|
||||
#, 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:546
|
||||
#, 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:636
|
||||
#, 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:658
|
||||
#, 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:852
|
||||
#: code:addons/share/wizard/share_wizard.py:884
|
||||
#, 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:513
|
||||
#, python-format
|
||||
msgid "Copied access for sharing"
|
||||
msgstr ""
|
||||
|
||||
#. module: share
|
||||
#: code:addons/share/wizard/share_wizard.py:817
|
||||
#, 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:886
|
||||
#, 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:844
|
||||
#, 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:793
|
||||
#, 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:853
|
||||
#, 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:876
|
||||
#, 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:851
|
||||
#: code:addons/share/wizard/share_wizard.py:883
|
||||
#: 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:835
|
||||
#: code:addons/share/wizard/share_wizard.py:866
|
||||
#, 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 ""
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue