diff --git a/addons/crm/crm_action_rule_demo.xml b/addons/crm/crm_action_rule_demo.xml
index 7204f666db5..569b2d676e0 100644
--- a/addons/crm/crm_action_rule_demo.xml
+++ b/addons/crm/crm_action_rule_demo.xml
@@ -14,13 +14,7 @@
True
ir.actions.server
email
- object.user_id.email
- Reminder on Lead: [[object.id ]] [[object.partner_id and 'of ' +object.partner_id.name or '']]
- Warning unprocessed incoming lead is more than 5 day old.
-Name: [[object.name ]]
-ID: [[object.id ]]
-Description: [[object.description]]
-
+
Set Auto Reminder on leads which are not open since 5 days.
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index 46a3f6e199e..c0f003f9792 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -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
# ----------------------------------------
diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml
index 92914542d9d..219ff2cdeee 100644
--- a/addons/crm/crm_lead_data.xml
+++ b/addons/crm/crm_lead_data.xml
@@ -220,6 +220,20 @@
${not object.partner_id and object.email_from}
+
+ Reminder to User
+
+
+ admin@example.com
+ ${object.user_id != False and object.user_id.email}
+ Reminder on Lead: ${object.id} from ${object.partner_id != False and object.partner_id.name or object.contact_name}
+ This opportunity did not have any activity since at least 5 days. Here are some details:
+
+Name: ${object.name}
+ID: ${object.id}
+Description: ${object.description}
+ ]]>
+
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
index cb4302166a1..aa5aac76b9d 100644
--- a/addons/crm/crm_lead_view.xml
+++ b/addons/crm/crm_lead_view.xml
@@ -408,7 +408,7 @@
diff --git a/addons/crm/i18n/hu.po b/addons/crm/i18n/hu.po
index 0289fac77cf..791273361eb 100644
--- a/addons/crm/i18n/hu.po
+++ b/addons/crm/i18n/hu.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17: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 \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
diff --git a/addons/email_template/__init__.py b/addons/email_template/__init__.py
index d1cf5b28431..3f091fd8645 100644
--- a/addons/email_template/__init__.py
+++ b/addons/email_template/__init__.py
@@ -22,5 +22,6 @@
import email_template
import wizard
import res_partner
+import ir_actions
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/email_template/__openerp__.py b/addons/email_template/__openerp__.py
index 1dc3baaf63c..b7977660134 100644
--- a/addons/email_template/__openerp__.py
+++ b/addons/email_template/__openerp__.py
@@ -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'
],
diff --git a/addons/email_template/doc/changelog.rst b/addons/email_template/doc/changelog.rst
new file mode 100644
index 00000000000..77e342c920a
--- /dev/null
+++ b/addons/email_template/doc/changelog.rst
@@ -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.
\ No newline at end of file
diff --git a/addons/email_template/doc/index.rst b/addons/email_template/doc/index.rst
new file mode 100644
index 00000000000..58cf9413601
--- /dev/null
+++ b/addons/email_template/doc/index.rst
@@ -0,0 +1,13 @@
+Email Template module documentation
+===================================
+
+Email Template documentation topics
+'''''''''''''''''''''''''''''''''''
+
+Changelog
+'''''''''
+
+.. toctree::
+ :maxdepth: 1
+
+ changelog.rst
diff --git a/addons/email_template/ir_actions.py b/addons/email_template/ir_actions.py
new file mode 100644
index 00000000000..bd860785da4
--- /dev/null
+++ b/addons/email_template/ir_actions.py
@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2013 OpenERP S.A.
+#
+# 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 .
+#
+##############################################################################
+
+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:
diff --git a/addons/email_template/ir_actions_view.xml b/addons/email_template/ir_actions_view.xml
new file mode 100644
index 00000000000..fae9c364312
--- /dev/null
+++ b/addons/email_template/ir_actions_view.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+ ir.actions.server.form
+ ir.actions.server
+
+
+
+
+
+ Please set the Base Model before setting the action details.
+
+
+
+
+ Choose a template to display its values.
+
+
+ The values displayed hereunder are informative. When sending the email, the values
+ will be taken from the email template.
+
+
+
+
+
+
+
+ Your template does not defined any email_from. Please update your template.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/email_template/tests/__init__.py b/addons/email_template/tests/__init__.py
index d63c5634cc3..9418985b06c 100644
--- a/addons/email_template/tests/__init__.py
+++ b/addons/email_template/tests/__init__.py
@@ -18,10 +18,11 @@
# along with this program. If not, see .
#
##############################################################################
-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:
\ No newline at end of file
diff --git a/addons/email_template/tests/test_ir_actions.py b/addons/email_template/tests/test_ir_actions.py
new file mode 100644
index 00000000000..d323ee36c1f
--- /dev/null
+++ b/addons/email_template/tests/test_ir_actions.py
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2013-TODAY OpenERP S.A.
+#
+# 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 .
+#
+##############################################################################
+
+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': 'Dear ${object.name}, your parent is ${object.parent_id and object.parent_id.name or "False"}
',
+ })
+
+ 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, 'Dear TestingPartner, your parent is False
',
+ 'ir_actions_server: TODO')
diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py
index 746c2cc55f6..92bf7c3aedf 100644
--- a/addons/email_template/wizard/mail_compose_message.py
+++ b/addons/email_template/wizard/mail_compose_message.py
@@ -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', '')
diff --git a/addons/google_base_account/google_base_account.py b/addons/google_base_account/google_base_account.py
index a6cf67bbe62..50fbf233ce6 100644
--- a/addons/google_base_account/google_base_account.py
+++ b/addons/google_base_account/google_base_account.py
@@ -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',
diff --git a/addons/google_drive/google_drive.py b/addons/google_drive/google_drive.py
index 1dc6b25f27c..8bc487ada7c 100644
--- a/addons/google_drive/google_drive.py
+++ b/addons/google_drive/google_drive.py
@@ -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):
diff --git a/addons/google_drive/google_drive_data.xml b/addons/google_drive/google_drive_data.xml
index c9266547969..b1f9883c149 100644
--- a/addons/google_drive/google_drive_data.xml
+++ b/addons/google_drive/google_drive_data.xml
@@ -4,12 +4,12 @@
google_drive_client_id
- 39623646228-eg3ggo3mk6o40m7rguobi3rkl9frh4tb.apps.googleusercontent.com
+ 598905559630.apps.googleusercontent.com
google_drive_client_secret
- Ul-PtmnSWs3euWs20fdono0e
+ vTmou73c-njP-1qCxm7qx7QE
diff --git a/addons/google_drive/res_config_user_view.xml b/addons/google_drive/res_config_user_view.xml
index 728ef03c5dd..dc563a76c2b 100644
--- a/addons/google_drive/res_config_user_view.xml
+++ b/addons/google_drive/res_config_user_view.xml
@@ -23,6 +23,7 @@
+
@@ -54,7 +55,7 @@
- Google Drive Templates
+ Templates
google.drive.config
ir.actions.act_window
form
@@ -87,7 +88,7 @@
-
+
diff --git a/addons/google_drive/static/src/js/gdrive.js b/addons/google_drive/static/src/js/gdrive.js
index 3267487b4e3..dbbe50d0794 100644
--- a/addons/google_drive/static/src/js/gdrive.js
+++ b/addons/google_drive/static/src/js/gdrive.js
@@ -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+ '
',
+ 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+ '
',
- config_id: res.id,
- res_id: res_id,
- res_model: view.dataset.model,
- callback: self.on_google_doc,
- classname: 'oe_share_gdoc'
- },
- ]);
})
}
});
diff --git a/addons/google_spreadsheet/__init__.py b/addons/google_spreadsheet/__init__.py
new file mode 100644
index 00000000000..f57aaed7749
--- /dev/null
+++ b/addons/google_spreadsheet/__init__.py
@@ -0,0 +1 @@
+import google_spreadsheet
\ No newline at end of file
diff --git a/addons/google_spreadsheet/__openerp__.py b/addons/google_spreadsheet/__openerp__.py
new file mode 100644
index 00000000000..1ae2d48d349
--- /dev/null
+++ b/addons/google_spreadsheet/__openerp__.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL (
).
+#
+# 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 .
+#
+##############################################################################
+
+
+{
+ '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:
diff --git a/addons/google_spreadsheet/google_spreadsheet.py b/addons/google_spreadsheet/google_spreadsheet.py
new file mode 100644
index 00000000000..2333adf6751
--- /dev/null
+++ b/addons/google_spreadsheet/google_spreadsheet.py
@@ -0,0 +1,109 @@
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2012 OpenERP SA ().
+#
+# 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 .
+#
+##############################################################################
+
+import simplejson
+from lxml import etree
+import re
+import requests
+
+from openerp.osv import osv
+from openerp import SUPERUSER_ID
+
+
+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 = '''
+ https://spreadsheets.google.com/feeds/cells/%s/od6/private/full
+
+ A1
+
+ https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R1C1
+
+
+
+
+ A2
+
+ https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R60C15
+
+
+
+ ''' % (spreadsheet_key, spreadsheet_key, spreadsheet_key, formula.replace('"', '"'), spreadsheet_key, spreadsheet_key, config_formula.replace('"', '"'))
+
+ requests.post('https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/batch?v=3&access_token=%s' % (spreadsheet_key, access_token), data=request, headers={'content-type': 'application/atom+xml', 'If-Match': '*'})
+
+ 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
diff --git a/addons/google_spreadsheet/google_spreadsheet_data.xml b/addons/google_spreadsheet/google_spreadsheet_data.xml
new file mode 100644
index 00000000000..19802e9d140
--- /dev/null
+++ b/addons/google_spreadsheet/google_spreadsheet_data.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Base Spreadsheet Template
+
+ https://docs.google.com/spreadsheet/ccc?key=0ApGVjjwUC-ygdDZ0TG5EQnRlLVFQNlFGdFN5b1ZrY1E
+ Reporting %(name)s
+
+
+
+
\ No newline at end of file
diff --git a/addons/google_spreadsheet/google_spreadsheet_view.xml b/addons/google_spreadsheet/google_spreadsheet_view.xml
new file mode 100644
index 00000000000..e99826dae52
--- /dev/null
+++ b/addons/google_spreadsheet/google_spreadsheet_view.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+ ir.attachment.google.spreadsheet.tree
+ ir.attachment
+
+
+
+
+
+
+
+
+
+ ir.attachment.google.spreadsheet.form
+ ir.attachment
+
+
+
+
+
+
+ Google Spreadsheets
+ ir.attachment
+ form
+ tree,form
+ {}
+ [('url', 'like', '/spreadsheet/')]
+ Google Spreadsheets
+
+
+
+
+ tree
+
+
+
+
+
+
+ form
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/addons/google_spreadsheet/i18n/google_spreadsheet.pot b/addons/google_spreadsheet/i18n/google_spreadsheet.pot
new file mode 100644
index 00000000000..3cf39bd8df5
--- /dev/null
+++ b/addons/google_spreadsheet/i18n/google_spreadsheet.pot
@@ -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 ""
+
diff --git a/addons/google_spreadsheet/static/src/js/search.js b/addons/google_spreadsheet/static/src/js/search.js
new file mode 100644
index 00000000000..c46ec615792
--- /dev/null
+++ b/addons/google_spreadsheet/static/src/js/search.js
@@ -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));
+ }
+ }
+ });
+};
\ No newline at end of file
diff --git a/addons/google_spreadsheet/static/src/xml/addtospreadsheet.xml b/addons/google_spreadsheet/static/src/xml/addtospreadsheet.xml
new file mode 100644
index 00000000000..faf984141a6
--- /dev/null
+++ b/addons/google_spreadsheet/static/src/xml/addtospreadsheet.xml
@@ -0,0 +1,5 @@
+
+
+
Add to Google Spreadsheet
+
+
\ No newline at end of file
diff --git a/addons/mail/doc/changelog.rst b/addons/mail/doc/changelog.rst
index f6674bb42ad..a7a2cfcf2b5 100644
--- a/addons/mail/doc/changelog.rst
+++ b/addons/mail/doc/changelog.rst
@@ -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``.
\ No newline at end of file
+ are ``read`` (portal documents), ``write`` (default value), ``unlink`` or ``create``.
diff --git a/addons/mail/mail_followers.py b/addons/mail/mail_followers.py
index 9d96a6ff59c..ac350810aa6 100644
--- a/addons/mail/mail_followers.py
+++ b/addons/mail/mail_followers.py
@@ -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
diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py
index d45ae04ddd1..bf76216e7e4 100644
--- a/addons/mail/mail_mail.py
+++ b/addons/mail/mail_mail.py
@@ -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'),
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index 9d6829f3f6e..a5d8f348a2b 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -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):
@@ -780,8 +781,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
diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js
index 5d54a6acc48..d0af3127404 100644
--- a/addons/mail/static/src/js/mail.js
+++ b/addons/mail/static/src/js/mail.js
@@ -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
diff --git a/addons/mail/tests/test_mail_features.py b/addons/mail/tests/test_mail_features.py
index 148b5faba87..ae5555c01ca 100644
--- a/addons/mail/tests/test_mail_features.py
+++ b/addons/mail/tests/test_mail_features.py
@@ -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
diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py
index 7685a27f1ed..6ab1f0e81ff 100644
--- a/addons/mail/wizard/mail_compose_message.py
+++ b/addons/mail/wizard/mail_compose_message.py
@@ -73,6 +73,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':
@@ -112,6 +117,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',
@@ -129,7 +136,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,
}
@@ -238,8 +244,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 = {
diff --git a/addons/mail/wizard/mail_compose_message_view.xml b/addons/mail/wizard/mail_compose_message_view.xml
index 1ca07b6a94c..07d39bb0965 100644
--- a/addons/mail/wizard/mail_compose_message_view.xml
+++ b/addons/mail/wizard/mail_compose_message_view.xml
@@ -12,6 +12,9 @@
+
+
+
diff --git a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml
index f6eb8a1d905..bdcbb984193 100644
--- a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml
+++ b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml
@@ -1,10 +1,10 @@
- Dummy Action
+ Dummy Python Code
- dummy
-
+ code
+ True
diff --git a/addons/mrp_operations/mrp_operations.py b/addons/mrp_operations/mrp_operations.py
index 87861ba8fc6..52fdda1a7b2 100644
--- a/addons/mrp_operations/mrp_operations.py
+++ b/addons/mrp_operations/mrp_operations.py
@@ -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])
diff --git a/addons/point_of_sale/i18n/zh_CN.po b/addons/point_of_sale/i18n/zh_CN.po
index 23dc97f2376..58d7c1f01de 100644
--- a/addons/point_of_sale/i18n/zh_CN.po
+++ b/addons/point_of_sale/i18n/zh_CN.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2013-04-24 06:41+0000\n"
-"Last-Translator: viney \n"
+"PO-Revision-Date: 2013-07-26 07:07+0000\n"
+"Last-Translator: Wei \"oldrev\" Li \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-07-27 05:02+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: point_of_sale
#: field:report.transaction.pos,product_nb:0
@@ -51,7 +51,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 +62,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 +85,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 +102,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 +111,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 +128,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 +164,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 +181,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 +200,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 +237,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 +259,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 +277,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
@@ -315,10 +315,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 +336,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 +353,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 +375,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 +404,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 +435,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 +446,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 +471,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 +484,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 +508,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 +543,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 +568,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 +609,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 +619,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 +631,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 +678,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 +693,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 +710,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
@@ -743,7 +743,7 @@ msgstr ""
#. 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 +778,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 +825,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 +863,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 +879,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
@@ -939,7 +939,7 @@ msgstr ""
#. 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 +965,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 +979,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 +1011,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 +1031,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 +1041,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 +1053,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 +1065,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
@@ -1082,17 +1082,17 @@ msgstr ""
#. 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,7 +1137,7 @@ 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
@@ -1153,12 +1153,12 @@ 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 ""
@@ -1215,14 +1215,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 +1240,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 +1295,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 +1315,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 +1352,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 +1360,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 +1396,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 +1415,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 +1431,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 +1448,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 +1458,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 +1511,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 +1541,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 +1563,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 +1613,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 +1644,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 +1655,7 @@ msgstr ""
#: view:pos.config:0
#: selection:pos.config,state:0
msgid "Inactive"
-msgstr ""
+msgstr "不活跃的"
#. module: point_of_sale
#. openerp-web
@@ -1679,7 +1679,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 +1699,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 +1815,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 +1978,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 +1986,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 +2038,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 +2761,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 +2774,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 +3085,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 +3189,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 +3230,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 +3261,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 +3340,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 +3381,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"
@@ -3495,7 +3497,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 +3541,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 +3593,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 +4022,7 @@ msgstr ""
#~ msgid "Discount percentage"
#~ msgstr "折扣百分比"
+#, python-format
#~ msgid "Close"
#~ msgstr "关闭"
@@ -4843,9 +4846,11 @@ msgstr ""
#~ msgid "Subtotal:"
#~ msgstr "小计:"
+#, python-format
#~ msgid "Validate"
#~ msgstr "确认"
+#, python-format
#~ msgid "Print"
#~ msgstr "打印"
@@ -4931,6 +4936,7 @@ msgstr ""
#~ msgid "PoS Backend"
#~ msgstr "POS后端"
+#, python-format
#~ msgid "Next Order"
#~ msgstr "下一订单"
diff --git a/addons/product/i18n/zh_CN.po b/addons/product/i18n/zh_CN.po
index bd28e914c5e..470e1c0632b 100644
--- a/addons/product/i18n/zh_CN.po
+++ b/addons/product/i18n/zh_CN.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-11-27 09:28+0000\n"
-"Last-Translator: 盈通 ccdos \n"
+"PO-Revision-Date: 2013-07-28 11:18+0000\n"
+"Last-Translator: Wei \"oldrev\" Li \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 ""
" \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"
diff --git a/addons/stock/i18n/zh_CN.po b/addons/stock/i18n/zh_CN.po
index 407a76e63b7..3200f82e8f4 100644
--- a/addons/stock/i18n/zh_CN.po
+++ b/addons/stock/i18n/zh_CN.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2012-12-09 05:05+0000\n"
-"Last-Translator: sum1201 \n"
+"PO-Revision-Date: 2013-07-27 18:34+0000\n"
+"Last-Translator: Wei \"oldrev\" Li \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:00+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-07-28 05:54+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: stock
#: field:stock.inventory.line.split,line_exist_ids:0
@@ -124,8 +124,8 @@ msgid "Product Moves"
msgstr "产品调拨"
#. module: stock
-#: code:addons/stock/stock.py:2519
-#: code:addons/stock/stock.py:2580
+#: code:addons/stock/stock.py:2524
+#: code:addons/stock/stock.py:2585
#, python-format
msgid "Please provide proper quantity."
msgstr "输入数量不正确"
@@ -251,7 +251,7 @@ msgstr "安排送货单"
#: code:addons/stock/wizard/stock_change_standard_price.py:107
#, python-format
msgid "Active ID is not set in Context."
-msgstr ""
+msgstr "Contex中没有 Active ID"
#. module: stock
#: selection:stock.picking,invoice_state:0
@@ -346,9 +346,9 @@ msgstr "保留复杂的摘要(消息数量,……等)。为了插入到看板视
#. module: stock
#: code:addons/stock/stock.py:768
-#: code:addons/stock/stock.py:2475
-#: code:addons/stock/stock.py:2519
-#: code:addons/stock/stock.py:2580
+#: code:addons/stock/stock.py:2473
+#: code:addons/stock/stock.py:2524
+#: code:addons/stock/stock.py:2585
#: code:addons/stock/wizard/stock_change_product_qty.py:91
#: code:addons/stock/wizard/stock_fill_inventory.py:124
#: code:addons/stock/wizard/stock_inventory_merge.py:43
@@ -476,6 +476,7 @@ msgstr "操作追溯 "
#: selection:stock.move,state:0
#: selection:stock.picking,state:0
#: selection:stock.picking.in,state:0
+#: report:stock.picking.list:0
#: selection:stock.picking.out,state:0
msgid "Waiting Availability"
msgstr "等待可用"
@@ -484,6 +485,7 @@ msgstr "等待可用"
#: selection:report.stock.inventory,state:0
#: selection:report.stock.move,state:0
#: selection:stock.move,state:0
+#: report:stock.picking.list:0
#: view:stock.production.lot:0
#: field:stock.production.lot,stock_available:0
msgid "Available"
@@ -574,7 +576,7 @@ msgstr "实物盘点表草稿"
msgid ""
"Quantities, Units of Measure, Products and Locations cannot be modified on "
"stock moves that have already been processed (except by the Administrator)."
-msgstr ""
+msgstr "已经被处理过的移库单中,数量,计量单位,产品和库位不能修改(除非是 管理员)"
#. module: stock
#: help:report.stock.move,type:0
@@ -614,7 +616,7 @@ msgstr "标签"
#: code:addons/stock/stock.py:1356
#, python-format
msgid "Back order %s has been created ."
-msgstr "未交付清单%s 已经被 创建 ."
+msgstr "延期交货清单%s 已经被 创建 ."
#. module: stock
#: model:ir.model,name:stock.model_report_stock_move
@@ -684,7 +686,7 @@ msgstr "入库单"
#, python-format
msgid ""
"Serial number quantity %d of %s is larger than available quantity (%d)!"
-msgstr ""
+msgstr "系列号数量 %d ( %s ) 大于可用数量(%d)!"
#. module: stock
#: report:stock.picking.list:0
@@ -821,7 +823,7 @@ msgstr "6月"
msgid ""
"Forces to specify a Serial Number for all moves containing this product and "
"coming from a Supplier Location"
-msgstr ""
+msgstr "为包含该产品和来自供应商库位的所有移库单 强制指定一个 系列号"
#. module: stock
#: help:stock.config.settings,group_uos:0
@@ -831,6 +833,8 @@ msgid ""
" For instance, you can sell pieces of meat that you invoice "
"based on their weight."
msgstr ""
+"允许产品的销售和开票的单位不一致.\n"
+" 例如你可以按块卖,但发票按重量开."
#. module: stock
#: field:product.template,property_stock_procurement:0
@@ -866,7 +870,7 @@ msgstr "在进行实时库存核算时,库存调拨处理将自动登入这账
msgid ""
"Please define stock output account for this product or its category: \"%s\" "
"(id: %d)"
-msgstr ""
+msgstr "请为这个产品或者它的类别定义一个出库科目: \"%s\" (id: %d)"
#. module: stock
#: field:stock.picking,message_summary:0
@@ -895,7 +899,7 @@ msgid "Time"
msgstr "时间"
#. module: stock
-#: code:addons/stock/product.py:447
+#: code:addons/stock/product.py:449
#, python-format
msgid "Future Receptions"
msgstr "未来的入库"
@@ -948,7 +952,7 @@ msgstr "入库库位"
msgid ""
"This field is for internal purpose. It is used to decide if the column "
"production lot has to be shown on the moves or not."
-msgstr ""
+msgstr "这 字段是内部用途。用来决定 生产批号这一列 是否显示在移库单上面"
#. module: stock
#: selection:product.product,valuation:0
@@ -982,7 +986,7 @@ msgstr "公司间转移的中途库位"
msgid ""
"You cannot cancel the picking as some moves have been done. You should "
"cancel the picking lines."
-msgstr ""
+msgstr "您不能取消已经有部分移库完成的分拣单。您应该取消 分拣单行"
#. module: stock
#: field:stock.config.settings,decimal_precision:0
@@ -1000,7 +1004,7 @@ msgid "Change Product Quantity"
msgstr "更改产品数量"
#. module: stock
-#: code:addons/stock/product.py:463
+#: code:addons/stock/product.py:465
#, python-format
msgid "Future P&L"
msgstr "未来的产品和库位"
@@ -1027,13 +1031,13 @@ msgstr "盘点库位"
#. module: stock
#: constraint:stock.move:0
msgid "You must assign a serial number for this product."
-msgstr ""
+msgstr "你需要为该产品指定一个系列号"
#. module: stock
#: code:addons/stock/stock.py:2255
#, python-format
msgid "Please define journal on the product category: \"%s\" (id: %d)"
-msgstr ""
+msgstr "请为这个产品类型定义一个分类账: \"%s\" (id: %d)"
#. module: stock
#: view:stock.move:0
@@ -1043,7 +1047,7 @@ msgstr "详情"
#. module: stock
#: selection:stock.picking,state:0
msgid "Ready to Transfer"
-msgstr ""
+msgstr "准备转移"
#. module: stock
#: report:lot.stock.overview:0
@@ -1134,12 +1138,12 @@ msgstr "产品批次"
#. module: stock
#: view:stock.picking:0
msgid "Reverse Transfer"
-msgstr ""
+msgstr "反向转移"
#. module: stock
#: field:stock.config.settings,group_uos:0
msgid "Invoice products in a different unit of measure than the sales order"
-msgstr ""
+msgstr "开票产品的计量单位和销售订单不一致。"
#. module: stock
#: help:stock.location,active:0
@@ -1160,13 +1164,13 @@ msgstr "请在列表视图中选择多个待合并的盘点"
msgid ""
"No products to return (only lines in Done state and not fully returned yet "
"can be returned)!"
-msgstr ""
+msgstr "没有产品被退货(只有完成状态和未完全退货的 行能被退货)!"
#. module: stock
#: view:stock.picking:0
#: view:stock.picking.in:0
msgid "Back Orders"
-msgstr "子单"
+msgstr "延期交货"
#. module: stock
#: field:stock.location,stock_virtual:0
@@ -1208,7 +1212,7 @@ msgstr "生产库位"
#: code:addons/stock/product.py:121
#, python-format
msgid "Please define journal on the product category: \"%s\" (id: %d)."
-msgstr ""
+msgstr "请在产品分类 \"%s\" (id: %d) 上面定义一个分类账。"
#. module: stock
#: field:report.stock.lines.date,date:0
@@ -1267,17 +1271,17 @@ msgstr "建立者"
#, python-format
msgid ""
"You are moving %.2f %s but only %.2f %s available for this serial number."
-msgstr ""
+msgstr "你正在移动 %.2f %s ,但该系列号只有 %.2f %s 可用"
#. module: stock
#: report:stock.picking.list:0
msgid "Internal Shipment :"
-msgstr ""
+msgstr "内部装运:"
#. module: stock
#: view:stock.inventory.line:0
msgid "Split Inventory Line"
-msgstr ""
+msgstr "拆分存货清单行"
#. module: stock
#: selection:stock.location,chained_auto_packing:0
@@ -1298,7 +1302,7 @@ msgid "Supplier"
msgstr "供应商"
#. module: stock
-#: code:addons/stock/stock.py:2859
+#: code:addons/stock/stock.py:2864
#, python-format
msgid ""
"In order to cancel this inventory, you must first unpost related journal "
@@ -1309,7 +1313,7 @@ msgstr "为取消这个盘存,你必须要先取消相关的分录。"
#: code:addons/stock/product.py:113
#, python-format
msgid "Please specify company in Location."
-msgstr ""
+msgstr "请在库位里 指定公司"
#. module: stock
#: view:stock.move:0
@@ -1321,7 +1325,7 @@ msgstr "库存调拨可用(已准备好)"
msgid ""
"Allows you to create and manage your packaging dimensions and types you want "
"to be maintained in your system."
-msgstr ""
+msgstr "允许创建和管理你要在系统中保留的的包装尺寸和类型。"
#. module: stock
#: selection:report.stock.inventory,month:0
@@ -1346,7 +1350,7 @@ msgstr "实物盘点"
#: code:addons/stock/wizard/stock_move.py:214
#, python-format
msgid "Processing Error!"
-msgstr ""
+msgstr "处理错误!"
#. module: stock
#: help:stock.location,chained_company_id:0
@@ -1367,6 +1371,11 @@ msgid ""
"* Available: When products are reserved, it is set to 'Available'.\n"
"* Done: When the shipment is processed, the state is 'Done'."
msgstr ""
+"* 新建: 当移库单被创建还没被确实时。\n"
+"* 等待另外的移库: 当需要等待另外一个移库完成时,出现该状态。例如:链式物流.\n"
+"* 等待可用: 当需求还不能被直接了当地解决时,出现该状态。可能需要等调度程序被运行,有个部件在等待制造等等...\n"
+"* 可用: 当产品已经被保留了,状态就被设置为 可用。\n"
+"* 完成: 当这次装运被处理,状态就是“完成”。"
#. module: stock
#: model:stock.location,name:stock.stock_location_locations_partner
@@ -1462,7 +1471,7 @@ msgstr "等待其它调拨"
#: help:stock.change.product.qty,new_quantity:0
msgid ""
"This quantity is expressed in the Default Unit of Measure of the product."
-msgstr ""
+msgstr "此数量以该产品的默认计量单位表示"
#. module: stock
#: help:stock.move,price_unit:0
@@ -1475,7 +1484,7 @@ msgstr "用户在确认分拣时设置期间,字段用于记录产品的成本
#: code:addons/stock/stock.py:1890
#, python-format
msgid "Warning: No Back Order"
-msgstr ""
+msgstr "警告: 没有 延期交货清单"
#. module: stock
#: model:ir.model,name:stock.model_stock_move
@@ -1494,7 +1503,7 @@ msgid "To be refunded/invoiced"
msgstr "已开票或退票"
#. module: stock
-#: code:addons/stock/stock.py:2450
+#: code:addons/stock/stock.py:2448
#, python-format
msgid "You can only delete draft moves."
msgstr "您只能删除草稿状态的调拨。"
@@ -1503,12 +1512,12 @@ msgstr "您只能删除草稿状态的调拨。"
#: code:addons/stock/stock.py:1665
#, python-format
msgid "You cannot move product %s to a location of type view %s."
-msgstr ""
+msgstr "您不能移动产品%s到视图类型的库位%s。"
#. module: stock
#: view:stock.inventory:0
msgid "Split in serial numbers"
-msgstr ""
+msgstr "拆分系列号"
#. module: stock
#: view:stock.move:0
@@ -1537,10 +1546,10 @@ msgid "Additional Info"
msgstr "附加信息"
#. module: stock
-#: code:addons/stock/stock.py:2648
+#: code:addons/stock/stock.py:2653
#, python-format
msgid "Missing partial picking data for move #%s."
-msgstr ""
+msgstr "移库单 #%s 丢失了部分分拣的数据。"
#. module: stock
#: field:stock.location.product,from_date:0
@@ -1631,6 +1640,9 @@ msgstr ""
#. module: stock
#: field:stock.inventory,date:0
#: field:stock.move,create_date:0
+#: field:stock.picking,date:0
+#: field:stock.picking.in,date:0
+#: field:stock.picking.out,date:0
#: field:stock.production.lot,date:0
#: field:stock.tracking,date:0
msgid "Creation Date"
@@ -1731,7 +1743,7 @@ msgstr "上级库位"
#: code:addons/stock/product.py:168
#, python-format
msgid "Please define stock output account for this product: \"%s\" (id: %d)."
-msgstr ""
+msgstr "请为产品 \"%s\" (id: %d) 定义出库科目"
#. module: stock
#: help:stock.location,company_id:0
@@ -1754,15 +1766,15 @@ msgid "Stock Invoice Onshipping"
msgstr "发票未到"
#. module: stock
-#: code:addons/stock/stock.py:2475
+#: code:addons/stock/stock.py:2473
#, python-format
msgid "Please provide a positive quantity to scrap."
-msgstr ""
+msgstr "请提供一个正数给报废库位。"
#. module: stock
#: model:stock.location,name:stock.stock_location_shop1
msgid "Your Company, Birmingham shop"
-msgstr ""
+msgstr "你的公司,伯明翰商店"
#. module: stock
#: view:product.product:0
@@ -1781,7 +1793,7 @@ msgstr "单位成本的币别"
#: selection:stock.picking.in,move_type:0
#: selection:stock.picking.out,move_type:0
msgid "Partial"
-msgstr ""
+msgstr "部分"
#. module: stock
#: selection:report.stock.inventory,month:0
@@ -1792,7 +1804,7 @@ msgstr "9月"
#. module: stock
#: view:product.product:0
msgid "days"
-msgstr ""
+msgstr "天"
#. module: stock
#: model:ir.model,name:stock.model_report_stock_inventory
@@ -1809,13 +1821,13 @@ msgstr "月计划"
#: help:stock.picking.in,origin:0
#: help:stock.picking.out,origin:0
msgid "Reference of the document"
-msgstr ""
+msgstr "文档的参照"
#. module: stock
#: view:stock.picking:0
#: view:stock.picking.in:0
msgid "Is a Back Order"
-msgstr "是子单"
+msgstr "是一个延期交货清单"
#. module: stock
#: report:stock.picking.list:0
@@ -1830,7 +1842,7 @@ msgstr "库存核算科目(出仓)"
#. module: stock
#: view:stock.return.picking.memory:0
msgid "Return Picking Memory"
-msgstr ""
+msgstr "退回分拣存储区"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_move_form2
@@ -1847,7 +1859,7 @@ msgstr "库存调拨"
msgid ""
"Check this option to select existing serial numbers in the list below, "
"otherwise you should enter new ones line by line."
-msgstr ""
+msgstr "点击此项从下面列表中选择一个已有的系列号,否则你要逐行输入新的"
#. module: stock
#: selection:report.stock.move,type:0
@@ -1873,14 +1885,14 @@ msgstr "取消可用"
#: code:addons/stock/wizard/stock_location_product.py:49
#, python-format
msgid "Current Inventory"
-msgstr ""
+msgstr "当前库存清单"
#. module: stock
#: help:product.template,property_stock_production:0
msgid ""
"This stock location will be used, instead of the default one, as the source "
"location for stock moves generated by manufacturing orders."
-msgstr ""
+msgstr "该库位将被使用以替换默认的,同样的,库存移位的源库位将根据制造单生成。"
#. module: stock
#: help:stock.move,date_expected:0
@@ -1903,10 +1915,10 @@ msgid "Shelf 2"
msgstr "货架 2"
#. module: stock
-#: code:addons/stock/stock.py:529
+#: code:addons/stock/stock.py:528
#, python-format
msgid "You cannot remove a lot line."
-msgstr ""
+msgstr "您不能移除一个批号"
#. module: stock
#: help:stock.location,posx:0
@@ -1927,7 +1939,7 @@ msgid "Localization"
msgstr "本地化"
#. module: stock
-#: code:addons/stock/product.py:459
+#: code:addons/stock/product.py:461
#, python-format
msgid "Delivered Qty"
msgstr "已配送数量"
@@ -1935,14 +1947,14 @@ msgstr "已配送数量"
#. module: stock
#: view:stock.partial.picking:0
msgid "Transfer Products"
-msgstr ""
+msgstr "转让产品"
#. module: stock
#: help:product.template,property_stock_inventory:0
msgid ""
"This stock location will be used, instead of the default one, as the source "
"location for stock moves generated when you do an inventory."
-msgstr ""
+msgstr "该库位将被使用以替换默认的,同样当你做盘点时,库存移位的源库位将被生成。"
#. module: stock
#: help:product.template,property_stock_account_output:0
@@ -1998,7 +2010,7 @@ msgstr "日期"
#: field:stock.picking.in,message_is_follower:0
#: field:stock.picking.out,message_is_follower:0
msgid "Is a Follower"
-msgstr ""
+msgstr "是一个关注者"
#. module: stock
#: view:report.stock.inventory:0
@@ -2009,13 +2021,13 @@ msgstr "增加筛选条件"
#. module: stock
#: field:stock.warehouse,lot_stock_id:0
msgid "Location Stock"
-msgstr "库位库存"
+msgstr "库存库位"
#. module: stock
#: code:addons/stock/wizard/stock_partial_picking.py:97
#, python-format
msgid "_Deliver"
-msgstr ""
+msgstr "_Deliver"
#. module: stock
#: code:addons/stock/wizard/stock_inventory_merge.py:64
@@ -2058,7 +2070,7 @@ msgstr "批号"
#: model:ir.actions.act_window,name:stock.action_deliver_move
#: view:product.product:0
msgid "Deliveries"
-msgstr ""
+msgstr "已交付"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_reception_picking_move
@@ -2109,7 +2121,7 @@ msgstr "退回分拣"
#: model:ir.actions.act_window,name:stock.act_stock_return_picking_in
#: model:ir.actions.act_window,name:stock.act_stock_return_picking_out
msgid "Return Shipment"
-msgstr ""
+msgstr "退回件"
#. module: stock
#: model:ir.model,name:stock.model_stock_inventory_merge
@@ -2161,7 +2173,7 @@ msgstr "默认作为您接收当前业务伙伴产品的源库位"
#: sql_constraint:stock.production.lot:0
msgid ""
"The combination of Serial Number and internal reference must be unique !"
-msgstr ""
+msgstr "系列号和内部参考号的组合必须是唯一的"
#. module: stock
#: field:stock.warehouse,partner_id:0
@@ -2179,7 +2191,7 @@ msgstr "调拨分析让您轻松检查和分析您公司的库存调拨.在您
#. module: stock
#: constraint:stock.move:0
msgid "You try to assign a lot which is not from the same product."
-msgstr ""
+msgstr "你试图分配一个不是该产品的批次"
#. module: stock
#: field:report.stock.move,day_diff1:0
@@ -2194,20 +2206,20 @@ msgstr "价格"
#. module: stock
#: field:stock.config.settings,module_stock_invoice_directly:0
msgid "Create and open the invoice when the user finish a delivery order"
-msgstr ""
+msgstr "当用户完成一个发运单后,创建并打开发票"
#. module: stock
#: model:ir.model,name:stock.model_stock_return_picking_memory
msgid "stock.return.picking.memory"
-msgstr ""
+msgstr "stock.return.picking.memory"
#. module: stock
#: field:stock.config.settings,group_stock_inventory_valuation:0
msgid "Generate accounting entries per stock movement"
-msgstr ""
+msgstr "对每个移库动作生成账务分录"
#. module: stock
-#: code:addons/stock/product.py:449
+#: code:addons/stock/product.py:451
#, python-format
msgid "Received Qty"
msgstr "已接收数量"
@@ -2215,7 +2227,7 @@ msgstr "已接收数量"
#. module: stock
#: field:stock.production.lot,ref:0
msgid "Internal Reference"
-msgstr "内部单号"
+msgstr "编号"
#. module: stock
#: help:stock.production.lot,prefix:0
@@ -2229,7 +2241,7 @@ msgstr "显示这序列号时的可选前缀: PREFIX/SERIAL [INT_REF]"
msgid ""
"Forces to specify a Serial Number for all moves containing this product and "
"generated by a Manufacturing Order"
-msgstr ""
+msgstr "强制对包含该产品的所有移库单指定一个系列号,并生成一个制造单"
#. module: stock
#: model:ir.model,name:stock.model_stock_fill_inventory
@@ -2246,7 +2258,7 @@ msgstr "名称"
#. module: stock
#: report:stock.picking.list:0
msgid "Supplier Address :"
-msgstr ""
+msgstr "供应商地址:"
#. module: stock
#: view:stock.inventory.line:0
@@ -2274,28 +2286,28 @@ msgid "Customer Locations"
msgstr "客户库位"
#. module: stock
-#: code:addons/stock/stock.py:2449
-#: code:addons/stock/stock.py:2858
+#: code:addons/stock/stock.py:2448
+#: code:addons/stock/stock.py:2863
#, python-format
msgid "User Error!"
-msgstr ""
+msgstr "用户错误!"
#. module: stock
#: view:stock.partial.picking:0
msgid "Stock partial Picking"
-msgstr ""
+msgstr "库存部分分拣"
#. module: stock
#: view:stock.picking:0
msgid "Create Invoice/Refund"
-msgstr ""
+msgstr "创建发票/退款"
#. module: stock
#: help:stock.picking,message_ids:0
#: help:stock.picking.in,message_ids:0
#: help:stock.picking.out,message_ids:0
msgid "Messages and communication history"
-msgstr ""
+msgstr "消息和通信记录"
#. module: stock
#: view:report.stock.inventory:0
@@ -2320,7 +2332,7 @@ msgstr "供货商库位"
#. module: stock
#: view:stock.location.product:0
msgid "View Products Inventory"
-msgstr ""
+msgstr "查看产品存货清单"
#. module: stock
#: view:stock.move:0
@@ -2331,7 +2343,7 @@ msgstr "创建"
#: code:addons/stock/stock.py:1776
#, python-format
msgid "Operation forbidden !"
-msgstr ""
+msgstr "操作被禁止"
#. module: stock
#: view:report.stock.inventory:0
@@ -2355,12 +2367,12 @@ msgstr "入库科目"
#. module: stock
#: view:report.stock.move:0
msgid "Shipping type specify, goods coming in or going out"
-msgstr ""
+msgstr "指定运输类型,商品进入或者发出"
#. module: stock
#: view:stock.config.settings:0
msgid "Accounting"
-msgstr ""
+msgstr "会计"
#. module: stock
#: model:ir.ui.menu,name:stock.menu_warehouse_config
@@ -2429,26 +2441,26 @@ msgstr "计量单位"
#. module: stock
#: field:stock.config.settings,group_stock_multiple_locations:0
msgid "Manage multiple locations and warehouses"
-msgstr ""
+msgstr "管理多库位及仓库"
#. module: stock
#: field:stock.config.settings,group_stock_production_lot:0
msgid "Track serial number on products"
-msgstr ""
+msgstr "追溯产品批次"
#. module: stock
#: field:stock.picking,message_unread:0
#: field:stock.picking.in,message_unread:0
#: field:stock.picking.out,message_unread:0
msgid "Unread Messages"
-msgstr ""
+msgstr "未读消息"
#. module: stock
#: help:stock.production.lot,stock_available:0
msgid ""
"Current quantity of products with this Serial Number available in company "
"warehouses"
-msgstr ""
+msgstr "在 公司仓库中,该序列号的产品当前可用的数量。"
#. module: stock
#: view:stock.inventory:0
@@ -2470,7 +2482,7 @@ msgstr "批次"
#. module: stock
#: view:stock.partial.picking:0
msgid "_Transfer"
-msgstr ""
+msgstr "_Transfer"
#. module: stock
#: selection:report.stock.move,type:0
@@ -2499,7 +2511,7 @@ msgid "Warehouse board"
msgstr "仓库控制台"
#. module: stock
-#: code:addons/stock/product.py:469
+#: code:addons/stock/product.py:471
#, python-format
msgid "Future Qty"
msgstr "未来数量"
@@ -2507,7 +2519,7 @@ msgstr "未来数量"
#. module: stock
#: model:res.groups,name:stock.group_production_lot
msgid "Manage Serial Numbers"
-msgstr ""
+msgstr "管理系列号"
#. module: stock
#: field:stock.move,note:0
@@ -2520,7 +2532,7 @@ msgstr "备注"
#. module: stock
#: selection:stock.picking,state:0
msgid "Transferred"
-msgstr ""
+msgstr "已转运"
#. module: stock
#: report:lot.stock.overview:0
@@ -2541,7 +2553,7 @@ msgstr "移库单类型"
#. module: stock
#: view:stock.move:0
msgid "Process Partially"
-msgstr ""
+msgstr "处理部分"
#. module: stock
#: view:stock.move:0
@@ -2566,7 +2578,7 @@ msgstr "产品"
msgid ""
"Cannot create Journal Entry, Output Account of this product and Valuation "
"account on category of this product are same."
-msgstr ""
+msgstr "不能创建分类账分录,该产品的出库科目和其分类中的 估值科目是一样的"
#. module: stock
#: selection:stock.location,chained_location_type:0
@@ -2606,7 +2618,7 @@ msgstr "出仓产品"
msgid ""
"Please define stock input account for this product or its category: \"%s\" "
"(id: %d)"
-msgstr ""
+msgstr "请为产品 \"%s\" (id: %d) 或者他的类别 定义一个入库科目"
#. module: stock
#: view:report.stock.move:0
@@ -2621,7 +2633,7 @@ msgid "Move"
msgstr "调拨"
#. module: stock
-#: code:addons/stock/product.py:465
+#: code:addons/stock/product.py:467
#, python-format
msgid "P&L Qty"
msgstr "损益数量"
@@ -2629,7 +2641,7 @@ msgstr "损益数量"
#. module: stock
#: model:ir.model,name:stock.model_stock_config_settings
msgid "stock.config.settings"
-msgstr ""
+msgstr "stock.config.settings"
#. module: stock
#: view:stock.production.lot:0
@@ -2652,7 +2664,7 @@ msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_4
msgid "Big Suppliers"
-msgstr ""
+msgstr "大供应商"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_stock_inventory_report
@@ -2678,7 +2690,7 @@ msgstr "创建"
#. module: stock
#: field:stock.change.product.qty,new_quantity:0
msgid "New Quantity on Hand"
-msgstr ""
+msgstr "在手库存调整"
#. module: stock
#: field:stock.move,priority:0
@@ -2728,7 +2740,7 @@ msgstr "取消盘点"
#. module: stock
#: field:stock.config.settings,group_product_variant:0
msgid "Support multiple variants per products "
-msgstr ""
+msgstr "支持每个产品的多个变体 "
#. module: stock
#: code:addons/stock/stock.py:2246
@@ -2736,7 +2748,7 @@ msgstr ""
msgid ""
"Cannot create Journal Entry, Input Account of this product and Valuation "
"account on category of this product are same."
-msgstr ""
+msgstr "不能创建分类账分录,该产品的入库科目和其分类中的 估值科目是一样的"
#. module: stock
#: model:ir.ui.menu,name:stock.menu_stock_unit_measure_stock
@@ -2752,7 +2764,7 @@ msgstr "固定库位"
#. module: stock
#: field:report.stock.inventory,scrap_location:0
msgid "scrap"
-msgstr ""
+msgstr "报废"
#. module: stock
#: code:addons/stock/stock.py:1891
@@ -2760,22 +2772,22 @@ msgstr ""
msgid ""
"By changing the quantity here, you accept the new quantity as complete: "
"OpenERP will not automatically generate a Back Order."
-msgstr ""
+msgstr "通过修改此处的数量,就是您已经收到完成的数量: OpenERP 将自动生成一个延期交货清单。"
#. module: stock
#: report:stock.inventory.move:0
msgid "Manual Quantity"
-msgstr ""
+msgstr "手动数量"
#. module: stock
#: view:product.product:0
msgid "On hand:"
-msgstr ""
+msgstr "在手:"
#. module: stock
#: model:ir.model,name:stock.model_stock_report_prodlots
msgid "Stock report by serial number"
-msgstr ""
+msgstr "按批次统计库库"
#. module: stock
#: selection:report.stock.inventory,month:0
@@ -2801,7 +2813,7 @@ msgstr "显示您产品的最后盘点并用特定的筛选规则去排序。如
#: code:addons/stock/wizard/stock_invoice_onshipping.py:112
#, python-format
msgid "Please create Invoices."
-msgstr ""
+msgstr "请创建发票"
#. module: stock
#: help:stock.config.settings,module_product_expiry:0
@@ -2814,12 +2826,20 @@ msgid ""
" - alert date.\n"
"This installs the module product_expiry."
msgstr ""
+"对产品和序列号跟踪不同的日期。\n"
+"下列日期可被跟踪:\n"
+" -寿命终止\n"
+" -最佳使用日期\n"
+" -搬运日期 \n"
+" -提醒日期\n"
+"\n"
+"这需要安装模块 product_expiry."
#. module: stock
#: code:addons/stock/wizard/stock_partial_picking.py:174
#, python-format
msgid "Please provide proper Quantity."
-msgstr ""
+msgstr "请提供适度的数量"
#. module: stock
#: model:ir.actions.report.xml,name:stock.report_product_history
@@ -2842,7 +2862,7 @@ msgstr "库存账簿"
#: code:addons/stock/wizard/stock_return_picking.py:174
#, python-format
msgid "%s-%s-return"
-msgstr ""
+msgstr "%s-%s-返回"
#. module: stock
#: code:addons/stock/wizard/stock_change_product_qty.py:82
@@ -2859,7 +2879,7 @@ msgstr "强制可用"
#. module: stock
#: field:product.template,loc_rack:0
msgid "Rack"
-msgstr ""
+msgstr "货架"
#. module: stock
#: model:ir.actions.act_window,name:stock.move_scrap
@@ -2870,7 +2890,7 @@ msgstr "损耗调拨"
#. module: stock
#: help:stock.move,prodlot_id:0
msgid "Serial number is used to put a serial number on the production"
-msgstr ""
+msgstr "用作在产品上放置一个系列号"
#. module: stock
#: code:addons/stock/wizard/stock_partial_picking.py:100
@@ -2916,7 +2936,7 @@ msgstr "完成日期"
#: code:addons/stock/stock.py:1663
#, python-format
msgid "You cannot move product %s from a location of type view %s."
-msgstr ""
+msgstr "您不能移动产品%s,因为它来自一个视图类型的库位 %s."
#. module: stock
#: model:stock.location,name:stock.stock_location_company
@@ -2978,7 +2998,7 @@ msgstr "实际库存"
#. module: stock
#: field:stock.report.tracklots,tracking_id:0
msgid "Logistic Serial Number"
-msgstr ""
+msgstr "物流系列号"
#. module: stock
#: field:stock.production.lot.revision,date:0
@@ -2998,12 +3018,12 @@ msgstr "批次"
msgid ""
"Total quantity after split exceeds the quantity to split for this product: "
"\"%s\" (id: %d)."
-msgstr ""
+msgstr "产品 \"%s\" (id: %d) 分割后的数量总数超过了这个产品的数量"
#. module: stock
#: view:stock.partial.move.line:0
msgid "Stock Partial Move Line"
-msgstr ""
+msgstr "仓库局部 移库清单"
#. module: stock
#: field:stock.move,product_uos_qty:0
@@ -3025,13 +3045,13 @@ msgstr "联系地址:"
msgid ""
"When you select a serial number on product moves, you can get the upstream "
"or downstream traceability of that product."
-msgstr ""
+msgstr "当您在产品移库单选择了一个系列号,你就能得到该产品的上游或者下游的可追朔性"
#. module: stock
#: code:addons/stock/wizard/stock_partial_picking.py:95
#, python-format
msgid "_Receive"
-msgstr ""
+msgstr "_Receive"
#. module: stock
#: field:stock.incoterms,active:0
@@ -3069,7 +3089,7 @@ msgstr "贸易术语"
#. module: stock
#: model:ir.model,name:stock.model_stock_partial_picking_line
msgid "stock.partial.picking.line"
-msgstr ""
+msgstr "stock.partial.picking.line"
#. module: stock
#: report:lot.stock.overview:0
@@ -3099,6 +3119,14 @@ msgid ""
" \n"
" "
msgstr ""
+"\n"
+" 单击为该产品登记一个收货单。\n"
+"
\n"
+" 这里可以找到该产品相关的所有收货记录,\n"
+" 以及所有你正在等待的来自供应商的\n"
+" 尚未到达的收货单。\n"
+"
\n"
+" "
#. module: stock
#: help:stock.fill.inventory,recursive:0
@@ -3111,7 +3139,7 @@ msgstr "如果选择将包括该库位子库位的产品。"
#: help:stock.config.settings,group_stock_inventory_valuation:0
msgid ""
"Allows to configure inventory valuations on products and product categories."
-msgstr ""
+msgstr "允许在产品或者产品分类配置存货估值。"
#. module: stock
#: help:stock.config.settings,module_stock_location:0
@@ -3163,7 +3191,7 @@ msgstr "修订版名称"
#. module: stock
#: model:res.groups,name:stock.group_tracking_lot
msgid "Manage Logistic Serial Numbers"
-msgstr ""
+msgstr "管理物流系列号"
#. module: stock
#: view:stock.inventory:0
@@ -3186,10 +3214,10 @@ msgid ""
msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:2496
+#: code:addons/stock/stock.py:2501
#, python-format
msgid "%s %s %s has been moved to scrap."
-msgstr ""
+msgstr "%s %s %s 已被 移动到 报废仓."
#. module: stock
#: model:ir.actions.act_window,name:stock.action_picking_tree_out
@@ -3205,6 +3233,7 @@ msgstr "客户包装"
#: selection:stock.move,state:0
#: view:stock.picking:0
#: view:stock.picking.in:0
+#: report:stock.picking.list:0
msgid "Done"
msgstr "完成"
@@ -3242,14 +3271,14 @@ msgstr "如果想生成发票,请在分拣单上填写上业务伙伴."
#. module: stock
#: view:stock.picking.in:0
msgid "Confirm & Receive"
-msgstr ""
+msgstr "确认并接收"
#. module: stock
#: field:stock.picking,origin:0
#: field:stock.picking.in,origin:0
#: field:stock.picking.out,origin:0
msgid "Source Document"
-msgstr ""
+msgstr "源单据"
#. module: stock
#: selection:stock.move,priority:0
@@ -3259,7 +3288,7 @@ msgstr "不紧急"
#. module: stock
#: view:stock.move:0
msgid "Scheduled"
-msgstr ""
+msgstr "排程"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_warehouse_form
@@ -3275,14 +3304,14 @@ msgstr "负责人"
#. module: stock
#: view:stock.move:0
msgid "Process Entirely"
-msgstr ""
+msgstr "处理分录"
#. module: stock
#: help:product.template,property_stock_procurement:0
msgid ""
"This stock location will be used, instead of the default one, as the source "
"location for stock moves generated by procurements."
-msgstr ""
+msgstr "该库位将被使用以替换默认的,同样的,库存移位的源库位将根据需求单生成。"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_stock_inventory_report
@@ -3306,7 +3335,7 @@ msgstr "库存"
#: code:addons/stock/wizard/stock_return_picking.py:222
#, python-format
msgid "Returned Picking"
-msgstr ""
+msgstr "退回的分拣"
#. module: stock
#: model:ir.model,name:stock.model_product_product
@@ -3372,12 +3401,12 @@ msgstr "指定的内部调拨"
#: code:addons/stock/stock.py:790
#, python-format
msgid "You cannot process picking without stock moves."
-msgstr ""
+msgstr "没有移库单,您不能处理分拣。"
#. module: stock
#: field:stock.production.lot,move_ids:0
msgid "Moves for this serial number"
-msgstr ""
+msgstr "该系列号的移库"
#. module: stock
#: field:stock.move,product_uos:0
@@ -3414,7 +3443,7 @@ msgstr "通道(X)"
#. module: stock
#: field:stock.config.settings,group_stock_packaging:0
msgid "Allow to define several packaging methods on products"
-msgstr ""
+msgstr "允许产品定义多种包装方式"
#. module: stock
#: model:stock.location,name:stock.stock_location_7
@@ -3465,7 +3494,7 @@ msgstr "按库位划分产品"
#. module: stock
#: view:stock.config.settings:0
msgid "Logistic"
-msgstr ""
+msgstr "物流"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_location_form
@@ -3550,7 +3579,7 @@ msgstr "激活相关科目"
#. module: stock
#: field:stock.location.product,type:0
msgid "Analyse Type"
-msgstr ""
+msgstr "分析类型"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_picking_tree4
@@ -3582,10 +3611,10 @@ msgstr "全部一次性"
#. module: stock
#: model:ir.actions.act_window,name:stock.act_product_stock_move_open
msgid "Inventory Move"
-msgstr ""
+msgstr "库存调拨"
#. module: stock
-#: code:addons/stock/product.py:475
+#: code:addons/stock/product.py:477
#, python-format
msgid "Future Productions"
msgstr "未来生产"
@@ -3615,7 +3644,7 @@ msgstr ""
#: model:ir.actions.act_window,name:stock.action_stock_config_settings
#: view:stock.config.settings:0
msgid "Configure Warehouse"
-msgstr ""
+msgstr "配置仓库"
#. module: stock
#: view:stock.picking:0
@@ -3643,7 +3672,7 @@ msgstr "盘点日期"
#: model:ir.actions.act_window,name:stock.action_receive_move
#: view:product.product:0
msgid "Receptions"
-msgstr ""
+msgstr "接收"
#. module: stock
#: view:report.stock.move:0
@@ -3678,7 +3707,7 @@ msgstr "公司"
#: field:stock.move.consume,product_uom:0
#: field:stock.move.scrap,product_uom:0
msgid "Product Unit of Measure"
-msgstr ""
+msgstr "产品计量单位"
#. module: stock
#: view:stock.move:0
@@ -3712,7 +3741,7 @@ msgstr "盘点批次"
#: field:stock.report.prodlots,prodlot_id:0
#: field:stock.return.picking.memory,prodlot_id:0
msgid "Serial Number"
-msgstr ""
+msgstr "序列号"
#. module: stock
#: model:ir.model,name:stock.model_stock_partial_picking
@@ -3756,7 +3785,7 @@ msgstr ""
#: field:stock.picking.in,message_ids:0
#: field:stock.picking.out,message_ids:0
msgid "Messages"
-msgstr ""
+msgstr "消息"
#. module: stock
#: model:stock.location,name:stock.stock_location_8
@@ -3772,7 +3801,7 @@ msgstr "非欧洲客户"
#: code:addons/stock/product.py:167
#: code:addons/stock/report/report_stock.py:78
#: code:addons/stock/report/report_stock.py:134
-#: code:addons/stock/stock.py:529
+#: code:addons/stock/stock.py:528
#: code:addons/stock/stock.py:790
#: code:addons/stock/stock.py:1190
#: code:addons/stock/stock.py:1199
@@ -3782,7 +3811,8 @@ msgstr "非欧洲客户"
#: code:addons/stock/stock.py:2252
#: code:addons/stock/stock.py:2255
#: code:addons/stock/stock.py:2258
-#: code:addons/stock/stock.py:2585
+#: code:addons/stock/stock.py:2481
+#: code:addons/stock/stock.py:2590
#: code:addons/stock/wizard/stock_fill_inventory.py:59
#: code:addons/stock/wizard/stock_invoice_onshipping.py:112
#: code:addons/stock/wizard/stock_splitinto.py:53
@@ -3798,6 +3828,10 @@ msgid ""
" \n"
" "
msgstr ""
+"\n"
+" 单击 定义一个新的仓库。\n"
+"
\n"
+" "
#. module: stock
#: selection:report.stock.inventory,state:0
@@ -3834,12 +3868,12 @@ msgstr "这分拣单不需要开发票。"
msgid ""
"The unit of measure rounding does not allow you to ship \"%s %s\", only "
"roundings of \"%s %s\" is accepted by the Unit of Measure."
-msgstr ""
+msgstr "计量单位取整不允许你的运送 \"%s %s\",只有\"%s %s\" 取整才被该计量单位接受。"
#. module: stock
#: model:stock.location,name:stock.stock_location_shop0
msgid "Your Company, Chicago shop"
-msgstr ""
+msgstr "Your Company, Chicago shop"
#. module: stock
#: selection:report.stock.move,type:0
@@ -3877,12 +3911,12 @@ msgstr ""
msgid ""
"By changing this quantity here, you accept the new quantity as complete: "
"OpenERP will not automatically generate a back order."
-msgstr ""
+msgstr "通过修改此处的数量,就是您已经收到完成的数量: OpenERP 将自动生成一个延期交货清单。"
#. module: stock
#: view:stock.production.lot.revision:0
msgid "Serial Number Revisions"
-msgstr ""
+msgstr "序列号修订版"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_picking_tree
@@ -3900,7 +3934,7 @@ msgstr "送货单已处理"
#. module: stock
#: field:product.template,loc_case:0
msgid "Case"
-msgstr ""
+msgstr "案例"
#. module: stock
#: selection:report.stock.inventory,state:0
@@ -3941,10 +3975,10 @@ msgstr "这选项允许这库位能不能放置废料"
#: field:stock.picking.in,message_follower_ids:0
#: field:stock.picking.out,message_follower_ids:0
msgid "Followers"
-msgstr ""
+msgstr "关注者"
#. module: stock
-#: code:addons/stock/stock.py:2585
+#: code:addons/stock/stock.py:2590
#, python-format
msgid "Cannot consume a move with negative or zero quantity."
msgstr ""
@@ -3954,7 +3988,7 @@ msgstr ""
msgid ""
"As an example, a decimal precision of 2 will allow weights like: 9.99 kg, "
"whereas a decimal precision of 4 will allow weights like: 0.0231 kg."
-msgstr ""
+msgstr "作为一个例子,十进制精度为2允许重量是这样的:9.99千克,而一个十进制精度为4,将允许重量是这样的,如:0.0231千克。"
#. module: stock
#: view:report.stock.move:0
@@ -3967,7 +4001,7 @@ msgstr "总出库数量"
#: field:stock.picking.in,backorder_id:0
#: field:stock.picking.out,backorder_id:0
msgid "Back Order of"
-msgstr "分单"
+msgstr "之延期交货清单。"
#. module: stock
#: help:stock.partial.move.line,cost:0
@@ -3987,7 +4021,7 @@ msgstr "产品类别"
#. module: stock
#: view:stock.move:0
msgid "Serial Number"
-msgstr ""
+msgstr "序列号"
#. module: stock
#: view:stock.invoice.onshipping:0
@@ -4007,7 +4041,7 @@ msgstr "设置"
#. module: stock
#: model:res.groups,name:stock.group_locations
msgid "Manage Multiple Locations and Warehouses"
-msgstr ""
+msgstr "管理多个库位和仓库"
#. module: stock
#: help:stock.change.standard.price,new_price:0
@@ -4022,10 +4056,10 @@ msgstr ""
"如果成本价减少,库存核算科目为贷方,入库科目为借方。"
#. module: stock
-#: code:addons/stock/stock.py:2811
+#: code:addons/stock/stock.py:2816
#, python-format
msgid "INV:"
-msgstr ""
+msgstr "INV:"
#. module: stock
#: help:stock.config.settings,module_stock_invoice_directly:0
@@ -4074,7 +4108,7 @@ msgstr ""
"用于实时库存核算。当设定在一个虚拟库位(而不是内部类型)时,这科目将用于记录从内部库位调拨产品的估值。一般代替这产品的出库科目。它不影响内部库位。"
#. module: stock
-#: code:addons/stock/product.py:457
+#: code:addons/stock/product.py:459
#, python-format
msgid "Future Deliveries"
msgstr "未来送货"
@@ -4100,7 +4134,7 @@ msgstr "自动审核"
#: code:addons/stock/stock.py:1821
#, python-format
msgid "Insufficient Stock for Serial Number !"
-msgstr ""
+msgstr "该序列号的库存不足!"
#. module: stock
#: model:ir.model,name:stock.model_product_template
@@ -4144,13 +4178,13 @@ msgstr "字段用于记录用户确认在分拣期间所用的币别(用于计
#. module: stock
#: help:stock.production.lot,name:0
msgid "Unique Serial Number, will be displayed as: PREFIX/SERIAL [INT_REF]"
-msgstr ""
+msgstr "唯一序列号将被显示为: PREFIX/SERIAL [INT_REF]"
#. module: stock
#: code:addons/stock/product.py:142
#, python-format
msgid "Please define stock input account for this product: \"%s\" (id: %d)."
-msgstr ""
+msgstr "请为产品 \"%s\" (id: %d) 定义一个入库科目。"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_reception_picking_move
@@ -4161,7 +4195,7 @@ msgstr "入库产品"
#. module: stock
#: view:product.product:0
msgid "update"
-msgstr ""
+msgstr "更新"
#. module: stock
#: view:stock.change.product.qty:0
@@ -4180,7 +4214,7 @@ msgstr ""
#: view:stock.return.picking:0
#: view:stock.split.into:0
msgid "or"
-msgstr ""
+msgstr "或"
#. module: stock
#: selection:stock.picking,invoice_state:0
@@ -4232,7 +4266,7 @@ msgstr "自动分拣"
#. module: stock
#: report:stock.picking.list:0
msgid "Customer Address :"
-msgstr ""
+msgstr "客户地址:"
#. module: stock
#: field:stock.location,chained_auto_packing:0
@@ -4288,7 +4322,7 @@ msgstr "你真的要合并盘点?"
#. module: stock
#: view:stock.picking.out:0
msgid "Date of Delivery"
-msgstr ""
+msgstr "发运日期"
#. module: stock
#: field:stock.location,posy:0
@@ -4301,18 +4335,18 @@ msgstr "货架(Y)"
msgid ""
"Please define inventory valuation account on the product category: \"%s\" "
"(id: %d)"
-msgstr ""
+msgstr "请在产品类别 \"%s\" (id: %d) 中定义一个存货估值 科目"
#. module: stock
#: model:ir.model,name:stock.model_stock_production_lot_revision
msgid "Serial Number Revision"
-msgstr ""
+msgstr "序列号版本"
#. module: stock
#: code:addons/stock/product.py:96
#, python-format
msgid "Specify valuation Account for Product Category: %s."
-msgstr ""
+msgstr "为产品分类 %s 指定估值科目。"
#. module: stock
#: help:stock.config.settings,module_claim_from_delivery:0
@@ -4320,12 +4354,14 @@ msgid ""
"Adds a Claim link to the delivery order.\n"
" This installs the module claim_from_delivery."
msgstr ""
+"为发运单添加一个 索赔链接。\n"
+"这需要安装模块claim_from_delivery."
#. module: stock
#: code:addons/stock/wizard/stock_return_picking.py:208
#, python-format
msgid "Please specify at least one non-zero quantity."
-msgstr ""
+msgstr "请指定至少一个非0的数值。"
#. module: stock
#: field:stock.fill.inventory,set_stock_zero:0
@@ -4340,7 +4376,7 @@ msgstr "用户"
#. module: stock
#: field:stock.config.settings,module_stock_location:0
msgid "Create push/pull logistic rules"
-msgstr ""
+msgstr "创建推拉物流规则"
#. module: stock
#: code:addons/stock/wizard/stock_invoice_onshipping.py:98
@@ -4355,7 +4391,7 @@ msgid "November"
msgstr "11月"
#. module: stock
-#: code:addons/stock/product.py:471
+#: code:addons/stock/product.py:473
#, python-format
msgid "Unplanned Qty"
msgstr "计划外数量"
@@ -4379,7 +4415,7 @@ msgstr "1月"
#. module: stock
#: constraint:stock.move:0
msgid "You cannot move products from or to a location of the type view."
-msgstr ""
+msgstr "不能将视图类型的库位作为移库单的源库位或者目标库位"
#. module: stock
#: help:stock.config.settings,group_stock_production_lot:0
@@ -4394,7 +4430,7 @@ msgstr ""
#, python-format
msgid ""
"No product in this location. Please select a location in the product form."
-msgstr ""
+msgstr "该库位没有产品。请从产品表单选择一个库位。"
#. module: stock
#: model:ir.actions.act_window,name:stock.act_product_stock_move_futur_open
@@ -4407,7 +4443,7 @@ msgid "Move History (parent moves)"
msgstr "调拨日志(上级调拨)"
#. module: stock
-#: code:addons/stock/product.py:453
+#: code:addons/stock/product.py:455
#, python-format
msgid "Future Stock"
msgstr "未来库存"
@@ -4462,7 +4498,7 @@ msgstr "库位"
msgid ""
"If this shipment was split, then this field links to the shipment which "
"contains the already processed part."
-msgstr ""
+msgstr "如果这个装运单被分割,该字段将连接到包括了已经处理的部分的装运单。"
#. module: stock
#: view:stock.inventory:0
@@ -4481,7 +4517,7 @@ msgstr "前缀"
#: view:stock.move:0
#: view:stock.move.split:0
msgid "Split in Serial Numbers"
-msgstr ""
+msgstr "分开进系列号"
#. module: stock
#: help:product.template,property_stock_account_input:0
@@ -4524,12 +4560,12 @@ msgstr "指定包装的属性如数量,类型等"
#. module: stock
#: view:product.product:0
msgid "Delays"
-msgstr ""
+msgstr "延迟"
#. module: stock
#: report:stock.picking.list:0
msgid "Schedule Date"
-msgstr ""
+msgstr "预定日期"
#. module: stock
#: field:stock.location.product,to_date:0
@@ -4580,7 +4616,7 @@ msgstr "5月"
#: code:addons/stock/product.py:110
#, python-format
msgid "No difference between standard price and new price!"
-msgstr ""
+msgstr "标准价和新价格之间没有不同!"
#. module: stock
#: view:stock.picking.out:0
@@ -4595,7 +4631,7 @@ msgstr "送货"
#. module: stock
#: view:stock.fill.inventory:0
msgid "Import the current inventory"
-msgstr ""
+msgstr "导入当前库存清单"
#. module: stock
#: model:ir.actions.act_window,name:stock.action5
@@ -4609,7 +4645,7 @@ msgid "Location Content"
msgstr "库位包含"
#. module: stock
-#: code:addons/stock/product.py:477
+#: code:addons/stock/product.py:479
#, python-format
msgid "Produced Qty"
msgstr "产品数量"
@@ -4631,7 +4667,7 @@ msgstr "连锁库位类型"
#: help:stock.picking.in,min_date:0
#: help:stock.picking.out,min_date:0
msgid "Scheduled time for the shipment to be processed"
-msgstr ""
+msgstr "该装运单被处理的计划时间"
#. module: stock
#: selection:report.stock.inventory,location_type:0
@@ -4676,19 +4712,19 @@ msgstr ""
#. module: stock
#: view:stock.picking.in:0
msgid "Date of Reception"
-msgstr ""
+msgstr "接收的日期"
#. module: stock
#: help:stock.config.settings,group_stock_multiple_locations:0
msgid ""
"This allows to configure and use multiple stock locations and warehouses,\n"
" instead of having a single default one."
-msgstr ""
+msgstr "允许配置和使用多个库位和仓库,替换默认的一个。"
#. module: stock
#: view:stock.picking:0
msgid "Confirm & Transfer"
-msgstr ""
+msgstr "确认并传递"
#. module: stock
#: field:stock.location,scrap_location:0
@@ -4734,6 +4770,12 @@ msgid ""
" \n"
" "
msgstr ""
+"\n"
+" 点击以创建一个送货单. \n"
+"
\n"
+" 这里是所有送货单的列表,它们是根据不同的销售订单和物流规则 被准备好的。\n"
+"
\n"
+" "
#. module: stock
#: help:stock.tracking,name:0
@@ -4799,7 +4841,7 @@ msgstr "准备处理"
#. module: stock
#: report:stock.picking.list:0
msgid "Warehouse Address :"
-msgstr ""
+msgstr "仓库地址:"
#~ msgid "["
#~ msgstr "["