From 00375756199e95a94a26f8a64a6260124f9390f8 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 16 Feb 2012 17:27:06 +0100 Subject: [PATCH 01/39] [IMP] tests: provide simple reusable base classes to write tests. bzr revid: vmt@openerp.com-20120216162706-ccbgkqv8k8kufmnb --- openerp/tests/common.py | 79 ++++++++++++++++++------------- openerp/tests/test_ir_sequence.py | 5 -- openerp/tests/test_orm.py | 17 +++---- openerp/tests/test_xmlrpc.py | 21 ++++---- 4 files changed, 62 insertions(+), 60 deletions(-) diff --git a/openerp/tests/common.py b/openerp/tests/common.py index 44696384ce7..5b1b8096edf 100644 --- a/openerp/tests/common.py +++ b/openerp/tests/common.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import os import time +import unittest2 import xmlrpclib import openerp @@ -16,15 +17,6 @@ ADMIN_USER = 'admin' ADMIN_USER_ID = 1 ADMIN_PASSWORD = 'admin' -common_proxy_60 = None -db_proxy_60 = None -object_proxy_60 = None - -common_proxy_61 = None -db_proxy_61 = None -model_proxy_61 = None -model_uri_61 = None - def start_openerp(): """ Start the OpenERP server similary to the openerp-server script. @@ -34,33 +26,52 @@ def start_openerp(): # Ugly way to ensure the server is listening. time.sleep(2) -def create_xmlrpc_proxies(): +def stop_openerp(): """ - setup some xmlrpclib proxies. + Shutdown the OpenERP server similarly to a single ctrl-c. """ - global common_proxy_60 - global db_proxy_60 - global object_proxy_60 - - # Use the old (pre 6.1) API. - url = 'http://%s:%d/xmlrpc/' % (HOST, PORT) - common_proxy_60 = xmlrpclib.ServerProxy(url + 'common') - db_proxy_60 = xmlrpclib.ServerProxy(url + 'db') - object_proxy_60 = xmlrpclib.ServerProxy(url + 'object') - - global common_proxy_61 - global db_proxy_61 - global model_proxy_61 - global model_uri_61 - - # Use the new (6.1) API. - model_uri_61 = 'http://%s:%d/openerp/xmlrpc/1/' % (HOST, PORT) - common_proxy_61 = xmlrpclib.ServerProxy(model_uri_61 + 'common') - db_proxy_61 = xmlrpclib.ServerProxy(model_uri_61 + 'db') - model_proxy_61 = xmlrpclib.ServerProxy(model_uri_61 + 'model/' + DB) - -def tearDownModule(): - """ Shutdown the OpenERP server similarly to a single ctrl-c. """ openerp.service.stop_services() +class TransactionCase(unittest2.TestCase): + """ + Subclass of TestCase with a single transaction, rolled-back at the end of + the tests. + """ + + def __init__(self, name): + super(TransactionCase, self).__init__(name) + self.registry = lambda model: \ + openerp.modules.registry.RegistryManager.get(DB)[model] + + def setUp(self): + self.cr = openerp.modules.registry.RegistryManager.get(DB).db.cursor() + + def tearDown(self): + self.cr.rollback() + self.cr.close() + +class RpcCase(unittest2.TestCase): + """ + Subclass of TestCase with a few XML-RPC proxies. + """ + + def __init__(self, name): + super(RpcCase, self).__init__(name) + + class A(object): + pass + self.proxy = A() + + # Use the old (pre 6.1) API. + self.proxy.url_60 = url_60 = 'http://%s:%d/xmlrpc/' % (HOST, PORT) + self.proxy.common_60 = xmlrpclib.ServerProxy(url_60 + 'common') + self.proxy.db_60 = xmlrpclib.ServerProxy(url_60 + 'db') + self.proxy.object_60 = xmlrpclib.ServerProxy(url_60 + 'object') + + # Use the new (6.1) API. + self.proxy.url_61 = url_61 = 'http://%s:%d/openerp/xmlrpc/1/' % (HOST, PORT) + self.proxy.common_61 = xmlrpclib.ServerProxy(url_61 + 'common') + self.proxy.db_61 = xmlrpclib.ServerProxy(url_61 + 'db') + self.proxy.model_61 = xmlrpclib.ServerProxy(url_61 + 'model/' + DB) + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/tests/test_ir_sequence.py b/openerp/tests/test_ir_sequence.py index 2e9623c09b9..f16a7b4b603 100644 --- a/openerp/tests/test_ir_sequence.py +++ b/openerp/tests/test_ir_sequence.py @@ -16,11 +16,6 @@ import common DB = common.DB ADMIN_USER_ID = common.ADMIN_USER_ID -def setUpModule(): - common.create_xmlrpc_proxies() - -tearDownModule = common.tearDownModule - def registry(model): return openerp.modules.registry.RegistryManager.get(DB)[model] diff --git a/openerp/tests/test_orm.py b/openerp/tests/test_orm.py index c11d4cd19d2..0c4046df2a4 100644 --- a/openerp/tests/test_orm.py +++ b/openerp/tests/test_orm.py @@ -2,9 +2,10 @@ import os import unittest2 import openerp +import common -UID = 1 -DB = openerp.tools.config['db_name'] +UID = common.ADMIN_USER_ID +DB = common.DB CREATE = lambda values: (0, False, values) UPDATE = lambda id, values: (1, id, values) @@ -14,16 +15,12 @@ LINK_TO = lambda id: (4, id, False) DELETE_ALL = lambda: (5, False, False) REPLACE_WITH = lambda ids: (6, False, ids) -class TestO2MSerialization(unittest2.TestCase): +class TestO2MSerialization(common.TransactionCase): def setUp(self): - self.cr = openerp.modules.registry.RegistryManager.get(DB).db.cursor() - self.partner = openerp.modules.registry.RegistryManager.get(DB)['res.partner'] - self.address = openerp.modules.registry.RegistryManager.get(DB)['res.partner.address'] - - def tearDown(self): - self.cr.rollback() - self.cr.close() + super(TestO2MSerialization, self).setUp() + self.partner = self.registry('res.partner') + self.address = self.registry('res.partner.address') def test_no_command(self): " empty list of commands yields an empty list of records " diff --git a/openerp/tests/test_xmlrpc.py b/openerp/tests/test_xmlrpc.py index 954d3447360..c24d6ba706e 100644 --- a/openerp/tests/test_xmlrpc.py +++ b/openerp/tests/test_xmlrpc.py @@ -12,52 +12,51 @@ import xmlrpclib import openerp import common +import core DB = common.DB ADMIN_USER = common.ADMIN_USER ADMIN_USER_ID = common.ADMIN_USER_ID ADMIN_PASSWORD = common.ADMIN_PASSWORD -def setUpModule(): - common.start_openerp() - common.create_xmlrpc_proxies() +setUpModule = common.start_openerp -tearDownModule = common.tearDownModule +tearDownModule = common.stop_openerp -class test_xmlrpc(unittest2.TestCase): +class test_xmlrpc(core.RpcCase): def test_00_xmlrpc_create_database_polling(self): """ Simulate a OpenERP client requesting the creation of a database and polling the server until the creation is complete. """ - progress_id = common.db_proxy_60.create(ADMIN_PASSWORD, DB, True, + progress_id = self.proxy.db_60.create(ADMIN_PASSWORD, DB, True, False, ADMIN_PASSWORD) while True: time.sleep(1) - progress, users = common.db_proxy_60.get_progress(ADMIN_PASSWORD, + progress, users = self.proxy.db_60.get_progress(ADMIN_PASSWORD, progress_id) if progress == 1.0: break def test_xmlrpc_login(self): """ Try to login on the common service. """ - uid = common.common_proxy_60.login(DB, ADMIN_USER, ADMIN_PASSWORD) + uid = self.proxy.common_60.login(DB, ADMIN_USER, ADMIN_PASSWORD) assert uid == ADMIN_USER_ID def test_xmlrpc_ir_model_search(self): """ Try a search on the object service. """ - ids = common.object_proxy_60.execute(DB, ADMIN_USER_ID, ADMIN_PASSWORD, + ids = self.proxy.object_60.execute(DB, ADMIN_USER_ID, ADMIN_PASSWORD, 'ir.model', 'search', []) assert ids - ids = common.object_proxy_60.execute(DB, ADMIN_USER_ID, ADMIN_PASSWORD, + ids = self.proxy.object_60.execute(DB, ADMIN_USER_ID, ADMIN_PASSWORD, 'ir.model', 'search', [], {}) assert ids def test_xmlrpc_61_ir_model_search(self): """ Try a search on the object service. """ - proxy = xmlrpclib.ServerProxy(common.model_uri_61 + 'model/' + DB + '/ir.model') + proxy = xmlrpclib.ServerProxy(self.proxy.url_61 + 'model/' + DB + '/ir.model') ids = proxy.execute(ADMIN_USER_ID, ADMIN_PASSWORD, 'search', []) assert ids ids = proxy.execute(ADMIN_USER_ID, ADMIN_PASSWORD, 'search', [], {}) From ed71ad094635923baab956bae554eb14e8ee5597 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 17 Feb 2012 16:00:49 +0100 Subject: [PATCH 02/39] [FIX] tests: `core` is really `common`. Also added some comments and a second test suite variable for sanity checks. The comments will later be changed to point to some documentation instead. bzr revid: vmt@openerp.com-20120217150049-in1lmo24qay8ulmh --- openerp/tests/__init__.py | 24 +++++++++++++++++++++--- openerp/tests/test_xmlrpc.py | 3 +-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/openerp/tests/__init__.py b/openerp/tests/__init__.py index 6d29053b93c..dbdd2ccd024 100644 --- a/openerp/tests/__init__.py +++ b/openerp/tests/__init__.py @@ -1,14 +1,32 @@ # -*- coding: utf-8 -*- -import unittest2 +""" +Tests for the OpenERP library. + +This module groups a few sub-modules containing unittest2 test cases. + +Some of those test sub-modules are explicitely listed in the `fast_suite` +variable. Most of the tests should be considered fast enough to be included in +that `fast_suite` list and only tests that take a long time to run (e.g. more +than a minute) should not be listed. + +Some other test sub-modules are sanity checks explicitely listed in the +`checks` variable. These test sub-modules are invariants that must be +full-filled at any time. They are expected to always pass: obviously they must +pass right after the module is installed, but they must also pass after any +other module is installed, after a migration, or even after the database was +put in production for a few months. +""" import test_orm import test_ir_sequence import test_xmlrpc -# Explicit declaration list of test sub-modules. -suite = [ +fast_suite = [ test_xmlrpc, # Creates a database test_ir_sequence, # Assume an existing database + ] + +checks = [ test_orm, # Assume an existing database ] diff --git a/openerp/tests/test_xmlrpc.py b/openerp/tests/test_xmlrpc.py index c24d6ba706e..dfed851dbe3 100644 --- a/openerp/tests/test_xmlrpc.py +++ b/openerp/tests/test_xmlrpc.py @@ -12,7 +12,6 @@ import xmlrpclib import openerp import common -import core DB = common.DB ADMIN_USER = common.ADMIN_USER @@ -23,7 +22,7 @@ setUpModule = common.start_openerp tearDownModule = common.stop_openerp -class test_xmlrpc(core.RpcCase): +class test_xmlrpc(common.RpcCase): def test_00_xmlrpc_create_database_polling(self): """ From d709d602d8e139b09b19bb842c1560b2f87052d8 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Tue, 28 Feb 2012 12:24:18 +0100 Subject: [PATCH 03/39] [ADD] FEATURES.rst: whenever a feature branch is reviewed (but normally also when it is started), the description of the implented features must be provided, so here they are. bzr revid: vmt@openerp.com-20120228112418-r8tjx3o6xc2cbaej --- FEATURES.rst | 107 ++++++++++++++++++++++++++++++++++++++ openerp/tests/__init__.py | 13 +---- 2 files changed, 109 insertions(+), 11 deletions(-) create mode 100644 FEATURES.rst diff --git a/FEATURES.rst b/FEATURES.rst new file mode 100644 index 00000000000..ccbc7d2de7a --- /dev/null +++ b/FEATURES.rst @@ -0,0 +1,107 @@ +.. _features: + +Features +======== + + +.. _test-framework: + +Test framework +-------------- + +In addition to the YAML-based tests, OpenERP uses the unittest2 testing +framework to test both the core `openerp` package and its addons. For the core +and each addons, tests are divided between three (overlapping) sets: + +1. A test suite that comprises all the tests that can be run right after the +addons is installed (or, for the core, right after a database is created). +That suite is called `fast_suite` and must contain only tests that can be run +frequently. Actually most of the tests should be considered fast enough to be +included in that `fast_suite` list and only tests that take a long time to run +(e.g. more than a minute) should not be listed. Those long tests should come up +pretty rarely. + +2. A test suite called `checks` provides sanity checks. These tests are +invariants that must be full-filled at any time. They are expected to always +pass: obviously they must pass right after the module is installed (i.e. just +like the `fast_suite` tests), but they must also pass after any other module is +installed, after a migration, or even after the database was put in production +for a few months. + +3. The third suite is made of all the tests: those provided by the two above +suites, but also tests that are not explicitely listed in `fast_suite` or +`checks`. They are not explicitely listed anywhere and are discovered +automatically. + +As the sanity checks provide stronger guarantees about the code and database +structure, new tests must be added to the `checks` suite whenever it is +possible. Said with other words: one should try to avoid writing tests that +assume a freshly installed/unaltered module or database. + +It is possible to have tests that are not listed in `fast_suite` or `checks`. +This is useful if a test takes a lot of time. By default, when using the +testing infrastructure, tests should run fast enough so that people can use +them frequently. One can also use that possiblity for tests that require some +complex setup before they can be successfuly run. + +As a rule of thumb when writing a new test, try to add it to the `checks` +suite. If it really needs that the module it belongs to is freshly installed, +add it to `fast_suite`. Finally, if it can not be run in an acceptable time +frame, don't add it to any explicit list. + +The tests must developed under `.tests` (or `openerp.tests` for the core). +For instance, with respect to the tests, a module `foo` should be organized as follow:: + + foo/ + __init__.py # does not import .tests + tests/ + __init__.py # import some of the tests sub-modules, and + # list them in fast_suite or checks + test_bar.py # contains unittest2 classes + test_baz.py # idem + ... and so on ... + +The two explicit lists of tests are thus the variables `foo.tests.fast_suite` +and `foo.tests.checks`. As an example, you can take a look at the +`openerp.tests` module (which follows exactly the same conventions even if it +is not an addons). + +Note that the `fast_suite` and `checks` variables are really list of module +objects. They could be directly unittest2 suite objects if necessary in the +future. + +.. As this feature description becomes quite big, the following section is + turned into an additional feature. + +To run the tests, see :ref:`running-the-tests`. + +.. _running-the-tests: + +Running the tests +----------------- + +To run the tests (see :ref:`test-framework` to learn how tests are organized), +the simplest way is to use the `oe` command (provided by the `openerp-command` +project). + +:: + + > oe run-tests # will run all the fast_suite tests + > oe run-tests openerp # will run all the fast_suite tests defined in `openerp.tests` + > oe run-tests sale # will run all the fast_suite tests defined in `openerp.addons.sale.tests` + > oe run-tests foo.test_bar # will run the tests defined in `openerp.addons.foo.tests.test_bar` + +In addition to the above possibilities, when invoked with a non-existing module +(or module.sub-module) name, oe will reply with a list of available test +sub-modules. + +Depending on the unittest2 class that is used to write the tests (see +`openerp.tests.common` for some helper classes that you can re-use), a database +may be created before the test is run, and the module providing the test will +be installed on that database. + +Because creating a database, installing modules, and then dropping it is +expensive, it is possible to interleave the run of the `fast_suite` tests with +the initialization of a new database: the dabase is created, and after each +requested module is installed, its fast_suite tests are run. The database is +thus created and dropped (and the modules installed) only once. diff --git a/openerp/tests/__init__.py b/openerp/tests/__init__.py index dbdd2ccd024..de3bf5ea914 100644 --- a/openerp/tests/__init__.py +++ b/openerp/tests/__init__.py @@ -4,17 +4,8 @@ Tests for the OpenERP library. This module groups a few sub-modules containing unittest2 test cases. -Some of those test sub-modules are explicitely listed in the `fast_suite` -variable. Most of the tests should be considered fast enough to be included in -that `fast_suite` list and only tests that take a long time to run (e.g. more -than a minute) should not be listed. - -Some other test sub-modules are sanity checks explicitely listed in the -`checks` variable. These test sub-modules are invariants that must be -full-filled at any time. They are expected to always pass: obviously they must -pass right after the module is installed, but they must also pass after any -other module is installed, after a migration, or even after the database was -put in production for a few months. +Tests can be explicitely added to the `fast_suite` or `checks` lists or not. +See the :ref:`test-framework` section in the :ref:`features` list. """ import test_orm From dac45d43926df2c97c2251533365e42ea4811a07 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 29 Feb 2012 18:25:20 +0100 Subject: [PATCH 04/39] [IMP] unittest: run the fast_suite and checks tests when installing a module. bzr revid: vmt@openerp.com-20120229172520-n0k1dmxo5p0h0bar --- openerp/modules/loading.py | 108 +++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index b3f831f9709..a0bc33ca14d 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -32,6 +32,7 @@ import os import re import sys import threading +import types import zipfile import zipimport @@ -62,6 +63,91 @@ from openerp.modules.module import \ _logger = logging.getLogger(__name__) +def get_test_modules(module, submodule, explode): + """ + Return a list of submodules containing tests. + `submodule` can be: + - None + - the name of a submodule + - '__fast_suite__' + - '__sanity_checks__' + """ + # Turn command-line module, submodule into importable names. + if module is None: + pass + elif module == 'openerp': + module = 'openerp.tests' + else: + module = 'openerp.addons.' + module + '.tests' + + # Try to import the module + try: + __import__(module) + except Exception, e: + if explode: + print 'Can not `import %s`.' % module + import logging + logging.exception('') + sys.exit(1) + else: + if str(e) == 'No module named tests': + # It seems the module has no `tests` sub-module, no problem. + pass + else: + print 'Can not `import %s`.' % module + return [] + + # Discover available test sub-modules. + m = sys.modules[module] + submodule_names = sorted([x for x in dir(m) \ + if x.startswith('test_') and \ + isinstance(getattr(m, x), types.ModuleType)]) + submodules = [getattr(m, x) for x in submodule_names] + + def show_submodules_and_exit(): + if submodule_names: + print 'Available submodules are:' + for x in submodule_names: + print ' ', x + sys.exit(1) + + if submodule is None: + # Use auto-discovered sub-modules. + ms = submodules + elif submodule == '__fast_suite__': + # Obtain the explicit test sub-modules list. + ms = getattr(sys.modules[module], 'fast_suite', None) + # `suite` was used before the 6.1 release instead of `fast_suite`. + ms = ms if ms else getattr(sys.modules[module], 'suite', None) + if ms is None: + if explode: + print 'The module `%s` has no defined test suite.' % (module,) + show_submodules_and_exit() + else: + ms = [] + elif submodule == '__sanity_checks__': + ms = getattr(sys.modules[module], 'checks', None) + if ms is None: + if explode: + print 'The module `%s` has no defined sanity checks.' % (module,) + show_submodules_and_exit() + else: + ms = [] + else: + # Pick the command-line-specified test sub-module. + m = getattr(sys.modules[module], submodule, None) + ms = [m] + + if m is None: + if explode: + print 'The module `%s` has no submodule named `%s`.' % \ + (module, submodule) + show_submodules_and_exit() + else: + ms = [] + + return ms + def open_openerp_namespace(): # See comment for open_openerp_namespace. if openerp.conf.deprecation.open_openerp_namespace: @@ -203,6 +289,28 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= # as there is no rollback. load_test(module_name, idref, mode) + # Run the `fast_suite` and `checks` tests. + import unittest2 + ms = get_test_modules(package.name, '__fast_suite__', explode=False) + ms.extend(get_test_modules(package.name, '__sanity_checks__', explode=False)) + suite = unittest2.TestSuite() + for m in ms: + suite.addTests(unittest2.TestLoader().loadTestsFromModule(m)) + if ms: + _logger.info('module %s: executing %s `fast_suite` and/or `checks` sub-modules' % (package.name, len(ms))) + class C(object): + def flush(self): + pass + def write(self, s): + import re + r = re.compile(r'^-*$') + if r.match(s): + return + for c in s.split('\n'): + _logger.log(logging.TEST, c) + stream = C() + unittest2.TextTestRunner(verbosity=2, stream=stream).run(suite) + processed_modules.append(package.name) migrations.migrate_module(package, 'post') From d85da033148afa707577dcf65dd9a719c064d0d1 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 1 Mar 2012 11:54:19 +0100 Subject: [PATCH 05/39] [IMP] tests: xml-rpc test drops the created database (which has its own name, not clashing with the main db name). bzr revid: vmt@openerp.com-20120301105419-8ik3z5eikwjnackk --- openerp/service/__init__.py | 2 ++ openerp/tests/__init__.py | 6 ++---- openerp/tests/common.py | 8 ++++++++ openerp/tests/test_xmlrpc.py | 20 +++++++++++++++----- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/openerp/service/__init__.py b/openerp/service/__init__.py index c387d272e26..511d62c5862 100644 --- a/openerp/service/__init__.py +++ b/openerp/service/__init__.py @@ -48,6 +48,8 @@ import openerp.wsgi _logger = logging.getLogger(__name__) +# TODO block until the server is really up, accepting connections +# TODO be idemptotent (as long as stop_service was not called). def start_services(): """ Start all services. diff --git a/openerp/tests/__init__.py b/openerp/tests/__init__.py index de3bf5ea914..e528da6ba08 100644 --- a/openerp/tests/__init__.py +++ b/openerp/tests/__init__.py @@ -10,15 +10,13 @@ See the :ref:`test-framework` section in the :ref:`features` list. import test_orm import test_ir_sequence -import test_xmlrpc fast_suite = [ - test_xmlrpc, # Creates a database - test_ir_sequence, # Assume an existing database + test_ir_sequence, ] checks = [ - test_orm, # Assume an existing database + test_orm, ] # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/tests/common.py b/openerp/tests/common.py index 5b1b8096edf..fdbb83f6b5b 100644 --- a/openerp/tests/common.py +++ b/openerp/tests/common.py @@ -74,4 +74,12 @@ class RpcCase(unittest2.TestCase): self.proxy.db_61 = xmlrpclib.ServerProxy(url_61 + 'db') self.proxy.model_61 = xmlrpclib.ServerProxy(url_61 + 'model/' + DB) + @classmethod + def generate_database_name(cls): + if hasattr(cls, '_database_id'): + cls._database_id += 1 + else: + cls._database_id = 0 + return '_fresh_name_' + str(cls._database_id) + '_' + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/tests/test_xmlrpc.py b/openerp/tests/test_xmlrpc.py index dfed851dbe3..37655e72718 100644 --- a/openerp/tests/test_xmlrpc.py +++ b/openerp/tests/test_xmlrpc.py @@ -13,12 +13,15 @@ import xmlrpclib import openerp import common -DB = common.DB +DB = None ADMIN_USER = common.ADMIN_USER ADMIN_USER_ID = common.ADMIN_USER_ID ADMIN_PASSWORD = common.ADMIN_PASSWORD -setUpModule = common.start_openerp +def setUpModule(): + common.start_openerp() + global DB + DB = common.RpcCase.generate_database_name() tearDownModule = common.stop_openerp @@ -29,8 +32,8 @@ class test_xmlrpc(common.RpcCase): Simulate a OpenERP client requesting the creation of a database and polling the server until the creation is complete. """ - progress_id = self.proxy.db_60.create(ADMIN_PASSWORD, DB, True, - False, ADMIN_PASSWORD) + progress_id = self.proxy.db_60.create(ADMIN_PASSWORD,DB, True, False, + ADMIN_PASSWORD) while True: time.sleep(1) progress, users = self.proxy.db_60.get_progress(ADMIN_PASSWORD, @@ -55,12 +58,19 @@ class test_xmlrpc(common.RpcCase): def test_xmlrpc_61_ir_model_search(self): """ Try a search on the object service. """ - proxy = xmlrpclib.ServerProxy(self.proxy.url_61 + 'model/' + DB + '/ir.model') + proxy = xmlrpclib.ServerProxy(self.proxy.url_61 + 'model/' + DB + + '/ir.model') ids = proxy.execute(ADMIN_USER_ID, ADMIN_PASSWORD, 'search', []) assert ids ids = proxy.execute(ADMIN_USER_ID, ADMIN_PASSWORD, 'search', [], {}) assert ids + def test_zz_xmlrpc_drop_database(self): + """ + Simulate a OpenERP client requesting the deletion of a database. + """ + assert self.proxy.db_60.drop(ADMIN_PASSWORD, DB) is True + if __name__ == '__main__': unittest2.main() From ade3f174a55334caae9dbeed7a8803c7481df3c6 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 1 Mar 2012 13:16:11 +0100 Subject: [PATCH 06/39] [IMP] tests: move tests discovery and execution to openerp.modules.module, removed unexisting column name, filter out more test outputs bzr revid: vmt@openerp.com-20120301121611-1gieqehm9wqog2fx --- openerp/modules/loading.py | 112 ++--------------------------- openerp/modules/module.py | 116 +++++++++++++++++++++++++++++- openerp/tests/test_ir_sequence.py | 3 +- 3 files changed, 120 insertions(+), 111 deletions(-) diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index a0bc33ca14d..c6558f78eb0 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -32,7 +32,6 @@ import os import re import sys import threading -import types import zipfile import zipimport @@ -63,91 +62,6 @@ from openerp.modules.module import \ _logger = logging.getLogger(__name__) -def get_test_modules(module, submodule, explode): - """ - Return a list of submodules containing tests. - `submodule` can be: - - None - - the name of a submodule - - '__fast_suite__' - - '__sanity_checks__' - """ - # Turn command-line module, submodule into importable names. - if module is None: - pass - elif module == 'openerp': - module = 'openerp.tests' - else: - module = 'openerp.addons.' + module + '.tests' - - # Try to import the module - try: - __import__(module) - except Exception, e: - if explode: - print 'Can not `import %s`.' % module - import logging - logging.exception('') - sys.exit(1) - else: - if str(e) == 'No module named tests': - # It seems the module has no `tests` sub-module, no problem. - pass - else: - print 'Can not `import %s`.' % module - return [] - - # Discover available test sub-modules. - m = sys.modules[module] - submodule_names = sorted([x for x in dir(m) \ - if x.startswith('test_') and \ - isinstance(getattr(m, x), types.ModuleType)]) - submodules = [getattr(m, x) for x in submodule_names] - - def show_submodules_and_exit(): - if submodule_names: - print 'Available submodules are:' - for x in submodule_names: - print ' ', x - sys.exit(1) - - if submodule is None: - # Use auto-discovered sub-modules. - ms = submodules - elif submodule == '__fast_suite__': - # Obtain the explicit test sub-modules list. - ms = getattr(sys.modules[module], 'fast_suite', None) - # `suite` was used before the 6.1 release instead of `fast_suite`. - ms = ms if ms else getattr(sys.modules[module], 'suite', None) - if ms is None: - if explode: - print 'The module `%s` has no defined test suite.' % (module,) - show_submodules_and_exit() - else: - ms = [] - elif submodule == '__sanity_checks__': - ms = getattr(sys.modules[module], 'checks', None) - if ms is None: - if explode: - print 'The module `%s` has no defined sanity checks.' % (module,) - show_submodules_and_exit() - else: - ms = [] - else: - # Pick the command-line-specified test sub-module. - m = getattr(sys.modules[module], submodule, None) - ms = [m] - - if m is None: - if explode: - print 'The module `%s` has no submodule named `%s`.' % \ - (module, submodule) - show_submodules_and_exit() - else: - ms = [] - - return ms - def open_openerp_namespace(): # See comment for open_openerp_namespace. if openerp.conf.deprecation.open_openerp_namespace: @@ -289,27 +203,11 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= # as there is no rollback. load_test(module_name, idref, mode) - # Run the `fast_suite` and `checks` tests. - import unittest2 - ms = get_test_modules(package.name, '__fast_suite__', explode=False) - ms.extend(get_test_modules(package.name, '__sanity_checks__', explode=False)) - suite = unittest2.TestSuite() - for m in ms: - suite.addTests(unittest2.TestLoader().loadTestsFromModule(m)) - if ms: - _logger.info('module %s: executing %s `fast_suite` and/or `checks` sub-modules' % (package.name, len(ms))) - class C(object): - def flush(self): - pass - def write(self, s): - import re - r = re.compile(r'^-*$') - if r.match(s): - return - for c in s.split('\n'): - _logger.log(logging.TEST, c) - stream = C() - unittest2.TextTestRunner(verbosity=2, stream=stream).run(suite) + # Run the `fast_suite` and `checks` tests given by the module. + if module_name == 'base': + # Also run the core tests after the dabase is created. + openerp.modules.module.run_unit_tests('openerp') + openerp.modules.module.run_unit_tests(module_name) processed_modules.append(package.name) diff --git a/openerp/modules/module.py b/openerp/modules/module.py index 6238aadaed0..2e8ef180c2b 100644 --- a/openerp/modules/module.py +++ b/openerp/modules/module.py @@ -20,9 +20,12 @@ # ############################################################################## -import os, sys, imp -from os.path import join as opj +import imp import itertools +import os +from os.path import join as opj +import sys +import types import zipimport import openerp @@ -460,5 +463,114 @@ def get_modules_with_version(): continue return res +def get_test_modules(module, submodule, explode): + """ + Return a list of submodules containing tests. + `submodule` can be: + - None + - the name of a submodule + - '__fast_suite__' + - '__sanity_checks__' + """ + # Turn command-line module, submodule into importable names. + if module is None: + pass + elif module == 'openerp': + module = 'openerp.tests' + else: + module = 'openerp.addons.' + module + '.tests' + + # Try to import the module + try: + __import__(module) + except Exception, e: + if explode: + print 'Can not `import %s`.' % module + import logging + logging.exception('') + sys.exit(1) + else: + if str(e) == 'No module named tests': + # It seems the module has no `tests` sub-module, no problem. + pass + else: + print 'Can not `import %s`.' % module + return [] + + # Discover available test sub-modules. + m = sys.modules[module] + submodule_names = sorted([x for x in dir(m) \ + if x.startswith('test_') and \ + isinstance(getattr(m, x), types.ModuleType)]) + submodules = [getattr(m, x) for x in submodule_names] + + def show_submodules_and_exit(): + if submodule_names: + print 'Available submodules are:' + for x in submodule_names: + print ' ', x + sys.exit(1) + + if submodule is None: + # Use auto-discovered sub-modules. + ms = submodules + elif submodule == '__fast_suite__': + # Obtain the explicit test sub-modules list. + ms = getattr(sys.modules[module], 'fast_suite', None) + # `suite` was used before the 6.1 release instead of `fast_suite`. + ms = ms if ms else getattr(sys.modules[module], 'suite', None) + if ms is None: + if explode: + print 'The module `%s` has no defined test suite.' % (module,) + show_submodules_and_exit() + else: + ms = [] + elif submodule == '__sanity_checks__': + ms = getattr(sys.modules[module], 'checks', None) + if ms is None: + if explode: + print 'The module `%s` has no defined sanity checks.' % (module,) + show_submodules_and_exit() + else: + ms = [] + else: + # Pick the command-line-specified test sub-module. + m = getattr(sys.modules[module], submodule, None) + ms = [m] + + if m is None: + if explode: + print 'The module `%s` has no submodule named `%s`.' % \ + (module, submodule) + show_submodules_and_exit() + else: + ms = [] + + return ms + +def run_unit_tests(module_name): + import unittest2 + ms = get_test_modules(module_name, '__fast_suite__', explode=False) + ms.extend(get_test_modules(module_name, '__sanity_checks__', explode=False)) + suite = unittest2.TestSuite() + for m in ms: + suite.addTests(unittest2.TestLoader().loadTestsFromModule(m)) + if ms: + _logger.info('module %s: executing %s `fast_suite` and/or `checks` sub-modules' % (module_name, len(ms))) + # Use a custom stream object to log the test executions. + class MyStream(object): + def flush(self): + pass + def write(self, s): + r = re.compile(r'^-*$|^ *... *$|^ok$') + if r.match(s): + return + first = True + for c in s.split('\n'): + if not first: + c = '` ' + c + first = False + _logger.log(logging.TEST, c) + unittest2.TextTestRunner(verbosity=2, stream=MyStream()).run(suite) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/tests/test_ir_sequence.py b/openerp/tests/test_ir_sequence.py index f16a7b4b603..ce4c19695dc 100644 --- a/openerp/tests/test_ir_sequence.py +++ b/openerp/tests/test_ir_sequence.py @@ -169,8 +169,7 @@ class test_ir_sequence_generate(unittest2.TestCase): def test_ir_sequence_create_no_gap(self): """ Try to create a sequence object. """ cr = cursor() - d = dict(code='test_sequence_type_6', name='Test sequence type', - implementation='no_gap') + d = dict(code='test_sequence_type_6', name='Test sequence type') c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {}) assert c d = dict(code='test_sequence_type_6', name='Test sequence') From 7e5feece185205a187d57539d97d5b0279cf4c68 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 1 Mar 2012 14:00:08 +0100 Subject: [PATCH 07/39] [ADD] eval tests for eval_domain_and_context bzr revid: xmo@openerp.com-20120301130008-dijd6r49js1227by --- addons/web/static/src/js/core.js | 105 +++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index fe2ca1beb4f..679b193e121 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -321,6 +321,108 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. this.active_id = null; return this.session_init(); }, + test_eval: function (source, expected) { + try { + var ctx = this.test_eval_contexts(source.contexts); + if (!_.isEqual(ctx, expected.context)) { + console.group('Local context does not match remote'); + console.warn('source', source.contexts); + console.warn('local', ctx); + console.warn('remote', expected.context); + console.groupEnd(); + } + } catch (e) { + console.error( + 'Failed to evaluate contexts', source.contexts, ':', e); + } + + try { + var dom = this.test_eval_domains(source.domains); + if (!_.isEqual(dom, expected.domain)) { + console.group('Local domain does not match remote'); + console.warn('source', source.domains); + console.warn('local', dom); + console.warn('remote', expected.domain); + console.groupEnd(); + } + } catch (e) { + console.error( + 'Failed to evaluate domains', source.domains, ':', e); + } + + try { + var groups = this.test_eval_groupby(source.group_by_seq); + if (!_.isEqual(groups, expected.group_by)) { + console.group('Local groupby does not match remote'); + console.warn('source', source.group_by_seq); + console.warn('local', groups); + console.warn('remote', expected.group_by); + console.groupEnd(); + } + } catch (e) {} + }, + test_eval_contexts: function (contexts) { + var result_context = _.extend({}, this.user_context), + self = this; + _(contexts).each(function (ctx) { + switch(ctx.__ref) { + case 'context': + _.extend(py.eval(ctx.__debug)); + break; + case 'compound_context': + _.extend(self.test_eval_contexts(ctx.__contexts)); + break; + default: + _.extend(result_context, ctx); + } + }); + return result_context; + }, + test_eval_domains: function (domains) { + var result_domain = [], self = this; + _(domains).each(function (dom) { + switch(dom.__ref) { + case 'domain': + result_domain.push.apply( + result_domain, py.eval(dom.__debug)); + break; + case 'compound_domain': + result_domain.push.apply( + result_domain, self.test_eval_contexts(dom.__contexts)); + break; + default: + result_domain.push.apply( + result_domain, dom); + } + }); + return result_domain; + }, + test_eval_groupby: function (contexts) { + var result_group = [], self = this; + _(contexts).each(function (ctx) { + var group; + switch(ctx.__ref) { + case 'context': + group = py.eval(ctx.__debug).group_by; + break; + case 'compound_context': + group = self.test_eval_contexts(ctx.__contexts).group_by; + break; + default: + group = ctx.group_by + } + if (!group) { return; } + if (typeof group === 'string') { + result_group.push(group); + } else if (group instanceof Array) { + result_group.push.apply(result_group, group); + } else { + throw new Error('Got invalid groupby {{' + + JSON.stringify(group) + '}}'); + } + }); + return result_group; + }, /** * Executes an RPC call, registering the provided callbacks. * @@ -358,6 +460,9 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. function (response, textStatus, jqXHR) { self.on_rpc_response(); if (!response.error) { + if (url.url === '/web/session/eval_domain_and_context') { + self.test_eval(params, response.result); + } deferred.resolve(response["result"], textStatus, jqXHR); } else if (response.error.data.type === "session_invalid") { self.uid = false; From 632311195013fbbded97a9c41202b63f70a3482a Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 1 Mar 2012 14:46:08 +0100 Subject: [PATCH 08/39] [IMP] tests: - moved a few YAML tests to unittest2 for demonstration purpose - changed --test-disable to --test-enable (and swapped its meaning) bzr revid: vmt@openerp.com-20120301134608-szuktuj8imdhmn0r --- FEATURES.rst | 5 +- openerp/addons/base/__openerp__.py | 1 - openerp/addons/base/test/test_ir_values.yml | 87 ----------------- .../addons/base/test/test_osv_expression.yml | 10 -- openerp/addons/base/tests/__init__.py | 5 + openerp/addons/base/tests/test_ir_values.py | 95 +++++++++++++++++++ openerp/modules/loading.py | 38 ++++---- openerp/modules/module.py | 11 ++- openerp/tests/__init__.py | 4 +- openerp/tests/common.py | 9 +- openerp/tests/test_expression.py | 12 +++ openerp/tools/config.py | 6 +- 12 files changed, 151 insertions(+), 132 deletions(-) delete mode 100644 openerp/addons/base/test/test_ir_values.yml create mode 100644 openerp/addons/base/tests/__init__.py create mode 100644 openerp/addons/base/tests/test_ir_values.py create mode 100644 openerp/tests/test_expression.py diff --git a/FEATURES.rst b/FEATURES.rst index ccbc7d2de7a..0b950db26ed 100644 --- a/FEATURES.rst +++ b/FEATURES.rst @@ -49,8 +49,9 @@ suite. If it really needs that the module it belongs to is freshly installed, add it to `fast_suite`. Finally, if it can not be run in an acceptable time frame, don't add it to any explicit list. -The tests must developed under `.tests` (or `openerp.tests` for the core). -For instance, with respect to the tests, a module `foo` should be organized as follow:: +The tests must be developed under `.tests` (or `openerp.tests` for +the core). For instance, with respect to the tests, a module `foo` should be +organized as follow:: foo/ __init__.py # does not import .tests diff --git a/openerp/addons/base/__openerp__.py b/openerp/addons/base/__openerp__.py index 4e9687e4ea4..802a0510e28 100644 --- a/openerp/addons/base/__openerp__.py +++ b/openerp/addons/base/__openerp__.py @@ -91,7 +91,6 @@ 'test/bug_lp541545.xml', 'test/test_osv_expression.yml', 'test/test_ir_rule.yml', # <-- These tests modify/add/delete ir_rules. - 'test/test_ir_values.yml', # Commented because this takes some time. # This must be (un)commented with the corresponding import statement # in test/__init__.py. diff --git a/openerp/addons/base/test/test_ir_values.yml b/openerp/addons/base/test/test_ir_values.yml deleted file mode 100644 index c26e7257afd..00000000000 --- a/openerp/addons/base/test/test_ir_values.yml +++ /dev/null @@ -1,87 +0,0 @@ -- - Create some default value for some (non-existing) model, for all users. -- - !python {model: ir.values }: | - # use the old API - self.set(cr, uid, 'default', False, 'my_test_field',['unexisting_model'], 'global value') - # use the new API - self.set_default(cr, uid, 'other_unexisting_model', 'my_other_test_field', 'conditional value', condition='foo=bar') -- - Retrieve them. -- - !python {model: ir.values }: | - # d is a list of triplets (id, name, value) - # Old API - d = self.get(cr, uid, 'default', False, ['unexisting_model']) - assert len(d) == 1, "Only one single value should be retrieved for this model" - assert d[0][1] == 'my_test_field', "Can't retrieve the created default value. (1)" - assert d[0][2] == 'global value', "Can't retrieve the created default value. (2)" - - # New API, Conditional version - d = self.get_defaults(cr, uid, 'other_unexisting_model') - assert len(d) == 0, "No value should be retrieved, the condition is not met" - d = self.get_defaults(cr, uid, 'other_unexisting_model', condition="foo=eggs") - assert len(d) == 0, 'Condition is not met either, no defaults should be returned' - d = self.get_defaults(cr, uid, 'other_unexisting_model', condition="foo=bar") - assert len(d) == 1, "Only one single value should be retrieved" - assert d[0][1] == 'my_other_test_field', "Can't retrieve the created default value. (5)" - assert d[0][2] == 'conditional value', "Can't retrieve the created default value. (6)" -- - Do it again but for a specific user. -- - !python {model: ir.values }: | - self.set(cr, uid, 'default', False, 'my_test_field',['unexisting_model'], 'specific value', preserve_user=True) -- - Retrieve it and check it is the one for the current user. -- - !python {model: ir.values }: | - d = self.get(cr, uid, 'default', False, ['unexisting_model']) - assert len(d) == 1, "Only one default must be returned per field" - assert d[0][1] == 'my_test_field', "Can't retrieve the created default value." - assert d[0][2] == 'specific value', "Can't retrieve the created default value." -- - Create some action bindings for a non-existing model -- - !python {model: ir.values }: | - self.set(cr, uid, 'action', 'tree_but_open', 'OnDblClick Action', ['unexisting_model'], 'ir.actions.act_window,10', isobject=True) - self.set(cr, uid, 'action', 'tree_but_open', 'OnDblClick Action 2', ['unexisting_model'], 'ir.actions.act_window,11', isobject=True) - self.set(cr, uid, 'action', 'client_action_multi', 'Side Wizard', ['unexisting_model'], 'ir.actions.act_window,12', isobject=True) - self.set(cr, uid, 'action', 'client_print_multi', 'Nice Report', ['unexisting_model'], 'ir.actions.report.xml,2', isobject=True) - self.set(cr, uid, 'action', 'client_action_relate', 'Related Stuff', ['unexisting_model'], 'ir.actions.act_window,14', isobject=True) -- - Replace one action binding to set a new name -- - !python {model: ir.values }: | - self.set(cr, uid, 'action', 'tree_but_open', 'OnDblClick Action New', ['unexisting_model'], 'ir.actions.act_window,10', isobject=True) -- - Retrieve the action bindings and check they're correct -- - !python {model: ir.values }: | - actions = self.get(cr, uid, 'action', 'tree_but_open', ['unexisting_model']) - assert len(actions) == 2, "Mismatching number of bound actions" - #first action - assert len(actions[0]) == 3, "Malformed action definition" - assert actions[0][1] == 'OnDblClick Action 2', 'Bound action does not match definition' - assert isinstance(actions[0][2], dict) and actions[0][2]['id'] == 11, 'Bound action does not match definition' - #second action - this ones comes last because it was re-created with a different name - assert len(actions[1]) == 3, "Malformed action definition" - assert actions[1][1] == 'OnDblClick Action New', 'Re-Registering an action should replace it' - assert isinstance(actions[1][2], dict) and actions[1][2]['id'] == 10, 'Bound action does not match definition' - - actions = self.get(cr, uid, 'action', 'client_action_multi', ['unexisting_model']) - assert len(actions) == 1, "Mismatching number of bound actions" - assert len(actions[0]) == 3, "Malformed action definition" - assert actions[0][1] == 'Side Wizard', 'Bound action does not match definition' - assert isinstance(actions[0][2], dict) and actions[0][2]['id'] == 12, 'Bound action does not match definition' - - actions = self.get(cr, uid, 'action', 'client_print_multi', ['unexisting_model']) - assert len(actions) == 1, "Mismatching number of bound actions" - assert len(actions[0]) == 3, "Malformed action definition" - assert actions[0][1] == 'Nice Report', 'Bound action does not match definition' - assert isinstance(actions[0][2], dict) and actions[0][2]['id'] == 2, 'Bound action does not match definition' - - actions = self.get(cr, uid, 'action', 'client_action_relate', ['unexisting_model']) - assert len(actions) == 1, "Mismatching number of bound actions" - assert len(actions[0]) == 3, "Malformed action definition" - assert actions[0][1] == 'Related Stuff', 'Bound action does not match definition' - assert isinstance(actions[0][2], dict) and actions[0][2]['id'] == 14, 'Bound action does not match definition' diff --git a/openerp/addons/base/test/test_osv_expression.yml b/openerp/addons/base/test/test_osv_expression.yml index d9a1b215000..618108ef316 100644 --- a/openerp/addons/base/test/test_osv_expression.yml +++ b/openerp/addons/base/test/test_osv_expression.yml @@ -440,16 +440,6 @@ assert res_2 == expected assert res_3 == expected assert res_4 == expected -- - Verify that normalize_domain() works. -- - !python {model: res.partner}: | - from osv import expression - norm_domain = domain = ['&',(1,'=',1),('a','=','b')] - assert norm_domain == expression.normalize(domain), "Normalized domains should be left untouched" - domain = [('x','in',['y','z']),('a.v','=','e'),'|','|',('a','=','b'),'!',('c','>','d'),('e','!=','f'),('g','=','h')] - norm_domain = ['&','&','&'] + domain - assert norm_domain == expression.normalize(domain), "Non-normalized domains should be properly normalized" - Unaccent. Create a company with an accent in its name. - diff --git a/openerp/addons/base/tests/__init__.py b/openerp/addons/base/tests/__init__.py new file mode 100644 index 00000000000..5ea7654c008 --- /dev/null +++ b/openerp/addons/base/tests/__init__.py @@ -0,0 +1,5 @@ +import test_ir_values + +checks = [ + test_ir_values, +] diff --git a/openerp/addons/base/tests/test_ir_values.py b/openerp/addons/base/tests/test_ir_values.py new file mode 100644 index 00000000000..e2871a0d199 --- /dev/null +++ b/openerp/addons/base/tests/test_ir_values.py @@ -0,0 +1,95 @@ +import unittest2 + +import openerp.tests.common as common + +class test_ir_values(common.TransactionCase): + + def test_00(self): + # Create some default value for some (non-existing) model, for all users. + + ir_values = self.registry('ir.values') + # use the old API + ir_values.set(self.cr, self.uid, 'default', False, 'my_test_field', + ['unexisting_model'], 'global value') + # use the new API + ir_values.set_default(self.cr, self.uid, 'other_unexisting_model', + 'my_other_test_field', 'conditional value', condition='foo=bar') + + + # Retrieve them. + + ir_values = self.registry('ir.values') + # d is a list of triplets (id, name, value) + # Old API + d = ir_values.get(self.cr, self.uid, 'default', False, ['unexisting_model']) + assert len(d) == 1, "Only one single value should be retrieved for this model" + assert d[0][1] == 'my_test_field', "Can't retrieve the created default value. (1)" + assert d[0][2] == 'global value', "Can't retrieve the created default value. (2)" + + # New API, Conditional version + d = ir_values.get_defaults(self.cr, self.uid, 'other_unexisting_model') + assert len(d) == 0, "No value should be retrieved, the condition is not met" + d = ir_values.get_defaults(self.cr, self.uid, 'other_unexisting_model', condition="foo=eggs") + assert len(d) == 0, 'Condition is not met either, no defaults should be returned' + d = ir_values.get_defaults(self.cr, self.uid, 'other_unexisting_model', condition="foo=bar") + assert len(d) == 1, "Only one single value should be retrieved" + assert d[0][1] == 'my_other_test_field', "Can't retrieve the created default value. (5)" + assert d[0][2] == 'conditional value', "Can't retrieve the created default value. (6)" + + # Do it again but for a specific user. + + ir_values = self.registry('ir.values') + ir_values.set(self.cr, self.uid, 'default', False, 'my_test_field',['unexisting_model'], 'specific value', preserve_user=True) + + # Retrieve it and check it is the one for the current user. + ir_values = self.registry('ir.values') + d = ir_values.get(self.cr, self.uid, 'default', False, ['unexisting_model']) + assert len(d) == 1, "Only one default must be returned per field" + assert d[0][1] == 'my_test_field', "Can't retrieve the created default value." + assert d[0][2] == 'specific value', "Can't retrieve the created default value." + + # Create some action bindings for a non-existing model. + + ir_values = self.registry('ir.values') + ir_values.set(self.cr, self.uid, 'action', 'tree_but_open', 'OnDblClick Action', ['unexisting_model'], 'ir.actions.act_window,10', isobject=True) + ir_values.set(self.cr, self.uid, 'action', 'tree_but_open', 'OnDblClick Action 2', ['unexisting_model'], 'ir.actions.act_window,11', isobject=True) + ir_values.set(self.cr, self.uid, 'action', 'client_action_multi', 'Side Wizard', ['unexisting_model'], 'ir.actions.act_window,12', isobject=True) + ir_values.set(self.cr, self.uid, 'action', 'client_print_multi', 'Nice Report', ['unexisting_model'], 'ir.actions.report.xml,2', isobject=True) + ir_values.set(self.cr, self.uid, 'action', 'client_action_relate', 'Related Stuff', ['unexisting_model'], 'ir.actions.act_window,14', isobject=True) + + # Replace one action binding to set a new name. + + ir_values = self.registry('ir.values') + ir_values.set(self.cr, self.uid, 'action', 'tree_but_open', 'OnDblClick Action New', ['unexisting_model'], 'ir.actions.act_window,10', isobject=True) + + # Retrieve the action bindings and check they're correct + + ir_values = self.registry('ir.values') + actions = ir_values.get(self.cr, self.uid, 'action', 'tree_but_open', ['unexisting_model']) + assert len(actions) == 2, "Mismatching number of bound actions" + #first action + assert len(actions[0]) == 3, "Malformed action definition" + assert actions[0][1] == 'OnDblClick Action 2', 'Bound action does not match definition' + assert isinstance(actions[0][2], dict) and actions[0][2]['id'] == 11, 'Bound action does not match definition' + #second action - this ones comes last because it was re-created with a different name + assert len(actions[1]) == 3, "Malformed action definition" + assert actions[1][1] == 'OnDblClick Action New', 'Re-Registering an action should replace it' + assert isinstance(actions[1][2], dict) and actions[1][2]['id'] == 10, 'Bound action does not match definition' + + actions = ir_values.get(self.cr, self.uid, 'action', 'client_action_multi', ['unexisting_model']) + assert len(actions) == 1, "Mismatching number of bound actions" + assert len(actions[0]) == 3, "Malformed action definition" + assert actions[0][1] == 'Side Wizard', 'Bound action does not match definition' + assert isinstance(actions[0][2], dict) and actions[0][2]['id'] == 12, 'Bound action does not match definition' + + actions = ir_values.get(self.cr, self.uid, 'action', 'client_print_multi', ['unexisting_model']) + assert len(actions) == 1, "Mismatching number of bound actions" + assert len(actions[0]) == 3, "Malformed action definition" + assert actions[0][1] == 'Nice Report', 'Bound action does not match definition' + assert isinstance(actions[0][2], dict) and actions[0][2]['id'] == 2, 'Bound action does not match definition' + + actions = ir_values.get(self.cr, self.uid, 'action', 'client_action_relate', ['unexisting_model']) + assert len(actions) == 1, "Mismatching number of bound actions" + assert len(actions[0]) == 3, "Malformed action definition" + assert actions[0][1] == 'Related Stuff', 'Bound action does not match definition' + assert isinstance(actions[0][2], dict) and actions[0][2]['id'] == 14, 'Bound action does not match definition' diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index c6558f78eb0..ffc11018949 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -94,19 +94,18 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= def load_test(module_name, idref, mode): cr.commit() - if not tools.config.options['test_disable']: - try: - threading.currentThread().testing = True - _load_data(cr, module_name, idref, mode, 'test') - except Exception, e: - _logger.exception( - 'Tests failed to execute in module %s', module_name) - finally: - threading.currentThread().testing = False - if tools.config.options['test_commit']: - cr.commit() - else: - cr.rollback() + try: + threading.currentThread().testing = True + _load_data(cr, module_name, idref, mode, 'test') + except Exception, e: + _logger.exception( + 'Tests failed to execute in module %s', module_name) + finally: + threading.currentThread().testing = False + if tools.config.options['test_commit']: + cr.commit() + else: + cr.rollback() def _load_data(cr, module_name, idref, mode, kind): """ @@ -201,13 +200,14 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= # on demo data. Other tests can be added into the regular # 'data' section, but should probably not alter the data, # as there is no rollback. - load_test(module_name, idref, mode) + if tools.config.options['test_enable']: + load_test(module_name, idref, mode) - # Run the `fast_suite` and `checks` tests given by the module. - if module_name == 'base': - # Also run the core tests after the dabase is created. - openerp.modules.module.run_unit_tests('openerp') - openerp.modules.module.run_unit_tests(module_name) + # Run the `fast_suite` and `checks` tests given by the module. + if module_name == 'base': + # Also run the core tests after the dabase is created. + openerp.modules.module.run_unit_tests('openerp') + openerp.modules.module.run_unit_tests(module_name) processed_modules.append(package.name) diff --git a/openerp/modules/module.py b/openerp/modules/module.py index 2e8ef180c2b..3818882aab6 100644 --- a/openerp/modules/module.py +++ b/openerp/modules/module.py @@ -556,14 +556,15 @@ def run_unit_tests(module_name): for m in ms: suite.addTests(unittest2.TestLoader().loadTestsFromModule(m)) if ms: - _logger.info('module %s: executing %s `fast_suite` and/or `checks` sub-modules' % (module_name, len(ms))) + _logger.info('module %s: executing %s `fast_suite` and/or `checks` sub-modules', module_name, len(ms)) # Use a custom stream object to log the test executions. class MyStream(object): + def __init__(self): + self.r = re.compile(r'^-*$|^ *... *$|^ok$') def flush(self): pass def write(self, s): - r = re.compile(r'^-*$|^ *... *$|^ok$') - if r.match(s): + if self.r.match(s): return first = True for c in s.split('\n'): @@ -571,6 +572,8 @@ def run_unit_tests(module_name): c = '` ' + c first = False _logger.log(logging.TEST, c) - unittest2.TextTestRunner(verbosity=2, stream=MyStream()).run(suite) + result = unittest2.TextTestRunner(verbosity=2, stream=MyStream()).run(suite) + if not result.wasSuccessful(): + _logger.error('module %s: at least one error occured in a test', module_name) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/tests/__init__.py b/openerp/tests/__init__.py index e528da6ba08..5fccb07a082 100644 --- a/openerp/tests/__init__.py +++ b/openerp/tests/__init__.py @@ -8,14 +8,16 @@ Tests can be explicitely added to the `fast_suite` or `checks` lists or not. See the :ref:`test-framework` section in the :ref:`features` list. """ -import test_orm +import test_expression import test_ir_sequence +import test_orm fast_suite = [ test_ir_sequence, ] checks = [ + test_expression, test_orm, ] diff --git a/openerp/tests/common.py b/openerp/tests/common.py index fdbb83f6b5b..ef5b0586136 100644 --- a/openerp/tests/common.py +++ b/openerp/tests/common.py @@ -38,18 +38,17 @@ class TransactionCase(unittest2.TestCase): the tests. """ - def __init__(self, name): - super(TransactionCase, self).__init__(name) - self.registry = lambda model: \ - openerp.modules.registry.RegistryManager.get(DB)[model] - def setUp(self): self.cr = openerp.modules.registry.RegistryManager.get(DB).db.cursor() + self.uid = openerp.SUPERUSER_ID def tearDown(self): self.cr.rollback() self.cr.close() + def registry(self, model): + return openerp.modules.registry.RegistryManager.get(DB)[model] + class RpcCase(unittest2.TestCase): """ Subclass of TestCase with a few XML-RPC proxies. diff --git a/openerp/tests/test_expression.py b/openerp/tests/test_expression.py new file mode 100644 index 00000000000..dd78e3fa88c --- /dev/null +++ b/openerp/tests/test_expression.py @@ -0,0 +1,12 @@ +import unittest2 + +import openerp + +class test_domain_normalization(unittest2.TestCase): + def test_normalize_domain(self): + expression = openerp.osv.expression + norm_domain = domain = ['&',(1,'=',1),('a','=','b')] + assert norm_domain == expression.normalize(domain), "Normalized domains should be left untouched" + domain = [('x','in',['y','z']),('a.v','=','e'),'|','|',('a','=','b'),'!',('c','>','d'),('e','!=','f'),('g','=','h')] + norm_domain = ['&','&','&'] + domain + assert norm_domain == expression.normalize(domain), "Non-normalized domains should be properly normalized" diff --git a/openerp/tools/config.py b/openerp/tools/config.py index a92ad443c7b..6c3f717881b 100644 --- a/openerp/tools/config.py +++ b/openerp/tools/config.py @@ -168,8 +168,8 @@ class configmanager(object): help="Launch a YML test file.") group.add_option("--test-report-directory", dest="test_report_directory", my_default=False, help="If set, will save sample of all reports in this directory.") - group.add_option("--test-disable", action="store_true", dest="test_disable", - my_default=False, help="Disable loading test files.") + group.add_option("--test-enable", action="store_true", dest="test_enable", + my_default=False, help="Enable YAML and unit tests.") group.add_option("--test-commit", action="store_true", dest="test_commit", my_default=False, help="Commit database changes performed by tests.") group.add_option("--assert-exit-level", dest='assert_exit_level', type="choice", choices=self._LOGLEVELS.keys(), @@ -395,7 +395,7 @@ class configmanager(object): 'debug_mode', 'smtp_ssl', 'load_language', 'stop_after_init', 'logrotate', 'without_demo', 'netrpc', 'xmlrpc', 'syslog', 'list_db', 'xmlrpcs', 'proxy_mode', - 'test_file', 'test_disable', 'test_commit', 'test_report_directory', + 'test_file', 'test_enable', 'test_commit', 'test_report_directory', 'osv_memory_count_limit', 'osv_memory_age_limit', 'max_cron_threads', 'virtual_memory_limit', 'virtual_memory_reset', 'cpu_time_limit', 'unaccent', ] From 12358af73bc0df054881258d690c91536e92b368 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 1 Mar 2012 14:59:00 +0100 Subject: [PATCH 09/39] [IMP] add basic evaluation context to asserter (for domains, so time and datetime are available). Doesn't really work because kwargs not supported by py.js (see bug #3), so Sales > Reporting > Opportunities analysis does not work Also current implementation of datetime and time.strftime very incomplete bzr revid: xmo@openerp.com-20120301135900-w4aucd5boi9yzmod --- addons/web/static/src/js/core.js | 50 +++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 679b193e121..ca53bce9c59 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -321,6 +321,47 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. this.active_id = null; return this.session_init(); }, + test_eval_get_context: function () { + var datetime = new py.object(); + var date = datetime.date = new py.type(function date(y, m, d) { + this._year = y; + this._month = m; + this._day = d; + }, py.object, { + strftime: function (format) { + var f = format.toJSON(), self = this; + return new py.str(f.replace(/%([A-Za-z])/g, function (m, c) { + switch (c) { + case 'Y': return self._year; + case 'm': return _.str.sprintf('%02d', self._month); + case 'd': return _.str.sprintf('%02d', self._day); + } + throw new Error('ValueError: No known conversion for ' + m); + })); + } + }); + date.__getattribute__ = function (name) { + if (name === 'today') { + return date.today; + } + throw new Error("AttributeError: object 'date' has no attribute '" + name +"'"); + }; + date.today = new py.def(function () { + var d = new Date(); + return new date(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate()); + }); + + var time = new py.object(); + time.strftime = new py.def(function (format) { + return date.today.__call__().strftime(format); + }); + + return { + uid: new py.float(this.uid), + datetime: datetime, + time: time + }; + }, test_eval: function (source, expected) { try { var ctx = this.test_eval_contexts(source.contexts); @@ -337,7 +378,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. } try { - var dom = this.test_eval_domains(source.domains); + var dom = this.test_eval_domains(source.domains, this.test_eval_get_context()); if (!_.isEqual(dom, expected.domain)) { console.group('Local domain does not match remote'); console.warn('source', source.domains); @@ -378,17 +419,18 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }); return result_context; }, - test_eval_domains: function (domains) { + test_eval_domains: function (domains, eval_context) { var result_domain = [], self = this; _(domains).each(function (dom) { switch(dom.__ref) { case 'domain': result_domain.push.apply( - result_domain, py.eval(dom.__debug)); + result_domain, py.eval(dom.__debug, eval_context)); break; case 'compound_domain': result_domain.push.apply( - result_domain, self.test_eval_contexts(dom.__contexts)); + result_domain, self.test_eval_domains( + dom.__domains, eval_context)); break; default: result_domain.push.apply( From dc34d73695987a1a017c4375b785ba7882eee208 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 2 Mar 2012 12:02:27 +0100 Subject: [PATCH 10/39] [IMP] tests: - pass around the assertion_report to the YAML importer - removed TestReport, which was identical to assertion_report - assertion_report is simpler (no more severity level) - use the report to log a greppable sentence when some test failed. Previously the runbot had to grep for a Traceback which was an unreliable technique (e.g. an exception can be purposefuly generated as part of a test and the associated traceback visible in the logs). Now it can grep "At least one test failed when loading the modules". bzr revid: vmt@openerp.com-20120302110227-nqrl7i46ju28ntdr --- openerp/modules/loading.py | 24 ++++++++++------- openerp/modules/module.py | 9 ++++++- openerp/tools/assertion_report.py | 29 ++++++++++++++++++++ openerp/tools/convert.py | 41 +++++----------------------- openerp/tools/yaml_import.py | 45 ++++++++----------------------- 5 files changed, 70 insertions(+), 78 deletions(-) create mode 100644 openerp/tools/assertion_report.py diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index ffc11018949..3536cf60db4 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -50,6 +50,7 @@ import openerp.pooler as pooler import openerp.release as release import openerp.tools as tools import openerp.tools.osutil as osutil +import openerp.tools.assertion_report as assertion_report from openerp.tools.safe_eval import safe_eval as eval from openerp.tools.translate import _ @@ -97,9 +98,11 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= try: threading.currentThread().testing = True _load_data(cr, module_name, idref, mode, 'test') + return True except Exception, e: - _logger.exception( - 'Tests failed to execute in module %s', module_name) + _logger.error( + 'module %s: an exception occured in a test', module_name) + return False finally: threading.currentThread().testing = False if tools.config.options['test_commit']: @@ -132,7 +135,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= elif ext == '.sql': process_sql_file(cr, fp) elif ext == '.yml': - tools.convert_yaml_import(cr, module_name, fp, idref, mode, noupdate) + tools.convert_yaml_import(cr, module_name, fp, idref, mode, noupdate, report) else: tools.convert_xml_import(cr, module_name, fp, idref, mode, noupdate, report) finally: @@ -201,13 +204,13 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= # 'data' section, but should probably not alter the data, # as there is no rollback. if tools.config.options['test_enable']: - load_test(module_name, idref, mode) + report.record_result(load_test(module_name, idref, mode)) # Run the `fast_suite` and `checks` tests given by the module. if module_name == 'base': - # Also run the core tests after the dabase is created. - openerp.modules.module.run_unit_tests('openerp') - openerp.modules.module.run_unit_tests(module_name) + # Also run the core tests after the database is created. + report.record_result(openerp.modules.module.run_unit_tests('openerp')) + report.record_result(openerp.modules.module.run_unit_tests(module_name)) processed_modules.append(package.name) @@ -288,7 +291,6 @@ def load_modules(db, force_demo=False, status=None, update_module=False): # This is a brand new pool, just created in pooler.get_db_and_pool() pool = pooler.get_pool(cr.dbname) - report = tools.assertion_report() if 'base' in tools.config['update'] or 'all' in tools.config['update']: cr.execute("update ir_module_module set state=%s where name=%s and state=%s", ('to upgrade', 'base', 'installed')) @@ -301,6 +303,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False): # processed_modules: for cleanup step after install # loaded_modules: to avoid double loading + report = assertion_report.assertion_report() loaded_modules, processed_modules = load_module_graph(cr, graph, status, perform_checks=(not update_module), report=report) if tools.config['load_language']: @@ -420,7 +423,10 @@ def load_modules(db, force_demo=False, status=None, update_module=False): cr.execute("update ir_module_module set state=%s where state=%s", ('uninstalled', 'to remove',)) cr.commit() - _logger.info('Modules loaded.') + if report.failures: + _logger.error('At least one test failed when loading the modules.') + else: + _logger.info('Modules loaded.') finally: cr.close() diff --git a/openerp/modules/module.py b/openerp/modules/module.py index 3818882aab6..d1f6912bd29 100644 --- a/openerp/modules/module.py +++ b/openerp/modules/module.py @@ -549,6 +549,10 @@ def get_test_modules(module, submodule, explode): return ms def run_unit_tests(module_name): + """ + Return True or False if some tests were found and succeeded or failed. + Return None if no test was found. + """ import unittest2 ms = get_test_modules(module_name, '__fast_suite__', explode=False) ms.extend(get_test_modules(module_name, '__sanity_checks__', explode=False)) @@ -573,7 +577,10 @@ def run_unit_tests(module_name): first = False _logger.log(logging.TEST, c) result = unittest2.TextTestRunner(verbosity=2, stream=MyStream()).run(suite) - if not result.wasSuccessful(): + if result.wasSuccessful(): + return True + else: _logger.error('module %s: at least one error occured in a test', module_name) + return False # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/tools/assertion_report.py b/openerp/tools/assertion_report.py new file mode 100644 index 00000000000..60606d10d9c --- /dev/null +++ b/openerp/tools/assertion_report.py @@ -0,0 +1,29 @@ + +class assertion_report(object): + """ + Simple pair of success and failures counts (used to record YAML and XML + `assert` tags as well as unittest2 tests outcome (in this case, not + individual `assert`)). + """ + def __init__(self): + self.successes = 0 + self.failures = 0 + + def record_success(self): + self.successes += 1 + + def record_failure(self): + self.failures += 1 + + def record_result(self, result): + if result is None: + pass + elif result is True: + self.record_success() + elif result is False: + self.record_failure() + + def __str__(self): + res = 'Assertions report: %s successes, %s failures' % (self.successes, self.failures) + return res + diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index ec096a87218..0b1fd136c13 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -30,6 +30,8 @@ import re import time import openerp.release as release +import assertion_report + _logger = logging.getLogger(__name__) try: @@ -200,35 +202,6 @@ escape_re = re.compile(r'(?= config['assert_exit_level']: raise YamlImportAbortion('Severe assertion failure (%s), aborting.' % levelname) @@ -286,7 +263,7 @@ class YamlInterpreter(object): self._log_assert_failure(assertion.severity, msg, *args) return else: # all tests were successful for this assertion tag (no break) - self.assert_report.record(True, assertion.severity) + self.assertion_report.record_success() def _coerce_bool(self, value, default=False): if isinstance(value, types.BooleanType): @@ -534,7 +511,7 @@ class YamlInterpreter(object): _logger.debug('Exception during evaluation of !python block in yaml_file %s.', self.filename, exc_info=True) raise else: - self.assert_report.record(True, python.severity) + self.assertion_report.record_success() def process_workflow(self, node): workflow, values = node.items()[0] @@ -900,11 +877,11 @@ class YamlInterpreter(object): is_preceded_by_comment = False return is_preceded_by_comment -def yaml_import(cr, module, yamlfile, idref=None, mode='init', noupdate=False): +def yaml_import(cr, module, yamlfile, idref=None, mode='init', noupdate=False, report=None): if idref is None: idref = {} yaml_string = yamlfile.read() - yaml_interpreter = YamlInterpreter(cr, module, idref, mode, filename=yamlfile.name, noupdate=noupdate) + yaml_interpreter = YamlInterpreter(cr, module, idref, mode, filename=yamlfile.name, report=report, noupdate=noupdate) yaml_interpreter.process(yaml_string) # keeps convention of convert.py From 0cb86fc58d521d0c24704db129b61c898411bb96 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 2 Mar 2012 12:28:34 +0100 Subject: [PATCH 11/39] [IMP] tests: removed the severity concept from `assert` tags. bzr revid: vmt@openerp.com-20120302112834-n1zyqf1g4v61ivje --- openerp/modules/loading.py | 2 +- openerp/modules/module.py | 2 +- openerp/tools/config.py | 12 ++---------- openerp/tools/convert.py | 13 ++----------- openerp/tools/yaml_import.py | 21 ++++++--------------- 5 files changed, 12 insertions(+), 38 deletions(-) diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 3536cf60db4..ce16869a304 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -101,7 +101,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= return True except Exception, e: _logger.error( - 'module %s: an exception occured in a test', module_name) + 'module %s: an exception occurred in a test', module_name) return False finally: threading.currentThread().testing = False diff --git a/openerp/modules/module.py b/openerp/modules/module.py index d1f6912bd29..bc8e21bee7e 100644 --- a/openerp/modules/module.py +++ b/openerp/modules/module.py @@ -580,7 +580,7 @@ def run_unit_tests(module_name): if result.wasSuccessful(): return True else: - _logger.error('module %s: at least one error occured in a test', module_name) + _logger.error('module %s: at least one error occurred in a test', module_name) return False # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/tools/config.py b/openerp/tools/config.py index 6c3f717881b..3a4329433eb 100644 --- a/openerp/tools/config.py +++ b/openerp/tools/config.py @@ -171,10 +171,7 @@ class configmanager(object): group.add_option("--test-enable", action="store_true", dest="test_enable", my_default=False, help="Enable YAML and unit tests.") group.add_option("--test-commit", action="store_true", dest="test_commit", - my_default=False, help="Commit database changes performed by tests.") - group.add_option("--assert-exit-level", dest='assert_exit_level', type="choice", choices=self._LOGLEVELS.keys(), - my_default='error', - help="specify the level at which a failed assertion will stop the server. Accepted values: %s" % (self._LOGLEVELS.keys(),)) + my_default=False, help="Commit database changes performed by YAML or XML tests.") parser.add_option_group(group) # Logging Group @@ -408,11 +405,6 @@ class configmanager(object): elif isinstance(self.options[arg], basestring) and self.casts[arg].type in optparse.Option.TYPE_CHECKER: self.options[arg] = optparse.Option.TYPE_CHECKER[self.casts[arg].type](self.casts[arg], arg, self.options[arg]) - if opt.assert_exit_level: - self.options['assert_exit_level'] = self._LOGLEVELS[opt.assert_exit_level] - else: - self.options['assert_exit_level'] = self._LOGLEVELS.get(self.options['assert_exit_level']) or int(self.options['assert_exit_level']) - self.options['root_path'] = os.path.abspath(os.path.expanduser(os.path.expandvars(os.path.dirname(openerp.__file__)))) if not self.options['addons_path'] or self.options['addons_path']=='None': self.options['addons_path'] = os.path.join(self.options['root_path'], 'addons') @@ -582,7 +574,7 @@ class configmanager(object): continue if opt in self.blacklist_for_save: continue - if opt in ('log_level', 'assert_exit_level'): + if opt in ('log_level',): p.set('options', opt, loglevelnames.get(self.options[opt], self.options[opt])) else: p.set('options', opt, self.options[opt]) diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index 0b1fd136c13..c2c610c16af 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -685,7 +685,6 @@ form: module.record_id""" % (xml_id,) rec_src = rec.get("search",'').encode('utf8') rec_src_count = rec.get("count") - severity = rec.get("severity",'').encode('ascii') or loglevels.LOG_ERROR rec_string = rec.get("string",'').encode('utf8') or 'unknown' ids = None @@ -706,11 +705,7 @@ form: module.record_id""" % (xml_id,) ' expected count: %d\n' \ ' obtained count: %d\n' \ % (rec_string, count, len(ids)) - sevval = getattr(logging, severity.upper()) - _logger.log(sevval, msg) - if sevval >= config['assert_exit_level']: - # TODO: define a dedicated exception - raise Exception('Severe assertion failure') + _logger.error(msg) return assert ids is not None,\ @@ -738,11 +733,7 @@ form: module.record_id""" % (xml_id,) ' expected value: %r\n' \ ' obtained value: %r\n' \ % (rec_string, etree.tostring(test), expected_value, expression_value) - sevval = getattr(logging, severity.upper()) - _logger.log(sevval, msg) - if sevval >= config['assert_exit_level']: - # TODO: define a dedicated exception - raise Exception('Severe assertion failure') + _logger.error(msg) return else: # all tests were successful for this assertion tag (no break) self.assertion_report.record_success() diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index 03055953937..eba0bcd8939 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -187,18 +187,9 @@ class YamlInterpreter(object): def process_comment(self, node): return node - def _log_assert_failure(self, severity, msg, *args): - if isinstance(severity, types.StringTypes): - levelname = severity.strip().upper() - level = logging.getLevelName(levelname) - else: - level = severity - levelname = logging.getLevelName(level) + def _log_assert_failure(msg, *args): self.assertion_report.record_failure() - _logger.log(level, msg, *args) - if level >= config['assert_exit_level']: - raise YamlImportAbortion('Severe assertion failure (%s), aborting.' % levelname) - return + _logger.error(msg, *args) def _get_assertion_id(self, assertion): if assertion.id: @@ -227,7 +218,7 @@ class YamlInterpreter(object): ' expected count: %d\n' \ ' obtained count: %d\n' args = (assertion.string, assertion.count, len(ids)) - self._log_assert_failure(assertion.severity, msg, *args) + self._log_assert_failure(msg, *args) else: context = self.get_context(assertion, self.eval_context) for id in ids: @@ -260,7 +251,7 @@ class YamlInterpreter(object): args += ( lmsg, aop, rmsg ) break - self._log_assert_failure(assertion.severity, msg, *args) + self._log_assert_failure(msg, *args) return else: # all tests were successful for this assertion tag (no break) self.assertion_report.record_success() @@ -505,7 +496,7 @@ class YamlInterpreter(object): code_obj = compile(statements, self.filename, 'exec') unsafe_eval(code_obj, {'ref': self.get_id}, code_context) except AssertionError, e: - self._log_assert_failure(python.severity, 'AssertionError in Python code %s: %s', python.name, e) + self._log_assert_failure('AssertionError in Python code %s: %s', python.name, e) return except Exception, e: _logger.debug('Exception during evaluation of !python block in yaml_file %s.', self.filename, exc_info=True) @@ -804,7 +795,7 @@ class YamlInterpreter(object): """ Empty node or commented node should not pass silently. """ - self._log_assert_failure(logging.WARNING, "You have an empty block in your tests.") + self._log_assert_failure("You have an empty block in your tests.") def process(self, yaml_string): From d2b5a201829c876957b6e9ffbf106f181d975910 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 2 Mar 2012 13:35:35 +0100 Subject: [PATCH 12/39] [FIX] tests: mistakenly removed a self argument. bzr revid: vmt@openerp.com-20120302123535-jxsf49wr4at1ylhh --- openerp/tools/yaml_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index eba0bcd8939..082b6487baa 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -187,7 +187,7 @@ class YamlInterpreter(object): def process_comment(self, node): return node - def _log_assert_failure(msg, *args): + def _log_assert_failure(self, msg, *args): self.assertion_report.record_failure() _logger.error(msg, *args) From 2b8d20f424a153da410d7bd4ba6ba4ff27db9d84 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 5 Mar 2012 09:49:40 +0100 Subject: [PATCH 13/39] [DOC] Added modified (used in global doc and server) flask theme. bzr revid: vmt@openerp.com-20120305084940-wxz0haidk99fh77s --- doc/source/_static/openerp.png | Bin 0 -> 3981 bytes doc/source/_templates/sidebarintro.html | 16 + doc/source/_templates/sidebarlogo.html | 3 + doc/source/_themes/LICENSE | 37 ++ doc/source/_themes/README | 31 ++ doc/source/_themes/flask/layout.html | 25 ++ doc/source/_themes/flask/relations.html | 19 + doc/source/_themes/flask/static/flasky.css_t | 395 ++++++++++++++++++ .../_themes/flask/static/small_flask.css | 70 ++++ doc/source/_themes/flask/theme.conf | 9 + doc/source/_themes/flask_small/layout.html | 22 + .../_themes/flask_small/static/flasky.css_t | 287 +++++++++++++ doc/source/_themes/flask_small/theme.conf | 10 + doc/source/_themes/flask_theme_support.py | 86 ++++ doc/source/conf.py | 101 +++-- 15 files changed, 1059 insertions(+), 52 deletions(-) create mode 100644 doc/source/_static/openerp.png create mode 100644 doc/source/_templates/sidebarintro.html create mode 100644 doc/source/_templates/sidebarlogo.html create mode 100644 doc/source/_themes/LICENSE create mode 100644 doc/source/_themes/README create mode 100644 doc/source/_themes/flask/layout.html create mode 100644 doc/source/_themes/flask/relations.html create mode 100644 doc/source/_themes/flask/static/flasky.css_t create mode 100644 doc/source/_themes/flask/static/small_flask.css create mode 100644 doc/source/_themes/flask/theme.conf create mode 100644 doc/source/_themes/flask_small/layout.html create mode 100644 doc/source/_themes/flask_small/static/flasky.css_t create mode 100644 doc/source/_themes/flask_small/theme.conf create mode 100644 doc/source/_themes/flask_theme_support.py diff --git a/doc/source/_static/openerp.png b/doc/source/_static/openerp.png new file mode 100644 index 0000000000000000000000000000000000000000..d6dbd9d83d1f3c3c2568e7ccac4e031e0f5b3806 GIT binary patch literal 3981 zcmd^C_d6So6Q){fYt^b!v(zYRmYOv`)NZZXqm_bg)8jJ-!9MkGOE zBvBz>|Ht>9=kC4x>3!~f?w;o^R$o_xn&L495fKr!mZqxVE%x5}i~A(Ev1HN+c?&GQ zYNozM9!|dgw%(3J$_^fOjvQK_Z9h61I@&sX^%`@0O+-XOq_1PFc64;KDJunjXDI&i zWo2dM+3_)IZuSg`+)`875EF)2n&;=|pG;4gnVA(86_uBldwF@S3p_i7!CG5ej|YGt z5GX1ts<*e7jg2ieHFZltwzRYqqWfP)Muw%OWoT%qjEoFCJ99%saL3l_-Me>cYHBAF z<2^k+r%>pQll>VChC-pv;P8cog^rGnrluwZ1%-x&hOx0R0|SFCWd(9_@}u5A#l^*k z`MEAGF8%%e0s;bSYirwDYNMm0h~HHZv-j}Q;?vz-SV}U~#c5rLAHBYQ@I9K7lhe)3 z?Hr8`2ng8L)&v{qA{*+0gM(q|sVXWeU0q#tbaYTRm;Lb2&CSgX3DM)@<6Tepii!%< z@-qC_Ph?xGpPwIkb7Ma;d~k4ZFW}48*4F94K~7E%ytpthFi=TJY43~gj=-~{?k-75 zNgW*>EiElxUS4EV<38XUyz*CecJ^Liz{%+7#KgqiyLX3%hG3~F2Z?dJ-kzsmFnVR> zFf)Bq>g9fPq>qnJQc}`USLZnrX=i754u|XN>Y}%|Q40&m_BLco6I5IT>gp^cB*etT zl$DhwCnvXK{b6Qi#>2y-zP_G7AjHSVBM^wVxHvo>KQ}iwKR*wL!*_Oe_V@Q!R#vcB zY;A4r&CN|hLc;3m>g43)zkmNQ7)*G0`1$E61Oi!FT8fR0y}Z0!US7Vsx^j1SzrMc4 z;c!z^Q+0K9v$M0iySt}5keZsBEydRd2M5U3mR%1wFc`ccE{cG|&khfv9&QIo2@ng@ zO*t7T6nZ>7bPyl=@A7hfZffQCEwa0il)_VabWdBg2T6 zroR?u$AbgFq(mGRo06Q|_gWTltH$5af`S70&oa!#1$t|9c4h`$S2JL5yCo@x#bC9xd^I&* zX6XOHOL1R@nURT^O__(E<7I49tbvrqBfFFiK|eCJ&kxtK%iktS=JL;Cok*M^JiGAlx<)KI17v%|s3!d@k2GBK*81?%QXW7_LA}5dW8FIrH%8Bjk^lX2_-}SE-Fqyo-aeQbzE^On` zLs^&ibe#626289nd!gO?40c6z2DGWhl@lZbJ5TnrKG!ps7uO{up*&+0U;bjY41m`n zw`eghl>Yi}3itPQz6y2;P+~q$HH=!ss?EJwplv(I0EOGm3t@45NYdZ5-SlMn{xuDD zRjgmXCJ5eG9P%S}NJ~z{SxRbF^5%XW(Pfuq{%BJc-2G8L?o8|Lc7?+68E%f3WyNai z+)@_nvLy70Q$BwoTQnpaY0N9V{>om}r}M!T@{i>6v`AJ>P0auQl z@0l-JjZxGWkYGEd@Kb3n!RN zD<*u!T`v{lugQ?4f8)(^!`X3JXvkJn#1WbLEqYMet#| zU(SpwKriumxez`@%E}g3^k2+$Ly0I$NVTyo)v$>+T7$%O$-@!XY+LE^duE&EN=RNx zPxw?Yu)pLKZyj=zOt@JKIgJPCIptl}1MrJQJWOmo09^M8DWTe1HeF02gmV~_vBN}+ zz$*9ypBntvowcpx%(Y1q15;y+-I65GFKVy1eS4W)=rHQOE)``+aN=6S%(?$!;XL(i zq9RUAk=*_gA>vc0PmwQY&%X_DBR{*Ae28CW3_EccNB(oWv!qQ{VnoE&LUhL!9i;$U z9XzBjdvved|CLI}lmo=!-u=u$n2~Y&3D^ezvvaSrCL@McwF9WQ_r!T~(hihrW47B! zN{Yc^$=u!M?=}?3rvzGs6ADGZ6Z7ey;2{-Ii#+s~5=~GZl1(f*nA$!>2hXMQ%F{Ga zzXCKL0=*6eDCG1?cJ4~36bh0-we$K|@e2dOu`_Kvfl-uNQi~8_+Rnr)3}qWsBxbSs z{TNbLgm?kHy6a7R$?WcYxOQGo-g$CI#i-Kvx5#NZ%Q1H(%@6EBnxMc!d#+m|@3MW= zsAmxF1v-m+aL43BhU2EeLe-vf2+4*|`gE5`v3MZp0~ffcOr=Ari!89d!~nbA9Bu6Z zEc3KHywA`9uFi^kD~~#Tix!mD{w*bqV~|^#aAjvG{@t6tT0m-*(i$_IH>}y{Y)Ru2 zz-+UEYa(xqk`j!i-L;$cDG~Ws+)%(z_eDz+RpDErDJSLE_ zh5t&YmAppj^4B?UXk(+DIf=~Hp>TmpCL?@ruK;YR*zFU{={ROMSPPbZWA$!VbENs( z4=z9#H-NYPkr8os`B%&YorMpL%$nm`gv!{Ny-DyC*ze6~*C?OPAFe$N%H^K{k6ZyH z27DY}*rqYlNBj`M276P+zdrDh4HR*%8)fGDYX(Jo1knI?b5LGU4bUbhy-06?HBp>! zqUKG3(8b$%a1aatz0eT;Lj4?H7r*ZPz;M&%0qnU1nuxXZV(1m-_4~K^dYg!cQ=JRl z#kdt{v+L!#?OY~Z7k#wAs?hS|x*;Hd9=|W&Prym6S(@hR#oulGMozn*NK%6_ zQ!r!>Oc_~aRg|~zl_gNfZ&Od7bJ6#+8y4Ra(Tw|qJ?VnqUG1(b-{<^MPCgzYJbRf_@|CZ4;8B*kWtYS#XQ7_U>SE?RN&P(=5a)i$>3Igq&-ngaoc)`>T3ph@y|N_rKZFW?F66rz@Gi zZ*Q)$d#SSrCXN*!j|EyiG7-(o!i;rTEbnEWgZ1}m!LoguWyYM31pU+c9?igBMW7hB z)3icG)1Pf6y&%j{8R;FT4Twpb)%S}W{}YXYkH(sEBa}_Qcawy=f4jB*jVn?1p!|e zd+lCigNmLF1-^Fzs81<;`c`K|LTTnsvkd*RisHS{DwC3BLxcpl|LJnoZfBb5So;HR z4~bOS4;l$AH2I{9t6X2c^%&Z7*f%~%<}LPoSX2`cLPw4;7GP}{(X=)JhN`=SR{3Q+ z*x0jD;lpgUhHU55YuiGp=`Yhiju(f$RsCQz_OYMGX2i4VaiW(HeGCiGn}qoh(W?!0 z_}UZFCpg=c4F=#cIEikfxc&XR2f`rMb8~a~4@wl~KMhI)?MB4ji4~XfNp`5mSNC|4 zBpt$=Ad$b-XNXB!WvE?a8R_lmv#WrMq1GmeXW*mDABpAw)0APxRita30QfORQd<*s{a^L}E!$3Wz<=T1>S3#t7))rQxG%K5($_5OC#!%6Dopy??_3?}dH=u>Ef zCLKU1O!^$fDD0k~&knt&ChZtZ+@u1izt(Mr$0~$N1Vn-*IyA$pEyTcx^>r=ER%MxZ zY2o4sT+X#jnYrn_`JyiKO)?}rFI{+u=eru-#51~znn>%;QaousE;C#AiEU~8gVGot z4f&dgY2P-{1nwOh6G(;m!;izcbX^ z3MmQGvwQr~_u8HwL{!!f<_7*FFza8^4oj=qynas?kGsQxERnGid7PqJhzYc0XoLyP z)Xp9HW~v7+@eiLYg^@NcAi9K%e{HEe_A9rXK!? zu&PvG)*6-wja)#$56j@Co9e9Jf$Z7OPD01!02K$LeqHX$I=&69Fl&E#omL>%#k41v%>AQvU#?0DigJ(8An`#2D3sp+cLsn~@75B=%69{>OV literal 0 HcmV?d00001 diff --git a/doc/source/_templates/sidebarintro.html b/doc/source/_templates/sidebarintro.html new file mode 100644 index 00000000000..d61f3417226 --- /dev/null +++ b/doc/source/_templates/sidebarintro.html @@ -0,0 +1,16 @@ + + +

Other Docs

+ + +

Useful Links

+ diff --git a/doc/source/_templates/sidebarlogo.html b/doc/source/_templates/sidebarlogo.html new file mode 100644 index 00000000000..de6e3e5c851 --- /dev/null +++ b/doc/source/_templates/sidebarlogo.html @@ -0,0 +1,3 @@ + diff --git a/doc/source/_themes/LICENSE b/doc/source/_themes/LICENSE new file mode 100644 index 00000000000..8daab7ee6ef --- /dev/null +++ b/doc/source/_themes/LICENSE @@ -0,0 +1,37 @@ +Copyright (c) 2010 by Armin Ronacher. + +Some rights reserved. + +Redistribution and use in source and binary forms of the theme, with or +without modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +* The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +We kindly ask you to only use these themes in an unmodified manner just +for Flask and Flask-related products, not for unrelated projects. If you +like the visual style and want to use it for your own projects, please +consider making some larger changes to the themes (such as changing +font faces, sizes, colors or margins). + +THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/doc/source/_themes/README b/doc/source/_themes/README new file mode 100644 index 00000000000..b3292bdff8e --- /dev/null +++ b/doc/source/_themes/README @@ -0,0 +1,31 @@ +Flask Sphinx Styles +=================== + +This repository contains sphinx styles for Flask and Flask related +projects. To use this style in your Sphinx documentation, follow +this guide: + +1. put this folder as _themes into your docs folder. Alternatively + you can also use git submodules to check out the contents there. +2. add this to your conf.py: + + sys.path.append(os.path.abspath('_themes')) + html_theme_path = ['_themes'] + html_theme = 'flask' + +The following themes exist: + +- 'flask' - the standard flask documentation theme for large + projects +- 'flask_small' - small one-page theme. Intended to be used by + very small addon libraries for flask. + +The following options exist for the flask_small theme: + + [options] + index_logo = '' filename of a picture in _static + to be used as replacement for the + h1 in the index.rst file. + index_logo_height = 120px height of the index logo + github_fork = '' repository name on github for the + "fork me" badge diff --git a/doc/source/_themes/flask/layout.html b/doc/source/_themes/flask/layout.html new file mode 100644 index 00000000000..ad08eccd38d --- /dev/null +++ b/doc/source/_themes/flask/layout.html @@ -0,0 +1,25 @@ +{%- extends "basic/layout.html" %} +{%- block extrahead %} + {{ super() }} + {% if theme_touch_icon %} + + {% endif %} + +{% endblock %} +{%- block relbar2 %}{% endblock %} +{% block header %} + {{ super() }} + {% if pagename == 'index' %} +
+ {% endif %} +{% endblock %} +{%- block footer %} + + {% if pagename == 'index' %} +
+ {% endif %} +{%- endblock %} diff --git a/doc/source/_themes/flask/relations.html b/doc/source/_themes/flask/relations.html new file mode 100644 index 00000000000..3bbcde85bb4 --- /dev/null +++ b/doc/source/_themes/flask/relations.html @@ -0,0 +1,19 @@ +

Related Topics

+ diff --git a/doc/source/_themes/flask/static/flasky.css_t b/doc/source/_themes/flask/static/flasky.css_t new file mode 100644 index 00000000000..0280e159455 --- /dev/null +++ b/doc/source/_themes/flask/static/flasky.css_t @@ -0,0 +1,395 @@ +/* + * flasky.css_t + * ~~~~~~~~~~~~ + * + * :copyright: Copyright 2010 by Armin Ronacher. + * :license: Flask Design License, see LICENSE for details. + */ + +{% set page_width = '80em' %} +{% set sidebar_width = '16em' %} + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'Georgia', serif; + font-size: 15px; + background-color: white; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + width: {{ page_width }}; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 {{ sidebar_width }}; +} + +div.sphinxsidebar { + width: {{ sidebar_width }}; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 0 0px 0 0px; +} + +img.floatingflask { + padding: 0 0 10px 10px; + float: right; +} + +div.footer { + width: {{ page_width }}; + margin: 20px auto 30px auto; + font-size: 12px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +div.related { + display: none; +} + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebar { + font-size: 12px; + line-height: 1.5; +} + +div.sphinxsidebarwrapper { + padding: 0px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0 0 20px 0; + margin: 0; + text-align: center; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: 'Garamond', 'Georgia', serif; + color: #444; + font-size: 22px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 18px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar input { + border: 1px solid #ccc; + font-family: 'Georgia', serif; + font-size: 1em; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +{% if theme_index_logo %} +div.indexwrapper h1 { + text-indent: -999999px; + background: url({{ theme_index_logo }}) no-repeat center center; + height: {{ theme_index_logo_height }}; +} +{% endif %} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #ddd; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #eaeaea; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + background: #fafafa; + margin: 20px -30px; + padding: 10px 30px; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} + +div.admonition tt.xref, div.admonition a tt { + border-bottom: 1px solid #fafafa; +} + +dd div.admonition { + margin-left: -60px; + padding-left: 60px; +} + +div.admonition p.admonition-title { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + font-size: 22px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: white; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt { + font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +img.screenshot { +} + +tt.descname, tt.descclassname { + font-size: 0.95em; +} + +tt.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #eee; + background: #fdfdfd; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.footnote td.label { + width: 0px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #eee; + padding: 7px 30px; + margin: 15px -30px; + line-height: 1.3em; +} + +dl pre, blockquote pre, li pre { + margin-left: -60px; + padding-left: 60px; +} + +dl dl pre { + margin-left: -90px; + padding-left: 90px; +} + +tt { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid white; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt { + background: #EEE; +} diff --git a/doc/source/_themes/flask/static/small_flask.css b/doc/source/_themes/flask/static/small_flask.css new file mode 100644 index 00000000000..1c6df309edc --- /dev/null +++ b/doc/source/_themes/flask/static/small_flask.css @@ -0,0 +1,70 @@ +/* + * small_flask.css_t + * ~~~~~~~~~~~~~~~~~ + * + * :copyright: Copyright 2010 by Armin Ronacher. + * :license: Flask Design License, see LICENSE for details. + */ + +body { + margin: 0; + padding: 20px 30px; +} + +div.documentwrapper { + float: none; + background: white; +} + +div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: white; +} + +div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, +div.sphinxsidebar h3 a { + color: white; +} + +div.sphinxsidebar a { + color: #aaa; +} + +div.sphinxsidebar p.logo { + display: none; +} + +div.document { + width: 100%; + margin: 0; +} + +div.related { + display: block; + margin: 0; + padding: 10px 0 20px 0; +} + +div.related ul, +div.related ul li { + margin: 0; + padding: 0; +} + +div.footer { + display: none; +} + +div.bodywrapper { + margin: 0; +} + +div.body { + min-height: 0; + padding: 0; +} diff --git a/doc/source/_themes/flask/theme.conf b/doc/source/_themes/flask/theme.conf new file mode 100644 index 00000000000..18c720f804c --- /dev/null +++ b/doc/source/_themes/flask/theme.conf @@ -0,0 +1,9 @@ +[theme] +inherit = basic +stylesheet = flasky.css +pygments_style = flask_theme_support.FlaskyStyle + +[options] +index_logo = '' +index_logo_height = 120px +touch_icon = diff --git a/doc/source/_themes/flask_small/layout.html b/doc/source/_themes/flask_small/layout.html new file mode 100644 index 00000000000..aa1716aaff0 --- /dev/null +++ b/doc/source/_themes/flask_small/layout.html @@ -0,0 +1,22 @@ +{% extends "basic/layout.html" %} +{% block header %} + {{ super() }} + {% if pagename == 'index' %} +
+ {% endif %} +{% endblock %} +{% block footer %} + {% if pagename == 'index' %} +
+ {% endif %} +{% endblock %} +{# do not display relbars #} +{% block relbar1 %}{% endblock %} +{% block relbar2 %} + {% if theme_github_fork %} + Fork me on GitHub + {% endif %} +{% endblock %} +{% block sidebar1 %}{% endblock %} +{% block sidebar2 %}{% endblock %} diff --git a/doc/source/_themes/flask_small/static/flasky.css_t b/doc/source/_themes/flask_small/static/flasky.css_t new file mode 100644 index 00000000000..fe2141c565e --- /dev/null +++ b/doc/source/_themes/flask_small/static/flasky.css_t @@ -0,0 +1,287 @@ +/* + * flasky.css_t + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- flasky theme based on nature theme. + * + * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'Georgia', serif; + font-size: 17px; + color: #000; + background: white; + margin: 0; + padding: 0; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 40px auto 0 auto; + width: 700px; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 0 30px 30px 30px; +} + +img.floatingflask { + padding: 0 0 10px 10px; + float: right; +} + +div.footer { + text-align: right; + color: #888; + padding: 10px; + font-size: 14px; + width: 650px; + margin: 0 auto 40px auto; +} + +div.footer a { + color: #888; + text-decoration: underline; +} + +div.related { + line-height: 32px; + color: #888; +} + +div.related ul { + padding: 0 0 0 10px; +} + +div.related a { + color: #444; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body { + padding-bottom: 40px; /* saved for footer */ +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +{% if theme_index_logo %} +div.indexwrapper h1 { + text-indent: -999999px; + background: url({{ theme_index_logo }}) no-repeat center center; + height: {{ theme_index_logo_height }}; +} +{% endif %} + +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: white; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #eaeaea; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + background: #fafafa; + margin: 20px -30px; + padding: 10px 30px; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} + +div.admonition p.admonition-title { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight{ + background-color: white; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt { + font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.85em; +} + +img.screenshot { +} + +tt.descname, tt.descclassname { + font-size: 0.95em; +} + +tt.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #eee; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.footnote td { + padding: 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +pre { + padding: 0; + margin: 15px -30px; + padding: 8px; + line-height: 1.3em; + padding: 7px 30px; + background: #eee; + border-radius: 2px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; +} + +dl pre { + margin-left: -60px; + padding-left: 60px; +} + +tt { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, a tt { + background-color: #FBFBFB; +} + +a:hover tt { + background: #EEE; +} diff --git a/doc/source/_themes/flask_small/theme.conf b/doc/source/_themes/flask_small/theme.conf new file mode 100644 index 00000000000..542b462515d --- /dev/null +++ b/doc/source/_themes/flask_small/theme.conf @@ -0,0 +1,10 @@ +[theme] +inherit = basic +stylesheet = flasky.css +nosidebar = true +pygments_style = flask_theme_support.FlaskyStyle + +[options] +index_logo = '' +index_logo_height = 120px +github_fork = '' diff --git a/doc/source/_themes/flask_theme_support.py b/doc/source/_themes/flask_theme_support.py new file mode 100644 index 00000000000..33f47449c11 --- /dev/null +++ b/doc/source/_themes/flask_theme_support.py @@ -0,0 +1,86 @@ +# flasky extensions. flasky pygments style based on tango style +from pygments.style import Style +from pygments.token import Keyword, Name, Comment, String, Error, \ + Number, Operator, Generic, Whitespace, Punctuation, Other, Literal + + +class FlaskyStyle(Style): + background_color = "#f8f8f8" + default_style = "" + + styles = { + # No corresponding class for the following: + #Text: "", # class: '' + Whitespace: "underline #f8f8f8", # class: 'w' + Error: "#a40000 border:#ef2929", # class: 'err' + Other: "#000000", # class 'x' + + Comment: "italic #8f5902", # class: 'c' + Comment.Preproc: "noitalic", # class: 'cp' + + Keyword: "bold #004461", # class: 'k' + Keyword.Constant: "bold #004461", # class: 'kc' + Keyword.Declaration: "bold #004461", # class: 'kd' + Keyword.Namespace: "bold #004461", # class: 'kn' + Keyword.Pseudo: "bold #004461", # class: 'kp' + Keyword.Reserved: "bold #004461", # class: 'kr' + Keyword.Type: "bold #004461", # class: 'kt' + + Operator: "#582800", # class: 'o' + Operator.Word: "bold #004461", # class: 'ow' - like keywords + + Punctuation: "bold #000000", # class: 'p' + + # because special names such as Name.Class, Name.Function, etc. + # are not recognized as such later in the parsing, we choose them + # to look the same as ordinary variables. + Name: "#000000", # class: 'n' + Name.Attribute: "#c4a000", # class: 'na' - to be revised + Name.Builtin: "#004461", # class: 'nb' + Name.Builtin.Pseudo: "#3465a4", # class: 'bp' + Name.Class: "#000000", # class: 'nc' - to be revised + Name.Constant: "#000000", # class: 'no' - to be revised + Name.Decorator: "#888", # class: 'nd' - to be revised + Name.Entity: "#ce5c00", # class: 'ni' + Name.Exception: "bold #cc0000", # class: 'ne' + Name.Function: "#000000", # class: 'nf' + Name.Property: "#000000", # class: 'py' + Name.Label: "#f57900", # class: 'nl' + Name.Namespace: "#000000", # class: 'nn' - to be revised + Name.Other: "#000000", # class: 'nx' + Name.Tag: "bold #004461", # class: 'nt' - like a keyword + Name.Variable: "#000000", # class: 'nv' - to be revised + Name.Variable.Class: "#000000", # class: 'vc' - to be revised + Name.Variable.Global: "#000000", # class: 'vg' - to be revised + Name.Variable.Instance: "#000000", # class: 'vi' - to be revised + + Number: "#990000", # class: 'm' + + Literal: "#000000", # class: 'l' + Literal.Date: "#000000", # class: 'ld' + + String: "#4e9a06", # class: 's' + String.Backtick: "#4e9a06", # class: 'sb' + String.Char: "#4e9a06", # class: 'sc' + String.Doc: "italic #8f5902", # class: 'sd' - like a comment + String.Double: "#4e9a06", # class: 's2' + String.Escape: "#4e9a06", # class: 'se' + String.Heredoc: "#4e9a06", # class: 'sh' + String.Interpol: "#4e9a06", # class: 'si' + String.Other: "#4e9a06", # class: 'sx' + String.Regex: "#4e9a06", # class: 'sr' + String.Single: "#4e9a06", # class: 's1' + String.Symbol: "#4e9a06", # class: 'ss' + + Generic: "#000000", # class: 'g' + Generic.Deleted: "#a40000", # class: 'gd' + Generic.Emph: "italic #000000", # class: 'ge' + Generic.Error: "#ef2929", # class: 'gr' + Generic.Heading: "bold #000080", # class: 'gh' + Generic.Inserted: "#00A000", # class: 'gi' + Generic.Output: "#888", # class: 'go' + Generic.Prompt: "#745334", # class: 'gp' + Generic.Strong: "bold #000000", # class: 'gs' + Generic.Subheading: "bold #800080", # class: 'gu' + Generic.Traceback: "bold #a40000", # class: 'gt' + } diff --git a/doc/source/conf.py b/doc/source/conf.py index 13a490c5072..c57c3629317 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # -# OpenERP Web documentation build configuration file, created by -# sphinx-quickstart on Fri Mar 18 16:31:55 2011. +# OpenERP Technical Documentation configuration file, created by +# sphinx-quickstart on Fri Feb 17 16:14:06 2012. # # This file is execfile()d with the current directory set to its containing dir. # @@ -16,6 +16,7 @@ import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. +sys.path.append(os.path.abspath('_themes')) sys.path.insert(0, os.path.abspath('../../addons')) sys.path.insert(0, os.path.abspath('../..')) @@ -26,7 +27,7 @@ sys.path.insert(0, os.path.abspath('../..')) # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.todo', 'sphinx.ext.coverage' ] +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.viewcode'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -41,8 +42,8 @@ source_suffix = '.rst' master_doc = 'index' # General information about the project. -project = u'OpenERP Web' -copyright = u'2011, OpenERP S.A.' +project = u'OpenERP Server Developers Documentation' +copyright = u'2012, OpenERP s.a.' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -51,7 +52,7 @@ copyright = u'2011, OpenERP S.A.' # The short X.Y version. version = '6.1' # The full version, including alpha/beta/rc tags. -release = '6.1.0pre' +release = '6.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -65,7 +66,7 @@ release = '6.1.0pre' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = [] +exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None @@ -92,7 +93,7 @@ pygments_style = 'sphinx' # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = 'flask' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -100,7 +101,7 @@ html_theme = 'default' #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +html_theme_path = ['_themes'] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". @@ -132,7 +133,11 @@ html_static_path = ['_static'] #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +html_sidebars = { + 'index': ['sidebarintro.html', 'sourcelink.html', 'searchbox.html'], + '**': ['sidebarlogo.html', 'localtoc.html', 'relations.html', + 'sourcelink.html', 'searchbox.html'] +} # Additional templates that should be rendered to pages, maps page names to # template names. @@ -165,22 +170,27 @@ html_static_path = ['_static'] #html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'OpenERPWebdoc' +htmlhelp_basename = 'openerp-server-doc' # -- Options for LaTeX output -------------------------------------------------- -# The paper size ('letter' or 'a4'). -#latex_paper_size = 'letter' +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). -#latex_font_size = '10pt' +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'OpenERPWeb.tex', u'OpenERP Web Documentation', - u'OpenERP S.A.', 'manual'), + ('index', 'openerp-server-doc.tex', u'OpenERP Server Developers Documentation', + u'OpenERP s.a.', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of @@ -197,9 +207,6 @@ latex_documents = [ # If true, show URL addresses after external links. #latex_show_urls = False -# Additional stuff for the LaTeX preamble. -#latex_preamble = '' - # Documents to append as an appendix to all manuals. #latex_appendices = [] @@ -212,46 +219,36 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'openerpweb', u'OpenERP Web Documentation', - [u'OpenERP S.A.'], 1) + ('index', 'openerp-server-doc', u'OpenERP Server Developers Documentation', + [u'OpenERP s.a.'], 1) ] +# If true, show URL addresses after external links. +#man_show_urls = False -# -- Options for Epub output --------------------------------------------------- -# Bibliographic Dublin Core info. -epub_title = u'OpenERP Web' -epub_author = u'OpenERP S.A.' -epub_publisher = u'OpenERP S.A.' -epub_copyright = u'2011, OpenERP S.A.' +# -- Options for Texinfo output ------------------------------------------------ -# The language of the text. It defaults to the language option -# or en if the language is not set. -#epub_language = '' +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'OpenERPServerDocumentation', u'OpenERP Server Developers Documentation', + u'OpenERP s.a.', 'OpenERPServerDocumentation', 'Developers documentation for the openobject-server project.', + 'Miscellaneous'), +] -# The scheme of the identifier. Typical schemes are ISBN or URL. -#epub_scheme = '' +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] -# The unique identifier of the text. This can be a ISBN number -# or the project homepage. -#epub_identifier = '' +# If false, no module index is generated. +#texinfo_domain_indices = True -# A unique identification for the text. -#epub_uid = '' +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' -# HTML files that should be inserted before the pages created by sphinx. -# The format is a list of tuples containing the path and title. -#epub_pre_files = [] -# HTML files shat should be inserted after the pages created by sphinx. -# The format is a list of tuples containing the path and title. -#epub_post_files = [] - -# A list of files that should not be packed into the epub file. -#epub_exclude_files = [] - -# The depth of the table of contents in toc.ncx. -#epub_tocdepth = 3 - -# Allow duplicate toc entries. -#epub_tocdup = True +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = { + 'http://docs.python.org/': None, + } From f8a93bc2848eba516213142f4f730a1feda5a39e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 5 Mar 2012 09:55:32 +0100 Subject: [PATCH 14/39] [FIX] update py.js for operators &al, implement basic crummy version of relativedelta bzr revid: xmo@openerp.com-20120305085532-0vcz6j0m985gjuz1 --- addons/web/static/lib/py.js/.hg_archival.txt | 6 +- addons/web/static/lib/py.js/README.rst | 18 +- addons/web/static/lib/py.js/TODO.rst | 19 +- addons/web/static/lib/py.js/lib/py.js | 196 +++++++++++++++---- addons/web/static/lib/py.js/test/parser.js | 31 +++ addons/web/static/lib/py.js/test/test.js | 67 ++++++- addons/web/static/src/js/core.js | 128 ++++++++++-- 7 files changed, 401 insertions(+), 64 deletions(-) diff --git a/addons/web/static/lib/py.js/.hg_archival.txt b/addons/web/static/lib/py.js/.hg_archival.txt index d10d8a6b1cc..f5355e28a12 100644 --- a/addons/web/static/lib/py.js/.hg_archival.txt +++ b/addons/web/static/lib/py.js/.hg_archival.txt @@ -1,5 +1,5 @@ repo: 076b192d0d8ab2b92d1dbcfa3da055382f30eaea -node: 7be96c381d9302b4aafaf5eb5381083b0731a9aa +node: 5adb2d9c89e53a6445e3799f9c4dc9110458c149 branch: default -latesttag: 0.4 -latesttagdistance: 7 +latesttag: 0.5 +latesttagdistance: 9 diff --git a/addons/web/static/lib/py.js/README.rst b/addons/web/static/lib/py.js/README.rst index a5aaa289a46..046db7153d1 100644 --- a/addons/web/static/lib/py.js/README.rst +++ b/addons/web/static/lib/py.js/README.rst @@ -10,6 +10,17 @@ specification document is the `Python 2.7 Expressions spec `_ (along with the lexical analysis part). +Syntax +------ + +* Lambdas and ternaries should be parsed but are not implemented (in + the evaluator) +* Only floats are implemented, ``int`` literals are parsed as floats. +* Octal and hexadecimal literals are not implemented +* Srings are backed by JavaScript strings and probably behave like + ``unicode`` more than like ``str`` +* Slices don't work + Builtins -------- @@ -89,9 +100,10 @@ Collections Abstract Base Classes Hashable are kind-of implemented as well) Numeric type emulation - Basically not implemented, the only part of it which is - implemented is the unary ``-`` (because it's used to create - negative floats, they're parsed as a negated positive number) + Operators are implemented (but not tested), ``abs``, ``divmod`` + and ``pow`` builtins are not implemented yet. Neither are ``oct`` + and ``hex`` but I'm not sure we care (I'm not sure we care about + ``pow`` or even ``divmod`` either, for that matter) Utilities --------- diff --git a/addons/web/static/lib/py.js/TODO.rst b/addons/web/static/lib/py.js/TODO.rst index f80520944d5..a1309bd3fc5 100644 --- a/addons/web/static/lib/py.js/TODO.rst +++ b/addons/web/static/lib/py.js/TODO.rst @@ -34,15 +34,14 @@ Base methods requirement ************************ * ``__getattr__`` -* ? ``__getitem`` -* ``__call__`` -* ``or`` -* ``toJS`` / ``toJSON`` * ``dict.get`` -* ``datetime.time.today`` -* ``datetime.time.strftime`` -* ``time.strftime`` -* ``__add__`` / ``__radd__`` -* ``__sub__`` / ``__rsub__`` * ``__len__`` -* ``__nonzero__`` + +In datamodel, not implemented in any type, untested +*************************************************** + +* a[b] + +* a + b, a - b, a * b, ... + +* +a, ~a diff --git a/addons/web/static/lib/py.js/lib/py.js b/addons/web/static/lib/py.js/lib/py.js index ec6b9182543..3c0b13d0717 100644 --- a/addons/web/static/lib/py.js/lib/py.js +++ b/addons/web/static/lib/py.js/lib/py.js @@ -104,6 +104,15 @@ var py = {}; symbol(':'); symbol(')'); symbol(']'); symbol('}'); symbol(','); symbol('else'); + infix('=', 10, function (left) { + if (left.id !== '(name)') { + throw new Error("Expected keyword argument name, got " + token.id); + } + this.first = left; + this.second = expression(); + return this; + }); + symbol('lambda', 20).nud = function () { this.first = []; if (token.id !== ':') { @@ -362,7 +371,7 @@ var py = {}; if (val instanceof py.object || val === py.object - || py.issubclass.__call__(val, py.object) === py.True) { + || py.issubclass.__call__([val, py.object]) === py.True) { return val; } @@ -443,7 +452,7 @@ var py = {}; // TODO: second argument should be class return val.__get__(this); } - if (typeof val === 'function' && !this.hasOwnProperty(val)) { + if (typeof val === 'function' && !this.hasOwnProperty(name)) { // val is a method from the class return new PY_instancemethod(val, this); } @@ -476,6 +485,7 @@ var py = {}; py.NotImplemented = new NotImplementedType(); var booleans_initialized = false; py.bool = py.type(function bool(value) { + value = (value instanceof Array) ? value[0] : value; // The only actual instance of py.bool should be py.True // and py.False. Return the new instance of py.bool if we // are initializing py.True and py.False, otherwise always @@ -493,7 +503,26 @@ var py = {}; py.False = new py.bool(); booleans_initialized = true; py.float = py.type(function float(value) { - this._value = value; + value = (value instanceof Array) ? value[0] : value; + if (value === undefined) { this._value = 0; return; } + if (value instanceof py.float) { return value; } + if (typeof value === 'number' || value instanceof Number) { + this._value = value; + return; + } + if (typeof value === 'string' || value instanceof String) { + this._value = parseFloat(value); + return; + } + if (value instanceof py.object && '__float__' in value) { + var res = value.__float__(); + if (res instanceof py.float) { + return res; + } + throw new Error('TypeError: __float__ returned non-float (type ' + + res.constructor.name + ')'); + } + throw new Error('TypeError: float() argument must be a string or a number'); }, py.object, { __eq__: function (other) { return this._value === other._value ? py.True : py.False; @@ -514,9 +543,25 @@ var py = {}; if (!(other instanceof py.float)) { return py.NotImplemented; } return this._value >= other._value ? py.True : py.False; }, + __add__: function (other) { + if (!(other instanceof py.float)) { return py.NotImplemented; } + return new py.float(this._value + other._value); + }, __neg__: function () { return new py.float(-this._value); }, + __sub__: function (other) { + if (!(other instanceof py.float)) { return py.NotImplemented; } + return new py.float(this._value - other._value); + }, + __mul__: function (other) { + if (!(other instanceof py.float)) { return py.NotImplemented; } + return new py.float(this._value * other._value); + }, + __div__: function (other) { + if (!(other instanceof py.float)) { return py.NotImplemented; } + return new py.float(this._value / other._value); + }, __nonzero__: function () { return this._value ? py.True : py.False; }, @@ -525,7 +570,17 @@ var py = {}; } }); py.str = py.type(function str(s) { - this._value = s; + s = (s instanceof Array) ? s[0] : s; + if (s === undefined) { this._value = ''; return; } + if (s instanceof py.str) { return s; } + if (typeof s === 'string' || s instanceof String) { + this._value = s; + return; + } + var v = s.__str__(); + if (v instanceof py.str) { return v; } + throw new Error('TypeError: __str__ returned non-string (type ' + + v.constructor.name + ')'); }, py.object, { __eq__: function (other) { if (other instanceof py.str && this._value === other._value) { @@ -549,6 +604,10 @@ var py = {}; if (!(other instanceof py.str)) { return py.NotImplemented; } return this._value >= other._value ? py.True : py.False; }, + __add__: function (other) { + if (!(other instanceof py.str)) { return py.NotImplemented; } + return new py.str(this._value + other._value); + }, __nonzero__: function () { return this._value.length ? py.True : py.False; }, @@ -596,9 +655,9 @@ var py = {}; this._inst = null; this._func = nativefunc; }, py.object, { - __call__: function () { + __call__: function (args, kwargs) { // don't want to rewrite __call__ for instancemethod - return this._func.apply(this._inst, arguments); + return this._func.call(this._inst, args, kwargs); }, toJSON: function () { return this._func; @@ -610,13 +669,69 @@ var py = {}; this._func = nativefunc; }, py.def, {}); - py.issubclass = new py.def(function issubclass(derived, parent) { + py.issubclass = new py.def(function issubclass(args) { + var derived = args[0], parent = args[1]; // still hurts my brain that this can work return derived.prototype instanceof py.object ? py.True : py.False; }); + + // All binary operators with fallbacks, so they can be applied generically + var PY_operators = { + '==': ['eq', 'eq', function (a, b) { return a === b; }], + '!=': ['ne', 'ne', function (a, b) { return a !== b; }], + '<': ['lt', 'gt', function (a, b) {return a.constructor.name < b.constructor.name;}], + '<=': ['le', 'ge', function (a, b) {return a.constructor.name <= b.constructor.name;}], + '>': ['gt', 'lt', function (a, b) {return a.constructor.name > b.constructor.name;}], + '>=': ['ge', 'le', function (a, b) {return a.constructor.name >= b.constructor.name;}], + + '+': ['add', 'radd'], + '-': ['sub', 'rsub'], + '*': ['mul', 'rmul'], + '/': ['div', 'rdiv'], + '//': ['floordiv', 'rfloordiv'], + '%': ['mod', 'rmod'], + '**': ['pow', 'rpow'], + '<<': ['lshift', 'rlshift'], + '>>': ['rshift', 'rrshift'], + '&': ['and', 'rand'], + '^': ['xor', 'rxor'], + '|': ['or', 'ror'] + }; + /** + * Implements operator fallback/reflection. + * + * First two arguments are the objects to apply the operator on, + * in their actual order (ltr). + * + * Third argument is the actual operator. + * + * If the operator methods raise exceptions, those exceptions are + * not intercepted. + */ + var PY_op = function (o1, o2, op) { + var r; + var methods = PY_operators[op]; + var forward = '__' + methods[0] + '__', reverse = '__' + methods[1] + '__'; + var otherwise = methods[2]; + + if (forward in o1 && (r = o1[forward](o2)) !== py.NotImplemented) { + return r; + } + if (reverse in o2 && (r = o2[reverse](o1)) !== py.NotImplemented) { + return r; + } + if (otherwise) { + return PY_ensurepy(otherwise(o1, o2)); + } + throw new Error( + "TypeError: unsupported operand type(s) for " + op + ": '" + + o1.constructor.name + "' and '" + + o2.constructor.name + "'"); + }; + var PY_builtins = { type: py.type, @@ -643,30 +758,16 @@ var py = {}; var evaluate_operator = function (operator, a, b) { var v; switch (operator) { - case '==': return a.__eq__(b); case 'is': return a === b ? py.True : py.False; - case '!=': return a.__ne__(b); case 'is not': return a !== b ? py.True : py.False; - case '<': - v = a.__lt__(b); - if (v !== py.NotImplemented) { return v; } - return PY_ensurepy(a.constructor.name < b.constructor.name); - case '<=': - v = a.__le__(b); - if (v !== py.NotImplemented) { return v; } - return PY_ensurepy(a.constructor.name <= b.constructor.name); - case '>': - v = a.__gt__(b); - if (v !== py.NotImplemented) { return v; } - return PY_ensurepy(a.constructor.name > b.constructor.name); - case '>=': - v = a.__ge__(b); - if (v !== py.NotImplemented) { return v; } - return PY_ensurepy(a.constructor.name >= b.constructor.name); case 'in': return b.__contains__(a); case 'not in': return b.__contains__(a) === py.True ? py.False : py.True; + case '==': case '!=': + case '<': case '<=': + case '>': case '>=': + return PY_op(a, b, operator); } throw new Error('SyntaxError: unknown comparator [[' + operator + ']]'); }; @@ -700,11 +801,6 @@ var py = {}; if (result === py.False) { return py.False; } } return py.True; - case '-': - if (expr.second) { - throw new Error('SyntaxError: binary [-] not implemented yet'); - } - return (py.evaluate(expr.first, context)).__neg__(); case 'not': return py.evaluate(expr.first, context).__nonzero__() === py.True ? py.False @@ -723,12 +819,20 @@ var py = {}; return py.evaluate(expr.second, context); case '(': if (expr.second) { - var callable = py.evaluate(expr.first, context), args=[]; + var callable = py.evaluate(expr.first, context); + var args = [], kwargs = {}; for (var jj=0; jj>': + case '&': case '^': case '|': + return PY_op( + py.evaluate(expr.first, context), + py.evaluate(expr.second, context), + expr.id); + default: throw new Error('SyntaxError: Unknown node [[' + expr.id + ']]'); } diff --git a/addons/web/static/lib/py.js/test/parser.js b/addons/web/static/lib/py.js/test/parser.js index ca74d2bebc8..bbbd5d7663d 100644 --- a/addons/web/static/lib/py.js/test/parser.js +++ b/addons/web/static/lib/py.js/test/parser.js @@ -11,6 +11,14 @@ expect.Assertion.prototype.tokens = function (n) { 'expected ' + this.obj + ' to not have an end token'); }; +expect.Assertion.prototype.named = function (value) { + this.assert(this.obj.id === '(name)', + 'expected ' + this.obj + ' to be a name token', + 'expected ' + this.obj + ' not to be a name token'); + this.assert(this.obj.value === value, + 'expected ' + this.obj + ' to have tokenized ' + value, + 'expected ' + this.obj + ' not to have tokenized ' + value); +}; expect.Assertion.prototype.constant = function (value) { this.assert(this.obj.id === '(constant)', 'expected ' + this.obj + ' to be a constant token', @@ -98,4 +106,27 @@ describe('Tokenizer', function () { expect(toks[1].id).to.be(')'); }); }); + describe('functions', function () { + it('tokenizes kwargs', function () { + var toks = py.tokenize('foo(bar=3, qux=4)'); + expect(toks).to.have.tokens(10); + }); + }); +}); + +describe('Parser', function () { + describe('functions', function () { + var ast = py.parse(py.tokenize('foo(bar=3, qux=4)')); + expect(ast.id).to.be('('); + expect(ast.first).to.be.named('foo'); + + args = ast.second; + expect(args[0].id).to.be('='); + expect(args[0].first).to.be.named('bar'); + expect(args[0].second).to.be.number(3); + + expect(args[1].id).to.be('='); + expect(args[1].first).to.be.named('qux'); + expect(args[1].second).to.be.number(4); + }); }); \ No newline at end of file diff --git a/addons/web/static/lib/py.js/test/test.js b/addons/web/static/lib/py.js/test/test.js index 6c53bcfad85..31fccc23240 100644 --- a/addons/web/static/lib/py.js/test/test.js +++ b/addons/web/static/lib/py.js/test/test.js @@ -262,6 +262,15 @@ describe('Attribute access', function () { }); expect(py.eval('foo.bar()', {foo: o})).to.be('ok'); }); + it('should not convert function attributes into methods', function () { + var o = new py.object(); + o.bar = new py.type(function bar() {}); + o.bar.__getattribute__ = function () { + return o.bar.baz; + } + o.bar.baz = py.True; + expect(py.eval('foo.bar.baz', {foo: o})).to.be(true); + }); it('should work on instance attributes', function () { var typ = py.type(function MyType() { this.attr = new py.float(3); @@ -296,16 +305,37 @@ describe('Callables', function () { }); expect(py.eval('MyType()', {MyType: typ})).to.be(true); }); + it('should accept kwargs', function () { + expect(py.eval('foo(ok=True)', { + foo: function foo() { return py.True; } + })).to.be(true); + }); + it('should be able to get its kwargs', function () { + expect(py.eval('foo(ok=True)', { + foo: function foo(args, kwargs) { return kwargs.ok; } + })).to.be(true); + }); + it('should be able to have both args and kwargs', function () { + expect(py.eval('foo(1, 2, 3, ok=True, nok=False)', { + foo: function (args, kwargs) { + expect(args).to.have.length(3); + expect(args[0].toJSON()).to.be(1); + expect(kwargs).to.only.have.keys('ok', 'nok') + expect(kwargs.nok.toJSON()).to.be(false); + return kwargs.ok; + } + })).to.be(true); + }); }); describe('issubclass', function () { it('should say a type is its own subclass', function () { - expect(py.issubclass.__call__(py.dict, py.dict).toJSON()) + expect(py.issubclass.__call__([py.dict, py.dict]).toJSON()) .to.be(true); expect(py.eval('issubclass(dict, dict)')) .to.be(true); }); it('should work with subtypes', function () { - expect(py.issubclass.__call__(py.bool, py.object).toJSON()) + expect(py.issubclass.__call__([py.bool, py.object]).toJSON()) .to.be(true); }); }); @@ -313,4 +343,37 @@ describe('builtins', function () { it('should aways be available', function () { expect(py.eval('bool("foo")')).to.be(true); }); +}); + +describe('numerical protocols', function () { + describe('True numbers (float)', function () { + describe('Basic arithmetic', function () { + it('can be added', function () { + expect(py.eval('1 + 1')).to.be(2); + expect(py.eval('1.5 + 2')).to.be(3.5); + expect(py.eval('1 + -1')).to.be(0); + }); + it('can be subtracted', function () { + expect(py.eval('1 - 1')).to.be(0); + expect(py.eval('1.5 - 2')).to.be(-0.5); + expect(py.eval('2 - 1.5')).to.be(0.5); + }); + it('can be multiplied', function () { + expect(py.eval('1 * 3')).to.be(3); + expect(py.eval('0 * 5')).to.be(0); + expect(py.eval('42 * -2')).to.be(-84); + }); + it('can be divided', function () { + expect(py.eval('1 / 2')).to.be(0.5); + expect(py.eval('2 / 1')).to.be(2); + }); + }); + }); + describe('Strings', function () { + describe('Basic arithmetics operators', function () { + it('can be added (concatenation)', function () { + expect(py.eval('"foo" + "bar"')).to.be('foobar'); + }); + }); + }); }); \ No newline at end of file diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index ca53bce9c59..ead33822926 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -322,19 +322,34 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. return this.session_init(); }, test_eval_get_context: function () { + var asJS = function (arg) { + if (arg instanceof py.object) { + return arg.toJSON(); + } + return arg; + }; + var datetime = new py.object(); + datetime.datetime = new py.type(function datetime() { + throw new Error('datetime.datetime not implemented'); + }); var date = datetime.date = new py.type(function date(y, m, d) { - this._year = y; - this._month = m; - this._day = d; + if (y instanceof Array) { + d = y[2]; + m = y[1]; + y = y[0]; + } + this.year = asJS(y); + this.month = asJS(m); + this.day = asJS(d); }, py.object, { - strftime: function (format) { - var f = format.toJSON(), self = this; + strftime: function (args) { + var f = asJS(args[0]), self = this; return new py.str(f.replace(/%([A-Za-z])/g, function (m, c) { switch (c) { - case 'Y': return self._year; - case 'm': return _.str.sprintf('%02d', self._month); - case 'd': return _.str.sprintf('%02d', self._day); + case 'Y': return self.year; + case 'm': return _.str.sprintf('%02d', self.month); + case 'd': return _.str.sprintf('%02d', self.day); } throw new Error('ValueError: No known conversion for ' + m); })); @@ -350,16 +365,107 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. var d = new Date(); return new date(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate()); }); + datetime.time = new py.type(function time() { + throw new Error('datetime.time not implemented'); + }); var time = new py.object(); - time.strftime = new py.def(function (format) { - return date.today.__call__().strftime(format); + time.strftime = new py.def(function (args) { + return date.today.__call__().strftime(args); + }); + + var relativedelta = new py.type(function relativedelta(args, kwargs) { + if (!_.isEmpty(args)) { + throw new Error('Extraction of relative deltas from existing datetimes not supported'); + } + this.ops = kwargs; + }, py.object, { + __add__: function (other) { + if (!(other instanceof datetime.date)) { + return py.NotImplemented; + } + // TODO: test this whole mess + var year = asJS(this.ops.year) || asJS(other.year); + if (asJS(this.ops.years)) { + year += asJS(this.ops.years); + } + + var month = asJS(this.ops.month) || asJS(other.month); + if (asJS(this.ops.months)) { + month += asJS(this.ops.months); + // FIXME: no divmod in JS? + while (month < 1) { + year -= 1; + month += 12; + } + while (month > 12) { + year += 1; + month -= 12; + } + } + + var lastMonthDay = new Date(year, month, 0).getDate(); + var day = asJS(this.ops.day) || asJS(other.day); + if (day > lastMonthDay) { day = lastMonthDay; } + var days_offset = ((asJS(this.ops.weeks) || 0) * 7) + (asJS(this.ops.days) || 0); + if (days_offset) { + day = new Date(year, month-1, day + days_offset).getDate(); + } + // TODO: leapdays? + // TODO: hours, minutes, seconds? Not used in XML domains + // TODO: weekday? + return new datetime.date(year, month, day); + }, + __radd__: function (other) { + return this.__add__(other); + }, + + __sub__: function (other) { + if (!(other instanceof datetime.date)) { + return py.NotImplemented; + } + // TODO: test this whole mess + var year = asJS(this.ops.year) || asJS(other.year); + if (asJS(this.ops.years)) { + year -= asJS(this.ops.years); + } + + var month = asJS(this.ops.month) || asJS(other.month); + if (asJS(this.ops.months)) { + month -= asJS(this.ops.months); + // FIXME: no divmod in JS? + while (month < 1) { + year -= 1; + month += 12; + } + while (month > 12) { + year += 1; + month -= 12; + } + } + + var lastMonthDay = new Date(year, month, 0).getDate(); + var day = asJS(this.ops.day) || asJS(other.day); + if (day > lastMonthDay) { day = lastMonthDay; } + var days_offset = ((asJS(this.ops.weeks) || 0) * 7) + (asJS(this.ops.days) || 0); + if (days_offset) { + day = new Date(year, month-1, day - days_offset).getDate(); + } + // TODO: leapdays? + // TODO: hours, minutes, seconds? Not used in XML domains + // TODO: weekday? + return new datetime.date(year, month, day); + }, + __rsub__: function (other) { + return this.__sub__(other); + } }); return { uid: new py.float(this.uid), datetime: datetime, - time: time + time: time, + relativedelta: relativedelta }; }, test_eval: function (source, expected) { From fa4bc04db092e5f36b4b272fbe508cb152dc1a4e Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 5 Mar 2012 09:58:36 +0100 Subject: [PATCH 15/39] [DOC] added new Makefile. bzr revid: vmt@openerp.com-20120305085836-qhz3glwhyp8an38z --- doc/source/Makefile | 154 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 doc/source/Makefile diff --git a/doc/source/Makefile b/doc/source/Makefile new file mode 100644 index 00000000000..8afc4d9c0c2 --- /dev/null +++ b/doc/source/Makefile @@ -0,0 +1,154 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + sed -i '/-99999/d' _build/dirhtml/_static/flasky.css + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/OpenERPTechnicalDocumentation.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/OpenERPTechnicalDocumentation.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/OpenERPTechnicalDocumentation" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/OpenERPTechnicalDocumentation" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." From 14a682903c57abb8d4746c6b5d999fff6c4da6d7 Mon Sep 17 00:00:00 2001 From: Openerp Online Date: Mon, 5 Mar 2012 12:39:57 +0100 Subject: [PATCH 16/39] [DOC] added intersphinx namespaces. bzr revid: online@openerp.com-20120305113957-xmrjudts6kbdhh6e --- doc/Makefile | 2 +- doc/conf.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index 8afc4d9c0c2..c1eff186583 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -2,7 +2,7 @@ # # You can set these variables from the command line. -SPHINXOPTS = +SPHINXOPTS = -q SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build diff --git a/doc/conf.py b/doc/conf.py index 9e08b5f162e..737229e4972 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -250,5 +250,7 @@ texinfo_documents = [ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { - 'http://docs.python.org/': None, - } + 'python': ('http://docs.python.org/', None), + 'openerpweb': ('http://doc.openerp.com/v6.1/developers/web', None), + 'openerpdev': ('http://doc.openerp.com/v6.1/developers', None), +} From ba3193dd4d5aa2a138899c2ac55b3e7fa7768256 Mon Sep 17 00:00:00 2001 From: Openerp Online Date: Mon, 5 Mar 2012 12:40:29 +0100 Subject: [PATCH 17/39] [DOC] added intersphinx namespaces. bzr revid: online@openerp.com-20120305114029-j0g6jf8v3t6uf090 --- doc/source/Makefile | 2 +- doc/source/conf.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/doc/source/Makefile b/doc/source/Makefile index 8afc4d9c0c2..c1eff186583 100644 --- a/doc/source/Makefile +++ b/doc/source/Makefile @@ -2,7 +2,7 @@ # # You can set these variables from the command line. -SPHINXOPTS = +SPHINXOPTS = -q SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build diff --git a/doc/source/conf.py b/doc/source/conf.py index c57c3629317..eb2b10d8bce 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -250,5 +250,7 @@ texinfo_documents = [ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { - 'http://docs.python.org/': None, - } + 'python': ('http://docs.python.org/', None), + 'openerpserver': ('http://doc.openerp.com/v6.1/developers/server', None), + 'openerpdev': ('http://doc.openerp.com/v6.1/developers', None), +} From 0c8e11643f84afddec07f21b6f7fc2b981fb2706 Mon Sep 17 00:00:00 2001 From: Openerp Online Date: Mon, 5 Mar 2012 13:40:16 +0100 Subject: [PATCH 18/39] [DOC] use a flat (i.e. no source/ directory) structure. bzr revid: online@openerp.com-20120305124016-d25rncl3q2qcem31 --- doc/Makefile | 2 +- doc/_templates/sidebarintro.html | 2 +- doc/{source => }/addon-structure.txt | 0 doc/{source => }/addons.rst | 0 doc/conf.py | 22 +- doc/{source => }/development.rst | 0 doc/{source => }/getting-started.rst | 0 doc/{source => }/guides/client-action.rst | 0 doc/{source => }/guides/sidebar-protocol.rst | 0 doc/index.rst | 27 +- doc/make.bat | 4 +- doc/{source => }/old-version.rst | 0 doc/{source => }/production.rst | 0 doc/{source => }/project.rst | 0 doc/source/Makefile | 154 ------- doc/source/_static/openerp.png | Bin 3981 -> 0 bytes doc/source/_templates/sidebarintro.html | 16 - doc/source/_templates/sidebarlogo.html | 3 - doc/source/_themes/LICENSE | 37 -- doc/source/_themes/README | 31 -- doc/source/_themes/flask/layout.html | 25 -- doc/source/_themes/flask/relations.html | 19 - doc/source/_themes/flask/static/flasky.css_t | 395 ------------------ .../_themes/flask/static/small_flask.css | 70 ---- doc/source/_themes/flask/theme.conf | 9 - doc/source/_themes/flask_small/layout.html | 22 - .../_themes/flask_small/static/flasky.css_t | 287 ------------- doc/source/_themes/flask_small/theme.conf | 10 - doc/source/_themes/flask_theme_support.py | 86 ---- doc/source/conf.py | 256 ------------ doc/source/index.rst | 27 -- doc/{source => }/widgets.rst | 0 32 files changed, 40 insertions(+), 1464 deletions(-) rename doc/{source => }/addon-structure.txt (100%) rename doc/{source => }/addons.rst (100%) rename doc/{source => }/development.rst (100%) rename doc/{source => }/getting-started.rst (100%) rename doc/{source => }/guides/client-action.rst (100%) rename doc/{source => }/guides/sidebar-protocol.rst (100%) rename doc/{source => }/old-version.rst (100%) rename doc/{source => }/production.rst (100%) rename doc/{source => }/project.rst (100%) delete mode 100644 doc/source/Makefile delete mode 100644 doc/source/_static/openerp.png delete mode 100644 doc/source/_templates/sidebarintro.html delete mode 100644 doc/source/_templates/sidebarlogo.html delete mode 100644 doc/source/_themes/LICENSE delete mode 100644 doc/source/_themes/README delete mode 100644 doc/source/_themes/flask/layout.html delete mode 100644 doc/source/_themes/flask/relations.html delete mode 100644 doc/source/_themes/flask/static/flasky.css_t delete mode 100644 doc/source/_themes/flask/static/small_flask.css delete mode 100644 doc/source/_themes/flask/theme.conf delete mode 100644 doc/source/_themes/flask_small/layout.html delete mode 100644 doc/source/_themes/flask_small/static/flasky.css_t delete mode 100644 doc/source/_themes/flask_small/theme.conf delete mode 100644 doc/source/_themes/flask_theme_support.py delete mode 100644 doc/source/conf.py delete mode 100644 doc/source/index.rst rename doc/{source => }/widgets.rst (100%) diff --git a/doc/Makefile b/doc/Makefile index 8afc4d9c0c2..c1eff186583 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -2,7 +2,7 @@ # # You can set these variables from the command line. -SPHINXOPTS = +SPHINXOPTS = -q SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build diff --git a/doc/_templates/sidebarintro.html b/doc/_templates/sidebarintro.html index 4d4dcc89e6d..d61f3417226 100644 --- a/doc/_templates/sidebarintro.html +++ b/doc/_templates/sidebarintro.html @@ -5,7 +5,7 @@

Other Docs

diff --git a/doc/source/addon-structure.txt b/doc/addon-structure.txt similarity index 100% rename from doc/source/addon-structure.txt rename to doc/addon-structure.txt diff --git a/doc/source/addons.rst b/doc/addons.rst similarity index 100% rename from doc/source/addons.rst rename to doc/addons.rst diff --git a/doc/conf.py b/doc/conf.py index 9e08b5f162e..d7452992944 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -16,9 +16,9 @@ import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) sys.path.append(os.path.abspath('_themes')) -sys.path.append(os.path.abspath('..')) +sys.path.insert(0, os.path.abspath('../addons')) +sys.path.insert(0, os.path.abspath('..')) # -- General configuration ----------------------------------------------------- @@ -42,7 +42,7 @@ source_suffix = '.rst' master_doc = 'index' # General information about the project. -project = u'OpenERP Server Developers Documentation' +project = u'OpenERP Web Developers Documentation' copyright = u'2012, OpenERP s.a.' # The version info for the project you're documenting, acts as replacement for @@ -170,7 +170,7 @@ html_sidebars = { #html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'openerp-server-doc' +htmlhelp_basename = 'openerp-web-doc' # -- Options for LaTeX output -------------------------------------------------- @@ -189,7 +189,7 @@ latex_elements = { # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'openerp-server-doc.tex', u'OpenERP Server Developers Documentation', + ('index', 'openerp-web-doc.tex', u'OpenERP Web Developers Documentation', u'OpenERP s.a.', 'manual'), ] @@ -219,7 +219,7 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'openerp-server-doc', u'OpenERP Server Developers Documentation', + ('index', 'openerp-web-doc', u'OpenERP Web Developers Documentation', [u'OpenERP s.a.'], 1) ] @@ -233,8 +233,8 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'OpenERPServerDocumentation', u'OpenERP Server Developers Documentation', - u'OpenERP s.a.', 'OpenERPServerDocumentation', 'Developers documentation for the openobject-server project.', + ('index', 'OpenERPWebDocumentation', u'OpenERP Web Developers Documentation', + u'OpenERP s.a.', 'OpenERPWebDocumentation', 'Developers documentation for the openerp-web project.', 'Miscellaneous'), ] @@ -250,5 +250,7 @@ texinfo_documents = [ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { - 'http://docs.python.org/': None, - } + 'python': ('http://docs.python.org/', None), + 'openerpserver': ('http://doc.openerp.com/v6.1/developers/server', None), + 'openerpdev': ('http://doc.openerp.com/v6.1/developers', None), +} diff --git a/doc/source/development.rst b/doc/development.rst similarity index 100% rename from doc/source/development.rst rename to doc/development.rst diff --git a/doc/source/getting-started.rst b/doc/getting-started.rst similarity index 100% rename from doc/source/getting-started.rst rename to doc/getting-started.rst diff --git a/doc/source/guides/client-action.rst b/doc/guides/client-action.rst similarity index 100% rename from doc/source/guides/client-action.rst rename to doc/guides/client-action.rst diff --git a/doc/source/guides/sidebar-protocol.rst b/doc/guides/sidebar-protocol.rst similarity index 100% rename from doc/source/guides/sidebar-protocol.rst rename to doc/guides/sidebar-protocol.rst diff --git a/doc/index.rst b/doc/index.rst index 5d5b4f8e0bd..efa4d1ce812 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,6 +1,27 @@ -:orphan: +.. OpenERP Web documentation master file, created by + sphinx-quickstart on Fri Mar 18 16:31:55 2011. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. -OpenERP Server Developers Documentation +Welcome to OpenERP Web's documentation! ======================================= -.. include:: index.rst.inc +Contents: + +.. toctree:: + :maxdepth: 2 + + getting-started + production + widgets + addons + development + project + old-version + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/doc/make.bat b/doc/make.bat index 2440f7c9356..3e72cadb53b 100644 --- a/doc/make.bat +++ b/doc/make.bat @@ -5,8 +5,8 @@ REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) -set BUILDDIR=build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% ) diff --git a/doc/source/old-version.rst b/doc/old-version.rst similarity index 100% rename from doc/source/old-version.rst rename to doc/old-version.rst diff --git a/doc/source/production.rst b/doc/production.rst similarity index 100% rename from doc/source/production.rst rename to doc/production.rst diff --git a/doc/source/project.rst b/doc/project.rst similarity index 100% rename from doc/source/project.rst rename to doc/project.rst diff --git a/doc/source/Makefile b/doc/source/Makefile deleted file mode 100644 index c1eff186583..00000000000 --- a/doc/source/Makefile +++ /dev/null @@ -1,154 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -q -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - sed -i '/-99999/d' _build/dirhtml/_static/flasky.css - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/OpenERPTechnicalDocumentation.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/OpenERPTechnicalDocumentation.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/OpenERPTechnicalDocumentation" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/OpenERPTechnicalDocumentation" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." diff --git a/doc/source/_static/openerp.png b/doc/source/_static/openerp.png deleted file mode 100644 index d6dbd9d83d1f3c3c2568e7ccac4e031e0f5b3806..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3981 zcmd^C_d6So6Q){fYt^b!v(zYRmYOv`)NZZXqm_bg)8jJ-!9MkGOE zBvBz>|Ht>9=kC4x>3!~f?w;o^R$o_xn&L495fKr!mZqxVE%x5}i~A(Ev1HN+c?&GQ zYNozM9!|dgw%(3J$_^fOjvQK_Z9h61I@&sX^%`@0O+-XOq_1PFc64;KDJunjXDI&i zWo2dM+3_)IZuSg`+)`875EF)2n&;=|pG;4gnVA(86_uBldwF@S3p_i7!CG5ej|YGt z5GX1ts<*e7jg2ieHFZltwzRYqqWfP)Muw%OWoT%qjEoFCJ99%saL3l_-Me>cYHBAF z<2^k+r%>pQll>VChC-pv;P8cog^rGnrluwZ1%-x&hOx0R0|SFCWd(9_@}u5A#l^*k z`MEAGF8%%e0s;bSYirwDYNMm0h~HHZv-j}Q;?vz-SV}U~#c5rLAHBYQ@I9K7lhe)3 z?Hr8`2ng8L)&v{qA{*+0gM(q|sVXWeU0q#tbaYTRm;Lb2&CSgX3DM)@<6Tepii!%< z@-qC_Ph?xGpPwIkb7Ma;d~k4ZFW}48*4F94K~7E%ytpthFi=TJY43~gj=-~{?k-75 zNgW*>EiElxUS4EV<38XUyz*CecJ^Liz{%+7#KgqiyLX3%hG3~F2Z?dJ-kzsmFnVR> zFf)Bq>g9fPq>qnJQc}`USLZnrX=i754u|XN>Y}%|Q40&m_BLco6I5IT>gp^cB*etT zl$DhwCnvXK{b6Qi#>2y-zP_G7AjHSVBM^wVxHvo>KQ}iwKR*wL!*_Oe_V@Q!R#vcB zY;A4r&CN|hLc;3m>g43)zkmNQ7)*G0`1$E61Oi!FT8fR0y}Z0!US7Vsx^j1SzrMc4 z;c!z^Q+0K9v$M0iySt}5keZsBEydRd2M5U3mR%1wFc`ccE{cG|&khfv9&QIo2@ng@ zO*t7T6nZ>7bPyl=@A7hfZffQCEwa0il)_VabWdBg2T6 zroR?u$AbgFq(mGRo06Q|_gWTltH$5af`S70&oa!#1$t|9c4h`$S2JL5yCo@x#bC9xd^I&* zX6XOHOL1R@nURT^O__(E<7I49tbvrqBfFFiK|eCJ&kxtK%iktS=JL;Cok*M^JiGAlx<)KI17v%|s3!d@k2GBK*81?%QXW7_LA}5dW8FIrH%8Bjk^lX2_-}SE-Fqyo-aeQbzE^On` zLs^&ibe#626289nd!gO?40c6z2DGWhl@lZbJ5TnrKG!ps7uO{up*&+0U;bjY41m`n zw`eghl>Yi}3itPQz6y2;P+~q$HH=!ss?EJwplv(I0EOGm3t@45NYdZ5-SlMn{xuDD zRjgmXCJ5eG9P%S}NJ~z{SxRbF^5%XW(Pfuq{%BJc-2G8L?o8|Lc7?+68E%f3WyNai z+)@_nvLy70Q$BwoTQnpaY0N9V{>om}r}M!T@{i>6v`AJ>P0auQl z@0l-JjZxGWkYGEd@Kb3n!RN zD<*u!T`v{lugQ?4f8)(^!`X3JXvkJn#1WbLEqYMet#| zU(SpwKriumxez`@%E}g3^k2+$Ly0I$NVTyo)v$>+T7$%O$-@!XY+LE^duE&EN=RNx zPxw?Yu)pLKZyj=zOt@JKIgJPCIptl}1MrJQJWOmo09^M8DWTe1HeF02gmV~_vBN}+ zz$*9ypBntvowcpx%(Y1q15;y+-I65GFKVy1eS4W)=rHQOE)``+aN=6S%(?$!;XL(i zq9RUAk=*_gA>vc0PmwQY&%X_DBR{*Ae28CW3_EccNB(oWv!qQ{VnoE&LUhL!9i;$U z9XzBjdvved|CLI}lmo=!-u=u$n2~Y&3D^ezvvaSrCL@McwF9WQ_r!T~(hihrW47B! zN{Yc^$=u!M?=}?3rvzGs6ADGZ6Z7ey;2{-Ii#+s~5=~GZl1(f*nA$!>2hXMQ%F{Ga zzXCKL0=*6eDCG1?cJ4~36bh0-we$K|@e2dOu`_Kvfl-uNQi~8_+Rnr)3}qWsBxbSs z{TNbLgm?kHy6a7R$?WcYxOQGo-g$CI#i-Kvx5#NZ%Q1H(%@6EBnxMc!d#+m|@3MW= zsAmxF1v-m+aL43BhU2EeLe-vf2+4*|`gE5`v3MZp0~ffcOr=Ari!89d!~nbA9Bu6Z zEc3KHywA`9uFi^kD~~#Tix!mD{w*bqV~|^#aAjvG{@t6tT0m-*(i$_IH>}y{Y)Ru2 zz-+UEYa(xqk`j!i-L;$cDG~Ws+)%(z_eDz+RpDErDJSLE_ zh5t&YmAppj^4B?UXk(+DIf=~Hp>TmpCL?@ruK;YR*zFU{={ROMSPPbZWA$!VbENs( z4=z9#H-NYPkr8os`B%&YorMpL%$nm`gv!{Ny-DyC*ze6~*C?OPAFe$N%H^K{k6ZyH z27DY}*rqYlNBj`M276P+zdrDh4HR*%8)fGDYX(Jo1knI?b5LGU4bUbhy-06?HBp>! zqUKG3(8b$%a1aatz0eT;Lj4?H7r*ZPz;M&%0qnU1nuxXZV(1m-_4~K^dYg!cQ=JRl z#kdt{v+L!#?OY~Z7k#wAs?hS|x*;Hd9=|W&Prym6S(@hR#oulGMozn*NK%6_ zQ!r!>Oc_~aRg|~zl_gNfZ&Od7bJ6#+8y4Ra(Tw|qJ?VnqUG1(b-{<^MPCgzYJbRf_@|CZ4;8B*kWtYS#XQ7_U>SE?RN&P(=5a)i$>3Igq&-ngaoc)`>T3ph@y|N_rKZFW?F66rz@Gi zZ*Q)$d#SSrCXN*!j|EyiG7-(o!i;rTEbnEWgZ1}m!LoguWyYM31pU+c9?igBMW7hB z)3icG)1Pf6y&%j{8R;FT4Twpb)%S}W{}YXYkH(sEBa}_Qcawy=f4jB*jVn?1p!|e zd+lCigNmLF1-^Fzs81<;`c`K|LTTnsvkd*RisHS{DwC3BLxcpl|LJnoZfBb5So;HR z4~bOS4;l$AH2I{9t6X2c^%&Z7*f%~%<}LPoSX2`cLPw4;7GP}{(X=)JhN`=SR{3Q+ z*x0jD;lpgUhHU55YuiGp=`Yhiju(f$RsCQz_OYMGX2i4VaiW(HeGCiGn}qoh(W?!0 z_}UZFCpg=c4F=#cIEikfxc&XR2f`rMb8~a~4@wl~KMhI)?MB4ji4~XfNp`5mSNC|4 zBpt$=Ad$b-XNXB!WvE?a8R_lmv#WrMq1GmeXW*mDABpAw)0APxRita30QfORQd<*s{a^L}E!$3Wz<=T1>S3#t7))rQxG%K5($_5OC#!%6Dopy??_3?}dH=u>Ef zCLKU1O!^$fDD0k~&knt&ChZtZ+@u1izt(Mr$0~$N1Vn-*IyA$pEyTcx^>r=ER%MxZ zY2o4sT+X#jnYrn_`JyiKO)?}rFI{+u=eru-#51~znn>%;QaousE;C#AiEU~8gVGot z4f&dgY2P-{1nwOh6G(;m!;izcbX^ z3MmQGvwQr~_u8HwL{!!f<_7*FFza8^4oj=qynas?kGsQxERnGid7PqJhzYc0XoLyP z)Xp9HW~v7+@eiLYg^@NcAi9K%e{HEe_A9rXK!? zu&PvG)*6-wja)#$56j@Co9e9Jf$Z7OPD01!02K$LeqHX$I=&69Fl&E#omL>%#k41v%>AQvU#?0DigJ(8An`#2D3sp+cLsn~@75B=%69{>OV diff --git a/doc/source/_templates/sidebarintro.html b/doc/source/_templates/sidebarintro.html deleted file mode 100644 index d61f3417226..00000000000 --- a/doc/source/_templates/sidebarintro.html +++ /dev/null @@ -1,16 +0,0 @@ - - -

Other Docs

- - -

Useful Links

- diff --git a/doc/source/_templates/sidebarlogo.html b/doc/source/_templates/sidebarlogo.html deleted file mode 100644 index de6e3e5c851..00000000000 --- a/doc/source/_templates/sidebarlogo.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/doc/source/_themes/LICENSE b/doc/source/_themes/LICENSE deleted file mode 100644 index 8daab7ee6ef..00000000000 --- a/doc/source/_themes/LICENSE +++ /dev/null @@ -1,37 +0,0 @@ -Copyright (c) 2010 by Armin Ronacher. - -Some rights reserved. - -Redistribution and use in source and binary forms of the theme, with or -without modification, are permitted provided that the following conditions -are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - -* The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -We kindly ask you to only use these themes in an unmodified manner just -for Flask and Flask-related products, not for unrelated projects. If you -like the visual style and want to use it for your own projects, please -consider making some larger changes to the themes (such as changing -font faces, sizes, colors or margins). - -THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/doc/source/_themes/README b/doc/source/_themes/README deleted file mode 100644 index b3292bdff8e..00000000000 --- a/doc/source/_themes/README +++ /dev/null @@ -1,31 +0,0 @@ -Flask Sphinx Styles -=================== - -This repository contains sphinx styles for Flask and Flask related -projects. To use this style in your Sphinx documentation, follow -this guide: - -1. put this folder as _themes into your docs folder. Alternatively - you can also use git submodules to check out the contents there. -2. add this to your conf.py: - - sys.path.append(os.path.abspath('_themes')) - html_theme_path = ['_themes'] - html_theme = 'flask' - -The following themes exist: - -- 'flask' - the standard flask documentation theme for large - projects -- 'flask_small' - small one-page theme. Intended to be used by - very small addon libraries for flask. - -The following options exist for the flask_small theme: - - [options] - index_logo = '' filename of a picture in _static - to be used as replacement for the - h1 in the index.rst file. - index_logo_height = 120px height of the index logo - github_fork = '' repository name on github for the - "fork me" badge diff --git a/doc/source/_themes/flask/layout.html b/doc/source/_themes/flask/layout.html deleted file mode 100644 index ad08eccd38d..00000000000 --- a/doc/source/_themes/flask/layout.html +++ /dev/null @@ -1,25 +0,0 @@ -{%- extends "basic/layout.html" %} -{%- block extrahead %} - {{ super() }} - {% if theme_touch_icon %} - - {% endif %} - -{% endblock %} -{%- block relbar2 %}{% endblock %} -{% block header %} - {{ super() }} - {% if pagename == 'index' %} -
- {% endif %} -{% endblock %} -{%- block footer %} - - {% if pagename == 'index' %} -
- {% endif %} -{%- endblock %} diff --git a/doc/source/_themes/flask/relations.html b/doc/source/_themes/flask/relations.html deleted file mode 100644 index 3bbcde85bb4..00000000000 --- a/doc/source/_themes/flask/relations.html +++ /dev/null @@ -1,19 +0,0 @@ -

Related Topics

- diff --git a/doc/source/_themes/flask/static/flasky.css_t b/doc/source/_themes/flask/static/flasky.css_t deleted file mode 100644 index 0280e159455..00000000000 --- a/doc/source/_themes/flask/static/flasky.css_t +++ /dev/null @@ -1,395 +0,0 @@ -/* - * flasky.css_t - * ~~~~~~~~~~~~ - * - * :copyright: Copyright 2010 by Armin Ronacher. - * :license: Flask Design License, see LICENSE for details. - */ - -{% set page_width = '80em' %} -{% set sidebar_width = '16em' %} - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: 'Georgia', serif; - font-size: 15px; - background-color: white; - color: #000; - margin: 0; - padding: 0; -} - -div.document { - width: {{ page_width }}; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 {{ sidebar_width }}; -} - -div.sphinxsidebar { - width: {{ sidebar_width }}; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #ffffff; - color: #3E4349; - padding: 0 0px 0 0px; -} - -img.floatingflask { - padding: 0 0 10px 10px; - float: right; -} - -div.footer { - width: {{ page_width }}; - margin: 20px auto 30px auto; - font-size: 12px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -div.related { - display: none; -} - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebar { - font-size: 12px; - line-height: 1.5; -} - -div.sphinxsidebarwrapper { - padding: 0px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0 0 20px 0; - margin: 0; - text-align: center; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: 'Garamond', 'Georgia', serif; - color: #444; - font-size: 22px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 18px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar input { - border: 1px solid #ccc; - font-family: 'Georgia', serif; - font-size: 1em; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -{% if theme_index_logo %} -div.indexwrapper h1 { - text-indent: -999999px; - background: url({{ theme_index_logo }}) no-repeat center center; - height: {{ theme_index_logo_height }}; -} -{% endif %} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #ddd; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #eaeaea; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - background: #fafafa; - margin: 20px -30px; - padding: 10px 30px; - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; -} - -div.admonition tt.xref, div.admonition a tt { - border-bottom: 1px solid #fafafa; -} - -dd div.admonition { - margin-left: -60px; - padding-left: 60px; -} - -div.admonition p.admonition-title { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - font-size: 22px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: white; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt { - font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -img.screenshot { -} - -tt.descname, tt.descclassname { - font-size: 0.95em; -} - -tt.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #eee; - background: #fdfdfd; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.footnote td.label { - width: 0px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #eee; - padding: 7px 30px; - margin: 15px -30px; - line-height: 1.3em; -} - -dl pre, blockquote pre, li pre { - margin-left: -60px; - padding-left: 60px; -} - -dl dl pre { - margin-left: -90px; - padding-left: 90px; -} - -tt { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid white; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt { - background: #EEE; -} diff --git a/doc/source/_themes/flask/static/small_flask.css b/doc/source/_themes/flask/static/small_flask.css deleted file mode 100644 index 1c6df309edc..00000000000 --- a/doc/source/_themes/flask/static/small_flask.css +++ /dev/null @@ -1,70 +0,0 @@ -/* - * small_flask.css_t - * ~~~~~~~~~~~~~~~~~ - * - * :copyright: Copyright 2010 by Armin Ronacher. - * :license: Flask Design License, see LICENSE for details. - */ - -body { - margin: 0; - padding: 20px 30px; -} - -div.documentwrapper { - float: none; - background: white; -} - -div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: white; -} - -div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, -div.sphinxsidebar h3 a { - color: white; -} - -div.sphinxsidebar a { - color: #aaa; -} - -div.sphinxsidebar p.logo { - display: none; -} - -div.document { - width: 100%; - margin: 0; -} - -div.related { - display: block; - margin: 0; - padding: 10px 0 20px 0; -} - -div.related ul, -div.related ul li { - margin: 0; - padding: 0; -} - -div.footer { - display: none; -} - -div.bodywrapper { - margin: 0; -} - -div.body { - min-height: 0; - padding: 0; -} diff --git a/doc/source/_themes/flask/theme.conf b/doc/source/_themes/flask/theme.conf deleted file mode 100644 index 18c720f804c..00000000000 --- a/doc/source/_themes/flask/theme.conf +++ /dev/null @@ -1,9 +0,0 @@ -[theme] -inherit = basic -stylesheet = flasky.css -pygments_style = flask_theme_support.FlaskyStyle - -[options] -index_logo = '' -index_logo_height = 120px -touch_icon = diff --git a/doc/source/_themes/flask_small/layout.html b/doc/source/_themes/flask_small/layout.html deleted file mode 100644 index aa1716aaff0..00000000000 --- a/doc/source/_themes/flask_small/layout.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "basic/layout.html" %} -{% block header %} - {{ super() }} - {% if pagename == 'index' %} -
- {% endif %} -{% endblock %} -{% block footer %} - {% if pagename == 'index' %} -
- {% endif %} -{% endblock %} -{# do not display relbars #} -{% block relbar1 %}{% endblock %} -{% block relbar2 %} - {% if theme_github_fork %} - Fork me on GitHub - {% endif %} -{% endblock %} -{% block sidebar1 %}{% endblock %} -{% block sidebar2 %}{% endblock %} diff --git a/doc/source/_themes/flask_small/static/flasky.css_t b/doc/source/_themes/flask_small/static/flasky.css_t deleted file mode 100644 index fe2141c565e..00000000000 --- a/doc/source/_themes/flask_small/static/flasky.css_t +++ /dev/null @@ -1,287 +0,0 @@ -/* - * flasky.css_t - * ~~~~~~~~~~~~ - * - * Sphinx stylesheet -- flasky theme based on nature theme. - * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: 'Georgia', serif; - font-size: 17px; - color: #000; - background: white; - margin: 0; - padding: 0; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 40px auto 0 auto; - width: 700px; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #ffffff; - color: #3E4349; - padding: 0 30px 30px 30px; -} - -img.floatingflask { - padding: 0 0 10px 10px; - float: right; -} - -div.footer { - text-align: right; - color: #888; - padding: 10px; - font-size: 14px; - width: 650px; - margin: 0 auto 40px auto; -} - -div.footer a { - color: #888; - text-decoration: underline; -} - -div.related { - line-height: 32px; - color: #888; -} - -div.related ul { - padding: 0 0 0 10px; -} - -div.related a { - color: #444; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body { - padding-bottom: 40px; /* saved for footer */ -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -{% if theme_index_logo %} -div.indexwrapper h1 { - text-indent: -999999px; - background: url({{ theme_index_logo }}) no-repeat center center; - height: {{ theme_index_logo_height }}; -} -{% endif %} - -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: white; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #eaeaea; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - background: #fafafa; - margin: 20px -30px; - padding: 10px 30px; - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; -} - -div.admonition p.admonition-title { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight{ - background-color: white; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt { - font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.85em; -} - -img.screenshot { -} - -tt.descname, tt.descclassname { - font-size: 0.95em; -} - -tt.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #eee; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.footnote td { - padding: 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -pre { - padding: 0; - margin: 15px -30px; - padding: 8px; - line-height: 1.3em; - padding: 7px 30px; - background: #eee; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; -} - -dl pre { - margin-left: -60px; - padding-left: 60px; -} - -tt { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, a tt { - background-color: #FBFBFB; -} - -a:hover tt { - background: #EEE; -} diff --git a/doc/source/_themes/flask_small/theme.conf b/doc/source/_themes/flask_small/theme.conf deleted file mode 100644 index 542b462515d..00000000000 --- a/doc/source/_themes/flask_small/theme.conf +++ /dev/null @@ -1,10 +0,0 @@ -[theme] -inherit = basic -stylesheet = flasky.css -nosidebar = true -pygments_style = flask_theme_support.FlaskyStyle - -[options] -index_logo = '' -index_logo_height = 120px -github_fork = '' diff --git a/doc/source/_themes/flask_theme_support.py b/doc/source/_themes/flask_theme_support.py deleted file mode 100644 index 33f47449c11..00000000000 --- a/doc/source/_themes/flask_theme_support.py +++ /dev/null @@ -1,86 +0,0 @@ -# flasky extensions. flasky pygments style based on tango style -from pygments.style import Style -from pygments.token import Keyword, Name, Comment, String, Error, \ - Number, Operator, Generic, Whitespace, Punctuation, Other, Literal - - -class FlaskyStyle(Style): - background_color = "#f8f8f8" - default_style = "" - - styles = { - # No corresponding class for the following: - #Text: "", # class: '' - Whitespace: "underline #f8f8f8", # class: 'w' - Error: "#a40000 border:#ef2929", # class: 'err' - Other: "#000000", # class 'x' - - Comment: "italic #8f5902", # class: 'c' - Comment.Preproc: "noitalic", # class: 'cp' - - Keyword: "bold #004461", # class: 'k' - Keyword.Constant: "bold #004461", # class: 'kc' - Keyword.Declaration: "bold #004461", # class: 'kd' - Keyword.Namespace: "bold #004461", # class: 'kn' - Keyword.Pseudo: "bold #004461", # class: 'kp' - Keyword.Reserved: "bold #004461", # class: 'kr' - Keyword.Type: "bold #004461", # class: 'kt' - - Operator: "#582800", # class: 'o' - Operator.Word: "bold #004461", # class: 'ow' - like keywords - - Punctuation: "bold #000000", # class: 'p' - - # because special names such as Name.Class, Name.Function, etc. - # are not recognized as such later in the parsing, we choose them - # to look the same as ordinary variables. - Name: "#000000", # class: 'n' - Name.Attribute: "#c4a000", # class: 'na' - to be revised - Name.Builtin: "#004461", # class: 'nb' - Name.Builtin.Pseudo: "#3465a4", # class: 'bp' - Name.Class: "#000000", # class: 'nc' - to be revised - Name.Constant: "#000000", # class: 'no' - to be revised - Name.Decorator: "#888", # class: 'nd' - to be revised - Name.Entity: "#ce5c00", # class: 'ni' - Name.Exception: "bold #cc0000", # class: 'ne' - Name.Function: "#000000", # class: 'nf' - Name.Property: "#000000", # class: 'py' - Name.Label: "#f57900", # class: 'nl' - Name.Namespace: "#000000", # class: 'nn' - to be revised - Name.Other: "#000000", # class: 'nx' - Name.Tag: "bold #004461", # class: 'nt' - like a keyword - Name.Variable: "#000000", # class: 'nv' - to be revised - Name.Variable.Class: "#000000", # class: 'vc' - to be revised - Name.Variable.Global: "#000000", # class: 'vg' - to be revised - Name.Variable.Instance: "#000000", # class: 'vi' - to be revised - - Number: "#990000", # class: 'm' - - Literal: "#000000", # class: 'l' - Literal.Date: "#000000", # class: 'ld' - - String: "#4e9a06", # class: 's' - String.Backtick: "#4e9a06", # class: 'sb' - String.Char: "#4e9a06", # class: 'sc' - String.Doc: "italic #8f5902", # class: 'sd' - like a comment - String.Double: "#4e9a06", # class: 's2' - String.Escape: "#4e9a06", # class: 'se' - String.Heredoc: "#4e9a06", # class: 'sh' - String.Interpol: "#4e9a06", # class: 'si' - String.Other: "#4e9a06", # class: 'sx' - String.Regex: "#4e9a06", # class: 'sr' - String.Single: "#4e9a06", # class: 's1' - String.Symbol: "#4e9a06", # class: 'ss' - - Generic: "#000000", # class: 'g' - Generic.Deleted: "#a40000", # class: 'gd' - Generic.Emph: "italic #000000", # class: 'ge' - Generic.Error: "#ef2929", # class: 'gr' - Generic.Heading: "bold #000080", # class: 'gh' - Generic.Inserted: "#00A000", # class: 'gi' - Generic.Output: "#888", # class: 'go' - Generic.Prompt: "#745334", # class: 'gp' - Generic.Strong: "bold #000000", # class: 'gs' - Generic.Subheading: "bold #800080", # class: 'gu' - Generic.Traceback: "bold #a40000", # class: 'gt' - } diff --git a/doc/source/conf.py b/doc/source/conf.py deleted file mode 100644 index eb2b10d8bce..00000000000 --- a/doc/source/conf.py +++ /dev/null @@ -1,256 +0,0 @@ -# -*- coding: utf-8 -*- -# -# OpenERP Technical Documentation configuration file, created by -# sphinx-quickstart on Fri Feb 17 16:14:06 2012. -# -# This file is execfile()d with the current directory set to its containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys, os - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -sys.path.append(os.path.abspath('_themes')) -sys.path.insert(0, os.path.abspath('../../addons')) -sys.path.insert(0, os.path.abspath('../..')) - -# -- General configuration ----------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.viewcode'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'OpenERP Server Developers Documentation' -copyright = u'2012, OpenERP s.a.' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '6.1' -# The full version, including alpha/beta/rc tags. -release = '6.1' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['_build'] - -# The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - - -# -- Options for HTML output --------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'flask' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -html_theme_path = ['_themes'] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -html_sidebars = { - 'index': ['sidebarintro.html', 'sourcelink.html', 'searchbox.html'], - '**': ['sidebarlogo.html', 'localtoc.html', 'relations.html', - 'sourcelink.html', 'searchbox.html'] -} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'openerp-server-doc' - - -# -- Options for LaTeX output -------------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ - ('index', 'openerp-server-doc.tex', u'OpenERP Server Developers Documentation', - u'OpenERP s.a.', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output -------------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'openerp-server-doc', u'OpenERP Server Developers Documentation', - [u'OpenERP s.a.'], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------------ - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ('index', 'OpenERPServerDocumentation', u'OpenERP Server Developers Documentation', - u'OpenERP s.a.', 'OpenERPServerDocumentation', 'Developers documentation for the openobject-server project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = { - 'python': ('http://docs.python.org/', None), - 'openerpserver': ('http://doc.openerp.com/v6.1/developers/server', None), - 'openerpdev': ('http://doc.openerp.com/v6.1/developers', None), -} diff --git a/doc/source/index.rst b/doc/source/index.rst deleted file mode 100644 index efa4d1ce812..00000000000 --- a/doc/source/index.rst +++ /dev/null @@ -1,27 +0,0 @@ -.. OpenERP Web documentation master file, created by - sphinx-quickstart on Fri Mar 18 16:31:55 2011. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to OpenERP Web's documentation! -======================================= - -Contents: - -.. toctree:: - :maxdepth: 2 - - getting-started - production - widgets - addons - development - project - old-version - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/doc/source/widgets.rst b/doc/widgets.rst similarity index 100% rename from doc/source/widgets.rst rename to doc/widgets.rst From c7ab774b5359aede50db7e8840a56c5d66979486 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 5 Mar 2012 15:07:38 +0100 Subject: [PATCH 19/39] [DOC] moved FEATURES.rst to doc/. bzr revid: vmt@openerp.com-20120305140738-ou7f1pz5fnqffukm --- FEATURES.rst | 108 ----------------------------------------- doc/index.rst.inc | 7 +++ doc/test-framework.rst | 100 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 108 deletions(-) delete mode 100644 FEATURES.rst create mode 100644 doc/test-framework.rst diff --git a/FEATURES.rst b/FEATURES.rst deleted file mode 100644 index 0b950db26ed..00000000000 --- a/FEATURES.rst +++ /dev/null @@ -1,108 +0,0 @@ -.. _features: - -Features -======== - - -.. _test-framework: - -Test framework --------------- - -In addition to the YAML-based tests, OpenERP uses the unittest2 testing -framework to test both the core `openerp` package and its addons. For the core -and each addons, tests are divided between three (overlapping) sets: - -1. A test suite that comprises all the tests that can be run right after the -addons is installed (or, for the core, right after a database is created). -That suite is called `fast_suite` and must contain only tests that can be run -frequently. Actually most of the tests should be considered fast enough to be -included in that `fast_suite` list and only tests that take a long time to run -(e.g. more than a minute) should not be listed. Those long tests should come up -pretty rarely. - -2. A test suite called `checks` provides sanity checks. These tests are -invariants that must be full-filled at any time. They are expected to always -pass: obviously they must pass right after the module is installed (i.e. just -like the `fast_suite` tests), but they must also pass after any other module is -installed, after a migration, or even after the database was put in production -for a few months. - -3. The third suite is made of all the tests: those provided by the two above -suites, but also tests that are not explicitely listed in `fast_suite` or -`checks`. They are not explicitely listed anywhere and are discovered -automatically. - -As the sanity checks provide stronger guarantees about the code and database -structure, new tests must be added to the `checks` suite whenever it is -possible. Said with other words: one should try to avoid writing tests that -assume a freshly installed/unaltered module or database. - -It is possible to have tests that are not listed in `fast_suite` or `checks`. -This is useful if a test takes a lot of time. By default, when using the -testing infrastructure, tests should run fast enough so that people can use -them frequently. One can also use that possiblity for tests that require some -complex setup before they can be successfuly run. - -As a rule of thumb when writing a new test, try to add it to the `checks` -suite. If it really needs that the module it belongs to is freshly installed, -add it to `fast_suite`. Finally, if it can not be run in an acceptable time -frame, don't add it to any explicit list. - -The tests must be developed under `.tests` (or `openerp.tests` for -the core). For instance, with respect to the tests, a module `foo` should be -organized as follow:: - - foo/ - __init__.py # does not import .tests - tests/ - __init__.py # import some of the tests sub-modules, and - # list them in fast_suite or checks - test_bar.py # contains unittest2 classes - test_baz.py # idem - ... and so on ... - -The two explicit lists of tests are thus the variables `foo.tests.fast_suite` -and `foo.tests.checks`. As an example, you can take a look at the -`openerp.tests` module (which follows exactly the same conventions even if it -is not an addons). - -Note that the `fast_suite` and `checks` variables are really list of module -objects. They could be directly unittest2 suite objects if necessary in the -future. - -.. As this feature description becomes quite big, the following section is - turned into an additional feature. - -To run the tests, see :ref:`running-the-tests`. - -.. _running-the-tests: - -Running the tests ------------------ - -To run the tests (see :ref:`test-framework` to learn how tests are organized), -the simplest way is to use the `oe` command (provided by the `openerp-command` -project). - -:: - - > oe run-tests # will run all the fast_suite tests - > oe run-tests openerp # will run all the fast_suite tests defined in `openerp.tests` - > oe run-tests sale # will run all the fast_suite tests defined in `openerp.addons.sale.tests` - > oe run-tests foo.test_bar # will run the tests defined in `openerp.addons.foo.tests.test_bar` - -In addition to the above possibilities, when invoked with a non-existing module -(or module.sub-module) name, oe will reply with a list of available test -sub-modules. - -Depending on the unittest2 class that is used to write the tests (see -`openerp.tests.common` for some helper classes that you can re-use), a database -may be created before the test is run, and the module providing the test will -be installed on that database. - -Because creating a database, installing modules, and then dropping it is -expensive, it is possible to interleave the run of the `fast_suite` tests with -the initialization of a new database: the dabase is created, and after each -requested module is installed, its fast_suite tests are run. The database is -thus created and dropped (and the modules installed) only once. diff --git a/doc/index.rst.inc b/doc/index.rst.inc index 8b137891791..05c4a53640b 100644 --- a/doc/index.rst.inc +++ b/doc/index.rst.inc @@ -1 +1,8 @@ +OpenERP Server +'''''''''''''' + +.. toctree:: + :maxdepth: 1 + + test-framework diff --git a/doc/test-framework.rst b/doc/test-framework.rst new file mode 100644 index 00000000000..56951b1a8e1 --- /dev/null +++ b/doc/test-framework.rst @@ -0,0 +1,100 @@ +.. _test-framework: + +Test framework +============== + +In addition to the YAML-based tests, OpenERP uses the unittest2_ testing +framework to test both the core ``openerp`` package and its addons. For the +core and each addons, tests are divided between three (overlapping) sets: + +1. A test suite that comprises all the tests that can be run right after the + addons is installed (or, for the core, right after a database is created). + That suite is called ``fast_suite`` and must contain only tests that can be run + frequently. Actually most of the tests should be considered fast enough to be + included in that ``fast_suite`` list and only tests that take a long time to run + (e.g. more than a minute) should not be listed. Those long tests should come up + pretty rarely. + +2. A test suite called ``checks`` provides sanity checks. These tests are + invariants that must be full-filled at any time. They are expected to always + pass: obviously they must pass right after the module is installed (i.e. just + like the ``fast_suite`` tests), but they must also pass after any other module is + installed, after a migration, or even after the database was put in production + for a few months. + +3. The third suite is made of all the tests: those provided by the two above + suites, but also tests that are not explicitely listed in ``fast_suite`` or + ``checks``. They are not explicitely listed anywhere and are discovered + automatically. + +As the sanity checks provide stronger guarantees about the code and database +structure, new tests must be added to the ``checks`` suite whenever it is +possible. Said with other words: one should try to avoid writing tests that +assume a freshly installed/unaltered module or database. + +It is possible to have tests that are not listed in ``fast_suite`` or +``checks``. This is useful if a test takes a lot of time. By default, when +using the testing infrastructure, tests should run fast enough so that people +can use them frequently. One can also use that possiblity for tests that +require some complex setup before they can be successfuly run. + +As a rule of thumb when writing a new test, try to add it to the ``checks`` +suite. If it really needs that the module it belongs to is freshly installed, +add it to ``fast_suite``. Finally, if it can not be run in an acceptable time +frame, don't add it to any explicit list. + +Writing tests +------------- + +The tests must be developed under ``.tests`` (or ``openerp.tests`` +for the core). For instance, with respect to the tests, a module ``foo`` +should be organized as follow:: + + foo/ + __init__.py # does not import .tests + tests/ + __init__.py # import some of the tests sub-modules, and + # list them in fast_suite or checks + test_bar.py # contains unittest2 classes + test_baz.py # idem + ... and so on ... + +The two explicit lists of tests are thus the variables ``foo.tests.fast_suite`` +and ``foo.tests.checks``. As an example, you can take a look at the +``openerp.tests`` module (which follows exactly the same conventions even if it +is not an addons). + +Note that the ``fast_suite`` and ``checks`` variables are really lists of +module objects. They could be directly unittest2 suite objects if necessary in +the future. + +Running the tests +----------------- + +To run the tests (see :ref:`above ` to learn how tests are +organized), the simplest way is to use the ``oe`` command (provided by the +``openerp-command`` project). + +:: + + > oe run-tests # will run all the fast_suite tests + > oe run-tests -m openerp # will run all the fast_suite tests defined in `openerp.tests` + > oe run-tests -m sale # will run all the fast_suite tests defined in `openerp.addons.sale.tests` + > oe run-tests -m foo.test_bar # will run the tests defined in `openerp.addons.foo.tests.test_bar` + +In addition to the above possibilities, when invoked with a non-existing module +(or module.sub-module) name, oe will reply with a list of available test +sub-modules. + +Depending on the unittest2_ class that is used to write the tests (see +``openerp.tests.common`` for some helper classes that you can re-use), a database +may be created before the test is run, and the module providing the test will +be installed on that database. + +Because creating a database, installing modules, and then dropping it is +expensive, it is possible to interleave the run of the ``fast_suite`` tests +with the initialization of a new database: the dabase is created, and after +each requested module is installed, its fast_suite tests are run. The database +is thus created and dropped (and the modules installed) only once. + +.. _unittest2: http://pypi.python.org/pypi/unittest2 From 1ae5913ae8fa5074be0e8da30ec318e2bdde1027 Mon Sep 17 00:00:00 2001 From: Openerp Online Date: Mon, 5 Mar 2012 17:45:52 +0100 Subject: [PATCH 20/39] [DOC] change v6.1 reference to trunk. bzr revid: online@openerp.com-20120305164552-tij9m4if82h4huts --- doc/_templates/sidebarintro.html | 6 +++--- doc/conf.py | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/_templates/sidebarintro.html b/doc/_templates/sidebarintro.html index d61f3417226..95b047733e3 100644 --- a/doc/_templates/sidebarintro.html +++ b/doc/_templates/sidebarintro.html @@ -4,9 +4,9 @@

Other Docs

Useful Links

diff --git a/doc/conf.py b/doc/conf.py index d7452992944..54deb11eb2d 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -16,9 +16,9 @@ import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) sys.path.append(os.path.abspath('_themes')) -sys.path.insert(0, os.path.abspath('../addons')) -sys.path.insert(0, os.path.abspath('..')) +sys.path.append(os.path.abspath('..')) # -- General configuration ----------------------------------------------------- @@ -42,7 +42,7 @@ source_suffix = '.rst' master_doc = 'index' # General information about the project. -project = u'OpenERP Web Developers Documentation' +project = u'OpenERP Server Developers Documentation' copyright = u'2012, OpenERP s.a.' # The version info for the project you're documenting, acts as replacement for @@ -170,7 +170,7 @@ html_sidebars = { #html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'openerp-web-doc' +htmlhelp_basename = 'openerp-server-doc' # -- Options for LaTeX output -------------------------------------------------- @@ -189,7 +189,7 @@ latex_elements = { # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'openerp-web-doc.tex', u'OpenERP Web Developers Documentation', + ('index', 'openerp-server-doc.tex', u'OpenERP Server Developers Documentation', u'OpenERP s.a.', 'manual'), ] @@ -219,7 +219,7 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'openerp-web-doc', u'OpenERP Web Developers Documentation', + ('index', 'openerp-server-doc', u'OpenERP Server Developers Documentation', [u'OpenERP s.a.'], 1) ] @@ -233,8 +233,8 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'OpenERPWebDocumentation', u'OpenERP Web Developers Documentation', - u'OpenERP s.a.', 'OpenERPWebDocumentation', 'Developers documentation for the openerp-web project.', + ('index', 'OpenERPServerDocumentation', u'OpenERP Server Developers Documentation', + u'OpenERP s.a.', 'OpenERPServerDocumentation', 'Developers documentation for the openobject-server project.', 'Miscellaneous'), ] @@ -251,6 +251,6 @@ texinfo_documents = [ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { 'python': ('http://docs.python.org/', None), - 'openerpserver': ('http://doc.openerp.com/v6.1/developers/server', None), - 'openerpdev': ('http://doc.openerp.com/v6.1/developers', None), + 'openerpweb': ('http://doc.openerp.com/trunk/developers/web', None), + 'openerpdev': ('http://doc.openerp.com/trunk/developers', None), } From 3fec9bb04961b11f9c7a474fc79c16e23dd1f80f Mon Sep 17 00:00:00 2001 From: Openerp Online Date: Mon, 5 Mar 2012 17:46:17 +0100 Subject: [PATCH 21/39] [DOC] change v6.1 reference to trunk. bzr revid: online@openerp.com-20120305164617-2ykj6o263sywjstz --- doc/_templates/sidebarintro.html | 2 +- doc/conf.py | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/_templates/sidebarintro.html b/doc/_templates/sidebarintro.html index 95b047733e3..ecd51980e58 100644 --- a/doc/_templates/sidebarintro.html +++ b/doc/_templates/sidebarintro.html @@ -5,7 +5,7 @@

Other Docs

diff --git a/doc/conf.py b/doc/conf.py index 54deb11eb2d..69e49d0e5a7 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -16,9 +16,9 @@ import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) sys.path.append(os.path.abspath('_themes')) -sys.path.append(os.path.abspath('..')) +sys.path.insert(0, os.path.abspath('../addons')) +sys.path.insert(0, os.path.abspath('..')) # -- General configuration ----------------------------------------------------- @@ -42,7 +42,7 @@ source_suffix = '.rst' master_doc = 'index' # General information about the project. -project = u'OpenERP Server Developers Documentation' +project = u'OpenERP Web Developers Documentation' copyright = u'2012, OpenERP s.a.' # The version info for the project you're documenting, acts as replacement for @@ -170,7 +170,7 @@ html_sidebars = { #html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'openerp-server-doc' +htmlhelp_basename = 'openerp-web-doc' # -- Options for LaTeX output -------------------------------------------------- @@ -189,7 +189,7 @@ latex_elements = { # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'openerp-server-doc.tex', u'OpenERP Server Developers Documentation', + ('index', 'openerp-web-doc.tex', u'OpenERP Web Developers Documentation', u'OpenERP s.a.', 'manual'), ] @@ -219,7 +219,7 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'openerp-server-doc', u'OpenERP Server Developers Documentation', + ('index', 'openerp-web-doc', u'OpenERP Web Developers Documentation', [u'OpenERP s.a.'], 1) ] @@ -233,8 +233,8 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'OpenERPServerDocumentation', u'OpenERP Server Developers Documentation', - u'OpenERP s.a.', 'OpenERPServerDocumentation', 'Developers documentation for the openobject-server project.', + ('index', 'OpenERPWebDocumentation', u'OpenERP Web Developers Documentation', + u'OpenERP s.a.', 'OpenERPWebDocumentation', 'Developers documentation for the openerp-web project.', 'Miscellaneous'), ] @@ -251,6 +251,6 @@ texinfo_documents = [ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { 'python': ('http://docs.python.org/', None), - 'openerpweb': ('http://doc.openerp.com/trunk/developers/web', None), + 'openerpserver': ('http://doc.openerp.com/trunk/developers/server', None), 'openerpdev': ('http://doc.openerp.com/trunk/developers', None), } From eb2338c575a47d721ba018cca349ff76aadee038 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 5 Mar 2012 18:20:21 +0100 Subject: [PATCH 22/39] [FIX] @default_focus not honored in embedded form views lp bug: https://launchpad.net/bugs/944080 fixed bzr revid: fme@openerp.com-20120305172021-wwmen156hb38yppc --- addons/web/static/src/js/view_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 70b66b897eb..d4a090eafcc 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -211,7 +211,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# if (self.sidebar) { self.sidebar.attachments.do_update(); } - if (self.default_focus_field && !self.embedded_view) { + if (self.default_focus_field) { self.default_focus_field.focus(); } if (record.id) { From effd8e2ca3a053a258831d5ac53676d00ee948e8 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 5 Mar 2012 19:45:16 +0100 Subject: [PATCH 23/39] [FIX] "Group" label in list view should be translatable lp bug: https://launchpad.net/bugs/943973 fixed bzr revid: fme@openerp.com-20120305184516-6j7ftdnflw6mrb0p --- addons/web/static/src/js/view_list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 30a0018b6e1..e8fff450c6e 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -363,7 +363,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# _(this.fields_view.arch.children).map(field_to_column)); if (grouped) { this.columns.unshift({ - id: '_group', tag: '', string: "Group", meta: true, + id: '_group', tag: '', string: _t("Group"), meta: true, modifiers_for: function () { return {}; } }, { id: '_count', tag: '', string: '#', meta: true, From 79ff7b620a5fa2eba1eaf3aedc33c7b8960de983 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Tue, 6 Mar 2012 04:48:43 +0000 Subject: [PATCH 24/39] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20120306044843-9a70e0z9fqoy4v3f --- addons/email_template/i18n/fr.po | 38 +- addons/fetchmail_hr_recruitment/i18n/fr.po | 32 ++ addons/import_base/i18n/fr.po | 100 +++++ addons/import_sugarcrm/i18n/ar.po | 404 +++++++++++++++++++++ addons/stock/i18n/fr.po | 16 +- 5 files changed, 567 insertions(+), 23 deletions(-) create mode 100644 addons/fetchmail_hr_recruitment/i18n/fr.po create mode 100644 addons/import_base/i18n/fr.po create mode 100644 addons/import_sugarcrm/i18n/ar.po diff --git a/addons/email_template/i18n/fr.po b/addons/email_template/i18n/fr.po index d4599d879a7..9436b37ece2 100644 --- a/addons/email_template/i18n/fr.po +++ b/addons/email_template/i18n/fr.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-02-08 00:36+0000\n" -"PO-Revision-Date: 2012-02-18 23:35+0000\n" -"Last-Translator: GaCriv \n" +"PO-Revision-Date: 2012-03-05 14:46+0000\n" +"Last-Translator: Numérigraphe \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: 2012-02-19 05:43+0000\n" -"X-Generator: Launchpad (build 14814)\n" +"X-Launchpad-Export-Date: 2012-03-06 04:48+0000\n" +"X-Generator: Launchpad (build 14900)\n" #. module: email_template #: field:email.template,subtype:0 @@ -37,12 +37,14 @@ msgstr "SMTP Server" #: view:email.template:0 msgid "Remove the sidebar button currently displayed on related documents" msgstr "" +"Supprime le bouton de la barre latérale actuellement affiché sur les " +"documents associés" #. module: email_template #: field:email.template,ref_ir_act_window:0 #: field:email_template.preview,ref_ir_act_window:0 msgid "Sidebar action" -msgstr "" +msgstr "Action de la barre latérale" #. module: email_template #: view:mail.compose.message:0 @@ -72,7 +74,7 @@ msgstr "Reçu" #: field:email.template,ref_ir_value:0 #: field:email_template.preview,ref_ir_value:0 msgid "Sidebar button" -msgstr "" +msgstr "Bouton de la barre latérale" #. module: email_template #: help:email.template,report_name:0 @@ -85,7 +87,7 @@ msgstr "" #. module: email_template #: view:email.template:0 msgid "Attach existing files" -msgstr "" +msgstr "Joindre les fichiers existants" #. module: email_template #: view:email.template:0 @@ -185,7 +187,7 @@ msgstr "Assistant de composition de message" #. module: email_template #: view:email.template:0 msgid "Dynamic Values Builder" -msgstr "" +msgstr "Constructeur de valeurs dynamiques" #. module: email_template #: field:email.template,res_id:0 @@ -274,7 +276,7 @@ msgstr "Options" #: field:email.template,model_id:0 #: field:email_template.preview,model_id:0 msgid "Related document model" -msgstr "" +msgstr "Modèle de document associé" #. module: email_template #: help:email.template,email_from:0 @@ -343,12 +345,14 @@ msgid "" "If checked, the user's signature will be appended to the text version of the " "message" msgstr "" +"Si coché, la signature de l'utilisateur sera ajoutée à la version texte du " +"message" #. module: email_template #: view:email.template:0 #: view:email_template.preview:0 msgid "Body (Rich/HTML)" -msgstr "" +msgstr "Corps (riche/HTML)" #. module: email_template #: help:email.template,sub_object:0 @@ -383,7 +387,7 @@ msgstr "" #. module: email_template #: view:email.template:0 msgid "Add sidebar button" -msgstr "" +msgstr "Ajouter un bouton dans la barre latérale" #. module: email_template #: view:email.template:0 @@ -507,6 +511,8 @@ msgid "" "Sidebar action to make this template available on records of the related " "document model" msgstr "" +"Action de la barre latérale pour rendre ce modèle disponible sur les " +"enregistrements associés au modèle de document" #. module: email_template #: field:email.template,model_object_field:0 @@ -596,7 +602,7 @@ msgstr "" #: field:email.template,headers:0 #: field:email_template.preview,headers:0 msgid "Message headers" -msgstr "" +msgstr "En-têtes de message" #. module: email_template #: field:email.template,email_bcc:0 @@ -609,17 +615,18 @@ msgstr "Copie cachée à (BCC)" #: help:email_template.preview,reply_to:0 msgid "Preferred response address (placeholders may be used here)" msgstr "" +"Adresse de réponse préférée (des variables peuvent être utilisées ici)" #. module: email_template #: view:email.template:0 msgid "Remove sidebar button" -msgstr "" +msgstr "Supprimer le bouton de la barre latérale" #. module: email_template #: help:email.template,null_value:0 #: help:email_template.preview,null_value:0 msgid "Optional value to use if the target field is empty" -msgstr "" +msgstr "Valeur facultative à utiliser si le champ cible est vide" #. module: email_template #: view:email.template:0 @@ -631,12 +638,13 @@ msgstr "Modèle" #: help:email_template.preview,references:0 msgid "Message references, such as identifiers of previous messages" msgstr "" +"Références du message, tel que les identifiants des messages précédents" #. module: email_template #: help:email.template,ref_ir_value:0 #: help:email_template.preview,ref_ir_value:0 msgid "Sidebar button to open the sidebar action" -msgstr "" +msgstr "Bouton de la barre latérale pour ouvrir l'action" #. module: email_template #: constraint:res.partner:0 diff --git a/addons/fetchmail_hr_recruitment/i18n/fr.po b/addons/fetchmail_hr_recruitment/i18n/fr.po new file mode 100644 index 00000000000..dd5b0ca99f1 --- /dev/null +++ b/addons/fetchmail_hr_recruitment/i18n/fr.po @@ -0,0 +1,32 @@ +# French translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-03-05 21:49+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-06 04:48+0000\n" +"X-Generator: Launchpad (build 14900)\n" + +#. module: fetchmail_hr_recruitment +#: model:ir.actions.act_window,help:fetchmail_hr_recruitment.action_link_applicant_to_email_account +msgid "" +"You can synchronize the job email account (e.g. job@yourcompany.com) with " +"OpenERP so that new applicants are created automatically in OpenERP for the " +"followup of the recruitment process. Attachments are automatically stored in " +"the DMS of OpenERP so that you get an indexation of all the CVs received." +msgstr "" + +#. module: fetchmail_hr_recruitment +#: model:ir.actions.act_window,name:fetchmail_hr_recruitment.action_link_applicant_to_email_account +msgid "Create Applicants from Email Account" +msgstr "" diff --git a/addons/import_base/i18n/fr.po b/addons/import_base/i18n/fr.po new file mode 100644 index 00000000000..719b4835229 --- /dev/null +++ b/addons/import_base/i18n/fr.po @@ -0,0 +1,100 @@ +# French translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-03-05 21:56+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-06 04:48+0000\n" +"X-Generator: Launchpad (build 14900)\n" + +#. module: import_base +#: code:addons/import_base/import_framework.py:434 +#, python-format +msgid "Import failed due to an unexpected error" +msgstr "" + +#. module: import_base +#: code:addons/import_base/import_framework.py:461 +#, python-format +msgid "started at %s and finished at %s \n" +msgstr "" + +#. module: import_base +#: code:addons/import_base/import_framework.py:448 +#, python-format +msgid "Import of your data finished at %s" +msgstr "" + +#. module: import_base +#: code:addons/import_base/import_framework.py:463 +#, python-format +msgid "" +"but failed, in consequence no data were imported to keep database " +"consistency \n" +" error : \n" +msgstr "" + +#. module: import_base +#: code:addons/import_base/import_framework.py:477 +#, python-format +msgid "" +"The import of data \n" +" instance name : %s \n" +msgstr "" + +#. module: import_base +#: code:addons/import_base/import_framework.py:470 +#, python-format +msgid "%s has been successfully imported from %s %s, %s \n" +msgstr "" + +#. module: import_base +#: code:addons/import_base/import_framework.py:447 +#, python-format +msgid "Data Import failed at %s due to an unexpected error" +msgstr "" + +#. module: import_base +#: code:addons/import_base/import_framework.py:436 +#, python-format +msgid "Import finished, notification email sended" +msgstr "" + +#. module: import_base +#: code:addons/import_base/import_framework.py:190 +#, python-format +msgid "%s is not a valid model name" +msgstr "" + +#. module: import_base +#: model:ir.ui.menu,name:import_base.menu_import_crm +msgid "Import" +msgstr "" + +#. module: import_base +#: code:addons/import_base/import_framework.py:467 +#, python-format +msgid "with no warning" +msgstr "" + +#. module: import_base +#: code:addons/import_base/import_framework.py:469 +#, python-format +msgid "with warning : %s" +msgstr "" + +#. module: import_base +#: code:addons/import_base/import_framework.py:191 +#, python-format +msgid " fields imported : " +msgstr "" diff --git a/addons/import_sugarcrm/i18n/ar.po b/addons/import_sugarcrm/i18n/ar.po new file mode 100644 index 00000000000..b2cff09d700 --- /dev/null +++ b/addons/import_sugarcrm/i18n/ar.po @@ -0,0 +1,404 @@ +# Arabic translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-03-05 11:30+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Arabic \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-06 04:48+0000\n" +"X-Generator: Launchpad (build 14900)\n" + +#. module: import_sugarcrm +#: code:addons/import_sugarcrm/import_sugarcrm.py:1105 +#: code:addons/import_sugarcrm/import_sugarcrm.py:1131 +#, python-format +msgid "Error !!" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "" +"Use the SugarSoap API URL (read tooltip) and a full access SugarCRM login." +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "(Coming Soon)" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,document:0 +msgid "Documents" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "Import your data from SugarCRM :" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "" +"Choose data you want to import. Click 'Import' to get data manually or " +"'Schedule Reccurent Imports' to get recurrently and automatically data." +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,contact:0 +msgid "Contacts" +msgstr "جهات الاتصال" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "HR" +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,bug:0 +msgid "Check this box to import sugarCRM Bugs into OpenERP project issues" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,instance_name:0 +msgid "Instance's Name" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,project_task:0 +msgid "Project Tasks" +msgstr "مهام المشروع" + +#. module: import_sugarcrm +#: field:import.sugarcrm,email_from:0 +msgid "Notify End Of Import To:" +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,user:0 +msgid "" +"Check this box to import sugarCRM Users into OpenERP users, warning if a " +"user with the same login exist in OpenERP, user information will be erase by " +"sugarCRM user information" +msgstr "" + +#. module: import_sugarcrm +#: code:addons/import_sugarcrm/sugarsoap_services.py:23 +#, python-format +msgid "Please install SOAP for python - ZSI-2.0-rc3.tar.gz - python-zci" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "_Schedule Recurrent Imports" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "" +"Do not forget the email address to be notified of the success of the import." +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,call:0 +msgid "Check this box to import sugarCRM Calls into OpenERP calls" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "" +"If you make recurrent or ponctual import, data already in OpenERP will be " +"updated by SugarCRM data." +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,employee:0 +msgid "Employee" +msgstr "الموظف" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "Document" +msgstr "مستند" + +#. module: import_sugarcrm +#: help:import.sugarcrm,document:0 +msgid "Check this box to import sugarCRM Documents into OpenERP documents" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "Import Data From SugarCRM" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "CRM" +msgstr "" + +#. module: import_sugarcrm +#: view:import.message:0 +msgid "" +"Data are importing, the process is running in the background, an email will " +"be sent to the given email address if it was defined." +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,call:0 +msgid "Calls" +msgstr "مكالمات" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "Multi Instance Management" +msgstr "" + +#. module: import_sugarcrm +#: view:import.message:0 +msgid "_Ok" +msgstr "_موافق" + +#. module: import_sugarcrm +#: help:import.sugarcrm,opportunity:0 +msgid "" +"Check this box to import sugarCRM Leads and Opportunities into OpenERP Leads " +"and Opportunities" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,email_history:0 +msgid "Email and Note" +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,url:0 +msgid "" +"Webservice's url where to get the data. example : " +"'http://example.com/sugarcrm/soap.php', or copy the address of your sugarcrm " +"application " +"http://trial.sugarcrm.com/qbquyj4802/index.php?module=Home&action=index" +msgstr "" + +#. module: import_sugarcrm +#: model:ir.actions.act_window,name:import_sugarcrm.action_import_sugarcrm +#: model:ir.ui.menu,name:import_sugarcrm.menu_sugarcrm_import +msgid "Import SugarCRM" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "_Import" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,user:0 +msgid "User" +msgstr "" + +#. module: import_sugarcrm +#: code:addons/import_sugarcrm/import_sugarcrm.py:1105 +#: code:addons/import_sugarcrm/import_sugarcrm.py:1131 +#, python-format +msgid "%s data required %s Module to be installed, Please install %s module" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,claim:0 +msgid "Cases" +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,meeting:0 +msgid "" +"Check this box to import sugarCRM Meetings and Tasks into OpenERP meetings" +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,email_history:0 +msgid "" +"Check this box to import sugarCRM Emails, Notes and Attachments into OpenERP " +"Messages and Attachments" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,project:0 +msgid "Projects" +msgstr "" + +#. module: import_sugarcrm +#: code:addons/import_sugarcrm/sugarsoap_services_types.py:14 +#, python-format +msgid "" +"Please install SOAP for python - ZSI-2.0-rc3.tar.gz from " +"http://pypi.python.org/pypi/ZSI/" +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,project:0 +msgid "Check this box to import sugarCRM Projects into OpenERP projects" +msgstr "" + +#. module: import_sugarcrm +#: code:addons/import_sugarcrm/import_sugarcrm.py:1098 +#: code:addons/import_sugarcrm/import_sugarcrm.py:1124 +#, python-format +msgid "Select Module to Import." +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,meeting:0 +msgid "Meetings" +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,employee:0 +msgid "Check this box to import sugarCRM Employees into OpenERP employees" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,url:0 +msgid "SugarSoap Api url:" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "Address Book" +msgstr "" + +#. module: import_sugarcrm +#: code:addons/import_sugarcrm/sugar.py:60 +#, python-format +msgid "" +"Authentication error !\n" +"Bad Username or Password bad SugarSoap Api url !" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,bug:0 +msgid "Bugs" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "Project" +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,project_task:0 +msgid "Check this box to import sugarCRM Project Tasks into OpenERP tasks" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,opportunity:0 +msgid "Leads & Opp" +msgstr "" + +#. module: import_sugarcrm +#: code:addons/import_sugarcrm/import_sugarcrm.py:79 +#, python-format +msgid "" +"Authentication error !\n" +"Bad Username or Password or bad SugarSoap Api url !" +msgstr "" + +#. module: import_sugarcrm +#: code:addons/import_sugarcrm/import_sugarcrm.py:79 +#: code:addons/import_sugarcrm/sugar.py:60 +#, python-format +msgid "Error !" +msgstr "" + +#. module: import_sugarcrm +#: code:addons/import_sugarcrm/import_sugarcrm.py:1098 +#: code:addons/import_sugarcrm/import_sugarcrm.py:1124 +#, python-format +msgid "Warning !" +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,instance_name:0 +msgid "" +"Prefix of SugarCRM id to differentiate xml_id of SugarCRM models datas come " +"from different server." +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,contact:0 +msgid "Check this box to import sugarCRM Contacts into OpenERP addresses" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,password:0 +msgid "Password" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "Login Information" +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,claim:0 +msgid "Check this box to import sugarCRM Cases into OpenERP claims" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "Email Notification When Import is finished" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,username:0 +msgid "User Name" +msgstr "" + +#. module: import_sugarcrm +#: view:import.message:0 +#: model:ir.model,name:import_sugarcrm.model_import_message +msgid "Import Message" +msgstr "" + +#. module: import_sugarcrm +#: help:import.sugarcrm,account:0 +msgid "Check this box to import sugarCRM Accounts into OpenERP partners" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "Online documentation:" +msgstr "" + +#. module: import_sugarcrm +#: field:import.sugarcrm,account:0 +msgid "Accounts" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "_Cancel" +msgstr "" + +#. module: import_sugarcrm +#: code:addons/import_sugarcrm/sugarsoap_services.py:23 +#: code:addons/import_sugarcrm/sugarsoap_services_types.py:14 +#, python-format +msgid "ZSI Import Error!" +msgstr "" + +#. module: import_sugarcrm +#: model:ir.model,name:import_sugarcrm.model_import_sugarcrm +msgid "Import SugarCRM DATA" +msgstr "" + +#. module: import_sugarcrm +#: view:import.sugarcrm:0 +msgid "Email Address to Notify" +msgstr "" diff --git a/addons/stock/i18n/fr.po b/addons/stock/i18n/fr.po index 6b63aade6f7..b1c945772c4 100644 --- a/addons/stock/i18n/fr.po +++ b/addons/stock/i18n/fr.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-02-08 01:37+0100\n" -"PO-Revision-Date: 2012-02-16 15:22+0000\n" -"Last-Translator: Numérigraphe \n" +"PO-Revision-Date: 2012-03-05 14:29+0000\n" +"Last-Translator: gde (OpenERP) \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: 2012-02-17 04:58+0000\n" -"X-Generator: Launchpad (build 14814)\n" +"X-Launchpad-Export-Date: 2012-03-06 04:48+0000\n" +"X-Generator: Launchpad (build 14900)\n" #. module: stock #: field:stock.inventory.line,product_uom:0 @@ -238,7 +238,7 @@ msgstr "Vous ne pouvez supprimer aucun enregistrement !" #. module: stock #: view:stock.picking:0 msgid "Delivery orders to invoice" -msgstr "" +msgstr "Bons de livraisons à facturer" #. module: stock #: view:stock.picking:0 @@ -392,7 +392,7 @@ msgstr "Mouvements pour ce colis" #. module: stock #: view:stock.picking:0 msgid "Incoming Shipments Available" -msgstr "" +msgstr "Réception disponible" #. module: stock #: selection:report.stock.inventory,location_type:0 @@ -1084,7 +1084,7 @@ msgstr "" #: code:addons/stock/stock.py:1349 #, python-format msgid "is waiting." -msgstr "" +msgstr "est en attente." #. module: stock #: constraint:product.product:0 @@ -1488,7 +1488,7 @@ msgstr "Fournisseurs IT Générique" #. module: stock #: view:stock.move:0 msgid "Stock to be receive" -msgstr "" +msgstr "Stock à recevoir" #. module: stock #: help:stock.location,valuation_out_account_id:0 From 43ab27d7bb6c06f06a19917af24d567716a946ed Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 6 Mar 2012 12:02:12 +0100 Subject: [PATCH 25/39] [FIX] Menu not working anymore after the installation of a module lp bug: https://launchpad.net/bugs/944113 fixed bzr revid: fme@openerp.com-20120306110212-9qd1r0q5t0zwnnt0 --- addons/web/static/src/js/chrome.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 1d465df1cc5..20750f07a4e 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -678,6 +678,11 @@ openerp.web.Menu = openerp.web.Widget.extend(/** @lends openerp.web.Menu# */{ this._super.apply(this, arguments); this.has_been_loaded = $.Deferred(); }, + start: function() { + this._super.apply(this, arguments); + this.$secondary_menus = this.getParent().$element.find('.oe_secondary_menus_container'); + this.$secondary_menus.on('click', 'a[data-menu]', this.on_menu_click); + }, do_reload: function() { var self = this; return this.rpc("/web/menu/load", {}, this.on_loaded).then(function () { @@ -689,11 +694,7 @@ openerp.web.Menu = openerp.web.Widget.extend(/** @lends openerp.web.Menu# */{ on_loaded: function(data) { this.data = data; this.renderElement(); - if (!this.$secondary_menus && this.getParent()) { - // TODO: create Widget openerp.web.SubMenu - this.$secondary_menus = this.getParent().$element.find('.oe_secondary_menus_container'); - this.$element.add(this.$secondary_menus).on('click', 'a[data-menu]', this.on_menu_click); - } + this.$element.on('click', 'a[data-menu]', this.on_menu_click); this.$secondary_menus.html(QWeb.render("Menu.secondary", { widget : this })); // Hide second level submenus this.$secondary_menus.find('.oe_menu_toggler').siblings('.oe_secondary_submenu').hide(); From e4da2447c0c8a476eef1f2687dbc4124bf8e1e4a Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 6 Mar 2012 18:46:20 +0100 Subject: [PATCH 26/39] [FIX] audittrail: don't break execute_kw calls methods, correctly forward keyword arguments bzr revid: xmo@openerp.com-20120306174620-iwfkvgbbhxz2vlcf --- addons/audittrail/audittrail.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py index 302d6e146bd..08bcb1050d1 100644 --- a/addons/audittrail/audittrail.py +++ b/addons/audittrail/audittrail.py @@ -240,7 +240,7 @@ class audittrail_objects_proxy(object_proxy): line_id = log_line_pool.create(cr, uid, vals) return True - def log_fct(self, cr, uid_orig, model, method, fct_src, *args): + def log_fct(self, cr, uid_orig, model, method, fct_src, *args, **kw): """ Logging function: This function is performing the logging operation @param model: Object whose values are being changed @@ -262,12 +262,12 @@ class audittrail_objects_proxy(object_proxy): old_values = new_values = {} if method == 'create': - res = fct_src(cr, uid_orig, model.model, method, *args) + res = fct_src(cr, uid_orig, model.model, method, *args, **kw) if res: res_ids = [res] new_values = self.get_data(cr, uid_orig, pool, res_ids, model, method) elif method == 'read': - res = fct_src(cr, uid_orig, model.model, method, *args) + res = fct_src(cr, uid_orig, model.model, method, *args, **kw) # build the res_ids and the old_values dict. Here we don't use get_data() to # avoid performing an additional read() res_ids = [] @@ -279,7 +279,7 @@ class audittrail_objects_proxy(object_proxy): elif method == 'unlink': res_ids = args[0] old_values = self.get_data(cr, uid_orig, pool, res_ids, model, method) - res = fct_src(cr, uid_orig, model.model, method, *args) + res = fct_src(cr, uid_orig, model.model, method, *args, **kw) else: # method is write, action or workflow action res_ids = [] if args: @@ -290,7 +290,7 @@ class audittrail_objects_proxy(object_proxy): # store the old values into a dictionary old_values = self.get_data(cr, uid_orig, pool, res_ids, model, method) # process the original function, workflow trigger... - res = fct_src(cr, uid_orig, model.model, method, *args) + res = fct_src(cr, uid_orig, model.model, method, *args, **kw) if method == 'copy': res_ids = [res] if res_ids: @@ -491,14 +491,14 @@ class audittrail_objects_proxy(object_proxy): def execute_cr(self, cr, uid, model, method, *args, **kw): fct_src = super(audittrail_objects_proxy, self).execute_cr if self.check_rules(cr,uid,model,method): - return self.log_fct(cr, uid, model, method, fct_src, *args) - return fct_src(cr, uid, model, method, *args) + return self.log_fct(cr, uid, model, method, fct_src, *args, **kw) + return fct_src(cr, uid, model, method, *args, **kw) - def exec_workflow_cr(self, cr, uid, model, method, *args, **argv): + def exec_workflow_cr(self, cr, uid, model, method, *args, **kw): fct_src = super(audittrail_objects_proxy, self).exec_workflow_cr if self.check_rules(cr,uid,model,'workflow'): - return self.log_fct(cr, uid, model, method, fct_src, *args) - return fct_src(cr, uid, model, method, *args) + return self.log_fct(cr, uid, model, method, fct_src, *args, **kw) + return fct_src(cr, uid, model, method, *argsm **kw) audittrail_objects_proxy() From c1e887c9a4d633e29f735226f5734fd95faa1739 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Wed, 7 Mar 2012 05:38:05 +0000 Subject: [PATCH 27/39] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20120307051356-qt4l9psx78mvgfkb bzr revid: launchpad_translations_on_behalf_of_openerp-20120307053805-lwhhzrl94y022bpw --- addons/account_cancel/i18n/gu.po | 23 + addons/account_voucher/i18n/gu.po | 1114 ++++++++++++++++ .../analytic_journal_billing_rate/i18n/gu.po | 79 ++ addons/audittrail/i18n/gu.po | 369 ++++++ addons/base_action_rule/i18n/gu.po | 496 ++++++++ addons/base_contact/i18n/gu.po | 264 ++++ addons/base_vat/i18n/gu.po | 75 ++ addons/document/i18n/gu.po | 1003 +++++++++++++++ addons/google_map/i18n/gu.po | 35 + addons/hr_payroll/i18n/gu.po | 1119 +++++++++++++++++ addons/hr_payroll_account/i18n/gu.po | 140 +++ addons/web_dashboard/i18n/ja.po | 111 ++ addons/web_kanban/i18n/ja.po | 55 + 13 files changed, 4883 insertions(+) create mode 100644 addons/account_cancel/i18n/gu.po create mode 100644 addons/account_voucher/i18n/gu.po create mode 100644 addons/analytic_journal_billing_rate/i18n/gu.po create mode 100644 addons/audittrail/i18n/gu.po create mode 100644 addons/base_action_rule/i18n/gu.po create mode 100644 addons/base_contact/i18n/gu.po create mode 100644 addons/base_vat/i18n/gu.po create mode 100644 addons/document/i18n/gu.po create mode 100644 addons/google_map/i18n/gu.po create mode 100644 addons/hr_payroll/i18n/gu.po create mode 100644 addons/hr_payroll_account/i18n/gu.po create mode 100644 addons/web_dashboard/i18n/ja.po create mode 100644 addons/web_kanban/i18n/ja.po diff --git a/addons/account_cancel/i18n/gu.po b/addons/account_cancel/i18n/gu.po new file mode 100644 index 00000000000..06eb622786e --- /dev/null +++ b/addons/account_cancel/i18n/gu.po @@ -0,0 +1,23 @@ +# Gujarati translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:35+0000\n" +"PO-Revision-Date: 2012-03-06 18:31+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-07 05:13+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. module: account_cancel +#: view:account.invoice:0 +msgid "Cancel" +msgstr "રદ કરો" diff --git a/addons/account_voucher/i18n/gu.po b/addons/account_voucher/i18n/gu.po new file mode 100644 index 00000000000..3ff2de507a6 --- /dev/null +++ b/addons/account_voucher/i18n/gu.po @@ -0,0 +1,1114 @@ +# Gujarati translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 01:37+0100\n" +"PO-Revision-Date: 2012-03-06 18:11+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-07 05:13+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. module: account_voucher +#: view:sale.receipt.report:0 +msgid "last month" +msgstr "પૂર્વ માસ" + +#. module: account_voucher +#: view:account.voucher.unreconcile:0 +msgid "Unreconciliation transactions" +msgstr "" + +#. module: account_voucher +#: code:addons/account_voucher/account_voucher.py:324 +#, python-format +msgid "Write-Off" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Payment Ref" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Total Amount" +msgstr "કુલ રકમ" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Open Customer Journal Entries" +msgstr "" + +#. module: account_voucher +#: code:addons/account_voucher/account_voucher.py:1063 +#, python-format +msgid "" +"You have to configure account base code and account tax code on the '%s' tax!" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 view:sale.receipt.report:0 +msgid "Group By..." +msgstr "ગ્રુપ દ્વારા..." + +#. module: account_voucher +#: code:addons/account_voucher/account_voucher.py:797 +#, python-format +msgid "Cannot delete Voucher(s) which are already opened or paid !" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Supplier" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +#: model:ir.actions.act_window,name:account_voucher.act_pay_bills +msgid "Bill Payment" +msgstr "" + +#. module: account_voucher +#: view:account.statement.from.invoice.lines:0 +#: code:addons/account_voucher/wizard/account_statement_from_invoice.py:181 +#: model:ir.actions.act_window,name:account_voucher.action_view_account_statement_from_invoice_lines +#, python-format +msgid "Import Entries" +msgstr "" + +#. module: account_voucher +#: model:ir.model,name:account_voucher.model_account_voucher_unreconcile +msgid "Account voucher unreconcile" +msgstr "" + +#. module: account_voucher +#: selection:sale.receipt.report,month:0 +msgid "March" +msgstr "માર્ચ" + +#. module: account_voucher +#: model:ir.actions.act_window,help:account_voucher.action_sale_receipt +msgid "" +"When you sell products to a customer, you can give him a sales receipt or an " +"invoice. When the sales receipt is confirmed, it creates journal items " +"automatically and you can record the customer payment related to this sales " +"receipt." +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Pay Bill" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,company_id:0 field:account.voucher.line,company_id:0 +#: view:sale.receipt.report:0 field:sale.receipt.report,company_id:0 +msgid "Company" +msgstr "કંપની" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Set to Draft" +msgstr "" + +#. module: account_voucher +#: help:account.voucher,reference:0 +msgid "Transaction reference number." +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 +msgid "Group by year of Invoice Date" +msgstr "" + +#. module: account_voucher +#: model:ir.actions.act_window,name:account_voucher.action_view_account_voucher_unreconcile +msgid "Unreconcile entries" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Voucher Statistics" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Validate" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 field:sale.receipt.report,day:0 +msgid "Day" +msgstr "દિવસ" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Search Vouchers" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,writeoff_acc_id:0 +msgid "Counterpart Account" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,account_id:0 field:account.voucher.line,account_id:0 +#: field:sale.receipt.report,account_id:0 +msgid "Account" +msgstr "ખાતું" + +#. module: account_voucher +#: field:account.voucher,line_dr_ids:0 +msgid "Debits" +msgstr "" + +#. module: account_voucher +#: view:account.statement.from.invoice.lines:0 +msgid "Ok" +msgstr "બરાબર" + +#. module: account_voucher +#: field:account.voucher.line,reconcile:0 +msgid "Full Reconcile" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,date_due:0 field:account.voucher.line,date_due:0 +#: view:sale.receipt.report:0 field:sale.receipt.report,date_due:0 +msgid "Due Date" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,narration:0 +msgid "Notes" +msgstr "નોંધ" + +#. module: account_voucher +#: model:ir.actions.act_window,help:account_voucher.action_vendor_receipt +msgid "" +"Sales payment allows you to register the payments you receive from your " +"customers. In order to record a payment, you must enter the customer, the " +"payment method (=the journal) and the payment amount. OpenERP will propose " +"to you automatically the reconciliation of this payment with the open " +"invoices or sales receipts." +msgstr "" + +#. module: account_voucher +#: selection:account.voucher,type:0 selection:sale.receipt.report,type:0 +msgid "Sale" +msgstr "" + +#. module: account_voucher +#: field:account.voucher.line,move_line_id:0 +msgid "Journal Item" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,is_multi_currency:0 +msgid "Multi Currency Voucher" +msgstr "" + +#. module: account_voucher +#: field:account.voucher.line,amount:0 +msgid "Amount" +msgstr "કિંમત" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Payment Options" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Other Information" +msgstr "" + +#. module: account_voucher +#: selection:account.voucher,state:0 selection:sale.receipt.report,state:0 +msgid "Cancelled" +msgstr "રદ થયેલ" + +#. module: account_voucher +#: field:account.statement.from.invoice,date:0 +msgid "Date payment" +msgstr "" + +#. module: account_voucher +#: model:ir.model,name:account_voucher.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 view:account.voucher.unreconcile:0 +msgid "Unreconcile" +msgstr "" + +#. module: account_voucher +#: constraint:account.invoice:0 +msgid "Invalid BBA Structured Communication !" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,tax_id:0 +msgid "Tax" +msgstr "" + +#. module: account_voucher +#: constraint:account.bank.statement:0 +msgid "The journal and period chosen have to belong to the same company." +msgstr "" + +#. module: account_voucher +#: field:account.voucher,comment:0 +msgid "Counterpart Comment" +msgstr "" + +#. module: account_voucher +#: field:account.voucher.line,account_analytic_id:0 +msgid "Analytic Account" +msgstr "વિશ્લેષણાત્મક ખાતું" + +#. module: account_voucher +#: code:addons/account_voucher/account_voucher.py:927 +#: code:addons/account_voucher/account_voucher.py:931 +#, python-format +msgid "Warning" +msgstr "ચેતવણી" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Payment Information" +msgstr "" + +#. module: account_voucher +#: view:account.statement.from.invoice:0 +msgid "Go" +msgstr "જાઓ" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Paid Amount" +msgstr "" + +#. module: account_voucher +#: view:account.bank.statement:0 +msgid "Import Invoices" +msgstr "" + +#. module: account_voucher +#: selection:account.voucher,pay_now:0 selection:sale.receipt.report,pay_now:0 +msgid "Pay Later or Group Funds" +msgstr "" + +#. module: account_voucher +#: help:account.voucher,writeoff_amount:0 +msgid "" +"Computed as the difference between the amount stated in the voucher and the " +"sum of allocation on the voucher lines." +msgstr "" + +#. module: account_voucher +#: selection:account.voucher,type:0 selection:sale.receipt.report,type:0 +msgid "Receipt" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Sales Lines" +msgstr "" + +#. module: account_voucher +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 +msgid "current month" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 field:account.voucher,period_id:0 +msgid "Period" +msgstr "અવધિ" + +#. module: account_voucher +#: view:account.voucher:0 field:account.voucher,state:0 +#: view:sale.receipt.report:0 +msgid "State" +msgstr "સ્થિતિ" + +#. module: account_voucher +#: selection:account.voucher.line,type:0 +msgid "Debit" +msgstr "ઉધાર" + +#. module: account_voucher +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 field:sale.receipt.report,nbr:0 +msgid "# of Voucher Lines" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 field:sale.receipt.report,type:0 +msgid "Type" +msgstr "પ્રકાર" + +#. module: account_voucher +#: field:account.voucher.unreconcile,remove:0 +msgid "Want to remove accounting entries too ?" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 +msgid "Pro-forma Vouchers" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open +msgid "Voucher Entries" +msgstr "" + +#. module: account_voucher +#: code:addons/account_voucher/account_voucher.py:462 +#: code:addons/account_voucher/account_voucher.py:894 +#, python-format +msgid "Error !" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Supplier Voucher" +msgstr "" + +#. module: account_voucher +#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list +msgid "Vouchers Entries" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,name:0 +msgid "Memo" +msgstr "મેમો" + +#. module: account_voucher +#: view:account.invoice:0 code:addons/account_voucher/invoice.py:32 +#, python-format +msgid "Pay Invoice" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Are you sure to unreconcile and cancel this record ?" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt +#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt +msgid "Sales Receipt" +msgstr "" + +#. module: account_voucher +#: code:addons/account_voucher/account_voucher.py:797 +#, python-format +msgid "Invalid action !" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Bill Information" +msgstr "" + +#. module: account_voucher +#: selection:sale.receipt.report,month:0 +msgid "July" +msgstr "જુલાઈ" + +#. module: account_voucher +#: view:account.voucher.unreconcile:0 +msgid "Unreconciliation" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,writeoff_amount:0 +msgid "Difference Amount" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 field:sale.receipt.report,due_delay:0 +msgid "Avg. Due Delay" +msgstr "" + +#. module: account_voucher +#: field:res.company,income_currency_exchange_account_id:0 +msgid "Income Currency Rate" +msgstr "" + +#. module: account_voucher +#: code:addons/account_voucher/account_voucher.py:1063 +#, python-format +msgid "No Account Base Code and Account Tax Code!" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,tax_amount:0 +msgid "Tax Amount" +msgstr "જકાતી રકમ" + +#. module: account_voucher +#: view:sale.receipt.report:0 +msgid "Validated Vouchers" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,line_ids:0 view:account.voucher.line:0 +#: model:ir.model,name:account_voucher.model_account_voucher_line +msgid "Voucher Lines" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Voucher Entry" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 field:account.voucher,partner_id:0 +#: field:account.voucher.line,partner_id:0 view:sale.receipt.report:0 +#: field:sale.receipt.report,partner_id:0 +msgid "Partner" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,payment_option:0 +msgid "Payment Difference" +msgstr "" + +#. module: account_voucher +#: constraint:account.bank.statement.line:0 +msgid "" +"The amount of the voucher must be the same amount as the one on the " +"statement line" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 field:account.voucher,audit:0 +msgid "To Review" +msgstr "" + +#. module: account_voucher +#: code:addons/account_voucher/account_voucher.py:938 +#: code:addons/account_voucher/account_voucher.py:952 +#: code:addons/account_voucher/account_voucher.py:1103 +#, python-format +msgid "change" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Expense Lines" +msgstr "" + +#. module: account_voucher +#: help:account.voucher,is_multi_currency:0 +msgid "" +"Fields with internal purpose only that depicts if the voucher is a multi " +"currency one or not" +msgstr "" + +#. module: account_voucher +#: field:account.statement.from.invoice,line_ids:0 +#: field:account.statement.from.invoice.lines,line_ids:0 +msgid "Invoices" +msgstr "" + +#. module: account_voucher +#: selection:sale.receipt.report,month:0 +msgid "December" +msgstr "ડિસેમ્બર" + +#. module: account_voucher +#: view:sale.receipt.report:0 +msgid "Group by month of Invoice Date" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 field:sale.receipt.report,month:0 +msgid "Month" +msgstr "મહિનો" + +#. module: account_voucher +#: field:account.voucher,currency_id:0 +#: field:account.voucher.line,currency_id:0 +#: field:sale.receipt.report,currency_id:0 +msgid "Currency" +msgstr "ચલણ" + +#. module: account_voucher +#: view:account.statement.from.invoice.lines:0 +msgid "Payable and Receivables" +msgstr "" + +#. module: account_voucher +#: model:ir.actions.act_window,help:account_voucher.action_vendor_payment +msgid "" +"The supplier payment form allows you to track the payment you do to your " +"suppliers. When you select a supplier, the payment method and an amount for " +"the payment, OpenERP will propose to reconcile your payment with the open " +"supplier invoices or bills." +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 field:sale.receipt.report,user_id:0 +msgid "Salesman" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 field:sale.receipt.report,delay_to_pay:0 +msgid "Avg. Delay To Pay" +msgstr "" + +#. module: account_voucher +#: help:account.voucher,paid:0 +msgid "The Voucher has been totally paid." +msgstr "" + +#. module: account_voucher +#: selection:account.voucher,payment_option:0 +msgid "Reconcile Payment Balance" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 selection:account.voucher,state:0 +#: view:sale.receipt.report:0 selection:sale.receipt.report,state:0 +msgid "Draft" +msgstr "ડ્રાફ્ટ" + +#. module: account_voucher +#: code:addons/account_voucher/account_voucher.py:927 +#, python-format +msgid "" +"Unable to create accounting entry for currency rate difference. You have to " +"configure the field 'Income Currency Rate' on the company! " +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 view:sale.receipt.report:0 +msgid "Draft Vouchers" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 field:sale.receipt.report,price_total_tax:0 +msgid "Total With Tax" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Allocation" +msgstr "ફાળવણી" + +#. module: account_voucher +#: selection:sale.receipt.report,month:0 +msgid "August" +msgstr "ઑગસ્ટ" + +#. module: account_voucher +#: help:account.voucher,audit:0 +msgid "" +"Check this box if you are unsure of that journal entry and if you want to " +"note it as 'to be reviewed' by an accounting expert." +msgstr "" + +#. module: account_voucher +#: selection:sale.receipt.report,month:0 +msgid "October" +msgstr "ઑક્ટોબર" + +#. module: account_voucher +#: selection:sale.receipt.report,month:0 +msgid "June" +msgstr "જૂન" + +#. module: account_voucher +#: field:account.voucher,payment_rate_currency_id:0 +msgid "Payment Rate Currency" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,paid:0 +msgid "Paid" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Payment Terms" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Are you sure to unreconcile this record ?" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,date:0 field:account.voucher.line,date_original:0 +#: field:sale.receipt.report,date:0 +msgid "Date" +msgstr "તારીખ" + +#. module: account_voucher +#: selection:sale.receipt.report,month:0 +msgid "November" +msgstr "નવેમ્બર" + +#. module: account_voucher +#: view:sale.receipt.report:0 +msgid "Extended Filters..." +msgstr "" + +#. module: account_voucher +#: field:account.voucher,paid_amount_in_company_currency:0 +msgid "Paid Amount in Company Currency" +msgstr "" + +#. module: account_voucher +#: field:account.bank.statement.line,amount_reconciled:0 +msgid "Amount reconciled" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,analytic_id:0 +msgid "Write-Off Analytic Account" +msgstr "" + +#. module: account_voucher +#: selection:account.voucher,pay_now:0 selection:sale.receipt.report,pay_now:0 +msgid "Pay Directly" +msgstr "" + +#. module: account_voucher +#: field:account.voucher.line,type:0 +msgid "Dr/Cr" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,pre_line:0 +msgid "Previous Payments ?" +msgstr "" + +#. module: account_voucher +#: selection:sale.receipt.report,month:0 +msgid "January" +msgstr "જાન્યુઆરી" + +#. module: account_voucher +#: model:ir.actions.act_window,name:account_voucher.action_voucher_list +#: model:ir.ui.menu,name:account_voucher.menu_encode_entries_by_voucher +msgid "Journal Vouchers" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Compute Tax" +msgstr "" + +#. module: account_voucher +#: model:ir.model,name:account_voucher.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_voucher +#: code:addons/account_voucher/account_voucher.py:462 +#, python-format +msgid "Please define default credit/debit accounts on the journal \"%s\" !" +msgstr "" + +#. module: account_voucher +#: selection:account.voucher.line,type:0 +msgid "Credit" +msgstr "જમા" + +#. module: account_voucher +#: code:addons/account_voucher/account_voucher.py:895 +#, python-format +msgid "Please define a sequence on the journal !" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Open Supplier Journal Entries" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Total Allocation" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 +msgid "Group by Invoice Date" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Post" +msgstr "લેખ" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Invoices and outstanding transactions" +msgstr "" + +#. module: account_voucher +#: field:res.company,expense_currency_exchange_account_id:0 +msgid "Expense Currency Rate" +msgstr "" + +#. module: account_voucher +#: sql_constraint:account.invoice:0 +msgid "Invoice Number must be unique per Company!" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 field:sale.receipt.report,price_total:0 +msgid "Total Without Tax" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Bill Date" +msgstr "" + +#. module: account_voucher +#: help:account.voucher,state:0 +msgid "" +" * The 'Draft' state is used when a user is encoding a new and unconfirmed " +"Voucher. \n" +"* The 'Pro-forma' when voucher is in Pro-forma state,voucher does not have " +"an voucher number. \n" +"* The 'Posted' state is used when user create voucher,a voucher number is " +"generated and voucher entries are created in account " +"\n" +"* The 'Cancelled' state is used when user cancel voucher." +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +#: model:ir.model,name:account_voucher.model_account_voucher +msgid "Accounting Voucher" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,number:0 +msgid "Number" +msgstr "ક્રમ" + +#. module: account_voucher +#: model:ir.model,name:account_voucher.model_account_bank_statement +msgid "Bank Statement" +msgstr "" + +#. module: account_voucher +#: selection:sale.receipt.report,month:0 +msgid "September" +msgstr "સપ્ટેમ્બર" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Sales Information" +msgstr "" + +#. module: account_voucher +#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt_report_all +#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt_report_all +#: view:sale.receipt.report:0 +msgid "Sales Receipt Analysis" +msgstr "" + +#. module: account_voucher +#: field:account.voucher.line,voucher_id:0 +#: model:res.request.link,name:account_voucher.req_link_voucher +msgid "Voucher" +msgstr "" + +#. module: account_voucher +#: model:ir.model,name:account_voucher.model_account_invoice +msgid "Invoice" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Voucher Items" +msgstr "" + +#. module: account_voucher +#: view:account.statement.from.invoice:0 +#: view:account.statement.from.invoice.lines:0 view:account.voucher:0 +#: view:account.voucher.unreconcile:0 +msgid "Cancel" +msgstr "રદ કરો" + +#. module: account_voucher +#: selection:account.voucher,state:0 view:sale.receipt.report:0 +#: selection:sale.receipt.report,state:0 +msgid "Pro-forma" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 field:account.voucher,move_ids:0 +msgid "Journal Items" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +#: model:ir.actions.act_window,name:account_voucher.act_pay_voucher +#: model:ir.actions.act_window,name:account_voucher.action_vendor_receipt +#: model:ir.ui.menu,name:account_voucher.menu_action_vendor_receipt +msgid "Customer Payment" +msgstr "" + +#. module: account_voucher +#: view:account.statement.from.invoice:0 +#: model:ir.actions.act_window,name:account_voucher.action_view_account_statement_from_invoice +msgid "Import Invoices in Statement" +msgstr "" + +#. module: account_voucher +#: selection:account.voucher,type:0 selection:sale.receipt.report,type:0 +msgid "Purchase" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Pay" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 +msgid "year" +msgstr "વર્ષ" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Currency Options" +msgstr "" + +#. module: account_voucher +#: help:account.voucher,payment_option:0 +msgid "" +"This field helps you to choose what you want to do with the eventual " +"difference between the paid amount and the sum of allocated amounts. You can " +"either choose to keep open this difference on the partner's account, or " +"reconcile it with the payment(s)" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Are you sure to confirm this record ?" +msgstr "" + +#. module: account_voucher +#: model:ir.actions.act_window,help:account_voucher.action_sale_receipt_report_all +msgid "" +"From this report, you can have an overview of the amount invoiced to your " +"customer as well as payment delays. The tool search can also be used to " +"personalise your Invoices reports and so, match this analysis to your needs." +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Posted Vouchers" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,payment_rate:0 +msgid "Exchange Rate" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Payment Method" +msgstr "" + +#. module: account_voucher +#: field:account.voucher.line,name:0 +msgid "Description" +msgstr "વર્ણન" + +#. module: account_voucher +#: selection:sale.receipt.report,month:0 +msgid "May" +msgstr "મે" + +#. module: account_voucher +#: field:account.statement.from.invoice,journal_ids:0 view:account.voucher:0 +#: field:account.voucher,journal_id:0 view:sale.receipt.report:0 +#: field:sale.receipt.report,journal_id:0 +msgid "Journal" +msgstr "રોજનામું" + +#. module: account_voucher +#: model:ir.actions.act_window,name:account_voucher.action_vendor_payment +#: model:ir.ui.menu,name:account_voucher.menu_action_vendor_payment +msgid "Supplier Payment" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Internal Notes" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 field:account.voucher,line_cr_ids:0 +msgid "Credits" +msgstr "" + +#. module: account_voucher +#: field:account.voucher.line,amount_original:0 +msgid "Original Amount" +msgstr "" + +#. module: account_voucher +#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt +#: model:ir.ui.menu,name:account_voucher.menu_action_purchase_receipt +msgid "Purchase Receipt" +msgstr "" + +#. module: account_voucher +#: help:account.voucher,payment_rate:0 +msgid "" +"The specific rate that will be used, in this voucher, between the selected " +"currency (in 'Payment Rate Currency' field) and the voucher currency." +msgstr "" + +#. module: account_voucher +#: field:account.bank.statement.line,voucher_id:0 view:account.invoice:0 +#: field:account.voucher,pay_now:0 selection:account.voucher,type:0 +#: field:sale.receipt.report,pay_now:0 selection:sale.receipt.report,type:0 +msgid "Payment" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 selection:account.voucher,state:0 +#: view:sale.receipt.report:0 selection:sale.receipt.report,state:0 +msgid "Posted" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Customer" +msgstr "" + +#. module: account_voucher +#: selection:sale.receipt.report,month:0 +msgid "February" +msgstr "ફેબ્રુઆરી" + +#. module: account_voucher +#: view:account.voucher:0 +msgid "Supplier Invoices and Outstanding transactions" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 +msgid "Month-1" +msgstr "" + +#. module: account_voucher +#: selection:sale.receipt.report,month:0 +msgid "April" +msgstr "એપ્રિલ" + +#. module: account_voucher +#: help:account.voucher,tax_id:0 +msgid "Only for tax excluded from price" +msgstr "" + +#. module: account_voucher +#: code:addons/account_voucher/account_voucher.py:931 +#, python-format +msgid "" +"Unable to create accounting entry for currency rate difference. You have to " +"configure the field 'Expense Currency Rate' on the company! " +msgstr "" + +#. module: account_voucher +#: field:account.voucher,type:0 +msgid "Default Type" +msgstr "" + +#. module: account_voucher +#: model:ir.model,name:account_voucher.model_account_statement_from_invoice +#: model:ir.model,name:account_voucher.model_account_statement_from_invoice_lines +msgid "Entries by Statement from Invoices" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,move_id:0 +msgid "Account Entry" +msgstr "" + +#. module: account_voucher +#: field:account.voucher,reference:0 +msgid "Ref #" +msgstr "" + +#. module: account_voucher +#: field:sale.receipt.report,state:0 +msgid "Voucher State" +msgstr "" + +#. module: account_voucher +#: help:account.voucher,date:0 +msgid "Effective date for accounting entries" +msgstr "" + +#. module: account_voucher +#: selection:account.voucher,payment_option:0 +msgid "Keep Open" +msgstr "" + +#. module: account_voucher +#: view:account.voucher.unreconcile:0 +msgid "" +"If you unreconciliate transactions, you must also verify all the actions " +"that are linked to those transactions because they will not be disable" +msgstr "" + +#. module: account_voucher +#: field:account.voucher.line,untax_amount:0 +msgid "Untax Amount" +msgstr "" + +#. module: account_voucher +#: model:ir.model,name:account_voucher.model_sale_receipt_report +msgid "Sales Receipt Statistics" +msgstr "" + +#. module: account_voucher +#: view:sale.receipt.report:0 field:sale.receipt.report,year:0 +msgid "Year" +msgstr "વર્ષ" + +#. module: account_voucher +#: field:account.voucher.line,amount_unreconciled:0 +msgid "Open Balance" +msgstr "" + +#. module: account_voucher +#: view:account.voucher:0 field:account.voucher,amount:0 +msgid "Total" +msgstr "કુલ" diff --git a/addons/analytic_journal_billing_rate/i18n/gu.po b/addons/analytic_journal_billing_rate/i18n/gu.po new file mode 100644 index 00000000000..c8034ae4d0c --- /dev/null +++ b/addons/analytic_journal_billing_rate/i18n/gu.po @@ -0,0 +1,79 @@ +# Gujarati translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:35+0000\n" +"PO-Revision-Date: 2012-03-06 18:22+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-07 05:13+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. module: analytic_journal_billing_rate +#: sql_constraint:account.invoice:0 +msgid "Invoice Number must be unique per Company!" +msgstr "" + +#. module: analytic_journal_billing_rate +#: field:analytic_journal_rate_grid,journal_id:0 +msgid "Analytic Journal" +msgstr "" + +#. module: analytic_journal_billing_rate +#: constraint:account.invoice:0 +msgid "Invalid BBA Structured Communication !" +msgstr "" + +#. module: analytic_journal_billing_rate +#: view:analytic_journal_rate_grid:0 +msgid "Billing Rate per Journal for this Analytic Account" +msgstr "" + +#. module: analytic_journal_billing_rate +#: field:analytic_journal_rate_grid,account_id:0 +#: model:ir.model,name:analytic_journal_billing_rate.model_account_analytic_account +msgid "Analytic Account" +msgstr "વિશ્લેષણાત્મક ખાતું" + +#. module: analytic_journal_billing_rate +#: model:ir.model,name:analytic_journal_billing_rate.model_analytic_journal_rate_grid +msgid "Relation table between journals and billing rates" +msgstr "" + +#. module: analytic_journal_billing_rate +#: field:account.analytic.account,journal_rate_ids:0 +msgid "Invoicing Rate per Journal" +msgstr "" + +#. module: analytic_journal_billing_rate +#: model:ir.model,name:analytic_journal_billing_rate.model_account_invoice +msgid "Invoice" +msgstr "" + +#. module: analytic_journal_billing_rate +#: constraint:hr.analytic.timesheet:0 +msgid "You cannot modify an entry in a Confirmed/Done timesheet !." +msgstr "" + +#. module: analytic_journal_billing_rate +#: field:analytic_journal_rate_grid,rate_id:0 +msgid "Invoicing Rate" +msgstr "" + +#. module: analytic_journal_billing_rate +#: constraint:account.analytic.account:0 +msgid "Error! You can not create recursive analytic accounts." +msgstr "ત્રુટિ! તમે અંદરોઅંદર વિશ્લેષણાત્મક ખાતાઓ ન બનાવી શકો." + +#. module: analytic_journal_billing_rate +#: model:ir.model,name:analytic_journal_billing_rate.model_hr_analytic_timesheet +msgid "Timesheet Line" +msgstr "" diff --git a/addons/audittrail/i18n/gu.po b/addons/audittrail/i18n/gu.po new file mode 100644 index 00000000000..abe5302809e --- /dev/null +++ b/addons/audittrail/i18n/gu.po @@ -0,0 +1,369 @@ +# Gujarati translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-03-06 18:11+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-07 05:13+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. module: audittrail +#: code:addons/audittrail/audittrail.py:75 +#, python-format +msgid "WARNING: audittrail is not part of the pool" +msgstr "" + +#. module: audittrail +#: field:audittrail.log.line,log_id:0 +msgid "Log" +msgstr "લોગ" + +#. module: audittrail +#: view:audittrail.rule:0 +#: selection:audittrail.rule,state:0 +msgid "Subscribed" +msgstr "ઉમેદવારી" + +#. module: audittrail +#: sql_constraint:audittrail.rule:0 +msgid "" +"There is already a rule defined on this object\n" +" You cannot define another: please edit the existing one." +msgstr "" + +#. module: audittrail +#: view:audittrail.rule:0 +msgid "Subscribed Rule" +msgstr "" + +#. module: audittrail +#: model:ir.model,name:audittrail.model_audittrail_rule +msgid "Audittrail Rule" +msgstr "" + +#. module: audittrail +#: view:audittrail.view.log:0 +#: model:ir.actions.act_window,name:audittrail.action_audittrail_log_tree +#: model:ir.ui.menu,name:audittrail.menu_action_audittrail_log_tree +msgid "Audit Logs" +msgstr "" + +#. module: audittrail +#: view:audittrail.log:0 +#: view:audittrail.rule:0 +msgid "Group By..." +msgstr "ગ્રુપ દ્વારા..." + +#. module: audittrail +#: view:audittrail.rule:0 +#: field:audittrail.rule,state:0 +msgid "State" +msgstr "સ્થિતિ" + +#. module: audittrail +#: view:audittrail.rule:0 +msgid "_Subscribe" +msgstr "ઉમેદવારી કરો (_S)" + +#. module: audittrail +#: view:audittrail.rule:0 +#: selection:audittrail.rule,state:0 +msgid "Draft" +msgstr "ડ્રાફ્ટ" + +#. module: audittrail +#: field:audittrail.log.line,old_value:0 +msgid "Old Value" +msgstr "" + +#. module: audittrail +#: model:ir.actions.act_window,name:audittrail.action_audittrail_view_log +msgid "View log" +msgstr "" + +#. module: audittrail +#: help:audittrail.rule,log_read:0 +msgid "" +"Select this if you want to keep track of read/open on any record of the " +"object of this rule" +msgstr "" + +#. module: audittrail +#: field:audittrail.log,method:0 +msgid "Method" +msgstr "પદ્દત્તિ" + +#. module: audittrail +#: field:audittrail.view.log,from:0 +msgid "Log From" +msgstr "" + +#. module: audittrail +#: field:audittrail.log.line,log:0 +msgid "Log ID" +msgstr "" + +#. module: audittrail +#: field:audittrail.log,res_id:0 +msgid "Resource Id" +msgstr "" + +#. module: audittrail +#: help:audittrail.rule,user_id:0 +msgid "if User is not added then it will applicable for all users" +msgstr "" + +#. module: audittrail +#: help:audittrail.rule,log_workflow:0 +msgid "" +"Select this if you want to keep track of workflow on any record of the " +"object of this rule" +msgstr "" + +#. module: audittrail +#: field:audittrail.rule,user_id:0 +msgid "Users" +msgstr "વપરાશકર્તાઓ" + +#. module: audittrail +#: view:audittrail.log:0 +msgid "Log Lines" +msgstr "" + +#. module: audittrail +#: view:audittrail.log:0 +#: field:audittrail.log,object_id:0 +#: field:audittrail.rule,object_id:0 +msgid "Object" +msgstr "વસ્તુ" + +#. module: audittrail +#: view:audittrail.rule:0 +msgid "AuditTrail Rule" +msgstr "" + +#. module: audittrail +#: field:audittrail.view.log,to:0 +msgid "Log To" +msgstr "" + +#. module: audittrail +#: view:audittrail.log:0 +msgid "New Value Text: " +msgstr "" + +#. module: audittrail +#: view:audittrail.rule:0 +msgid "Search Audittrail Rule" +msgstr "" + +#. module: audittrail +#: model:ir.actions.act_window,name:audittrail.action_audittrail_rule_tree +#: model:ir.ui.menu,name:audittrail.menu_action_audittrail_rule_tree +msgid "Audit Rules" +msgstr "" + +#. module: audittrail +#: view:audittrail.log:0 +msgid "Old Value : " +msgstr "" + +#. module: audittrail +#: field:audittrail.log,name:0 +msgid "Resource Name" +msgstr "" + +#. module: audittrail +#: view:audittrail.log:0 +#: field:audittrail.log,timestamp:0 +msgid "Date" +msgstr "તારીખ" + +#. module: audittrail +#: help:audittrail.rule,log_write:0 +msgid "" +"Select this if you want to keep track of modification on any record of the " +"object of this rule" +msgstr "" + +#. module: audittrail +#: field:audittrail.rule,log_create:0 +msgid "Log Creates" +msgstr "" + +#. module: audittrail +#: help:audittrail.rule,object_id:0 +msgid "Select object for which you want to generate log." +msgstr "" + +#. module: audittrail +#: view:audittrail.log:0 +msgid "Old Value Text : " +msgstr "" + +#. module: audittrail +#: field:audittrail.rule,log_workflow:0 +msgid "Log Workflow" +msgstr "" + +#. module: audittrail +#: field:audittrail.rule,log_read:0 +msgid "Log Reads" +msgstr "" + +#. module: audittrail +#: code:addons/audittrail/audittrail.py:76 +#, python-format +msgid "Change audittrail depends -- Setting rule as DRAFT" +msgstr "" + +#. module: audittrail +#: field:audittrail.log,line_ids:0 +msgid "Log lines" +msgstr "" + +#. module: audittrail +#: field:audittrail.log.line,field_id:0 +msgid "Fields" +msgstr "" + +#. module: audittrail +#: view:audittrail.rule:0 +msgid "AuditTrail Rules" +msgstr "" + +#. module: audittrail +#: help:audittrail.rule,log_unlink:0 +msgid "" +"Select this if you want to keep track of deletion on any record of the " +"object of this rule" +msgstr "" + +#. module: audittrail +#: view:audittrail.log:0 +#: field:audittrail.log,user_id:0 +msgid "User" +msgstr "વપરાશકર્તા" + +#. module: audittrail +#: field:audittrail.rule,action_id:0 +msgid "Action ID" +msgstr "" + +#. module: audittrail +#: view:audittrail.rule:0 +msgid "Users (if User is not added then it will applicable for all users)" +msgstr "" + +#. module: audittrail +#: view:audittrail.rule:0 +msgid "UnSubscribe" +msgstr "" + +#. module: audittrail +#: field:audittrail.rule,log_unlink:0 +msgid "Log Deletes" +msgstr "" + +#. module: audittrail +#: field:audittrail.log.line,field_description:0 +msgid "Field Description" +msgstr "" + +#. module: audittrail +#: view:audittrail.log:0 +msgid "Search Audittrail Log" +msgstr "" + +#. module: audittrail +#: field:audittrail.rule,log_write:0 +msgid "Log Writes" +msgstr "" + +#. module: audittrail +#: view:audittrail.view.log:0 +msgid "Open Logs" +msgstr "" + +#. module: audittrail +#: field:audittrail.log.line,new_value_text:0 +msgid "New value Text" +msgstr "" + +#. module: audittrail +#: field:audittrail.rule,name:0 +msgid "Rule Name" +msgstr "" + +#. module: audittrail +#: field:audittrail.log.line,new_value:0 +msgid "New Value" +msgstr "" + +#. module: audittrail +#: view:audittrail.log:0 +msgid "AuditTrail Logs" +msgstr "" + +#. module: audittrail +#: view:audittrail.rule:0 +msgid "Draft Rule" +msgstr "" + +#. module: audittrail +#: model:ir.model,name:audittrail.model_audittrail_log +msgid "Audittrail Log" +msgstr "" + +#. module: audittrail +#: help:audittrail.rule,log_action:0 +msgid "" +"Select this if you want to keep track of actions on the object of this rule" +msgstr "" + +#. module: audittrail +#: view:audittrail.log:0 +msgid "New Value : " +msgstr "" + +#. module: audittrail +#: field:audittrail.log.line,old_value_text:0 +msgid "Old value Text" +msgstr "" + +#. module: audittrail +#: view:audittrail.view.log:0 +msgid "Cancel" +msgstr "રદ કરો" + +#. module: audittrail +#: model:ir.model,name:audittrail.model_audittrail_view_log +msgid "View Log" +msgstr "લોગ જુઓ" + +#. module: audittrail +#: model:ir.model,name:audittrail.model_audittrail_log_line +msgid "Log Line" +msgstr "" + +#. module: audittrail +#: field:audittrail.rule,log_action:0 +msgid "Log Action" +msgstr "" + +#. module: audittrail +#: help:audittrail.rule,log_create:0 +msgid "" +"Select this if you want to keep track of creation on any record of the " +"object of this rule" +msgstr "" diff --git a/addons/base_action_rule/i18n/gu.po b/addons/base_action_rule/i18n/gu.po new file mode 100644 index 00000000000..eb5594f2167 --- /dev/null +++ b/addons/base_action_rule/i18n/gu.po @@ -0,0 +1,496 @@ +# Gujarati translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-03-06 18:15+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-07 05:13+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. module: base_action_rule +#: help:base.action.rule,act_mail_to_user:0 +msgid "" +"Check this if you want the rule to send an email to the responsible person." +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_remind_partner:0 +msgid "Remind Partner" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_partner_categ_id:0 +msgid "Partner Category" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_mail_to_watchers:0 +msgid "Mail to Watchers (CC)" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_state_to:0 +msgid "Button Pressed" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,model_id:0 +msgid "Object" +msgstr "વસ્તુ" + +#. module: base_action_rule +#: field:base.action.rule,act_mail_to_email:0 +msgid "Mail to these Emails" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_state:0 +msgid "Set State to" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_email_from:0 +msgid "Email From" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Email Body" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_range_type:0 +msgid "Days" +msgstr "દિવસો" + +#. module: base_action_rule +#: field:base.action.rule,last_run:0 +msgid "Last Run" +msgstr "" + +#. module: base_action_rule +#: code:addons/base_action_rule/base_action_rule.py:328 +#, python-format +msgid "Error!" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_reply_to:0 +msgid "Reply-To" +msgstr "ને જવાબ આપો" + +#. module: base_action_rule +#: help:base.action.rule,act_email_cc:0 +msgid "" +"These people will receive a copy of the future communication between partner " +"and users by email" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_range_type:0 +msgid "Minutes" +msgstr "મિનીટો" + +#. module: base_action_rule +#: field:base.action.rule,name:0 +msgid "Rule Name" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_remind_partner:0 +msgid "" +"Check this if you want the rule to send a reminder by email to the partner." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions on Model Partner" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "Deadline" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_partner_id:0 +msgid "Partner" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_subject)s = Object subject" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Email Reminders" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Special Keywords to Be Used in The Body" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_state_from:0 +msgid "State" +msgstr "સ્થિતિ" + +#. module: base_action_rule +#: model:ir.actions.act_window,help:base_action_rule.base_action_rule_act +msgid "" +"Use automated actions to automatically trigger actions for various screens. " +"Example: a lead created by a specific user may be automatically set to a " +"specific sales team, or an opportunity which still has status pending after " +"14 days might trigger an automatic reminder email." +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_mail_to_email:0 +msgid "Email-id of the persons whom mail is to be sent" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Action Rule" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Fields to Change" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "Creation Date" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "Last Action Date" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_range_type:0 +msgid "Hours" +msgstr "કલાક" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_id)s = Object ID" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Delay After Trigger Date" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_remind_attach:0 +msgid "Remind with Attachment" +msgstr "" + +#. module: base_action_rule +#: constraint:ir.cron:0 +msgid "Invalid arguments" +msgstr "અયોગ્ય દલીલો" + +#. module: base_action_rule +#: field:base.action.rule,act_user_id:0 +msgid "Set Responsible to" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "None" +msgstr "કંઇ નહિં" + +#. module: base_action_rule +#: help:base.action.rule,act_email_to:0 +msgid "" +"Use a python expression to specify the right field on which one than we will " +"use for the 'To' field of the header" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_user_phone)s = Responsible phone" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "" +"The rule uses the AND operator. The model must match all non-empty fields so " +"that the rule executes the action described in the 'Actions' tab." +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_date_range_type:0 +msgid "Delay type" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,regex_name:0 +msgid "" +"Regular expression for matching name of the resource\n" +"e.g.: 'urgent.*' will search for records having name starting with the " +"string 'urgent'\n" +"Note: This is case sensitive search." +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_method:0 +msgid "Call Object Method" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_email_to:0 +msgid "Email To" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_mail_to_watchers:0 +msgid "" +"Check this if you want the rule to mark CC(mail to any other person defined " +"in actions)." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(partner)s = Partner name" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Note" +msgstr "નોંધ" + +#. module: base_action_rule +#: help:base.action.rule,act_email_from:0 +msgid "" +"Use a python expression to specify the right field on which one than we will " +"use for the 'From' field of the header" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_date_range:0 +msgid "Delay after trigger date" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions" +msgstr "શરતો" + +#. module: base_action_rule +#: help:base.action.rule,trg_date_range:0 +msgid "" +"Delay After Trigger Date,specifies you can put a negative number. If you " +"need a delay before the trigger date, like sending a reminder 15 minutes " +"before a meeting." +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,active:0 +msgid "Active" +msgstr "કાર્યશીલ" + +#. module: base_action_rule +#: code:addons/base_action_rule/base_action_rule.py:329 +#, python-format +msgid "No E-Mail ID Found for your Company address!" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_remind_user:0 +msgid "Remind Responsible" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,sequence:0 +msgid "Gives the sequence order when displaying a list of rules." +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_range_type:0 +msgid "Months" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,filter_id:0 +msgid "Filter" +msgstr "ફિલ્ટર" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "Date" +msgstr "તારીખ" + +#. module: base_action_rule +#: help:base.action.rule,server_action_id:0 +msgid "" +"Describes the action name.\n" +"eg:on which object which action to be taken on basis of which condition" +msgstr "" + +#. module: base_action_rule +#: model:ir.model,name:base_action_rule.model_ir_cron +msgid "ir.cron" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_description)s = Object description" +msgstr "" + +#. module: base_action_rule +#: constraint:base.action.rule:0 +msgid "Error: The mail is not well formated" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Email Actions" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Email Information" +msgstr "" + +#. module: base_action_rule +#: model:ir.model,name:base_action_rule.model_base_action_rule +msgid "Action Rules" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_mail_body:0 +msgid "Content of mail" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_user_id:0 +msgid "Responsible" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(partner_email)s = Partner Email" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_date)s = Creation date" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_user_email)s = Responsible Email" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_mail_body:0 +msgid "Mail body" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_remind_user:0 +msgid "" +"Check this if you want the rule to send a reminder by email to the user." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Server Action to be Triggered" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_mail_to_user:0 +msgid "Mail to Responsible" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_email_cc:0 +msgid "Add Watchers (Cc)" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions on Model Fields" +msgstr "" + +#. module: base_action_rule +#: model:ir.actions.act_window,name:base_action_rule.base_action_rule_act +#: model:ir.ui.menu,name:base_action_rule.menu_base_action_rule_form +msgid "Automated Actions" +msgstr "સ્વયંચાલિતકાર્યો(એકશન્સ)" + +#. module: base_action_rule +#: field:base.action.rule,server_action_id:0 +msgid "Server Action" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,regex_name:0 +msgid "Regex on Resource Name" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_remind_attach:0 +msgid "" +"Check this if you want that all documents attached to the object be attached " +"to the reminder email sent." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions on Timing" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,sequence:0 +msgid "Sequence" +msgstr "ક્રમ" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Actions" +msgstr "ક્રિયાઓ" + +#. module: base_action_rule +#: help:base.action.rule,active:0 +msgid "" +"If the active field is set to False, it will allow you to hide the rule " +"without removing it." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_user)s = Responsible name" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,create_date:0 +msgid "Create Date" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions on States" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_date_type:0 +msgid "Trigger Date" +msgstr "" diff --git a/addons/base_contact/i18n/gu.po b/addons/base_contact/i18n/gu.po new file mode 100644 index 00000000000..3c4537b342a --- /dev/null +++ b/addons/base_contact/i18n/gu.po @@ -0,0 +1,264 @@ +# Gujarati translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-03-06 18:22+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-07 05:13+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. module: base_contact +#: field:res.partner.location,city:0 +msgid "City" +msgstr "શહેર" + +#. module: base_contact +#: view:res.partner.contact:0 +msgid "First/Lastname" +msgstr "" + +#. module: base_contact +#: model:ir.actions.act_window,name:base_contact.action_partner_contact_form +#: model:ir.ui.menu,name:base_contact.menu_partner_contact_form +#: model:ir.ui.menu,name:base_contact.menu_purchases_partner_contact_form +#: model:process.node,name:base_contact.process_node_contacts0 +#: field:res.partner.location,job_ids:0 +msgid "Contacts" +msgstr "સંપર્કો" + +#. module: base_contact +#: view:res.partner.contact:0 +msgid "Professional Info" +msgstr "" + +#. module: base_contact +#: field:res.partner.contact,first_name:0 +msgid "First Name" +msgstr "પ્રથમ નામ" + +#. module: base_contact +#: field:res.partner.address,location_id:0 +msgid "Location" +msgstr "સ્થળ" + +#. module: base_contact +#: model:process.transition,name:base_contact.process_transition_partnertoaddress0 +msgid "Partner to address" +msgstr "" + +#. module: base_contact +#: help:res.partner.contact,active:0 +msgid "" +"If the active field is set to False, it will allow you to " +"hide the partner contact without removing it." +msgstr "" + +#. module: base_contact +#: field:res.partner.contact,website:0 +msgid "Website" +msgstr "સન્ચારપ્રૌદ્યોગિક" + +#. module: base_contact +#: field:res.partner.location,zip:0 +msgid "Zip" +msgstr "Zip" + +#. module: base_contact +#: field:res.partner.location,state_id:0 +msgid "Fed. State" +msgstr "" + +#. module: base_contact +#: field:res.partner.location,company_id:0 +msgid "Company" +msgstr "કંપની" + +#. module: base_contact +#: field:res.partner.contact,title:0 +msgid "Title" +msgstr "શીર્ષક" + +#. module: base_contact +#: field:res.partner.location,partner_id:0 +msgid "Main Partner" +msgstr "" + +#. module: base_contact +#: model:process.process,name:base_contact.process_process_basecontactprocess0 +msgid "Base Contact" +msgstr "" + +#. module: base_contact +#: field:res.partner.contact,email:0 +msgid "E-Mail" +msgstr "ઈ-મેઇલ" + +#. module: base_contact +#: field:res.partner.contact,active:0 +msgid "Active" +msgstr "કાર્યશીલ" + +#. module: base_contact +#: field:res.partner.contact,country_id:0 +msgid "Nationality" +msgstr "નાગરિકત્વ" + +#. module: base_contact +#: view:res.partner:0 +#: view:res.partner.address:0 +msgid "Postal Address" +msgstr "પોસ્ટલ સરનામું" + +#. module: base_contact +#: field:res.partner.contact,function:0 +msgid "Main Function" +msgstr "" + +#. module: base_contact +#: model:process.transition,note:base_contact.process_transition_partnertoaddress0 +msgid "Define partners and their addresses." +msgstr "" + +#. module: base_contact +#: field:res.partner.contact,name:0 +msgid "Name" +msgstr "નામ" + +#. module: base_contact +#: field:res.partner.contact,lang_id:0 +msgid "Language" +msgstr "ભાષા" + +#. module: base_contact +#: field:res.partner.contact,mobile:0 +msgid "Mobile" +msgstr "મોબાઇલ" + +#. module: base_contact +#: field:res.partner.location,country_id:0 +msgid "Country" +msgstr "દેશ" + +#. module: base_contact +#: view:res.partner.contact:0 +#: field:res.partner.contact,comment:0 +msgid "Notes" +msgstr "નોંધ" + +#. module: base_contact +#: model:process.node,note:base_contact.process_node_contacts0 +msgid "People you work with." +msgstr "" + +#. module: base_contact +#: view:res.partner.contact:0 +msgid "Extra Information" +msgstr "વધુ માહિતી" + +#. module: base_contact +#: view:res.partner.contact:0 +#: field:res.partner.contact,job_ids:0 +msgid "Functions and Addresses" +msgstr "" + +#. module: base_contact +#: model:ir.model,name:base_contact.model_res_partner_contact +#: field:res.partner.address,contact_id:0 +msgid "Contact" +msgstr "સંપર્ક" + +#. module: base_contact +#: model:ir.model,name:base_contact.model_res_partner_location +msgid "res.partner.location" +msgstr "" + +#. module: base_contact +#: model:process.node,note:base_contact.process_node_partners0 +msgid "Companies you work with." +msgstr "" + +#. module: base_contact +#: field:res.partner.contact,partner_id:0 +msgid "Main Employer" +msgstr "" + +#. module: base_contact +#: view:res.partner.contact:0 +msgid "Partner Contact" +msgstr "" + +#. module: base_contact +#: model:process.node,name:base_contact.process_node_addresses0 +msgid "Addresses" +msgstr "સરનામાંઓ" + +#. module: base_contact +#: model:process.node,note:base_contact.process_node_addresses0 +msgid "Working and private addresses." +msgstr "" + +#. module: base_contact +#: field:res.partner.contact,last_name:0 +msgid "Last Name" +msgstr "છેલ્લું નામ" + +#. module: base_contact +#: view:res.partner.contact:0 +#: field:res.partner.contact,photo:0 +msgid "Photo" +msgstr "ફોટો" + +#. module: base_contact +#: view:res.partner.location:0 +msgid "Locations" +msgstr "સ્થળો" + +#. module: base_contact +#: view:res.partner.contact:0 +msgid "General" +msgstr "સામાન્ય" + +#. module: base_contact +#: field:res.partner.location,street:0 +msgid "Street" +msgstr "શેરી" + +#. module: base_contact +#: view:res.partner.contact:0 +msgid "Partner" +msgstr "" + +#. module: base_contact +#: model:process.node,name:base_contact.process_node_partners0 +msgid "Partners" +msgstr "" + +#. module: base_contact +#: model:ir.model,name:base_contact.model_res_partner_address +msgid "Partner Addresses" +msgstr "" + +#. module: base_contact +#: field:res.partner.location,street2:0 +msgid "Street2" +msgstr "" + +#. module: base_contact +#: view:res.partner.contact:0 +msgid "Personal Information" +msgstr "અંગત માહિતી" + +#. module: base_contact +#: field:res.partner.contact,birthdate:0 +msgid "Birth Date" +msgstr "જન્મ તારીખ" diff --git a/addons/base_vat/i18n/gu.po b/addons/base_vat/i18n/gu.po new file mode 100644 index 00000000000..5c79cde4c42 --- /dev/null +++ b/addons/base_vat/i18n/gu.po @@ -0,0 +1,75 @@ +# Gujarati translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-03-06 18:23+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-07 05:13+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. module: base_vat +#: code:addons/base_vat/base_vat.py:141 +#, python-format +msgid "" +"This VAT number does not seem to be valid.\n" +"Note: the expected format is %s" +msgstr "" + +#. module: base_vat +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "" + +#. module: base_vat +#: constraint:res.partner:0 +msgid "Error ! You cannot create recursive associated members." +msgstr "" + +#. module: base_vat +#: field:res.company,vat_check_vies:0 +msgid "VIES VAT Check" +msgstr "" + +#. module: base_vat +#: model:ir.model,name:base_vat.model_res_company +msgid "Companies" +msgstr "" + +#. module: base_vat +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "" + +#. module: base_vat +#: help:res.partner,vat_subjected:0 +msgid "" +"Check this box if the partner is subjected to the VAT. It will be used for " +"the VAT legal statement." +msgstr "" + +#. module: base_vat +#: model:ir.model,name:base_vat.model_res_partner +msgid "Partner" +msgstr "" + +#. module: base_vat +#: help:res.company,vat_check_vies:0 +msgid "" +"If checked, Partners VAT numbers will be fully validated against EU's VIES " +"service rather than via a simple format validation (checksum)." +msgstr "" + +#. module: base_vat +#: field:res.partner,vat_subjected:0 +msgid "VAT Legal Statement" +msgstr "" diff --git a/addons/document/i18n/gu.po b/addons/document/i18n/gu.po new file mode 100644 index 00000000000..832f4b13a18 --- /dev/null +++ b/addons/document/i18n/gu.po @@ -0,0 +1,1003 @@ +# Gujarati translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-03-06 18:23+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-07 05:13+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. module: document +#: field:document.directory,parent_id:0 +msgid "Parent Directory" +msgstr "" + +#. module: document +#: code:addons/document/document_directory.py:276 +#, python-format +msgid "Directory name contains special characters!" +msgstr "" + +#. module: document +#: field:document.directory,resource_field:0 +msgid "Name field" +msgstr "" + +#. module: document +#: view:board.board:0 +msgid "Document board" +msgstr "" + +#. module: document +#: model:ir.model,name:document.model_process_node +msgid "Process Node" +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "Search Document Directory" +msgstr "" + +#. module: document +#: help:document.directory,resource_field:0 +msgid "" +"Field to be used as name on resource directories. If empty, the \"name\" " +"will be used." +msgstr "" + +#. module: document +#: view:document.directory:0 +#: view:document.storage:0 +msgid "Group By..." +msgstr "ગ્રુપ દ્વારા..." + +#. module: document +#: model:ir.model,name:document.model_document_directory_content_type +msgid "Directory Content Type" +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "Resources" +msgstr "સ્રોતો" + +#. module: document +#: field:document.directory,file_ids:0 +#: view:report.document.user:0 +msgid "Files" +msgstr "ફાઇલો" + +#. module: document +#: view:report.files.partner:0 +msgid "Files per Month" +msgstr "" + +#. module: document +#: selection:report.document.user,month:0 +#: selection:report.files.partner,month:0 +msgid "March" +msgstr "માર્ચ" + +#. module: document +#: view:document.configuration:0 +msgid "title" +msgstr "શીર્ષક" + +#. module: document +#: field:document.directory.dctx,expr:0 +msgid "Expression" +msgstr "સમીકરણ" + +#. module: document +#: view:document.directory:0 +#: field:document.directory,company_id:0 +msgid "Company" +msgstr "કંપની" + +#. module: document +#: model:ir.model,name:document.model_document_directory_content +msgid "Directory Content" +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "Dynamic context" +msgstr "" + +#. module: document +#: model:ir.ui.menu,name:document.menu_document_management_configuration +msgid "Document Management" +msgstr "" + +#. module: document +#: help:document.directory.dctx,expr:0 +msgid "" +"A python expression used to evaluate the field.\n" +"You can use 'dir_id' for current dir, 'res_id', 'res_model' as a reference " +"to the current record, in dynamic folders" +msgstr "" + +#. module: document +#: view:report.document.user:0 +msgid "This Year" +msgstr "આ વર્ષ" + +#. module: document +#: field:document.storage,path:0 +msgid "Path" +msgstr "પથ" + +#. module: document +#: code:addons/document/document_directory.py:266 +#: code:addons/document/document_directory.py:271 +#, python-format +msgid "Directory name must be unique!" +msgstr "" + +#. module: document +#: view:ir.attachment:0 +msgid "Filter on my documents" +msgstr "" + +#. module: document +#: field:ir.attachment,index_content:0 +msgid "Indexed Content" +msgstr "" + +#. module: document +#: help:document.directory,resource_find_all:0 +msgid "" +"If true, all attachments that match this resource will be located. If " +"false, only ones that have this as parent." +msgstr "" + +#. module: document +#: model:ir.actions.todo.category,name:document.category_knowledge_mgmt_config +msgid "Knowledge Management" +msgstr "" + +#. module: document +#: view:document.directory:0 +#: field:document.storage,dir_ids:0 +#: model:ir.ui.menu,name:document.menu_document_directories +msgid "Directories" +msgstr "ડિરેક્ટરીઓ" + +#. module: document +#: model:ir.model,name:document.model_report_document_user +msgid "Files details by Users" +msgstr "" + +#. module: document +#: code:addons/document/document_storage.py:573 +#: code:addons/document/document_storage.py:601 +#, python-format +msgid "Error!" +msgstr "" + +#. module: document +#: field:document.directory,resource_find_all:0 +msgid "Find all resources" +msgstr "" + +#. module: document +#: selection:document.directory,type:0 +msgid "Folders per resource" +msgstr "" + +#. module: document +#: field:document.directory.content,suffix:0 +msgid "Suffix" +msgstr "" + +#. module: document +#: field:report.document.user,change_date:0 +msgid "Modified Date" +msgstr "" + +#. module: document +#: view:document.configuration:0 +msgid "Knowledge Application Configuration" +msgstr "" + +#. module: document +#: view:ir.attachment:0 +#: field:ir.attachment,partner_id:0 +#: field:report.files.partner,partner:0 +msgid "Partner" +msgstr "" + +#. module: document +#: view:board.board:0 +msgid "Files by Users" +msgstr "" + +#. module: document +#: field:process.node,directory_id:0 +msgid "Document directory" +msgstr "" + +#. module: document +#: code:addons/document/document.py:220 +#: code:addons/document/document.py:299 +#: code:addons/document/document_directory.py:266 +#: code:addons/document/document_directory.py:271 +#: code:addons/document/document_directory.py:276 +#, python-format +msgid "ValidateError" +msgstr "" + +#. module: document +#: model:ir.model,name:document.model_ir_actions_report_xml +msgid "ir.actions.report.xml" +msgstr "" + +#. module: document +#: model:ir.actions.act_window,name:document.action_document_file_form +#: view:ir.attachment:0 +#: model:ir.ui.menu,name:document.menu_document_doc +#: model:ir.ui.menu,name:document.menu_document_files +msgid "Documents" +msgstr "દસ્તાવેજો" + +#. module: document +#: constraint:document.directory:0 +msgid "Error! You can not create recursive Directories." +msgstr "" + +#. module: document +#: view:document.directory:0 +#: field:document.directory,storage_id:0 +msgid "Storage" +msgstr "સંગ્રહસ્થાન" + +#. module: document +#: field:document.directory,ressource_type_id:0 +msgid "Resource model" +msgstr "" + +#. module: document +#: field:ir.attachment,file_size:0 +#: field:report.document.file,file_size:0 +#: field:report.document.user,file_size:0 +#: field:report.files.partner,file_size:0 +msgid "File Size" +msgstr "ફાઈલનું માપ" + +#. module: document +#: field:document.directory.content.type,name:0 +#: field:ir.attachment,file_type:0 +msgid "Content Type" +msgstr "" + +#. module: document +#: view:document.directory:0 +#: field:document.directory,type:0 +#: view:document.storage:0 +#: field:document.storage,type:0 +msgid "Type" +msgstr "પ્રકાર" + +#. module: document +#: help:document.directory,ressource_type_id:0 +msgid "" +"Select an object here and there will be one folder per record of that " +"resource." +msgstr "" + +#. module: document +#: help:document.directory,domain:0 +msgid "" +"Use a domain if you want to apply an automatic filter on visible resources." +msgstr "" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_files_by_partner +msgid "Files Per Partner" +msgstr "" + +#. module: document +#: field:document.directory,dctx_ids:0 +msgid "Context fields" +msgstr "" + +#. module: document +#: field:ir.attachment,store_fname:0 +msgid "Stored Filename" +msgstr "" + +#. module: document +#: view:document.directory:0 +#: field:report.document.user,type:0 +msgid "Directory Type" +msgstr "" + +#. module: document +#: field:document.directory.content,report_id:0 +msgid "Report" +msgstr "" + +#. module: document +#: selection:report.document.user,month:0 +#: selection:report.files.partner,month:0 +msgid "July" +msgstr "જુલાઈ" + +#. module: document +#: model:ir.actions.act_window,name:document.open_board_document_manager +#: model:ir.ui.menu,name:document.menu_reports_document_manager +msgid "Document Dashboard" +msgstr "" + +#. module: document +#: field:document.directory.content.type,code:0 +msgid "Extension" +msgstr "એક્સટેન્શન" + +#. module: document +#: view:ir.attachment:0 +msgid "Created" +msgstr "બનાવાયેલ" + +#. module: document +#: field:document.directory,content_ids:0 +msgid "Virtual Files" +msgstr "" + +#. module: document +#: view:ir.attachment:0 +msgid "Modified" +msgstr "સુધારેલ" + +#. module: document +#: code:addons/document/document_storage.py:639 +#, python-format +msgid "Error at doc write!" +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "Generated Files" +msgstr "" + +#. module: document +#: view:document.configuration:0 +msgid "" +"When executing this wizard, it will configure your directories automatically " +"according to modules installed." +msgstr "" + +#. module: document +#: field:document.directory.content,directory_id:0 +#: field:document.directory.dctx,dir_id:0 +#: model:ir.actions.act_window,name:document.action_document_file_directory_form +#: view:ir.attachment:0 +#: field:ir.attachment,parent_id:0 +#: model:ir.model,name:document.model_document_directory +#: field:report.document.user,directory:0 +msgid "Directory" +msgstr "ડિરેક્ટરી" + +#. module: document +#: view:document.directory:0 +msgid "Security" +msgstr "સુરક્ષા" + +#. module: document +#: field:document.directory,write_uid:0 +#: field:document.storage,write_uid:0 +#: field:ir.attachment,write_uid:0 +msgid "Last Modification User" +msgstr "" + +#. module: document +#: model:ir.actions.act_window,name:document.act_res_partner_document +#: model:ir.actions.act_window,name:document.zoom_directory +msgid "Related Documents" +msgstr "" + +#. module: document +#: field:document.directory,domain:0 +msgid "Domain" +msgstr "શરતી અવકાશ" + +#. module: document +#: field:document.directory,write_date:0 +#: field:document.storage,write_date:0 +#: field:ir.attachment,write_date:0 +msgid "Date Modified" +msgstr "ફેરફાર કર્યાની તારીખ" + +#. module: document +#: model:ir.model,name:document.model_report_document_file +msgid "Files details by Directory" +msgstr "" + +#. module: document +#: view:report.document.user:0 +msgid "All users files" +msgstr "" + +#. module: document +#: view:board.board:0 +#: model:ir.actions.act_window,name:document.action_view_size_month +#: view:report.document.file:0 +msgid "File Size by Month" +msgstr "" + +#. module: document +#: selection:report.document.user,month:0 +#: selection:report.files.partner,month:0 +msgid "December" +msgstr "ડિસેમ્બર" + +#. module: document +#: field:document.configuration,config_logo:0 +msgid "Image" +msgstr "ચિત્ર" + +#. module: document +#: selection:document.directory,type:0 +msgid "Static Directory" +msgstr "" + +#. module: document +#: field:document.directory,child_ids:0 +msgid "Children" +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "Define words in the context, for all child directories and files" +msgstr "" + +#. module: document +#: help:document.storage,online:0 +msgid "" +"If not checked, media is currently offline and its contents not available" +msgstr "" + +#. module: document +#: view:document.directory:0 +#: field:document.directory,user_id:0 +#: field:document.storage,user_id:0 +#: view:ir.attachment:0 +#: field:ir.attachment,user_id:0 +#: field:report.document.user,user_id:0 +#: field:report.document.wall,user_id:0 +msgid "Owner" +msgstr "માલિક" + +#. module: document +#: view:document.directory:0 +msgid "PDF Report" +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "Contents" +msgstr "સમાવિષ્ટો" + +#. module: document +#: field:document.directory,create_date:0 +#: field:document.storage,create_date:0 +#: field:report.document.user,create_date:0 +msgid "Date Created" +msgstr "બનાવ્યાની તારીખ" + +#. module: document +#: help:document.directory.content,include_name:0 +msgid "" +"Check this field if you want that the name of the file to contain the record " +"name.\n" +"If set, the directory will have to be a resource one." +msgstr "" + +#. module: document +#: view:document.configuration:0 +#: model:ir.actions.act_window,name:document.action_config_auto_directory +msgid "Configure Directories" +msgstr "" + +#. module: document +#: field:document.directory.content,include_name:0 +msgid "Include Record Name" +msgstr "" + +#. module: document +#: view:ir.attachment:0 +msgid "Attachment" +msgstr "જોડાણ" + +#. module: document +#: field:ir.actions.report.xml,model_id:0 +msgid "Model Id" +msgstr "" + +#. module: document +#: field:document.storage,online:0 +msgid "Online" +msgstr "ઓનલાઇન" + +#. module: document +#: help:document.directory,ressource_tree:0 +msgid "" +"Check this if you want to use the same tree structure as the object selected " +"in the system." +msgstr "" + +#. module: document +#: help:document.directory,ressource_id:0 +msgid "" +"Along with Parent Model, this ID attaches this folder to a specific record " +"of Parent Model." +msgstr "" + +#. module: document +#: selection:report.document.user,month:0 +#: selection:report.files.partner,month:0 +msgid "August" +msgstr "ઑગસ્ટ" + +#. module: document +#: sql_constraint:document.directory:0 +msgid "Directory cannot be parent of itself!" +msgstr "" + +#. module: document +#: selection:report.document.user,month:0 +#: selection:report.files.partner,month:0 +msgid "June" +msgstr "જૂન" + +#. module: document +#: field:report.document.user,user:0 +#: field:report.document.wall,user:0 +msgid "User" +msgstr "વપરાશકર્તા" + +#. module: document +#: field:document.directory,group_ids:0 +#: field:document.storage,group_ids:0 +msgid "Groups" +msgstr "સમૂહો" + +#. module: document +#: field:document.directory.content.type,active:0 +msgid "Active" +msgstr "કાર્યશીલ" + +#. module: document +#: selection:report.document.user,month:0 +#: selection:report.files.partner,month:0 +msgid "November" +msgstr "નવેમ્બર" + +#. module: document +#: view:ir.attachment:0 +#: field:ir.attachment,db_datas:0 +msgid "Data" +msgstr "માહિતી" + +#. module: document +#: help:document.directory,ressource_parent_type_id:0 +msgid "" +"If you put an object here, this directory template will appear bellow all of " +"these objects. Such directories are \"attached\" to the specific model or " +"record, just like attachments. Don't put a parent directory if you select a " +"parent model." +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "Definition" +msgstr "વ્યાખ્યા" + +#. module: document +#: selection:report.document.user,month:0 +#: selection:report.files.partner,month:0 +msgid "October" +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "Seq." +msgstr "" + +#. module: document +#: selection:document.storage,type:0 +msgid "Database" +msgstr "" + +#. module: document +#: selection:report.document.user,month:0 +#: selection:report.files.partner,month:0 +msgid "January" +msgstr "" + +#. module: document +#: view:ir.attachment:0 +msgid "Related to" +msgstr "" + +#. module: document +#: view:ir.attachment:0 +msgid "Attached To" +msgstr "" + +#. module: document +#: model:ir.ui.menu,name:document.menu_reports_document +msgid "Dashboard" +msgstr "" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_user_graph +msgid "Files By Users" +msgstr "" + +#. module: document +#: field:document.storage,readonly:0 +msgid "Read Only" +msgstr "" + +#. module: document +#: model:ir.actions.act_window,name:document.action_document_directory_form +msgid "Document Directory" +msgstr "" + +#. module: document +#: sql_constraint:document.directory:0 +msgid "The directory name must be unique !" +msgstr "" + +#. module: document +#: field:document.directory,create_uid:0 +#: field:document.storage,create_uid:0 +msgid "Creator" +msgstr "" + +#. module: document +#: field:document.directory.content,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: document +#: view:document.configuration:0 +msgid "" +"OpenERP's Document Management System supports mapping virtual folders with " +"documents. The virtual folder of a document can be used to manage the files " +"attached to the document, or to print and download any report. This tool " +"will create directories automatically according to modules installed." +msgstr "" + +#. module: document +#: view:board.board:0 +#: model:ir.actions.act_window,name:document.action_view_files_by_month_graph +#: view:report.document.user:0 +msgid "Files by Month" +msgstr "" + +#. module: document +#: selection:report.document.user,month:0 +#: selection:report.files.partner,month:0 +msgid "September" +msgstr "" + +#. module: document +#: field:document.directory.content,prefix:0 +msgid "Prefix" +msgstr "" + +#. module: document +#: field:report.document.wall,last:0 +msgid "Last Posted Time" +msgstr "" + +#. module: document +#: field:report.document.user,datas_fname:0 +msgid "File Name" +msgstr "" + +#. module: document +#: view:document.configuration:0 +msgid "res_config_contents" +msgstr "" + +#. module: document +#: field:document.directory,ressource_id:0 +msgid "Resource ID" +msgstr "" + +#. module: document +#: selection:document.storage,type:0 +msgid "External file storage" +msgstr "" + +#. module: document +#: view:board.board:0 +#: model:ir.actions.act_window,name:document.action_view_wall +#: view:report.document.wall:0 +msgid "Wall of Shame" +msgstr "" + +#. module: document +#: help:document.storage,path:0 +msgid "For file storage, the root path of the storage" +msgstr "" + +#. module: document +#: model:ir.model,name:document.model_report_files_partner +msgid "Files details by Partners" +msgstr "" + +#. module: document +#: field:document.directory.dctx,field:0 +msgid "Field" +msgstr "" + +#. module: document +#: model:ir.model,name:document.model_document_directory_dctx +msgid "Directory Dynamic Context" +msgstr "" + +#. module: document +#: field:document.directory,ressource_parent_type_id:0 +msgid "Parent Model" +msgstr "" + +#. module: document +#: view:report.document.user:0 +msgid "Files by users" +msgstr "" + +#. module: document +#: field:report.document.file,month:0 +#: field:report.document.user,month:0 +#: field:report.document.wall,month:0 +#: field:report.document.wall,name:0 +#: field:report.files.partner,month:0 +msgid "Month" +msgstr "" + +#. module: document +#: view:report.document.user:0 +msgid "This Months Files" +msgstr "" + +#. module: document +#: model:ir.ui.menu,name:document.menu_reporting +msgid "Reporting" +msgstr "" + +#. module: document +#: field:document.directory,ressource_tree:0 +msgid "Tree Structure" +msgstr "" + +#. module: document +#: selection:report.document.user,month:0 +#: selection:report.files.partner,month:0 +msgid "May" +msgstr "" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_all_document_tree1 +msgid "All Users files" +msgstr "" + +#. module: document +#: model:ir.model,name:document.model_report_document_wall +msgid "Users that did not inserted documents since one month" +msgstr "" + +#. module: document +#: model:ir.actions.act_window,help:document.action_document_file_form +msgid "" +"The Documents repository gives you access to all attachments, such as mails, " +"project documents, invoices etc." +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "For each entry here, virtual files will appear in this folder." +msgstr "" + +#. module: document +#: model:ir.model,name:document.model_ir_attachment +msgid "ir.attachment" +msgstr "" + +#. module: document +#: view:board.board:0 +msgid "New Files" +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "Static" +msgstr "" + +#. module: document +#: view:report.files.partner:0 +msgid "Files By Partner" +msgstr "" + +#. module: document +#: view:ir.attachment:0 +msgid "Indexed Content - experimental" +msgstr "" + +#. module: document +#: view:report.document.user:0 +msgid "This Month" +msgstr "" + +#. module: document +#: view:ir.attachment:0 +msgid "Notes" +msgstr "" + +#. module: document +#: model:ir.model,name:document.model_document_configuration +msgid "Directory Configuration" +msgstr "" + +#. module: document +#: help:document.directory,type:0 +msgid "" +"Each directory can either have the type Static or be linked to another " +"resource. A static directory, as with Operating Systems, is the classic " +"directory that can contain a set of files. The directories linked to systems " +"resources automatically possess sub-directories for each of resource types " +"defined in the parent directory." +msgstr "" + +#. module: document +#: selection:report.document.user,month:0 +#: selection:report.files.partner,month:0 +msgid "February" +msgstr "" + +#. module: document +#: model:ir.actions.act_window,name:document.open_board_document_manager1 +#: model:ir.ui.menu,name:document.menu_reports_document_manager1 +msgid "Statistics by User" +msgstr "" + +#. module: document +#: help:document.directory.dctx,field:0 +msgid "" +"The name of the field. Note that the prefix \"dctx_\" will be prepended to " +"what is typed here." +msgstr "" + +#. module: document +#: field:document.directory,name:0 +#: field:document.storage,name:0 +msgid "Name" +msgstr "" + +#. module: document +#: sql_constraint:document.storage:0 +msgid "The storage path must be unique!" +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "Fields" +msgstr "" + +#. module: document +#: help:document.storage,readonly:0 +msgid "If set, media is for reading only" +msgstr "" + +#. module: document +#: selection:report.document.user,month:0 +#: selection:report.files.partner,month:0 +msgid "April" +msgstr "" + +#. module: document +#: field:report.document.file,nbr:0 +#: field:report.document.user,nbr:0 +#: field:report.files.partner,nbr:0 +msgid "# of Files" +msgstr "" + +#. module: document +#: code:addons/document/document.py:209 +#, python-format +msgid "(copy)" +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "" +"Only members of these groups will have access to this directory and its " +"files." +msgstr "" + +#. module: document +#: view:document.directory:0 +msgid "" +"These groups, however, do NOT apply to children directories, which must " +"define their own groups." +msgstr "" + +#. module: document +#: field:document.directory.content.type,mimetype:0 +msgid "Mime Type" +msgstr "" + +#. module: document +#: view:report.document.user:0 +msgid "All Months Files" +msgstr "" + +#. module: document +#: field:document.directory.content,name:0 +msgid "Content Name" +msgstr "" + +#. module: document +#: code:addons/document/document.py:220 +#: code:addons/document/document.py:299 +#, python-format +msgid "File name must be unique!" +msgstr "" + +#. module: document +#: selection:document.storage,type:0 +msgid "Internal File storage" +msgstr "" + +#. module: document +#: sql_constraint:document.directory:0 +msgid "Directory must have a parent or a storage" +msgstr "" + +#. module: document +#: model:ir.actions.act_window,name:document.action_document_directory_tree +#: model:ir.ui.menu,name:document.menu_document_directories_tree +msgid "Directories' Structure" +msgstr "" + +#. module: document +#: view:report.document.user:0 +msgid "Files by Resource Type" +msgstr "" + +#. module: document +#: field:report.document.user,name:0 +#: field:report.files.partner,name:0 +msgid "Year" +msgstr "" + +#. module: document +#: view:document.storage:0 +#: model:ir.actions.act_window,name:document.action_document_storage_form +#: model:ir.model,name:document.model_document_storage +#: model:ir.ui.menu,name:document.menu_document_storage_media +msgid "Storage Media" +msgstr "" + +#. module: document +#: view:document.storage:0 +msgid "Search Document storage" +msgstr "" + +#. module: document +#: field:document.directory.content,extension:0 +msgid "Document Type" +msgstr "" diff --git a/addons/google_map/i18n/gu.po b/addons/google_map/i18n/gu.po new file mode 100644 index 00000000000..f6b305790c1 --- /dev/null +++ b/addons/google_map/i18n/gu.po @@ -0,0 +1,35 @@ +# Gujarati translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-03-06 18:10+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-07 05:13+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. module: google_map +#: view:res.partner:0 +#: view:res.partner.address:0 +msgid "Map" +msgstr "નકશો" + +#. module: google_map +#: model:ir.model,name:google_map.model_res_partner_address +msgid "Partner Addresses" +msgstr "" + +#. module: google_map +#: view:res.partner:0 +#: view:res.partner.address:0 +msgid "Street2 : " +msgstr "" diff --git a/addons/hr_payroll/i18n/gu.po b/addons/hr_payroll/i18n/gu.po new file mode 100644 index 00000000000..1a1c1b6b5cc --- /dev/null +++ b/addons/hr_payroll/i18n/gu.po @@ -0,0 +1,1119 @@ +# Gujarati translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 01:37+0100\n" +"PO-Revision-Date: 2012-03-06 18:24+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-07 05:13+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. module: hr_payroll +#: field:hr.payslip.line,condition_select:0 +#: field:hr.salary.rule,condition_select:0 +msgid "Condition Based on" +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Monthly" +msgstr "માસીક" + +#. module: hr_payroll +#: view:hr.payslip:0 field:hr.payslip,line_ids:0 +#: model:ir.actions.act_window,name:hr_payroll.act_contribution_reg_payslip_lines +msgid "Payslip Lines" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.line:0 +#: model:ir.model,name:hr_payroll.model_hr_salary_rule_category +#: report:paylip.details:0 +msgid "Salary Rule Category" +msgstr "" + +#. module: hr_payroll +#: help:hr.salary.rule.category,parent_id:0 +msgid "" +"Linking a salary category to its parent is used only for the reporting " +"purpose." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.payslip.line:0 view:hr.salary.rule:0 +msgid "Group By..." +msgstr "ગ્રુપ દ્વારા..." + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "States" +msgstr "રાજ્યો" + +#. module: hr_payroll +#: field:hr.payslip.line,input_ids:0 view:hr.salary.rule:0 +#: field:hr.salary.rule,input_ids:0 +msgid "Inputs" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,parent_rule_id:0 +#: field:hr.salary.rule,parent_rule_id:0 +msgid "Parent Salary Rule" +msgstr "" + +#. module: hr_payroll +#: field:hr.employee,slip_ids:0 view:hr.payslip:0 view:hr.payslip.run:0 +#: field:hr.payslip.run,slip_ids:0 +#: model:ir.actions.act_window,name:hr_payroll.act_hr_employee_payslip_list +msgid "Payslips" +msgstr "" + +#. module: hr_payroll +#: field:hr.payroll.structure,parent_id:0 +#: field:hr.salary.rule.category,parent_id:0 +msgid "Parent" +msgstr "પિતૃ" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "(" +msgstr "(" + +#. module: hr_payroll +#: field:hr.contribution.register,company_id:0 +#: field:hr.payroll.structure,company_id:0 field:hr.payslip,company_id:0 +#: field:hr.payslip.line,company_id:0 field:hr.salary.rule,company_id:0 +#: field:hr.salary.rule.category,company_id:0 +msgid "Company" +msgstr "કંપની" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Done Slip" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "," +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.payslip.run:0 +msgid "Set to Draft" +msgstr "" + +#. module: hr_payroll +#: model:ir.model,name:hr_payroll.model_hr_salary_rule +msgid "hr.salary.rule" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,payslip_run_id:0 +#: model:ir.model,name:hr_payroll.model_hr_payslip_run +msgid "Payslip Batches" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.employees:0 +msgid "" +"This wizard will generate payslips for all selected employee(s) based on the " +"dates and credit note specified on Payslips Run." +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 report:paylip.details:0 +#: report:payslip:0 +msgid "Quantity/Rate" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.input,payslip_id:0 field:hr.payslip.line,slip_id:0 +#: field:hr.payslip.worked_days,payslip_id:0 +#: model:ir.model,name:hr_payroll.model_hr_payslip report:payslip:0 +msgid "Pay Slip" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.employees:0 +msgid "Generate" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,amount_percentage_base:0 +#: help:hr.salary.rule,amount_percentage_base:0 +msgid "result will be affected to a variable" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 +msgid "Total:" +msgstr "કુલ:" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.act_children_salary_rules +msgid "All Children Rules" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.salary.rule:0 +msgid "Input Data" +msgstr "" + +#. module: hr_payroll +#: constraint:hr.payslip:0 +msgid "Payslip 'Date From' must be before 'Date To'." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.salary.rule.category:0 +msgid "Notes" +msgstr "નોંધ" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Salary Computation" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 field:hr.payslip.input,amount:0 +#: field:hr.payslip.line,amount:0 report:paylip.details:0 report:payslip:0 +msgid "Amount" +msgstr "કિંમત" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.payslip.line:0 +#: model:ir.model,name:hr_payroll.model_hr_payslip_line +msgid "Payslip Line" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Other Information" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,amount_select:0 help:hr.salary.rule,amount_select:0 +msgid "The computation method for the rule amount." +msgstr "" + +#. module: hr_payroll +#: view:payslip.lines.contribution.register:0 +msgid "Contribution Register's Payslip Lines" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py:52 +#, python-format +msgid "Warning !" +msgstr "ચેતવણી !" + +#. module: hr_payroll +#: report:paylip.details:0 +msgid "Details by Salary Rule Category:" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Note" +msgstr "નોંધ" + +#. module: hr_payroll +#: field:hr.payroll.structure,code:0 field:hr.payslip,number:0 +#: report:paylip.details:0 report:payslip:0 +msgid "Reference" +msgstr "સંદર્ભ" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Draft Slip" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:422 +#, python-format +msgid "Normal Working Days paid at 100%" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,condition_range_max:0 +#: field:hr.salary.rule,condition_range_max:0 +msgid "Maximum Range" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Identification No" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,struct_id:0 +msgid "Structure" +msgstr "બંધારણ" + +#. module: hr_payroll +#: help:hr.employee,total_wage:0 +msgid "Sum of all current contract's wage of employee." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Total Working Days" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,code:0 help:hr.salary.rule,code:0 +msgid "" +"The code of salary rules can be used as reference in computation of other " +"rules. In that case, it is case sensitive." +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Weekly" +msgstr "સાપ્તાહિક" + +#. module: hr_payroll +#: field:hr.payslip.line,rate:0 +msgid "Rate (%)" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Confirm" +msgstr "ખાતરી કરો" + +#. module: hr_payroll +#: model:ir.actions.report.xml,name:hr_payroll.payslip_report +msgid "Employee PaySlip" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,condition_range_max:0 +#: help:hr.salary.rule,condition_range_max:0 +msgid "The maximum amount, applied for this rule." +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,condition_python:0 +#: help:hr.salary.rule,condition_python:0 +msgid "" +"Applied this rule for calculation if condition is true. You can specify " +"condition like basic > 1000." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.employees:0 +msgid "Payslips by Employees" +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Quarterly" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,state:0 field:hr.payslip.run,state:0 +msgid "State" +msgstr "સ્થિતિ" + +#. module: hr_payroll +#: help:hr.salary.rule,quantity:0 +msgid "" +"It is used in computation for percentage and fixed amount.For e.g. A rule " +"for Meal Voucher having fixed amount of 1€ per worked day can have its " +"quantity defined in expression like worked_days.WORK100.number_of_days." +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "Search Salary Rule" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,employee_id:0 field:hr.payslip.line,employee_id:0 +#: model:ir.model,name:hr_payroll.model_hr_employee +msgid "Employee" +msgstr "કર્મચારી" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Semi-annually" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "Children definition" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Email" +msgstr "ઈ-મેઈલ" + +#. module: hr_payroll +#: view:hr.payslip.run:0 +msgid "Search Payslip Batches" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,amount_percentage_base:0 +#: field:hr.salary.rule,amount_percentage_base:0 +msgid "Percentage based on" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,amount_percentage:0 +#: help:hr.salary.rule,amount_percentage:0 +msgid "For example, enter 50.0 to apply a percentage of 50%" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,paid:0 +msgid "Made Payment Order ? " +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 +msgid "PaySlip Lines by Contribution Register" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip,state:0 +msgid "" +"* When the payslip is created the state is 'Draft'. \n" +"* If the payslip is under verification, the state is 'Waiting'. " +"\n" +"* If the payslip is confirmed then state is set to 'Done'. \n" +"* When user cancel payslip the state is 'Rejected'." +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.worked_days,number_of_days:0 +msgid "Number of Days" +msgstr "" + +#. module: hr_payroll +#: selection:hr.payslip,state:0 +msgid "Rejected" +msgstr "રદ કરેલ છે" + +#. module: hr_payroll +#: view:hr.payroll.structure:0 field:hr.payroll.structure,rule_ids:0 +#: view:hr.salary.rule:0 +#: model:ir.actions.act_window,name:hr_payroll.action_salary_rule_form +#: model:ir.ui.menu,name:hr_payroll.menu_action_hr_salary_rule_form +msgid "Salary Rules" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:337 +#, python-format +msgid "Refund: " +msgstr "" + +#. module: hr_payroll +#: model:ir.model,name:hr_payroll.model_payslip_lines_contribution_register +msgid "PaySlip Lines by Contribution Registers" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 selection:hr.payslip,state:0 view:hr.payslip.run:0 +msgid "Done" +msgstr "થઈ ગયું" + +#. module: hr_payroll +#: field:hr.payslip.line,appears_on_payslip:0 +#: field:hr.salary.rule,appears_on_payslip:0 +msgid "Appears on Payslip" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,amount_fix:0 +#: selection:hr.payslip.line,amount_select:0 field:hr.salary.rule,amount_fix:0 +#: selection:hr.salary.rule,amount_select:0 +msgid "Fixed Amount" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,active:0 help:hr.salary.rule,active:0 +msgid "" +"If the active field is set to false, it will allow you to hide the salary " +"rule without removing it." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Worked Days & Inputs" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,details_by_salary_rule_category:0 +msgid "Details by Salary Rule Category" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.action_payslip_lines_contribution_register +msgid "PaySlip Lines" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,register_id:0 help:hr.salary.rule,register_id:0 +msgid "Eventual third party involved in the salary payment of the employees." +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.worked_days,number_of_hours:0 +msgid "Number of Hours" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "PaySlip Batch" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,condition_range_min:0 +#: field:hr.salary.rule,condition_range_min:0 +msgid "Minimum Range" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,child_ids:0 field:hr.salary.rule,child_ids:0 +msgid "Child Salary Rule" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 field:hr.payslip,date_to:0 +#: field:hr.payslip.run,date_end:0 report:paylip.details:0 report:payslip:0 +#: field:payslip.lines.contribution.register,date_to:0 +msgid "Date To" +msgstr "" + +#. module: hr_payroll +#: selection:hr.payslip.line,condition_select:0 +#: selection:hr.salary.rule,condition_select:0 +msgid "Range" +msgstr "સીમા" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payroll_structure_tree +#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_structure_tree +msgid "Salary Structures Hierarchy" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Payslip" +msgstr "" + +#. module: hr_payroll +#: constraint:hr.contract:0 +msgid "Error! contract start-date must be lower then contract end-date." +msgstr "" + +#. module: hr_payroll +#: view:hr.contract:0 +msgid "Payslip Info" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.act_payslip_lines +msgid "Payslip Computation Details" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:872 +#, python-format +msgid "Wrong python code defined for salary rule %s (%s) " +msgstr "" + +#. module: hr_payroll +#: model:ir.model,name:hr_payroll.model_hr_payslip_input +msgid "Payslip Input" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule.category:0 +#: model:ir.actions.act_window,name:hr_payroll.action_hr_salary_rule_category +#: model:ir.ui.menu,name:hr_payroll.menu_hr_salary_rule_category +msgid "Salary Rule Categories" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.input,contract_id:0 +#: help:hr.payslip.worked_days,contract_id:0 +msgid "The contract for which applied this input" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "Computation" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.input,amount:0 +msgid "" +"It is used in computation. For e.g. A rule for sales having 1% commission of " +"basic salary for per product can defined in expression like result = " +"inputs.SALEURO.amount * contract.wage*0.01." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.line:0 field:hr.payslip.line,amount_select:0 +#: field:hr.salary.rule,amount_select:0 +msgid "Amount Type" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,category_id:0 view:hr.salary.rule:0 +#: field:hr.salary.rule,category_id:0 +msgid "Category" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.run,credit_note:0 +msgid "" +"If its checked, indicates that all payslips generated from here are refund " +"payslips." +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payroll_structure_list_form +#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_structure_view +msgid "Salary Structures" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.run:0 +msgid "Draft Payslip Batches" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 selection:hr.payslip,state:0 view:hr.payslip.run:0 +#: selection:hr.payslip.run,state:0 +msgid "Draft" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 field:hr.payslip,date_from:0 +#: field:hr.payslip.run,date_start:0 report:paylip.details:0 report:payslip:0 +#: field:payslip.lines.contribution.register,date_from:0 +msgid "Date From" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.run:0 +msgid "Done Payslip Batches" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 +msgid "Payslip Lines by Contribution Register:" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "Conditions" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,amount_percentage:0 +#: selection:hr.payslip.line,amount_select:0 +#: field:hr.salary.rule,amount_percentage:0 +#: selection:hr.salary.rule,amount_select:0 +msgid "Percentage (%)" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Worked Day" +msgstr "" + +#. module: hr_payroll +#: view:hr.payroll.structure:0 +msgid "Employee Function" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,credit_note:0 field:hr.payslip.run,credit_note:0 +msgid "Credit Note" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Compute Sheet" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,active:0 field:hr.salary.rule,active:0 +msgid "Active" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "Child Rules" +msgstr "" + +#. module: hr_payroll +#: constraint:hr.employee:0 +msgid "Error ! You cannot create recursive Hierarchy of Employees." +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.report.xml,name:hr_payroll.payslip_details_report +msgid "PaySlip Details" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,condition_range_min:0 +#: help:hr.salary.rule,condition_range_min:0 +msgid "The minimum amount, applied for this rule." +msgstr "" + +#. module: hr_payroll +#: selection:hr.payslip.line,condition_select:0 +#: selection:hr.salary.rule,condition_select:0 +msgid "Python Expression" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Designation" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py:52 +#, python-format +msgid "You must select employee(s) to generate payslip(s)" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:861 +#, python-format +msgid "Wrong quantity defined for salary rule %s (%s)" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Companies" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Authorized Signature" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,contract_id:0 field:hr.payslip.input,contract_id:0 +#: field:hr.payslip.line,contract_id:0 +#: field:hr.payslip.worked_days,contract_id:0 +#: model:ir.model,name:hr_payroll.model_hr_contract +msgid "Contract" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Credit" +msgstr "" + +#. module: hr_payroll +#: field:hr.contract,schedule_pay:0 +msgid "Scheduled Pay" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:861 +#: code:addons/hr_payroll/hr_payroll.py:866 +#: code:addons/hr_payroll/hr_payroll.py:872 +#: code:addons/hr_payroll/hr_payroll.py:889 +#: code:addons/hr_payroll/hr_payroll.py:895 +#, python-format +msgid "Error" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,condition_python:0 +#: field:hr.salary.rule,condition_python:0 +msgid "Python Condition" +msgstr "" + +#. module: hr_payroll +#: view:hr.contribution.register:0 +msgid "Contribution" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:347 +#, python-format +msgid "Refund Payslip" +msgstr "" + +#. module: hr_payroll +#: field:hr.rule.input,input_id:0 +#: model:ir.model,name:hr_payroll.model_hr_rule_input +msgid "Salary Rule Input" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:895 +#, python-format +msgid "Wrong python condition defined for salary rule %s (%s)" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,quantity:0 field:hr.salary.rule,quantity:0 +msgid "Quantity" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Refund" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "Company contribution" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 field:hr.payslip.input,code:0 +#: field:hr.payslip.line,code:0 field:hr.payslip.worked_days,code:0 +#: field:hr.rule.input,code:0 field:hr.salary.rule,code:0 +#: field:hr.salary.rule.category,code:0 report:paylip.details:0 +#: report:payslip:0 +msgid "Code" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,amount_python_compute:0 +#: selection:hr.payslip.line,amount_select:0 +#: field:hr.salary.rule,amount_python_compute:0 +#: selection:hr.salary.rule,amount_select:0 +msgid "Python Code" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.input,sequence:0 field:hr.payslip.line,sequence:0 +#: field:hr.payslip.worked_days,sequence:0 field:hr.salary.rule,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 report:paylip.details:0 +msgid "Register Name" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "General" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:664 +#, python-format +msgid "Salary Slip of %s for %s" +msgstr "" + +#. module: hr_payroll +#: model:ir.model,name:hr_payroll.model_hr_payslip_employees +msgid "Generate payslips for all selected employees" +msgstr "" + +#. module: hr_payroll +#: field:hr.contract,struct_id:0 view:hr.payroll.structure:0 view:hr.payslip:0 +#: view:hr.payslip.line:0 +#: model:ir.model,name:hr_payroll.model_hr_payroll_structure +msgid "Salary Structure" +msgstr "" + +#. module: hr_payroll +#: field:hr.contribution.register,register_line_ids:0 +msgid "Register Line" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.payslip.employees:0 +#: view:payslip.lines.contribution.register:0 +msgid "Cancel" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.run:0 selection:hr.payslip.run,state:0 +msgid "Close" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip,struct_id:0 +msgid "" +"Defines the rules that have to be applied to this payslip, accordingly to " +"the contract chosen. If you let empty the field contract, this field isn't " +"mandatory anymore and thus the rules applied will be all the rules set on " +"the structure of all contracts of the employee valid for the chosen period" +msgstr "" + +#. module: hr_payroll +#: field:hr.payroll.structure,children_ids:0 +#: field:hr.salary.rule.category,children_ids:0 +msgid "Children" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip,credit_note:0 +msgid "Indicates this payslip has a refund of another" +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Bi-monthly" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 +msgid "Pay Slip Details" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payslip_form +#: model:ir.ui.menu,name:hr_payroll.menu_department_tree +msgid "Employee Payslips" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.line:0 field:hr.payslip.line,register_id:0 +#: field:hr.salary.rule,register_id:0 +#: model:ir.model,name:hr_payroll.model_hr_contribution_register +msgid "Contribution Register" +msgstr "" + +#. module: hr_payroll +#: view:payslip.lines.contribution.register:0 +msgid "Print" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,help:hr_payroll.action_contribution_register_form +msgid "" +"A contribution register is a third party involved in the salary payment of " +"the employees. It can be the social security, the estate or anyone that " +"collect or inject money on payslips." +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:889 +#, python-format +msgid "Wrong range condition defined for salary rule %s (%s)" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.line:0 +msgid "Calculations" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Worked Days" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Search Payslips" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.run:0 +#: model:ir.actions.act_window,name:hr_payroll.action_hr_payslip_run_tree +#: model:ir.ui.menu,name:hr_payroll.menu_hr_payslip_run +msgid "Payslips Batches" +msgstr "" + +#. module: hr_payroll +#: view:hr.contribution.register:0 field:hr.contribution.register,note:0 +#: field:hr.payroll.structure,note:0 field:hr.payslip,name:0 +#: field:hr.payslip,note:0 field:hr.payslip.input,name:0 +#: view:hr.payslip.line:0 field:hr.payslip.line,note:0 +#: field:hr.payslip.worked_days,name:0 field:hr.rule.input,name:0 +#: view:hr.salary.rule:0 field:hr.salary.rule,note:0 +#: field:hr.salary.rule.category,note:0 +msgid "Description" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid ")" +msgstr "" + +#. module: hr_payroll +#: view:hr.contribution.register:0 +#: model:ir.actions.act_window,name:hr_payroll.action_contribution_register_form +#: model:ir.ui.menu,name:hr_payroll.menu_action_hr_contribution_register_form +msgid "Contribution Registers" +msgstr "" + +#. module: hr_payroll +#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_reporting +#: model:ir.ui.menu,name:hr_payroll.menu_hr_root_payroll +#: model:ir.ui.menu,name:hr_payroll.payroll_configure +msgid "Payroll" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.report.xml,name:hr_payroll.contribution_register +msgid "PaySlip Lines By Conribution Register" +msgstr "" + +#. module: hr_payroll +#: selection:hr.payslip,state:0 +msgid "Waiting" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Address" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:866 +#, python-format +msgid "Wrong percentage base or quantity defined for salary rule %s (%s)" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,worked_days_line_ids:0 +#: model:ir.model,name:hr_payroll.model_hr_payslip_worked_days +msgid "Payslip Worked Days" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule.category:0 +msgid "Salary Categories" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 field:hr.contribution.register,name:0 +#: field:hr.payroll.structure,name:0 field:hr.payslip.line,name:0 +#: field:hr.payslip.run,name:0 field:hr.salary.rule,name:0 +#: field:hr.salary.rule.category,name:0 report:paylip.details:0 +#: report:payslip:0 +msgid "Name" +msgstr "" + +#. module: hr_payroll +#: view:hr.payroll.structure:0 +msgid "Payroll Structures" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.payslip.employees:0 +#: field:hr.payslip.employees,employee_ids:0 view:hr.payslip.line:0 +msgid "Employees" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Bank Account" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,sequence:0 help:hr.salary.rule,sequence:0 +msgid "Use to arrange calculation sequence" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,condition_range:0 +#: help:hr.salary.rule,condition_range:0 +msgid "" +"This will be used to compute the % fields values; in general it is on basic, " +"but you can also use categories code fields in lowercase as a variable names " +"(hra, ma, lta, etc.) and the variable basic." +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Annually" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,input_line_ids:0 +msgid "Payslip Inputs" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,salary_rule_id:0 +msgid "Rule" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.action_hr_salary_rule_category_tree_view +#: model:ir.ui.menu,name:hr_payroll.menu_hr_salary_rule_category_tree_view +msgid "Salary Rule Categories Hierarchy" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 field:hr.payslip.line,total:0 +#: report:paylip.details:0 report:payslip:0 +msgid "Total" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,appears_on_payslip:0 +#: help:hr.salary.rule,appears_on_payslip:0 +msgid "Used for the display of rule on payslip" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.line:0 +msgid "Search Payslip Lines" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Details By Salary Rule Category" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.input,code:0 help:hr.payslip.worked_days,code:0 +#: help:hr.rule.input,code:0 +msgid "The code that can be used in the salary rules" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.run:0 +#: model:ir.actions.act_window,name:hr_payroll.action_hr_payslip_by_employees +msgid "Generate Payslips" +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Bi-weekly" +msgstr "" + +#. module: hr_payroll +#: field:hr.employee,total_wage:0 +msgid "Total Basic Salary" +msgstr "" + +#. module: hr_payroll +#: selection:hr.payslip.line,condition_select:0 +#: selection:hr.salary.rule,condition_select:0 +msgid "Always True" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 +msgid "PaySlip Name" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,condition_range:0 +#: field:hr.salary.rule,condition_range:0 +msgid "Range Based on" +msgstr "" diff --git a/addons/hr_payroll_account/i18n/gu.po b/addons/hr_payroll_account/i18n/gu.po new file mode 100644 index 00000000000..be0856904f0 --- /dev/null +++ b/addons/hr_payroll_account/i18n/gu.po @@ -0,0 +1,140 @@ +# Gujarati translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-03-06 18:24+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-07 05:13+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. module: hr_payroll_account +#: field:hr.payslip,move_id:0 +msgid "Accounting Entry" +msgstr "" + +#. module: hr_payroll_account +#: field:hr.salary.rule,account_tax_id:0 +msgid "Tax Code" +msgstr "" + +#. module: hr_payroll_account +#: field:hr.payslip,journal_id:0 +#: field:hr.payslip.run,journal_id:0 +msgid "Expense Journal" +msgstr "" + +#. module: hr_payroll_account +#: code:addons/hr_payroll_account/hr_payroll_account.py:157 +#: code:addons/hr_payroll_account/hr_payroll_account.py:173 +#, python-format +msgid "Adjustment Entry" +msgstr "" + +#. module: hr_payroll_account +#: field:hr.contract,analytic_account_id:0 +#: field:hr.salary.rule,analytic_account_id:0 +msgid "Analytic Account" +msgstr "વિશ્લેષણાત્મક ખાતું" + +#. module: hr_payroll_account +#: model:ir.model,name:hr_payroll_account.model_hr_salary_rule +msgid "hr.salary.rule" +msgstr "" + +#. module: hr_payroll_account +#: model:ir.model,name:hr_payroll_account.model_hr_payslip_run +msgid "Payslip Batches" +msgstr "" + +#. module: hr_payroll_account +#: field:hr.contract,journal_id:0 +msgid "Salary Journal" +msgstr "" + +#. module: hr_payroll_account +#: model:ir.model,name:hr_payroll_account.model_hr_payslip +msgid "Pay Slip" +msgstr "" + +#. module: hr_payroll_account +#: constraint:hr.payslip:0 +msgid "Payslip 'Date From' must be before 'Date To'." +msgstr "" + +#. module: hr_payroll_account +#: help:hr.payslip,period_id:0 +msgid "Keep empty to use the period of the validation(Payslip) date." +msgstr "" + +#. module: hr_payroll_account +#: code:addons/hr_payroll_account/hr_payroll_account.py:171 +#, python-format +msgid "" +"The Expense Journal \"%s\" has not properly configured the Debit Account!" +msgstr "" + +#. module: hr_payroll_account +#: code:addons/hr_payroll_account/hr_payroll_account.py:155 +#, python-format +msgid "" +"The Expense Journal \"%s\" has not properly configured the Credit Account!" +msgstr "" + +#. module: hr_payroll_account +#: field:hr.salary.rule,account_debit:0 +msgid "Debit Account" +msgstr "" + +#. module: hr_payroll_account +#: code:addons/hr_payroll_account/hr_payroll_account.py:102 +#, python-format +msgid "Payslip of %s" +msgstr "" + +#. module: hr_payroll_account +#: model:ir.model,name:hr_payroll_account.model_hr_contract +msgid "Contract" +msgstr "કરાર" + +#. module: hr_payroll_account +#: constraint:hr.contract:0 +msgid "Error! contract start-date must be lower then contract end-date." +msgstr "" + +#. module: hr_payroll_account +#: field:hr.payslip,period_id:0 +msgid "Force Period" +msgstr "" + +#. module: hr_payroll_account +#: field:hr.salary.rule,account_credit:0 +msgid "Credit Account" +msgstr "" + +#. module: hr_payroll_account +#: model:ir.model,name:hr_payroll_account.model_hr_payslip_employees +msgid "Generate payslips for all selected employees" +msgstr "" + +#. module: hr_payroll_account +#: code:addons/hr_payroll_account/hr_payroll_account.py:155 +#: code:addons/hr_payroll_account/hr_payroll_account.py:171 +#, python-format +msgid "Configuration Error!" +msgstr "રેખાંકન ભૂલ" + +#. module: hr_payroll_account +#: view:hr.contract:0 +#: view:hr.salary.rule:0 +msgid "Accounting" +msgstr "ગણતરી" diff --git a/addons/web_dashboard/i18n/ja.po b/addons/web_dashboard/i18n/ja.po new file mode 100644 index 00000000000..177be1cc222 --- /dev/null +++ b/addons/web_dashboard/i18n/ja.po @@ -0,0 +1,111 @@ +# Japanese translation for openerp-web +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openerp-web package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openerp-web\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-14 15:27+0100\n" +"PO-Revision-Date: 2012-03-06 06:40+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: 2012-03-07 05:38+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. openerp-web +#: addons/web_dashboard/static/src/js/dashboard.js:63 +msgid "Edit Layout" +msgstr "レイアウトを編集" + +#. openerp-web +#: addons/web_dashboard/static/src/js/dashboard.js:109 +msgid "Are you sure you want to remove this item ?" +msgstr "この項目を取り除きますか?" + +#. openerp-web +#: addons/web_dashboard/static/src/js/dashboard.js:316 +msgid "Uncategorized" +msgstr "未分類" + +#. openerp-web +#: addons/web_dashboard/static/src/js/dashboard.js:324 +#, python-format +msgid "Execute task \"%s\"" +msgstr "タスク \"%s\" を実行" + +#. openerp-web +#: addons/web_dashboard/static/src/js/dashboard.js:325 +msgid "Mark this task as done" +msgstr "このタスクを完了" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:4 +msgid "Reset Layout.." +msgstr "レイアウトをリセット" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:6 +msgid "Reset" +msgstr "リセット" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:8 +msgid "Change Layout.." +msgstr "レイアウトを変更…" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:10 +msgid "Change Layout" +msgstr "レイアウトを変更" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:27 +msgid " " +msgstr " " + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:28 +msgid "Create" +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:39 +msgid "Choose dashboard layout" +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:62 +msgid "progress:" +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:67 +msgid "" +"Click on the functionalites listed below to launch them and configure your " +"system" +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:110 +msgid "Welcome to OpenERP" +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:118 +msgid "Remember to bookmark" +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:119 +msgid "This url" +msgstr "" + +#. openerp-web +#: addons/web_dashboard/static/src/xml/web_dashboard.xml:121 +msgid "Your login:" +msgstr "" diff --git a/addons/web_kanban/i18n/ja.po b/addons/web_kanban/i18n/ja.po new file mode 100644 index 00000000000..e5c5afdf5ac --- /dev/null +++ b/addons/web_kanban/i18n/ja.po @@ -0,0 +1,55 @@ +# Japanese translation for openerp-web +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openerp-web package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openerp-web\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-14 15:27+0100\n" +"PO-Revision-Date: 2012-03-06 06:35+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: 2012-03-07 05:38+0000\n" +"X-Generator: Launchpad (build 14907)\n" + +#. openerp-web +#: addons/web_kanban/static/src/js/kanban.js:10 +msgid "Kanban" +msgstr "看板" + +#. openerp-web +#: addons/web_kanban/static/src/js/kanban.js:294 +#: addons/web_kanban/static/src/js/kanban.js:295 +msgid "Undefined" +msgstr "未定義" + +#. openerp-web +#: addons/web_kanban/static/src/js/kanban.js:469 +#: addons/web_kanban/static/src/js/kanban.js:470 +msgid "Are you sure you want to delete this record ?" +msgstr "このレコードを削除しますか?" + +#. openerp-web +#: addons/web_kanban/static/src/xml/web_kanban.xml:5 +msgid "Create" +msgstr "作成" + +#. openerp-web +#: addons/web_kanban/static/src/xml/web_kanban.xml:41 +msgid "Show more... (" +msgstr "もっと表示する…(" + +#. openerp-web +#: addons/web_kanban/static/src/xml/web_kanban.xml:41 +msgid "remaining)" +msgstr "残り)" + +#. openerp-web +#: addons/web_kanban/static/src/xml/web_kanban.xml:59 +msgid "" +msgstr "" From 98341230a78fe9798b55d3a4173b17a00d8d9a0f Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Mar 2012 08:46:41 +0100 Subject: [PATCH 28/39] [FIX] context evaluation: accumulation of literal and compound context data into evaluated context bzr revid: xmo@openerp.com-20120307074641-pm5wl9t3cb4l9s64 --- addons/web/static/src/js/core.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 6e44394c8a2..6f9773a676e 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -514,10 +514,11 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. _(contexts).each(function (ctx) { switch(ctx.__ref) { case 'context': - _.extend(py.eval(ctx.__debug)); + _.extend(result_context, py.eval(ctx.__debug)); break; case 'compound_context': - _.extend(self.test_eval_contexts(ctx.__contexts)); + _.extend( + result_context, self.test_eval_contexts(ctx.__contexts)); break; default: _.extend(result_context, ctx); From d59a1d3a9b6f8894495df7672b68883a96aba6fe Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Mar 2012 08:49:07 +0100 Subject: [PATCH 29/39] [FIX] audittrail: stupid typo bzr revid: xmo@openerp.com-20120307074907-15jw4zl317a1qzit --- addons/audittrail/audittrail.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py index 08bcb1050d1..5147448733a 100644 --- a/addons/audittrail/audittrail.py +++ b/addons/audittrail/audittrail.py @@ -498,7 +498,7 @@ class audittrail_objects_proxy(object_proxy): fct_src = super(audittrail_objects_proxy, self).exec_workflow_cr if self.check_rules(cr,uid,model,'workflow'): return self.log_fct(cr, uid, model, method, fct_src, *args, **kw) - return fct_src(cr, uid, model, method, *argsm **kw) + return fct_src(cr, uid, model, method, *args, **kw) audittrail_objects_proxy() From dbcac346d66012b9615ff2697ebb60dcea245d02 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Mar 2012 10:12:54 +0100 Subject: [PATCH 30/39] [IMP] simplify opacity mixin, add missing variants to vertical and radial gradients bzr revid: xmo@openerp.com-20120307091254-x9kg0ua1twbjmxp9 --- addons/web/static/src/css/base.css | 26 ++++++++++++++------------ addons/web/static/src/css/base.sass | 19 +++++++++++-------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index b81dea89050..52dcc46ec15 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -29,10 +29,13 @@ height: 31px; border-top: solid 1px #d3d3d3; border-bottom: solid 1px black; - background: #646060; - background: -moz-linear-gradient(#646060, #262626); - background: -webkit-gradient(linear, left top, left bottom, from(#646060), to(#262626)); - background: -webkit-linear-gradient(#646060, #262626); + background-color: #646060; + background-image: -webkit-gradient(linear, left top, left bottom, from(#646060), to(#262626)); + background-image: -webkit-linear-gradient(top, #646060, #262626); + background-image: -moz-linear-gradient(top, #646060, #262626); + background-image: -ms-linear-gradient(top, #646060, #262626); + background-image: -o-linear-gradient(top, #646060, #262626); + background-image: linear-gradient(to bottom, #646060, #262626); } .openerp2 .oe_topbar .oe_systray { float: right; @@ -226,8 +229,6 @@ border-bottom: 4px solid transparent; border-left: 4px solid #4c4c4c; filter: alpha(opacity=50); - -khtml-opacity: 0.5; - -moz-opacity: 0.5; opacity: 0.5; } .openerp2 .oe_secondary_submenu .oe_menu_opened:before { @@ -263,8 +264,6 @@ border-right: 4px solid transparent; border-top: 4px solid white; filter: alpha(opacity=50); - -khtml-opacity: 0.5; - -moz-opacity: 0.5; opacity: 0.5; } .openerp2 .oe_user_menu .oe_dropdown_options { @@ -309,10 +308,13 @@ color: #eeeeee; } .openerp2 .oe_user_menu .oe_dropdown_options li a:hover { - background: #292929; - background: -moz-linear-gradient(#292929, #191919); - background: -webkit-gradient(linear, left top, left bottom, from(#292929), to(#191919)); - background: -webkit-linear-gradient(#292929, #191919); + background-color: #292929; + background-image: -webkit-gradient(linear, left top, left bottom, from(#292929), to(#191919)); + background-image: -webkit-linear-gradient(top, #292929, #191919); + background-image: -moz-linear-gradient(top, #292929, #191919); + background-image: -ms-linear-gradient(top, #292929, #191919); + background-image: -o-linear-gradient(top, #292929, #191919); + background-image: linear-gradient(to bottom, #292929, #191919); -moz-box-shadow: none; -webkit-box-shadow: none; -box-shadow: none; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index cfb8178de12..92b8101f2b7 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -5,16 +5,21 @@ $colour4: #8a89ba // Mixins {{{ @mixin vertical-gradient($startColor: #555, $endColor: #333) - background: $startColor - background: -moz-linear-gradient($startColor, $endColor) - background: -webkit-gradient(linear, left top, left bottom, from($startColor), to($endColor)) - background: -webkit-linear-gradient($startColor, $endColor) + background-color: $startColor + background-image: -webkit-gradient(linear, left top, left bottom, from($startColor), to($endColor)) /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, $startColor, $endColor) /* Chrome 10+, Saf5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, $startColor, $endColor) /* FF3.6 */ + background-image: -ms-linear-gradient(top, $startColor, $endColor) /* IE10 */ + background-image: -o-linear-gradient(top, $startColor, $endColor) /* Opera 11.10+ */ + background-image: linear-gradient(to bottom, $startColor, $endColor) + @mixin radial-gradient($gradient) background-position: center center - background-image: radial-gradient($gradient) - background-image: -moz-radial-gradient($gradient) background-image: -webkit-radial-gradient(circle, $gradient) + background-image: -moz-radial-gradient($gradient) + background-image: -ms-radial-gradient($gradient) + background-image: radial-gradient($gradient) @mixin radius($radius: 5px) -moz-border-radius: $radius @@ -35,8 +40,6 @@ $colour4: #8a89ba @mixin opacity($opacity: .5) filter: alpha(opacity=$opacity * 100) - -khtml-opacity: $opacity - -moz-opacity: $opacity opacity: $opacity @mixin background-clip($clip: padding-box) From 80ebf90a7c411342cc280cb2824f117fad15bb55 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Mar 2012 10:57:32 +0100 Subject: [PATCH 31/39] [IMP] debug messages of test evaluator bzr revid: xmo@openerp.com-20120307095732-ckfuowa43i7dkapg --- addons/web/static/src/js/core.js | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 6f9773a676e..f464bded13b 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -468,45 +468,57 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. relativedelta: relativedelta }; }, + /** + * FIXME: Huge testing hack, especially the evaluation context, rewrite + test for real before switching + */ test_eval: function (source, expected) { try { var ctx = this.test_eval_contexts(source.contexts); if (!_.isEqual(ctx, expected.context)) { - console.group('Local context does not match remote'); + console.group('Local context does not match remote, nothing is broken but please report to R&D (xmo)'); console.warn('source', source.contexts); console.warn('local', ctx); console.warn('remote', expected.context); console.groupEnd(); } } catch (e) { - console.error( - 'Failed to evaluate contexts', source.contexts, ':', e); + console.group('Failed to evaluate contexts, nothing is broken but please report to R&D (xmo)'); + console.error(e); + console.log('source', source.contexts); + console.groupEnd(); } try { var dom = this.test_eval_domains(source.domains, this.test_eval_get_context()); if (!_.isEqual(dom, expected.domain)) { - console.group('Local domain does not match remote'); + console.group('Local domain does not match remote, nothing is broken but please report to R&D (xmo)'); console.warn('source', source.domains); console.warn('local', dom); console.warn('remote', expected.domain); console.groupEnd(); } } catch (e) { - console.error( - 'Failed to evaluate domains', source.domains, ':', e); + console.group('Failed to evaluate domains, nothing is broken but please report to R&D (xmo)'); + console.error(e); + console.log('source', source.domains); + console.groupEnd(); } try { var groups = this.test_eval_groupby(source.group_by_seq); if (!_.isEqual(groups, expected.group_by)) { - console.group('Local groupby does not match remote'); + console.group('Local groupby does not match remote, nothing is broken but please report to R&D (xmo)'); console.warn('source', source.group_by_seq); console.warn('local', groups); console.warn('remote', expected.group_by); console.groupEnd(); } - } catch (e) {} + } catch (e) { + console.group('Failed to evaluate groupby, nothing is broken but please report to R&D (xmo)'); + console.error(e); + console.log('source', source.group_by_seq); + console.groupEnd(); + } }, test_eval_contexts: function (contexts) { var result_context = _.extend({}, this.user_context), From 8c65ef53b93e6e1a8bdc8082b6d3706443875fc5 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 7 Mar 2012 16:05:00 +0100 Subject: [PATCH 32/39] [imp] minor feature in the web client class to set the content to full screen bzr revid: nicolas.vanhoren@openerp.com-20120307150500-o8kkxp4ohrtzjq69 --- addons/web/static/src/js/chrome.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 20750f07a4e..cd3ff72ff6a 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -1127,6 +1127,12 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie self.menu.on_menu_click(null, action.menu_id); }); } + }, + set_content_full_screen: function(fullscreen) { + if (fullscreen) + this.$element.addClass("oe_content_full_screen"); + else + this.$element.removeClass("oe_content_full_screen"); } }); From df1cfd1e8f1b8f65bc5e28fecf7c9b79aefd4aa7 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 7 Mar 2012 16:05:49 +0100 Subject: [PATCH 33/39] [imp] changed the way the point of sale switch to fullscreen bzr revid: nicolas.vanhoren@openerp.com-20120307150549-rzkjz0j79l6mpjqs --- addons/point_of_sale/static/src/js/pos.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/addons/point_of_sale/static/src/js/pos.js b/addons/point_of_sale/static/src/js/pos.js index 1885604d42c..8554877d506 100644 --- a/addons/point_of_sale/static/src/js/pos.js +++ b/addons/point_of_sale/static/src/js/pos.js @@ -1325,8 +1325,7 @@ openerp.point_of_sale = function(db) { }); pos.app = new App(self.$element); - $('.oe_toggle_secondary_menu').hide(); - $('.oe_footer').hide(); + db.webclient.set_content_full_screen(true); if (pos.store.get('account.bank.statement').length === 0) return new db.web.Model("ir.model.data").get_func("search_read")([['name', '=', 'action_pos_open_statement']], ['res_id']).pipe( @@ -1384,8 +1383,7 @@ openerp.point_of_sale = function(db) { }, this)); }, destroy: function() { - $('.oe_footer').show(); - $('.oe_toggle_secondary_menu').show(); + db.webclient.set_content_full_screen(false); pos = undefined; this._super(); } From 659ab1ff3b85c0035e8c4b23852973a0ee331888 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 7 Mar 2012 16:55:29 +0100 Subject: [PATCH 34/39] [imp] changed detail in full screen feature bzr revid: nicolas.vanhoren@openerp.com-20120307155529-t83uabjx0ocm8mjq --- addons/web/static/src/js/chrome.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index cd3ff72ff6a..829610f2988 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -1130,9 +1130,9 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie }, set_content_full_screen: function(fullscreen) { if (fullscreen) - this.$element.addClass("oe_content_full_screen"); + $(".oe_webclient", this.$element).addClass("oe_content_full_screen"); else - this.$element.removeClass("oe_content_full_screen"); + $(".oe_webclient", this.$element).removeClass("oe_content_full_screen"); } }); From b06d76c51f69c0c3352de53bf78390027321bcaa Mon Sep 17 00:00:00 2001 From: Minh Tran Date: Wed, 7 Mar 2012 17:05:12 +0100 Subject: [PATCH 35/39] Added CSS for fullscreen mode (eg. for the point of sale) bzr revid: mit@openerp.com-20120307160512-fziwyn40i45dgxap --- addons/web/static/src/css/base.css | 590 +++++++++++++--------------- addons/web/static/src/css/base.sass | 9 + 2 files changed, 285 insertions(+), 314 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 52dcc46ec15..dab8e6070af 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -5,317 +5,279 @@ color: #4c4c4c; font-size: 13px; background: white; - position: relative; -} -.openerp2 a { - text-decoration: none; -} -.openerp2 .oe_webclient { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; -} -.openerp2 .oe_webclient .oe_application { - position: absolute; - top: 32px; - bottom: 0; - left: 206px; - right: 0; -} -.openerp2 .oe_topbar { - width: 100%; - height: 31px; - border-top: solid 1px #d3d3d3; - border-bottom: solid 1px black; - background-color: #646060; - background-image: -webkit-gradient(linear, left top, left bottom, from(#646060), to(#262626)); - background-image: -webkit-linear-gradient(top, #646060, #262626); - background-image: -moz-linear-gradient(top, #646060, #262626); - background-image: -ms-linear-gradient(top, #646060, #262626); - background-image: -o-linear-gradient(top, #646060, #262626); - background-image: linear-gradient(to bottom, #646060, #262626); -} -.openerp2 .oe_topbar .oe_systray { - float: right; -} -.openerp2 .oe_topbar .oe_systray > div { - float: left; - padding: 0 4px 0 4px; -} -.openerp2 .oe_topbar .oe_topbar_item li { - float: left; -} -.openerp2 .oe_topbar .oe_topbar_item li a { - display: block; - padding: 5px 10px 7px; - line-height: 20px; - height: 20px; - color: #eeeeee; - vertical-align: top; - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); -} -.openerp2 .oe_topbar .oe_topbar_item li a:hover { - background: #303030; - color: white; - -moz-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; - -webkit-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; - -box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; -} -.openerp2 .oe_topbar .oe_topbar_item .oe_active { - background: #303030; - font-weight: bold; - color: white; - -moz-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; - -webkit-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; - -box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; -} -.openerp2 .oe_topbar .oe_topbar_avatar { - width: 24px; - height: 24px; - margin: -2px 2px 0 0; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; -} -.openerp2 .oe_topbar .oe_topbar_avatar { - vertical-align: top; -} -.openerp2 .oe_leftbar { - width: 205px; - height: 100%; - background: #f0eeee; - border-right: 1px solid #afafb6; - overflow: auto; - text-shadow: 0 1px 1px white; -} -.openerp2 .oe_leftbar .oe_footer { - position: absolute; - width: 205px; - text-align: center; - bottom: 8px; -} -.openerp2 a.oe_logo { - display: block; - text-align: center; - height: 70px; - line-height: 70px; -} -.openerp2 a.oe_logo img { - height: 40px; - width: 157px; - margin: 14px 0; -} -.openerp2 .oe_footer { - position: absolute; - width: 205px; - text-align: center; - bottom: 8px; -} -.openerp2 .oe_footer a { - font-weight: 800; - font-family: serif; - font-size: 16px; - color: black; -} -.openerp2 .oe_footer a span { - color: #c81010; - font-style: italic; -} -.openerp2 .oe_menu { - float: left; - padding: 0; - margin: 0; -} -.openerp2 .oe_menu li { - list-style-type: none; - float: left; -} -.openerp2 .oe_menu a { - display: block; - padding: 5px 10px 7px; - line-height: 20px; - height: 20px; - color: #eeeeee; - vertical-align: top; - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); -} -.openerp2 .oe_menu a:hover { - background: #303030; - color: white; - -moz-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; - -webkit-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; - -box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; -} -.openerp2 .oe_menu .oe_active { - background: #303030; - font-weight: bold; - color: white; - -moz-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; - -webkit-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; - -box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; -} -.openerp2 .oe_secondary_menu_section { - font-weight: bold; - margin-left: 8px; - color: #8a89ba; -} -.openerp2 .oe_secondary_submenu { - padding: 2px 0 8px 0; - margin: 0; - width: 100%; - display: inline-block; -} -.openerp2 .oe_secondary_submenu li { - position: relative; - padding: 1px 0 1px 16px; - list-style-type: none; -} -.openerp2 .oe_secondary_submenu li a { - display: block; - color: #4c4c4c; - padding: 2px 4px 2px 0; -} -.openerp2 .oe_secondary_submenu li .oe_menu_label { - position: absolute; - top: 1px; - right: 1px; - font-size: 10px; - background: #8a89ba; - color: white; - padding: 2px 4px; - margin: 1px 6px 0 0; - border: 1px solid lightGray; - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); - -box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); -} -.openerp2 .oe_secondary_submenu .oe_active { - background: #8a89ba; - border-top: 1px solid lightGray; - border-bottom: 1px solid lightGray; - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); - -box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); -} -.openerp2 .oe_secondary_submenu .oe_active a { - color: white; -} -.openerp2 .oe_secondary_submenu .oe_active .oe_menu_label { - background: #eeeeee; - color: #8a89ba; - text-shadow: 0 1px 1px white; - -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); - -box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); -} -.openerp2 .oe_secondary_submenu .oe_menu_toggler:before { - width: 0; - height: 0; - display: inline-block; - content: "&darr"; - text-indent: -99999px; - vertical-align: top; - margin-left: -8px; - margin-top: 4px; - margin-right: 4px; - border-top: 4px solid transparent; - border-bottom: 4px solid transparent; - border-left: 4px solid #4c4c4c; - filter: alpha(opacity=50); - opacity: 0.5; -} -.openerp2 .oe_secondary_submenu .oe_menu_opened:before { - margin-top: 6px; - margin-left: -12px; - margin-right: 4px; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid #4c4c4c; -} -.openerp2 .oe_user_menu { - float: right; - padding: 0; - margin: 0; -} -.openerp2 .oe_user_menu li { - list-style-type: none; - float: left; -} -.openerp2 .oe_user_menu .oe_dropdown { - position: relative; -} -.openerp2 .oe_user_menu .oe_dropdown_toggle:after { - width: 0; - height: 0; - display: inline-block; - content: "&darr"; - text-indent: -99999px; - vertical-align: top; - margin-top: 8px; - margin-left: 4px; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid white; - filter: alpha(opacity=50); - opacity: 0.5; -} -.openerp2 .oe_user_menu .oe_dropdown_options { - float: left; - background: #333333; - background: rgba(37, 37, 37, 0.9); - display: none; - position: absolute; - top: 32px; - right: -1px; - border: 0; - z-index: 900; - margin-left: 0; - margin-right: 0; - padding: 6px 0; - zoom: 1; - border-color: #999999; - border-color: rgba(0, 0, 0, 0.2); - border-style: solid; - border-width: 0 1px 1px; - -moz-border-radius: 0 0 6px 6px; - -webkit-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); - -box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} -.openerp2 .oe_user_menu .oe_dropdown_options li { - float: none; - display: block; - background-color: none; -} -.openerp2 .oe_user_menu .oe_dropdown_options li a { - display: block; - padding: 4px 15px; - clear: both; - font-weight: normal; - line-height: 18px; - color: #eeeeee; -} -.openerp2 .oe_user_menu .oe_dropdown_options li a:hover { - background-color: #292929; - background-image: -webkit-gradient(linear, left top, left bottom, from(#292929), to(#191919)); - background-image: -webkit-linear-gradient(top, #292929, #191919); - background-image: -moz-linear-gradient(top, #292929, #191919); - background-image: -ms-linear-gradient(top, #292929, #191919); - background-image: -o-linear-gradient(top, #292929, #191919); - background-image: linear-gradient(to bottom, #292929, #191919); - -moz-box-shadow: none; - -webkit-box-shadow: none; - -box-shadow: none; -} + position: relative; } + .openerp2 a { + text-decoration: none; } + .openerp2 .oe_webclient { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; } + .openerp2 .oe_webclient .oe_application { + position: absolute; + top: 32px; + bottom: 0; + left: 206px; + right: 0; } + .openerp2 .oe_content_full_screen .oe_application { + top: 0; + left: 0; } + .openerp2 .oe_content_full_screen .topbar, .openerp2 .oe_content_full_screen .leftbar { + display: none; } + .openerp2 .oe_topbar { + width: 100%; + height: 31px; + border-top: solid 1px #d3d3d3; + border-bottom: solid 1px black; + background-color: #646060; + background-image: -webkit-gradient(linear, left top, left bottom, from(#646060), to(#262626)); + background-image: -webkit-linear-gradient(top, #646060, #262626); + background-image: -moz-linear-gradient(top, #646060, #262626); + background-image: -ms-linear-gradient(top, #646060, #262626); + background-image: -o-linear-gradient(top, #646060, #262626); + background-image: linear-gradient(to bottom, #646060, #262626); } + .openerp2 .oe_topbar .oe_systray { + float: right; } + .openerp2 .oe_topbar .oe_systray > div { + float: left; + padding: 0 4px 0 4px; } + .openerp2 .oe_topbar .oe_topbar_item li { + float: left; } + .openerp2 .oe_topbar .oe_topbar_item li a { + display: block; + padding: 5px 10px 7px; + line-height: 20px; + height: 20px; + color: #eeeeee; + vertical-align: top; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); } + .openerp2 .oe_topbar .oe_topbar_item li a:hover { + background: #303030; + color: white; + -moz-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; + -webkit-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; + -box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; } + .openerp2 .oe_topbar .oe_topbar_item .oe_active { + background: #303030; + font-weight: bold; + color: white; + -moz-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; + -webkit-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; + -box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; } + .openerp2 .oe_topbar .oe_topbar_avatar { + width: 24px; + height: 24px; + margin: -2px 2px 0 0; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; } + .openerp2 .oe_topbar .oe_topbar_avatar { + vertical-align: top; } + .openerp2 .oe_leftbar { + width: 205px; + height: 100%; + background: #f0eeee; + border-right: 1px solid #afafb6; + overflow: auto; + text-shadow: 0 1px 1px white; } + .openerp2 .oe_leftbar .oe_footer { + position: absolute; + width: 205px; + text-align: center; + bottom: 8px; } + .openerp2 a.oe_logo { + display: block; + text-align: center; + height: 70px; + line-height: 70px; } + .openerp2 a.oe_logo img { + height: 40px; + width: 157px; + margin: 14px 0; } + .openerp2 .oe_footer { + position: absolute; + width: 205px; + text-align: center; + bottom: 8px; } + .openerp2 .oe_footer a { + font-weight: 800; + font-family: serif; + font-size: 16px; + color: black; } + .openerp2 .oe_footer a span { + color: #c81010; + font-style: italic; } + .openerp2 .oe_menu { + float: left; + padding: 0; + margin: 0; } + .openerp2 .oe_menu li { + list-style-type: none; + float: left; } + .openerp2 .oe_menu a { + display: block; + padding: 5px 10px 7px; + line-height: 20px; + height: 20px; + color: #eeeeee; + vertical-align: top; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); } + .openerp2 .oe_menu a:hover { + background: #303030; + color: white; + -moz-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; + -webkit-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; + -box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; } + .openerp2 .oe_menu .oe_active { + background: #303030; + font-weight: bold; + color: white; + -moz-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; + -webkit-box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; + -box-shadow: 0 1px 2px rgba(255, 255, 255, 0.3) inset; } + .openerp2 .oe_secondary_menu_section { + font-weight: bold; + margin-left: 8px; + color: #8a89ba; } + .openerp2 .oe_secondary_submenu { + padding: 2px 0 8px 0; + margin: 0; + width: 100%; + display: inline-block; } + .openerp2 .oe_secondary_submenu li { + position: relative; + padding: 1px 0 1px 16px; + list-style-type: none; } + .openerp2 .oe_secondary_submenu li a { + display: block; + color: #4c4c4c; + padding: 2px 4px 2px 0; } + .openerp2 .oe_secondary_submenu li .oe_menu_label { + position: absolute; + top: 1px; + right: 1px; + font-size: 10px; + background: #8a89ba; + color: white; + padding: 2px 4px; + margin: 1px 6px 0 0; + border: 1px solid lightGray; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); } + .openerp2 .oe_secondary_submenu .oe_active { + background: #8a89ba; + border-top: 1px solid lightGray; + border-bottom: 1px solid lightGray; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); } + .openerp2 .oe_secondary_submenu .oe_active a { + color: white; } + .openerp2 .oe_secondary_submenu .oe_active .oe_menu_label { + background: #eeeeee; + color: #8a89ba; + text-shadow: 0 1px 1px white; + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + -box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); } + .openerp2 .oe_secondary_submenu .oe_menu_toggler:before { + width: 0; + height: 0; + display: inline-block; + content: "&darr"; + text-indent: -99999px; + vertical-align: top; + margin-left: -8px; + margin-top: 4px; + margin-right: 4px; + border-top: 4px solid transparent; + border-bottom: 4px solid transparent; + border-left: 4px solid #4c4c4c; + filter: alpha(opacity=50); + opacity: 0.5; } + .openerp2 .oe_secondary_submenu .oe_menu_opened:before { + margin-top: 6px; + margin-left: -12px; + margin-right: 4px; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid #4c4c4c; } + .openerp2 .oe_user_menu { + float: right; + padding: 0; + margin: 0; } + .openerp2 .oe_user_menu li { + list-style-type: none; + float: left; } + .openerp2 .oe_user_menu .oe_dropdown { + position: relative; } + .openerp2 .oe_user_menu .oe_dropdown_toggle:after { + width: 0; + height: 0; + display: inline-block; + content: "&darr"; + text-indent: -99999px; + vertical-align: top; + margin-top: 8px; + margin-left: 4px; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid white; + filter: alpha(opacity=50); + opacity: 0.5; } + .openerp2 .oe_user_menu .oe_dropdown_options { + float: left; + background: #333333; + background: rgba(37, 37, 37, 0.9); + display: none; + position: absolute; + top: 32px; + right: -1px; + border: 0; + z-index: 900; + margin-left: 0; + margin-right: 0; + padding: 6px 0; + zoom: 1; + border-color: #999999; + border-color: rgba(0, 0, 0, 0.2); + border-style: solid; + border-width: 0 1px 1px; + -moz-border-radius: 0 0 6px 6px; + -webkit-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); + -box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; } + .openerp2 .oe_user_menu .oe_dropdown_options li { + float: none; + display: block; + background-color: none; } + .openerp2 .oe_user_menu .oe_dropdown_options li a { + display: block; + padding: 4px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #eeeeee; } + .openerp2 .oe_user_menu .oe_dropdown_options li a:hover { + background-color: #292929; + background-image: -webkit-gradient(linear, left top, left bottom, from(#292929), to(#191919)); + background-image: -webkit-linear-gradient(top, #292929, #191919); + background-image: -moz-linear-gradient(top, #292929, #191919); + background-image: -ms-linear-gradient(top, #292929, #191919); + background-image: -o-linear-gradient(top, #292929, #191919); + background-image: linear-gradient(to bottom, #292929, #191919); + -moz-box-shadow: none; + -webkit-box-shadow: none; + -box-shadow: none; } diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 92b8101f2b7..56a735c98fd 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -78,6 +78,15 @@ $colour4: #8a89ba right: 0 // }}} + // Fullscreen mode {{{ + .oe_content_full_screen + .oe_application + top: 0 + left: 0 + .topbar, .leftbar + display: none + // }} + // Topbar {{{ .oe_topbar width: 100% From dabd80eaafdedc7e6ee1f280a7fa2796863c3b7f Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Thu, 8 Mar 2012 04:43:45 +0000 Subject: [PATCH 36/39] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20120308044345-k1iwqynbbewkyyoi --- .../i18n/sr@latin.po | 381 ++++++++++++++++ addons/account_budget/i18n/gu.po | 417 ++++++++++++++++++ 2 files changed, 798 insertions(+) create mode 100644 addons/account_bank_statement_extensions/i18n/sr@latin.po create mode 100644 addons/account_budget/i18n/gu.po diff --git a/addons/account_bank_statement_extensions/i18n/sr@latin.po b/addons/account_bank_statement_extensions/i18n/sr@latin.po new file mode 100644 index 00000000000..b8551612a9e --- /dev/null +++ b/addons/account_bank_statement_extensions/i18n/sr@latin.po @@ -0,0 +1,381 @@ +# Serbian Latin translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:35+0000\n" +"PO-Revision-Date: 2012-03-07 18:50+0000\n" +"Last-Translator: Milan Milosevic \n" +"Language-Team: Serbian Latin \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-08 04:43+0000\n" +"X-Generator: Launchpad (build 14914)\n" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Search Bank Transactions" +msgstr "Pretraži bankovne transakcije" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +#: selection:account.bank.statement.line,state:0 +msgid "Confirmed" +msgstr "Potvrđeno" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement:0 +#: view:account.bank.statement.line:0 +msgid "Glob. Id" +msgstr "Glob. Id" + +#. module: account_bank_statement_extensions +#: selection:account.bank.statement.line.global,type:0 +msgid "CODA" +msgstr "CODA" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,parent_id:0 +msgid "Parent Code" +msgstr "Šifra nadređenog" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Debit" +msgstr "Duguje" + +#. module: account_bank_statement_extensions +#: view:cancel.statement.line:0 +#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_cancel_statement_line +#: model:ir.model,name:account_bank_statement_extensions.model_cancel_statement_line +msgid "Cancel selected statement lines" +msgstr "Otkaži izabrane redove izvoda" + +#. module: account_bank_statement_extensions +#: constraint:res.partner.bank:0 +msgid "The RIB and/or IBAN is not valid" +msgstr "RIB i / ili IBAN nije validan" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Group By..." +msgstr "Grupiši po..." + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,state:0 +msgid "State" +msgstr "Stanje" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +#: selection:account.bank.statement.line,state:0 +msgid "Draft" +msgstr "Nacrt" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Statement" +msgstr "Izvod" + +#. module: account_bank_statement_extensions +#: view:confirm.statement.line:0 +#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_confirm_statement_line +#: model:ir.model,name:account_bank_statement_extensions.model_confirm_statement_line +msgid "Confirm selected statement lines" +msgstr "Potvrdi izabrane redove izvoda" + +#. module: account_bank_statement_extensions +#: report:bank.statement.balance.report:0 +#: model:ir.actions.report.xml,name:account_bank_statement_extensions.bank_statement_balance_report +msgid "Bank Statement Balances Report" +msgstr "Izvod banke o izveštaju balansa" + +#. module: account_bank_statement_extensions +#: view:cancel.statement.line:0 +msgid "Cancel Lines" +msgstr "Otkaži linije" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line.global:0 +#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement_line_global +msgid "Batch Payment Info" +msgstr "Informacije o grupnom plaćanju" + +#. module: account_bank_statement_extensions +#: view:confirm.statement.line:0 +msgid "Confirm Lines" +msgstr "Potvrdi linije" + +#. module: account_bank_statement_extensions +#: code:addons/account_bank_statement_extensions/account_bank_statement.py:130 +#, python-format +msgid "" +"Delete operation not allowed ! Please go to the associated bank " +"statement in order to delete and/or modify this bank statement line" +msgstr "" +"Postupak brisanja nije dozvoljen! Molimo idite do povezanog izvoda banke da " +"biste izbrisali i/ili izmenili taj red izvoda banke" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,type:0 +msgid "Type" +msgstr "Tip" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +#: field:account.bank.statement.line,journal_id:0 +#: report:bank.statement.balance.report:0 +msgid "Journal" +msgstr "Dnevnik" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Confirmed Statement Lines." +msgstr "Potvrđeni redovi izvoda" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Credit Transactions." +msgstr "Kreditne transakcije" + +#. module: account_bank_statement_extensions +#: model:ir.actions.act_window,help:account_bank_statement_extensions.action_cancel_statement_line +msgid "cancel selected statement lines." +msgstr "otkaži izabrane redoive izvode" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,counterparty_number:0 +msgid "Counterparty Number" +msgstr "Broj druge strane" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line.global:0 +msgid "Transactions" +msgstr "Transakcije" + +#. module: account_bank_statement_extensions +#: code:addons/account_bank_statement_extensions/account_bank_statement.py:130 +#, python-format +msgid "Warning" +msgstr "Upozorenje" + +#. module: account_bank_statement_extensions +#: report:bank.statement.balance.report:0 +msgid "Closing Balance" +msgstr "Zatvaranje stanja" + +#. module: account_bank_statement_extensions +#: report:bank.statement.balance.report:0 +msgid "Date" +msgstr "Datum" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +#: field:account.bank.statement.line,globalisation_amount:0 +msgid "Glob. Amount" +msgstr "Uk.iznos" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Debit Transactions." +msgstr "Transakcije dugovanja." + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Extended Filters..." +msgstr "Prošireni filteri..." + +#. module: account_bank_statement_extensions +#: view:confirm.statement.line:0 +msgid "Confirmed lines cannot be changed anymore." +msgstr "Potvrđeni redovi se ne mogu više izmeniti." + +#. module: account_bank_statement_extensions +#: constraint:res.partner.bank:0 +msgid "" +"\n" +"Please define BIC/Swift code on bank for bank type IBAN Account to make " +"valid payments" +msgstr "" +"\n" +"Molimo definišite BIC/Swift kod banke za tip IBAN račun za izvršenje " +"validnih uplata/isplata." + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,val_date:0 +msgid "Valuta Date" +msgstr "Datum valute" + +#. module: account_bank_statement_extensions +#: model:ir.actions.act_window,help:account_bank_statement_extensions.action_confirm_statement_line +msgid "Confirm selected statement lines." +msgstr "Potvrdi izabrane redove izvoda" + +#. module: account_bank_statement_extensions +#: view:cancel.statement.line:0 +msgid "Are you sure you want to cancel the selected Bank Statement lines ?" +msgstr "Da li zaista želite da otkažete izabrane redove izvoda banke?" + +#. module: account_bank_statement_extensions +#: report:bank.statement.balance.report:0 +msgid "Name" +msgstr "Naziv" + +#. module: account_bank_statement_extensions +#: selection:account.bank.statement.line.global,type:0 +msgid "ISO 20022" +msgstr "ISO 20022" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Notes" +msgstr "Beleške" + +#. module: account_bank_statement_extensions +#: selection:account.bank.statement.line.global,type:0 +msgid "Manual" +msgstr "Uputstvo" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Credit" +msgstr "Kredit" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,amount:0 +msgid "Amount" +msgstr "Iznos" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Fin.Account" +msgstr "Kon.račun" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,counterparty_currency:0 +msgid "Counterparty Currency" +msgstr "Valuta druge strane" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,counterparty_bic:0 +msgid "Counterparty BIC" +msgstr "BIC druge strane" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,child_ids:0 +msgid "Child Codes" +msgstr "Podređeni kodovi" + +#. module: account_bank_statement_extensions +#: view:confirm.statement.line:0 +msgid "Are you sure you want to confirm the selected Bank Statement lines ?" +msgstr "Da li zaista želite da izabrane redove izvoda banke?" + +#. module: account_bank_statement_extensions +#: constraint:account.bank.statement.line:0 +msgid "" +"The amount of the voucher must be the same amount as the one on the " +"statement line" +msgstr "Iznos vaučera mora biti isti kao onaj na izvodu računa" + +#. module: account_bank_statement_extensions +#: help:account.bank.statement.line,globalisation_id:0 +msgid "" +"Code to identify transactions belonging to the same globalisation level " +"within a batch payment" +msgstr "" +"Kod za identifikaciju transakcija koje pripadaju istom nivou globalizacije " +"unutar grupnog plaćanja" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Draft Statement Lines." +msgstr "Nacrt redova izvoda." + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Glob. Am." +msgstr "" + +#. module: account_bank_statement_extensions +#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,code:0 +msgid "Code" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,counterparty_name:0 +msgid "Counterparty Name" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,name:0 +msgid "Communication" +msgstr "" + +#. module: account_bank_statement_extensions +#: model:ir.model,name:account_bank_statement_extensions.model_res_partner_bank +msgid "Bank Accounts" +msgstr "" + +#. module: account_bank_statement_extensions +#: constraint:account.bank.statement:0 +msgid "The journal and period chosen have to belong to the same company." +msgstr "" + +#. module: account_bank_statement_extensions +#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement +msgid "Bank Statement" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Statement Line" +msgstr "" + +#. module: account_bank_statement_extensions +#: sql_constraint:account.bank.statement.line.global:0 +msgid "The code must be unique !" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,bank_statement_line_ids:0 +#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_bank_statement_line +#: model:ir.ui.menu,name:account_bank_statement_extensions.bank_statement_line +msgid "Bank Statement Lines" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line.global:0 +msgid "Child Batch Payments" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:cancel.statement.line:0 +#: view:confirm.statement.line:0 +msgid "Cancel" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Statement Lines" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Total Amount" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,globalisation_id:0 +msgid "Globalisation ID" +msgstr "" diff --git a/addons/account_budget/i18n/gu.po b/addons/account_budget/i18n/gu.po new file mode 100644 index 00000000000..2b259a56c8b --- /dev/null +++ b/addons/account_budget/i18n/gu.po @@ -0,0 +1,417 @@ +# Gujarati translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:35+0000\n" +"PO-Revision-Date: 2012-03-07 10:28+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-08 04:43+0000\n" +"X-Generator: Launchpad (build 14914)\n" + +#. module: account_budget +#: field:crossovered.budget,creating_user_id:0 +msgid "Responsible User" +msgstr "" + +#. module: account_budget +#: selection:crossovered.budget,state:0 +msgid "Confirmed" +msgstr "" + +#. module: account_budget +#: model:ir.actions.act_window,name:account_budget.open_budget_post_form +#: model:ir.ui.menu,name:account_budget.menu_budget_post_form +msgid "Budgetary Positions" +msgstr "" + +#. module: account_budget +#: report:account.budget:0 +msgid "Printed at:" +msgstr "" + +#. module: account_budget +#: view:crossovered.budget:0 +msgid "Confirm" +msgstr "ખાતરી કરો" + +#. module: account_budget +#: field:crossovered.budget,validating_user_id:0 +msgid "Validate User" +msgstr "" + +#. module: account_budget +#: model:ir.actions.act_window,name:account_budget.action_account_budget_crossvered_summary_report +msgid "Print Summary" +msgstr "" + +#. module: account_budget +#: field:crossovered.budget.lines,paid_date:0 +msgid "Paid Date" +msgstr "" + +#. module: account_budget +#: field:account.budget.analytic,date_to:0 +#: field:account.budget.crossvered.report,date_to:0 +#: field:account.budget.crossvered.summary.report,date_to:0 +#: field:account.budget.report,date_to:0 +msgid "End of period" +msgstr "" + +#. module: account_budget +#: view:crossovered.budget:0 +#: selection:crossovered.budget,state:0 +msgid "Draft" +msgstr "ડ્રાફ્ટ" + +#. module: account_budget +#: report:account.budget:0 +msgid "at" +msgstr "એટ" + +#. module: account_budget +#: view:account.budget.report:0 +#: model:ir.actions.act_window,name:account_budget.action_account_budget_analytic +#: model:ir.actions.act_window,name:account_budget.action_account_budget_crossvered_report +msgid "Print Budgets" +msgstr "" + +#. module: account_budget +#: report:account.budget:0 +msgid "Currency:" +msgstr "" + +#. module: account_budget +#: model:ir.model,name:account_budget.model_account_budget_crossvered_report +msgid "Account Budget crossvered report" +msgstr "" + +#. module: account_budget +#: selection:crossovered.budget,state:0 +msgid "Validated" +msgstr "" + +#. module: account_budget +#: field:crossovered.budget.lines,percentage:0 +msgid "Percentage" +msgstr "ટકાવારી" + +#. module: account_budget +#: report:crossovered.budget.report:0 +msgid "to" +msgstr "થી" + +#. module: account_budget +#: field:crossovered.budget,state:0 +msgid "Status" +msgstr "સ્થિતિ" + +#. module: account_budget +#: model:ir.actions.act_window,help:account_budget.act_crossovered_budget_view +msgid "" +"A budget is a forecast of your company's income and expenses expected for a " +"period in the future. With a budget, a company is able to carefully look at " +"how much money they are taking in during a given period, and figure out the " +"best way to divide it among various categories. By keeping track of where " +"your money goes, you may be less likely to overspend, and more likely to " +"meet your financial goals. Forecast a budget by detailing the expected " +"revenue per analytic account and monitor its evolution based on the actuals " +"realised during that period." +msgstr "" + +#. module: account_budget +#: code:addons/account_budget/account_budget.py:119 +#, python-format +msgid "The Budget '%s' has no accounts!" +msgstr "" + +#. module: account_budget +#: report:account.budget:0 +#: report:crossovered.budget.report:0 +msgid "%" +msgstr "" + +#. module: account_budget +#: report:account.budget:0 +#: report:crossovered.budget.report:0 +msgid "Description" +msgstr "" + +#. module: account_budget +#: report:crossovered.budget.report:0 +msgid "Currency" +msgstr "" + +#. module: account_budget +#: report:crossovered.budget.report:0 +msgid "Total :" +msgstr "" + +#. module: account_budget +#: field:account.budget.post,company_id:0 +#: field:crossovered.budget,company_id:0 +#: field:crossovered.budget.lines,company_id:0 +msgid "Company" +msgstr "" + +#. module: account_budget +#: view:crossovered.budget:0 +msgid "To Approve" +msgstr "" + +#. module: account_budget +#: view:crossovered.budget:0 +msgid "Reset to Draft" +msgstr "" + +#. module: account_budget +#: view:account.budget.post:0 +#: view:crossovered.budget:0 +#: field:crossovered.budget.lines,planned_amount:0 +msgid "Planned Amount" +msgstr "" + +#. module: account_budget +#: report:account.budget:0 +#: report:crossovered.budget.report:0 +msgid "Perc(%)" +msgstr "" + +#. module: account_budget +#: view:crossovered.budget:0 +#: selection:crossovered.budget,state:0 +msgid "Done" +msgstr "" + +#. module: account_budget +#: report:account.budget:0 +#: report:crossovered.budget.report:0 +msgid "Practical Amt" +msgstr "" + +#. module: account_budget +#: view:account.analytic.account:0 +#: view:account.budget.post:0 +#: view:crossovered.budget:0 +#: field:crossovered.budget.lines,practical_amount:0 +msgid "Practical Amount" +msgstr "" + +#. module: account_budget +#: field:crossovered.budget,date_to:0 +#: field:crossovered.budget.lines,date_to:0 +msgid "End Date" +msgstr "" + +#. module: account_budget +#: model:ir.model,name:account_budget.model_account_budget_analytic +#: model:ir.model,name:account_budget.model_account_budget_report +msgid "Account Budget report for analytic account" +msgstr "" + +#. module: account_budget +#: view:account.analytic.account:0 +msgid "Theoritical Amount" +msgstr "" + +#. module: account_budget +#: field:account.budget.post,name:0 +#: field:crossovered.budget,name:0 +msgid "Name" +msgstr "" + +#. module: account_budget +#: model:ir.model,name:account_budget.model_crossovered_budget_lines +msgid "Budget Line" +msgstr "" + +#. module: account_budget +#: view:account.analytic.account:0 +#: view:account.budget.post:0 +msgid "Lines" +msgstr "" + +#. module: account_budget +#: report:account.budget:0 +#: view:crossovered.budget:0 +#: field:crossovered.budget.lines,crossovered_budget_id:0 +#: report:crossovered.budget.report:0 +#: model:ir.actions.report.xml,name:account_budget.account_budget +#: model:ir.model,name:account_budget.model_crossovered_budget +msgid "Budget" +msgstr "" + +#. module: account_budget +#: view:crossovered.budget:0 +msgid "To Approve Budgets" +msgstr "" + +#. module: account_budget +#: code:addons/account_budget/account_budget.py:119 +#, python-format +msgid "Error!" +msgstr "" + +#. module: account_budget +#: field:account.budget.post,code:0 +#: field:crossovered.budget,code:0 +msgid "Code" +msgstr "" + +#. module: account_budget +#: view:account.budget.analytic:0 +#: view:account.budget.crossvered.report:0 +msgid "This wizard is used to print budget" +msgstr "" + +#. module: account_budget +#: model:ir.actions.act_window,name:account_budget.act_crossovered_budget_view +#: model:ir.actions.act_window,name:account_budget.action_account_budget_post_tree +#: model:ir.actions.act_window,name:account_budget.action_account_budget_report +#: model:ir.actions.report.xml,name:account_budget.report_crossovered_budget +#: model:ir.ui.menu,name:account_budget.menu_act_crossovered_budget_view +#: model:ir.ui.menu,name:account_budget.menu_action_account_budget_post_tree +#: model:ir.ui.menu,name:account_budget.next_id_31 +#: model:ir.ui.menu,name:account_budget.next_id_pos +msgid "Budgets" +msgstr "" + +#. module: account_budget +#: view:account.budget.crossvered.summary.report:0 +msgid "This wizard is used to print summary of budgets" +msgstr "" + +#. module: account_budget +#: selection:crossovered.budget,state:0 +msgid "Cancelled" +msgstr "" + +#. module: account_budget +#: view:crossovered.budget:0 +msgid "Approve" +msgstr "" + +#. module: account_budget +#: field:crossovered.budget,date_from:0 +#: field:crossovered.budget.lines,date_from:0 +msgid "Start Date" +msgstr "" + +#. module: account_budget +#: view:account.budget.post:0 +#: field:crossovered.budget.lines,general_budget_id:0 +#: model:ir.model,name:account_budget.model_account_budget_post +msgid "Budgetary Position" +msgstr "" + +#. module: account_budget +#: field:account.budget.analytic,date_from:0 +#: field:account.budget.crossvered.report,date_from:0 +#: field:account.budget.crossvered.summary.report,date_from:0 +#: field:account.budget.report,date_from:0 +msgid "Start of period" +msgstr "" + +#. module: account_budget +#: model:ir.model,name:account_budget.model_account_budget_crossvered_summary_report +msgid "Account Budget crossvered summary report" +msgstr "" + +#. module: account_budget +#: report:account.budget:0 +#: report:crossovered.budget.report:0 +msgid "Theoretical Amt" +msgstr "" + +#. module: account_budget +#: view:account.budget.analytic:0 +#: view:account.budget.crossvered.report:0 +#: view:account.budget.crossvered.summary.report:0 +#: view:account.budget.report:0 +msgid "Select Dates Period" +msgstr "" + +#. module: account_budget +#: view:account.budget.analytic:0 +#: view:account.budget.crossvered.report:0 +#: view:account.budget.crossvered.summary.report:0 +#: view:account.budget.report:0 +msgid "Print" +msgstr "" + +#. module: account_budget +#: view:account.budget.post:0 +#: view:crossovered.budget:0 +#: field:crossovered.budget.lines,theoritical_amount:0 +msgid "Theoretical Amount" +msgstr "" + +#. module: account_budget +#: field:crossovered.budget.lines,analytic_account_id:0 +#: model:ir.model,name:account_budget.model_account_analytic_account +msgid "Analytic Account" +msgstr "" + +#. module: account_budget +#: report:account.budget:0 +msgid "Budget :" +msgstr "" + +#. module: account_budget +#: report:account.budget:0 +#: report:crossovered.budget.report:0 +msgid "Planned Amt" +msgstr "" + +#. module: account_budget +#: view:account.budget.post:0 +#: field:account.budget.post,account_ids:0 +msgid "Accounts" +msgstr "" + +#. module: account_budget +#: view:account.analytic.account:0 +#: field:account.analytic.account,crossovered_budget_line:0 +#: view:account.budget.post:0 +#: field:account.budget.post,crossovered_budget_line:0 +#: view:crossovered.budget:0 +#: field:crossovered.budget,crossovered_budget_line:0 +#: view:crossovered.budget.lines:0 +#: model:ir.actions.act_window,name:account_budget.act_account_analytic_account_cb_lines +#: model:ir.actions.act_window,name:account_budget.act_crossovered_budget_lines_view +#: model:ir.ui.menu,name:account_budget.menu_act_crossovered_budget_lines_view +msgid "Budget Lines" +msgstr "" + +#. module: account_budget +#: view:account.budget.analytic:0 +#: view:account.budget.crossvered.report:0 +#: view:account.budget.crossvered.summary.report:0 +#: view:account.budget.report:0 +#: view:crossovered.budget:0 +msgid "Cancel" +msgstr "" + +#. module: account_budget +#: constraint:account.analytic.account:0 +msgid "Error! You can not create recursive analytic accounts." +msgstr "" + +#. module: account_budget +#: report:account.budget:0 +#: report:crossovered.budget.report:0 +msgid "Analysis from" +msgstr "" + +#. module: account_budget +#: view:crossovered.budget:0 +msgid "Draft Budgets" +msgstr "" From 284e19c29e3338670e95045c316cf9612ff39334 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 8 Mar 2012 15:06:36 +0100 Subject: [PATCH 37/39] [FIX] BinaryImage field: check if value is bin_size or not bzr revid: fme@openerp.com-20120308140636-qk2ekrmqlqpaa7uo --- addons/web/static/src/js/view_form.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index d4a090eafcc..4866d88dd15 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3314,10 +3314,17 @@ openerp.web.form.FieldBinaryImage = openerp.web.form.FieldBinary.extend({ this.$element.find('.oe-binary').toggle(!this.readonly); }, set_value: function(value) { + console.log(value) this._super.apply(this, arguments); this.set_image_maxwidth(); - var url = '/web/binary/image?session_id=' + this.session.session_id + '&model=' + - this.view.dataset.model +'&id=' + (this.view.datarecord.id || '') + '&field=' + this.name + '&t=' + (new Date().getTime()); + + var url; + if (value && value.substr(0, 10).indexOf(' ') == -1) { + url = 'data:image/png;base64,' + this.value; + } else { + url = '/web/binary/image?session_id=' + this.session.session_id + '&model=' + + this.view.dataset.model +'&id=' + (this.view.datarecord.id || '') + '&field=' + this.name + '&t=' + (new Date().getTime()); + } this.$image.attr('src', url); }, set_image_maxwidth: function() { From d11ba5806e5c80948ed9646a9114b21dac819968 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 8 Mar 2012 15:44:39 +0100 Subject: [PATCH 38/39] [IMP] product, sale, purchase, mrp, account: change unit label 'PCE' into 'Unit' bzr revid: rco@openerp.com-20120308144439-yg2txflpu12zcord --- addons/account/test/test_edi_invoice.yml | 74 +++++++++---------- addons/mrp/test/order_demo.yml | 2 +- addons/mrp/test/order_process.yml | 4 +- addons/product/product_data.xml | 2 +- addons/product/test/product_pricelist.yml | 4 +- .../test/process/edi_purchase_order.yml | 8 +- addons/sale/test/edi_sale_order.yml | 62 ++++++++-------- 7 files changed, 78 insertions(+), 78 deletions(-) diff --git a/addons/account/test/test_edi_invoice.yml b/addons/account/test/test_edi_invoice.yml index e2c0f21e7da..c36672c4531 100644 --- a/addons/account/test/test_edi_invoice.yml +++ b/addons/account/test/test_edi_invoice.yml @@ -50,72 +50,72 @@ !python {model: account.invoice}: | import time edi_document = { - "__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.random_invoice_763jsms", - "__module": "account", - "__model": "account.invoice", - "__version": [6,1,0], - "internal_number": time.strftime("SAJ/%Y/002"), + "__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.random_invoice_763jsms", + "__module": "account", + "__model": "account.invoice", + "__version": [6,1,0], + "internal_number": time.strftime("SAJ/%Y/002"), "company_address": { "__id": "base:b22acf7a-ddcd-11e0-a4db-701a04e25543.main_address", "__module": "base", - "__model": "res.partner.address", - "city": "Gerompont", - "zip": "1367", - "country_id": ["base:b22acf7a-ddcd-11e0-a4db-701a04e25543.be", "Belgium"], - "phone": "(+32).81.81.37.00", + "__model": "res.partner.address", + "city": "Gerompont", + "zip": "1367", + "country_id": ["base:b22acf7a-ddcd-11e0-a4db-701a04e25543.be", "Belgium"], + "phone": "(+32).81.81.37.00", "street": "Chaussee de Namur 40", "bank_ids": [ ["base:b22acf7a-ddcd-11e0-a4db-701a04e25543.res_partner_bank-ZrTWzesfsdDJzGbp","Sample bank: 123465789-156113"] ], - }, - "company_id": ["account:b22acf7a-ddcd-11e0-a4db-701a04e25543.res_company_test11", "Thomson pvt. ltd."], + }, + "company_id": ["account:b22acf7a-ddcd-11e0-a4db-701a04e25543.res_company_test11", "Thomson pvt. ltd."], "currency": { "__id": "base:b22acf7a-ddcd-11e0-a4db-701a04e25543.EUR", "__module": "base", "__model": "res.currency", "code": "EUR", "symbol": "€", - }, + }, "partner_id": ["account:b22acf7a-ddcd-11e0-a4db-701a04e25543.res_partner_test20", "Junjun wala"], "partner_address": { "__id": "base:5af1272e-dd26-11e0-b65e-701a04e25543.res_partner_address_7wdsjasdjh", "__module": "base", "__model": "res.partner.address", - "phone": "(+32).81.81.37.00", - "street": "Chaussee de Namur 40", - "city": "Gerompont", - "zip": "1367", - "country_id": ["base:5af1272e-dd26-11e0-b65e-701a04e25543.be", "Belgium"], + "phone": "(+32).81.81.37.00", + "street": "Chaussee de Namur 40", + "city": "Gerompont", + "zip": "1367", + "country_id": ["base:5af1272e-dd26-11e0-b65e-701a04e25543.be", "Belgium"], }, - "date_invoice": time.strftime('%Y-%m-%d'), - "name": "sample invoice", + "date_invoice": time.strftime('%Y-%m-%d'), + "name": "sample invoice", "tax_line": [{ - "__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.account_invoice_tax-4g4EutbiEMVl", + "__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.account_invoice_tax-4g4EutbiEMVl", "__module": "account", - "__model": "account.invoice.tax", - "amount": 1000.0, - "manual": True, - "name": "sale tax", - }], - "type": "out_invoice", + "__model": "account.invoice.tax", + "amount": 1000.0, + "manual": True, + "name": "sale tax", + }], + "type": "out_invoice", "invoice_line": [{ "__module": "account", "__model": "account.invoice.line", "__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.account_invoice_line-1RP3so", - "uos_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_uom_unit", "PCE"], - "name": "Basic PC", - "price_unit": 10.0, - "product_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_product_pc1", "[PC1] Basic PC"], + "uos_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_uom_unit", "Unit"], + "name": "Basic PC", + "price_unit": 10.0, + "product_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_product_pc1", "[PC1] Basic PC"], "quantity": 1.0 }, { "__module": "account", "__model": "account.invoice.line", "__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.account_invoice_line-u2XV5", - "uos_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_uom_unit", "PCE"], - "name": "Medium PC", - "price_unit": 100.0, - "product_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_product_pc3", "[PC3] Medium PC"], + "uos_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_uom_unit", "Unit"], + "name": "Medium PC", + "price_unit": 100.0, + "product_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_product_pc3", "[PC3] Medium PC"], "quantity": 5.0 }] } @@ -137,12 +137,12 @@ assert len(invoice_new.invoice_line) == 2, "invoice lines are not same" for inv_line in invoice_new.invoice_line: if inv_line.name == 'Basic PC': - assert inv_line.uos_id.name == "PCE" , "uom is not same" + assert inv_line.uos_id.name == "Unit" , "uom is not same" assert inv_line.price_unit == 10 , "price unit is not same" assert inv_line.quantity == 1 , "product qty is not same" assert inv_line.price_subtotal == 10, "price sub total is not same" elif inv_line.name == 'Medium PC': - assert inv_line.uos_id.name == "PCE" , "uom is not same" + assert inv_line.uos_id.name == "Unit" , "uom is not same" assert inv_line.price_unit == 100 , "price unit is not same" assert inv_line.quantity == 5 , "product qty is not same" assert inv_line.price_subtotal == 500, "price sub total is not same" diff --git a/addons/mrp/test/order_demo.yml b/addons/mrp/test/order_demo.yml index 9c7b8720904..72a18572a73 100644 --- a/addons/mrp/test/order_demo.yml +++ b/addons/mrp/test/order_demo.yml @@ -10,7 +10,7 @@ !record {model: mrp.bom, id: mrp_bom_rearpanelarm1}: routing_id: mrp.mrp_routing_0 - - I create Production Order of Shelf 100cm to produce 5.0 Dozen PCE. + I create Production Order of Shelf 100cm to produce 5.0 Dozen Unit. - !record {model: mrp.production, id: mrp_production_shelf100cm}: location_src_id: stock.stock_location_stock diff --git a/addons/mrp/test/order_process.yml b/addons/mrp/test/order_process.yml index 539b9fe2ca6..496e039d0d4 100644 --- a/addons/mrp/test/order_process.yml +++ b/addons/mrp/test/order_process.yml @@ -17,7 +17,7 @@ woodmm10 = False metalcleats = False for line in order.product_lines: - if line.product_id.id == ref('product.product_product_sidepanel0'): #SIDEPAN 2 PCE + if line.product_id.id == ref('product.product_product_sidepanel0'): #SIDEPAN 2 Unit assert not sidepanel, "Production line is already generated for SIDEPAN." assert line.product_qty == (2.0*factor), "Qty is not correspond." assert line.product_uom.id == ref('product.product_uom_unit'), "UOM is not correspond" @@ -32,7 +32,7 @@ assert line.product_qty == (0.25*factor), "Qty is not correspond." assert line.product_uom.id == ref('product.product_uom_meter'), "UOM is not correspond" woodmm0 = True - elif line.product_id.id == ref('product.product_product_metalcleats0'): #METC000 4*3 PCE + elif line.product_id.id == ref('product.product_product_metalcleats0'): #METC000 4*3 Unit assert not metalcleats, "Production line is already generated for METC000." assert line.product_qty == (4*3*factor), "Qty is not correspond." assert line.product_uom.id == ref('product.product_uom_unit'), "UOM is not correspond" diff --git a/addons/product/product_data.xml b/addons/product/product_data.xml index 0233a5a4788..3e2d114dc74 100644 --- a/addons/product/product_data.xml +++ b/addons/product/product_data.xml @@ -27,7 +27,7 @@ --> - PCE + Unit diff --git a/addons/product/test/product_pricelist.yml b/addons/product/test/product_pricelist.yml index 2dbc4be1120..58003f6a566 100644 --- a/addons/product/test/product_pricelist.yml +++ b/addons/product/test/product_pricelist.yml @@ -21,7 +21,7 @@ assert product.price == product.lst_price, "Sell price is not correspond." - - I check sale price of IT componet if more than 3 PCE. + I check sale price of IT componet if more than 3 Unit. - !python {model: product.product}: | context.update({'quantity':5}) @@ -51,7 +51,7 @@ product = self.browse(cr, uid, ref("product_product_pc2"), context=context) assert product.price == 450, "cost price is not correspond." - - I check cost price of PC2 if more than 3 PCE. + I check cost price of PC2 if more than 3 Unit. - !python {model: product.product}: | context.update({'quantity':3}) diff --git a/addons/purchase/test/process/edi_purchase_order.yml b/addons/purchase/test/process/edi_purchase_order.yml index ff49b41157b..abbc3047d9a 100644 --- a/addons/purchase/test/process/edi_purchase_order.yml +++ b/addons/purchase/test/process/edi_purchase_order.yml @@ -88,7 +88,7 @@ "__import_module": "purchase", "__import_model": "purchase.order.line", "name": "Basic PC", - "product_uom": ["product:724f93ec-ddd0-11e0-88ec-701a04e25543.product_uom_unit", "PCE"], + "product_uom": ["product:724f93ec-ddd0-11e0-88ec-701a04e25543.product_uom_unit", "Unit"], "product_qty": 1.0, "date_planned": "2011-09-30", "sequence": 10, @@ -102,7 +102,7 @@ "__import_module": "purchase", "__import_model": "purchase.order.line", "name": "Medium PC", - "product_uom": ["product:724f93ec-ddd0-11e0-88ec-701a04e25543.product_uom_unit", "PCE"], + "product_uom": ["product:724f93ec-ddd0-11e0-88ec-701a04e25543.product_uom_unit", "Unit"], "product_qty": 10.0, "sequence": 11, "date_planned": "2011-09-15", @@ -125,11 +125,11 @@ assert len(order_new.order_line) == 2, "Purchase order lines number mismatch" for purchase_line in order_new.order_line: if purchase_line.name == 'Basic PC': - assert purchase_line.product_uom.name == "PCE" , "uom is not same" + assert purchase_line.product_uom.name == "Unit" , "uom is not same" assert purchase_line.price_unit == 150 , "unit price is not same, got %s, expected 150"%(purchase_line.price_unit,) assert purchase_line.product_qty == 1 , "product qty is not same" elif purchase_line.name == 'Medium PC': - assert purchase_line.product_uom.name == "PCE" , "uom is not same" + assert purchase_line.product_uom.name == "Unit" , "uom is not same" assert purchase_line.price_unit == 20 , "unit price is not same, got %s, expected 20"%(purchase_line.price_unit,) assert purchase_line.product_qty == 10 , "product qty is not same" else: diff --git a/addons/sale/test/edi_sale_order.yml b/addons/sale/test/edi_sale_order.yml index 9a207d9f44e..c53ff9cfc45 100644 --- a/addons/sale/test/edi_sale_order.yml +++ b/addons/sale/test/edi_sale_order.yml @@ -57,52 +57,52 @@ "__id": "base:5af1272e-dd26-11e0-b65e-701a04e25543.some_address", "__module": "base", "__model": "res.partner.address", - "phone": "(+32).81.81.37.00", - "street": "Chaussee de Namur 40", - "city": "Gerompont", - "zip": "1367", + "phone": "(+32).81.81.37.00", + "street": "Chaussee de Namur 40", + "city": "Gerompont", + "zip": "1367", "country_id": ["base:5af1272e-dd26-11e0-b65e-701a04e25543.be", "Belgium"], "bank_ids": [ ["base:5af1272e-dd26-11e0-b65e-701a04e25543.res_partner_bank-adaWadsadasdDJzGbp","Ladies bank: 032465789-156113"] ], - }, - "partner_id": ["purchase:5af1272e-dd26-11e0-b65e-701a04e25543.res_partner_test20", "jones white"], + }, + "partner_id": ["purchase:5af1272e-dd26-11e0-b65e-701a04e25543.res_partner_test20", "jones white"], "partner_address": { "__id": "base:5af1272e-dd26-11e0-b65e-701a04e25543.res_partner_address_7wdsjasdjh", "__module": "base", "__model": "res.partner.address", - "phone": "(+32).81.81.37.00", - "street": "Chaussee de Namur 40", - "city": "Gerompont", - "zip": "1367", - "country_id": ["base:5af1272e-dd26-11e0-b65e-701a04e25543.be", "Belgium"], + "phone": "(+32).81.81.37.00", + "street": "Chaussee de Namur 40", + "city": "Gerompont", + "zip": "1367", + "country_id": ["base:5af1272e-dd26-11e0-b65e-701a04e25543.be", "Belgium"], }, "order_line": [{ - "__id": "purchase:5af1272e-dd26-11e0-b65e-701a04e25543.purchase_order_line-AlhsVDZGoKvJ", - "__module": "purchase", + "__id": "purchase:5af1272e-dd26-11e0-b65e-701a04e25543.purchase_order_line-AlhsVDZGoKvJ", + "__module": "purchase", "__model": "purchase.order.line", - "__import_module": "sale", - "__import_model": "sale.order.line", - "name": "Basic PC", - "date_planned": "2011-09-30", - "price_unit": 150.0, + "__import_module": "sale", + "__import_model": "sale.order.line", + "name": "Basic PC", + "date_planned": "2011-09-30", + "price_unit": 150.0, "product_id": ["product:5af1272e-dd26-11e0-b65e-701a04e25543.product_product_pc1", "[PC1] Basic PC"], - "product_qty": 1.0, - "product_uom": ["product:5af1272e-dd26-11e0-b65e-701a04e25543.product_uom_unit", "PCE"], + "product_qty": 1.0, + "product_uom": ["product:5af1272e-dd26-11e0-b65e-701a04e25543.product_uom_unit", "Unit"], }, { - "__id": "purchase:5af1272e-dd26-11e0-b65e-701a04e25543.purchase_order_line-Alsads33e", - "__module": "purchase", + "__id": "purchase:5af1272e-dd26-11e0-b65e-701a04e25543.purchase_order_line-Alsads33e", + "__module": "purchase", "__model": "purchase.order.line", - "__import_module": "sale", + "__import_module": "sale", "__import_model": "sale.order.line", - "name": "Medium PC", - "date_planned": "2011-09-15", - "price_unit": 100.0, + "name": "Medium PC", + "date_planned": "2011-09-15", + "price_unit": 100.0, "product_id": ["product:5af1272e-dd26-11e0-b65e-701a04e25543.product_product_pc3", "[PC3] Medium PC"], - "product_qty": 2.0, - "product_uom": ["product:5af1272e-dd26-11e0-b65e-701a04e25543.product_uom_unit", "PCE"], - }], + "product_qty": 2.0, + "product_uom": ["product:5af1272e-dd26-11e0-b65e-701a04e25543.product_uom_unit", "Unit"], + }], } new_sale_order_id = sale_order_pool.edi_import(cr, uid, edi_document, context=context) assert new_sale_order_id, 'Sale order import failed' @@ -120,12 +120,12 @@ for sale_line in order_new.order_line: if sale_line.name == 'Basic PC': assert sale_line.delay == 18 , "incorrect delay: got %s, expected 18"%(sale_line.delay,) - assert sale_line.product_uom.name == "PCE" , "uom is not same" + assert sale_line.product_uom.name == "Unit" , "uom is not same" assert sale_line.price_unit == 150 , "unit price is not same, got %s, expected 150"%(sale_line.price_unit,) assert sale_line.product_uom_qty == 1 , "product qty is not same" elif sale_line.name == 'Medium PC': assert sale_line.delay == 3 , "incorrect delay: got %s, expected 3"%(sale_line.delay,) - assert sale_line.product_uom.name == "PCE" , "uom is not same" + assert sale_line.product_uom.name == "Unit" , "uom is not same" assert sale_line.price_unit == 100 , "unit price is not same, got %s, expected 100"%(sale_line.price_unit,) assert sale_line.product_uom_qty == 2 , "product qty is not same" else: From abfa7ea5559caa2ecf224cc27cf5b80ea616ceee Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Sat, 10 Mar 2012 04:54:59 +0000 Subject: [PATCH 39/39] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20120309045159-lozy0xh0ud7jmbaa bzr revid: launchpad_translations_on_behalf_of_openerp-20120310045459-pobr12hzfpnsma2q --- addons/account_asset/i18n/lt.po | 793 +++++++++++ .../i18n/ar.po | 376 ++++++ addons/account_cancel/i18n/lt.po | 23 + addons/decimal_precision/i18n/lt.po | 49 + addons/hr_payroll/i18n/lt.po | 1119 ++++++++++++++++ addons/hr_recruitment/i18n/mk.po | 1176 +++++++++++++++++ 6 files changed, 3536 insertions(+) create mode 100644 addons/account_asset/i18n/lt.po create mode 100644 addons/account_bank_statement_extensions/i18n/ar.po create mode 100644 addons/account_cancel/i18n/lt.po create mode 100644 addons/decimal_precision/i18n/lt.po create mode 100644 addons/hr_payroll/i18n/lt.po create mode 100644 addons/hr_recruitment/i18n/mk.po diff --git a/addons/account_asset/i18n/lt.po b/addons/account_asset/i18n/lt.po new file mode 100644 index 00000000000..eea03149162 --- /dev/null +++ b/addons/account_asset/i18n/lt.po @@ -0,0 +1,793 @@ +# Lithuanian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 01:37+0100\n" +"PO-Revision-Date: 2012-03-09 15:10+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Lithuanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-10 04:54+0000\n" +"X-Generator: Launchpad (build 14914)\n" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Assets in draft and open states" +msgstr "" + +#. module: account_asset +#: field:account.asset.category,method_end:0 +#: field:account.asset.history,method_end:0 field:asset.modify,method_end:0 +msgid "Ending date" +msgstr "Pabaigos data" + +#. module: account_asset +#: field:account.asset.asset,value_residual:0 +msgid "Residual Value" +msgstr "" + +#. module: account_asset +#: field:account.asset.category,account_expense_depreciation_id:0 +msgid "Depr. Expense Account" +msgstr "" + +#. module: account_asset +#: view:asset.depreciation.confirmation.wizard:0 +msgid "Compute Asset" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +msgid "Group By..." +msgstr "" + +#. module: account_asset +#: field:asset.asset.report,gross_value:0 +msgid "Gross Amount" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 field:account.asset.asset,name:0 +#: field:account.asset.depreciation.line,asset_id:0 +#: field:account.asset.history,asset_id:0 field:account.move.line,asset_id:0 +#: view:asset.asset.report:0 field:asset.asset.report,asset_id:0 +#: model:ir.model,name:account_asset.model_account_asset_asset +msgid "Asset" +msgstr "" + +#. module: account_asset +#: help:account.asset.asset,prorata:0 help:account.asset.category,prorata:0 +msgid "" +"Indicates that the first depreciation entry for this asset have to be done " +"from the purchase date instead of the first January" +msgstr "" + +#. module: account_asset +#: field:account.asset.history,name:0 +msgid "History name" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,company_id:0 +#: field:account.asset.category,company_id:0 view:asset.asset.report:0 +#: field:asset.asset.report,company_id:0 +msgid "Company" +msgstr "" + +#. module: account_asset +#: view:asset.modify:0 +msgid "Modify" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,state:0 view:asset.asset.report:0 +#: selection:asset.asset.report,state:0 +msgid "Running" +msgstr "" + +#. module: account_asset +#: field:account.asset.depreciation.line,amount:0 +msgid "Depreciation Amount" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +#: model:ir.actions.act_window,name:account_asset.action_asset_asset_report +#: model:ir.model,name:account_asset.model_asset_asset_report +#: model:ir.ui.menu,name:account_asset.menu_action_asset_asset_report +msgid "Assets Analysis" +msgstr "" + +#. module: account_asset +#: field:asset.modify,name:0 +msgid "Reason" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,method_progress_factor:0 +#: field:account.asset.category,method_progress_factor:0 +msgid "Degressive Factor" +msgstr "" + +#. module: account_asset +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list_normal +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list_normal +msgid "Asset Categories" +msgstr "" + +#. module: account_asset +#: view:asset.depreciation.confirmation.wizard:0 +msgid "" +"This wizard will post the depreciation lines of running assets that belong " +"to the selected period." +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,account_move_line_ids:0 +#: field:account.move.line,entry_ids:0 +#: model:ir.actions.act_window,name:account_asset.act_entries_open +msgid "Entries" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +#: field:account.asset.asset,depreciation_line_ids:0 +msgid "Depreciation Lines" +msgstr "" + +#. module: account_asset +#: help:account.asset.asset,salvage_value:0 +msgid "It is the amount you plan to have that you cannot depreciate." +msgstr "" + +#. module: account_asset +#: field:account.asset.depreciation.line,depreciation_date:0 +#: view:asset.asset.report:0 field:asset.asset.report,depreciation_date:0 +msgid "Depreciation Date" +msgstr "" + +#. module: account_asset +#: field:account.asset.category,account_asset_id:0 +msgid "Asset Account" +msgstr "" + +#. module: account_asset +#: field:asset.asset.report,posted_value:0 +msgid "Posted Amount" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 view:asset.asset.report:0 +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_form +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_form +#: model:ir.ui.menu,name:account_asset.menu_finance_assets +#: model:ir.ui.menu,name:account_asset.menu_finance_config_assets +msgid "Assets" +msgstr "" + +#. module: account_asset +#: field:account.asset.category,account_depreciation_id:0 +msgid "Depreciation Account" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 view:account.asset.category:0 +#: view:account.asset.history:0 view:asset.modify:0 field:asset.modify,note:0 +msgid "Notes" +msgstr "" + +#. module: account_asset +#: field:account.asset.depreciation.line,move_id:0 +msgid "Depreciation Entry" +msgstr "" + +#. module: account_asset +#: sql_constraint:account.move.line:0 +msgid "Wrong credit or debit value in accounting entry !" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 field:asset.asset.report,nbr:0 +msgid "# of Depreciation Lines" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +msgid "Assets in draft state" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,method_end:0 +#: selection:account.asset.asset,method_time:0 +#: selection:account.asset.category,method_time:0 +#: selection:account.asset.history,method_time:0 +msgid "Ending Date" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,code:0 +msgid "Reference" +msgstr "" + +#. module: account_asset +#: constraint:account.invoice:0 +msgid "Invalid BBA Structured Communication !" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Account Asset" +msgstr "" + +#. module: account_asset +#: model:ir.actions.act_window,name:account_asset.action_asset_depreciation_confirmation_wizard +#: model:ir.ui.menu,name:account_asset.menu_asset_depreciation_confirmation_wizard +msgid "Compute Assets" +msgstr "" + +#. module: account_asset +#: field:account.asset.depreciation.line,sequence:0 +msgid "Sequence of the depreciation" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,method_period:0 +#: field:account.asset.category,method_period:0 +#: field:account.asset.history,method_period:0 +#: field:asset.modify,method_period:0 +msgid "Period Length" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,state:0 view:asset.asset.report:0 +#: selection:asset.asset.report,state:0 +msgid "Draft" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +msgid "Date of asset purchase" +msgstr "" + +#. module: account_asset +#: help:account.asset.asset,method_number:0 +msgid "Calculates Depreciation within specified interval" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Change Duration" +msgstr "" + +#. module: account_asset +#: field:account.asset.category,account_analytic_id:0 +msgid "Analytic account" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,method:0 field:account.asset.category,method:0 +msgid "Computation Method" +msgstr "" + +#. module: account_asset +#: help:account.asset.asset,method_period:0 +msgid "State here the time during 2 depreciations, in months" +msgstr "" + +#. module: account_asset +#: constraint:account.asset.asset:0 +msgid "" +"Prorata temporis can be applied only for time method \"number of " +"depreciations\"." +msgstr "" + +#. module: account_asset +#: help:account.asset.history,method_time:0 +msgid "" +"The method to use to compute the dates and number of depreciation lines.\n" +"Number of Depreciations: Fix the number of depreciation lines and the time " +"between 2 depreciations.\n" +"Ending Date: Choose the time between 2 depreciations and the date the " +"depreciations won't go beyond." +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,purchase_value:0 +msgid "Gross value " +msgstr "" + +#. module: account_asset +#: constraint:account.asset.asset:0 +msgid "Error ! You can not create recursive assets." +msgstr "" + +#. module: account_asset +#: help:account.asset.history,method_period:0 +msgid "Time in month between two depreciations" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 field:asset.asset.report,name:0 +msgid "Year" +msgstr "" + +#. module: account_asset +#: view:asset.modify:0 +#: model:ir.actions.act_window,name:account_asset.action_asset_modify +#: model:ir.model,name:account_asset.model_asset_modify +msgid "Modify Asset" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Other Information" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,salvage_value:0 +msgid "Salvage Value" +msgstr "" + +#. module: account_asset +#: field:account.invoice.line,asset_category_id:0 view:asset.asset.report:0 +msgid "Asset Category" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Set to Close" +msgstr "" + +#. module: account_asset +#: model:ir.actions.wizard,name:account_asset.wizard_asset_compute +msgid "Compute assets" +msgstr "" + +#. module: account_asset +#: model:ir.actions.wizard,name:account_asset.wizard_asset_modify +msgid "Modify asset" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Assets in closed state" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,parent_id:0 +msgid "Parent Asset" +msgstr "" + +#. module: account_asset +#: view:account.asset.history:0 +#: model:ir.model,name:account_asset.model_account_asset_history +msgid "Asset history" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +msgid "Assets purchased in current year" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,state:0 field:asset.asset.report,state:0 +msgid "State" +msgstr "" + +#. module: account_asset +#: model:ir.model,name:account_asset.model_account_invoice_line +msgid "Invoice Line" +msgstr "" + +#. module: account_asset +#: constraint:account.move.line:0 +msgid "" +"The selected account of your Journal Entry forces to provide a secondary " +"currency. You should remove the secondary currency on the account or select " +"a multi-currency view on the journal." +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +msgid "Month" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Depreciation Board" +msgstr "" + +#. module: account_asset +#: model:ir.model,name:account_asset.model_account_move_line +msgid "Journal Items" +msgstr "" + +#. module: account_asset +#: field:asset.asset.report,unposted_value:0 +msgid "Unposted Amount" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,method_time:0 +#: field:account.asset.category,method_time:0 +#: field:account.asset.history,method_time:0 +msgid "Time Method" +msgstr "" + +#. module: account_asset +#: view:account.asset.category:0 +msgid "Analytic information" +msgstr "" + +#. module: account_asset +#: view:asset.modify:0 +msgid "Asset durations to modify" +msgstr "" + +#. module: account_asset +#: constraint:account.move.line:0 +msgid "" +"The date of your Journal Entry is not in the defined period! You should " +"change the date or remove this constraint from the journal." +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,note:0 field:account.asset.category,note:0 +#: field:account.asset.history,note:0 +msgid "Note" +msgstr "" + +#. module: account_asset +#: help:account.asset.asset,method:0 help:account.asset.category,method:0 +msgid "" +"Choose the method to use to compute the amount of depreciation lines.\n" +" * Linear: Calculated on basis of: Gross Value / Number of Depreciations\n" +" * Degressive: Calculated on basis of: Remaining Value * Degressive Factor" +msgstr "" + +#. module: account_asset +#: help:account.asset.asset,method_time:0 +#: help:account.asset.category,method_time:0 +msgid "" +"Choose the method to use to compute the dates and number of depreciation " +"lines.\n" +" * Number of Depreciations: Fix the number of depreciation lines and the " +"time between 2 depreciations.\n" +" * Ending Date: Choose the time between 2 depreciations and the date the " +"depreciations won't go beyond." +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +msgid "Assets in running state" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Closed" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,partner_id:0 +#: field:asset.asset.report,partner_id:0 +msgid "Partner" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 field:asset.asset.report,depreciation_value:0 +msgid "Amount of Depreciation Lines" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +msgid "Posted depreciation lines" +msgstr "" + +#. module: account_asset +#: constraint:account.move.line:0 +msgid "Company must be the same for its related account and period." +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,child_ids:0 +msgid "Children Assets" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +msgid "Date of depreciation" +msgstr "" + +#. module: account_asset +#: field:account.asset.history,user_id:0 +msgid "User" +msgstr "" + +#. module: account_asset +#: field:account.asset.history,date:0 +msgid "Date" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +msgid "Assets purchased in current month" +msgstr "" + +#. module: account_asset +#: constraint:account.move.line:0 +msgid "You can not create journal items on an account of type view." +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +msgid "Extended Filters..." +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 view:asset.depreciation.confirmation.wizard:0 +msgid "Compute" +msgstr "" + +#. module: account_asset +#: view:account.asset.category:0 +msgid "Search Asset Category" +msgstr "" + +#. module: account_asset +#: model:ir.model,name:account_asset.model_asset_depreciation_confirmation_wizard +msgid "asset.depreciation.confirmation.wizard" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,active:0 +msgid "Active" +msgstr "" + +#. module: account_asset +#: model:ir.actions.wizard,name:account_asset.wizard_asset_close +msgid "Close asset" +msgstr "" + +#. module: account_asset +#: field:account.asset.depreciation.line,parent_state:0 +msgid "State of Asset" +msgstr "" + +#. module: account_asset +#: field:account.asset.depreciation.line,name:0 +msgid "Depreciation Name" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 field:account.asset.asset,history_ids:0 +msgid "History" +msgstr "" + +#. module: account_asset +#: sql_constraint:account.invoice:0 +msgid "Invoice Number must be unique per Company!" +msgstr "" + +#. module: account_asset +#: field:asset.depreciation.confirmation.wizard,period_id:0 +msgid "Period" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "General" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,prorata:0 field:account.asset.category,prorata:0 +msgid "Prorata Temporis" +msgstr "" + +#. module: account_asset +#: view:account.asset.category:0 +msgid "Accounting information" +msgstr "" + +#. module: account_asset +#: model:ir.model,name:account_asset.model_account_invoice +msgid "Invoice" +msgstr "" + +#. module: account_asset +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_form_normal +msgid "Review Asset Categories" +msgstr "" + +#. module: account_asset +#: view:asset.depreciation.confirmation.wizard:0 view:asset.modify:0 +msgid "Cancel" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,state:0 selection:asset.asset.report,state:0 +msgid "Close" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 view:account.asset.category:0 +msgid "Depreciation Method" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,purchase_date:0 view:asset.asset.report:0 +#: field:asset.asset.report,purchase_date:0 +msgid "Purchase Date" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,method:0 +#: selection:account.asset.category,method:0 +msgid "Degressive" +msgstr "" + +#. module: account_asset +#: help:asset.depreciation.confirmation.wizard,period_id:0 +msgid "" +"Choose the period for which you want to automatically post the depreciation " +"lines of running assets" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Current" +msgstr "" + +#. module: account_asset +#: field:account.asset.depreciation.line,remaining_value:0 +msgid "Amount to Depreciate" +msgstr "" + +#. module: account_asset +#: field:account.asset.category,open_asset:0 +msgid "Skip Draft State" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 view:account.asset.category:0 +#: view:account.asset.history:0 +msgid "Depreciation Dates" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,currency_id:0 +msgid "Currency" +msgstr "" + +#. module: account_asset +#: field:account.asset.category,journal_id:0 +msgid "Journal" +msgstr "" + +#. module: account_asset +#: field:account.asset.depreciation.line,depreciated_value:0 +msgid "Amount Already Depreciated" +msgstr "" + +#. module: account_asset +#: field:account.asset.depreciation.line,move_check:0 +#: view:asset.asset.report:0 field:asset.asset.report,move_check:0 +msgid "Posted" +msgstr "" + +#. module: account_asset +#: help:account.asset.asset,state:0 +msgid "" +"When an asset is created, the state is 'Draft'.\n" +"If the asset is confirmed, the state goes in 'Running' and the depreciation " +"lines can be posted in the accounting.\n" +"You can manually close an asset when the depreciation is over. If the last " +"line of depreciation is posted, the asset automatically goes in that state." +msgstr "" + +#. module: account_asset +#: field:account.asset.category,name:0 +msgid "Name" +msgstr "" + +#. module: account_asset +#: help:account.asset.category,open_asset:0 +msgid "" +"Check this if you want to automatically confirm the assets of this category " +"when created by invoices." +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Set to Draft" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,method:0 +#: selection:account.asset.category,method:0 +msgid "Linear" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +msgid "Month-1" +msgstr "" + +#. module: account_asset +#: model:ir.model,name:account_asset.model_account_asset_depreciation_line +msgid "Asset depreciation line" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,category_id:0 view:account.asset.category:0 +#: field:asset.asset.report,asset_category_id:0 +#: model:ir.model,name:account_asset.model_account_asset_category +msgid "Asset category" +msgstr "" + +#. module: account_asset +#: view:asset.asset.report:0 +msgid "Assets purchased in last month" +msgstr "" + +#. module: account_asset +#: code:addons/account_asset/wizard/wizard_asset_compute.py:49 +#, python-format +msgid "Created Asset Moves" +msgstr "" + +#. module: account_asset +#: constraint:account.move.line:0 +msgid "You can not create journal items on closed account." +msgstr "" + +#. module: account_asset +#: model:ir.actions.act_window,help:account_asset.action_asset_asset_report +msgid "" +"From this report, you can have an overview on all depreciation. The tool " +"search can also be used to personalise your Assets reports and so, match " +"this analysis to your needs;" +msgstr "" + +#. module: account_asset +#: help:account.asset.category,method_period:0 +msgid "State here the time between 2 depreciations, in months" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,method_number:0 +#: selection:account.asset.asset,method_time:0 +#: field:account.asset.category,method_number:0 +#: selection:account.asset.category,method_time:0 +#: field:account.asset.history,method_number:0 +#: selection:account.asset.history,method_time:0 +#: field:asset.modify,method_number:0 +msgid "Number of Depreciations" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Create Move" +msgstr "" + +#. module: account_asset +#: view:asset.depreciation.confirmation.wizard:0 +msgid "Post Depreciation Lines" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Confirm Asset" +msgstr "" + +#. module: account_asset +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_tree +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_tree +msgid "Asset Hierarchy" +msgstr "" diff --git a/addons/account_bank_statement_extensions/i18n/ar.po b/addons/account_bank_statement_extensions/i18n/ar.po new file mode 100644 index 00000000000..95f18c8ddb1 --- /dev/null +++ b/addons/account_bank_statement_extensions/i18n/ar.po @@ -0,0 +1,376 @@ +# Arabic translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:35+0000\n" +"PO-Revision-Date: 2012-03-09 13:28+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Arabic \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-10 04:54+0000\n" +"X-Generator: Launchpad (build 14914)\n" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Search Bank Transactions" +msgstr "بحث عن المعاملات البنكية" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +#: selection:account.bank.statement.line,state:0 +msgid "Confirmed" +msgstr "مصدق عليه" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement:0 +#: view:account.bank.statement.line:0 +msgid "Glob. Id" +msgstr "" + +#. module: account_bank_statement_extensions +#: selection:account.bank.statement.line.global,type:0 +msgid "CODA" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,parent_id:0 +msgid "Parent Code" +msgstr "الكود الأم" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Debit" +msgstr "مدين" + +#. module: account_bank_statement_extensions +#: view:cancel.statement.line:0 +#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_cancel_statement_line +#: model:ir.model,name:account_bank_statement_extensions.model_cancel_statement_line +msgid "Cancel selected statement lines" +msgstr "الغاء الاسطر المحددة في الكشف" + +#. module: account_bank_statement_extensions +#: constraint:res.partner.bank:0 +msgid "The RIB and/or IBAN is not valid" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Group By..." +msgstr "تجميع حسب" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,state:0 +msgid "State" +msgstr "حالة" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +#: selection:account.bank.statement.line,state:0 +msgid "Draft" +msgstr "مسودة" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Statement" +msgstr "كشف حساب" + +#. module: account_bank_statement_extensions +#: view:confirm.statement.line:0 +#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_confirm_statement_line +#: model:ir.model,name:account_bank_statement_extensions.model_confirm_statement_line +msgid "Confirm selected statement lines" +msgstr "" + +#. module: account_bank_statement_extensions +#: report:bank.statement.balance.report:0 +#: model:ir.actions.report.xml,name:account_bank_statement_extensions.bank_statement_balance_report +msgid "Bank Statement Balances Report" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:cancel.statement.line:0 +msgid "Cancel Lines" +msgstr "الغى الأسطر" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line.global:0 +#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement_line_global +msgid "Batch Payment Info" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:confirm.statement.line:0 +msgid "Confirm Lines" +msgstr "تأكيد الأسطر" + +#. module: account_bank_statement_extensions +#: code:addons/account_bank_statement_extensions/account_bank_statement.py:130 +#, python-format +msgid "" +"Delete operation not allowed ! Please go to the associated bank " +"statement in order to delete and/or modify this bank statement line" +msgstr "" +"إلغاء العملية غير مسموح! يرجى الذهاب إلى الكشف البنكي المرتبط حتى تتمكن من " +"الغاء اوتغيير اسطر هذا الكشف" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,type:0 +msgid "Type" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +#: field:account.bank.statement.line,journal_id:0 +#: report:bank.statement.balance.report:0 +msgid "Journal" +msgstr "السجل اليومي" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Confirmed Statement Lines." +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Credit Transactions." +msgstr "" + +#. module: account_bank_statement_extensions +#: model:ir.actions.act_window,help:account_bank_statement_extensions.action_cancel_statement_line +msgid "cancel selected statement lines." +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,counterparty_number:0 +msgid "Counterparty Number" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line.global:0 +msgid "Transactions" +msgstr "المعاملات البنكية" + +#. module: account_bank_statement_extensions +#: code:addons/account_bank_statement_extensions/account_bank_statement.py:130 +#, python-format +msgid "Warning" +msgstr "تحذير" + +#. module: account_bank_statement_extensions +#: report:bank.statement.balance.report:0 +msgid "Closing Balance" +msgstr "رصيد الإغلاق" + +#. module: account_bank_statement_extensions +#: report:bank.statement.balance.report:0 +msgid "Date" +msgstr "التاريخ" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +#: field:account.bank.statement.line,globalisation_amount:0 +msgid "Glob. Amount" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Debit Transactions." +msgstr "معاملات المدين" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Extended Filters..." +msgstr "" + +#. module: account_bank_statement_extensions +#: view:confirm.statement.line:0 +msgid "Confirmed lines cannot be changed anymore." +msgstr "" + +#. module: account_bank_statement_extensions +#: constraint:res.partner.bank:0 +msgid "" +"\n" +"Please define BIC/Swift code on bank for bank type IBAN Account to make " +"valid payments" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,val_date:0 +msgid "Valuta Date" +msgstr "" + +#. module: account_bank_statement_extensions +#: model:ir.actions.act_window,help:account_bank_statement_extensions.action_confirm_statement_line +msgid "Confirm selected statement lines." +msgstr "" + +#. module: account_bank_statement_extensions +#: view:cancel.statement.line:0 +msgid "Are you sure you want to cancel the selected Bank Statement lines ?" +msgstr "" + +#. module: account_bank_statement_extensions +#: report:bank.statement.balance.report:0 +msgid "Name" +msgstr "" + +#. module: account_bank_statement_extensions +#: selection:account.bank.statement.line.global,type:0 +msgid "ISO 20022" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Notes" +msgstr "" + +#. module: account_bank_statement_extensions +#: selection:account.bank.statement.line.global,type:0 +msgid "Manual" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Credit" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,amount:0 +msgid "Amount" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Fin.Account" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,counterparty_currency:0 +msgid "Counterparty Currency" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,counterparty_bic:0 +msgid "Counterparty BIC" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,child_ids:0 +msgid "Child Codes" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:confirm.statement.line:0 +msgid "Are you sure you want to confirm the selected Bank Statement lines ?" +msgstr "" + +#. module: account_bank_statement_extensions +#: constraint:account.bank.statement.line:0 +msgid "" +"The amount of the voucher must be the same amount as the one on the " +"statement line" +msgstr "" + +#. module: account_bank_statement_extensions +#: help:account.bank.statement.line,globalisation_id:0 +msgid "" +"Code to identify transactions belonging to the same globalisation level " +"within a batch payment" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Draft Statement Lines." +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Glob. Am." +msgstr "" + +#. module: account_bank_statement_extensions +#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,code:0 +msgid "Code" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,counterparty_name:0 +msgid "Counterparty Name" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,name:0 +msgid "Communication" +msgstr "" + +#. module: account_bank_statement_extensions +#: model:ir.model,name:account_bank_statement_extensions.model_res_partner_bank +msgid "Bank Accounts" +msgstr "" + +#. module: account_bank_statement_extensions +#: constraint:account.bank.statement:0 +msgid "The journal and period chosen have to belong to the same company." +msgstr "" + +#. module: account_bank_statement_extensions +#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement +msgid "Bank Statement" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Statement Line" +msgstr "" + +#. module: account_bank_statement_extensions +#: sql_constraint:account.bank.statement.line.global:0 +msgid "The code must be unique !" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line.global,bank_statement_line_ids:0 +#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_bank_statement_line +#: model:ir.ui.menu,name:account_bank_statement_extensions.bank_statement_line +msgid "Bank Statement Lines" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line.global:0 +msgid "Child Batch Payments" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:cancel.statement.line:0 +#: view:confirm.statement.line:0 +msgid "Cancel" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Statement Lines" +msgstr "" + +#. module: account_bank_statement_extensions +#: view:account.bank.statement.line:0 +msgid "Total Amount" +msgstr "" + +#. module: account_bank_statement_extensions +#: field:account.bank.statement.line,globalisation_id:0 +msgid "Globalisation ID" +msgstr "" diff --git a/addons/account_cancel/i18n/lt.po b/addons/account_cancel/i18n/lt.po new file mode 100644 index 00000000000..6ff65fbc2af --- /dev/null +++ b/addons/account_cancel/i18n/lt.po @@ -0,0 +1,23 @@ +# Lithuanian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:35+0000\n" +"PO-Revision-Date: 2012-03-09 15:21+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Lithuanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-10 04:54+0000\n" +"X-Generator: Launchpad (build 14914)\n" + +#. module: account_cancel +#: view:account.invoice:0 +msgid "Cancel" +msgstr "Atšaukti" diff --git a/addons/decimal_precision/i18n/lt.po b/addons/decimal_precision/i18n/lt.po new file mode 100644 index 00000000000..d9ea7610c48 --- /dev/null +++ b/addons/decimal_precision/i18n/lt.po @@ -0,0 +1,49 @@ +# Lithuanian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 00:36+0000\n" +"PO-Revision-Date: 2012-03-09 15:34+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Lithuanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-10 04:54+0000\n" +"X-Generator: Launchpad (build 14914)\n" + +#. module: decimal_precision +#: field:decimal.precision,digits:0 +msgid "Digits" +msgstr "Skaitmenys" + +#. module: decimal_precision +#: model:ir.actions.act_window,name:decimal_precision.action_decimal_precision_form +#: model:ir.ui.menu,name:decimal_precision.menu_decimal_precision_form +msgid "Decimal Accuracy" +msgstr "Dešimtainis tikslumas" + +#. module: decimal_precision +#: field:decimal.precision,name:0 +msgid "Usage" +msgstr "Naudojimas" + +#. module: decimal_precision +#: sql_constraint:decimal.precision:0 +msgid "Only one value can be defined for each given usage!" +msgstr "" + +#. module: decimal_precision +#: view:decimal.precision:0 +msgid "Decimal Precision" +msgstr "Dešimtainis tikslumas" + +#. module: decimal_precision +#: model:ir.model,name:decimal_precision.model_decimal_precision +msgid "decimal.precision" +msgstr "decimal.precision" diff --git a/addons/hr_payroll/i18n/lt.po b/addons/hr_payroll/i18n/lt.po new file mode 100644 index 00000000000..4bbfdcdb3f5 --- /dev/null +++ b/addons/hr_payroll/i18n/lt.po @@ -0,0 +1,1119 @@ +# Lithuanian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 01:37+0100\n" +"PO-Revision-Date: 2012-03-09 15:19+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Lithuanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-10 04:54+0000\n" +"X-Generator: Launchpad (build 14914)\n" + +#. module: hr_payroll +#: field:hr.payslip.line,condition_select:0 +#: field:hr.salary.rule,condition_select:0 +msgid "Condition Based on" +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Monthly" +msgstr "Kas mėnesį" + +#. module: hr_payroll +#: view:hr.payslip:0 field:hr.payslip,line_ids:0 +#: model:ir.actions.act_window,name:hr_payroll.act_contribution_reg_payslip_lines +msgid "Payslip Lines" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.line:0 +#: model:ir.model,name:hr_payroll.model_hr_salary_rule_category +#: report:paylip.details:0 +msgid "Salary Rule Category" +msgstr "" + +#. module: hr_payroll +#: help:hr.salary.rule.category,parent_id:0 +msgid "" +"Linking a salary category to its parent is used only for the reporting " +"purpose." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.payslip.line:0 view:hr.salary.rule:0 +msgid "Group By..." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "States" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,input_ids:0 view:hr.salary.rule:0 +#: field:hr.salary.rule,input_ids:0 +msgid "Inputs" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,parent_rule_id:0 +#: field:hr.salary.rule,parent_rule_id:0 +msgid "Parent Salary Rule" +msgstr "" + +#. module: hr_payroll +#: field:hr.employee,slip_ids:0 view:hr.payslip:0 view:hr.payslip.run:0 +#: field:hr.payslip.run,slip_ids:0 +#: model:ir.actions.act_window,name:hr_payroll.act_hr_employee_payslip_list +msgid "Payslips" +msgstr "" + +#. module: hr_payroll +#: field:hr.payroll.structure,parent_id:0 +#: field:hr.salary.rule.category,parent_id:0 +msgid "Parent" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "(" +msgstr "" + +#. module: hr_payroll +#: field:hr.contribution.register,company_id:0 +#: field:hr.payroll.structure,company_id:0 field:hr.payslip,company_id:0 +#: field:hr.payslip.line,company_id:0 field:hr.salary.rule,company_id:0 +#: field:hr.salary.rule.category,company_id:0 +msgid "Company" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Done Slip" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "," +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.payslip.run:0 +msgid "Set to Draft" +msgstr "" + +#. module: hr_payroll +#: model:ir.model,name:hr_payroll.model_hr_salary_rule +msgid "hr.salary.rule" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,payslip_run_id:0 +#: model:ir.model,name:hr_payroll.model_hr_payslip_run +msgid "Payslip Batches" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.employees:0 +msgid "" +"This wizard will generate payslips for all selected employee(s) based on the " +"dates and credit note specified on Payslips Run." +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 report:paylip.details:0 +#: report:payslip:0 +msgid "Quantity/Rate" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.input,payslip_id:0 field:hr.payslip.line,slip_id:0 +#: field:hr.payslip.worked_days,payslip_id:0 +#: model:ir.model,name:hr_payroll.model_hr_payslip report:payslip:0 +msgid "Pay Slip" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.employees:0 +msgid "Generate" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,amount_percentage_base:0 +#: help:hr.salary.rule,amount_percentage_base:0 +msgid "result will be affected to a variable" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 +msgid "Total:" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.act_children_salary_rules +msgid "All Children Rules" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.salary.rule:0 +msgid "Input Data" +msgstr "" + +#. module: hr_payroll +#: constraint:hr.payslip:0 +msgid "Payslip 'Date From' must be before 'Date To'." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.salary.rule.category:0 +msgid "Notes" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Salary Computation" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 field:hr.payslip.input,amount:0 +#: field:hr.payslip.line,amount:0 report:paylip.details:0 report:payslip:0 +msgid "Amount" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.payslip.line:0 +#: model:ir.model,name:hr_payroll.model_hr_payslip_line +msgid "Payslip Line" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Other Information" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,amount_select:0 help:hr.salary.rule,amount_select:0 +msgid "The computation method for the rule amount." +msgstr "" + +#. module: hr_payroll +#: view:payslip.lines.contribution.register:0 +msgid "Contribution Register's Payslip Lines" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py:52 +#, python-format +msgid "Warning !" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 +msgid "Details by Salary Rule Category:" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Note" +msgstr "" + +#. module: hr_payroll +#: field:hr.payroll.structure,code:0 field:hr.payslip,number:0 +#: report:paylip.details:0 report:payslip:0 +msgid "Reference" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Draft Slip" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:422 +#, python-format +msgid "Normal Working Days paid at 100%" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,condition_range_max:0 +#: field:hr.salary.rule,condition_range_max:0 +msgid "Maximum Range" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Identification No" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,struct_id:0 +msgid "Structure" +msgstr "" + +#. module: hr_payroll +#: help:hr.employee,total_wage:0 +msgid "Sum of all current contract's wage of employee." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Total Working Days" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,code:0 help:hr.salary.rule,code:0 +msgid "" +"The code of salary rules can be used as reference in computation of other " +"rules. In that case, it is case sensitive." +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Weekly" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,rate:0 +msgid "Rate (%)" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Confirm" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.report.xml,name:hr_payroll.payslip_report +msgid "Employee PaySlip" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,condition_range_max:0 +#: help:hr.salary.rule,condition_range_max:0 +msgid "The maximum amount, applied for this rule." +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,condition_python:0 +#: help:hr.salary.rule,condition_python:0 +msgid "" +"Applied this rule for calculation if condition is true. You can specify " +"condition like basic > 1000." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.employees:0 +msgid "Payslips by Employees" +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Quarterly" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,state:0 field:hr.payslip.run,state:0 +msgid "State" +msgstr "" + +#. module: hr_payroll +#: help:hr.salary.rule,quantity:0 +msgid "" +"It is used in computation for percentage and fixed amount.For e.g. A rule " +"for Meal Voucher having fixed amount of 1€ per worked day can have its " +"quantity defined in expression like worked_days.WORK100.number_of_days." +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "Search Salary Rule" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,employee_id:0 field:hr.payslip.line,employee_id:0 +#: model:ir.model,name:hr_payroll.model_hr_employee +msgid "Employee" +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Semi-annually" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "Children definition" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Email" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.run:0 +msgid "Search Payslip Batches" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,amount_percentage_base:0 +#: field:hr.salary.rule,amount_percentage_base:0 +msgid "Percentage based on" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,amount_percentage:0 +#: help:hr.salary.rule,amount_percentage:0 +msgid "For example, enter 50.0 to apply a percentage of 50%" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,paid:0 +msgid "Made Payment Order ? " +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 +msgid "PaySlip Lines by Contribution Register" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip,state:0 +msgid "" +"* When the payslip is created the state is 'Draft'. \n" +"* If the payslip is under verification, the state is 'Waiting'. " +"\n" +"* If the payslip is confirmed then state is set to 'Done'. \n" +"* When user cancel payslip the state is 'Rejected'." +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.worked_days,number_of_days:0 +msgid "Number of Days" +msgstr "" + +#. module: hr_payroll +#: selection:hr.payslip,state:0 +msgid "Rejected" +msgstr "" + +#. module: hr_payroll +#: view:hr.payroll.structure:0 field:hr.payroll.structure,rule_ids:0 +#: view:hr.salary.rule:0 +#: model:ir.actions.act_window,name:hr_payroll.action_salary_rule_form +#: model:ir.ui.menu,name:hr_payroll.menu_action_hr_salary_rule_form +msgid "Salary Rules" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:337 +#, python-format +msgid "Refund: " +msgstr "" + +#. module: hr_payroll +#: model:ir.model,name:hr_payroll.model_payslip_lines_contribution_register +msgid "PaySlip Lines by Contribution Registers" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 selection:hr.payslip,state:0 view:hr.payslip.run:0 +msgid "Done" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,appears_on_payslip:0 +#: field:hr.salary.rule,appears_on_payslip:0 +msgid "Appears on Payslip" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,amount_fix:0 +#: selection:hr.payslip.line,amount_select:0 field:hr.salary.rule,amount_fix:0 +#: selection:hr.salary.rule,amount_select:0 +msgid "Fixed Amount" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,active:0 help:hr.salary.rule,active:0 +msgid "" +"If the active field is set to false, it will allow you to hide the salary " +"rule without removing it." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Worked Days & Inputs" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,details_by_salary_rule_category:0 +msgid "Details by Salary Rule Category" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.action_payslip_lines_contribution_register +msgid "PaySlip Lines" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,register_id:0 help:hr.salary.rule,register_id:0 +msgid "Eventual third party involved in the salary payment of the employees." +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.worked_days,number_of_hours:0 +msgid "Number of Hours" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "PaySlip Batch" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,condition_range_min:0 +#: field:hr.salary.rule,condition_range_min:0 +msgid "Minimum Range" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,child_ids:0 field:hr.salary.rule,child_ids:0 +msgid "Child Salary Rule" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 field:hr.payslip,date_to:0 +#: field:hr.payslip.run,date_end:0 report:paylip.details:0 report:payslip:0 +#: field:payslip.lines.contribution.register,date_to:0 +msgid "Date To" +msgstr "" + +#. module: hr_payroll +#: selection:hr.payslip.line,condition_select:0 +#: selection:hr.salary.rule,condition_select:0 +msgid "Range" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payroll_structure_tree +#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_structure_tree +msgid "Salary Structures Hierarchy" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Payslip" +msgstr "" + +#. module: hr_payroll +#: constraint:hr.contract:0 +msgid "Error! contract start-date must be lower then contract end-date." +msgstr "" + +#. module: hr_payroll +#: view:hr.contract:0 +msgid "Payslip Info" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.act_payslip_lines +msgid "Payslip Computation Details" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:872 +#, python-format +msgid "Wrong python code defined for salary rule %s (%s) " +msgstr "" + +#. module: hr_payroll +#: model:ir.model,name:hr_payroll.model_hr_payslip_input +msgid "Payslip Input" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule.category:0 +#: model:ir.actions.act_window,name:hr_payroll.action_hr_salary_rule_category +#: model:ir.ui.menu,name:hr_payroll.menu_hr_salary_rule_category +msgid "Salary Rule Categories" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.input,contract_id:0 +#: help:hr.payslip.worked_days,contract_id:0 +msgid "The contract for which applied this input" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "Computation" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.input,amount:0 +msgid "" +"It is used in computation. For e.g. A rule for sales having 1% commission of " +"basic salary for per product can defined in expression like result = " +"inputs.SALEURO.amount * contract.wage*0.01." +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.line:0 field:hr.payslip.line,amount_select:0 +#: field:hr.salary.rule,amount_select:0 +msgid "Amount Type" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,category_id:0 view:hr.salary.rule:0 +#: field:hr.salary.rule,category_id:0 +msgid "Category" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.run,credit_note:0 +msgid "" +"If its checked, indicates that all payslips generated from here are refund " +"payslips." +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payroll_structure_list_form +#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_structure_view +msgid "Salary Structures" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.run:0 +msgid "Draft Payslip Batches" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 selection:hr.payslip,state:0 view:hr.payslip.run:0 +#: selection:hr.payslip.run,state:0 +msgid "Draft" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 field:hr.payslip,date_from:0 +#: field:hr.payslip.run,date_start:0 report:paylip.details:0 report:payslip:0 +#: field:payslip.lines.contribution.register,date_from:0 +msgid "Date From" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.run:0 +msgid "Done Payslip Batches" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 +msgid "Payslip Lines by Contribution Register:" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "Conditions" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,amount_percentage:0 +#: selection:hr.payslip.line,amount_select:0 +#: field:hr.salary.rule,amount_percentage:0 +#: selection:hr.salary.rule,amount_select:0 +msgid "Percentage (%)" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Worked Day" +msgstr "" + +#. module: hr_payroll +#: view:hr.payroll.structure:0 +msgid "Employee Function" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,credit_note:0 field:hr.payslip.run,credit_note:0 +msgid "Credit Note" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Compute Sheet" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,active:0 field:hr.salary.rule,active:0 +msgid "Active" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "Child Rules" +msgstr "" + +#. module: hr_payroll +#: constraint:hr.employee:0 +msgid "Error ! You cannot create recursive Hierarchy of Employees." +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.report.xml,name:hr_payroll.payslip_details_report +msgid "PaySlip Details" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,condition_range_min:0 +#: help:hr.salary.rule,condition_range_min:0 +msgid "The minimum amount, applied for this rule." +msgstr "" + +#. module: hr_payroll +#: selection:hr.payslip.line,condition_select:0 +#: selection:hr.salary.rule,condition_select:0 +msgid "Python Expression" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Designation" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py:52 +#, python-format +msgid "You must select employee(s) to generate payslip(s)" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:861 +#, python-format +msgid "Wrong quantity defined for salary rule %s (%s)" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Companies" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Authorized Signature" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,contract_id:0 field:hr.payslip.input,contract_id:0 +#: field:hr.payslip.line,contract_id:0 +#: field:hr.payslip.worked_days,contract_id:0 +#: model:ir.model,name:hr_payroll.model_hr_contract +msgid "Contract" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Credit" +msgstr "" + +#. module: hr_payroll +#: field:hr.contract,schedule_pay:0 +msgid "Scheduled Pay" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:861 +#: code:addons/hr_payroll/hr_payroll.py:866 +#: code:addons/hr_payroll/hr_payroll.py:872 +#: code:addons/hr_payroll/hr_payroll.py:889 +#: code:addons/hr_payroll/hr_payroll.py:895 +#, python-format +msgid "Error" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,condition_python:0 +#: field:hr.salary.rule,condition_python:0 +msgid "Python Condition" +msgstr "" + +#. module: hr_payroll +#: view:hr.contribution.register:0 +msgid "Contribution" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:347 +#, python-format +msgid "Refund Payslip" +msgstr "" + +#. module: hr_payroll +#: field:hr.rule.input,input_id:0 +#: model:ir.model,name:hr_payroll.model_hr_rule_input +msgid "Salary Rule Input" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:895 +#, python-format +msgid "Wrong python condition defined for salary rule %s (%s)" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,quantity:0 field:hr.salary.rule,quantity:0 +msgid "Quantity" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Refund" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "Company contribution" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 field:hr.payslip.input,code:0 +#: field:hr.payslip.line,code:0 field:hr.payslip.worked_days,code:0 +#: field:hr.rule.input,code:0 field:hr.salary.rule,code:0 +#: field:hr.salary.rule.category,code:0 report:paylip.details:0 +#: report:payslip:0 +msgid "Code" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,amount_python_compute:0 +#: selection:hr.payslip.line,amount_select:0 +#: field:hr.salary.rule,amount_python_compute:0 +#: selection:hr.salary.rule,amount_select:0 +msgid "Python Code" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.input,sequence:0 field:hr.payslip.line,sequence:0 +#: field:hr.payslip.worked_days,sequence:0 field:hr.salary.rule,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 report:paylip.details:0 +msgid "Register Name" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule:0 +msgid "General" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:664 +#, python-format +msgid "Salary Slip of %s for %s" +msgstr "" + +#. module: hr_payroll +#: model:ir.model,name:hr_payroll.model_hr_payslip_employees +msgid "Generate payslips for all selected employees" +msgstr "" + +#. module: hr_payroll +#: field:hr.contract,struct_id:0 view:hr.payroll.structure:0 view:hr.payslip:0 +#: view:hr.payslip.line:0 +#: model:ir.model,name:hr_payroll.model_hr_payroll_structure +msgid "Salary Structure" +msgstr "" + +#. module: hr_payroll +#: field:hr.contribution.register,register_line_ids:0 +msgid "Register Line" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.payslip.employees:0 +#: view:payslip.lines.contribution.register:0 +msgid "Cancel" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.run:0 selection:hr.payslip.run,state:0 +msgid "Close" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip,struct_id:0 +msgid "" +"Defines the rules that have to be applied to this payslip, accordingly to " +"the contract chosen. If you let empty the field contract, this field isn't " +"mandatory anymore and thus the rules applied will be all the rules set on " +"the structure of all contracts of the employee valid for the chosen period" +msgstr "" + +#. module: hr_payroll +#: field:hr.payroll.structure,children_ids:0 +#: field:hr.salary.rule.category,children_ids:0 +msgid "Children" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip,credit_note:0 +msgid "Indicates this payslip has a refund of another" +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Bi-monthly" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 +msgid "Pay Slip Details" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payslip_form +#: model:ir.ui.menu,name:hr_payroll.menu_department_tree +msgid "Employee Payslips" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.line:0 field:hr.payslip.line,register_id:0 +#: field:hr.salary.rule,register_id:0 +#: model:ir.model,name:hr_payroll.model_hr_contribution_register +msgid "Contribution Register" +msgstr "" + +#. module: hr_payroll +#: view:payslip.lines.contribution.register:0 +msgid "Print" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,help:hr_payroll.action_contribution_register_form +msgid "" +"A contribution register is a third party involved in the salary payment of " +"the employees. It can be the social security, the estate or anyone that " +"collect or inject money on payslips." +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:889 +#, python-format +msgid "Wrong range condition defined for salary rule %s (%s)" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.line:0 +msgid "Calculations" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Worked Days" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Search Payslips" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.run:0 +#: model:ir.actions.act_window,name:hr_payroll.action_hr_payslip_run_tree +#: model:ir.ui.menu,name:hr_payroll.menu_hr_payslip_run +msgid "Payslips Batches" +msgstr "" + +#. module: hr_payroll +#: view:hr.contribution.register:0 field:hr.contribution.register,note:0 +#: field:hr.payroll.structure,note:0 field:hr.payslip,name:0 +#: field:hr.payslip,note:0 field:hr.payslip.input,name:0 +#: view:hr.payslip.line:0 field:hr.payslip.line,note:0 +#: field:hr.payslip.worked_days,name:0 field:hr.rule.input,name:0 +#: view:hr.salary.rule:0 field:hr.salary.rule,note:0 +#: field:hr.salary.rule.category,note:0 +msgid "Description" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid ")" +msgstr "" + +#. module: hr_payroll +#: view:hr.contribution.register:0 +#: model:ir.actions.act_window,name:hr_payroll.action_contribution_register_form +#: model:ir.ui.menu,name:hr_payroll.menu_action_hr_contribution_register_form +msgid "Contribution Registers" +msgstr "" + +#. module: hr_payroll +#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_reporting +#: model:ir.ui.menu,name:hr_payroll.menu_hr_root_payroll +#: model:ir.ui.menu,name:hr_payroll.payroll_configure +msgid "Payroll" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.report.xml,name:hr_payroll.contribution_register +msgid "PaySlip Lines By Conribution Register" +msgstr "" + +#. module: hr_payroll +#: selection:hr.payslip,state:0 +msgid "Waiting" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Address" +msgstr "" + +#. module: hr_payroll +#: code:addons/hr_payroll/hr_payroll.py:866 +#, python-format +msgid "Wrong percentage base or quantity defined for salary rule %s (%s)" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,worked_days_line_ids:0 +#: model:ir.model,name:hr_payroll.model_hr_payslip_worked_days +msgid "Payslip Worked Days" +msgstr "" + +#. module: hr_payroll +#: view:hr.salary.rule.category:0 +msgid "Salary Categories" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 field:hr.contribution.register,name:0 +#: field:hr.payroll.structure,name:0 field:hr.payslip.line,name:0 +#: field:hr.payslip.run,name:0 field:hr.salary.rule,name:0 +#: field:hr.salary.rule.category,name:0 report:paylip.details:0 +#: report:payslip:0 +msgid "Name" +msgstr "" + +#. module: hr_payroll +#: view:hr.payroll.structure:0 +msgid "Payroll Structures" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 view:hr.payslip.employees:0 +#: field:hr.payslip.employees,employee_ids:0 view:hr.payslip.line:0 +msgid "Employees" +msgstr "" + +#. module: hr_payroll +#: report:paylip.details:0 report:payslip:0 +msgid "Bank Account" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,sequence:0 help:hr.salary.rule,sequence:0 +msgid "Use to arrange calculation sequence" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,condition_range:0 +#: help:hr.salary.rule,condition_range:0 +msgid "" +"This will be used to compute the % fields values; in general it is on basic, " +"but you can also use categories code fields in lowercase as a variable names " +"(hra, ma, lta, etc.) and the variable basic." +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Annually" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip,input_line_ids:0 +msgid "Payslip Inputs" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,salary_rule_id:0 +msgid "Rule" +msgstr "" + +#. module: hr_payroll +#: model:ir.actions.act_window,name:hr_payroll.action_hr_salary_rule_category_tree_view +#: model:ir.ui.menu,name:hr_payroll.menu_hr_salary_rule_category_tree_view +msgid "Salary Rule Categories Hierarchy" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 field:hr.payslip.line,total:0 +#: report:paylip.details:0 report:payslip:0 +msgid "Total" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.line,appears_on_payslip:0 +#: help:hr.salary.rule,appears_on_payslip:0 +msgid "Used for the display of rule on payslip" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.line:0 +msgid "Search Payslip Lines" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip:0 +msgid "Details By Salary Rule Category" +msgstr "" + +#. module: hr_payroll +#: help:hr.payslip.input,code:0 help:hr.payslip.worked_days,code:0 +#: help:hr.rule.input,code:0 +msgid "The code that can be used in the salary rules" +msgstr "" + +#. module: hr_payroll +#: view:hr.payslip.run:0 +#: model:ir.actions.act_window,name:hr_payroll.action_hr_payslip_by_employees +msgid "Generate Payslips" +msgstr "" + +#. module: hr_payroll +#: selection:hr.contract,schedule_pay:0 +msgid "Bi-weekly" +msgstr "" + +#. module: hr_payroll +#: field:hr.employee,total_wage:0 +msgid "Total Basic Salary" +msgstr "" + +#. module: hr_payroll +#: selection:hr.payslip.line,condition_select:0 +#: selection:hr.salary.rule,condition_select:0 +msgid "Always True" +msgstr "" + +#. module: hr_payroll +#: report:contribution.register.lines:0 +msgid "PaySlip Name" +msgstr "" + +#. module: hr_payroll +#: field:hr.payslip.line,condition_range:0 +#: field:hr.salary.rule,condition_range:0 +msgid "Range Based on" +msgstr "" diff --git a/addons/hr_recruitment/i18n/mk.po b/addons/hr_recruitment/i18n/mk.po new file mode 100644 index 00000000000..114a284ffac --- /dev/null +++ b/addons/hr_recruitment/i18n/mk.po @@ -0,0 +1,1176 @@ +# Macedonian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 01:37+0100\n" +"PO-Revision-Date: 2012-03-08 10:54+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Macedonian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-03-09 04:51+0000\n" +"X-Generator: Launchpad (build 14914)\n" + +#. module: hr_recruitment +#: help:hr.applicant,active:0 +msgid "" +"If the active field is set to false, it will allow you to hide the case " +"without removing it." +msgstr "" + +#. module: hr_recruitment +#: view:hr.recruitment.stage:0 field:hr.recruitment.stage,requirements:0 +msgid "Requirements" +msgstr "Барања" + +#. module: hr_recruitment +#: view:hr.recruitment.source:0 +#: model:ir.actions.act_window,name:hr_recruitment.hr_recruitment_source_action +#: model:ir.ui.menu,name:hr_recruitment.menu_hr_recruitment_source +msgid "Sources of Applicants" +msgstr "" + +#. module: hr_recruitment +#: field:hr.recruitment.report,delay_open:0 +msgid "Avg. Delay to Open" +msgstr "" + +#. module: hr_recruitment +#: field:hr.recruitment.report,nbr:0 +msgid "# of Cases" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Group By..." +msgstr "Групирај По..." + +#. module: hr_recruitment +#: field:hr.applicant,user_email:0 +msgid "User Email" +msgstr "Емаил на корисникот" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Filter and view on next actions and date" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 field:hr.applicant,department_id:0 +#: view:hr.recruitment.report:0 field:hr.recruitment.report,department_id:0 +msgid "Department" +msgstr "Одделение" + +#. module: hr_recruitment +#: field:hr.applicant,date_action:0 +msgid "Next Action Date" +msgstr "Дата на следната активност" + +#. module: hr_recruitment +#: field:hr.applicant,salary_expected_extra:0 +msgid "Expected Salary Extra" +msgstr "Очекувана екстра плата" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "Jobs" +msgstr "Работни Места" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Pending Jobs" +msgstr "Во очекување на работни места" + +#. module: hr_recruitment +#: field:hr.applicant,company_id:0 view:hr.recruitment.report:0 +#: field:hr.recruitment.report,company_id:0 +msgid "Company" +msgstr "Компанија" + +#. module: hr_recruitment +#: view:hired.employee:0 +msgid "No" +msgstr "Не" + +#. module: hr_recruitment +#: code:addons/hr_recruitment/hr_recruitment.py:436 +#, python-format +msgid "You must define Applied Job for this applicant." +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Job" +msgstr "Работно Место" + +#. module: hr_recruitment +#: field:hr.recruitment.partner.create,close:0 +msgid "Close job request" +msgstr "" + +#. module: hr_recruitment +#: field:hr.applicant,day_open:0 +msgid "Days to Open" +msgstr "" + +#. module: hr_recruitment +#: field:hr.recruitment.job2phonecall,note:0 +msgid "Goals" +msgstr "Цели" + +#. module: hr_recruitment +#: field:hr.recruitment.report,partner_address_id:0 +msgid "Partner Contact Name" +msgstr "Контакт име на партнер" + +#. module: hr_recruitment +#: view:hr.applicant:0 view:hr.recruitment.partner.create:0 +#: model:ir.actions.act_window,name:hr_recruitment.action_hr_recruitment_partner_create +msgid "Create Partner" +msgstr "Креирај партнер" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 field:hr.recruitment.report,day:0 +msgid "Day" +msgstr "Ден" + +#. module: hr_recruitment +#: field:hr.applicant,reference:0 +msgid "Refered By" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Contract Data" +msgstr "Дата на договорот" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Add Internal Note" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Refuse" +msgstr "Одбиј" + +#. module: hr_recruitment +#: model:hr.recruitment.degree,name:hr_recruitment.degree_licenced +msgid "Master Degree" +msgstr "МАгистратура" + +#. module: hr_recruitment +#: field:hr.applicant,partner_mobile:0 +msgid "Mobile" +msgstr "Мобилен" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Notes" +msgstr "Забелешки" + +#. module: hr_recruitment +#: field:hr.applicant,message_ids:0 +msgid "Messages" +msgstr "Пораки" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Next Actions" +msgstr "Следна активност" + +#. module: hr_recruitment +#: field:hr.applicant,salary_expected:0 view:hr.recruitment.report:0 +msgid "Expected Salary" +msgstr "Очекувана плата" + +#. module: hr_recruitment +#: field:hr.applicant,job_id:0 field:hr.recruitment.report,job_id:0 +msgid "Applied Job" +msgstr "" + +#. module: hr_recruitment +#: model:hr.recruitment.degree,name:hr_recruitment.degree_graduate +msgid "Graduate" +msgstr "" + +#. module: hr_recruitment +#: field:hr.applicant,color:0 +msgid "Color Index" +msgstr "Индекс на бои" + +#. module: hr_recruitment +#: view:board.board:0 view:hr.applicant:0 +#: model:ir.actions.act_window,name:hr_recruitment.action_applicants_status +msgid "Applicants Status" +msgstr "Статус на апликантот" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "My Recruitment" +msgstr "Мое вработување" + +#. module: hr_recruitment +#: field:hr.job,survey_id:0 +msgid "Interview Form" +msgstr "Формулар за интервју" + +#. module: hr_recruitment +#: help:hr.job,survey_id:0 +msgid "" +"Choose an interview form for this job position and you will be able to " +"print/answer this interview from all applicants who apply for this job" +msgstr "" +"Избери формулар за интервју за оваа работна позиција и ќе може да го " +"испринтате/одговорите овој формулар за од страна на сите кои аплицирале за " +"ова работно место" + +#. module: hr_recruitment +#: model:ir.ui.menu,name:hr_recruitment.menu_hr_recruitment_recruitment +msgid "Recruitment" +msgstr "Вработување" + +#. module: hr_recruitment +#: code:addons/hr_recruitment/hr_recruitment.py:436 +#, python-format +msgid "Warning!" +msgstr "Предупредување!" + +#. module: hr_recruitment +#: field:hr.recruitment.report,salary_prop:0 +msgid "Salary Proposed" +msgstr "Предложена плата" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Change Color" +msgstr "Промени боја" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "Avg Proposed Salary" +msgstr "Просечна предложена плата" + +#. module: hr_recruitment +#: view:hr.applicant:0 field:hr.recruitment.report,available:0 +msgid "Availability" +msgstr "Достапност" + +#. module: hr_recruitment +#: help:hr.recruitment.stage,department_id:0 +msgid "" +"Stages of the recruitment process may be different per department. If this " +"stage is common to all departments, keep tempy this field." +msgstr "" +"Етапите од процесот на вработување може да се разликуваат по одделение. " +"Доколу оваа етапа е заедничка за сите одделенија," + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Previous" +msgstr "" + +#. module: hr_recruitment +#: model:ir.model,name:hr_recruitment.model_hr_recruitment_source +msgid "Source of Applicants" +msgstr "" + +#. module: hr_recruitment +#: code:addons/hr_recruitment/wizard/hr_recruitment_phonecall.py:115 +#, python-format +msgid "Phone Call" +msgstr "Телефонски повик" + +#. module: hr_recruitment +#: view:hr.recruitment.partner.create:0 +msgid "Convert To Partner" +msgstr "" + +#. module: hr_recruitment +#: model:ir.model,name:hr_recruitment.model_hr_recruitment_report +msgid "Recruitments Statistics" +msgstr "" + +#. module: hr_recruitment +#: code:addons/hr_recruitment/hr_recruitment.py:476 +#, python-format +msgid "Changed Stage to: %s" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Hire" +msgstr "" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "Hired employees" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Next" +msgstr "" + +#. module: hr_recruitment +#: model:ir.model,name:hr_recruitment.model_hr_job +msgid "Job Description" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 field:hr.applicant,source_id:0 +msgid "Source" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Send New Email" +msgstr "испрати нов емаил" + +#. module: hr_recruitment +#: code:addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py:39 +#, python-format +msgid "A partner is already defined on this job request." +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 selection:hr.applicant,state:0 +#: view:hr.recruitment.report:0 selection:hr.recruitment.report,state:0 +msgid "New" +msgstr "Нов" + +#. module: hr_recruitment +#: field:hr.applicant,email_from:0 +msgid "Email" +msgstr "Е-пошта" + +#. module: hr_recruitment +#: field:hr.applicant,availability:0 +msgid "Availability (Days)" +msgstr "" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "Available" +msgstr "Достапно" + +#. module: hr_recruitment +#: field:hr.applicant,title_action:0 +msgid "Next Action" +msgstr "следна активност" + +#. module: hr_recruitment +#: selection:hr.applicant,priority:0 +#: selection:hr.recruitment.report,priority:0 +msgid "Good" +msgstr "Добро" + +#. module: hr_recruitment +#: code:addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py:38 +#: code:addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py:57 +#, python-format +msgid "Error !" +msgstr "грешка!" + +#. module: hr_recruitment +#: model:ir.actions.act_window,help:hr_recruitment.hr_job_stage_act +msgid "" +"Define here your stages of the recruitment process, for example: " +"qualification call, first interview, second interview, refused, hired." +msgstr "" +"дефинирај ги етапите на процесот на вработување, на пример: повик за " +"квалификација, прво интервју, второ интервју, одбиен, вработен." + +#. module: hr_recruitment +#: view:hr.applicant:0 field:hr.applicant,create_date:0 +#: view:hr.recruitment.report:0 +msgid "Creation Date" +msgstr "Датум на креирање" + +#. module: hr_recruitment +#: model:ir.actions.act_window,name:hr_recruitment.action_hr_recruitment_hired_employee +#: model:ir.model,name:hr_recruitment.model_hired_employee +msgid "Create Employee" +msgstr "" + +#. module: hr_recruitment +#: field:hr.recruitment.job2phonecall,deadline:0 +msgid "Planned Date" +msgstr "планирана дата" + +#. module: hr_recruitment +#: view:hr.applicant:0 field:hr.applicant,priority:0 +#: field:hr.recruitment.report,priority:0 +msgid "Appreciation" +msgstr "" + +#. module: hr_recruitment +#: model:hr.recruitment.stage,name:hr_recruitment.stage_job1 +msgid "Initial Qualification" +msgstr "основна квалификација" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Print Interview" +msgstr "испринтај интервју" + +#. module: hr_recruitment +#: view:hr.applicant:0 field:hr.applicant,stage_id:0 +#: view:hr.recruitment.report:0 field:hr.recruitment.report,stage_id:0 +#: view:hr.recruitment.stage:0 +msgid "Stage" +msgstr "Етапа" + +#. module: hr_recruitment +#: view:hr.applicant:0 selection:hr.applicant,state:0 +#: view:hr.recruitment.report:0 selection:hr.recruitment.report,state:0 +msgid "Pending" +msgstr "Чекам" + +#. module: hr_recruitment +#: model:ir.actions.act_window,name:hr_recruitment.hr_job_stage_act +msgid "Recruitment / Applicants Stages" +msgstr "" + +#. module: hr_recruitment +#: model:hr.recruitment.degree,name:hr_recruitment.degree_bac5 +msgid "Doctoral Degree" +msgstr "докторска дисертациај" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,month:0 +msgid "July" +msgstr "Јули" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Subject" +msgstr "Наслов" + +#. module: hr_recruitment +#: field:hr.applicant,email_cc:0 +msgid "Watchers Emails" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +#: model:ir.actions.act_window,name:hr_recruitment.crm_case_categ0_act_job +#: model:ir.ui.menu,name:hr_recruitment.menu_crm_case_categ0_act_job +msgid "Applicants" +msgstr "апликанти" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "History Information" +msgstr "историски информации" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Dates" +msgstr "Датуми" + +#. module: hr_recruitment +#: model:ir.actions.act_window,help:hr_recruitment.hr_recruitment_stage_act +msgid "" +" Check if the following stages are matching your recruitment process. Don't " +"forget to specify the department if your recruitment process is different " +"according to the job position." +msgstr "" +" Проверете дали следниве етапи се совпаѓаат со процесот на вработување. Не " +"заборавајте да го назначите одделението доколку процесот на вработување " +"варира во зависност од работната позиција." + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid " Month-1 " +msgstr " Месец - 1 " + +#. module: hr_recruitment +#: field:hr.recruitment.report,salary_exp:0 +msgid "Salary Expected" +msgstr "очекувана плата" + +#. module: hr_recruitment +#: model:ir.model,name:hr_recruitment.model_hr_applicant +msgid "Applicant" +msgstr "Кандидат" + +#. module: hr_recruitment +#: help:hr.recruitment.stage,sequence:0 +msgid "Gives the sequence order when displaying a list of stages." +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Contact" +msgstr "Контакт" + +#. module: hr_recruitment +#: help:hr.applicant,salary_expected_extra:0 +msgid "Salary Expected by Applicant, extra advantages" +msgstr "очекувана плата по кандидат, екстра предности" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Qualification" +msgstr "квалификација" + +#. module: hr_recruitment +#: field:hr.applicant,partner_id:0 view:hr.recruitment.report:0 +#: field:hr.recruitment.report,partner_id:0 +msgid "Partner" +msgstr "партнер" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,month:0 +msgid "March" +msgstr "Март" + +#. module: hr_recruitment +#: model:ir.model,name:hr_recruitment.model_hr_recruitment_stage +msgid "Stage of Recruitment" +msgstr "Етапа на вработување" + +#. module: hr_recruitment +#: view:hr.recruitment.stage:0 +#: model:ir.actions.act_window,name:hr_recruitment.hr_recruitment_stage_act +#: model:ir.ui.menu,name:hr_recruitment.menu_hr_recruitment_stage +msgid "Stages" +msgstr "Етапи" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "Draft recruitment" +msgstr "Предлог за враборување" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Delete" +msgstr "Бриши" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "In progress" +msgstr "Во тек" + +#. module: hr_recruitment +#: model:ir.actions.act_window,name:hr_recruitment.hr_recruitment_stage_form_installer +msgid "Review Recruitment Stages" +msgstr "Прегледај ги етапите за вработување" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Jobs - Recruitment Form" +msgstr "Работни места - формулар за вработување" + +#. module: hr_recruitment +#: field:hr.applicant,probability:0 +msgid "Probability" +msgstr "Веројатност" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,month:0 +msgid "September" +msgstr "Септември" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,month:0 +msgid "December" +msgstr "Декември" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "Recruitment performed in current year" +msgstr "Вработување направено во тековната година" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "Recruitment during last month" +msgstr "Вработување во текот на минатиот месец" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 field:hr.recruitment.report,month:0 +msgid "Month" +msgstr "Месец" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Unassigned Recruitments" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Job Info" +msgstr "Информации за работни места" + +#. module: hr_recruitment +#: model:hr.recruitment.stage,name:hr_recruitment.stage_job2 +msgid "First Interview" +msgstr "Прво интервју" + +#. module: hr_recruitment +#: field:hr.applicant,write_date:0 +msgid "Update Date" +msgstr "Датум на ажурирање" + +#. module: hr_recruitment +#: view:hired.employee:0 +msgid "Yes" +msgstr "Да" + +#. module: hr_recruitment +#: field:hr.applicant,salary_proposed:0 view:hr.recruitment.report:0 +msgid "Proposed Salary" +msgstr "Предложена плата" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Schedule Meeting" +msgstr "Распоред на состаноци" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Search Jobs" +msgstr "барај работни места" + +#. module: hr_recruitment +#: field:hr.recruitment.job2phonecall,category_id:0 +msgid "Category" +msgstr "Категорија" + +#. module: hr_recruitment +#: field:hr.applicant,partner_name:0 +msgid "Applicant's Name" +msgstr "Име на апликантот" + +#. module: hr_recruitment +#: selection:hr.applicant,priority:0 +#: selection:hr.recruitment.report,priority:0 +msgid "Very Good" +msgstr "Многу добро" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "# Cases" +msgstr "Случаи" + +#. module: hr_recruitment +#: field:hr.applicant,date_open:0 +msgid "Opened" +msgstr "Отворено" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "Group By ..." +msgstr "Групирај по..." + +#. module: hr_recruitment +#: view:hr.applicant:0 selection:hr.applicant,state:0 +msgid "In Progress" +msgstr "Во тек" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Reset to New" +msgstr "" + +#. module: hr_recruitment +#: help:hr.applicant,salary_expected:0 +msgid "Salary Expected by Applicant" +msgstr "Очекувана плата по апликант" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "All Initial Jobs" +msgstr "Сите почетни работни места" + +#. module: hr_recruitment +#: help:hr.applicant,email_cc:0 +msgid "" +"These email addresses will be added to the CC field of all inbound and " +"outbound emails for this record before being sent. Separate multiple email " +"addresses with a comma" +msgstr "" +"Овие емаил адреси ќе бидат додадени во СС полето на сите влезни и излезни " +"мејлови за овој запис пред да бидат испратени. Одделете ги емаил адресите со " +"запирка." + +#. module: hr_recruitment +#: model:ir.ui.menu,name:hr_recruitment.menu_hr_recruitment_degree +msgid "Degrees" +msgstr "Степени" + +#. module: hr_recruitment +#: field:hr.applicant,date_closed:0 field:hr.recruitment.report,date_closed:0 +msgid "Closed" +msgstr "Затворено" + +#. module: hr_recruitment +#: view:hr.recruitment.stage:0 +msgid "Stage Definition" +msgstr "Дефинирање на етапа" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Answer" +msgstr "Одговор" + +#. module: hr_recruitment +#: field:hr.recruitment.report,delay_close:0 +msgid "Avg. Delay to Close" +msgstr "" + +#. module: hr_recruitment +#: help:hr.applicant,salary_proposed:0 +msgid "Salary Proposed by the Organisation" +msgstr "Предложена плата од старна на организацијата" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Meeting" +msgstr "Состанок" + +#. module: hr_recruitment +#: code:addons/hr_recruitment/hr_recruitment.py:347 +#, python-format +msgid "No Subject" +msgstr "Нема наслов" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Status" +msgstr "Статус" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Communication & History" +msgstr "Комуникација и историја" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,month:0 +msgid "August" +msgstr "Август" + +#. module: hr_recruitment +#: view:hr.applicant:0 field:hr.applicant,type_id:0 +#: view:hr.recruitment.degree:0 view:hr.recruitment.report:0 +#: field:hr.recruitment.report,type_id:0 +#: model:ir.actions.act_window,name:hr_recruitment.hr_recruitment_degree_action +msgid "Degree" +msgstr "Диплома" + +#. module: hr_recruitment +#: field:hr.applicant,partner_phone:0 +msgid "Phone" +msgstr "Телефон" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Global CC" +msgstr "" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,month:0 +msgid "June" +msgstr "Јуни" + +#. module: hr_recruitment +#: field:hr.applicant,day_close:0 +msgid "Days to Close" +msgstr "Денови до затварање" + +#. module: hr_recruitment +#: field:hr.recruitment.report,user_id:0 +msgid "User" +msgstr "Корисник" + +#. module: hr_recruitment +#: selection:hr.applicant,priority:0 +#: selection:hr.recruitment.report,priority:0 +msgid "Excellent" +msgstr "Одлично" + +#. module: hr_recruitment +#: field:hr.applicant,active:0 +msgid "Active" +msgstr "Активен" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,month:0 +msgid "November" +msgstr "Ноември" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "Extended Filters..." +msgstr "Напредно пребарување" + +#. module: hr_recruitment +#: field:hr.applicant,response:0 +msgid "Response" +msgstr "Одговор" + +#. module: hr_recruitment +#: field:hr.recruitment.stage,department_id:0 +msgid "Specific to a Department" +msgstr "Специфично за одделението" + +#. module: hr_recruitment +#: field:hr.recruitment.report,salary_prop_avg:0 +msgid "Avg Salary Proposed" +msgstr "Просечна предложена плата" + +#. module: hr_recruitment +#: view:hr.recruitment.job2phonecall:0 +#: model:ir.actions.act_window,name:hr_recruitment.action_hr_recruitment_phonecall +#: model:ir.model,name:hr_recruitment.model_hr_recruitment_job2phonecall +msgid "Schedule Phone Call" +msgstr "Распоред на телефонски повици" + +#. module: hr_recruitment +#: field:hr.applicant,salary_proposed_extra:0 +msgid "Proposed Salary Extra" +msgstr "Предложена екстра плата" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,month:0 +msgid "January" +msgstr "Јануари" + +#. module: hr_recruitment +#: help:hr.applicant,email_from:0 +msgid "These people will receive email." +msgstr "Овие луѓе ќе добијат емаил" + +#. module: hr_recruitment +#: selection:hr.applicant,priority:0 +#: selection:hr.recruitment.report,priority:0 +msgid "Not Good" +msgstr "Не е добро" + +#. module: hr_recruitment +#: field:hr.applicant,date:0 field:hr.recruitment.report,date:0 +msgid "Date" +msgstr "Дата" + +#. module: hr_recruitment +#: view:hr.recruitment.job2phonecall:0 +msgid "Phone Call Description" +msgstr "" + +#. module: hr_recruitment +#: view:hr.recruitment.partner.create:0 +msgid "Are you sure you want to create a partner based on this job request ?" +msgstr "" +"Дали сте сигурни дека сакате да креирате партнер врз основа на барањата на " +"оваа работно место" + +#. module: hr_recruitment +#: view:hired.employee:0 +msgid "Would you like to create an employee ?" +msgstr "Дали сакате да креирате вработен" + +#. module: hr_recruitment +#: model:ir.actions.act_window,help:hr_recruitment.crm_case_categ0_act_job +msgid "" +"From this menu you can track applicants in the recruitment process and " +"manage all operations: meetings, interviews, phone calls, etc. If you setup " +"the email gateway, applicants and their attached CV are created " +"automatically when an email is sent to jobs@yourcompany.com. If you install " +"the document management modules, all documents (CV and motivation letters) " +"are indexed automatically, so that you can easily search through their " +"content." +msgstr "" +"Од оваа мени можете да ги следите апикантите во процесот на вработување и да " +"ги менаџирате сите операции: состаноци, интервјуа, телефонски разговори и " +"др. Доклоку подесите емаил портал, апликантите и нивните прикачени CV се " +"креираат автоматски кога се испрака емаил на jobs@yourcompany.com. Доклоку " +"инсталирете модули за менаџирање на документи, сите документи (CV и " +"мотивациони писма) автоматски ќе бидат означени, така што ќе можете лесно да " +"пребарувате по нивната содржина." + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "History" +msgstr "Историја" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "Recruitment performed in current month" +msgstr "Вработување направоено во тековниот месец." + +#. module: hr_recruitment +#: model:ir.actions.act_window,help:hr_recruitment.hr_recruitment_stage_form_installer +msgid "" +"Check if the following stages are matching your recruitment process. Don't " +"forget to specify the department if your recruitment process is different " +"according to the job position." +msgstr "" +"Проверете дали следниве етапи се совпаѓаат со процесот на вработување. Не " +"заборавајте да го назначите одделението доколку процесот на вработување " +"варира во однос на работната позиција." + +#. module: hr_recruitment +#: field:hr.applicant,partner_address_id:0 +msgid "Partner Contact" +msgstr "Контакт партнер" + +#. module: hr_recruitment +#: model:hr.recruitment.stage,name:hr_recruitment.stage_job4 +msgid "Contract Proposed" +msgstr "Предложен договор" + +#. module: hr_recruitment +#: view:hr.applicant:0 field:hr.applicant,state:0 view:hr.recruitment.report:0 +#: field:hr.recruitment.report,state:0 +msgid "State" +msgstr "Земја" + +#. module: hr_recruitment +#: model:hr.recruitment.source,name:hr_recruitment.source_website_company +msgid "Company Website" +msgstr "Веб страна на компанијата" + +#. module: hr_recruitment +#: sql_constraint:hr.recruitment.degree:0 +msgid "The name of the Degree of Recruitment must be unique!" +msgstr "" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 field:hr.recruitment.report,year:0 +msgid "Year" +msgstr "Година" + +#. module: hr_recruitment +#: view:hired.employee:0 view:hr.recruitment.job2phonecall:0 +#: view:hr.recruitment.partner.create:0 +msgid "Cancel" +msgstr "Откажи" + +#. module: hr_recruitment +#: model:ir.actions.act_window,name:hr_recruitment.hr_job_categ_action +msgid "Applicant Categories" +msgstr "" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,state:0 +msgid "Open" +msgstr "" + +#. module: hr_recruitment +#: code:addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py:57 +#, python-format +msgid "A partner is already existing with the same name." +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Subject / Applicant" +msgstr "" + +#. module: hr_recruitment +#: help:hr.recruitment.degree,sequence:0 +msgid "Gives the sequence order when displaying a list of degrees." +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 field:hr.applicant,user_id:0 +#: view:hr.recruitment.report:0 +msgid "Responsible" +msgstr "" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +#: model:ir.actions.act_window,name:hr_recruitment.action_hr_recruitment_report_all +#: model:ir.ui.menu,name:hr_recruitment.menu_hr_recruitment_report_all +msgid "Recruitment Analysis" +msgstr "" + +#. module: hr_recruitment +#: view:hired.employee:0 +msgid "Create New Employee" +msgstr "" + +#. module: hr_recruitment +#: model:hr.recruitment.source,name:hr_recruitment.source_linkedin +msgid "LinkedIn" +msgstr "" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,month:0 +msgid "October" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Cases By Stage and Estimates" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Reply" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Interview" +msgstr "" + +#. module: hr_recruitment +#: field:hr.recruitment.source,name:0 +msgid "Source Name" +msgstr "" + +#. module: hr_recruitment +#: field:hr.applicant,description:0 +msgid "Description" +msgstr "" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,month:0 +msgid "May" +msgstr "" + +#. module: hr_recruitment +#: model:hr.recruitment.stage,name:hr_recruitment.stage_job5 +msgid "Contract Signed" +msgstr "" + +#. module: hr_recruitment +#: model:hr.recruitment.source,name:hr_recruitment.source_word +msgid "Word of Mouth" +msgstr "" + +#. module: hr_recruitment +#: selection:hr.applicant,state:0 selection:hr.recruitment.report,state:0 +#: model:hr.recruitment.stage,name:hr_recruitment.stage_job6 +msgid "Refused" +msgstr "" + +#. module: hr_recruitment +#: code:addons/hr_recruitment/hr_recruitment.py:414 +#, python-format +msgid "Applicant '%s' is being hired." +msgstr "" + +#. module: hr_recruitment +#: selection:hr.applicant,state:0 view:hr.recruitment.report:0 +#: selection:hr.recruitment.report,state:0 +msgid "Hired" +msgstr "" + +#. module: hr_recruitment +#: selection:hr.applicant,priority:0 +#: selection:hr.recruitment.report,priority:0 +msgid "On Average" +msgstr "" + +#. module: hr_recruitment +#: model:ir.model,name:hr_recruitment.model_hr_recruitment_degree +msgid "Degree of Recruitment" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Open Jobs" +msgstr "" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,month:0 +msgid "February" +msgstr "" + +#. module: hr_recruitment +#: field:hr.applicant,name:0 field:hr.recruitment.degree,name:0 +#: field:hr.recruitment.stage,name:0 +msgid "Name" +msgstr "" + +#. module: hr_recruitment +#: view:hr.applicant:0 +msgid "Edit" +msgstr "" + +#. module: hr_recruitment +#: model:hr.recruitment.stage,name:hr_recruitment.stage_job3 +msgid "Second Interview" +msgstr "" + +#. module: hr_recruitment +#: model:ir.model,name:hr_recruitment.model_hr_recruitment_partner_create +msgid "Create Partner from job application" +msgstr "" + +#. module: hr_recruitment +#: selection:hr.recruitment.report,month:0 +msgid "April" +msgstr "" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "Pending recruitment" +msgstr "" + +#. module: hr_recruitment +#: model:hr.recruitment.source,name:hr_recruitment.source_monster +msgid "Monster" +msgstr "" + +#. module: hr_recruitment +#: model:ir.ui.menu,name:hr_recruitment.menu_hr_job +msgid "Job Positions" +msgstr "" + +#. module: hr_recruitment +#: view:hr.recruitment.report:0 +msgid "In progress recruitment" +msgstr "" + +#. module: hr_recruitment +#: sql_constraint:hr.job:0 +msgid "The name of the job position must be unique per company!" +msgstr "" + +#. module: hr_recruitment +#: field:hr.recruitment.degree,sequence:0 +#: field:hr.recruitment.stage,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: hr_recruitment +#: model:hr.recruitment.degree,name:hr_recruitment.degree_bachelor +msgid "Bachelor Degree" +msgstr "" + +#. module: hr_recruitment +#: field:hr.recruitment.job2phonecall,user_id:0 +msgid "Assign To" +msgstr "" + +#. module: hr_recruitment +#: code:addons/hr_recruitment/hr_recruitment.py:407 +#, python-format +msgid "The job request '%s' has been set 'in progress'." +msgstr "" + +#. module: hr_recruitment +#: help:hr.applicant,salary_proposed_extra:0 +msgid "Salary Proposed by the Organisation, extra advantages" +msgstr "" + +#. module: hr_recruitment +#: help:hr.recruitment.report,delay_close:0 +#: help:hr.recruitment.report,delay_open:0 +msgid "Number of Days to close the project issue" +msgstr "" + +#. module: hr_recruitment +#: field:hr.applicant,survey:0 +msgid "Survey" +msgstr ""