From 0568f5c65384cdc70bae5d03f8932a5db6b97cbb Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Mon, 22 Jul 2013 17:17:40 +0200
Subject: [PATCH 01/61] [ADD] test_workflow: added some tests for the
workflows.
bzr revid: vmt@openerp.com-20130722151740-mucw6i5vn38blh66
---
.../tests/addons/test_workflow/__init__.py | 3 +
.../tests/addons/test_workflow/__openerp__.py | 15 ++++
openerp/tests/addons/test_workflow/data.xml | 86 +++++++++++++++++++
openerp/tests/addons/test_workflow/models.py | 37 ++++++++
openerp/tests/addons/test_workflow/run.py | 44 ++++++++++
.../addons/test_workflow/tests/__init__.py | 12 +++
.../test_workflow/tests/test_workflow.py | 62 +++++++++++++
7 files changed, 259 insertions(+)
create mode 100644 openerp/tests/addons/test_workflow/__init__.py
create mode 100644 openerp/tests/addons/test_workflow/__openerp__.py
create mode 100644 openerp/tests/addons/test_workflow/data.xml
create mode 100644 openerp/tests/addons/test_workflow/models.py
create mode 100755 openerp/tests/addons/test_workflow/run.py
create mode 100644 openerp/tests/addons/test_workflow/tests/__init__.py
create mode 100644 openerp/tests/addons/test_workflow/tests/test_workflow.py
diff --git a/openerp/tests/addons/test_workflow/__init__.py b/openerp/tests/addons/test_workflow/__init__.py
new file mode 100644
index 00000000000..fe4487156b1
--- /dev/null
+++ b/openerp/tests/addons/test_workflow/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+import models
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerp/tests/addons/test_workflow/__openerp__.py b/openerp/tests/addons/test_workflow/__openerp__.py
new file mode 100644
index 00000000000..1b846f9f227
--- /dev/null
+++ b/openerp/tests/addons/test_workflow/__openerp__.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+{
+ 'name': 'test-workflow',
+ 'version': '0.1',
+ 'category': 'Tests',
+ 'description': """A module to play with workflows.""",
+ 'author': 'OpenERP SA',
+ 'maintainer': 'OpenERP SA',
+ 'website': 'http://www.openerp.com',
+ 'depends': ['base'],
+ 'data': ['data.xml'],
+ 'installable': True,
+ 'auto_install': False,
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerp/tests/addons/test_workflow/data.xml b/openerp/tests/addons/test_workflow/data.xml
new file mode 100644
index 00000000000..c50dfc03bf6
--- /dev/null
+++ b/openerp/tests/addons/test_workflow/data.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+ Test workflow
+ test.workflow.model
+
+
+
+
+
+
+ Test workflow
+ ir.actions.act_window
+ test.workflow.model
+ form
+ tree,form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ test.workflow
+ test.workflow.model
+ True
+
+
+
+
+ True
+ a
+ function
+ print_a()
+
+
+
+ b
+ function
+ print_b()
+
+
+
+ True
+ c
+ function
+ print_c()
+
+
+
+
+
+ a-b
+
+
+
+
+ condition()
+ test.workflow.trigger
+ [1]
+
+
+
diff --git a/openerp/tests/addons/test_workflow/models.py b/openerp/tests/addons/test_workflow/models.py
new file mode 100644
index 00000000000..7f79aeb1484
--- /dev/null
+++ b/openerp/tests/addons/test_workflow/models.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+import openerp
+
+class m(openerp.osv.orm.Model):
+ """ A model for which we will define a worflow (see data.xml). """
+ _name = 'test.workflow.model'
+
+ def print_(self, cr, uid, ids, s, context=None):
+ print ' Running activity `%s` for record %s' % (s, ids)
+ return True
+
+ def print_a(self, cr, uid, ids, context=None):
+ return self.print_(cr, uid, ids, 'a', context)
+
+ def print_b(self, cr, uid, ids, context=None):
+ return self.print_(cr, uid, ids, 'b', context)
+
+ def print_c(self, cr, uid, ids, context=None):
+ return self.print_(cr, uid, ids, 'c', context)
+
+ def condition(self, cr, uid, ids, context=None):
+ m = self.pool['test.workflow.trigger']
+ for r in m.browse(cr, uid, [1], context=context):
+ if not r.value:
+ return False
+ return True
+
+ def trigger(self, cr, uid, context=None):
+ return openerp.workflow.trg_trigger(uid, 'test.workflow.trigger', 1, cr)
+
+class n(openerp.osv.orm.Model):
+ """ A model used for the trigger feature. """
+ _name = 'test.workflow.trigger'
+ _columns = { 'value': openerp.osv.fields.boolean('Value') }
+ _defaults = { 'value': False }
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerp/tests/addons/test_workflow/run.py b/openerp/tests/addons/test_workflow/run.py
new file mode 100755
index 00000000000..dda955f9ce9
--- /dev/null
+++ b/openerp/tests/addons/test_workflow/run.py
@@ -0,0 +1,44 @@
+#! /usr/bin/env python2
+import os
+
+import openerp
+from openerp import SUPERUSER_ID
+
+DATABASE='t'
+
+def configure():
+ conf = openerp.tools.config
+ conf['addons_path'] = os.path.join(os.path.dirname(os.path.dirname(__file__))) + ",/home/thu/repos/web/trunk/addons"
+ conf['log_handler'] = [':CRITICAL']
+ openerp.modules.module.initialize_sys_path()
+ openerp.netsvc.init_logger()
+
+if __name__ == '__main__':
+ configure()
+
+ print '> Loading registry `%s`...' % DATABASE
+ registry = registry = openerp.registry(DATABASE)
+ cr = registry.db.cursor()
+ print '< Registry `%s` loaded.' % DATABASE
+
+ model = registry['test.workflow.model']
+ trigger = registry['test.workflow.trigger']
+
+ print '> Creating new record...'
+ i = model.create(cr, SUPERUSER_ID, {})
+ print '< Record created with ID %s' % i
+
+ print '> Calling signal `a-b`...'
+ model.signal_workflow(cr, SUPERUSER_ID, [i], 'a-b')
+ print '< Signal `a-b` called.'
+
+ print '> Triggering associated record...'
+ model.trigger(cr, SUPERUSER_ID, [i])
+ print '< Associated record triggered.'
+
+ print '> Triggering associated record (this time with the condition evaluating to True)...'
+ trigger.write(cr, SUPERUSER_ID, [1], {'value': True})
+ model.trigger(cr, SUPERUSER_ID)
+ print '< Associated record triggered.'
+
+ cr.close()
diff --git a/openerp/tests/addons/test_workflow/tests/__init__.py b/openerp/tests/addons/test_workflow/tests/__init__.py
new file mode 100644
index 00000000000..a09d09fe74a
--- /dev/null
+++ b/openerp/tests/addons/test_workflow/tests/__init__.py
@@ -0,0 +1,12 @@
+# -*- coding: utf-8 -*-
+
+from . import test_workflow
+
+fast_suite = [
+]
+
+checks = [
+ test_workflow,
+]
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerp/tests/addons/test_workflow/tests/test_workflow.py b/openerp/tests/addons/test_workflow/tests/test_workflow.py
new file mode 100644
index 00000000000..60ace7ee269
--- /dev/null
+++ b/openerp/tests/addons/test_workflow/tests/test_workflow.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+import openerp
+from openerp import SUPERUSER_ID
+from openerp.tests import common
+
+
+class test_workflows(common.TransactionCase):
+
+ def check_activities(self, model_name, i, names):
+ """ Check that the record i has workitems in the given activity names.
+ """
+ instance = self.registry('workflow.instance')
+ workitem = self.registry('workflow.workitem')
+
+ # Given the workflow instance associated to the record ...
+ instance_id = instance.search(
+ self.cr, SUPERUSER_ID,
+ [('res_type', '=', model_name), ('res_id', '=', i)])
+ self.assertTrue( instance_id, 'A workflow instance is expected.')
+
+ # ... get all its workitems ...
+ workitem_ids = workitem.search(
+ self.cr, SUPERUSER_ID,
+ [('inst_id', '=', instance_id[0])])
+ self.assertTrue(
+ workitem_ids,
+ 'The workflow instance should have workitems.')
+
+ # ... and check the activity the are in against the provided names.
+ workitem_records = workitem.browse(
+ self.cr, SUPERUSER_ID, workitem_ids)
+ self.assertEqual(
+ sorted([item.act_id.name for item in workitem_records]),
+ sorted(names))
+
+ def test_workflow(self):
+ model = self.registry('test.workflow.model')
+ trigger = self.registry('test.workflow.trigger')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['a'])
+
+ # a -> b is just a signal.
+ model.signal_workflow(self.cr, SUPERUSER_ID, [i], 'a-b')
+ self.check_activities(model._name, i, ['b'])
+
+ # b -> c is a trigger (which is False),
+ # so we remain in the b activity.
+ model.trigger(self.cr, SUPERUSER_ID, [i])
+ self.check_activities(model._name, i, ['b'])
+
+ # b -> c is a trigger (which is set to True).
+ # so we go in c when the trigger is called.
+ trigger.write(self.cr, SUPERUSER_ID, [1], {'value': True})
+ model.trigger(self.cr, SUPERUSER_ID)
+ self.check_activities(model._name, i, ['c'])
+
+ self.assertEqual(
+ True,
+ True)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
From 9357ed959a8b9228264f60377a877ae5a70629d6 Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Tue, 23 Jul 2013 13:21:47 +0200
Subject: [PATCH 02/61] [DOC] workflows: started to write some workflow
documentation.
bzr revid: vmt@openerp.com-20130723112147-wje0mt5e1a59zj68
---
doc/index.rst | 1 +
doc/workflows.rst | 104 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 105 insertions(+)
create mode 100644 doc/workflows.rst
diff --git a/doc/index.rst b/doc/index.rst
index e641de1da67..b5ac49f6a8f 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -14,6 +14,7 @@ OpenERP Server
02_architecture
03_module_dev
04_security
+ workflows
05_test_framework
06_misc
deployment-gunicorn
diff --git a/doc/workflows.rst b/doc/workflows.rst
new file mode 100644
index 00000000000..6e7308d485d
--- /dev/null
+++ b/doc/workflows.rst
@@ -0,0 +1,104 @@
+.. _workflows:
+
+Workflows
+=========
+
+A workflow is a directed graph where the nodes are called "activities" and the
+arcs are called "transitions".
+
+- Activities define work that should be done within the OpenERP server, such as
+ changing the state of some records, or sending mails.
+
+- Transitions control how the workflow will go from activities to activities.
+
+When defining a workflow, one can attach conditions, signals, and triggers to
+transitions, so that the behavior of the workflow can depend on user actions
+(such as clicking on a button), changes to records, or arbitrary Python code.
+
+XML definition
+--------------
+
+Defining a workflow with data files is straightforward: a record "workflow" is
+needed together with records for the activities and the transitions. For
+instance here is a simple sequence of two activities defined in XML::
+
+
+ test.workflow
+ test.workflow.model
+ True
+
+
+
+
+ True
+ a
+ function
+ print_a()
+
+
+
+ True
+ b
+ function
+ print_b()
+
+
+
+
+
+
+
+A worfklow is always defined with respect to a particular model (the model is
+given through the ``osv`` attribute on the ``workflow`` model). Methods
+specified in the activities or transitions will be called on that model.
+
+In the example code above, a workflow called "test_workflow" is created. It is
+made up of two activies, named "a" and "b", and one transition, going from "a"
+to "b".
+
+The first activity has its ``flow_start`` attribute set to True so that OpenERP
+knows where to start the workflow when it is instanciated. Because
+``on_create`` is set to True on the workflow record, the workflow is
+instanciated for each newly created record. (Otherwise, the workflow should be
+created by other means, such as from some module Python code.)
+
+When the workflow is instanciated, it will start by the "a" activity. That
+activity is of kind ``function`` which means the action ``print_a()`` is a
+method to be called on the ``test.workflow`` model (the usual ``cr, uid, ids,
+context`` arguments are passed for you).
+
+The transition between "a" and "b" does not specify any conditions. This means
+the workflow instance will immediately progress from "a" to "b" (after "a" has
+been processed), and thus elso process the "b" activity.
+
+Conditions
+----------
+
+Triggers
+--------
+
+When an activity is completed, the workflow engine will try to get across
+transitions departing from the completed activity, towards the next activities.
+To get across a transition, its associated condition should evaluate to True.
+If the condition evaluates to False, the transition is not taken (and thus the
+activity it leads to will not be processed). Still, the workflow instance can
+get new chances to progress across that transition by providing so-called
+triggers. The idea is that when the condition fails, triggers (actually just
+model name/record IDs pairs) are recorded in database. Later, it is possible to
+wake-up specifically the workflow instances that installed those triggers,
+offering them a new chance to evaluation their transition conditions. This
+mechnism makes it cheaper to wake-up workflow instances by targetting just a
+few of them (those that have installed the triggers) instead of all of them.
+
+On each transition, in addition to a condition, records can be defined as a
+trigger. The records will be defined as triggers as the transition is tried
+withing a workflow, after the condition has failed. The actual records are
+stored as model name and record ids. The model name is defined by the
+trigger_model attribute of the transition while the record IDs are retrived by
+evaluating the trigger_expression (also defined on the transition).
+
+- I think the triggers are never deleted from the database. They are: they are
+ 'on delete cascade' on both the workflow instance and the workitem.
+
+- Are those triggers re-installed whenever the transition is tried ? Nope.
+
From b5068764adb294f3d914d46751a3cbe0bfc55dd2 Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Tue, 23 Jul 2013 14:51:43 +0200
Subject: [PATCH 03/61] [DOC] workflows: added Conditions section.
bzr revid: vmt@openerp.com-20130723125143-20n8ukewixxbkbt4
---
doc/workflows.rst | 49 ++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 44 insertions(+), 5 deletions(-)
diff --git a/doc/workflows.rst b/doc/workflows.rst
index 6e7308d485d..939433440a2 100644
--- a/doc/workflows.rst
+++ b/doc/workflows.rst
@@ -15,8 +15,8 @@ When defining a workflow, one can attach conditions, signals, and triggers to
transitions, so that the behavior of the workflow can depend on user actions
(such as clicking on a button), changes to records, or arbitrary Python code.
-XML definition
---------------
+Basics
+------
Defining a workflow with data files is straightforward: a record "workflow" is
needed together with records for the activities and the transitions. For
@@ -69,13 +69,52 @@ context`` arguments are passed for you).
The transition between "a" and "b" does not specify any conditions. This means
the workflow instance will immediately progress from "a" to "b" (after "a" has
-been processed), and thus elso process the "b" activity.
+been processed), and thus also process the "b" activity.
+
+Transitions
+-----------
+
+Transitions provide the control structures to orchestrate a workflow. In their
+simplest form they just link activities from one to the others (as in the
+example above), and activities are processed as soon as the activities
+preceding them are completed.
+
+But instead of running all activities in one fell swoop, it is also possible to
+block on transitions, going through them only when some criteria are met. Such
+criteria are the conditions, the signals, and the triggers. They are detailed
+in the next sections.
Conditions
-----------
+''''''''''
+
+When an activity has been completed, its outgoing transitions will be inspected
+to see if it is possible for the workflow instance to proceed through them and
+reach the next activities. When only a condition is defined (i.e. no signal or
+trigger is defined), the condition is evaluated by OpenERP, and if it evaluates
+to ``True``, the worklfow instance will go through.
+
+By default, the ``condition`` attribute (i.e. the expression to be evaluated)
+is just "True", which will trivially evaluate to ``True``.
+
+Actually, the condition can be several lines long, and the value of the last
+one will be used to test if the transition can be taken.
+
+In the condition evaluation environment, several symbols are conveniently
+defined:
+
+- The database cursor (``cr``),
+- the user ID (``uid``), the record ID tied to the workflow instance (``id``),
+- the user ID wrapped in a list (``ids``),
+- the model name (``model``),
+- the model instance (``obj``),
+- all the model column names,
+- and all the record (the one obtained by browsing the provided ID) attributes.
+
+Signals
+'''''''
Triggers
---------
+''''''''
When an activity is completed, the workflow engine will try to get across
transitions departing from the completed activity, towards the next activities.
From 2397c1a98ba6b93dc013d6d338a50ec49bacd47f Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Tue, 23 Jul 2013 14:52:42 +0200
Subject: [PATCH 04/61] [IMP] workflows: added docstring, some variable
renaming (to wkf_expr).
bzr revid: vmt@openerp.com-20130723125242-mpzpjfbnyrmx3bzt
---
openerp/workflow/wkf_expr.py | 74 +++++++++++++++++++++++++-----------
1 file changed, 52 insertions(+), 22 deletions(-)
diff --git a/openerp/workflow/wkf_expr.py b/openerp/workflow/wkf_expr.py
index b43fa83e3de..0b83195aec2 100644
--- a/openerp/workflow/wkf_expr.py
+++ b/openerp/workflow/wkf_expr.py
@@ -19,62 +19,92 @@
#
##############################################################################
+"""
+Evaluate workflow code found in activity actions and transition conditions.
+"""
+
import openerp
from openerp.tools.safe_eval import safe_eval as eval
class Env(dict):
- def __init__(self, cr, uid, model, ids):
+ """
+ Dictionary class used as an environment to evaluate workflow code (such as
+ the condition on transitions).
+
+ This environment provides sybmols for cr, uid, id, model name, model
+ instance, column names, and all the record (the one obtained by browsing
+ the provided ID) attributes.
+ """
+ def __init__(self, cr, uid, model, id):
self.cr = cr
self.uid = uid
self.model = model
- self.ids = ids
+ self.id = id
+ self.ids = [id]
self.obj = openerp.registry(cr.dbname)[model]
self.columns = self.obj._columns.keys() + self.obj._inherit_fields.keys()
def __getitem__(self, key):
if (key in self.columns) or (key in dir(self.obj)):
- res = self.obj.browse(self.cr, self.uid, self.ids[0])
+ res = self.obj.browse(self.cr, self.uid, self.id)
return res[key]
else:
return super(Env, self).__getitem__(key)
-def _eval_expr(cr, ident, workitem, action):
- ret=False
- assert action, 'You used a NULL action in a workflow, use dummy node instead.'
- for line in action.split('\n'):
+def _eval_expr(cr, ident, workitem, lines):
+ """
+ Evaluate each line of ``lines`` with the ``Env`` environment, returning
+ the value of the last line.
+ """
+ assert lines, 'You used a NULL action in a workflow, use dummy node instead.'
+ uid, model, id = ident
+ result = False
+ for line in lines.split('\n'):
line = line.strip()
if not line:
continue
- uid=ident[0]
- model=ident[1]
- ids=[ident[2]]
- if line =='True':
- ret=True
- elif line =='False':
- ret=False
+ if line == 'True':
+ result = True
+ elif line == 'False':
+ result = False
else:
- env = Env(cr, uid, model, ids)
- ret = eval(line, env, nocopy=True)
- return ret
+ env = Env(cr, uid, model, id)
+ result = eval(line, env, nocopy=True)
+ return result
def execute_action(cr, ident, workitem, activity):
- obj = openerp.registry(cr.dbname)['ir.actions.server']
- ctx = {'active_model':ident[1], 'active_id':ident[2], 'active_ids':[ident[2]]}
- result = obj.run(cr, ident[0], [activity['action_id']], ctx)
+ """
+ Evaluate the ir.actions.server action specified in the activity.
+ """
+ uid, model, id = ident
+ ir_actions_server = openerp.registry(cr.dbname)['ir.actions.server']
+ context = { 'active_model': model, 'active_id': id, 'active_ids': [id] }
+ result = ir_actions_server.run(cr, uid, [activity['action_id']], context)
return result
def execute(cr, ident, workitem, activity):
+ """
+ Evaluate the action specified in the activity.
+ """
return _eval_expr(cr, ident, workitem, activity['action'])
def check(cr, workitem, ident, transition, signal):
+ """
+ Test if a transition can be taken. The transition can be taken if:
+
+ - the signal name matches,
+ - the uid is SUPERUSER_ID or the user groups contains the transition's
+ group,
+ - the condition evaluates to a truish value.
+ """
if transition['signal'] and signal != transition['signal']:
return False
uid = ident[0]
- if transition['group_id'] and uid != 1:
+ if uid != openerp.SUPERUSER_ID and transition['groups_id']:
registry = openerp.registry(cr.dbname)
user_groups = registry['res.users'].read(cr, uid, [uid], ['groups_id'])[0]['groups_id']
- if not transition['group_id'] in user_groups:
+ if transition['group_id'] not in user_groups:
return False
return _eval_expr(cr, ident, workitem, transition['condition'])
From 3f9fb6eacc5468c62b9017fd2af6e259e16b7c8f Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Tue, 23 Jul 2013 15:27:51 +0200
Subject: [PATCH 05/61] [DOC] workflows: added Signals section.
bzr revid: vmt@openerp.com-20130723132751-lwn5r6y1m51jhj9o
---
doc/workflows.rst | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/doc/workflows.rst b/doc/workflows.rst
index 939433440a2..19b845f7f98 100644
--- a/doc/workflows.rst
+++ b/doc/workflows.rst
@@ -113,6 +113,19 @@ defined:
Signals
'''''''
+In addition of a condition, a transition can specify a signal name. When such
+signal name is present, the transition will not be taken directly (even if the
+condition evaluates to true). Instead the transition will block, waiting to be
+woken up.
+
+To wake up a transition with a defined signal name, the signal must be sent to
+the workflow. A common way to send a signal is to use a button in the web
+interface, using the ```` element with the signal name as the ``name``
+attribute of the button.
+
+.. note:: The condition is still evaluated when the signal is sent to the
+ workflow instance.
+
Triggers
''''''''
From 8501e89735f826332d3cd4fbeb543af637405e1b Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Tue, 23 Jul 2013 17:12:49 +0200
Subject: [PATCH 06/61] [DOC] workflows: improved Triggers section.
bzr revid: vmt@openerp.com-20130723151249-oa18owwzg82ea79t
---
doc/workflows.rst | 39 ++++++++++++++++++---------------------
1 file changed, 18 insertions(+), 21 deletions(-)
diff --git a/doc/workflows.rst b/doc/workflows.rst
index 19b845f7f98..928cd49fbcc 100644
--- a/doc/workflows.rst
+++ b/doc/workflows.rst
@@ -74,7 +74,9 @@ been processed), and thus also process the "b" activity.
Transitions
-----------
-Transitions provide the control structures to orchestrate a workflow. In their
+Transitions provide the control structures to orchestrate a workflow. When an
+activity is completed, the workflow engine will try to get across transitions
+departing from the completed activity, towards the next activities. In their
simplest form they just link activities from one to the others (as in the
example above), and activities are processed as soon as the activities
preceding them are completed.
@@ -129,28 +131,23 @@ attribute of the button.
Triggers
''''''''
-When an activity is completed, the workflow engine will try to get across
-transitions departing from the completed activity, towards the next activities.
-To get across a transition, its associated condition should evaluate to True.
-If the condition evaluates to False, the transition is not taken (and thus the
+With conditions that evaluate to false, transitions are not taken (and thus the
activity it leads to will not be processed). Still, the workflow instance can
get new chances to progress across that transition by providing so-called
-triggers. The idea is that when the condition fails, triggers (actually just
-model name/record IDs pairs) are recorded in database. Later, it is possible to
-wake-up specifically the workflow instances that installed those triggers,
-offering them a new chance to evaluation their transition conditions. This
-mechnism makes it cheaper to wake-up workflow instances by targetting just a
-few of them (those that have installed the triggers) instead of all of them.
+triggers. The idea is that when the condition fails, triggers are recorded in
+database. Later, it is possible to wake-up specifically the workflow instances
+that installed those triggers, offering them a new chance to evaluation their
+transition conditions. This mechnism makes it cheaper to wake-up workflow
+instances by targetting just a few of them (those that have installed the
+triggers) instead of all of them.
-On each transition, in addition to a condition, records can be defined as a
-trigger. The records will be defined as triggers as the transition is tried
-withing a workflow, after the condition has failed. The actual records are
-stored as model name and record ids. The model name is defined by the
-trigger_model attribute of the transition while the record IDs are retrived by
-evaluating the trigger_expression (also defined on the transition).
+Triggers are recorded in database as record IDs (together with the model name)
+and refer to the workflow instance waiting for them. The transition definition
+can thus provide a Python expression (using the ``trigger_model`` attribute)
+that when evaluated will return the record IDs. Unlike the other expressions
+defined on the workflow, this one is evaluated with respect to a model that can
+be chosen on a per-transition basis with the ``trigger_expression`` attribute.
-- I think the triggers are never deleted from the database. They are: they are
- 'on delete cascade' on both the workflow instance and the workitem.
-
-- Are those triggers re-installed whenever the transition is tried ? Nope.
+.. note:: Note that triggers are not re-installed whenever the transition is
+ re-tried.
From 86c544d2024495d6c533a7263245fda7446bdcaf Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Wed, 24 Jul 2013 14:37:41 +0200
Subject: [PATCH 07/61] [DOC] workflows: added Flow start and flow stop
section.
bzr revid: vmt@openerp.com-20130724123741-jf3l9w3flxf7ty4k
---
doc/workflows.rst | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/doc/workflows.rst b/doc/workflows.rst
index 928cd49fbcc..d631fdfb265 100644
--- a/doc/workflows.rst
+++ b/doc/workflows.rst
@@ -151,3 +151,33 @@ be chosen on a per-transition basis with the ``trigger_expression`` attribute.
.. note:: Note that triggers are not re-installed whenever the transition is
re-tried.
+Activities
+----------
+
+While the transitions can be seen as the control structure of the workflows,
+activities are the place where everything happen, from changing record states
+to sending email.
+
+Different kind of activities exist: ``Dummy``, ``Function``, ``Subflow``, and
+``Stop all``; different kind of activities can do different and they are
+detailed below.
+
+In addition to the activity kind, activies have some properties, detailed in
+the next sections.
+
+Flow start and flow stop
+''''''''''''''''''''''''
+
+The ``flow_start`` attribute is a boolean value specifying if the activity
+starts the workflow. Multiple activities can have the ``flow_start`` attribute
+set to ``True`` and when instanciating a workflow for a record, OpenERP will
+simply process all of them, and try all their outgoing transitions afterwards.
+
+The ``flow_stop`` attribute is also a boolean value, specifying if the activity
+ends the workflow. A workflow is considered to be completed when all its
+activities with the ``flow_stop`` attribute set to ``True`` are completed.
+
+It is important for OpenERP to know when a workflow instance is completed: a
+workflow can have an activity that is actually another workflow (called a
+subflow) and that activity will be completed only when the subflow is
+completed.
From eff32c650c5c69d64ad21bc4a7a003fce9f8e1ac Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Wed, 24 Jul 2013 15:51:02 +0200
Subject: [PATCH 08/61] [DOC] workflows: added Subflow section.
bzr revid: vmt@openerp.com-20130724135102-2zzaoqpjpebim59k
---
doc/workflows.rst | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/doc/workflows.rst b/doc/workflows.rst
index d631fdfb265..521ca0bb6d3 100644
--- a/doc/workflows.rst
+++ b/doc/workflows.rst
@@ -181,3 +181,29 @@ It is important for OpenERP to know when a workflow instance is completed: a
workflow can have an activity that is actually another workflow (called a
subflow) and that activity will be completed only when the subflow is
completed.
+
+Subflow
+'''''''
+
+An activity can embed a complete workflow, called a subflow (the embedding
+workflow is called the parent workflow). The workflow to instanciate is
+specified by the ``subflow_id`` attribute.
+
+.. note:: In the GUI, that attribute can not be set unless the kind of the
+ activity is ``Subflow``.
+
+The activity will be completed (and its outgoing transitions will be tried)
+when the subflow is completed (see the ``flow_stop`` attribute above to read
+about when a workflow is considered completed by OpenERP).
+
+Sending a signal from a subflow
+'''''''''''''''''''''''''''''''
+
+When a workflow is used (as a sublfow) in the activity of a (parent) workflow,
+the sublow can send a signal from its own activities to the parent by specifying a
+signal name in the ``signal_send`` attribute. OpenERP will process those
+activities normally and send to the parent workflow instance a signal with
+``signal_send`` value prefixed with ``subflow.``.
+
+In other words, it is possible to react and take transitions in the parent
+workflow as activities are executed in the sublow.
From 33ab08b8b37aa859eae55b334e2d959c2457d3c4 Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Wed, 24 Jul 2013 17:25:18 +0200
Subject: [PATCH 09/61] [DOC] workflows: added remaining sections for the
Activities.
bzr revid: vmt@openerp.com-20130724152518-gab0fa44t8a81u30
---
doc/workflows.rst | 69 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 69 insertions(+)
diff --git a/doc/workflows.rst b/doc/workflows.rst
index 521ca0bb6d3..a1165b6f5d2 100644
--- a/doc/workflows.rst
+++ b/doc/workflows.rst
@@ -151,6 +151,14 @@ be chosen on a per-transition basis with the ``trigger_expression`` attribute.
.. note:: Note that triggers are not re-installed whenever the transition is
re-tried.
+Splitting and joining transitions
+'''''''''''''''''''''''''''''''''
+
+When multiple transitions leave the same activity, or lead to the same
+activity, OpenERP provides some control about which transitions will be
+crossed, or how the reached activity will be processed. The ``split_mode`` and
+``join_mode`` attributes on the activity are used for such control.
+
Activities
----------
@@ -207,3 +215,64 @@ activities normally and send to the parent workflow instance a signal with
In other words, it is possible to react and take transitions in the parent
workflow as activities are executed in the sublow.
+
+Server actions
+''''''''''''''
+
+An activity can run a "Server Action" by specifying its ID in the ``action_id``
+attribute.
+
+Python action
+'''''''''''''
+
+An activity can run some Python code, provided through the ``action``
+attribute. See the section about transition conditions to read about the
+evaluation environment.
+
+Split mode
+''''''''''
+
+After an activity has been processed, its outgoing transitions will be tried.
+Normally, if a transition can be taken, OpenERP will do it and proceed to the
+activity the transition leads to.
+
+Actually, when more than a single transition is leaving an activity, OpenERP
+can proceed, or not, depending on the other transitions. That is, the condition
+on the transitions can be combined together, and the combined result will
+instruct OpenERP to cross zero, one, or all the transitions. The way they are
+combined is controlled by the ``split_mode`` attribute.
+
+There are indeed three modes to decide how to combine the transition
+conditions, ``XOR``, ``OR``, and ``AND``.
+
+``XOR``
+ When the transitions are combined with a ``XOR`` split mode, as soon as a
+ transition with a condition that evaluates to true is found, the
+ transition is taken and the other will not be tried.
+
+``OR``
+ With an ``OR`` mode, all the transitions with a condition that evaluates to
+ true are taken. The remaining transitions will not be tried later.
+
+``AND``
+ With an ``AND`` mode, OpenERP will wait for all transition conditions to
+ evaluate to true, then cross all the transitions at the same time.
+
+Join mode
+'''''''''
+
+Just as departing transition conditions can be combined together to decide
+whether they can be taken or not, arriving transitions can be combined together
+to decide if an activity must be run. The attribute to control that behavior is
+called ``join_mode``.
+
+The join mode is a bit simpler than the split mode: only two modes are
+provided, ``XOR`` and ``AND``.
+
+``XOR``
+ An activity with a ``XOR`` join mode will be run as soon as a transition is
+ crossed to arrive at the activity.
+
+``AND``
+ With an ``AND`` mode, the activity will wait for all its incoming
+ transitions to be crossed before being run.
From b7f02c329e05343c5e4bfa3a35d9bb81ffcff8cc Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Thu, 25 Jul 2013 11:42:19 +0200
Subject: [PATCH 10/61] [DOC] workflows: added Kinds section.
bzr revid: vmt@openerp.com-20130725094219-tintybvpdl5izdca
---
doc/workflows.rst | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/doc/workflows.rst b/doc/workflows.rst
index a1165b6f5d2..293b2c347c0 100644
--- a/doc/workflows.rst
+++ b/doc/workflows.rst
@@ -276,3 +276,32 @@ provided, ``XOR`` and ``AND``.
``AND``
With an ``AND`` mode, the activity will wait for all its incoming
transitions to be crossed before being run.
+
+Kinds
+'''''
+
+Activities can be of different kinds: ``dummy``, ``function``, ``subflow``, or
+``stopall``. The kind defines what type of work an activity can do.
+
+Dummy
+ The ``dummy`` kind is for activities that do nothing (i.e. they act as hubs
+ to gather/dispatch transitions), or for activities that only call a Server
+ Action.
+
+Function
+ The ``function`` kind is for activities that only need to run some Python
+ code, and possibly a Server Action.
+
+Stop all
+ The ``stopall`` kind is for activities that will completely halt the
+ workflow instance. In addition they can also run some Python code.
+
+Subflow
+ When the kind of the activity is ``subflow``, the activity will run
+ another workflow. When the sub-workflow is completed, the activity will also be
+ considered completed.
+
+ Normally the sub-workflow is instanciated for the same record as the parent
+ workflow. It is possible to change that default behavior by providing
+ Python code that has to return a record ID for which a workflow has been
+ instanciated.
From ae01b6ab21c3ab26aab135087cf94d80a660c6c2 Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Thu, 25 Jul 2013 11:42:46 +0200
Subject: [PATCH 11/61] [ADD] workflows: added some tests.
bzr revid: vmt@openerp.com-20130725094246-4v2p0sgzocnt5vwf
---
openerp/tests/addons/test_workflow/data.xml | 84 ++++++++++++++++++-
openerp/tests/addons/test_workflow/models.py | 19 ++++-
.../test_workflow/tests/test_workflow.py | 43 ++++++++++
3 files changed, 144 insertions(+), 2 deletions(-)
diff --git a/openerp/tests/addons/test_workflow/data.xml b/openerp/tests/addons/test_workflow/data.xml
index c50dfc03bf6..a07451e2f42 100644
--- a/openerp/tests/addons/test_workflow/data.xml
+++ b/openerp/tests/addons/test_workflow/data.xml
@@ -37,7 +37,6 @@
-
+
+ test.workflow.a
+ test.workflow.model.a
+ True
+
+
+
+
+ True
+ True
+ a
+ dummy
+
+
+
+
+ test.workflow.b
+ test.workflow.model.b
+ True
+
+
+
+
+ True
+ True
+ a
+ function
+ write({'value': 1})
+
+
+
+
+ test.workflow.c
+ test.workflow.model.c
+ True
+
+
+
+
+ True
+ True
+ a
+ dummy
+ write({'value': 1})
+
+
+
+
+ test.workflow.d
+ test.workflow.model.d
+ True
+
+
+
+
+ True
+ True
+ a
+ stopall
+ write({'value': 1})
+
diff --git a/openerp/tests/addons/test_workflow/models.py b/openerp/tests/addons/test_workflow/models.py
index 7f79aeb1484..b1df8e662d3 100644
--- a/openerp/tests/addons/test_workflow/models.py
+++ b/openerp/tests/addons/test_workflow/models.py
@@ -2,7 +2,7 @@
import openerp
class m(openerp.osv.orm.Model):
- """ A model for which we will define a worflow (see data.xml). """
+ """ A model for which we will define a workflow (see data.xml). """
_name = 'test.workflow.model'
def print_(self, cr, uid, ids, s, context=None):
@@ -34,4 +34,21 @@ class n(openerp.osv.orm.Model):
_columns = { 'value': openerp.osv.fields.boolean('Value') }
_defaults = { 'value': False }
+class a(openerp.osv.orm.Model):
+ _name = 'test.workflow.model.a'
+ _columns = { 'value': openerp.osv.fields.integer('Value') }
+ _defaults = { 'value': 0 }
+
+class b(openerp.osv.orm.Model):
+ _name = 'test.workflow.model.b'
+ _inherit = 'test.workflow.model.a'
+
+class c(openerp.osv.orm.Model):
+ _name = 'test.workflow.model.c'
+ _inherit = 'test.workflow.model.a'
+
+class d(openerp.osv.orm.Model):
+ _name = 'test.workflow.model.d'
+ _inherit = 'test.workflow.model.a'
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerp/tests/addons/test_workflow/tests/test_workflow.py b/openerp/tests/addons/test_workflow/tests/test_workflow.py
index 60ace7ee269..c09511dc168 100644
--- a/openerp/tests/addons/test_workflow/tests/test_workflow.py
+++ b/openerp/tests/addons/test_workflow/tests/test_workflow.py
@@ -33,6 +33,13 @@ class test_workflows(common.TransactionCase):
sorted([item.act_id.name for item in workitem_records]),
sorted(names))
+ def check_value(self, model_name, i, value):
+ """ Check that the record i has the given value.
+ """
+ model = self.registry(model_name)
+ record = model.read(self.cr, SUPERUSER_ID, [i], ['value'])[0]
+ self.assertEqual(record['value'], value)
+
def test_workflow(self):
model = self.registry('test.workflow.model')
trigger = self.registry('test.workflow.trigger')
@@ -60,3 +67,39 @@ class test_workflows(common.TransactionCase):
True)
model.unlink(self.cr, SUPERUSER_ID, [i])
+
+ def test_workflow_a(self):
+ model = self.registry('test.workflow.model.a')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['a'])
+ self.check_value(model._name, i, 0)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
+
+ def test_workflow_b(self):
+ model = self.registry('test.workflow.model.b')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['a'])
+ self.check_value(model._name, i, 1)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
+
+ def test_workflow_c(self):
+ model = self.registry('test.workflow.model.c')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['a'])
+ self.check_value(model._name, i, 0)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
+
+ def test_workflow_d(self):
+ model = self.registry('test.workflow.model.d')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['a'])
+ self.check_value(model._name, i, 1)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
From 64ddf5f26422dfef9c545cc74e6db975d4a2eb50 Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Thu, 25 Jul 2013 12:43:27 +0200
Subject: [PATCH 12/61] [ADD] workflows: more tests.
bzr revid: vmt@openerp.com-20130725104327-l7onjhipi6fdnrj6
---
openerp/tests/addons/test_workflow/data.xml | 65 +++++++++++++++++++
openerp/tests/addons/test_workflow/models.py | 13 ++++
.../test_workflow/tests/test_workflow.py | 22 +++++++
3 files changed, 100 insertions(+)
diff --git a/openerp/tests/addons/test_workflow/data.xml b/openerp/tests/addons/test_workflow/data.xml
index a07451e2f42..c6f542879a0 100644
--- a/openerp/tests/addons/test_workflow/data.xml
+++ b/openerp/tests/addons/test_workflow/data.xml
@@ -164,5 +164,70 @@
stopall
write({'value': 1})
+
+
+
+ test.workflow.e
+ test.workflow.model.e
+ True
+
+
+
+
+ True
+ a
+ function
+ write({'value': 1})
+
+
+
+ True
+ b
+ function
+ write({'value': 2})
+
+
+
+
+
+
+
+
+
+ test.workflow.f
+ test.workflow.model.f
+ True
+
+
+
+
+ True
+ a
+ function
+ write({'value': 1})
+
+
+
+ True
+ b
+ function
+ write({'value': 2})
+
+
+
+
+
+ a-b
+
diff --git a/openerp/tests/addons/test_workflow/models.py b/openerp/tests/addons/test_workflow/models.py
index b1df8e662d3..84789cc9b69 100644
--- a/openerp/tests/addons/test_workflow/models.py
+++ b/openerp/tests/addons/test_workflow/models.py
@@ -51,4 +51,17 @@ class d(openerp.osv.orm.Model):
_name = 'test.workflow.model.d'
_inherit = 'test.workflow.model.a'
+class e(openerp.osv.orm.Model):
+ _name = 'test.workflow.model.e'
+ _inherit = 'test.workflow.model.a'
+
+for name in 'bcdef':
+ type(
+ name,
+ (openerp.osv.orm.Model,),
+ {
+ '_name': 'test.workflow.model.%s' % name,
+ '_inherit': 'test.workflow.model.a',
+ })
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerp/tests/addons/test_workflow/tests/test_workflow.py b/openerp/tests/addons/test_workflow/tests/test_workflow.py
index c09511dc168..d55657f6a6a 100644
--- a/openerp/tests/addons/test_workflow/tests/test_workflow.py
+++ b/openerp/tests/addons/test_workflow/tests/test_workflow.py
@@ -103,3 +103,25 @@ class test_workflows(common.TransactionCase):
self.check_value(model._name, i, 1)
model.unlink(self.cr, SUPERUSER_ID, [i])
+
+ def test_workflow_e(self):
+ model = self.registry('test.workflow.model.e')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['b'])
+ self.check_value(model._name, i, 2)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
+
+ def test_workflow_f(self):
+ model = self.registry('test.workflow.model.f')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['a'])
+ self.check_value(model._name, i, 1)
+
+ model.signal_workflow(self.cr, SUPERUSER_ID, [i], 'a-b')
+ self.check_activities(model._name, i, ['b'])
+ self.check_value(model._name, i, 2)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
From 68ff38763ab40845e15b4a1305d8dc592b7b9b8b Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Thu, 25 Jul 2013 16:30:56 +0200
Subject: [PATCH 13/61] [ADD] workflows: some split_mode tests.
I am not sure if the Workflow K is determinist though
so it could maybe end up in activity c instead of b
(and thus fail the tests).
bzr revid: vmt@openerp.com-20130725143056-p6oic1m9jjke9j8r
---
openerp/tests/addons/test_workflow/data.xml | 216 ++++++++++++++++++
openerp/tests/addons/test_workflow/models.py | 2 +-
.../test_workflow/tests/test_workflow.py | 45 ++++
3 files changed, 262 insertions(+), 1 deletion(-)
diff --git a/openerp/tests/addons/test_workflow/data.xml b/openerp/tests/addons/test_workflow/data.xml
index c6f542879a0..b9f1e367000 100644
--- a/openerp/tests/addons/test_workflow/data.xml
+++ b/openerp/tests/addons/test_workflow/data.xml
@@ -229,5 +229,221 @@
a-b
+
+
+
+ test.workflow.g
+ test.workflow.model.g
+ True
+
+
+
+
+ True
+ a
+ function
+ write({'value': 1})
+
+
+
+ True
+ b
+ function
+ write({'value': 2})
+
+
+
+
+
+ False
+
+
+
+
+ test.workflow.h
+ test.workflow.model.h
+ True
+
+
+
+
+ True
+ a
+ function
+ write({'value': 1})
+ OR
+
+
+
+ True
+ b
+ function
+ write({'value': 2})
+
+
+
+ True
+ c
+ function
+ write({'value': 2})
+
+
+
+
+
+
+
+
+
+
+
+
+
+ test.workflow.i
+ test.workflow.model.i
+ True
+
+
+
+
+ True
+ a
+ function
+ write({'value': 1})
+ OR
+
+
+
+ True
+ b
+ function
+ write({'value': 2})
+
+
+
+ True
+ c
+ function
+ write({'value': 3})
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ test.workflow.j
+ test.workflow.model.j
+ True
+
+
+
+
+ True
+ a
+ function
+ write({'value': 1})
+ AND
+
+
+
+ True
+ b
+ function
+ write({'value': 2})
+
+
+
+ True
+ c
+ function
+ write({'value': 3})
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ test.workflow.k
+ test.workflow.model.k
+ True
+
+
+
+
+ True
+ a
+ function
+ write({'value': 1})
+ XOR
+
+
+
+ True
+ b
+ function
+ write({'value': 2})
+
+
+
+ True
+ c
+ function
+ write({'value': 3})
+
+
+
+
+
+
+
+
+
+
diff --git a/openerp/tests/addons/test_workflow/models.py b/openerp/tests/addons/test_workflow/models.py
index 84789cc9b69..8214d6313ff 100644
--- a/openerp/tests/addons/test_workflow/models.py
+++ b/openerp/tests/addons/test_workflow/models.py
@@ -55,7 +55,7 @@ class e(openerp.osv.orm.Model):
_name = 'test.workflow.model.e'
_inherit = 'test.workflow.model.a'
-for name in 'bcdef':
+for name in 'bcdefghijk':
type(
name,
(openerp.osv.orm.Model,),
diff --git a/openerp/tests/addons/test_workflow/tests/test_workflow.py b/openerp/tests/addons/test_workflow/tests/test_workflow.py
index d55657f6a6a..4d9cee98b35 100644
--- a/openerp/tests/addons/test_workflow/tests/test_workflow.py
+++ b/openerp/tests/addons/test_workflow/tests/test_workflow.py
@@ -125,3 +125,48 @@ class test_workflows(common.TransactionCase):
self.check_value(model._name, i, 2)
model.unlink(self.cr, SUPERUSER_ID, [i])
+
+ def test_workflow_g(self):
+ model = self.registry('test.workflow.model.g')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['a'])
+ self.check_value(model._name, i, 1)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
+
+ def test_workflow_h(self):
+ model = self.registry('test.workflow.model.h')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['b', 'c'])
+ self.check_value(model._name, i, 2)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
+
+ def test_workflow_i(self):
+ model = self.registry('test.workflow.model.i')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['b'])
+ self.check_value(model._name, i, 2)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
+
+ def test_workflow_j(self):
+ model = self.registry('test.workflow.model.j')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['a'])
+ self.check_value(model._name, i, 1)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
+
+ def test_workflow_k(self):
+ model = self.registry('test.workflow.model.k')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['b'])
+ self.check_value(model._name, i, 2)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
From fc435af4284ff4f70c8f1900526d00fc5217307d Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Fri, 26 Jul 2013 12:36:00 +0200
Subject: [PATCH 14/61] [FIX] workflows: fixed the non-deterministic workflow
K, added workflow L in tests.
bzr revid: vmt@openerp.com-20130726103600-t58rshix01q7vpot
---
openerp/tests/addons/test_workflow/data.xml | 72 ++++++++++++++++++-
openerp/tests/addons/test_workflow/models.py | 2 +-
.../test_workflow/tests/test_workflow.py | 13 +++-
3 files changed, 83 insertions(+), 4 deletions(-)
diff --git a/openerp/tests/addons/test_workflow/data.xml b/openerp/tests/addons/test_workflow/data.xml
index b9f1e367000..6299baa77ea 100644
--- a/openerp/tests/addons/test_workflow/data.xml
+++ b/openerp/tests/addons/test_workflow/data.xml
@@ -403,7 +403,7 @@
+
+ test.workflow.l
+ test.workflow.model.l
+ True
+
+
+
+
+ True
+ a
+ function
+ write({'value': 1})
+ OR
+
+
+
+ True
+ b
+ function
+ write({'value': 2})
+ OR
+
+
+
+ True
+ c
+ function
+ write({'value': 3})
+ XOR
+
+
+
+ True
+ d
+ function
+ write({'value': 3})
+ AND
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/openerp/tests/addons/test_workflow/models.py b/openerp/tests/addons/test_workflow/models.py
index 8214d6313ff..f7a5ef23b1a 100644
--- a/openerp/tests/addons/test_workflow/models.py
+++ b/openerp/tests/addons/test_workflow/models.py
@@ -55,7 +55,7 @@ class e(openerp.osv.orm.Model):
_name = 'test.workflow.model.e'
_inherit = 'test.workflow.model.a'
-for name in 'bcdefghijk':
+for name in 'bcdefghijkl':
type(
name,
(openerp.osv.orm.Model,),
diff --git a/openerp/tests/addons/test_workflow/tests/test_workflow.py b/openerp/tests/addons/test_workflow/tests/test_workflow.py
index 4d9cee98b35..e9ff7b9cd1e 100644
--- a/openerp/tests/addons/test_workflow/tests/test_workflow.py
+++ b/openerp/tests/addons/test_workflow/tests/test_workflow.py
@@ -166,7 +166,18 @@ class test_workflows(common.TransactionCase):
model = self.registry('test.workflow.model.k')
i = model.create(self.cr, SUPERUSER_ID, {})
- self.check_activities(model._name, i, ['b'])
+ # Non-determinisitic: can be b or c
+ # self.check_activities(model._name, i, ['b'])
+ # self.check_activities(model._name, i, ['c'])
self.check_value(model._name, i, 2)
model.unlink(self.cr, SUPERUSER_ID, [i])
+
+ def test_workflow_l(self):
+ model = self.registry('test.workflow.model.l')
+
+ i = model.create(self.cr, SUPERUSER_ID, {})
+ self.check_activities(model._name, i, ['c', 'c', 'd'])
+ self.check_value(model._name, i, 3)
+
+ model.unlink(self.cr, SUPERUSER_ID, [i])
From fd1df3ee22cfe8558a7d6b1fb661c36fc97b084b Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Fri, 26 Jul 2013 14:15:14 +0200
Subject: [PATCH 15/61] [IMP] Removed openerp's ineffective JavaScript module
loader and added retro-compatibility layer
bzr revid: nicolas.vanhoren@openerp.com-20130726121514-ss0omrhed76ybv5a
---
addons/web/__openerp__.py | 1 +
addons/web/static/src/js/boot.js | 75 +++++++++++---------
addons/web/static/src/js/coresetup.js | 11 ++-
addons/web/static/src/js/openerpframework.js | 18 +++++
4 files changed, 68 insertions(+), 37 deletions(-)
create mode 100644 addons/web/static/src/js/openerpframework.js
diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py
index e8c2dd903d0..7a00b4c5a47 100644
--- a/addons/web/__openerp__.py
+++ b/addons/web/__openerp__.py
@@ -42,6 +42,7 @@ This module provides the core of the OpenERP Web Client.
"static/lib/backbone/backbone.js",
"static/lib/cleditor/jquery.cleditor.js",
"static/lib/py.js/lib/py.js",
+ "static/src/js/openerpframework.js",
"static/src/js/boot.js",
"static/src/js/testing.js",
"static/src/js/pyeval.js",
diff --git a/addons/web/static/src/js/boot.js b/addons/web/static/src/js/boot.js
index 4565d220dc8..c255db36ff8 100644
--- a/addons/web/static/src/js/boot.js
+++ b/addons/web/static/src/js/boot.js
@@ -7,15 +7,20 @@
* @namespace openerp
*/
(function() {
- if (this.openerp)
- return;
- var session_counter = 0;
+ var inited = false;
- var openerp = this.openerp = {
+ _.extend(openerp, {
// Per session namespace
// openerp. will map to
// openerp.instances.sessionname. using a closure
- instances: {},
+ instances: {instance0: openerp},
+ // links to the global openerp
+ _openerp: openerp,
+ // this unique id will be replaced by hostname_databasename by
+ // openerp.web.Session on the first connection
+ _session_id: "instance0",
+ _modules: ['web'],
+ web_mobile: {},
/**
* OpenERP instance constructor
*
@@ -24,41 +29,43 @@
init: function(modules) {
if (modules === null) {
modules = [];
- } else {
- modules = _.union(['web'], modules || []);
}
- var new_instance = {
- // links to the global openerp
- _openerp: openerp,
- // this unique id will be replaced by hostname_databasename by
- // openerp.web.Session on the first connection
- _session_id: "instance" + session_counter++,
- _modules: modules,
- web: {},
- web_mobile: {}
- };
- openerp.instances[new_instance._session_id] = new_instance;
+ if (inited)
+ throw new Error("OpenERP was already inited");
+ inited = true;
+ init_web_modules();
for(var i=0; i < modules.length; i++) {
- new_instance[modules[i]] = {};
- if (openerp[modules[i]]) {
- openerp[modules[i]](new_instance,new_instance[modules[i]]);
+ if (modules[i] === "web")
+ continue;
+ var fct = openerp[modules[i]];
+ if (typeof(fct) === "function") {
+ openerp[modules[i]] = {};
+ for (k in fct) {
+ openerp[modules[i]][k] = fct[k];
+ }
+ fct(openerp, openerp[modules[i]]);
}
}
- return new_instance;
+ openerp._modules = ['web'].concat(modules);
+ return openerp;
}
- };
-})();
+ });
-/*---------------------------------------------------------
- * OpenERP Web web module split
- *---------------------------------------------------------*/
-openerp.web = function(session) {
- var files = ["pyeval", "corelib","coresetup","dates","formats","chrome","data","views","search","list","form","list_editable","web_mobile","view_tree","data_export","data_import"];
- for(var i=0; i
Date: Fri, 26 Jul 2013 14:40:57 +0200
Subject: [PATCH 16/61] [IMP] Put Class and Widget in a openerpframework.js
bzr revid: nicolas.vanhoren@openerp.com-20130726124057-qwmslhhheso5xy1x
---
addons/web/static/src/js/corelib.js | 757 +------------------
addons/web/static/src/js/coresetup.js | 1 -
addons/web/static/src/js/openerpframework.js | 739 +++++++++++++++++-
3 files changed, 753 insertions(+), 744 deletions(-)
diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js
index 6ab7a30c642..1b93ced09aa 100644
--- a/addons/web/static/src/js/corelib.js
+++ b/addons/web/static/src/js/corelib.js
@@ -25,460 +25,7 @@
openerp.web.corelib = function(instance) {
-/**
- * Improved John Resig's inheritance, based on:
- *
- * Simple JavaScript Inheritance
- * By John Resig http://ejohn.org/
- * MIT Licensed.
- *
- * Adds "include()"
- *
- * Defines The Class object. That object can be used to define and inherit classes using
- * the extend() method.
- *
- * Example:
- *
- * var Person = instance.web.Class.extend({
- * init: function(isDancing){
- * this.dancing = isDancing;
- * },
- * dance: function(){
- * return this.dancing;
- * }
- * });
- *
- * The init() method act as a constructor. This class can be instancied this way:
- *
- * var person = new Person(true);
- * person.dance();
- *
- * The Person class can also be extended again:
- *
- * var Ninja = Person.extend({
- * init: function(){
- * this._super( false );
- * },
- * dance: function(){
- * // Call the inherited version of dance()
- * return this._super();
- * },
- * swingSword: function(){
- * return true;
- * }
- * });
- *
- * When extending a class, each re-defined method can use this._super() to call the previous
- * implementation of that method.
- */
-(function() {
- var initializing = false,
- fnTest = /xyz/.test(function(){xyz();}) ? /\b_super\b/ : /.*/;
- // The web Class implementation (does nothing)
- instance.web.Class = function(){};
-
- /**
- * Subclass an existing class
- *
- * @param {Object} prop class-level properties (class attributes and instance methods) to set on the new class
- */
- instance.web.Class.extend = function() {
- var _super = this.prototype;
- // Support mixins arguments
- var args = _.toArray(arguments);
- args.unshift({});
- var prop = _.extend.apply(_,args);
-
- // Instantiate a web class (but only create the instance,
- // don't run the init constructor)
- initializing = true;
- var prototype = new this();
- initializing = false;
-
- // Copy the properties over onto the new prototype
- _.each(prop, function(val, name) {
- // Check if we're overwriting an existing function
- prototype[name] = typeof prop[name] == "function" &&
- fnTest.test(prop[name]) ?
- (function(name, fn) {
- return function() {
- var tmp = this._super;
-
- // Add a new ._super() method that is the same
- // method but on the super-class
- this._super = _super[name];
-
- // The method only need to be bound temporarily, so
- // we remove it when we're done executing
- var ret = fn.apply(this, arguments);
- this._super = tmp;
-
- return ret;
- };
- })(name, prop[name]) :
- prop[name];
- });
-
- // The dummy class constructor
- function Class() {
- if(this.constructor !== instance.web.Class){
- throw new Error("You can only instanciate objects with the 'new' operator");
- }
- // All construction is actually done in the init method
- if (!initializing && this.init) {
- var ret = this.init.apply(this, arguments);
- if (ret) { return ret; }
- }
- return this;
- }
- Class.include = function (properties) {
- _.each(properties, function(val, name) {
- if (typeof properties[name] !== 'function'
- || !fnTest.test(properties[name])) {
- prototype[name] = properties[name];
- } else if (typeof prototype[name] === 'function'
- && prototype.hasOwnProperty(name)) {
- prototype[name] = (function (name, fn, previous) {
- return function () {
- var tmp = this._super;
- this._super = previous;
- var ret = fn.apply(this, arguments);
- this._super = tmp;
- return ret;
- };
- })(name, properties[name], prototype[name]);
- } else if (typeof _super[name] === 'function') {
- prototype[name] = (function (name, fn) {
- return function () {
- var tmp = this._super;
- this._super = _super[name];
- var ret = fn.apply(this, arguments);
- this._super = tmp;
- return ret;
- };
- })(name, properties[name]);
- }
- });
- };
-
- // Populate our constructed prototype object
- Class.prototype = prototype;
-
- // Enforce the constructor to be what we expect
- Class.constructor = Class;
-
- // And make this class extendable
- Class.extend = arguments.callee;
-
- return Class;
- };
-})();
-
-// Mixins
-
-/**
- * Mixin to structure objects' life-cycles folowing a parent-children
- * relationship. Each object can a have a parent and multiple children.
- * When an object is destroyed, all its children are destroyed too releasing
- * any resource they could have reserved before.
- */
-instance.web.ParentedMixin = {
- __parentedMixin : true,
- init: function() {
- this.__parentedDestroyed = false;
- this.__parentedChildren = [];
- this.__parentedParent = null;
- },
- /**
- * Set the parent of the current object. When calling this method, the
- * parent will also be informed and will return the current object
- * when its getChildren() method is called. If the current object did
- * already have a parent, it is unregistered before, which means the
- * previous parent will not return the current object anymore when its
- * getChildren() method is called.
- */
- setParent : function(parent) {
- if (this.getParent()) {
- if (this.getParent().__parentedMixin) {
- this.getParent().__parentedChildren = _.without(this
- .getParent().getChildren(), this);
- }
- }
- this.__parentedParent = parent;
- if (parent && parent.__parentedMixin) {
- parent.__parentedChildren.push(this);
- }
- },
- /**
- * Return the current parent of the object (or null).
- */
- getParent : function() {
- return this.__parentedParent;
- },
- /**
- * Return a list of the children of the current object.
- */
- getChildren : function() {
- return _.clone(this.__parentedChildren);
- },
- /**
- * Returns true if destroy() was called on the current object.
- */
- isDestroyed : function() {
- return this.__parentedDestroyed;
- },
- /**
- Utility method to only execute asynchronous actions if the current
- object has not been destroyed.
-
- @param {$.Deferred} promise The promise representing the asynchronous
- action.
- @param {bool} [reject=false] If true, the returned promise will be
- rejected with no arguments if the current
- object is destroyed. If false, the
- returned promise will never be resolved
- or rejected.
- @returns {$.Deferred} A promise that will mirror the given promise if
- everything goes fine but will either be rejected
- with no arguments or never resolved if the
- current object is destroyed.
- */
- alive: function(promise, reject) {
- var def = $.Deferred();
- var self = this;
- promise.done(function() {
- if (! self.isDestroyed()) {
- if (! reject)
- def.resolve.apply(def, arguments);
- else
- def.reject();
- }
- }).fail(function() {
- if (! self.isDestroyed()) {
- if (! reject)
- def.reject.apply(def, arguments);
- else
- def.reject();
- }
- });
- return def.promise();
- },
- /**
- * Inform the object it should destroy itself, releasing any
- * resource it could have reserved.
- */
- destroy : function() {
- _.each(this.getChildren(), function(el) {
- el.destroy();
- });
- this.setParent(undefined);
- this.__parentedDestroyed = true;
- }
-};
-
-/**
- * Backbone's events. Do not ever use it directly, use EventDispatcherMixin instead.
- *
- * This class just handle the dispatching of events, it is not meant to be extended,
- * nor used directly. All integration with parenting and automatic unregistration of
- * events is done in EventDispatcherMixin.
- *
- * Copyright notice for the following Class:
- *
- * (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.
- * Backbone may be freely distributed under the MIT license.
- * For all details and documentation:
- * http://backbonejs.org
- *
- */
-var Events = instance.web.Class.extend({
- on : function(events, callback, context) {
- var ev;
- events = events.split(/\s+/);
- var calls = this._callbacks || (this._callbacks = {});
- while ((ev = events.shift())) {
- var list = calls[ev] || (calls[ev] = {});
- var tail = list.tail || (list.tail = list.next = {});
- tail.callback = callback;
- tail.context = context;
- list.tail = tail.next = {};
- }
- return this;
- },
-
- off : function(events, callback, context) {
- var ev, calls, node;
- if (!events) {
- delete this._callbacks;
- } else if ((calls = this._callbacks)) {
- events = events.split(/\s+/);
- while ((ev = events.shift())) {
- node = calls[ev];
- delete calls[ev];
- if (!callback || !node)
- continue;
- while ((node = node.next) && node.next) {
- if (node.callback === callback
- && (!context || node.context === context))
- continue;
- this.on(ev, node.callback, node.context);
- }
- }
- }
- return this;
- },
-
- callbackList: function() {
- var lst = [];
- _.each(this._callbacks || {}, function(el, eventName) {
- var node = el;
- while ((node = node.next) && node.next) {
- lst.push([eventName, node.callback, node.context]);
- }
- });
- return lst;
- },
-
- trigger : function(events) {
- var event, node, calls, tail, args, all, rest;
- if (!(calls = this._callbacks))
- return this;
- all = calls['all'];
- (events = events.split(/\s+/)).push(null);
- // Save references to the current heads & tails.
- while ((event = events.shift())) {
- if (all)
- events.push({
- next : all.next,
- tail : all.tail,
- event : event
- });
- if (!(node = calls[event]))
- continue;
- events.push({
- next : node.next,
- tail : node.tail
- });
- }
- rest = Array.prototype.slice.call(arguments, 1);
- while ((node = events.pop())) {
- tail = node.tail;
- args = node.event ? [ node.event ].concat(rest) : rest;
- while ((node = node.next) !== tail) {
- node.callback.apply(node.context || this, args);
- }
- }
- return this;
- }
-});
-
-instance.web.EventDispatcherMixin = _.extend({}, instance.web.ParentedMixin, {
- __eventDispatcherMixin: true,
- init: function() {
- instance.web.ParentedMixin.init.call(this);
- this.__edispatcherEvents = new Events();
- this.__edispatcherRegisteredEvents = [];
- },
- on: function(events, dest, func) {
- var self = this;
- if (!(func instanceof Function)) {
- throw new Error("Event handler must be a function.");
- }
- events = events.split(/\s+/);
- _.each(events, function(eventName) {
- self.__edispatcherEvents.on(eventName, func, dest);
- if (dest && dest.__eventDispatcherMixin) {
- dest.__edispatcherRegisteredEvents.push({name: eventName, func: func, source: self});
- }
- });
- return this;
- },
- off: function(events, dest, func) {
- var self = this;
- events = events.split(/\s+/);
- _.each(events, function(eventName) {
- self.__edispatcherEvents.off(eventName, func, dest);
- if (dest && dest.__eventDispatcherMixin) {
- dest.__edispatcherRegisteredEvents = _.filter(dest.__edispatcherRegisteredEvents, function(el) {
- return !(el.name === eventName && el.func === func && el.source === self);
- });
- }
- });
- return this;
- },
- trigger: function(events) {
- this.__edispatcherEvents.trigger.apply(this.__edispatcherEvents, arguments);
- return this;
- },
- destroy: function() {
- var self = this;
- _.each(this.__edispatcherRegisteredEvents, function(event) {
- event.source.__edispatcherEvents.off(event.name, event.func, self);
- });
- this.__edispatcherRegisteredEvents = [];
- _.each(this.__edispatcherEvents.callbackList(), function(cal) {
- this.off(cal[0], cal[2], cal[1]);
- }, this);
- this.__edispatcherEvents.off();
- instance.web.ParentedMixin.destroy.call(this);
- }
-});
-
-instance.web.PropertiesMixin = _.extend({}, instance.web.EventDispatcherMixin, {
- init: function() {
- instance.web.EventDispatcherMixin.init.call(this);
- this.__getterSetterInternalMap = {};
- },
- set: function(arg1, arg2, arg3) {
- var map;
- var options;
- if (typeof arg1 === "string") {
- map = {};
- map[arg1] = arg2;
- options = arg3 || {};
- } else {
- map = arg1;
- options = arg2 || {};
- }
- var self = this;
- var changed = false;
- _.each(map, function(val, key) {
- var tmp = self.__getterSetterInternalMap[key];
- if (tmp === val)
- return;
- changed = true;
- self.__getterSetterInternalMap[key] = val;
- if (! options.silent)
- self.trigger("change:" + key, self, {
- oldValue: tmp,
- newValue: val
- });
- });
- if (changed)
- self.trigger("change", self);
- },
- get: function(key) {
- return this.__getterSetterInternalMap[key];
- }
-});
-
-// Classes
-
-/**
- A class containing common utility methods useful when working with OpenERP as well as the PropertiesMixin.
-*/
-instance.web.Controller = instance.web.Class.extend(instance.web.PropertiesMixin, {
- /**
- * Constructs the object and sets its parent if a parent is given.
- *
- * @param {instance.web.Controller} parent Binds the current instance to the given Controller instance.
- * When that controller is destroyed by calling destroy(), the current instance will be
- * destroyed too. Can be null.
- */
- init: function(parent) {
- instance.web.PropertiesMixin.init.call(this);
- this.setParent(parent);
- },
+var ControllerMixin = {
/**
* Proxies a method of the object, in order to keep the right ``this`` on
* method invocations.
@@ -530,301 +77,35 @@ instance.web.Controller = instance.web.Class.extend(instance.web.PropertiesMixin
return false;
},
rpc: function(url, data, options) {
- return this.alive(instance.session.rpc(url, data, options));
+ return this.alive(openerp.session.rpc(url, data, options));
}
-});
+};
/**
- * Base class for all visual components. Provides a lot of functionalities helpful
- * for the management of a part of the DOM.
- *
- * Widget handles:
- * - Rendering with QWeb.
- * - Life-cycle management and parenting (when a parent is destroyed, all its children are
- * destroyed too).
- * - Insertion in DOM.
- *
- * Guide to create implementations of the Widget class:
- * ==============================================
- *
- * Here is a sample child class:
- *
- * MyWidget = instance.base.Widget.extend({
- * // the name of the QWeb template to use for rendering
- * template: "MyQWebTemplate",
- *
- * init: function(parent) {
- * this._super(parent);
- * // stuff that you want to init before the rendering
- * },
- * start: function() {
- * // stuff you want to make after the rendering, `this.$el` holds a correct value
- * this.$el.find(".my_button").click(/* an example of event binding * /);
- *
- * // if you have some asynchronous operations, it's a good idea to return
- * // a promise in start()
- * var promise = this.rpc(...);
- * return promise;
- * }
- * });
- *
- * Now this class can simply be used with the following syntax:
- *
- * var my_widget = new MyWidget(this);
- * my_widget.appendTo($(".some-div"));
- *
- * With these two lines, the MyWidget instance was inited, rendered, it was inserted into the
- * DOM inside the ".some-div" div and its events were binded.
- *
- * And of course, when you don't need that widget anymore, just do:
- *
- * my_widget.destroy();
- *
- * That will kill the widget in a clean way and erase its content from the dom.
- */
-instance.web.Widget = instance.web.Controller.extend({
- // Backbone-ish API
- tagName: 'div',
- id: null,
- className: null,
- attributes: {},
- events: {},
+ A class containing common utility methods useful when working with OpenERP as well as the PropertiesMixin.
+*/
+openerp.web.Controller = openerp.web.Class.extend(openerp.web.PropertiesMixin, ControllerMixin, {
/**
- * The name of the QWeb template that will be used for rendering. Must be
- * redefined in subclasses or the default render() method can not be used.
+ * Constructs the object and sets its parent if a parent is given.
*
- * @type string
- */
- template: null,
- /**
- * Constructs the widget and sets its parent if a parent is given.
- *
- * @constructs instance.web.Widget
- *
- * @param {instance.web.Widget} parent Binds the current instance to the given Widget instance.
- * When that widget is destroyed by calling destroy(), the current instance will be
+ * @param {openerp.web.Controller} parent Binds the current instance to the given Controller instance.
+ * When that controller is destroyed by calling destroy(), the current instance will be
* destroyed too. Can be null.
*/
init: function(parent) {
- this._super(parent);
- // Bind on_/do_* methods to this
- // We might remove this automatic binding in the future
- for (var name in this) {
- if(typeof(this[name]) == "function") {
- if((/^on_|^do_/).test(name)) {
- this[name] = this[name].bind(this);
- }
- }
- }
- // FIXME: this should not be
- this.setElement(this._make_descriptive());
- this.session = instance.session;
+ openerp.web.PropertiesMixin.init.call(this);
+ this.setParent(parent);
+ this.session = openerp.session;
},
- /**
- * Destroys the current widget, also destroys all its children before destroying itself.
- */
- destroy: function() {
- _.each(this.getChildren(), function(el) {
- el.destroy();
- });
- if(this.$el) {
- this.$el.remove();
- }
- instance.web.PropertiesMixin.destroy.call(this);
- },
- /**
- * Renders the current widget and appends it to the given jQuery object or Widget.
- *
- * @param target A jQuery object or a Widget instance.
- */
- appendTo: function(target) {
- var self = this;
- return this.__widgetRenderAndInsert(function(t) {
- self.$el.appendTo(t);
- }, target);
- },
- /**
- * Renders the current widget and prepends it to the given jQuery object or Widget.
- *
- * @param target A jQuery object or a Widget instance.
- */
- prependTo: function(target) {
- var self = this;
- return this.__widgetRenderAndInsert(function(t) {
- self.$el.prependTo(t);
- }, target);
- },
- /**
- * Renders the current widget and inserts it after to the given jQuery object or Widget.
- *
- * @param target A jQuery object or a Widget instance.
- */
- insertAfter: function(target) {
- var self = this;
- return this.__widgetRenderAndInsert(function(t) {
- self.$el.insertAfter(t);
- }, target);
- },
- /**
- * Renders the current widget and inserts it before to the given jQuery object or Widget.
- *
- * @param target A jQuery object or a Widget instance.
- */
- insertBefore: function(target) {
- var self = this;
- return this.__widgetRenderAndInsert(function(t) {
- self.$el.insertBefore(t);
- }, target);
- },
- /**
- * Renders the current widget and replaces the given jQuery object.
- *
- * @param target A jQuery object or a Widget instance.
- */
- replace: function(target) {
- return this.__widgetRenderAndInsert(_.bind(function(t) {
- this.$el.replaceAll(t);
- }, this), target);
- },
- __widgetRenderAndInsert: function(insertion, target) {
- this.renderElement();
- insertion(target);
- return this.start();
- },
- /**
- * Method called after rendering. Mostly used to bind actions, perform asynchronous
- * calls, etc...
- *
- * By convention, this method should return an object that can be passed to $.when()
- * to inform the caller when this widget has been initialized.
- *
- * @returns {jQuery.Deferred or any}
- */
- start: function() {
- return $.when();
- },
- /**
- * Renders the element. The default implementation renders the widget using QWeb,
- * `this.template` must be defined. The context given to QWeb contains the "widget"
- * key that references `this`.
- */
- renderElement: function() {
- var $el;
- if (this.template) {
- $el = $(_.str.trim(instance.web.qweb.render(
- this.template, {widget: this})));
- } else {
- $el = this._make_descriptive();
- }
- this.replaceElement($el);
- },
- /**
- * Re-sets the widget's root element and replaces the old root element
- * (if any) by the new one in the DOM.
- *
- * @param {HTMLElement | jQuery} $el
- * @returns {*} this
- */
- replaceElement: function ($el) {
- var $oldel = this.$el;
- this.setElement($el);
- if ($oldel && !$oldel.is(this.$el)) {
- $oldel.replaceWith(this.$el);
- }
- return this;
- },
- /**
- * Re-sets the widget's root element (el/$el/$el).
- *
- * Includes:
- * * re-delegating events
- * * re-binding sub-elements
- * * if the widget already had a root element, replacing the pre-existing
- * element in the DOM
- *
- * @param {HTMLElement | jQuery} element new root element for the widget
- * @return {*} this
- */
- setElement: function (element) {
- // NB: completely useless, as WidgetMixin#init creates a $el
- // always
- if (this.$el) {
- this.undelegateEvents();
- }
-
- this.$el = (element instanceof $) ? element : $(element);
- this.el = this.$el[0];
-
- this.delegateEvents();
-
- return this;
- },
- /**
- * Utility function to build small DOM elements.
- *
- * @param {String} tagName name of the DOM element to create
- * @param {Object} [attributes] map of DOM attributes to set on the element
- * @param {String} [content] HTML content to set on the element
- * @return {Element}
- */
- make: function (tagName, attributes, content) {
- var el = document.createElement(tagName);
- if (!_.isEmpty(attributes)) {
- $(el).attr(attributes);
- }
- if (content) {
- $(el).html(content);
- }
- return el;
- },
- /**
- * Makes a potential root element from the declarative builder of the
- * widget
- *
- * @return {jQuery}
- * @private
- */
- _make_descriptive: function () {
- var attrs = _.extend({}, this.attributes || {});
- if (this.id) { attrs.id = this.id; }
- if (this.className) { attrs['class'] = this.className; }
- return $(this.make(this.tagName, attrs));
- },
- delegateEvents: function () {
- var events = this.events;
- if (_.isEmpty(events)) { return; }
-
- for(var key in events) {
- if (!events.hasOwnProperty(key)) { continue; }
-
- var method = this.proxy(events[key]);
-
- var match = /^(\S+)(\s+(.*))?$/.exec(key);
- var event = match[1];
- var selector = match[3];
-
- event += '.widget_events';
- if (!selector) {
- this.$el.on(event, method);
- } else {
- this.$el.on(event, selector, method);
- }
- }
- },
- undelegateEvents: function () {
- this.$el.off('.widget_events');
- },
- /**
- * Shortcut for ``this.$el.find(selector)``
- *
- * @param {String} selector CSS selector, rooted in $el
- * @returns {jQuery} selector match
- */
- $: function(selector) {
- return this.$el.find(selector);
- }
});
+openerp.web.Widget.include(_.extend({}, ControllerMixin, {
+ init: function() {
+ this._super.apply(this, arguments);
+ this.session = openerp.session;
+ },
+}));
+
instance.web.Registry = instance.web.Class.extend({
/**
* Stores a mapping of arbitrary key (strings) to object paths (as strings
diff --git a/addons/web/static/src/js/coresetup.js b/addons/web/static/src/js/coresetup.js
index d4e1c6bc8a5..424782d5e24 100644
--- a/addons/web/static/src/js/coresetup.js
+++ b/addons/web/static/src/js/coresetup.js
@@ -564,7 +564,6 @@ instance.web._t = new instance.web.TranslationDataBase().build_translation_funct
instance.web._lt = function (s) {
return {toString: function () { return instance.web._t(s); }};
};
-instance.web.qweb = new QWeb2.Engine();
instance.web.qweb.debug = instance.session.debug;
instance.web.qweb.default_dict = {
'_' : _,
diff --git a/addons/web/static/src/js/openerpframework.js b/addons/web/static/src/js/openerpframework.js
index f481f0ce6b1..85c454d595d 100644
--- a/addons/web/static/src/js/openerpframework.js
+++ b/addons/web/static/src/js/openerpframework.js
@@ -1,16 +1,745 @@
(function() {
-function declare($, _, QWeb) {
- var openerp = {};
+function declare($, _, QWeb2) {
+var openerp = {};
+openerp.web = {};
- openerp.web = {};
+ /**
+ * Improved John Resig's inheritance, based on:
+ *
+ * Simple JavaScript Inheritance
+ * By John Resig http://ejohn.org/
+ * MIT Licensed.
+ *
+ * Adds "include()"
+ *
+ * Defines The Class object. That object can be used to define and inherit classes using
+ * the extend() method.
+ *
+ * Example:
+ *
+ * var Person = openerp.web.Class.extend({
+ * init: function(isDancing){
+ * this.dancing = isDancing;
+ * },
+ * dance: function(){
+ * return this.dancing;
+ * }
+ * });
+ *
+ * The init() method act as a constructor. This class can be instancied this way:
+ *
+ * var person = new Person(true);
+ * person.dance();
+ *
+ * The Person class can also be extended again:
+ *
+ * var Ninja = Person.extend({
+ * init: function(){
+ * this._super( false );
+ * },
+ * dance: function(){
+ * // Call the inherited version of dance()
+ * return this._super();
+ * },
+ * swingSword: function(){
+ * return true;
+ * }
+ * });
+ *
+ * When extending a class, each re-defined method can use this._super() to call the previous
+ * implementation of that method.
+ */
+(function() {
+ var initializing = false,
+ fnTest = /xyz/.test(function(){xyz();}) ? /\b_super\b/ : /.*/;
+ // The web Class implementation (does nothing)
+ openerp.web.Class = function(){};
- return openerp;
+ /**
+ * Subclass an existing class
+ *
+ * @param {Object} prop class-level properties (class attributes and instance methods) to set on the new class
+ */
+ openerp.web.Class.extend = function() {
+ var _super = this.prototype;
+ // Support mixins arguments
+ var args = _.toArray(arguments);
+ args.unshift({});
+ var prop = _.extend.apply(_,args);
+
+ // Instantiate a web class (but only create the instance,
+ // don't run the init constructor)
+ initializing = true;
+ var prototype = new this();
+ initializing = false;
+
+ // Copy the properties over onto the new prototype
+ _.each(prop, function(val, name) {
+ // Check if we're overwriting an existing function
+ prototype[name] = typeof prop[name] == "function" &&
+ fnTest.test(prop[name]) ?
+ (function(name, fn) {
+ return function() {
+ var tmp = this._super;
+
+ // Add a new ._super() method that is the same
+ // method but on the super-class
+ this._super = _super[name];
+
+ // The method only need to be bound temporarily, so
+ // we remove it when we're done executing
+ var ret = fn.apply(this, arguments);
+ this._super = tmp;
+
+ return ret;
+ };
+ })(name, prop[name]) :
+ prop[name];
+ });
+
+ // The dummy class constructor
+ function Class() {
+ if(this.constructor !== openerp.web.Class){
+ throw new Error("You can only instanciate objects with the 'new' operator");
+ }
+ // All construction is actually done in the init method
+ if (!initializing && this.init) {
+ var ret = this.init.apply(this, arguments);
+ if (ret) { return ret; }
+ }
+ return this;
+ }
+ Class.include = function (properties) {
+ _.each(properties, function(val, name) {
+ if (typeof properties[name] !== 'function'
+ || !fnTest.test(properties[name])) {
+ prototype[name] = properties[name];
+ } else if (typeof prototype[name] === 'function'
+ && prototype.hasOwnProperty(name)) {
+ prototype[name] = (function (name, fn, previous) {
+ return function () {
+ var tmp = this._super;
+ this._super = previous;
+ var ret = fn.apply(this, arguments);
+ this._super = tmp;
+ return ret;
+ };
+ })(name, properties[name], prototype[name]);
+ } else if (typeof _super[name] === 'function') {
+ prototype[name] = (function (name, fn) {
+ return function () {
+ var tmp = this._super;
+ this._super = _super[name];
+ var ret = fn.apply(this, arguments);
+ this._super = tmp;
+ return ret;
+ };
+ })(name, properties[name]);
+ }
+ });
+ };
+
+ // Populate our constructed prototype object
+ Class.prototype = prototype;
+
+ // Enforce the constructor to be what we expect
+ Class.constructor = Class;
+
+ // And make this class extendable
+ Class.extend = arguments.callee;
+
+ return Class;
+ };
+})();
+
+// Mixins
+
+/**
+ * Mixin to structure objects' life-cycles folowing a parent-children
+ * relationship. Each object can a have a parent and multiple children.
+ * When an object is destroyed, all its children are destroyed too releasing
+ * any resource they could have reserved before.
+ */
+openerp.web.ParentedMixin = {
+ __parentedMixin : true,
+ init: function() {
+ this.__parentedDestroyed = false;
+ this.__parentedChildren = [];
+ this.__parentedParent = null;
+ },
+ /**
+ * Set the parent of the current object. When calling this method, the
+ * parent will also be informed and will return the current object
+ * when its getChildren() method is called. If the current object did
+ * already have a parent, it is unregistered before, which means the
+ * previous parent will not return the current object anymore when its
+ * getChildren() method is called.
+ */
+ setParent : function(parent) {
+ if (this.getParent()) {
+ if (this.getParent().__parentedMixin) {
+ this.getParent().__parentedChildren = _.without(this
+ .getParent().getChildren(), this);
+ }
+ }
+ this.__parentedParent = parent;
+ if (parent && parent.__parentedMixin) {
+ parent.__parentedChildren.push(this);
+ }
+ },
+ /**
+ * Return the current parent of the object (or null).
+ */
+ getParent : function() {
+ return this.__parentedParent;
+ },
+ /**
+ * Return a list of the children of the current object.
+ */
+ getChildren : function() {
+ return _.clone(this.__parentedChildren);
+ },
+ /**
+ * Returns true if destroy() was called on the current object.
+ */
+ isDestroyed : function() {
+ return this.__parentedDestroyed;
+ },
+ /**
+ Utility method to only execute asynchronous actions if the current
+ object has not been destroyed.
+
+ @param {$.Deferred} promise The promise representing the asynchronous
+ action.
+ @param {bool} [reject=false] If true, the returned promise will be
+ rejected with no arguments if the current
+ object is destroyed. If false, the
+ returned promise will never be resolved
+ or rejected.
+ @returns {$.Deferred} A promise that will mirror the given promise if
+ everything goes fine but will either be rejected
+ with no arguments or never resolved if the
+ current object is destroyed.
+ */
+ alive: function(promise, reject) {
+ var def = $.Deferred();
+ var self = this;
+ promise.done(function() {
+ if (! self.isDestroyed()) {
+ if (! reject)
+ def.resolve.apply(def, arguments);
+ else
+ def.reject();
+ }
+ }).fail(function() {
+ if (! self.isDestroyed()) {
+ if (! reject)
+ def.reject.apply(def, arguments);
+ else
+ def.reject();
+ }
+ });
+ return def.promise();
+ },
+ /**
+ * Inform the object it should destroy itself, releasing any
+ * resource it could have reserved.
+ */
+ destroy : function() {
+ _.each(this.getChildren(), function(el) {
+ el.destroy();
+ });
+ this.setParent(undefined);
+ this.__parentedDestroyed = true;
+ }
+};
+
+/**
+ * Backbone's events. Do not ever use it directly, use EventDispatcherMixin instead.
+ *
+ * This class just handle the dispatching of events, it is not meant to be extended,
+ * nor used directly. All integration with parenting and automatic unregistration of
+ * events is done in EventDispatcherMixin.
+ *
+ * Copyright notice for the following Class:
+ *
+ * (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.
+ * Backbone may be freely distributed under the MIT license.
+ * For all details and documentation:
+ * http://backbonejs.org
+ *
+ */
+var Events = openerp.web.Class.extend({
+ on : function(events, callback, context) {
+ var ev;
+ events = events.split(/\s+/);
+ var calls = this._callbacks || (this._callbacks = {});
+ while ((ev = events.shift())) {
+ var list = calls[ev] || (calls[ev] = {});
+ var tail = list.tail || (list.tail = list.next = {});
+ tail.callback = callback;
+ tail.context = context;
+ list.tail = tail.next = {};
+ }
+ return this;
+ },
+
+ off : function(events, callback, context) {
+ var ev, calls, node;
+ if (!events) {
+ delete this._callbacks;
+ } else if ((calls = this._callbacks)) {
+ events = events.split(/\s+/);
+ while ((ev = events.shift())) {
+ node = calls[ev];
+ delete calls[ev];
+ if (!callback || !node)
+ continue;
+ while ((node = node.next) && node.next) {
+ if (node.callback === callback
+ && (!context || node.context === context))
+ continue;
+ this.on(ev, node.callback, node.context);
+ }
+ }
+ }
+ return this;
+ },
+
+ callbackList: function() {
+ var lst = [];
+ _.each(this._callbacks || {}, function(el, eventName) {
+ var node = el;
+ while ((node = node.next) && node.next) {
+ lst.push([eventName, node.callback, node.context]);
+ }
+ });
+ return lst;
+ },
+
+ trigger : function(events) {
+ var event, node, calls, tail, args, all, rest;
+ if (!(calls = this._callbacks))
+ return this;
+ all = calls['all'];
+ (events = events.split(/\s+/)).push(null);
+ // Save references to the current heads & tails.
+ while ((event = events.shift())) {
+ if (all)
+ events.push({
+ next : all.next,
+ tail : all.tail,
+ event : event
+ });
+ if (!(node = calls[event]))
+ continue;
+ events.push({
+ next : node.next,
+ tail : node.tail
+ });
+ }
+ rest = Array.prototype.slice.call(arguments, 1);
+ while ((node = events.pop())) {
+ tail = node.tail;
+ args = node.event ? [ node.event ].concat(rest) : rest;
+ while ((node = node.next) !== tail) {
+ node.callback.apply(node.context || this, args);
+ }
+ }
+ return this;
+ }
+});
+
+openerp.web.EventDispatcherMixin = _.extend({}, openerp.web.ParentedMixin, {
+ __eventDispatcherMixin: true,
+ init: function() {
+ openerp.web.ParentedMixin.init.call(this);
+ this.__edispatcherEvents = new Events();
+ this.__edispatcherRegisteredEvents = [];
+ },
+ on: function(events, dest, func) {
+ var self = this;
+ if (!(func instanceof Function)) {
+ throw new Error("Event handler must be a function.");
+ }
+ events = events.split(/\s+/);
+ _.each(events, function(eventName) {
+ self.__edispatcherEvents.on(eventName, func, dest);
+ if (dest && dest.__eventDispatcherMixin) {
+ dest.__edispatcherRegisteredEvents.push({name: eventName, func: func, source: self});
+ }
+ });
+ return this;
+ },
+ off: function(events, dest, func) {
+ var self = this;
+ events = events.split(/\s+/);
+ _.each(events, function(eventName) {
+ self.__edispatcherEvents.off(eventName, func, dest);
+ if (dest && dest.__eventDispatcherMixin) {
+ dest.__edispatcherRegisteredEvents = _.filter(dest.__edispatcherRegisteredEvents, function(el) {
+ return !(el.name === eventName && el.func === func && el.source === self);
+ });
+ }
+ });
+ return this;
+ },
+ trigger: function(events) {
+ this.__edispatcherEvents.trigger.apply(this.__edispatcherEvents, arguments);
+ return this;
+ },
+ destroy: function() {
+ var self = this;
+ _.each(this.__edispatcherRegisteredEvents, function(event) {
+ event.source.__edispatcherEvents.off(event.name, event.func, self);
+ });
+ this.__edispatcherRegisteredEvents = [];
+ _.each(this.__edispatcherEvents.callbackList(), function(cal) {
+ this.off(cal[0], cal[2], cal[1]);
+ }, this);
+ this.__edispatcherEvents.off();
+ openerp.web.ParentedMixin.destroy.call(this);
+ }
+});
+
+openerp.web.PropertiesMixin = _.extend({}, openerp.web.EventDispatcherMixin, {
+ init: function() {
+ openerp.web.EventDispatcherMixin.init.call(this);
+ this.__getterSetterInternalMap = {};
+ },
+ set: function(arg1, arg2, arg3) {
+ var map;
+ var options;
+ if (typeof arg1 === "string") {
+ map = {};
+ map[arg1] = arg2;
+ options = arg3 || {};
+ } else {
+ map = arg1;
+ options = arg2 || {};
+ }
+ var self = this;
+ var changed = false;
+ _.each(map, function(val, key) {
+ var tmp = self.__getterSetterInternalMap[key];
+ if (tmp === val)
+ return;
+ changed = true;
+ self.__getterSetterInternalMap[key] = val;
+ if (! options.silent)
+ self.trigger("change:" + key, self, {
+ oldValue: tmp,
+ newValue: val
+ });
+ });
+ if (changed)
+ self.trigger("change", self);
+ },
+ get: function(key) {
+ return this.__getterSetterInternalMap[key];
+ }
+});
+
+/**
+ * Base class for all visual components. Provides a lot of functionalities helpful
+ * for the management of a part of the DOM.
+ *
+ * Widget handles:
+ * - Rendering with QWeb.
+ * - Life-cycle management and parenting (when a parent is destroyed, all its children are
+ * destroyed too).
+ * - Insertion in DOM.
+ *
+ * Guide to create implementations of the Widget class:
+ * ==============================================
+ *
+ * Here is a sample child class:
+ *
+ * MyWidget = openerp.base.Widget.extend({
+ * // the name of the QWeb template to use for rendering
+ * template: "MyQWebTemplate",
+ *
+ * init: function(parent) {
+ * this._super(parent);
+ * // stuff that you want to init before the rendering
+ * },
+ * start: function() {
+ * // stuff you want to make after the rendering, `this.$el` holds a correct value
+ * this.$el.find(".my_button").click(/* an example of event binding * /);
+ *
+ * // if you have some asynchronous operations, it's a good idea to return
+ * // a promise in start()
+ * var promise = this.rpc(...);
+ * return promise;
+ * }
+ * });
+ *
+ * Now this class can simply be used with the following syntax:
+ *
+ * var my_widget = new MyWidget(this);
+ * my_widget.appendTo($(".some-div"));
+ *
+ * With these two lines, the MyWidget instance was inited, rendered, it was inserted into the
+ * DOM inside the ".some-div" div and its events were binded.
+ *
+ * And of course, when you don't need that widget anymore, just do:
+ *
+ * my_widget.destroy();
+ *
+ * That will kill the widget in a clean way and erase its content from the dom.
+ */
+openerp.web.Widget = openerp.web.Class.extend(openerp.web.PropertiesMixin, {
+ // Backbone-ish API
+ tagName: 'div',
+ id: null,
+ className: null,
+ attributes: {},
+ events: {},
+ /**
+ * The name of the QWeb template that will be used for rendering. Must be
+ * redefined in subclasses or the default render() method can not be used.
+ *
+ * @type string
+ */
+ template: null,
+ /**
+ * Constructs the widget and sets its parent if a parent is given.
+ *
+ * @constructs openerp.web.Widget
+ *
+ * @param {openerp.web.Widget} parent Binds the current instance to the given Widget instance.
+ * When that widget is destroyed by calling destroy(), the current instance will be
+ * destroyed too. Can be null.
+ */
+ init: function(parent) {
+ openerp.web.PropertiesMixin.init.call(this);
+ this.setParent(parent);
+ // Bind on_/do_* methods to this
+ // We might remove this automatic binding in the future
+ for (var name in this) {
+ if(typeof(this[name]) == "function") {
+ if((/^on_|^do_/).test(name)) {
+ this[name] = this[name].bind(this);
+ }
+ }
+ }
+ // FIXME: this should not be
+ this.setElement(this._make_descriptive());
+ },
+ /**
+ * Destroys the current widget, also destroys all its children before destroying itself.
+ */
+ destroy: function() {
+ _.each(this.getChildren(), function(el) {
+ el.destroy();
+ });
+ if(this.$el) {
+ this.$el.remove();
+ }
+ openerp.web.PropertiesMixin.destroy.call(this);
+ },
+ /**
+ * Renders the current widget and appends it to the given jQuery object or Widget.
+ *
+ * @param target A jQuery object or a Widget instance.
+ */
+ appendTo: function(target) {
+ var self = this;
+ return this.__widgetRenderAndInsert(function(t) {
+ self.$el.appendTo(t);
+ }, target);
+ },
+ /**
+ * Renders the current widget and prepends it to the given jQuery object or Widget.
+ *
+ * @param target A jQuery object or a Widget instance.
+ */
+ prependTo: function(target) {
+ var self = this;
+ return this.__widgetRenderAndInsert(function(t) {
+ self.$el.prependTo(t);
+ }, target);
+ },
+ /**
+ * Renders the current widget and inserts it after to the given jQuery object or Widget.
+ *
+ * @param target A jQuery object or a Widget instance.
+ */
+ insertAfter: function(target) {
+ var self = this;
+ return this.__widgetRenderAndInsert(function(t) {
+ self.$el.insertAfter(t);
+ }, target);
+ },
+ /**
+ * Renders the current widget and inserts it before to the given jQuery object or Widget.
+ *
+ * @param target A jQuery object or a Widget instance.
+ */
+ insertBefore: function(target) {
+ var self = this;
+ return this.__widgetRenderAndInsert(function(t) {
+ self.$el.insertBefore(t);
+ }, target);
+ },
+ /**
+ * Renders the current widget and replaces the given jQuery object.
+ *
+ * @param target A jQuery object or a Widget instance.
+ */
+ replace: function(target) {
+ return this.__widgetRenderAndInsert(_.bind(function(t) {
+ this.$el.replaceAll(t);
+ }, this), target);
+ },
+ __widgetRenderAndInsert: function(insertion, target) {
+ this.renderElement();
+ insertion(target);
+ return this.start();
+ },
+ /**
+ * Method called after rendering. Mostly used to bind actions, perform asynchronous
+ * calls, etc...
+ *
+ * By convention, this method should return an object that can be passed to $.when()
+ * to inform the caller when this widget has been initialized.
+ *
+ * @returns {jQuery.Deferred or any}
+ */
+ start: function() {
+ return $.when();
+ },
+ /**
+ * Renders the element. The default implementation renders the widget using QWeb,
+ * `this.template` must be defined. The context given to QWeb contains the "widget"
+ * key that references `this`.
+ */
+ renderElement: function() {
+ var $el;
+ if (this.template) {
+ $el = $(_.str.trim(openerp.web.qweb.render(
+ this.template, {widget: this})));
+ } else {
+ $el = this._make_descriptive();
+ }
+ this.replaceElement($el);
+ },
+ /**
+ * Re-sets the widget's root element and replaces the old root element
+ * (if any) by the new one in the DOM.
+ *
+ * @param {HTMLElement | jQuery} $el
+ * @returns {*} this
+ */
+ replaceElement: function ($el) {
+ var $oldel = this.$el;
+ this.setElement($el);
+ if ($oldel && !$oldel.is(this.$el)) {
+ $oldel.replaceWith(this.$el);
+ }
+ return this;
+ },
+ /**
+ * Re-sets the widget's root element (el/$el/$el).
+ *
+ * Includes:
+ * * re-delegating events
+ * * re-binding sub-elements
+ * * if the widget already had a root element, replacing the pre-existing
+ * element in the DOM
+ *
+ * @param {HTMLElement | jQuery} element new root element for the widget
+ * @return {*} this
+ */
+ setElement: function (element) {
+ // NB: completely useless, as WidgetMixin#init creates a $el
+ // always
+ if (this.$el) {
+ this.undelegateEvents();
+ }
+
+ this.$el = (element instanceof $) ? element : $(element);
+ this.el = this.$el[0];
+
+ this.delegateEvents();
+
+ return this;
+ },
+ /**
+ * Utility function to build small DOM elements.
+ *
+ * @param {String} tagName name of the DOM element to create
+ * @param {Object} [attributes] map of DOM attributes to set on the element
+ * @param {String} [content] HTML content to set on the element
+ * @return {Element}
+ */
+ make: function (tagName, attributes, content) {
+ var el = document.createElement(tagName);
+ if (!_.isEmpty(attributes)) {
+ $(el).attr(attributes);
+ }
+ if (content) {
+ $(el).html(content);
+ }
+ return el;
+ },
+ /**
+ * Makes a potential root element from the declarative builder of the
+ * widget
+ *
+ * @return {jQuery}
+ * @private
+ */
+ _make_descriptive: function () {
+ var attrs = _.extend({}, this.attributes || {});
+ if (this.id) { attrs.id = this.id; }
+ if (this.className) { attrs['class'] = this.className; }
+ return $(this.make(this.tagName, attrs));
+ },
+ delegateEvents: function () {
+ var events = this.events;
+ if (_.isEmpty(events)) { return; }
+
+ for(var key in events) {
+ if (!events.hasOwnProperty(key)) { continue; }
+
+ var method = this.proxy(events[key]);
+
+ var match = /^(\S+)(\s+(.*))?$/.exec(key);
+ var event = match[1];
+ var selector = match[3];
+
+ event += '.widget_events';
+ if (!selector) {
+ this.$el.on(event, method);
+ } else {
+ this.$el.on(event, selector, method);
+ }
+ }
+ },
+ undelegateEvents: function () {
+ this.$el.off('.widget_events');
+ },
+ /**
+ * Shortcut for ``this.$el.find(selector)``
+ *
+ * @param {String} selector CSS selector, rooted in $el
+ * @returns {jQuery} selector match
+ */
+ $: function(selector) {
+ return this.$el.find(selector);
+ }
+});
+
+openerp.web.qweb = new QWeb2.Engine();
+
+return openerp;
};
if (typeof(define) !== "undefined") { // amd
- define(["jquery", "underscore", "qweb"], declare);
+ define(["jquery", "underscore", "qweb2"], declare);
} else {
window.openerp = declare($, _, QWeb2);
}
From 99e07f1e3e99c633702b9e10dabce5334098d47e Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Fri, 26 Jul 2013 14:44:46 +0200
Subject: [PATCH 17/61] Put some qweb globals in the framework
bzr revid: nicolas.vanhoren@openerp.com-20130726124446-6z3xpm1mu22mgep3
---
addons/web/static/src/js/coresetup.js | 6 ++----
addons/web/static/src/js/openerpframework.js | 5 +++++
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/addons/web/static/src/js/coresetup.js b/addons/web/static/src/js/coresetup.js
index 424782d5e24..7ff082edcce 100644
--- a/addons/web/static/src/js/coresetup.js
+++ b/addons/web/static/src/js/coresetup.js
@@ -565,12 +565,10 @@ instance.web._lt = function (s) {
return {toString: function () { return instance.web._t(s); }};
};
instance.web.qweb.debug = instance.session.debug;
-instance.web.qweb.default_dict = {
- '_' : _,
+_.extend(instance.web.qweb.default_dict, {
'_t' : instance.web._t,
- 'JSON': JSON,
'__debug__': instance.session.debug,
-};
+});
instance.web.qweb.preprocess_node = function() {
// Note that 'this' is the Qweb Node
switch (this.node.nodeType) {
diff --git a/addons/web/static/src/js/openerpframework.js b/addons/web/static/src/js/openerpframework.js
index 85c454d595d..7774b23eed4 100644
--- a/addons/web/static/src/js/openerpframework.js
+++ b/addons/web/static/src/js/openerpframework.js
@@ -735,6 +735,11 @@ openerp.web.Widget = openerp.web.Class.extend(openerp.web.PropertiesMixin, {
openerp.web.qweb = new QWeb2.Engine();
+openerp.web.qweb.default_dict = {
+ '_' : _,
+ 'JSON': JSON,
+};
+
return openerp;
};
From c94c4599b2a1e76664db8558bcd973ac6250e18f Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Fri, 26 Jul 2013 14:48:37 +0200
Subject: [PATCH 18/61] Moved proxy()
bzr revid: nicolas.vanhoren@openerp.com-20130726124837-yze64evp7r70uv5y
---
addons/web/static/src/js/corelib.js | 26 ------------------
addons/web/static/src/js/openerpframework.js | 28 +++++++++++++++++++-
2 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js
index 1b93ced09aa..c419685c222 100644
--- a/addons/web/static/src/js/corelib.js
+++ b/addons/web/static/src/js/corelib.js
@@ -26,32 +26,6 @@
openerp.web.corelib = function(instance) {
var ControllerMixin = {
- /**
- * Proxies a method of the object, in order to keep the right ``this`` on
- * method invocations.
- *
- * This method is similar to ``Function.prototype.bind`` or ``_.bind``, and
- * even more so to ``jQuery.proxy`` with a fundamental difference: its
- * resolution of the method being called is lazy, meaning it will use the
- * method as it is when the proxy is called, not when the proxy is created.
- *
- * Other methods will fix the bound method to what it is when creating the
- * binding/proxy, which is fine in most javascript code but problematic in
- * OpenERP Web where developers may want to replace existing callbacks with
- * theirs.
- *
- * The semantics of this precisely replace closing over the method call.
- *
- * @param {String|Function} method function or name of the method to invoke
- * @returns {Function} proxied method
- */
- proxy: function (method) {
- var self = this;
- return function () {
- var fn = (typeof method === 'string') ? self[method] : method;
- return fn.apply(self, arguments);
- };
- },
/**
* Informs the action manager to do an action. This supposes that
* the action manager can be found amongst the ancestors of the current widget.
diff --git a/addons/web/static/src/js/openerpframework.js b/addons/web/static/src/js/openerpframework.js
index 7774b23eed4..c67d9a34f23 100644
--- a/addons/web/static/src/js/openerpframework.js
+++ b/addons/web/static/src/js/openerpframework.js
@@ -730,7 +730,33 @@ openerp.web.Widget = openerp.web.Class.extend(openerp.web.PropertiesMixin, {
*/
$: function(selector) {
return this.$el.find(selector);
- }
+ },
+ /**
+ * Proxies a method of the object, in order to keep the right ``this`` on
+ * method invocations.
+ *
+ * This method is similar to ``Function.prototype.bind`` or ``_.bind``, and
+ * even more so to ``jQuery.proxy`` with a fundamental difference: its
+ * resolution of the method being called is lazy, meaning it will use the
+ * method as it is when the proxy is called, not when the proxy is created.
+ *
+ * Other methods will fix the bound method to what it is when creating the
+ * binding/proxy, which is fine in most javascript code but problematic in
+ * OpenERP Web where developers may want to replace existing callbacks with
+ * theirs.
+ *
+ * The semantics of this precisely replace closing over the method call.
+ *
+ * @param {String|Function} method function or name of the method to invoke
+ * @returns {Function} proxied method
+ */
+ proxy: function (method) {
+ var self = this;
+ return function () {
+ var fn = (typeof method === 'string') ? self[method] : method;
+ return fn.apply(self, arguments);
+ };
+ },
});
openerp.web.qweb = new QWeb2.Engine();
From 5c7b6cffdecbdc632bcb47a3c420a173e797c53c Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Fri, 26 Jul 2013 15:18:05 +0200
Subject: [PATCH 19/61] Fixed some problems about testing framework
bzr revid: nicolas.vanhoren@openerp.com-20130726131805-wstt1de2qqq7w7hx
---
addons/web/static/src/js/testing.js | 36 +++++------------------------
1 file changed, 6 insertions(+), 30 deletions(-)
diff --git a/addons/web/static/src/js/testing.js b/addons/web/static/src/js/testing.js
index ed26238028e..d3a9a538dd9 100644
--- a/addons/web/static/src/js/testing.js
+++ b/addons/web/static/src/js/testing.js
@@ -164,6 +164,8 @@ openerp.testing = {};
});
};
+ var openerp_inited = false;
+
var db = window['oe_db_info'];
testing.section = function (name, options, body) {
if (_.isFunction(options)) {
@@ -240,36 +242,10 @@ openerp.testing = {};
}
QUnit.test(name, function () {
- var instance;
- if (!opts.dependencies) {
- instance = openerp.init(module_deps);
- } else {
- // empty-but-specified dependencies actually allow running
- // without loading any module into the instance
-
- // TODO: clean up this mess
- var d = opts.dependencies.slice();
- // dependencies list should be in deps order, reverse to make
- // loading order from last
- d.reverse();
- var di = 0;
- while (di < d.length) {
- var m = /^web\.(\w+)$/.exec(d[di]);
- if (m) {
- d[di] = m[1];
- }
- d.splice.apply(d, [di+1, 0].concat(
- _(dependencies[d[di]]).reverse()));
- ++di;
- }
-
- instance = openerp.init(null);
- _(d).chain()
- .reverse()
- .uniq()
- .each(function (module) {
- openerp.web[module](instance);
- });
+ var instance = openerp;
+ if (!openerp_inited) {
+ openerp.init(module_deps);
+ openerp_inited = true;
}
if (instance.session) {
instance.session.uid = 42;
From 38bc6817d6c411124c2d7f1ed456f01cad2cfc33 Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Fri, 26 Jul 2013 15:35:50 +0200
Subject: [PATCH 20/61] Fixed problem with parsing functions tests that created
side effects
bzr revid: nicolas.vanhoren@openerp.com-20130726133550-96zyro1znep8ip6x
---
addons/web/static/test/formats.js | 46 +++++++++++++++++++------------
1 file changed, 29 insertions(+), 17 deletions(-)
diff --git a/addons/web/static/test/formats.js b/addons/web/static/test/formats.js
index fe8388c8929..b9ff5e96371 100644
--- a/addons/web/static/test/formats.js
+++ b/addons/web/static/test/formats.js
@@ -116,25 +116,37 @@ openerp.testing.section('web-formats', {
// equal(val.toString("HH:mm:ss"), res.toString("HH:mm:ss"));
// });
test('parse_integer', function (instance) {
- var val = instance.web.parse_value('123,456', {type: 'integer'});
- equal(val, 123456);
- instance.web._t.database.parameters.thousands_sep = '|';
- var val2 = instance.web.parse_value('123|456', {type: 'integer'});
- equal(val2, 123456);
+ var tmp = instance.web._t.database.parameters.thousands_sep;
+ try {
+ var val = instance.web.parse_value('123,456', {type: 'integer'});
+ equal(val, 123456);
+ instance.web._t.database.parameters.thousands_sep = '|';
+ var val2 = instance.web.parse_value('123|456', {type: 'integer'});
+ equal(val2, 123456);
+ } finally {
+ instance.web._t.database.parameters.thousands_sep = tmp;
+ }
});
test("parse_float", function (instance) {
- var str = "134,112.1234";
- var val = instance.web.parse_value(str, {type:"float"});
- equal(val, 134112.1234);
- str = "-134,112.1234";
- val = instance.web.parse_value(str, {type:"float"});
- equal(val, -134112.1234);
- _.extend(instance.web._t.database.parameters, {
- decimal_point: ',',
- thousands_sep: '.'
- });
- var val3 = instance.web.parse_value('123.456,789', {type: 'float'});
- equal(val3, 123456.789);
+ var tmp1 = instance.web._t.database.parameters.thousands_sep;
+ var tmp2 = instance.web._t.database.parameters.decimal_point;
+ try {
+ var str = "134,112.1234";
+ var val = instance.web.parse_value(str, {type:"float"});
+ equal(val, 134112.1234);
+ str = "-134,112.1234";
+ val = instance.web.parse_value(str, {type:"float"});
+ equal(val, -134112.1234);
+ _.extend(instance.web._t.database.parameters, {
+ decimal_point: ',',
+ thousands_sep: '.'
+ });
+ var val3 = instance.web.parse_value('123.456,789', {type: 'float'});
+ equal(val3, 123456.789);
+ } finally {
+ instance.web._t.database.parameters.thousands_sep = tmp1;
+ instance.web._t.database.parameters.decimal_point = tmp2;
+ }
});
test('intersperse', function (instance) {
var g = instance.web.intersperse;
From 0c79e1b07968e982ab012c4834f38a62cbe2321d Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Fri, 26 Jul 2013 16:27:07 +0200
Subject: [PATCH 21/61] Fixed multiple side effects related to the session
bzr revid: nicolas.vanhoren@openerp.com-20130726142707-eyfq5hmubm38slk1
---
addons/web/static/src/js/testing.js | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/addons/web/static/src/js/testing.js b/addons/web/static/src/js/testing.js
index d3a9a538dd9..af434c4c0f4 100644
--- a/addons/web/static/src/js/testing.js
+++ b/addons/web/static/src/js/testing.js
@@ -247,9 +247,8 @@ openerp.testing = {};
openerp.init(module_deps);
openerp_inited = true;
}
- if (instance.session) {
- instance.session.uid = 42;
- }
+ instance.session = new instance.web.Session();
+ instance.session.uid = 42;
if (_.isNumber(opts.asserts)) {
expect(opts.asserts);
}
From a02da32a083b356099f183b0852e98d84876d621 Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Fri, 26 Jul 2013 16:36:47 +0200
Subject: [PATCH 22/61] Changed some testing code creating side effects and
making other tests crash
bzr revid: nicolas.vanhoren@openerp.com-20130726143647-rz01o0cnwm2a1gyo
---
addons/web/static/test/search.js | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js
index 268fe4d1c0c..3941c3ccdfe 100644
--- a/addons/web/static/test/search.js
+++ b/addons/web/static/test/search.js
@@ -1387,10 +1387,8 @@ openerp.testing.section('search.invisible', {
templates: true,
}, function (test) {
var registerTestField = function (instance, methods) {
+ instance.testing.TestWidget = instance.web.search.Field.extend(methods);
instance.web.search.fields.add('test', 'instance.testing.TestWidget');
- instance.testing = {
- TestWidget: instance.web.search.Field.extend(methods),
- };
};
var makeView = function (instance, mock, fields, arch, defaults) {
mock('ir.filters:get_filters', function () { return []; });
From 861186d136460a174e7b4e6182b939cdf3d560de Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Fri, 26 Jul 2013 17:44:54 +0200
Subject: [PATCH 23/61] Fixed potential problem in web_test_demo
bzr revid: nicolas.vanhoren@openerp.com-20130726154454-9hu2gpxcz4ynhmkj
---
addons/web_tests_demo/static/src/js/demo.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/addons/web_tests_demo/static/src/js/demo.js b/addons/web_tests_demo/static/src/js/demo.js
index b35b44b80f8..506808027cc 100644
--- a/addons/web_tests_demo/static/src/js/demo.js
+++ b/addons/web_tests_demo/static/src/js/demo.js
@@ -1,11 +1,11 @@
// static/src/js/demo.js
openerp.web_tests_demo = function (instance) {
- instance.web_tests_demo = {
+ _.extend(instance.web_tests_demo, {
value_true: true,
SomeType: instance.web.Class.extend({
init: function (value) {
this.value = value;
}
})
- };
+ });
};
From 89a9ab8cd055befb2e379b9f9366e5a8cdc8b385 Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Fri, 26 Jul 2013 18:03:15 +0200
Subject: [PATCH 24/61] Now uses only openerpframework in widget's tests
bzr revid: nicolas.vanhoren@openerp.com-20130726160315-l60r6z706urv2hga
---
addons/web/static/src/js/openerpframework.js | 2 +
addons/web/static/test/Widget.js | 98 ++++++++++----------
2 files changed, 53 insertions(+), 47 deletions(-)
diff --git a/addons/web/static/src/js/openerpframework.js b/addons/web/static/src/js/openerpframework.js
index c67d9a34f23..11bc6497e8a 100644
--- a/addons/web/static/src/js/openerpframework.js
+++ b/addons/web/static/src/js/openerpframework.js
@@ -766,6 +766,8 @@ openerp.web.qweb.default_dict = {
'JSON': JSON,
};
+openerp.declare = declare;
+
return openerp;
};
diff --git a/addons/web/static/test/Widget.js b/addons/web/static/test/Widget.js
index 858044f8cb0..ce48fd529b2 100644
--- a/addons/web/static/test/Widget.js
+++ b/addons/web/static/test/Widget.js
@@ -1,8 +1,13 @@
-openerp.testing.section('Widget.proxy', {
- dependencies: ['web.corelib']
+(function() {
+
+var ropenerp = window.openerp;
+
+var openerp = ropenerp.declare($, _, QWeb2);
+
+ropenerp.testing.section('Widget.proxy', {
}, function (test) {
- test('(String)', function (instance) {
- var W = instance.web.Widget.extend({
+ test('(String)', function () {
+ var W = openerp.web.Widget.extend({
exec: function () {
this.executed = true;
}
@@ -12,8 +17,8 @@ openerp.testing.section('Widget.proxy', {
fn();
ok(w.executed, 'should execute the named method in the right context');
});
- test('(String)(*args)', function (instance) {
- var W = instance.web.Widget.extend({
+ test('(String)(*args)', function () {
+ var W = openerp.web.Widget.extend({
exec: function (arg) {
this.executed = arg;
}
@@ -24,10 +29,10 @@ openerp.testing.section('Widget.proxy', {
ok(w.executed, "should execute the named method in the right context");
equal(w.executed, 42, "should be passed the proxy's arguments");
});
- test('(String), include', function (instance) {
+ test('(String), include', function () {
// the proxy function should handle methods being changed on the class
// and should always proxy "by name", to the most recent one
- var W = instance.web.Widget.extend({
+ var W = openerp.web.Widget.extend({
exec: function () {
this.executed = 1;
}
@@ -42,26 +47,25 @@ openerp.testing.section('Widget.proxy', {
equal(w.executed, 2, "should be lazily resolved");
});
- test('(Function)', function (instance) {
- var w = new (instance.web.Widget.extend({ }))();
+ test('(Function)', function () {
+ var w = new (openerp.web.Widget.extend({ }))();
var fn = w.proxy(function () { this.executed = true; });
fn();
ok(w.executed, "should set the function's context (like Function#bind)");
});
- test('(Function)(*args)', function (instance) {
- var w = new (instance.web.Widget.extend({ }))();
+ test('(Function)(*args)', function () {
+ var w = new (openerp.web.Widget.extend({ }))();
var fn = w.proxy(function (arg) { this.executed = arg; });
fn(42);
equal(w.executed, 42, "should be passed the proxy's arguments");
});
});
-openerp.testing.section('Widget.renderElement', {
- dependencies: ['web.corelib'],
- setup: function (instance) {
- instance.web.qweb = new QWeb2.Engine();
- instance.web.qweb.add_template(
+ropenerp.testing.section('Widget.renderElement', {
+ setup: function () {
+ openerp.web.qweb = new QWeb2.Engine();
+ openerp.web.qweb.add_template(
'' +
'' +
'' +
@@ -78,8 +82,8 @@ openerp.testing.section('Widget.renderElement', {
'
');
}
}, function (test) {
- test('no template, default', function (instance) {
- var w = new (instance.web.Widget.extend({ }))();
+ test('no template, default', function () {
+ var w = new (openerp.web.Widget.extend({ }))();
var $original = w.$el;
ok($original, "should initially have a root element");
@@ -93,16 +97,16 @@ openerp.testing.section('Widget.renderElement', {
equal(w.el.attributes.length, 0, "should not have generated any attribute");
ok(_.isEmpty(w.$el.html(), "should not have generated any content"));
});
- test('no template, custom tag', function (instance) {
- var w = new (instance.web.Widget.extend({
+ test('no template, custom tag', function () {
+ var w = new (openerp.web.Widget.extend({
tagName: 'ul'
}))();
w.renderElement();
equal(w.el.nodeName, 'UL', "should have generated the custom element tag");
});
- test('no template, @id', function (instance) {
- var w = new (instance.web.Widget.extend({
+ test('no template, @id', function () {
+ var w = new (openerp.web.Widget.extend({
id: 'foo'
}))();
w.renderElement();
@@ -111,8 +115,8 @@ openerp.testing.section('Widget.renderElement', {
equal(w.$el.attr('id'), 'foo', "should have generated the id attribute");
equal(w.el.id, 'foo', "should also be available via property");
});
- test('no template, @className', function (instance) {
- var w = new (instance.web.Widget.extend({
+ test('no template, @className', function () {
+ var w = new (openerp.web.Widget.extend({
className: 'oe_some_class'
}))();
w.renderElement();
@@ -120,8 +124,8 @@ openerp.testing.section('Widget.renderElement', {
equal(w.el.className, 'oe_some_class', "should have the right property");
equal(w.$el.attr('class'), 'oe_some_class', "should have the right attribute");
});
- test('no template, bunch of attributes', function (instance) {
- var w = new (instance.web.Widget.extend({
+ test('no template, bunch of attributes', function () {
+ var w = new (openerp.web.Widget.extend({
attributes: {
'id': 'some_id',
'class': 'some_class',
@@ -147,8 +151,8 @@ openerp.testing.section('Widget.renderElement', {
equal(w.$el.attr('spoiler'), 'snape kills dumbledore');
});
- test('template', function (instance) {
- var w = new (instance.web.Widget.extend({
+ test('template', function () {
+ var w = new (openerp.web.Widget.extend({
template: 'test.widget.template'
}))();
w.renderElement();
@@ -157,8 +161,8 @@ openerp.testing.section('Widget.renderElement', {
equal(w.$el.children().length, 5);
equal(w.el.textContent, '01234');
});
- test('repeated', { asserts: 4 }, function (instance, $fix) {
- var w = new (instance.web.Widget.extend({
+ test('repeated', { asserts: 4 }, function (_unused, $fix) {
+ var w = new (openerp.web.Widget.extend({
template: 'test.widget.template-value'
}))();
w.value = 42;
@@ -173,11 +177,10 @@ openerp.testing.section('Widget.renderElement', {
});
});
});
-openerp.testing.section('Widget.$', {
- dependencies: ['web.corelib'],
- setup: function (instance) {
- instance.web.qweb = new QWeb2.Engine();
- instance.web.qweb.add_template(
+ropenerp.testing.section('Widget.$', {
+ setup: function () {
+ openerp.web.qweb = new QWeb2.Engine();
+ openerp.web.qweb.add_template(
'' +
'' +
'' +
@@ -191,8 +194,8 @@ openerp.testing.section('Widget.$', {
'
');
}
}, function (test) {
- test('basic-alias', function (instance) {
- var w = new (instance.web.Widget.extend({
+ test('basic-alias', function () {
+ var w = new (openerp.web.Widget.extend({
template: 'test.widget.template'
}))();
w.renderElement();
@@ -201,11 +204,10 @@ openerp.testing.section('Widget.$', {
"should do the same thing as calling find on the widget root");
});
});
-openerp.testing.section('Widget.events', {
- dependencies: ['web.corelib'],
- setup: function (instance) {
- instance.web.qweb = new QWeb2.Engine();
- instance.web.qweb.add_template(
+ropenerp.testing.section('Widget.events', {
+ setup: function () {
+ openerp.web.qweb = new QWeb2.Engine();
+ openerp.web.qweb.add_template(
'' +
'' +
'' +
@@ -219,9 +221,9 @@ openerp.testing.section('Widget.events', {
'
');
}
}, function (test) {
- test('delegate', function (instance) {
+ test('delegate', function () {
var a = [];
- var w = new (instance.web.Widget.extend({
+ var w = new (openerp.web.Widget.extend({
template: 'test.widget.template',
events: {
'click': function () {
@@ -243,9 +245,9 @@ openerp.testing.section('Widget.events', {
ok(a[i], "should pass test " + i);
}
});
- test('undelegate', function (instance) {
+ test('undelegate', function () {
var clicked = false, newclicked = false;
- var w = new (instance.web.Widget.extend({
+ var w = new (openerp.web.Widget.extend({
template: 'test.widget.template',
events: { 'click li': function () { clicked = true; } }
}))();
@@ -263,3 +265,5 @@ openerp.testing.section('Widget.events', {
ok(newclicked, "undelegate should only unbind events it created");
});
});
+
+})();
From e01b96e76290ba6e0689bc143deeb79bcef9701e Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Fri, 26 Jul 2013 18:07:15 +0200
Subject: [PATCH 25/61] Put class and widgets tests in framework.js
bzr revid: nicolas.vanhoren@openerp.com-20130726160715-adjyalkubyismvao
---
addons/web/__openerp__.py | 3 +-
addons/web/static/test/class.js | 133 -----------------
.../static/test/{Widget.js => framework.js} | 135 ++++++++++++++++++
3 files changed, 136 insertions(+), 135 deletions(-)
delete mode 100644 addons/web/static/test/class.js
rename addons/web/static/test/{Widget.js => framework.js} (70%)
diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py
index 7a00b4c5a47..08c6d0c6148 100644
--- a/addons/web/__openerp__.py
+++ b/addons/web/__openerp__.py
@@ -75,7 +75,7 @@ This module provides the core of the OpenERP Web Client.
],
'test': [
"static/test/testing.js",
- "static/test/class.js",
+ "static/test/framework.js",
"static/test/registry.js",
"static/test/form.js",
"static/test/data.js",
@@ -84,7 +84,6 @@ This module provides the core of the OpenERP Web Client.
"static/test/rpc.js",
"static/test/evals.js",
"static/test/search.js",
- "static/test/Widget.js",
"static/test/list.js",
"static/test/list-editable.js",
"static/test/mutex.js"
diff --git a/addons/web/static/test/class.js b/addons/web/static/test/class.js
deleted file mode 100644
index bb3fb7e12b9..00000000000
--- a/addons/web/static/test/class.js
+++ /dev/null
@@ -1,133 +0,0 @@
-openerp.testing.section('class', {
- dependencies: ['web.corelib']
-}, function (test) {
- test('Basic class creation', function (instance) {
- var C = instance.web.Class.extend({
- foo: function () {
- return this.somevar;
- }
- });
- var i = new C();
- i.somevar = 3;
-
- ok(i instanceof C);
- strictEqual(i.foo(), 3);
- });
- test('Class initialization', function (instance) {
- var C1 = instance.web.Class.extend({
- init: function () {
- this.foo = 3;
- }
- });
- var C2 = instance.web.Class.extend({
- init: function (arg) {
- this.foo = arg;
- }
- });
-
- var i1 = new C1(),
- i2 = new C2(42);
-
- strictEqual(i1.foo, 3);
- strictEqual(i2.foo, 42);
- });
- test('Inheritance', function (instance) {
- var C0 = instance.web.Class.extend({
- foo: function () {
- return 1;
- }
- });
- var C1 = C0.extend({
- foo: function () {
- return 1 + this._super();
- }
- });
- var C2 = C1.extend({
- foo: function () {
- return 1 + this._super();
- }
- });
-
- strictEqual(new C0().foo(), 1);
- strictEqual(new C1().foo(), 2);
- strictEqual(new C2().foo(), 3);
- });
- test('In-place extension', function (instance) {
- var C0 = instance.web.Class.extend({
- foo: function () {
- return 3;
- },
- qux: function () {
- return 3;
- },
- bar: 3
- });
- C0.include({
- foo: function () {
- return 5;
- },
- qux: function () {
- return 2 + this._super();
- },
- bar: 5,
- baz: 5
- });
-
- strictEqual(new C0().bar, 5);
- strictEqual(new C0().baz, 5);
- strictEqual(new C0().foo(), 5);
- strictEqual(new C0().qux(), 5);
- });
- test('In-place extension and inheritance', function (instance) {
- var C0 = instance.web.Class.extend({
- foo: function () { return 1; },
- bar: function () { return 1; }
- });
- var C1 = C0.extend({
- foo: function () { return 1 + this._super(); }
- });
- strictEqual(new C1().foo(), 2);
- strictEqual(new C1().bar(), 1);
-
- C1.include({
- foo: function () { return 2 + this._super(); },
- bar: function () { return 1 + this._super(); }
- });
- strictEqual(new C1().foo(), 4);
- strictEqual(new C1().bar(), 2);
- });
- test('In-place extensions alter existing instances', function (instance) {
- var C0 = instance.web.Class.extend({
- foo: function () { return 1; },
- bar: function () { return 1; }
- });
- var i = new C0();
- strictEqual(i.foo(), 1);
- strictEqual(i.bar(), 1);
-
- C0.include({
- foo: function () { return 2; },
- bar: function () { return 2 + this._super(); }
- });
- strictEqual(i.foo(), 2);
- strictEqual(i.bar(), 3);
- });
- test('In-place extension of subclassed types', function (instance) {
- var C0 = instance.web.Class.extend({
- foo: function () { return 1; },
- bar: function () { return 1; }
- });
- var C1 = C0.extend({
- foo: function () { return 1 + this._super(); },
- bar: function () { return 1 + this._super(); }
- });
- var i = new C1();
- strictEqual(i.foo(), 2);
- C0.include({
- foo: function () { return 2; },
- bar: function () { return 2 + this._super(); }
- });
- strictEqual(i.foo(), 3);
- strictEqual(i.bar(), 4);
- });
-});
diff --git a/addons/web/static/test/Widget.js b/addons/web/static/test/framework.js
similarity index 70%
rename from addons/web/static/test/Widget.js
rename to addons/web/static/test/framework.js
index ce48fd529b2..5848c5cde7f 100644
--- a/addons/web/static/test/Widget.js
+++ b/addons/web/static/test/framework.js
@@ -4,6 +4,141 @@ var ropenerp = window.openerp;
var openerp = ropenerp.declare($, _, QWeb2);
+ropenerp.testing.section('class', {
+ dependencies: ['web.corelib']
+}, function (test) {
+ test('Basic class creation', function (instance) {
+ var C = instance.web.Class.extend({
+ foo: function () {
+ return this.somevar;
+ }
+ });
+ var i = new C();
+ i.somevar = 3;
+
+ ok(i instanceof C);
+ strictEqual(i.foo(), 3);
+ });
+ test('Class initialization', function (instance) {
+ var C1 = instance.web.Class.extend({
+ init: function () {
+ this.foo = 3;
+ }
+ });
+ var C2 = instance.web.Class.extend({
+ init: function (arg) {
+ this.foo = arg;
+ }
+ });
+
+ var i1 = new C1(),
+ i2 = new C2(42);
+
+ strictEqual(i1.foo, 3);
+ strictEqual(i2.foo, 42);
+ });
+ test('Inheritance', function (instance) {
+ var C0 = instance.web.Class.extend({
+ foo: function () {
+ return 1;
+ }
+ });
+ var C1 = C0.extend({
+ foo: function () {
+ return 1 + this._super();
+ }
+ });
+ var C2 = C1.extend({
+ foo: function () {
+ return 1 + this._super();
+ }
+ });
+
+ strictEqual(new C0().foo(), 1);
+ strictEqual(new C1().foo(), 2);
+ strictEqual(new C2().foo(), 3);
+ });
+ test('In-place extension', function (instance) {
+ var C0 = instance.web.Class.extend({
+ foo: function () {
+ return 3;
+ },
+ qux: function () {
+ return 3;
+ },
+ bar: 3
+ });
+ C0.include({
+ foo: function () {
+ return 5;
+ },
+ qux: function () {
+ return 2 + this._super();
+ },
+ bar: 5,
+ baz: 5
+ });
+
+ strictEqual(new C0().bar, 5);
+ strictEqual(new C0().baz, 5);
+ strictEqual(new C0().foo(), 5);
+ strictEqual(new C0().qux(), 5);
+ });
+ test('In-place extension and inheritance', function (instance) {
+ var C0 = instance.web.Class.extend({
+ foo: function () { return 1; },
+ bar: function () { return 1; }
+ });
+ var C1 = C0.extend({
+ foo: function () { return 1 + this._super(); }
+ });
+ strictEqual(new C1().foo(), 2);
+ strictEqual(new C1().bar(), 1);
+
+ C1.include({
+ foo: function () { return 2 + this._super(); },
+ bar: function () { return 1 + this._super(); }
+ });
+ strictEqual(new C1().foo(), 4);
+ strictEqual(new C1().bar(), 2);
+ });
+ test('In-place extensions alter existing instances', function (instance) {
+ var C0 = instance.web.Class.extend({
+ foo: function () { return 1; },
+ bar: function () { return 1; }
+ });
+ var i = new C0();
+ strictEqual(i.foo(), 1);
+ strictEqual(i.bar(), 1);
+
+ C0.include({
+ foo: function () { return 2; },
+ bar: function () { return 2 + this._super(); }
+ });
+ strictEqual(i.foo(), 2);
+ strictEqual(i.bar(), 3);
+ });
+ test('In-place extension of subclassed types', function (instance) {
+ var C0 = instance.web.Class.extend({
+ foo: function () { return 1; },
+ bar: function () { return 1; }
+ });
+ var C1 = C0.extend({
+ foo: function () { return 1 + this._super(); },
+ bar: function () { return 1 + this._super(); }
+ });
+ var i = new C1();
+ strictEqual(i.foo(), 2);
+ C0.include({
+ foo: function () { return 2; },
+ bar: function () { return 2 + this._super(); }
+ });
+ strictEqual(i.foo(), 3);
+ strictEqual(i.bar(), 4);
+ });
+});
+
+
ropenerp.testing.section('Widget.proxy', {
}, function (test) {
test('(String)', function () {
From 95599aefd445f2a19c28d2d12bed8807ca896872 Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Fri, 26 Jul 2013 18:08:45 +0200
Subject: [PATCH 26/61] Corrected class tests
bzr revid: nicolas.vanhoren@openerp.com-20130726160845-z2ug9cwp41y1h9yj
---
addons/web/static/test/framework.js | 30 ++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/addons/web/static/test/framework.js b/addons/web/static/test/framework.js
index 5848c5cde7f..8fb066bbce9 100644
--- a/addons/web/static/test/framework.js
+++ b/addons/web/static/test/framework.js
@@ -7,8 +7,8 @@ var openerp = ropenerp.declare($, _, QWeb2);
ropenerp.testing.section('class', {
dependencies: ['web.corelib']
}, function (test) {
- test('Basic class creation', function (instance) {
- var C = instance.web.Class.extend({
+ test('Basic class creation', function () {
+ var C = openerp.web.Class.extend({
foo: function () {
return this.somevar;
}
@@ -19,13 +19,13 @@ ropenerp.testing.section('class', {
ok(i instanceof C);
strictEqual(i.foo(), 3);
});
- test('Class initialization', function (instance) {
- var C1 = instance.web.Class.extend({
+ test('Class initialization', function () {
+ var C1 = openerp.web.Class.extend({
init: function () {
this.foo = 3;
}
});
- var C2 = instance.web.Class.extend({
+ var C2 = openerp.web.Class.extend({
init: function (arg) {
this.foo = arg;
}
@@ -37,8 +37,8 @@ ropenerp.testing.section('class', {
strictEqual(i1.foo, 3);
strictEqual(i2.foo, 42);
});
- test('Inheritance', function (instance) {
- var C0 = instance.web.Class.extend({
+ test('Inheritance', function () {
+ var C0 = openerp.web.Class.extend({
foo: function () {
return 1;
}
@@ -58,8 +58,8 @@ ropenerp.testing.section('class', {
strictEqual(new C1().foo(), 2);
strictEqual(new C2().foo(), 3);
});
- test('In-place extension', function (instance) {
- var C0 = instance.web.Class.extend({
+ test('In-place extension', function () {
+ var C0 = openerp.web.Class.extend({
foo: function () {
return 3;
},
@@ -84,8 +84,8 @@ ropenerp.testing.section('class', {
strictEqual(new C0().foo(), 5);
strictEqual(new C0().qux(), 5);
});
- test('In-place extension and inheritance', function (instance) {
- var C0 = instance.web.Class.extend({
+ test('In-place extension and inheritance', function () {
+ var C0 = openerp.web.Class.extend({
foo: function () { return 1; },
bar: function () { return 1; }
});
@@ -102,8 +102,8 @@ ropenerp.testing.section('class', {
strictEqual(new C1().foo(), 4);
strictEqual(new C1().bar(), 2);
});
- test('In-place extensions alter existing instances', function (instance) {
- var C0 = instance.web.Class.extend({
+ test('In-place extensions alter existing instances', function () {
+ var C0 = openerp.web.Class.extend({
foo: function () { return 1; },
bar: function () { return 1; }
});
@@ -118,8 +118,8 @@ ropenerp.testing.section('class', {
strictEqual(i.foo(), 2);
strictEqual(i.bar(), 3);
});
- test('In-place extension of subclassed types', function (instance) {
- var C0 = instance.web.Class.extend({
+ test('In-place extension of subclassed types', function () {
+ var C0 = openerp.web.Class.extend({
foo: function () { return 1; },
bar: function () { return 1; }
});
From 4157b860bc11aa4a882539761863fd67cb7929ee Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Fri, 26 Jul 2013 18:11:43 +0200
Subject: [PATCH 27/61] Desactivated some sample tests
bzr revid: nicolas.vanhoren@openerp.com-20130726161143-z77m3ez5vm9kcehn
---
addons/web_tests_demo/static/test/demo.js | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/addons/web_tests_demo/static/test/demo.js b/addons/web_tests_demo/static/test/demo.js
index 02e3b404d90..0ca10ba642c 100644
--- a/addons/web_tests_demo/static/test/demo.js
+++ b/addons/web_tests_demo/static/test/demo.js
@@ -1,4 +1,7 @@
-openerp.testing.section('basic section', function (test) {
+
+// niv: I desactivate these until the testing framework has been adapted to better use
+// the new way to declare JavaScript modules
+/*openerp.testing.section('basic section', function (test) {
test('my first test', function () {
ok(true, "this test has run");
});
@@ -99,4 +102,4 @@ openerp.testing.section('basic section', function (test) {
// strictEqual(record.other, 'bob');
// });
// });
-});
+});*/
From 22ac3304e1e29699db3b9068d1a417a269ec944a Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Mon, 29 Jul 2013 11:25:12 +0200
Subject: [PATCH 28/61] Added strict mode and es3 mode to framework and
corrected some problems
bzr revid: nicolas.vanhoren@openerp.com-20130729092512-1ip4abjrypf74qr2
---
addons/web/package.json | 6 +++---
addons/web/static/src/js/boot.js | 4 ++--
addons/web/static/src/js/coresetup.js | 2 +-
addons/web/static/src/js/openerpframework.js | 13 ++++++++-----
4 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/addons/web/package.json b/addons/web/package.json
index f8dfc2879d6..3ce6500a077 100644
--- a/addons/web/package.json
+++ b/addons/web/package.json
@@ -1,6 +1,6 @@
{
"devDependencies": {
- "grunt": "~0.4.1",
- "grunt-contrib-jshint": "~0.6.0"
+ "grunt": "*",
+ "grunt-contrib-jshint": "*"
}
-}
\ No newline at end of file
+}
diff --git a/addons/web/static/src/js/boot.js b/addons/web/static/src/js/boot.js
index c255db36ff8..87115fd30ea 100644
--- a/addons/web/static/src/js/boot.js
+++ b/addons/web/static/src/js/boot.js
@@ -40,7 +40,7 @@
var fct = openerp[modules[i]];
if (typeof(fct) === "function") {
openerp[modules[i]] = {};
- for (k in fct) {
+ for (var k in fct) {
openerp[modules[i]][k] = fct[k];
}
fct(openerp, openerp[modules[i]]);
@@ -60,7 +60,7 @@
var fct = openerp.web[files[i]];
if(typeof(fct) === "function") {
openerp.web[files[i]] = {};
- for (k in fct) {
+ for (var k in fct) {
openerp.web[files[i]][k] = fct[k];
}
fct(openerp, openerp.web[files[i]]);
diff --git a/addons/web/static/src/js/coresetup.js b/addons/web/static/src/js/coresetup.js
index 7ff082edcce..c8deca1c9ac 100644
--- a/addons/web/static/src/js/coresetup.js
+++ b/addons/web/static/src/js/coresetup.js
@@ -253,7 +253,7 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
var fct = instance._openerp[mod];
if(typeof(fct) === "function") {
instance._openerp[mod] = {};
- for (k in fct) {
+ for (var k in fct) {
instance._openerp[mod][k] = fct[k];
}
fct(instance, instance._openerp[mod]);
diff --git a/addons/web/static/src/js/openerpframework.js b/addons/web/static/src/js/openerpframework.js
index 11bc6497e8a..470baf89b2d 100644
--- a/addons/web/static/src/js/openerpframework.js
+++ b/addons/web/static/src/js/openerpframework.js
@@ -1,5 +1,7 @@
(function() {
+/* jshint es3: true */
+"use strict";
function declare($, _, QWeb2) {
var openerp = {};
@@ -72,7 +74,8 @@ openerp.web = {};
// Instantiate a web class (but only create the instance,
// don't run the init constructor)
initializing = true;
- var prototype = new this();
+ var This = this;
+ var prototype = new This();
initializing = false;
// Copy the properties over onto the new prototype
@@ -148,7 +151,7 @@ openerp.web = {};
Class.constructor = Class;
// And make this class extendable
- Class.extend = arguments.callee;
+ Class.extend = this.extend;
return Class;
};
@@ -756,20 +759,20 @@ openerp.web.Widget = openerp.web.Class.extend(openerp.web.PropertiesMixin, {
var fn = (typeof method === 'string') ? self[method] : method;
return fn.apply(self, arguments);
};
- },
+ }
});
openerp.web.qweb = new QWeb2.Engine();
openerp.web.qweb.default_dict = {
'_' : _,
- 'JSON': JSON,
+ 'JSON': JSON
};
openerp.declare = declare;
return openerp;
-};
+}
if (typeof(define) !== "undefined") { // amd
define(["jquery", "underscore", "qweb2"], declare);
From 80df99fa184f2a8878f7842a3f4be80cea90e8a7 Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Mon, 29 Jul 2013 11:36:57 +0200
Subject: [PATCH 29/61] cosmetic
bzr revid: nicolas.vanhoren@openerp.com-20130729093657-p0xdm0nyhg4jn3i7
---
addons/web/static/src/js/openerpframework.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/web/static/src/js/openerpframework.js b/addons/web/static/src/js/openerpframework.js
index 470baf89b2d..374493b1f7e 100644
--- a/addons/web/static/src/js/openerpframework.js
+++ b/addons/web/static/src/js/openerpframework.js
@@ -7,7 +7,7 @@ function declare($, _, QWeb2) {
var openerp = {};
openerp.web = {};
- /**
+/**
* Improved John Resig's inheritance, based on:
*
* Simple JavaScript Inheritance
From f1b47a3e0e0ae93d7c6450214e639aa0fd8cf527 Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Mon, 29 Jul 2013 17:05:53 +0200
Subject: [PATCH 30/61] Added grunt-tests command
bzr revid: nicolas.vanhoren@openerp.com-20130729150553-ps7w9g6fuqx4qxes
---
openerpcommand/__init__.py | 3 ++-
openerpcommand/grunt_tests.py | 50 +++++++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+), 1 deletion(-)
create mode 100644 openerpcommand/grunt_tests.py
diff --git a/openerpcommand/__init__.py b/openerpcommand/__init__.py
index 6d41c2842dc..9d5e81f0327 100644
--- a/openerpcommand/__init__.py
+++ b/openerpcommand/__init__.py
@@ -19,9 +19,10 @@ from . import scaffold
from . import uninstall
from . import update
from . import web
+from . import grunt_tests
command_list_server = (conf, cron, drop, initialize, model, module, read, run_tests,
- scaffold, uninstall, update, web, )
+ scaffold, uninstall, update, web, grunt_tests, )
command_list_client = (Call, Open, Show, ConsumeNothing, ConsumeMemory,
LeakMemory, ConsumeCPU, Bench, BenchRead,
diff --git a/openerpcommand/grunt_tests.py b/openerpcommand/grunt_tests.py
new file mode 100644
index 00000000000..db2513f2bc0
--- /dev/null
+++ b/openerpcommand/grunt_tests.py
@@ -0,0 +1,50 @@
+"""
+Search for Gruntfile.js files in all the addons and launch them using the 'grunt test' command.
+"""
+
+import common
+import fnmatch
+import os
+import re
+import sys
+import subprocess
+
+def grunt_tester(directories, log = sys.stdout):
+ result = 0
+
+ matches = []
+ for direc in directories:
+ for root, dirnames, filenames in os.walk(direc):
+ for filename in fnmatch.filter(filenames, 'Gruntfile.js'):
+ full = os.path.join(root, filename)
+ if re.match(r"(^.*?/node_modules/.*$)|(^.*?/lib/.*$)", full):
+ continue
+ matches.append(full)
+
+ for file_ in matches:
+ folder = os.path.dirname(file_)
+ p = subprocess.Popen(['npm', 'install'], cwd=folder)
+ if p.wait() != 0:
+ raise Exception("Failed to install dependencies for Gruntfile located in folder %s" % folder)
+
+ p = subprocess.Popen(['grunt', 'test', '--no-color'], cwd=folder, stdout=log, stderr=log)
+ if p.wait() != 0:
+ result = 1
+
+ return result
+
+def run(args):
+ if args.addons:
+ args.addons = args.addons.split(':')
+ else:
+ args.addons = []
+ result = grunt_tester(args.addons)
+ if result != 0:
+ sys.exit(result)
+
+def add_parser(subparsers):
+ parser = subparsers.add_parser('grunt-tests',
+ description='Run the tests contained in Gruntfile.js files.')
+ common.add_addons_argument(parser)
+
+ parser.set_defaults(run=run)
From cf4c185f8c9694b7298c88c04582be026135d0cd Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Mon, 29 Jul 2013 18:49:52 +0200
Subject: [PATCH 31/61] Removed jshint in the "test" task of grunt
bzr revid: nicolas.vanhoren@openerp.com-20130729164952-srjsdg8pmq1x2ahd
---
addons/web/Gruntfile.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/web/Gruntfile.js b/addons/web/Gruntfile.js
index cbc650492b6..81c41c86001 100644
--- a/addons/web/Gruntfile.js
+++ b/addons/web/Gruntfile.js
@@ -13,7 +13,7 @@ module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-contrib-jshint');
- grunt.registerTask('test', ['jshint']);
+ grunt.registerTask('test', []);
grunt.registerTask('default', ['jshint']);
From 6f70aa399147bfa5c32e722e06d907fd15fe076f Mon Sep 17 00:00:00 2001
From: Launchpad Translations on behalf of openerp <>
Date: Tue, 30 Jul 2013 04:44:24 +0000
Subject: [PATCH 32/61] Launchpad automatic translations update.
bzr revid: launchpad_translations_on_behalf_of_openerp-20130727050954-96mxb3jjb92i8ebt
bzr revid: launchpad_translations_on_behalf_of_openerp-20130730044424-p2gnfpj9j7r2rgx2
---
addons/web/i18n/ar.po | 4 +-
addons/web/i18n/bg.po | 4 +-
addons/web/i18n/bn.po | 4 +-
addons/web/i18n/bs.po | 4 +-
addons/web/i18n/ca.po | 4 +-
addons/web/i18n/cs.po | 4 +-
addons/web/i18n/da.po | 4 +-
addons/web/i18n/de.po | 4 +-
addons/web/i18n/en_AU.po | 4 +-
addons/web/i18n/en_GB.po | 4 +-
addons/web/i18n/es.po | 4 +-
addons/web/i18n/es_CL.po | 4 +-
addons/web/i18n/es_CR.po | 4 +-
addons/web/i18n/es_DO.po | 4 +-
addons/web/i18n/es_EC.po | 4 +-
addons/web/i18n/es_MX.po | 4 +-
addons/web/i18n/et.po | 4 +-
addons/web/i18n/eu.po | 4 +-
addons/web/i18n/fa.po | 4 +-
addons/web/i18n/fi.po | 4 +-
addons/web/i18n/fr.po | 4 +-
addons/web/i18n/fr_CA.po | 4 +-
addons/web/i18n/gl.po | 4 +-
addons/web/i18n/gu.po | 4 +-
addons/web/i18n/hi.po | 4 +-
addons/web/i18n/hr.po | 4 +-
addons/web/i18n/hu.po | 4 +-
addons/web/i18n/id.po | 4 +-
addons/web/i18n/it.po | 4 +-
addons/web/i18n/ja.po | 4 +-
addons/web/i18n/ka.po | 4 +-
addons/web/i18n/ko.po | 4 +-
addons/web/i18n/lo.po | 4 +-
addons/web/i18n/lt.po | 4 +-
addons/web/i18n/lv.po | 4 +-
addons/web/i18n/mk.po | 4 +-
addons/web/i18n/mn.po | 4 +-
addons/web/i18n/nb.po | 4 +-
addons/web/i18n/nl.po | 4 +-
addons/web/i18n/nl_BE.po | 4 +-
addons/web/i18n/pl.po | 4 +-
addons/web/i18n/pt.po | 4 +-
addons/web/i18n/pt_BR.po | 4 +-
addons/web/i18n/ro.po | 4 +-
addons/web/i18n/ru.po | 4 +-
addons/web/i18n/sk.po | 4 +-
addons/web/i18n/sl.po | 4 +-
addons/web/i18n/sq.po | 4 +-
addons/web/i18n/sr@latin.po | 4 +-
addons/web/i18n/sv.po | 4 +-
addons/web/i18n/th.po | 4 +-
addons/web/i18n/tr.po | 4 +-
addons/web/i18n/uk.po | 4 +-
addons/web/i18n/vi.po | 2601 ++++++++++++++++++++++++++
addons/web/i18n/zh_CN.po | 4 +-
addons/web/i18n/zh_TW.po | 4 +-
addons/web_calendar/i18n/ar.po | 4 +-
addons/web_calendar/i18n/bg.po | 4 +-
addons/web_calendar/i18n/bn.po | 4 +-
addons/web_calendar/i18n/bs.po | 4 +-
addons/web_calendar/i18n/ca.po | 4 +-
addons/web_calendar/i18n/cs.po | 4 +-
addons/web_calendar/i18n/da.po | 4 +-
addons/web_calendar/i18n/de.po | 4 +-
addons/web_calendar/i18n/en_AU.po | 4 +-
addons/web_calendar/i18n/en_GB.po | 4 +-
addons/web_calendar/i18n/es.po | 4 +-
addons/web_calendar/i18n/es_CL.po | 4 +-
addons/web_calendar/i18n/es_CR.po | 4 +-
addons/web_calendar/i18n/es_DO.po | 4 +-
addons/web_calendar/i18n/es_EC.po | 4 +-
addons/web_calendar/i18n/es_MX.po | 4 +-
addons/web_calendar/i18n/et.po | 4 +-
addons/web_calendar/i18n/eu.po | 4 +-
addons/web_calendar/i18n/fa.po | 4 +-
addons/web_calendar/i18n/fi.po | 4 +-
addons/web_calendar/i18n/fr.po | 4 +-
addons/web_calendar/i18n/fr_CA.po | 4 +-
addons/web_calendar/i18n/gl.po | 4 +-
addons/web_calendar/i18n/gu.po | 4 +-
addons/web_calendar/i18n/hr.po | 4 +-
addons/web_calendar/i18n/hu.po | 4 +-
addons/web_calendar/i18n/id.po | 4 +-
addons/web_calendar/i18n/it.po | 4 +-
addons/web_calendar/i18n/ja.po | 4 +-
addons/web_calendar/i18n/ka.po | 4 +-
addons/web_calendar/i18n/ko.po | 4 +-
addons/web_calendar/i18n/lt.po | 4 +-
addons/web_calendar/i18n/mk.po | 4 +-
addons/web_calendar/i18n/mn.po | 4 +-
addons/web_calendar/i18n/nb.po | 4 +-
addons/web_calendar/i18n/nl.po | 4 +-
addons/web_calendar/i18n/nl_BE.po | 4 +-
addons/web_calendar/i18n/pl.po | 4 +-
addons/web_calendar/i18n/pt.po | 4 +-
addons/web_calendar/i18n/pt_BR.po | 4 +-
addons/web_calendar/i18n/ro.po | 4 +-
addons/web_calendar/i18n/ru.po | 4 +-
addons/web_calendar/i18n/sk.po | 4 +-
addons/web_calendar/i18n/sl.po | 4 +-
addons/web_calendar/i18n/sq.po | 4 +-
addons/web_calendar/i18n/sr@latin.po | 4 +-
addons/web_calendar/i18n/sv.po | 4 +-
addons/web_calendar/i18n/th.po | 4 +-
addons/web_calendar/i18n/tr.po | 4 +-
addons/web_calendar/i18n/uk.po | 4 +-
addons/web_calendar/i18n/zh_CN.po | 4 +-
addons/web_diagram/i18n/ar.po | 4 +-
addons/web_diagram/i18n/bg.po | 4 +-
addons/web_diagram/i18n/bn.po | 4 +-
addons/web_diagram/i18n/bs.po | 4 +-
addons/web_diagram/i18n/ca.po | 4 +-
addons/web_diagram/i18n/cs.po | 4 +-
addons/web_diagram/i18n/da.po | 4 +-
addons/web_diagram/i18n/de.po | 4 +-
addons/web_diagram/i18n/en_AU.po | 4 +-
addons/web_diagram/i18n/en_GB.po | 4 +-
addons/web_diagram/i18n/es.po | 4 +-
addons/web_diagram/i18n/es_CL.po | 4 +-
addons/web_diagram/i18n/es_CR.po | 4 +-
addons/web_diagram/i18n/es_DO.po | 4 +-
addons/web_diagram/i18n/es_EC.po | 4 +-
addons/web_diagram/i18n/es_MX.po | 4 +-
addons/web_diagram/i18n/et.po | 4 +-
addons/web_diagram/i18n/fa.po | 4 +-
addons/web_diagram/i18n/fi.po | 4 +-
addons/web_diagram/i18n/fr.po | 4 +-
addons/web_diagram/i18n/gl.po | 4 +-
addons/web_diagram/i18n/gu.po | 4 +-
addons/web_diagram/i18n/hr.po | 4 +-
addons/web_diagram/i18n/hu.po | 4 +-
addons/web_diagram/i18n/id.po | 4 +-
addons/web_diagram/i18n/it.po | 4 +-
addons/web_diagram/i18n/ja.po | 4 +-
addons/web_diagram/i18n/ka.po | 4 +-
addons/web_diagram/i18n/ko.po | 4 +-
addons/web_diagram/i18n/lt.po | 4 +-
addons/web_diagram/i18n/mk.po | 4 +-
addons/web_diagram/i18n/mn.po | 4 +-
addons/web_diagram/i18n/nb.po | 4 +-
addons/web_diagram/i18n/nl.po | 4 +-
addons/web_diagram/i18n/nl_BE.po | 4 +-
addons/web_diagram/i18n/pl.po | 4 +-
addons/web_diagram/i18n/pt.po | 4 +-
addons/web_diagram/i18n/pt_BR.po | 4 +-
addons/web_diagram/i18n/ro.po | 4 +-
addons/web_diagram/i18n/ru.po | 4 +-
addons/web_diagram/i18n/sl.po | 4 +-
addons/web_diagram/i18n/sq.po | 4 +-
addons/web_diagram/i18n/sr@latin.po | 4 +-
addons/web_diagram/i18n/sv.po | 4 +-
addons/web_diagram/i18n/th.po | 4 +-
addons/web_diagram/i18n/tr.po | 4 +-
addons/web_diagram/i18n/zh_CN.po | 4 +-
addons/web_diagram/i18n/zh_TW.po | 4 +-
addons/web_gantt/i18n/ar.po | 4 +-
addons/web_gantt/i18n/bg.po | 4 +-
addons/web_gantt/i18n/bn.po | 4 +-
addons/web_gantt/i18n/bs.po | 4 +-
addons/web_gantt/i18n/ca.po | 4 +-
addons/web_gantt/i18n/cs.po | 4 +-
addons/web_gantt/i18n/da.po | 4 +-
addons/web_gantt/i18n/de.po | 4 +-
addons/web_gantt/i18n/en_AU.po | 4 +-
addons/web_gantt/i18n/en_GB.po | 4 +-
addons/web_gantt/i18n/es.po | 4 +-
addons/web_gantt/i18n/es_CL.po | 4 +-
addons/web_gantt/i18n/es_CR.po | 4 +-
addons/web_gantt/i18n/es_DO.po | 4 +-
addons/web_gantt/i18n/es_EC.po | 4 +-
addons/web_gantt/i18n/es_MX.po | 4 +-
addons/web_gantt/i18n/et.po | 4 +-
addons/web_gantt/i18n/fa.po | 4 +-
addons/web_gantt/i18n/fi.po | 4 +-
addons/web_gantt/i18n/fr.po | 4 +-
addons/web_gantt/i18n/gl.po | 4 +-
addons/web_gantt/i18n/gu.po | 4 +-
addons/web_gantt/i18n/hr.po | 4 +-
addons/web_gantt/i18n/hu.po | 4 +-
addons/web_gantt/i18n/it.po | 4 +-
addons/web_gantt/i18n/ja.po | 4 +-
addons/web_gantt/i18n/ka.po | 4 +-
addons/web_gantt/i18n/ko.po | 4 +-
addons/web_gantt/i18n/lo.po | 4 +-
addons/web_gantt/i18n/lt.po | 4 +-
addons/web_gantt/i18n/mk.po | 4 +-
addons/web_gantt/i18n/mn.po | 4 +-
addons/web_gantt/i18n/nb.po | 4 +-
addons/web_gantt/i18n/nl.po | 4 +-
addons/web_gantt/i18n/nl_BE.po | 4 +-
addons/web_gantt/i18n/pl.po | 6 +-
addons/web_gantt/i18n/pt.po | 4 +-
addons/web_gantt/i18n/pt_BR.po | 4 +-
addons/web_gantt/i18n/ro.po | 4 +-
addons/web_gantt/i18n/ru.po | 4 +-
addons/web_gantt/i18n/sl.po | 4 +-
addons/web_gantt/i18n/sq.po | 4 +-
addons/web_gantt/i18n/sr@latin.po | 4 +-
addons/web_gantt/i18n/sv.po | 4 +-
addons/web_gantt/i18n/th.po | 4 +-
addons/web_gantt/i18n/tr.po | 4 +-
addons/web_gantt/i18n/zh_CN.po | 4 +-
addons/web_graph/i18n/ar.po | 4 +-
addons/web_graph/i18n/bg.po | 4 +-
addons/web_graph/i18n/bn.po | 4 +-
addons/web_graph/i18n/bs.po | 4 +-
addons/web_graph/i18n/ca.po | 4 +-
addons/web_graph/i18n/cs.po | 4 +-
addons/web_graph/i18n/da.po | 4 +-
addons/web_graph/i18n/de.po | 4 +-
addons/web_graph/i18n/en_AU.po | 4 +-
addons/web_graph/i18n/en_GB.po | 4 +-
addons/web_graph/i18n/es.po | 4 +-
addons/web_graph/i18n/es_CL.po | 4 +-
addons/web_graph/i18n/es_CR.po | 4 +-
addons/web_graph/i18n/es_DO.po | 4 +-
addons/web_graph/i18n/es_EC.po | 4 +-
addons/web_graph/i18n/es_MX.po | 4 +-
addons/web_graph/i18n/et.po | 4 +-
addons/web_graph/i18n/fa.po | 4 +-
addons/web_graph/i18n/fi.po | 4 +-
addons/web_graph/i18n/fr.po | 4 +-
addons/web_graph/i18n/fr_CA.po | 4 +-
addons/web_graph/i18n/gl.po | 4 +-
addons/web_graph/i18n/gu.po | 4 +-
addons/web_graph/i18n/hr.po | 4 +-
addons/web_graph/i18n/hu.po | 4 +-
addons/web_graph/i18n/it.po | 4 +-
addons/web_graph/i18n/ja.po | 4 +-
addons/web_graph/i18n/ka.po | 4 +-
addons/web_graph/i18n/ko.po | 4 +-
addons/web_graph/i18n/lt.po | 4 +-
addons/web_graph/i18n/mk.po | 4 +-
addons/web_graph/i18n/mn.po | 4 +-
addons/web_graph/i18n/nb.po | 4 +-
addons/web_graph/i18n/nl.po | 4 +-
addons/web_graph/i18n/nl_BE.po | 4 +-
addons/web_graph/i18n/pl.po | 4 +-
addons/web_graph/i18n/pt.po | 4 +-
addons/web_graph/i18n/pt_BR.po | 4 +-
addons/web_graph/i18n/ro.po | 4 +-
addons/web_graph/i18n/ru.po | 4 +-
addons/web_graph/i18n/sl.po | 4 +-
addons/web_graph/i18n/sq.po | 4 +-
addons/web_graph/i18n/sr@latin.po | 4 +-
addons/web_graph/i18n/sv.po | 4 +-
addons/web_graph/i18n/th.po | 4 +-
addons/web_graph/i18n/tr.po | 4 +-
addons/web_graph/i18n/zh_CN.po | 4 +-
addons/web_kanban/i18n/ar.po | 4 +-
addons/web_kanban/i18n/bg.po | 4 +-
addons/web_kanban/i18n/bn.po | 4 +-
addons/web_kanban/i18n/bs.po | 4 +-
addons/web_kanban/i18n/ca.po | 4 +-
addons/web_kanban/i18n/cs.po | 4 +-
addons/web_kanban/i18n/da.po | 4 +-
addons/web_kanban/i18n/de.po | 4 +-
addons/web_kanban/i18n/en_AU.po | 4 +-
addons/web_kanban/i18n/en_GB.po | 4 +-
addons/web_kanban/i18n/es.po | 4 +-
addons/web_kanban/i18n/es_CL.po | 4 +-
addons/web_kanban/i18n/es_CR.po | 4 +-
addons/web_kanban/i18n/es_DO.po | 4 +-
addons/web_kanban/i18n/es_EC.po | 4 +-
addons/web_kanban/i18n/es_MX.po | 4 +-
addons/web_kanban/i18n/et.po | 4 +-
addons/web_kanban/i18n/fa.po | 4 +-
addons/web_kanban/i18n/fi.po | 4 +-
addons/web_kanban/i18n/fr.po | 4 +-
addons/web_kanban/i18n/fr_CA.po | 4 +-
addons/web_kanban/i18n/gl.po | 4 +-
addons/web_kanban/i18n/gu.po | 4 +-
addons/web_kanban/i18n/hr.po | 4 +-
addons/web_kanban/i18n/hu.po | 4 +-
addons/web_kanban/i18n/it.po | 4 +-
addons/web_kanban/i18n/ja.po | 4 +-
addons/web_kanban/i18n/ka.po | 4 +-
addons/web_kanban/i18n/ko.po | 4 +-
addons/web_kanban/i18n/lt.po | 4 +-
addons/web_kanban/i18n/mk.po | 4 +-
addons/web_kanban/i18n/mn.po | 4 +-
addons/web_kanban/i18n/nb.po | 4 +-
addons/web_kanban/i18n/nl.po | 4 +-
addons/web_kanban/i18n/nl_BE.po | 4 +-
addons/web_kanban/i18n/pl.po | 4 +-
addons/web_kanban/i18n/pt.po | 4 +-
addons/web_kanban/i18n/pt_BR.po | 4 +-
addons/web_kanban/i18n/ro.po | 4 +-
addons/web_kanban/i18n/ru.po | 4 +-
addons/web_kanban/i18n/sl.po | 4 +-
addons/web_kanban/i18n/sr@latin.po | 4 +-
addons/web_kanban/i18n/sv.po | 4 +-
addons/web_kanban/i18n/th.po | 4 +-
addons/web_kanban/i18n/tr.po | 4 +-
addons/web_kanban/i18n/zh_CN.po | 4 +-
addons/web_kanban/i18n/zh_TW.po | 4 +-
addons/web_view_editor/i18n/ar.po | 4 +-
addons/web_view_editor/i18n/cs.po | 4 +-
addons/web_view_editor/i18n/de.po | 4 +-
addons/web_view_editor/i18n/en_AU.po | 4 +-
addons/web_view_editor/i18n/es.po | 4 +-
addons/web_view_editor/i18n/es_DO.po | 4 +-
addons/web_view_editor/i18n/es_EC.po | 4 +-
addons/web_view_editor/i18n/es_MX.po | 4 +-
addons/web_view_editor/i18n/et.po | 4 +-
addons/web_view_editor/i18n/fa.po | 4 +-
addons/web_view_editor/i18n/fi.po | 4 +-
addons/web_view_editor/i18n/fr.po | 4 +-
addons/web_view_editor/i18n/hr.po | 4 +-
addons/web_view_editor/i18n/hu.po | 4 +-
addons/web_view_editor/i18n/it.po | 4 +-
addons/web_view_editor/i18n/ko.po | 4 +-
addons/web_view_editor/i18n/lt.po | 4 +-
addons/web_view_editor/i18n/lv.po | 4 +-
addons/web_view_editor/i18n/mk.po | 4 +-
addons/web_view_editor/i18n/mn.po | 4 +-
addons/web_view_editor/i18n/nb.po | 4 +-
addons/web_view_editor/i18n/nl.po | 4 +-
addons/web_view_editor/i18n/nl_BE.po | 4 +-
addons/web_view_editor/i18n/pl.po | 4 +-
addons/web_view_editor/i18n/pt.po | 4 +-
addons/web_view_editor/i18n/pt_BR.po | 4 +-
addons/web_view_editor/i18n/ro.po | 4 +-
addons/web_view_editor/i18n/ru.po | 4 +-
addons/web_view_editor/i18n/sl.po | 4 +-
addons/web_view_editor/i18n/th.po | 4 +-
addons/web_view_editor/i18n/tr.po | 4 +-
addons/web_view_editor/i18n/zh_CN.po | 4 +-
328 files changed, 3256 insertions(+), 655 deletions(-)
create mode 100644 addons/web/i18n/vi.po
diff --git a/addons/web/i18n/ar.po b/addons/web/i18n/ar.po
index 4ad07a8c85c..b9c42196172 100644
--- a/addons/web/i18n/ar.po
+++ b/addons/web/i18n/ar.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:39+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/bg.po b/addons/web/i18n/bg.po
index 8691ed15ef9..f893d9aeef5 100644
--- a/addons/web/i18n/bg.po
+++ b/addons/web/i18n/bg.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/bn.po b/addons/web/i18n/bn.po
index 2af5315b6c1..6b68dee15ba 100644
--- a/addons/web/i18n/bn.po
+++ b/addons/web/i18n/bn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:39+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/bs.po b/addons/web/i18n/bs.po
index 5d0fdeca369..58853df8a60 100644
--- a/addons/web/i18n/bs.po
+++ b/addons/web/i18n/bs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/ca.po b/addons/web/i18n/ca.po
index 9ff472b1cf4..40adeb5c465 100644
--- a/addons/web/i18n/ca.po
+++ b/addons/web/i18n/ca.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/cs.po b/addons/web/i18n/cs.po
index b3bbb492ad1..17bc36efaca 100644
--- a/addons/web/i18n/cs.po
+++ b/addons/web/i18n/cs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
"X-Poedit-Language: Czech\n"
#. module: web
diff --git a/addons/web/i18n/da.po b/addons/web/i18n/da.po
index a3a0e0c07ca..0c1e90ff494 100644
--- a/addons/web/i18n/da.po
+++ b/addons/web/i18n/da.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/de.po b/addons/web/i18n/de.po
index e8d7b2d1ec5..383b916d7a5 100644
--- a/addons/web/i18n/de.po
+++ b/addons/web/i18n/de.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/en_AU.po b/addons/web/i18n/en_AU.po
index 117567d248f..39e548b3bfa 100644
--- a/addons/web/i18n/en_AU.po
+++ b/addons/web/i18n/en_AU.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/en_GB.po b/addons/web/i18n/en_GB.po
index edd202f5cd7..5fbbaa06d78 100644
--- a/addons/web/i18n/en_GB.po
+++ b/addons/web/i18n/en_GB.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/es.po b/addons/web/i18n/es.po
index c4fabbbcc53..faeec10a814 100644
--- a/addons/web/i18n/es.po
+++ b/addons/web/i18n/es.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/es_CL.po b/addons/web/i18n/es_CL.po
index dfe647bcbc7..64fa792ddfb 100644
--- a/addons/web/i18n/es_CL.po
+++ b/addons/web/i18n/es_CL.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/es_CR.po b/addons/web/i18n/es_CR.po
index 9f0b04e682d..b02a53d593e 100644
--- a/addons/web/i18n/es_CR.po
+++ b/addons/web/i18n/es_CR.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
"Language: es\n"
#. module: web
diff --git a/addons/web/i18n/es_DO.po b/addons/web/i18n/es_DO.po
index d954fa60fce..d91cff414b2 100644
--- a/addons/web/i18n/es_DO.po
+++ b/addons/web/i18n/es_DO.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/es_EC.po b/addons/web/i18n/es_EC.po
index 422229be257..0b2c42570aa 100644
--- a/addons/web/i18n/es_EC.po
+++ b/addons/web/i18n/es_EC.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/es_MX.po b/addons/web/i18n/es_MX.po
index 14e744bf119..e747fdae123 100644
--- a/addons/web/i18n/es_MX.po
+++ b/addons/web/i18n/es_MX.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/et.po b/addons/web/i18n/et.po
index c04270f0ca3..fbdcc79886b 100644
--- a/addons/web/i18n/et.po
+++ b/addons/web/i18n/et.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/eu.po b/addons/web/i18n/eu.po
index ac2126a8b89..ee387d408cc 100644
--- a/addons/web/i18n/eu.po
+++ b/addons/web/i18n/eu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:39+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/fa.po b/addons/web/i18n/fa.po
index dee493a6957..e6ddf35a27a 100644
--- a/addons/web/i18n/fa.po
+++ b/addons/web/i18n/fa.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/fi.po b/addons/web/i18n/fi.po
index 1429fa54f14..764c009e2e2 100644
--- a/addons/web/i18n/fi.po
+++ b/addons/web/i18n/fi.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/fr.po b/addons/web/i18n/fr.po
index 7c0dbb89dc7..5771ca6ec3f 100644
--- a/addons/web/i18n/fr.po
+++ b/addons/web/i18n/fr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/fr_CA.po b/addons/web/i18n/fr_CA.po
index 2f70861b20d..4e0bc70f0a0 100644
--- a/addons/web/i18n/fr_CA.po
+++ b/addons/web/i18n/fr_CA.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/gl.po b/addons/web/i18n/gl.po
index 6dc68783f83..f8f1fa70a44 100644
--- a/addons/web/i18n/gl.po
+++ b/addons/web/i18n/gl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/gu.po b/addons/web/i18n/gu.po
index 9d6ec958302..6267d246f2d 100644
--- a/addons/web/i18n/gu.po
+++ b/addons/web/i18n/gu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/hi.po b/addons/web/i18n/hi.po
index c6fdb00dadb..0df85d44b0a 100644
--- a/addons/web/i18n/hi.po
+++ b/addons/web/i18n/hi.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/hr.po b/addons/web/i18n/hr.po
index e7af3680f50..c005acd2201 100644
--- a/addons/web/i18n/hr.po
+++ b/addons/web/i18n/hr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/hu.po b/addons/web/i18n/hu.po
index 6488bfd219b..39ae7c79d86 100644
--- a/addons/web/i18n/hu.po
+++ b/addons/web/i18n/hu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/id.po b/addons/web/i18n/id.po
index 6da13254561..8b60e9aee6b 100644
--- a/addons/web/i18n/id.po
+++ b/addons/web/i18n/id.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/it.po b/addons/web/i18n/it.po
index 50c030add9f..a73ed9d7739 100644
--- a/addons/web/i18n/it.po
+++ b/addons/web/i18n/it.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/ja.po b/addons/web/i18n/ja.po
index a5735ff4a63..9d387691535 100644
--- a/addons/web/i18n/ja.po
+++ b/addons/web/i18n/ja.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/ka.po b/addons/web/i18n/ka.po
index 8d09f5d87d1..634f4d6a56a 100644
--- a/addons/web/i18n/ka.po
+++ b/addons/web/i18n/ka.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/ko.po b/addons/web/i18n/ko.po
index ef26f697993..1d6660cdd94 100644
--- a/addons/web/i18n/ko.po
+++ b/addons/web/i18n/ko.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/lo.po b/addons/web/i18n/lo.po
index 8fecad9c653..3975bd60a18 100644
--- a/addons/web/i18n/lo.po
+++ b/addons/web/i18n/lo.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/lt.po b/addons/web/i18n/lt.po
index 79596b9ec35..6311d83d48f 100644
--- a/addons/web/i18n/lt.po
+++ b/addons/web/i18n/lt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/lv.po b/addons/web/i18n/lv.po
index 236c07a9ad9..93317998113 100644
--- a/addons/web/i18n/lv.po
+++ b/addons/web/i18n/lv.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/mk.po b/addons/web/i18n/mk.po
index 3a4cbb59f5d..5112569b9bb 100644
--- a/addons/web/i18n/mk.po
+++ b/addons/web/i18n/mk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/mn.po b/addons/web/i18n/mn.po
index 2b54185983a..51159d0fa4f 100644
--- a/addons/web/i18n/mn.po
+++ b/addons/web/i18n/mn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/nb.po b/addons/web/i18n/nb.po
index bda76ea709e..066497e7870 100644
--- a/addons/web/i18n/nb.po
+++ b/addons/web/i18n/nb.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/nl.po b/addons/web/i18n/nl.po
index 67ea0cc2e0a..747f6388934 100644
--- a/addons/web/i18n/nl.po
+++ b/addons/web/i18n/nl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:40+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/nl_BE.po b/addons/web/i18n/nl_BE.po
index 2daad6fb8cc..10912a93987 100644
--- a/addons/web/i18n/nl_BE.po
+++ b/addons/web/i18n/nl_BE.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/pl.po b/addons/web/i18n/pl.po
index c44f832c66e..35e76514de3 100644
--- a/addons/web/i18n/pl.po
+++ b/addons/web/i18n/pl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/pt.po b/addons/web/i18n/pt.po
index 33260569d21..910d1a26092 100644
--- a/addons/web/i18n/pt.po
+++ b/addons/web/i18n/pt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/pt_BR.po b/addons/web/i18n/pt_BR.po
index 777c62025d1..50b3b6cffab 100644
--- a/addons/web/i18n/pt_BR.po
+++ b/addons/web/i18n/pt_BR.po
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/ro.po b/addons/web/i18n/ro.po
index 7c051b6ad6c..e0fe4ac8ed7 100644
--- a/addons/web/i18n/ro.po
+++ b/addons/web/i18n/ro.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/ru.po b/addons/web/i18n/ru.po
index 5bd16a7c2dc..1328ef429da 100644
--- a/addons/web/i18n/ru.po
+++ b/addons/web/i18n/ru.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/sk.po b/addons/web/i18n/sk.po
index c516f28c3e1..8885eba0dd0 100644
--- a/addons/web/i18n/sk.po
+++ b/addons/web/i18n/sk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/sl.po b/addons/web/i18n/sl.po
index a624e50b156..ff5bbc6b70a 100644
--- a/addons/web/i18n/sl.po
+++ b/addons/web/i18n/sl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/sq.po b/addons/web/i18n/sq.po
index d5636a9b296..1b070778eda 100644
--- a/addons/web/i18n/sq.po
+++ b/addons/web/i18n/sq.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:39+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:07+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/sr@latin.po b/addons/web/i18n/sr@latin.po
index ce541a78c46..9e12172d1bf 100644
--- a/addons/web/i18n/sr@latin.po
+++ b/addons/web/i18n/sr@latin.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/sv.po b/addons/web/i18n/sv.po
index 7b4b498ee3b..fd268fcbda8 100644
--- a/addons/web/i18n/sv.po
+++ b/addons/web/i18n/sv.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/th.po b/addons/web/i18n/th.po
index 62644fc8400..b705aea99f0 100644
--- a/addons/web/i18n/th.po
+++ b/addons/web/i18n/th.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/tr.po b/addons/web/i18n/tr.po
index 237c96c5d45..0b70a7c1996 100644
--- a/addons/web/i18n/tr.po
+++ b/addons/web/i18n/tr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/uk.po b/addons/web/i18n/uk.po
index e906802407f..92c7f10cb0e 100644
--- a/addons/web/i18n/uk.po
+++ b/addons/web/i18n/uk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:41+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:08+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/vi.po b/addons/web/i18n/vi.po
new file mode 100644
index 00000000000..b944c273871
--- /dev/null
+++ b/addons/web/i18n/vi.po
@@ -0,0 +1,2601 @@
+# Vietnamese translation for openerp-web
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openerp-web package.
+# FIRST AUTHOR , 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openerp-web\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-07-29 08:37+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Vietnamese \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-07-30 04:44+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:147
+#, python-format
+msgid "Default language:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:592
+#, python-format
+msgid "%d minutes ago"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:620
+#, python-format
+msgid "Still loading...
Please be patient."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1999
+#, python-format
+msgid "%(field)s %(operator)s \"%(value)s\""
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:2061
+#: code:addons/web/static/src/js/search.js:2097
+#: code:addons/web/static/src/js/search.js:2124
+#, python-format
+msgid "less or equal than"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:410
+#, python-format
+msgid "Please enter your previous password"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:126
+#: code:addons/web/static/src/xml/base.xml:185
+#: code:addons/web/static/src/xml/base.xml:300
+#, python-format
+msgid "Master password:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:292
+#, python-format
+msgid "Change Master Password"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:513
+#, python-format
+msgid "Do you really want to delete the database: %s ?"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1502
+#, python-format
+msgid "Search %(field)s at: %(value)s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:559
+#, python-format
+msgid "Access Denied"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:5220
+#, python-format
+msgid "Uploading error"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:593
+#, python-format
+msgid "about an hour ago"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/controllers/main.py:811
+#: code:addons/web/static/src/js/chrome.js:536
+#: code:addons/web/static/src/xml/base.xml:234
+#, python-format
+msgid "Backup Database"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:518
+#, python-format
+msgid "%(view_type)s view"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/dates.js:49
+#: code:addons/web/static/src/js/dates.js:53
+#, python-format
+msgid "'%s' is not a valid date"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1858
+#, python-format
+msgid "Here is a preview of the file we could not import:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:591
+#, python-format
+msgid "about a minute ago"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1306
+#, python-format
+msgid "File"
+msgstr ""
+
+#. module: web
+#: code:addons/web/controllers/main.py:869
+#, python-format
+msgid "You cannot leave any password empty."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:732
+#, python-format
+msgid "Invalid username or password"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:224
+#: code:addons/web/static/src/xml/base.xml:256
+#: code:addons/web/static/src/xml/base.xml:278
+#, python-format
+msgid "Master Password:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1245
+#: code:addons/web/static/src/xml/base.xml:1402
+#, python-format
+msgid "Select"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:571
+#, python-format
+msgid "Database restored successfully"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:437
+#, python-format
+msgid "Version"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:592
+#, python-format
+msgid "Latest Modification Date:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1566
+#, python-format
+msgid "M2O search fields do not currently handle multiple default values"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:1241
+#, python-format
+msgid "Widget type '%s' is not implemented"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1626
+#, python-format
+msgid "Share with all users"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:77
+#: code:addons/web/static/src/js/view_form.js:320
+#, python-format
+msgid "Form"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1352
+#, python-format
+msgid "(no string)"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/formats.js:286
+#, python-format
+msgid "'%s' is not a correct time"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1401
+#, python-format
+msgid "not a valid number"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:343
+#, python-format
+msgid "New Password:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:632
+#, python-format
+msgid "Attachment :"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1712
+#, python-format
+msgid "Fields to export"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:1350
+#, python-format
+msgid "Undefined"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:5002
+#, python-format
+msgid "File Upload"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:597
+#, python-format
+msgid "about a month ago"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1618
+#, python-format
+msgid "Custom Filters"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1364
+#, python-format
+msgid "Button Type:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:441
+#, python-format
+msgid "OpenERP SA Company"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1663
+#, python-format
+msgid "Custom Filter"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:177
+#, python-format
+msgid "Duplicate Database"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/controllers/main.py:832
+#: code:addons/web/controllers/main.py:833
+#: code:addons/web/controllers/main.py:869
+#: code:addons/web/controllers/main.py:871
+#: code:addons/web/controllers/main.py:877
+#: code:addons/web/controllers/main.py:878
+#: code:addons/web/static/src/js/chrome.js:823
+#: code:addons/web/static/src/xml/base.xml:294
+#: code:addons/web/static/src/xml/base.xml:354
+#, python-format
+msgid "Change Password"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:3528
+#, python-format
+msgid "View type '%s' is not supported in One2Many."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:5082
+#: code:addons/web/static/src/js/view_list.js:2204
+#, python-format
+msgid "Download"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/formats.js:270
+#, python-format
+msgid "'%s' is not a correct datetime"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:432
+#, python-format
+msgid "Group"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:949
+#, python-format
+msgid "Unhandled widget"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1004
+#, python-format
+msgid "Selection:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:881
+#, python-format
+msgid "The following fields are invalid:"
+msgstr ""
+
+#. module: web
+#: code:addons/web/controllers/main.py:890
+#, python-format
+msgid "Languages"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1298
+#, python-format
+msgid "...Upload in progress..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1789
+#, python-format
+msgid "Import"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:565
+#, python-format
+msgid "Could not restore the database"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:4982
+#, python-format
+msgid "File upload"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:3925
+#, python-format
+msgid "Action Button"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:564
+#: code:addons/web/static/src/xml/base.xml:1493
+#, python-format
+msgid "Manage Filters"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:2042
+#, python-format
+msgid "contains"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:623
+#, python-format
+msgid "Take a minute to get a coffee,
because it's loading..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:435
+#, python-format
+msgid "Activate the developer mode"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:341
+#, python-format
+msgid "Loading (%d)"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1216
+#, python-format
+msgid "GroupBy"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:699
+#, python-format
+msgid "You must select at least one record."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:557
+#, python-format
+msgid "View Log (perm_read)"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:1071
+#, python-format
+msgid "Set Default"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1000
+#, python-format
+msgid "Relation:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:590
+#, python-format
+msgid "less than a minute ago"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:873
+#, python-format
+msgid "Condition:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:1709
+#, python-format
+msgid "Unsupported operator %s in domain %s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/formats.js:246
+#, python-format
+msgid "'%s' is not a correct float"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:571
+#, python-format
+msgid "Restored"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:409
+#, python-format
+msgid "%d-%d of %d"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:2955
+#, python-format
+msgid "Create and Edit..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/pyeval.js:736
+#, python-format
+msgid "Unknown nonliteral type "
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:2359
+#, python-format
+msgid "Resource error"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:2144
+#, python-format
+msgid "is not"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:572
+#, python-format
+msgid "Print Workflow"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:413
+#, python-format
+msgid "Please confirm your new password"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1825
+#, python-format
+msgid "UTF-8"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:443
+#, python-format
+msgid "For more information visit"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1880
+#, python-format
+msgid "Add All Info..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1701
+#, python-format
+msgid "Export Formats"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:996
+#, python-format
+msgid "On change:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:939
+#, python-format
+msgid "Model %s fields"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:906
+#, python-format
+msgid "Setting 'id' attribute on existing record %s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:8
+#, python-format
+msgid "List"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:2058
+#: code:addons/web/static/src/js/search.js:2094
+#: code:addons/web/static/src/js/search.js:2121
+#, python-format
+msgid "greater than"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:2258
+#: code:addons/web/static/src/xml/base.xml:568
+#, python-format
+msgid "View"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1492
+#, python-format
+msgid "Save Filter"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1372
+#, python-format
+msgid "Action ID:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:479
+#, python-format
+msgid "Your user's preference timezone does not match your browser timezone:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:1237
+#, python-format
+msgid "Field '%s' specified in view could not be found."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1777
+#, python-format
+msgid "Saved exports:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:338
+#, python-format
+msgid "Old Password:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/formats.js:113
+#, python-format
+msgid "Bytes,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:503
+#, python-format
+msgid "The database has been duplicated."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1643
+#, python-format
+msgid "Apply"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1414
+#, python-format
+msgid "Save & New"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1251
+#: code:addons/web/static/src/xml/base.xml:1253
+#, python-format
+msgid "Save As"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/doc/module/static/src/xml/web_example.xml:3
+#, python-format
+msgid "00:00:00"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:2330
+#, python-format
+msgid "E-mail error"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:595
+#, python-format
+msgid "a day ago"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1810
+#, python-format
+msgid "Does your file have titles?"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:327
+#, python-format
+msgid "Unlimited"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:788
+#, python-format
+msgid ""
+"Warning, the record has been modified, your changes will be discarded.\n"
+"\n"
+"Are you sure you want to leave this page ?"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:2991
+#, python-format
+msgid "Search: "
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:566
+#, python-format
+msgid "Technical translation"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1818
+#, python-format
+msgid "Delimiter:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:484
+#, python-format
+msgid "Browser's timezone"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1623
+#, python-format
+msgid "Filter name"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1490
+#, python-format
+msgid "-- Actions --"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:4262
+#: code:addons/web/static/src/js/view_form.js:4423
+#: code:addons/web/static/src/xml/base.xml:1435
+#: code:addons/web/static/src/xml/base.xml:1726
+#, python-format
+msgid "Add"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:558
+#, python-format
+msgid "Toggle Form Layout Outline"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:443
+#, python-format
+msgid "OpenERP.com"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:2349
+#, python-format
+msgid "Can't send email to invalid e-mail address"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:658
+#, python-format
+msgid "Add..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:424
+#, python-format
+msgid "Preferences"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:435
+#, python-format
+msgid "Wrong on change format: %s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/controllers/main.py:793
+#: code:addons/web/static/src/xml/base.xml:203
+#, python-format
+msgid "Drop Database"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:488
+#, python-format
+msgid "Click here to change your user's timezone."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:988
+#, python-format
+msgid "Modifiers:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:649
+#, python-format
+msgid "Delete this attachment"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:796
+#: code:addons/web/static/src/xml/base.xml:837
+#: code:addons/web/static/src/xml/base.xml:1410
+#: code:addons/web/static/src/xml/base.xml:1630
+#, python-format
+msgid "Save"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:1074
+#: code:addons/web/static/src/xml/base.xml:370
+#, python-format
+msgid "More"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:73
+#, python-format
+msgid "Username"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:503
+#, python-format
+msgid "Duplicating database"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:585
+#, python-format
+msgid "Password has been changed successfully"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list_editable.js:793
+#, python-format
+msgid "The form's data can not be discarded"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:555
+#, python-format
+msgid "Debug View#"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:77
+#, python-format
+msgid "Log in"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:199
+#: code:addons/web/static/src/js/view_list.js:346
+#: code:addons/web/static/src/xml/base.xml:1785
+#, python-format
+msgid "Delete"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/pyeval.js:774
+#, python-format
+msgid ""
+"Local evaluation failure\n"
+"%s\n"
+"\n"
+"%s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:367
+#, python-format
+msgid "Invalid database name"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1714
+#, python-format
+msgid "Save fields list"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/doc/module/static/src/xml/web_example.xml:5
+#, python-format
+msgid "Start"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:897
+#, python-format
+msgid "View Log (%s)"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:586
+#, python-format
+msgid "Creation Date:"
+msgstr ""
+
+#. module: web
+#: code:addons/web/controllers/main.py:833
+#: code:addons/web/controllers/main.py:878
+#, python-format
+msgid "Error, password not changed !"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:4981
+#, python-format
+msgid "The selected file exceed the maximum file size of %s."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:635
+#, python-format
+msgid "/web/binary/upload_attachment"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:585
+#, python-format
+msgid "Changed Password"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1457
+#, python-format
+msgid "Search"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:3139
+#: code:addons/web/static/src/js/view_form.js:3785
+#: code:addons/web/static/src/js/view_form.js:3906
+#: code:addons/web/static/src/js/view_form.js:4358
+#: code:addons/web/static/src/js/view_form.js:4482
+#, python-format
+msgid "Open: "
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:236
+#: code:addons/web/static/src/xml/base.xml:327
+#, python-format
+msgid "Backup"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/dates.js:76
+#: code:addons/web/static/src/js/dates.js:80
+#, python-format
+msgid "'%s' is not a valid time"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/formats.js:278
+#, python-format
+msgid "'%s' is not a correct date"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:955
+#, python-format
+msgid "(nolabel)"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:596
+#, python-format
+msgid "%d days ago"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1500
+#, python-format
+msgid "(Any existing filter with the same name will be replaced)"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:1936
+#: code:addons/web/static/src/xml/base.xml:356
+#: code:addons/web/static/src/xml/base.xml:1405
+#: code:addons/web/static/src/xml/base.xml:1881
+#, python-format
+msgid "Cancel"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:672
+#: code:addons/web/static/src/js/coresetup.js:618
+#: code:addons/web/static/src/xml/base.xml:9
+#, python-format
+msgid "Loading..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:589
+#, python-format
+msgid "Latest Modification by:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:492
+#, python-format
+msgid "Timezone mismatch"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:1663
+#, python-format
+msgid "Unknown operator %s in domain %s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:427
+#, python-format
+msgid "%d / %d"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1803
+#, python-format
+msgid "2. Check your file format"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1739
+#, python-format
+msgid "Name"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1796
+#, python-format
+msgid ""
+"Select a .CSV file to import. If you need a sample of file to import,\n"
+" you should use the export tool with the \"Import Compatible\" option."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:598
+#, python-format
+msgid "%d months ago"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:205
+#: code:addons/web/static/src/xml/base.xml:326
+#, python-format
+msgid "Drop"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1491
+#, python-format
+msgid "Add Advanced Filter"
+msgstr ""
+
+#. module: web
+#: code:addons/web/controllers/main.py:871
+#, python-format
+msgid "The new password and its confirmation must be identical."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:564
+#: code:addons/web/static/src/xml/base.xml:266
+#, python-format
+msgid "Restore Database"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:702
+#, python-format
+msgid "Login"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:442
+#, python-format
+msgid "Licenced under the terms of"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:268
+#: code:addons/web/static/src/xml/base.xml:328
+#, python-format
+msgid "Restore"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1695
+#, python-format
+msgid "Export Type:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:428
+#, python-format
+msgid "Log out"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1192
+#, python-format
+msgid "Group by: %s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:154
+#, python-format
+msgid "No data provided."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:345
+#: code:addons/web/static/src/xml/base.xml:1683
+#, python-format
+msgid "Export"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/data_export.js:31
+#, python-format
+msgid "Export To File"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:1172
+#, python-format
+msgid "You must choose at least one record."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:621
+#, python-format
+msgid "Don't leave yet,
it's still loading..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:841
+#, python-format
+msgid "Invalid Search"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:990
+#, python-format
+msgid "Could not find id in dataset"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1728
+#, python-format
+msgid "Remove All"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1368
+#, python-format
+msgid "Method:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:1449
+#, python-format
+msgid "%(page)d/%(page_count)d"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:414
+#, python-format
+msgid "The confirmation does not match the password"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:463
+#, python-format
+msgid "Edit Company data"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:5017
+#, python-format
+msgid "Save As..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:5138
+#, python-format
+msgid "Could not display the selected image."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:531
+#, python-format
+msgid "Database backed up successfully"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1829
+#, python-format
+msgid ""
+"For use if CSV files have titles on multiple lines, skips more than a single "
+"line during import"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:414
+#, python-format
+msgid "99+"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1795
+#, python-format
+msgid "1. Import a .CSV file"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:702
+#, python-format
+msgid "No database selected !"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/formats.js:184
+#, python-format
+msgid "(%d records)"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:992
+#, python-format
+msgid "Change default:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:189
+#, python-format
+msgid "Original database name:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:2044
+#: code:addons/web/static/src/js/search.js:2056
+#: code:addons/web/static/src/js/search.js:2092
+#: code:addons/web/static/src/js/search.js:2119
+#, python-format
+msgid "is equal to"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:1581
+#, python-format
+msgid "Could not serialize XML"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1637
+#, python-format
+msgid "Advanced Search"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:308
+#, python-format
+msgid "Confirm new master password:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:624
+#, python-format
+msgid "Maybe you should consider reloading the application by pressing F5..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:17
+#: code:addons/web/static/src/js/view_list.js:2258
+#: code:addons/web/static/src/xml/base.xml:324
+#: code:addons/web/static/src/xml/base.xml:834
+#: code:addons/web/static/src/xml/base.xml:1404
+#, python-format
+msgid "Create"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:2043
+#, python-format
+msgid "doesn't contain"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1806
+#, python-format
+msgid "Import Options"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:3023
+#, python-format
+msgid "Add %s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:145
+#, python-format
+msgid "Admin password:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/data_export.js:30
+#: code:addons/web/static/src/js/view_form.js:1077
+#: code:addons/web/static/src/xml/base.xml:1422
+#, python-format
+msgid "Close"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:622
+#, python-format
+msgid ""
+"You may not believe it,
but the application is actually loading..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1800
+#, python-format
+msgid "CSV File:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1879
+#, python-format
+msgid "Advanced"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_tree.js:11
+#, python-format
+msgid "Tree"
+msgstr ""
+
+#. module: web
+#: code:addons/web/controllers/main.py:793
+#, python-format
+msgid "Could not drop database !"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/formats.js:231
+#, python-format
+msgid "'%s' is not a correct integer"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:899
+#, python-format
+msgid "All users"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:1671
+#, python-format
+msgid "Unknown field %s in domain %s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:1546
+#, python-format
+msgid "Node [%s] is not a JSONified XML node"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1454
+#, python-format
+msgid "Advanced Search..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:521
+#, python-format
+msgid "Dropping database"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:82
+#: code:addons/web/static/src/xml/base.xml:467
+#, python-format
+msgid "Powered by"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1484
+#: code:addons/web/static/src/xml/base.xml:992
+#, python-format
+msgid "Yes"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:5002
+#, python-format
+msgid "There was a problem while uploading your file"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:580
+#, python-format
+msgid "XML ID:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:976
+#, python-format
+msgid "Size:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1845
+#, python-format
+msgid "--- Don't Import ---"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1697
+#, python-format
+msgid "Import-Compatible Export"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:600
+#, python-format
+msgid "%d years ago"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:1050
+#, python-format
+msgid "Unknown m2m command %s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:1078
+#, python-format
+msgid "Save default"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:193
+#: code:addons/web/static/src/xml/base.xml:282
+#, python-format
+msgid "New database name:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:411
+#, python-format
+msgid "Please enter your new password"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:5017
+#, python-format
+msgid "The field is empty, there's nothing to save !"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:567
+#, python-format
+msgid "Manage Views"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1822
+#, python-format
+msgid "Encoding:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1829
+#, python-format
+msgid "Lines to skip"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:2945
+#, python-format
+msgid "Create \"%s\""
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/data_export.js:362
+#, python-format
+msgid "Please select fields to save export list..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:440
+#, python-format
+msgid "Copyright © 2004-TODAY OpenERP SA. All Rights Reserved."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:2379
+#, python-format
+msgid "This resource is empty"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1710
+#, python-format
+msgid "Available fields"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1856
+#, python-format
+msgid "The import failed due to:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:886
+#: code:addons/web/static/src/xml/base.xml:561
+#, python-format
+msgid "JS Tests"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1771
+#, python-format
+msgid "Save as:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1024
+#, python-format
+msgid "Filter on: %s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:2991
+#: code:addons/web/static/src/js/view_form.js:3878
+#, python-format
+msgid "Create: "
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:562
+#, python-format
+msgid "View Fields"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:348
+#, python-format
+msgid "Confirm New Password:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:587
+#, python-format
+msgid "Do you really want to remove these records?"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:980
+#, python-format
+msgid "Context:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:2114
+#: code:addons/web/static/src/js/search.js:2143
+#, python-format
+msgid "is"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/data_export.js:6
+#, python-format
+msgid "Export Data"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:984
+#, python-format
+msgid "Domain:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:856
+#, python-format
+msgid "Default:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:82
+#: code:addons/web/static/src/xml/base.xml:468
+#, python-format
+msgid "OpenERP"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/doc/module/static/src/xml/web_example.xml:8
+#, python-format
+msgid "Stop"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:68
+#: code:addons/web/static/src/xml/base.xml:211
+#: code:addons/web/static/src/xml/base.xml:243
+#, python-format
+msgid "Database:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1211
+#: code:addons/web/static/src/xml/base.xml:1268
+#, python-format
+msgid "Uploading ..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1874
+#, python-format
+msgid "Name:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:1165
+#, python-format
+msgid "About"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1457
+#, python-format
+msgid "Search Again"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1481
+#, python-format
+msgid "-- Filters --"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:2431
+#: code:addons/web/static/src/xml/base.xml:1258
+#: code:addons/web/static/src/xml/base.xml:1260
+#, python-format
+msgid "Clear"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1698
+#, python-format
+msgid "Export all Data"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:1344
+#, python-format
+msgid ""
+"Grouping on field '%s' is not possible because that field does not appear in "
+"the list view."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:559
+#, python-format
+msgid "Set Defaults"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1688
+#, python-format
+msgid ""
+"This wizard will export all data that matches the current search criteria to "
+"a CSV file.\n"
+" You can export all data or only the fields that can be "
+"reimported after modification."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:320
+#, python-format
+msgid "The record could not be found in the database."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1498
+#, python-format
+msgid "Filter Name:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:968
+#, python-format
+msgid "Type:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:560
+#, python-format
+msgid "Incorrect super-administrator password"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:964
+#, python-format
+msgid "Object:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:309
+#: code:addons/web/static/src/js/chrome.js:343
+#, python-format
+msgid "Loading"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:599
+#, python-format
+msgid "about a year ago"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:2045
+#: code:addons/web/static/src/js/search.js:2057
+#: code:addons/web/static/src/js/search.js:2093
+#: code:addons/web/static/src/js/search.js:2120
+#, python-format
+msgid "is not equal to"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:5167
+#, python-format
+msgid ""
+"The type of the field '%s' must be a many2many field with a relation to "
+"'ir.attachment' model."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:594
+#, python-format
+msgid "%d hours ago"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:4334
+#: code:addons/web/static/src/js/view_form.js:4464
+#, python-format
+msgid "Add: "
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1879
+#, python-format
+msgid "Quick Add"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1826
+#, python-format
+msgid "Latin 1"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:277
+#: code:addons/web/static/src/js/chrome.js:286
+#: code:addons/web/static/src/js/chrome.js:466
+#: code:addons/web/static/src/js/chrome.js:847
+#: code:addons/web/static/src/js/view_form.js:575
+#: code:addons/web/static/src/js/view_form.js:1940
+#: code:addons/web/static/src/xml/base.xml:1773
+#, python-format
+msgid "Ok"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:1237
+#, python-format
+msgid "Uploading..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:125
+#, python-format
+msgid "Load Demonstration data:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:637
+#, python-format
+msgid "Created by :"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/dates.js:22
+#: code:addons/web/static/src/js/dates.js:26
+#, python-format
+msgid "'%s' is not a valid datetime"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:274
+#, python-format
+msgid "File:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:2059
+#: code:addons/web/static/src/js/search.js:2095
+#: code:addons/web/static/src/js/search.js:2122
+#, python-format
+msgid "less than"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:699
+#: code:addons/web/static/src/js/views.js:1172
+#, python-format
+msgid "Warning"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:569
+#, python-format
+msgid "Edit SearchView"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:2160
+#, python-format
+msgid "is true"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:4030
+#, python-format
+msgid "Add an item"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1621
+#, python-format
+msgid "Save current filter"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:1933
+#, python-format
+msgid "Confirm"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/data_export.js:127
+#, python-format
+msgid "Please enter save field list name"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:2216
+#, python-format
+msgid "Download \"%s\""
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:325
+#, python-format
+msgid "New"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:1777
+#, python-format
+msgid "Can't convert value %s to context"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:881
+#: code:addons/web/static/src/xml/base.xml:563
+#, python-format
+msgid "Fields View Get"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:163
+#, python-format
+msgid "Confirm password:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:2060
+#: code:addons/web/static/src/js/search.js:2096
+#: code:addons/web/static/src/js/search.js:2123
+#, python-format
+msgid "greater or equal than"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1349
+#, python-format
+msgid "Button"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:440
+#, python-format
+msgid "OpenERP is a trademark of the"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/data_export.js:375
+#, python-format
+msgid "Please select fields to export..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:304
+#, python-format
+msgid "New master password:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:2161
+#, python-format
+msgid "is false"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:426
+#, python-format
+msgid "About OpenERP"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/formats.js:301
+#, python-format
+msgid "'%s' is not a correct date, datetime nor time"
+msgstr ""
+
+#. module: web
+#: code:addons/web/controllers/main.py:1307
+#, python-format
+msgid "No content found for field '%s' on '%s:%s'"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:322
+#, python-format
+msgid "Database Management"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:5138
+#, python-format
+msgid "Image"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:81
+#, python-format
+msgid "Manage Databases"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/pyeval.js:770
+#, python-format
+msgid "Evaluation Error"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1387
+#, python-format
+msgid "not a valid integer"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:355
+#: code:addons/web/static/src/xml/base.xml:798
+#: code:addons/web/static/src/xml/base.xml:838
+#: code:addons/web/static/src/xml/base.xml:1404
+#: code:addons/web/static/src/xml/base.xml:1412
+#: code:addons/web/static/src/xml/base.xml:1648
+#, python-format
+msgid "or"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1485
+#, python-format
+msgid "No"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/formats.js:313
+#, python-format
+msgid "'%s' is not convertible to date, datetime nor time"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:200
+#: code:addons/web/static/src/xml/base.xml:179
+#: code:addons/web/static/src/xml/base.xml:325
+#, python-format
+msgid "Duplicate"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:799
+#: code:addons/web/static/src/xml/base.xml:839
+#: code:addons/web/static/src/xml/base.xml:1419
+#, python-format
+msgid "Discard"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1642
+#, python-format
+msgid "Add a condition"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/coresetup.js:619
+#, python-format
+msgid "Still loading..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:884
+#, python-format
+msgid "Incorrect value for field %(fieldname)s: [%(value)s] is %(message)s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:3926
+#, python-format
+msgid "The o2m record must be saved before an action can be used"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:531
+#, python-format
+msgid "Backed"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1628
+#, python-format
+msgid "Use by default"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_list.js:1358
+#, python-format
+msgid "%s (%d)"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:841
+#, python-format
+msgid "triggered from search view"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1079
+#, python-format
+msgid "Filter"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:972
+#, python-format
+msgid "Widget:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:570
+#, python-format
+msgid "Edit Action"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:577
+#, python-format
+msgid "ID:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:892
+#, python-format
+msgid "Only you"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:571
+#, python-format
+msgid "Edit Workflow"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:1246
+#, python-format
+msgid "Do you really want to delete this attachment ?"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:914
+#, python-format
+msgid "Technical Translation"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:960
+#, python-format
+msgid "Field:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:642
+#, python-format
+msgid "Modified by :"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:521
+#, python-format
+msgid "The database %s has been dropped"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:482
+#, python-format
+msgid "User's timezone"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome.js:301
+#: code:addons/web/static/src/js/chrome.js:1276
+#, python-format
+msgid "Client Error"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/views.js:1073
+#, python-format
+msgid "Print"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1359
+#, python-format
+msgid "Special:"
+msgstr ""
+
+#. module: web
+#: code:addons/web/controllers/main.py:877
+#, python-format
+msgid ""
+"The old password you provided is incorrect, your password was not changed."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:583
+#, python-format
+msgid "Creation User:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:769
+#, python-format
+msgid "Do you really want to delete this record?"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1413
+#, python-format
+msgid "Save & Close"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/view_form.js:2932
+#, python-format
+msgid "Search More..."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:75
+#: code:addons/web/static/src/xml/base.xml:329
+#, python-format
+msgid "Password"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:568
+#: code:addons/web/static/src/xml/base.xml:831
+#: code:addons/web/static/src/xml/base.xml:1206
+#, python-format
+msgid "Edit"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1727
+#, python-format
+msgid "Remove"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1090
+#, python-format
+msgid "Select date"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:1351
+#: code:addons/web/static/src/js/search.js:1369
+#, python-format
+msgid "Search %(field)s for: %(value)s"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1305
+#, python-format
+msgid "Delete this file"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:168
+#, python-format
+msgid "Create Database"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:442
+#, python-format
+msgid "GNU Affero General Public License"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:1816
+#, python-format
+msgid "Separator:"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/xml/base.xml:318
+#, python-format
+msgid "Back to Login"
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/search.js:616
+#: code:addons/web/static/src/xml/base.xml:1480
+#, python-format
+msgid "Filters"
+msgstr ""
diff --git a/addons/web/i18n/zh_CN.po b/addons/web/i18n/zh_CN.po
index 0da6b7542d6..1fc231ab847 100644
--- a/addons/web/i18n/zh_CN.po
+++ b/addons/web/i18n/zh_CN.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/zh_TW.po b/addons/web/i18n/zh_TW.po
index a7a996e6b49..943cf96a47c 100644
--- a/addons/web/i18n/zh_TW.po
+++ b/addons/web/i18n/zh_TW.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web
#. openerp-web
diff --git a/addons/web_calendar/i18n/ar.po b/addons/web_calendar/i18n/ar.po
index 3708ffeadb8..5ac0b89414a 100644
--- a/addons/web_calendar/i18n/ar.po
+++ b/addons/web_calendar/i18n/ar.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/bg.po b/addons/web_calendar/i18n/bg.po
index 1f223b89019..14f4cb6073b 100644
--- a/addons/web_calendar/i18n/bg.po
+++ b/addons/web_calendar/i18n/bg.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/bn.po b/addons/web_calendar/i18n/bn.po
index 9187104751b..aee8ea8385d 100644
--- a/addons/web_calendar/i18n/bn.po
+++ b/addons/web_calendar/i18n/bn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/bs.po b/addons/web_calendar/i18n/bs.po
index 9205eda5081..b60e6c7a494 100644
--- a/addons/web_calendar/i18n/bs.po
+++ b/addons/web_calendar/i18n/bs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/ca.po b/addons/web_calendar/i18n/ca.po
index 0b75c24fc98..f129a032d28 100644
--- a/addons/web_calendar/i18n/ca.po
+++ b/addons/web_calendar/i18n/ca.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/cs.po b/addons/web_calendar/i18n/cs.po
index 36a19c21506..d1d7da30a05 100644
--- a/addons/web_calendar/i18n/cs.po
+++ b/addons/web_calendar/i18n/cs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
"X-Poedit-Language: Czech\n"
#. module: web_calendar
diff --git a/addons/web_calendar/i18n/da.po b/addons/web_calendar/i18n/da.po
index 83d1c16153d..d74262f88a4 100644
--- a/addons/web_calendar/i18n/da.po
+++ b/addons/web_calendar/i18n/da.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/de.po b/addons/web_calendar/i18n/de.po
index a2d4d65cbba..27e88dbc9a7 100644
--- a/addons/web_calendar/i18n/de.po
+++ b/addons/web_calendar/i18n/de.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/en_AU.po b/addons/web_calendar/i18n/en_AU.po
index ad859e87676..1f83299d156 100644
--- a/addons/web_calendar/i18n/en_AU.po
+++ b/addons/web_calendar/i18n/en_AU.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/en_GB.po b/addons/web_calendar/i18n/en_GB.po
index 5451d49082c..43e1a217baf 100644
--- a/addons/web_calendar/i18n/en_GB.po
+++ b/addons/web_calendar/i18n/en_GB.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/es.po b/addons/web_calendar/i18n/es.po
index a412140e939..b25dc6f294c 100644
--- a/addons/web_calendar/i18n/es.po
+++ b/addons/web_calendar/i18n/es.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/es_CL.po b/addons/web_calendar/i18n/es_CL.po
index 37632c70400..a701bb147d0 100644
--- a/addons/web_calendar/i18n/es_CL.po
+++ b/addons/web_calendar/i18n/es_CL.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/es_CR.po b/addons/web_calendar/i18n/es_CR.po
index e602b1aed39..123fcd13498 100644
--- a/addons/web_calendar/i18n/es_CR.po
+++ b/addons/web_calendar/i18n/es_CR.po
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
"Language: es\n"
#. module: web_calendar
diff --git a/addons/web_calendar/i18n/es_DO.po b/addons/web_calendar/i18n/es_DO.po
index 173479bc407..7d561c332ce 100644
--- a/addons/web_calendar/i18n/es_DO.po
+++ b/addons/web_calendar/i18n/es_DO.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/es_EC.po b/addons/web_calendar/i18n/es_EC.po
index 4ab35ccea81..369cc65e4e8 100644
--- a/addons/web_calendar/i18n/es_EC.po
+++ b/addons/web_calendar/i18n/es_EC.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/es_MX.po b/addons/web_calendar/i18n/es_MX.po
index f17fb04c93b..14994ffbdf9 100644
--- a/addons/web_calendar/i18n/es_MX.po
+++ b/addons/web_calendar/i18n/es_MX.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/et.po b/addons/web_calendar/i18n/et.po
index d327cd31e8e..6b4d1ed4c8a 100644
--- a/addons/web_calendar/i18n/et.po
+++ b/addons/web_calendar/i18n/et.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/eu.po b/addons/web_calendar/i18n/eu.po
index 54411191fde..31916055049 100644
--- a/addons/web_calendar/i18n/eu.po
+++ b/addons/web_calendar/i18n/eu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/fa.po b/addons/web_calendar/i18n/fa.po
index 8851b799d3b..6a134dfcfa9 100644
--- a/addons/web_calendar/i18n/fa.po
+++ b/addons/web_calendar/i18n/fa.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/fi.po b/addons/web_calendar/i18n/fi.po
index ca8df0da1f8..4c878c4431e 100644
--- a/addons/web_calendar/i18n/fi.po
+++ b/addons/web_calendar/i18n/fi.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/fr.po b/addons/web_calendar/i18n/fr.po
index 65a85ac2796..c4bb14ce7b2 100644
--- a/addons/web_calendar/i18n/fr.po
+++ b/addons/web_calendar/i18n/fr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/fr_CA.po b/addons/web_calendar/i18n/fr_CA.po
index a0acc2fe0dc..155b04ba87a 100644
--- a/addons/web_calendar/i18n/fr_CA.po
+++ b/addons/web_calendar/i18n/fr_CA.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/gl.po b/addons/web_calendar/i18n/gl.po
index 4f68928dcc7..25a34d4183a 100644
--- a/addons/web_calendar/i18n/gl.po
+++ b/addons/web_calendar/i18n/gl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/gu.po b/addons/web_calendar/i18n/gu.po
index 94764b380bb..05c8ae2cf0a 100644
--- a/addons/web_calendar/i18n/gu.po
+++ b/addons/web_calendar/i18n/gu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/hr.po b/addons/web_calendar/i18n/hr.po
index 07a755b37f4..2ff09635c0d 100644
--- a/addons/web_calendar/i18n/hr.po
+++ b/addons/web_calendar/i18n/hr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/hu.po b/addons/web_calendar/i18n/hu.po
index 8bbc7e4f0c1..1fd1e381dc1 100644
--- a/addons/web_calendar/i18n/hu.po
+++ b/addons/web_calendar/i18n/hu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/id.po b/addons/web_calendar/i18n/id.po
index 320c0f0297c..7f5edbbd39c 100644
--- a/addons/web_calendar/i18n/id.po
+++ b/addons/web_calendar/i18n/id.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/it.po b/addons/web_calendar/i18n/it.po
index 47e0ad21e96..63e9957024c 100644
--- a/addons/web_calendar/i18n/it.po
+++ b/addons/web_calendar/i18n/it.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/ja.po b/addons/web_calendar/i18n/ja.po
index e69686c4ed7..b4c7f2cbe96 100644
--- a/addons/web_calendar/i18n/ja.po
+++ b/addons/web_calendar/i18n/ja.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/ka.po b/addons/web_calendar/i18n/ka.po
index 23a81c7a810..03553375fff 100644
--- a/addons/web_calendar/i18n/ka.po
+++ b/addons/web_calendar/i18n/ka.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/ko.po b/addons/web_calendar/i18n/ko.po
index b67f98e5055..3278787ff08 100644
--- a/addons/web_calendar/i18n/ko.po
+++ b/addons/web_calendar/i18n/ko.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/lt.po b/addons/web_calendar/i18n/lt.po
index 4d65ae241ba..52f1904b857 100644
--- a/addons/web_calendar/i18n/lt.po
+++ b/addons/web_calendar/i18n/lt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/mk.po b/addons/web_calendar/i18n/mk.po
index f32dd46f91a..9ee5c438cfa 100644
--- a/addons/web_calendar/i18n/mk.po
+++ b/addons/web_calendar/i18n/mk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/mn.po b/addons/web_calendar/i18n/mn.po
index 87914133ead..bdbfffc401f 100644
--- a/addons/web_calendar/i18n/mn.po
+++ b/addons/web_calendar/i18n/mn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/nb.po b/addons/web_calendar/i18n/nb.po
index 58c8480e536..e605c205438 100644
--- a/addons/web_calendar/i18n/nb.po
+++ b/addons/web_calendar/i18n/nb.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/nl.po b/addons/web_calendar/i18n/nl.po
index 3722495cc21..117602111d3 100644
--- a/addons/web_calendar/i18n/nl.po
+++ b/addons/web_calendar/i18n/nl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/nl_BE.po b/addons/web_calendar/i18n/nl_BE.po
index 930da35a59e..ec73ef575f5 100644
--- a/addons/web_calendar/i18n/nl_BE.po
+++ b/addons/web_calendar/i18n/nl_BE.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/pl.po b/addons/web_calendar/i18n/pl.po
index a80a30108dd..7e27cf716c5 100644
--- a/addons/web_calendar/i18n/pl.po
+++ b/addons/web_calendar/i18n/pl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/pt.po b/addons/web_calendar/i18n/pt.po
index 7e17d1ba69a..90307520600 100644
--- a/addons/web_calendar/i18n/pt.po
+++ b/addons/web_calendar/i18n/pt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/pt_BR.po b/addons/web_calendar/i18n/pt_BR.po
index 45e98329075..97c78f26da8 100644
--- a/addons/web_calendar/i18n/pt_BR.po
+++ b/addons/web_calendar/i18n/pt_BR.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/ro.po b/addons/web_calendar/i18n/ro.po
index 30741e26cdd..18500027290 100644
--- a/addons/web_calendar/i18n/ro.po
+++ b/addons/web_calendar/i18n/ro.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/ru.po b/addons/web_calendar/i18n/ru.po
index 024dbeab2d3..abaace93cc4 100644
--- a/addons/web_calendar/i18n/ru.po
+++ b/addons/web_calendar/i18n/ru.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/sk.po b/addons/web_calendar/i18n/sk.po
index 8cef9c5ed82..af354d08c11 100644
--- a/addons/web_calendar/i18n/sk.po
+++ b/addons/web_calendar/i18n/sk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/sl.po b/addons/web_calendar/i18n/sl.po
index d1828217f79..afcbe4d99ff 100644
--- a/addons/web_calendar/i18n/sl.po
+++ b/addons/web_calendar/i18n/sl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/sq.po b/addons/web_calendar/i18n/sq.po
index e6f46e23ea3..f7a41553d08 100644
--- a/addons/web_calendar/i18n/sq.po
+++ b/addons/web_calendar/i18n/sq.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/sr@latin.po b/addons/web_calendar/i18n/sr@latin.po
index acfb34a91b2..2610e8458c2 100644
--- a/addons/web_calendar/i18n/sr@latin.po
+++ b/addons/web_calendar/i18n/sr@latin.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/sv.po b/addons/web_calendar/i18n/sv.po
index 0066437c458..441504bb851 100644
--- a/addons/web_calendar/i18n/sv.po
+++ b/addons/web_calendar/i18n/sv.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/th.po b/addons/web_calendar/i18n/th.po
index 6ad4d9df824..2db72e36520 100644
--- a/addons/web_calendar/i18n/th.po
+++ b/addons/web_calendar/i18n/th.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/tr.po b/addons/web_calendar/i18n/tr.po
index b518da9f548..31bbd887076 100644
--- a/addons/web_calendar/i18n/tr.po
+++ b/addons/web_calendar/i18n/tr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/uk.po b/addons/web_calendar/i18n/uk.po
index b8a6d728eb7..3f30266f435 100644
--- a/addons/web_calendar/i18n/uk.po
+++ b/addons/web_calendar/i18n/uk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_calendar/i18n/zh_CN.po b/addons/web_calendar/i18n/zh_CN.po
index 130e9a01846..eb9bb48ca1c 100644
--- a/addons/web_calendar/i18n/zh_CN.po
+++ b/addons/web_calendar/i18n/zh_CN.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_calendar
#. openerp-web
diff --git a/addons/web_diagram/i18n/ar.po b/addons/web_diagram/i18n/ar.po
index 755ac969f7f..25786185222 100644
--- a/addons/web_diagram/i18n/ar.po
+++ b/addons/web_diagram/i18n/ar.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/bg.po b/addons/web_diagram/i18n/bg.po
index c46ad3f5447..086468e10c0 100644
--- a/addons/web_diagram/i18n/bg.po
+++ b/addons/web_diagram/i18n/bg.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/bn.po b/addons/web_diagram/i18n/bn.po
index 4f5fb33dc9c..c267239a8f0 100644
--- a/addons/web_diagram/i18n/bn.po
+++ b/addons/web_diagram/i18n/bn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/bs.po b/addons/web_diagram/i18n/bs.po
index be21b5409ac..91357ef09eb 100644
--- a/addons/web_diagram/i18n/bs.po
+++ b/addons/web_diagram/i18n/bs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/ca.po b/addons/web_diagram/i18n/ca.po
index f180cce3f12..bc7ba1214a5 100644
--- a/addons/web_diagram/i18n/ca.po
+++ b/addons/web_diagram/i18n/ca.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/cs.po b/addons/web_diagram/i18n/cs.po
index 3d57fbe00d4..c30a98e8a6e 100644
--- a/addons/web_diagram/i18n/cs.po
+++ b/addons/web_diagram/i18n/cs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
"X-Poedit-Language: Czech\n"
#. module: web_diagram
diff --git a/addons/web_diagram/i18n/da.po b/addons/web_diagram/i18n/da.po
index 7ccadff5528..b79ed79f6eb 100644
--- a/addons/web_diagram/i18n/da.po
+++ b/addons/web_diagram/i18n/da.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/de.po b/addons/web_diagram/i18n/de.po
index 45bb621c68f..46684fda7b1 100644
--- a/addons/web_diagram/i18n/de.po
+++ b/addons/web_diagram/i18n/de.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/en_AU.po b/addons/web_diagram/i18n/en_AU.po
index 15fcc73434d..636427133b9 100644
--- a/addons/web_diagram/i18n/en_AU.po
+++ b/addons/web_diagram/i18n/en_AU.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/en_GB.po b/addons/web_diagram/i18n/en_GB.po
index 760ee1df14c..1af6210ddfb 100644
--- a/addons/web_diagram/i18n/en_GB.po
+++ b/addons/web_diagram/i18n/en_GB.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/es.po b/addons/web_diagram/i18n/es.po
index 101a9fbab34..73e44f42ea8 100644
--- a/addons/web_diagram/i18n/es.po
+++ b/addons/web_diagram/i18n/es.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/es_CL.po b/addons/web_diagram/i18n/es_CL.po
index b1568069712..dd773c4e1ca 100644
--- a/addons/web_diagram/i18n/es_CL.po
+++ b/addons/web_diagram/i18n/es_CL.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/es_CR.po b/addons/web_diagram/i18n/es_CR.po
index 22d56aa24bd..741e4fd577c 100644
--- a/addons/web_diagram/i18n/es_CR.po
+++ b/addons/web_diagram/i18n/es_CR.po
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
"Language: es\n"
#. module: web_diagram
diff --git a/addons/web_diagram/i18n/es_DO.po b/addons/web_diagram/i18n/es_DO.po
index e36236947d3..ff0dcc7093b 100644
--- a/addons/web_diagram/i18n/es_DO.po
+++ b/addons/web_diagram/i18n/es_DO.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/es_EC.po b/addons/web_diagram/i18n/es_EC.po
index 9aaf352ec02..1139a38aeb0 100644
--- a/addons/web_diagram/i18n/es_EC.po
+++ b/addons/web_diagram/i18n/es_EC.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/es_MX.po b/addons/web_diagram/i18n/es_MX.po
index eab5d2ccffd..85e60629808 100644
--- a/addons/web_diagram/i18n/es_MX.po
+++ b/addons/web_diagram/i18n/es_MX.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/et.po b/addons/web_diagram/i18n/et.po
index 9ad89a04fab..2d178846ef4 100644
--- a/addons/web_diagram/i18n/et.po
+++ b/addons/web_diagram/i18n/et.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/fa.po b/addons/web_diagram/i18n/fa.po
index 9acefaec8bc..30f4acab8d9 100644
--- a/addons/web_diagram/i18n/fa.po
+++ b/addons/web_diagram/i18n/fa.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/fi.po b/addons/web_diagram/i18n/fi.po
index 66e4fb101db..9e12c0847c3 100644
--- a/addons/web_diagram/i18n/fi.po
+++ b/addons/web_diagram/i18n/fi.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/fr.po b/addons/web_diagram/i18n/fr.po
index 0c269bd494e..14288068f3f 100644
--- a/addons/web_diagram/i18n/fr.po
+++ b/addons/web_diagram/i18n/fr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/gl.po b/addons/web_diagram/i18n/gl.po
index fd81b6f2b0a..9d2d22addbb 100644
--- a/addons/web_diagram/i18n/gl.po
+++ b/addons/web_diagram/i18n/gl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/gu.po b/addons/web_diagram/i18n/gu.po
index 0ef783c9ff9..9172cf00234 100644
--- a/addons/web_diagram/i18n/gu.po
+++ b/addons/web_diagram/i18n/gu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/hr.po b/addons/web_diagram/i18n/hr.po
index f36fe9ea4f0..6ede8c0a84d 100644
--- a/addons/web_diagram/i18n/hr.po
+++ b/addons/web_diagram/i18n/hr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/hu.po b/addons/web_diagram/i18n/hu.po
index 7b97b3bf363..48269ef12fb 100644
--- a/addons/web_diagram/i18n/hu.po
+++ b/addons/web_diagram/i18n/hu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/id.po b/addons/web_diagram/i18n/id.po
index 98db868ebb0..673b45cb2b6 100644
--- a/addons/web_diagram/i18n/id.po
+++ b/addons/web_diagram/i18n/id.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/it.po b/addons/web_diagram/i18n/it.po
index a3e5ace0a81..85a7b93916f 100644
--- a/addons/web_diagram/i18n/it.po
+++ b/addons/web_diagram/i18n/it.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/ja.po b/addons/web_diagram/i18n/ja.po
index 03a3f2e9c32..663021bb223 100644
--- a/addons/web_diagram/i18n/ja.po
+++ b/addons/web_diagram/i18n/ja.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/ka.po b/addons/web_diagram/i18n/ka.po
index 3b9ce5de41e..759c489ee62 100644
--- a/addons/web_diagram/i18n/ka.po
+++ b/addons/web_diagram/i18n/ka.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/ko.po b/addons/web_diagram/i18n/ko.po
index 2b038dd9613..4d5f3c2f77d 100644
--- a/addons/web_diagram/i18n/ko.po
+++ b/addons/web_diagram/i18n/ko.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/lt.po b/addons/web_diagram/i18n/lt.po
index bf4f519acad..076d5a5fe88 100644
--- a/addons/web_diagram/i18n/lt.po
+++ b/addons/web_diagram/i18n/lt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/mk.po b/addons/web_diagram/i18n/mk.po
index ec1e8f00276..f458b470c87 100644
--- a/addons/web_diagram/i18n/mk.po
+++ b/addons/web_diagram/i18n/mk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/mn.po b/addons/web_diagram/i18n/mn.po
index 1e0e1c44e65..9d7f2bda669 100644
--- a/addons/web_diagram/i18n/mn.po
+++ b/addons/web_diagram/i18n/mn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/nb.po b/addons/web_diagram/i18n/nb.po
index f1368bbd48c..28eeb8d5848 100644
--- a/addons/web_diagram/i18n/nb.po
+++ b/addons/web_diagram/i18n/nb.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/nl.po b/addons/web_diagram/i18n/nl.po
index 6a9b8a293cf..da35271a752 100644
--- a/addons/web_diagram/i18n/nl.po
+++ b/addons/web_diagram/i18n/nl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/nl_BE.po b/addons/web_diagram/i18n/nl_BE.po
index 815a1ecfdc7..f1c773e7ad7 100644
--- a/addons/web_diagram/i18n/nl_BE.po
+++ b/addons/web_diagram/i18n/nl_BE.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/pl.po b/addons/web_diagram/i18n/pl.po
index b9fb840ead1..368e795980d 100644
--- a/addons/web_diagram/i18n/pl.po
+++ b/addons/web_diagram/i18n/pl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/pt.po b/addons/web_diagram/i18n/pt.po
index 3ae0d07f48d..27e8b416972 100644
--- a/addons/web_diagram/i18n/pt.po
+++ b/addons/web_diagram/i18n/pt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/pt_BR.po b/addons/web_diagram/i18n/pt_BR.po
index 4955f37924b..2247207c000 100644
--- a/addons/web_diagram/i18n/pt_BR.po
+++ b/addons/web_diagram/i18n/pt_BR.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/ro.po b/addons/web_diagram/i18n/ro.po
index 0bf56e38c60..7d201870640 100644
--- a/addons/web_diagram/i18n/ro.po
+++ b/addons/web_diagram/i18n/ro.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/ru.po b/addons/web_diagram/i18n/ru.po
index 4e894322a52..53c37d466d1 100644
--- a/addons/web_diagram/i18n/ru.po
+++ b/addons/web_diagram/i18n/ru.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/sl.po b/addons/web_diagram/i18n/sl.po
index 351e6ec834a..08132c69e84 100644
--- a/addons/web_diagram/i18n/sl.po
+++ b/addons/web_diagram/i18n/sl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/sq.po b/addons/web_diagram/i18n/sq.po
index b1d86252b94..e6150ec75b4 100644
--- a/addons/web_diagram/i18n/sq.po
+++ b/addons/web_diagram/i18n/sq.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/sr@latin.po b/addons/web_diagram/i18n/sr@latin.po
index 8d6592796fa..54310a0b833 100644
--- a/addons/web_diagram/i18n/sr@latin.po
+++ b/addons/web_diagram/i18n/sr@latin.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/sv.po b/addons/web_diagram/i18n/sv.po
index 0169a0e50cb..bfab9ed6e70 100644
--- a/addons/web_diagram/i18n/sv.po
+++ b/addons/web_diagram/i18n/sv.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/th.po b/addons/web_diagram/i18n/th.po
index 09cfcf75987..05d3ba1d9ea 100644
--- a/addons/web_diagram/i18n/th.po
+++ b/addons/web_diagram/i18n/th.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/tr.po b/addons/web_diagram/i18n/tr.po
index da747f0df4c..e25ccd423ea 100644
--- a/addons/web_diagram/i18n/tr.po
+++ b/addons/web_diagram/i18n/tr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/zh_CN.po b/addons/web_diagram/i18n/zh_CN.po
index b015ffe9f08..1cc5a23a3e7 100644
--- a/addons/web_diagram/i18n/zh_CN.po
+++ b/addons/web_diagram/i18n/zh_CN.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_diagram/i18n/zh_TW.po b/addons/web_diagram/i18n/zh_TW.po
index 69654e9626f..40e4400331a 100644
--- a/addons/web_diagram/i18n/zh_TW.po
+++ b/addons/web_diagram/i18n/zh_TW.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_diagram
#. openerp-web
diff --git a/addons/web_gantt/i18n/ar.po b/addons/web_gantt/i18n/ar.po
index 47f534e2290..fabd85fb1a2 100644
--- a/addons/web_gantt/i18n/ar.po
+++ b/addons/web_gantt/i18n/ar.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/bg.po b/addons/web_gantt/i18n/bg.po
index 2ece5cd719f..982a4b6c180 100644
--- a/addons/web_gantt/i18n/bg.po
+++ b/addons/web_gantt/i18n/bg.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/bn.po b/addons/web_gantt/i18n/bn.po
index ad97add1220..5a876902586 100644
--- a/addons/web_gantt/i18n/bn.po
+++ b/addons/web_gantt/i18n/bn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/bs.po b/addons/web_gantt/i18n/bs.po
index 8f1ce9c2c4c..6953a80f139 100644
--- a/addons/web_gantt/i18n/bs.po
+++ b/addons/web_gantt/i18n/bs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/ca.po b/addons/web_gantt/i18n/ca.po
index 09e4f4c3bb3..bf116ed3967 100644
--- a/addons/web_gantt/i18n/ca.po
+++ b/addons/web_gantt/i18n/ca.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/cs.po b/addons/web_gantt/i18n/cs.po
index a9338becd94..498ba886b2f 100644
--- a/addons/web_gantt/i18n/cs.po
+++ b/addons/web_gantt/i18n/cs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
"X-Poedit-Language: Czech\n"
#. module: web_gantt
diff --git a/addons/web_gantt/i18n/da.po b/addons/web_gantt/i18n/da.po
index a7ceb564d57..eb42f74f107 100644
--- a/addons/web_gantt/i18n/da.po
+++ b/addons/web_gantt/i18n/da.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/de.po b/addons/web_gantt/i18n/de.po
index 814519e231d..3197a582bf1 100644
--- a/addons/web_gantt/i18n/de.po
+++ b/addons/web_gantt/i18n/de.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/en_AU.po b/addons/web_gantt/i18n/en_AU.po
index 5f0f02f4892..c1ed1ecc2ae 100644
--- a/addons/web_gantt/i18n/en_AU.po
+++ b/addons/web_gantt/i18n/en_AU.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/en_GB.po b/addons/web_gantt/i18n/en_GB.po
index d35b0ac2f3d..3a02bee99c5 100644
--- a/addons/web_gantt/i18n/en_GB.po
+++ b/addons/web_gantt/i18n/en_GB.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/es.po b/addons/web_gantt/i18n/es.po
index 78452628a66..54fcc2c2f55 100644
--- a/addons/web_gantt/i18n/es.po
+++ b/addons/web_gantt/i18n/es.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/es_CL.po b/addons/web_gantt/i18n/es_CL.po
index 0eeb1efd9a2..b54fcb1db33 100644
--- a/addons/web_gantt/i18n/es_CL.po
+++ b/addons/web_gantt/i18n/es_CL.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/es_CR.po b/addons/web_gantt/i18n/es_CR.po
index abf56971670..ee464c3f3b0 100644
--- a/addons/web_gantt/i18n/es_CR.po
+++ b/addons/web_gantt/i18n/es_CR.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/es_DO.po b/addons/web_gantt/i18n/es_DO.po
index 35bd342db31..11f9a443ab4 100644
--- a/addons/web_gantt/i18n/es_DO.po
+++ b/addons/web_gantt/i18n/es_DO.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/es_EC.po b/addons/web_gantt/i18n/es_EC.po
index 7e3eb51ab3e..afe4487377b 100644
--- a/addons/web_gantt/i18n/es_EC.po
+++ b/addons/web_gantt/i18n/es_EC.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/es_MX.po b/addons/web_gantt/i18n/es_MX.po
index a54e81eddfe..299e88832c9 100644
--- a/addons/web_gantt/i18n/es_MX.po
+++ b/addons/web_gantt/i18n/es_MX.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/et.po b/addons/web_gantt/i18n/et.po
index b8df187679a..534296b6ac1 100644
--- a/addons/web_gantt/i18n/et.po
+++ b/addons/web_gantt/i18n/et.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/fa.po b/addons/web_gantt/i18n/fa.po
index c59646d23ea..90b0fd0bda7 100644
--- a/addons/web_gantt/i18n/fa.po
+++ b/addons/web_gantt/i18n/fa.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/fi.po b/addons/web_gantt/i18n/fi.po
index 690e1f8761a..66030a75ac5 100644
--- a/addons/web_gantt/i18n/fi.po
+++ b/addons/web_gantt/i18n/fi.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/fr.po b/addons/web_gantt/i18n/fr.po
index 105b1cd99a1..a2ef6ed00e9 100644
--- a/addons/web_gantt/i18n/fr.po
+++ b/addons/web_gantt/i18n/fr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/gl.po b/addons/web_gantt/i18n/gl.po
index bfdeb11b9aa..4d7834812fb 100644
--- a/addons/web_gantt/i18n/gl.po
+++ b/addons/web_gantt/i18n/gl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/gu.po b/addons/web_gantt/i18n/gu.po
index 344b6ac1926..11f332f7610 100644
--- a/addons/web_gantt/i18n/gu.po
+++ b/addons/web_gantt/i18n/gu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/hr.po b/addons/web_gantt/i18n/hr.po
index 649746bd91b..facb9d58d8f 100644
--- a/addons/web_gantt/i18n/hr.po
+++ b/addons/web_gantt/i18n/hr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/hu.po b/addons/web_gantt/i18n/hu.po
index accfa22c950..06ec4dd9a7d 100644
--- a/addons/web_gantt/i18n/hu.po
+++ b/addons/web_gantt/i18n/hu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/it.po b/addons/web_gantt/i18n/it.po
index 3a15f882f48..4ace315f171 100644
--- a/addons/web_gantt/i18n/it.po
+++ b/addons/web_gantt/i18n/it.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/ja.po b/addons/web_gantt/i18n/ja.po
index 1c0eceae712..f51deff2262 100644
--- a/addons/web_gantt/i18n/ja.po
+++ b/addons/web_gantt/i18n/ja.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/ka.po b/addons/web_gantt/i18n/ka.po
index 2e4761321f2..1814ff278a1 100644
--- a/addons/web_gantt/i18n/ka.po
+++ b/addons/web_gantt/i18n/ka.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/ko.po b/addons/web_gantt/i18n/ko.po
index b1c19ecc8e2..594cb5b7e62 100644
--- a/addons/web_gantt/i18n/ko.po
+++ b/addons/web_gantt/i18n/ko.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/lo.po b/addons/web_gantt/i18n/lo.po
index 40d778423ff..6b67a2d66b4 100644
--- a/addons/web_gantt/i18n/lo.po
+++ b/addons/web_gantt/i18n/lo.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/lt.po b/addons/web_gantt/i18n/lt.po
index 86ba2dc10cb..062157cfdbb 100644
--- a/addons/web_gantt/i18n/lt.po
+++ b/addons/web_gantt/i18n/lt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/mk.po b/addons/web_gantt/i18n/mk.po
index 8212f3615a2..7016e5d42f2 100644
--- a/addons/web_gantt/i18n/mk.po
+++ b/addons/web_gantt/i18n/mk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/mn.po b/addons/web_gantt/i18n/mn.po
index 9b2dd27e27b..edad6a38270 100644
--- a/addons/web_gantt/i18n/mn.po
+++ b/addons/web_gantt/i18n/mn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/nb.po b/addons/web_gantt/i18n/nb.po
index 1b39ebfbe15..b2c83db1374 100644
--- a/addons/web_gantt/i18n/nb.po
+++ b/addons/web_gantt/i18n/nb.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/nl.po b/addons/web_gantt/i18n/nl.po
index 29bd235583b..8cd2121fe16 100644
--- a/addons/web_gantt/i18n/nl.po
+++ b/addons/web_gantt/i18n/nl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/nl_BE.po b/addons/web_gantt/i18n/nl_BE.po
index 5bc98e4235d..cc4b5a063ef 100644
--- a/addons/web_gantt/i18n/nl_BE.po
+++ b/addons/web_gantt/i18n/nl_BE.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/pl.po b/addons/web_gantt/i18n/pl.po
index 8df58772b6a..ad863fa0080 100644
--- a/addons/web_gantt/i18n/pl.po
+++ b/addons/web_gantt/i18n/pl.po
@@ -9,13 +9,13 @@ msgstr ""
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2012-07-04 17:56+0000\n"
-"Last-Translator: Piotr Łęgosz \n"
+"Last-Translator: pml \n"
"Language-Team: Polish \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/pt.po b/addons/web_gantt/i18n/pt.po
index eeac0a30df6..7ee33df32cc 100644
--- a/addons/web_gantt/i18n/pt.po
+++ b/addons/web_gantt/i18n/pt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/pt_BR.po b/addons/web_gantt/i18n/pt_BR.po
index c90d1c90576..cbcacc2ff81 100644
--- a/addons/web_gantt/i18n/pt_BR.po
+++ b/addons/web_gantt/i18n/pt_BR.po
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/ro.po b/addons/web_gantt/i18n/ro.po
index 92fb5ccd78b..ed0e79efabd 100644
--- a/addons/web_gantt/i18n/ro.po
+++ b/addons/web_gantt/i18n/ro.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/ru.po b/addons/web_gantt/i18n/ru.po
index c34789c8411..afcfc9c51dd 100644
--- a/addons/web_gantt/i18n/ru.po
+++ b/addons/web_gantt/i18n/ru.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/sl.po b/addons/web_gantt/i18n/sl.po
index 6addb352092..c514902c771 100644
--- a/addons/web_gantt/i18n/sl.po
+++ b/addons/web_gantt/i18n/sl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/sq.po b/addons/web_gantt/i18n/sq.po
index 1994ad03438..133b71f36c7 100644
--- a/addons/web_gantt/i18n/sq.po
+++ b/addons/web_gantt/i18n/sq.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/sr@latin.po b/addons/web_gantt/i18n/sr@latin.po
index edc702bdeb1..44c53ac1d7c 100644
--- a/addons/web_gantt/i18n/sr@latin.po
+++ b/addons/web_gantt/i18n/sr@latin.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/sv.po b/addons/web_gantt/i18n/sv.po
index 45201f745ea..3ffee969892 100644
--- a/addons/web_gantt/i18n/sv.po
+++ b/addons/web_gantt/i18n/sv.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/th.po b/addons/web_gantt/i18n/th.po
index fb4ba83b294..ea2c6063008 100644
--- a/addons/web_gantt/i18n/th.po
+++ b/addons/web_gantt/i18n/th.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/tr.po b/addons/web_gantt/i18n/tr.po
index 7eddeaac6cd..b3c8521ed37 100644
--- a/addons/web_gantt/i18n/tr.po
+++ b/addons/web_gantt/i18n/tr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_gantt/i18n/zh_CN.po b/addons/web_gantt/i18n/zh_CN.po
index 48e5aacc627..200545398c1 100644
--- a/addons/web_gantt/i18n/zh_CN.po
+++ b/addons/web_gantt/i18n/zh_CN.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_gantt
#. openerp-web
diff --git a/addons/web_graph/i18n/ar.po b/addons/web_graph/i18n/ar.po
index 6288293145c..3089c48fb6e 100644
--- a/addons/web_graph/i18n/ar.po
+++ b/addons/web_graph/i18n/ar.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/bg.po b/addons/web_graph/i18n/bg.po
index cf3eae08697..fa8fbd85f4a 100644
--- a/addons/web_graph/i18n/bg.po
+++ b/addons/web_graph/i18n/bg.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/bn.po b/addons/web_graph/i18n/bn.po
index bcbe8a128fc..44da69f9ac8 100644
--- a/addons/web_graph/i18n/bn.po
+++ b/addons/web_graph/i18n/bn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/bs.po b/addons/web_graph/i18n/bs.po
index dabf4706c08..ecdf236efda 100644
--- a/addons/web_graph/i18n/bs.po
+++ b/addons/web_graph/i18n/bs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/ca.po b/addons/web_graph/i18n/ca.po
index 79be0748525..136fb3b23ef 100644
--- a/addons/web_graph/i18n/ca.po
+++ b/addons/web_graph/i18n/ca.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/cs.po b/addons/web_graph/i18n/cs.po
index 3e2f5c285c2..8561f6fcda1 100644
--- a/addons/web_graph/i18n/cs.po
+++ b/addons/web_graph/i18n/cs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/da.po b/addons/web_graph/i18n/da.po
index a04cabe2cb8..889221c6aca 100644
--- a/addons/web_graph/i18n/da.po
+++ b/addons/web_graph/i18n/da.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/de.po b/addons/web_graph/i18n/de.po
index 89a21457667..5c6f4e77ce8 100644
--- a/addons/web_graph/i18n/de.po
+++ b/addons/web_graph/i18n/de.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/en_AU.po b/addons/web_graph/i18n/en_AU.po
index 4d68ce77aa7..394c962be3b 100644
--- a/addons/web_graph/i18n/en_AU.po
+++ b/addons/web_graph/i18n/en_AU.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/en_GB.po b/addons/web_graph/i18n/en_GB.po
index 316d56d8e10..6c9b1cccbd1 100644
--- a/addons/web_graph/i18n/en_GB.po
+++ b/addons/web_graph/i18n/en_GB.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/es.po b/addons/web_graph/i18n/es.po
index 58fc3911f38..170a59e9132 100644
--- a/addons/web_graph/i18n/es.po
+++ b/addons/web_graph/i18n/es.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/es_CL.po b/addons/web_graph/i18n/es_CL.po
index b6dae64b8ec..c04e487e7e4 100644
--- a/addons/web_graph/i18n/es_CL.po
+++ b/addons/web_graph/i18n/es_CL.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/es_CR.po b/addons/web_graph/i18n/es_CR.po
index be1011d1b95..ffd0e4b2384 100644
--- a/addons/web_graph/i18n/es_CR.po
+++ b/addons/web_graph/i18n/es_CR.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/es_DO.po b/addons/web_graph/i18n/es_DO.po
index ab9e68cb2bd..b8276fe2194 100644
--- a/addons/web_graph/i18n/es_DO.po
+++ b/addons/web_graph/i18n/es_DO.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/es_EC.po b/addons/web_graph/i18n/es_EC.po
index 98d6ca4c1e2..dede9bd15cb 100644
--- a/addons/web_graph/i18n/es_EC.po
+++ b/addons/web_graph/i18n/es_EC.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/es_MX.po b/addons/web_graph/i18n/es_MX.po
index 4fa2459b734..d2020c11d7d 100644
--- a/addons/web_graph/i18n/es_MX.po
+++ b/addons/web_graph/i18n/es_MX.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/et.po b/addons/web_graph/i18n/et.po
index 31438e94766..ca9be853081 100644
--- a/addons/web_graph/i18n/et.po
+++ b/addons/web_graph/i18n/et.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/fa.po b/addons/web_graph/i18n/fa.po
index 1dd41285df2..2acb190ba7f 100644
--- a/addons/web_graph/i18n/fa.po
+++ b/addons/web_graph/i18n/fa.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/fi.po b/addons/web_graph/i18n/fi.po
index dd2f1e3a419..0ad0d139404 100644
--- a/addons/web_graph/i18n/fi.po
+++ b/addons/web_graph/i18n/fi.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/fr.po b/addons/web_graph/i18n/fr.po
index 42afdcc23a5..61f72eeb949 100644
--- a/addons/web_graph/i18n/fr.po
+++ b/addons/web_graph/i18n/fr.po
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/fr_CA.po b/addons/web_graph/i18n/fr_CA.po
index 5cf63b38aeb..262a5e6b500 100644
--- a/addons/web_graph/i18n/fr_CA.po
+++ b/addons/web_graph/i18n/fr_CA.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/gl.po b/addons/web_graph/i18n/gl.po
index 2d14f8fef30..049a972ec08 100644
--- a/addons/web_graph/i18n/gl.po
+++ b/addons/web_graph/i18n/gl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/gu.po b/addons/web_graph/i18n/gu.po
index d238cae28e9..d076a4e128a 100644
--- a/addons/web_graph/i18n/gu.po
+++ b/addons/web_graph/i18n/gu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/hr.po b/addons/web_graph/i18n/hr.po
index 13670f6de6d..473a929abb5 100644
--- a/addons/web_graph/i18n/hr.po
+++ b/addons/web_graph/i18n/hr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/hu.po b/addons/web_graph/i18n/hu.po
index 7855fdf2b94..2e3cb5e62bf 100644
--- a/addons/web_graph/i18n/hu.po
+++ b/addons/web_graph/i18n/hu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/it.po b/addons/web_graph/i18n/it.po
index 234d0022d69..13a7c31b6ec 100644
--- a/addons/web_graph/i18n/it.po
+++ b/addons/web_graph/i18n/it.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/ja.po b/addons/web_graph/i18n/ja.po
index f67e147f044..a1136f2d5b5 100644
--- a/addons/web_graph/i18n/ja.po
+++ b/addons/web_graph/i18n/ja.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/ka.po b/addons/web_graph/i18n/ka.po
index 810f726ba36..2e223a4ef71 100644
--- a/addons/web_graph/i18n/ka.po
+++ b/addons/web_graph/i18n/ka.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/ko.po b/addons/web_graph/i18n/ko.po
index 64607dbe204..9e0ba91bbf3 100644
--- a/addons/web_graph/i18n/ko.po
+++ b/addons/web_graph/i18n/ko.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/lt.po b/addons/web_graph/i18n/lt.po
index c3e4543886c..b4794b6ee97 100644
--- a/addons/web_graph/i18n/lt.po
+++ b/addons/web_graph/i18n/lt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/mk.po b/addons/web_graph/i18n/mk.po
index e0cc4696830..cc7a57f2a2f 100644
--- a/addons/web_graph/i18n/mk.po
+++ b/addons/web_graph/i18n/mk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/mn.po b/addons/web_graph/i18n/mn.po
index 9b7c9fd2cea..799724821c3 100644
--- a/addons/web_graph/i18n/mn.po
+++ b/addons/web_graph/i18n/mn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/nb.po b/addons/web_graph/i18n/nb.po
index 0121c44666d..c4cb36be02c 100644
--- a/addons/web_graph/i18n/nb.po
+++ b/addons/web_graph/i18n/nb.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/nl.po b/addons/web_graph/i18n/nl.po
index 11cebefc756..5091098f1df 100644
--- a/addons/web_graph/i18n/nl.po
+++ b/addons/web_graph/i18n/nl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/nl_BE.po b/addons/web_graph/i18n/nl_BE.po
index b2d08460c9b..ed4e040221c 100644
--- a/addons/web_graph/i18n/nl_BE.po
+++ b/addons/web_graph/i18n/nl_BE.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/pl.po b/addons/web_graph/i18n/pl.po
index 7cce17bda58..803b1c921de 100644
--- a/addons/web_graph/i18n/pl.po
+++ b/addons/web_graph/i18n/pl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/pt.po b/addons/web_graph/i18n/pt.po
index b16565e68c2..0a459226a3c 100644
--- a/addons/web_graph/i18n/pt.po
+++ b/addons/web_graph/i18n/pt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/pt_BR.po b/addons/web_graph/i18n/pt_BR.po
index f911909301d..f6e5a73ca03 100644
--- a/addons/web_graph/i18n/pt_BR.po
+++ b/addons/web_graph/i18n/pt_BR.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/ro.po b/addons/web_graph/i18n/ro.po
index a8c294e5a88..a4fd2bfcf06 100644
--- a/addons/web_graph/i18n/ro.po
+++ b/addons/web_graph/i18n/ro.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/ru.po b/addons/web_graph/i18n/ru.po
index f30f980fb5e..8090ae44976 100644
--- a/addons/web_graph/i18n/ru.po
+++ b/addons/web_graph/i18n/ru.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/sl.po b/addons/web_graph/i18n/sl.po
index f555be60c44..5eb51b616ae 100644
--- a/addons/web_graph/i18n/sl.po
+++ b/addons/web_graph/i18n/sl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/sq.po b/addons/web_graph/i18n/sq.po
index 0b965a7cc12..32b75227892 100644
--- a/addons/web_graph/i18n/sq.po
+++ b/addons/web_graph/i18n/sq.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/sr@latin.po b/addons/web_graph/i18n/sr@latin.po
index aedf3f9a8a8..39d2deb3935 100644
--- a/addons/web_graph/i18n/sr@latin.po
+++ b/addons/web_graph/i18n/sr@latin.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/sv.po b/addons/web_graph/i18n/sv.po
index 65e66e3782a..088bf22fdc4 100644
--- a/addons/web_graph/i18n/sv.po
+++ b/addons/web_graph/i18n/sv.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/th.po b/addons/web_graph/i18n/th.po
index 0cf32536b67..c092d06888f 100644
--- a/addons/web_graph/i18n/th.po
+++ b/addons/web_graph/i18n/th.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/tr.po b/addons/web_graph/i18n/tr.po
index c6ede706898..5af1ae8b253 100644
--- a/addons/web_graph/i18n/tr.po
+++ b/addons/web_graph/i18n/tr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_graph/i18n/zh_CN.po b/addons/web_graph/i18n/zh_CN.po
index 47344b1fa1b..4ecc5c57e78 100644
--- a/addons/web_graph/i18n/zh_CN.po
+++ b/addons/web_graph/i18n/zh_CN.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_graph
#. openerp-web
diff --git a/addons/web_kanban/i18n/ar.po b/addons/web_kanban/i18n/ar.po
index 0a1043fe0ad..e265ae4d6e6 100644
--- a/addons/web_kanban/i18n/ar.po
+++ b/addons/web_kanban/i18n/ar.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/bg.po b/addons/web_kanban/i18n/bg.po
index 7ad5069c490..a409a870971 100644
--- a/addons/web_kanban/i18n/bg.po
+++ b/addons/web_kanban/i18n/bg.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/bn.po b/addons/web_kanban/i18n/bn.po
index d2f4518a199..b3e82e949fc 100644
--- a/addons/web_kanban/i18n/bn.po
+++ b/addons/web_kanban/i18n/bn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/bs.po b/addons/web_kanban/i18n/bs.po
index 26223b9cc36..4ce8d13f87e 100644
--- a/addons/web_kanban/i18n/bs.po
+++ b/addons/web_kanban/i18n/bs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/ca.po b/addons/web_kanban/i18n/ca.po
index 370ff3d6134..a3b40065ba4 100644
--- a/addons/web_kanban/i18n/ca.po
+++ b/addons/web_kanban/i18n/ca.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/cs.po b/addons/web_kanban/i18n/cs.po
index d17fe219d55..b0dd811314a 100644
--- a/addons/web_kanban/i18n/cs.po
+++ b/addons/web_kanban/i18n/cs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
"X-Poedit-Language: Czech\n"
#. module: web_kanban
diff --git a/addons/web_kanban/i18n/da.po b/addons/web_kanban/i18n/da.po
index 0d372fd12ea..75de649859a 100644
--- a/addons/web_kanban/i18n/da.po
+++ b/addons/web_kanban/i18n/da.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/de.po b/addons/web_kanban/i18n/de.po
index d3554e9b244..55dbe9b6bc8 100644
--- a/addons/web_kanban/i18n/de.po
+++ b/addons/web_kanban/i18n/de.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/en_AU.po b/addons/web_kanban/i18n/en_AU.po
index 5d5b6ad4d2a..a22efec2fc4 100644
--- a/addons/web_kanban/i18n/en_AU.po
+++ b/addons/web_kanban/i18n/en_AU.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/en_GB.po b/addons/web_kanban/i18n/en_GB.po
index 468b55bc880..54a74b98045 100644
--- a/addons/web_kanban/i18n/en_GB.po
+++ b/addons/web_kanban/i18n/en_GB.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/es.po b/addons/web_kanban/i18n/es.po
index 84257a80258..631409855a3 100644
--- a/addons/web_kanban/i18n/es.po
+++ b/addons/web_kanban/i18n/es.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/es_CL.po b/addons/web_kanban/i18n/es_CL.po
index 65aeac23ea0..3f031ef915b 100644
--- a/addons/web_kanban/i18n/es_CL.po
+++ b/addons/web_kanban/i18n/es_CL.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/es_CR.po b/addons/web_kanban/i18n/es_CR.po
index 6d7c38e92db..5e3725f5213 100644
--- a/addons/web_kanban/i18n/es_CR.po
+++ b/addons/web_kanban/i18n/es_CR.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/es_DO.po b/addons/web_kanban/i18n/es_DO.po
index 152391d3c80..6ea74053b88 100644
--- a/addons/web_kanban/i18n/es_DO.po
+++ b/addons/web_kanban/i18n/es_DO.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/es_EC.po b/addons/web_kanban/i18n/es_EC.po
index 816894737ca..ad18fb01d11 100644
--- a/addons/web_kanban/i18n/es_EC.po
+++ b/addons/web_kanban/i18n/es_EC.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/es_MX.po b/addons/web_kanban/i18n/es_MX.po
index 9d15ce9a3f8..38681e0d6ae 100644
--- a/addons/web_kanban/i18n/es_MX.po
+++ b/addons/web_kanban/i18n/es_MX.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/et.po b/addons/web_kanban/i18n/et.po
index c39987ce88a..f2be36ce449 100644
--- a/addons/web_kanban/i18n/et.po
+++ b/addons/web_kanban/i18n/et.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/fa.po b/addons/web_kanban/i18n/fa.po
index 5234e952894..466c659a87b 100644
--- a/addons/web_kanban/i18n/fa.po
+++ b/addons/web_kanban/i18n/fa.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/fi.po b/addons/web_kanban/i18n/fi.po
index cd0e01ca0a5..24ab21c8899 100644
--- a/addons/web_kanban/i18n/fi.po
+++ b/addons/web_kanban/i18n/fi.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/fr.po b/addons/web_kanban/i18n/fr.po
index f8aba2a6904..399a368de33 100644
--- a/addons/web_kanban/i18n/fr.po
+++ b/addons/web_kanban/i18n/fr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/fr_CA.po b/addons/web_kanban/i18n/fr_CA.po
index 2f15ea252c0..88b8ab3e66a 100644
--- a/addons/web_kanban/i18n/fr_CA.po
+++ b/addons/web_kanban/i18n/fr_CA.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/gl.po b/addons/web_kanban/i18n/gl.po
index ae3456093cb..373d48c16ca 100644
--- a/addons/web_kanban/i18n/gl.po
+++ b/addons/web_kanban/i18n/gl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/gu.po b/addons/web_kanban/i18n/gu.po
index 65cd5d1461a..536b9f9e057 100644
--- a/addons/web_kanban/i18n/gu.po
+++ b/addons/web_kanban/i18n/gu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/hr.po b/addons/web_kanban/i18n/hr.po
index 6719e24f71c..701e171bb66 100644
--- a/addons/web_kanban/i18n/hr.po
+++ b/addons/web_kanban/i18n/hr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/hu.po b/addons/web_kanban/i18n/hu.po
index 82f996f927c..c8787426a7f 100644
--- a/addons/web_kanban/i18n/hu.po
+++ b/addons/web_kanban/i18n/hu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/it.po b/addons/web_kanban/i18n/it.po
index 23b8f326669..51d40563162 100644
--- a/addons/web_kanban/i18n/it.po
+++ b/addons/web_kanban/i18n/it.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/ja.po b/addons/web_kanban/i18n/ja.po
index 3eecf66e3f1..8afaa23e38d 100644
--- a/addons/web_kanban/i18n/ja.po
+++ b/addons/web_kanban/i18n/ja.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/ka.po b/addons/web_kanban/i18n/ka.po
index 6f91eae9341..e2c660f822e 100644
--- a/addons/web_kanban/i18n/ka.po
+++ b/addons/web_kanban/i18n/ka.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/ko.po b/addons/web_kanban/i18n/ko.po
index 63e6e623a06..c807b2b6732 100644
--- a/addons/web_kanban/i18n/ko.po
+++ b/addons/web_kanban/i18n/ko.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/lt.po b/addons/web_kanban/i18n/lt.po
index 07564e50b15..4150cd29a7a 100644
--- a/addons/web_kanban/i18n/lt.po
+++ b/addons/web_kanban/i18n/lt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/mk.po b/addons/web_kanban/i18n/mk.po
index 888a2a84e37..82fc53d4ca7 100644
--- a/addons/web_kanban/i18n/mk.po
+++ b/addons/web_kanban/i18n/mk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/mn.po b/addons/web_kanban/i18n/mn.po
index e84b719041d..d9c4d0c3980 100644
--- a/addons/web_kanban/i18n/mn.po
+++ b/addons/web_kanban/i18n/mn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/nb.po b/addons/web_kanban/i18n/nb.po
index cc13bc80fd9..3897959a168 100644
--- a/addons/web_kanban/i18n/nb.po
+++ b/addons/web_kanban/i18n/nb.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/nl.po b/addons/web_kanban/i18n/nl.po
index e99aa74f27c..66d39fb6c4a 100644
--- a/addons/web_kanban/i18n/nl.po
+++ b/addons/web_kanban/i18n/nl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:42+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/nl_BE.po b/addons/web_kanban/i18n/nl_BE.po
index 20e33cb45cf..7fe08358601 100644
--- a/addons/web_kanban/i18n/nl_BE.po
+++ b/addons/web_kanban/i18n/nl_BE.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/pl.po b/addons/web_kanban/i18n/pl.po
index 84108faaed4..952dfa2864d 100644
--- a/addons/web_kanban/i18n/pl.po
+++ b/addons/web_kanban/i18n/pl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/pt.po b/addons/web_kanban/i18n/pt.po
index bafc9b2e35c..be42e67c411 100644
--- a/addons/web_kanban/i18n/pt.po
+++ b/addons/web_kanban/i18n/pt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/pt_BR.po b/addons/web_kanban/i18n/pt_BR.po
index 80158712751..316d5c5da08 100644
--- a/addons/web_kanban/i18n/pt_BR.po
+++ b/addons/web_kanban/i18n/pt_BR.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/ro.po b/addons/web_kanban/i18n/ro.po
index df237f1d82e..1d6db5705df 100644
--- a/addons/web_kanban/i18n/ro.po
+++ b/addons/web_kanban/i18n/ro.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/ru.po b/addons/web_kanban/i18n/ru.po
index 7edbc1a7e3d..d2b9d2fa857 100644
--- a/addons/web_kanban/i18n/ru.po
+++ b/addons/web_kanban/i18n/ru.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/sl.po b/addons/web_kanban/i18n/sl.po
index 48c0713cf09..e2bee4efdf9 100644
--- a/addons/web_kanban/i18n/sl.po
+++ b/addons/web_kanban/i18n/sl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/sr@latin.po b/addons/web_kanban/i18n/sr@latin.po
index 1db9bf66940..54188de7aed 100644
--- a/addons/web_kanban/i18n/sr@latin.po
+++ b/addons/web_kanban/i18n/sr@latin.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/sv.po b/addons/web_kanban/i18n/sv.po
index c8ef6d32dc3..9e88bf0731b 100644
--- a/addons/web_kanban/i18n/sv.po
+++ b/addons/web_kanban/i18n/sv.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/th.po b/addons/web_kanban/i18n/th.po
index 21e9886fe8d..d74f0d34a83 100644
--- a/addons/web_kanban/i18n/th.po
+++ b/addons/web_kanban/i18n/th.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/tr.po b/addons/web_kanban/i18n/tr.po
index cad498f0d58..57debda502a 100644
--- a/addons/web_kanban/i18n/tr.po
+++ b/addons/web_kanban/i18n/tr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/zh_CN.po b/addons/web_kanban/i18n/zh_CN.po
index 316c907a7c6..200b817d7ef 100644
--- a/addons/web_kanban/i18n/zh_CN.po
+++ b/addons/web_kanban/i18n/zh_CN.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_kanban/i18n/zh_TW.po b/addons/web_kanban/i18n/zh_TW.po
index efc7249abb8..91a571fc9fe 100644
--- a/addons/web_kanban/i18n/zh_TW.po
+++ b/addons/web_kanban/i18n/zh_TW.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_kanban
#. openerp-web
diff --git a/addons/web_view_editor/i18n/ar.po b/addons/web_view_editor/i18n/ar.po
index 56513c319fb..155bc5f8349 100644
--- a/addons/web_view_editor/i18n/ar.po
+++ b/addons/web_view_editor/i18n/ar.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/cs.po b/addons/web_view_editor/i18n/cs.po
index f57c5d6a4fe..21c0fcb1849 100644
--- a/addons/web_view_editor/i18n/cs.po
+++ b/addons/web_view_editor/i18n/cs.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/de.po b/addons/web_view_editor/i18n/de.po
index 7fa7125b036..f13f03e55ad 100644
--- a/addons/web_view_editor/i18n/de.po
+++ b/addons/web_view_editor/i18n/de.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/en_AU.po b/addons/web_view_editor/i18n/en_AU.po
index 60ecb50169a..693a73bf867 100644
--- a/addons/web_view_editor/i18n/en_AU.po
+++ b/addons/web_view_editor/i18n/en_AU.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/es.po b/addons/web_view_editor/i18n/es.po
index 04447ad04d7..dc1330f3160 100644
--- a/addons/web_view_editor/i18n/es.po
+++ b/addons/web_view_editor/i18n/es.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/es_DO.po b/addons/web_view_editor/i18n/es_DO.po
index 2aa5567f65b..25f56822d4d 100644
--- a/addons/web_view_editor/i18n/es_DO.po
+++ b/addons/web_view_editor/i18n/es_DO.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/es_EC.po b/addons/web_view_editor/i18n/es_EC.po
index ead034e2d42..624e328607d 100644
--- a/addons/web_view_editor/i18n/es_EC.po
+++ b/addons/web_view_editor/i18n/es_EC.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/es_MX.po b/addons/web_view_editor/i18n/es_MX.po
index 1f38fe34585..fba1102507a 100644
--- a/addons/web_view_editor/i18n/es_MX.po
+++ b/addons/web_view_editor/i18n/es_MX.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/et.po b/addons/web_view_editor/i18n/et.po
index ef912ca06fa..0fe251a2baa 100644
--- a/addons/web_view_editor/i18n/et.po
+++ b/addons/web_view_editor/i18n/et.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/fa.po b/addons/web_view_editor/i18n/fa.po
index ea7e5980cbc..877bbe23516 100644
--- a/addons/web_view_editor/i18n/fa.po
+++ b/addons/web_view_editor/i18n/fa.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/fi.po b/addons/web_view_editor/i18n/fi.po
index 2d33d0e0c1f..97d28a79591 100644
--- a/addons/web_view_editor/i18n/fi.po
+++ b/addons/web_view_editor/i18n/fi.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/fr.po b/addons/web_view_editor/i18n/fr.po
index 5d028e2dcb3..bd0638ed89d 100644
--- a/addons/web_view_editor/i18n/fr.po
+++ b/addons/web_view_editor/i18n/fr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/hr.po b/addons/web_view_editor/i18n/hr.po
index eaa0e9857b3..c961d3cb44d 100644
--- a/addons/web_view_editor/i18n/hr.po
+++ b/addons/web_view_editor/i18n/hr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/hu.po b/addons/web_view_editor/i18n/hu.po
index b5c773bc248..c4894c1d518 100644
--- a/addons/web_view_editor/i18n/hu.po
+++ b/addons/web_view_editor/i18n/hu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/it.po b/addons/web_view_editor/i18n/it.po
index a53f19757f3..3fb93bb48d7 100644
--- a/addons/web_view_editor/i18n/it.po
+++ b/addons/web_view_editor/i18n/it.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/ko.po b/addons/web_view_editor/i18n/ko.po
index 0c8c4fc1b29..cd4ec6efa10 100644
--- a/addons/web_view_editor/i18n/ko.po
+++ b/addons/web_view_editor/i18n/ko.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/lt.po b/addons/web_view_editor/i18n/lt.po
index d0135e34442..f9d5df5d718 100644
--- a/addons/web_view_editor/i18n/lt.po
+++ b/addons/web_view_editor/i18n/lt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/lv.po b/addons/web_view_editor/i18n/lv.po
index add734292cc..d82f330993b 100644
--- a/addons/web_view_editor/i18n/lv.po
+++ b/addons/web_view_editor/i18n/lv.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/mk.po b/addons/web_view_editor/i18n/mk.po
index dbae3bb93f7..aee1de859aa 100644
--- a/addons/web_view_editor/i18n/mk.po
+++ b/addons/web_view_editor/i18n/mk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/mn.po b/addons/web_view_editor/i18n/mn.po
index 70df762972a..6891ec254b5 100644
--- a/addons/web_view_editor/i18n/mn.po
+++ b/addons/web_view_editor/i18n/mn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/nb.po b/addons/web_view_editor/i18n/nb.po
index 9aa8154f963..3d4668bd376 100644
--- a/addons/web_view_editor/i18n/nb.po
+++ b/addons/web_view_editor/i18n/nb.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/nl.po b/addons/web_view_editor/i18n/nl.po
index 663563d9ab3..3c99fba5875 100644
--- a/addons/web_view_editor/i18n/nl.po
+++ b/addons/web_view_editor/i18n/nl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/nl_BE.po b/addons/web_view_editor/i18n/nl_BE.po
index abba11fd271..7628dcd40d6 100644
--- a/addons/web_view_editor/i18n/nl_BE.po
+++ b/addons/web_view_editor/i18n/nl_BE.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/pl.po b/addons/web_view_editor/i18n/pl.po
index 8dbbdcee490..56eb620b5c8 100644
--- a/addons/web_view_editor/i18n/pl.po
+++ b/addons/web_view_editor/i18n/pl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/pt.po b/addons/web_view_editor/i18n/pt.po
index c3845399efc..e31c56785db 100644
--- a/addons/web_view_editor/i18n/pt.po
+++ b/addons/web_view_editor/i18n/pt.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/pt_BR.po b/addons/web_view_editor/i18n/pt_BR.po
index 4bea58a31c2..3fcdf6f589e 100644
--- a/addons/web_view_editor/i18n/pt_BR.po
+++ b/addons/web_view_editor/i18n/pt_BR.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/ro.po b/addons/web_view_editor/i18n/ro.po
index 349e317034d..c1359293a81 100644
--- a/addons/web_view_editor/i18n/ro.po
+++ b/addons/web_view_editor/i18n/ro.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/ru.po b/addons/web_view_editor/i18n/ru.po
index c46b79217ea..016a01e06f8 100644
--- a/addons/web_view_editor/i18n/ru.po
+++ b/addons/web_view_editor/i18n/ru.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/sl.po b/addons/web_view_editor/i18n/sl.po
index 005b1853a41..015599aa9e0 100644
--- a/addons/web_view_editor/i18n/sl.po
+++ b/addons/web_view_editor/i18n/sl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/th.po b/addons/web_view_editor/i18n/th.po
index c445353ae38..2d0c1e666ca 100644
--- a/addons/web_view_editor/i18n/th.po
+++ b/addons/web_view_editor/i18n/th.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/tr.po b/addons/web_view_editor/i18n/tr.po
index ca3fb2baea9..ccb8fbfb197 100644
--- a/addons/web_view_editor/i18n/tr.po
+++ b/addons/web_view_editor/i18n/tr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
diff --git a/addons/web_view_editor/i18n/zh_CN.po b/addons/web_view_editor/i18n/zh_CN.po
index 3bb66e1dc2a..475282df942 100644
--- a/addons/web_view_editor/i18n/zh_CN.po
+++ b/addons/web_view_editor/i18n/zh_CN.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-07-17 06:43+0000\n"
-"X-Generator: Launchpad (build 16696)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:09+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: web_view_editor
#. openerp-web
From 494c12d8fcdff0c4bd1afc02e06957c9c4b56fab Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Wed, 31 Jul 2013 12:20:37 +0200
Subject: [PATCH 33/61] [IMP] Added compass compilation to grunt file
bzr revid: nicolas.vanhoren@openerp.com-20130731102037-ai9ldek3vaph27l8
---
addons/web/Gruntfile.js | 20 ++++++++++++++++++++
addons/web/package.json | 4 +++-
2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/addons/web/Gruntfile.js b/addons/web/Gruntfile.js
index 81c41c86001..54112dae3a0 100644
--- a/addons/web/Gruntfile.js
+++ b/addons/web/Gruntfile.js
@@ -8,11 +8,31 @@ module.exports = function(grunt) {
evil: true, //eval
laxbreak: true, //unsafe line breaks
},
+ },
+ sass: {
+ dev: {
+ options: {
+ style: "expanded",
+ },
+ files: {
+ "static/src/css/base.css": "static/src/css/base.sass",
+ }
+ }
+ },
+ watch: {
+ sass: {
+ files: ["static/src/css/base.sass"],
+ tasks: ['sass']
+ },
}
});
grunt.loadNpmTasks('grunt-contrib-jshint');
+ grunt.loadNpmTasks('grunt-contrib-sass');
+ grunt.loadNpmTasks('grunt-contrib-watch');
+ grunt.registerTask('gen', ["sass"]);
+ grunt.registerTask('watcher', ["gen", "watch"]);
grunt.registerTask('test', []);
grunt.registerTask('default', ['jshint']);
diff --git a/addons/web/package.json b/addons/web/package.json
index 3ce6500a077..cce1f2ad28f 100644
--- a/addons/web/package.json
+++ b/addons/web/package.json
@@ -1,6 +1,8 @@
{
"devDependencies": {
"grunt": "*",
- "grunt-contrib-jshint": "*"
+ "grunt-contrib-jshint": "*",
+ "grunt-contrib-sass": "~0.4.1",
+ "grunt-contrib-watch": "~0.5.1"
}
}
From 4ec2906626f2848c3651321295e2980bc288e5ba Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Wed, 31 Jul 2013 15:19:33 +0200
Subject: [PATCH 34/61] [FIX] attempt to solve false-positive in js tests on
the runbot
bzr revid: nicolas.vanhoren@openerp.com-20130731131933-ur5vdahgnbjsj16o
---
addons/web/static/test/search.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js
index 3941c3ccdfe..333b28607bb 100644
--- a/addons/web/static/test/search.js
+++ b/addons/web/static/test/search.js
@@ -1132,7 +1132,7 @@ openerp.testing.section('search.groupby', {
return f instanceof instance.web.search.GroupbyGroup;
});
ok(group, "should have a GroupbyGroup input");
- strictEqual(group.getParent(), view,
+ strictEqual(group.__parentedParent, view,
"group's parent should be view");
group.toggle(group.filters[0]);
From 46869ba52dede1779e41c8deb6efc50cde938f36 Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Wed, 31 Jul 2013 15:35:04 +0200
Subject: [PATCH 35/61] [FIX] desactivated test creating random false positive
bzr revid: nicolas.vanhoren@openerp.com-20130731133504-vt2fx11jziyad47e
---
addons/web/static/test/search.js | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js
index 333b28607bb..611cbf806cb 100644
--- a/addons/web/static/test/search.js
+++ b/addons/web/static/test/search.js
@@ -1104,7 +1104,8 @@ openerp.testing.section('search.groupby', {
rpc: 'mock',
templates: true,
}, function (test) {
- test('basic', {
+ // temporarily desactivated to stop raising random false positive on the runbot
+ /*test('basic', {
asserts: 7,
setup: function (instance, $s, mock) {
mock('dummy.model:fields_view_get', function () {
@@ -1150,7 +1151,7 @@ openerp.testing.section('search.groupby', {
"{'group_by': 'baz'}"
], "should have sequence of contexts");
});
- });
+ });*/
test('unified multiple groupby groups', {
asserts: 4,
setup: function (instance, $s, mock) {
From 3c0d11271eff5896de98f4af91c17d7e04a2c900 Mon Sep 17 00:00:00 2001
From: Raphael Collet
Date: Wed, 31 Jul 2013 15:58:14 +0200
Subject: [PATCH 36/61] [IMP] doc: improve workflow documentation
bzr revid: rco@openerp.com-20130731135814-386v5w6rkc40kwwv
---
doc/workflows.rst | 284 +++++++++++++++++++++++-----------------------
1 file changed, 144 insertions(+), 140 deletions(-)
diff --git a/doc/workflows.rst b/doc/workflows.rst
index 293b2c347c0..86ba78d0275 100644
--- a/doc/workflows.rst
+++ b/doc/workflows.rst
@@ -3,24 +3,29 @@
Workflows
=========
-A workflow is a directed graph where the nodes are called "activities" and the
-arcs are called "transitions".
+In OpenERP, a workflow is a technical artefact to manage a set of "things to do"
+associated to the records of some data model. The workflow provides a higher-
+level way to organize the things to do on a record.
+
+More specifically, a workflow is a directed graph where the nodes are called
+"activities" and the arcs are called "transitions".
- Activities define work that should be done within the OpenERP server, such as
- changing the state of some records, or sending mails.
+ changing the state of some records, or sending emails.
-- Transitions control how the workflow will go from activities to activities.
+- Transitions control how the workflow progresses from activity to activity.
-When defining a workflow, one can attach conditions, signals, and triggers to
-transitions, so that the behavior of the workflow can depend on user actions
-(such as clicking on a button), changes to records, or arbitrary Python code.
+In the definition of a workflow, one can attach conditions, signals, and
+triggers to transitions, so that the behavior of the workflow depends on user
+actions (such as clicking on a button), changes to records, or arbitrary Python
+code.
Basics
------
Defining a workflow with data files is straightforward: a record "workflow" is
-needed together with records for the activities and the transitions. For
-instance here is a simple sequence of two activities defined in XML::
+given together with records for the activities and the transitions. For
+instance, here is a simple sequence of two activities defined in XML::
test.workflow
@@ -49,81 +54,82 @@ instance here is a simple sequence of two activities defined in XML::
A worfklow is always defined with respect to a particular model (the model is
-given through the ``osv`` attribute on the ``workflow`` model). Methods
-specified in the activities or transitions will be called on that model.
+given by attribute ``osv`` on the model ``workflow``). Methods specified in the
+activities or transitions will be called on that model.
In the example code above, a workflow called "test_workflow" is created. It is
made up of two activies, named "a" and "b", and one transition, going from "a"
to "b".
-The first activity has its ``flow_start`` attribute set to True so that OpenERP
-knows where to start the workflow when it is instanciated. Because
-``on_create`` is set to True on the workflow record, the workflow is
+The first activity has its attribute ``flow_start`` set to ``True`` so that
+OpenERP knows where to start the workflow traversal after it is instanciated.
+Because ``on_create`` is set to True on the workflow record, the workflow is
instanciated for each newly created record. (Otherwise, the workflow should be
-created by other means, such as from some module Python code.)
+instanciated by other means, such as from some module Python code.)
-When the workflow is instanciated, it will start by the "a" activity. That
-activity is of kind ``function`` which means the action ``print_a()`` is a
-method to be called on the ``test.workflow`` model (the usual ``cr, uid, ids,
-context`` arguments are passed for you).
+When the workflow is instanciated, it begins with activity "a". That activity is
+of kind ``function``, which means that the action ``print_a()`` is method call
+on the model ``test.workflow`` (the usual ``cr, uid, ids, context`` arguments
+are passed for you).
-The transition between "a" and "b" does not specify any conditions. This means
-the workflow instance will immediately progress from "a" to "b" (after "a" has
-been processed), and thus also process the "b" activity.
+The transition between "a" and "b" does not specify any condition. This means
+that the workflow instance immediately goes from "a" to "b" after "a" has been
+processed, and thus also processes activity "b".
Transitions
-----------
Transitions provide the control structures to orchestrate a workflow. When an
-activity is completed, the workflow engine will try to get across transitions
-departing from the completed activity, towards the next activities. In their
-simplest form they just link activities from one to the others (as in the
-example above), and activities are processed as soon as the activities
-preceding them are completed.
+activity is completed, the workflow engine tries to get across transitions
+departing from the completed activity, towards the next activities. In their
+simplest form (as in the example above), they link activities sequentially:
+activities are processed as soon as the activities preceding them are completed.
-But instead of running all activities in one fell swoop, it is also possible to
-block on transitions, going through them only when some criteria are met. Such
-criteria are the conditions, the signals, and the triggers. They are detailed
-in the next sections.
+Instead of running all activities in one fell swoop, it is also possible to wait
+on transitions, going through them only when some criteria are met. The criteria
+are the conditions, the signals, and the triggers. They are detailed in the
+following sections.
Conditions
''''''''''
-When an activity has been completed, its outgoing transitions will be inspected
-to see if it is possible for the workflow instance to proceed through them and
-reach the next activities. When only a condition is defined (i.e. no signal or
-trigger is defined), the condition is evaluated by OpenERP, and if it evaluates
-to ``True``, the worklfow instance will go through.
+When an activity has been completed, its outgoing transitions are inspected to
+determine whether it is possible for the workflow instance to proceed through
+them and reach the next activities. When only a condition is defined (i.e., no
+signal or trigger is defined), the condition is evaluated by OpenERP, and if it
+evaluates to ``True``, the worklfow instance progresses through the transition.
+If the condition is not met, it will be reevaluated every time the associated
+record is modified, or by an explicit method call to do it.
-By default, the ``condition`` attribute (i.e. the expression to be evaluated)
-is just "True", which will trivially evaluate to ``True``.
-
-Actually, the condition can be several lines long, and the value of the last
-one will be used to test if the transition can be taken.
+By default, the attribute ``condition`` (i.e., the expression to be evaluated)
+is just "True", which trivially evaluates to ``True``. Note that the condition
+may be several lines long; in that case, the value of the last one determines
+whether the transition can be taken.
In the condition evaluation environment, several symbols are conveniently
defined:
-- The database cursor (``cr``),
-- the user ID (``uid``), the record ID tied to the workflow instance (``id``),
-- the user ID wrapped in a list (``ids``),
+- the database cursor (``cr``),
+- the user ID (``uid``),
+- the record ID tied to the workflow instance (``id``),
+- the record ID wrapped in a list (``ids``),
- the model name (``model``),
- the model instance (``obj``),
-- all the model column names,
-- and all the record (the one obtained by browsing the provided ID) attributes.
+- all the model column names, and
+- all the browse record's attributes.
Signals
'''''''
-In addition of a condition, a transition can specify a signal name. When such
-signal name is present, the transition will not be taken directly (even if the
-condition evaluates to true). Instead the transition will block, waiting to be
+In addition to a condition, a transition can specify a signal name. When such
+signal name is present, the transition is not taken directly, even if the
+condition evaluates to ``True``. Instead the transition blocks, waiting to be
woken up.
-To wake up a transition with a defined signal name, the signal must be sent to
-the workflow. A common way to send a signal is to use a button in the web
-interface, using the ```` element with the signal name as the ``name``
-attribute of the button.
+In order to wake up a transition with a defined signal name, the signal must be
+sent to the workflow instance. A common way to send a signal is to use a button
+in the user interface, using the element ```` with the signal name as
+the ``name`` attribute of the button. Once the button is clicked,
.. note:: The condition is still evaluated when the signal is sent to the
workflow instance.
@@ -131,22 +137,22 @@ attribute of the button.
Triggers
''''''''
-With conditions that evaluate to false, transitions are not taken (and thus the
-activity it leads to will not be processed). Still, the workflow instance can
-get new chances to progress across that transition by providing so-called
-triggers. The idea is that when the condition fails, triggers are recorded in
-database. Later, it is possible to wake-up specifically the workflow instances
-that installed those triggers, offering them a new chance to evaluation their
-transition conditions. This mechnism makes it cheaper to wake-up workflow
+With conditions that evaluate to ``False``, transitions are not taken (and thus
+the activity it leads to is not processed immediately). Still, the workflow
+instance can get new chances to progress across that transition by providing so-
+called triggers. The idea is that when the condition is not satisfied, triggers
+are recorded in database. Later, it is possible to wake up specifically the
+workflow instances that installed those triggers, offering them to reevaluate
+their transition conditions. This mechanism makes it cheaper to wake up workflow
instances by targetting just a few of them (those that have installed the
triggers) instead of all of them.
Triggers are recorded in database as record IDs (together with the model name)
-and refer to the workflow instance waiting for them. The transition definition
-can thus provide a Python expression (using the ``trigger_model`` attribute)
-that when evaluated will return the record IDs. Unlike the other expressions
-defined on the workflow, this one is evaluated with respect to a model that can
-be chosen on a per-transition basis with the ``trigger_expression`` attribute.
+and refer to the workflow instance waiting for those records. The transition
+definition provides a model name (attribute ``trigger_model``) and a Python
+expression (attribute ``trigger_expression``) that evaluates to a list of record
+IDs in the given model. Any of those records can wake up the workflow instance
+they are associated to.
.. note:: Note that triggers are not re-installed whenever the transition is
re-tried.
@@ -154,128 +160,125 @@ be chosen on a per-transition basis with the ``trigger_expression`` attribute.
Splitting and joining transitions
'''''''''''''''''''''''''''''''''
-When multiple transitions leave the same activity, or lead to the same
-activity, OpenERP provides some control about which transitions will be
-crossed, or how the reached activity will be processed. The ``split_mode`` and
-``join_mode`` attributes on the activity are used for such control.
+When multiple transitions leave the same activity, or lead to the same activity,
+OpenERP provides some control over which transitions are actually taken, or how
+the reached activity will be processed. The attributes ``split_mode`` and
+``join_mode`` on the activity are used for such control. The possible values of
+those attributes are explained below.
Activities
----------
-While the transitions can be seen as the control structure of the workflows,
-activities are the place where everything happen, from changing record states
+While the transitions can be seen as the control structures of the workflows,
+activities are the places where everything happens, from changing record states
to sending email.
-Different kind of activities exist: ``Dummy``, ``Function``, ``Subflow``, and
-``Stop all``; different kind of activities can do different and they are
-detailed below.
-
-In addition to the activity kind, activies have some properties, detailed in
-the next sections.
+Different kinds of activities exist: ``Dummy``, ``Function``, ``Subflow``, and
+``Stop all``, each doing different things when the activity is processed. In
+addition to their kind, activies have other properties, detailed in the next
+sections.
Flow start and flow stop
''''''''''''''''''''''''
-The ``flow_start`` attribute is a boolean value specifying if the activity
-starts the workflow. Multiple activities can have the ``flow_start`` attribute
-set to ``True`` and when instanciating a workflow for a record, OpenERP will
-simply process all of them, and try all their outgoing transitions afterwards.
+The attribute ``flow_start`` is a boolean value specifying whether the activity
+is processed when the workflow is instanciated. Multiple activities can have
+their attribute ``flow_start`` set to ``True``. When instanciating a workflow
+for a record, OpenERP simply processes all of them, and evaluate all their
+outgoing transitions afterwards.
-The ``flow_stop`` attribute is also a boolean value, specifying if the activity
-ends the workflow. A workflow is considered to be completed when all its
-activities with the ``flow_stop`` attribute set to ``True`` are completed.
-
-It is important for OpenERP to know when a workflow instance is completed: a
-workflow can have an activity that is actually another workflow (called a
-subflow) and that activity will be completed only when the subflow is
+The attribute ``flow_stop`` is a boolean value specifying whether the activity
+stops the workflow instance. A workflow instance is considered completed when
+all its activities with the ``flow_stop`` attribute set to ``True`` are
completed.
+It is important for OpenERP to know when a workflow instance is completed. A
+workflow can have an activity that is actually another workflow (called a
+subflow); that activity is completed when the subflow is completed.
+
Subflow
'''''''
An activity can embed a complete workflow, called a subflow (the embedding
workflow is called the parent workflow). The workflow to instanciate is
-specified by the ``subflow_id`` attribute.
+specified by attribute ``subflow_id``.
.. note:: In the GUI, that attribute can not be set unless the kind of the
activity is ``Subflow``.
-The activity will be completed (and its outgoing transitions will be tried)
-when the subflow is completed (see the ``flow_stop`` attribute above to read
-about when a workflow is considered completed by OpenERP).
+The activity is considered completed (and its outgoing transitions ready to be
+evaluated) when the subflow is completed (see attribute ``flow_stop`` above).
Sending a signal from a subflow
'''''''''''''''''''''''''''''''
-When a workflow is used (as a sublfow) in the activity of a (parent) workflow,
-the sublow can send a signal from its own activities to the parent by specifying a
-signal name in the ``signal_send`` attribute. OpenERP will process those
-activities normally and send to the parent workflow instance a signal with
-``signal_send`` value prefixed with ``subflow.``.
+When a workflow is embedded in an activity (as a subflow) of a workflow, the
+sublow can send a signal from its own activities to the parent workflow by
+giving a signal name in attribute ``signal_send``. OpenERP processes those
+activities by sending the value of ``signal_send`` prefixed by "subflow" to the
+parent workflow instance.
-In other words, it is possible to react and take transitions in the parent
+In other words, it is possible to react and get transitions in the parent
workflow as activities are executed in the sublow.
Server actions
''''''''''''''
-An activity can run a "Server Action" by specifying its ID in the ``action_id``
-attribute.
+An activity can run a "Server Action" by specifying its ID in the attribute
+``action_id``.
Python action
'''''''''''''
-An activity can run some Python code, provided through the ``action``
-attribute. See the section about transition conditions to read about the
-evaluation environment.
+An activity can execute some Python code, given by attribute ``action``. The
+evaluation environment is the same as the one explained in the section
+`Conditions`_.
Split mode
''''''''''
-After an activity has been processed, its outgoing transitions will be tried.
-Normally, if a transition can be taken, OpenERP will do it and proceed to the
+After an activity has been processed, its outgoing transitions are evaluated.
+Normally, if a transition can be taken, OpenERP traverses it and proceed to the
activity the transition leads to.
-Actually, when more than a single transition is leaving an activity, OpenERP
-can proceed, or not, depending on the other transitions. That is, the condition
-on the transitions can be combined together, and the combined result will
-instruct OpenERP to cross zero, one, or all the transitions. The way they are
-combined is controlled by the ``split_mode`` attribute.
+Actually, when more than a single transition is leaving an activity, OpenERP may
+proceed or not, depending on the other transitions. That is, the condition on
+the transitions can be combined together, and the combined result instructs
+OpenERP to traverse zero, one, or all the transitions. The way they are combined
+is controlled by the attribute ``split_mode``.
-There are indeed three modes to decide how to combine the transition
-conditions, ``XOR``, ``OR``, and ``AND``.
+There are three possible split modes: ``XOR``, ``OR`` and ``AND``.
``XOR``
When the transitions are combined with a ``XOR`` split mode, as soon as a
- transition with a condition that evaluates to true is found, the
- transition is taken and the other will not be tried.
+ transition has a satisfied condition, the transition is traversed and the
+ others are skipped.
``OR``
- With an ``OR`` mode, all the transitions with a condition that evaluates to
- true are taken. The remaining transitions will not be tried later.
+ With the ``OR`` mode, all the transitions with a satisfied condition are
+ traversed. The remaining transitions will not be evaluated later.
``AND``
- With an ``AND`` mode, OpenERP will wait for all transition conditions to
- evaluate to true, then cross all the transitions at the same time.
+ With the ``AND`` mode, OpenERP will wait for all outgoing transition
+ conditions to be satisfied, then traverse all of them at once.
Join mode
'''''''''
-Just as departing transition conditions can be combined together to decide
-whether they can be taken or not, arriving transitions can be combined together
-to decide if an activity must be run. The attribute to control that behavior is
-called ``join_mode``.
+Just like outgoing transition conditions can be combined together to decide
+whether they can be traversed or not, incoming transitions can be combined
+together to decide if and when an activity may be processed. The attribute
+``join_mode`` controls that behavior.
-The join mode is a bit simpler than the split mode: only two modes are
-provided, ``XOR`` and ``AND``.
+There are two possible join modes: ``XOR`` and ``AND``.
``XOR``
- An activity with a ``XOR`` join mode will be run as soon as a transition is
- crossed to arrive at the activity.
+ With the ``XOR`` mode, an incoming transition with a satisfied condition is
+ traversed immediately, and enables the processing of the activity.
``AND``
- With an ``AND`` mode, the activity will wait for all its incoming
- transitions to be crossed before being run.
+ With the ``AND`` mode, OpenERP will wait until all incoming transitions have
+ been traversed before enabling the processing of the activity.
Kinds
'''''
@@ -284,24 +287,25 @@ Activities can be of different kinds: ``dummy``, ``function``, ``subflow``, or
``stopall``. The kind defines what type of work an activity can do.
Dummy
- The ``dummy`` kind is for activities that do nothing (i.e. they act as hubs
- to gather/dispatch transitions), or for activities that only call a Server
- Action.
+ The ``dummy`` kind is for activities that do nothing, or for activities that
+ only call a server action. Activities that do nothing can be used as hubs to
+ gather/dispatch transitions.
Function
The ``function`` kind is for activities that only need to run some Python
- code, and possibly a Server Action.
+ code, and possibly a server action.
Stop all
- The ``stopall`` kind is for activities that will completely halt the
- workflow instance. In addition they can also run some Python code.
+ The ``stopall`` kind is for activities that will completely stop the
+ workflow instance and mark it as completed. In addition they can also run
+ some Python code.
Subflow
- When the kind of the activity is ``subflow``, the activity will run
- another workflow. When the sub-workflow is completed, the activity will also be
+ When the kind of the activity is ``subflow``, the activity embeds another
+ workflow instance. When the subflow is completed, the activity is also
considered completed.
- Normally the sub-workflow is instanciated for the same record as the parent
- workflow. It is possible to change that default behavior by providing
- Python code that has to return a record ID for which a workflow has been
- instanciated.
+ By default, the subflow is instanciated for the same record as the parent
+ workflow. It is possible to change that behavior by providing Python code
+ that returns a record ID (of the same data model as the subflow). The
+ embedded subflow instance is then the one of the given record.
From 245b009a0bbffc49a8d06f4ad12a93b4302827e4 Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Wed, 31 Jul 2013 16:41:29 +0200
Subject: [PATCH 37/61] [FIX] avoid error message in the web client when we go
on the Apps menu, replace it with a warning message explaining that the apps
is not working currently
bzr revid: nicolas.vanhoren@openerp.com-20130731144129-x9po16ihtbp4rj8m
---
openerp/addons/base/static/src/js/apps.js | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/openerp/addons/base/static/src/js/apps.js b/openerp/addons/base/static/src/js/apps.js
index eaaca6b13c3..f877e9258b1 100644
--- a/openerp/addons/base/static/src/js/apps.js
+++ b/openerp/addons/base/static/src/js/apps.js
@@ -92,7 +92,8 @@ openerp.base = function(instance) {
start: function() {
var self = this;
- return self.get_client().
+ // desactivated for now because apps does not work anyway due to changes in the framework
+ /*return self.get_client().
done(function(client) {
client.replace(self.$el).
done(function() {
@@ -100,13 +101,13 @@ openerp.base = function(instance) {
client.do_action(self.remote_action_id, {hide_breadcrumb: true});
});
}).
- fail(function(client) {
+ fail(function(client) {*/
self.do_warn(_t('OpenERP Apps Unreachable'), _t('Showing locally available modules'), true);
self.rpc('/web/action/load', {action_id: self.failback_action_id}).done(function(action) {
self.do_action(action);
instance.webclient.menu.open_action(action.id);
});
- });
+ //});
},
});
From 3d1d7ee39cd9e82c0499af533ae1e1553c4e3b0a Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Wed, 31 Jul 2013 17:09:43 +0200
Subject: [PATCH 38/61] [DOC] workflows: typos, and removed inaccurate
environment symbols.
bzr revid: vmt@openerp.com-20130731150943-etfvn08fnkhcecvt
---
doc/workflows.rst | 55 +++++++++++++++++++++--------------------------
1 file changed, 25 insertions(+), 30 deletions(-)
diff --git a/doc/workflows.rst b/doc/workflows.rst
index 86ba78d0275..d8ba89bd1ad 100644
--- a/doc/workflows.rst
+++ b/doc/workflows.rst
@@ -54,8 +54,8 @@ instance, here is a simple sequence of two activities defined in XML::
A worfklow is always defined with respect to a particular model (the model is
-given by attribute ``osv`` on the model ``workflow``). Methods specified in the
-activities or transitions will be called on that model.
+given by the attribute ``osv`` on the model ``workflow``). Methods specified in
+the activities or transitions will be called on that model.
In the example code above, a workflow called "test_workflow" is created. It is
made up of two activies, named "a" and "b", and one transition, going from "a"
@@ -67,10 +67,10 @@ Because ``on_create`` is set to True on the workflow record, the workflow is
instanciated for each newly created record. (Otherwise, the workflow should be
instanciated by other means, such as from some module Python code.)
-When the workflow is instanciated, it begins with activity "a". That activity is
-of kind ``function``, which means that the action ``print_a()`` is method call
-on the model ``test.workflow`` (the usual ``cr, uid, ids, context`` arguments
-are passed for you).
+When the workflow is instanciated, it begins with activity "a". That activity
+is of kind ``function``, which means that the action ``print_a()`` is a method
+call on the model ``test.workflow`` (the usual ``cr, uid, ids, context``
+arguments are passed for you).
The transition between "a" and "b" does not specify any condition. This means
that the workflow instance immediately goes from "a" to "b" after "a" has been
@@ -107,14 +107,8 @@ may be several lines long; in that case, the value of the last one determines
whether the transition can be taken.
In the condition evaluation environment, several symbols are conveniently
-defined:
+defined (in addition to the OpenERP ``safe_eval`` environment):
-- the database cursor (``cr``),
-- the user ID (``uid``),
-- the record ID tied to the workflow instance (``id``),
-- the record ID wrapped in a list (``ids``),
-- the model name (``model``),
-- the model instance (``obj``),
- all the model column names, and
- all the browse record's attributes.
@@ -122,14 +116,15 @@ Signals
'''''''
In addition to a condition, a transition can specify a signal name. When such
-signal name is present, the transition is not taken directly, even if the
+a signal name is present, the transition is not taken directly, even if the
condition evaluates to ``True``. Instead the transition blocks, waiting to be
woken up.
In order to wake up a transition with a defined signal name, the signal must be
sent to the workflow instance. A common way to send a signal is to use a button
in the user interface, using the element ```` with the signal name as
-the ``name`` attribute of the button. Once the button is clicked,
+the attribute ``name`` of the button. Once the button is clicked, the signal is
+sent to the workflow instance of the current record.
.. note:: The condition is still evaluated when the signal is sent to the
workflow instance.
@@ -139,20 +134,20 @@ Triggers
With conditions that evaluate to ``False``, transitions are not taken (and thus
the activity it leads to is not processed immediately). Still, the workflow
-instance can get new chances to progress across that transition by providing so-
-called triggers. The idea is that when the condition is not satisfied, triggers
-are recorded in database. Later, it is possible to wake up specifically the
-workflow instances that installed those triggers, offering them to reevaluate
-their transition conditions. This mechanism makes it cheaper to wake up workflow
-instances by targetting just a few of them (those that have installed the
-triggers) instead of all of them.
+instance can get new chances to progress across that transition by providing
+so-called triggers. The idea is that when the condition is not satisfied,
+triggers are recorded in database. Later, it is possible to wake up
+specifically the workflow instances that installed those triggers, offering
+them to reevaluate their transition conditions. This mechanism makes it cheaper
+to wake up workflow instances by targetting just a few of them (those that have
+installed the triggers) instead of all of them.
Triggers are recorded in database as record IDs (together with the model name)
and refer to the workflow instance waiting for those records. The transition
definition provides a model name (attribute ``trigger_model``) and a Python
expression (attribute ``trigger_expression``) that evaluates to a list of record
IDs in the given model. Any of those records can wake up the workflow instance
-they are associated to.
+they are associated with.
.. note:: Note that triggers are not re-installed whenever the transition is
re-tried.
@@ -189,7 +184,7 @@ outgoing transitions afterwards.
The attribute ``flow_stop`` is a boolean value specifying whether the activity
stops the workflow instance. A workflow instance is considered completed when
-all its activities with the ``flow_stop`` attribute set to ``True`` are
+all its activities with the attribute ``flow_stop`` set to ``True`` are
completed.
It is important for OpenERP to know when a workflow instance is completed. A
@@ -214,9 +209,9 @@ Sending a signal from a subflow
When a workflow is embedded in an activity (as a subflow) of a workflow, the
sublow can send a signal from its own activities to the parent workflow by
-giving a signal name in attribute ``signal_send``. OpenERP processes those
-activities by sending the value of ``signal_send`` prefixed by "subflow" to the
-parent workflow instance.
+giving a signal name in the attribute ``signal_send``. OpenERP processes those
+activities by sending the value of ``signal_send`` prefixed by "subflow." to
+the parent workflow instance.
In other words, it is possible to react and get transitions in the parent
workflow as activities are executed in the sublow.
@@ -230,8 +225,8 @@ An activity can run a "Server Action" by specifying its ID in the attribute
Python action
'''''''''''''
-An activity can execute some Python code, given by attribute ``action``. The
-evaluation environment is the same as the one explained in the section
+An activity can execute some Python code, given by the attribute ``action``.
+The evaluation environment is the same as the one explained in the section
`Conditions`_.
Split mode
@@ -242,7 +237,7 @@ Normally, if a transition can be taken, OpenERP traverses it and proceed to the
activity the transition leads to.
Actually, when more than a single transition is leaving an activity, OpenERP may
-proceed or not, depending on the other transitions. That is, the condition on
+proceed or not, depending on the other transitions. That is, the conditions on
the transitions can be combined together, and the combined result instructs
OpenERP to traverse zero, one, or all the transitions. The way they are combined
is controlled by the attribute ``split_mode``.
From 07f5e9a4d64fcd8ae33303ff6c367c587d3c6e61 Mon Sep 17 00:00:00 2001
From: Vo Minh Thu
Date: Wed, 31 Jul 2013 17:11:04 +0200
Subject: [PATCH 39/61] [REM] workflows: removed temporary run.py script from
the tests.
bzr revid: vmt@openerp.com-20130731151104-mxo8qu5x12krto0h
---
openerp/tests/addons/test_workflow/run.py | 44 -----------------------
1 file changed, 44 deletions(-)
delete mode 100755 openerp/tests/addons/test_workflow/run.py
diff --git a/openerp/tests/addons/test_workflow/run.py b/openerp/tests/addons/test_workflow/run.py
deleted file mode 100755
index dda955f9ce9..00000000000
--- a/openerp/tests/addons/test_workflow/run.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#! /usr/bin/env python2
-import os
-
-import openerp
-from openerp import SUPERUSER_ID
-
-DATABASE='t'
-
-def configure():
- conf = openerp.tools.config
- conf['addons_path'] = os.path.join(os.path.dirname(os.path.dirname(__file__))) + ",/home/thu/repos/web/trunk/addons"
- conf['log_handler'] = [':CRITICAL']
- openerp.modules.module.initialize_sys_path()
- openerp.netsvc.init_logger()
-
-if __name__ == '__main__':
- configure()
-
- print '> Loading registry `%s`...' % DATABASE
- registry = registry = openerp.registry(DATABASE)
- cr = registry.db.cursor()
- print '< Registry `%s` loaded.' % DATABASE
-
- model = registry['test.workflow.model']
- trigger = registry['test.workflow.trigger']
-
- print '> Creating new record...'
- i = model.create(cr, SUPERUSER_ID, {})
- print '< Record created with ID %s' % i
-
- print '> Calling signal `a-b`...'
- model.signal_workflow(cr, SUPERUSER_ID, [i], 'a-b')
- print '< Signal `a-b` called.'
-
- print '> Triggering associated record...'
- model.trigger(cr, SUPERUSER_ID, [i])
- print '< Associated record triggered.'
-
- print '> Triggering associated record (this time with the condition evaluating to True)...'
- trigger.write(cr, SUPERUSER_ID, [1], {'value': True})
- model.trigger(cr, SUPERUSER_ID)
- print '< Associated record triggered.'
-
- cr.close()
From e57e50fdfac5a0853bad3fd2e2ce6c4ded88ba4a Mon Sep 17 00:00:00 2001
From: Xavier Morel
Date: Thu, 1 Aug 2013 11:11:30 +0200
Subject: [PATCH 40/61] [FIX] unneeded & dangerous start call in async test
bzr revid: xmo@openerp.com-20130801091130-vx7ow7vxifu7ak84
---
addons/web/static/test/rpc.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/addons/web/static/test/rpc.js b/addons/web/static/test/rpc.js
index 410c041633d..0f6067e97a6 100644
--- a/addons/web/static/test/rpc.js
+++ b/addons/web/static/test/rpc.js
@@ -113,7 +113,6 @@ openerp.testing.section('misordered resolution managemeng', {
var done = $.Deferred();
setTimeout(function () {
- start();
// d1 is failed
ok(!done1);
ok(fail1);
From cdee92f9845e32ae4c7b83f7eeb31cc50d203bc4 Mon Sep 17 00:00:00 2001
From: Xavier Morel
Date: Thu, 1 Aug 2013 11:12:39 +0200
Subject: [PATCH 41/61] [IMP] update QUnit to 1.12.0 (doesn't fix issue, adds
features)
bzr revid: xmo@openerp.com-20130801091239-6lz0ya595i226l85
---
addons/web/static/lib/qunit/qunit.css | 27 +-
addons/web/static/lib/qunit/qunit.js | 770 ++++++++++++++++++--------
addons/web/static/src/js/testing.js | 3 +-
3 files changed, 546 insertions(+), 254 deletions(-)
diff --git a/addons/web/static/lib/qunit/qunit.css b/addons/web/static/lib/qunit/qunit.css
index 257b224ff44..7ba3f9a30b8 100644
--- a/addons/web/static/lib/qunit/qunit.css
+++ b/addons/web/static/lib/qunit/qunit.css
@@ -1,11 +1,11 @@
/**
- * QUnit v1.9.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.12.0 - A JavaScript Unit Testing Framework
*
- * http://docs.jquery.com/QUnit
+ * http://qunitjs.com
*
- * Copyright (c) 2012 John Resig, Jörn Zaefferer
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * or GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
*/
/** Font Family and Sizes */
@@ -20,7 +20,7 @@
/** Resets */
-#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
margin: 0;
padding: 0;
}
@@ -67,6 +67,7 @@
padding: 0.5em 0 0.5em 2em;
color: #5E740B;
background-color: #eee;
+ overflow: hidden;
}
#qunit-userAgent {
@@ -76,6 +77,9 @@
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
}
+#qunit-modulefilter-container {
+ float: right;
+}
/** Tests: Pass/Fail */
@@ -107,7 +111,12 @@
color: #000;
}
-#qunit-tests ol {
+#qunit-tests li .runtime {
+ float: right;
+ font-size: smaller;
+}
+
+.qunit-assert-list {
margin-top: 0.5em;
padding: 0.5em;
@@ -118,6 +127,10 @@
-webkit-border-radius: 5px;
}
+.qunit-collapsed {
+ display: none;
+}
+
#qunit-tests table {
border-collapse: collapse;
margin-top: .2em;
diff --git a/addons/web/static/lib/qunit/qunit.js b/addons/web/static/lib/qunit/qunit.js
index 65625336453..c36724e33b2 100644
--- a/addons/web/static/lib/qunit/qunit.js
+++ b/addons/web/static/lib/qunit/qunit.js
@@ -1,35 +1,88 @@
/**
- * QUnit v1.9.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.12.0 - A JavaScript Unit Testing Framework
*
- * http://docs.jquery.com/QUnit
+ * http://qunitjs.com
*
- * Copyright (c) 2012 John Resig, Jörn Zaefferer
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * or GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2013 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * https://jquery.org/license/
*/
(function( window ) {
var QUnit,
+ assert,
config,
onErrorFnPrev,
testId = 0,
fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
toString = Object.prototype.toString,
hasOwn = Object.prototype.hasOwnProperty,
+ // Keep a local reference to Date (GH-283)
+ Date = window.Date,
+ setTimeout = window.setTimeout,
defined = {
- setTimeout: typeof window.setTimeout !== "undefined",
- sessionStorage: (function() {
- var x = "qunit-test-string";
- try {
- sessionStorage.setItem( x, x );
- sessionStorage.removeItem( x );
- return true;
- } catch( e ) {
- return false;
+ setTimeout: typeof window.setTimeout !== "undefined",
+ sessionStorage: (function() {
+ var x = "qunit-test-string";
+ try {
+ sessionStorage.setItem( x, x );
+ sessionStorage.removeItem( x );
+ return true;
+ } catch( e ) {
+ return false;
+ }
+ }())
+ },
+ /**
+ * Provides a normalized error string, correcting an issue
+ * with IE 7 (and prior) where Error.prototype.toString is
+ * not properly implemented
+ *
+ * Based on http://es5.github.com/#x15.11.4.4
+ *
+ * @param {String|Error} error
+ * @return {String} error message
+ */
+ errorString = function( error ) {
+ var name, message,
+ errorString = error.toString();
+ if ( errorString.substring( 0, 7 ) === "[object" ) {
+ name = error.name ? error.name.toString() : "Error";
+ message = error.message ? error.message.toString() : "";
+ if ( name && message ) {
+ return name + ": " + message;
+ } else if ( name ) {
+ return name;
+ } else if ( message ) {
+ return message;
+ } else {
+ return "Error";
+ }
+ } else {
+ return errorString;
}
- }())
-};
+ },
+ /**
+ * Makes a clone of an object using only Array or Object as base,
+ * and copies over the own enumerable properties.
+ *
+ * @param {Object} obj
+ * @return {Object} New object with only the own properties (recursively).
+ */
+ objectValues = function( obj ) {
+ // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
+ /*jshint newcap: false */
+ var key, val,
+ vals = QUnit.is( "array", obj ) ? [] : {};
+ for ( key in obj ) {
+ if ( hasOwn.call( obj, key ) ) {
+ val = obj[key];
+ vals[key] = val === Object(val) ? objectValues(val) : val;
+ }
+ }
+ return vals;
+ };
function Test( settings ) {
extend( this, settings );
@@ -42,11 +95,11 @@ Test.count = 0;
Test.prototype = {
init: function() {
var a, b, li,
- tests = id( "qunit-tests" );
+ tests = id( "qunit-tests" );
if ( tests ) {
b = document.createElement( "strong" );
- b.innerHTML = this.name;
+ b.innerHTML = this.nameHtml;
// `a` initialized at top of scope
a = document.createElement( "a" );
@@ -63,8 +116,16 @@ Test.prototype = {
}
},
setup: function() {
- if ( this.module !== config.previousModule ) {
- if ( config.previousModule ) {
+ if (
+ // Emit moduleStart when we're switching from one module to another
+ this.module !== config.previousModule ||
+ // They could be equal (both undefined) but if the previousModule property doesn't
+ // yet exist it means this is the first test in a suite that isn't wrapped in a
+ // module, in which case we'll just emit a moduleStart event for 'undefined'.
+ // Without this, reporters can get testStart before moduleStart which is a problem.
+ !hasOwn.call( config, "previousModule" )
+ ) {
+ if ( hasOwn.call( config, "previousModule" ) ) {
runLoggingCallbacks( "moduleDone", QUnit, {
name: config.previousModule,
failed: config.moduleStats.bad,
@@ -77,10 +138,6 @@ Test.prototype = {
runLoggingCallbacks( "moduleStart", QUnit, {
name: this.module
});
- } else if ( config.autorun ) {
- runLoggingCallbacks( "moduleStart", QUnit, {
- name: this.module
- });
}
config.current = this;
@@ -90,26 +147,35 @@ Test.prototype = {
teardown: function() {}
}, this.moduleTestEnvironment );
+ this.started = +new Date();
runLoggingCallbacks( "testStart", QUnit, {
name: this.testName,
module: this.module
});
- // allow utility functions to access the current test environment
- // TODO why??
+ /*jshint camelcase:false */
+
+
+ /**
+ * Expose the current test environment.
+ *
+ * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead.
+ */
QUnit.current_testEnvironment = this.testEnvironment;
+ /*jshint camelcase:true */
+
if ( !config.pollution ) {
saveGlobal();
}
if ( config.notrycatch ) {
- this.testEnvironment.setup.call( this.testEnvironment );
+ this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
return;
}
try {
- this.testEnvironment.setup.call( this.testEnvironment );
+ this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
} catch( e ) {
- QUnit.pushFailure( "Setup failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) );
+ QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
}
},
run: function() {
@@ -118,22 +184,28 @@ Test.prototype = {
var running = id( "qunit-testresult" );
if ( running ) {
- running.innerHTML = "Running:
" + this.name;
+ running.innerHTML = "Running:
" + this.nameHtml;
}
if ( this.async ) {
QUnit.stop();
}
+ this.callbackStarted = +new Date();
+
if ( config.notrycatch ) {
this.callback.call( this.testEnvironment, QUnit.assert );
+ this.callbackRuntime = +new Date() - this.callbackStarted;
return;
}
try {
this.callback.call( this.testEnvironment, QUnit.assert );
+ this.callbackRuntime = +new Date() - this.callbackStarted;
} catch( e ) {
- QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + e.message, extractStacktrace( e, 0 ) );
+ this.callbackRuntime = +new Date() - this.callbackStarted;
+
+ QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
// else next test will carry the responsibility
saveGlobal();
@@ -146,38 +218,43 @@ Test.prototype = {
teardown: function() {
config.current = this;
if ( config.notrycatch ) {
- this.testEnvironment.teardown.call( this.testEnvironment );
+ if ( typeof this.callbackRuntime === "undefined" ) {
+ this.callbackRuntime = +new Date() - this.callbackStarted;
+ }
+ this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
return;
} else {
try {
- this.testEnvironment.teardown.call( this.testEnvironment );
+ this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
} catch( e ) {
- QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) );
+ QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
}
}
checkPollution();
},
finish: function() {
config.current = this;
- if ( config.requireExpects && this.expected == null ) {
+ if ( config.requireExpects && this.expected === null ) {
QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
- } else if ( this.expected != null && this.expected != this.assertions.length ) {
+ } else if ( this.expected !== null && this.expected !== this.assertions.length ) {
QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
- } else if ( this.expected == null && !this.assertions.length ) {
+ } else if ( this.expected === null && !this.assertions.length ) {
QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
}
- var assertion, a, b, i, li, ol,
+ var i, assertion, a, b, time, li, ol,
test = this,
good = 0,
bad = 0,
tests = id( "qunit-tests" );
+ this.runtime = +new Date() - this.started;
config.stats.all += this.assertions.length;
config.moduleStats.all += this.assertions.length;
if ( tests ) {
ol = document.createElement( "ol" );
+ ol.className = "qunit-assert-list";
for ( i = 0; i < this.assertions.length; i++ ) {
assertion = this.assertions[i];
@@ -206,22 +283,22 @@ Test.prototype = {
}
if ( bad === 0 ) {
- ol.style.display = "none";
+ addClass( ol, "qunit-collapsed" );
}
// `b` initialized at top of scope
b = document.createElement( "strong" );
- b.innerHTML = this.name + " (" + bad + ", " + good + ", " + this.assertions.length + ")";
+ b.innerHTML = this.nameHtml + " (" + bad + ", " + good + ", " + this.assertions.length + ")";
addEvent(b, "click", function() {
- var next = b.nextSibling.nextSibling,
- display = next.style.display;
- next.style.display = display === "none" ? "block" : "none";
+ var next = b.parentNode.lastChild,
+ collapsed = hasClass( next, "qunit-collapsed" );
+ ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
});
addEvent(b, "dblclick", function( e ) {
var target = e && e.target ? e.target : window.event.srcElement;
- if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) {
+ if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
target = target.parentNode;
}
if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
@@ -229,13 +306,19 @@ Test.prototype = {
}
});
+ // `time` initialized at top of scope
+ time = document.createElement( "span" );
+ time.className = "runtime";
+ time.innerHTML = this.runtime + " ms";
+
// `li` initialized at top of scope
li = id( this.id );
li.className = bad ? "fail" : "pass";
li.removeChild( li.firstChild );
a = li.firstChild;
li.appendChild( b );
- li.appendChild ( a );
+ li.appendChild( a );
+ li.appendChild( time );
li.appendChild( ol );
} else {
@@ -253,7 +336,8 @@ Test.prototype = {
module: this.module,
failed: bad,
passed: this.assertions.length - bad,
- total: this.assertions.length
+ total: this.assertions.length,
+ duration: this.runtime
});
QUnit.reset();
@@ -304,7 +388,8 @@ QUnit = {
// call on start of module test to prepend name to all tests
module: function( name, testEnvironment ) {
config.currentModule = name;
- config.currentModuleTestEnviroment = testEnvironment;
+ config.currentModuleTestEnvironment = testEnvironment;
+ config.modules[name] = true;
},
asyncTest: function( testName, expected, callback ) {
@@ -318,7 +403,7 @@ QUnit = {
test: function( testName, expected, callback, async ) {
var test,
- name = "" + escapeInnerText( testName ) + "";
+ nameHtml = "" + escapeText( testName ) + "";
if ( arguments.length === 2 ) {
callback = expected;
@@ -326,17 +411,17 @@ QUnit = {
}
if ( config.currentModule ) {
- name = "" + config.currentModule + ": " + name;
+ nameHtml = "" + escapeText( config.currentModule ) + ": " + nameHtml;
}
test = new Test({
- name: name,
+ nameHtml: nameHtml,
testName: testName,
expected: expected,
async: async,
callback: callback,
module: config.currentModule,
- moduleTestEnvironment: config.currentModuleTestEnviroment,
+ moduleTestEnvironment: config.currentModuleTestEnvironment,
stack: sourceFromStacktrace( 2 )
});
@@ -347,12 +432,28 @@ QUnit = {
test.queue();
},
- // Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
+ // Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
expect: function( asserts ) {
- config.current.expected = asserts;
+ if (arguments.length === 1) {
+ config.current.expected = asserts;
+ } else {
+ return config.current.expected;
+ }
},
start: function( count ) {
+ // QUnit hasn't been initialized yet.
+ // Note: RequireJS (et al) may delay onLoad
+ if ( config.semaphore === undefined ) {
+ QUnit.begin(function() {
+ // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
+ setTimeout(function() {
+ QUnit.start( count );
+ });
+ });
+ return;
+ }
+
config.semaphore -= count || 1;
// don't start until equal number of stop-calls
if ( config.semaphore > 0 ) {
@@ -360,11 +461,13 @@ QUnit = {
}
// ignore if start is called more often then stop
if ( config.semaphore < 0 ) {
- config.semaphore = 0;
+ config.semaphore = 0;
+ QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
+ return;
}
// A slight delay, to avoid any current callbacks
if ( defined.setTimeout ) {
- window.setTimeout(function() {
+ setTimeout(function() {
if ( config.semaphore > 0 ) {
return;
}
@@ -387,7 +490,7 @@ QUnit = {
if ( config.testTimeout && defined.setTimeout ) {
clearTimeout( config.timeout );
- config.timeout = window.setTimeout(function() {
+ config.timeout = setTimeout(function() {
QUnit.ok( false, "Test timed out" );
config.semaphore = 1;
QUnit.start();
@@ -396,11 +499,14 @@ QUnit = {
}
};
-// Asssert helpers
-// All of these must call either QUnit.push() or manually do:
+// `assert` initialized at top of scope
+// Assert helpers
+// All of these must either call QUnit.push() or manually do:
// - runLoggingCallbacks( "log", .. );
// - config.current.assertions.push({ .. });
-QUnit.assert = {
+// We attach it to the QUnit object *after* we expose the public API,
+// otherwise `assert` will become a global variable in browsers (#341).
+assert = {
/**
* Asserts rough true-ish result.
* @name ok
@@ -412,21 +518,23 @@ QUnit.assert = {
throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
}
result = !!result;
+ msg = msg || (result ? "okay" : "failed" );
var source,
details = {
+ module: config.current.module,
+ name: config.current.testName,
result: result,
message: msg
};
- msg = escapeInnerText( msg || (result ? "okay" : "failed" ) );
- msg = "" + msg + "";
+ msg = "" + escapeText( msg ) + "";
if ( !result ) {
source = sourceFromStacktrace( 2 );
if ( source ) {
details.source = source;
- msg += "| Source: | " + escapeInnerText( source ) + " |
|---|
";
+ msg += "| Source: | " + escapeText( source ) + " |
|---|
";
}
}
runLoggingCallbacks( "log", QUnit, details );
@@ -444,6 +552,7 @@ QUnit.assert = {
* @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
*/
equal: function( actual, expected, message ) {
+ /*jshint eqeqeq:false */
QUnit.push( expected == actual, actual, expected, message );
},
@@ -452,9 +561,30 @@ QUnit.assert = {
* @function
*/
notEqual: function( actual, expected, message ) {
+ /*jshint eqeqeq:false */
QUnit.push( expected != actual, actual, expected, message );
},
+ /**
+ * @name propEqual
+ * @function
+ */
+ propEqual: function( actual, expected, message ) {
+ actual = objectValues(actual);
+ expected = objectValues(expected);
+ QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
+ },
+
+ /**
+ * @name notPropEqual
+ * @function
+ */
+ notPropEqual: function( actual, expected, message ) {
+ actual = objectValues(actual);
+ expected = objectValues(expected);
+ QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
+ },
+
/**
* @name deepEqual
* @function
@@ -487,8 +617,9 @@ QUnit.assert = {
QUnit.push( expected !== actual, actual, expected, message );
},
- throws: function( block, expected, message ) {
+ "throws": function( block, expected, message ) {
var actual,
+ expectedOutput = expected,
ok = false;
// 'expected' is optional
@@ -509,35 +640,38 @@ QUnit.assert = {
// we don't want to validate thrown error
if ( !expected ) {
ok = true;
+ expectedOutput = null;
// expected is a regexp
} else if ( QUnit.objectType( expected ) === "regexp" ) {
- ok = expected.test( actual );
+ ok = expected.test( errorString( actual ) );
// expected is a constructor
} else if ( actual instanceof expected ) {
ok = true;
// expected is a validation function which returns true is validation passed
} else if ( expected.call( {}, actual ) === true ) {
+ expectedOutput = null;
ok = true;
}
- QUnit.push( ok, actual, null, message );
+ QUnit.push( ok, actual, expectedOutput, message );
} else {
- QUnit.pushFailure( message, null, 'No exception was thrown.' );
+ QUnit.pushFailure( message, null, "No exception was thrown." );
}
}
};
/**
- * @deprecate since 1.8.0
- * Kept assertion helpers in root for backwards compatibility
+ * @deprecated since 1.8.0
+ * Kept assertion helpers in root for backwards compatibility.
*/
-extend( QUnit, QUnit.assert );
+extend( QUnit, assert );
/**
* @deprecated since 1.9.0
- * Kept global "raises()" for backwards compatibility
+ * Kept root "raises()" for backwards compatibility.
+ * (Note that we don't introduce assert.raises).
*/
-QUnit.raises = QUnit.assert.throws;
+QUnit.raises = assert[ "throws" ];
/**
* @deprecated since 1.0.0, replaced with error pushes since 1.3.0
@@ -600,6 +734,9 @@ config = {
}
],
+ // Set of all modules.
+ modules: {},
+
// logging callback queues
begin: [],
done: [],
@@ -610,6 +747,15 @@ config = {
moduleDone: []
};
+// Export global variables, unless an 'exports' object exists,
+// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
+if ( typeof exports === "undefined" ) {
+ extend( window, QUnit.constructor.prototype );
+
+ // Expose QUnit object
+ window.QUnit = QUnit;
+}
+
// Initialize more QUnit.config and QUnit.urlParams
(function() {
var i,
@@ -643,18 +789,11 @@ config = {
QUnit.isLocal = location.protocol === "file:";
}());
-// Export global variables, unless an 'exports' object exists,
-// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
-if ( typeof exports === "undefined" ) {
- extend( window, QUnit );
-
- // Expose QUnit object
- window.QUnit = QUnit;
-}
-
// Extend QUnit object,
// these after set here because they should not be exposed as global functions
extend( QUnit, {
+ assert: assert,
+
config: config,
// Initialize the configuration options
@@ -669,7 +808,7 @@ extend( QUnit, {
autorun: false,
filter: "",
queue: [],
- semaphore: 0
+ semaphore: 1
});
var tests, banner, result,
@@ -677,7 +816,7 @@ extend( QUnit, {
if ( qunit ) {
qunit.innerHTML =
- "" +
+ "" +
"" +
"" +
"" +
@@ -710,17 +849,15 @@ extend( QUnit, {
},
// Resets the test setup. Useful for tests that modify the DOM.
- // If jQuery is available, uses jQuery's html(), otherwise just innerHTML.
+ /*
+ DEPRECATED: Use multiple tests instead of resetting inside a test.
+ Use testStart or testDone for custom cleanup.
+ This method will throw an error in 2.0, and will be removed in 2.1
+ */
reset: function() {
- var fixture;
-
- if ( window.jQuery ) {
- jQuery( "#qunit-fixture" ).html( config.fixture );
- } else {
- fixture = id( "qunit-fixture" );
- if ( fixture ) {
- fixture.innerHTML = config.fixture;
- }
+ var fixture = id( "qunit-fixture" );
+ if ( fixture ) {
+ fixture.innerHTML = config.fixture;
}
},
@@ -740,7 +877,7 @@ extend( QUnit, {
// Safe object type checking
is: function( type, obj ) {
- return QUnit.objectType( obj ) == type;
+ return QUnit.objectType( obj ) === type;
},
objectType: function( obj ) {
@@ -752,7 +889,8 @@ extend( QUnit, {
return "null";
}
- var type = toString.call( obj ).match(/^\[object\s(.*)\]$/)[1] || "";
+ var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
+ type = match && match[1] || "";
switch ( type ) {
case "Number":
@@ -781,22 +919,24 @@ extend( QUnit, {
var output, source,
details = {
+ module: config.current.module,
+ name: config.current.testName,
result: result,
message: message,
actual: actual,
expected: expected
};
- message = escapeInnerText( message ) || ( result ? "okay" : "failed" );
+ message = escapeText( message ) || ( result ? "okay" : "failed" );
message = "" + message + "";
output = message;
if ( !result ) {
- expected = escapeInnerText( QUnit.jsDump.parse(expected) );
- actual = escapeInnerText( QUnit.jsDump.parse(actual) );
+ expected = escapeText( QUnit.jsDump.parse(expected) );
+ actual = escapeText( QUnit.jsDump.parse(actual) );
output += "| Expected: | " + expected + " |
";
- if ( actual != expected ) {
+ if ( actual !== expected ) {
output += "| Result: | " + actual + " |
";
output += "| Diff: | " + QUnit.diff( expected, actual ) + " |
";
}
@@ -805,7 +945,7 @@ extend( QUnit, {
if ( source ) {
details.source = source;
- output += "| Source: | " + escapeInnerText( source ) + " |
";
+ output += "| Source: | " + escapeText( source ) + " |
";
}
output += "
";
@@ -826,23 +966,25 @@ extend( QUnit, {
var output,
details = {
+ module: config.current.module,
+ name: config.current.testName,
result: false,
message: message
};
- message = escapeInnerText( message ) || "error";
+ message = escapeText( message ) || "error";
message = "" + message + "";
output = message;
output += "";
if ( actual ) {
- output += "| Result: | " + escapeInnerText( actual ) + " |
";
+ output += "| Result: | " + escapeText( actual ) + " |
";
}
if ( source ) {
details.source = source;
- output += "| Source: | " + escapeInnerText( source ) + " |
";
+ output += "| Source: | " + escapeText( source ) + " |
";
}
output += "
";
@@ -861,18 +1003,21 @@ extend( QUnit, {
querystring = "?";
for ( key in params ) {
- if ( !hasOwn.call( params, key ) ) {
- continue;
+ if ( hasOwn.call( params, key ) ) {
+ querystring += encodeURIComponent( key ) + "=" +
+ encodeURIComponent( params[ key ] ) + "&";
}
- querystring += encodeURIComponent( key ) + "=" +
- encodeURIComponent( params[ key ] ) + "&";
}
- return window.location.pathname + querystring.slice( 0, -1 );
+ return window.location.protocol + "//" + window.location.host +
+ window.location.pathname + querystring.slice( 0, -1 );
},
extend: extend,
id: id,
- addEvent: addEvent
+ addEvent: addEvent,
+ addClass: addClass,
+ hasClass: hasClass,
+ removeClass: removeClass
// load, equiv, jsDump, diff: Attached later
});
@@ -898,7 +1043,7 @@ extend( QUnit.constructor.prototype, {
// testStart: { name }
testStart: registerLoggingCallback( "testStart" ),
- // testDone: { name, failed, passed, total }
+ // testDone: { name, failed, passed, total, duration }
testDone: registerLoggingCallback( "testDone" ),
// moduleStart: { name }
@@ -916,7 +1061,11 @@ QUnit.load = function() {
runLoggingCallbacks( "begin", QUnit, {} );
// Initialize the config, saving the execution queue
- var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes,
+ var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
+ urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
+ numModules = 0,
+ moduleNames = [],
+ moduleFilterHtml = "",
urlConfigHtml = "",
oldconfig = extend( {}, config );
@@ -937,8 +1086,33 @@ QUnit.load = function() {
};
}
config[ val.id ] = QUnit.urlParams[ val.id ];
- urlConfigHtml += "";
+ urlConfigHtml += "";
}
+ for ( i in config.modules ) {
+ if ( config.modules.hasOwnProperty( i ) ) {
+ moduleNames.push(i);
+ }
+ }
+ numModules = moduleNames.length;
+ moduleNames.sort( function( a, b ) {
+ return a.localeCompare( b );
+ });
+ moduleFilterHtml += "";
// `userAgent` initialized at top of scope
userAgent = id( "qunit-userAgent" );
@@ -990,18 +1164,42 @@ QUnit.load = function() {
// `label` initialized at top of scope
label = document.createElement( "label" );
label.setAttribute( "for", "qunit-filter-pass" );
- label.setAttribute( "title", "Only show tests and assertons that fail. Stored in sessionStorage." );
+ label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." );
label.innerHTML = "Hide passed tests";
toolbar.appendChild( label );
- urlConfigCheckboxes = document.createElement( 'span' );
- urlConfigCheckboxes.innerHTML = urlConfigHtml;
- addEvent( urlConfigCheckboxes, "change", function( event ) {
- var params = {};
- params[ event.target.name ] = event.target.checked ? true : undefined;
+ urlConfigCheckboxesContainer = document.createElement("span");
+ urlConfigCheckboxesContainer.innerHTML = urlConfigHtml;
+ urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input");
+ // For oldIE support:
+ // * Add handlers to the individual elements instead of the container
+ // * Use "click" instead of "change"
+ // * Fallback from event.target to event.srcElement
+ addEvents( urlConfigCheckboxes, "click", function( event ) {
+ var params = {},
+ target = event.target || event.srcElement;
+ params[ target.name ] = target.checked ? true : undefined;
window.location = QUnit.url( params );
});
- toolbar.appendChild( urlConfigCheckboxes );
+ toolbar.appendChild( urlConfigCheckboxesContainer );
+
+ if (numModules > 1) {
+ moduleFilter = document.createElement( "span" );
+ moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
+ moduleFilter.innerHTML = moduleFilterHtml;
+ addEvent( moduleFilter.lastChild, "change", function() {
+ var selectBox = moduleFilter.getElementsByTagName("select")[0],
+ selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
+
+ window.location = QUnit.url({
+ module: ( selectedModule === "" ) ? undefined : selectedModule,
+ // Remove any existing filters
+ filter: undefined,
+ testNumber: undefined
+ });
+ });
+ toolbar.appendChild(moduleFilter);
+ }
}
// `main` initialized at top of scope
@@ -1022,7 +1220,7 @@ addEvent( window, "load", QUnit.load );
onErrorFnPrev = window.onerror;
// Cover uncaught exceptions
-// Returning true will surpress the default browser handler,
+// Returning true will suppress the default browser handler,
// returning false will let it run.
window.onerror = function ( error, filePath, linerNr ) {
var ret = false;
@@ -1031,7 +1229,7 @@ window.onerror = function ( error, filePath, linerNr ) {
}
// Treat return value as window.onerror itself does,
- // Only do our handling if not surpressed.
+ // Only do our handling if not suppressed.
if ( ret !== true ) {
if ( QUnit.config.current ) {
if ( QUnit.config.current.ignoreGlobalErrors ) {
@@ -1039,9 +1237,9 @@ window.onerror = function ( error, filePath, linerNr ) {
}
QUnit.pushFailure( error, filePath + ":" + linerNr );
} else {
- QUnit.test( "global failure", function() {
+ QUnit.test( "global failure", extend( function() {
QUnit.pushFailure( error, filePath + ":" + linerNr );
- });
+ }, { validTest: validTest } ) );
}
return false;
}
@@ -1061,6 +1259,7 @@ function done() {
total: config.moduleStats.all
});
}
+ delete config.previousModule;
var i, key,
banner = id( "qunit-banner" ),
@@ -1073,7 +1272,7 @@ function done() {
" milliseconds.
",
"",
passed,
- " tests of ",
+ " assertions of ",
config.stats.all,
" passed, ",
config.stats.bad,
@@ -1108,6 +1307,11 @@ function done() {
}
}
+ // scroll back to top to show results
+ if ( window.scrollTo ) {
+ window.scrollTo(0, 0);
+ }
+
runLoggingCallbacks( "done", QUnit, {
failed: config.stats.bad,
passed: passed,
@@ -1123,6 +1327,12 @@ function validTest( test ) {
module = config.module && config.module.toLowerCase(),
fullName = (test.module + ": " + test.testName).toLowerCase();
+ // Internally-generated tests are always valid
+ if ( test.callback && test.callback.validTest === validTest ) {
+ delete test.callback.validTest;
+ return true;
+ }
+
if ( config.testNumber ) {
return test.testNumber === config.testNumber;
}
@@ -1155,7 +1365,7 @@ function validTest( test ) {
function extractStacktrace( e, offset ) {
offset = offset === undefined ? 3 : offset;
- var stack, include, i, regex;
+ var stack, include, i;
if ( e.stacktrace ) {
// Opera
@@ -1169,7 +1379,7 @@ function extractStacktrace( e, offset ) {
if ( fileName ) {
include = [];
for ( i = offset; i < stack.length; i++ ) {
- if ( stack[ i ].indexOf( fileName ) != -1 ) {
+ if ( stack[ i ].indexOf( fileName ) !== -1 ) {
break;
}
include.push( stack[ i ] );
@@ -1198,17 +1408,27 @@ function sourceFromStacktrace( offset ) {
}
}
-function escapeInnerText( s ) {
+/**
+ * Escape text for attribute or text content.
+ */
+function escapeText( s ) {
if ( !s ) {
return "";
}
s = s + "";
- return s.replace( /[\&<>]/g, function( s ) {
+ // Both single quotes and double quotes (for attributes)
+ return s.replace( /['"<>&]/g, function( s ) {
switch( s ) {
- case "&": return "&";
- case "<": return "<";
- case ">": return ">";
- default: return s;
+ case "'":
+ return "'";
+ case "\"":
+ return """;
+ case "<":
+ return "<";
+ case ">":
+ return ">";
+ case "&":
+ return "&";
}
});
}
@@ -1232,7 +1452,7 @@ function process( last ) {
if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
config.queue.shift()();
} else {
- window.setTimeout( next, 13 );
+ setTimeout( next, 13 );
break;
}
}
@@ -1247,16 +1467,18 @@ function saveGlobal() {
if ( config.noglobals ) {
for ( var key in window ) {
- // in Opera sometimes DOM element ids show up here, ignore them
- if ( !hasOwn.call( window, key ) || /^qunit-test-output/.test( key ) ) {
- continue;
+ if ( hasOwn.call( window, key ) ) {
+ // in Opera sometimes DOM element ids show up here, ignore them
+ if ( /^qunit-test-output/.test( key ) ) {
+ continue;
+ }
+ config.pollution.push( key );
}
- config.pollution.push( key );
}
}
}
-function checkPollution( name ) {
+function checkPollution() {
var newGlobals,
deletedGlobals,
old = config.pollution;
@@ -1293,28 +1515,68 @@ function diff( a, b ) {
function extend( a, b ) {
for ( var prop in b ) {
- if ( b[ prop ] === undefined ) {
- delete a[ prop ];
-
- // Avoid "Member not found" error in IE8 caused by setting window.constructor
- } else if ( prop !== "constructor" || a !== window ) {
- a[ prop ] = b[ prop ];
+ if ( hasOwn.call( b, prop ) ) {
+ // Avoid "Member not found" error in IE8 caused by messing with window.constructor
+ if ( !( prop === "constructor" && a === window ) ) {
+ if ( b[ prop ] === undefined ) {
+ delete a[ prop ];
+ } else {
+ a[ prop ] = b[ prop ];
+ }
+ }
}
}
return a;
}
+/**
+ * @param {HTMLElement} elem
+ * @param {string} type
+ * @param {Function} fn
+ */
function addEvent( elem, type, fn ) {
+ // Standards-based browsers
if ( elem.addEventListener ) {
elem.addEventListener( type, fn, false );
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, fn );
+ // IE
} else {
- fn();
+ elem.attachEvent( "on" + type, fn );
}
}
+/**
+ * @param {Array|NodeList} elems
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvents( elems, type, fn ) {
+ var i = elems.length;
+ while ( i-- ) {
+ addEvent( elems[i], type, fn );
+ }
+}
+
+function hasClass( elem, name ) {
+ return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
+}
+
+function addClass( elem, name ) {
+ if ( !hasClass( elem, name ) ) {
+ elem.className += (elem.className ? " " : "") + name;
+ }
+}
+
+function removeClass( elem, name ) {
+ var set = " " + elem.className + " ";
+ // Class name may appear multiple times
+ while ( set.indexOf(" " + name + " ") > -1 ) {
+ set = set.replace(" " + name + " " , " ");
+ }
+ // If possible, trim it for prettiness, but not necessarily
+ elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, "");
+}
+
function id( name ) {
return !!( typeof document !== "undefined" && document && document.getElementById ) &&
document.getElementById( name );
@@ -1328,7 +1590,6 @@ function registerLoggingCallback( key ) {
// Supports deprecated method of completely overwriting logging callbacks
function runLoggingCallbacks( key, scope, args ) {
- //debugger;
var i, callbacks;
if ( QUnit.hasOwnProperty( key ) ) {
QUnit[ key ].call(scope, args );
@@ -1362,16 +1623,19 @@ QUnit.equiv = (function() {
callers = [],
// stack to avoiding loops from circular referencing
parents = [],
+ parentsB = [],
getProto = Object.getPrototypeOf || function ( obj ) {
+ /*jshint camelcase:false */
return obj.__proto__;
},
callbacks = (function () {
// for string, boolean, number and null
function useStrictEquality( b, a ) {
+ /*jshint eqeqeq:false */
if ( b instanceof a.constructor || a instanceof b.constructor ) {
- // to catch short annotaion VS 'new' annotation of a
+ // to catch short annotation VS 'new' annotation of a
// declaration
// e.g. var i = 1;
// var j = new Number(1);
@@ -1400,11 +1664,12 @@ QUnit.equiv = (function() {
return QUnit.objectType( b ) === "regexp" &&
// the regex itself
a.source === b.source &&
- // and its modifers
+ // and its modifiers
a.global === b.global &&
// (gmi) ...
a.ignoreCase === b.ignoreCase &&
- a.multiline === b.multiline;
+ a.multiline === b.multiline &&
+ a.sticky === b.sticky;
},
// - skip when the property is a method of an instance (OOP)
@@ -1416,7 +1681,7 @@ QUnit.equiv = (function() {
},
"array": function( b, a ) {
- var i, j, len, loop;
+ var i, j, len, loop, aCircular, bCircular;
// b could be an object literal here
if ( QUnit.objectType( b ) !== "array" ) {
@@ -1431,24 +1696,36 @@ QUnit.equiv = (function() {
// track reference to avoid circular references
parents.push( a );
+ parentsB.push( b );
for ( i = 0; i < len; i++ ) {
loop = false;
for ( j = 0; j < parents.length; j++ ) {
- if ( parents[j] === a[i] ) {
- loop = true;// dont rewalk array
+ aCircular = parents[j] === a[i];
+ bCircular = parentsB[j] === b[i];
+ if ( aCircular || bCircular ) {
+ if ( a[i] === b[i] || aCircular && bCircular ) {
+ loop = true;
+ } else {
+ parents.pop();
+ parentsB.pop();
+ return false;
+ }
}
}
if ( !loop && !innerEquiv(a[i], b[i]) ) {
parents.pop();
+ parentsB.pop();
return false;
}
}
parents.pop();
+ parentsB.pop();
return true;
},
"object": function( b, a ) {
- var i, j, loop,
+ /*jshint forin:false */
+ var i, j, loop, aCircular, bCircular,
// Default to true
eq = true,
aProperties = [],
@@ -1467,28 +1744,36 @@ QUnit.equiv = (function() {
// stack constructor before traversing properties
callers.push( a.constructor );
+
// track reference to avoid circular references
parents.push( a );
+ parentsB.push( b );
- for ( i in a ) { // be strict: don't ensures hasOwnProperty
- // and go deep
+ // be strict: don't ensure hasOwnProperty and go deep
+ for ( i in a ) {
loop = false;
for ( j = 0; j < parents.length; j++ ) {
- if ( parents[j] === a[i] ) {
- // don't go down the same path twice
- loop = true;
+ aCircular = parents[j] === a[i];
+ bCircular = parentsB[j] === b[i];
+ if ( aCircular || bCircular ) {
+ if ( a[i] === b[i] || aCircular && bCircular ) {
+ loop = true;
+ } else {
+ eq = false;
+ break;
+ }
}
}
- aProperties.push(i); // collect a's properties
-
- if (!loop && !innerEquiv( a[i], b[i] ) ) {
+ aProperties.push(i);
+ if ( !loop && !innerEquiv(a[i], b[i]) ) {
eq = false;
break;
}
}
- callers.pop(); // unstack, we are done
parents.pop();
+ parentsB.pop();
+ callers.pop(); // unstack, we are done
for ( i in b ) {
bProperties.push( i ); // collect b's properties
@@ -1518,7 +1803,7 @@ QUnit.equiv = (function() {
}
// apply transition with (1..n) arguments
- }( args[0], args[1] ) && arguments.callee.apply( this, args.splice(1, args.length - 1 )) );
+ }( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) );
};
return innerEquiv;
@@ -1536,7 +1821,7 @@ QUnit.equiv = (function() {
*/
QUnit.jsDump = (function() {
function quote( str ) {
- return '"' + str.toString().replace( /"/g, '\\"' ) + '"';
+ return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\"";
}
function literal( o ) {
return o + "";
@@ -1565,26 +1850,25 @@ QUnit.jsDump = (function() {
var reName = /^function (\w+)/,
jsDump = {
- parse: function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance
- stack = stack || [ ];
+ // type is used mostly internally, you can fix a (custom)type in advance
+ parse: function( obj, type, stack ) {
+ stack = stack || [{}];
var inStack, res,
parser = this.parsers[ type || this.typeOf(obj) ];
type = typeof parser;
inStack = inArray( obj, stack );
- if ( inStack != -1 ) {
+ if ( inStack !== -1 ) {
return "recursion(" + (inStack - stack.length) + ")";
}
- //else
- if ( type == "function" ) {
+ if ( type === "function" ) {
stack.push( obj );
res = parser.call( this, obj, stack );
stack.pop();
return res;
}
- // else
- return ( type == "string" ) ? parser : this.parsers.error;
+ return ( type === "string" ) ? parser : this.parsers.error;
},
typeOf: function( obj ) {
var type;
@@ -1611,6 +1895,8 @@ QUnit.jsDump = (function() {
( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
) {
type = "array";
+ } else if ( obj.constructor === Error.prototype.constructor ) {
+ type = "error";
} else {
type = typeof obj;
}
@@ -1619,7 +1905,8 @@ QUnit.jsDump = (function() {
separator: function() {
return this.multiline ? this.HTML ? "
" : "\n" : this.HTML ? " " : " ";
},
- indent: function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing
+ // extra can be a number, shortcut for increasing-calling-decreasing
+ indent: function( extra ) {
if ( !this.multiline ) {
return "";
}
@@ -1627,13 +1914,13 @@ QUnit.jsDump = (function() {
if ( this.HTML ) {
chr = chr.replace( /\t/g, " " ).replace( / /g, " " );
}
- return new Array( this._depth_ + (extra||0) ).join(chr);
+ return new Array( this.depth + ( extra || 0 ) ).join(chr);
},
up: function( a ) {
- this._depth_ += a || 1;
+ this.depth += a || 1;
},
down: function( a ) {
- this._depth_ -= a || 1;
+ this.depth -= a || 1;
},
setParser: function( name, parser ) {
this.parsers[name] = parser;
@@ -1643,18 +1930,21 @@ QUnit.jsDump = (function() {
literal: literal,
join: join,
//
- _depth_: 1,
+ depth: 1,
// This is the list of parsers, to modify them, use jsDump.setParser
parsers: {
window: "[Window]",
document: "[Document]",
- error: "[ERROR]", //when no parser is found, shouldn"t happen
+ error: function(error) {
+ return "Error(\"" + error.message + "\")";
+ },
unknown: "[Unknown]",
"null": "null",
"undefined": "undefined",
"function": function( fn ) {
var ret = "function",
- name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];//functions never have name in IE
+ // functions never have name in IE
+ name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
if ( name ) {
ret += " " + name;
@@ -1668,15 +1958,12 @@ QUnit.jsDump = (function() {
nodelist: array,
"arguments": array,
object: function( map, stack ) {
+ /*jshint forin:false */
var ret = [ ], keys, key, val, i;
QUnit.jsDump.up();
- if ( Object.keys ) {
- keys = Object.keys( map );
- } else {
- keys = [];
- for ( key in map ) {
- keys.push( key );
- }
+ keys = [];
+ for ( key in map ) {
+ keys.push( key );
}
keys.sort();
for ( i = 0; i < keys.length; i++ ) {
@@ -1688,21 +1975,34 @@ QUnit.jsDump = (function() {
return join( "{", ret, "}" );
},
node: function( node ) {
- var a, val,
+ var len, i, val,
open = QUnit.jsDump.HTML ? "<" : "<",
close = QUnit.jsDump.HTML ? ">" : ">",
tag = node.nodeName.toLowerCase(),
- ret = open + tag;
+ ret = open + tag,
+ attrs = node.attributes;
- for ( a in QUnit.jsDump.DOMAttrs ) {
- val = node[ QUnit.jsDump.DOMAttrs[a] ];
- if ( val ) {
- ret += " " + a + "=" + QUnit.jsDump.parse( val, "attribute" );
+ if ( attrs ) {
+ for ( i = 0, len = attrs.length; i < len; i++ ) {
+ val = attrs[i].nodeValue;
+ // IE6 includes all attributes in .attributes, even ones not explicitly set.
+ // Those have values like undefined, null, 0, false, "" or "inherit".
+ if ( val && val !== "inherit" ) {
+ ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
+ }
}
}
- return ret + close + open + "/" + tag + close;
+ ret += close;
+
+ // Show content of TextNode or CDATASection
+ if ( node.nodeType === 3 || node.nodeType === 4 ) {
+ ret += node.nodeValue;
+ }
+
+ return ret + open + "/" + tag + close;
},
- functionArgs: function( fn ) {//function calls it internally, it's the arguments part of the function
+ // function calls it internally, it's the arguments part of the function
+ functionArgs: function( fn ) {
var args,
l = fn.length;
@@ -1712,54 +2012,34 @@ QUnit.jsDump = (function() {
args = new Array(l);
while ( l-- ) {
- args[l] = String.fromCharCode(97+l);//97 is 'a'
+ // 97 is 'a'
+ args[l] = String.fromCharCode(97+l);
}
return " " + args.join( ", " ) + " ";
},
- key: quote, //object calls it internally, the key part of an item in a map
- functionCode: "[code]", //function calls it internally, it's the content of the function
- attribute: quote, //node calls it internally, it's an html attribute value
+ // object calls it internally, the key part of an item in a map
+ key: quote,
+ // function calls it internally, it's the content of the function
+ functionCode: "[code]",
+ // node calls it internally, it's an html attribute value
+ attribute: quote,
string: quote,
date: quote,
- regexp: literal, //regex
+ regexp: literal,
number: literal,
"boolean": literal
},
- DOMAttrs: {
- //attributes to dump from nodes, name=>realName
- id: "id",
- name: "name",
- "class": "className"
- },
- HTML: false,//if true, entities are escaped ( <, >, \t, space and \n )
- indentChar: " ",//indentation unit
- multiline: true //if true, items in a collection, are separated by a \n, else just a space.
+ // if true, entities are escaped ( <, >, \t, space and \n )
+ HTML: false,
+ // indentation unit
+ indentChar: " ",
+ // if true, items in a collection, are separated by a \n, else just a space.
+ multiline: true
};
return jsDump;
}());
-// from Sizzle.js
-function getText( elems ) {
- var i, elem,
- ret = "";
-
- for ( i = 0; elems[i]; i++ ) {
- elem = elems[i];
-
- // Get the text from text nodes and CDATA nodes
- if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
- ret += elem.nodeValue;
-
- // Traverse everything else, except comment nodes
- } else if ( elem.nodeType !== 8 ) {
- ret += getText( elem.childNodes );
- }
- }
-
- return ret;
-}
-
// from jquery.js
function inArray( elem, array ) {
if ( array.indexOf ) {
@@ -1790,13 +2070,14 @@ function inArray( elem, array ) {
* QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick brown fox jumped jumps over"
*/
QUnit.diff = (function() {
+ /*jshint eqeqeq:false, eqnull:true */
function diff( o, n ) {
var i,
ns = {},
os = {};
for ( i = 0; i < n.length; i++ ) {
- if ( ns[ n[i] ] == null ) {
+ if ( !hasOwn.call( ns, n[i] ) ) {
ns[ n[i] ] = {
rows: [],
o: null
@@ -1806,7 +2087,7 @@ QUnit.diff = (function() {
}
for ( i = 0; i < o.length; i++ ) {
- if ( os[ o[i] ] == null ) {
+ if ( !hasOwn.call( os, o[i] ) ) {
os[ o[i] ] = {
rows: [],
n: null
@@ -1816,18 +2097,17 @@ QUnit.diff = (function() {
}
for ( i in ns ) {
- if ( !hasOwn.call( ns, i ) ) {
- continue;
- }
- if ( ns[i].rows.length == 1 && typeof os[i] != "undefined" && os[i].rows.length == 1 ) {
- n[ ns[i].rows[0] ] = {
- text: n[ ns[i].rows[0] ],
- row: os[i].rows[0]
- };
- o[ os[i].rows[0] ] = {
- text: o[ os[i].rows[0] ],
- row: ns[i].rows[0]
- };
+ if ( hasOwn.call( ns, i ) ) {
+ if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
+ n[ ns[i].rows[0] ] = {
+ text: n[ ns[i].rows[0] ],
+ row: os[i].rows[0]
+ };
+ o[ os[i].rows[0] ] = {
+ text: o[ os[i].rows[0] ],
+ row: ns[i].rows[0]
+ };
+ }
}
}
@@ -1923,9 +2203,9 @@ QUnit.diff = (function() {
};
}());
-// for CommonJS enviroments, export everything
+// for CommonJS environments, export everything
if ( typeof exports !== "undefined" ) {
- extend(exports, QUnit);
+ extend( exports, QUnit.constructor.prototype );
}
// get at whatever the global object is, like window in browsers
diff --git a/addons/web/static/src/js/testing.js b/addons/web/static/src/js/testing.js
index af434c4c0f4..880da9f1bc1 100644
--- a/addons/web/static/src/js/testing.js
+++ b/addons/web/static/src/js/testing.js
@@ -195,8 +195,7 @@ openerp.testing = {};
0, module_index + 1 || undefined);
// Serialize options for this precise test case
- // WARNING: typo is from jquery, do not fix!
- var env = QUnit.config.currentModuleTestEnviroment;
+ var env = QUnit.config.currentModuleTestEnvironment;
// section setup
// case setup
// test
From adfe3e7ec9c1e98f648a644c5e5d3972e71397b3 Mon Sep 17 00:00:00 2001
From: Xavier Morel
Date: Thu, 1 Aug 2013 11:13:26 +0200
Subject: [PATCH 42/61] [FIX] reinstate basic grouping test, replace
strictEqual call on widgets by ok(===)
There seems to be a problem with QUnit's serialization routines when
applied to complex widgets (the view here) while running inside
PhantomJS. It does not seem to be cycles in datastructures (that is
handled) but looks related to complex objects linked from multiple
"children" (skipping any object already serialized makes the issue
disappear).
The bug leads to unbounded memory growth, and on runbot to the process
being summarily terminated (likely by the OOM killer) not even
resulting in an OOM error (which is displayed locally). The issue can
not be observed within browsers. This may be a difference in GC
strategy.
The serialization is applied by the driver on high-level comparison
methods (e.g. strictEqual) so the caller can display the structures if
desired.
Replace the strictEqual(a, b) call by ok(a === b) to avoid any risk of
such serialization.
bzr revid: xmo@openerp.com-20130801091326-u2q9e163zls4k8ad
---
addons/web/static/test/search.js | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js
index 611cbf806cb..22f6c843efc 100644
--- a/addons/web/static/test/search.js
+++ b/addons/web/static/test/search.js
@@ -1104,8 +1104,7 @@ openerp.testing.section('search.groupby', {
rpc: 'mock',
templates: true,
}, function (test) {
- // temporarily desactivated to stop raising random false positive on the runbot
- /*test('basic', {
+ test('basic', {
asserts: 7,
setup: function (instance, $s, mock) {
mock('dummy.model:fields_view_get', function () {
@@ -1133,8 +1132,8 @@ openerp.testing.section('search.groupby', {
return f instanceof instance.web.search.GroupbyGroup;
});
ok(group, "should have a GroupbyGroup input");
- strictEqual(group.__parentedParent, view,
- "group's parent should be view");
+ ok(group.getParent() === view,
+ "group's parent should be view");
group.toggle(group.filters[0]);
group.toggle(group.filters[2]);
@@ -1151,7 +1150,7 @@ openerp.testing.section('search.groupby', {
"{'group_by': 'baz'}"
], "should have sequence of contexts");
});
- });*/
+ });
test('unified multiple groupby groups', {
asserts: 4,
setup: function (instance, $s, mock) {
From f3d634a278411f4a4fdcc0d38da31265042e4bc0 Mon Sep 17 00:00:00 2001
From: niv-openerp
Date: Thu, 1 Aug 2013 13:31:36 +0200
Subject: [PATCH 43/61] [IMP] http.py: Make it possible to implement a new
authentication method for the routes
bzr revid: nicolas.vanhoren@openerp.com-20130801113136-5fg9hyrptjckhtkm
---
addons/web/http.py | 32 ++++++++++++++++++++------------
1 file changed, 20 insertions(+), 12 deletions(-)
diff --git a/addons/web/http.py b/addons/web/http.py
index 687af164e72..c41c32169ad 100644
--- a/addons/web/http.py
+++ b/addons/web/http.py
@@ -124,17 +124,7 @@ class WebRequest(object):
except SessionExpiredException, e:
self.session.logout()
raise SessionExpiredException("Session expired for request %s" % self.httprequest)
- if self.auth_method == "none":
- self.disable_db = True
- self.uid = None
- elif self.auth_method == "admin":
- self.disable_db = False
- if not self.db:
- raise SessionExpiredException("No valid database for request %s" % self.httprequest)
- self.uid = openerp.SUPERUSER_ID
- else: # auth
- self.disable_db = False
- self.uid = self.session.uid
+ auth_methods[self.auth_method]()
@property
def registry(self):
"""
@@ -187,6 +177,24 @@ class WebRequest(object):
self.disable_db = True
self.uid = None
+def auth_method_user():
+ request.uid = request.session.uid
+
+def auth_method_admin():
+ if not request.db:
+ raise SessionExpiredException("No valid database for request %s" % request.httprequest)
+ request.uid = openerp.SUPERUSER_ID
+
+def auth_method_none():
+ request.disable_db = True
+ request.uid = None
+
+auth_methods = {
+ "user": auth_method_user,
+ "admin": auth_method_admin,
+ "none": auth_method_none,
+}
+
def route(route, type="http", auth="user"):
"""
Decorator marking the decorated method as being a handler for requests. The method must be part of a subclass
@@ -206,7 +214,7 @@ def route(route, type="http", auth="user"):
configuration indicating the current database nor the current user.
"""
assert type in ["http", "json"]
- assert auth in ["user", "admin", "none"]
+ assert auth in auth_methods.keys()
def decorator(f):
if isinstance(route, list):
f.routes = route
From bd23b317219639a6a1eff79a595b9c23f4b3a927 Mon Sep 17 00:00:00 2001
From: Christophe Matthieu
Date: Thu, 1 Aug 2013 14:48:50 +0200
Subject: [PATCH 44/61] [IMP] website: add auth_method_public
bzr revid: chm@openerp.com-20130801124850-9ycc9j77wphiiww6
---
addons/website/website.py | 46 ++----
addons/website_hr/controllers/main.py | 15 +-
addons/website_mail/controllers/main.py | 67 ++++----
addons/website_mail/mail_message.py | 4 +-
addons/website_sale/controllers/main.py | 205 ++++++++++--------------
5 files changed, 149 insertions(+), 188 deletions(-)
diff --git a/addons/website/website.py b/addons/website/website.py
index c9cb2aab37d..f8d9a9592ce 100644
--- a/addons/website/website.py
+++ b/addons/website/website.py
@@ -6,45 +6,31 @@ from openerp.addons.web.controllers import main
from openerp.addons.web.http import request
-class website(http.Controller):
- public_user_id = None
+def auth_method_public():
+ registry = openerp.modules.registry.RegistryManager.get(request.db)
+ with registry.cursor() as cr:
+ request.public_uid = request.registry['ir.model.data'].get_object_reference(cr, openerp.SUPERUSER_ID, 'website', 'public_user')[1]
+ if not request.session.uid:
+ request.uid = request.public_uid
+ else:
+ request.uid = request.session.uid
+http.auth_methods['public'] = auth_method_public
- def get_uid(self):
- try:
- request.session.check_security()
- uid = request.session._uid
- except http.SessionExpiredException:
- if not website.public_user_id:
- data_obj = request.registry['ir.model.data']
- website.public_user_id = data_obj.get_object_reference(request.cr, openerp.SUPERUSER_ID, 'website', 'public_user')[1]
- uid = website.public_user_id
- return uid
-
- def isloggued(self):
- return website.public_user_id != self.get_uid()
-
- def render(self, cr, uid, template, add_values={}):
+class website(object):
+ def render(self, template, add_values={}):
script = "\n".join(['' % i for i in main.manifest_list('js', db=request.db)])
css = "\n".join('' % i for i in main.manifest_list('css', db=request.db))
_values = {
- 'editable': self.isloggued(),
+ 'editable': request.uid != request.public_uid,
'request': request,
'registry': request.registry,
- 'cr': cr,
- 'uid': uid,
+ 'cr': request.cr,
+ 'uid': request.uid,
'script': script,
'css': css,
'host_url': request.httprequest.host_url,
}
_values.update(add_values)
- return request.registry.get("ir.ui.view").render(cr, uid, template, _values)
-
- @staticmethod
- def route(*args, **kwargs):
- def wrap(_funct):
- @http.route(*args, **kwargs)
- def wrapper(self, *a, **k):
- return _funct(self, request.cr, self.get_uid(), *a, **k)
- return wrapper
- return wrap
+ return request.registry.get("ir.ui.view").render(request.cr, request.uid, template, _values)
+website = website()
\ No newline at end of file
diff --git a/addons/website_hr/controllers/main.py b/addons/website_hr/controllers/main.py
index 4b5321f929c..3cffe6d9388 100644
--- a/addons/website_hr/controllers/main.py
+++ b/addons/website_hr/controllers/main.py
@@ -1,19 +1,20 @@
# -*- coding: utf-8 -*-
+from openerp.addons.web import http
from openerp.addons.web.http import request
from openerp.addons.website import website
-class website_hr(website):
+class website_hr(http.Controller):
- @website.route(['/team'], type='http', auth="admin")
- def blog(self, cr, uid, **post):
+ @http.route(['/team'], type='http', auth="public")
+ def blog(self, **post):
hr_obj = request.registry['hr.employee']
- employee_ids = hr_obj.search(cr, uid, [(1, "=", 1)])
+ employee_ids = hr_obj.search(request.cr, request.uid, [(1, "=", 1)])
values = {
- 'res_company': request.registry['res.company'].browse(cr, uid, 1),
- 'employee_ids': hr_obj.browse(cr, uid, employee_ids),
+ 'res_company': request.registry['res.company'].browse(request.cr, request.uid, 1),
+ 'employee_ids': hr_obj.browse(request.cr, request.uid, employee_ids),
}
- html = self.render(cr, uid, "website_hr.index", values)
+ html = website.render(request.cr, request.uid, "website_hr.index", values)
return html
diff --git a/addons/website_mail/controllers/main.py b/addons/website_mail/controllers/main.py
index b1351cee682..b8ae9981be6 100644
--- a/addons/website_mail/controllers/main.py
+++ b/addons/website_mail/controllers/main.py
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
+from openerp.addons.web import http
from openerp.addons.web.http import request
from openerp.addons.website import website
import werkzeug
@@ -10,15 +11,15 @@ import simplejson
_months = {1:_("January"), 2:_("February"), 3:_("March"), 4:_("April"), 5:_("May"), 6:_("June"), 7:_("July"), 8:_("August"), 9:_("September"), 10:_("October"), 11:_("November"), 12:_("December")}
-class website_mail(website):
+class website_mail(http.Controller):
- @website.route(['/blog', '/blog/', '/blog//'], type='http', auth="admin")
- def blog(self, cr, uid, mail_group_id=None, blog_id=None, **post):
+ @http.route(['/blog', '/blog/', '/blog//'], type='http', auth="public")
+ def blog(self, mail_group_id=None, blog_id=None, **post):
group_obj = request.registry['mail.group']
message_obj = request.registry['mail.message']
values = {
- 'res_company': request.registry['res.company'].browse(cr, uid, 1),
+ 'res_company': request.registry['res.company'].browse(request.cr, request.uid, 1),
'blog_ids': None,
'blog_id': None,
'nav_list': dict(),
@@ -27,8 +28,8 @@ class website_mail(website):
'mail_group_id': mail_group_id,
}
domain = mail_group_id and [("res_id", "=", mail_group_id)] or []
-
- for group in message_obj.read_group(cr, uid, domain + group_obj.get_public_domain(cr, uid), ['subject', 'date'], groupby="date", orderby="create_date asc"):
+
+ for group in message_obj.read_group(request.cr, request.uid, domain + group_obj.get_public_blog(request.cr, request.uid), ['subject', 'date'], groupby="date", orderby="create_date asc"):
year = group['date'].split(" ")[1]
if not values['nav_list'].get(year):
values['nav_list'][year] = {'name': year, 'date_count': 0, 'months': []}
@@ -36,57 +37,60 @@ class website_mail(website):
values['nav_list'][year]['months'].append(group)
if post.get('date'):
- ids = group_obj.get_public_message_ids(cr, uid, domain=domain + [("date", ">", post.get('date'))], order="create_date asc", limit=10)
+ ids = group_obj.get_public_message_ids(request.cr, request.uid, domain=domain + [("date", ">", post.get('date'))], order="create_date asc", limit=10)
if ids:
- values['prev_date'] = message_obj.browse(cr, uid, ids.pop()).date
+ values['prev_date'] = message_obj.browse(request.cr, request.uid, ids.pop()).date
domain += [("date", "<=", post.get('date'))]
- message_ids = group_obj.get_public_message_ids(cr, uid, domain=domain, order="create_date desc", limit=11)
+ message_ids = group_obj.get_public_message_ids(request.cr, request.uid, domain=domain, order="create_date desc", limit=11)
if message_ids:
- values['blog_ids'] = message_obj.browse(cr, uid, message_ids)
+ values['blog_ids'] = message_obj.browse(request.cr, request.uid, message_ids)
if len(message_ids) > 10:
values['next_date'] = values['blog_ids'].pop().date
if blog_id:
- values['blog_id'] = message_obj.browse(cr, uid, blog_id)
+ values['blog_id'] = message_obj.browse(request.cr, request.uid, blog_id)
comment_ids = [child_id.id for child_id in values['blog_id'].child_ids]
- values['comments'] = message_obj.read(cr, uid, comment_ids, ['website_published', 'author_id', 'date', 'body'])
+ values['comments'] = message_obj.read(request.cr, request.uid, comment_ids, ['website_published', 'author_id', 'date', 'body'])
- html = self.render(cr, uid, "website_mail.index", values)
+ html = website.render("website_mail.index", values)
return html
- @website.route(['/blog/nav'], type='http', auth="admin")
- def nav(self, cr, uid, **post):
- comment_ids = request.registry['mail.group'].get_public_message_ids(cr, uid, domain=safe_eval(post.get('domain')), order="create_date asc", limit=None)
- return simplejson.dumps(request.registry['mail.message'].read(cr, uid, comment_ids, ['website_published', 'subject', 'res_id']))
+ @http.route(['/blog/nav'], type='http', auth="public")
+ def nav(self, **post):
+ request.uid = website.get_request.uid()
+ comment_ids = request.registry['mail.group'].get_public_message_ids(request.cr, request.uid, domain=safe_eval(post.get('domain')), order="create_date asc", limit=None)
+ return simplejson.dumps(request.registry['mail.message'].read(request.cr, request.uid, comment_ids, ['website_published', 'subject', 'res_id']))
- @website.route(['/blog/publish'], type='http', auth="admin")
- def publish(self, cr, uid, **post):
+ @http.route(['/blog/publish'], type='http', auth="public")
+ def publish(self, **post):
+ request.uid = website.get_request.uid()
message_id = int(post['message_id'])
message_obj = request.registry['mail.message']
- blog = message_obj.browse(cr, uid, message_id)
- message_obj.write(cr, uid, [message_id], {'website_published': not blog.website_published})
- blog = message_obj.browse(cr, uid, message_id)
+ blog = message_obj.browse(request.cr, request.uid, message_id)
+ message_obj.write(request.cr, request.uid, [message_id], {'website_published': not blog.website_published})
+ blog = message_obj.browse(request.cr, request.uid, message_id)
return blog.website_published and "1" or "0"
- @website.route(['/blog///post'], type='http', auth="admin")
- def blog_post(self, cr, uid, mail_group_id=None, blog_id=None, **post):
+ @http.route(['/blog///post'], type='http', auth="public")
+ def blog_post(self, mail_group_id=None, blog_id=None, **post):
+ request.uid = website.get_request.uid()
url = request.httprequest.host_url
if post.get('body'):
request.session.body = post.get('body')
- if not self.isloggued():
+ if not request.uid != request.public_uid:
return '%s/admin#action=redirect&url=%s/blog/%s/%s/post' % (url, url, mail_group_id, blog_id)
if 'body' in request.session and request.session.body:
- request.registry['mail.group'].message_post(cr, uid, mail_group_id,
+ request.registry['mail.group'].message_post(request.cr, request.uid, mail_group_id,
body=request.session.body,
parent_id=blog_id,
website_published=blog_id and True or False,
type='comment',
subtype='mt_comment',
- context={'mail_create_nosubscribe': True},
+ context={'mail_create_nosubsrequest.cribe': True},
)
request.session.body = False
@@ -95,14 +99,15 @@ class website_mail(website):
else:
return werkzeug.utils.redirect("/blog/%s/%s" % (mail_group_id, blog_id))
- @website.route(['/blog//new'], type='http', auth="admin")
- def new_blog_post(self, cr, uid, mail_group_id=None, **post):
- blog_id = request.registry['mail.group'].message_post(cr, uid, mail_group_id,
+ @http.route(['/blog//new'], type='http', auth="public")
+ def new_blog_post(self, mail_group_id=None, **post):
+ request.uid = website.get_request.uid()
+ blog_id = request.registry['mail.group'].message_post(request.cr, request.uid, mail_group_id,
body=_("Blog content.
Please edit this content then you can publish this blog."),
subject=_("Blog title"),
website_published=False,
type='comment',
subtype='mt_comment',
- context={'mail_create_nosubscribe': True},
+ context={'mail_create_nosubsrequest.cribe': True},
)
return werkzeug.utils.redirect("/blog/%s/%s" % (mail_group_id, blog_id))
diff --git a/addons/website_mail/mail_message.py b/addons/website_mail/mail_message.py
index c3133f06f7e..b939a258ba0 100644
--- a/addons/website_mail/mail_message.py
+++ b/addons/website_mail/mail_message.py
@@ -32,12 +32,12 @@ class mail_message(osv.osv):
class mail_group(osv.Model):
_inherit = 'mail.group'
- def get_public_domain(self, cr, uid, context=None):
+ def get_public_blog(self, cr, uid, context=None):
mail_group_ids = self.search(cr, uid, [('public', '=', 'public')], context=context)
return [ ("type", "in", ['comment']),
("parent_id", "=", False),
("model", "=", 'mail.group'), ("res_id", "in", mail_group_ids)]
def get_public_message_ids(self, cr, uid, domain=[], order="create_date desc", limit=10, offset=0, context=None):
- domain += self.get_public_domain(cr, uid, context=context)
+ domain += self.get_public_blog(cr, uid, context=context)
return self.pool.get('mail.message').search(cr, uid, domain, order=order, limit=limit, offset=offset, context=context)
diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index 9067dc50a4a..ecafe3d67b0 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -2,67 +2,51 @@
import simplejson
from openerp.addons.web import http
+from openerp.addons.website import website
from openerp.addons.web.http import request
-from openerp.addons.website.controllers.main import template_values
class Ecommerce(http.Controller):
- def get_cr_uid(self):
- cr = request.cr
- uid = request.uid
-
- if request.session._uid:
- request.httprequest.session['ecommerce_partner_id'] = False
- partner_id = request.registry.get('res.users').browse(cr, uid, request.session._uid).partner_id.id
- else:
- partner_id = request.httprequest.session.get('ecommerce_partner_id', False)
- if partner_id and not request.registry.get('res.partner').search(cr, uid, [('id', '=', partner_id)]):
- partner_id = None
- return (cr, uid, partner_id)
-
def get_categories(self):
- cr, uid, partner_id = self.get_cr_uid()
category_obj = request.registry.get('pos.category')
- category_ids = category_obj.search(cr, uid, [('parent_id', '=', False)])
- return category_obj.browse(cr, uid, category_ids)
+ category_ids = category_obj.search(request.cr, request.uid, [('parent_id', '=', False)])
+ return category_obj.browse(request.cr, request.uid, category_ids)
+
+ def get_current_order(self):
+ order = self.get_order(request.httprequest.session.get('ecommerce_order'))
+ request.httprequest.session['ecommerce_order'] = order.id
+ return order
def get_order(self, order_id=None):
- cr, uid, partner_id = self.get_cr_uid()
+
order_obj = request.registry.get('sale.order')
# check if order allready exists
if order_id:
try:
- order_obj.browse(cr, uid, order_id).pricelist_id
+ order_obj.browse(request.cr, request.uid, order_id).pricelist_id
except:
order_id = None
if not order_id:
fields = [k for k, v in order_obj._columns.items()]
- order_value = order_obj.default_get(cr, uid, fields)
- order_value['partner_id'] = partner_id or request.registry.get('res.users').browse(cr, uid, uid).partner_id.id
- order_value.update(order_obj.onchange_partner_id(cr, uid, [], uid, context={})['value'])
- order_id = order_obj.create(cr, uid, order_value)
- return order_obj.browse(cr, uid, order_id)
+ order_value = order_obj.default_get(request.cr, request.uid, fields)
+ order_value['partner_id'] = partner_id or request.registry.get('res.users').browse(request.cr, request.uid, request.uid).partner_id.id
+ order_value.update(order_obj.onchange_partner_id(request.cr, request.uid, [], request.uid, context={})['value'])
+ order_id = order_obj.create(request.cr, request.uid, order_value)
+ return order_obj.browse(request.cr, request.uid, order_id)
- def get_values(self):
- cr, uid, partner_id = self.get_cr_uid()
-
- order = self.get_order(request.httprequest.session.get('ecommerce_order'))
- request.httprequest.session['ecommerce_order'] = order.id
-
- values = template_values()
- values.update({
- 'temp': 0,
- 'res_company': request.registry['res.company'].browse(request.cr, 1, 1),
- 'order': order,
+ def render(self, template, values={}):
+ _values = {
+ 'order': self.get_current_order(),
'categories': self.get_categories(),
- })
- return values
+ }
+ _values.update(values)
+ return website.render(template, _values)
def recommended_product(self, my_pids):
if not my_pids:
return []
- cr, uid, partner_id = self.get_cr_uid()
+
my_pids = str(my_pids)[1:-1]
product_ids = []
query = """
@@ -76,99 +60,91 @@ class Ecommerce(http.Controller):
ORDER BY COUNT(sol.order_id) DESC
LIMIT 8
""" % (my_pids, my_pids)
- cr.execute(query)
- for p in cr.fetchall():
+ request.cr.execute(query)
+ for p in request.cr.fetchall():
product_ids.append(p[0])
- return request.registry.get('product.product').browse(cr, uid, product_ids)
+ return request.registry.get('product.product').browse(request.cr, request.uid, product_ids)
@http.route(['/shop', '/shop/category/'], type='http', auth="admin")
def category(self, cat_id=0, offset=0, **post):
- values = self.get_values()
- cr, uid, partner_id = self.get_cr_uid()
domain = []
if post.get("search"):
- domain += ['|', '|', ('name', 'ilike', "%%%s%%" % post.get("search")), ('description', 'ilike', "%%%s%%" % post.get("search")), ('pos_categ_id.name', 'ilike', "%%%s%%" % post.get("search"))]
+ domain += ['|', '|', ('name', 'ilike', "%%%s%%" % post.get("search")), ('desrequest.cription', 'ilike', "%%%s%%" % post.get("search")), ('pos_categ_id.name', 'ilike', "%%%s%%" % post.get("search"))]
if cat_id:
cat_id = cat_id and int(cat_id) or 0
domain = [('pos_categ_id.id', 'child_of', cat_id)] + domain
- category_obj = request.registry.get('pos.category')
product_obj = request.registry.get('product.product')
- category_ids = category_obj.search(cr, uid, [('parent_id', '=', False)])
- product_ids = product_obj.search(cr, uid, domain or [(1, '=', 1)], limit=20, offset=offset)
+ product_ids = product_obj.search(request.cr, request.uid, domain or [(1, '=', 1)], limit=20, offset=offset)
- values.update({
+ values = {
'current_category': cat_id,
- 'categories': category_obj.browse(cr, uid, category_ids),
- 'products': product_obj.browse(cr, uid, product_ids),
+ 'products': product_obj.browse(request.cr, request.uid, product_ids),
'search': post.get("search"),
- })
- html = request.registry.get("ir.ui.view").render(cr, uid, "website_sale.products", values)
+ }
+ html = self.render("website_sale.products", values)
return html
@http.route(['/shop/product/'], type='http', auth="admin")
def product(self, cat_id=0, product_id=0):
- values = self.get_values()
- cr, uid, partner_id = self.get_cr_uid()
+ order = self.get_current_order()
product_id = product_id and int(product_id) or 0
product_obj = request.registry.get('product.product')
- line = [line for line in values['order'].order_line if line.product_id.id == product_id]
+ line = [line for line in order.order_line if line.product_id.id == product_id]
quantity = line and int(line[0].product_uom_qty) or 0
- values.update({
- 'product': product_obj.browse(cr, uid, product_id),
+ values = {
+ 'product': product_obj.browse(request.cr, request.uid, product_id),
'quantity': quantity,
'recommended_products': self.recommended_product([product_id]),
- })
- html = request.registry.get("ir.ui.view").render(cr, uid, "website_sale.product", values)
+ }
+ html = self.render("website_sale.product", values)
return html
@http.route(['/shop/mycart'], type='http', auth="admin")
def mycart(self, **post):
- cr, uid, partner_id = self.get_cr_uid()
- values = self.get_values()
+ order = self.get_current_order()
if post.get('code'):
pricelist_obj = request.registry.get('product.pricelist')
- order_obj = request.registry.get('sale.order')
- pricelist_ids = pricelist_obj.search(cr, uid, [('code', '=', post.get('code'))])
+ pricelist_ids = pricelist_obj.search(request.cr, request.uid, [('code', '=', post.get('code'))])
if pricelist_ids:
- values["order"].write({'pricelist_id': pricelist_ids[0]})
+ order.write({'pricelist_id': pricelist_ids[0]})
- my_pids = [line.product_id.id for line in values['order'].order_line]
- values["recommended_products"] = self.recommended_product(my_pids)
+ my_pids = [line.product_id.id for line in order.order_line]
+ values= {"recommended_products": self.recommended_product(my_pids)}
- html = request.registry.get("ir.ui.view").render(cr, uid, "website_sale.mycart", values)
+ html = self.render("website_sale.mycart", values)
return html
@http.route(['/shop/add_cart'], type='http', auth="admin")
def add_cart(self, product_id=0, remove=False):
- cr, uid, partner_id = self.get_cr_uid()
- values = self.get_values()
+
context = {}
order_obj = request.registry.get('sale.order')
order_line_obj = request.registry.get('sale.order.line')
+ user_obj = request.registry.get('res.users')
product_id = product_id and int(product_id) or 0
- order = values['order']
+ order = self.get_current_order()
quantity = 0
# values initialisation
- order_line_ids = order_line_obj.search(cr, uid, [('order_id', '=', order.id), ('product_id', '=', product_id)], context=context)
+ order_line_ids = order_line_obj.search(request.cr, request.uid, [('order_id', '=', order.id), ('product_id', '=', product_id)], context=context)
values = {}
if order_line_ids:
- order_line = order_line_obj.read(cr, uid, order_line_ids, [], context=context)[0]
+ order_line = order_line_obj.read(request.cr, request.uid, order_line_ids, [], context=context)[0]
quantity = order_line['product_uom_qty'] + (remove and -1 or 1)
if quantity <= 0:
- order_line_obj.unlink(cr, uid, order_line_ids, context=context)
+ order_line_obj.unlink(request.cr, request.uid, order_line_ids, context=context)
else:
fields = [k for k, v in order_line_obj._columns.items()]
- values = order_line_obj.default_get(cr, uid, fields, context=context)
+ values = order_line_obj.default_get(request.cr, request.uid, fields, context=context)
quantity = 1
values['product_uom_qty'] = quantity
values['product_id'] = product_id
@@ -177,16 +153,16 @@ class Ecommerce(http.Controller):
# change and record value
if quantity:
pricelist_id = order.pricelist_id and order.pricelist_id.id or False
- values.update(order_line_obj.product_id_change(cr, uid, [], pricelist_id, product_id,
- partner_id=partner_id or request.registry.get('res.users').browse(cr, uid, uid).partner_id.id,
+ values.update(order_line_obj.product_id_change(request.cr, request.uid, [], pricelist_id, product_id,
+ partner_id=user_obj.browse(request.cr, request.uid, request.uid).partner_id.id,
context=context)['value'])
if order_line_ids:
- order_line_obj.write(cr, uid, order_line_ids, values, context=context)
+ order_line_obj.write(request.cr, request.uid, order_line_ids, values, context=context)
else:
- order_line_id = order_line_obj.create(cr, uid, values, context=context)
+ order_line_id = order_line_obj.create(request.cr, request.uid, values, context=context)
order.write({'order_line': [(4, order_line_id)]}, context=context)
- html = request.registry.get("ir.ui.view").render(cr, uid, "website_sale.total", self.get_values())
+ html = self.render("website_sale.total", self.get_values())
return simplejson.dumps({"quantity": quantity, "totalHTML": html})
@@ -196,9 +172,7 @@ class Ecommerce(http.Controller):
@http.route(['/shop/checkout'], type='http', auth="admin")
def checkout(self, **post):
- cr, uid, partner_id = self.get_cr_uid()
- values = self.get_values()
- order = values['order']
+ order = self.get_current_order()
if order.state != 'draft':
return self.confirmed(**post)
@@ -211,41 +185,38 @@ class Ecommerce(http.Controller):
country_state_obj = request.registry.get('res.country.state')
payment_obj = request.registry.get('portal.payment.acquirer')
- values['partner'] = False
+ values = {'partner': False}
- if post.get("login"):
- user_id = user_obj.login(cr, post.get("login"), post.get("password"))
- partner_id = user_obj.browse(cr, uid, user_id).partner_id.id
-
- if partner_id:
- values['partner'] = partner_obj.browse(cr, uid, partner_id)
- shipping_ids = partner_obj.search(cr, uid, [("parent_id", "=", partner_id), ('type', "=", 'delivery')])
+ if request.uid != request.public_uid:
+ values['partner'] = partner_obj.browse(request.cr, request.uid, partner_id)
+ shipping_ids = partner_obj.search(request.cr, request.uid, [("parent_id", "=", partner_id), ('type', "=", 'delivery')])
values['shipping'] = None
if shipping_ids:
- values['shipping'] = partner_obj.browse(cr, uid, shipping_ids[0])
+ values['shipping'] = partner_obj.browse(request.cr, request.uid, shipping_ids[0])
- values['countries'] = country_obj.browse(cr, uid, country_obj.search(cr, uid, [(1, "=", 1)]))
- values['states'] = country_state_obj.browse(cr, uid, country_state_obj.search(cr, uid, [(1, "=", 1)]))
+ values['countries'] = country_obj.browse(request.cr, request.uid, country_obj.search(request.cr, request.uid, [(1, "=", 1)]))
+ values['states'] = country_state_obj.browse(request.cr, request.uid, country_state_obj.search(request.cr, request.uid, [(1, "=", 1)]))
- payment_ids = payment_obj.search(cr, uid, [('visible', '=', True)])
- values['payments'] = payment_obj.browse(cr, uid, payment_ids)
+ payment_ids = payment_obj.search(request.cr, request.uid, [('visible', '=', True)])
+ values['payments'] = payment_obj.browse(request.cr, request.uid, payment_ids)
for payment in values['payments']:
- content = payment_obj.render(cr, uid, payment.id, order, order.name, order.pricelist_id.currency_id, order.amount_total)
+ content = payment_obj.render(request.cr, request.uid, payment.id, order, order.name, order.pricelist_id.currency_id, order.amount_total)
payment._content = content
- return request.registry.get("ir.ui.view").render(cr, uid, "website_sale.checkout", values)
+ return self.render("website_sale.checkout", values)
@http.route(['/shop/confirm_order'], type='http', auth="admin")
def confirm_order(self, **post):
- cr, uid, partner_id = self.get_cr_uid()
- values = self.get_values()
+ order = self.get_current_order()
+
json = {'error': [], 'validation': False}
partner_obj = request.registry.get('res.partner')
+ user_obj = request.registry.get('res.users')
- if values['order'].state != 'draft':
+ if order.state != 'draft':
json['validation'] = True
return json
- if not values['order'].order_line:
+ if not order.order_line:
json['error'].append("empty_cart")
return json
@@ -262,10 +233,10 @@ class Ecommerce(http.Controller):
# search or create company
company_id = None
if post['company']:
- company_ids = partner_obj.search(cr, uid, [("name", "ilike", post['company']), ('is_company', '=', True)])
+ company_ids = partner_obj.search(request.cr, request.uid, [("name", "ilike", post['company']), ('is_company', '=', True)])
company_id = company_ids and company_ids[0] or None
if not company_id:
- company_id = partner_obj.create(cr, uid, {'name': post['company'], 'is_company': True})
+ company_id = partner_obj.create(request.cr, request.uid, {'name': post['company'], 'is_company': True})
partner_value = {
'fax': post['fax'],
@@ -279,10 +250,11 @@ class Ecommerce(http.Controller):
'country_id': post['country_id'],
'state_id': post['state_id'],
}
- if partner_id:
- partner_obj.write(cr, uid, [partner_id], partner_value)
+ if request.uid != request.public_uid:
+ partner_id = user_obj.browse(request.cr, request.uid, request.uid).partner_id.id
+ partner_obj.write(request.cr, request.uid, [partner_id], partner_value)
else:
- partner_id = partner_obj.create(cr, uid, partner_value)
+ partner_id = partner_obj.create(request.cr, 1, partner_value)
shipping_id = None
if 'shipping_name' in post:
@@ -300,12 +272,12 @@ class Ecommerce(http.Controller):
}
domain = [(key, '_id' in key and '=' or 'ilike', '_id' in key and int(value) or value)
for key, value in shipping_value.items() if key in required_field + ["type", "parent_id"]]
- shipping_ids = partner_obj.search(cr, uid, domain)
+ shipping_ids = partner_obj.search(request.cr, request.uid, domain)
if shipping_ids:
shipping_id = shipping_ids[0]
- partner_obj.write(cr, uid, [shipping_id], shipping_value)
+ partner_obj.write(request.cr, request.uid, [shipping_id], shipping_value)
else:
- shipping_id = partner_obj.create(cr, uid, shipping_value)
+ shipping_id = partner_obj.create(request.cr, request.uid, shipping_value)
order_value = {
'state': 'progress',
@@ -313,18 +285,17 @@ class Ecommerce(http.Controller):
'partner_invoice_id': partner_id,
'partner_shipping_id': shipping_id or partner_id
}
- order_value.update(request.registry.get('sale.order').onchange_partner_id(cr, uid, [], uid, context={})['value'])
- values['order'].write(order_value)
+ order_value.update(request.registry.get('sale.order').onchange_partner_id(request.cr, request.uid, [], request.uid, context={})['value'])
+ order.write(order_value)
json['validation'] = True
return simplejson.dumps(json)
@http.route(['/shop/confirmed'], type='http', auth="admin")
def confirmed(self, **post):
- cr, uid, partner_id = self.get_cr_uid()
if request.httprequest.session.get('ecommerce_order'):
- order = self.get_order(request.httprequest.session.get('ecommerce_order'))
+ order = self.get_current_order()
if order.state != 'draft':
request.httprequest.session['ecommerce_order_old'] = order.id
request.httprequest.session['ecommerce_order'] = None
@@ -333,13 +304,11 @@ class Ecommerce(http.Controller):
if not order_old.order_line:
return self.mycart(**post)
- values = template_values()
- values.update({
+ values = {
'temp': 0,
- 'res_company': request.registry['res.company'].browse(request.cr, 1, 1),
'order': order_old,
'categories': self.get_categories(),
- })
- return request.registry.get("ir.ui.view").render(cr, uid, "website_sale.confirmed", values)
+ }
+ return self.render("website_sale.confirmed", values)
# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
From 7828e44ea541f5140c1b3a87d0411f21eb6c2da2 Mon Sep 17 00:00:00 2001
From: Launchpad Translations on behalf of openerp <>
Date: Fri, 2 Aug 2013 05:38:52 +0000
Subject: [PATCH 45/61] Launchpad automatic translations update.
bzr revid: launchpad_translations_on_behalf_of_openerp-20130727050216-3lqngtzz3y4eal03
bzr revid: launchpad_translations_on_behalf_of_openerp-20130728055452-udjnnr7f174dwx7s
bzr revid: launchpad_translations_on_behalf_of_openerp-20130729052557-z3cyhulfa50uou01
bzr revid: launchpad_translations_on_behalf_of_openerp-20130731051700-toxlygnbrq3rfi75
bzr revid: launchpad_translations_on_behalf_of_openerp-20130802053852-k0z9t3xzddxkqibc
---
addons/account_accountant/i18n/ja.po | 10 +-
addons/account_budget/i18n/ja.po | 10 +-
addons/account_cancel/i18n/uk.po | 23 ++
addons/point_of_sale/i18n/zh_CN.po | 248 ++++++++--------
addons/product/i18n/zh_CN.po | 30 +-
addons/stock/i18n/zh_CN.po | 406 +++++++++++++++------------
6 files changed, 400 insertions(+), 327 deletions(-)
create mode 100644 addons/account_cancel/i18n/uk.po
diff --git a/addons/account_accountant/i18n/ja.po b/addons/account_accountant/i18n/ja.po
index 9e2208e06cd..1da9c374c7f 100644
--- a/addons/account_accountant/i18n/ja.po
+++ b/addons/account_accountant/i18n/ja.po
@@ -8,19 +8,19 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2012-04-13 22:35+0000\n"
-"Last-Translator: FULL NAME \n"
+"PO-Revision-Date: 2013-07-30 22:25+0000\n"
+"Last-Translator: Masaki Yamaya \n"
"Language-Team: Japanese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:47+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-07-31 05:16+0000\n"
+"X-Generator: Launchpad (build 16718)\n"
#. module: account_accountant
#: model:ir.actions.client,name:account_accountant.action_client_account_menu
msgid "Open Accounting Menu"
-msgstr ""
+msgstr "会計メニューを開く"
#~ msgid ""
#~ "\n"
diff --git a/addons/account_budget/i18n/ja.po b/addons/account_budget/i18n/ja.po
index f69a34b9a82..4dd1ba0298f 100644
--- a/addons/account_budget/i18n/ja.po
+++ b/addons/account_budget/i18n/ja.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
-"PO-Revision-Date: 2012-06-13 17:16+0000\n"
-"Last-Translator: Akira Hiyama \n"
+"PO-Revision-Date: 2013-07-30 22:29+0000\n"
+"Last-Translator: Masaki Yamaya \n"
"Language-Team: Japanese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:34+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-07-31 05:16+0000\n"
+"X-Generator: Launchpad (build 16718)\n"
#. module: account_budget
#: view:account.budget.analytic:0
@@ -418,7 +418,7 @@ msgstr "からの分析"
#. module: account_budget
#: view:crossovered.budget:0
msgid "Draft Budgets"
-msgstr "ドラフト予算"
+msgstr "予算案"
#, python-format
#~ msgid "The General Budget '%s' has no Accounts!"
diff --git a/addons/account_cancel/i18n/uk.po b/addons/account_cancel/i18n/uk.po
new file mode 100644
index 00000000000..5fbae627883
--- /dev/null
+++ b/addons/account_cancel/i18n/uk.po
@@ -0,0 +1,23 @@
+# Ukrainian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-08-01 11:11+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Ukrainian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-08-02 05:38+0000\n"
+"X-Generator: Launchpad (build 16718)\n"
+
+#. module: account_cancel
+#: view:account.invoice:0
+msgid "Cancel"
+msgstr ""
diff --git a/addons/point_of_sale/i18n/zh_CN.po b/addons/point_of_sale/i18n/zh_CN.po
index 23dc97f2376..58d7c1f01de 100644
--- a/addons/point_of_sale/i18n/zh_CN.po
+++ b/addons/point_of_sale/i18n/zh_CN.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2013-04-24 06:41+0000\n"
-"Last-Translator: viney \n"
+"PO-Revision-Date: 2013-07-26 07:07+0000\n"
+"Last-Translator: Wei \"oldrev\" Li \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-04-25 05:20+0000\n"
-"X-Generator: Launchpad (build 16580)\n"
+"X-Launchpad-Export-Date: 2013-07-27 05:02+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: point_of_sale
#: field:report.transaction.pos,product_nb:0
@@ -51,7 +51,7 @@ msgstr "打印销售订单的收据"
#. module: point_of_sale
#: field:pos.session,cash_register_balance_end:0
msgid "Computed Balance"
-msgstr ""
+msgstr "计算余额"
#. module: point_of_sale
#: view:pos.session:0
@@ -62,7 +62,7 @@ msgstr "今天"
#. module: point_of_sale
#: field:pos.config,iface_electronic_scale:0
msgid "Electronic Scale Interface"
-msgstr ""
+msgstr "电子称接口"
#. module: point_of_sale
#: model:pos.category,name:point_of_sale.plain_water
@@ -85,7 +85,7 @@ msgstr ""
#: field:pos.config,journal_id:0
#: field:pos.order,sale_journal:0
msgid "Sale Journal"
-msgstr ""
+msgstr "销售日记账"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.spa_2l_product_template
@@ -102,7 +102,7 @@ msgstr "销售详情"
#. module: point_of_sale
#: constraint:pos.config:0
msgid "You cannot have two cash controls in one Point Of Sale !"
-msgstr ""
+msgstr "同一个销售点不能使用两个钱箱"
#. module: point_of_sale
#: field:pos.payment.report.user,user_id:0
@@ -111,7 +111,7 @@ msgstr ""
#: view:report.pos.order:0
#: field:report.pos.order,user_id:0
msgid "Salesperson"
-msgstr ""
+msgstr "销售员"
#. module: point_of_sale
#: view:report.pos.order:0
@@ -128,13 +128,13 @@ msgstr "产品名称"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.pamplemousse_rouge_pamplemousse_product_template
msgid "Red grapefruit"
-msgstr ""
+msgstr "红葡萄柚"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:1343
+#: code:addons/point_of_sale/point_of_sale.py:1373
#, python-format
msgid "Assign a Custom EAN"
-msgstr ""
+msgstr "使用自定义的条码"
#. module: point_of_sale
#: view:pos.session.opening:0
@@ -164,12 +164,12 @@ msgstr "取钱"
#: code:addons/point_of_sale/point_of_sale.py:105
#, python-format
msgid "not used"
-msgstr ""
+msgstr "未被使用"
#. module: point_of_sale
#: field:pos.config,iface_vkeyboard:0
msgid "Virtual KeyBoard Interface"
-msgstr ""
+msgstr "虚拟键盘接口"
#. module: point_of_sale
#. openerp-web
@@ -181,11 +181,11 @@ msgstr "+/-"
#. module: point_of_sale
#: field:pos.ean_wizard,ean13_pattern:0
msgid "Reference"
-msgstr ""
+msgstr "单号"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:1041
-#: code:addons/point_of_sale/point_of_sale.py:1057
+#: code:addons/point_of_sale/point_of_sale.py:1066
+#: code:addons/point_of_sale/point_of_sale.py:1083
#: report:pos.invoice:0
#: report:pos.lines:0
#, python-format
@@ -200,32 +200,32 @@ msgstr "开始日期"
#. module: point_of_sale
#: constraint:pos.session:0
msgid "You cannot create two active sessions with the same responsible!"
-msgstr ""
+msgstr "同一个负责人不能创建两个活动销售会话"
#. module: point_of_sale
#. openerp-web
#: code:addons/point_of_sale/static/src/xml/pos.xml:473
#, python-format
msgid "Weighting"
-msgstr ""
+msgstr "称重"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.fenouil_fenouil_product_template
msgid "Fennel"
-msgstr ""
+msgstr "小茴香"
#. module: point_of_sale
#. openerp-web
#: code:addons/point_of_sale/static/src/xml/pos.xml:472
#, python-format
msgid "Help needed"
-msgstr ""
+msgstr "需要帮助"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:739
+#: code:addons/point_of_sale/point_of_sale.py:760
#, python-format
msgid "Configuration Error!"
-msgstr ""
+msgstr "设置错误!"
#. module: point_of_sale
#: report:account.statement:0
@@ -237,7 +237,7 @@ msgstr "业务伙伴"
#. module: point_of_sale
#: view:pos.session:0
msgid "Closing Cash Control"
-msgstr ""
+msgstr "关闭现金箱"
#. module: point_of_sale
#: report:pos.details:0
@@ -259,7 +259,7 @@ msgstr "会计信息"
#. module: point_of_sale
#: field:pos.session.opening,show_config:0
msgid "Show Config"
-msgstr ""
+msgstr "显示配置"
#. module: point_of_sale
#: report:pos.lines:0
@@ -277,7 +277,7 @@ msgstr "折扣合计"
#: code:addons/point_of_sale/static/src/xml/pos.xml:441
#, python-format
msgid "Debug Window"
-msgstr ""
+msgstr "调试窗口"
#. module: point_of_sale
#. openerp-web
@@ -315,10 +315,10 @@ msgid "Disc.(%)"
msgstr "折扣(%)"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:1006
+#: code:addons/point_of_sale/point_of_sale.py:1031
#, python-format
msgid "Please define income account for this product: \"%s\" (id:%d)."
-msgstr ""
+msgstr "请为这个产品定义收益科目:\"%s\" (id:%d)."
#. module: point_of_sale
#: view:report.pos.order:0
@@ -336,7 +336,7 @@ msgstr "Leffe Brune 33cl"
msgid ""
"Check this if this point of sale should open by default in a self checkout "
"mode. If unchecked, OpenERP uses the normal cashier mode by default."
-msgstr ""
+msgstr "如果需要把自助收银作为默认模式,请选中这里。 如果未选, OpenERP 将使用普通收银员作为默认模式。"
#. module: point_of_sale
#: model:ir.actions.report.xml,name:point_of_sale.pos_sales_user
@@ -353,7 +353,7 @@ msgstr "饮料类"
#: model:ir.actions.act_window,name:point_of_sale.action_pos_session_opening
#: model:ir.ui.menu,name:point_of_sale.menu_pos_session_opening
msgid "Your Session"
-msgstr ""
+msgstr "您的销售会话"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.stella_50cl_product_template
@@ -375,12 +375,12 @@ msgstr "上级类别"
#: code:addons/point_of_sale/static/src/xml/pos.xml:482
#, python-format
msgid "Open Cashbox"
-msgstr ""
+msgstr "打开钱箱"
#. module: point_of_sale
#: view:pos.session.opening:0
msgid "Select your Point of Sale"
-msgstr ""
+msgstr "选择您的销售点"
#. module: point_of_sale
#: field:report.sales.by.margin.pos,total:0
@@ -404,25 +404,25 @@ msgstr "Dr. Oetker Ristorante Speciale"
#: code:addons/point_of_sale/static/src/xml/pos.xml:480
#, python-format
msgid "Payment Request"
-msgstr ""
+msgstr "付款请求"
#. module: point_of_sale
#: field:product.product,to_weight:0
msgid "To Weight"
-msgstr ""
+msgstr "需要称重"
#. module: point_of_sale
#. openerp-web
#: code:addons/point_of_sale/static/src/xml/pos.xml:476
#, python-format
msgid "Hardware Events"
-msgstr ""
+msgstr "硬件事件"
#. module: point_of_sale
#: code:addons/point_of_sale/point_of_sale.py:301
#, python-format
msgid "You should assign a Point of Sale to your session."
-msgstr ""
+msgstr "您需要为您的销售会话指定一个销售点"
#. module: point_of_sale
#: view:pos.order.line:0
@@ -435,7 +435,7 @@ msgid "Fanta Orange 33cl"
msgstr "Fanta Orange 33cl"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:420
+#: code:addons/point_of_sale/point_of_sale.py:423
#, python-format
msgid ""
"Please set your profit and loss accounts on your payment method '%s'. This "
@@ -446,10 +446,10 @@ msgstr ""
#. module: point_of_sale
#: code:addons/point_of_sale/point_of_sale.py:315
-#: code:addons/point_of_sale/point_of_sale.py:512
+#: code:addons/point_of_sale/point_of_sale.py:514
#, python-format
msgid "error!"
-msgstr ""
+msgstr "错误!"
#. module: point_of_sale
#: model:ir.actions.act_window,name:point_of_sale.action_report_sales_by_user_pos_month
@@ -471,12 +471,12 @@ msgstr ""
#. module: point_of_sale
#: model:product.template,name:point_of_sale.Onions_product_template
msgid "Onions"
-msgstr ""
+msgstr "洋葱"
#. module: point_of_sale
#: view:pos.session:0
msgid "Validate & Open Session"
-msgstr ""
+msgstr "验证并打开销售会话"
#. module: point_of_sale
#: code:addons/point_of_sale/point_of_sale.py:99
@@ -484,18 +484,18 @@ msgstr ""
#: selection:pos.session.opening,pos_state:0
#, python-format
msgid "In Progress"
-msgstr ""
+msgstr "进行中"
#. module: point_of_sale
#: view:pos.session:0
#: field:pos.session,opening_details_ids:0
msgid "Opening Cash Control"
-msgstr ""
+msgstr "正在打开钱箱"
#. module: point_of_sale
#: help:res.users,ean13:0
msgid "BarCode"
-msgstr ""
+msgstr "条码"
#. module: point_of_sale
#: help:pos.category,image_medium:0
@@ -508,19 +508,19 @@ msgstr ""
#. module: point_of_sale
#: view:pos.session.opening:0
msgid "Open Session"
-msgstr ""
+msgstr "打开销售会话"
#. module: point_of_sale
#: model:ir.ui.menu,name:point_of_sale.menu_point_of_sale
msgid "Daily Operations"
-msgstr "每天经营"
+msgstr "日常经营"
#. module: point_of_sale
#. openerp-web
#: code:addons/point_of_sale/static/src/xml/pos.xml:42
#, python-format
msgid "Google Chrome"
-msgstr ""
+msgstr "Google Chrome"
#. module: point_of_sale
#: model:pos.category,name:point_of_sale.sparkling_water
@@ -543,7 +543,7 @@ msgstr "查询现金对账单"
#: field:pos.session.opening,pos_state_str:0
#: field:report.pos.order,state:0
msgid "Status"
-msgstr ""
+msgstr "状态"
#. module: point_of_sale
#: selection:report.pos.order,month:0
@@ -568,14 +568,14 @@ msgstr "POS单明细"
#. module: point_of_sale
#: view:pos.config:0
msgid "Point of Sale Configuration"
-msgstr ""
+msgstr "销售点配置"
#. module: point_of_sale
#. openerp-web
#: code:addons/point_of_sale/static/src/xml/pos.xml:359
#, python-format
msgid "Your order has to be validated by a cashier."
-msgstr ""
+msgstr "您的订单已被收银员确认"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.fanta_orange_50cl_product_template
@@ -609,7 +609,7 @@ msgid ""
msgstr ""
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:867
+#: code:addons/point_of_sale/point_of_sale.py:888
#, python-format
msgid "Customer Invoice"
msgstr "客户发票"
@@ -619,7 +619,7 @@ msgstr "客户发票"
msgid ""
"You can continue sales from the touchscreen interface by clicking on \"Start "
"Selling\" or close the cash register session."
-msgstr ""
+msgstr "通过触摸屏幕的“开始销售”或者关闭钱箱之后您就可以继续进行销售。"
#. module: point_of_sale
#: report:account.statement:0
@@ -631,7 +631,7 @@ msgstr "结束日期"
#. module: point_of_sale
#: view:pos.session:0
msgid "Opening Cashbox Lines"
-msgstr ""
+msgstr "正在打开钱箱"
#. module: point_of_sale
#: selection:report.pos.order,month:0
@@ -678,7 +678,7 @@ msgstr "行号"
#: code:addons/point_of_sale/static/src/xml/pos.xml:453
#, python-format
msgid "Set Weight"
-msgstr ""
+msgstr "设置重量"
#. module: point_of_sale
#: view:account.bank.statement:0
@@ -693,7 +693,7 @@ msgstr "净合计:"
#. module: point_of_sale
#: model:ir.actions.client,name:point_of_sale.action_client_pos_menu
msgid "Open POS Menu"
-msgstr ""
+msgstr "打开销售点菜单"
#. module: point_of_sale
#: report:pos.details_summary:0
@@ -710,12 +710,12 @@ msgstr "发表POS机日记帐分录"
#: code:addons/point_of_sale/static/src/xml/pos.xml:457
#, python-format
msgid "Barcode Scanner"
-msgstr ""
+msgstr "条码扫描器"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.pomme_granny_smith_product_template
msgid "Granny Smith apples"
-msgstr ""
+msgstr "Granny Smith 苹果"
#. module: point_of_sale
#: help:product.product,expense_pdt:0
@@ -743,7 +743,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.session.opening:0
msgid "Click to start a session."
-msgstr ""
+msgstr "单击开始销售会话"
#. module: point_of_sale
#: view:pos.details:0
@@ -778,7 +778,7 @@ msgstr "新增产品"
#. module: point_of_sale
#: field:pos.config,name:0
msgid "Point of Sale Name"
-msgstr ""
+msgstr "销售点名称"
#. module: point_of_sale
#: field:report.transaction.pos,invoice_am:0
@@ -825,7 +825,7 @@ msgstr "期末结余"
#: code:addons/point_of_sale/wizard/pos_box_out.py:89
#, python-format
msgid "please check that account is set to %s."
-msgstr ""
+msgstr "请检查该科目已经设为为:%s"
#. module: point_of_sale
#: help:pos.category,image:0
@@ -863,7 +863,7 @@ msgstr ""
#. module: point_of_sale
#: view:pos.ean_wizard:0
msgid "Ean13 Generator"
-msgstr ""
+msgstr "条码生成器"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.spa_1l_product_template
@@ -879,7 +879,7 @@ msgstr "错误:无效的EAN编码"
#. module: point_of_sale
#: model:pos.category,name:point_of_sale.legumes_racine
msgid "Root vegetables"
-msgstr ""
+msgstr "根类蔬菜"
#. module: point_of_sale
#: model:ir.actions.act_window,name:point_of_sale.act_pos_open_statement
@@ -939,7 +939,7 @@ msgstr ""
#. module: point_of_sale
#: view:res.users:0
msgid "Edit EAN"
-msgstr ""
+msgstr "编辑条码"
#. module: point_of_sale
#: code:addons/point_of_sale/wizard/pos_open_statement.py:80
@@ -965,7 +965,7 @@ msgstr ""
#. module: point_of_sale
#: field:pos.session.opening,pos_session_id:0
msgid "PoS Session"
-msgstr ""
+msgstr "销售点会话"
#. module: point_of_sale
#: selection:report.pos.order,month:0
@@ -979,7 +979,7 @@ msgid "User's Product"
msgstr "用户的产品"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:1143
+#: code:addons/point_of_sale/point_of_sale.py:1173
#, python-format
msgid ""
"You have to select a pricelist in the sale form !\n"
@@ -1011,7 +1011,7 @@ msgstr "增加一个全局折扣"
#. module: point_of_sale
#: view:pos.config:0
msgid "Journals"
-msgstr ""
+msgstr "日记账"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.oetker_prosciutto_product_template
@@ -1031,7 +1031,7 @@ msgstr "Coca-Cola Light Lemon 50cl"
#. module: point_of_sale
#. openerp-web
-#: code:addons/point_of_sale/point_of_sale.py:518
+#: code:addons/point_of_sale/point_of_sale.py:520
#: code:addons/point_of_sale/static/src/xml/pos.xml:689
#: code:addons/point_of_sale/static/src/xml/pos.xml:744
#, python-format
@@ -1041,7 +1041,7 @@ msgstr ""
#. module: point_of_sale
#: view:product.product:0
msgid "Set a Custom EAN"
-msgstr ""
+msgstr "设置自定义条码"
#. module: point_of_sale
#. openerp-web
@@ -1053,7 +1053,7 @@ msgstr ""
#. module: point_of_sale
#: model:pos.category,name:point_of_sale.legumes
msgid "Fresh vegetables"
-msgstr ""
+msgstr "新鲜蔬菜"
#. module: point_of_sale
#: view:pos.session:0
@@ -1065,7 +1065,7 @@ msgstr ""
#: code:addons/point_of_sale/static/src/xml/pos.xml:478
#, python-format
msgid "Scan Item Success"
-msgstr ""
+msgstr "扫描条目成功"
#. module: point_of_sale
#: report:account.statement:0
@@ -1082,17 +1082,17 @@ msgstr ""
#. module: point_of_sale
#: sql_constraint:pos.session:0
msgid "The name of this POS Session must be unique !"
-msgstr ""
+msgstr "销售会话名称必须唯一"
#. module: point_of_sale
#: view:pos.session:0
msgid "Opening Subtotal"
-msgstr ""
+msgstr "小计"
#. module: point_of_sale
#: view:pos.session:0
msgid "payment method."
-msgstr ""
+msgstr "付款方式"
#. module: point_of_sale
#: view:pos.order:0
@@ -1137,7 +1137,7 @@ msgstr "折扣"
#. module: point_of_sale
#: view:pos.order:0
msgid "(update)"
-msgstr ""
+msgstr "(更新)"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.ijsboerke_vanille_2,5l_product_template
@@ -1153,12 +1153,12 @@ msgstr "销售详情"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.evian_2l_product_template
msgid "2L Evian"
-msgstr ""
+msgstr "2L 依云"
#. module: point_of_sale
#: code:addons/point_of_sale/point_of_sale.py:373
-#: code:addons/point_of_sale/point_of_sale.py:472
-#: code:addons/point_of_sale/wizard/pos_session_opening.py:34
+#: code:addons/point_of_sale/point_of_sale.py:474
+#: code:addons/point_of_sale/wizard/pos_session_opening.py:33
#, python-format
msgid "Start Point Of Sale"
msgstr ""
@@ -1215,14 +1215,14 @@ msgstr "Chaudfontaine Petillante 50cl"
#: code:addons/point_of_sale/static/src/xml/pos.xml:485
#, python-format
msgid "Read Weighting Scale"
-msgstr ""
+msgstr "读取电子秤"
#. module: point_of_sale
#. openerp-web
#: code:addons/point_of_sale/static/src/xml/pos.xml:426
#, python-format
msgid "0.00 €"
-msgstr ""
+msgstr "0.00 €"
#. module: point_of_sale
#: field:pos.order.line,create_date:0
@@ -1240,7 +1240,7 @@ msgstr "今天的销售情况"
#: code:addons/point_of_sale/static/src/xml/pos.xml:324
#, python-format
msgid "Welcome"
-msgstr ""
+msgstr "欢迎"
#. module: point_of_sale
#: code:addons/point_of_sale/wizard/pos_box_entries.py:46
@@ -1295,7 +1295,7 @@ msgstr "已开票合计"
#: model:ir.model,name:point_of_sale.model_pos_category
#: field:product.product,pos_categ_id:0
msgid "Point of Sale Category"
-msgstr ""
+msgstr "销售点商品分类"
#. module: point_of_sale
#: view:report.pos.order:0
@@ -1315,7 +1315,7 @@ msgstr ""
#: code:addons/point_of_sale/static/src/xml/pos.xml:324
#, python-format
msgid "Choose your type of receipt:"
-msgstr ""
+msgstr "选择小票类型"
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_report_sales_by_margin_pos_month
@@ -1352,7 +1352,7 @@ msgstr ""
#: code:addons/point_of_sale/static/src/xml/pos.xml:479
#, python-format
msgid "Scan Item Unrecognized"
-msgstr ""
+msgstr "未能识别扫描的条目"
#. module: point_of_sale
#: report:all.closed.cashbox.of.the.day:0
@@ -1360,7 +1360,7 @@ msgid "Today's Closed Cashbox"
msgstr "今日关闭的钱箱"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:897
+#: code:addons/point_of_sale/point_of_sale.py:920
#, python-format
msgid "Selected orders do not have the same session!"
msgstr ""
@@ -1396,7 +1396,7 @@ msgstr "开启日期"
#: model:ir.actions.act_window,name:point_of_sale.action_pos_session
#: model:ir.ui.menu,name:point_of_sale.menu_pos_session_all
msgid "All Sessions"
-msgstr ""
+msgstr "全部销售会话"
#. module: point_of_sale
#. openerp-web
@@ -1415,7 +1415,7 @@ msgstr "税:"
#: code:addons/point_of_sale/static/src/xml/pos.xml:271
#, python-format
msgid "Thank you for shopping with us."
-msgstr ""
+msgstr "感谢您的光临。"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.coca_light_2l_product_template
@@ -1431,7 +1431,7 @@ msgstr "Dr. Oetker Ristorante Funghi"
#: model:ir.actions.act_window,name:point_of_sale.pos_category_action
#: model:ir.ui.menu,name:point_of_sale.menu_pos_category
msgid "Product Categories"
-msgstr ""
+msgstr "商品类别"
#. module: point_of_sale
#: help:pos.config,journal_id:0
@@ -1448,7 +1448,7 @@ msgstr "折扣"
#: code:addons/point_of_sale/static/src/xml/pos.xml:467
#, python-format
msgid "Invalid Ean"
-msgstr ""
+msgstr "无效的条码"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.lindemans_kriek_37,5cl_product_template
@@ -1458,7 +1458,7 @@ msgstr "Lindemans Kriek 37.5cl"
#. module: point_of_sale
#: view:pos.config:0
msgid "Point of Sale Config"
-msgstr ""
+msgstr "销售点配置"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.coca_zero_33cl_product_template
@@ -1511,7 +1511,7 @@ msgstr "税:"
#. module: point_of_sale
#: view:pos.session:0
msgid "+ Transactions"
-msgstr ""
+msgstr "+ 交易"
#. module: point_of_sale
#: model:ir.actions.act_window,name:point_of_sale.action_pos_discount
@@ -1541,12 +1541,12 @@ msgstr "用户"
#: code:addons/point_of_sale/static/src/xml/pos.xml:194
#, python-format
msgid "Kg"
-msgstr ""
+msgstr "千克"
#. module: point_of_sale
#: field:product.product,available_in_pos:0
msgid "Available in the Point of Sale"
-msgstr ""
+msgstr "可在销售点销售"
#. module: point_of_sale
#: selection:pos.config,state:0
@@ -1563,7 +1563,7 @@ msgstr ""
#: code:addons/point_of_sale/static/src/xml/pos.xml:338
#, python-format
msgid "The scanned product was not recognized"
-msgstr ""
+msgstr "无法识别扫描的商品"
#. module: point_of_sale
#: model:ir.model,name:point_of_sale.model_report_transaction_pos
@@ -1613,7 +1613,7 @@ msgstr "11月"
#: code:addons/point_of_sale/static/src/xml/pos.xml:267
#, python-format
msgid "Please scan an item or your member card"
-msgstr ""
+msgstr "请扫描商品或您的会员卡"
#. module: point_of_sale
#: model:product.template,name:point_of_sale.poivron_verts_product_template
@@ -1644,7 +1644,7 @@ msgid "Number of Transaction"
msgstr "交易数"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:738
+#: code:addons/point_of_sale/point_of_sale.py:759
#, python-format
msgid ""
"There is no receivable account defined to make payment for the partner: "
@@ -1655,7 +1655,7 @@ msgstr ""
#: view:pos.config:0
#: selection:pos.config,state:0
msgid "Inactive"
-msgstr ""
+msgstr "不活跃的"
#. module: point_of_sale
#. openerp-web
@@ -1679,7 +1679,7 @@ msgstr "取消"
#: code:addons/point_of_sale/static/src/xml/pos.xml:296
#, python-format
msgid "Please put your product on the scale"
-msgstr ""
+msgstr "请将商品放到称上"
#. module: point_of_sale
#: model:ir.actions.report.xml,name:point_of_sale.pos_details_summary
@@ -1699,7 +1699,7 @@ msgstr "Timmermans Kriek 37.5cl"
#. module: point_of_sale
#: field:pos.config,sequence_id:0
msgid "Order IDs Sequence"
-msgstr ""
+msgstr "订单号序列"
#. module: point_of_sale
#: report:pos.invoice:0
@@ -1815,7 +1815,7 @@ msgid "Difference"
msgstr ""
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:529
+#: code:addons/point_of_sale/point_of_sale.py:549
#, python-format
msgid "Unable to Delete !"
msgstr "不能删除!"
@@ -1978,7 +1978,7 @@ msgid "Salespeople"
msgstr ""
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:756
+#: code:addons/point_of_sale/point_of_sale.py:777
#: code:addons/point_of_sale/wizard/pos_box_entries.py:118
#: code:addons/point_of_sale/wizard/pos_box_out.py:91
#, python-format
@@ -1986,7 +1986,7 @@ msgid "You have to open at least one cashbox."
msgstr ""
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:1142
+#: code:addons/point_of_sale/point_of_sale.py:1172
#, python-format
msgid "No Pricelist !"
msgstr "没有价格表!"
@@ -2038,7 +2038,7 @@ msgid "No Cash Register Defined !"
msgstr "没有定义收银机"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:513
+#: code:addons/point_of_sale/point_of_sale.py:515
#, python-format
msgid ""
"No cash statement found for this session. Unable to record returned cash."
@@ -2761,7 +2761,7 @@ msgid "Pos Lines"
msgstr "销售单明细"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:413
+#: code:addons/point_of_sale/point_of_sale.py:416
#, python-format
msgid "Point of Sale Profit"
msgstr ""
@@ -2774,7 +2774,7 @@ msgid "Please wait, a cashier is on the way"
msgstr ""
#. module: point_of_sale
-#: code:addons/point_of_sale/wizard/pos_session_opening.py:68
+#: code:addons/point_of_sale/wizard/pos_session_opening.py:67
#: field:pos.box.entries,session_id:0
#: view:pos.order:0
#: field:pos.order,session_id:0
@@ -3085,15 +3085,17 @@ msgstr ""
#. module: point_of_sale
#: code:addons/point_of_sale/point_of_sale.py:300
#: code:addons/point_of_sale/point_of_sale.py:409
-#: code:addons/point_of_sale/point_of_sale.py:419
-#: code:addons/point_of_sale/point_of_sale.py:457
-#: code:addons/point_of_sale/point_of_sale.py:712
-#: code:addons/point_of_sale/point_of_sale.py:756
-#: code:addons/point_of_sale/point_of_sale.py:818
-#: code:addons/point_of_sale/point_of_sale.py:897
-#: code:addons/point_of_sale/point_of_sale.py:1006
+#: code:addons/point_of_sale/point_of_sale.py:412
+#: code:addons/point_of_sale/point_of_sale.py:422
+#: code:addons/point_of_sale/point_of_sale.py:459
+#: code:addons/point_of_sale/point_of_sale.py:536
+#: code:addons/point_of_sale/point_of_sale.py:733
+#: code:addons/point_of_sale/point_of_sale.py:777
+#: code:addons/point_of_sale/point_of_sale.py:839
+#: code:addons/point_of_sale/point_of_sale.py:920
+#: code:addons/point_of_sale/point_of_sale.py:1031
#: code:addons/point_of_sale/report/pos_invoice.py:46
-#: code:addons/point_of_sale/wizard/pos_box.py:23
+#: code:addons/point_of_sale/wizard/pos_box.py:22
#: code:addons/point_of_sale/wizard/pos_box_entries.py:46
#: code:addons/point_of_sale/wizard/pos_box_entries.py:118
#: code:addons/point_of_sale/wizard/pos_box_entries.py:123
@@ -3187,13 +3189,13 @@ msgid "Chaudfontaine 1.5l"
msgstr "Chaudfontaine 1.5l"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:1069
+#: code:addons/point_of_sale/point_of_sale.py:1096
#, python-format
msgid "Trade Receivables"
msgstr ""
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:529
+#: code:addons/point_of_sale/point_of_sale.py:549
#, python-format
msgid "In order to delete a sale, it must be new or cancelled."
msgstr "只有新的或被取消的销售流水可以删除"
@@ -3228,7 +3230,7 @@ msgid "Journal Entry"
msgstr "日记账簿"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:736
+#: code:addons/point_of_sale/point_of_sale.py:757
#, python-format
msgid "There is no receivable account defined to make payment."
msgstr ""
@@ -3259,7 +3261,7 @@ msgid "Supplier Invoice"
msgstr "供应商发票"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:458
+#: code:addons/point_of_sale/point_of_sale.py:460
#, python-format
msgid ""
"You cannot confirm all orders of this session, because they have not the "
@@ -3338,7 +3340,7 @@ msgid "Coca-Cola Regular 1L"
msgstr "Coca-Cola Regular 1L"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:712
+#: code:addons/point_of_sale/point_of_sale.py:733
#, python-format
msgid "Unable to cancel the picking."
msgstr "无法取消发货"
@@ -3379,7 +3381,7 @@ msgid "Spa Barisart 1.5l"
msgstr "Spa Barisart 1.5l"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:789
+#: code:addons/point_of_sale/point_of_sale.py:810
#: view:pos.order:0
#, python-format
msgid "Return Products"
@@ -3495,7 +3497,7 @@ msgid "Default Point of Sale"
msgstr ""
#. module: point_of_sale
-#: code:addons/point_of_sale/wizard/pos_box.py:24
+#: code:addons/point_of_sale/wizard/pos_box.py:23
#, python-format
msgid "There is no cash register for this PoS Session"
msgstr ""
@@ -3539,7 +3541,7 @@ msgid "PRO-FORMA"
msgstr "形式发票"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:818
+#: code:addons/point_of_sale/point_of_sale.py:839
#, python-format
msgid "Please provide a partner for the sale."
msgstr "请提供业务伙伴。"
@@ -3591,7 +3593,7 @@ msgid "Print Receipt"
msgstr "打印收银条"
#. module: point_of_sale
-#: code:addons/point_of_sale/point_of_sale.py:417
+#: code:addons/point_of_sale/point_of_sale.py:420
#, python-format
msgid "Point of Sale Loss"
msgstr ""
@@ -4020,6 +4022,7 @@ msgstr ""
#~ msgid "Discount percentage"
#~ msgstr "折扣百分比"
+#, python-format
#~ msgid "Close"
#~ msgstr "关闭"
@@ -4843,9 +4846,11 @@ msgstr ""
#~ msgid "Subtotal:"
#~ msgstr "小计:"
+#, python-format
#~ msgid "Validate"
#~ msgstr "确认"
+#, python-format
#~ msgid "Print"
#~ msgstr "打印"
@@ -4931,6 +4936,7 @@ msgstr ""
#~ msgid "PoS Backend"
#~ msgstr "POS后端"
+#, python-format
#~ msgid "Next Order"
#~ msgstr "下一订单"
diff --git a/addons/product/i18n/zh_CN.po b/addons/product/i18n/zh_CN.po
index bd28e914c5e..470e1c0632b 100644
--- a/addons/product/i18n/zh_CN.po
+++ b/addons/product/i18n/zh_CN.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
-"PO-Revision-Date: 2012-11-27 09:28+0000\n"
-"Last-Translator: 盈通 ccdos \n"
+"PO-Revision-Date: 2013-07-28 11:18+0000\n"
+"Last-Translator: Wei \"oldrev\" Li \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:25+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-07-29 05:25+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: product
#: field:product.packaging,rows:0
@@ -513,7 +513,7 @@ msgstr "标准耳机"
#. module: product
#: model:product.uom,name:product.product_uom_day
msgid "Day(s)"
-msgstr ""
+msgstr "天"
#. module: product
#: help:product.product,incoming_qty:0
@@ -800,7 +800,7 @@ msgstr "结束日期"
#. module: product
#: model:product.uom,name:product.product_uom_litre
msgid "Liter(s)"
-msgstr ""
+msgstr "升"
#. module: product
#: view:product.price_list:0
@@ -843,7 +843,7 @@ msgstr "价格表"
#. module: product
#: model:product.uom,name:product.product_uom_hour
msgid "Hour(s)"
-msgstr ""
+msgstr "小时"
#. module: product
#: selection:product.template,state:0
@@ -1114,7 +1114,7 @@ msgstr "右父项"
#. module: product
#: field:product.product,price:0
msgid "Price"
-msgstr ""
+msgstr "价格"
#. module: product
#: field:product.pricelist.item,price_surcharge:0
@@ -1192,7 +1192,7 @@ msgstr "显示产品列表的顺序号"
#. module: product
#: model:product.uom,name:product.product_uom_dozen
msgid "Dozen(s)"
-msgstr ""
+msgstr "打"
#. module: product
#: field:product.uom,factor:0
@@ -1338,7 +1338,7 @@ msgstr "指定一个产品分类 ,规则只被应用在与这个分类以及
#. module: product
#: view:product.product:0
msgid "Inventory"
-msgstr "盘点"
+msgstr "库存"
#. module: product
#: field:product.product,seller_info_id:0
@@ -1346,7 +1346,7 @@ msgid "Supplier Info"
msgstr "供应商信息"
#. module: product
-#: code:addons/product/product.py:729
+#: code:addons/product/product.py:732
#, python-format
msgid "%s (copy)"
msgstr "%s (副本)"
@@ -1891,7 +1891,7 @@ msgstr "消息"
#. module: product
#: model:product.uom,name:product.product_uom_unit
msgid "Unit(s)"
-msgstr ""
+msgstr "件"
#. module: product
#: code:addons/product/product.py:176
@@ -2341,7 +2341,7 @@ msgstr "序列"
msgid ""
"Average delay in days to produce this product. In the case of multi-level "
"BOM, the manufacturing lead times of the components will be added."
-msgstr ""
+msgstr "生成该产品的平均延时天数。在多级BoM的情况下,部件的制造提前期将被累加"
#. module: product
#: model:product.template,name:product.product_assembly_product_template
@@ -2364,6 +2364,8 @@ msgid ""
"
\n"
" "
msgstr ""
+"单击以创建一个新的计量单位\n"
+" "
#. module: product
#: model:product.template,name:product.product_product_11_product_template
@@ -2444,7 +2446,7 @@ msgid "15” LCD Monitor"
msgstr "15” LCD 显示器"
#. module: product
-#: code:addons/product/pricelist.py:376
+#: code:addons/product/pricelist.py:379
#: field:product.pricelist.item,base_pricelist_id:0
#, python-format
msgid "Other Pricelist"
diff --git a/addons/stock/i18n/zh_CN.po b/addons/stock/i18n/zh_CN.po
index 407a76e63b7..3200f82e8f4 100644
--- a/addons/stock/i18n/zh_CN.po
+++ b/addons/stock/i18n/zh_CN.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2012-12-09 05:05+0000\n"
-"Last-Translator: sum1201 \n"
+"PO-Revision-Date: 2013-07-27 18:34+0000\n"
+"Last-Translator: Wei \"oldrev\" Li \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-03-16 05:00+0000\n"
-"X-Generator: Launchpad (build 16532)\n"
+"X-Launchpad-Export-Date: 2013-07-28 05:54+0000\n"
+"X-Generator: Launchpad (build 16700)\n"
#. module: stock
#: field:stock.inventory.line.split,line_exist_ids:0
@@ -124,8 +124,8 @@ msgid "Product Moves"
msgstr "产品调拨"
#. module: stock
-#: code:addons/stock/stock.py:2519
-#: code:addons/stock/stock.py:2580
+#: code:addons/stock/stock.py:2524
+#: code:addons/stock/stock.py:2585
#, python-format
msgid "Please provide proper quantity."
msgstr "输入数量不正确"
@@ -251,7 +251,7 @@ msgstr "安排送货单"
#: code:addons/stock/wizard/stock_change_standard_price.py:107
#, python-format
msgid "Active ID is not set in Context."
-msgstr ""
+msgstr "Contex中没有 Active ID"
#. module: stock
#: selection:stock.picking,invoice_state:0
@@ -346,9 +346,9 @@ msgstr "保留复杂的摘要(消息数量,……等)。为了插入到看板视
#. module: stock
#: code:addons/stock/stock.py:768
-#: code:addons/stock/stock.py:2475
-#: code:addons/stock/stock.py:2519
-#: code:addons/stock/stock.py:2580
+#: code:addons/stock/stock.py:2473
+#: code:addons/stock/stock.py:2524
+#: code:addons/stock/stock.py:2585
#: code:addons/stock/wizard/stock_change_product_qty.py:91
#: code:addons/stock/wizard/stock_fill_inventory.py:124
#: code:addons/stock/wizard/stock_inventory_merge.py:43
@@ -476,6 +476,7 @@ msgstr "操作追溯 "
#: selection:stock.move,state:0
#: selection:stock.picking,state:0
#: selection:stock.picking.in,state:0
+#: report:stock.picking.list:0
#: selection:stock.picking.out,state:0
msgid "Waiting Availability"
msgstr "等待可用"
@@ -484,6 +485,7 @@ msgstr "等待可用"
#: selection:report.stock.inventory,state:0
#: selection:report.stock.move,state:0
#: selection:stock.move,state:0
+#: report:stock.picking.list:0
#: view:stock.production.lot:0
#: field:stock.production.lot,stock_available:0
msgid "Available"
@@ -574,7 +576,7 @@ msgstr "实物盘点表草稿"
msgid ""
"Quantities, Units of Measure, Products and Locations cannot be modified on "
"stock moves that have already been processed (except by the Administrator)."
-msgstr ""
+msgstr "已经被处理过的移库单中,数量,计量单位,产品和库位不能修改(除非是 管理员)"
#. module: stock
#: help:report.stock.move,type:0
@@ -614,7 +616,7 @@ msgstr "标签"
#: code:addons/stock/stock.py:1356
#, python-format
msgid "Back order %s has been created."
-msgstr "未交付清单%s 已经被 创建."
+msgstr "延期交货清单%s 已经被 创建."
#. module: stock
#: model:ir.model,name:stock.model_report_stock_move
@@ -684,7 +686,7 @@ msgstr "入库单"
#, python-format
msgid ""
"Serial number quantity %d of %s is larger than available quantity (%d)!"
-msgstr ""
+msgstr "系列号数量 %d ( %s ) 大于可用数量(%d)!"
#. module: stock
#: report:stock.picking.list:0
@@ -821,7 +823,7 @@ msgstr "6月"
msgid ""
"Forces to specify a Serial Number for all moves containing this product and "
"coming from a Supplier Location"
-msgstr ""
+msgstr "为包含该产品和来自供应商库位的所有移库单 强制指定一个 系列号"
#. module: stock
#: help:stock.config.settings,group_uos:0
@@ -831,6 +833,8 @@ msgid ""
" For instance, you can sell pieces of meat that you invoice "
"based on their weight."
msgstr ""
+"允许产品的销售和开票的单位不一致.\n"
+" 例如你可以按块卖,但发票按重量开."
#. module: stock
#: field:product.template,property_stock_procurement:0
@@ -866,7 +870,7 @@ msgstr "在进行实时库存核算时,库存调拨处理将自动登入这账
msgid ""
"Please define stock output account for this product or its category: \"%s\" "
"(id: %d)"
-msgstr ""
+msgstr "请为这个产品或者它的类别定义一个出库科目: \"%s\" (id: %d)"
#. module: stock
#: field:stock.picking,message_summary:0
@@ -895,7 +899,7 @@ msgid "Time"
msgstr "时间"
#. module: stock
-#: code:addons/stock/product.py:447
+#: code:addons/stock/product.py:449
#, python-format
msgid "Future Receptions"
msgstr "未来的入库"
@@ -948,7 +952,7 @@ msgstr "入库库位"
msgid ""
"This field is for internal purpose. It is used to decide if the column "
"production lot has to be shown on the moves or not."
-msgstr ""
+msgstr "这 字段是内部用途。用来决定 生产批号这一列 是否显示在移库单上面"
#. module: stock
#: selection:product.product,valuation:0
@@ -982,7 +986,7 @@ msgstr "公司间转移的中途库位"
msgid ""
"You cannot cancel the picking as some moves have been done. You should "
"cancel the picking lines."
-msgstr ""
+msgstr "您不能取消已经有部分移库完成的分拣单。您应该取消 分拣单行"
#. module: stock
#: field:stock.config.settings,decimal_precision:0
@@ -1000,7 +1004,7 @@ msgid "Change Product Quantity"
msgstr "更改产品数量"
#. module: stock
-#: code:addons/stock/product.py:463
+#: code:addons/stock/product.py:465
#, python-format
msgid "Future P&L"
msgstr "未来的产品和库位"
@@ -1027,13 +1031,13 @@ msgstr "盘点库位"
#. module: stock
#: constraint:stock.move:0
msgid "You must assign a serial number for this product."
-msgstr ""
+msgstr "你需要为该产品指定一个系列号"
#. module: stock
#: code:addons/stock/stock.py:2255
#, python-format
msgid "Please define journal on the product category: \"%s\" (id: %d)"
-msgstr ""
+msgstr "请为这个产品类型定义一个分类账: \"%s\" (id: %d)"
#. module: stock
#: view:stock.move:0
@@ -1043,7 +1047,7 @@ msgstr "详情"
#. module: stock
#: selection:stock.picking,state:0
msgid "Ready to Transfer"
-msgstr ""
+msgstr "准备转移"
#. module: stock
#: report:lot.stock.overview:0
@@ -1134,12 +1138,12 @@ msgstr "产品批次"
#. module: stock
#: view:stock.picking:0
msgid "Reverse Transfer"
-msgstr ""
+msgstr "反向转移"
#. module: stock
#: field:stock.config.settings,group_uos:0
msgid "Invoice products in a different unit of measure than the sales order"
-msgstr ""
+msgstr "开票产品的计量单位和销售订单不一致。"
#. module: stock
#: help:stock.location,active:0
@@ -1160,13 +1164,13 @@ msgstr "请在列表视图中选择多个待合并的盘点"
msgid ""
"No products to return (only lines in Done state and not fully returned yet "
"can be returned)!"
-msgstr ""
+msgstr "没有产品被退货(只有完成状态和未完全退货的 行能被退货)!"
#. module: stock
#: view:stock.picking:0
#: view:stock.picking.in:0
msgid "Back Orders"
-msgstr "子单"
+msgstr "延期交货"
#. module: stock
#: field:stock.location,stock_virtual:0
@@ -1208,7 +1212,7 @@ msgstr "生产库位"
#: code:addons/stock/product.py:121
#, python-format
msgid "Please define journal on the product category: \"%s\" (id: %d)."
-msgstr ""
+msgstr "请在产品分类 \"%s\" (id: %d) 上面定义一个分类账。"
#. module: stock
#: field:report.stock.lines.date,date:0
@@ -1267,17 +1271,17 @@ msgstr "建立者"
#, python-format
msgid ""
"You are moving %.2f %s but only %.2f %s available for this serial number."
-msgstr ""
+msgstr "你正在移动 %.2f %s ,但该系列号只有 %.2f %s 可用"
#. module: stock
#: report:stock.picking.list:0
msgid "Internal Shipment :"
-msgstr ""
+msgstr "内部装运:"
#. module: stock
#: view:stock.inventory.line:0
msgid "Split Inventory Line"
-msgstr ""
+msgstr "拆分存货清单行"
#. module: stock
#: selection:stock.location,chained_auto_packing:0
@@ -1298,7 +1302,7 @@ msgid "Supplier"
msgstr "供应商"
#. module: stock
-#: code:addons/stock/stock.py:2859
+#: code:addons/stock/stock.py:2864
#, python-format
msgid ""
"In order to cancel this inventory, you must first unpost related journal "
@@ -1309,7 +1313,7 @@ msgstr "为取消这个盘存,你必须要先取消相关的分录。"
#: code:addons/stock/product.py:113
#, python-format
msgid "Please specify company in Location."
-msgstr ""
+msgstr "请在库位里 指定公司"
#. module: stock
#: view:stock.move:0
@@ -1321,7 +1325,7 @@ msgstr "库存调拨可用(已准备好)"
msgid ""
"Allows you to create and manage your packaging dimensions and types you want "
"to be maintained in your system."
-msgstr ""
+msgstr "允许创建和管理你要在系统中保留的的包装尺寸和类型。"
#. module: stock
#: selection:report.stock.inventory,month:0
@@ -1346,7 +1350,7 @@ msgstr "实物盘点"
#: code:addons/stock/wizard/stock_move.py:214
#, python-format
msgid "Processing Error!"
-msgstr ""
+msgstr "处理错误!"
#. module: stock
#: help:stock.location,chained_company_id:0
@@ -1367,6 +1371,11 @@ msgid ""
"* Available: When products are reserved, it is set to 'Available'.\n"
"* Done: When the shipment is processed, the state is 'Done'."
msgstr ""
+"* 新建: 当移库单被创建还没被确实时。\n"
+"* 等待另外的移库: 当需要等待另外一个移库完成时,出现该状态。例如:链式物流.\n"
+"* 等待可用: 当需求还不能被直接了当地解决时,出现该状态。可能需要等调度程序被运行,有个部件在等待制造等等...\n"
+"* 可用: 当产品已经被保留了,状态就被设置为 可用。\n"
+"* 完成: 当这次装运被处理,状态就是“完成”。"
#. module: stock
#: model:stock.location,name:stock.stock_location_locations_partner
@@ -1462,7 +1471,7 @@ msgstr "等待其它调拨"
#: help:stock.change.product.qty,new_quantity:0
msgid ""
"This quantity is expressed in the Default Unit of Measure of the product."
-msgstr ""
+msgstr "此数量以该产品的默认计量单位表示"
#. module: stock
#: help:stock.move,price_unit:0
@@ -1475,7 +1484,7 @@ msgstr "用户在确认分拣时设置期间,字段用于记录产品的成本
#: code:addons/stock/stock.py:1890
#, python-format
msgid "Warning: No Back Order"
-msgstr ""
+msgstr "警告: 没有 延期交货清单"
#. module: stock
#: model:ir.model,name:stock.model_stock_move
@@ -1494,7 +1503,7 @@ msgid "To be refunded/invoiced"
msgstr "已开票或退票"
#. module: stock
-#: code:addons/stock/stock.py:2450
+#: code:addons/stock/stock.py:2448
#, python-format
msgid "You can only delete draft moves."
msgstr "您只能删除草稿状态的调拨。"
@@ -1503,12 +1512,12 @@ msgstr "您只能删除草稿状态的调拨。"
#: code:addons/stock/stock.py:1665
#, python-format
msgid "You cannot move product %s to a location of type view %s."
-msgstr ""
+msgstr "您不能移动产品%s到视图类型的库位%s。"
#. module: stock
#: view:stock.inventory:0
msgid "Split in serial numbers"
-msgstr ""
+msgstr "拆分系列号"
#. module: stock
#: view:stock.move:0
@@ -1537,10 +1546,10 @@ msgid "Additional Info"
msgstr "附加信息"
#. module: stock
-#: code:addons/stock/stock.py:2648
+#: code:addons/stock/stock.py:2653
#, python-format
msgid "Missing partial picking data for move #%s."
-msgstr ""
+msgstr "移库单 #%s 丢失了部分分拣的数据。"
#. module: stock
#: field:stock.location.product,from_date:0
@@ -1631,6 +1640,9 @@ msgstr ""
#. module: stock
#: field:stock.inventory,date:0
#: field:stock.move,create_date:0
+#: field:stock.picking,date:0
+#: field:stock.picking.in,date:0
+#: field:stock.picking.out,date:0
#: field:stock.production.lot,date:0
#: field:stock.tracking,date:0
msgid "Creation Date"
@@ -1731,7 +1743,7 @@ msgstr "上级库位"
#: code:addons/stock/product.py:168
#, python-format
msgid "Please define stock output account for this product: \"%s\" (id: %d)."
-msgstr ""
+msgstr "请为产品 \"%s\" (id: %d) 定义出库科目"
#. module: stock
#: help:stock.location,company_id:0
@@ -1754,15 +1766,15 @@ msgid "Stock Invoice Onshipping"
msgstr "发票未到"
#. module: stock
-#: code:addons/stock/stock.py:2475
+#: code:addons/stock/stock.py:2473
#, python-format
msgid "Please provide a positive quantity to scrap."
-msgstr ""
+msgstr "请提供一个正数给报废库位。"
#. module: stock
#: model:stock.location,name:stock.stock_location_shop1
msgid "Your Company, Birmingham shop"
-msgstr ""
+msgstr "你的公司,伯明翰商店"
#. module: stock
#: view:product.product:0
@@ -1781,7 +1793,7 @@ msgstr "单位成本的币别"
#: selection:stock.picking.in,move_type:0
#: selection:stock.picking.out,move_type:0
msgid "Partial"
-msgstr ""
+msgstr "部分"
#. module: stock
#: selection:report.stock.inventory,month:0
@@ -1792,7 +1804,7 @@ msgstr "9月"
#. module: stock
#: view:product.product:0
msgid "days"
-msgstr ""
+msgstr "天"
#. module: stock
#: model:ir.model,name:stock.model_report_stock_inventory
@@ -1809,13 +1821,13 @@ msgstr "月计划"
#: help:stock.picking.in,origin:0
#: help:stock.picking.out,origin:0
msgid "Reference of the document"
-msgstr ""
+msgstr "文档的参照"
#. module: stock
#: view:stock.picking:0
#: view:stock.picking.in:0
msgid "Is a Back Order"
-msgstr "是子单"
+msgstr "是一个延期交货清单"
#. module: stock
#: report:stock.picking.list:0
@@ -1830,7 +1842,7 @@ msgstr "库存核算科目(出仓)"
#. module: stock
#: view:stock.return.picking.memory:0
msgid "Return Picking Memory"
-msgstr ""
+msgstr "退回分拣存储区"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_move_form2
@@ -1847,7 +1859,7 @@ msgstr "库存调拨"
msgid ""
"Check this option to select existing serial numbers in the list below, "
"otherwise you should enter new ones line by line."
-msgstr ""
+msgstr "点击此项从下面列表中选择一个已有的系列号,否则你要逐行输入新的"
#. module: stock
#: selection:report.stock.move,type:0
@@ -1873,14 +1885,14 @@ msgstr "取消可用"
#: code:addons/stock/wizard/stock_location_product.py:49
#, python-format
msgid "Current Inventory"
-msgstr ""
+msgstr "当前库存清单"
#. module: stock
#: help:product.template,property_stock_production:0
msgid ""
"This stock location will be used, instead of the default one, as the source "
"location for stock moves generated by manufacturing orders."
-msgstr ""
+msgstr "该库位将被使用以替换默认的,同样的,库存移位的源库位将根据制造单生成。"
#. module: stock
#: help:stock.move,date_expected:0
@@ -1903,10 +1915,10 @@ msgid "Shelf 2"
msgstr "货架 2"
#. module: stock
-#: code:addons/stock/stock.py:529
+#: code:addons/stock/stock.py:528
#, python-format
msgid "You cannot remove a lot line."
-msgstr ""
+msgstr "您不能移除一个批号"
#. module: stock
#: help:stock.location,posx:0
@@ -1927,7 +1939,7 @@ msgid "Localization"
msgstr "本地化"
#. module: stock
-#: code:addons/stock/product.py:459
+#: code:addons/stock/product.py:461
#, python-format
msgid "Delivered Qty"
msgstr "已配送数量"
@@ -1935,14 +1947,14 @@ msgstr "已配送数量"
#. module: stock
#: view:stock.partial.picking:0
msgid "Transfer Products"
-msgstr ""
+msgstr "转让产品"
#. module: stock
#: help:product.template,property_stock_inventory:0
msgid ""
"This stock location will be used, instead of the default one, as the source "
"location for stock moves generated when you do an inventory."
-msgstr ""
+msgstr "该库位将被使用以替换默认的,同样当你做盘点时,库存移位的源库位将被生成。"
#. module: stock
#: help:product.template,property_stock_account_output:0
@@ -1998,7 +2010,7 @@ msgstr "日期"
#: field:stock.picking.in,message_is_follower:0
#: field:stock.picking.out,message_is_follower:0
msgid "Is a Follower"
-msgstr ""
+msgstr "是一个关注者"
#. module: stock
#: view:report.stock.inventory:0
@@ -2009,13 +2021,13 @@ msgstr "增加筛选条件"
#. module: stock
#: field:stock.warehouse,lot_stock_id:0
msgid "Location Stock"
-msgstr "库位库存"
+msgstr "库存库位"
#. module: stock
#: code:addons/stock/wizard/stock_partial_picking.py:97
#, python-format
msgid "_Deliver"
-msgstr ""
+msgstr "_Deliver"
#. module: stock
#: code:addons/stock/wizard/stock_inventory_merge.py:64
@@ -2058,7 +2070,7 @@ msgstr "批号"
#: model:ir.actions.act_window,name:stock.action_deliver_move
#: view:product.product:0
msgid "Deliveries"
-msgstr ""
+msgstr "已交付"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_reception_picking_move
@@ -2109,7 +2121,7 @@ msgstr "退回分拣"
#: model:ir.actions.act_window,name:stock.act_stock_return_picking_in
#: model:ir.actions.act_window,name:stock.act_stock_return_picking_out
msgid "Return Shipment"
-msgstr ""
+msgstr "退回件"
#. module: stock
#: model:ir.model,name:stock.model_stock_inventory_merge
@@ -2161,7 +2173,7 @@ msgstr "默认作为您接收当前业务伙伴产品的源库位"
#: sql_constraint:stock.production.lot:0
msgid ""
"The combination of Serial Number and internal reference must be unique !"
-msgstr ""
+msgstr "系列号和内部参考号的组合必须是唯一的"
#. module: stock
#: field:stock.warehouse,partner_id:0
@@ -2179,7 +2191,7 @@ msgstr "调拨分析让您轻松检查和分析您公司的库存调拨.在您
#. module: stock
#: constraint:stock.move:0
msgid "You try to assign a lot which is not from the same product."
-msgstr ""
+msgstr "你试图分配一个不是该产品的批次"
#. module: stock
#: field:report.stock.move,day_diff1:0
@@ -2194,20 +2206,20 @@ msgstr "价格"
#. module: stock
#: field:stock.config.settings,module_stock_invoice_directly:0
msgid "Create and open the invoice when the user finish a delivery order"
-msgstr ""
+msgstr "当用户完成一个发运单后,创建并打开发票"
#. module: stock
#: model:ir.model,name:stock.model_stock_return_picking_memory
msgid "stock.return.picking.memory"
-msgstr ""
+msgstr "stock.return.picking.memory"
#. module: stock
#: field:stock.config.settings,group_stock_inventory_valuation:0
msgid "Generate accounting entries per stock movement"
-msgstr ""
+msgstr "对每个移库动作生成账务分录"
#. module: stock
-#: code:addons/stock/product.py:449
+#: code:addons/stock/product.py:451
#, python-format
msgid "Received Qty"
msgstr "已接收数量"
@@ -2215,7 +2227,7 @@ msgstr "已接收数量"
#. module: stock
#: field:stock.production.lot,ref:0
msgid "Internal Reference"
-msgstr "内部单号"
+msgstr "编号"
#. module: stock
#: help:stock.production.lot,prefix:0
@@ -2229,7 +2241,7 @@ msgstr "显示这序列号时的可选前缀: PREFIX/SERIAL [INT_REF]"
msgid ""
"Forces to specify a Serial Number for all moves containing this product and "
"generated by a Manufacturing Order"
-msgstr ""
+msgstr "强制对包含该产品的所有移库单指定一个系列号,并生成一个制造单"
#. module: stock
#: model:ir.model,name:stock.model_stock_fill_inventory
@@ -2246,7 +2258,7 @@ msgstr "名称"
#. module: stock
#: report:stock.picking.list:0
msgid "Supplier Address :"
-msgstr ""
+msgstr "供应商地址:"
#. module: stock
#: view:stock.inventory.line:0
@@ -2274,28 +2286,28 @@ msgid "Customer Locations"
msgstr "客户库位"
#. module: stock
-#: code:addons/stock/stock.py:2449
-#: code:addons/stock/stock.py:2858
+#: code:addons/stock/stock.py:2448
+#: code:addons/stock/stock.py:2863
#, python-format
msgid "User Error!"
-msgstr ""
+msgstr "用户错误!"
#. module: stock
#: view:stock.partial.picking:0
msgid "Stock partial Picking"
-msgstr ""
+msgstr "库存部分分拣"
#. module: stock
#: view:stock.picking:0
msgid "Create Invoice/Refund"
-msgstr ""
+msgstr "创建发票/退款"
#. module: stock
#: help:stock.picking,message_ids:0
#: help:stock.picking.in,message_ids:0
#: help:stock.picking.out,message_ids:0
msgid "Messages and communication history"
-msgstr ""
+msgstr "消息和通信记录"
#. module: stock
#: view:report.stock.inventory:0
@@ -2320,7 +2332,7 @@ msgstr "供货商库位"
#. module: stock
#: view:stock.location.product:0
msgid "View Products Inventory"
-msgstr ""
+msgstr "查看产品存货清单"
#. module: stock
#: view:stock.move:0
@@ -2331,7 +2343,7 @@ msgstr "创建"
#: code:addons/stock/stock.py:1776
#, python-format
msgid "Operation forbidden !"
-msgstr ""
+msgstr "操作被禁止"
#. module: stock
#: view:report.stock.inventory:0
@@ -2355,12 +2367,12 @@ msgstr "入库科目"
#. module: stock
#: view:report.stock.move:0
msgid "Shipping type specify, goods coming in or going out"
-msgstr ""
+msgstr "指定运输类型,商品进入或者发出"
#. module: stock
#: view:stock.config.settings:0
msgid "Accounting"
-msgstr ""
+msgstr "会计"
#. module: stock
#: model:ir.ui.menu,name:stock.menu_warehouse_config
@@ -2429,26 +2441,26 @@ msgstr "计量单位"
#. module: stock
#: field:stock.config.settings,group_stock_multiple_locations:0
msgid "Manage multiple locations and warehouses"
-msgstr ""
+msgstr "管理多库位及仓库"
#. module: stock
#: field:stock.config.settings,group_stock_production_lot:0
msgid "Track serial number on products"
-msgstr ""
+msgstr "追溯产品批次"
#. module: stock
#: field:stock.picking,message_unread:0
#: field:stock.picking.in,message_unread:0
#: field:stock.picking.out,message_unread:0
msgid "Unread Messages"
-msgstr ""
+msgstr "未读消息"
#. module: stock
#: help:stock.production.lot,stock_available:0
msgid ""
"Current quantity of products with this Serial Number available in company "
"warehouses"
-msgstr ""
+msgstr "在 公司仓库中,该序列号的产品当前可用的数量。"
#. module: stock
#: view:stock.inventory:0
@@ -2470,7 +2482,7 @@ msgstr "批次"
#. module: stock
#: view:stock.partial.picking:0
msgid "_Transfer"
-msgstr ""
+msgstr "_Transfer"
#. module: stock
#: selection:report.stock.move,type:0
@@ -2499,7 +2511,7 @@ msgid "Warehouse board"
msgstr "仓库控制台"
#. module: stock
-#: code:addons/stock/product.py:469
+#: code:addons/stock/product.py:471
#, python-format
msgid "Future Qty"
msgstr "未来数量"
@@ -2507,7 +2519,7 @@ msgstr "未来数量"
#. module: stock
#: model:res.groups,name:stock.group_production_lot
msgid "Manage Serial Numbers"
-msgstr ""
+msgstr "管理系列号"
#. module: stock
#: field:stock.move,note:0
@@ -2520,7 +2532,7 @@ msgstr "备注"
#. module: stock
#: selection:stock.picking,state:0
msgid "Transferred"
-msgstr ""
+msgstr "已转运"
#. module: stock
#: report:lot.stock.overview:0
@@ -2541,7 +2553,7 @@ msgstr "移库单类型"
#. module: stock
#: view:stock.move:0
msgid "Process Partially"
-msgstr ""
+msgstr "处理部分"
#. module: stock
#: view:stock.move:0
@@ -2566,7 +2578,7 @@ msgstr "产品"
msgid ""
"Cannot create Journal Entry, Output Account of this product and Valuation "
"account on category of this product are same."
-msgstr ""
+msgstr "不能创建分类账分录,该产品的出库科目和其分类中的 估值科目是一样的"
#. module: stock
#: selection:stock.location,chained_location_type:0
@@ -2606,7 +2618,7 @@ msgstr "出仓产品"
msgid ""
"Please define stock input account for this product or its category: \"%s\" "
"(id: %d)"
-msgstr ""
+msgstr "请为产品 \"%s\" (id: %d) 或者他的类别 定义一个入库科目"
#. module: stock
#: view:report.stock.move:0
@@ -2621,7 +2633,7 @@ msgid "Move"
msgstr "调拨"
#. module: stock
-#: code:addons/stock/product.py:465
+#: code:addons/stock/product.py:467
#, python-format
msgid "P&L Qty"
msgstr "损益数量"
@@ -2629,7 +2641,7 @@ msgstr "损益数量"
#. module: stock
#: model:ir.model,name:stock.model_stock_config_settings
msgid "stock.config.settings"
-msgstr ""
+msgstr "stock.config.settings"
#. module: stock
#: view:stock.production.lot:0
@@ -2652,7 +2664,7 @@ msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_4
msgid "Big Suppliers"
-msgstr ""
+msgstr "大供应商"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_stock_inventory_report
@@ -2678,7 +2690,7 @@ msgstr "创建"
#. module: stock
#: field:stock.change.product.qty,new_quantity:0
msgid "New Quantity on Hand"
-msgstr ""
+msgstr "在手库存调整"
#. module: stock
#: field:stock.move,priority:0
@@ -2728,7 +2740,7 @@ msgstr "取消盘点"
#. module: stock
#: field:stock.config.settings,group_product_variant:0
msgid "Support multiple variants per products "
-msgstr ""
+msgstr "支持每个产品的多个变体 "
#. module: stock
#: code:addons/stock/stock.py:2246
@@ -2736,7 +2748,7 @@ msgstr ""
msgid ""
"Cannot create Journal Entry, Input Account of this product and Valuation "
"account on category of this product are same."
-msgstr ""
+msgstr "不能创建分类账分录,该产品的入库科目和其分类中的 估值科目是一样的"
#. module: stock
#: model:ir.ui.menu,name:stock.menu_stock_unit_measure_stock
@@ -2752,7 +2764,7 @@ msgstr "固定库位"
#. module: stock
#: field:report.stock.inventory,scrap_location:0
msgid "scrap"
-msgstr ""
+msgstr "报废"
#. module: stock
#: code:addons/stock/stock.py:1891
@@ -2760,22 +2772,22 @@ msgstr ""
msgid ""
"By changing the quantity here, you accept the new quantity as complete: "
"OpenERP will not automatically generate a Back Order."
-msgstr ""
+msgstr "通过修改此处的数量,就是您已经收到完成的数量: OpenERP 将自动生成一个延期交货清单。"
#. module: stock
#: report:stock.inventory.move:0
msgid "Manual Quantity"
-msgstr ""
+msgstr "手动数量"
#. module: stock
#: view:product.product:0
msgid "On hand:"
-msgstr ""
+msgstr "在手:"
#. module: stock
#: model:ir.model,name:stock.model_stock_report_prodlots
msgid "Stock report by serial number"
-msgstr ""
+msgstr "按批次统计库库"
#. module: stock
#: selection:report.stock.inventory,month:0
@@ -2801,7 +2813,7 @@ msgstr "显示您产品的最后盘点并用特定的筛选规则去排序。如
#: code:addons/stock/wizard/stock_invoice_onshipping.py:112
#, python-format
msgid "Please create Invoices."
-msgstr ""
+msgstr "请创建发票"
#. module: stock
#: help:stock.config.settings,module_product_expiry:0
@@ -2814,12 +2826,20 @@ msgid ""
" - alert date.\n"
"This installs the module product_expiry."
msgstr ""
+"对产品和序列号跟踪不同的日期。\n"
+"下列日期可被跟踪:\n"
+" -寿命终止\n"
+" -最佳使用日期\n"
+" -搬运日期 \n"
+" -提醒日期\n"
+"\n"
+"这需要安装模块 product_expiry."
#. module: stock
#: code:addons/stock/wizard/stock_partial_picking.py:174
#, python-format
msgid "Please provide proper Quantity."
-msgstr ""
+msgstr "请提供适度的数量"
#. module: stock
#: model:ir.actions.report.xml,name:stock.report_product_history
@@ -2842,7 +2862,7 @@ msgstr "库存账簿"
#: code:addons/stock/wizard/stock_return_picking.py:174
#, python-format
msgid "%s-%s-return"
-msgstr ""
+msgstr "%s-%s-返回"
#. module: stock
#: code:addons/stock/wizard/stock_change_product_qty.py:82
@@ -2859,7 +2879,7 @@ msgstr "强制可用"
#. module: stock
#: field:product.template,loc_rack:0
msgid "Rack"
-msgstr ""
+msgstr "货架"
#. module: stock
#: model:ir.actions.act_window,name:stock.move_scrap
@@ -2870,7 +2890,7 @@ msgstr "损耗调拨"
#. module: stock
#: help:stock.move,prodlot_id:0
msgid "Serial number is used to put a serial number on the production"
-msgstr ""
+msgstr "用作在产品上放置一个系列号"
#. module: stock
#: code:addons/stock/wizard/stock_partial_picking.py:100
@@ -2916,7 +2936,7 @@ msgstr "完成日期"
#: code:addons/stock/stock.py:1663
#, python-format
msgid "You cannot move product %s from a location of type view %s."
-msgstr ""
+msgstr "您不能移动产品%s,因为它来自一个视图类型的库位 %s."
#. module: stock
#: model:stock.location,name:stock.stock_location_company
@@ -2978,7 +2998,7 @@ msgstr "实际库存"
#. module: stock
#: field:stock.report.tracklots,tracking_id:0
msgid "Logistic Serial Number"
-msgstr ""
+msgstr "物流系列号"
#. module: stock
#: field:stock.production.lot.revision,date:0
@@ -2998,12 +3018,12 @@ msgstr "批次"
msgid ""
"Total quantity after split exceeds the quantity to split for this product: "
"\"%s\" (id: %d)."
-msgstr ""
+msgstr "产品 \"%s\" (id: %d) 分割后的数量总数超过了这个产品的数量"
#. module: stock
#: view:stock.partial.move.line:0
msgid "Stock Partial Move Line"
-msgstr ""
+msgstr "仓库局部 移库清单"
#. module: stock
#: field:stock.move,product_uos_qty:0
@@ -3025,13 +3045,13 @@ msgstr "联系地址:"
msgid ""
"When you select a serial number on product moves, you can get the upstream "
"or downstream traceability of that product."
-msgstr ""
+msgstr "当您在产品移库单选择了一个系列号,你就能得到该产品的上游或者下游的可追朔性"
#. module: stock
#: code:addons/stock/wizard/stock_partial_picking.py:95
#, python-format
msgid "_Receive"
-msgstr ""
+msgstr "_Receive"
#. module: stock
#: field:stock.incoterms,active:0
@@ -3069,7 +3089,7 @@ msgstr "贸易术语"
#. module: stock
#: model:ir.model,name:stock.model_stock_partial_picking_line
msgid "stock.partial.picking.line"
-msgstr ""
+msgstr "stock.partial.picking.line"
#. module: stock
#: report:lot.stock.overview:0
@@ -3099,6 +3119,14 @@ msgid ""
" \n"
" "
msgstr ""
+"\n"
+" 单击为该产品登记一个收货单。\n"
+"
\n"
+" 这里可以找到该产品相关的所有收货记录,\n"
+" 以及所有你正在等待的来自供应商的\n"
+" 尚未到达的收货单。\n"
+"
\n"
+" "
#. module: stock
#: help:stock.fill.inventory,recursive:0
@@ -3111,7 +3139,7 @@ msgstr "如果选择将包括该库位子库位的产品。"
#: help:stock.config.settings,group_stock_inventory_valuation:0
msgid ""
"Allows to configure inventory valuations on products and product categories."
-msgstr ""
+msgstr "允许在产品或者产品分类配置存货估值。"
#. module: stock
#: help:stock.config.settings,module_stock_location:0
@@ -3163,7 +3191,7 @@ msgstr "修订版名称"
#. module: stock
#: model:res.groups,name:stock.group_tracking_lot
msgid "Manage Logistic Serial Numbers"
-msgstr ""
+msgstr "管理物流系列号"
#. module: stock
#: view:stock.inventory:0
@@ -3186,10 +3214,10 @@ msgid ""
msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:2496
+#: code:addons/stock/stock.py:2501
#, python-format
msgid "%s %s %s has been moved to scrap."
-msgstr ""
+msgstr "%s %s %s 已被 移动到 报废仓."
#. module: stock
#: model:ir.actions.act_window,name:stock.action_picking_tree_out
@@ -3205,6 +3233,7 @@ msgstr "客户包装"
#: selection:stock.move,state:0
#: view:stock.picking:0
#: view:stock.picking.in:0
+#: report:stock.picking.list:0
msgid "Done"
msgstr "完成"
@@ -3242,14 +3271,14 @@ msgstr "如果想生成发票,请在分拣单上填写上业务伙伴."
#. module: stock
#: view:stock.picking.in:0
msgid "Confirm & Receive"
-msgstr ""
+msgstr "确认并接收"
#. module: stock
#: field:stock.picking,origin:0
#: field:stock.picking.in,origin:0
#: field:stock.picking.out,origin:0
msgid "Source Document"
-msgstr ""
+msgstr "源单据"
#. module: stock
#: selection:stock.move,priority:0
@@ -3259,7 +3288,7 @@ msgstr "不紧急"
#. module: stock
#: view:stock.move:0
msgid "Scheduled"
-msgstr ""
+msgstr "排程"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_warehouse_form
@@ -3275,14 +3304,14 @@ msgstr "负责人"
#. module: stock
#: view:stock.move:0
msgid "Process Entirely"
-msgstr ""
+msgstr "处理分录"
#. module: stock
#: help:product.template,property_stock_procurement:0
msgid ""
"This stock location will be used, instead of the default one, as the source "
"location for stock moves generated by procurements."
-msgstr ""
+msgstr "该库位将被使用以替换默认的,同样的,库存移位的源库位将根据需求单生成。"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_stock_inventory_report
@@ -3306,7 +3335,7 @@ msgstr "库存"
#: code:addons/stock/wizard/stock_return_picking.py:222
#, python-format
msgid "Returned Picking"
-msgstr ""
+msgstr "退回的分拣"
#. module: stock
#: model:ir.model,name:stock.model_product_product
@@ -3372,12 +3401,12 @@ msgstr "指定的内部调拨"
#: code:addons/stock/stock.py:790
#, python-format
msgid "You cannot process picking without stock moves."
-msgstr ""
+msgstr "没有移库单,您不能处理分拣。"
#. module: stock
#: field:stock.production.lot,move_ids:0
msgid "Moves for this serial number"
-msgstr ""
+msgstr "该系列号的移库"
#. module: stock
#: field:stock.move,product_uos:0
@@ -3414,7 +3443,7 @@ msgstr "通道(X)"
#. module: stock
#: field:stock.config.settings,group_stock_packaging:0
msgid "Allow to define several packaging methods on products"
-msgstr ""
+msgstr "允许产品定义多种包装方式"
#. module: stock
#: model:stock.location,name:stock.stock_location_7
@@ -3465,7 +3494,7 @@ msgstr "按库位划分产品"
#. module: stock
#: view:stock.config.settings:0
msgid "Logistic"
-msgstr ""
+msgstr "物流"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_location_form
@@ -3550,7 +3579,7 @@ msgstr "激活相关科目"
#. module: stock
#: field:stock.location.product,type:0
msgid "Analyse Type"
-msgstr ""
+msgstr "分析类型"
#. module: stock
#: model:ir.actions.act_window,help:stock.action_picking_tree4
@@ -3582,10 +3611,10 @@ msgstr "全部一次性"
#. module: stock
#: model:ir.actions.act_window,name:stock.act_product_stock_move_open
msgid "Inventory Move"
-msgstr ""
+msgstr "库存调拨"
#. module: stock
-#: code:addons/stock/product.py:475
+#: code:addons/stock/product.py:477
#, python-format
msgid "Future Productions"
msgstr "未来生产"
@@ -3615,7 +3644,7 @@ msgstr ""
#: model:ir.actions.act_window,name:stock.action_stock_config_settings
#: view:stock.config.settings:0
msgid "Configure Warehouse"
-msgstr ""
+msgstr "配置仓库"
#. module: stock
#: view:stock.picking:0
@@ -3643,7 +3672,7 @@ msgstr "盘点日期"
#: model:ir.actions.act_window,name:stock.action_receive_move
#: view:product.product:0
msgid "Receptions"
-msgstr ""
+msgstr "接收"
#. module: stock
#: view:report.stock.move:0
@@ -3678,7 +3707,7 @@ msgstr "公司"
#: field:stock.move.consume,product_uom:0
#: field:stock.move.scrap,product_uom:0
msgid "Product Unit of Measure"
-msgstr ""
+msgstr "产品计量单位"
#. module: stock
#: view:stock.move:0
@@ -3712,7 +3741,7 @@ msgstr "盘点批次"
#: field:stock.report.prodlots,prodlot_id:0
#: field:stock.return.picking.memory,prodlot_id:0
msgid "Serial Number"
-msgstr ""
+msgstr "序列号"
#. module: stock
#: model:ir.model,name:stock.model_stock_partial_picking
@@ -3756,7 +3785,7 @@ msgstr ""
#: field:stock.picking.in,message_ids:0
#: field:stock.picking.out,message_ids:0
msgid "Messages"
-msgstr ""
+msgstr "消息"
#. module: stock
#: model:stock.location,name:stock.stock_location_8
@@ -3772,7 +3801,7 @@ msgstr "非欧洲客户"
#: code:addons/stock/product.py:167
#: code:addons/stock/report/report_stock.py:78
#: code:addons/stock/report/report_stock.py:134
-#: code:addons/stock/stock.py:529
+#: code:addons/stock/stock.py:528
#: code:addons/stock/stock.py:790
#: code:addons/stock/stock.py:1190
#: code:addons/stock/stock.py:1199
@@ -3782,7 +3811,8 @@ msgstr "非欧洲客户"
#: code:addons/stock/stock.py:2252
#: code:addons/stock/stock.py:2255
#: code:addons/stock/stock.py:2258
-#: code:addons/stock/stock.py:2585
+#: code:addons/stock/stock.py:2481
+#: code:addons/stock/stock.py:2590
#: code:addons/stock/wizard/stock_fill_inventory.py:59
#: code:addons/stock/wizard/stock_invoice_onshipping.py:112
#: code:addons/stock/wizard/stock_splitinto.py:53
@@ -3798,6 +3828,10 @@ msgid ""
" \n"
" "
msgstr ""
+"\n"
+" 单击 定义一个新的仓库。\n"
+"
\n"
+" "
#. module: stock
#: selection:report.stock.inventory,state:0
@@ -3834,12 +3868,12 @@ msgstr "这分拣单不需要开发票。"
msgid ""
"The unit of measure rounding does not allow you to ship \"%s %s\", only "
"roundings of \"%s %s\" is accepted by the Unit of Measure."
-msgstr ""
+msgstr "计量单位取整不允许你的运送 \"%s %s\",只有\"%s %s\" 取整才被该计量单位接受。"
#. module: stock
#: model:stock.location,name:stock.stock_location_shop0
msgid "Your Company, Chicago shop"
-msgstr ""
+msgstr "Your Company, Chicago shop"
#. module: stock
#: selection:report.stock.move,type:0
@@ -3877,12 +3911,12 @@ msgstr ""
msgid ""
"By changing this quantity here, you accept the new quantity as complete: "
"OpenERP will not automatically generate a back order."
-msgstr ""
+msgstr "通过修改此处的数量,就是您已经收到完成的数量: OpenERP 将自动生成一个延期交货清单。"
#. module: stock
#: view:stock.production.lot.revision:0
msgid "Serial Number Revisions"
-msgstr ""
+msgstr "序列号修订版"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_picking_tree
@@ -3900,7 +3934,7 @@ msgstr "送货单已处理"
#. module: stock
#: field:product.template,loc_case:0
msgid "Case"
-msgstr ""
+msgstr "案例"
#. module: stock
#: selection:report.stock.inventory,state:0
@@ -3941,10 +3975,10 @@ msgstr "这选项允许这库位能不能放置废料"
#: field:stock.picking.in,message_follower_ids:0
#: field:stock.picking.out,message_follower_ids:0
msgid "Followers"
-msgstr ""
+msgstr "关注者"
#. module: stock
-#: code:addons/stock/stock.py:2585
+#: code:addons/stock/stock.py:2590
#, python-format
msgid "Cannot consume a move with negative or zero quantity."
msgstr ""
@@ -3954,7 +3988,7 @@ msgstr ""
msgid ""
"As an example, a decimal precision of 2 will allow weights like: 9.99 kg, "
"whereas a decimal precision of 4 will allow weights like: 0.0231 kg."
-msgstr ""
+msgstr "作为一个例子,十进制精度为2允许重量是这样的:9.99千克,而一个十进制精度为4,将允许重量是这样的,如:0.0231千克。"
#. module: stock
#: view:report.stock.move:0
@@ -3967,7 +4001,7 @@ msgstr "总出库数量"
#: field:stock.picking.in,backorder_id:0
#: field:stock.picking.out,backorder_id:0
msgid "Back Order of"
-msgstr "分单"
+msgstr "之延期交货清单。"
#. module: stock
#: help:stock.partial.move.line,cost:0
@@ -3987,7 +4021,7 @@ msgstr "产品类别"
#. module: stock
#: view:stock.move:0
msgid "Serial Number"
-msgstr ""
+msgstr "序列号"
#. module: stock
#: view:stock.invoice.onshipping:0
@@ -4007,7 +4041,7 @@ msgstr "设置"
#. module: stock
#: model:res.groups,name:stock.group_locations
msgid "Manage Multiple Locations and Warehouses"
-msgstr ""
+msgstr "管理多个库位和仓库"
#. module: stock
#: help:stock.change.standard.price,new_price:0
@@ -4022,10 +4056,10 @@ msgstr ""
"如果成本价减少,库存核算科目为贷方,入库科目为借方。"
#. module: stock
-#: code:addons/stock/stock.py:2811
+#: code:addons/stock/stock.py:2816
#, python-format
msgid "INV:"
-msgstr ""
+msgstr "INV:"
#. module: stock
#: help:stock.config.settings,module_stock_invoice_directly:0
@@ -4074,7 +4108,7 @@ msgstr ""
"用于实时库存核算。当设定在一个虚拟库位(而不是内部类型)时,这科目将用于记录从内部库位调拨产品的估值。一般代替这产品的出库科目。它不影响内部库位。"
#. module: stock
-#: code:addons/stock/product.py:457
+#: code:addons/stock/product.py:459
#, python-format
msgid "Future Deliveries"
msgstr "未来送货"
@@ -4100,7 +4134,7 @@ msgstr "自动审核"
#: code:addons/stock/stock.py:1821
#, python-format
msgid "Insufficient Stock for Serial Number !"
-msgstr ""
+msgstr "该序列号的库存不足!"
#. module: stock
#: model:ir.model,name:stock.model_product_template
@@ -4144,13 +4178,13 @@ msgstr "字段用于记录用户确认在分拣期间所用的币别(用于计
#. module: stock
#: help:stock.production.lot,name:0
msgid "Unique Serial Number, will be displayed as: PREFIX/SERIAL [INT_REF]"
-msgstr ""
+msgstr "唯一序列号将被显示为: PREFIX/SERIAL [INT_REF]"
#. module: stock
#: code:addons/stock/product.py:142
#, python-format
msgid "Please define stock input account for this product: \"%s\" (id: %d)."
-msgstr ""
+msgstr "请为产品 \"%s\" (id: %d) 定义一个入库科目。"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_reception_picking_move
@@ -4161,7 +4195,7 @@ msgstr "入库产品"
#. module: stock
#: view:product.product:0
msgid "update"
-msgstr ""
+msgstr "更新"
#. module: stock
#: view:stock.change.product.qty:0
@@ -4180,7 +4214,7 @@ msgstr ""
#: view:stock.return.picking:0
#: view:stock.split.into:0
msgid "or"
-msgstr ""
+msgstr "或"
#. module: stock
#: selection:stock.picking,invoice_state:0
@@ -4232,7 +4266,7 @@ msgstr "自动分拣"
#. module: stock
#: report:stock.picking.list:0
msgid "Customer Address :"
-msgstr ""
+msgstr "客户地址:"
#. module: stock
#: field:stock.location,chained_auto_packing:0
@@ -4288,7 +4322,7 @@ msgstr "你真的要合并盘点?"
#. module: stock
#: view:stock.picking.out:0
msgid "Date of Delivery"
-msgstr ""
+msgstr "发运日期"
#. module: stock
#: field:stock.location,posy:0
@@ -4301,18 +4335,18 @@ msgstr "货架(Y)"
msgid ""
"Please define inventory valuation account on the product category: \"%s\" "
"(id: %d)"
-msgstr ""
+msgstr "请在产品类别 \"%s\" (id: %d) 中定义一个存货估值 科目"
#. module: stock
#: model:ir.model,name:stock.model_stock_production_lot_revision
msgid "Serial Number Revision"
-msgstr ""
+msgstr "序列号版本"
#. module: stock
#: code:addons/stock/product.py:96
#, python-format
msgid "Specify valuation Account for Product Category: %s."
-msgstr ""
+msgstr "为产品分类 %s 指定估值科目。"
#. module: stock
#: help:stock.config.settings,module_claim_from_delivery:0
@@ -4320,12 +4354,14 @@ msgid ""
"Adds a Claim link to the delivery order.\n"
" This installs the module claim_from_delivery."
msgstr ""
+"为发运单添加一个 索赔链接。\n"
+"这需要安装模块claim_from_delivery."
#. module: stock
#: code:addons/stock/wizard/stock_return_picking.py:208
#, python-format
msgid "Please specify at least one non-zero quantity."
-msgstr ""
+msgstr "请指定至少一个非0的数值。"
#. module: stock
#: field:stock.fill.inventory,set_stock_zero:0
@@ -4340,7 +4376,7 @@ msgstr "用户"
#. module: stock
#: field:stock.config.settings,module_stock_location:0
msgid "Create push/pull logistic rules"
-msgstr ""
+msgstr "创建推拉物流规则"
#. module: stock
#: code:addons/stock/wizard/stock_invoice_onshipping.py:98
@@ -4355,7 +4391,7 @@ msgid "November"
msgstr "11月"
#. module: stock
-#: code:addons/stock/product.py:471
+#: code:addons/stock/product.py:473
#, python-format
msgid "Unplanned Qty"
msgstr "计划外数量"
@@ -4379,7 +4415,7 @@ msgstr "1月"
#. module: stock
#: constraint:stock.move:0
msgid "You cannot move products from or to a location of the type view."
-msgstr ""
+msgstr "不能将视图类型的库位作为移库单的源库位或者目标库位"
#. module: stock
#: help:stock.config.settings,group_stock_production_lot:0
@@ -4394,7 +4430,7 @@ msgstr ""
#, python-format
msgid ""
"No product in this location. Please select a location in the product form."
-msgstr ""
+msgstr "该库位没有产品。请从产品表单选择一个库位。"
#. module: stock
#: model:ir.actions.act_window,name:stock.act_product_stock_move_futur_open
@@ -4407,7 +4443,7 @@ msgid "Move History (parent moves)"
msgstr "调拨日志(上级调拨)"
#. module: stock
-#: code:addons/stock/product.py:453
+#: code:addons/stock/product.py:455
#, python-format
msgid "Future Stock"
msgstr "未来库存"
@@ -4462,7 +4498,7 @@ msgstr "库位"
msgid ""
"If this shipment was split, then this field links to the shipment which "
"contains the already processed part."
-msgstr ""
+msgstr "如果这个装运单被分割,该字段将连接到包括了已经处理的部分的装运单。"
#. module: stock
#: view:stock.inventory:0
@@ -4481,7 +4517,7 @@ msgstr "前缀"
#: view:stock.move:0
#: view:stock.move.split:0
msgid "Split in Serial Numbers"
-msgstr ""
+msgstr "分开进系列号"
#. module: stock
#: help:product.template,property_stock_account_input:0
@@ -4524,12 +4560,12 @@ msgstr "指定包装的属性如数量,类型等"
#. module: stock
#: view:product.product:0
msgid "Delays"
-msgstr ""
+msgstr "延迟"
#. module: stock
#: report:stock.picking.list:0
msgid "Schedule Date"
-msgstr ""
+msgstr "预定日期"
#. module: stock
#: field:stock.location.product,to_date:0
@@ -4580,7 +4616,7 @@ msgstr "5月"
#: code:addons/stock/product.py:110
#, python-format
msgid "No difference between standard price and new price!"
-msgstr ""
+msgstr "标准价和新价格之间没有不同!"
#. module: stock
#: view:stock.picking.out:0
@@ -4595,7 +4631,7 @@ msgstr "送货"
#. module: stock
#: view:stock.fill.inventory:0
msgid "Import the current inventory"
-msgstr ""
+msgstr "导入当前库存清单"
#. module: stock
#: model:ir.actions.act_window,name:stock.action5
@@ -4609,7 +4645,7 @@ msgid "Location Content"
msgstr "库位包含"
#. module: stock
-#: code:addons/stock/product.py:477
+#: code:addons/stock/product.py:479
#, python-format
msgid "Produced Qty"
msgstr "产品数量"
@@ -4631,7 +4667,7 @@ msgstr "连锁库位类型"
#: help:stock.picking.in,min_date:0
#: help:stock.picking.out,min_date:0
msgid "Scheduled time for the shipment to be processed"
-msgstr ""
+msgstr "该装运单被处理的计划时间"
#. module: stock
#: selection:report.stock.inventory,location_type:0
@@ -4676,19 +4712,19 @@ msgstr ""
#. module: stock
#: view:stock.picking.in:0
msgid "Date of Reception"
-msgstr ""
+msgstr "接收的日期"
#. module: stock
#: help:stock.config.settings,group_stock_multiple_locations:0
msgid ""
"This allows to configure and use multiple stock locations and warehouses,\n"
" instead of having a single default one."
-msgstr ""
+msgstr "允许配置和使用多个库位和仓库,替换默认的一个。"
#. module: stock
#: view:stock.picking:0
msgid "Confirm & Transfer"
-msgstr ""
+msgstr "确认并传递"
#. module: stock
#: field:stock.location,scrap_location:0
@@ -4734,6 +4770,12 @@ msgid ""
" \n"
" "
msgstr ""
+"\n"
+" 点击以创建一个送货单. \n"
+"
\n"
+" 这里是所有送货单的列表,它们是根据不同的销售订单和物流规则 被准备好的。\n"
+"
\n"
+" "
#. module: stock
#: help:stock.tracking,name:0
@@ -4799,7 +4841,7 @@ msgstr "准备处理"
#. module: stock
#: report:stock.picking.list:0
msgid "Warehouse Address :"
-msgstr ""
+msgstr "仓库地址:"
#~ msgid "["
#~ msgstr "["
From a176be5c4480a37ebdac110d23ae4588d6c6d14a Mon Sep 17 00:00:00 2001
From: Christophe Matthieu
Date: Thu, 1 Aug 2013 16:33:47 +0200
Subject: [PATCH 46/61] [IMP] website: public_uid
bzr revid: chm@openerp.com-20130801143347-ihg8nkb1frs08rl2
---
addons/website/website.py | 2 ++
addons/website_hr/controllers/main.py | 1 -
addons/website_mail/controllers/main.py | 7 +---
addons/website_mail/static/src/css/blog.css | 9 -----
addons/website_mail/static/src/css/blog.sass | 8 -----
addons/website_mail/static/src/js/blog.js | 19 ++++++----
addons/website_mail/views/website_mail.xml | 26 +++++++-------
addons/website_sale/controllers/main.py | 38 ++++++++++----------
8 files changed, 49 insertions(+), 61 deletions(-)
diff --git a/addons/website/website.py b/addons/website/website.py
index f8d9a9592ce..b4f2da2ea80 100644
--- a/addons/website/website.py
+++ b/addons/website/website.py
@@ -8,6 +8,7 @@ from openerp.addons.web.http import request
def auth_method_public():
registry = openerp.modules.registry.RegistryManager.get(request.db)
+ request.public_uid = None
with registry.cursor() as cr:
request.public_uid = request.registry['ir.model.data'].get_object_reference(cr, openerp.SUPERUSER_ID, 'website', 'public_user')[1]
if not request.session.uid:
@@ -30,6 +31,7 @@ class website(object):
'script': script,
'css': css,
'host_url': request.httprequest.host_url,
+ 'res_company': request.registry['res.company'].browse(request.cr, openerp.SUPERUSER_ID, 1),
}
_values.update(add_values)
return request.registry.get("ir.ui.view").render(request.cr, request.uid, template, _values)
diff --git a/addons/website_hr/controllers/main.py b/addons/website_hr/controllers/main.py
index 3cffe6d9388..fb63bbcc7ed 100644
--- a/addons/website_hr/controllers/main.py
+++ b/addons/website_hr/controllers/main.py
@@ -12,7 +12,6 @@ class website_hr(http.Controller):
employee_ids = hr_obj.search(request.cr, request.uid, [(1, "=", 1)])
values = {
- 'res_company': request.registry['res.company'].browse(request.cr, request.uid, 1),
'employee_ids': hr_obj.browse(request.cr, request.uid, employee_ids),
}
diff --git a/addons/website_mail/controllers/main.py b/addons/website_mail/controllers/main.py
index b8ae9981be6..dd155eccf32 100644
--- a/addons/website_mail/controllers/main.py
+++ b/addons/website_mail/controllers/main.py
@@ -19,7 +19,6 @@ class website_mail(http.Controller):
message_obj = request.registry['mail.message']
values = {
- 'res_company': request.registry['res.company'].browse(request.cr, request.uid, 1),
'blog_ids': None,
'blog_id': None,
'nav_list': dict(),
@@ -28,7 +27,7 @@ class website_mail(http.Controller):
'mail_group_id': mail_group_id,
}
domain = mail_group_id and [("res_id", "=", mail_group_id)] or []
-
+
for group in message_obj.read_group(request.cr, request.uid, domain + group_obj.get_public_blog(request.cr, request.uid), ['subject', 'date'], groupby="date", orderby="create_date asc"):
year = group['date'].split(" ")[1]
if not values['nav_list'].get(year):
@@ -58,13 +57,11 @@ class website_mail(http.Controller):
@http.route(['/blog/nav'], type='http', auth="public")
def nav(self, **post):
- request.uid = website.get_request.uid()
comment_ids = request.registry['mail.group'].get_public_message_ids(request.cr, request.uid, domain=safe_eval(post.get('domain')), order="create_date asc", limit=None)
return simplejson.dumps(request.registry['mail.message'].read(request.cr, request.uid, comment_ids, ['website_published', 'subject', 'res_id']))
@http.route(['/blog/publish'], type='http', auth="public")
def publish(self, **post):
- request.uid = website.get_request.uid()
message_id = int(post['message_id'])
message_obj = request.registry['mail.message']
@@ -76,7 +73,6 @@ class website_mail(http.Controller):
@http.route(['/blog///post'], type='http', auth="public")
def blog_post(self, mail_group_id=None, blog_id=None, **post):
- request.uid = website.get_request.uid()
url = request.httprequest.host_url
if post.get('body'):
request.session.body = post.get('body')
@@ -101,7 +97,6 @@ class website_mail(http.Controller):
@http.route(['/blog//new'], type='http', auth="public")
def new_blog_post(self, mail_group_id=None, **post):
- request.uid = website.get_request.uid()
blog_id = request.registry['mail.group'].message_post(request.cr, request.uid, mail_group_id,
body=_("Blog content.
Please edit this content then you can publish this blog."),
subject=_("Blog title"),
diff --git a/addons/website_mail/static/src/css/blog.css b/addons/website_mail/static/src/css/blog.css
index 8edea7d3306..5850483761f 100644
--- a/addons/website_mail/static/src/css/blog.css
+++ b/addons/website_mail/static/src/css/blog.css
@@ -1,12 +1,3 @@
-.css_website_mail .media .label-success {
- display: none;
-}
-.css_website_mail .css_published .label-important {
- display: none;
-}
-.css_website_mail .css_published .label-success {
- display: inline-block;
-}
.css_website_mail .has-error {
border-color: red;
}
diff --git a/addons/website_mail/static/src/css/blog.sass b/addons/website_mail/static/src/css/blog.sass
index e0e8828d9f2..c23585eae75 100644
--- a/addons/website_mail/static/src/css/blog.sass
+++ b/addons/website_mail/static/src/css/blog.sass
@@ -1,14 +1,6 @@
@import "compass/css3"
.css_website_mail
- .media
- .label-success
- display: none
- .css_published
- .label-important
- display: none
- .label-success
- display: inline-block
.has-error
border-color: red
.css_nav_month
diff --git a/addons/website_mail/static/src/js/blog.js b/addons/website_mail/static/src/js/blog.js
index a80c3d99de4..1588c7cd9b5 100644
--- a/addons/website_mail/static/src/js/blog.js
+++ b/addons/website_mail/static/src/js/blog.js
@@ -1,11 +1,18 @@
$(document).ready(function () {
- $('.js_website_mail').on('click', '.js_publish', function (e) {
+ $('.js_website_mail').on('click', '.js_publish, .js_unpublish', function (e) {
e.preventDefault();
- var $media = $(this).parent();
- $media.toggleClass('css_published');
- $.post('/blog/publish/', {'message_id': $(this).data('id')}, function (result) {
- if (+result) $media.addClass('css_published');
- else $media.removeClass('css_published');
+ var $link = $(this).parent();
+ $link.find('.js_publish, .js_unpublish').addClass("hidden");
+ var $unp = $link.find(".js_unpublish");
+ var $p = $link.find(".js_publish");
+ $.post('/blog/publish/', {'message_id': $link.data('id')}, function (result) {
+ if (+result) {
+ $p.addClass("hidden");
+ $unp.removeClass("hidden");
+ } else {
+ $p.removeClass("hidden");
+ $unp.addClass("hidden");
+ }
});
});
diff --git a/addons/website_mail/views/website_mail.xml b/addons/website_mail/views/website_mail.xml
index f352a1e0c39..23b6d48be07 100644
--- a/addons/website_mail/views/website_mail.xml
+++ b/addons/website_mail/views/website_mail.xml
@@ -45,11 +45,11 @@
Blog
-