From dca92e2cc152733c9c6b928ca527b4ff74023d1d Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Fri, 7 Oct 2011 17:37:19 +0200 Subject: [PATCH 01/28] [FIX] share: correct default value bzr revid: chs@openerp.com-20111007153719-2lq8ntxom3y8g2xj --- addons/share/wizard/share_wizard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/share/wizard/share_wizard.py b/addons/share/wizard/share_wizard.py index b66ccc2dd47..bee96b882b8 100644 --- a/addons/share/wizard/share_wizard.py +++ b/addons/share/wizard/share_wizard.py @@ -134,7 +134,7 @@ class share_wizard(osv.osv_memory): 'message': fields.text("Personal Message", help="An optional personal message, to be included in the e-mail notification."), } _defaults = { - 'user_type' : 'new', + 'user_type' : 'emails', 'domain': lambda self, cr, uid, context, *a: context.get('domain', '[]'), 'share_root_url': lambda self, cr, uid, context, *a: context.get('share_root_url') or _('Please specify "share_root_url" in context'), 'action_id': lambda self, cr, uid, context, *a: context.get('action_id'), From a1e57977275af752c2b8e9c9c644523fbeb7425b Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 10 Oct 2011 16:25:49 +0200 Subject: [PATCH 02/28] [FIX] share+portal: fix share wizard. [IMP] share wizard: share_root_url and share_url are now function fields bzr revid: chs@openerp.com-20111010142549-uvco15xdf2198e0x --- addons/portal/wizard/share_wizard.py | 4 -- addons/portal/wizard/share_wizard_view.xml | 6 +-- addons/share/wizard/share_wizard.py | 53 ++++++++++------------ addons/share/wizard/share_wizard_view.xml | 8 +++- 4 files changed, 32 insertions(+), 39 deletions(-) diff --git a/addons/portal/wizard/share_wizard.py b/addons/portal/wizard/share_wizard.py index c1366b5dbf0..ab639bdeccc 100644 --- a/addons/portal/wizard/share_wizard.py +++ b/addons/portal/wizard/share_wizard.py @@ -40,10 +40,6 @@ class share_wizard_portal(osv.osv_memory): _columns = { 'user_ids': fields.many2many('res.users', 'share_wizard_res_user_rel', 'share_id', 'user_id', 'Existing users', domain=[('share', '=', True)]), 'group_ids': fields.many2many('res.groups', 'share_wizard_res_group_rel', 'share_id', 'group_id', 'Existing groups', domain=[('share', '=', False)]), - - # no clean way to extend selection yet, copy the field. - 'user_type': fields.selection(_user_type_selection,'Users to share with', - help="Select the type of user(s) you would like to share data with."), } def is_portal_manager(self, cr, uid, context=None): diff --git a/addons/portal/wizard/share_wizard_view.xml b/addons/portal/wizard/share_wizard_view.xml index f16334b68a3..9bee027c3e2 100644 --- a/addons/portal/wizard/share_wizard_view.xml +++ b/addons/portal/wizard/share_wizard_view.xml @@ -8,11 +8,7 @@ form - - - - - + diff --git a/addons/share/wizard/share_wizard.py b/addons/share/wizard/share_wizard.py index bee96b882b8..82eb814e54a 100644 --- a/addons/share/wizard/share_wizard.py +++ b/addons/share/wizard/share_wizard.py @@ -119,24 +119,35 @@ class share_wizard(osv.osv_memory): values['name'] = action.name return super(share_wizard,self).create(cr, uid, values, context=context) + + def _share_root_url(self, cr, uid, ids, _fieldname, _args, context=None): + result = dict.fromkeys(ids, '') + data = dict(dbname=cr.dbname, login='', password='') + for this in self.browse(cr, uid, ids, context=context): + result[this.id] = this.share_url_template % data + return result + _columns = { 'action_id': fields.many2one('ir.actions.act_window', 'Action to share', required=True, help="The action that opens the screen containing the data you wish to share."), 'domain': fields.char('Domain', size=256, help="Optional domain for further data filtering"), - 'user_type': fields.selection(_user_type_selection,'Users to share with', + 'user_type': fields.selection(lambda s, *a, **k: s._user_type_selection(*a, **k),'Users to share with', required=True, help="Select the type of user(s) you would like to share data with."), 'new_users': fields.text("Emails"), 'access_mode': fields.selection([('readonly','Can view'),('readwrite','Can edit')],'Access Mode', required=True, help="Access rights to be granted on the shared documents."), 'result_line_ids': fields.one2many('share.wizard.result.line', 'share_wizard_id', 'Summary', readonly=True), - 'share_root_url': fields.char('Share Access URL', size=512, readonly=True, tooltip='Main access page for users that are granted shared access'), + 'share_url_template': fields.char('Share Access URL Template', size=512, + help='Template for share url. May contains %(dbname)s, %(login)s and %(password)s'), + 'share_root_url': fields.function(_share_root_url, 'Share Access URL', type='char', size=512, readonly=True, + help='Main access page for users that are granted shared access'), 'name': fields.char('Share Title', size=64, required=True, help="Title for the share (displayed to users as menu and shortcut name)"), 'message': fields.text("Personal Message", help="An optional personal message, to be included in the e-mail notification."), } _defaults = { 'user_type' : 'emails', 'domain': lambda self, cr, uid, context, *a: context.get('domain', '[]'), - 'share_root_url': lambda self, cr, uid, context, *a: context.get('share_root_url') or _('Please specify "share_root_url" in context'), + 'share_url_template': lambda self, cr, uid, context, *a: context.get('share_url_template') or _('Please specify "share_url_template" in context'), 'action_id': lambda self, cr, uid, context, *a: context.get('action_id'), 'access_mode': 'readonly', } @@ -537,12 +548,11 @@ class share_wizard(osv.osv_memory): try: domain = safe_eval(wizard_data.domain) if domain: - domain_expr = expression.expression(domain) for rel_field, model in fields_relations: related_domain = [] if not rel_field: continue for element in domain: - if domain_expr._is_leaf(element): + if expression.is_leaf(element): left, operator, right = element left = '%s.%s'%(rel_field, left) element = left, operator, right @@ -555,19 +565,6 @@ class share_wizard(osv.osv_memory): raise osv.except_osv(_('Sharing access could not be created'), _('Sorry, the current screen and filter you are trying to share are not supported at the moment.\nYou may want to try a simpler filter.')) - def _finish_result_lines(self, cr, uid, wizard_data, share_group_id, context=None): - """Perform finalization of the share, and populate the summary""" - share_root_url = wizard_data.share_root_url - format_url = '%(dbname)s' in share_root_url - for result in wizard_data.result_line_ids: - # share_root_url may contain placeholders for dbname, login and password - share_url = (share_root_url % \ - {'login': quote_plus(result.user_id.login), - 'password': '', # kept empty for security reasons - 'dbname': quote_plus(cr.dbname)}) \ - if format_url else share_root_url - result.write({'share_url': share_url}, context=context) - def _check_preconditions(self, cr, uid, wizard_data, context=None): self._assert(wizard_data.action_id and wizard_data.access_mode, _('Action and Access Mode are required to create a shared access'), @@ -662,15 +659,6 @@ class share_wizard(osv.osv_memory): # C. self._create_indirect_sharing_rules(cr, current_user, wizard_data, group_id, obj1, context=context) - # so far, so good -> check summary results and return them - self._finish_result_lines(cr, uid, wizard_data, group_id, context=context) - - # update share URL to make it generic - generic_share_url = wizard_data.share_root_url % {'dbname': cr.dbname, - 'login': '', - 'password': ''} - wizard_data.write({'share_root_url': generic_share_url}, context=context) - # refresh wizard_data wizard_data = self.browse(cr, uid, ids[0], context=context) @@ -742,11 +730,20 @@ share_wizard() class share_result_line(osv.osv_memory): _name = 'share.wizard.result.line' _rec_name = 'user_id' + + + def _share_url(self, cr, uid, ids, _fieldname, _args, context=None): + result = dict.fromkeys(ids, '') + for this in self.browse(cr, uid, ids, context=context): + data = dict(dbname=cr.dbname, login=this.login, password='') # password is kept empty for security reasons + result[this.id] = this.share_wizard_id.share_url_template % data + return result + _columns = { 'user_id': fields.many2one('res.users', required=True, readonly=True), 'login': fields.related('user_id', 'login', string='Login', type='char', size=64, required=True, readonly=True), 'password': fields.char('Password', size=64, readonly=True), - 'share_url': fields.char('Share URL', size=512, required=True), + 'share_url': fields.function(_share_url, 'Share URL', type='char', size=512), 'share_wizard_id': fields.many2one('share.wizard', 'Share Wizard', required=True), 'newly_created': fields.boolean('Newly created', readonly=True), } diff --git a/addons/share/wizard/share_wizard_view.xml b/addons/share/wizard/share_wizard_view.xml index 5087b85d7bd..dedb7c7f4bc 100644 --- a/addons/share/wizard/share_wizard_view.xml +++ b/addons/share/wizard/share_wizard_view.xml @@ -29,6 +29,10 @@ form
+ + + + @@ -78,7 +82,7 @@ - 'action_id' (id of action) - 'domain' (string expression for full domain to apply as sent to server, with dynamic data like 'uid' replaced by actual value (i.e. after eval)!) - - 'share_root_url' : URL for direct access to share page (may include %(login)s and %(password)s placeholders) + - 'share_url_template' : URL for direct access to share page (may include %(login)s and %(password)s placeholders) --> Share Wizard @@ -94,7 +98,7 @@ - 'action_id' (id of action) - 'domain' (string expression for full domain to apply as sent to server, with dynamic data like 'uid' replaced by actual value (i.e. after eval)!) - - 'share_root_url' : URL for direct access to share page (may include %(login)s and %(password)s placeholders) + - 'share_url_template' : URL for direct access to share page (may include %(login)s and %(password)s placeholders) --> Share Wizard From cb7cc66a2e53c325fce682346b7930648f8f16a5 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 10 Oct 2011 16:29:53 +0200 Subject: [PATCH 03/28] [IMP] share: convert web part to v6.1 bzr revid: chs@openerp.com-20111010142953-90ylj17cc1416o5f --- addons/share/__openerp__.py | 7 +- addons/share/static/src/css/share.css | 5 ++ addons/share/static/src/js/share.js | 43 ++++++++++++ addons/share/web/__init__.py | 2 - addons/share/web/controllers.py | 49 -------------- addons/share/web/editors.py | 94 --------------------------- 6 files changed, 53 insertions(+), 147 deletions(-) create mode 100644 addons/share/static/src/css/share.css create mode 100644 addons/share/static/src/js/share.js delete mode 100644 addons/share/web/__init__.py delete mode 100644 addons/share/web/controllers.py delete mode 100644 addons/share/web/editors.py diff --git a/addons/share/__openerp__.py b/addons/share/__openerp__.py index f6a0c93285d..ec026742f87 100644 --- a/addons/share/__openerp__.py +++ b/addons/share/__openerp__.py @@ -3,6 +3,7 @@ # # OpenERP, Open Source Management Solution # Copyright (C) 2004-2010 Tiny SPRL (). +# Copyright (C) 2010-2011 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 @@ -22,7 +23,7 @@ { "name" : "Web Share", - "version" : "1.5", + "version" : "2.0", "depends" : ["base", "mail"], "author" : "OpenERP SA", "category": 'Hidden', @@ -53,7 +54,9 @@ synchronization with other companies, etc. 'installable': True, 'web': True, 'certificate' : '001301246528927038493', - 'images': ['images/share_wizard.jpeg','images/sharing_wizard_step1.jpeg', 'images/sharing_wizard_step2.jpeg'], + 'js': ['static/src/js/share.js'], + 'css': ['static/src/css/share.css'], + 'images': ['static/src/img/share_wizard.jpeg','static/src/img/sharing_wizard_step1.jpeg', 'static/src/img/sharing_wizard_step2.jpeg'], } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/share/static/src/css/share.css b/addons/share/static/src/css/share.css new file mode 100644 index 00000000000..781bfe197f1 --- /dev/null +++ b/addons/share/static/src/css/share.css @@ -0,0 +1,5 @@ + +.openerp li.oe_share { + background: url(../img/share.png) no-repeat; + padding-left: 20px; +} diff --git a/addons/share/static/src/js/share.js b/addons/share/static/src/js/share.js new file mode 100644 index 00000000000..8a8294d0f12 --- /dev/null +++ b/addons/share/static/src/js/share.js @@ -0,0 +1,43 @@ + +openerp.share = function(instance) { + +instance.web.Sidebar = instance.web.Sidebar.extend({ + + add_default_sections: function() { + this._super(); + this.add_items('Sharing', [{ + label: 'Share', + callback: this.on_sidebar_click_share, + classname: 'oe_share', + }]); + }, + + on_sidebar_click_share: function(item) { + var self = this; + var view = this.widget_parent + var action = view.widget_parent.action; + + var share_url_template = _('%s//%s/?db=%%(dbname)s&login=%%(login)s').sprintf(document.location.protocol, document.location.host); + var Share = new instance.web.DataSet(this, 'share.wizard', view.dataset.get_context()); + + Share.create({ + name: action.name, + domain: view.dataset.domain, + action_id: action.id, + share_url_template: share_url_template, + }, function(result) { + var share_id = result.result; + console.log('share_id', share_id); + + var step1 = Share.call('go_step_1', [[share_id],], function(result) { + var action = result; + console.log('step1', action); + self.do_action(action); + }); + }); + + }, + +}); + +}; diff --git a/addons/share/web/__init__.py b/addons/share/web/__init__.py deleted file mode 100644 index f95bb222c10..00000000000 --- a/addons/share/web/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -import controllers -import editors \ No newline at end of file diff --git a/addons/share/web/controllers.py b/addons/share/web/controllers.py deleted file mode 100644 index e682c8d9709..00000000000 --- a/addons/share/web/controllers.py +++ /dev/null @@ -1,49 +0,0 @@ -import urlparse -import cherrypy - -from openobject import rpc -from openobject.tools import expose, ast - -import openerp.controllers - - - -class ShareWizardController(openerp.controllers.SecuredController): - _cp_path = "/share" - - @expose() - def index(self, domain, context, view_id, search_domain='[]', action_id=None): - context = ast.literal_eval(context) - - if not action_id: - # This should not be needed anymore, but just in case users are - # running the module with an older version of the web client... - - # to remove soon-ish - action_id = rpc.RPCProxy('ir.actions.act_window').search( - [('view_id','=',int(view_id))], context=context) - if not action_id: return "" - - action_id = action_id[0] - - domain = ast.literal_eval(domain) - domain.extend(ast.literal_eval(search_domain)) - - scheme, netloc, _, _, _ = urlparse.urlsplit(cherrypy.request.base) - share_root_url = urlparse.urlunsplit(( - scheme, netloc, '/openerp/login', - 'db=%(dbname)s&user=%(login)s&password=%(password)s', '')) - - context.update( - #active_ids=share_wiz_id, - #active_id=share_wiz_id[0], - _terp_view_name='Share Wizard', - share_root_url=share_root_url) - Share = rpc.RPCProxy('share.wizard') - sharing_view_id = Share.create({ - 'domain': str(domain), - 'action_id': action_id and int(action_id) - }, context) - return openerp.controllers.actions.execute( - Share.go_step_1([sharing_view_id], context), - ids=[sharing_view_id], context=context) diff --git a/addons/share/web/editors.py b/addons/share/web/editors.py deleted file mode 100644 index 677de4a8317..00000000000 --- a/addons/share/web/editors.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: utf-8 -*- -import openobject.templating - -class FormEditor(openobject.templating.TemplateEditor): - templates = ['/openerp/controllers/templates/form.mako'] - MAIN_FORM_BODY = u'id="main_form_body"' - - def insert_share_button(self, output): - # Insert the share button on the form title H1 line, at the very end, - # but only if the user is a member of the sharing group - share_opener_insertion = output.index('% endif', output.index( - '/view_diagram/process', - output.index(self.MAIN_FORM_BODY))) + len('% endif') - return output[:share_opener_insertion] + ''' - <% - if 'has_share' not in cp.session: - cp.session['has_share'] = rpc.RPCProxy('share.wizard').has_share() - %> - % if cp.session['has_share'] and buttons.toolbar and not is_dashboard: - - - - - \n - % endif -''' + output[share_opener_insertion:] - - def edit(self, template, template_text): - return self.insert_share_button( - super(FormEditor, self).edit(template, template_text)) - - -class SidebarEditor(openobject.templating.TemplateEditor): - templates = ['/openerp/widgets/templates/sidebar.mako'] - ADD_SHARE_SECTION = u'id="sidebar"' - - def insert_share_link(self, output): - # Insert the link on the line, right after the link to open the - # attachment form, but only if the user is a member of the sharing group - share_opener_insertion = output.index( - '\n', - output.index(self.ADD_SHARE_SECTION)) + 1 - return output[:share_opener_insertion] + ''' - <% - if 'has_share' not in cp.session: - cp.session['has_share'] = rpc.RPCProxy('share.wizard').has_share() - %> - % if cp.session['has_share']: -

${_("Sharing")}

- - - \n - % endif -''' + output[share_opener_insertion:] - - def edit(self, template, template_text): - return self.insert_share_link( - super(SidebarEditor, self).edit(template, template_text)) From b46ef4b9605c0b276dfa51779a873c6deb2c9289 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 10 Oct 2011 16:54:06 +0200 Subject: [PATCH 04/28] [FIX] share: correct function fields labels bzr revid: chs@openerp.com-20111010145406-0k4au407iwv9e31n --- addons/share/wizard/share_wizard.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/share/wizard/share_wizard.py b/addons/share/wizard/share_wizard.py index 82eb814e54a..20f175b1e0b 100644 --- a/addons/share/wizard/share_wizard.py +++ b/addons/share/wizard/share_wizard.py @@ -139,7 +139,7 @@ class share_wizard(osv.osv_memory): 'result_line_ids': fields.one2many('share.wizard.result.line', 'share_wizard_id', 'Summary', readonly=True), 'share_url_template': fields.char('Share Access URL Template', size=512, help='Template for share url. May contains %(dbname)s, %(login)s and %(password)s'), - 'share_root_url': fields.function(_share_root_url, 'Share Access URL', type='char', size=512, readonly=True, + 'share_root_url': fields.function(_share_root_url, string='Share Access URL', type='char', size=512, readonly=True, help='Main access page for users that are granted shared access'), 'name': fields.char('Share Title', size=64, required=True, help="Title for the share (displayed to users as menu and shortcut name)"), 'message': fields.text("Personal Message", help="An optional personal message, to be included in the e-mail notification."), @@ -743,7 +743,7 @@ class share_result_line(osv.osv_memory): 'user_id': fields.many2one('res.users', required=True, readonly=True), 'login': fields.related('user_id', 'login', string='Login', type='char', size=64, required=True, readonly=True), 'password': fields.char('Password', size=64, readonly=True), - 'share_url': fields.function(_share_url, 'Share URL', type='char', size=512), + 'share_url': fields.function(_share_url, string='Share URL', type='char', size=512), 'share_wizard_id': fields.many2one('share.wizard', 'Share Wizard', required=True), 'newly_created': fields.boolean('Newly created', readonly=True), } From 0b803c6852af147c6f423d11754ccff88259b931 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 13 Oct 2011 17:33:02 +0200 Subject: [PATCH 05/28] [IMP] share: put the sidebar item in the "Other Options" section bzr revid: chs@openerp.com-20111013153302-ts5yds22n15zdb4h --- addons/share/static/src/js/share.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/share/static/src/js/share.js b/addons/share/static/src/js/share.js index 8a8294d0f12..96ff5dc4dd6 100644 --- a/addons/share/static/src/js/share.js +++ b/addons/share/static/src/js/share.js @@ -5,7 +5,7 @@ instance.web.Sidebar = instance.web.Sidebar.extend({ add_default_sections: function() { this._super(); - this.add_items('Sharing', [{ + this.add_items('other', [{ label: 'Share', callback: this.on_sidebar_click_share, classname: 'oe_share', From 9f964ca29d1fbf334c8bde793936822a2d1cddd7 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Fri, 14 Oct 2011 11:43:24 +0200 Subject: [PATCH 06/28] [IMP] share: share_url_template is read from ir_config_parameter bzr revid: chs@openerp.com-20111014094324-wpj3265vwinel3rj --- addons/share/static/src/js/share.js | 2 -- addons/share/wizard/share_wizard.py | 17 ++++++++++------- addons/share/wizard/share_wizard_view.xml | 2 -- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/addons/share/static/src/js/share.js b/addons/share/static/src/js/share.js index 96ff5dc4dd6..68df8eec878 100644 --- a/addons/share/static/src/js/share.js +++ b/addons/share/static/src/js/share.js @@ -17,14 +17,12 @@ instance.web.Sidebar = instance.web.Sidebar.extend({ var view = this.widget_parent var action = view.widget_parent.action; - var share_url_template = _('%s//%s/?db=%%(dbname)s&login=%%(login)s').sprintf(document.location.protocol, document.location.host); var Share = new instance.web.DataSet(this, 'share.wizard', view.dataset.get_context()); Share.create({ name: action.name, domain: view.dataset.domain, action_id: action.id, - share_url_template: share_url_template, }, function(result) { var share_id = result.result; console.log('share_id', share_id); diff --git a/addons/share/wizard/share_wizard.py b/addons/share/wizard/share_wizard.py index 20f175b1e0b..1cd8104100c 100644 --- a/addons/share/wizard/share_wizard.py +++ b/addons/share/wizard/share_wizard.py @@ -119,12 +119,18 @@ class share_wizard(osv.osv_memory): values['name'] = action.name return super(share_wizard,self).create(cr, uid, values, context=context) + def share_url_template(self, cr, uid, _ids, context=None): + # NOTE: take _ids in parameter to allow usage through browse_record objects + base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', default='', context=context) + if base_url: + base_url += '/?db=%(dbname)s&login=%(login)s' + return base_url def _share_root_url(self, cr, uid, ids, _fieldname, _args, context=None): result = dict.fromkeys(ids, '') - data = dict(dbname=cr.dbname, login='', password='') + data = dict(dbname=cr.dbname, login='') for this in self.browse(cr, uid, ids, context=context): - result[this.id] = this.share_url_template % data + result[this.id] = this.share_url_template() % data return result _columns = { @@ -137,8 +143,6 @@ class share_wizard(osv.osv_memory): 'access_mode': fields.selection([('readonly','Can view'),('readwrite','Can edit')],'Access Mode', required=True, help="Access rights to be granted on the shared documents."), 'result_line_ids': fields.one2many('share.wizard.result.line', 'share_wizard_id', 'Summary', readonly=True), - 'share_url_template': fields.char('Share Access URL Template', size=512, - help='Template for share url. May contains %(dbname)s, %(login)s and %(password)s'), 'share_root_url': fields.function(_share_root_url, string='Share Access URL', type='char', size=512, readonly=True, help='Main access page for users that are granted shared access'), 'name': fields.char('Share Title', size=64, required=True, help="Title for the share (displayed to users as menu and shortcut name)"), @@ -147,7 +151,6 @@ class share_wizard(osv.osv_memory): _defaults = { 'user_type' : 'emails', 'domain': lambda self, cr, uid, context, *a: context.get('domain', '[]'), - 'share_url_template': lambda self, cr, uid, context, *a: context.get('share_url_template') or _('Please specify "share_url_template" in context'), 'action_id': lambda self, cr, uid, context, *a: context.get('action_id'), 'access_mode': 'readonly', } @@ -735,8 +738,8 @@ class share_result_line(osv.osv_memory): def _share_url(self, cr, uid, ids, _fieldname, _args, context=None): result = dict.fromkeys(ids, '') for this in self.browse(cr, uid, ids, context=context): - data = dict(dbname=cr.dbname, login=this.login, password='') # password is kept empty for security reasons - result[this.id] = this.share_wizard_id.share_url_template % data + data = dict(dbname=cr.dbname, login=this.login) + result[this.id] = this.share_wizard_id.share_url_template() % data return result _columns = { diff --git a/addons/share/wizard/share_wizard_view.xml b/addons/share/wizard/share_wizard_view.xml index dedb7c7f4bc..128b32b07da 100644 --- a/addons/share/wizard/share_wizard_view.xml +++ b/addons/share/wizard/share_wizard_view.xml @@ -82,7 +82,6 @@ - 'action_id' (id of action) - 'domain' (string expression for full domain to apply as sent to server, with dynamic data like 'uid' replaced by actual value (i.e. after eval)!) - - 'share_url_template' : URL for direct access to share page (may include %(login)s and %(password)s placeholders) --> Share Wizard @@ -98,7 +97,6 @@ - 'action_id' (id of action) - 'domain' (string expression for full domain to apply as sent to server, with dynamic data like 'uid' replaced by actual value (i.e. after eval)!) - - 'share_url_template' : URL for direct access to share page (may include %(login)s and %(password)s placeholders) --> Share Wizard From 5de33e50224033523288fba1593da2ef5f706e9a Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Fri, 14 Oct 2011 14:12:12 +0200 Subject: [PATCH 07/28] [IMP] share bzr revid: chs@openerp.com-20111014121212-zyipo1v68rm7f64c --- addons/share/static/src/css/share.css | 10 ++- addons/share/static/src/js/share.js | 100 +++++++++++++++++++------- 2 files changed, 84 insertions(+), 26 deletions(-) diff --git a/addons/share/static/src/css/share.css b/addons/share/static/src/css/share.css index 781bfe197f1..3b47a065b1e 100644 --- a/addons/share/static/src/css/share.css +++ b/addons/share/static/src/css/share.css @@ -1,5 +1,13 @@ -.openerp li.oe_share { +.openerp li.oe-share { background: url(../img/share.png) no-repeat; padding-left: 20px; } + +.openerp a.oe-share { + background: url(../img/share.png) no-repeat; + display: block; + float: left; + width: 20px; + height: 20px; +} diff --git a/addons/share/static/src/js/share.js b/addons/share/static/src/js/share.js index 68df8eec878..391d2ceb1b2 100644 --- a/addons/share/static/src/js/share.js +++ b/addons/share/static/src/js/share.js @@ -1,41 +1,91 @@ openerp.share = function(instance) { +var QWeb = instance.web.qweb; +QWeb.add_template('/share/static/src/xml/share.xml'); + +function launch_wizard(self, view) { + + var action = view.widget_parent.action; + var Share = new instance.web.DataSet(self, 'share.wizard', view.dataset.get_context()); + + console.log(view); + + domain = view.dataset.domain; + if (view.fields_view.type == 'form') { + domain = new instance.web.CompoundDomain(domain, [['id', '=', view.datarecord.id]]); + } + + Share.create({ + name: action.name, + domain: domain, + action_id: action.id, + }, function(result) { + var share_id = result.result; + var step1 = Share.call('go_step_1', [[share_id],], function(result) { + var action = result; + self.do_action(action); + }); + }); +} + +var _has_share = null; +function if_has_share(yes, no) { + if (!_has_share) { + _has_share = $.Deferred(function() { + var self = this; + var session = instance.webclient.session; + session.on_session_invalid.add_last(function() { _has_share = null; }); + var func = new instance.web.Model(session, "share.wizard").get_func("has_share"); + func(session.uid).pipe(function(res) { + if(res) { + self.resolve(); + } else { + self.reject(); + } + }); + }); + } + _has_share.done(yes).fail(no); +} + instance.web.Sidebar = instance.web.Sidebar.extend({ add_default_sections: function() { this._super(); - this.add_items('other', [{ - label: 'Share', - callback: this.on_sidebar_click_share, - classname: 'oe_share', - }]); + var self = this; + if_has_share(function() { + self.add_items('other', [{ + label: 'Share', + callback: self.on_sidebar_click_share, + classname: 'oe-share', + }]); + }); }, on_sidebar_click_share: function(item) { - var self = this; var view = this.widget_parent - var action = view.widget_parent.action; - - var Share = new instance.web.DataSet(this, 'share.wizard', view.dataset.get_context()); - - Share.create({ - name: action.name, - domain: view.dataset.domain, - action_id: action.id, - }, function(result) { - var share_id = result.result; - console.log('share_id', share_id); - - var step1 = Share.call('go_step_1', [[share_id],], function(result) { - var action = result; - console.log('step1', action); - self.do_action(action); - }); - }); - + launch_wizard(this, view); }, }); + +instance.web.ViewManagerAction.include({ + start: function() { + var self = this; + if_has_share(function() { + self.$element.find('a.oe-share').click(self.on_click_share); + }, function() { + self.$element.find('a.oe-share').remove(); + }); + return this._super.apply(this, arguments); + }, + + on_click_share: function(e) { + e.preventDefault(); + launch_wizard(this, this.views[this.active_view].controller); + }, +}); + }; From c507d1ef7ea17d9a6d0a59466a4c57fe81db23cb Mon Sep 17 00:00:00 2001 From: "RavishchanraMurari (Open ERP)" Date: Thu, 20 Oct 2011 17:21:46 +0530 Subject: [PATCH 08/28] company_id_in_multi_company bzr revid: rmu@tinyerp.com-20111020115146-p0ai3x3q0u48390k --- addons/web/static/src/js/search.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 9cab0ade9d0..2a4d3b1cdfe 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -63,6 +63,8 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search rows.push(row); var filters = []; _.each(items, function (item) { + if(!item.attrs.hasOwnProperty('invisible') && item.attrs.invisible!=1) + { if (filters.length && item.tag !== 'filter') { row.push( new openerp.web.search.FilterGroup( @@ -98,6 +100,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search this.make_field( item, fields[item['attrs'].name])); } + } } }, this); if (filters.length) { From d8e5a280d539510fac24d6da87eb455526a64c28 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Mon, 24 Oct 2011 14:02:19 +0200 Subject: [PATCH 09/28] [ADD] res.currency data: definition of Chilean Peso bzr revid: odo@openerp.com-20111024120219-k0a1l6ekjsrgc2p0 --- openerp/addons/base/base_data.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/openerp/addons/base/base_data.xml b/openerp/addons/base/base_data.xml index e61bdefd80d..d7190b8b5ef 100644 --- a/openerp/addons/base/base_data.xml +++ b/openerp/addons/base/base_data.xml @@ -1667,5 +1667,19 @@ + + + + CLP + $ + 0.01 + 4 + + + + 710 + + + From 1945d19d150544668de7020d7c67b2f2a327a128 Mon Sep 17 00:00:00 2001 From: "RavishchanraMurari (Open ERP)" Date: Mon, 24 Oct 2011 17:44:15 +0530 Subject: [PATCH 10/28] mulit_company_in group_by bzr revid: rmu@tinyerp.com-20111024121415-wkjyjzl6ydqz3t7o --- addons/web/static/src/js/search.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 45a0d40e96e..48d58b5776c 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -63,8 +63,9 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search rows.push(row); var filters = []; _.each(items, function (item) { - if(!item.attrs.hasOwnProperty('invisible') && item.attrs.invisible!=1) - { + if (item.attrs.invisible === '1') { + return; + } if (filters.length && item.tag !== 'filter') { row.push( new openerp.web.search.FilterGroup( @@ -101,7 +102,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search item, fields[item['attrs'].name])); } } - } + }, this); if (filters.length) { row.push(new openerp.web.search.FilterGroup(filters, this)); From ce45893633ca0492dfc57a8cd180374565560357 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 15:44:13 +0200 Subject: [PATCH 11/28] [FIX] Display 'don't import' placeholder when no value selected bzr revid: xmo@openerp.com-20111024134413-kgcgemdzquwtn0ns --- addons/web/static/src/xml/base.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 2860174c30f..db3f082ed03 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1461,7 +1461,7 @@ - + From a8b81ed5754ef0f2495b28b517f2a5b7ed9ba749 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 15:55:21 +0200 Subject: [PATCH 12/28] [ADD] dropdown arrow next to import autocompletes bzr revid: xmo@openerp.com-20111024135521-aikh791r9j94moal --- addons/web/static/src/js/data_import.js | 4 ++++ addons/web/static/src/xml/base.xml | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/data_import.js b/addons/web/static/src/js/data_import.js index 711e790dfaa..025ff8df1c5 100644 --- a/addons/web/static/src/js/data_import.js +++ b/addons/web/static/src/js/data_import.js @@ -205,6 +205,10 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ return; } + this.$element.delegate('.oe-m2o-drop-down-button', 'click', function () { + $(this).prev('input').focus(); + }); + var self = this; this.ready.then(function () { var $fields = self.$element.find('.sel_fields').bind('blur', function () { diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index db3f082ed03..7d010d5867b 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1461,7 +1461,8 @@ - + + From b45b7ad22cce753a00fff13981502e2c807cee79 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 16:06:58 +0200 Subject: [PATCH 13/28] [IMP] import: only show second step once file has been uploaded bzr revid: xmo@openerp.com-20111024140658-8t9csv9i6gd30luj --- addons/web/controllers/main.py | 2 +- addons/web/static/src/js/data_import.js | 2 +- addons/web/static/src/xml/base.xml | 39 +++++++++++++------------ 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 8120141b4f6..6cc46b476a9 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1412,7 +1412,7 @@ class Import(View): return fields @openerpweb.httprequest - def detect_data(self, req, csvfile, csvsep, csvdel, csvcode, jsonp): + def detect_data(self, req, csvfile, csvsep=',', csvdel='"', csvcode='utf-8', jsonp='callback'): try: data = list(csv.reader( csvfile, quotechar=str(csvdel), delimiter=str(csvsep))) diff --git a/addons/web/static/src/js/data_import.js b/addons/web/static/src/js/data_import.js index 025ff8df1c5..42f0cf8d680 100644 --- a/addons/web/static/src/js/data_import.js +++ b/addons/web/static/src/js/data_import.js @@ -80,7 +80,7 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ this.toggle_import_button(false); this.$element.find('#csvfile').change(this.on_autodetect_data); this.$element.find('fieldset').change(this.on_autodetect_data); - this.$element.find('fieldset legend').click(function() { + this.$element.delegate('fieldset legend', 'click', function() { $(this).next().toggle(); }); this.ready.push(new openerp.web.DataSet(this, this.model).call( diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 7d010d5867b..201ac964ac9 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1419,8 +1419,27 @@

-

2. Check your file format

+ + + +

2. Check your file format

+ + + + + + + + + + +
+
+ + +
+
Import Options @@ -1451,25 +1470,7 @@
-
- - - - - - - - - - -
-
- - -
-

The import failed due to:

From cd59e5e6fbf07bb1783dde48ecdafa73000d33c4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 16:17:37 +0200 Subject: [PATCH 14/28] [ADD] open/close arrow next to import options bzr revid: xmo@openerp.com-20111024141737-bk2rg08wvll1hgno --- addons/web/static/src/css/data_import.css | 12 ++++++++++++ addons/web/static/src/js/data_import.js | 2 +- addons/web/static/src/xml/base.xml | 9 +++++---- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/addons/web/static/src/css/data_import.css b/addons/web/static/src/css/data_import.css index 1fb3b22aa45..b1c4330402f 100644 --- a/addons/web/static/src/css/data_import.css +++ b/addons/web/static/src/css/data_import.css @@ -11,6 +11,18 @@ .openerp .oe_import_grid-row .oe_import_grid-cell { border-bottom: 1px solid #E3E3E3; } +.openerp .oe-import fieldset { + cursor: pointer; +} +.openerp .oe-import fieldset legend:before { + content: '\25BC '; +} +.openerp .oe-import fieldset.oe-closed legend:before { + content: '\25B6 '; +} +.openerp .oe-import fieldset.oe-closed table { + display: none; +} .openerp .separator.horizontal { font-weight: bold; border-bottom-width: 1px; diff --git a/addons/web/static/src/js/data_import.js b/addons/web/static/src/js/data_import.js index 42f0cf8d680..a284669732d 100644 --- a/addons/web/static/src/js/data_import.js +++ b/addons/web/static/src/js/data_import.js @@ -81,7 +81,7 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ this.$element.find('#csvfile').change(this.on_autodetect_data); this.$element.find('fieldset').change(this.on_autodetect_data); this.$element.delegate('fieldset legend', 'click', function() { - $(this).next().toggle(); + $(this).parent().toggleClass('oe-closed'); }); this.ready.push(new openerp.web.DataSet(this, this.model).call( 'fields_get', [], function (fields) { diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 201ac964ac9..f2f77b83eb7 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1409,7 +1409,8 @@ Import -
+

1. Import a .CSV file

Select a .CSV file to import. If you need a sample of file to import, @@ -1440,9 +1441,9 @@ -

- Import Options - +
+ Import Options +
From 06344150ebf2860247929c76f3fc6d9b43ca27b9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 16:27:44 +0200 Subject: [PATCH 15/28] [FIX] automatically open options box if the file fails to parse entirely bzr revid: xmo@openerp.com-20111024142744-zeal912gqf9bvrrp --- addons/web/static/src/css/data_import.css | 4 ++ addons/web/static/src/js/data_import.js | 3 ++ addons/web/static/src/xml/base.xml | 46 +++++++++++------------ 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/addons/web/static/src/css/data_import.css b/addons/web/static/src/css/data_import.css index b1c4330402f..e5d1c9a910c 100644 --- a/addons/web/static/src/css/data_import.css +++ b/addons/web/static/src/css/data_import.css @@ -11,6 +11,10 @@ .openerp .oe_import_grid-row .oe_import_grid-cell { border-bottom: 1px solid #E3E3E3; } + +.openerp .oe-import-no-result .oe-import-result { + display: none; +} .openerp .oe-import fieldset { cursor: pointer; } diff --git a/addons/web/static/src/js/data_import.js b/addons/web/static/src/js/data_import.js index a284669732d..355c6c1b493 100644 --- a/addons/web/static/src/js/data_import.js +++ b/addons/web/static/src/js/data_import.js @@ -194,9 +194,11 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ : with_headers ? results.records.slice(1) : results.records })); + this.$element.find('fieldset').addClass('oe-closed'); } else if (results['error']) { result_node.append(QWeb.render('ImportView.error', { 'error': results['error']})); + this.$element.find('fieldset').removeClass('oe-closed'); } else if (results['success']) { if (this.widget_parent.widget_parent.active_view == "list") { this.widget_parent.reload_content(); @@ -204,6 +206,7 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ this.stop(); return; } + this.$element.find('form').removeClass('oe-import-no-result'); this.$element.delegate('.oe-m2o-drop-down-button', 'click', function () { $(this).prev('input').focus(); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index f2f77b83eb7..1054a76dcf6 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1410,7 +1410,7 @@ + class="oe-import oe-import-no-result">

1. Import a .CSV file

Select a .CSV file to import. If you need a sample of file to import, @@ -1420,28 +1420,9 @@

-
- -
- -

2. Check your file format

- - - - - - - - - - -
-
- - -
-
-
+

2. Check your file format

+
+
Import Options @@ -1471,6 +1452,25 @@
+ + + + + + + + + + + + + +
+
+ + +
+

The import failed due to:

From a617e3bacc5ea44b4aa3ec9840e3eb8a4009047f Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 24 Oct 2011 17:10:39 +0200 Subject: [PATCH 16/28] [fix] small problem with the context menu of m2o when there is not item selected bzr revid: nicolas.vanhoren@openerp.com-20111024151039-k9jlntcj3n56h13d --- addons/web/static/src/xml/base.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 1054a76dcf6..349dccec867 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -859,9 +859,9 @@
    -
  • Open...
  • +
  • Open...
  • Create...
  • -
  • Search...
  • +
  • Search...
  • From 84a383d5aa7c3ef6a2fc38fb06953b447d831651 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 17:11:58 +0200 Subject: [PATCH 17/28] [IMP] make notebooks in page view identical to those of normal form view as requested by fp bzr revid: xmo@openerp.com-20111024151158-7hqox4k6xrjujxnb --- addons/web/static/src/js/view_form.js | 4 ---- addons/web/static/src/xml/base.xml | 6 ------ 2 files changed, 10 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 7d3f96925e0..aa1fbab90e1 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -2813,9 +2813,6 @@ openerp.web.form.FieldStatus = openerp.web.form.Field.extend({ } }); -openerp.web.form.WidgetNotebookReadonly = openerp.web.form.WidgetNotebook.extend({ - template: 'WidgetNotebook.readonly' -}); openerp.web.form.FieldReadonly = openerp.web.form.Field.extend({ }); @@ -2934,7 +2931,6 @@ openerp.web.form.widgets = new openerp.web.Registry({ 'statusbar': 'openerp.web.form.FieldStatus' }); openerp.web.form.readonly = openerp.web.form.widgets.clone({ - 'notebook': 'openerp.web.form.WidgetNotebookReadonly', 'char': 'openerp.web.form.FieldCharReadonly', 'email': 'openerp.web.form.FieldEmailReadonly', 'url': 'openerp.web.form.FieldUrlReadonly', diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 349dccec867..95ad99726f8 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -744,12 +744,6 @@ - - -

    - - -
    From 19bb1dda1a0d59b3010f06b53e47473ee0923105 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 17:20:13 +0200 Subject: [PATCH 18/28] [IMP] use empty box/check mark for page boolean fields, instead of cross vs check mark bzr revid: xmo@openerp.com-20111024152013-nhi8kwra46se0yva --- addons/web/static/src/js/view_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index aa1fbab90e1..a8ccfcb3e46 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -2848,7 +2848,7 @@ openerp.web.form.FieldUrlReadonly = openerp.web.form.FieldURIReadonly.extend({ }); openerp.web.form.FieldBooleanReadonly = openerp.web.form.FieldCharReadonly.extend({ set_value: function (value) { - this._super(value ? '\u2714' : '\u2718'); + this._super(value ? '\u2611' : '\u2610'); } }); openerp.web.form.FieldSelectionReadonly = openerp.web.form.FieldReadonly.extend({ From 6cb7f2b6f9cad1bd02dda34ad283342e1565995e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 24 Oct 2011 17:20:56 +0200 Subject: [PATCH 19/28] [imp] m2o now supports readonly mode bzr revid: nicolas.vanhoren@openerp.com-20111024152056-2nfx7zk4kc9py17k --- addons/web/static/src/js/view_form.js | 11 +++++++++++ addons/web/static/src/xml/base.xml | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index a8ccfcb3e46..1f1b5b8ef6f 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -1628,6 +1628,11 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ } else { $("#" + self.cm_id + " .oe_m2o_menu_item_mandatory").addClass("oe-m2o-disabled-cm"); } + if (!self.readonly) { + $("#" + self.cm_id + " .oe_m2o_menu_item_noreadonly").removeClass("oe-m2o-disabled-cm"); + } else { + $("#" + self.cm_id + " .oe_m2o_menu_item_noreadonly").addClass("oe-m2o-disabled-cm"); + } return true; }, menuStyle: {width: "200px"} }); @@ -1647,6 +1652,8 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ } }); this.$drop_down.click(function() { + if (self.readonly) + return; if (self.$input.autocomplete("widget").is(":visible")) { self.$input.autocomplete("close"); } else { @@ -1853,6 +1860,10 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ }, focus: function () { this.$input.focus(); + }, + update_dom: function() { + this._super.apply(this, arguments); + this.$input.attr('disabled', this.readonly); } }); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 95ad99726f8..c0007275ffa 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -854,8 +854,8 @@
    • Open...
    • -
    • Create...
    • -
    • Search...
    • +
    • Create...
    • +
    • Search...
    • From f097e140b8b51437258ae03000b37f1677f6098b Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Tue, 25 Oct 2011 00:54:31 +0200 Subject: [PATCH 20/28] [IMP] try session instead of openerp,db and we would rename Session into Connection bzr revid: al@openerp.com-20111024225431-g9eaqophnw3k8hh4 --- addons/web/static/src/js/views.js | 86 +++++++++++++++---------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index f402a51bf7e..b7a3d185bc1 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -2,21 +2,21 @@ * OpenERP web library *---------------------------------------------------------*/ -openerp.web.views = function(db) { +openerp.web.views = function(session) { -var _t = db.web._t; +var _t = session.web._t; /** * Registry for all the client actions key: tag value: widget */ -db.web.client_actions = new db.web.Registry(); +session.web.client_actions = new session.web.Registry(); /** * Registry for all the main views */ -db.web.views = new db.web.Registry(); +session.web.views = new session.web.Registry(); -db.web.ActionManager = db.web.Widget.extend({ +session.web.ActionManager = session.web.Widget.extend({ identifier_prefix: "actionmanager", init: function(parent) { this._super(parent); @@ -93,20 +93,20 @@ db.web.ActionManager = db.web.Widget.extend({ ir_actions_act_window: function (action, on_close) { if (action.target === 'new') { if (this.dialog == null) { - this.dialog = new db.web.Dialog(this, { title: action.name, width: '80%' }); + this.dialog = new session.web.Dialog(this, { title: action.name, width: '80%' }); if(on_close) this.dialog.on_close.add(on_close); this.dialog.start(); } else { this.dialog_viewmanager.stop(); } - this.dialog_viewmanager = new db.web.ViewManagerAction(this, action); + this.dialog_viewmanager = new session.web.ViewManagerAction(this, action); this.dialog_viewmanager.appendTo(this.dialog.$element); this.dialog.open(); } else { this.dialog_stop(); this.content_stop(); - this.inner_viewmanager = new db.web.ViewManagerAction(this, action); + this.inner_viewmanager = new session.web.ViewManagerAction(this, action); this.inner_viewmanager.appendTo(this.$element); this.url_update(action); } @@ -124,7 +124,7 @@ db.web.ActionManager = db.web.Widget.extend({ if (this.dialog && action.context) { var model = action.context.active_model; if (model === 'base.module.upgrade' || model === 'base.setup.installer' || model === 'base.module.upgrade') { - db.webclient.do_reload(); + session.webclient.do_reload(); } } this.dialog_stop(); @@ -140,7 +140,7 @@ db.web.ActionManager = db.web.Widget.extend({ }, ir_actions_client: function (action) { this.content_stop(); - var ClientWidget = db.web.client_actions.get_object(action.tag); + var ClientWidget = session.web.client_actions.get_object(action.tag); (this.client_widget = new ClientWidget(this, action.params)).appendTo(this); }, ir_actions_report_xml: function(action) { @@ -164,12 +164,12 @@ db.web.ActionManager = db.web.Widget.extend({ } }); -db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ +session.web.ViewManager = session.web.Widget.extend(/** @lends session.web.ViewManager# */{ identifier_prefix: "viewmanager", template: "ViewManager", /** - * @constructs db.web.ViewManager - * @extends db.web.Widget + * @constructs session.web.ViewManager + * @extends session.web.Widget * * @param parent * @param dataset @@ -185,10 +185,10 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ this.views_src = _.map(views, function(x) {return x instanceof Array? {view_id: x[0], view_type: x[1]} : x;}); this.views = {}; this.flags = this.flags || {}; - this.registry = db.web.views; + this.registry = session.web.views; }, render: function() { - return db.web.qweb.render(this.template, { + return session.web.qweb.render(this.template, { self: this, prefix: this.element_id, views: this.views_src}); @@ -284,7 +284,7 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ if (this.searchview) { this.searchview.stop(); } - this.searchview = new db.web.SearchView( + this.searchview = new session.web.SearchView( this, this.dataset, view_id, search_defaults, this.flags.search_view === false); @@ -334,13 +334,13 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ on_action_executed: function () {} }); -db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.ViewManagerAction# */{ +session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepnerp.web.ViewManagerAction# */{ template:"ViewManagerAction", /** - * @constructs db.web.ViewManagerAction - * @extends db.web.ViewManager + * @constructs session.web.ViewManagerAction + * @extends session.web.ViewManager * - * @param {db.web.ActionManager} parent parent object/widget + * @param {session.web.ActionManager} parent parent object/widget * @param {Object} action descriptor for the action this viewmanager needs to manage its views. */ init: function(parent, action) { @@ -350,7 +350,7 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View this._super(parent, null, action.views); this.session = parent.session; this.action = action; - var dataset = new db.web.DataSetSearch(this, action.res_model, action.context, action.domain); + var dataset = new session.web.DataSetSearch(this, action.res_model, action.context, action.domain); if (action.res_id) { dataset.ids.push(action.res_id); dataset.index = 0; @@ -400,12 +400,12 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View this.$element.find('.oe_get_xml_view').click(function () { // TODO: add search view? - $('
      ').text(db.web.json_node_to_xml(
      +            $('
      ').text(session.web.json_node_to_xml(
                       self.views[self.active_view].controller.fields_view.arch, true))
                           .dialog({ width: '95%'});
               });
               if (this.action.help && !this.flags.low_profile) {
      -            var Users = new db.web.DataSet(self, 'res.users'),
      +            var Users = new session.web.DataSet(self, 'res.users'),
                       header = this.$element.find('.oe-view-manager-header');
                   header.delegate('blockquote button', 'click', function() {
                       var $this = $(this);
      @@ -451,7 +451,7 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View
               var grandparent = this.widget_parent && this.widget_parent.widget_parent;
               // display shortcuts if on the first view for the action
               var $shortcut_toggle = this.$element.find('.oe-shortcut-toggle');
      -        if (!(grandparent instanceof db.web.WebClient) ||
      +        if (!(grandparent instanceof session.web.WebClient) ||
                   !(view.view_type === this.views_src[0].view_type
                       && view.view_id === this.views_src[0].view_id)) {
                   $shortcut_toggle.hide();
      @@ -488,7 +488,7 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View
            * Intercept do_action resolution from children views
            */
           on_action_executed: function () {
      -        return new db.web.DataSet(this, 'res.log')
      +        return new session.web.DataSet(this, 'res.log')
                       .call('get', [], this.do_display_log);
           },
           /**
      @@ -515,7 +515,7 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View
           }
       });
       
      -db.web.Sidebar = db.web.Widget.extend({
      +session.web.Sidebar = session.web.Widget.extend({
           init: function(parent, element_id) {
               this._super(parent, element_id);
               this.items = {};
      @@ -524,7 +524,7 @@ db.web.Sidebar = db.web.Widget.extend({
           start: function() {
               this._super(this);
               var self = this;
      -        this.$element.html(db.web.qweb.render('Sidebar'));
      +        this.$element.html(session.web.qweb.render('Sidebar'));
               this.$element.find(".toggle-sidebar").click(function(e) {
                   self.do_toggle();
               });
      @@ -601,7 +601,7 @@ db.web.Sidebar = db.web.Widget.extend({
       
               if(!$section) {
                   section_id = _.uniqueId(this.element_id + '_section_' + code + '_');
      -            var $section = $(db.web.qweb.render("Sidebar.section", {
      +            var $section = $(session.web.qweb.render("Sidebar.section", {
                       section_id: section_id,
                       name: name,
                       classname: 'oe_sidebar_' + code,
      @@ -633,7 +633,7 @@ db.web.Sidebar = db.web.Widget.extend({
                       this.items[items[i].element_id] = items[i];
                   }
       
      -            var $items = $(db.web.qweb.render("Sidebar.section.items", {items: items}));
      +            var $items = $(session.web.qweb.render("Sidebar.section.items", {items: items}));
       
                   $items.find('a.oe_sidebar_action_a').click(function() {
                       var item = self.items[$(this).attr('id')];
      @@ -687,7 +687,7 @@ db.web.Sidebar = db.web.Widget.extend({
           }
       });
       
      -db.web.TranslateDialog = db.web.Dialog.extend({
      +session.web.TranslateDialog = session.web.Dialog.extend({
           dialog_title: _t("Translations"),
           init: function(view) {
               // TODO fme: should add the language to fields_view_get because between the fields view get
      @@ -707,14 +707,14 @@ db.web.TranslateDialog = db.web.Dialog.extend({
               this.translatable_fields_keys = _.map(this.view.translatable_fields || [], function(i) { return i.name });
               this.languages = null;
               this.languages_loaded = $.Deferred();
      -        (new db.web.DataSetSearch(this, 'res.lang', this.view.dataset.get_context(),
      +        (new session.web.DataSetSearch(this, 'res.lang', this.view.dataset.get_context(),
                   [['translatable', '=', '1']])).read_slice(['code', 'name'], { sort: 'id' }, this.on_languages_loaded);
           },
           start: function() {
               var self = this;
               this._super();
               $.when(this.languages_loaded).then(function() {
      -            self.$element.html(db.web.qweb.render('TranslateDialog', { widget: self }));
      +            self.$element.html(session.web.qweb.render('TranslateDialog', { widget: self }));
                   self.$element.tabs();
                   if (!(self.view.translatable_fields && self.view.translatable_fields.length)) {
                       self.hide_tabs('fields');
      @@ -819,7 +819,7 @@ db.web.TranslateDialog = db.web.Dialog.extend({
           }
       });
       
      -db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
      +session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{
           template: "EmptyComponent",
           set_default_options: function(options) {
               this.options = options || {};
      @@ -833,7 +833,7 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
           },
           open_translate_dialog: function(field) {
               if (!this.translate_dialog) {
      -            this.translate_dialog = new db.web.TranslateDialog(this).start();
      +            this.translate_dialog = new session.web.TranslateDialog(this).start();
               }
               this.translate_dialog.open(field);
           },
      @@ -845,7 +845,7 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
            * @param {String} [action_data.special=null] special action handlers (currently: only ``'cancel'``)
            * @param {String} [action_data.type='workflow'] the action type, if present, one of ``'object'``, ``'action'`` or ``'workflow'``
            * @param {Object} [action_data.context=null] additional action context, to add to the current context
      -     * @param {db.web.DataSet} dataset a dataset object used to communicate with the server
      +     * @param {session.web.DataSet} dataset a dataset object used to communicate with the server
            * @param {Object} [record_id] the identifier of the object on which the action is to be applied
            * @param {Function} on_closed callback to execute when dialog is closed or when the action does not generate any result (no new action)
            */
      @@ -857,12 +857,12 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
                       return self.widget_parent.on_action_executed.apply(null, arguments);
                   }
               };
      -        var context = new db.web.CompoundContext(dataset.get_context(), action_data.context || {});
      +        var context = new session.web.CompoundContext(dataset.get_context(), action_data.context || {});
               
               var handler = function (r) {
                   var action = r.result;
                   if (action && action.constructor == Object) {
      -                var ncontext = new db.web.CompoundContext(context);
      +                var ncontext = new session.web.CompoundContext(context);
                       if (record_id) {
                           ncontext.add({
                               active_id: record_id,
      @@ -899,7 +899,7 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
           /**
            * Directly set a view to use instead of calling fields_view_get. This method must
            * be called before start(). When an embedded view is set, underlying implementations
      -     * of db.web.View must use the provided view instead of any other one.
      +     * of session.web.View must use the provided view instead of any other one.
            *
            * @param embedded_view A view.
            */
      @@ -917,7 +917,7 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
           },
           on_sidebar_manage_views: function() {
               if (this.fields_view && this.fields_view.arch) {
      -            $('' + db.web.json_node_to_xml(this.fields_view.arch, true) + '').dialog({ width: '95%', height: 600});
      +            $('' + session.web.json_node_to_xml(this.fields_view.arch, true) + '').dialog({ width: '95%', height: 600});
               } else {
                   this.do_warn("Manage Views", "Could not find current view declaration");
               }
      @@ -929,11 +929,11 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
               console.log('Todo');
           },
           on_sidebar_import: function() {
      -        var import_view = new db.web.DataImport(this, this.dataset);
      +        var import_view = new session.web.DataImport(this, this.dataset);
               import_view.start();
           },
           on_sidebar_export: function() {
      -        var export_view = new db.web.DataExport(this, this.dataset);
      +        var export_view = new session.web.DataExport(this, this.dataset);
               export_view.start();
           },
           on_sidebar_translate: function() {
      @@ -943,7 +943,7 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
           }
       });
       
      -db.web.json_node_to_xml = function(node, single_quote, indent) {
      +session.web.json_node_to_xml = function(node, single_quote, indent) {
           // For debugging purpose, this function will convert a json node back to xml
           // Maybe usefull for xml view editor
       
      @@ -972,7 +972,7 @@ db.web.json_node_to_xml = function(node, single_quote, indent) {
               r += '>\n';
               var childs = [];
               for (var i = 0, ii = node.children.length; i < ii; i++) {
      -            childs.push(db.web.json_node_to_xml(node.children[i], single_quote, indent + 1));
      +            childs.push(session.web.json_node_to_xml(node.children[i], single_quote, indent + 1));
               }
               r += childs.join('\n');
               r += '\n' + sindent + '';
      
      From 564e609abe600a326ccf7715617d11988db856fe Mon Sep 17 00:00:00 2001
      From: Fabien Meghazi 
      Date: Mon, 24 Oct 2011 17:30:29 +0200
      Subject: [PATCH 21/28] [IMP] Kanban: Groups order can be shuffled due to a
       race condition
      
      bzr revid: fme@openerp.com-20111024153029-yv9ezid4zn0lu7b6
      ---
       addons/web_kanban/static/src/js/kanban.js | 11 ++++++-----
       1 file changed, 6 insertions(+), 5 deletions(-)
      
      diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js
      index 82b085d9749..72df590fbf4 100644
      --- a/addons/web_kanban/static/src/js/kanban.js
      +++ b/addons/web_kanban/static/src/js/kanban.js
      @@ -446,8 +446,9 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
           },
           do_render_group : function (datagroups) {
               this.all_display_data = [];
      -        var self = this;
      -        _.each(datagroups, function (group) {
      +        var self = this,
      +            remaining = datagroups.length - 1;
      +        _.each(datagroups, function (group, index) {
                   var group_name = group.value;
                   var group_value = group.value;
                   if (!group.value) {
      @@ -462,10 +463,10 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
                       group_aggregates[value] = group.aggregates[key];
                   });
                   var dataset = new openerp.web.DataSetSearch(self, self.dataset.model, group.context, group.domain);
      +            self.$element.find(".oe_kanban_view").remove();
                   dataset.read_slice(_.keys(self.fields_view.fields), {'domain': group.domain, 'context': group.context}, function(records) {
      -                self.all_display_data.push({"value" : group_value, "records": records, 'header':group_name, 'ids': dataset.ids, 'aggregates': group_aggregates});
      -                if (datagroups.length == self.all_display_data.length) {
      -                    self.$element.find(".oe_kanban_view").remove();
      +                self.all_display_data[index] = {"value" : group_value, "records" : records, 'header' : group_name, 'ids' : dataset.ids, 'aggregates' : group_aggregates};
      +                if (!remaining--) {
                           self.on_show_data();
                       }
                   });
      
      From 68adb9de7e729dd5bb62ca9bc60c584d02ec3563 Mon Sep 17 00:00:00 2001
      From: Launchpad Translations on behalf of openerp <>
      Date: Tue, 25 Oct 2011 04:53:15 +0000
      Subject: [PATCH 22/28] Launchpad automatic translations update.
      
      bzr revid: launchpad_translations_on_behalf_of_openerp-20111025045315-1mgz3k00tjs6iv7x
      ---
       addons/stock_location/i18n/es_CL.po       |  594 +++++++
       addons/stock_no_autopicking/i18n/es_CL.po |   83 +
       addons/stock_planning/i18n/es_CL.po       | 1861 +++++++++++++++++++++
       3 files changed, 2538 insertions(+)
       create mode 100644 addons/stock_location/i18n/es_CL.po
       create mode 100644 addons/stock_no_autopicking/i18n/es_CL.po
       create mode 100644 addons/stock_planning/i18n/es_CL.po
      
      diff --git a/addons/stock_location/i18n/es_CL.po b/addons/stock_location/i18n/es_CL.po
      new file mode 100644
      index 00000000000..b6b2b458f1a
      --- /dev/null
      +++ b/addons/stock_location/i18n/es_CL.po
      @@ -0,0 +1,594 @@
      +# Spanish (Chile) translation for openobject-addons
      +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
      +# This file is distributed under the same license as the openobject-addons package.
      +# FIRST AUTHOR , 2011.
      +#
      +msgid ""
      +msgstr ""
      +"Project-Id-Version: openobject-addons\n"
      +"Report-Msgid-Bugs-To: FULL NAME \n"
      +"POT-Creation-Date: 2011-01-11 11:16+0000\n"
      +"PO-Revision-Date: 2011-10-24 19:30+0000\n"
      +"Last-Translator: Francisco Reyes Acuña \n"
      +"Language-Team: Spanish (Chile) \n"
      +"MIME-Version: 1.0\n"
      +"Content-Type: text/plain; charset=UTF-8\n"
      +"Content-Transfer-Encoding: 8bit\n"
      +"X-Launchpad-Export-Date: 2011-10-25 04:53+0000\n"
      +"X-Generator: Launchpad (build 14185)\n"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,picking_type:0
      +#: selection:stock.location.path,picking_type:0
      +msgid "Sending Goods"
      +msgstr "Envío de mercancías"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Pulled Paths"
      +msgstr "Rutas arrastradas"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,type_proc:0
      +msgid "Move"
      +msgstr "Movimiento"
      +
      +#. module: stock_location
      +#: model:ir.model,name:stock_location.model_stock_location_path
      +msgid "Pushed Flows"
      +msgstr "Flujos empujados"
      +
      +#. module: stock_location
      +#: selection:stock.location.path,auto:0
      +msgid "Automatic No Step Added"
      +msgstr "Movimiento automático, paso no añadido"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Parameters"
      +msgstr "Parámetros"
      +
      +#. module: stock_location
      +#: field:stock.location.path,location_from_id:0
      +msgid "Source Location"
      +msgstr "Ubicación de origen"
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,cancel_cascade:0
      +msgid "Allow you to cancel moves related to the product pull flow"
      +msgstr ""
      +"Le permite cancelar movimientos relacionados con el flujo de arrastre de "
      +"producto."
      +
      +#. module: stock_location
      +#: model:ir.model,name:stock_location.model_product_pulled_flow
      +#: field:product.product,flow_pull_ids:0
      +msgid "Pulled Flows"
      +msgstr "Flujos arrastrados"
      +
      +#. module: stock_location
      +#: constraint:stock.move:0
      +msgid "You must assign a production lot for this product"
      +msgstr "Debe asignar un lote de producción para este producto"
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,location_src_id:0
      +msgid "Location used by Destination Location to supply"
      +msgstr "Ubicación usada como destino al abastecer."
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,picking_type:0
      +#: selection:stock.location.path,picking_type:0
      +msgid "Internal"
      +msgstr "Interno"
      +
      +#. module: stock_location
      +#: code:addons/stock_location/procurement_pull.py:98
      +#, python-format
      +msgid ""
      +"Pulled procurement coming from original location %s, pull rule %s, via "
      +"original Procurement %s (#%d)"
      +msgstr ""
      +"Abastecimiento arrastrado proveniente de la ubicación original %s, regla de "
      +"arrastre %s, vía abastecimiento original %s (#%d)"
      +
      +#. module: stock_location
      +#: model:ir.model,name:stock_location.model_stock_location
      +msgid "Location"
      +msgstr "Ubicación"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,invoice_state:0
      +#: field:stock.location.path,invoice_state:0
      +msgid "Invoice Status"
      +msgstr "Estado de facturación"
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,name:0
      +msgid "This field will fill the packing Origin and the name of its moves"
      +msgstr ""
      +"Este campo rellenará el origen de la guiá de despacho y el nombre de sus "
      +"movimientos."
      +
      +#. module: stock_location
      +#: help:stock.location.path,auto:0
      +msgid ""
      +"This is used to define paths the product has to follow within the location "
      +"tree.\n"
      +"The 'Automatic Move' value will create a stock move after the current one "
      +"that will be validated automatically. With 'Manual Operation', the stock "
      +"move has to be validated by a worker. With 'Automatic No Step Added', the "
      +"location is replaced in the original move."
      +msgstr ""
      +"Se utiliza para definir rutas que el producto debe seguir dentro del árbol "
      +"de ubicaciones.\n"
      +"La opción 'Movimiento automático' creará un movimiento de stock después del "
      +"actual que se validará automáticamente. Con 'Operación manual', el "
      +"movimiento de stock debe ser validado por un trabajador. Con 'Automático "
      +"paso no añadido', la ubicación se reemplaza en el movimiento original."
      +
      +#. module: stock_location
      +#: model:ir.module.module,shortdesc:stock_location.module_meta_information
      +msgid "Warehouse Locations Paths"
      +msgstr "Rutas en las ubicaciones de almacén"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Conditions"
      +msgstr "Condiciones"
      +
      +#. module: stock_location
      +#: model:stock.location,name:stock_location.location_pack_zone
      +msgid "Pack Zone"
      +msgstr "Zona de empaquetado"
      +
      +#. module: stock_location
      +#: model:stock.location,name:stock_location.location_gate_b
      +msgid "Gate B"
      +msgstr "Puerta B"
      +
      +#. module: stock_location
      +#: model:stock.location,name:stock_location.location_gate_a
      +msgid "Gate A"
      +msgstr "Puerta A"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,type_proc:0
      +msgid "Buy"
      +msgstr "Comprar"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Pushed flows"
      +msgstr "Flujos empujados"
      +
      +#. module: stock_location
      +#: model:stock.location,name:stock_location.location_dispatch_zone
      +msgid "Dispatch Zone"
      +msgstr "Zona de despacho"
      +
      +#. module: stock_location
      +#: model:ir.model,name:stock_location.model_stock_move
      +msgid "Stock Move"
      +msgstr "Movimiento de stock"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Pulled flows"
      +msgstr "Flujos arrastrados"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,company_id:0
      +#: field:stock.location.path,company_id:0
      +msgid "Company"
      +msgstr "Empresa"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Logistics Flows"
      +msgstr "Flujos de logística"
      +
      +#. module: stock_location
      +#: help:stock.move,cancel_cascade:0
      +msgid "If checked, when this move is cancelled, cancel the linked move too"
      +msgstr ""
      +"Si está marcado, cuando este movimiento se cancela, también cancela el "
      +"movimiento relacionado."
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,type_proc:0
      +msgid "Produce"
      +msgstr "Producir"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,procure_method:0
      +msgid "Make to Order"
      +msgstr "Obtener bajo pedido"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,procure_method:0
      +msgid "Make to Stock"
      +msgstr "Obtener para stock"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,partner_address_id:0
      +msgid "Partner Address"
      +msgstr "Dirección de empresa"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,invoice_state:0
      +#: selection:stock.location.path,invoice_state:0
      +msgid "To Be Invoiced"
      +msgstr "Para facturar"
      +
      +#. module: stock_location
      +#: help:stock.location.path,delay:0
      +msgid "Number of days to do this transition"
      +msgstr "Número de días para realizar esta transición"
      +
      +#. module: stock_location
      +#: model:ir.module.module,description:stock_location.module_meta_information
      +msgid ""
      +"\n"
      +"This module supplements the Warehouse application by adding support for per-"
      +"product\n"
      +"location paths, effectively implementing Push and Pull inventory flows.\n"
      +"\n"
      +"Typically this could be used to:\n"
      +"* Manage product manufacturing chains\n"
      +"* Manage default locations per product\n"
      +"* Define routes within your warehouse according to business needs, such as:\n"
      +"   - Quality Control\n"
      +"   - After Sales Services\n"
      +"   - Supplier Returns\n"
      +"* Help rental management, by generating automated return moves for rented "
      +"products\n"
      +"\n"
      +"Once this module is installed, an additional tab appear on the product form, "
      +"where you can add\n"
      +"Push and Pull flow specifications. The demo data of  CPU1 product for that "
      +"push/pull :\n"
      +"\n"
      +"Push flows\n"
      +"----------\n"
      +"Push flows are useful when the arrival of certain products in a given "
      +"location should always\n"
      +"be followed by a corresponding move to another location, optionally after a "
      +"certain delay.\n"
      +"The original Warehouse application already supports such Push flow "
      +"specifications on the\n"
      +"Locations themselves, but these cannot be refined per-product.\n"
      +"\n"
      +"A push flow specification indicates which location is chained with which "
      +"location, and with\n"
      +"what parameters. As soon as a given quantity of products is moved in the "
      +"source location,\n"
      +"a chained move is automatically foreseen according to the parameters set on "
      +"the flow specification\n"
      +"(destination location, delay, type of move, journal, etc.) The new move can "
      +"be automatically\n"
      +"processed, or require a manual confirmation, depending on the parameters.\n"
      +"\n"
      +"Pull flows\n"
      +"----------\n"
      +"Pull flows are a bit different from Pull flows, in the sense that they are "
      +"not related to\n"
      +"the processing of product moves, but rather to the processing of procurement "
      +"orders.\n"
      +"What is being pulled is a need, not directly products.\n"
      +"A classical example of Push flow is when you have an Outlet company, with a "
      +"parent Company\n"
      +"that is responsible for the supplies of the Outlet.\n"
      +"\n"
      +"  [ Customer ] <- A - [ Outlet ]  <- B -  [ Holding ] <~ C ~ [ Supplier ]\n"
      +"\n"
      +"When a new procurement order (A, coming from the confirmation of a Sale "
      +"Order for example) arrives\n"
      +"in the Outlet, it is converted into another procurement (B, via a Push flow "
      +"of type 'move')\n"
      +"requested from the Holding. When procurement order B is processed by the "
      +"Holding company, and\n"
      +"if the product is out of stock, it can be converted into a Purchase Order "
      +"(C) from the Supplier\n"
      +"(Push flow of type Purchase). The result is that the procurement order, the "
      +"need, is pushed\n"
      +"all the way between the Customer and Supplier.\n"
      +"\n"
      +"Technically, Pull flows allow to process procurement orders differently, not "
      +"only depending on\n"
      +"the product being considered, but also depending on which location holds the "
      +"\"need\" for that\n"
      +"product (i.e. the destination location of that procurement order).\n"
      +"\n"
      +"Use-Case\n"
      +"--------\n"
      +"\n"
      +"You can use the demo data as follow:\n"
      +"  CPU1: Sell some CPU1 from Shop 1 and run the scheduler\n"
      +"     - Warehouse: delivery order, Shop 1: reception\n"
      +"  CPU3:\n"
      +"     - When receiving the product, it goes to Quality Control location then "
      +"stored to shelf 2.\n"
      +"     - When delivering the customer: Pick List -> Packing -> Delivery Order "
      +"from Gate A\n"
      +"    "
      +msgstr ""
      +"\n"
      +"Este módulo complementa la aplicación Almacén, añadiendo soporte para cada "
      +"producto,\n"
      +"ruta de ubicación, aplicación efectiva de flujos de inventario de Entrada y "
      +"Salida.\n"
      +"\n"
      +"Normalmente, esto se podría utilizar para:\n"
      +"* Gestión de las cadenas de fabricación de productos\n"
      +"* Gestionar ubicaciones predeterminadas por producto\n"
      +"* Definir las rutas dentro de su almacén de acuerdo a las necesidades "
      +"empresariales, tales como:\n"
      +"   - Control de Calidad\n"
      +"   - Después de Servicios de Ventas\n"
      +"   - Proveedor Devoluciones\n"
      +"* Gestión de Ayuda a la rentabilidad, mediante la generación de movimientos "
      +"automáticos para productos alquilados\n"
      +"\n"
      +"Una vez que este módulo está instalado, aparecerá una ficha adicional en la "
      +"pestaña del producto, donde se puede añadir\n"
      +"las especificaciones del flujo de Entrada y de Salida. Los datos de "
      +"demostración del producto CPU1 para esos flujos de entrada/salida:\n"
      +"\n"
      +"Flujos de Entrada\n"
      +"----------\n"
      +"Los flujos de entrada son útiles cuando la llegada de determinados productos "
      +"a un lugar determinado siempre\n"
      +"va seguida de un movimiento que corresponde a otra ubicación, opcionalmente "
      +"después de un cierto retraso.\n"
      +"La aplicación Almacén original ya soporta tales especificaciones del flujo "
      +"de entrada en sus Ubicaciones, pero estas no pueden ser refinadas por "
      +"producto.\n"
      +"\n"
      +"Una especificación de flujo de entrada indica qué ubicación está encadenada "
      +"con qué ubicación, y con\n"
      +"qué parámetros. Tan pronto como una cantidad determinada de productos se "
      +"mueve de la ubicación de origen,\n"
      +"un movimiento encadenado de forma automática configurado de acuerdo con los "
      +"parámetros establecidos en la especificación del flujo\n"
      +"(lugar de destino, demora, tipo de movimiento, diarios, etc) se dispara. El "
      +"nuevo movimiento puede ser automáticamente\n"
      +"procesado, o requerir una confirmación manual, dependiendo de los "
      +"parámetros.\n"
      +"\n"
      +"Flujos de Salida\n"
      +"----------\n"
      +"Los flujos de salida son un poco diferentes de los flujos de entrada, en el "
      +"sentido de que no están relacionados con\n"
      +"la tramitación de movimientos de productos, sino más bien con el tratamiento "
      +"de los pedidos de venta.\n"
      +"Lo que se saca es una necesidad, no directamente los productos.\n"
      +"Un ejemplo clásico de flujo de salida es cuando usted tiene una empresa de "
      +"Outlet, con una empresa padre\n"
      +"que es la responsable de los suministros del Outlet.\n"
      +"\n"
      +"  [cliente] <- A - [Outlet] <- B - [Suministrador] <~ C ~ [Proveedor]\n"
      +"\n"
      +"Cuando una nueva orden de compra (A, procedente de la confirmación de una "
      +"orden de venta por ejemplo) llega al Outlet, se convierte en otra compra (B, "
      +"a través de un flujo de entrada del tipo 'mover')\n"
      +"solicitada desde el socio. Cuando el orden de compa para B es procesado por "
      +"la empresa socia, y\n"
      +"si el producto está agotado, puede convertirse en una Orden de Compra (C) "
      +"del Proveedor\n"
      +"(flujo de Entrada de tipo Compra). El resultado es que el orden de "
      +"adquisición, la necesidad, se traslada automáticamente del Cliente al "
      +"Proveedor.\n"
      +"\n"
      +"Técnicamente, los flujos de Salida permiten procesar los pedidos de "
      +"adquisición de otra manera, no sólo en función del producto considerado, "
      +"sino también en función de qué ubicación tiene la \"necesidad\" de qué\n"
      +"producto (es decir, la ubicación de destino de esa orden de compra).\n"
      +"\n"
      +"Caso de Uso\n"
      +"---------------\n"
      +"\n"
      +"Puede utilizar los datos de demostración de la siguiente manera:\n"
      +"  CPU1: Venta de algunas CPU1 en la tienda 1 y ejecutar el planificador\n"
      +"     - Almacén: órden de entrega, Tienda 1: Recepción\n"
      +"  CPU3:\n"
      +"     - Al recibir el producto, va al Control de Calidad y se almacena en la "
      +"plataforma 2.\n"
      +"     - Cuando se entrega al cliente: Lista de Selección -> Embalaje -> Orden "
      +"de Entrega desde la puerta A\n"
      +"    "
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,type_proc:0
      +msgid "Type of Procurement"
      +msgstr "Tipo de abastecimiento"
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,company_id:0
      +msgid "Is used to know to which company belong packings and moves"
      +msgstr ""
      +"Se usa para saber a que compañía pertenece las guias de despacho y "
      +"movimientos."
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,name:0
      +msgid "Name"
      +msgstr "Nombre"
      +
      +#. module: stock_location
      +#: help:product.product,path_ids:0
      +msgid ""
      +"These rules set the right path of the product in the whole location tree."
      +msgstr ""
      +"Estas reglas fijan la ruta correcta del producto en todo el árbol de "
      +"ubicaciones."
      +
      +#. module: stock_location
      +#: selection:stock.location.path,auto:0
      +msgid "Manual Operation"
      +msgstr "Operación manual"
      +
      +#. module: stock_location
      +#: model:ir.model,name:stock_location.model_product_product
      +#: field:product.pulled.flow,product_id:0
      +msgid "Product"
      +msgstr "Producto"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,procure_method:0
      +msgid "Procure Method"
      +msgstr "Método abastecimiento"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,picking_type:0
      +#: field:stock.location.path,picking_type:0
      +msgid "Shipping Type"
      +msgstr "Tipo de envío"
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,procure_method:0
      +msgid ""
      +"'Make to Stock': When needed, take from the stock or wait until re-"
      +"supplying. 'Make to Order': When needed, purchase or produce for the "
      +"procurement request."
      +msgstr ""
      +"'Obtener para stock': Cuando sea necesario, coger del stock o esperar hasta "
      +"que sea reabastecido. 'Obtener bajo pedido': Cuando sea necesario, comprar o "
      +"producir para la petición de abastecimiento."
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,location_id:0
      +msgid "Is the destination location that needs supplying"
      +msgstr "Es la ubicación destino que necesita suministro."
      +
      +#. module: stock_location
      +#: field:stock.location.path,product_id:0
      +msgid "Products"
      +msgstr "Productos"
      +
      +#. module: stock_location
      +#: code:addons/stock_location/procurement_pull.py:118
      +#, python-format
      +msgid "Pulled from another location via procurement %d"
      +msgstr "Arrastrado desde otra ubicación vía abastecimiento %d"
      +
      +#. module: stock_location
      +#: model:stock.location,name:stock_location.stock_location_qualitytest0
      +msgid "Quality Control"
      +msgstr "Control de calidad"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,invoice_state:0
      +#: selection:stock.location.path,invoice_state:0
      +msgid "Not Applicable"
      +msgstr "No Aplicable"
      +
      +#. module: stock_location
      +#: field:stock.location.path,delay:0
      +msgid "Delay (days)"
      +msgstr "Retraso (días)"
      +
      +#. module: stock_location
      +#: code:addons/stock_location/procurement_pull.py:67
      +#, python-format
      +msgid ""
      +"Picking for pulled procurement coming from original location %s, pull rule "
      +"%s, via original Procurement %s (#%d)"
      +msgstr ""
      +"Guía de despacho para abastecimiento arrastrado proveniente de la ubicación "
      +"original %s, regla de arrastre %s, vía abastecimiento original %s (#%d)"
      +
      +#. module: stock_location
      +#: field:product.product,path_ids:0
      +msgid "Pushed Flow"
      +msgstr "Flujo empujado"
      +
      +#. module: stock_location
      +#: code:addons/stock_location/procurement_pull.py:89
      +#, python-format
      +msgid ""
      +"Move for pulled procurement coming from original location %s, pull rule %s, "
      +"via original Procurement %s (#%d)"
      +msgstr ""
      +"Movimiento para abastecimiento arrastrado proveniente de la ubicación "
      +"original %s, regla de arrastre %s, vía abastecimiento original %s (#%d)"
      +
      +#. module: stock_location
      +#: constraint:stock.move:0
      +msgid "You try to assign a lot which is not from the same product"
      +msgstr "Está intentando asignar un lote que no es del mismo producto"
      +
      +#. module: stock_location
      +#: model:ir.model,name:stock_location.model_procurement_order
      +msgid "Procurement"
      +msgstr "Abastecimiento"
      +
      +#. module: stock_location
      +#: field:stock.location.path,location_dest_id:0
      +msgid "Destination Location"
      +msgstr "Ubicación de destino"
      +
      +#. module: stock_location
      +#: field:stock.location.path,auto:0
      +#: selection:stock.location.path,auto:0
      +msgid "Automatic Move"
      +msgstr "Movimiento automático"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,picking_type:0
      +#: selection:stock.location.path,picking_type:0
      +msgid "Getting Goods"
      +msgstr "Recepción mercancías"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Action Type"
      +msgstr "Tipo de acción"
      +
      +#. module: stock_location
      +#: constraint:product.product:0
      +msgid "Error: Invalid ean code"
      +msgstr "Error: Código EAN no válido"
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,picking_type:0
      +#: help:stock.location.path,picking_type:0
      +msgid ""
      +"Depending on the company, choose whatever you want to receive or send "
      +"products"
      +msgstr "Según la compañía, seleccionar si desea recibir o enviar productos."
      +
      +#. module: stock_location
      +#: model:stock.location,name:stock_location.location_order
      +msgid "Order Processing"
      +msgstr "Procesando pedido"
      +
      +#. module: stock_location
      +#: field:stock.location.path,name:0
      +msgid "Operation"
      +msgstr "Operación"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +#: field:product.product,path_ids:0
      +#: view:stock.location.path:0
      +msgid "Location Paths"
      +msgstr "Rutas de ubicaciones"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,journal_id:0
      +#: field:stock.location.path,journal_id:0
      +msgid "Journal"
      +msgstr "Diario"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,cancel_cascade:0
      +#: field:stock.move,cancel_cascade:0
      +msgid "Cancel Cascade"
      +msgstr "Cancelar cascada"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,invoice_state:0
      +#: selection:stock.location.path,invoice_state:0
      +msgid "Invoiced"
      +msgstr "Facturado"
      diff --git a/addons/stock_no_autopicking/i18n/es_CL.po b/addons/stock_no_autopicking/i18n/es_CL.po
      new file mode 100644
      index 00000000000..98a3c002c30
      --- /dev/null
      +++ b/addons/stock_no_autopicking/i18n/es_CL.po
      @@ -0,0 +1,83 @@
      +# Spanish (Chile) translation for openobject-addons
      +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
      +# This file is distributed under the same license as the openobject-addons package.
      +# FIRST AUTHOR , 2011.
      +#
      +msgid ""
      +msgstr ""
      +"Project-Id-Version: openobject-addons\n"
      +"Report-Msgid-Bugs-To: FULL NAME \n"
      +"POT-Creation-Date: 2011-01-03 16:58+0000\n"
      +"PO-Revision-Date: 2011-10-24 19:35+0000\n"
      +"Last-Translator: Francisco Reyes Acuña \n"
      +"Language-Team: Spanish (Chile) \n"
      +"MIME-Version: 1.0\n"
      +"Content-Type: text/plain; charset=UTF-8\n"
      +"Content-Transfer-Encoding: 8bit\n"
      +"X-Launchpad-Export-Date: 2011-10-25 04:53+0000\n"
      +"X-Generator: Launchpad (build 14185)\n"
      +
      +#. module: stock_no_autopicking
      +#: model:ir.model,name:stock_no_autopicking.model_product_product
      +msgid "Product"
      +msgstr "Producto"
      +
      +#. module: stock_no_autopicking
      +#: model:ir.module.module,description:stock_no_autopicking.module_meta_information
      +msgid ""
      +"\n"
      +"    This module allows an intermediate picking process to provide raw "
      +"materials\n"
      +"    to production orders.\n"
      +"\n"
      +"    One example of usage of this module is to manage production made by "
      +"your\n"
      +"    suppliers (sub-contracting). To achieve this, set the assembled product\n"
      +"    which is sub-contracted to \"No Auto-Picking\" and put the location of "
      +"the\n"
      +"    supplier in the routing of the assembly operation.\n"
      +"    "
      +msgstr ""
      +"\n"
      +"    Este módulo permite un proceso de recogida intermedio para proveer "
      +"materias\n"
      +"    primas a las órdenes de fabricación.\n"
      +"\n"
      +"    Un ejemplo de uso de este módulo es gestionar la producción realizada "
      +"por sus\n"
      +"    proveedores (subcontratación). Para conseguir esto, establezca los "
      +"productos ensamblados\n"
      +"    que serán subcontratados a \"No Auto-Recogida\" y establezca la "
      +"ubicación del nuevo\n"
      +"    proveedor en el proceso de la operación de ensamblado.\n"
      +"    "
      +
      +#. module: stock_no_autopicking
      +#: model:ir.model,name:stock_no_autopicking.model_mrp_production
      +msgid "Manufacturing Order"
      +msgstr "Orden de fabricación"
      +
      +#. module: stock_no_autopicking
      +#: field:product.product,auto_pick:0
      +msgid "Auto Picking"
      +msgstr "Auto empaquetado"
      +
      +#. module: stock_no_autopicking
      +#: help:product.product,auto_pick:0
      +msgid "Auto picking for raw materials of production orders."
      +msgstr "Auto empaquetado para materiales a granel en órdenes de producción."
      +
      +#. module: stock_no_autopicking
      +#: constraint:product.product:0
      +msgid "Error: Invalid ean code"
      +msgstr "Error: Código EAN no válido"
      +
      +#. module: stock_no_autopicking
      +#: model:ir.module.module,shortdesc:stock_no_autopicking.module_meta_information
      +msgid "Stock No Auto-Picking"
      +msgstr "Stock no auto empaquetado"
      +
      +#. module: stock_no_autopicking
      +#: constraint:mrp.production:0
      +msgid "Order quantity cannot be negative or zero !"
      +msgstr "¡La cantidad ordenada no puede ser negativa o cero!"
      diff --git a/addons/stock_planning/i18n/es_CL.po b/addons/stock_planning/i18n/es_CL.po
      new file mode 100644
      index 00000000000..9e876116a3a
      --- /dev/null
      +++ b/addons/stock_planning/i18n/es_CL.po
      @@ -0,0 +1,1861 @@
      +# Spanish (Chile) translation for openobject-addons
      +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
      +# This file is distributed under the same license as the openobject-addons package.
      +# FIRST AUTHOR , 2011.
      +#
      +msgid ""
      +msgstr ""
      +"Project-Id-Version: openobject-addons\n"
      +"Report-Msgid-Bugs-To: FULL NAME \n"
      +"POT-Creation-Date: 2011-01-11 11:16+0000\n"
      +"PO-Revision-Date: 2011-10-24 20:18+0000\n"
      +"Last-Translator: Francisco Reyes Acuña \n"
      +"Language-Team: Spanish (Chile) \n"
      +"MIME-Version: 1.0\n"
      +"Content-Type: text/plain; charset=UTF-8\n"
      +"Content-Transfer-Encoding: 8bit\n"
      +"X-Launchpad-Export-Date: 2011-10-25 04:53+0000\n"
      +"X-Generator: Launchpad (build 14185)\n"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/wizard/stock_planning_createlines.py:73
      +#, python-format
      +msgid ""
      +"No forecasts for selected period or no products in selected category !"
      +msgstr ""
      +"¡No hay previsiones para el periodo seleccionado o no hay productos en la "
      +"categoría seleccionada!"
      +
      +#. module: stock_planning
      +#: help:stock.planning,stock_only:0
      +msgid ""
      +"Check to calculate stock location of selected warehouse only. If not "
      +"selected calculation is made for input, stock and output location of "
      +"warehouse."
      +msgstr ""
      +"Marque esta opción para calcular el stock sólo de la ubicación stock del "
      +"almacén seleccionado. Si no se marca, el cálculo se realiza para las "
      +"ubicaciones de entrada, stock y salida del almacén."
      +
      +#. module: stock_planning
      +#: field:stock.planning,maximum_op:0
      +msgid "Maximum Rule"
      +msgstr "Regla máximo"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period1_per_company:0
      +msgid "This Copmany Period1"
      +msgstr "Esta compañía período1"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +#: view:stock.sale.forecast:0
      +msgid "Group By..."
      +msgstr "Agrupar por..."
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,product_amt:0
      +msgid ""
      +"Forecast value which will be converted to Product Quantity according to "
      +"prices."
      +msgstr ""
      +"Valor de la previsión que será convertido en cantidad de producto en función "
      +"de precios."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:621
      +#: code:addons/stock_planning/stock_planning.py:663
      +#, python-format
      +msgid "Incoming Left must be greater than 0 !"
      +msgstr "¡Entradas restantes debe ser mayor que 0!"
      +
      +#. module: stock_planning
      +#: help:stock.planning,outgoing_before:0
      +msgid ""
      +"Planned Out in periods before calculated. Between start date of current "
      +"period and one day before start of calculated period."
      +msgstr ""
      +"Salidas planificadas en periodos anteriores al calculado. Entre la fecha de "
      +"inicio del periodo actual y un día antes del comienzo del periodo calculado."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/wizard/stock_planning_forecast.py:60
      +#, python-format
      +msgid "No products in selected category !"
      +msgstr "¡No hay productos en la categoría seleccionada!"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast.createlines,warehouse_id:0
      +msgid ""
      +"Warehouse which forecasts will concern. If during stock planning you will "
      +"need sales forecast for all warehouses choose any warehouse now."
      +msgstr ""
      +"Almacén al que conciernen las previsiones. Si durante la planificación de "
      +"stock necesita previsiones de ventas para todos los almacenes escoja ahora "
      +"un almacén cualquiera."
      +
      +#. module: stock_planning
      +#: field:stock.planning,outgoing_left:0
      +msgid "Expected Out"
      +msgstr "Salidas previstas"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid " "
      +msgstr " "
      +
      +#. module: stock_planning
      +#: field:stock.planning,incoming_left:0
      +msgid "Incoming Left"
      +msgstr "Entradas restantes"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Requisition history"
      +msgstr "Historial demandas"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast.createlines:0
      +msgid "Create Forecasts Lines"
      +msgstr "Crear líneas de previsiones"
      +
      +#. module: stock_planning
      +#: help:stock.planning,outgoing:0
      +msgid "Quantity of all confirmed outgoing moves in calculated Period."
      +msgstr "Cantidades de todas las salidas confirmadas en el periodo calculado."
      +
      +#. module: stock_planning
      +#: view:stock.period.createlines:0
      +msgid "Create Daily Periods"
      +msgstr "Crear periodos diarios"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +#: field:stock.planning,company_id:0
      +#: field:stock.planning.createlines,company_id:0
      +#: view:stock.sale.forecast:0
      +#: field:stock.sale.forecast,company_id:0
      +#: field:stock.sale.forecast.createlines,company_id:0
      +msgid "Company"
      +msgstr "Compañía"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:640
      +#: code:addons/stock_planning/stock_planning.py:682
      +#, python-format
      +msgid ""
      +"\n"
      +" Initial Stock: "
      +msgstr ""
      +"\n"
      +" Stock inicial: "
      +
      +#. module: stock_planning
      +#: help:stock.planning,warehouse_forecast:0
      +msgid ""
      +"All sales forecasts for selected Warehouse of selected Product during "
      +"selected Period."
      +msgstr ""
      +"Todas las previsiones de ventas para el almacén seleccionado del producto "
      +"seleccionado durante el periodo seleccionado."
      +
      +#. module: stock_planning
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_period_creatlines
      +msgid "Create Stock and Sales Periods"
      +msgstr "Crear periodos de stock y ventas"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Minimum Stock Rule Indicators"
      +msgstr "Indicadores de reglas de stock mínimo"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast.createlines,period_id:0
      +msgid "Period which forecasts will concern."
      +msgstr "Periodo al que conciernen las previsiones."
      +
      +#. module: stock_planning
      +#: field:stock.planning,stock_only:0
      +msgid "Stock Location Only"
      +msgstr "Sólo ubicaciones de stock"
      +
      +#. module: stock_planning
      +#: help:stock.planning,already_out:0
      +msgid ""
      +"Quantity which is already dispatched out of this warehouse in current period."
      +msgstr ""
      +"Cantidades que ya se enviaron fuera de este almacén en el período actual."
      +
      +#. module: stock_planning
      +#: help:stock.planning,procure_to_stock:0
      +msgid ""
      +"Chect to make procurement to stock location of selected warehouse. If not "
      +"selected procurement will be made into input location of warehouse."
      +msgstr ""
      +"Marque esta opción para realizar los abastecimientos en la ubicación stock "
      +"del almacén seleccionado. Si no se marca, el abastecimiento se realizará en "
      +"la ubicación de entrada del almacén."
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Current Period Situation"
      +msgstr "Situación del periodo actual"
      +
      +#. module: stock_planning
      +#: view:stock.period.createlines:0
      +msgid "Create Monthly Periods"
      +msgstr "Crear períodos mensuales"
      +
      +#. module: stock_planning
      +#: help:stock.planning,supply_warehouse_id:0
      +msgid ""
      +"Warehouse used as source in supply pick move created by 'Supply from Another "
      +"Warhouse'."
      +msgstr ""
      +"Almacén usado como origen en el movimiento de suministro creado por "
      +"'Suministrar desde otro almacén'."
      +
      +#. module: stock_planning
      +#: model:ir.model,name:stock_planning.model_stock_period_createlines
      +msgid "stock.period.createlines"
      +msgstr "stock.periodo.crearlíneas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,outgoing_before:0
      +msgid "Planned Out Before"
      +msgstr "Salidas planificadas antes"
      +
      +#. module: stock_planning
      +#: field:stock.planning.createlines,forecasted_products:0
      +msgid "All Products with Forecast"
      +msgstr "Todos los productos con previsión"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Periods :"
      +msgstr "Periodos :"
      +
      +#. module: stock_planning
      +#: help:stock.planning,already_in:0
      +msgid ""
      +"Quantity which is already picked up to this warehouse in current period."
      +msgstr ""
      +"Cantidades que ya han sido recogidas en este almacén en el periodo actual."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:644
      +#: code:addons/stock_planning/stock_planning.py:686
      +#, python-format
      +msgid "    Confirmed In Before: "
      +msgstr "    Entradas confirmadas antes: "
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Stock and Sales Forecast"
      +msgstr "Previsiones de stock y ventas"
      +
      +#. module: stock_planning
      +#: model:ir.model,name:stock_planning.model_stock_sale_forecast
      +msgid "stock.sale.forecast"
      +msgstr "stock.ventas.prevision"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_dept_id:0
      +msgid "This Department"
      +msgstr "Este departamento"
      +
      +#. module: stock_planning
      +#: field:stock.planning,to_procure:0
      +msgid "Planned In"
      +msgstr "Entradas planificadas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,stock_simulation:0
      +msgid "Stock Simulation"
      +msgstr "Simulación de stock"
      +
      +#. module: stock_planning
      +#: model:ir.model,name:stock_planning.model_stock_planning_createlines
      +msgid "stock.planning.createlines"
      +msgstr "stock.planificación.crearlíneas"
      +
      +#. module: stock_planning
      +#: help:stock.planning,incoming_before:0
      +msgid ""
      +"Confirmed incoming in periods before calculated (Including Already In). "
      +"Between start date of current period and one day before start of calculated "
      +"period."
      +msgstr ""
      +"Entradas confirmadas en periodos anteriores al calculado (incluyendo las "
      +"entradas realizadas). Entre la fecha de inicio del periodo actual y un día "
      +"antes del comienzo del periodo calculado."
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Search  Sales Forecast"
      +msgstr "Buscar previsiones de ventas"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period5_per_user:0
      +msgid "This User Period5"
      +msgstr "El periodo de este usuario5"
      +
      +#. module: stock_planning
      +#: help:stock.planning,history:0
      +msgid "History of procurement or internal supply of this planning line."
      +msgstr ""
      +"Historial de abastecimiento o suministro interno de esta línea de "
      +"planificación."
      +
      +#. module: stock_planning
      +#: help:stock.planning,company_forecast:0
      +msgid ""
      +"All sales forecasts for whole company (for all Warehouses) of selected "
      +"Product during selected Period."
      +msgstr ""
      +"Todas las previsiones para la compañía entera (para todos los almacenes) del "
      +"producto seleccionado durante el periodo seleccionado."
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period1_per_user:0
      +msgid "This User Period1"
      +msgstr "El periodo de este usuario1"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period3_per_user:0
      +msgid "This User Period3"
      +msgstr "El periodo de este usuario3"
      +
      +#. module: stock_planning
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_planning_main
      +#: view:stock.planning:0
      +msgid "Stock Planning"
      +msgstr "Planificación de stock"
      +
      +#. module: stock_planning
      +#: field:stock.planning,minimum_op:0
      +msgid "Minimum Rule"
      +msgstr "Regla de mínimos"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Procure Incoming Left"
      +msgstr "Entradas abastecimiento restante"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:646
      +#: code:addons/stock_planning/stock_planning.py:688
      +#, python-format
      +msgid "    Incoming Left: "
      +msgstr "    Entradas restante: "
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:719
      +#, python-format
      +msgid "%s Pick List %s (%s,  %s) %s %s \n"
      +msgstr "%s Lista de selección %s (%s, %s) %s %s \n"
      +
      +#. module: stock_planning
      +#: view:stock.planning.createlines:0
      +#: view:stock.sale.forecast.createlines:0
      +msgid "Create"
      +msgstr "Crear"
      +
      +#. module: stock_planning
      +#: model:ir.actions.act_window,name:stock_planning.action_view_stock_planning_form
      +#: model:ir.module.module,shortdesc:stock_planning.module_meta_information
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_planning
      +#: view:stock.planning:0
      +msgid "Master Procurement Schedule"
      +msgstr "Plan maestro de abastecimiento"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:636
      +#: code:addons/stock_planning/stock_planning.py:678
      +#, python-format
      +msgid "  Creation Date: "
      +msgstr "  Fecha de creación: "
      +
      +#. module: stock_planning
      +#: field:stock.planning,period_id:0
      +#: field:stock.planning.createlines,period_id:0
      +#: field:stock.sale.forecast,period_id:0
      +#: field:stock.sale.forecast.createlines,period_id:0
      +msgid "Period"
      +msgstr "Período"
      +
      +#. module: stock_planning
      +#: view:stock.period:0
      +#: field:stock.period,state:0
      +#: field:stock.planning,state:0
      +#: field:stock.sale.forecast,state:0
      +msgid "State"
      +msgstr "Estado"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast.createlines,product_categ_id:0
      +msgid "Product Category of products which created forecasts will concern."
      +msgstr "Categoría de los productos cuyas previsiones se crearán."
      +
      +#. module: stock_planning
      +#: model:ir.model,name:stock_planning.model_stock_period
      +msgid "stock period"
      +msgstr "periodo stock"
      +
      +#. module: stock_planning
      +#: model:ir.model,name:stock_planning.model_stock_sale_forecast_createlines
      +msgid "stock.sale.forecast.createlines"
      +msgstr "stock.venta.previsión.crearlíneas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,warehouse_id:0
      +#: field:stock.planning.createlines,warehouse_id:0
      +#: field:stock.sale.forecast,warehouse_id:0
      +#: field:stock.sale.forecast.createlines,warehouse_id:0
      +msgid "Warehouse"
      +msgstr "Almacén"
      +
      +#. module: stock_planning
      +#: help:stock.planning,stock_simulation:0
      +msgid ""
      +"Stock simulation at the end of selected Period.\n"
      +" For current period it is: \n"
      +"Initial Stock - Already Out + Already In - Expected Out + Incoming Left.\n"
      +"For periods ahead it is: \n"
      +"Initial Stock - Planned Out Before + Incoming Before - Planned Out + Planned "
      +"In."
      +msgstr ""
      +"Simulación de stock al final del período seleccionado.\n"
      +" Para el periodo actual es: \n"
      +"Stock inicial – salidas + entradas – salidas previstas + entradas "
      +"esperadas.\n"
      +" Para los siguientes periodos es: \n"
      +"Stock inicial – salidas previstas anteriores + entradas anteriores – salidas "
      +"previstas + entradas previstas."
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,analyze_company:0
      +msgid "Check this box to see the sales for whole company."
      +msgstr "Seleccione esta casilla para ver las ventas de todda la compañía."
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,name:0
      +msgid "Name"
      +msgstr "Nombre"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Search Stock Planning"
      +msgstr "Buscar planificación de stock"
      +
      +#. module: stock_planning
      +#: field:stock.planning,incoming_before:0
      +msgid "Incoming Before"
      +msgstr "Entradas antes"
      +
      +#. module: stock_planning
      +#: field:stock.planning.createlines,product_categ_id:0
      +#: field:stock.sale.forecast.createlines,product_categ_id:0
      +msgid "Product Category"
      +msgstr "Categoría del producto"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:621
      +#: code:addons/stock_planning/stock_planning.py:663
      +#: code:addons/stock_planning/stock_planning.py:665
      +#: code:addons/stock_planning/stock_planning.py:667
      +#: code:addons/stock_planning/wizard/stock_planning_createlines.py:73
      +#: code:addons/stock_planning/wizard/stock_planning_forecast.py:60
      +#, python-format
      +msgid "Error !"
      +msgstr "¡ Error !"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:626
      +#, python-format
      +msgid "Manual planning for %s"
      +msgstr "Manual para la planificación de %s"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_user_id:0
      +msgid "This User"
      +msgstr "Este usuario"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:643
      +#: code:addons/stock_planning/stock_planning.py:685
      +#, python-format
      +msgid ""
      +"\n"
      +" Confirmed Out: "
      +msgstr ""
      +"\n"
      +" Salidas confirmadas: "
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Forecasts"
      +msgstr "Previsiones"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Supply from Another Warehouse"
      +msgstr "Abastecer desde otro almacén"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Calculate Planning"
      +msgstr "Calcular planificación"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:636
      +#, python-format
      +msgid ""
      +" Procurement created in MPS by user: %s   Creation Date: %s                  "
      +"                       \n"
      +" For period: %s                                         \n"
      +" according to state:                                         \n"
      +" Warehouse Forecast: %s                                         \n"
      +" Initial Stock: %s                                         \n"
      +" Planned Out: %s    Planned In: %s                                         \n"
      +" Already Out: %s    Already In: %s                                         \n"
      +" Confirmed Out: %s    Confirmed In: %s                                       "
      +"  \n"
      +" Planned Out Before: %s    Confirmed In Before: %s                           "
      +"              \n"
      +" Expected Out: %s    Incoming Left: %s                                       "
      +"  \n"
      +" Stock Simulation: %s    Minimum stock: %s"
      +msgstr ""
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:140
      +#, python-format
      +msgid "Invalid action !"
      +msgstr "¡Acción no válida!"
      +
      +#. module: stock_planning
      +#: help:stock.planning,stock_start:0
      +msgid "Stock quantity one day before current period."
      +msgstr "Cantidad stock un día antes del periodo actual."
      +
      +#. module: stock_planning
      +#: view:stock.period.createlines:0
      +msgid "Create Weekly Periods"
      +msgstr "Crear periodos semanales"
      +
      +#. module: stock_planning
      +#: help:stock.planning,maximum_op:0
      +msgid "Maximum quantity set in Minimum Stock Rules for this Warhouse"
      +msgstr ""
      +"Cantidad máxima establecida en las reglas de stock mínimo para este almacén."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:665
      +#, python-format
      +msgid "You must specify a Source Warehouse !"
      +msgstr "¡Debe especificar un almacén de origen!"
      +
      +#. module: stock_planning
      +#: view:stock.planning.createlines:0
      +msgid "Creates planning lines for selected period and warehouse."
      +msgstr ""
      +"Crea líneas de planificación para el periodo y almacén seleccionados."
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period4_per_user:0
      +msgid "This User Period4"
      +msgstr "Este periodo de usuario4"
      +
      +#. module: stock_planning
      +#: view:stock.planning.createlines:0
      +#: view:stock.sale.forecast.createlines:0
      +msgid "Note: Doesn't duplicate existing lines created by you."
      +msgstr "Nota: No duplica las líneas creadas por usted."
      +
      +#. module: stock_planning
      +#: view:stock.period:0
      +msgid "Stock and Sales Period"
      +msgstr "Periodo de stock y ventas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,company_forecast:0
      +msgid "Company Forecast"
      +msgstr "Previsión de la compañía"
      +
      +#. module: stock_planning
      +#: help:stock.planning,product_uom:0
      +#: help:stock.sale.forecast,product_uom:0
      +msgid ""
      +"Unit of Measure used to show the quanities of stock calculation.You can use "
      +"units form default category or from second category (UoS category)."
      +msgstr ""
      +"Unidad de medida utilizada para mostrar las cantidades calculadas de stock. "
      +"Puede utilizar las unidades de la categoría por defecto o las de la segunda "
      +"categoría (categoría UdV)."
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Per User :"
      +msgstr "Por usuario :"
      +
      +#. module: stock_planning
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast_all
      +#: view:stock.sale.forecast:0
      +msgid "Sales Forecasts"
      +msgstr "Previsiones de ventas"
      +
      +#. module: stock_planning
      +#: field:stock.period,name:0
      +#: field:stock.period.createlines,name:0
      +msgid "Period Name"
      +msgstr "Nombre del período"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,user_id:0
      +msgid "Created/Validated by"
      +msgstr "Creado/Validado por"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Internal Supply"
      +msgstr "Suministro interno"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period4_per_company:0
      +msgid "This Company Period4"
      +msgstr "El periodo de esta compañía4"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period5_per_company:0
      +msgid "This Company Period5"
      +msgstr "El periodo de esta compañía5"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period2_per_company:0
      +msgid "This Company Period2"
      +msgstr "El periodo de esta compañía2"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period3_per_company:0
      +msgid "This Company Period3"
      +msgstr "El periodo de esta compañía3"
      +
      +#. module: stock_planning
      +#: field:stock.period,date_start:0
      +#: field:stock.period.createlines,date_start:0
      +msgid "Start Date"
      +msgstr "Fecha de inicio"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:642
      +#: code:addons/stock_planning/stock_planning.py:684
      +#, python-format
      +msgid ""
      +"\n"
      +" Already Out: "
      +msgstr ""
      +"\n"
      +" Salidas realizadas: "
      +
      +#. module: stock_planning
      +#: field:stock.planning,confirmed_forecasts_only:0
      +msgid "Validated Forecasts"
      +msgstr "Previsiones validadas"
      +
      +#. module: stock_planning
      +#: help:stock.planning.createlines,product_categ_id:0
      +msgid ""
      +"Planning will be created for products from Product Category selected by this "
      +"field. This field is ignored when you check \"All Forecasted Product\" box."
      +msgstr ""
      +"Se creará la planificación para los productos de la categoría de productos "
      +"seleccionada con este campo. Este campo se ignora cuando se marca la opción "
      +"\"Todas las previsiones de productos”."
      +
      +#. module: stock_planning
      +#: field:stock.planning,planned_outgoing:0
      +msgid "Planned Out"
      +msgstr "Salidas planificadas"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Per Department :"
      +msgstr "Por departamento:"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Forecast"
      +msgstr "Previsión"
      +
      +#. module: stock_planning
      +#: selection:stock.period,state:0
      +#: selection:stock.planning,state:0
      +#: selection:stock.sale.forecast,state:0
      +msgid "Draft"
      +msgstr "Borrador"
      +
      +#. module: stock_planning
      +#: view:stock.period:0
      +msgid "Closed"
      +msgstr "Cerrada"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +#: view:stock.sale.forecast:0
      +msgid "Warehouse "
      +msgstr "Almacén "
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:646
      +#: code:addons/stock_planning/stock_planning.py:688
      +#, python-format
      +msgid ""
      +"\n"
      +" Expected Out: "
      +msgstr ""
      +"\n"
      +" Salidas previstas: "
      +
      +#. module: stock_planning
      +#: view:stock.period.createlines:0
      +msgid "Create periods for Stock and Sales Planning"
      +msgstr "Crear periodos para planificación de stock y ventas"
      +
      +#. module: stock_planning
      +#: help:stock.planning,planned_outgoing:0
      +msgid ""
      +"Enter planned outgoing quantity from selected Warehouse during the selected "
      +"Period of selected Product. To plan this value look at Confirmed Out or "
      +"Sales Forecasts. This value should be equal or greater than Confirmed Out."
      +msgstr ""
      +"Introduzca la cantidad saliente planificada para el almacén seleccionado "
      +"durante el periodo seleccionado y para el producto seleccionado. Para "
      +"planificar este valor puede fijarse en las salidas confirmadas o las "
      +"previsiones de ventas. Este valor debería ser igual o superior a las salidas "
      +"confirmadas."
      +
      +#. module: stock_planning
      +#: model:ir.module.module,description:stock_planning.module_meta_information
      +msgid ""
      +"\n"
      +"This module is based on original OpenERP SA module stock_planning version "
      +"1.0 of the same name Master Procurement Schedule.\n"
      +"\n"
      +"Purpose of MPS is to allow create a manual procurement (requisition) apart "
      +"of MRP scheduler (which works automatically on minimum stock rules).\n"
      +"\n"
      +"Terms used in the module:\n"
      +"- Stock and Sales Period - is the time (between Start Date and End Date) for "
      +"which you plan Stock and Sales Forecast and make Procurement Planning. \n"
      +"- Stock and Sales Forecast - is the quantity of products you plan to sell in "
      +"the Period.\n"
      +"- Stock Planning - is the quantity of products you plan to purchase or "
      +"produce for the Period.\n"
      +"\n"
      +"Because we have another module sale_forecast which uses terms \"Sales "
      +"Forecast\" and \"Planning\" as amount values we will use terms \"Stock and "
      +"Sales Forecast\" and \"Stock Planning\" to emphasize that we use quantity "
      +"values. \n"
      +"\n"
      +"Activity with this module is divided to three steps:\n"
      +"- Creating Periods. Mandatory step.\n"
      +"- Creating Sale Forecasts and entering quantities to them. Optional step but "
      +"useful for further planning.\n"
      +"- Creating Planning lines, entering quantities to them and making "
      +"Procurement. Making procurement is the final step for the Period.\n"
      +"\n"
      +"Periods\n"
      +"=======\n"
      +"You have two menu items for Periods in \"Sales Management - Configuration\". "
      +"There are:\n"
      +"- \"Create Sales Periods\" - Which automates creating daily, weekly or "
      +"monthly periods.\n"
      +"- \"Stock and sales Periods\" - Which allows to create any type of periods, "
      +"change the dates and change the State of period.\n"
      +"\n"
      +"Creating periods is the first step you have to do to use modules features. "
      +"You can create custom periods using \"New\" button in \"Stock and Sales "
      +"Periods\" form or view but it is recommended to use automating tool.\n"
      +"\n"
      +"Remarks:\n"
      +"- These periods (officially Stock and Sales Periods) are separated of "
      +"Financial or other periods in the system.\n"
      +"- Periods are not assigned to companies (when you use multicompany feature "
      +"at all). Module suppose that you use the same periods across companies. If "
      +"you wish to use different periods for different companies define them as you "
      +"wish (they can overlap). Later on in this text will be indications how to "
      +"use such periods.\n"
      +"- When periods are created automatically their start and finish dates are "
      +"with start hour 00:00:00 and end hour 23:59:00. Fe. when you create daily "
      +"periods they will have start date 31.01.2010 00:00:00 and end date "
      +"31.01.2010 23:59:00. It works only in automatic creation of periods. When "
      +"you create periods manually you have to take care about hours because you "
      +"can have incorrect values form sales or stock. \n"
      +"- If you use overlapping periods for the same product, warehouse and company "
      +"results can be unpredictable.\n"
      +"- If current date doesn't belong to any period or you have holes between "
      +"periods results can be unpredictable.\n"
      +"\n"
      +"Sales Forecasts\n"
      +"===============\n"
      +"You have few menus for Sales forecast in \"Sales Management - Sales "
      +"Forecasts\".\n"
      +"- \"Create Sales Forecasts for Sales Periods\" - which automates creating "
      +"forecasts lines according to some parameters.\n"
      +"- \"Sales Forecasts\" - few menus for working with forecasts lists and "
      +"forms.\n"
      +"\n"
      +"Menu \"Create Sales Forecasts for Sales Periods\" creates Forecasts for "
      +"products from selected Category, for selected Period and for selected "
      +"Warehouse. It is an option \"Copy Last Forecast\" to copy forecast and other "
      +"settings of period before this one to created one.\n"
      +"\n"
      +"Remarks:\n"
      +"- This tool doesn't create lines, if relevant lines (for the same Product, "
      +"Period, Warehouse and validated or created by you) already exists. If you "
      +"wish to create another forecast, if relevant lines exists you have to do it "
      +"manually using menus described bellow.\n"
      +"- When created lines are validated by someone else you can use this tool to "
      +"create another lines for the same Period, Product and Warehouse. \n"
      +"- When you choose \"Copy Last Forecast\" created line takes quantity and "
      +"some settings from your (validated by you or created by you if not validated "
      +"yet) forecast which is for last period before period of created forecast. If "
      +"there are few your forecasts for period before this one (it is possible) "
      +"system takes one of them (no rule which of them).\n"
      +"\n"
      +"\n"
      +"Menus \"Sales Forecasts\"\n"
      +"On \"Sales Forecast\" form mainly you have to enter a forecast quantity in "
      +"\"Product Quantity\". Further calculation can work for draft forecasts. But "
      +"validation can save your data against any accidental changes. You can click "
      +"\"Validate\" button but it is not mandatory.\n"
      +"\n"
      +"Instead of forecast quantity you can enter amount of forecast sales in field "
      +"\"Product Amount\". System will count quantity from amount according to Sale "
      +"price of the Product.\n"
      +"\n"
      +"All values on the form are expressed in unit of measure selected on form. "
      +"You can select one of unit of measure from default category or from second "
      +"category. When you change unit of measure the quanities will be recalculated "
      +"according to new UoM: editable values (blue fields) immediately, non edited "
      +"fields after clicking of \"Calculate Planning\" button.\n"
      +"\n"
      +"To find proper value for Sale Forecast you can use \"Sales History\" table "
      +"for this product. You have to enter parameters to the top and left of this "
      +"table and system will count sale quantities according to these parameters. "
      +"So you can select fe. your department (at the top) then (to the left): last "
      +"period, period before last and period year ago.\n"
      +"\n"
      +"Remarks:\n"
      +"\n"
      +"\n"
      +"Procurement Planning\n"
      +"====================\n"
      +"Menu for Planning you can find in \"Warehouse - Stock Planning\".\n"
      +"- \"Create Stock Planning Lines\" - allows you to automate creating planning "
      +"lines according to some parameters.\n"
      +"- \"Master Procurement Scheduler\" - is the most important menu of the "
      +"module which allows to create procurement.\n"
      +"\n"
      +"As Sales forecast is phase of planning sales. The Procurement Planning "
      +"(Planning) is the phase of scheduling Purchasing or Producing. You can "
      +"create Procurement Planning quickly using tool from menu \"Create Stock "
      +"Planning Lines\", then you can review created planning and make procurement "
      +"using menu \"Master Procurement Schedule\".\n"
      +"\n"
      +"Menu \"Create Stock Planning Lines\" allows you to create quickly Planning "
      +"lines for products from selected Category, for selected Period, and for "
      +"selected Warehouse. When you check option \"All Products with Forecast\" "
      +"system creates lines for all products having forecast for selected Period "
      +"and Warehouse. Selected Category will be ignored in this case.\n"
      +"\n"
      +"Under menu \"Master Procurement Scheduler\" you can generally change the "
      +"values \"Planned Out\" and \"Planned In\" to observe the field \"Stock "
      +"Simulation\" and decide if this value would be accurate for end of the "
      +"Period. \n"
      +"\"Planned Out\" can be based on \"Warehouse Forecast\" which is the sum of "
      +"all forecasts for Period and Warehouse. But your planning can be based on "
      +"any other information you have. It is not necessary to have any forecast. \n"
      +"\"Planned In\" quantity is used to calculate field \"Incoming Left\" which "
      +"is the quantity to be procured to make stock as indicated in \"Stock "
      +"Simulation\" at the end of Period. You can compare \"Stock Simulation\" "
      +"quantity to minimum stock rules visible on the form. But you can plan "
      +"different quantity than in Minimum Stock Rules. Calculation is made for "
      +"whole Warehouse by default. But if you want to see values for Stock location "
      +"of calculated warehouse you can use check box \"Stock Location Only\".\n"
      +"\n"
      +"If after few tries you decide that you found correct quantities for "
      +"\"Planned Out\" and \"Planned In\" and you are satisfied with end of period "
      +"stock calculated in \"Stock Simulation\" you can click \"Procure Incoming "
      +"Left\" button to procure quantity of field \"Incoming Left\" into the "
      +"Warehouse. System creates appropriate Procurement Order. You can decide if "
      +"procurement will be made to Stock or Input location of calculated Warehouse. "
      +"\n"
      +"\n"
      +"If you don't want to Produce or Buy the product but just pick calculated "
      +"quantity from another warehouse you can click \"Supply from Another "
      +"Warehouse\" (instead of \"Procure Incoming Left\"). System creates pick list "
      +"with move from selected source Warehouse to calculated Warehouse (as "
      +"destination). You can also decide if this pick should be done from Stock or "
      +"Output location of source warehouse. Destination location (Stock or Input) "
      +"of destination warehouse will be used as set for \"Procure Incoming Left\". "
      +"\n"
      +"\n"
      +"To see proper quantities in fields \"Confirmed In\", \"Confirmed Out\", "
      +"\"Confirmed In Before\", \"Planned Out Before\" and \"Stock Simulation\" you "
      +"have to click button \"Calculate Planning\".\n"
      +"\n"
      +"All values on the form are expressed in unit of measure selected on form. "
      +"You can select one of unit of measure from default category or from second "
      +"category. When you change unit of measure the quanities will be recalculated "
      +"according to new UoM: editable values (blue fields) immediately, non edited "
      +"fields after clicking of \"Calculate Planning\" button.\n"
      +"\n"
      +"How Stock Simulation field is calculated:\n"
      +"Generally Stock Simulation shows the stock for end of the calculated period "
      +"according to some planned or confirmed stock moves. Calculation always "
      +"starts with quantity of real stock of beginning of current period. Then "
      +"calculation adds or subtracts quantities of calculated period or periods "
      +"before calculated.\n"
      +"When you are in the same period (current period is the same as calculated) "
      +"Stock Simulation is calculated as follows:\n"
      +"Stock Simulation = \n"
      +"\tStock of beginning of current Period\n"
      +"\t- Planned Out \n"
      +"\t+ Planned In\n"
      +"\n"
      +"When you calculate period next to current:\n"
      +"Stock Simulation = \n"
      +"\tStock of beginning of current Period\n"
      +"\t- Planned Out of current Period \n"
      +"\t+ Confirmed In of current Period  (incl. Already In)\n"
      +"\t- Planned Out of calculated Period \n"
      +"\t+ Planned In of calculated Period .\n"
      +"\n"
      +"As you see calculated Period is taken the same way like in case above. But "
      +"calculation of current Period are made a little bit different. First you "
      +"should note that system takes for current Period only Confirmed In moves. It "
      +"means that you have to make planning and procurement for current Period "
      +"before this calculation (for Period next to current). \n"
      +"\n"
      +"When you calculate Period ahead:\n"
      +"Stock Simulation = \n"
      +"\tStock of beginning of current Period \n"
      +"\t- Sum of Planned Out of Periods before calculated \n"
      +"\t+ Sum of Confirmed In of Periods before calculated (incl. Already In) \n"
      +"\t- Planned Out of calculated Period \n"
      +"\t+ Planned In of calculated Period.\n"
      +"\n"
      +"Periods before calculated means periods starting from current till period "
      +"before calculated.\n"
      +"\n"
      +"Remarks:\n"
      +"- Remember to make planning for all periods before calculated because "
      +"omitting these quantities and procurements can cause wrong suggestions for "
      +"procurements few periods ahead.\n"
      +"- If you made planning few periods ahead and you find that real Confirmed "
      +"Out is bigger than Planned Out in some periods before you can repeat "
      +"Planning and make another procurement. You should do it in the same planning "
      +"line. If you create another planning line the suggestions can be wrong.\n"
      +"- When you wish to work with different periods for some part of products "
      +"define two kinds of periods (fe. Weekly and Monthly) and use them for "
      +"different products. Example: If you use always Weekly periods for Products "
      +"A, and Monthly periods for Products B your all calculations will work "
      +"correctly. You can also use different kind of periods for the same products "
      +"from different warehouse or companies. But you cannot use overlapping "
      +"periods for the same product, warehouse and company because results can be "
      +"unpredictable. The same apply to Forecasts lines.\n"
      +msgstr ""
      +"\n"
      +"Este módulo se basa en la versión original de OpenERP stock_planning SA "
      +"módulo 1.0 del mismo nombre Programador de Compras Maestras.\n"
      +"\n"
      +"El propósito de la MPS es permitir crear un manual de contratación "
      +"(solicitud), aparte del programador MRP (que funciona automáticamente, "
      +"basándose en reglas de existencias mínimas).\n"
      +"\n"
      +"Los términos utilizados en el módulo:\n"
      +"- Stock y Período de ventas - es el tiempo (entre Fecha de inicio y Fecha de "
      +"finalización) para el que planifica el Stock y la Previsión de Ventas y hace "
      +"la Planificación de las Compras.\n"
      +"- Stock y pronóstico de ventas - es la cantidad de productos que planea "
      +"vender en el Período.\n"
      +"- Planificación de Stock - es la cantidad de productos que planea comprar o "
      +"producir para el Período.\n"
      +"\n"
      +"Porque tenemos otra módulo sale_forecast que utiliza los términos "
      +"\"Pronóstico de Ventas\" y \"Planificación\" como valores de cantidad, "
      +"utilizaremos términos \"Stock y Pronóstico de Ventas\" y \"Planificación del "
      +"Stock\" para hacer hincapié en que usamos los valores de cantidad.\n"
      +"\n"
      +"La actividad con este módulo se divide en tres pasos:\n"
      +"- Creación de Períodos. Paso obligatorio.\n"
      +"- Creación de Pronósticos de Venta e introducción de sus cantidades. Un paso "
      +"opcional pero útil para una mayor planificación.\n"
      +"- Creación de líneas de Planificación, introducción de sus cantidades y "
      +"hacer Adquisiciones. Hacer compras es el paso final para el Período.\n"
      +"\n"
      +"Períodos\n"
      +"=========\n"
      +"Tiene dos opciones de menú para Períodos en \"Gestión de Ventas - "
      +"Configuración\". Son las siguientes:\n"
      +"- \"Crear los Períodos de Ventas\" - Que automatiza la creación de periodos "
      +"diarios, semanales o mensuales.\n"
      +"- \"Stock y Períodos de ventas\" - Que permite crear cualquier tipo de "
      +"períodos, el cambio de las fechas y el cambio del Estado del período.\n"
      +"\n"
      +"Creación de periodos es el primer paso que tiene que hacer para utilizar las "
      +"funciones de los módulos. Puede crear períodos personalizados mediante el "
      +"botón \"Nuevo\" en el formulario o vista de \"Stock y Períodos de Ventas\", "
      +"pero se recomienda utilizar la herramienta automática.\n"
      +"\n"
      +"Observaciones:\n"
      +"- Estos períodos (Stock oficial y Períodos de Ventas) están separan de "
      +"Finanzas o de otros períodos en el sistema.\n"
      +"- Los Períodos no se asignan a las compañías (en ningún caso cuando se "
      +"utiliza la función multicompañía). El módulo supone que utiliza los mismos "
      +"períodos a través de las compañías. Si desea utilizar períodos diferentes "
      +"para diferentes compañías defínalos a su gusto (pueden solaparse). Más "
      +"adelante en este texto se indica cómo utilizar esos períodos.\n"
      +"- Cuando los períodos son creados automáticamente sus fechas de inicio y "
      +"final se inician con la hora 00:00:00 y 23:59:00 como hora final. Pe.cuando "
      +"crea períodos diarios tendrán fecha de inicio 01.31.2010 00:00:00 y fecha de "
      +"finalización 01.31.2010 23:59:00. Funciona sólo en la creación automática de "
      +"los períodos. Cuando crea períodos manualmente hay que tener cuidado con las "
      +"horas, ya que puede tener valores incorrectos en ventas y stock.\n"
      +"- Si utiliza períodos solapados para el mismo producto, almacén y compañía, "
      +"los resultados pueden ser impredecibles.\n"
      +"- Si la fecha actual no pertenece a ningún período o si tiene agujeros entre "
      +"los períodos los resultados pueden ser impredecibles.\n"
      +"\n"
      +"Previsión de ventas\n"
      +"====================\n"
      +"Tiene menús pocas ventas previsto en \"Gestión de Ventas - Pronósticos de "
      +"Ventas\".\n"
      +"- \"Creación de Pronósticos de Ventas para los Períodos de Ventas\" - que "
      +"automatiza la creación de líneas de previsiones de acuerdo con algunos "
      +"parámetros.\n"
      +"- \"Las Previsiones de Ventas\" - algunos menús para trabajar con listas de "
      +"las previsiones y las formas.\n"
      +"\n"
      +"Menú \"Crear Pronósticos de Ventas para Períodos de Ventas\" crea "
      +"Pronósticos para los productos de la Categoría seleccionada, para el Período "
      +"y Almacén seleccionado. Es una opción \"Copia del Último Pronóstico\" para "
      +"copiar previsiones y otros ajustes del período anterior a éste para crear "
      +"uno.\n"
      +"\n"
      +"Observaciones:\n"
      +"- Esta herramienta no crea líneas, si las líneas oportunas (para el mismo "
      +"Producto, Período y Almacén, y validado o creado por usted) ya existen. Si "
      +"desea crear otro pronóstico, si las líneas pertinentes existen tiene que "
      +"hacerlo manualmente usando los menús que se describen a continuación.\n"
      +"- Cuando las líneas se crean son validadas por otra persona que puede "
      +"utilizar esta herramienta para crear otras líneas para el mismo Período, "
      +"Producto y Almacén.\n"
      +"- Cuando se elige \"Copiar Último Pronóstico\" la línea creada tiene la "
      +"cantidad y algunos ajustes de su (validado o creadas por usted, si no se ha "
      +"validado aún) pronostico que para el último período anterior al período de "
      +"la previsión creada. Si hay pocos pronósticos para el período anterior a "
      +"éste (es posible) el sistema toma una de ellos (no existe regla sobre "
      +"cual).\n"
      +"\n"
      +"\n"
      +"Menús \"Previsión de Ventas\"\n"
      +"En el formulario \"Pronóstico de Ventas\" principalmente tiene que "
      +"introducir una cantidad prevista en la \"Cantidad de Producto\". Además del "
      +"cálculo puede funcionar para las previsiones borrador. Sin embargo, la "
      +"validación puede guardar sus datos contra cualquier cambio accidental. Puede "
      +"hacer clic en botón \"Validar\", pero no es obligatorio.\n"
      +"\n"
      +"En lugar de la cantidad prevista se puede introducir la cantidad de "
      +"previsión de ventas en el campo \"Cantidad de Producto\". El sistema contará "
      +"la cantidad en función del Precio de Venta del Producto.\n"
      +"\n"
      +"Todos los valores del formulario se expresan en la unidad de medida "
      +"seleccionada en el formulario. Usted puede seleccionar uno de la unidad de "
      +"medida de la categoría por defecto o de segunda categoría. Cuando se cambia "
      +"la unidad de medida las cantiades se volverán a calcular de acuerdo con la "
      +"nueva UoM: los valores editables (campos azules) inmediatamente, los campos "
      +"no editables después de hacer clic en el botón \"Calcular Planificación\".\n"
      +"\n"
      +"Para encontrar el valor adecuado para Pronóstico de Venta se puede utilizar "
      +"la tabla \"Historial de ventas\" para este producto. Tienes que introducir "
      +"los parámetros en la parte superior izquierda de esta tabla y el sistema "
      +"contará las vantidades venta de acuerdo con estos parámetros. Así que usted "
      +"puede seleccionar, pe. de su departamento (en la parte superior) y luego (a "
      +"la izquierda): el último período, el período anterior al último y el período "
      +"de hace un año.\n"
      +"\n"
      +"Observaciones:\n"
      +"\n"
      +"\n"
      +"Planificación de las compras\n"
      +"====================\n"
      +"Menú para la Planificación de lo que puedes encontrar en \"Almacén - "
      +"Planificación del Stock\".\n"
      +"- \"Crear archivo de Planificación Lines\" - le permite automatizar la "
      +"creación de líneas de planificación de acuerdo con algunos parámetros.\n"
      +"- \"Programador Maestro de Adquisiciones\" - es el menú más importante del "
      +"módulo que permite la creación de la contratación.\n"
      +"\n"
      +"Con arreglo a las previsiones de ventas, es la fase de planificación de "
      +"ventas. La Planificación de compras (planificación) es la fase de "
      +"programación de compras o de producción. Usted puede crear la planificación "
      +"de las compras rápidamente con la herramienta del menú \"Crear Líneas de "
      +"Planificación de Stock\", entonces puede revisar la planificación creada y "
      +"hacer compras usando el menú \"Lista Maestra de Adquisiciones\".\n"
      +"\n"
      +"Menú \"Crear Líneas de Planificación de Stock\" le permite crear rápidamente "
      +"las Líneas de Planificación de productos de la categoría seleccionada, en "
      +"determinados períodos, y para el almacén seleccionado. Al marcar la opción "
      +"\"Todos los productos con Pronóstico\" el sistema crea las líneas para todos "
      +"los productos que tiene previsto para el Período seleccionado y Almacén. La "
      +"Categoría seleccionada se tendrá en cuenta en este caso.\n"
      +"\n"
      +"Debajo del menú \"Programador Maestro de Adquisiciones\" por lo general, "
      +"puede cambiar los valores \"Salidas planificadas\" y \"Entradas "
      +"planificadas\" para observar el campo \"Simulación de Stock\" y decidir si "
      +"este valor es exacto para el final del período.\n"
      +"\"Planeado\" puede basarse en la \"Pronóstico de Almacén\", que es la suma "
      +"de todas las previsiones para el período y Almacén. Pero la planificación se "
      +"puede basar en cualquier otra información que usted tenga. No es necesario "
      +"tener ningún pronóstico.\n"
      +"\"Entradas planificadas\" la cantidad se utiliza para calcular el campo "
      +"\"Entradas Restantes\" que es la cantidad que falta por adquirir para "
      +"alcanzar el stock, como se indica en la \"Simulación de Stock\" al final del "
      +"período. Usted puede comparar la \"Simulación de Stock\" con las normas de "
      +"cantidad mínima de existencias visibles en el formulario. Pero puede planear "
      +"una cantidad diferente al de las Reglas Mínimas de Stock. El cálculo está "
      +"hecho para todo el almacén por defecto. Pero si usted quiere ver los valores "
      +"de la ubicación del stock del almacén calculado, puede utilizar la casilla "
      +"\"Sólo Ubicación del Stock\".\n"
      +"\n"
      +"Si después de varios intentos decide que las cantidades son correctas para "
      +"lo \"Salidas planificadas\" y lo \"Entradas planificadas\" y que está "
      +"satisfecho con el final de existencias del período calculado en la "
      +"\"Simulación del Stock\" puede hacer clic en \"Adquirir Entradas Restantes\" "
      +"para obtener la cantidad del campo \"Entradas Restantes\" en el Almacén. El "
      +"sistema crea la correspondiente Orden de Compras. Usted puede decidir si la "
      +"contratación se hará para el stock o para la ubicación de entrada del "
      +"Almacén calculado.\n"
      +"\n"
      +"Si no quieres Producir o Comprar el producto, pero sólo debes elegir la "
      +"cantidad calculada, desde otro almacén puede hacer clic en \"Suministro "
      +"desde Otro Almacén\" (en lugar de \"Adquirir Entradas Restantes\"). El "
      +"sistema crea la lista de selección desde el Almacén origen seleccionado "
      +"hasta el Almacén calculado (como destino). También puede decidir si esta "
      +"selección debe hacerse de almacén o la ubicación de salida del almacén de "
      +"origen. La ubicación de destino (almacén o entrada) del almacén de destino, "
      +"se utilizará como establecido para \"Adquirir Entradas Restantes\".\n"
      +"\n"
      +"Para ver las cantidades adecuadas en los campos \"Entrada Confirmada\", "
      +"\"Salida Confirmada\", \"Entrada Confirmada Antes\", \"Salidas planificadas "
      +"antes\" y \"Simulación de Stock\" tiene que hacer clic en el botón "
      +"\"Calcular Planificación\".\n"
      +"\n"
      +"Todos los valores en el formulario se expresan en la unidad de medida "
      +"seleccionada en el formulario. Usted puede seleccionar uno de la unidad de "
      +"medida de la categoría por defecto o de una segunda categoría. Cuando se "
      +"cambia la unidad de medida las cantidades se volverán a calcular de acuerdo "
      +"con UoM: los valores editables inmediatamente (campos azules), los campos no "
      +"editables después de hacer clic en el botón \"Calcular Planificación\".\n"
      +"\n"
      +"Cómo se calcula el campo Simulación del Stock:\n"
      +"Generalmente la Simulación del Stock muestra el stock al final período "
      +"calculado de acuerdo con algunos movimientos de stock previsto o confirmado. "
      +"El cálculo se inicia siempre con la cantidad de stock real del inicio del "
      +"período actual. Luego se calcula la suma o resta de las cantidades del "
      +"período o períodos antes calculados.\n"
      +"Cuando está en el mismo período (período actual es el mismo que el "
      +"calculado) la Simulación del Stock se calcula como sigue:\n"
      +"Simulación de Stock = \n"
      +"\t Stock inicial del período actual\n"
      +"\t - Salidas planificadas \n"
      +"\t + Entradas planificadas\n"
      +"\n"
      +"Cuando se calcula el período siguiente al actual:\n"
      +"Simulación del Stock = \n"
      +"\t Stock inicial del período actual \n"
      +"\t - Planificación de Salidas del Período actual\n"
      +"\t + Entradas Confirmadas en el Período actual (incl. las Entradas ya "
      +"existentes)\n"
      +"\t - Salidas planificadas del Período calculado \n"
      +"\t + Entradas planificadas en el Período calculado.\n"
      +"\n"
      +"Como puede ver el período calculado se toma de la misma forma que en el caso "
      +"anterior. Sin embargo, el cálculo del período actual se hace de manera un "
      +"poco diferente. En primer lugar debe tener en cuenta que el sistema tiene "
      +"para el Período actual sólo Confirmados los movimientos de entrada. Esto "
      +"significa que tiene que hacer la planificación y la compra para Período "
      +"actual antes de este cálculo (para el Próximo período al actual).\n"
      +"\n"
      +"Cuando se calcula el período siguiente:\n"
      +"Colección de simulación = \n"
      +"\t Stock inicial del Período actual \n"
      +"\t - Suma de Planificación de salida de los períodos antes calculados \n"
      +"\t + Suma de Confirmados En períodos anteriores calculados (incl. las "
      +"entradas ya existentes) \n"
      +"\t - Salidas Planificadas del Período calculado \n"
      +"\t + Entradas Planificadas del Período calculado.\n"
      +"\n"
      +"Los períodos anteriores calculados, significa que los períodos comienzados "
      +"en el actual hasta el período antes calculado.\n"
      +"\n"
      +"Observaciones:\n"
      +"- Recuerde hacer la planificación para todos los períodos antes calculados "
      +"debido a omitir estas cantidades y las adquisiciones pueden causar "
      +"sugerencias erróneas para las compras de algunos períodos posteriores.\n"
      +"- Si ha realizado la planificación de unos pocos períodos posteriores y "
      +"encuentra que las Salidas Confirmadas reales son mayores de lo previsto en "
      +"algunos períodos antes de que pueda repetirse la Planificación y realizar "
      +"otra adquisición. Debe hacerlo en la misma línea de la planificación. Si se "
      +"crea otra línea de planificación de sugerencias puede estar equivocada.\n"
      +"- Cuando desea trabajar con diferentes períodos para una parte de los "
      +"productos, defina dos tipos de períodos (pe. semanal y mensual) y los "
      +"utilícelos para diferentes productos. Ejemplo: si utiliza siempre los "
      +"períodos semanales para los productos A, y los períodos mensuales de los "
      +"productos B todos sus cálculos funcionarán correctamente. También puede "
      +"utilizar diferentes tipos de períodos para los mismos productos de "
      +"diferentes almacenes de diferentes compañías. Pero no se pueden utilizar "
      +"períodos solapados para el mismo producto de un almacén, y compañía porque "
      +"los resultados pueden ser impredecibles. Lo mismo se aplica a las líneas de "
      +"Previsiones.\n"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:140
      +#, python-format
      +msgid "Cannot delete Validated Sale Forecasts !"
      +msgstr "¡ No se pueden borrar previsiones de ventas validadas !"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:641
      +#: code:addons/stock_planning/stock_planning.py:683
      +#, python-format
      +msgid ""
      +"\n"
      +" Planned Out: "
      +msgstr ""
      +"\n"
      +" Salidas planificadas: "
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:667
      +#, python-format
      +msgid ""
      +"You must specify a Source Warehouse different than calculated (destination) "
      +"Warehouse !"
      +msgstr ""
      +"¡Debe especificar un almacén de origen diferente del almacén calculado (de "
      +"destino)!"
      +
      +#. module: stock_planning
      +#: model:ir.actions.act_window,name:stock_planning.action_stock_sale_forecast_createlines_form
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast_createlines
      +msgid "Create Sales Forecasts"
      +msgstr "Crear previsiones de ventas"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast.createlines:0
      +msgid "Creates forecast lines for selected warehouse and period."
      +msgstr "Crear líneas de previsión para el almacén y periodo seleccionados."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:656
      +#, python-format
      +msgid "%s Requisition (%s,  %s) %s %s \n"
      +msgstr "%s Solicitud (%s, %s) %s %s \n"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:655
      +#, python-format
      +msgid "Requisition ("
      +msgstr "Solicitud ("
      +
      +#. module: stock_planning
      +#: help:stock.planning,outgoing_left:0
      +msgid ""
      +"Quantity expected to go out in selected period. As a difference between "
      +"Planned Out and Confirmed Out. For current period Already Out is also "
      +"calculated"
      +msgstr ""
      +"Cantidad prevista para salir en el período seleccionado. Diferencia entre "
      +"las salidas previstas y las salidas confirmadas. Para el periodo actual "
      +"también se calculan las salidas realizadas."
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period4_id:0
      +msgid "Period4"
      +msgstr "Periodo4"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:642
      +#: code:addons/stock_planning/stock_planning.py:684
      +#, python-format
      +msgid "    Already In: "
      +msgstr "    Entradas realizadas: "
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period2_id:0
      +msgid "Period2"
      +msgstr "Periodo2"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period3_id:0
      +msgid "Period3"
      +msgstr "Periodo3"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period1_id:0
      +msgid "Period1"
      +msgstr "Periodo1"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:647
      +#: code:addons/stock_planning/stock_planning.py:689
      +#, python-format
      +msgid "    Minimum stock: "
      +msgstr "    Stock mínimo: "
      +
      +#. module: stock_planning
      +#: field:stock.planning,active_uom:0
      +#: field:stock.sale.forecast,active_uom:0
      +msgid "Active UoM"
      +msgstr "UdM activa"
      +
      +#. module: stock_planning
      +#: model:ir.actions.act_window,name:stock_planning.action_stock_planning_createlines_form
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_planning_createlines
      +#: view:stock.planning.createlines:0
      +msgid "Create Stock Planning Lines"
      +msgstr "Crear líneas de planificación de stock"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "General Info"
      +msgstr "Información General"
      +
      +#. module: stock_planning
      +#: model:ir.actions.act_window,name:stock_planning.action_view_stock_sale_forecast_form
      +msgid "Sales Forecast"
      +msgstr "Previsión de ventas"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Planning and Situation for Calculated Period"
      +msgstr "Planificación y situación para el periodo calculado"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period1_per_warehouse:0
      +msgid "This Warehouse Period1"
      +msgstr "Peridodo de este almacen1"
      +
      +#. module: stock_planning
      +#: field:stock.planning,warehouse_forecast:0
      +msgid "Warehouse Forecast"
      +msgstr "Previsión almacen"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:643
      +#: code:addons/stock_planning/stock_planning.py:685
      +#, python-format
      +msgid "    Confirmed In: "
      +msgstr "    Entradas confirmadas: "
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Sales history"
      +msgstr "Histórico de ventas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,supply_warehouse_id:0
      +msgid "Source Warehouse"
      +msgstr "Almacén origen"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,product_qty:0
      +msgid "Forecasted quantity."
      +msgstr "Cantidad prevista."
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Stock"
      +msgstr "Stock"
      +
      +#. module: stock_planning
      +#: field:stock.planning,stock_supply_location:0
      +msgid "Stock Supply Location"
      +msgstr "Ubicación suministro de stock"
      +
      +#. module: stock_planning
      +#: help:stock.period.createlines,date_stop:0
      +msgid "Ending date for planning period."
      +msgstr "Fecha de fin para el periodo planificado."
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period2_per_user:0
      +msgid "This User Period2"
      +msgstr "El periodo de este usuario2"
      +
      +#. module: stock_planning
      +#: help:stock.planning.createlines,forecasted_products:0
      +msgid ""
      +"Check this box to create planning for all products having any forecast for "
      +"selected Warehouse and Period. Product Category field will be ignored."
      +msgstr ""
      +"Marque esta opción para crear la planificación de todos los productos que "
      +"tengan cualquier previsión en el almacén y periodo seleccionado. El campo "
      +"categoría de producto será ignorado."
      +
      +#. module: stock_planning
      +#: field:stock.planning,already_in:0
      +msgid "Already In"
      +msgstr "Entradas realizadas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,product_uom_categ:0
      +#: field:stock.planning,product_uos_categ:0
      +#: field:stock.sale.forecast,product_uom_categ:0
      +msgid "Product UoM Category"
      +msgstr "Categoría UdM producto"
      +
      +#. module: stock_planning
      +#: field:stock.planning,incoming:0
      +msgid "Confirmed In"
      +msgstr "Entradas confirmadas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,line_time:0
      +msgid "Past/Future"
      +msgstr "Pasado/Futuro"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,product_uos_categ:0
      +msgid "Product UoS Category"
      +msgstr "Categoría UdV producto"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,product_qty:0
      +msgid "Product Quantity"
      +msgstr "Cantidad de producto"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast.createlines,copy_forecast:0
      +msgid "Copy Last Forecast"
      +msgstr "Copiar última previsión"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,product_id:0
      +msgid "Shows which product this forecast concerns."
      +msgstr "Muestra a qué producto concierne esta previsión"
      +
      +#. module: stock_planning
      +#: selection:stock.planning,state:0
      +msgid "Done"
      +msgstr "Listo"
      +
      +#. module: stock_planning
      +#: field:stock.period.createlines,period_ids:0
      +msgid "Periods"
      +msgstr "Periodos"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:638
      +#: code:addons/stock_planning/stock_planning.py:680
      +#, python-format
      +msgid " according to state:"
      +msgstr " según el estado:"
      +
      +#. module: stock_planning
      +#: view:stock.period.createlines:0
      +msgid "Cancel"
      +msgstr "Cancelar"
      +
      +#. module: stock_planning
      +#: view:stock.period:0
      +#: selection:stock.period,state:0
      +#: view:stock.planning.createlines:0
      +#: view:stock.sale.forecast.createlines:0
      +msgid "Close"
      +msgstr "Cerrar"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +#: selection:stock.sale.forecast,state:0
      +msgid "Validated"
      +msgstr "Validado"
      +
      +#. module: stock_planning
      +#: view:stock.period:0
      +#: selection:stock.period,state:0
      +msgid "Open"
      +msgstr "Abrir"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast.createlines,copy_forecast:0
      +msgid "Copy quantities from last Stock and Sale Forecast."
      +msgstr "Copiar cantidades desde el stock pasado y previsión de ventas"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period1_per_dept:0
      +msgid "This Dept Period1"
      +msgstr "El periodo de este depto.1"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period3_per_dept:0
      +msgid "This Dept Period3"
      +msgstr "El periodo de este depto.3"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period2_per_dept:0
      +msgid "This Dept Period2"
      +msgstr "El periodo de este depto.2"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period5_per_dept:0
      +msgid "This Dept Period5"
      +msgstr "El periodo de este depto.5"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period4_per_dept:0
      +msgid "This Dept Period4"
      +msgstr "El periodo de este depto.4"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period2_per_warehouse:0
      +msgid "This Warehouse Period2"
      +msgstr "El periodo de este almacén2"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period3_per_warehouse:0
      +msgid "This Warehouse Period3"
      +msgstr "El periodo de este almacén3"
      +
      +#. module: stock_planning
      +#: field:stock.planning,outgoing:0
      +msgid "Confirmed Out"
      +msgstr "Salidas confirmadas"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,create_uid:0
      +msgid "Responsible"
      +msgstr "Responsable"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Default UOM"
      +msgstr "UdM por defecto"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period4_per_warehouse:0
      +msgid "This Warehouse Period4"
      +msgstr "El periodo de este almacén4"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period5_per_warehouse:0
      +msgid "This Warehouse Period5"
      +msgstr "El periodo de este almacén5"
      +
      +#. module: stock_planning
      +#: view:stock.period:0
      +msgid "Current"
      +msgstr "Actual"
      +
      +#. module: stock_planning
      +#: model:ir.model,name:stock_planning.model_stock_planning
      +msgid "stock.planning"
      +msgstr "stock.planificación"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,warehouse_id:0
      +msgid ""
      +"Shows which warehouse this forecast concerns. If during stock planning you "
      +"will need sales forecast for all warehouses choose any warehouse now."
      +msgstr ""
      +"Muestra a qué almacén concierne esta previsión. Si durante la planificación "
      +"de stock necesita previsiones de ventas para todos los almacenes escoja "
      +"ahora un almacén cualquiera."
      +
      +#. module: stock_planning
      +#: help:stock.planning.createlines,warehouse_id:0
      +msgid "Warehouse which planning will concern."
      +msgstr "Almacén que se referirá la planificación"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:647
      +#: code:addons/stock_planning/stock_planning.py:689
      +#, python-format
      +msgid ""
      +"\n"
      +" Stock Simulation: "
      +msgstr ""
      +"\n"
      +" Simulación de stock: "
      +
      +#. module: stock_planning
      +#: help:stock.planning,to_procure:0
      +msgid ""
      +"Enter quantity which (by your plan) should come in. Change this value and "
      +"observe Stock simulation. This value should be equal or greater than "
      +"Confirmed In."
      +msgstr ""
      +"Introducir la cantidad que (por su plan) debe entrar. Cambie este valor y "
      +"observe la simulación de stock. Este valor debería ser igual o superior a "
      +"las entradas confirmadas."
      +
      +#. module: stock_planning
      +#: help:stock.planning.createlines,period_id:0
      +msgid "Period which planning will concern."
      +msgstr "Periodo al cual concierne la planificación"
      +
      +#. module: stock_planning
      +#: field:stock.planning,already_out:0
      +msgid "Already Out"
      +msgstr "Salidas realizadas"
      +
      +#. module: stock_planning
      +#: help:stock.planning,product_id:0
      +msgid "Product which this planning is created for."
      +msgstr "Producto para el que ha sido creada esta planificación."
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Per Warehouse :"
      +msgstr "Por almacén :"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:639
      +#: code:addons/stock_planning/stock_planning.py:681
      +#, python-format
      +msgid ""
      +"\n"
      +" Warehouse Forecast: "
      +msgstr ""
      +"\n"
      +" Previsión almacén: "
      +
      +#. module: stock_planning
      +#: field:stock.planning,history:0
      +msgid "Procurement History"
      +msgstr "Histórico abastecimientos"
      +
      +#. module: stock_planning
      +#: help:stock.period.createlines,date_start:0
      +msgid "Starting date for planning period."
      +msgstr "Fecha inicial para el periodo planificado."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:641
      +#: code:addons/stock_planning/stock_planning.py:683
      +#, python-format
      +msgid "    Planned In: "
      +msgstr "    Entradas planificadas: "
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyze_company:0
      +msgid "Per Company"
      +msgstr "Por compañía"
      +
      +#. module: stock_planning
      +#: help:stock.planning,incoming_left:0
      +msgid ""
      +"Quantity left to Planned incoming quantity. This is calculated difference "
      +"between Planned In and Confirmed In. For current period Already In is also "
      +"calculated. This value is used to create procurement for lacking quantity."
      +msgstr ""
      +"Cantidad restante de la cantidad entrante planificada. Se calcula mediante "
      +"la diferencia entre las entradas planificadas y las entradas confirmadas. "
      +"Para el periodo actual las entradas realizadas también se calculan. Este "
      +"valor se usa para crear abastecimientos para la cantidad faltante."
      +
      +#. module: stock_planning
      +#: help:stock.planning,incoming:0
      +msgid "Quantity of all confirmed incoming moves in calculated Period."
      +msgstr ""
      +"Cantidades de todas las entradas confirmadas en el periodo calculado."
      +
      +#. module: stock_planning
      +#: field:stock.period,date_stop:0
      +#: field:stock.period.createlines,date_stop:0
      +msgid "End Date"
      +msgstr "Fecha de término"
      +
      +#. module: stock_planning
      +#: help:stock.planning,stock_supply_location:0
      +msgid ""
      +"Check to supply from Stock location of Supply Warehouse. If not checked "
      +"supply will be made from Output location of Supply Warehouse. Used in "
      +"'Supply from Another Warhouse' with Supply Warehouse."
      +msgstr ""
      +"Marque esta opción para suministrar desde la ubicación stock del almacén de "
      +"suministro. Si no se marca, el suministro se realizará desde la ubicación de "
      +"salida del almacén de suministro. Utilizado en 'Suministrar desde otro "
      +"almacén' con un almacén de suministro."
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "No Requisition"
      +msgstr "No solicitar"
      +
      +#. module: stock_planning
      +#: help:stock.planning,minimum_op:0
      +msgid "Minimum quantity set in Minimum Stock Rules for this Warhouse"
      +msgstr ""
      +"Cantidad mínima establecida en las reglas de stock mínimo para este almacén."
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,period_id:0
      +msgid "Shows which period this forecast concerns."
      +msgstr "Muestra a que periodo concierne esta previsión."
      +
      +#. module: stock_planning
      +#: field:stock.planning,product_uom:0
      +msgid "UoM"
      +msgstr "UdM"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Calculated Period Simulation"
      +msgstr "Simulación calculada del periodo"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +#: field:stock.planning,product_id:0
      +#: view:stock.sale.forecast:0
      +#: field:stock.sale.forecast,product_id:0
      +msgid "Product"
      +msgstr "Producto"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:638
      +#: code:addons/stock_planning/stock_planning.py:680
      +#, python-format
      +msgid ""
      +"\n"
      +"For period: "
      +msgstr ""
      +"\n"
      +"Por periodo: "
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,product_uom:0
      +msgid "Product UoM"
      +msgstr "UdM del producto"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:627
      +#: code:addons/stock_planning/stock_planning.py:673
      +#: code:addons/stock_planning/stock_planning.py:697
      +#, python-format
      +msgid "MPS(%s) %s"
      +msgstr "Copy text \t MPS(%s) %s"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:627
      +#: code:addons/stock_planning/stock_planning.py:671
      +#: code:addons/stock_planning/stock_planning.py:693
      +#, python-format
      +msgid "MPS("
      +msgstr "MPS("
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:680
      +#, python-format
      +msgid ""
      +"Pick created from MPS by user: %s   Creation Date: %s                        "
      +"             \n"
      +"For period: %s   according to state:                                     \n"
      +" Warehouse Forecast: %s                                     \n"
      +" Initial Stock: %s                                     \n"
      +" Planned Out: %s  Planned In: %s                                     \n"
      +" Already Out: %s  Already In: %s                                     \n"
      +" Confirmed Out: %s   Confirmed In: %s                                     \n"
      +" Planned Out Before: %s   Confirmed In Before: %s                            "
      +"         \n"
      +" Expected Out: %s   Incoming Left: %s                                     \n"
      +" Stock Simulation: %s   Minimum stock: %s "
      +msgstr ""
      +
      +#. module: stock_planning
      +#: field:stock.planning,procure_to_stock:0
      +msgid "Procure To Stock Location"
      +msgstr "Abastecimiento a ubicación stock"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Approve"
      +msgstr "Aprobar"
      +
      +#. module: stock_planning
      +#: help:stock.planning,period_id:0
      +msgid ""
      +"Period for this planning. Requisition will be created for beginning of the "
      +"period."
      +msgstr ""
      +"Periodo para esta planificación. Se creará una solicitud al principio del "
      +"periodo."
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Calculate Sales History"
      +msgstr "Calcular historial de ventas"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,product_amt:0
      +msgid "Product Amount"
      +msgstr "Cantidad de producto"
      +
      +#. module: stock_planning
      +#: help:stock.planning,confirmed_forecasts_only:0
      +msgid ""
      +"Check to take validated forecasts only. If not checked system takes "
      +"validated and draft forecasts."
      +msgstr ""
      +"Marcar para usar sólo las previsiones validadas. Si no se marca el sistema "
      +"usa las previsiones validadas y borrador."
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period5_id:0
      +msgid "Period5"
      +msgstr "Periodo5"
      +
      +#. module: stock_planning
      +#: model:ir.actions.act_window,name:stock_planning.action_stock_period_createlines_form
      +msgid "Stock and Sales Planning Periods"
      +msgstr "Periodos de planificación de stock y ventas"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_warehouse_id:0
      +msgid "This Warehouse"
      +msgstr "Este almacén"
      +
      +#. module: stock_planning
      +#: model:ir.actions.act_window,name:stock_planning.action_stock_period_form
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_period
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_period_main
      +#: view:stock.period:0
      +#: view:stock.period.createlines:0
      +msgid "Stock and Sales Periods"
      +msgstr "Periodos de stock y ventas"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,user_id:0
      +msgid "Shows who created this forecast, or who validated."
      +msgstr "Muestra quién creó esta previsión, o quién la validó."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:644
      +#: code:addons/stock_planning/stock_planning.py:686
      +#, python-format
      +msgid ""
      +"\n"
      +" Planned Out Before: "
      +msgstr ""
      +"\n"
      +" Salidas planificadas antes: "
      +
      +#. module: stock_planning
      +#: field:stock.planning,stock_start:0
      +msgid "Initial Stock"
      +msgstr "Stock inicial"
      
      From ba2f06a2ac17699cf33ccaaa2479f8a51f0b6970 Mon Sep 17 00:00:00 2001
      From: Xavier Morel 
      Date: Tue, 25 Oct 2011 09:06:26 +0200
      Subject: [PATCH 23/28] [ADD] missing deferred propagation in
       ListView.reload_content
      
      bzr revid: xmo@openerp.com-20111025070626-pxxp6virhhomb7kl
      ---
       addons/web/static/src/js/view_list.js | 5 +++++
       1 file changed, 5 insertions(+)
      
      diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js
      index d09ec1d3035..4408cab8e3b 100644
      --- a/addons/web/static/src/js/view_list.js
      +++ b/addons/web/static/src/js/view_list.js
      @@ -424,10 +424,13 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
           },
           /**
            * re-renders the content of the list view
      +     *
      +     * @returns {$.Deferred} promise to content reloading
            */
           reload_content: function () {
               var self = this;
               this.records.reset();
      +        var reloaded = $.Deferred();
               this.$element.find('.oe-listview-content').append(
                   this.groups.render(function () {
                       if (self.dataset.index == null) {
      @@ -438,7 +441,9 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
                           }
                       }
                       self.compute_aggregates();
      +                reloaded.resolve();
                   }));
      +        return reloaded.promise();
           },
           /**
            * Handler for the result of eval_domain_and_context, actually perform the
      
      From 44344a21b24955799b63215d402956b70961a360 Mon Sep 17 00:00:00 2001
      From: Fabien Meghazi 
      Date: Tue, 25 Oct 2011 10:36:48 +0200
      Subject: [PATCH 24/28] [ADD] Added jQuery.MD5
      
      bzr revid: fme@openerp.com-20111025083648-x5nd1mv7z7nee7cl
      ---
       addons/web/__openerp__.py                     |   1 +
       addons/web/static/lib/jquery.MD5/README.md    |  32 +++
       addons/web/static/lib/jquery.MD5/README.txt   |  32 +++
       .../web/static/lib/jquery.MD5/jquery.md5.js   | 269 ++++++++++++++++++
       .../static/lib/jquery.MD5/tests/index.html    |  43 +++
       .../web/static/lib/jquery.MD5/tests/tests.js  |  57 ++++
       6 files changed, 434 insertions(+)
       create mode 100644 addons/web/static/lib/jquery.MD5/README.md
       create mode 100644 addons/web/static/lib/jquery.MD5/README.txt
       create mode 100644 addons/web/static/lib/jquery.MD5/jquery.md5.js
       create mode 100644 addons/web/static/lib/jquery.MD5/tests/index.html
       create mode 100644 addons/web/static/lib/jquery.MD5/tests/tests.js
      
      diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py
      index 0afd43190d6..314d7274879 100644
      --- a/addons/web/__openerp__.py
      +++ b/addons/web/__openerp__.py
      @@ -11,6 +11,7 @@
               "static/lib/datejs/sugarpak.js",
               "static/lib/datejs/extras.js",
               "static/lib/jquery/jquery-1.6.2.js",
      +        "static/lib/jquery.MD5/jquery.md5.js",
               "static/lib/jquery.form/jquery.form.js",
               "static/lib/jquery.validate/jquery.validate.js",
               "static/lib/jquery.ba-bbq/jquery.ba-bbq.js",
      diff --git a/addons/web/static/lib/jquery.MD5/README.md b/addons/web/static/lib/jquery.MD5/README.md
      new file mode 100644
      index 00000000000..88778a7a3bf
      --- /dev/null
      +++ b/addons/web/static/lib/jquery.MD5/README.md
      @@ -0,0 +1,32 @@
      +# jQuery MD5 Plugin
      +
      +## Usage
      +Create ([hex](http://en.wikipedia.org/wiki/Hexadecimal)-encoded) [MD5](http://en.wikipedia.org/wiki/MD5) hash of a given string value:
      +
      +    var md5 = $.md5('value');
      +
      +Create ([hex](http://en.wikipedia.org/wiki/Hexadecimal)-encoded) [HMAC](http://en.wikipedia.org/wiki/HMAC)-MD5 hash of a given string value and key:
      +
      +    var md5 = $.md5('value', 'key');
      +    
      +Create raw [MD5](http://en.wikipedia.org/wiki/MD5) hash of a given string value:
      +
      +    var md5 = $.md5('value', null, true);
      +
      +Create raw [HMAC](http://en.wikipedia.org/wiki/HMAC)-MD5 hash of a given string value and key:
      +
      +    var md5 = $.md5('value', 'key', true);
      +
      +## Requirements
      +None.
      +
      +If [jQuery](http://jquery.com/) is not available, the md5 function will be added to the global object:
      +
      +    var md5 = md5('value');
      +
      +## License
      +Released under the [MIT license](http://creativecommons.org/licenses/MIT/).
      +
      +## Source Code & Download
      +* Browse and checkout the [source code](https://github.com/blueimp/jQuery-MD5).
      +* [Download](https://github.com/blueimp/jQuery-MD5/archives/master) the project to add the plugin to your website.
      diff --git a/addons/web/static/lib/jquery.MD5/README.txt b/addons/web/static/lib/jquery.MD5/README.txt
      new file mode 100644
      index 00000000000..8a8cbf4db2a
      --- /dev/null
      +++ b/addons/web/static/lib/jquery.MD5/README.txt
      @@ -0,0 +1,32 @@
      +jQuery MD5 Plugin
      +=================
      +
      +Usage
      +-----
      +Create (hex-encoded) MD5 hash of a given string value:
      +    var md5 = $.md5('value');
      +
      +Create (hex-encoded) HMAC-MD5 hash of a given string value and key:
      +    var md5 = $.md5('value', 'key');
      +    
      +Create raw MD5 hash of a given string value:
      +    var md5 = $.md5('value', null, true);
      +
      +Create raw HMAC-MD5 hash of a given string value and key:
      +    var md5 = $.md5('value', 'key', true);
      +
      +Requirements
      +------------
      +None.
      +
      +If jQuery is not available, the md5 function will be added to the global object:
      +    var md5 = md5('value');
      +
      +License
      +-------
      +Released under the MIT license:
      +http://creativecommons.org/licenses/MIT/
      +
      +Source Code & Download
      +----------------------
      +https://github.com/blueimp/jQuery-MD5
      diff --git a/addons/web/static/lib/jquery.MD5/jquery.md5.js b/addons/web/static/lib/jquery.MD5/jquery.md5.js
      new file mode 100644
      index 00000000000..bf9bbe97b55
      --- /dev/null
      +++ b/addons/web/static/lib/jquery.MD5/jquery.md5.js
      @@ -0,0 +1,269 @@
      +/*
      + * jQuery MD5 Plugin 1.2.1
      + * https://github.com/blueimp/jQuery-MD5
      + *
      + * Copyright 2010, Sebastian Tschan
      + * https://blueimp.net
      + *
      + * Licensed under the MIT license:
      + * http://creativecommons.org/licenses/MIT/
      + * 
      + * Based on
      + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
      + * Digest Algorithm, as defined in RFC 1321.
      + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
      + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
      + * Distributed under the BSD License
      + * See http://pajhome.org.uk/crypt/md5 for more info.
      + */
      +
      +/*jslint bitwise: true */
      +/*global unescape, jQuery */
      +
      +(function ($) {
      +    'use strict';
      +
      +    /*
      +    * Add integers, wrapping at 2^32. This uses 16-bit operations internally
      +    * to work around bugs in some JS interpreters.
      +    */
      +    function safe_add(x, y) {
      +        var lsw = (x & 0xFFFF) + (y & 0xFFFF),
      +            msw = (x >> 16) + (y >> 16) + (lsw >> 16);
      +        return (msw << 16) | (lsw & 0xFFFF);
      +    }
      +
      +    /*
      +    * Bitwise rotate a 32-bit number to the left.
      +    */
      +    function bit_rol(num, cnt) {
      +        return (num << cnt) | (num >>> (32 - cnt));
      +    }
      +
      +    /*
      +    * These functions implement the four basic operations the algorithm uses.
      +    */
      +    function md5_cmn(q, a, b, x, s, t) {
      +        return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
      +    }
      +    function md5_ff(a, b, c, d, x, s, t) {
      +        return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
      +    }
      +    function md5_gg(a, b, c, d, x, s, t) {
      +        return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
      +    }
      +    function md5_hh(a, b, c, d, x, s, t) {
      +        return md5_cmn(b ^ c ^ d, a, b, x, s, t);
      +    }
      +    function md5_ii(a, b, c, d, x, s, t) {
      +        return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
      +    }
      +
      +    /*
      +    * Calculate the MD5 of an array of little-endian words, and a bit length.
      +    */
      +    function binl_md5(x, len) {
      +        /* append padding */
      +        x[len >> 5] |= 0x80 << ((len) % 32);
      +        x[(((len + 64) >>> 9) << 4) + 14] = len;
      +
      +        var i, olda, oldb, oldc, oldd,
      +            a =  1732584193,
      +            b = -271733879,
      +            c = -1732584194,
      +            d =  271733878;
      +
      +        for (i = 0; i < x.length; i += 16) {
      +            olda = a;
      +            oldb = b;
      +            oldc = c;
      +            oldd = d;
      +
      +            a = md5_ff(a, b, c, d, x[i],       7, -680876936);
      +            d = md5_ff(d, a, b, c, x[i +  1], 12, -389564586);
      +            c = md5_ff(c, d, a, b, x[i +  2], 17,  606105819);
      +            b = md5_ff(b, c, d, a, x[i +  3], 22, -1044525330);
      +            a = md5_ff(a, b, c, d, x[i +  4],  7, -176418897);
      +            d = md5_ff(d, a, b, c, x[i +  5], 12,  1200080426);
      +            c = md5_ff(c, d, a, b, x[i +  6], 17, -1473231341);
      +            b = md5_ff(b, c, d, a, x[i +  7], 22, -45705983);
      +            a = md5_ff(a, b, c, d, x[i +  8],  7,  1770035416);
      +            d = md5_ff(d, a, b, c, x[i +  9], 12, -1958414417);
      +            c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
      +            b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
      +            a = md5_ff(a, b, c, d, x[i + 12],  7,  1804603682);
      +            d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
      +            c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
      +            b = md5_ff(b, c, d, a, x[i + 15], 22,  1236535329);
      +
      +            a = md5_gg(a, b, c, d, x[i +  1],  5, -165796510);
      +            d = md5_gg(d, a, b, c, x[i +  6],  9, -1069501632);
      +            c = md5_gg(c, d, a, b, x[i + 11], 14,  643717713);
      +            b = md5_gg(b, c, d, a, x[i],      20, -373897302);
      +            a = md5_gg(a, b, c, d, x[i +  5],  5, -701558691);
      +            d = md5_gg(d, a, b, c, x[i + 10],  9,  38016083);
      +            c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
      +            b = md5_gg(b, c, d, a, x[i +  4], 20, -405537848);
      +            a = md5_gg(a, b, c, d, x[i +  9],  5,  568446438);
      +            d = md5_gg(d, a, b, c, x[i + 14],  9, -1019803690);
      +            c = md5_gg(c, d, a, b, x[i +  3], 14, -187363961);
      +            b = md5_gg(b, c, d, a, x[i +  8], 20,  1163531501);
      +            a = md5_gg(a, b, c, d, x[i + 13],  5, -1444681467);
      +            d = md5_gg(d, a, b, c, x[i +  2],  9, -51403784);
      +            c = md5_gg(c, d, a, b, x[i +  7], 14,  1735328473);
      +            b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
      +
      +            a = md5_hh(a, b, c, d, x[i +  5],  4, -378558);
      +            d = md5_hh(d, a, b, c, x[i +  8], 11, -2022574463);
      +            c = md5_hh(c, d, a, b, x[i + 11], 16,  1839030562);
      +            b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
      +            a = md5_hh(a, b, c, d, x[i +  1],  4, -1530992060);
      +            d = md5_hh(d, a, b, c, x[i +  4], 11,  1272893353);
      +            c = md5_hh(c, d, a, b, x[i +  7], 16, -155497632);
      +            b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
      +            a = md5_hh(a, b, c, d, x[i + 13],  4,  681279174);
      +            d = md5_hh(d, a, b, c, x[i],      11, -358537222);
      +            c = md5_hh(c, d, a, b, x[i +  3], 16, -722521979);
      +            b = md5_hh(b, c, d, a, x[i +  6], 23,  76029189);
      +            a = md5_hh(a, b, c, d, x[i +  9],  4, -640364487);
      +            d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
      +            c = md5_hh(c, d, a, b, x[i + 15], 16,  530742520);
      +            b = md5_hh(b, c, d, a, x[i +  2], 23, -995338651);
      +
      +            a = md5_ii(a, b, c, d, x[i],       6, -198630844);
      +            d = md5_ii(d, a, b, c, x[i +  7], 10,  1126891415);
      +            c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
      +            b = md5_ii(b, c, d, a, x[i +  5], 21, -57434055);
      +            a = md5_ii(a, b, c, d, x[i + 12],  6,  1700485571);
      +            d = md5_ii(d, a, b, c, x[i +  3], 10, -1894986606);
      +            c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
      +            b = md5_ii(b, c, d, a, x[i +  1], 21, -2054922799);
      +            a = md5_ii(a, b, c, d, x[i +  8],  6,  1873313359);
      +            d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
      +            c = md5_ii(c, d, a, b, x[i +  6], 15, -1560198380);
      +            b = md5_ii(b, c, d, a, x[i + 13], 21,  1309151649);
      +            a = md5_ii(a, b, c, d, x[i +  4],  6, -145523070);
      +            d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
      +            c = md5_ii(c, d, a, b, x[i +  2], 15,  718787259);
      +            b = md5_ii(b, c, d, a, x[i +  9], 21, -343485551);
      +
      +            a = safe_add(a, olda);
      +            b = safe_add(b, oldb);
      +            c = safe_add(c, oldc);
      +            d = safe_add(d, oldd);
      +        }
      +        return [a, b, c, d];
      +    }
      +
      +    /*
      +    * Convert an array of little-endian words to a string
      +    */
      +    function binl2rstr(input) {
      +        var i,
      +            output = '';
      +        for (i = 0; i < input.length * 32; i += 8) {
      +            output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
      +        }
      +        return output;
      +    }
      +
      +    /*
      +    * Convert a raw string to an array of little-endian words
      +    * Characters >255 have their high-byte silently ignored.
      +    */
      +    function rstr2binl(input) {
      +        var i,
      +            output = [];
      +        output[(input.length >> 2) - 1] = undefined;
      +        for (i = 0; i < output.length; i += 1) {
      +            output[i] = 0;
      +        }
      +        for (i = 0; i < input.length * 8; i += 8) {
      +            output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
      +        }
      +        return output;
      +    }
      +
      +    /*
      +    * Calculate the MD5 of a raw string
      +    */
      +    function rstr_md5(s) {
      +        return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
      +    }
      +
      +    /*
      +    * Calculate the HMAC-MD5, of a key and some data (raw strings)
      +    */
      +    function rstr_hmac_md5(key, data) {
      +        var i,
      +            bkey = rstr2binl(key),
      +            ipad = [],
      +            opad = [],
      +            hash;
      +        ipad[15] = opad[15] = undefined;                        
      +        if (bkey.length > 16) {
      +            bkey = binl_md5(bkey, key.length * 8);
      +        }
      +        for (i = 0; i < 16; i += 1) {
      +            ipad[i] = bkey[i] ^ 0x36363636;
      +            opad[i] = bkey[i] ^ 0x5C5C5C5C;
      +        }
      +        hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
      +        return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
      +    }
      +
      +    /*
      +    * Convert a raw string to a hex string
      +    */
      +    function rstr2hex(input) {
      +        var hex_tab = '0123456789abcdef',
      +            output = '',
      +            x,
      +            i;
      +        for (i = 0; i < input.length; i += 1) {
      +            x = input.charCodeAt(i);
      +            output += hex_tab.charAt((x >>> 4) & 0x0F) +
      +                hex_tab.charAt(x & 0x0F);
      +        }
      +        return output;
      +    }
      +
      +    /*
      +    * Encode a string as utf-8
      +    */
      +    function str2rstr_utf8(input) {
      +        return unescape(encodeURIComponent(input));
      +    }
      +
      +    /*
      +    * Take string arguments and return either raw or hex encoded strings
      +    */
      +    function raw_md5(s) {
      +        return rstr_md5(str2rstr_utf8(s));
      +    }
      +    function hex_md5(s) {
      +        return rstr2hex(raw_md5(s));
      +    }
      +    function raw_hmac_md5(k, d) {
      +        return rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d));
      +    }
      +    function hex_hmac_md5(k, d) {
      +        return rstr2hex(raw_hmac_md5(k, d));
      +    }
      +    
      +    $.md5 = function (string, key, raw) {
      +        if (!key) {
      +            if (!raw) {
      +                return hex_md5(string);
      +            } else {
      +                return raw_md5(string);
      +            }
      +        }
      +        if (!raw) {
      +            return hex_hmac_md5(key, string);
      +        } else {
      +            return raw_hmac_md5(key, string);
      +        }
      +    };
      +    
      +}(typeof jQuery === 'function' ? jQuery : this));
      \ No newline at end of file
      diff --git a/addons/web/static/lib/jquery.MD5/tests/index.html b/addons/web/static/lib/jquery.MD5/tests/index.html
      new file mode 100644
      index 00000000000..27ba8d3607d
      --- /dev/null
      +++ b/addons/web/static/lib/jquery.MD5/tests/index.html
      @@ -0,0 +1,43 @@
      +
      +
      +
      +
      +
      +jQuery MD5 Plugin Tests
      +
      +
      +
      +

      jQuery MD5 Plugin Tests

      +

      +
      +

      +
        + + + + + + + \ No newline at end of file diff --git a/addons/web/static/lib/jquery.MD5/tests/tests.js b/addons/web/static/lib/jquery.MD5/tests/tests.js new file mode 100644 index 00000000000..ab70f2f991b --- /dev/null +++ b/addons/web/static/lib/jquery.MD5/tests/tests.js @@ -0,0 +1,57 @@ +/* + * jQuery MD5 Plugin Tests 1.1 + * https://github.com/blueimp/jQuery-MD5 + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://creativecommons.org/licenses/MIT/ + */ + +/*global jQuery, module, test, strictEqual */ + +(function ($) { + 'use strict'; + + module('Hex-encoded MD5'); + + test('Creating hex-encoded MD5 hash of an ASCII value', function () { + strictEqual($.md5('value'), '2063c1608d6e0baf80249c42e2be5804'); + }); + + test('Creating hex-encoded MD5 hash of an UTF-8 value', function () { + strictEqual($.md5('日本'), '4dbed2e657457884e67137d3514119b3'); + }); + + module('Hex-encoded HMAC-MD5'); + + test('Creating hex-encoded HMAC-MD5 hash of an ASCII value and key', function () { + strictEqual($.md5('value', 'key'), '01433efd5f16327ea4b31144572c67f6'); + }); + + test('Creating hex-encoded HMAC-MD5 hash of an UTF-8 value and key', function () { + strictEqual($.md5('日本', '日本'), 'c78b8c7357926981cc04740bd3e9d015'); + }); + + module('Raw MD5'); + + test('Creating raw MD5 hash of an ASCII value', function () { + strictEqual($.md5('value', null, true), ' c\xc1`\x8dn\x0b\xaf\x80$\x9cB\xe2\xbeX\x04'); + }); + + test('Creating raw MD5 hash of an UTF-8 value', function () { + strictEqual($.md5('日本', null, true), 'M\xbe\xd2\xe6WEx\x84\xe6q7\xd3QA\x19\xb3'); + }); + + module('Raw HMAC-MD5'); + + test('Creating raw HMAC-MD5 hash of an ASCII value and key', function () { + strictEqual($.md5('value', 'key', true), '\x01C>\xfd_\x162~\xa4\xb3\x11DW,g\xf6'); + }); + + test('Creating raw HMAC-MD5 hash of an UTF-8 value and key', function () { + strictEqual($.md5('日本', '日本', true), '\xc7\x8b\x8csW\x92i\x81\xcc\x04t\x0b\xd3\xe9\xd0\x15'); + }); + +}(typeof jQuery === 'function' ? jQuery : this)); \ No newline at end of file From c68d85140742ff1090175e64815ffa09f2f77104 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 25 Oct 2011 10:37:43 +0200 Subject: [PATCH 25/28] [IMP] Removed hard-coded AMIGrAve's face from kanban view. Compute gravatar url using md5. bzr revid: fme@openerp.com-20111025083743-d9g90sy1g9cx2ueg --- addons/web_kanban/static/src/js/kanban.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 72df590fbf4..761952d5af2 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -69,7 +69,7 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ }, kanban_gravatar: function(email, size) { size = size || 22; - var email_md5 = '2eb60ad22dadcf4dc456b28390a80268'; + var email_md5 = $.md5(email); return 'http://www.gravatar.com/avatar/' + email_md5 + '.png?s=' + size; }, transform_qweb_template: function(node) { From b6a0874f4cc406788f0bf7045e279f43f8bd82ed Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 25 Oct 2011 10:51:12 +0200 Subject: [PATCH 26/28] [FIX] disgusting hack to skip around race condition When clicking on an action button, form view first saves then executes the action. In doing so, it causes the o2m field to call ListView#reload_content twice without waiting for the reloading to end, generating a race condition in ListView.List#render_dataset. As a result, the read_slice callback fills the list twice (once for each #reload_content call), resulting in everything being duplicated. Clear the content of the records collection before adding stuff. note: collections should dedup on ids. lp bug: https://launchpad.net/bugs/877965 fixed bzr revid: xmo@openerp.com-20111025085112-q38q8m0k2mopwadg --- addons/web/static/src/js/view_list.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 4408cab8e3b..bf6f79b9cc0 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -1206,6 +1206,10 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L var options = { offset: page * limit, limit: limit }; //TODO xmo: investigate why we need to put the setTimeout setTimeout(function() {dataset.read_slice(fields, options , function (records) { + // FIXME: ignominious hacks, parents (aka form view) should not send two ListView#reload_content concurrently + if (self.records.length) { + self.records.reset(null, {silent: true}); + } if (!self.datagroup.openable) { view.configure_pager(dataset); } else { @@ -1546,7 +1550,8 @@ var Collection = openerp.web.Class.extend(/** @lends Collection# */{ * @param {Array} [records] * @returns this */ - reset: function (records) { + reset: function (records, options) { + options = options || {}; _(this._proxies).each(function (proxy) { proxy.reset(); }); @@ -1557,7 +1562,9 @@ var Collection = openerp.web.Class.extend(/** @lends Collection# */{ if (records) { this.add(records); } - this.trigger('reset', this); + if (!options.silent) { + this.trigger('reset', this); + } return this; }, /** From 2102484af45a6bfae846db2a317f5b0561d4941c Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 25 Oct 2011 11:40:09 +0200 Subject: [PATCH 27/28] [FIX] share: add missing file bzr revid: chs@openerp.com-20111025094009-s9mgam03rww08s08 --- addons/share/static/src/xml/share.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 addons/share/static/src/xml/share.xml diff --git a/addons/share/static/src/xml/share.xml b/addons/share/static/src/xml/share.xml new file mode 100644 index 00000000000..9a1363846a0 --- /dev/null +++ b/addons/share/static/src/xml/share.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + From bf3465b3b5bebeb3d2d033f9536bbf4afbb4642f Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 25 Oct 2011 11:44:19 +0200 Subject: [PATCH 28/28] [FIX] Kanban: if the name of the column is long, folding is ugly the text overflow the colum bzr revid: fme@openerp.com-20111025094419-3org5d0cy7895lil --- addons/web_kanban/static/src/css/kanban.css | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/web_kanban/static/src/css/kanban.css b/addons/web_kanban/static/src/css/kanban.css index 82143e460d1..35ab36a0188 100644 --- a/addons/web_kanban/static/src/css/kanban.css +++ b/addons/web_kanban/static/src/css/kanban.css @@ -14,6 +14,7 @@ height:20px; align:center; font-size:24px; + white-space: nowrap; } .openerp .oe_kanban_view .ui-sortable-placeholder {