[MERGE] sync with trunk

bzr revid: mat@openerp.com-20130911094257-yu17yffdawc45v2a
This commit is contained in:
Martin Trigaux 2013-09-11 09:42:57 +00:00
commit 1f30f78fab
123 changed files with 13381 additions and 3478 deletions

View File

@ -37,7 +37,6 @@ There are two types of views:
.. note:: Since OpenERP 4.1, form views can also contain graphs.
Form views
----------
@ -388,6 +387,33 @@ The easiest method to compute real statistics on objects is:
You can get en example in all modules of the form: report\_.... Example: report_crm.
Controlling view actions
------------------------
When defining a view, the following attributes can be added on the
opening element of the view (i.e. ``<form>``, ``<tree>``...)
``create``
set to ``false`` to hide the link / button which allows to create a new
record.
``delete``
set to ``false`` to hide the link / button which allows to remove a
record.
``edit``
set to ``false`` to hide the link / button which allows to
edit a record.
These attributes are available on form, tree, kanban and gantt
views. They are normally automatically set from the access rights of
the users, but can be forced globally in the view definition. A
possible use case for these attributes is to define an inner tree view
for a one2many relation inside a form view, in which the user cannot
add or remove related records, but only edit the existing ones (which
are presumably created through another way, such as a wizard).
Calendar Views
--------------
@ -680,6 +706,7 @@ toolbar
its descendants will be displayed in the main tree. The value is ignored
for flat lists.
Grouping Elements
+++++++++++++++++
@ -1351,12 +1378,22 @@ When you add a one2many field in a form view, you do something like this :
If you want to specify the views to use, you can add a *context* attribute, and
specify a view id for each type of view supported, exactly like the action's
*view_id* attribute:
*view_id* attribute, except that the provided view id must always be
fully-qualified with the module name, even if it belongs to the same module:
.. code-block:: xml
<field name="order_line" colspan="4" nolabel="1"
context="{'form_view_ref' : 'module.view_id', 'tree_view_ref' : 'model.view_id'}"/>
context="{'form_view_ref': 'module.view_id',
'tree_view_ref': 'module.view_id'}"/>
.. note::
You *have to* put the module name in the view_id, because this
is evaluated when the view is displayed, and not when the XML file
is parsed, so the module name information is not available. Failing
to do so will result in the default view being selected (see
below).
If you don't specify the views, OpenERP will choose one in this order :

View File

@ -6,6 +6,16 @@ Changelog
`trunk`
-------
- Improved ``html_email_clean`` in tools: better quote and signature finding,
added shortening.
- Cleaned and slightly refactored ``ir.actions.server``. The ``loop``, ``sms``
and ``dummy`` server actions have been removed; ``object_create`` and
``object_copy`` have been merged into ``object_create``; ``other`` is now ``multi``
and raises in case of loops. See :ref:`ir-actions-server` for more details.
- Removed ``sms_send`` method.
- Added checking of recursions in many2many loops using ``_check_m2m_recursion``.
- Added MONTHS attribute on fields.date and fields.datetime, holding the list
(month_number, month_name)
- Almost removed ``LocalService()``. For reports,
``openerp.osv.orm.Model.print_report()`` can be used. For workflows, see
:ref:`orm-workflows`.
@ -21,5 +31,15 @@ Changelog
``openerp.exceptions.RedirectWarning``.
- Give a pair of new methods to ``res.config.settings`` and a helper to make
them easier to use: ``get_config_warning()``.
- Path to webkit report files (field ``report_file``) must be writen with the
Unix way (with ``/`` and not ``\``)
- Path to webkit report files (field ``report_file``) must be written the
Unix way (with ``/`` and not ``\``)
`7.0`
-----
- Modules may now include an ``i18n_extra`` directory that will be treated like the
default ``i18n`` directory. This is typically useful for manual translation files
that are not managed by Launchpad's translation system. An example is l10n modules
that depend on ``l10n_multilang``.

View File

@ -14,11 +14,13 @@ OpenERP Server
02_architecture
03_module_dev
04_security
workflows
05_test_framework
06_misc
deployment-gunicorn
deployment-mod-wsgi
form-view-guidelines
ir_actions
OpenERP Command
'''''''''''''''

48
doc/ir_actions.rst Normal file
View File

@ -0,0 +1,48 @@
.. _ir-actions:
Ir Actions
===========
.. _ir-actions-server:
Server actions
++++++++++++++
.. versionchanged:: 8.0
.. currentmodule:: openerp.addons.base.ir.ir_actions
.. autoclass:: actions_server
:noindex:
Adding a new sever action
-------------------------
The ``state`` field holds the various available types of server action. In order
to add a new server action, the first thing to do is to override the ``_get_states``
method that returns the list of values available for the selection field.
.. automethod:: actions_server._get_states
:noindex:
The method called when executing the server action is the ``run`` method. This
method calls ``run_action_<STATE>``. When adding a new server action type, you
have to define the related method that will be called upon execution.
.. automethod:: actions_server.run
:noindex:
Changelog
---------
`8.0`
'''''
The refactoring of OpenERP 8.0 server actions removed the following types of
server action:
- ``loop``: can be replaced by a ``code`` action
- ``dummy``: can be replaced by a void ``code`` action
- ``object_create`` and ``object_copy`` have been merged into a single and
more understandable ``object_create`` action
- ``other`` is renamed ``multi`` and raises in case of loops

306
doc/workflows.rst Normal file
View File

@ -0,0 +1,306 @@
.. _workflows:
Workflows
=========
In OpenERP, a workflow is a technical artefact to manage a set of "things to do"
associated to the records of some data model. The workflow provides a higher-
level way to organize the things to do on a record.
More specifically, a workflow is a directed graph where the nodes are called
"activities" and the arcs are called "transitions".
- Activities define work that should be done within the OpenERP server, such as
changing the state of some records, or sending emails.
- Transitions control how the workflow progresses from activity to activity.
In the definition of a workflow, one can attach conditions, signals, and
triggers to transitions, so that the behavior of the workflow depends on user
actions (such as clicking on a button), changes to records, or arbitrary Python
code.
Basics
------
Defining a workflow with data files is straightforward: a record "workflow" is
given together with records for the activities and the transitions. For
instance, here is a simple sequence of two activities defined in XML::
<record id="test_workflow" model="workflow">
<field name="name">test.workflow</field>
<field name="osv">test.workflow.model</field>
<field name="on_create">True</field>
</record>
<record id="activity_a" model="workflow.activity">
<field name="wkf_id" ref="test_workflow"/>
<field name="flow_start">True</field>
<field name="name">a</field>
<field name="kind">function</field>
<field name="action">print_a()</field>
</record>
<record id="activity_b" model="workflow.activity">
<field name="wkf_id" ref="test_workflow"/>
<field name="flow_stop">True</field>
<field name="name">b</field>
<field name="kind">function</field>
<field name="action">print_b()</field>
</record>
<record id="trans_a_b" model="workflow.transition">
<field name="act_from" ref="activity_a"/>
<field name="act_to" ref="activity_b"/>
</record>
A worfklow is always defined with respect to a particular model (the model is
given by the attribute ``osv`` on the model ``workflow``). Methods specified in
the activities or transitions will be called on that model.
In the example code above, a workflow called "test_workflow" is created. It is
made up of two activies, named "a" and "b", and one transition, going from "a"
to "b".
The first activity has its attribute ``flow_start`` set to ``True`` so that
OpenERP knows where to start the workflow traversal after it is instanciated.
Because ``on_create`` is set to True on the workflow record, the workflow is
instanciated for each newly created record. (Otherwise, the workflow should be
instanciated by other means, such as from some module Python code.)
When the workflow is instanciated, it begins with activity "a". That activity
is of kind ``function``, which means that the action ``print_a()`` is a method
call on the model ``test.workflow`` (the usual ``cr, uid, ids, context``
arguments are passed for you).
The transition between "a" and "b" does not specify any condition. This means
that the workflow instance immediately goes from "a" to "b" after "a" has been
processed, and thus also processes activity "b".
Transitions
-----------
Transitions provide the control structures to orchestrate a workflow. When an
activity is completed, the workflow engine tries to get across transitions
departing from the completed activity, towards the next activities. In their
simplest form (as in the example above), they link activities sequentially:
activities are processed as soon as the activities preceding them are completed.
Instead of running all activities in one fell swoop, it is also possible to wait
on transitions, going through them only when some criteria are met. The criteria
are the conditions, the signals, and the triggers. They are detailed in the
following sections.
Conditions
''''''''''
When an activity has been completed, its outgoing transitions are inspected to
determine whether it is possible for the workflow instance to proceed through
them and reach the next activities. When only a condition is defined (i.e., no
signal or trigger is defined), the condition is evaluated by OpenERP, and if it
evaluates to ``True``, the worklfow instance progresses through the transition.
If the condition is not met, it will be reevaluated every time the associated
record is modified, or by an explicit method call to do it.
By default, the attribute ``condition`` (i.e., the expression to be evaluated)
is just "True", which trivially evaluates to ``True``. Note that the condition
may be several lines long; in that case, the value of the last one determines
whether the transition can be taken.
In the condition evaluation environment, several symbols are conveniently
defined (in addition to the OpenERP ``safe_eval`` environment):
- all the model column names, and
- all the browse record's attributes.
Signals
'''''''
In addition to a condition, a transition can specify a signal name. When such
a signal name is present, the transition is not taken directly, even if the
condition evaluates to ``True``. Instead the transition blocks, waiting to be
woken up.
In order to wake up a transition with a defined signal name, the signal must be
sent to the workflow instance. A common way to send a signal is to use a button
in the user interface, using the element ``<button/>`` with the signal name as
the attribute ``name`` of the button. Once the button is clicked, the signal is
sent to the workflow instance of the current record.
.. note:: The condition is still evaluated when the signal is sent to the
workflow instance.
Triggers
''''''''
With conditions that evaluate to ``False``, transitions are not taken (and thus
the activity it leads to is not processed immediately). Still, the workflow
instance can get new chances to progress across that transition by providing
so-called triggers. The idea is that when the condition is not satisfied,
triggers are recorded in database. Later, it is possible to wake up
specifically the workflow instances that installed those triggers, offering
them to reevaluate their transition conditions. This mechanism makes it cheaper
to wake up workflow instances by targetting just a few of them (those that have
installed the triggers) instead of all of them.
Triggers are recorded in database as record IDs (together with the model name)
and refer to the workflow instance waiting for those records. The transition
definition provides a model name (attribute ``trigger_model``) and a Python
expression (attribute ``trigger_expression``) that evaluates to a list of record
IDs in the given model. Any of those records can wake up the workflow instance
they are associated with.
.. note:: Note that triggers are not re-installed whenever the transition is
re-tried.
Splitting and joining transitions
'''''''''''''''''''''''''''''''''
When multiple transitions leave the same activity, or lead to the same activity,
OpenERP provides some control over which transitions are actually taken, or how
the reached activity will be processed. The attributes ``split_mode`` and
``join_mode`` on the activity are used for such control. The possible values of
those attributes are explained below.
Activities
----------
While the transitions can be seen as the control structures of the workflows,
activities are the places where everything happens, from changing record states
to sending email.
Different kinds of activities exist: ``Dummy``, ``Function``, ``Subflow``, and
``Stop all``, each doing different things when the activity is processed. In
addition to their kind, activies have other properties, detailed in the next
sections.
Flow start and flow stop
''''''''''''''''''''''''
The attribute ``flow_start`` is a boolean value specifying whether the activity
is processed when the workflow is instanciated. Multiple activities can have
their attribute ``flow_start`` set to ``True``. When instanciating a workflow
for a record, OpenERP simply processes all of them, and evaluate all their
outgoing transitions afterwards.
The attribute ``flow_stop`` is a boolean value specifying whether the activity
stops the workflow instance. A workflow instance is considered completed when
all its activities with the attribute ``flow_stop`` set to ``True`` are
completed.
It is important for OpenERP to know when a workflow instance is completed. A
workflow can have an activity that is actually another workflow (called a
subflow); that activity is completed when the subflow is completed.
Subflow
'''''''
An activity can embed a complete workflow, called a subflow (the embedding
workflow is called the parent workflow). The workflow to instanciate is
specified by attribute ``subflow_id``.
.. note:: In the GUI, that attribute can not be set unless the kind of the
activity is ``Subflow``.
The activity is considered completed (and its outgoing transitions ready to be
evaluated) when the subflow is completed (see attribute ``flow_stop`` above).
Sending a signal from a subflow
'''''''''''''''''''''''''''''''
When a workflow is embedded in an activity (as a subflow) of a workflow, the
sublow can send a signal from its own activities to the parent workflow by
giving a signal name in the attribute ``signal_send``. OpenERP processes those
activities by sending the value of ``signal_send`` prefixed by "subflow." to
the parent workflow instance.
In other words, it is possible to react and get transitions in the parent
workflow as activities are executed in the sublow.
Server actions
''''''''''''''
An activity can run a "Server Action" by specifying its ID in the attribute
``action_id``.
Python action
'''''''''''''
An activity can execute some Python code, given by the attribute ``action``.
The evaluation environment is the same as the one explained in the section
`Conditions`_.
Split mode
''''''''''
After an activity has been processed, its outgoing transitions are evaluated.
Normally, if a transition can be taken, OpenERP traverses it and proceed to the
activity the transition leads to.
Actually, when more than a single transition is leaving an activity, OpenERP may
proceed or not, depending on the other transitions. That is, the conditions on
the transitions can be combined together, and the combined result instructs
OpenERP to traverse zero, one, or all the transitions. The way they are combined
is controlled by the attribute ``split_mode``.
There are three possible split modes: ``XOR``, ``OR`` and ``AND``.
``XOR``
When the transitions are combined with a ``XOR`` split mode, as soon as a
transition has a satisfied condition, the transition is traversed and the
others are skipped.
``OR``
With the ``OR`` mode, all the transitions with a satisfied condition are
traversed. The remaining transitions will not be evaluated later.
``AND``
With the ``AND`` mode, OpenERP will wait for all outgoing transition
conditions to be satisfied, then traverse all of them at once.
Join mode
'''''''''
Just like outgoing transition conditions can be combined together to decide
whether they can be traversed or not, incoming transitions can be combined
together to decide if and when an activity may be processed. The attribute
``join_mode`` controls that behavior.
There are two possible join modes: ``XOR`` and ``AND``.
``XOR``
With the ``XOR`` mode, an incoming transition with a satisfied condition is
traversed immediately, and enables the processing of the activity.
``AND``
With the ``AND`` mode, OpenERP will wait until all incoming transitions have
been traversed before enabling the processing of the activity.
Kinds
'''''
Activities can be of different kinds: ``dummy``, ``function``, ``subflow``, or
``stopall``. The kind defines what type of work an activity can do.
Dummy
The ``dummy`` kind is for activities that do nothing, or for activities that
only call a server action. Activities that do nothing can be used as hubs to
gather/dispatch transitions.
Function
The ``function`` kind is for activities that only need to run some Python
code, and possibly a server action.
Stop all
The ``stopall`` kind is for activities that will completely stop the
workflow instance and mark it as completed. In addition they can also run
some Python code.
Subflow
When the kind of the activity is ``subflow``, the activity embeds another
workflow instance. When the subflow is completed, the activity is also
considered completed.
By default, the subflow is instanciated for the same record as the parent
workflow. It is possible to change that behavior by providing Python code
that returns a record ID (of the same data model as the subflow). The
embedded subflow instance is then the one of the given record.

View File

@ -940,18 +940,6 @@
<field name="rate">18.89</field>
</record>
<record id="EEK" model="res.currency">
<field name="name">EEK</field>
<field name="symbol">kr</field>
<field name="rounding">0.01</field>
<field name="accuracy">4</field>
</record>
<record id="rateEEK" model="res.currency.rate">
<field name="currency_id" ref="EEK" />
<field eval="time.strftime('%Y-01-01')" name="name"/>
<field name="rate">14.41</field>
</record>
<record id="ETB" model="res.currency">
<field name="name">ETB</field>
<field name="symbol">Br</field>

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:32+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:15+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:33+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:15+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:33+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:16+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:33+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:16+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -58,7 +58,7 @@ msgstr ""
#: field:ir.ui.view,arch:0
#: field:ir.ui.view.custom,arch:0
msgid "View Architecture"
msgstr "عرض المنصة (الهيكلة)"
msgstr "عرض الهيكلية"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
@ -91,7 +91,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr ""
msgstr "واجهة شاشة اللمس للمتاجر"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:34+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:17+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -1098,7 +1098,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_fleet
msgid "Fleet Management"
msgstr ""
msgstr "Автопарк"
#. module: base
#: help:ir.server.object.lines,value:0
@ -8854,6 +8854,8 @@ msgid ""
"* Show all costs associated to a vehicle or to a type of service\n"
"* Analysis graph for costs\n"
msgstr ""
"\n"
"Превозни средства, лизинг, застраховки, разходи\n"
#. module: base
#: field:multi_company.default,company_dest_id:0

File diff suppressed because it is too large Load Diff

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:34+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:17+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:34+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:17+0000\n"
"X-Generator: Launchpad (build 16760)\n"
"X-Poedit-Language: Czech\n"
#. module: base
@ -173,7 +173,7 @@ msgstr ""
#. module: base
#: field:res.partner,ref:0
msgid "Reference"
msgstr "Odkaz"
msgstr "Značka"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_be_invoice_bba
@ -419,13 +419,12 @@ msgid ""
"line.\n"
msgstr ""
"\n"
"Umožňuje vám přidat metody dopravy do potvrzení objednávek a vyzvednutí.\n"
"Umožňuje vám přidat metody dopravy zakázek a dodávek.\n"
"==============================================================\n"
"\n"
"Můžete nadefinovat vlastní přepravce a tarifní pásma přepravy. Když "
"vytváříte \n"
"faktury z vyzvednutí, OpenERP je schopno přidat a spočítat řádek s "
"dopravou.\n"
"faktury z dodávek, OpenERP je schopno přidat a spočítat řádek s dopravou.\n"
#. module: base
#: code:addons/base/ir/ir_filters.py:80
@ -733,7 +732,7 @@ msgstr "Kolumbie"
#. module: base
#: model:res.partner.title,name:base.res_partner_title_mister
msgid "Mister"
msgstr "mistr"
msgstr "pan"
#. module: base
#: help:res.country,code:0
@ -1109,7 +1108,7 @@ msgstr "Sdílená úložiště (WebDAV)"
#. module: base
#: view:res.users:0
msgid "Email Preferences"
msgstr "Předvolby Emailu"
msgstr "Předvolby emailu"
#. module: base
#: code:addons/base/ir/ir_fields.py:195
@ -2446,8 +2445,7 @@ msgstr ""
"\n"
"Můžete si zvolit flexibilní fakturační metody:\n"
"\n"
"* *Na vyžádání*: Faktury jsou vytvářeny manuálně z potvrzení objednávek "
"podle potřeby\n"
"* *Na vyžádání*: Faktury jsou vytvářeny manuálně ze zakázek podle potřeby\n"
"* *Při dodání*: Faktury jsou vytvářeny při vyzvednutí (dodání)\n"
"* *Před dodáním*: Je vytvořena proforma faktura, která musí být uhrazena "
"před dodáním\n"
@ -2514,7 +2512,7 @@ msgid ""
"and sales orders."
msgstr ""
"Zobrazit tento bankovní učet v patičce tištěných dokumentů jako jsou faktury "
"a potvrzení objednávek."
"a zakázky."
#. module: base
#: selection:base.language.install,lang:0
@ -2963,11 +2961,11 @@ msgid ""
" "
msgstr ""
"\n"
"Základní modul pro správu analytické distribuce a potvrzení objednávek.\n"
"Základní modul pro správu analytické distribuce a zakázek.\n"
"=================================================================\n"
"\n"
"Při použití tohoto modulu bude schopni propojit analytické účty s "
"potvrzeními objednávek.\n"
"Při použití tohoto modulu bude schopni propojit analytické účty se "
"zakázkami.\n"
" "
#. module: base
@ -3092,11 +3090,11 @@ msgstr ""
"==================================\n"
"\n"
"Tato aplikace vám umožňuje efektivně spravovat prodejní cíle sledováním "
"všech potvrzení objednávek a historie.\n"
"všech zakázek a historie.\n"
"\n"
"Aplikace spravuje ceý postup prodejte:\n"
"Aplikace spravuje celý postup prodejte:\n"
"\n"
"* **Nabídka** -> **Potvrzení objednávky** -> **Faktura**\n"
"* **Nabídka** -> **Zakázka** -> **Faktura**\n"
"\n"
"Předvolby (pouze s nainstalovaným skladovým hospodářstvím)\n"
"------------------------------------------------------\n"
@ -3110,14 +3108,13 @@ msgstr ""
"\n"
"Můžete si zvolit flexibilní fakturační metody:\n"
"\n"
"* *Na vyžádání*: Faktury jsou vytvářeny manuálně z potvrzení objednávek "
"podle potřeby\n"
"* *Na vyžádání*: Faktury jsou vytvářeny manuálně ze zakázek podle potřeby\n"
"* *Při dodání*: Faktury jsou vytvářeny při vyzvednutí (dodání)\n"
"* *Před dodáním*: Je vytvořena proforma faktura, která musí být uhrazena "
"před dodáním\n"
"\n"
"\n"
"Dashboard pro manažera prodejů zahrnuje\n"
"Přehled pro vedoucího odbytu zahrnuje\n"
"------------------------------------------------\n"
"* Moje nabídky\n"
"* Měsíční obrat (graf)\n"
@ -4900,7 +4897,7 @@ msgstr "Objednávka obědů, stravování, potraviny"
#: field:ir.model.fields,required:0
#: field:res.partner.bank.type.field,required:0
msgid "Required"
msgstr "Požadováno"
msgstr "Povinné"
#. module: base
#: model:res.country,name:base.ro
@ -5200,10 +5197,10 @@ msgid ""
" * Effective Date\n"
msgstr ""
"\n"
"Přidejte dodatečná data do potvrzení objednávky.\n"
"Přidejte dodatečná data do zakázky\n"
"===================================================\n"
"\n"
"Do potvrzení objednávky můžete přidat následující dodatečná data:\n"
"Do zakázky můžete přidat následující dodatečná data:\n"
"------------------------------------------------------------\n"
" * Datum požadavku\n"
" * Datum závazku\n"
@ -7073,7 +7070,7 @@ msgid ""
" "
msgstr ""
"\n"
"Tento modul přidává pole 'Marže' k potvrzení objednávek.\n"
"Tento modul přidává pole 'Marže' k zakázkám.\n"
"=============================================\n"
"\n"
"Díky tomu lze zjistit ziskovost spočtením rozdílu mezi cenou položky\n"
@ -7937,7 +7934,7 @@ msgstr "Zleva doprava"
#: view:res.lang:0
#: field:res.lang,translatable:0
msgid "Translatable"
msgstr "Přeložitelný"
msgstr "Přeložitelné"
#. module: base
#: help:base.language.import,code:0
@ -10058,7 +10055,7 @@ msgstr ""
"\n"
"Dle našich záznamů nebyly některé vaše platby stále uhrazeny. Podrobnosti "
"jsou níže.\n"
"Pokud jste platby již uhradily, považujte tuto zprávu za bezpředmětnou. V "
"Pokud jste platby již uhradili, považujte tuto zprávu za bezpředmětnou. V "
"opačném případě vás žádáme o uhrazení částek uvedených níže.\n"
"V případě jakýchkoli dotazů nás neváhejte kontaktovat..\n"
"\n"
@ -12856,7 +12853,7 @@ msgstr "Druh sestavy"
#: view:res.partner.bank:0
#: view:res.users:0
msgid "State"
msgstr "Stav"
msgstr "Stát"
#. module: base
#: selection:base.language.install,lang:0
@ -13274,7 +13271,7 @@ msgstr "Uživatel průvodce změnou hesla"
#. module: base
#: model:res.groups,name:base.group_no_one
msgid "Technical Features"
msgstr "Technické rysy"
msgstr "Technická nastavení"
#. module: base
#: model:ir.module.module,description:base.module_l10n_ve
@ -14120,7 +14117,7 @@ msgstr "Závislosti :"
#. module: base
#: field:res.company,vat:0
msgid "Tax ID"
msgstr "ID daně"
msgstr "DIČ"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_bank_statement_extensions
@ -14738,7 +14735,7 @@ msgstr ""
#: field:ir.actions.server,trigger_obj_id:0
#: field:ir.model.fields,relation_field:0
msgid "Relation Field"
msgstr "?!?Související pole"
msgstr "Pole relace"
#. module: base
#: model:ir.module.module,description:base.module_portal_project
@ -15032,7 +15029,7 @@ msgstr ""
#. module: base
#: field:ir.model.fields,relation:0
msgid "Object Relation"
msgstr "Vztah objektu"
msgstr "Relace objektu"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_voucher

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:34+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:17+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -64,12 +64,12 @@ msgstr "Vis arkitektur"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
msgstr ""
msgstr "Tilbud, Salgs ordre, Følgeseddel og Faktura kontrol"
#. module: base
#: selection:ir.sequence,implementation:0
msgid "No gap"
msgstr ""
msgstr "Ingen forskel"
#. module: base
#: selection:base.language.install,lang:0
@ -98,7 +98,7 @@ msgstr "Touchscreen-grænseflade for butikker"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
msgid "Indian Payroll"
msgstr ""
msgstr "Indisk Løn"
#. module: base
#: help:ir.cron,model:0
@ -166,6 +166,9 @@ msgid ""
"specified as a Python expression defining a list of triplets. For example: "
"[('color','=','red')]"
msgstr ""
"Valgfrit domæne til at begrænse mulige værdier for forholdsfelter, angivet "
"som et Python-udtryk definerer en liste af trillinger. For eksempel: "
"[('color', '=', 'red')]"
#. module: base
#: field:res.partner,ref:0
@ -175,7 +178,7 @@ msgstr "Reference"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_be_invoice_bba
msgid "Belgium - Structured Communication"
msgstr ""
msgstr "Belgisk struktureret kommunikation"
#. module: base
#: field:ir.actions.act_window,target:0

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:36+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:19+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -8452,15 +8452,15 @@ msgstr ""
"\n"
"Jeder Mitarbeiter kann seine aufgewendete Zeit für verschiedene Projekte "
"kodieren und verfolgen.\n"
"Ein Projekt ist eine analytische Rechnung und die Zeit, die jemand an diesem "
"Projekt verbracht hat,\n"
"verursacht Kosten auf dem entsprechenden Konto. \n"
"Ein Projekt wird automatisch zur Kostenstelle. Die Zeit, die jemand an "
"diesem Projekt verbracht hat,\n"
"verursacht dementsprechend Kosten auf dieser Projektkostenstelle. \n"
"\n"
"Viele Berichterstattungen über die Verfolgung von Zeit und Mitarbeiter "
"werden bereitgestellt.\n"
"Es ist vollständig in die Kostenrechnung integriert. Es ermöglicht Ihnen die "
"Einrichtung einer \n"
"Betriebsführung nach Angelegenheit.\n"
"Das Modul bietet außerdem Auswertungen zur Rückverfolgung der Mitarbeiter "
"Arbeitszeit in Projekten.\n"
"Es ist dadurch vollständig in die OpenERP Kostenrechnung integriert und "
"ermöglicht dem Management \n"
"ein effizientes Projektcontrolling.\n"
" "
#. module: base
@ -14211,7 +14211,7 @@ msgstr "Berichtsart"
#: view:res.partner.bank:0
#: view:res.users:0
msgid "State"
msgstr "Status"
msgstr "Bundesland"
#. module: base
#: selection:base.language.install,lang:0

View File

@ -12,8 +12,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:36+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:19+0000\n"
"X-Generator: Launchpad (build 16760)\n"
"X-Poedit-Country: GREECE\n"
"X-Poedit-Language: Greek\n"
"X-Poedit-SourceCharset: utf-8\n"

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:44+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:26+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -25,6 +25,10 @@ msgid ""
"================================================\n"
" "
msgstr ""
"\n"
"Module for the Check Writing and Check Printing.\n"
"================================================\n"
" "
#. module: base
#: model:res.country,name:base.sh
@ -60,7 +64,7 @@ msgstr "View Architecture"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
msgstr ""
msgstr "Quotation, Sale Orders, Delivery & Invoicing Control"
#. module: base
#: selection:ir.sequence,implementation:0
@ -89,12 +93,12 @@ msgstr ""
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr ""
msgstr "Touchscreen Interface for Shops"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
msgid "Indian Payroll"
msgstr ""
msgstr "Indian Payroll"
#. module: base
#: help:ir.cron,model:0
@ -138,7 +142,7 @@ msgstr ""
#. module: base
#: field:ir.actions.client,params:0
msgid "Supplementary arguments"
msgstr ""
msgstr "Supplementary arguments"
#. module: base
#: model:ir.module.module,description:base.module_google_base_account
@ -147,11 +151,14 @@ msgid ""
"The module adds google user in res user.\n"
"========================================\n"
msgstr ""
"\n"
"The module adds google user in res user.\n"
"========================================\n"
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
msgstr ""
msgstr "Check this box if this contact is an Employee."
#. module: base
#: help:ir.model.fields,domain:0
@ -182,7 +189,7 @@ msgstr "Target Window"
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main Report File Path"
msgstr ""
msgstr "Main Report File Path"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
@ -203,6 +210,16 @@ msgid ""
"revenue\n"
"reports."
msgstr ""
"\n"
"Generate your Invoices from Expenses, Timesheet Entries.\n"
"========================================================\n"
"\n"
"Module to generate invoices based on costs (human resources, expenses, "
"...).\n"
"\n"
"You can define price lists in analytic account, make some theoretical "
"revenue\n"
"reports."
#. module: base
#: code:addons/base/ir/ir_sequence.py:134
@ -253,7 +270,7 @@ msgstr "created."
#. module: base
#: field:ir.actions.report.xml,report_xsl:0
msgid "XSL Path"
msgstr ""
msgstr "XSL Path"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_tr
@ -279,7 +296,7 @@ msgstr "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
#. module: base
#: model:res.groups,name:base.group_multi_currency
msgid "Multi Currencies"
msgstr ""
msgstr "Multi Currencies"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@ -291,6 +308,12 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"Chilean accounting chart and tax localisation.\n"
"==============================================\n"
"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n"
"\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
@ -402,6 +425,8 @@ msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
#. module: base
#: code:addons/orm.py:2649
@ -499,12 +524,12 @@ msgstr ""
#. module: base
#: field:ir.model.relation,name:0
msgid "Relation Name"
msgstr ""
msgstr "Relation Name"
#. module: base
#: view:ir.rule:0
msgid "Create Access Right"
msgstr ""
msgstr "Create Access Right"
#. module: base
#: model:res.country,name:base.tv
@ -544,7 +569,7 @@ msgstr ""
#. module: base
#: view:workflow.transition:0
msgid "Workflow Transition"
msgstr ""
msgstr "Workflow Transition"
#. module: base
#: model:res.country,name:base.gf
@ -554,7 +579,7 @@ msgstr "French Guyana"
#. module: base
#: model:ir.module.module,summary:base.module_hr
msgid "Jobs, Departments, Employees Details"
msgstr ""
msgstr "Jobs, Departments, Employees Details"
#. module: base
#: model:ir.module.module,description:base.module_analytic
@ -594,7 +619,7 @@ msgid ""
"event registration\n"
msgstr ""
"\n"
"Organization and management of Events.\n"
"Organisation and management of Events.\n"
"======================================\n"
"\n"
"The event module allows you to efficiently organise events and all related "
@ -617,7 +642,7 @@ msgstr "Bosnian / bosanski jezik"
msgid ""
"If you check this, then the second time the user prints with same attachment "
"name, it returns the previous report."
msgstr "On checking this successive reports are generated from cache."
msgstr "With this checked, successive reports are retrieved from cache."
#. module: base
#: model:ir.module.module,description:base.module_mrp_byproduct
@ -775,6 +800,32 @@ msgid ""
"module named account_voucher.\n"
" "
msgstr ""
"\n"
"Accounting and Financial Management.\n"
"====================================\n"
"\n"
"Financial and accounting module which covers:\n"
"---------------------------------------------\n"
" * General Accounting\n"
" * Cost/Analytic accounting\n"
" * Third party accounting\n"
" * Taxes management\n"
" * Budgets\n"
" * Customer and Supplier Invoices\n"
" * Bank statements\n"
" * Reconciliation process by partner\n"
"\n"
"Creates a dashboard for accountants that includes:\n"
"--------------------------------------------------\n"
" * List of Customer Invoices to Approve\n"
" * Company Analysis\n"
" * Graph of Treasury\n"
"\n"
"Processes like maintaining the general ledger are done through the defined "
"financial Journals (entry move line or grouping is maintained through "
"journal) for a particular financial year.\n"
"For the preparation of vouchers there is a module named account_voucher.\n"
" "
#. module: base
#: view:ir.model:0
@ -802,13 +853,18 @@ msgid ""
"This module provides the Integration of the LinkedIn with OpenERP.\n"
" "
msgstr ""
"\n"
"OpenERP Web LinkedIn module.\n"
"============================\n"
"This module integrates LinkedIn with OpenERP.\n"
" "
#. module: base
#: help:ir.actions.act_window,src_model:0
msgid ""
"Optional model name of the objects on which this action should be visible"
msgstr ""
"Optional model name of the objects on which this action should be visible"
"Optional model name of the objects for which this action should be visible"
#. module: base
#: field:workflow.transition,trigger_expr_id:0
@ -823,7 +879,7 @@ msgstr "Jordan"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_hr
msgid "Croatia - RRIF 2012 COA"
msgstr ""
msgstr "Croatia - RRIF 2012 COA"
#. module: base
#: help:ir.cron,nextcall:0
@ -952,6 +1008,30 @@ msgid ""
"also possible in order to automatically create a meeting when a holiday "
"request is accepted by setting up a type of meeting in Leave Type.\n"
msgstr ""
"\n"
"Manage leaves and allocation requests\n"
"=====================================\n"
"\n"
"This application controls the holiday schedule of your company. It allows "
"employees to request holidays. Then, managers can review requests for "
"holidays and approve or reject them. This way, you can control the overall "
"holiday planning for the company or department.\n"
"\n"
"You can configure several kinds of leaves (sickness, holiday, paid days, "
"...) and quickly allocate leaves to an employee or department via allocation "
"requests. An employee can also make a request for more days off by making a "
"new Allocation. This will increase the total available days for that leave "
"type (if the request is accepted).\n"
"\n"
"You can keep track of leaves in different ways by the following reports: \n"
"\n"
"* Leaves Summary\n"
"* Leaves by Department\n"
"* Leaves Analysis\n"
"\n"
"Synchronisation with an internal agenda (Meetings of the CRM module) is also "
"possible. In order to automatically create a meeting when a holiday request "
"is accepted, set up the type of meeting in Leave Type.\n"
#. module: base
#: selection:base.language.install,lang:0
@ -1182,6 +1262,35 @@ msgid ""
"* Planned Revenue by Stage and User (graph)\n"
"* Opportunities by Stage (graph)\n"
msgstr ""
"\n"
"The generic OpenERP Customer Relationship Management\n"
"====================================================\n"
"\n"
"This application enables a group of people to intelligently and efficiently "
"manage leads, opportunities, meetings and phone calls.\n"
"\n"
"It manages key tasks such as communication, identification, prioritisation, "
"assignment, resolution and notification.\n"
"\n"
"OpenERP ensures that all cases are successfully tracked by users, customers "
"and suppliers. It can automatically send reminders, escalate the request, "
"trigger specific methods and many other actions based on your own enterprise "
"rules.\n"
"\n"
"The greatest thing about this system is that users don't need to do anything "
"special. The CRM module has an email gateway for the synchronisation "
"interface between mails and OpenERP. That way, users can just send emails to "
"the request tracker.\n"
"\n"
"OpenERP will take care of thanking them for their message, automatically "
"routing it to the appropriate staff and make sure all future correspondence "
"gets to the right place.\n"
"\n"
"\n"
"Dashboard for CRM will include:\n"
"-------------------------------\n"
"* Planned Revenue by Stage and User (graph)\n"
"* Opportunities by Stage (graph)\n"
#. module: base
#: selection:base.language.export,format:0
@ -1278,6 +1387,48 @@ msgid ""
"come with any additional paid permission for online use of 'private "
"modules'.\n"
msgstr ""
"\n"
"Base module for the Brazilian localisation\n"
"==========================================\n"
"\n"
"This module consists in:\n"
"\n"
" - Generic Brazilian chart of accounts\n"
" - Brazilian taxes such as:\n"
"\n"
" - IPI\n"
" - ICMS\n"
" - PIS\n"
" - COFINS\n"
" - ISS\n"
" - IR\n"
" - IRPJ\n"
" - CSLL\n"
"\n"
"The field tax_discount has also been added in the account.tax.template and \n"
"account.tax objects to allow the proper computation of some Brazilian VATs \n"
"such as ICMS. The chart of account creation wizard has been extended to \n"
"propagate those new data properly.\n"
"\n"
"It's important to note however that this module lack many implementations to "
"\n"
"use OpenERP properly in Brazil. Those implementations (such as the "
"electronic \n"
"fiscal Invoicing which is already operational) are brought by more than 15 \n"
"additional modules of the Brazilian Launchpad localisation project \n"
"https://launchpad.net/openerp.pt-br-localiz and their dependencies in the \n"
"extra addons branch. Those modules aim at not breaking with the remarkable \n"
"OpenERP modularity, this is why they are numerous but small. One of the \n"
"reasons for maintaining those modules apart is that Brazilian Localisation \n"
"leaders need commit rights agility to complete the localisation as companies "
"\n"
"fund the remaining legal requirements (such as soon fiscal ledgers, \n"
"accounting SPED, fiscal SPED and PAF ECF that are still missing as September "
"\n"
"2011). Those modules are also strictly licensed under AGPL V3 and today "
"don't \n"
"come with any additional paid permission for online use of 'private "
"modules'.\n"
#. module: base
#: code:addons/orm.py:406
@ -1286,8 +1437,8 @@ msgid ""
"Language with code \"%s\" is not defined in your system !\n"
"Define it through the Administration menu."
msgstr ""
"Language with code \"%s\" is not defined in your system !\n"
"Define it through the Administration menu."
"Language with code \"%s\" is not defined in your system!\n"
"Define it through the Settings menu."
#. module: base
#: model:res.country,name:base.gu
@ -1729,6 +1880,26 @@ msgid ""
"in their pockets, this module is essential.\n"
" "
msgstr ""
"\n"
"The base module to manage lunch.\n"
"================================\n"
"\n"
"Many companies order sandwiches, pizzas and more from regular suppliers for "
"their employees providing them with extra facilities. \n"
"\n"
"However lunch management within a company requires proper administration "
"especially when the number of employees or suppliers is large. \n"
"\n"
"The “Lunch Order” module has been developed to make this management easier "
"and also to offer employees more tools and better usability. \n"
"\n"
"In addition to full meal and supplier management, this module offers the "
"possibility to display warnings and provide quick order selection based on "
"employees' preferences.\n"
"\n"
"If you want to save your employees' time and the need to always have coins "
"in their pockets, this module is essential.\n"
" "
#. module: base
#: view:wizard.ir.model.menu.create:0
@ -2014,6 +2185,22 @@ msgid ""
"synchronization with other companies.\n"
" "
msgstr ""
"\n"
"This module adds generic sharing tools to your current OpenERP database.\n"
"========================================================================\n"
"\n"
"It specifically adds a 'share' button that is available in the Web client "
"to\n"
"share any kind of OpenERP data with colleagues, customers, friends.\n"
"\n"
"The system will work by creating new users and groups on the fly, and by\n"
"combining the appropriate access rights and ir.rules to ensure that the "
"shared\n"
"users only have access to the data that has been shared with them.\n"
"\n"
"This is extremely useful for collaborative work, knowledge sharing,\n"
"synchronisation with other companies.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_process
@ -2546,7 +2733,7 @@ msgid ""
msgstr ""
"\n"
" \n"
"Belgian localization for in/outgoing invoices (prereq to account_coda):\n"
"Belgian localisation for in/outgoing invoices (prereq to account_coda):\n"
"=========================================================================\n"
" - Rename 'reference' field labels to 'Communication'\n"
" - Add support for Belgian Structured Communication\n"
@ -2641,10 +2828,10 @@ msgstr ""
"Helpdesk Management.\n"
"====================\n"
"\n"
"Like records and processing of claims, Helpdesk and Support are good tools\n"
"Like records and claims processing, Helpdesk and Support are good tools\n"
"to trace your interventions. This menu is more adapted to oral "
"communication,\n"
"which is not necessarily related to a claim. Select a customer, add notes\n"
"communication\n"
"that is not necessarily related to a claim. Select a customer, add notes\n"
"and categorise your interventions with a channel and a priority level.\n"
" "
@ -2993,6 +3180,15 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"Peruvian accounting chart and tax localisation. In accordance with PCGE "
"2010.\n"
"========================================================================\n"
"\n"
"Plan contable peruano e impuestos de acuerdo a disposiciones vigentes de la\n"
"SUNAT 2011 (PCGE 2010).\n"
"\n"
" "
#. module: base
#: view:ir.actions.server:0
@ -3153,6 +3349,19 @@ msgid ""
" * Unlimited \"Group By\" levels (not stacked), two cross level analysis "
"(stacked)\n"
msgstr ""
"\n"
"Graph Views for Web Client.\n"
"===========================\n"
"\n"
" * Parse a <graph> view allowing the presentation to be changed "
"dynamically\n"
" * Graph Types: pie, line, area, bar, radar\n"
" * Stacked/Not Stacked for areas and bars\n"
" * Legends: top, inside (top/left), hidden\n"
" * Features: download as PNG or CSV, browse data grid, switch "
"orientation\n"
" * Unlimited \"Group By\" levels (not stacked), two cross level analysis "
"(stacked)\n"
#. module: base
#: view:res.groups:0
@ -3231,6 +3440,25 @@ msgid ""
"purchase price and fixed product standard price are booked on a separate \n"
"account."
msgstr ""
"\n"
"This module supports the Anglo-Saxon accounting methodology by changing the "
"accounting logic for stock transactions.\n"
"============================================================================="
"=======================================\n"
"\n"
"The difference between the Anglo-Saxon accounting countries and the Rhine \n"
"(or also called Continental accounting) countries is the timing of taking \n"
"the Cost of Goods Sold versus the Cost of Sales. Anglo-Saxon accounting \n"
"takes the cost when a sales invoice is created whereas Continental "
"accounting will \n"
"take the cost at the moment the goods are shipped.\n"
"\n"
"This module adds the functionality by using an interim account to \n"
"store the value of shipped goods. It also contra-books the interim \n"
"account at creation to transfer the amount to the \n"
"debtor or creditor account. Additionally, price differences between actual \n"
"purchase prices and fixed product standard prices are booked on a separate \n"
"account."
#. module: base
#: model:res.country,name:base.si
@ -3297,7 +3525,7 @@ msgstr "French RIB Bank Details"
#. module: base
#: view:res.lang:0
msgid "%p - Equivalent of either AM or PM."
msgstr "%p - Equivalent of either AM or PM."
msgstr "%p - Writes either AM or PM."
#. module: base
#: view:ir.actions.server:0
@ -3315,6 +3543,7 @@ msgid ""
"the user will have an access to the sales configuration as well as statistic "
"reports."
msgstr ""
"the user will have access to the sales configuration and statistic reports."
#. module: base
#: model:res.country,name:base.nz
@ -3379,6 +3608,18 @@ msgid ""
" above. Specify the interval information and partner to be invoice.\n"
" "
msgstr ""
"\n"
"Create recurring documents.\n"
"===========================\n"
"\n"
"This module allows the creation of new documents and their subscriptions.\n"
"\n"
"e.g. To have an invoice generated automatically periodically:\n"
"-------------------------------------------------------------\n"
" * Define a document type based on an Invoice object.\n"
" * Define a subscription whose source document is the document defined\n"
" above. Specify the repeat interval and the partner to be invoiced.\n"
" "
#. module: base
#: field:res.company,rml_header1:0
@ -3401,6 +3642,8 @@ msgid ""
"the user will have an access to the human resources configuration as well as "
"statistic reports."
msgstr ""
"the user will have access to the human resources configuration as well as "
"statistics reports."
#. module: base
#: model:ir.module.module,description:base.module_l10n_pl
@ -3524,6 +3767,22 @@ msgid ""
" - Yearly Salary by Head and Yearly Salary by Employee Report\n"
" "
msgstr ""
"\n"
"Indian Payroll Salary Rules.\n"
"============================\n"
"\n"
" -Configuration of hr_payroll for India localisation\n"
" -All main contributions rules for India payslip.\n"
" * New payslip report\n"
" * Employee Contracts\n"
" * Allow to configure Basic / Gross / Net Salary\n"
" * Employee PaySlip\n"
" * Allowance / Deduction\n"
" * Integrated with Holiday Management\n"
" * Medical Allowance, Travel Allowance, Child Allowance, ...\n"
" - Payroll Advice and Report\n"
" - Yearly Salary by Head and Yearly Salary by Employee Report\n"
" "
#. module: base
#: code:addons/orm.py:3871
@ -3632,8 +3891,8 @@ msgid ""
"way you want to print them in letters and other documents. Some example: "
"Mr., Mrs. "
msgstr ""
"Manage the contact titles you want to have available in your system and the "
"way you want to print them in letters and other documents. Some example: "
"Manage the contact titles you wish to have available in your system and how "
"you want them to be printed in letters and other documents. Some examples: "
"Mr., Mrs. "
#. module: base
@ -3690,7 +3949,7 @@ msgid ""
"If you use a formula type, use a python expression using the variable "
"'object'."
msgstr ""
"If you use a formula type, use a python expression using the variable "
"If you use a formula type, use a python expression with the variable "
"'object'."
#. module: base
@ -3712,7 +3971,7 @@ msgstr "Contact Titles"
#. module: base
#: model:ir.module.module,shortdesc:base.module_product_manufacturer
msgid "Products Manufacturers"
msgstr "Products Manufacturers"
msgstr "Product Manufacturer Info"
#. module: base
#: code:addons/base/ir/ir_mail_server.py:240
@ -3885,6 +4144,38 @@ msgid ""
"* Work Order Analysis\n"
" "
msgstr ""
"\n"
"Manage the Manufacturing process in OpenERP\n"
"===========================================\n"
"\n"
"The manufacturing module allows you to cover planning, ordering, stock and "
"the manufacturing or assembly of products from raw materials and components. "
"It handles the consumption and production of products according to a bill of "
"materials, the necessary operations by machinery and tools, and the aid of "
"human resources, all via the use of routings.\n"
"\n"
"It supports the complete integration and planning of stockable goods, "
"consumables and services. Services are completely integrated with the rest "
"of the software. For instance, you can set up a sub-contracting service in a "
"bill of materials which, on order, automatically purchases your product "
"assembly.\n"
"\n"
"Key Features\n"
"------------\n"
"* Make to Stock/Make to Order\n"
"* Multi-level bill of materials, no limit\n"
"* Multi-level routing, no limit\n"
"* Routing and work centre integrated with analytic accounting\n"
"* Periodic scheduler computation \n"
"* Allows browsing bills of materials in a complete structure including child "
"and phantom bills of materials\n"
"\n"
"Dashboard / Reports for MRP includes:\n"
"-------------------------------------\n"
"* Procurements in Exception (Graph)\n"
"* Stock Value Variation (Graph)\n"
"* Work Order Analysis\n"
" "
#. module: base
#: view:ir.attachment:0
@ -3984,8 +4275,8 @@ msgid ""
"For one2many fields, the field on the target model that implement the "
"opposite many2one relationship"
msgstr ""
"For one2many fields, the field on the target model that implements the "
"opposite many2one relationship"
"For one2many fields, the field in the target model that implements the "
"reverse many2one relationship"
#. module: base
#: view:ir.rule:0
@ -4080,6 +4371,24 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"This module allows you to define the default timesheet function of a user on "
"a given account.\n"
"============================================================================="
"================\n"
"\n"
"This is useful when a user encodes their timesheet: the values are "
"retrieved\n"
"and the fields are auto-filled. However the possibility to change these "
"values is\n"
"still available.\n"
"\n"
"Obviously if no data has been recorded for the current account, the default\n"
"value is given as usual from the employee data so that this module is "
"perfectly\n"
"compatible with older configurations.\n"
"\n"
" "
#. module: base
#: view:ir.model:0
@ -4311,7 +4620,7 @@ msgid ""
" "
msgstr ""
"\n"
"Italian accounting chart and localization.\n"
"Italian accounting chart and localisation.\n"
"================================================\n"
" "
@ -4542,7 +4851,7 @@ msgstr "Account Charts"
#. module: base
#: model:ir.ui.menu,name:base.menu_event_main
msgid "Events Organization"
msgstr ""
msgstr "Events Organisation"
#. module: base
#: model:ir.actions.act_window,name:base.action_partner_customer_form
@ -7991,6 +8300,16 @@ msgid ""
"shortcut.\n"
" "
msgstr ""
"\n"
"Enable shortcut feature in the web client.\n"
"==========================================\n"
"\n"
"Add a Shortcut icon to the systray in order to access the user's shortcuts "
"(if any).\n"
"\n"
"Add a Shortcut icon beside the views title in order to add/remove a "
"shortcut.\n"
" "
#. module: base
#: field:res.company,rml_header2:0
@ -8249,6 +8568,14 @@ msgid ""
" </p>\n"
" "
msgstr ""
"<p class=\"oe_view_nocontent_create\">\n"
" Click to add a contact to your address book.\n"
" </p><p>\n"
" OpenERP helps you easily track all activities related to\n"
" a customer: discussions, history of business opportunities,\n"
" documents, etc.\n"
" </p>\n"
" "
#. module: base
#: model:ir.actions.act_window,name:base.bank_account_update
@ -16655,9 +16982,6 @@ msgstr ""
#~ msgid "maintenance.contract"
#~ msgstr "maintenance.contract"
#~ msgid "Last Connection"
#~ msgstr "Copy text \t Last Connection"
#~ msgid ""
#~ "If you need another language than the official ones available, you can "
#~ "import a language pack from here. Other OpenERP languages than the official "
@ -16753,10 +17077,6 @@ msgstr ""
#~ msgid "SMS Send"
#~ msgstr "SMS Send"
#, python-format
#~ msgid "Object %s does not exists"
#~ msgstr "Copy text \t Object %s does not exist"
#~ msgid "Waiting"
#~ msgstr "Waiting"
@ -16764,9 +17084,6 @@ msgstr ""
#~ msgid "Could not load base module"
#~ msgstr "Could not load base module"
#~ msgid "Secondary Log"
#~ msgstr "Copy text \t Secondary Log"
#~ msgid "Ignore"
#~ msgstr "Ignore"
@ -16869,9 +17186,6 @@ msgstr ""
#~ "you can add translations manually or perform a complete export (as a "
#~ "template for a new language example)."
#~ msgid "Publisher warranty contract successfully registered!"
#~ msgstr "Copy text \t Publisher warranty contract successfully registered!"
#~ msgid "state"
#~ msgstr "state"
@ -17293,6 +17607,19 @@ msgstr ""
#~ msgid "key '%s' not found in selection field '%s'"
#~ msgstr "key '%s' not found in selection field '%s'"
#~ msgid "Last Connection"
#~ msgstr "Last Connection"
#, python-format
#~ msgid "Object %s does not exists"
#~ msgstr "Object %s does not exist"
#~ msgid "Secondary Log"
#~ msgstr "Secondary Log"
#~ msgid "Publisher warranty contract successfully registered!"
#~ msgstr "Publisher warranty contract successfully registered!"
#, python-format
#~ msgid ""
#~ "Group(s) cannot be deleted, because some user(s) still belong to them: %s !"

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:42+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:24+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -8712,6 +8712,30 @@ msgid ""
" are scheduled with taking the phase's start date.\n"
" "
msgstr ""
"\n"
"Módulo de gestión de proyectos a largo plazo que registra la planificación, "
"la programación, la asignación de recursos.\n"
"============================================================================="
"==============\n"
"Características:\n"
"---------\n"
" * Gestión de grandes proyectos\n"
" * Definición de varias fases de proyecto\n"
" * Calculo de programación de fase: Calcula la fecha de inicio y fin de "
"las fases \n"
" del proyecto que están en estado borrador, abierto y pendiente. Si no "
"se especifica el proyecto\n"
" entonces se tomarán todas las fases en estado borrador, abierto y "
"pendiente.\n"
" * Calculo de programación de tareas: Funciona igual que el botón de "
"planificador en\n"
" project.phase. Toma el proyecto como argumento y calcula todas las "
"tareas en borrador,\n"
" abiertas y pendientes.\n"
" * Programación de tareas: todas las tareas que están en estado "
"borrador, abierto y pendiente\n"
" se programan tomando la fecha de inicio de la fase.\n"
" "
#. module: base
#: code:addons/orm.py:2021
@ -14802,7 +14826,7 @@ msgstr "Nueva Caledonia (Francesa)"
#. module: base
#: field:ir.model,osv_memory:0
msgid "Transient Model"
msgstr "Model transitorio"
msgstr "Modelo transitorio"
#. module: base
#: model:res.country,name:base.cy
@ -17702,6 +17726,25 @@ msgid ""
"depending on the product's configuration.\n"
" "
msgstr ""
"\n"
"Éste es el módulo para calcular abastecimientos.\n"
"==============================================\n"
"\n"
"En el proceso de reaprovisionamiento (MRP), los pedidos de abastecimiento se "
"crean para lanzar órdenes de fabricación, pedidos de compra o asignaciones "
"de existencias. Los pedidos de abastecimientos se generan de forma "
"automática por ele sistema y, a menos que haya un problema, el usuario no "
"será notificado. En caso de problemas, el sistema lanzará excepciones de "
"abastecimiento para informar al usuario acerca de los problemas bloqueantes "
"que necesitan ser resueltos manualmente (como por ejemplo, listas de "
"materiales (LdM) ausentes o proveedores no existentes).\n"
"\n"
"El pedido de abastecimiento planificará una propuesta para un abastecimiento "
"automático para el producto que requiere reposición. Este abastecimiento "
"comenzará una tarea, bien un formulario de pedido de compra para el "
"proveedor, o bien una orden de fabricación, dependiendo de la configuración "
"del producto.\n"
" "
#. module: base
#: model:ir.actions.act_window,name:base.open_module_tree
@ -23501,3 +23544,115 @@ msgstr "Registro"
#~ "que hacer, y se puede concentrar en la realización efectiva de dichas "
#~ "tareas.\n"
#~ " "
#~ msgid ""
#~ "\n"
#~ "This module allows to use several analytic plans, according to the general "
#~ "journal.\n"
#~ "============================================================================="
#~ "======\n"
#~ "\n"
#~ "Here multiple analytic lines are created when the invoice or the entries\n"
#~ "are confirmed.\n"
#~ "\n"
#~ "For example, you can define the following analytic structure:\n"
#~ " Projects\n"
#~ " Project 1\n"
#~ " SubProj 1.1\n"
#~ " SubProj 1.2\n"
#~ "\n"
#~ " Project 2\n"
#~ " Salesman\n"
#~ " Eric\n"
#~ " Fabien\n"
#~ "\n"
#~ "Here, we have two plans: Projects and Salesman. An invoice line must\n"
#~ "be able to write analytic entries in the 2 plans: SubProj 1.1 and\n"
#~ "Fabien. The amount can also be split. The following example is for\n"
#~ "an invoice that touches the two subproject and assigned to one salesman:\n"
#~ "\n"
#~ "Plan1:\n"
#~ " SubProject 1.1 : 50%\n"
#~ " SubProject 1.2 : 50%\n"
#~ "Plan2:\n"
#~ " Eric: 100%\n"
#~ "\n"
#~ "So when this line of invoice will be confirmed, it will generate 3 analytic "
#~ "lines,\n"
#~ "for one account entry.\n"
#~ "The analytic plan validates the minimum and maximum percentage at the time "
#~ "of creation\n"
#~ "of distribution models.\n"
#~ " "
#~ msgstr ""
#~ "\n"
#~ "Este módulo permite usar varios planes analíticos, según el diario general.\n"
#~ "============================================================================="
#~ "======\n"
#~ "\n"
#~ "Se crean varias líneas analíticas cuando la factura o las entradas se "
#~ "confirman.\n"
#~ "\n"
#~ "Por ejemplo, se puede definir la siguiente estructura analítica:\n"
#~ " Proyectos\n"
#~ " Proyecto 1\n"
#~ " SubProyecto 1.1\n"
#~ " SubProyecto 1.2\n"
#~ " Proyecto 2\n"
#~ "\n"
#~ " Comercial\n"
#~ " Eric\n"
#~ " Fabien\n"
#~ "\n"
#~ "Como vemos, hay dos planes: Proyectos y Comercial.\n"
#~ "Una lñinea de factura debe ser capaz de escribir entradas analíticas\n"
#~ "en dos planes: SubProyecto 1.1 y Fabien. También se puede repartir la "
#~ "cantidad.\n"
#~ "\n"
#~ "El siguiente ejemplo es para una factura que afecta a los dos subproyectos\n"
#~ "y se asigna a uno de los comerciales:\n"
#~ "\n"
#~ "Plan1:\n"
#~ " SubProyecto 1.1 : 50%\n"
#~ " SubProyecto 1.2 : 50%\n"
#~ "Plan2:\n"
#~ " Eric: 100%\n"
#~ "\n"
#~ "Así, cuando se confirme la línea de factura, se generarán 3 líneas "
#~ "analíticas,\n"
#~ "para un asiento contable.\n"
#~ "El plan analítico valida los porcentajes mínimo y máximo en el momento de "
#~ "creación\n"
#~ "de los modelos distribuidos.\n"
#~ " "
#~ msgid ""
#~ "\n"
#~ "This module allows you to produce several products from one production "
#~ "order.\n"
#~ "============================================================================="
#~ "\n"
#~ "\n"
#~ "You can configure sub-products in the bill of material.\n"
#~ "\n"
#~ "Without this module:\n"
#~ " A + B + C -> D\n"
#~ "\n"
#~ "With this module:\n"
#~ " A + B + C -> D + E\n"
#~ " "
#~ msgstr ""
#~ "\n"
#~ "Este módulo permite producir varios productos desde una única orden de "
#~ "producción.\n"
#~ "============================================================================="
#~ "\n"
#~ "\n"
#~ "Se pueden configurar subproductos en la lista de materiales.\n"
#~ "\n"
#~ "Sin este módulo:\n"
#~ " A + B + C -> D\n"
#~ "\n"
#~ "Con este módulo:\n"
#~ " A + B + C -> D + E\n"
#~ " "

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:44+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:26+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:44+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:26+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:45+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:27+0000\n"
"X-Generator: Launchpad (build 16760)\n"
"Language: \n"
#. module: base
@ -191,7 +191,7 @@ msgstr "Ventana destino"
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main Report File Path"
msgstr ""
msgstr "Ruta de archivo principal del informe"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
@ -212,6 +212,15 @@ msgid ""
"revenue\n"
"reports."
msgstr ""
"\n"
"Genere facturas desde los gastos y partes de horas.\n"
"========================================================\n"
"\n"
"Módulo para generar facturas basadas en los costes (recursos humanos, "
"gastos, ...).\n"
"\n"
"Puede definir tarifas en la contabilidad analítica, realizando algún informe "
"teórico de beneficios."
#. module: base
#: code:addons/base/ir/ir_sequence.py:134
@ -263,7 +272,7 @@ msgstr "creado."
#. module: base
#: field:ir.actions.report.xml,report_xsl:0
msgid "XSL Path"
msgstr ""
msgstr "Ruta XSL"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_tr
@ -289,7 +298,7 @@ msgstr "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
#. module: base
#: model:res.groups,name:base.group_multi_currency
msgid "Multi Currencies"
msgstr ""
msgstr "Multidivisa"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@ -301,6 +310,12 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"Plan de cuentas y localización de impuestos chilenos.\n"
"==============================================\n"
"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n"
"\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
@ -313,6 +328,7 @@ msgid ""
"The internal user that is in charge of communicating with this contact if "
"any."
msgstr ""
"El usuario interno encargado de comunicarse con este contacto si lo hubiese."
#. module: base
#: view:res.partner:0

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:44+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:26+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:45+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:27+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -8,14 +8,15 @@ msgstr ""
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
"PO-Revision-Date: 2012-09-07 01:11+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2013-07-25 03:08+0000\n"
"Last-Translator: Federico Manuel Echeverri Choux - ( Vauxoo ) "
"<echeverrifm@gmail.com>\n"
"Language-Team: Spanish (Mexico) <es_MX@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:45+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:27+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -613,7 +614,7 @@ msgstr ""
#. module: base
#: field:res.country,name:0
msgid "Country Name"
msgstr ""
msgstr "Nombre del país"
#. module: base
#: model:res.country,name:base.co
@ -14300,7 +14301,7 @@ msgstr ""
#: field:res.partner,vat:0
#, python-format
msgid "TIN"
msgstr ""
msgstr "RFC"
#. module: base
#: model:res.country,name:base.aw
@ -14316,7 +14317,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.ar
msgid "Argentina"
msgstr ""
msgstr "Argentina"
#. module: base
#: field:res.groups,full_name:0
@ -14357,7 +14358,7 @@ msgstr ""
#. module: base
#: model:ir.module.category,name:base.module_category_report_designer
msgid "Advanced Reporting"
msgstr ""
msgstr "Informes avanzados"
#. module: base
#: model:ir.module.module,summary:base.module_purchase
@ -14405,7 +14406,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr
msgid "France - Accounting"
msgstr ""
msgstr "Francia - Contabilidad"
#. module: base
#: view:ir.actions.todo:0
@ -14549,7 +14550,7 @@ msgstr ""
#. module: base
#: selection:base.language.install,lang:0
msgid "Czech / Čeština"
msgstr ""
msgstr "Checo / Čeština"
#. module: base
#: model:ir.module.category,name:base.module_category_generic_modules
@ -14608,7 +14609,7 @@ msgstr ""
#: model:ir.module.category,name:base.module_category_hidden
#: view:res.users:0
msgid "Technical Settings"
msgstr ""
msgstr "Configuración técnica"
#. module: base
#: model:ir.module.category,description:base.module_category_accounting_and_finance
@ -14616,6 +14617,8 @@ msgid ""
"Helps you handle your accounting needs, if you are not an accountant, we "
"suggest you to install only the Invoicing."
msgstr ""
"Le ayuda a manejar sus necesidades contables. Si no es un contable, le "
"recomendamos que sólo instale el módulo 'invoicing'."
#. module: base
#: model:ir.module.module,shortdesc:base.module_plugin_thunderbird
@ -14625,7 +14628,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,summary:base.module_event
msgid "Trainings, Conferences, Meetings, Exhibitions, Registrations"
msgstr ""
msgstr "Formaciones, conferencias, reuniones, exhibiciones, inscripciones"
#. module: base
#: model:ir.model,name:base.model_res_country
@ -14688,7 +14691,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_nl
msgid "Netherlands - Accounting"
msgstr ""
msgstr "Holanda - Contabilidad"
#. module: base
#: model:res.country,name:base.gs
@ -14713,6 +14716,11 @@ msgid ""
"1,06,500;[1,2,-1] will represent it to be 106,50,0;[3] will represent it as "
"106,500. Provided ',' as the thousand separator in each case."
msgstr ""
"El formato de separación debería ser como [,n] dónde 0 < n, empezando por "
"el dígito unidad. -1 terminará la separación. Por ej. [3,2,-1] representará "
"106500 como 1,06,500; [1,2,-1] lo representará como 106,50,0; [3] lo "
"representará como 106,500. Siempre que ',' sea el separador de mil en cada "
"caso."
#. module: base
#: field:ir.module.module,auto_install:0
@ -14732,6 +14740,12 @@ msgid ""
"taxes\n"
"and the Lempira currency."
msgstr ""
"\n"
"Éste es el módulo base para gestionar el plan de cuentas para Honduras.\n"
"====================================================================\n"
" \n"
"Agrega una nomenclatura contable para Honduras. También incluye impuestos y "
"la moneda Lempira."
#. module: base
#: model:res.country,name:base.jp
@ -14798,12 +14812,12 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ca
msgid "Canada - Accounting"
msgstr ""
msgstr "Canada - Contabilidad"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_co
msgid "Colombian - Accounting"
msgstr ""
msgstr "Contabilidad colombiana"
#. module: base
#: model:ir.module.module,description:base.module_account_voucher
@ -14870,7 +14884,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ve
msgid "Venezuela - Accounting"
msgstr ""
msgstr "Venezuela - Contabilidad"
#. module: base
#: model:res.country,name:base.cl

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:43+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:26+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:35+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:18+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:33+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:16+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -9,8 +9,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:40+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:22+0000\n"
"X-Generator: Launchpad (build 16760)\n"
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
"X-Poedit-Language: Persian\n"

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:46+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:28+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:35+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:18+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:35+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:18+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -1006,7 +1006,7 @@ msgstr "Sécurité et authentification"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_calendar
msgid "Web Calendar"
msgstr "Calendrier Web"
msgstr "Calendrier web"
#. module: base
#: selection:base.language.install,lang:0
@ -8819,7 +8819,7 @@ msgstr "Traduisible"
#. module: base
#: help:base.language.import,code:0
msgid "ISO Language and Country code, e.g. en_US"
msgstr ""
msgstr "Code ISO de la langue et du pays, ex: en_US"
#. module: base
#: model:res.country,name:base.vn
@ -8891,7 +8891,7 @@ msgstr "Sur plusieurs documents"
#: view:res.users:0
#: view:wizard.ir.model.menu.create:0
msgid "or"
msgstr ""
msgstr "ou"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_accountant
@ -9204,7 +9204,7 @@ msgstr "Cette fenêtre"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_anonymous
msgid "Anonymous portal"
msgstr ""
msgstr "Portail anonyme"
#. module: base
#: field:base.language.export,format:0
@ -9261,7 +9261,7 @@ msgstr "Mot de passe"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_claim
msgid "Portal Claim"
msgstr ""
msgstr "Portail Réclamation"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_pe
@ -9275,6 +9275,9 @@ msgid ""
"Allow users to login through OAuth2 Provider.\n"
"=============================================\n"
msgstr ""
"\n"
"Permettre aux utilisateurs de se connecter via un fournisseur OAuth2.\n"
"=============================================\n"
#. module: base
#: model:ir.actions.act_window,name:base.action_model_fields
@ -9528,7 +9531,7 @@ msgstr "Comptabilité financière et analytique"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_project
msgid "Portal Project"
msgstr ""
msgstr "Portail Projet"
#. module: base
#: model:res.country,name:base.cc
@ -9591,7 +9594,7 @@ msgstr ""
" </p><p>\n"
" OpenERP vous aide à suivre toutes les activités avec un "
"client : \n"
" les discussions, l'historiques des opportunités, \n"
" les discussions, l'historique des opportunités, \n"
" les documents, etc.\n"
" </p>\n"
" "
@ -9690,6 +9693,8 @@ msgid ""
"Select this if you want to set company's address information for this "
"contact"
msgstr ""
"Sélecionnez ceci si vous voulez indiquer l'adresse de la société de ce "
"contact."
#. module: base
#: field:ir.default,field_name:0
@ -9728,6 +9733,8 @@ msgid ""
"This field holds the image used as avatar for this contact, limited to "
"1024x1024px"
msgstr ""
"Ce champ contient l'image utilisée comme photo d'identité pour ce contact, "
"de taille limitée à 1024x1024px."
#. module: base
#: model:res.country,name:base.to
@ -9942,6 +9949,9 @@ msgid ""
"The kernel of OpenERP, needed for all installation.\n"
"===================================================\n"
msgstr ""
"\n"
"Le noyau d'OpenERP, nécessaire pour toute installation.\n"
"===================================================\n"
#. module: base
#: model:ir.model,name:base.model_ir_server_object_lines
@ -10040,7 +10050,7 @@ msgstr "Recherche toujours possible"
#. module: base
#: help:res.country.state,code:0
msgid "The state code in max. three chars."
msgstr ""
msgstr "Code de l'état, avec au plus trois caractères."
#. module: base
#: model:res.country,name:base.hk
@ -10050,7 +10060,7 @@ msgstr "Hong-Kong"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_sale
msgid "Portal Sale"
msgstr ""
msgstr "Portail Vente"
#. module: base
#: field:ir.default,ref_id:0
@ -10288,6 +10298,9 @@ msgid ""
"If the selected language is loaded in the system, all documents related to "
"this contact will be printed in this language. If not, it will be English."
msgstr ""
"Si la langue sélectionnée est chargée dans le système, tous les documents "
"pour ce contact seront imprimés dans cette langue. Dans le cas contraire, "
"ils le seront en anglais."
#. module: base
#: model:ir.module.module,description:base.module_hr_evaluation
@ -10502,7 +10515,7 @@ msgstr "Actions multiples"
#. module: base
#: model:ir.module.module,summary:base.module_mail
msgid "Discussions, Mailing Lists, News"
msgstr ""
msgstr "Discussions, listes de diffusion, nouvelles"
#. module: base
#: model:ir.module.module,description:base.module_fleet
@ -10976,7 +10989,7 @@ msgstr "Mali"
#. module: base
#: model:ir.ui.menu,name:base.menu_project_config_project
msgid "Stages"
msgstr ""
msgstr "Étapes"
#. module: base
#: selection:base.language.install,lang:0
@ -11088,7 +11101,7 @@ msgstr "Raccourcis personnalisés"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_si
msgid "Slovenian - Accounting"
msgstr ""
msgstr "Comptabilité - Slovénie"
#. module: base
#: model:ir.module.module,description:base.module_account_cancel
@ -11102,6 +11115,15 @@ msgid ""
"If set to true it allows user to cancel entries & invoices.\n"
" "
msgstr ""
"\n"
"Autoriser l'annulation d'écritures comptables.\n"
"====================================\n"
"\n"
"Ce module ajoute un champ \"Autoriser l'annulation d'écriture\" sur la vue "
"formulaire d'un journal de compte.\n"
"Lorsque ce champ est coché, un utilisateur peut annuler des écritures et des "
"factures.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_plugin
@ -11249,7 +11271,7 @@ msgstr "Annuler"
#: code:addons/orm.py:1507
#, python-format
msgid "Unknown database identifier '%s'"
msgstr ""
msgstr "Identifiant de base de données inconnu '%s'"
#. module: base
#: selection:base.language.export,format:0
@ -11402,7 +11424,7 @@ msgstr "Allemagne"
#. module: base
#: model:ir.module.module,shortdesc:base.module_auth_oauth
msgid "OAuth2 Authentication"
msgstr ""
msgstr "Identification OAuth2"
#. module: base
#: view:workflow:0
@ -11581,7 +11603,7 @@ msgstr "Regrouper par..."
#. module: base
#: view:base.module.update:0
msgid "Module Update Result"
msgstr ""
msgstr "Résultat de la mise à jour des modules"
#. module: base
#: model:ir.module.module,description:base.module_analytic_contract_hr_expense
@ -11596,7 +11618,7 @@ msgstr ""
#. module: base
#: field:ir.attachment,store_fname:0
msgid "Stored Filename"
msgstr ""
msgstr "Nom du fichier enregistré"
#. module: base
#: field:res.partner,use_parent_address:0
@ -11653,6 +11675,14 @@ msgid ""
" </p>\n"
" "
msgstr ""
"<p class=\"oe_view_nocontent_create\">\n"
"Cliquez pour ajouter un contact dans votre carnet d'adresses.\n"
"</p><p>\n"
"OpenERP vous aide à suivre toutes les activités d'un fournisseur :\n"
"les discussions, l'historique des achats,\n"
"les documents, etc.\n"
"</p>\n"
" "
#. module: base
#: model:res.country,name:base.lr
@ -11820,7 +11850,7 @@ msgstr "Unité de l'intervalle"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_stock
msgid "Portal Stock"
msgstr ""
msgstr "Portail Stock"
#. module: base
#: field:workflow.activity,kind:0
@ -11903,7 +11933,7 @@ msgstr "res.request"
#. module: base
#: field:res.partner,image_medium:0
msgid "Medium-sized image"
msgstr ""
msgstr "Image de taille moyenne"
#. module: base
#: view:ir.model:0
@ -11988,7 +12018,7 @@ msgstr "Règles sur les enregistrements"
#. module: base
#: view:multi_company.default:0
msgid "Multi Company"
msgstr ""
msgstr "Multi société"
#. module: base
#: model:ir.module.category,name:base.module_category_portal
@ -12005,7 +12035,7 @@ msgstr ""
#: code:addons/base/ir/ir_fields.py:294
#, python-format
msgid "See all possible values"
msgstr ""
msgstr "Voir toutes les valeurs possibles"
#. module: base
#: model:ir.module.module,description:base.module_claim_from_delivery
@ -12066,7 +12096,7 @@ msgstr "Guinée Bissau"
#. module: base
#: field:ir.actions.report.xml,header:0
msgid "Add RML Header"
msgstr ""
msgstr "Ajouter l'en-tête RML"
#. module: base
#: help:res.company,rml_footer:0
@ -12201,7 +12231,7 @@ msgstr "A Faire"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_hr_employees
msgid "Portal HR employees"
msgstr ""
msgstr "Portail RH Employés"
#. module: base
#: selection:base.language.install,lang:0
@ -12321,6 +12351,8 @@ msgstr ""
msgid ""
"Please contact your system administrator if you think this is an error."
msgstr ""
"Vous pouvez contacter votre administrateur système si vous pensez qu'il "
"s'agit d'une erreur."
#. module: base
#: code:addons/base/module/module.py:545
@ -12368,6 +12400,8 @@ msgid ""
"One of the documents you are trying to access has been deleted, please try "
"again after refreshing."
msgstr ""
"L'un des documents que vous voulez consulter a été supprimé : actualisez la "
"page puis réessayez."
#. module: base
#: model:ir.model,name:base.model_ir_mail_server
@ -12539,7 +12573,7 @@ msgstr ""
#. module: base
#: help:res.partner,ean13:0
msgid "BarCode"
msgstr ""
msgstr "Code-barres"
#. module: base
#: help:ir.model.fields,model_id:0
@ -12561,6 +12595,7 @@ msgstr "Martinique (Française)"
#: help:res.partner,is_company:0
msgid "Check if the contact is a company, otherwise it is a person"
msgstr ""
"Cochez si ce contact est une société, sinon il s'agit d'un particulier"
#. module: base
#: view:ir.sequence.type:0
@ -12570,7 +12605,7 @@ msgstr "Type de séquences"
#. module: base
#: view:res.partner:0
msgid "Mobile:"
msgstr ""
msgstr "Portable :"
#. module: base
#: code:addons/base/res/res_bank.py:195
@ -12637,7 +12672,7 @@ msgstr ""
#: code:addons/base/ir/ir_model.py:1031
#, python-format
msgid "Permission Denied"
msgstr ""
msgstr "Permission refusée"
#. module: base
#: field:ir.ui.menu,child_id:0
@ -12758,7 +12793,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.bl
msgid "Saint Barthélémy"
msgstr ""
msgstr "Saint Barthélémy"
#. module: base
#: selection:ir.module.module,license:0
@ -12830,13 +12865,13 @@ msgstr "Arabe / الْعَرَبيّة"
#. module: base
#: selection:ir.translation,state:0
msgid "Translated"
msgstr ""
msgstr "Traduit"
#. module: base
#: model:ir.actions.act_window,name:base.action_inventory_form
#: model:ir.ui.menu,name:base.menu_action_inventory_form
msgid "Default Company per Object"
msgstr ""
msgstr "Société par défaut par objet"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_hello
@ -12866,7 +12901,7 @@ msgstr "Domaine"
#: code:addons/base/ir/ir_fields.py:166
#, python-format
msgid "Use '1' for yes and '0' for no"
msgstr ""
msgstr "Utilisez \"1\" pour oui et \"0\" pour non"
#. module: base
#: model:ir.module.module,shortdesc:base.module_marketing_campaign
@ -13004,6 +13039,9 @@ msgid ""
"Allow users to sign up through OAuth2 Provider.\n"
"===============================================\n"
msgstr ""
"\n"
"Permettre aux utilisateurs de se connecter via un fournisseur OAuth2.\n"
"===============================================\n"
#. module: base
#: field:change.password.user,user_id:0
@ -13062,7 +13100,7 @@ msgstr "Grenade"
#. module: base
#: help:res.partner,customer:0
msgid "Check this box if this contact is a customer."
msgstr ""
msgstr "Cochez cette case si le contact est un client."
#. module: base
#: view:ir.actions.server:0
@ -13142,7 +13180,7 @@ msgstr ""
#: field:ir.actions.report.xml,report_rml_content:0
#: field:ir.actions.report.xml,report_rml_content_data:0
msgid "RML Content"
msgstr ""
msgstr "Contenu RML"
#. module: base
#: view:res.lang:0
@ -13383,7 +13421,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_fields_converter
msgid "ir.fields.converter"
msgstr ""
msgstr "ir.fields.converter"
#. module: base
#: code:addons/base/res/res_partner.py:439
@ -13411,12 +13449,12 @@ msgstr "Annuler l'installation"
#. module: base
#: model:ir.model,name:base.model_ir_model_relation
msgid "ir.model.relation"
msgstr ""
msgstr "ir.model.relation"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_check_writing
msgid "Check Writing"
msgstr ""
msgstr "Écriture de chèques"
#. module: base
#: model:ir.module.module,description:base.module_plugin_outlook
@ -13641,7 +13679,7 @@ msgstr "Grande Bretagne - Comptabilité"
#. module: base
#: model:res.partner.title,shortcut:base.res_partner_title_madam
msgid "Mrs."
msgstr ""
msgstr "Mme"
#. module: base
#: code:addons/base/ir/ir_model.py:432
@ -13663,6 +13701,7 @@ msgstr "Réf. utilisateur"
#, python-format
msgid "'%s' does not seem to be a valid datetime for field '%%(field)s'"
msgstr ""
"'%s' ne semble pas être une date/heure valide pour le champ '%%(fields)s'"
#. module: base
#: model:res.partner.bank.type.field,name:base.bank_normal_field_bic
@ -13813,7 +13852,7 @@ msgstr "Informations sur la connexion"
#. module: base
#: model:res.partner.title,name:base.res_partner_title_prof
msgid "Professor"
msgstr ""
msgstr "Professeur"
#. module: base
#: model:res.country,name:base.hm
@ -13842,7 +13881,7 @@ msgstr "Vous aide à gérer vos devis, commandes et factures"
#. module: base
#: field:res.users,login_date:0
msgid "Latest connection"
msgstr ""
msgstr "Dernière connexion"
#. module: base
#: field:res.groups,implied_ids:0
@ -13859,7 +13898,7 @@ msgstr "Sélection"
#: model:ir.actions.act_window,name:base.change_password_wizard_action
#: view:res.users:0
msgid "Change Password"
msgstr ""
msgstr "Modifier le mot de passe"
#. module: base
#: model:ir.module.module,description:base.module_l10n_es
@ -13927,7 +13966,7 @@ msgstr "Binaire"
#. module: base
#: model:res.partner.title,name:base.res_partner_title_doctor
msgid "Doctor"
msgstr ""
msgstr "Docteur"
#. module: base
#: model:ir.module.module,description:base.module_mrp_repair
@ -14136,12 +14175,12 @@ msgstr "Mois de création"
#. module: base
#: field:ir.module.module,demo:0
msgid "Demo Data"
msgstr ""
msgstr "Données de démonstration"
#. module: base
#: model:res.partner.title,shortcut:base.res_partner_title_mister
msgid "Mr."
msgstr ""
msgstr "M."
#. module: base
#: model:res.country,name:base.mv
@ -14261,7 +14300,7 @@ msgstr ""
#. module: base
#: field:ir.actions.report.xml,report_sxw:0
msgid "SXW Path"
msgstr ""
msgstr "Emplacement SXW"
#. module: base
#: model:ir.module.module,description:base.module_account_asset
@ -14294,7 +14333,7 @@ msgstr "Banque"
#: model:ir.module.category,name:base.module_category_point_of_sale
#: model:ir.module.module,shortdesc:base.module_point_of_sale
msgid "Point of Sale"
msgstr ""
msgstr "Point de vente"
#. module: base
#: model:ir.module.module,description:base.module_mail
@ -14544,7 +14583,7 @@ msgstr "Gabon"
#. module: base
#: model:ir.module.module,summary:base.module_stock
msgid "Inventory, Logistic, Storage"
msgstr ""
msgstr "Inventaire, logistique, stockage"
#. module: base
#: view:ir.actions.act_window:0
@ -15202,7 +15241,7 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "Fax:"
msgstr ""
msgstr "Fax :"
#. module: base
#: selection:ir.ui.view,type:0
@ -15480,7 +15519,7 @@ msgstr "Modules d'installation"
#. module: base
#: model:ir.ui.menu,name:base.menu_import_crm
msgid "Import & Synchronize"
msgstr ""
msgstr "Importer et synchroniser"
#. module: base
#: view:res.partner:0
@ -15680,7 +15719,7 @@ msgstr "Action due plusieurs documents"
#: model:ir.actions.act_window,name:base.action_partner_title_partner
#: model:ir.ui.menu,name:base.menu_partner_title_partner
msgid "Titles"
msgstr ""
msgstr "Civilités et Formes juridiques"
#. module: base
#: model:ir.module.module,description:base.module_anonymization
@ -15968,7 +16007,7 @@ msgstr "Modules à mettre à jour"
#. module: base
#: model:ir.ui.menu,name:base.menu_custom_multicompany
msgid "Multi-Companies"
msgstr ""
msgstr "Multi-sociétés"
#. module: base
#: field:workflow,osv:0
@ -16288,7 +16327,7 @@ msgstr "Accès"
#: field:res.partner,vat:0
#, python-format
msgid "TIN"
msgstr ""
msgstr "Numéro fiscal"
#. module: base
#: model:res.country,name:base.aw
@ -16388,7 +16427,7 @@ msgstr "Services après vente"
#. module: base
#: field:base.language.import,code:0
msgid "ISO Code"
msgstr ""
msgstr "Code ISO"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr
@ -16567,6 +16606,9 @@ msgid ""
"Allow users to login through OpenID.\n"
"====================================\n"
msgstr ""
"\n"
"Permettre aux utilisateurs de se connecter via OpenID.\n"
"====================================\n"
#. module: base
#: help:ir.mail_server,smtp_port:0
@ -16809,7 +16851,7 @@ msgstr "Canada - Comptabilité"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_co
msgid "Colombian - Accounting"
msgstr ""
msgstr "Colombie - Comptabilité"
#. module: base
#: model:ir.module.module,description:base.module_account_voucher
@ -16991,12 +17033,12 @@ msgstr "Mise à jour du système"
#: field:ir.actions.report.xml,report_sxw_content:0
#: field:ir.actions.report.xml,report_sxw_content_data:0
msgid "SXW Content"
msgstr ""
msgstr "Contenu SXW"
#. module: base
#: field:ir.attachment,file_size:0
msgid "File Size"
msgstr ""
msgstr "Taille du fichier"
#. module: base
#: help:ir.sequence,prefix:0
@ -17011,7 +17053,7 @@ msgstr "Seychelles"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_4
msgid "Gold"
msgstr ""
msgstr "Or"
#. module: base
#: code:addons/base/res/res_company.py:173
@ -17038,7 +17080,7 @@ msgstr "Informations générales"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_pt
msgid "Portugal - Chart of Accounts"
msgstr ""
msgstr "Portugal - Plan comptable"
#. module: base
#: field:ir.model.data,complete_name:0
@ -17088,6 +17130,8 @@ msgid ""
"Tax Identification Number. Check the box if this contact is subjected to "
"taxes. Used by the some of the legal statements."
msgstr ""
"Numéro fiscal. Cochez cette case si ce contact est soumis au paiement de "
"taxe. Utilisé dans certains documents légaux."
#. module: base
#: field:res.partner.bank,partner_id:0
@ -17269,6 +17313,14 @@ msgid ""
" </p>\n"
" "
msgstr ""
"<p class=\"oe_view_nocontent_create\">\n"
"Cliquez pour ajouter un contact dans votre carnet d'adresses.\n"
"</p><p>\n"
"OpenERP vous aide à suivre toutes les activités d'un client :\n"
"les discussions, l'historique des opportunités,\n"
"les documents, etc.\n"
"</p>\n"
" "
#. module: base
#: model:res.partner.category,name:base.res_partner_category_2

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:44+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:26+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:36+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:19+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:37+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:19+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -29,12 +29,12 @@ msgstr ""
#. module: base
#: model:res.country,name:base.sh
msgid "Saint Helena"
msgstr ""
msgstr "સંત હેલેના"
#. module: base
#: view:ir.actions.report.xml:0
msgid "Other Configuration"
msgstr "બીજા કન્ફિગ્યુરેશન"
msgstr "અન્ય રેખાંકન"
#. module: base
#: selection:ir.property,type:0
@ -232,7 +232,7 @@ msgstr "સ્પાર્સ ફિલ્ડ \"%s\" નુ નામ બદલ
#. module: base
#: model:res.country,name:base.sz
msgid "Swaziland"
msgstr "સ્વાઝિલેન્ડ"
msgstr "સ્વાઝલેન્ડ"
#. module: base
#: code:addons/orm.py:4485

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:37+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:19+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:37+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:20+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:41+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:23+0000\n"
"X-Generator: Launchpad (build 16760)\n"
"Language: hr\n"
#. module: base

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:37+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:20+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -9,8 +9,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:33+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:16+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:37+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:20+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -42,7 +42,7 @@ msgstr "Konfigurasi Lainnya"
#. module: base
#: selection:ir.property,type:0
msgid "DateTime"
msgstr ""
msgstr "DateTime"
#. module: base
#: code:addons/fields.py:652
@ -51,6 +51,8 @@ msgid ""
"The second argument of the many2many field %s must be a SQL table !You used "
"%s, which is not a valid SQL table name."
msgstr ""
"Argumen kedua dari field many2many %s harus merupakan tabel SQL ! Anda "
"menggunakan %s, yang mana bukan table SQL."
#. module: base
#: field:ir.ui.view,arch:0
@ -66,7 +68,7 @@ msgstr "Kontrol Penawaran, Pesanan Penjualan, Pengiriman & Faktur"
#. module: base
#: selection:ir.sequence,implementation:0
msgid "No gap"
msgstr ""
msgstr "Tidak ada gap"
#. module: base
#: selection:base.language.install,lang:0
@ -76,7 +78,7 @@ msgstr "Bahasa Hungaria"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (PY) / Español (PY)"
msgstr ""
msgstr "Bahasa Spanyol"
#. module: base
#: model:ir.module.category,description:base.module_category_project_management
@ -84,27 +86,30 @@ msgid ""
"Helps you manage your projects and tasks by tracking them, generating "
"plannings, etc..."
msgstr ""
"Memungkinkan Anda untuk mengelola proyek dan tugas dengan cara melacaknya, "
"menghasilkan perencanaan dan lain sebagainya ..."
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr ""
msgstr "Antarmuka layar sentuh untuk digunakan di toko"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
msgid "Indian Payroll"
msgstr ""
msgstr "Payroll untuk India"
#. module: base
#: help:ir.cron,model:0
msgid ""
"Model name on which the method to be called is located, e.g. 'res.partner'."
msgstr ""
"Sebutkan nama model yang mana metode ini akan dipanggil, misal 'res.partner'."
#. module: base
#: view:ir.module.module:0
msgid "Created Views"
msgstr "View Tercipta"
msgstr "View yang diciptakan"
#. module: base
#: model:ir.module.module,description:base.module_product_manufacturer
@ -121,11 +126,24 @@ msgid ""
" * Product Attributes\n"
" "
msgstr ""
"\n"
"Modul ini berfungsi untuk menambahkan nama produsen beserta atributnya pada "
"formulir produk.\n"
"============================================================================="
"==\n"
"\n"
"Anda dapat mengisi data-data berikut pada produk:\n"
"------------------------------------------------\n"
"* Nama produsen\n"
"* Nama produk produsen\n"
"* Code produk produsen\n"
"* Atribut produk\n"
" "
#. module: base
#: field:ir.actions.client,params:0
msgid "Supplementary arguments"
msgstr ""
msgstr "Argumen tambahan"
#. module: base
#: model:ir.module.module,description:base.module_google_base_account
@ -134,11 +152,14 @@ msgid ""
"The module adds google user in res user.\n"
"========================================\n"
msgstr ""
"\n"
"Modul ini akan menambahkan google user dalam obyek res.user\n"
"====================================================\n"
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
msgstr ""
msgstr "Centang kotak ini jika kontak adalah pegawai"
#. module: base
#: help:ir.model.fields,domain:0
@ -147,6 +168,9 @@ msgid ""
"specified as a Python expression defining a list of triplets. For example: "
"[('color','=','red')]"
msgstr ""
"Sebuah domain (opsional) untuk membatasi nilai untuk field yang terelasi, "
"dimana merupakan ekspresi Python yang mendefinisikan daftar triplet. Sebagai "
"contoh: [('color', '=', 'merah')]"
#. module: base
#: field:res.partner,ref:0
@ -156,7 +180,7 @@ msgstr "Referensi"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_be_invoice_bba
msgid "Belgium - Structured Communication"
msgstr ""
msgstr "Belgia - Komunikasi terstruktur"
#. module: base
#: field:ir.actions.act_window,target:0
@ -166,12 +190,12 @@ msgstr "Jendela Sasaran"
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main Report File Path"
msgstr ""
msgstr "Path (lokasi) file laporan"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
msgid "Sales Analytic Distribution"
msgstr ""
msgstr "Untuk mendistribusikan data analisis pada proses Penjualan"
#. module: base
#: model:ir.module.module,description:base.module_hr_timesheet_invoice
@ -203,12 +227,14 @@ msgid ""
"Properties of base fields cannot be altered in this manner! Please modify "
"them through Python code, preferably through a custom addon!"
msgstr ""
"Sifat field basis tidak dapat diubah dengan cara ini! Silahkan "
"memodifikasinya melalui kode Python, sebaiknya dibuat modul terpisah."
#. module: base
#: code:addons/osv.py:151
#, python-format
msgid "Constraint Error"
msgstr ""
msgstr "Kesalahan"
#. module: base
#: model:ir.model,name:base.model_ir_ui_view_custom
@ -219,7 +245,7 @@ msgstr "ir.ui.view.custom"
#: code:addons/base/ir/ir_model.py:374
#, python-format
msgid "Renaming sparse field \"%s\" is not allowed"
msgstr ""
msgstr "Mengganti nama field \"%s\" tidak diperbolehkan"
#. module: base
#: model:res.country,name:base.sz
@ -235,12 +261,12 @@ msgstr "dibuat"
#. module: base
#: field:ir.actions.report.xml,report_xsl:0
msgid "XSL Path"
msgstr ""
msgstr "Lokasi file XSL"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_tr
msgid "Turkey - Accounting"
msgstr ""
msgstr "Turki - Akunting"
#. module: base
#: field:ir.sequence,number_increment:0
@ -256,12 +282,12 @@ msgstr "Struktur Perusahaan"
#. module: base
#: selection:base.language.install,lang:0
msgid "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
msgstr ""
msgstr "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
#. module: base
#: model:res.groups,name:base.group_multi_currency
msgid "Multi Currencies"
msgstr ""
msgstr "Multi Mata Uang"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@ -277,7 +303,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
msgid "Sales Management"
msgstr ""
msgstr "Manajemen Penjualan"
#. module: base
#: help:res.partner,user_id:0
@ -285,6 +311,7 @@ msgid ""
"The internal user that is in charge of communicating with this contact if "
"any."
msgstr ""
"Pengguna/user yang ditugaskan berhubungan dengan kontak ini, jika ada."
#. module: base
#: view:res.partner:0
@ -299,7 +326,7 @@ msgstr "Jumlah Modul"
#. module: base
#: help:multi_company.default,company_dest_id:0
msgid "Company to store the current record"
msgstr ""
msgstr "Perusahaan untuk menyimpan data ini"
#. module: base
#: field:res.partner.bank.type.field,size:0
@ -312,6 +339,8 @@ msgid ""
"Database ID of record to open in form view, when ``view_mode`` is set to "
"'form' only"
msgstr ""
"Database ID dari data yang akan dibuka dalam tampilan formulir (form view), "
"dimana \"view_mode\" diberi nilai \"form\"."
#. module: base
#: help:ir.values,key2:0
@ -327,7 +356,7 @@ msgstr ""
#. module: base
#: sql_constraint:res.lang:0
msgid "The name of the language must be unique !"
msgstr ""
msgstr "Nama bahasa harus unik"
#. module: base
#: selection:res.request,state:0
@ -355,7 +384,7 @@ msgstr ""
#. module: base
#: model:ir.module.category,name:base.module_category_customer_relationship_management
msgid "Customer Relationship Management"
msgstr ""
msgstr "Manajemen Hubungan Pelanggan"
#. module: base
#: model:ir.module.module,description:base.module_delivery
@ -377,40 +406,42 @@ msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
"Sudah ada filter yang telah ditetapkan untuk %(model)s, silakan hapus atau "
"rubah dulu sebelum menetapkan nilai baru."
#. module: base
#: code:addons/orm.py:2649
#, python-format
msgid "Invalid group_by"
msgstr ""
msgstr "group_by salah"
#. module: base
#: field:ir.module.category,child_ids:0
msgid "Child Applications"
msgstr ""
msgstr "Aplikasi Anak"
#. module: base
#: field:res.partner,credit_limit:0
msgid "Credit Limit"
msgstr ""
msgstr "Batas Kredit"
#. module: base
#: field:ir.model.constraint,date_update:0
#: field:ir.model.data,date_update:0
#: field:ir.model.relation,date_update:0
msgid "Update Date"
msgstr "Tanggal Pembaharuan"
msgstr "Pembaharuan Tanggal"
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_action_rule
msgid "Automated Action Rules"
msgstr ""
msgstr "Aturan Aksi Otomatis"
#. module: base
#: view:ir.attachment:0
#: field:ir.attachment,create_uid:0
msgid "Owner"
msgstr ""
msgstr "Pemilik"
#. module: base
#: view:ir.actions.act_window:0
@ -420,7 +451,7 @@ msgstr "Sumber Obyek"
#. module: base
#: model:res.partner.bank.type,format_layout:base.bank_normal
msgid "%(bank_name)s: %(acc_number)s"
msgstr ""
msgstr "%(bank_name)s: %(acc_number)s"
#. module: base
#: view:ir.actions.todo:0
@ -445,6 +476,8 @@ msgid ""
"Invalid date/time format directive specified. Please refer to the list of "
"allowed directives, displayed when you edit a language."
msgstr ""
"Penetapan format data/time salah. Silakan contoh yang ditampilkan ketika "
"mengedit bahasa."
#. module: base
#: code:addons/orm.py:4153
@ -452,7 +485,7 @@ msgstr ""
msgid ""
"One of the records you are trying to modify has already been deleted "
"(Document type: %s)."
msgstr ""
msgstr "Data yang akan Anda modifikasi sudah dihapus (Jenis Dokumen: %s)."
#. module: base
#: help:ir.actions.act_window,views:0
@ -466,12 +499,12 @@ msgstr ""
#. module: base
#: field:ir.model.relation,name:0
msgid "Relation Name"
msgstr ""
msgstr "Nama Relasi"
#. module: base
#: view:ir.rule:0
msgid "Create Access Right"
msgstr ""
msgstr "Membuat Hak Akses"
#. module: base
#: model:res.country,name:base.tv
@ -481,7 +514,7 @@ msgstr "Tuvalu"
#. module: base
#: field:ir.actions.configuration.wizard,note:0
msgid "Next Wizard"
msgstr ""
msgstr "Wizard berikutnya"
#. module: base
#: field:res.lang,date_format:0
@ -491,7 +524,7 @@ msgstr "Format Tanggal"
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_report_designer
msgid "OpenOffice Report Designer"
msgstr ""
msgstr "Untuk mendesign Laporan dengan OpenOffice"
#. module: base
#: model:res.country,name:base.an

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:37+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:20+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:38+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:20+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -32,7 +32,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.sh
msgid "Saint Helena"
msgstr "Saint Helena"
msgstr "Sant'Elena"
#. module: base
#: view:ir.actions.report.xml:0

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:38+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:20+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -80,12 +80,12 @@ msgstr "スペイン語(パラグアイ)/ Español (PY)"
msgid ""
"Helps you manage your projects and tasks by tracking them, generating "
"plannings, etc..."
msgstr "プロジェクトやタスクを追跡,計画生成などすることにより、あなたのプロジェクトとタスクの管理を補助します。"
msgstr "追跡や計画生成などで、プロジェクトとタスクの管理を補助します。"
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr ""
msgstr "店舗用タッチスクリーン画面"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
@ -234,7 +234,7 @@ msgstr "作成済"
#. module: base
#: field:ir.actions.report.xml,report_xsl:0
msgid "XSL Path"
msgstr ""
msgstr "XLSパス"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_tr
@ -260,7 +260,7 @@ msgstr "イヌクウティトット語 / Inuktitut"
#. module: base
#: model:res.groups,name:base.group_multi_currency
msgid "Multi Currencies"
msgstr ""
msgstr "多通貨"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@ -276,7 +276,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
msgid "Sales Management"
msgstr "受注管理"
msgstr "販売管理"
#. module: base
#: help:res.partner,user_id:0
@ -654,7 +654,7 @@ msgstr "パラオ"
#. module: base
#: view:res.partner:0
msgid "Sales & Purchases"
msgstr "受注と発注"
msgstr "販売・購買"
#. module: base
#: view:ir.translation:0
@ -1535,7 +1535,7 @@ msgstr ""
#: model:ir.module.category,name:base.module_category_purchase_management
#: model:ir.ui.menu,name:base.menu_purchase_root
msgid "Purchases"
msgstr "発注"
msgstr "購買"
#. module: base
#: model:res.country,name:base.md
@ -1635,7 +1635,7 @@ msgstr "コード %s を持つ言語が存在しません。"
#: model:ir.module.category,name:base.module_category_social_network
#: model:ir.module.module,shortdesc:base.module_mail
msgid "Social Network"
msgstr ""
msgstr "ソーシャルネットワーク"
#. module: base
#: view:res.lang:0
@ -4589,7 +4589,7 @@ msgstr "ヒンディー語 / हिंदी"
#: model:ir.actions.act_window,name:base.action_view_base_language_install
#: model:ir.ui.menu,name:base.menu_view_base_language_install
msgid "Load a Translation"
msgstr ""
msgstr "言語の追加"
#. module: base
#: field:ir.module.module,latest_version:0
@ -5316,7 +5316,7 @@ msgstr "レート"
#. module: base
#: model:ir.module.module,shortdesc:base.module_email_template
msgid "Email Templates"
msgstr ""
msgstr "Eメールテンプレート"
#. module: base
#: model:res.country,name:base.sy
@ -9728,7 +9728,7 @@ msgstr "受注オーダーのマージン"
#. module: base
#: model:ir.module.module,shortdesc:base.module_purchase
msgid "Purchase Management"
msgstr "発注管理"
msgstr "購買管理"
#. module: base
#: field:ir.module.module,published_version:0
@ -9993,7 +9993,7 @@ msgstr "インストールする"
#: model:ir.module.module,shortdesc:base.module_base
#: field:res.currency,base:0
msgid "Base"
msgstr "基本"
msgstr "ベース"
#. module: base
#: field:ir.model.data,model:0
@ -14274,7 +14274,7 @@ msgstr ""
#. module: base
#: model:ir.ui.menu,name:base.menu_custom_multicompany
msgid "Multi-Companies"
msgstr ""
msgstr "複数会社設定"
#. module: base
#: field:workflow,osv:0
@ -15190,7 +15190,7 @@ msgstr "条件"
#: model:ir.actions.client,name:base.modules_updates_act_cl
#: model:ir.ui.menu,name:base.menu_module_updates
msgid "Updates"
msgstr ""
msgstr "アップデート"
#. module: base
#: help:res.currency,rate:0
@ -15402,7 +15402,7 @@ msgstr ""
#: model:ir.actions.act_window,name:base.open_module_tree
#: model:ir.ui.menu,name:base.menu_module_tree
msgid "Installed Modules"
msgstr ""
msgstr "インストール済モジュール"
#. module: base
#: code:addons/base/res/res_users.py:170
@ -15465,7 +15465,7 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "Internal Notes"
msgstr ""
msgstr "内部注記"
#. module: base
#: model:res.partner.title,name:base.res_partner_title_pvt_ltd
@ -15476,7 +15476,7 @@ msgstr "会社"
#. module: base
#: model:ir.module.module,shortdesc:base.module_purchase_requisition
msgid "Purchase Requisitions"
msgstr "発注依頼"
msgstr "購買依頼"
#. module: base
#: selection:ir.actions.act_window,target:0

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:36+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:18+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:38+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:21+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:38+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:21+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:39+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:21+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:39+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:21+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:39+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:21+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:39+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:22+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:39+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:22+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:35+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:17+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -9702,7 +9702,7 @@ msgstr "Gebruikersinterface"
#. module: base
#: model:ir.module.module,shortdesc:base.module_mrp_byproduct
msgid "MRP Byproducts"
msgstr "productie bijproducten"
msgstr "Productie bijproducten"
#. module: base
#: field:res.request,ref_partner_id:0
@ -15682,7 +15682,7 @@ msgid ""
"Do you confirm the uninstallation of this module? This will permanently "
"erase all data currently stored by the module!"
msgstr ""
"Wilt u de deinstllatie van deze module bevestigen? Dit zal alle gegevens "
"Wilt u de deinstallatie van deze module bevestigen? Dit zal alle gegevens "
"opgeslagen door de module verwijderen!"
#. module: base

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:44+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:27+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:40+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:22+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -2052,7 +2052,7 @@ msgstr "Turkmenistan"
#. module: base
#: view:res.lang:0
msgid "7. %H:%M:%S ==> 18:25:20"
msgstr ""
msgstr "7. %H:%M:%S ==> 18:25:20"
#. module: base
#: view:res.partner:0
@ -2579,7 +2579,7 @@ msgstr "Dodatkowe"
#. module: base
#: model:res.country,name:base.st
msgid "Saint Tome (Sao Tome) and Principe"
msgstr ""
msgstr "Wyspy Świętego Tomasza i Książęca"
#. module: base
#: selection:res.partner,type:0
@ -4261,7 +4261,7 @@ msgstr "Wymagana grupa"
#. module: base
#: view:res.lang:0
msgid "6. %d, %m ==> 05, 12"
msgstr ""
msgstr "6. %d, %m ==> 05, 12"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_it
@ -5146,7 +5146,7 @@ msgstr "Ścieżka XML"
#. module: base
#: model:res.country,name:base.bj
msgid "Benin"
msgstr ""
msgstr "Benin"
#. module: base
#: model:ir.actions.act_window,name:base.action_res_partner_bank_type_form
@ -5340,7 +5340,7 @@ msgstr "Syria"
#. module: base
#: view:res.lang:0
msgid "======================================================"
msgstr ""
msgstr "======================================================"
#. module: base
#: sql_constraint:ir.model:0
@ -5453,6 +5453,7 @@ msgstr "Nazwa posiadacza konta"
#, python-format
msgid "Cannot rename column to %s, because that column already exists!"
msgstr ""
"Nie można zmienić nazwy kolumny na %s, ponieważ ta kolumna już istnieje!"
#. module: base
#: view:ir.attachment:0
@ -5578,7 +5579,7 @@ msgstr "Wenezuela"
#. module: base
#: view:res.lang:0
msgid "9. %j ==> 340"
msgstr ""
msgstr "9. %j ==> 340"
#. module: base
#: model:res.country,name:base.zm
@ -5943,7 +5944,7 @@ msgstr "Pogrupuj wg"
#. module: base
#: view:res.config.installer:0
msgid "title"
msgstr ""
msgstr "tytuł"
#. module: base
#: code:addons/base/ir/ir_fields.py:146
@ -5969,7 +5970,7 @@ msgstr "Tłumaczenie"
#. module: base
#: selection:res.request,state:0
msgid "closed"
msgstr ""
msgstr "zamknięte"
#. module: base
#: selection:base.language.export,state:0
@ -12108,7 +12109,7 @@ msgstr ""
#. module: base
#: selection:ir.translation,type:0
msgid "XSL"
msgstr ""
msgstr "XSL"
#. module: base
#: code:addons/base/ir/ir_model.py:85
@ -15906,10 +15907,6 @@ msgstr ""
#~ msgid "On delete"
#~ msgstr "Przy usuwaniu"
#, python-format
#~ msgid "Not Implemented"
#~ msgstr "Nie zaimplementowane"
#~ msgid "Textile Suppliers"
#~ msgstr "Dostawca tekstyliów"
@ -17034,3 +17031,58 @@ msgstr ""
#~ "======================================\n"
#~ "\n"
#~ "Moduł umożliwia planowanie wsteczne zarządzające twoimi wydarzeniami.\n"
#, python-format
#~ msgid "Not Implemented"
#~ msgstr "Niezaimplementowane"
#~ msgid ""
#~ "OpenERP translations (core, modules, clients) are managed through "
#~ "Launchpad.net, our open source project management facility. We use their "
#~ "online interface to synchronize all translations efforts."
#~ msgstr ""
#~ "Tłumaczenia OpenERP (jądro, moduły, klient) są zarządzane poprzez "
#~ "Launchpad.net. Używamy ich interfejsu online by synchronizować wszelkie "
#~ "tłumaczenia."
#~ msgid ","
#~ msgstr ","
#~ msgid "S. Georgia & S. Sandwich Isls."
#~ msgstr "Georgia Południowa i Sandwich Południowy"
#~ msgid "-"
#~ msgstr "-"
#~ msgid "https://help.launchpad.net/Translations"
#~ msgstr "https://help.launchpad.net/Translations"
#~ msgid "Portugese (BR) / Português (BR)"
#~ msgstr "Portugalski (BR) / Português (BR)"
#~ msgid "Facebook"
#~ msgstr "Facebook"
#~ msgid "Openstuff.net"
#~ msgstr "Openstuff.net"
#~ msgid "Portugese / Português"
#~ msgstr "Portugalski / Português"
#~ msgid "M."
#~ msgstr "M."
#~ msgid "XML ID"
#~ msgstr "XML ID"
#~ msgid "XML Id"
#~ msgstr "XML Id"
#~ msgid "FYROM"
#~ msgstr "FYROM"
#~ msgid "Serial Key"
#~ msgstr "Klucz seryjny"
#~ msgid "Widget Wizard"
#~ msgstr "Kreator widżetów"

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:40+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:22+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -24,6 +24,10 @@ msgid ""
"================================================\n"
" "
msgstr ""
"\n"
"Módulo para Verificar a Escrita e Verificar a Impresaão.\n"
"================================================\n"
" "
#. module: base
#: model:res.country,name:base.sh
@ -122,6 +126,18 @@ msgid ""
" * Product Attributes\n"
" "
msgstr ""
"\n"
"Um modulo que acrescenta a identificação de fabricantes e atributos ao "
"formulário de produtos.\n"
"====================================================================\n"
"\n"
"Agora é possível definir o seguinte para cada produto:\n"
"\n"
" Fabricante\n"
" Nome do produto atribuído pelo fabricante\n"
" Código do produto atribuído pelo fabricante\n"
" Atributos do produto\n"
" "
#. module: base
#: field:ir.actions.client,params:0
@ -135,6 +151,8 @@ msgid ""
"The module adds google user in res user.\n"
"========================================\n"
msgstr ""
"\n"
"O modulo acrescenta utilizador google em \"res user\".\n"
#. module: base
#: help:res.partner,employee:0
@ -170,7 +188,7 @@ msgstr "Janela alvo"
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main Report File Path"
msgstr ""
msgstr "Caminho para o ficheiro do relatório principal"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
@ -191,6 +209,15 @@ msgid ""
"revenue\n"
"reports."
msgstr ""
"\n"
"Gerar faturas através de Despesas, Folhas de Horas\n"
"========================================================\n"
"\n"
"Modulo que gera faturas baseadas em custos (recursos humanos, despesas, "
"...).\n"
"\n"
"Pode definir tabelas de preços na conta analítica, criar analises teoréticas "
"de vendas."
#. module: base
#: code:addons/base/ir/ir_sequence.py:134
@ -226,7 +253,7 @@ msgstr "ir.ui.view.custom"
#: code:addons/base/ir/ir_model.py:374
#, python-format
msgid "Renaming sparse field \"%s\" is not allowed"
msgstr ""
msgstr "Não é permitido mudar o nome de sparse field \"%s\""
#. module: base
#: model:res.country,name:base.sz
@ -292,6 +319,8 @@ msgid ""
"The internal user that is in charge of communicating with this contact if "
"any."
msgstr ""
"O utilizador interno responsável pela comunicação com este contacto (se "
"houver)"
#. module: base
#: view:res.partner:0
@ -376,6 +405,15 @@ msgid ""
"invoices from picking, OpenERP is able to add and compute the shipping "
"line.\n"
msgstr ""
"\n"
"Permite adicionar métodos de entrega nas ordens de venda e ordens de "
"preparação de encomendas.\n"
"==============================================================\n"
"\n"
"Assim é possível definir transportadores adicionais e tabelas de preços para "
"entregas. No acto de criar \n"
"uma fatura através um ordem de preparação de encomenda, OpenERP consegue "
"adicionar e calcular custos de entrega.\n"
#. module: base
#: code:addons/base/ir/ir_filters.py:80
@ -384,6 +422,8 @@ msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
"Um filtro partilhado já está definido para %(model)s, apague ou modifique o "
"filtro existente antes de criar um novo."
#. module: base
#: code:addons/orm.py:2649
@ -452,8 +492,8 @@ msgid ""
"Invalid date/time format directive specified. Please refer to the list of "
"allowed directives, displayed when you edit a language."
msgstr ""
"Data inválida/especifique diretiva do formato da hora. Por favor, consulte a "
"lista de diretivas permitidas, exibida quando se edita uma linguagem."
"A diretiva data/hora especificada é invalida. Por favor, consulte a lista de "
"diretivas permitidas, exibida quando se edita uma linguagem."
#. module: base
#: code:addons/orm.py:4153
@ -462,7 +502,7 @@ msgid ""
"One of the records you are trying to modify has already been deleted "
"(Document type: %s)."
msgstr ""
"Um dos registos que está a tentar modificar já deve ter sido excluído "
"Um dos registos que está a tentar modificar já deve ter sido apagado "
"(Document type: %s)."
#. module: base
@ -552,6 +592,15 @@ msgid ""
"that have no counterpart in the general financial accounts.\n"
" "
msgstr ""
"\n"
"Modulo para definir objetos de contabilidade analítica.\n"
"===============================================\n"
"\n"
"Na OpenERP, contas analíticas estão ligados a contas gerais embora são "
"tratados \n"
"de uma forma independente. Assim é possível adicionar operações analíticas \n"
"mesmo quando não tenham homólogos nas contas gerais.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_idea
@ -575,6 +624,19 @@ msgid ""
"* Use emails to automatically confirm and send acknowledgements for any "
"event registration\n"
msgstr ""
"\n"
"Organização e gestão de Eventos.\n"
"======================================\n"
"\n"
"O modulo de gestão de eventos permite gerir todos as tarefas associadas a "
"organização de eventos: planificação, controlo de inscrições, "
"comparecimento, etc.\n"
"\n"
"Principais Funções\n"
"------------\n"
"* Gerir os seus Eventos e Inscrições\n"
"* Utilizar e-mail para enviar confirmações de forma automática para "
"inscrições nos seus eventos.\n"
#. module: base
#: selection:base.language.install,lang:0
@ -774,6 +836,11 @@ msgid ""
"This module provides the Integration of the LinkedIn with OpenERP.\n"
" "
msgstr ""
"\n"
"Módulo OpenERP Web LinkedIn.\n"
"============================\n"
"Este módulo disponibiliza a integração do LinkedIn com o OpenERP.\n"
" "
#. module: base
#: help:ir.actions.act_window,src_model:0
@ -839,6 +906,9 @@ msgid ""
"image, with aspect ratio preserved. Use this field anywhere a small image is "
"required."
msgstr ""
"Imagem em pequeno formato para este contacto. É automaticamente "
"redimensionada para 64x64px com o racio do aspect preservado. Utilize este "
"campo onde quer que uma imagem pequena seja necessária."
#. module: base
#: help:ir.actions.server,mobile:0
@ -1327,7 +1397,7 @@ msgstr "Contribuintes"
#. module: base
#: field:ir.rule,perm_unlink:0
msgid "Apply for Delete"
msgstr ""
msgstr "Aplicar para Apagar"
#. module: base
#: selection:ir.property,type:0
@ -1465,7 +1535,7 @@ msgstr "Haiti"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
msgid "French Payroll"
msgstr ""
msgstr "Folha de pagamentos Francesa"
#. module: base
#: view:ir.ui.view:0
@ -1996,6 +2066,8 @@ msgid ""
"Check this box if this contact is a supplier. If it's not checked, purchase "
"people will not see it when encoding a purchase order."
msgstr ""
"Assinala nesta caixa se o contacto é fornecedor. Se não for assinalado, o "
"contacto não será visível no acto de criar uma nota de encomenda."
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_evaluation
@ -2173,6 +2245,27 @@ msgid ""
"* *Before Delivery*: A Draft invoice is created and must be paid before "
"delivery\n"
msgstr ""
"\n"
"Gerir orçamentos e encomendas\n"
"==================================\n"
"\n"
"Este modulo liga a aplicação de vendas com a de gestão de armazéns.\n"
"\n"
"Preferências\n"
"-----------\n"
"* Envios: Escolha entre a entrega total ou parcial de uma encomenda.\n"
"* Faturação: Escolha o prazo de pagamento da fatura\n"
"* Incoterms: Escolha os termos de entrega da mercadoria (EXW, DDU, FOB, "
"etc.)\n"
"\n"
"Escolhe entre varias maneiras flexíveis de faturação:\n"
"\n"
"* *Manualmente*: As faturas são criados manualmente das notas de encomenda "
"quando necessário\n"
"* *Através de Ordem de Entrega*: As faturas são geradas das ordens de "
"entrega (pickings)\n"
"* *Antes de Entrega*: Uma fatura pro-forma é criado e tem de ser liquidada "
"antes de efetuar a entrega\n"
#. module: base
#: field:ir.ui.menu,complete_name:0
@ -2198,7 +2291,7 @@ msgstr ""
#. module: base
#: view:base.language.export:0
msgid "PO(T) format: you should edit it with a PO editor such as"
msgstr ""
msgstr "Formato PO(T): deve editá-lo com um editor de PO tal como"
#. module: base
#: model:ir.ui.menu,name:base.menu_administration
@ -2287,7 +2380,7 @@ msgstr "Bahamas"
#. module: base
#: field:ir.rule,perm_create:0
msgid "Apply for Create"
msgstr ""
msgstr "Aplicar para Criar"
#. module: base
#: model:ir.module.category,name:base.module_category_tools
@ -2310,6 +2403,8 @@ msgid ""
"Appears by default on the top right corner of your printed documents (report "
"header)."
msgstr ""
"Aparece por defeito no campo superior direito dos documentos impressos "
"(cabeçalho do relatório)."
#. module: base
#: field:base.module.update,update:0
@ -2357,6 +2452,31 @@ msgid ""
"* Maximal difference between timesheet and attendances\n"
" "
msgstr ""
"\n"
"Gravar e validar folhas de horas e comparecimento/assiduidade com "
"facilidade\n"
"=====================================================\n"
"\n"
"Esta aplicação cria uma nova ecrã que permite gerir comparecimento (entradas "
"e saídas) e o preenchimento de folhas de horas por período. Entradas na "
"folha de horas são efetuadas pelos funcionários diariamente. No fim do "
"período estipulado, o funcionário valida a folha de horas. De seguida a "
"folha é sujeito a aprovação da gerente de equipa. A definição do tempo de "
"cada período é feito nas configurações da empresa e podem ser efetuados "
"mensalmente ou semanalmente.\n"
"\n"
"O processo de validação da folha de horas é feito assim:\n"
"---------------------------------------------\n"
"* Preencher folha (funcionário)\n"
"* Confirmar a folha no fim do período (funcionário)\n"
"* Validação da folha pelo gestor da equipa\n"
"\n"
"As preferências de validação podem ser escolhidos nas configurações da "
"empresa:\n"
"------------------------------------------------\n"
"Periodicidade (Dia, Semana, Mês)\n"
"Diferenciação máxima permitida entre a folha de horas e comparecimento\n"
" "
#. module: base
#: code:addons/base/ir/ir_fields.py:341
@ -2429,6 +2549,9 @@ msgid ""
"=================================\n"
" "
msgstr ""
"\n"
"Permite que um utilizador anónimo aceda ao portal.\n"
" "
#. module: base
#: model:res.country,name:base.ge
@ -2677,6 +2800,12 @@ msgid ""
"orders.\n"
" "
msgstr ""
"\n"
"O modulo base para gerir distribuição analítica e notas de encomenda.\n"
"=================================================================\n"
"\n"
"Este modulo permite ligar contas analíticas a notas de encomenda.\n"
" "
#. module: base
#: model:ir.module.module,description:base.module_l10n_us
@ -2817,6 +2946,9 @@ msgid ""
"Module to attach a google document to any model.\n"
"================================================\n"
msgstr ""
"\n"
"Módulo para anexar um documento google a qualquer modelo.\n"
"=========================================================\n"
#. module: base
#: code:addons/base/ir/ir_fields.py:333
@ -5010,7 +5142,7 @@ msgstr "ir.needaction_mixin"
#. module: base
#: view:base.language.export:0
msgid "This file was generated using the universal"
msgstr ""
msgstr "Este ficheiro foi gerado usando o universal"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_7
@ -5082,7 +5214,7 @@ msgstr "Saltar"
#. module: base
#: model:ir.module.module,shortdesc:base.module_event_sale
msgid "Events Sales"
msgstr ""
msgstr "Vendas dos Eventos"
#. module: base
#: model:res.country,name:base.ls
@ -5269,7 +5401,7 @@ msgstr "Apenas se a conta bancária pertencer à sua empresa"
#: code:addons/base/ir/ir_fields.py:337
#, python-format
msgid "Unknown sub-field '%s'"
msgstr ""
msgstr "Sub-campo '%s' desconhecido"
#. module: base
#: model:res.country,name:base.za
@ -5385,6 +5517,10 @@ msgid ""
"================\n"
"\n"
msgstr ""
"\n"
"Openerp Web API.\n"
"================\n"
"\n"
#. module: base
#: selection:res.request,state:0
@ -6154,6 +6290,8 @@ msgid ""
"How many times the method is called,\n"
"a negative number indicates no limit."
msgstr ""
"Quantas vezes o método é chamado,\n"
"um número negativo sem limite."
#. module: base
#: field:res.partner.bank.type.field,bank_type_id:0
@ -6280,7 +6418,7 @@ msgstr ""
#: code:addons/base/ir/ir_fields.py:182
#, python-format
msgid "'%s' does not seem to be a number for field '%%(field)s'"
msgstr ""
msgstr "'%s' não parece ser um número para o campo '%%(field)s'"
#. module: base
#: help:res.country.state,name:0
@ -8013,7 +8151,7 @@ msgstr "Campo Personalizado"
#. module: base
#: model:ir.module.module,summary:base.module_account_accountant
msgid "Financial and Analytic Accounting"
msgstr ""
msgstr "Contabilidade Financeira e Analítica"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_project
@ -8352,7 +8490,7 @@ msgstr "Finlândia"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_shortcuts
msgid "Web Shortcuts"
msgstr ""
msgstr "Atalhos web"
#. module: base
#: view:res.partner:0
@ -8558,6 +8696,8 @@ msgid ""
"Translation features are unavailable until you install an extra OpenERP "
"translation."
msgstr ""
"As opções de tradução estão indisponíveis até que instale uma tradução extra "
"do OpenERP."
#. module: base
#: model:ir.module.module,description:base.module_l10n_nl
@ -8752,6 +8892,9 @@ msgid ""
"If the selected language is loaded in the system, all documents related to "
"this contact will be printed in this language. If not, it will be English."
msgstr ""
"Se o idioma seleccionado está carregado no sistema, todos os documentos "
"relacionados com este contacto serão impressos neste idioma. Caso contrário "
"serão impressos em Inglês."
#. module: base
#: model:ir.module.module,description:base.module_hr_evaluation
@ -8860,7 +9003,7 @@ msgstr "Esloveno / slovenščina"
#. module: base
#: field:res.currency,position:0
msgid "Symbol Position"
msgstr ""
msgstr "Posição do Símbolo"
#. module: base
#: model:ir.module.module,description:base.module_l10n_de
@ -10007,7 +10150,7 @@ msgstr "Agrupar por..."
#. module: base
#: view:base.module.update:0
msgid "Module Update Result"
msgstr ""
msgstr "Resultado da actualização do módulo"
#. module: base
#: model:ir.module.module,description:base.module_analytic_contract_hr_expense
@ -10469,7 +10612,7 @@ msgstr ""
#. module: base
#: view:res.company:0
msgid "Click to set your company logo."
msgstr ""
msgstr "Clique para definir o logo da empresa."
#. module: base
#: view:res.lang:0
@ -10792,6 +10935,8 @@ msgid ""
"One of the documents you are trying to access has been deleted, please try "
"again after refreshing."
msgstr ""
"Um dos documentos a que tenta aceder foi removido, tente novamente depois de "
"actualizar."
#. module: base
#: model:ir.model,name:base.model_ir_mail_server
@ -11300,7 +11445,7 @@ msgstr "Ficheiro binário ou URL"
#: code:addons/base/ir/ir_fields.py:313
#, python-format
msgid "Invalid database id '%s' for the field '%%(field)s'"
msgstr ""
msgstr "Id de base de dados '%s' inválido para o campo '%%(field)s'"
#. module: base
#: view:res.lang:0
@ -11444,7 +11589,7 @@ msgstr ""
#. module: base
#: field:workflow.transition,signal:0
msgid "Signal (Button Name)"
msgstr ""
msgstr "Sinal (Nome do botão)"
#. module: base
#: view:ir.actions.act_window:0
@ -11819,7 +11964,7 @@ msgstr "ir.model.relation"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_check_writing
msgid "Check Writing"
msgstr ""
msgstr "Verificar escrita"
#. module: base
#: model:ir.module.module,description:base.module_plugin_outlook
@ -12387,7 +12532,7 @@ msgstr "Outros Parceiros"
#: view:workflow.workitem:0
#: field:workflow.workitem,state:0
msgid "Status"
msgstr ""
msgstr "Estado"
#. module: base
#: model:ir.actions.act_window,name:base.action_currency_form
@ -13376,7 +13521,7 @@ msgstr "ir.sequence.type"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_account
msgid "Belgium - Payroll with Accounting"
msgstr ""
msgstr "Bélgica - Folha de pagamentos com Contabildade"
#. module: base
#: selection:base.language.export,format:0
@ -15269,7 +15414,7 @@ msgstr "Chile"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_view_editor
msgid "View Editor"
msgstr ""
msgstr "Ver o Editor"
#. module: base
#: view:ir.cron:0
@ -15349,6 +15494,8 @@ msgid ""
"Do you confirm the uninstallation of this module? This will permanently "
"erase all data currently stored by the module!"
msgstr ""
"Confirma a desinstalação deste módulo? Esta acção apaga todos os dados "
"guardados neste momento por este módulo!"
#. module: base
#: field:ir.actions.server,mobile:0

File diff suppressed because it is too large Load Diff

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:40+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:23+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
"PO-Revision-Date: 2013-01-24 13:14+0000\n"
"PO-Revision-Date: 2013-08-16 11:16+0000\n"
"Last-Translator: Chertykov Denis <chertykov@gmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:41+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:23+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -3428,7 +3428,7 @@ msgstr "Периодические оценки, оценки, опросы"
#: model:ir.actions.act_window,name:base.ir_property_form
#: model:ir.ui.menu,name:base.menu_ir_property_form_all
msgid "Configuration Parameters"
msgstr "Конфигурационные параметры:"
msgstr "Параметры конфигурации"
#. module: base
#: constraint:ir.cron:0

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:41+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:23+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:41+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:24+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:33+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:16+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:41+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:23+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:46+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:28+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:42+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:24+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

File diff suppressed because it is too large Load Diff

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:42+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:24+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:42+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:25+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -2465,6 +2465,8 @@ msgstr ""
msgid ""
"No matching record found for %(field_type)s '%(value)s' in field '%%(field)s'"
msgstr ""
"'%%(field)s' Alanında %(field_type)s '%(value)s' için eşleşen kayıt "
"bulunamadı"
#. module: base
#: field:change.password.user,new_passwd:0
@ -7493,7 +7495,7 @@ msgstr "Tam Adı"
#. module: base
#: view:ir.attachment:0
msgid "on"
msgstr ""
msgstr "bunda"
#. module: base
#: view:ir.property:0
@ -9538,6 +9540,17 @@ msgid ""
"Thank you in advance for your cooperation.\n"
"Best Regards,"
msgstr ""
"Sayın Yetkili,\n"
"\n"
"Kayıtlarımıza göre hesabınızda halen yapılmamış ödemeler bulunmaktadır. "
"Lütfen aşağıdaki ayrıntıları inceleyin.\n"
"Eğer ödeme yaptıysanız, lütfen bu yazımızı dikkate almayın. Aksi durumda, "
"aşağıda belirtilen tutarı tarafımıza ödemenizi rica ederiz.\n"
"Hesabınızla ilgili herhangi bir sorunuz olursa, lütfen bize danışın.\n"
"\n"
"İşbirliğiniz için şimdiden teşekkür ederiz.\n"
"\n"
"Saygılarımızla,"
#. module: base
#: view:ir.module.category:0
@ -11262,7 +11275,7 @@ msgstr "E-Mail"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_12
msgid "Office Supplies"
msgstr ""
msgstr "Büro Malzemeleri"
#. module: base
#: field:ir.attachment,res_model:0
@ -12547,7 +12560,7 @@ msgstr "Grup adı tekil olmalı !"
#. module: base
#: help:ir.translation,module:0
msgid "Module this term belongs to"
msgstr ""
msgstr "Bu terimin ait olduğu modül"
#. module: base
#: model:ir.module.module,description:base.module_web_view_editor
@ -12761,6 +12774,8 @@ msgid ""
"Here is what we got instead:\n"
" %s"
msgstr ""
"Yerine elimize geçen:\n"
" %s"
#. module: base
#: model:ir.actions.act_window,name:base.action_model_data
@ -13124,7 +13139,7 @@ msgstr "Yeni Kaledonya"
#. module: base
#: field:ir.model,osv_memory:0
msgid "Transient Model"
msgstr ""
msgstr "Geçici Model"
#. module: base
#: model:res.country,name:base.cy
@ -13386,7 +13401,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_test
msgid "Accounting Consistency Tests"
msgstr ""
msgstr "Muhasebe Tutarlılık Testleri"
#. module: base
#: model:ir.module.module,description:base.module_purchase_double_validation
@ -14091,6 +14106,8 @@ msgid ""
"Invalid group_by specification: \"%s\".\n"
"A group_by specification must be a list of valid fields."
msgstr ""
"Geçersiz group_by özellikleri: \"%s\".\n"
"Bir group_by özellikler geçerli alanların bir listesi olmalı."
#. module: base
#: selection:ir.mail_server,smtp_encryption:0
@ -14248,7 +14265,7 @@ msgstr "Hata ! iç içe çağırılan menü oluşturamazsınız."
#. module: base
#: view:ir.translation:0
msgid "Web-only translations"
msgstr ""
msgstr "Yalnızca-web çevirileri"
#. module: base
#: view:ir.rule:0
@ -14716,6 +14733,10 @@ msgid ""
"\n"
"(Document type: %s, Operation: %s)"
msgstr ""
"Güvenlik sınırlamalarından dolayı istenen işlem tamamlanamıyor. Lütfen "
"sistem yöneticinize danışın.\n"
"\n"
"(Belge tipi: %s, İşlem: %s)"
#. module: base
#: model:ir.module.module,description:base.module_idea
@ -15574,6 +15595,8 @@ msgid ""
"Tax Identification Number. Check the box if this contact is subjected to "
"taxes. Used by the some of the legal statements."
msgstr ""
"Vergi Kimlik Numarası. Bu kişi vergiye tabiyse kutuyu işaretleyin. Bazı "
"yasal belgelerde kullanılır."
#. module: base
#: field:res.partner.bank,partner_id:0
@ -15642,6 +15665,8 @@ msgid ""
"Manage relations with prospects and customers using leads, opportunities, "
"requests or issues."
msgstr ""
"Adayları, fırsatları, istekleri ya da sorunları kullanarak potansiyeller ve "
"müşterilerle ilişkileri yönetin."
#. module: base
#: model:ir.module.module,description:base.module_project

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:43+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:25+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:43+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:25+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

File diff suppressed because it is too large Load Diff

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:45+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:27+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -25,7 +25,7 @@ msgid ""
" "
msgstr ""
"\n"
"此模块用于支票和支票打印\n"
"此模块用于支票填写和打印\n"
"================================================\n"
" "
@ -384,6 +384,12 @@ msgid ""
"document and Wiki based Hidden.\n"
" "
msgstr ""
"\n"
"知识管理的隐藏依赖模块\n"
"=====================================\n"
"\n"
"在安装文档管理和wiki等知识管理应用的时候所依赖的隐藏模块\n"
" "
#. module: base
#: model:ir.module.category,name:base.module_category_customer_relationship_management
@ -991,6 +997,21 @@ msgid ""
"also possible in order to automatically create a meeting when a holiday "
"request is accepted by setting up a type of meeting in Leave Type.\n"
msgstr ""
"\n"
"休假申请和假期分配\n"
"=====================================\n"
"\n"
"此模块管理公司员工的休假。员工可以申请休假,然后等待经理批准,当然也可能拒绝。这样就可以使公司或部门的整体休假计划得到管控。\n"
"\n"
"可以配置多种休假类型(病假、法定假日、带薪休假等)并通过分配申请分配给单个员工或部门。员工也可以申请\n"
"增加假期天数,这需要填写一个额外的假期申请。如果增加假期天数的申请被批准,这个类型假期的可用天数会自动增加。\n"
"\n"
"以下报表用于对假期进行跟踪:\n"
"* 休假总览\n"
"* 按部门休假\n"
"* 休假分析\n"
"\n"
"如果为休假设置了一种日程类型就可以与CRM中的日程同步也就是说休假批准后会在日程上标识出此员工正在休假中。\n"
#. module: base
#: selection:base.language.install,lang:0
@ -1216,6 +1237,20 @@ msgid ""
"* Planned Revenue by Stage and User (graph)\n"
"* Opportunities by Stage (graph)\n"
msgstr ""
"\n"
"通用客户关系管理CRM模块\n"
"====================================================\n"
"此模块能让群组人员合理有效地管理线索、商机、会谈以及电话访问等活动。\n"
"管理涉及的重要功能包括:通信、身份识别、优先级设定、任务委派、投诉解决及通知等。\n"
"OpenERP可以有效跟踪用户、客户和供应商的所有的活动案例。根据设定的规则可以自动发送提醒、请求触发各种动作。\n"
"最重要的好处是用户不需要做任何特殊的事。此模块集成了电子邮件网关邮件在OpenERP中自动同步用户只需在OpenERP中根据系统反馈按需发送和回复"
"邮件。\n"
"OpenERP将接管其余的事诸如发送感谢信、自动转发到相关人员并确保之后相应的回复能准确送达。\n"
"\n"
"CRM 仪表盘Dashboard 包括:\n"
"---------------------------------------\n"
"* 可按阶段和用户分类的预计收益图表\n"
"* 按阶段分类的商机图表\n"
#. module: base
#: selection:base.language.export,format:0
@ -1991,15 +2026,13 @@ msgid ""
"rights to the Demo user. \n"
msgstr ""
"\n"
"会计访问权限\n"
"会计访问权限管理\n"
"\n"
"========================\n"
"\n"
"It gives the Administrator user access to all accounting features such as "
"journal items and the chart of accounts.\n"
"此模块用来管理所有会计功能的访问权限如凭证行归类journal items和会计科目chart of accounts等。\n"
"\n"
"It assigns manager and user access rights to the Administrator and only user "
"rights to the Demo user。 \n"
"默认设置管理员Administrator拥有经理和一般用户的访问权限而演示用户Demo user仅拥有一般用户的权限。 \n"
#. module: base
#: view:ir.sequence:0
@ -2059,7 +2092,7 @@ msgstr "读权限"
#. module: base
#: help:ir.attachment,res_id:0
msgid "The record id this is attached to"
msgstr ""
msgstr "附件相关的数据记录id"
#. module: base
#: model:ir.module.module,description:base.module_share
@ -2160,6 +2193,11 @@ msgid ""
"with the effect of creating, editing and deleting either ways.\n"
" "
msgstr ""
"\n"
"项目进度与工时记录的集成\n"
"====================================================================\n"
"安装了此模块,项目进度的添加删除和修改会自动同步到工时表上。\n"
" "
#. module: base
#: model:ir.model,name:base.model_ir_model_access
@ -2179,6 +2217,11 @@ msgid ""
" templates to target objects.\n"
" "
msgstr ""
"\n"
" * 科目表、税、税项、凭证类型、科目模版、成本要素和成本凭证类型的多语言支持。\n"
" * 对设置向导的修改\n"
" - 从模版复制科目表、税、税项和替换规则到目标数据表。\n"
" "
#. module: base
#: field:workflow.transition,act_from:0
@ -2934,6 +2977,36 @@ msgid ""
"* Monthly Turnover (Graph)\n"
" "
msgstr ""
"\n"
"报价单和销售订单管理\n"
"==================================\n"
"此模块用来有效记录和跟踪所有销售订单及其历史,从而有效管理你的销售目标。\n"
"\n"
"整个销售流程包括:\n"
"\n"
"* **报价单** -> **销售订单** -> **发票**\n"
"\n"
"参数设置(仅在安装了仓库管理模块的情况下):\n"
"------------------------------------------------------\n"
"\n"
"如果安装了仓库管理模块,您可以设置以下参数:\n"
"\n"
"* 发货:选择一次性发货或部分发货\n"
"* 发票:选择发票是如何被支付\n"
"* Incoterms选择所使用的国际贸易术语\n"
"\n"
"您可以选择灵活的开票方式:\n"
"\n"
"* *按需开具*:需要时,手动从销售订单开具发票\n"
"* *按发货单*:按发货单自动生成发票\n"
"* *发运前*:先创建发票草稿,待支付后发货\n"
"\n"
"\n"
"销售经理的仪表盘Dashboard包括\n"
"------------------------------------------------\n"
"* 我的报价单\n"
"* 月成交量(图表)\n"
" "
#. module: base
#: field:ir.actions.act_window,res_id:0
@ -8779,6 +8852,13 @@ msgid ""
"\n"
"Notes can be found in the 'Home' menu.\n"
msgstr ""
"\n"
"此模块能让用户在OpenERP中创建他们自己的笔记Notes\n"
"=================================================================\n"
"Notes可用来记录会议纪要、即时的想法和创意、个人待办事项等等。每个用户管理其自己的个人笔记。笔记只能由创建者自己看到但可通过分享笔记给其它用户以便"
"多人协作实时更新同一笔记。这对诸如分享会议纪要等十分有效。\n"
"\n"
"Notes菜单可在“消息”菜单中找到\n"
#. module: base
#: model:res.country,name:base.dm
@ -11918,7 +11998,7 @@ msgstr "ir.model.relation"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_check_writing
msgid "Check Writing"
msgstr "检查写作"
msgstr "支票填写"
#. module: base
#: model:ir.module.module,description:base.module_plugin_outlook
@ -12355,7 +12435,7 @@ msgstr "选中内容"
#: model:ir.actions.act_window,name:base.change_password_wizard_action
#: view:res.users:0
msgid "Change Password"
msgstr ""
msgstr "更改密码"
#. module: base
#: model:ir.module.module,description:base.module_l10n_es
@ -12665,7 +12745,7 @@ msgstr "地址格式"
#. module: base
#: model:ir.model,name:base.model_change_password_user
msgid "Change Password Wizard User"
msgstr ""
msgstr "密码更改向导"
#. module: base
#: model:res.groups,name:base.group_no_one
@ -13458,7 +13538,7 @@ msgstr "ir.sequence.type"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_account
msgid "Belgium - Payroll with Accounting"
msgstr ""
msgstr "比利时 - 工资与会计"
#. module: base
#: selection:base.language.export,format:0
@ -14304,7 +14384,7 @@ msgstr "泰国"
#. module: base
#: model:ir.model,name:base.model_change_password_wizard
msgid "Change Password Wizard"
msgstr ""
msgstr "密码更改向导"
#. module: base
#: model:ir.module.module,summary:base.module_account_voucher
@ -15618,7 +15698,7 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "Internal Notes"
msgstr "内部单据"
msgstr "内部备注"
#. module: base
#: model:res.partner.title,name:base.res_partner_title_pvt_ltd
@ -15639,7 +15719,7 @@ msgstr "行内编辑"
#. module: base
#: selection:ir.cron,interval_type:0
msgid "Months"
msgstr "月"
msgstr "月"
#. module: base
#: view:workflow.instance:0
@ -15662,7 +15742,7 @@ msgstr "是一个公司?"
#: field:res.partner.bank,name:0
#, python-format
msgid "Bank Account"
msgstr "银行账"
msgstr "银行账"
#. module: base
#: model:res.country,name:base.kp

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:43+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:25+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-06-18 05:45+0000\n"
"X-Generator: Launchpad (build 16673)\n"
"X-Launchpad-Export-Date: 2013-09-06 05:27+0000\n"
"X-Generator: Launchpad (build 16760)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -19,20 +19,20 @@
#
##############################################################################
from functools import partial
import logging
import operator
import os
import re
from socket import gethostname
import time
import openerp
from openerp import SUPERUSER_ID
from openerp import tools
from openerp import workflow
from openerp.osv import fields, osv
from openerp.osv.orm import browse_record
import openerp.report.interface
from openerp.report.report_sxw import report_sxw, report_rml
from openerp.tools.config import config
from openerp.tools.safe_eval import safe_eval as eval
from openerp.tools.translate import _
import openerp.workflow
@ -429,121 +429,177 @@ class server_object_lines(osv.osv):
_name = 'ir.server.object.lines'
_sequence = 'ir_actions_id_seq'
_columns = {
'server_id': fields.many2one('ir.actions.server', 'Object Mapping'),
'col1': fields.many2one('ir.model.fields', 'Destination', required=True),
'server_id': fields.many2one('ir.actions.server', 'Related Server Action'),
'col1': fields.many2one('ir.model.fields', 'Field', required=True),
'value': fields.text('Value', required=True, help="Expression containing a value specification. \n"
"When Formula type is selected, this field may be a Python expression "
" that can use the same values as for the condition field on the server action.\n"
"If Value type is selected, the value will be used directly without evaluation."),
'type': fields.selection([
('value','Value'),
('equation','Formula')
], 'Type', required=True, size=32, change_default=True),
('value', 'Value'),
('equation', 'Python expression')
], 'Evaluation Type', required=True, change_default=True),
}
_defaults = {
'type': 'equation',
'type': 'value',
}
server_object_lines()
##
# Actions that are run on the server side
#
class actions_server(osv.osv):
""" Server actions model. Server action work on a base model and offer various
type of actions that can be executed automatically, for example using base
action rules, of manually, by adding the action in the 'More' contextual
menu.
def _select_signals(self, cr, uid, context=None):
cr.execute("""SELECT distinct w.osv, t.signal FROM wkf w, wkf_activity a, wkf_transition t
WHERE w.id = a.wkf_id AND
(t.act_from = a.id OR t.act_to = a.id) AND
t.signal IS NOT NULL""")
result = cr.fetchall() or []
res = []
for rs in result:
if rs[0] is not None and rs[1] is not None:
line = rs[1], "%s - (%s)" % (rs[1], rs[0])
res.append(line)
return res
Since OpenERP 8.0 a button 'Create Menu Action' button is available on the
action form view. It creates an entry in the More menu of the base model.
This allows to create server actions and run them in mass mode easily through
the interface.
def _select_objects(self, cr, uid, context=None):
model_pool = self.pool.get('ir.model')
ids = model_pool.search(cr, uid, [('name','not ilike','.')])
res = model_pool.read(cr, uid, ids, ['model', 'name'])
return [(r['model'], r['name']) for r in res] + [('','')]
def change_object(self, cr, uid, ids, copy_object, state, context=None):
if state == 'object_copy' and copy_object:
if context is None:
context = {}
model_pool = self.pool.get('ir.model')
model = copy_object.split(',')[0]
mid = model_pool.search(cr, uid, [('model','=',model)])
return {
'value': {'srcmodel_id': mid[0]},
'context': context
}
else:
return {}
The available actions are :
- 'Execute Python Code': a block of python code that will be executed
- 'Trigger a Workflow Signal': send a signal to a workflow
- 'Run a Client Action': choose a client action to launch
- 'Create or Copy a new Record': create a new record with new values, or
copy an existing record in your database
- 'Write on a Record': update the values of a record
- 'Execute several actions': define an action that triggers several other
server actions
"""
_name = 'ir.actions.server'
_table = 'ir_act_server'
_inherit = 'ir.actions.actions'
_sequence = 'ir_actions_id_seq'
_order = 'sequence,name'
def _select_objects(self, cr, uid, context=None):
model_pool = self.pool.get('ir.model')
ids = model_pool.search(cr, uid, [('name', 'not ilike', '.')])
res = model_pool.read(cr, uid, ids, ['model', 'name'])
return [(r['model'], r['name']) for r in res] + [('', '')]
def _get_states(self, cr, uid, context=None):
""" Override me in order to add new states in the server action. Please
note that the added key length should not be higher than already-existing
ones. """
return [('code', 'Execute Python Code'),
('trigger', 'Trigger a Workflow Signal'),
('client_action', 'Run a Client Action'),
('object_create', 'Create or Copy a new Record'),
('object_write', 'Write on a Record'),
('multi', 'Execute several actions')]
def _get_states_wrapper(self, cr, uid, context=None):
return self._get_states(cr, uid, context)
_columns = {
'name': fields.char('Action Name', required=True, size=64, translate=True),
'condition' : fields.char('Condition', size=256, required=True,
help="Condition that is tested before the action is executed, "
"and prevent execution if it is not verified.\n"
"Example: object.list_price > 5000\n"
"It is a Python expression that can use the following values:\n"
" - self: ORM model of the record on which the action is triggered\n"
" - object or obj: browse_record of the record on which the action is triggered\n"
" - pool: ORM model pool (i.e. self.pool)\n"
" - time: Python time module\n"
" - cr: database cursor\n"
" - uid: current user id\n"
" - context: current context"),
'state': fields.selection([
('client_action','Client Action'),
('dummy','Dummy'),
('loop','Iteration'),
('code','Python Code'),
('trigger','Trigger'),
('email','Email'),
('sms','SMS'),
('object_create','Create Object'),
('object_copy','Copy Object'),
('object_write','Write Object'),
('other','Multi Actions'),
], 'Action Type', required=True, size=32, help="Type of the Action that is to be executed"),
'code':fields.text('Python Code', help="Python code to be executed if condition is met.\n"
"It is a Python block that can use the same values as for the condition field"),
'sequence': fields.integer('Sequence', help="Important when you deal with multiple actions, the execution order will be decided based on this, low number is higher priority."),
'model_id': fields.many2one('ir.model', 'Object', required=True, help="Select the object on which the action will work (read, write, create).", ondelete='cascade'),
'action_id': fields.many2one('ir.actions.actions', 'Client Action', help="Select the Action Window, Report, Wizard to be executed."),
'trigger_name': fields.selection(_select_signals, string='Trigger Signal', size=128, help="The workflow signal to trigger"),
'wkf_model_id': fields.many2one('ir.model', 'Target Object', help="The object that should receive the workflow signal (must have an associated workflow)"),
'trigger_obj_id': fields.many2one('ir.model.fields','Relation Field', help="The field on the current object that links to the target object record (must be a many2one, or an integer field with the record ID)"),
'email': fields.char('Email Address', size=512, help="Expression that returns the email address to send to. Can be based on the same values as for the condition field.\n"
"Example: object.invoice_address_id.email, or 'me@example.com'"),
'subject': fields.char('Subject', size=1024, translate=True, help="Email subject, may contain expressions enclosed in double brackets based on the same values as those "
"available in the condition field, e.g. `Hello [[ object.partner_id.name ]]`"),
'message': fields.text('Message', translate=True, help="Email contents, may contain expressions enclosed in double brackets based on the same values as those "
"available in the condition field, e.g. `Dear [[ object.partner_id.name ]]`"),
'mobile': fields.char('Mobile No', size=512, help="Provides fields that be used to fetch the mobile number, e.g. you select the invoice, then `object.invoice_address_id.mobile` is the field which gives the correct mobile number"),
'sms': fields.char('SMS', size=160, translate=True),
'child_ids': fields.many2many('ir.actions.server', 'rel_server_actions', 'server_id', 'action_id', 'Other Actions'),
'condition': fields.char('Condition',
help="Condition verified before executing the server action. If it "
"is not verified, the action will not be executed. The condition is "
"a Python expression, like 'object.list_price > 5000'. A void "
"condition is considered as always True. Help about python expression "
"is given in the help tab."),
'state': fields.selection(_get_states_wrapper, 'Action To Do', required=True,
help="Type of server action. The following values are available:\n"
"- 'Execute Python Code': a block of python code that will be executed\n"
"- 'Trigger a Workflow Signal': send a signal to a workflow\n"
"- 'Run a Client Action': choose a client action to launch\n"
"- 'Create or Copy a new Record': create a new record with new values, or copy an existing record in your database\n"
"- 'Write on a Record': update the values of a record\n"
"- 'Execute several actions': define an action that triggers several other server actions\n"
"- 'Send Email': automatically send an email (available in email_template)"),
'usage': fields.char('Action Usage', size=32),
'type': fields.char('Action Type', size=32, required=True),
'srcmodel_id': fields.many2one('ir.model', 'Model', help="Object in which you want to create / write the object. If it is empty then refer to the Object field."),
'fields_lines': fields.one2many('ir.server.object.lines', 'server_id', 'Field Mappings.'),
'record_id':fields.many2one('ir.model.fields', 'Create Id', help="Provide the field name where the record id is stored after the create operations. If it is empty, you can not track the new record."),
'write_id':fields.char('Write Id', size=256, help="Provide the field name that the record id refers to for the write operation. If it is empty it will refer to the active id of the object."),
'loop_action':fields.many2one('ir.actions.server', 'Loop Action', help="Select the action that will be executed. Loop action will not be avaliable inside loop."),
'expression':fields.char('Loop Expression', size=512, help="Enter the field/expression that will return the list. E.g. select the sale order in Object, and you can have loop on the sales order line. Expression = `object.order_line`."),
'copy_object': fields.reference('Copy Of', selection=_select_objects, size=256),
# Generic
'sequence': fields.integer('Sequence',
help="When dealing with multiple actions, the execution order is "
"based on the sequence. Low number means high priority."),
'model_id': fields.many2one('ir.model', 'Base Model', required=True, ondelete='cascade',
help="Base model on which the server action runs."),
'menu_ir_values_id': fields.many2one('ir.values', 'More Menu entry', readonly=True,
help='More menu entry.'),
# Client Action
'action_id': fields.many2one('ir.actions.actions', 'Client Action',
help="Select the client action that has to be executed."),
# Python code
'code': fields.text('Python Code',
help="Write Python code that the action will execute. Some variables are "
"available for use; help about pyhon expression is given in the help tab."),
# Workflow signal
'use_relational_model': fields.selection([('base', 'Use the base model of the action'),
('relational', 'Use a relation field on the base model')],
string='Target Model', required=True),
'wkf_transition_id': fields.many2one('workflow.transition', string='Signal to Trigger',
help="Select the workflow signal to trigger."),
'wkf_model_id': fields.many2one('ir.model', 'Target Model',
help="The model that will receive the workflow signal. Note that it should have a workflow associated with it."),
'wkf_model_name': fields.related('wkf_model_id', 'model', type='char', string='Target Model Name', store=True, readonly=True),
'wkf_field_id': fields.many2one('ir.model.fields', string='Relation Field',
oldname='trigger_obj_id',
help="The field on the current object that links to the target object record (must be a many2one, or an integer field with the record ID)"),
# Multi
'child_ids': fields.many2many('ir.actions.server', 'rel_server_actions',
'server_id', 'action_id',
string='Child Actions',
help='Child server actions that will be executed. Note that the last return returned action value will be used as global return value.'),
# Create/Copy/Write
'use_create': fields.selection([('new', 'Create a new record in the Base Model'),
('new_other', 'Create a new record in another model'),
('copy_current', 'Copy the current record'),
('copy_other', 'Choose and copy a record in the database')],
string="Creation Policy", required=True,
help=""),
'crud_model_id': fields.many2one('ir.model', 'Target Model',
oldname='srcmodel_id',
help="Model for record creation / update. Set this field only to specify a different model than the base model."),
'crud_model_name': fields.related('crud_model_id', 'model', type='char',
string='Create/Write Target Model Name',
store=True, readonly=True),
'ref_object': fields.reference('Reference record', selection=_select_objects, size=128,
oldname='copy_object'),
'link_new_record': fields.boolean('Attach the new record',
help="Check this if you want to link the newly-created record "
"to the current record on which the server action runs."),
'link_field_id': fields.many2one('ir.model.fields', 'Link using field',
oldname='record_id',
help="Provide the field where the record id is stored after the operations."),
'use_write': fields.selection([('current', 'Update the current record'),
('expression', 'Update a record linked to the current record using python'),
('other', 'Choose and Update a record in the database')],
string='Update Policy', required=True,
help=""),
'write_expression': fields.char('Expression',
oldname='write_id',
help="Provide an expression that, applied on the current record, gives the field to update."),
'fields_lines': fields.one2many('ir.server.object.lines', 'server_id',
string='Value Mapping',
help=""),
# Fake fields used to implement the placeholder assistant
'model_object_field': fields.many2one('ir.model.fields', string="Field",
help="Select target field from the related document model.\n"
"If it is a relationship field you will be able to select "
"a target field at the destination of the relationship."),
'sub_object': fields.many2one('ir.model', 'Sub-model', readonly=True,
help="When a relationship field is selected as first field, "
"this field shows the document model the relationship goes to."),
'sub_model_object_field': fields.many2one('ir.model.fields', 'Sub-field',
help="When a relationship field is selected as first field, "
"this field lets you select the target field within the "
"destination document model (sub-model)."),
'copyvalue': fields.char('Placeholder Expression', help="Final placeholder expression, to be copy-pasted in the desired template field."),
# Fake fields used to implement the ID finding assistant
'id_object': fields.reference('Record', selection=_select_objects, size=128),
'id_value': fields.char('Record ID'),
}
_defaults = {
'state': 'dummy',
'state': 'code',
'condition': 'True',
'type': 'ir.actions.server',
'sequence': 5,
@ -551,246 +607,427 @@ class actions_server(osv.osv):
# - self: ORM model of the record on which the action is triggered
# - object: browse_record of the record on which the action is triggered if there is one, otherwise None
# - pool: ORM model pool (i.e. self.pool)
# - time: Python time module
# - cr: database cursor
# - uid: current user id
# - context: current context
# If you plan to return an action, assign: action = {...}
""",
# - time: Python time module
# If you plan to return an action, assign: action = {...}""",
'use_relational_model': 'base',
'use_create': 'new',
'use_write': 'current',
}
def get_email(self, cr, uid, action, context):
def _check_expression(self, cr, uid, expression, model_id, context):
""" Check python expression (condition, write_expression). Each step of
the path must be a valid many2one field, or an integer field for the last
step.
:param str expression: a python expression, beginning by 'obj' or 'object'
:param int model_id: the base model of the server action
:returns tuple: (is_valid, target_model_name, error_msg)
"""
if not model_id:
return (False, None, 'Your expression cannot be validated because the Base Model is not set.')
# fetch current model
current_model_name = self.pool.get('ir.model').browse(cr, uid, model_id, context).model
# transform expression into a path that should look like 'object.many2onefield.many2onefield'
path = expression.split('.')
initial = path.pop(0)
if initial not in ['obj', 'object']:
return (False, None, 'Your expression should begin with obj or object.\nAn expression builder is available in the help tab.')
# analyze path
while path:
step = path.pop(0)
column_info = self.pool[current_model_name]._all_columns.get(step)
if not column_info:
return (False, None, 'Part of the expression (%s) is not recognized as a column in the model %s.' % (step, current_model_name))
column_type = column_info.column._type
if column_type not in ['many2one', 'int']:
return (False, None, 'Part of the expression (%s) is not a valid column type (is %s, should be a many2one or an int)' % (step, column_type))
if column_type == 'int' and path:
return (False, None, 'Part of the expression (%s) is an integer field that is only allowed at the end of an expression' % (step))
if column_type == 'many2one':
current_model_name = column_info.column._obj
return (True, current_model_name, None)
def _check_write_expression(self, cr, uid, ids, context=None):
for record in self.browse(cr, uid, ids, context=context):
if record.write_expression and record.model_id:
correct, model_name, message = self._check_expression(cr, uid, record.write_expression, record.model_id.id, context=context)
if not correct:
_logger.warning('Invalid expression: %s' % message)
return False
return True
_constraints = [
(_check_write_expression,
'Incorrect Write Record Expression',
['write_expression']),
(partial(osv.Model._check_m2m_recursion, field_name='child_ids'),
'Recursion found in child server actions',
['child_ids']),
]
def on_change_model_id(self, cr, uid, ids, model_id, wkf_model_id, crud_model_id, context=None):
""" When changing the action base model, reset workflow and crud config
to ease value coherence. """
values = {
'use_create': 'new',
'use_write': 'current',
'use_relational_model': 'base',
'wkf_model_id': model_id,
'wkf_field_id': False,
'crud_model_id': model_id,
}
return {'value': values}
def on_change_wkf_wonfig(self, cr, uid, ids, use_relational_model, wkf_field_id, wkf_model_id, model_id, context=None):
""" Update workflow type configuration
- update the workflow model (for base (model_id) /relational (field.relation))
- update wkf_transition_id to False if workflow model changes, to force
the user to choose a new one
"""
values = {}
if use_relational_model == 'relational' and wkf_field_id:
field = self.pool['ir.model.fields'].browse(cr, uid, wkf_field_id, context=context)
new_wkf_model_id = self.pool.get('ir.model').search(cr, uid, [('model', '=', field.relation)], context=context)[0]
values['wkf_model_id'] = new_wkf_model_id
else:
values['wkf_model_id'] = model_id
return {'value': values}
def on_change_wkf_model_id(self, cr, uid, ids, wkf_model_id, context=None):
""" When changing the workflow model, update its stored name also """
wkf_model_name = False
if wkf_model_id:
wkf_model_name = self.pool.get('ir.model').browse(cr, uid, wkf_model_id, context).model
values = {'wkf_transition_id': False, 'wkf_model_name': wkf_model_name}
return {'value': values}
def on_change_crud_config(self, cr, uid, ids, state, use_create, use_write, ref_object, crud_model_id, model_id, context=None):
""" Wrapper on CRUD-type (create or write) on_change """
if state == 'object_create':
return self.on_change_create_config(cr, uid, ids, use_create, ref_object, crud_model_id, model_id, context=context)
elif state == 'object_write':
return self.on_change_write_config(cr, uid, ids, use_write, ref_object, crud_model_id, model_id, context=context)
else:
return {}
def on_change_create_config(self, cr, uid, ids, use_create, ref_object, crud_model_id, model_id, context=None):
""" When changing the object_create type configuration:
- `new` and `copy_current`: crud_model_id is the same as base model
- `new_other`: user choose crud_model_id
- `copy_other`: disassemble the reference object to have its model
- if the target model has changed, then reset the link field that is
probably not correct anymore
"""
values = {}
if use_create == 'new':
values['crud_model_id'] = model_id
elif use_create == 'new_other':
pass
elif use_create == 'copy_current':
values['crud_model_id'] = model_id
elif use_create == 'copy_other' and ref_object:
ref_model, ref_id = ref_object.split(',')
ref_model_id = self.pool['ir.model'].search(cr, uid, [('model', '=', ref_model)], context=context)[0]
values['crud_model_id'] = ref_model_id
if values.get('crud_model_id') != crud_model_id:
values['link_field_id'] = False
return {'value': values}
def on_change_write_config(self, cr, uid, ids, use_write, ref_object, crud_model_id, model_id, context=None):
""" When changing the object_write type configuration:
- `current`: crud_model_id is the same as base model
- `other`: disassemble the reference object to have its model
- `expression`: has its own on_change, nothing special here
"""
values = {}
if use_write == 'current':
values['crud_model_id'] = model_id
elif use_write == 'other' and ref_object:
ref_model, ref_id = ref_object.split(',')
ref_model_id = self.pool['ir.model'].search(cr, uid, [('model', '=', ref_model)], context=context)[0]
values['crud_model_id'] = ref_model_id
elif use_write == 'expression':
pass
if values.get('crud_model_id') != crud_model_id:
values['link_field_id'] = False
return {'value': values}
def on_change_write_expression(self, cr, uid, ids, write_expression, model_id, context=None):
""" Check the write_expression and update crud_model_id accordingly """
values = {}
valid, model_name, message = self._check_expression(cr, uid, write_expression, model_id, context=context)
if valid:
ref_model_id = self.pool['ir.model'].search(cr, uid, [('model', '=', model_name)], context=context)[0]
values['crud_model_id'] = ref_model_id
return {'value': values}
if not message:
message = 'Invalid expression'
return {
'warning': {
'title': 'Incorrect expression',
'message': message,
}
}
def on_change_crud_model_id(self, cr, uid, ids, crud_model_id, context=None):
""" When changing the CRUD model, update its stored name also """
crud_model_name = False
if crud_model_id:
crud_model_name = self.pool.get('ir.model').browse(cr, uid, crud_model_id, context).model
values = {'link_field_id': False, 'crud_model_name': crud_model_name}
return {'value': values}
def _build_expression(self, field_name, sub_field_name):
""" Returns a placeholder expression for use in a template field,
based on the values provided in the placeholder assistant.
:param field_name: main field name
:param sub_field_name: sub field name (M2O)
:return: final placeholder expression
"""
expression = ''
if field_name:
expression = "object." + field_name
if sub_field_name:
expression += "." + sub_field_name
return expression
def onchange_sub_model_object_value_field(self, cr, uid, ids, model_object_field, sub_model_object_field=False, context=None):
result = {
'sub_object': False,
'copyvalue': False,
'sub_model_object_field': False,
}
if model_object_field:
fields_obj = self.pool.get('ir.model.fields')
field_value = fields_obj.browse(cr, uid, model_object_field, context)
if field_value.ttype in ['many2one', 'one2many', 'many2many']:
res_ids = self.pool.get('ir.model').search(cr, uid, [('model', '=', field_value.relation)], context=context)
sub_field_value = False
if sub_model_object_field:
sub_field_value = fields_obj.browse(cr, uid, sub_model_object_field, context)
if res_ids:
result.update({
'sub_object': res_ids[0],
'copyvalue': self._build_expression(field_value.name, sub_field_value and sub_field_value.name or False),
'sub_model_object_field': sub_model_object_field or False,
})
else:
result.update({
'copyvalue': self._build_expression(field_value.name, False),
})
return {'value': result}
def onchange_id_object(self, cr, uid, ids, id_object, context=None):
if id_object:
ref_model, ref_id = id_object.split(',')
return {'value': {'id_value': ref_id}}
return {'value': {'id_value': False}}
def create_action(self, cr, uid, ids, context=None):
""" Create a contextual action for each of the server actions. """
for action in self.browse(cr, uid, ids, context=context):
ir_values_id = self.pool.get('ir.values').create(cr, SUPERUSER_ID, {
'name': _('Run %s') % action.name,
'model': action.model_id.model,
'key2': 'client_action_multi',
'value': "ir.actions.server,%s" % action.id,
}, context)
action.write({
'menu_ir_values_id': ir_values_id,
})
return True
def unlink_action(self, cr, uid, ids, context=None):
""" Remove the contextual actions created for the server actions. """
for action in self.browse(cr, uid, ids, context=context):
if action.menu_ir_values_id:
try:
self.pool.get('ir.values').unlink(cr, SUPERUSER_ID, action.menu_ir_values_id.id, context)
except Exception:
raise osv.except_osv(_('Warning'), _('Deletion of the action record failed.'))
return True
def run_action_client_action(self, cr, uid, action, eval_context=None, context=None):
if not action.action_id:
raise osv.except_osv(_('Error'), _("Please specify an action to launch!"))
return self.pool[action.action_id.type].read(cr, uid, action.action_id.id, context=context)
def run_action_code(self, cr, uid, action, eval_context=None, context=None):
eval(action.code.strip(), eval_context, mode="exec", nocopy=True) # nocopy allows to return 'action'
if 'action' in eval_context:
return eval_context['action']
def run_action_trigger(self, cr, uid, action, eval_context=None, context=None):
""" Trigger a workflow signal, depending on the use_relational_model:
- `base`: base_model_pool.signal_<TRIGGER_NAME>(cr, uid, context.get('active_id'))
- `relational`: find the related model and object, using the relational
field, then target_model_pool.signal_<TRIGGER_NAME>(cr, uid, target_id)
"""
obj_pool = self.pool[action.model_id.model]
id = context.get('active_id')
obj = obj_pool.browse(cr, uid, id)
if action.use_relational_model == 'base':
target_id = context.get('active_id')
target_pool = obj_pool
else:
value = getattr(obj_pool.browse(cr, uid, context.get('active_id'), context=context), action.wkf_field_id.name)
if action.wkf_field_id.ttype == 'many2one':
target_id = value.id
else:
target_id = value
target_pool = self.pool[action.wkf_model_id.model]
fields = None
trigger_name = action.wkf_transition_id.signal
if '/' in action.email.complete_name:
fields = action.email.complete_name.split('/')
elif '.' in action.email.complete_name:
fields = action.email.complete_name.split('.')
workflow.trg_validate(uid, target_pool._name, target_id, trigger_name, cr)
for field in fields:
try:
obj = getattr(obj, field)
except Exception:
_logger.exception('Failed to parse: %s', field)
def run_action_multi(self, cr, uid, action, eval_context=None, context=None):
res = []
for act in action.child_ids:
result = self.run(cr, uid, [act.id], context)
if result:
res.append(result)
return res and res[0] or False
return obj
def run_action_object_write(self, cr, uid, action, eval_context=None, context=None):
""" Write server action.
def get_mobile(self, cr, uid, action, context):
obj_pool = self.pool[action.model_id.model]
id = context.get('active_id')
obj = obj_pool.browse(cr, uid, id)
- 1. evaluate the value mapping
- 2. depending on the write configuration:
fields = None
- `current`: id = active_id
- `other`: id = from reference object
- `expression`: id = from expression evaluation
"""
res = {}
for exp in action.fields_lines:
if exp.type == 'equation':
expr = eval(exp.value, eval_context)
else:
expr = exp.value
res[exp.col1.name] = expr
if '/' in action.mobile.complete_name:
fields = action.mobile.complete_name.split('/')
elif '.' in action.mobile.complete_name:
fields = action.mobile.complete_name.split('.')
if action.use_write == 'current':
model = action.model_id.model
ref_id = context.get('active_id')
elif action.use_write == 'other':
model = action.crud_model_id.model
ref_id = action.ref_object.id
elif action.use_write == 'expression':
model = action.crud_model_id.model
ref = eval(action.write_expression, eval_context)
if isinstance(ref, browse_record):
ref_id = getattr(ref, 'id')
else:
ref_id = int(ref)
for field in fields:
try:
obj = getattr(obj, field)
except Exception:
_logger.exception('Failed to parse: %s', field)
obj_pool = self.pool[model]
obj_pool.write(cr, uid, [ref_id], res, context=context)
return obj
def run_action_object_create(self, cr, uid, action, eval_context=None, context=None):
""" Create and Copy server action.
def merge_message(self, cr, uid, keystr, action, context=None):
if context is None:
context = {}
- 1. evaluate the value mapping
- 2. depending on the write configuration:
def merge(match):
obj_pool = self.pool[action.model_id.model]
id = context.get('active_id')
obj = obj_pool.browse(cr, uid, id)
exp = str(match.group()[2:-2]).strip()
result = eval(exp,
{
'object': obj,
'context': dict(context), # copy context to prevent side-effects of eval
'time': time,
})
if result in (None, False):
return str("--------")
return tools.ustr(result)
- `new`: new record in the base model
- `copy_current`: copy the current record (id = active_id) + gives custom values
- `new_other`: new record in target model
- `copy_other`: copy the current record (id from reference object)
+ gives custom values
"""
res = {}
for exp in action.fields_lines:
if exp.type == 'equation':
expr = eval(exp.value, eval_context)
else:
expr = exp.value
res[exp.col1.name] = expr
com = re.compile('(\[\[.+?\]\])')
message = com.sub(merge, keystr)
if action.use_create in ['new', 'copy_current']:
model = action.model_id.model
elif action.use_create in ['new_other', 'copy_other']:
model = action.crud_model_id.model
return message
obj_pool = self.pool[model]
if action.use_create == 'copy_current':
ref_id = context.get('active_id')
res_id = obj_pool.copy(cr, uid, ref_id, res, context=context)
elif action.use_create == 'copy_other':
ref_id = action.ref_object.id
res_id = obj_pool.copy(cr, uid, ref_id, res, context=context)
else:
res_id = obj_pool.create(cr, uid, res, context=context)
# Context should contains:
# ids : original ids
# id : current id of the object
# OUT:
# False : Finished correctly
# ACTION_ID : Action to launch
if action.link_new_record and action.link_field_id:
self.pool[action.model_id.model].write(cr, uid, [context.get('active_id')], {action.link_field_id.name: res_id})
# FIXME: refactor all the eval() calls in run()!
def run(self, cr, uid, ids, context=None):
""" Run the server action. For each server action, the condition is
checked. Note that A void (aka False) condition is considered as always
valid. If it is verified, the run_action_<STATE> method is called. This
allows easy inheritance of the server actions.
:param dict context: context should contain following keys
- active_id: id of the current object (single mode)
- active_model: current model that should equal the action's model
The following keys are optional:
- active_ids: ids of the current records (mass mode). If active_ids
and active_id are present, active_ids is given precedence.
:return: an action_id to be executed, or False is finished correctly without
return action
"""
if context is None:
context = {}
res = False
user = self.pool.get('res.users').browse(cr, uid, uid)
active_ids = context.get('active_ids', [context.get('active_id', None)])
for action in self.browse(cr, uid, ids, context):
obj = None
obj_pool = self.pool[action.model_id.model]
if context.get('active_model') == action.model_id.model and context.get('active_id'):
obj = obj_pool.browse(cr, uid, context['active_id'], context=context)
cxt = {
'self': obj_pool,
'object': obj,
'obj': obj,
'pool': self.pool,
'time': time,
'cr': cr,
'context': dict(context), # copy context to prevent side-effects of eval
'uid': uid,
'user': user
}
expr = eval(str(action.condition), cxt)
if not expr:
continue
for active_id in active_ids:
if context.get('active_model') == action.model_id.model and active_id:
obj = obj_pool.browse(cr, uid, context['active_id'], context=context)
# run context dedicated to a particular active_id
run_context = dict(context, active_ids=[active_id], active_id=active_id)
# evaluation context for python strings to evaluate
eval_context = {
'self': obj_pool,
'object': obj,
'obj': obj,
'pool': self.pool,
'time': time,
'cr': cr,
'context': dict(run_context), # copy context to prevent side-effects of eval
'uid': uid,
'user': user
}
if action.state=='client_action':
if not action.action_id:
raise osv.except_osv(_('Error'), _("Please specify an action to launch!"))
return self.pool[action.action_id.type].read(cr, uid, action.action_id.id, context=context)
if action.state=='code':
eval(action.code.strip(), cxt, mode="exec", nocopy=True) # nocopy allows to return 'action'
if 'action' in cxt:
return cxt['action']
if action.state == 'email':
email_from = config['email_from']
if not email_from:
_logger.debug('--email-from command line option is not specified, using a fallback value instead.')
if user.email:
email_from = user.email
else:
email_from = "%s@%s" % (user.login, gethostname())
try:
address = eval(str(action.email), cxt)
except Exception:
address = str(action.email)
if not address:
_logger.info('No partner email address specified, not sending any email.')
# evaluate the condition, with the specific case that a void (aka False) condition is considered as True
condition = action.condition
if action.condition is False:
condition = True
expr = eval(str(condition), eval_context)
if not expr:
continue
# call the method related to the action: run_action_<STATE>
if hasattr(self, 'run_action_%s' % action.state):
res = getattr(self, 'run_action_%s' % action.state)(cr, uid, action, eval_context=eval_context, context=run_context)
return res
# handle single and multiple recipient addresses
addresses = address if isinstance(address, (tuple, list)) else [address]
subject = self.merge_message(cr, uid, action.subject, action, context)
body = self.merge_message(cr, uid, action.message, action, context)
ir_mail_server = self.pool.get('ir.mail_server')
msg = ir_mail_server.build_email(email_from, addresses, subject, body)
res_email = ir_mail_server.send_email(cr, uid, msg)
if res_email:
_logger.info('Email successfully sent to: %s', addresses)
else:
_logger.warning('Failed to send email to: %s', addresses)
if action.state == 'trigger':
model = action.wkf_model_id.model
m2o_field_name = action.trigger_obj_id.name
target_id = obj_pool.read(cr, uid, context.get('active_id'), [m2o_field_name])[m2o_field_name]
target_id = target_id[0] if isinstance(target_id,tuple) else target_id
openerp.workflow.trg_validate(uid, model, int(target_id), action.trigger_name, cr)
if action.state == 'sms':
#TODO: set the user and password from the system
# for the sms gateway user / password
# USE smsclient module from extra-addons
_logger.warning('SMS Facility has not been implemented yet. Use smsclient module!')
if action.state == 'other':
res = []
for act in action.child_ids:
context['active_id'] = context['active_ids'][0]
result = self.run(cr, uid, [act.id], context)
if result:
res.append(result)
return res
if action.state == 'loop':
expr = eval(str(action.expression), cxt)
context['object'] = obj
for i in expr:
context['active_id'] = i.id
self.run(cr, uid, [action.loop_action.id], context)
if action.state == 'object_write':
res = {}
for exp in action.fields_lines:
euq = exp.value
if exp.type == 'equation':
expr = eval(euq, cxt)
else:
expr = exp.value
res[exp.col1.name] = expr
if not action.write_id:
if not action.srcmodel_id:
obj_pool = self.pool[action.model_id.model]
obj_pool.write(cr, uid, [context.get('active_id')], res)
else:
write_id = context.get('active_id')
obj_pool = self.pool[action.srcmodel_id.model]
obj_pool.write(cr, uid, [write_id], res)
elif action.write_id:
obj_pool = self.pool[action.srcmodel_id.model]
rec = self.pool[action.model_id.model].browse(cr, uid, context.get('active_id'))
id = eval(action.write_id, {'object': rec})
try:
id = int(id)
except:
raise osv.except_osv(_('Error'), _("Problem in configuration `Record Id` in Server Action!"))
if type(id) != type(1):
raise osv.except_osv(_('Error'), _("Problem in configuration `Record Id` in Server Action!"))
write_id = id
obj_pool.write(cr, uid, [write_id], res)
if action.state == 'object_create':
res = {}
for exp in action.fields_lines:
euq = exp.value
if exp.type == 'equation':
expr = eval(euq, cxt)
else:
expr = exp.value
res[exp.col1.name] = expr
obj_pool = self.pool[action.srcmodel_id.model]
res_id = obj_pool.create(cr, uid, res)
if action.record_id:
self.pool[action.model_id.model].write(cr, uid, [context.get('active_id')], {action.record_id.name:res_id})
if action.state == 'object_copy':
res = {}
for exp in action.fields_lines:
euq = exp.value
if exp.type == 'equation':
expr = eval(euq, cxt)
else:
expr = exp.value
res[exp.col1.name] = expr
model = action.copy_object.split(',')[0]
cid = action.copy_object.split(',')[1]
obj_pool = self.pool[model]
obj_pool.copy(cr, uid, int(cid), res)
return False
actions_server()
class act_window_close(osv.osv):
_name = 'ir.actions.act_window_close'

View File

@ -309,86 +309,208 @@
<field name="model">ir.actions.server</field>
<field name="arch" type="xml">
<form string="Server Action" version="7.0">
<group>
<sheet>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
</div>
<div class="oe_right oe_button_box" name="buttons">
<field name="menu_ir_values_id" invisible="1"/>
<button name="create_action" string="Add in the 'More' menu" type="object"
attrs="{'invisible':[('menu_ir_values_id','!=',False)]}"
help="Display an option on related documents to run this sever action"/>
<button name="unlink_action" string="Remove from the 'More' menu" type="object"
attrs="{'invisible':[('menu_ir_values_id','=',False)]}"
help="Remove the contextual action related to this server action"/>
</div>
<group>
<field name="name"/>
<field name="model_id"/>
<field name="state"/>
<group>
<field name="type" invisible="1"/>
<field name="model_id"
on_change="on_change_model_id(model_id, wkf_model_id, crud_model_id)"/>
<field name="state"/>
</group>
<group>
<field name="condition"/>
<field name="sequence"/>
</group>
</group>
<group>
<field name="condition"/>
<field name="sequence"/>
</group>
</group>
<notebook colspan="4">
<page string="Python Code" attrs="{'invisible':[('state','!=','code')]}">
<field name="code"/>
</page>
<page string="Trigger" attrs="{'invisible':[('state','!=','trigger')]}">
<group string="Trigger Configuration" col="4">
<field name="wkf_model_id" attrs="{'required':[('state','=','trigger')]}"/>
<field name="trigger_obj_id" context="{'key':''}"
domain="[('model_id','=',model_id),('ttype','in',['many2one','int'])]"
attrs="{'required':[('state','=','trigger')]}"/>
<field name="trigger_name" attrs="{'required':[('state','=','trigger')]}"/>
</group>
</page>
<page string="Action to Launch" attrs="{'invisible':[('state','!=','client_action')]}">
<group>
<field name="action_id" attrs="{'required':[('state','=','client_action')]}"/>
</group>
</page>
<page string="Email Configuration" attrs="{'invisible':[('state','!=','email')]}">
<group>
<field name="email" domain="[('model_id','=',model_id)]" attrs="{'required':[('state','=','email')]}"/>
<field name="subject" attrs="{'required':[('state','=','email')]}"/>
<field name="message" attrs="{'required':[('state','=','email')]}"/>
<newline/>
<label colspan="2" string="Access all the fields related to the current object using expressions, i.e. object.partner_id.name " align="0.0"/>
</group>
</page>
<page string="SMS Configuration" attrs="{'invisible':[('state','!=','sms')]}">
<group>
<field name="mobile" domain="[('model_id','=',model_id)]" attrs="{'required':[('state','=','sms')]}"/>
<field name="sms" attrs="{'required':[('state','=','sms')]}"/>
</group>
<label string="Access all the fields related to the current object using expressions, i.e. object.partner_id.name " align="0.0"/>
</page>
<page string="Create / Write / Copy" attrs="{'invisible':[('state','!=','object_create'), ('state','!=','object_write'), ('state','!=','object_copy')]}">
<group col="4" string="Fields Mapping">
<field name="srcmodel_id" attrs="{'required':[('state','!=','dummy'), ('state','!=','sms'), ('state','!=','code'), ('state','!=','loop'), ('state','!=','trigger'), ('state','!=','object_copy'), ('state','!=','client_action'), ('state','!=','email'), ('state','!=','sms'), ('state','!=','other')]}"/>
<field name="copy_object" on_change="change_object(copy_object, state)" attrs="{'required':[('state','!=','dummy'), ('state','!=','sms'), ('state','!=','code'), ('state','!=','loop'), ('state','!=','trigger'), ('state','!=','object_write'), ('state','!=','object_create'), ('state','!=','client_action'), ('state','!=','email'), ('state','!=','sms'), ('state','!=','other')]}"/>
<field name="fields_lines" nolabel="1" colspan="2">
<tree string="Field Mappings" editable="top">
<field name="col1" domain="[('model_id','=',parent.srcmodel_id or parent.model_id)]"/>
<field name="type"/>
<field name="value" colspan="4"/>
</tree>
<form string="Field Mapping" version="7.0">
<group col="4">
<field name="col1" domain="[('model_id','=',parent.srcmodel_id or parent.model_id)]"/>
<field name="type"/>
<field name="value" colspan="4"/>
<notebook colspan="4">
<page string="Python Code" name='code' autofocus="autofocus"
attrs="{'invisible': [('state', '!=', 'code')]}">
<field name="code" placeholder="Enter Python code here. Help about Python expression is available in the help tab of this document."/>
</page>
<page string="Worflow Signal" autofocus="autofocus"
attrs="{'invisible': [('state', '!=', 'trigger')]}">
<p attrs="{'invisible': [('model_id', '!=', False)]}">
Please set the Base Model before setting the action details.
</p>
<group attrs="{'invisible': [('model_id', '=', False)]}">
<field name="use_relational_model" widget="radio"
on_change="on_change_wkf_wonfig(use_relational_model, wkf_field_id, wkf_model_id, model_id)"
attrs="{'readonly': [('model_id', '=', False)]}"/>
<field name="wkf_field_id" context="{'key': ''}"
on_change="on_change_wkf_wonfig(use_relational_model, wkf_field_id, wkf_model_id, model_id)"
attrs="{'required': [('state', '=', 'trigger'), ('use_relational_model', '=', 'relational')],
'invisible': [('use_relational_model', '=', 'base')]}"
domain="[('model_id', '=', model_id), ('ttype', 'in', ['many2one'])]"/>
<field name="wkf_model_id" invisible="1"
on_change="on_change_wkf_model_id(wkf_model_id)"/>
<field name="wkf_model_name" invisible="1"/>
<field name="wkf_transition_id" attrs="{'required': [('state', '=', 'trigger')]}"
domain="[('wkf_id.osv', '=', wkf_model_name)]"/>
</group>
</page>
<page string="Client" autofocus="autofocus"
attrs="{'invisible': [('state', '!=', 'client_action')]}">
<group>
<field name="action_id" attrs="{'required':[('state', '=', 'client_action')]}"/>
</group>
</page>
<page string="Create / Write / Copy" autofocus="autofocus"
attrs="{'invisible':[('state', 'not in', ['object_create', 'object_write'])]}">
<p attrs="{'invisible': [('model_id', '!=', False)]}">
Please set the Base Model before setting the action details.
</p>
<group attrs="{'invisible': [('model_id', '=', False)]}">
<field name="use_create" widget="radio"
on_change="on_change_crud_config(state, use_create, use_write, ref_object, crud_model_id, model_id)"
attrs="{'invisible': [('state', '!=', 'object_create')]}"/>
<field name="use_write" widget="radio"
on_change="on_change_crud_config(state, use_create, use_write, ref_object, crud_model_id, model_id)"
attrs="{'invisible': [('state', '!=', 'object_write')]}"/>
<label for="ref_object" string=" "
attrs="{'invisible': ['&amp;',
'|', ('state', '!=', 'object_write'), ('use_write', '!=', 'other'),
'|', ('state', '!=', 'object_create'), ('use_create', '!=', 'copy_other')]}"/>
<div style="margin-left: 24px;"
attrs="{'invisible': ['&amp;',
'|', ('state', '!=', 'object_write'), ('use_write', '!=', 'other'),
'|', ('state', '!=', 'object_create'), ('use_create', '!=', 'copy_other')]}">
<field name="ref_object" nolabel="1"
on_change="on_change_crud_config(state, use_create, use_write, ref_object, crud_model_id, model_id)"/>
</div>
<field name="crud_model_id"
on_change="on_change_crud_model_id(crud_model_id)"
attrs="{'invisible': ['|', ('state', '!=', 'object_create'), ('use_create', '!=', 'new_other')]}"/>
<field name="crud_model_name" invisible="1"/>
<label for="link_new_record" attrs="{'invisible': [('state', '!=', 'object_create')]}"/>
<div attrs="{'invisible': [('state', '!=', 'object_create')]}">
<field name="link_new_record" nolabel="1" style="display: inline-block;"/>
<p class="oe_grey oe_edit_only" style="display: inline-block; margin: 0px 0px 0px 8px;">
Check to attach the newly created record to the record on which the server action runs.
</p>
<group>
<field name="link_field_id"
domain="[('model_id', '=', model_id), ('relation', '=', crud_model_name), ('ttype', 'in', ['many2one'])]"
attrs="{'required': [('state', '=', 'object_create'), ('link_new_record', '=', True)],
'invisible': ['|', ('state', '!=', 'object_create'), ('link_new_record', '=', False)]}"/>
</group>
</form>
</field>
<field name="record_id" attrs="{'readonly':[('state','!=','object_create')]}" domain="[('model_id','in',[model_id])]"/>
<field name="write_id" attrs="{'readonly':[('state','!=','object_write')]}"/>
</group>
<label string="If you use a formula type, use a python expression using the variable 'object'." align="0.0"/>
</page>
<page string="Iteration Actions" attrs="{'invisible':[('state','!=','loop')]}">
<group col="4">
<field name="expression" attrs="{'required':[('state','=','loop')]}"/>
<field name="loop_action" domain="[('state','!=','loop')]" attrs="{'required':[('state','=','loop')]}"/>
</group>
</page>
<page string="Multi Actions" attrs="{'invisible':[('state','!=','other')]}">
<field name="child_ids"/>
<label string="Only one client action will be executed, last client action will be considered in case of multiple client actions." align="0.0"/>
</page>
</notebook>
<field name="type" readonly="1"/>
</div>
<label for="link_new_record" attrs="{'invisible': ['|', ('state', '!=', 'object_write'), ('use_write', '!=', 'expression')]}"/>
<div attrs="{'invisible': ['|', ('state', '!=', 'object_write'), ('use_write', '!=', 'expression')]}">
<p class="oe_grey oe_edit_only" style="margin: 0px;">
Write a python expression, beginning with object, that gives the record to update. An expression builder is available in the help tab. Examples:
</p>
<ul class="oe_grey oe_edit_only">
<li>object.partner_id</li>
<li>object.partner_id.currency_id</li>
</ul>
<field name="write_expression"
on_change="on_change_write_expression(write_expression, model_id)"
attrs="{'required': [('state', '=', 'object_write'), ('use_write', '=', 'expression')]}"/>
</div>
<field name="fields_lines">
<tree string="Field Mappings" editable="top">
<field name="col1" domain="[('model_id', '=', parent.crud_model_id)]"/>
<field name="type"/>
<field name="value"/>
</tree>
<form string="Field Mapping" version="7.0">
<group >
<field name="col1" domain="[('model_id', '=', parent.crud_model_id)]"/>
<field name="type"/>
<field name="value"/>
</group>
</form>
</field>
</group>
</page>
<page string="Execute several actions" autofocus="autofocus"
attrs="{'invisible': [('state', '!=', 'multi')]}">
<p class="oe_grey">
If several child actions return an action, only the last one will be executed.
This may happen when having server actions executing code that returns an action, or server actions returning a client action.
</p>
<field name="child_ids"
domain="[('model_id', '=', model_id)]"/>
</page>
<page string="Help">
<group>
<div style="margin-top: 4px;">
<h3>Help with Python expressions.</h3>
<p>Various fields may use Python code or Python expressions. The following variables can be used:</p>
<ul>
<li>self: ORM model of the record on which the action is triggered</li>
<li>object or obj: browse_record of the record on which the action is triggered</li>
<li>pool: ORM model pool (i.e. self.pool)</li>
<li>time: Python time module</li>
<li>cr: database cursor</li>
<li>uid: current user id</li>
<li>context: current context</li>
</ul>
<div>
<p>Example of condition expression using Python</p>
<ul>
<li>condition: True</li>
<li>condition: object.list_price > 5000</li>
</ul>
</div>
<div attrs="{'invisible': [('state', '!=', 'code')]}">
<p>Example of python code</p>
<code>
partner_name = obj.name + '_code'
self.pool["res.partner"].create(cr, uid, {"name": partner_name}, context=context)
</code>
</div>
</div>
<group>
<h3 colspan="2">Dynamic expression builder</h3>
<p colspan="2" attrs="{'invisible': [('model_id', '!=', False)]}">
Please set the Base Model of the action to enable the dynamic expression buidler.
</p>
<field name="model_object_field"
attrs="{'invisible': [('model_id', '=', False)]}"
domain="[('model_id', '=', model_id), ('ttype', '!=', 'one2many'), ('ttype', '!=', 'many2many')]"
on_change="onchange_sub_model_object_value_field(model_object_field)"/>
<field name="sub_object" readonly="1" attrs="{'invisible': [('model_id', '=', False)]}"/>
<field name="sub_model_object_field"
domain="[('model_id', '=', sub_object), ('ttype', '!=', 'one2many'), ('ttype', '!=', 'many2many')]"
attrs="{'readonly':[('sub_object','=',False)],
'required':[('sub_object','!=',False)],
'invisible': [('model_id', '=', False)]}"
on_change="onchange_sub_model_object_value_field(model_object_field,sub_model_object_field)"/>
<field name="copyvalue" attrs="{'invisible': [('model_id', '=', False)]}"/>
<h3 colspan="2">Find the ID of a record in the database</h3>
<field name="id_object" on_change="onchange_id_object(id_object)"/>
<field name="id_value" />
</group>
</group>
</page>
</notebook>
</sheet>
</form>
</field>
</record>

View File

@ -233,10 +233,10 @@ class ir_attachment(osv.osv):
targets = cr.dictfetchall()
model_attachments = {}
for target_dict in targets:
if not (target_dict['res_id'] and target_dict['res_model']):
if not target_dict['res_model']:
continue
# model_attachments = { 'model': { 'res_id': [id1,id2] } }
model_attachments.setdefault(target_dict['res_model'],{}).setdefault(target_dict['res_id'],set()).add(target_dict['id'])
model_attachments.setdefault(target_dict['res_model'],{}).setdefault(target_dict['res_id'] or 0, set()).add(target_dict['id'])
# To avoid multiple queries for each attachment found, checks are
# performed in batch as much as possible.
@ -250,7 +250,7 @@ class ir_attachment(osv.osv):
# filter ids according to what access rules permit
target_ids = targets.keys()
allowed_ids = self.pool[model].search(cr, uid, [('id', 'in', target_ids)], context=context)
allowed_ids = [0] + self.pool[model].search(cr, uid, [('id', 'in', target_ids)], context=context)
disallowed_ids = set(target_ids).difference(allowed_ids)
for res_id in disallowed_ids:
for attach_id in targets[res_id]:

View File

@ -76,7 +76,7 @@
<filter string="Owner" icon="terp-personal" domain="[]" context="{'group_by':'create_uid'}"/>
<filter string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'type'}" groups="base.group_no_one"/>
<filter string="Company" icon="terp-gtk-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Month" help="Creation Month" icon="terp-go-month" domain="[]" context="{'group_by':'create_date'}"/>
<filter string="Creation Month" icon="terp-go-month" domain="[]" context="{'group_by':'create_date'}"/>
</group>
</search>
</field>

View File

@ -195,7 +195,8 @@ class ir_model(osv.osv):
ctx = dict(context,
field_name=vals['name'],
field_state='manual',
select=vals.get('select_level', '0'))
select=vals.get('select_level', '0'),
update_custom_fields=True)
self.pool[vals['model']]._auto_init(cr, ctx)
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
return res

View File

@ -247,6 +247,7 @@
<field name="complete_name"/>
<field name="display_name"/>
<field name="model" groups="base.group_no_one"/>
<field name="module" invisible="1"/>
<field name="res_id"/>
</tree>
</field>

View File

@ -84,7 +84,7 @@ class ir_sequence(openerp.osv.osv.osv):
_columns = {
'name': openerp.osv.fields.char('Name', size=64, required=True),
'code': openerp.osv.fields.selection(_code_get, 'Code', size=64),
'code': openerp.osv.fields.selection(_code_get, 'Sequence Type', size=64),
'implementation': openerp.osv.fields.selection( # TODO update the view
[('standard', 'Standard'), ('no_gap', 'No gap')],
'Implementation', required=True,

View File

@ -445,6 +445,13 @@ class ir_translation(osv.osv):
tools.trans_load(cr, base_trans_file, lang, verbose=False, module_name=module_name, context=context)
context['overwrite'] = True # make sure the requested translation will override the base terms later
# i18n_extra folder is for additional translations handle manually (eg: for l10n_be)
base_trans_extra_file = openerp.modules.get_module_resource(module_name, 'i18n_extra', base_lang_code + '.po')
if base_trans_extra_file:
_logger.info('module %s: loading extra base translation file %s for language %s', module_name, base_lang_code, lang)
tools.trans_load(cr, base_trans_extra_file, lang, verbose=False, module_name=module_name, context=context)
context['overwrite'] = True # make sure the requested translation will override the base terms later
# Step 2: then load the main translation file, possibly overriding the terms coming from the base language
trans_file = openerp.modules.get_module_resource(module_name, 'i18n', lang_code + '.po')
if trans_file:
@ -452,6 +459,11 @@ class ir_translation(osv.osv):
tools.trans_load(cr, trans_file, lang, verbose=False, module_name=module_name, context=context)
elif lang_code != 'en_US':
_logger.warning('module %s: no translation for language %s', module_name, lang_code)
trans_extra_file = openerp.modules.get_module_resource(module_name, 'i18n_extra', lang_code + '.po')
if trans_extra_file:
_logger.info('module %s: loading extra translation file (%s) for language %s', module_name, lang_code, lang)
tools.trans_load(cr, trans_extra_file, lang, verbose=False, module_name=module_name, context=context)
return True

View File

@ -187,7 +187,7 @@ class view(osv.osv):
if self.pool._init:
# Module init currently in progress, only consider views from modules whose code was already loaded
query = """SELECT v.id FROM ir_ui_view v LEFT JOIN ir_model_data md ON (md.model = 'ir.ui.view' AND md.res_id = v.id)
WHERE v.inherit_id=%s AND v.model=%s AND md.module in %s
WHERE v.inherit_id=%s AND v.model=%s AND (md.module IS NULL or md.module in %s)
ORDER BY priority"""
query_params = (view_id, model, tuple(self.pool._init_modules))
else:

View File

@ -32,6 +32,7 @@ import urllib
import urllib2
import zipfile
import zipimport
import lxml.html
try:
from cStringIO import StringIO
@ -152,9 +153,19 @@ class module(osv.osv):
def _get_desc(self, cr, uid, ids, field_name=None, arg=None, context=None):
res = dict.fromkeys(ids, '')
for module in self.browse(cr, uid, ids, context=context):
overrides = dict(embed_stylesheet=False, doctitle_xform=False, output_encoding='unicode')
output = publish_string(source=module.description, settings_overrides=overrides, writer=MyWriter())
res[module.id] = output
path = addons.get_module_resource(module.name, 'static/description/index.html')
if path:
with tools.file_open(path, 'rb') as desc_file:
doc = desc_file.read()
html = lxml.html.document_fromstring(doc)
for element, attribute, link, pos in html.iterlinks():
if element.get('src') and not '//' in element.get('src') and not 'static/' in element.get('src'):
element.set('src', "/%s/static/description/%s" % (module.name, element.get('src')))
res[module.id] = lxml.html.tostring(html)
else:
overrides = dict(embed_stylesheet=False, doctitle_xform=False, output_encoding='unicode')
output = publish_string(source=module.description, settings_overrides=overrides, writer=MyWriter())
res[module.id] = output
return res
def _get_latest_version(self, cr, uid, ids, field_name=None, arg=None, context=None):
@ -232,7 +243,7 @@ class module(osv.osv):
def _get_icon_image(self, cr, uid, ids, field_name=None, arg=None, context=None):
res = dict.fromkeys(ids, '')
for module in self.browse(cr, uid, ids, context=context):
path = addons.get_module_resource(module.name, 'static', 'src', 'img', 'icon.png')
path = addons.get_module_resource(module.name, 'static', 'description', 'icon.png')
if path:
image_file = tools.file_open(path, 'rb')
try:
@ -472,7 +483,6 @@ class module(osv.osv):
function(cr, uid, ids, context=context)
cr.commit()
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
registry = openerp.modules.registry.RegistryManager.new(cr.dbname, update_module=True)
config = registry['res.config'].next(cr, uid, [], context=context) or {}

View File

@ -37,15 +37,15 @@
<search string="Search modules">
<field name="name" filter_domain="['|', '|', ('summary', 'ilike', self), ('shortdesc', 'ilike', self), ('name',
'ilike', self)]" string="Module"/>
<filter name="app" icon="terp-check" string="Apps" domain="[('application', '=', 1)]"/>
<filter name="extra" icon="terp-check" string="Extra" domain="[('application', '=', 0)]"/>
<filter name="app" string="Apps" domain="[('application', '=', 1)]"/>
<filter name="extra" string="Extra" domain="[('application', '=', 0)]"/>
<separator/>
<filter name="installed" icon="terp-check" string="Installed" domain="[('state', 'in', ['installed', 'to upgrade', 'to remove'])]"/>
<filter icon="terp-dialog-close" string="Not Installed" domain="[('state', 'in', ['uninstalled', 'uninstallable', 'to install'])]"/>
<filter name="installed" string="Installed" domain="[('state', 'in', ['installed', 'to upgrade', 'to remove'])]"/>
<filter string="Not Installed" domain="[('state', 'in', ['uninstalled', 'uninstallable', 'to install'])]"/>
<field name="category_id"/>
<group expand="0" string="Group By...">
<filter string="Author" icon="terp-personal" domain="[]" context="{'group_by':'author'}"/>
<filter string="Category" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'category_id'}"/>
<filter string="Author" domain="[]" context="{'group_by':'author'}"/>
<filter string="Category" domain="[]" context="{'group_by':'category_id'}"/>
</group>
</search>
</field>
@ -71,36 +71,41 @@
<field name="model">ir.module.module</field>
<field name="arch" type="xml">
<form create="0" edit="0" string="Module" version="7.0">
<sheet>
<link rel="stylesheet" href="/base/static/src/css/description.css"></link>
<sheet>
<field name="icon_image" widget="image" class="oe_avatar oe_left"/>
<div class="oe_title">
<h1><field name="shortdesc"/></h1>
<h2 class="oe_fade"><field name="summary"/></h2>
<button name="button_immediate_install" states="uninstalled" string="Install" type="object" class="oe_highlight"/>
<button name="button_immediate_upgrade" states="installed" string="Upgrade" type="object" class="oe_highlight"/>
<button name="button_immediate_uninstall" states="installed" string="Uninstall" type="object"
confirm="Do you confirm the uninstallation of this module? This will permanently erase all data currently stored by the module!"/>
<button name="button_uninstall_cancel" states="to remove" string="Cancel Uninstall" type="object"/>
<button name="button_upgrade_cancel" states="to upgrade" string="Cancel Upgrade" type="object"/>
<button name="button_install_cancel" states="to install" string="Cancel Install" type="object"/>
<h3 class="oe_fade">
By <field name="author" class="oe_inline"/>
</h3>
<div>
<button name="button_immediate_install" states="uninstalled" string="Install" type="object" class="oe_highlight"/>
<button name="button_immediate_upgrade" states="installed" string="Upgrade" type="object" class="oe_highlight"/>
<button name="button_immediate_uninstall" states="installed" string="Uninstall" type="object"
confirm="Do you confirm the uninstallation of this module? This will permanently erase all data currently stored by the module!"/>
<button name="button_uninstall_cancel" states="to remove" string="Cancel Uninstall" type="object"/>
<button name="button_upgrade_cancel" states="to upgrade" string="Cancel Upgrade" type="object"/>
<button name="button_install_cancel" states="to install" string="Cancel Install" type="object"/>
</div>
</div>
<group>
<group>
<field name="author"/>
<field name="website" widget="url" attrs="{'invisible':[('website','=',False)]}"/>
<field name="category_id" widget="selection"/>
</group>
<group>
<field name="name"/>
<field name="license"/>
<field name="installed_version"/>
</group>
</group>
<notebook>
<page string="Description">
<field name="description_html"/>
<div class="oe_clear"/>
<notebook groups="base.group_no_one">
<page string="Information">
<group>
<group>
<field name="website" widget="url" attrs="{'invisible':[('website','=',False)]}"/>
<field name="category_id" widget="selection"/>
<field name="summary"/>
</group>
<group>
<field name="name"/>
<field name="license"/>
<field name="installed_version"/>
</group>
</group>
</page>
<page string="Technical Data" groups="base.group_no_one">
<page string="Technical Data">
<group col="4">
<field name="demo"/>
<field name="application"/>
@ -116,13 +121,14 @@
</tree>
</field>
</page>
<page string="Features" attrs="{'invisible':[('state','!=','installed')]}">
<page string="Installed Features" attrs="{'invisible':[('state','!=','installed')]}">
<label for="menus_by_module" string="Created Menus"/>
<field name="menus_by_module"/>
<label for="reports_by_module" string="Defined Reports"/>
<field name="reports_by_module"/>
</page>
</notebook>
<field name="description_html" class='oe_styling_v8'/>
</sheet>
</form>
</field>

View File

@ -33,7 +33,7 @@
</h1>
</div>
<div attrs="{'invisible' : [('logo','!=',False)]}" class="oe_view_nocontent oe_clear">
<p class="oe_view_nocontent_create">
<p class="oe_view_nocontent_create oe_edit_only">
Click to set your company logo.
</p>
</div>

View File

@ -49,10 +49,10 @@ class res_config_module_installation_mixin(object):
to_install_missing_names.append(name)
elif module.state == 'uninstalled':
to_install_ids.append(module.id)
result = None
if to_install_ids:
ir_module.button_immediate_install(cr, uid, to_install_ids, context=context)
result = ir_module.button_immediate_install(cr, uid, to_install_ids, context=context)
#FIXME: if result is not none, the corresponding todo will be skipped because it was just marked done
if to_install_missing_names:
return {
'type': 'ir.actions.client',
@ -60,7 +60,7 @@ class res_config_module_installation_mixin(object):
'params': {'modules': to_install_missing_names},
}
return None
return result
class res_config_configurable(osv.osv_memory):
''' Base classes for new-style configuration items

View File

@ -330,7 +330,7 @@
<record id="ee" model="res.country">
<field name="name">Estonia</field>
<field name="code">ee</field>
<field name="currency_id" ref="EEK"/>
<field name="currency_id" ref="EUR"/>
</record>
<record id="eg" model="res.country">
<field name="name">Egypt</field>

View File

@ -30,11 +30,13 @@ from openerp.tools.translate import _
CURRENCY_DISPLAY_PATTERN = re.compile(r'(\w+)\s*(?:\((.*)\))?')
class res_currency(osv.osv):
def _current_rate(self, cr, uid, ids, name, arg, context=None):
return self._get_current_rate(cr, uid, ids, name, arg, context=context)
return self._get_current_rate(cr, uid, ids, context=context)
def _get_current_rate(self, cr, uid, ids, name, arg, context=None):
def _current_rate_silent(self, cr, uid, ids, name, arg, context=None):
return self._get_current_rate(cr, uid, ids, raise_on_no_rate=False, context=context)
def _get_current_rate(self, cr, uid, ids, raise_on_no_rate=True, context=None):
if context is None:
context = {}
res = {}
@ -52,9 +54,12 @@ class res_currency(osv.osv):
if cr.rowcount:
id, rate = cr.fetchall()[0]
res[id] = rate
elif not raise_on_no_rate:
res[id] = 0
else:
raise osv.except_osv(_('Error!'),_("No currency rate associated for currency %d for the given period" % (id)))
return res
_name = "res.currency"
_description = "Currency"
_columns = {
@ -63,6 +68,10 @@ class res_currency(osv.osv):
'symbol': fields.char('Symbol', size=4, help="Currency sign, to be used when printing amounts."),
'rate': fields.function(_current_rate, string='Current Rate', digits=(12,6),
help='The rate of the currency to the currency of rate 1.'),
# Do not use for computation ! Same as rate field with silent failing
'rate_silent': fields.function(_current_rate_silent, string='Current Rate', digits=(12,6),
help='The rate of the currency to the currency of rate 1 (0 if no rate defined).'),
'rate_ids': fields.one2many('res.currency.rate', 'currency_id', 'Rates'),
'accuracy': fields.integer('Computational Accuracy'),
'rounding': fields.float('Rounding Factor', digits=(12,6)),

View File

@ -22,7 +22,7 @@
<field name="company_id" groups="base.group_multi_company"/>
<field name="rate_ids" invisible="1"/>
<field name="date"/>
<field name="rate"/>
<field name="rate_silent"/>
<field name="rounding"/>
<field name="accuracy"/>
<field name="position"/>
@ -37,7 +37,7 @@
<form string="Currency" version="7.0">
<group col="4">
<field name="name"/>
<field name="rate"/>
<field name="rate_silent"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>

View File

@ -208,6 +208,8 @@ class res_partner(osv.osv, format_address):
return result
def _display_name_compute(self, cr, uid, ids, name, args, context=None):
context = dict(context or {})
context.pop('show_address', None)
return dict(self.name_get(cr, uid, ids, context=context))
# indirections to avoid passing a copy of the overridable method when declaring the function field
@ -479,7 +481,11 @@ class res_partner(osv.osv, format_address):
if partner.child_ids:
# 2a. Commercial Fields: sync if commercial entity
if partner.commercial_partner_id == partner:
self._commercial_sync_to_children(cr, uid, partner, context=context)
commercial_fields = self._commercial_fields(cr, uid,
context=context)
if any(field in update_values for field in commercial_fields):
self._commercial_sync_to_children(cr, uid, partner,
context=context)
# 2b. Address fields: sync if address changed
address_fields = self._address_fields(cr, uid, context=context)
if any(field in update_values for field in address_fields):
@ -502,6 +508,16 @@ class res_partner(osv.osv, format_address):
def write(self, cr, uid, ids, vals, context=None):
if isinstance(ids, (int, long)):
ids = [ids]
#res.partner must only allow to set the company_id of a partner if it
#is the same as the company of all users that inherit from this partner
#(this is to allow the code from res_users to write to the partner!) or
#if setting the company_id to False (this is compatible with any user company)
if vals.get('company_id'):
for partner in self.browse(cr, uid, ids, context=context):
if partner.user_ids:
user_companies = set([user.company_id.id for user in partner.user_ids])
if len(user_companies) > 1 or vals['company_id'] not in user_companies:
raise osv.except_osv(_("Warning"),_("You can not change the company as the partner/user has multiple user linked with different companies."))
result = super(res_partner,self).write(cr, uid, ids, vals, context=context)
for partner in self.browse(cr, uid, ids, context=context):
self._fields_sync(cr, uid, partner, vals, context)
@ -602,14 +618,15 @@ class res_partner(osv.osv, format_address):
if operator in ('=ilike', '=like'):
operator = operator[1:]
query_args = {'name': search_name}
limit_str = ''
query = ('''SELECT id FROM res_partner
WHERE email ''' + operator + ''' %(name)s
OR display_name ''' + operator + ''' %(name)s
ORDER BY display_name
''')
if limit:
limit_str = ' limit %(limit)s'
query += ' limit %(limit)s'
query_args['limit'] = limit
cr.execute('''SELECT partner.id FROM res_partner partner
LEFT JOIN res_partner company ON partner.parent_id = company.id
WHERE partner.email ''' + operator +''' %(name)s OR
partner.display_name ''' + operator + ' %(name)s ' + limit_str, query_args)
cr.execute(query, query_args)
ids = map(lambda x: x[0], cr.fetchall())
ids = self.search(cr, uid, [('id', 'in', ids)] + args, limit=limit, context=context)
if ids:

View File

@ -283,6 +283,13 @@ class res_users(osv.osv):
return result
def create(self, cr, uid, vals, context=None):
user_id = super(res_users, self).create(cr, uid, vals, context=context)
user = self.browse(cr, uid, user_id, context=context)
if user.partner_id.company_id:
user.partner_id.write({'company_id': user.company_id.id})
return user_id
def write(self, cr, uid, ids, values, context=None):
if not hasattr(ids, '__iter__'):
ids = [ids]
@ -297,7 +304,11 @@ class res_users(osv.osv):
uid = 1 # safe fields only, so we write as super-user to bypass access rights
res = super(res_users, self).write(cr, uid, ids, values, context=context)
if 'company_id' in values:
for user in self.browse(cr, uid, ids, context=context):
# if partner is global we keep it that way
if user.partner_id.company_id and user.partner_id.company_id.id != values['company_id']:
user.partner_id.write({'company_id': user.company_id.id})
# clear caches linked to the users
self.pool['ir.model.access'].call_cache_clearing_methods(cr)
clear = partial(self.pool['ir.rule'].clear_cache, cr)

View File

@ -110,9 +110,7 @@
"access_res_bank_user","res_bank user","model_res_bank","group_user",1,0,0,0
"access_multi_company_default user","multi_company_default all","model_multi_company_default",,1,0,0,0
"access_multi_company_default manager","multi_company_default Manager","model_multi_company_default","group_erp_manager",1,1,1,1
"access_ir_filter all","ir_filters all","model_ir_filters",,1,0,0,0
"access_ir_filter employee","ir_filters employee","model_ir_filters","group_user",1,1,1,1
"access_ir_filters","ir_filters_all","model_ir_filters",,1,1,1,1
"access_ir_filter all","ir_filters all","model_ir_filters",,1,1,1,1
"access_ir_config_parameter","ir_config_parameter","model_ir_config_parameter",,1,0,0,0
"access_ir_mail_server","ir_mail_server","model_ir_mail_server","group_system",1,1,1,1
"access_ir_actions_client","ir_actions_client all","model_ir_actions_client",,1,0,0,0

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
110 access_res_bank_user res_bank user model_res_bank group_user 1 0 0 0
111 access_multi_company_default user multi_company_default all model_multi_company_default 1 0 0 0
112 access_multi_company_default manager multi_company_default Manager model_multi_company_default group_erp_manager 1 1 1 1
113 access_ir_filter all ir_filters all model_ir_filters 1 0 1 0 1 0 1
access_ir_filter employee ir_filters employee model_ir_filters group_user 1 1 1 1
access_ir_filters ir_filters_all model_ir_filters 1 1 1 1
114 access_ir_config_parameter ir_config_parameter model_ir_config_parameter 1 0 0 0
115 access_ir_mail_server ir_mail_server model_ir_mail_server group_system 1 1 1 1
116 access_ir_actions_client ir_actions_client all model_ir_actions_client 1 0 0 0

View File

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@ -0,0 +1,2 @@
sass:
sass -t expanded --compass --watch --unix-newlines *.sass

View File

@ -0,0 +1,732 @@
@charset "utf-8";
/*
* This CSS is for the html description of modules
* TODO clean
*/
/* --------------------------------- *
* STYLING CONTEXT *
* --------------------------------- */
/* --- Styling for the V8/Lato/White/Purple design --- */
.openerp .oe_form_sheet_width {
max-width: 960px;
}
.openerp .oe_form .oe_styling_v8 {
width: 100%;
padding: 0;
margin: 0;
font-family: "Open Sans", "Helvetica", Sans;
font-weight: 300;
color: #646464;
background: white;
font-size: 16px;
}
.openerp .oe_form .oe_styling_v8 .oe_websiteonly {
display: none;
}
.openerp .oe_form .oe_styling_v8 .oe_website_contents {
background: whitesmoke;
padding-bottom: 1px;
}
.openerp .oe_form .oe_styling_v8 b {
font-weight: 600;
}
.openerp .oe_form .oe_styling_v8 a {
color: #6d57e0;
text-decoration: none;
}
.openerp .oe_form .oe_styling_v8 a:visited {
color: #5b284f;
}
.openerp .oe_form .oe_styling_v8 a:hover {
color: #0096eb;
}
.openerp .oe_form .oe_styling_v8 .oe_title_font {
font-family: "Lato", "Open Sans", "Helvetica", Sans;
}
.openerp .oe_form .oe_styling_v8 .oe_page {
background: white;
overflow: hidden;
-webkit-border-radius: 1px;
-moz-border-radius: 1px;
-ms-border-radius: 1px;
-o-border-radius: 1px;
border-radius: 1px;
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
}
.openerp .oe_form .oe_styling_v8 .oe_emph {
font-weight: 400;
}
.openerp .oe_form .oe_styling_v8 .oe_dark {
overflow: hidden;
background: #fcfcfc;
-webkit-box-shadow: 0px 5px 9px -7px rgba(0, 0, 255, 0.5) inset, 0px -3px 9px -7px rgba(0, 0, 255, 0.5) inset;
-moz-box-shadow: 0px 5px 9px -7px rgba(0, 0, 255, 0.5) inset, 0px -3px 9px -7px rgba(0, 0, 255, 0.5) inset;
box-shadow: 0px 5px 9px -7px rgba(0, 0, 255, 0.5) inset, 0px -3px 9px -7px rgba(0, 0, 255, 0.5) inset;
}
/* --------------------------------- *
* LAYOUT *
* --------------------------------- */
/* ------ BASE GRID CONSTRUCTS ----- */
.oe_page {
margin: 0px auto 64px auto;
max-width: 992px;
}
.oe_row {
width: 928px;
margin-top: 16px;
margin-bottom: 16px;
margin-left: auto;
margin-right: auto;
}
.oe_row.oe_fit {
width: auto;
}
.oe_clearfix:after, .oe_row:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}
[class*='oe_span'] {
float: left;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 0 16px;
}
.oe_span12 {
width: 928px;
}
.oe_span10 {
width: 773px;
}
.oe_span9 {
width: 696px;
}
.oe_span8 {
width: 618px;
}
.oe_span6 {
width: 464px;
}
.oe_span4 {
width: 309px;
}
.oe_span3 {
width: 232px;
}
.oe_span2 {
width: 154px;
}
[class*='oe_span'].oe_fit {
padding-left: 0px !important;
padding-right: 0px !important;
}
[class*='oe_span'].oe_right {
float: right;
}
.oe_row.oe_flex [class*='oe_span'] {
display: inline-block;
float: none;
vertical-align: top;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 0 16px;
width: auto;
}
.oe_row.oe_flex .oe_span12 {
max-width: 928px;
}
.oe_row.oe_flex .oe_span10 {
max-width: 769px;
}
.oe_row.oe_flex .oe_span9 {
max-width: 692px;
}
.oe_row.oe_flex .oe_span8 {
max-width: 614px;
}
.oe_row.oe_flex .oe_span6 {
max-width: 460px;
}
.oe_row.oe_flex .oe_span4 {
max-width: 305px;
}
.oe_row.oe_flex .oe_span3 {
max-width: 228px;
}
.oe_row.oe_flex .oe_span2 {
max-width: 150px;
}
.oe_mb0 {
margin-bottom: 0px !important;
}
.oe_mb4 {
margin-bottom: 4px !important;
}
.oe_mb8 {
margin-bottom: 8px !important;
}
.oe_mb16 {
margin-bottom: 16px !important;
}
.oe_mb32 {
margin-bottom: 32px !important;
}
.oe_mb48 {
margin-bottom: 48px !important;
}
.oe_mb64 {
margin-bottom: 64px !important;
}
.oe_mt0 {
margin-top: 0px !important;
}
.oe_mt4 {
margin-top: 4px !important;
}
.oe_mt8 {
margin-top: 8px !important;
}
.oe_mt16 {
margin-top: 16px !important;
}
.oe_mt32 {
margin-top: 32px !important;
}
.oe_mt48 {
margin-top: 48px !important;
}
.oe_mt64 {
margin-top: 64px !important;
}
/* ------ GENERIC LAYOUT MODIFIERS ----- */
.oe_rightfit {
padding-right: 0px !important;
}
.oe_leftfit {
padding-left: 0px !important;
}
.oe_leftalign {
text-align: left;
}
.oe_rightalign {
text-align: right;
}
.oe_centeralign {
text-align: center;
}
.oe_centered {
margin-left: auto;
margin-right: auto;
}
.oe_hidden {
display: none !important;
opacity: 0 !important;
}
.oe_invisible {
visibility: hidden !important;
}
.oe_transparent {
opacity: 0 !important;
}
.oe_mb0 {
margin-bottom: 0px !important;
}
.oe_mb4 {
margin-bottom: 4px !important;
}
.oe_mb8 {
margin-bottom: 8px !important;
}
.oe_mb16 {
margin-bottom: 16px !important;
}
.oe_mb32 {
margin-bottom: 32px !important;
}
.oe_mb64 {
margin-bottom: 64px !important;
}
.oe_spaced {
margin-top: 32px;
margin-bottom: 32px;
}
.oe_more_spaced {
margin-top: 64px;
margin-bottom: 64px;
}
.oe_padded {
padding-top: 16px;
padding-bottom: 16px;
}
.oe_more_padded {
padding-top: 32px;
padding-bottom: 32px;
}
/* --------------------------------- *
* WEBPAGE COMPONENTS *
* --------------------------------- */
/* ------ BUTTONS ----- */
.oe_button {
position: relative;
bottom: 0;
display: inline-block;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.oe_styling_v8 .oe_button, .oe_styling_v8 a.oe_button {
padding: 8px 14px;
background: #8b72b6;
color: white;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
-ms-border-radius: 2px;
-o-border-radius: 2px;
border-radius: 2px;
-webkit-box-shadow: 0px 2px 0px #afa8cc;
-moz-box-shadow: 0px 2px 0px #afa8cc;
box-shadow: 0px 2px 0px #afa8cc;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.44);
border: solid 1px rgba(0, 0, 0, 0.09);
-webkit-transition-property: bottom, background;
-moz-transition-property: bottom, background;
-o-transition-property: bottom, background;
transition-property: bottom, background;
-webkit-transition-duration: 250ms;
-moz-transition-duration: 250ms;
-o-transition-duration: 250ms;
transition-duration: 250ms;
}
.oe_styling_v8 .oe_button:hover, .oe_styling_v8 a.oe_button:hover {
background: #8b5bdd;
color: white;
}
.oe_styling_v8 .oe_button:active, .oe_styling_v8 a.oe_button:active {
background: #333333;
bottom: -3px;
}
.oe_styling_v8 .oe_button.oe_big, .oe_styling_v8 a.oe_button.oe_big {
font-size: 24px;
}
.oe_styling_v8 .oe_button.oe_bigger, .oe_styling_v8 a.oe_button.oe_bigger {
font-size: 32px;
}
.oe_styling_v8 .oe_button.oe_small, .oe_styling_v8 a.oe_button.oe_small {
font-size: 13px;
padding: 2px 4px;
}
.oe_styling_v8 .oe_button.oe_small:active, .oe_styling_v8 a.oe_button.oe_small:active {
bottom: -1px;
}
.oe_styling_v8 .oe_button.oe_medium, .oe_styling_v8 a.oe_button.oe_medium {
padding: 5px 12px;
font-size: 16px;
}
.oe_styling_v8 .oe_button.oe_tacky, .oe_styling_v8 a.oe_button.oe_tacky {
background: #ff4444;
-webkit-box-shadow: 0px 2px 0px #eba8a8;
-moz-box-shadow: 0px 2px 0px #eba8a8;
box-shadow: 0px 2px 0px #eba8a8;
}
.oe_styling_v8 .oe_button.oe_tacky:hover, .oe_styling_v8 a.oe_button.oe_tacky:hover {
background: #ff1010;
}
.oe_styling_v8 .oe_button.oe_tacky:active, .oe_styling_v8 a.oe_button.oe_tacky:active {
background: black;
}
.oe_styling_v8 .oe_button.oe_disabled, .oe_styling_v8 a.oe_button.oe_disabled {
background: #c8c8c8;
-webkit-box-shadow: 0px 2px 0px #b4b4b4;
-moz-box-shadow: 0px 2px 0px #b4b4b4;
box-shadow: 0px 2px 0px #b4b4b4;
cursor: default;
}
.oe_styling_v8 .oe_button.oe_disabled:hover, .oe_styling_v8 a.oe_button.oe_disabled:hover {
background: #c8c8c8;
-webkit-box-shadow: 0px 2px 0px #b4b4b4;
-moz-box-shadow: 0px 2px 0px #b4b4b4;
box-shadow: 0px 2px 0px #b4b4b4;
}
.oe_styling_v8 .oe_button.oe_disabled:active, .oe_styling_v8 a.oe_button.oe_disabled:active {
background: #c8c8c8;
bottom: 0px;
-webkit-box-shadow: 0px 2px 0px #b4b4b4;
-moz-box-shadow: 0px 2px 0px #b4b4b4;
box-shadow: 0px 2px 0px #b4b4b4;
}
.oe_styling_v8.oe_styling_black .oe_button {
-webkit-box-shadow: 0px 2px 0px #463555;
-moz-box-shadow: 0px 2px 0px #463555;
box-shadow: 0px 2px 0px #463555;
}
/* ------ FORMS ----- */
.oe_styling_v8 {
/* FIXME: this is a quick hack for the release */
}
.oe_styling_v8 .oe_input {
padding: 4px 7px;
border-radius: 3px;
border: solid 1px #d6d6d6;
box-shadow: 0px 2px #e6e6e6;
background: #fafafa;
font-weight: 300;
outline: none;
-webkit-transition: all 150ms linear;
-moz-transition: all 150ms linear;
-o-transition: all 150ms linear;
transition: all 150ms linear;
}
.oe_styling_v8 .oe_input:focus {
border: solid 1px #969696;
box-shadow: 0px 2px #d2d2d2;
}
.oe_styling_v8 .oe_input.oe_valid {
background: #f2ffec;
border-color: #b1ebb6;
box-shadow: 0px 2px #e1f8e1;
color: #0f610f;
}
.oe_styling_v8 .oe_input.oe_invalid {
background: #fff2f2;
border-color: #ebb1b1;
box-shadow: 0px 2px #f8e1e1;
color: #610f0f;
}
.oe_styling_v8 .oe_input.oe_big {
padding: 8px 14px;
}
.oe_styling_v8 .oe_input_label {
font-weight: 300;
font-size: 16px;
}
.oe_styling_v8 .oe_input_label.oe_big {
font-size: 20px;
}
.oe_styling_v8 .oe_textarea {
width: 300px;
height: 80px;
}
.oe_styling_v8 .oe_form_layout_table {
width: 100%;
}
.oe_styling_v8 .oe_form_layout_table td {
padding-bottom: 16px;
}
.oe_styling_v8 .oe_form_layout_table td:first-child {
text-align: right;
padding-right: 16px;
}
/* ------ SLOGANS ----- */
.oe_styling_v8 .oe_slogan {
color: #333333;
font-family: "Lato", "Open Sans", "Helvetica", Sans;
text-align: center;
margin-top: 32px;
margin-bottom: 32px;
}
.oe_styling_v8 h1.oe_slogan {
font-size: 64px;
font-weight: 900;
margin-top: 48px;
margin-bottom: 48px;
}
.oe_styling_v8 h2.oe_slogan {
font-size: 40px;
font-weight: 300;
}
.oe_styling_v8 h3.oe_slogan {
font-size: 26px;
font-weight: 300;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
opacity: 0.5;
}
.oe_styling_v8 h4.oe_slogan {
font-size: 24px;
font-weight: 300;
}
.oe_styling_v8 h4.oe_slogan:before, .oe_styling_v8 h4.oe_slogan:after {
margin: 0 20px;
content: "";
display: inline-block;
width: 100px;
height: 0px;
border-top: solid 1px;
vertical-align: middle;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=30);
opacity: 0.3;
}
.oe_styling_v8 h5.oe_slogan {
font-weight: 300;
}
/* ------ QUOTES ----- */
.oe_quote {
margin: 8px;
padding: 16px;
background: rgba(0, 0, 0, 0.02);
border: solid 1px rgba(0, 0, 0, 0.06);
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
-ms-border-radius: 2px;
-o-border-radius: 2px;
border-radius: 2px;
}
.oe_quote .oe_q, .oe_quote q {
margin: 10px;
display: block;
font-style: italic;
text-align: center;
font-size: 20px;
color: #4e66e7;
}
.oe_quote .oe_q:before, .oe_quote .oe_q:after, .oe_quote q:before, .oe_quote q:after {
content: '"';
font-weight: 900;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=20);
opacity: 0.2;
}
.oe_quote cite {
display: block;
font-style: normal;
margin-top: 16px;
}
.oe_quote .oe_photo {
float: left;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
margin-right: 16px;
}
.oe_quote .oe_author {
font-size: 20px;
padding-top: 6px;
color: #8d7bac;
}
.oe_dark .oe_quote {
background: white;
border: 1px solid #f0f0ff;
}
/* ------ PICTURES ----- */
.oe_picture {
display: block;
max-width: 84%;
max-height: 400px;
margin: 16px 8%;
}
.oe_screenshot {
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
-webkit-box-shadow: 0px 3px 8px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0px 3px 8px rgba(0, 0, 0, 0.2);
box-shadow: 0px 3px 8px rgba(0, 0, 0, 0.2);
}
.oe_pic_ctr {
position: relative;
}
.oe_pic_ctr > img.oe_picture {
width: 100%;
max-width: none;
max-height: none;
margin: 0;
}
.oe_pic_ctr > .oe_title {
position: absolute;
top: 15px;
right: 38px;
}
.oe_styling_v8 .oe_pic_ctr > .oe_title {
font-size: 64px;
color: white;
font-weight: 600;
margin: 0;
text-shadow: 0px 2px 0px #494949, 0px 2px 5px rgba(0, 0, 0, 0.33), 0px 0px 60px rgba(0, 0, 0, 0.22);
}
/* ----- Link Image with Footer ----- */
/* FIXME: Terrible CSS, rewrite this */
div.oe_demo {
position: relative;
border: 1px solid #dedede;
}
div.oe_demo span.oe_demo_play {
top: 50%;
left: 50%;
width: 80px;
height: 60px;
margin-top: -30px;
margin-left: -40px;
display: block;
position: absolute;
background: url("../img/layout/play-button.png") no-repeat left top transparent;
pointer-events: none;
}
div.oe_demo img {
max-width: 100%;
width: 100%;
}
div.oe_demo div.oe_demo_footer {
position: absolute;
left: 0;
background-color: rgba(0, 0, 0, 0.4);
opacity: 0.85;
bottom: -1px;
width: 100%;
padding-top: 7px;
padding-bottom: 7px;
color: white;
font-size: 14px;
font-weight: bold;
border-bottom-left-radius: 3px;
border-bottom-right-radius: 3px;
pointer-events: none;
}
div.oe_demo:hover span.oe_demo_play {
background: url("../img/layout/play-button-over.png") no-repeat left top transparent;
}
/* ----- SEPARATOR ----- */
.oe_styling_v8 .oe_container.oe_separator {
height: 64px;
margin-bottom: 16px;
background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, rgba(0, 0, 0, 0.02)));
background: -webkit-linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.02));
background: -moz-linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.02));
background: -o-linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.02));
background: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.02));
-webkit-box-shadow: 0px -3px 10px -5px rgba(0, 0, 0, 0.1) inset;
-moz-box-shadow: 0px -3px 10px -5px rgba(0, 0, 0, 0.1) inset;
box-shadow: 0px -3px 10px -5px rgba(0, 0, 0, 0.1) inset;
overflow-y: hidden;
}
/* ----- TABS ----- */
.oe_row_tabs {
text-align: center;
margin-top: 0px;
margin-bottom: 0px;
padding-top: 21px;
}
.oe_row_tab {
position: relative;
min-width: 120px;
padding: 8px;
font-size: 20px;
display: inline-block;
margin: 0px -2px;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
border: solid 1px rgba(0, 0, 0, 0.1);
border-bottom: none;
background: #fafafa;
background-image: +linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.02));
box-shadow: 0px -3px 10px -5px rgba(0, 0, 0, 0.1) inset;
cursor: pointer;
-webkit-transition: all 250ms linear;
-moz-transition: all 250ms linear;
-o-transition: all 250ms linear;
transition: all 250ms linear;
}
.oe_row_tab:hover {
padding-bottom: 12px;
top: -4px;
background-color: white;
}
.oe_row_tab.oe_active {
background-color: white;
background-image: none;
box-shadow: none;
border-top-color: #8272b6;
border-top-width: 2px;
cursor: default;
}
.oe_row_tab.oe_active:hover {
padding-bottom: 8px;
top: 0asx;
}
/* ------ CALL TO ACTION ----- */
.oe_calltoaction {
height: 32px;
margin-top: -32px;
position: relative;
}

View File

@ -0,0 +1,572 @@
@charset "utf-8"
@import "compass/css3"
@import "compass/css3/user-interface"
/**
* This CSS is for the html description of modules
* TODO clean
*/
/* --------------------------------- *
* STYLING CONTEXT *
* --------------------------------- */
/* --- Styling for the V8/Lato/White/Purple design --- */
$v8_title_font_color: rgb(51,51,51)
$v8_text_font_color: rgb(100,100,100)
$v8_font_paragraph_color: rgb(51,51,51)
$v8_body_color: rgb(245,245,245)
$v8_bg_color: rgb(255,255,255)
$v8_text_font_family: 'Open Sans','Helvetica',Sans
$v8_title_font_family: 'Lato','Open Sans','Helvetica',Sans
$v8_anchor_color: #6D57E0
$v8_anchor_visited_color: rgb(91, 40, 79)
.openerp .oe_form_sheet_width
max-width: 960px
.openerp .oe_form .oe_styling_v8
width: 100%
padding: 0
margin: 0
font-family: $v8_text_font_family
font-weight: 300
color: $v8_text_font_color
background: $v8_bg_color
font-size: 16px
.oe_websiteonly
display: none
.oe_website_contents
background: $v8_body_color
padding-bottom: 1px
b
font-weight: 600
a
color: $v8_anchor_color
text-decoration: none
a:visited
color: $v8_anchor_visited_color
a:hover
color: #0096EB
.oe_title_font
font-family: $v8_title_font_family
.oe_page
background: $v8_bg_color
overflow: hidden
+border-radius(1px)
+box-shadow(0 1px 3px rgba(0,0,0,0.35))
.oe_emph
font-weight: 400
.oe_dark
overflow: hidden
background: #FCFCFC
+box-shadow(0px 5px 9px -7px rgba(0,0,255,0.5) inset, 0px -3px 9px -7px rgba(0,0,255,0.5) inset)
/* --------------------------------- *
* LAYOUT *
* --------------------------------- */
/* ------ BASE GRID CONSTRUCTS ----- */
.oe_page
margin: 0px auto 64px auto
max-width: 992px
.oe_row
width: 928px
margin-top: 16px
margin-bottom: 16px
margin-left: auto
margin-right: auto
.oe_row.oe_fit
width: auto
.oe_clearfix:after, .oe_row:after
content: "."
display: block
clear: both
visibility: hidden
line-height: 0
height: 0
$oe_span12_width: 928px
$oe_span10_width: 773px
$oe_span9_width: 696px
$oe_span8_width: 618px
$oe_span6_width: 464px
$oe_span4_width: 309px
$oe_span3_width: 232px
$oe_span2_width: 154px
[class*='oe_span']
float: left
+box-sizing(border-box)
padding: 0 16px
.oe_span12
width: $oe_span12_width
.oe_span10
width: $oe_span10_width
.oe_span9
width: $oe_span9_width
.oe_span8
width: $oe_span8_width
.oe_span6
width: $oe_span6_width
.oe_span4
width: $oe_span4_width
.oe_span3
width: $oe_span3_width
.oe_span2
width: $oe_span2_width
[class*='oe_span'].oe_fit
padding-left: 0px !important
padding-right: 0px !important
[class*='oe_span'].oe_right
float: right
.oe_row.oe_flex
[class*='oe_span']
display: inline-block
float: none
vertical-align: top
+box-sizing(border-box)
padding: 0 16px
width: auto
.oe_span12
max-width: $oe_span12_width
.oe_span10
max-width: ($oe_span10_width +-4px)
.oe_span9
max-width: ($oe_span9_width +-4px)
.oe_span8
max-width: ($oe_span8_width +-4px)
.oe_span6
max-width: ($oe_span6_width +-4px)
.oe_span4
max-width: ($oe_span4_width +-4px)
.oe_span3
max-width: ($oe_span3_width +-4px)
.oe_span2
max-width: ($oe_span2_width +-4px)
.oe_mb0
margin-bottom: 0px !important
.oe_mb4
margin-bottom: 4px !important
.oe_mb8
margin-bottom: 8px !important
.oe_mb16
margin-bottom: 16px !important
.oe_mb32
margin-bottom: 32px !important
.oe_mb48
margin-bottom: 48px !important
.oe_mb64
margin-bottom: 64px !important
.oe_mt0
margin-top: 0px !important
.oe_mt4
margin-top: 4px !important
.oe_mt8
margin-top: 8px !important
.oe_mt16
margin-top: 16px !important
.oe_mt32
margin-top: 32px !important
.oe_mt48
margin-top: 48px !important
.oe_mt64
margin-top: 64px !important
/* ------ GENERIC LAYOUT MODIFIERS ----- */
.oe_rightfit
padding-right: 0px !important
.oe_leftfit
padding-left: 0px !important
.oe_leftalign
text-align: left
.oe_rightalign
text-align: right
.oe_centeralign
text-align: center
.oe_centered
margin-left: auto
margin-right: auto
.oe_hidden
display: none !important
opacity: 0 !important
.oe_invisible
visibility: hidden !important
.oe_transparent
opacity: 0 !important
.oe_mb0
margin-bottom: 0px !important
.oe_mb4
margin-bottom: 4px !important
.oe_mb8
margin-bottom: 8px !important
.oe_mb16
margin-bottom: 16px !important
.oe_mb32
margin-bottom: 32px !important
.oe_mb64
margin-bottom: 64px !important
.oe_spaced
margin-top: 32px
margin-bottom: 32px
.oe_more_spaced
margin-top: 64px
margin-bottom: 64px
.oe_padded
padding-top: 16px
padding-bottom: 16px
.oe_more_padded
padding-top: 32px
padding-bottom: 32px
/* --------------------------------- *
* WEBPAGE COMPONENTS *
* --------------------------------- */
/* ------ BUTTONS ----- */
.oe_button
position: relative
bottom: 0
display: inline-block
cursor: pointer
+user-select(none)
.oe_styling_v8 .oe_button, .oe_styling_v8 a.oe_button
padding: 8px 14px
background: rgb(139, 114, 182)
color: white
+border-radius(2px)
+box-shadow(0px 2px 0px rgb(175, 168, 204))
+text-shadow(0px 1px 1px rgba(0,0,0, 0.44))
border: solid 1px rgba(0,0,0,0.09)
+transition-property((bottom, background))
+transition-duration(250ms)
&:hover
background: rgb(139,91,221)
color: white
&:active
background: rgb(51,51,51)
bottom: -3px
&.oe_big
font-size: 24px
&.oe_bigger
font-size: 32px
&.oe_small
font-size: 13px
padding: 2px 4px
&:active
bottom: -1px
&.oe_medium
padding: 5px 12px
font-size: 16px
&.oe_tacky
background: rgb(255,68,68)
+box-shadow(0px 2px 0px #eba8a8)
&:hover
background: rgb(255,16,16)
&:active
background: black
&.oe_disabled
background: rgb(200,200,200)
+box-shadow(0px 2px 0px rgb(180,180,180))
cursor: default
&:hover
background: rgb(200,200,200)
+box-shadow(0px 2px 0px rgb(180,180,180))
&:active
background: rgb(200,200,200)
bottom: 0px
+box-shadow(0px 2px 0px rgb(180,180,180))
.oe_styling_v8.oe_styling_black .oe_button
+box-shadow(0px 2px 0px rgb(70,53,85))
/* ------ FORMS ----- */
.oe_styling_v8
.oe_input
padding: 4px 7px
border-radius: 3px
border: solid 1px rgb(214,214,214)
box-shadow: 0px 2px rgb(230,230,230)
background: rgb(250,250,250)
font-weight: 300
outline: none
@include transition( all 150ms linear )
&:focus
border: solid 1px rgb(150,150,150)
box-shadow: 0px 2px rgb(210,210,210)
&.oe_valid
background: #F2FFEC
border-color: rgb(177,235,182)
box-shadow: 0px 2px rgb(225,248,225)
color: rgb(15,97,15)
&.oe_invalid
background: rgb(255,242,242)
border-color: #EBB1B1
box-shadow: 0px 2px #F8E1E1
color: #610F0F
&.oe_big
padding: 8px 14px
.oe_input_label
font-weight: 300
font-size: 16px
&.oe_big
font-size: 20px
/* FIXME: this is a quick hack for the release */
.oe_textarea
width: 300px
height: 80px
.oe_form_layout_table
width: 100%
td
padding-bottom: 16px
&:first-child
text-align: right
padding-right: 16px
/* ------ SLOGANS ----- */
.oe_styling_v8
.oe_slogan
color: $v8_title_font_color
font-family: $v8_title_font_family
text-align: center
margin-top: 32px
margin-bottom: 32px
h1.oe_slogan
font-size: 64px
font-weight: 900
margin-top: 48px
margin-bottom: 48px
h2.oe_slogan
font-size: 40px
font-weight: 300
h3.oe_slogan
font-size: 26px
font-weight: 300
+opacity(0.5)
h4.oe_slogan
font-size: 24px
font-weight: 300
h4.oe_slogan:before, h4.oe_slogan:after
margin: 0 20px
content: ""
display: inline-block
width: 100px
height: 0px
border-top: solid 1px
vertical-align: middle
+opacity(0.3)
h5.oe_slogan
font-weight: 300
//TODO
/* ------ QUOTES ----- */
.oe_quote
margin: 8px
padding: 16px
background: rgba(0,0,0,0.02)
border: solid 1px rgba(0,0,0,0.06)
+border-radius(2px)
.oe_q,q
margin: 10px
display: block
font-style: italic
text-align: center
font-size: 20px
color: rgb(78, 102, 231)
&:before, &:after
content: '\"'
font-weight: 900
+opacity(0.2)
cite
display: block
font-style: normal
margin-top: 16px
.oe_photo
float: left
+border-radius(3px)
margin-right: 16px
.oe_author
font-size: 20px
padding-top: 6px
color: rgb(141, 123, 172)
.oe_dark .oe_quote
background: white
border: 1px solid rgb(240,240,255)
/* ------ PICTURES ----- */
// display a picture in a span
.oe_picture
display: block
max-width: 84%
max-height: 400px
margin: 16px 8%
// style the picture like a screenshot
.oe_screenshot
+border-radius(3px)
+box-shadow(0px 3px 8px rgba(0,0,0,0.2))
// display a picture taking full width of a row
.oe_pic_ctr
position: relative
.oe_pic_ctr > img.oe_picture
width: 100%
max-width: none
max-height: none
margin: 0
// styling of the picture's title
.oe_pic_ctr > .oe_title
position: absolute
top: 15px
right: 38px
.oe_styling_v8 .oe_pic_ctr > .oe_title
font-size: 64px
color: white
font-weight: 600
margin: 0
+text-shadow( 0px 2px 0px rgb(73, 73, 73), 0px 2px 5px rgba(0, 0, 0, 0.33), 0px 0px 60px rgba(0, 0, 0, 0.22))
/* ----- Link Image with Footer ----- */
/* FIXME: Terrible CSS, rewrite this */
div.oe_demo
position: relative
border: 1px solid #dedede
span.oe_demo_play
top: 50%
left: 50%
width: 80px
height: 60px
margin-top: -30px
margin-left: -40px
display: block
position: absolute
background: url("../img/layout/play-button.png") no-repeat left top transparent
pointer-events: none
img
max-width: 100%
width: 100%
div.oe_demo_footer
position: absolute
left: 0
background-color: rgba(0,0,0,0.4)
opacity: 0.85
bottom: -1px
width: 100%
padding-top: 7px
padding-bottom: 7px
color: white
font-size: 14px
font-weight: bold
border-bottom-left-radius: 3px
border-bottom-right-radius: 3px
pointer-events: none
div.oe_demo:hover
span.oe_demo_play
background: url("../img/layout/play-button-over.png") no-repeat left top transparent
/* ----- SEPARATOR ----- */
.oe_styling_v8 .oe_container.oe_separator
height: 64px
margin-bottom: 16px
@include background(linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0.02)))
+box-shadow(0px -3px 10px -5px rgba(0,0,0,0.1) inset)
overflow-y: hidden
/* ----- TABS ----- */
.oe_row_tabs
text-align: center
margin-top: 0px
margin-bottom: 0px
padding-top: 21px
.oe_row_tab
position: relative
min-width: 120px
padding: 8px
font-size: 20px
display: inline-block
margin: 0px -2px
border-top-left-radius: 4px
border-top-right-radius: 4px
border: solid 1px rgba(0,0,0,0.1)
border-bottom: none
background: rgb(250,250,250)
background-image: +linear-gradient(rgba(0,0,0,0), rgba(0,0,0,0.02))
box-shadow: 0px -3px 10px -5px rgba(0,0,0,0.1) inset
cursor: pointer
@include transition(all 250ms linear)
.oe_row_tab:hover
padding-bottom: 12px
top: -4px
background-color: white
.oe_row_tab.oe_active
background-color: white
background-image: none
box-shadow: none
border-top-color: rgb(130, 114, 182)
border-top-width: 2px
cursor: default
.oe_row_tab.oe_active:hover
padding-bottom: 8px
top: 0asx
/* ------ CALL TO ACTION ----- */
.oe_calltoaction
height: 32px
margin-top: -32px
position: relative

View File

@ -92,7 +92,8 @@ openerp.base = function(instance) {
start: function() {
var self = this;
return self.get_client().
// desactivated for now because apps does not work anyway due to changes in the framework
/*return self.get_client().
done(function(client) {
client.replace(self.$el).
done(function() {
@ -100,13 +101,13 @@ openerp.base = function(instance) {
client.do_action(self.remote_action_id, {hide_breadcrumb: true});
});
}).
fail(function(client) {
self.do_warn(_t('OpenERP Apps Unreachable'), _t('Showing locally available modules'), true);
fail(function(client) {*/
//self.do_warn(_t('OpenERP Apps Unreachable'), _t('Showing locally available modules'), true);
self.rpc('/web/action/load', {action_id: self.failback_action_id}).done(function(action) {
self.do_action(action);
instance.webclient.menu.open_action(action.id);
});
});
//});
},
});

View File

@ -1,5 +1,6 @@
import test_base
import test_expression
import test_ir_actions
import test_ir_attachment
import test_ir_values
import test_menu
@ -10,6 +11,7 @@ import test_search
checks = [
test_base,
test_expression,
test_ir_actions,
test_ir_attachment,
test_ir_values,
test_menu,

View File

@ -0,0 +1,398 @@
import unittest2
from openerp.osv.orm import except_orm
import openerp.tests.common as common
from openerp.tools import mute_logger
class TestServerActionsBase(common.TransactionCase):
def setUp(self):
super(TestServerActionsBase, self).setUp()
cr, uid = self.cr, self.uid
# Models
self.ir_actions_server = self.registry('ir.actions.server')
self.ir_actions_client = self.registry('ir.actions.client')
self.ir_values = self.registry('ir.values')
self.ir_model = self.registry('ir.model')
self.ir_model_fields = self.registry('ir.model.fields')
self.res_partner = self.registry('res.partner')
self.res_country = self.registry('res.country')
# Data on which we will run the server action
self.test_country_id = self.res_country.create(cr, uid, {
'name': 'TestingCountry',
'code': 'TY',
'address_format': 'SuperFormat',
})
self.test_country = self.res_country.browse(cr, uid, self.test_country_id)
self.test_partner_id = self.res_partner.create(cr, uid, {
'name': 'TestingPartner',
'city': 'OrigCity',
'country_id': self.test_country_id,
})
self.test_partner = self.res_partner.browse(cr, uid, self.test_partner_id)
self.context = {
'active_id': self.test_partner_id,
'active_model': 'res.partner',
}
# Model data
self.res_partner_model_id = self.ir_model.search(cr, uid, [('model', '=', 'res.partner')])[0]
self.res_partner_name_field_id = self.ir_model_fields.search(cr, uid, [('model', '=', 'res.partner'), ('name', '=', 'name')])[0]
self.res_partner_city_field_id = self.ir_model_fields.search(cr, uid, [('model', '=', 'res.partner'), ('name', '=', 'city')])[0]
self.res_partner_country_field_id = self.ir_model_fields.search(cr, uid, [('model', '=', 'res.partner'), ('name', '=', 'country_id')])[0]
self.res_partner_parent_field_id = self.ir_model_fields.search(cr, uid, [('model', '=', 'res.partner'), ('name', '=', 'parent_id')])[0]
self.res_country_model_id = self.ir_model.search(cr, uid, [('model', '=', 'res.country')])[0]
self.res_country_name_field_id = self.ir_model_fields.search(cr, uid, [('model', '=', 'res.country'), ('name', '=', 'name')])[0]
self.res_country_code_field_id = self.ir_model_fields.search(cr, uid, [('model', '=', 'res.country'), ('name', '=', 'code')])[0]
# create server action to
self.act_id = self.ir_actions_server.create(cr, uid, {
'name': 'TestAction',
'condition': 'True',
'model_id': self.res_partner_model_id,
'state': 'code',
'code': 'obj.write({"comment": "MyComment"})',
})
class TestServerActions(TestServerActionsBase):
def test_00_action(self):
cr, uid = self.cr, self.uid
# Do: eval 'True' condition
self.ir_actions_server.run(cr, uid, [self.act_id], self.context)
self.test_partner.refresh()
self.assertEqual(self.test_partner.comment, 'MyComment', 'ir_actions_server: invalid condition check')
self.test_partner.write({'comment': False})
# Do: eval False condition, that should be considered as True (void = True)
self.ir_actions_server.write(cr, uid, [self.act_id], {'condition': False})
self.ir_actions_server.run(cr, uid, [self.act_id], self.context)
self.test_partner.refresh()
self.assertEqual(self.test_partner.comment, 'MyComment', 'ir_actions_server: invalid condition check')
# Do: create contextual action
self.ir_actions_server.create_action(cr, uid, [self.act_id])
# Test: ir_values created
ir_values_ids = self.ir_values.search(cr, uid, [('name', '=', 'Run TestAction')])
self.assertEqual(len(ir_values_ids), 1, 'ir_actions_server: create_action should have created an entry in ir_values')
ir_value = self.ir_values.browse(cr, uid, ir_values_ids[0])
self.assertEqual(ir_value.value, 'ir.actions.server,%s' % self.act_id, 'ir_actions_server: created ir_values should reference the server action')
self.assertEqual(ir_value.model, 'res.partner', 'ir_actions_server: created ir_values should be linked to the action base model')
# Do: remove contextual action
self.ir_actions_server.unlink_action(cr, uid, [self.act_id])
# Test: ir_values removed
ir_values_ids = self.ir_values.search(cr, uid, [('name', '=', 'Run TestAction')])
self.assertEqual(len(ir_values_ids), 0, 'ir_actions_server: unlink_action should remove the ir_values record')
def test_10_code(self):
cr, uid = self.cr, self.uid
self.ir_actions_server.write(cr, uid, self.act_id, {
'state': 'code',
'code': """partner_name = obj.name + '_code'
self.pool["res.partner"].create(cr, uid, {"name": partner_name}, context=context)"""
})
run_res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)
self.assertFalse(run_res, 'ir_actions_server: code server action correctly finished should return False')
pids = self.res_partner.search(cr, uid, [('name', 'ilike', 'TestingPartner_code')])
self.assertEqual(len(pids), 1, 'ir_actions_server: 1 new partner should have been created')
def test_20_trigger(self):
cr, uid = self.cr, self.uid
# Data: code server action (at this point code-based actions should work)
act_id2 = self.ir_actions_server.create(cr, uid, {
'name': 'TestAction2',
'type': 'ir.actions.server',
'condition': 'True',
'model_id': self.res_partner_model_id,
'state': 'code',
'code': 'obj.write({"comment": "MyComment"})',
})
act_id3 = self.ir_actions_server.create(cr, uid, {
'name': 'TestAction3',
'type': 'ir.actions.server',
'condition': 'True',
'model_id': self.res_country_model_id,
'state': 'code',
'code': 'obj.write({"code": "ZZ"})',
})
# Data: create workflows
partner_wf_id = self.registry('workflow').create(cr, uid, {
'name': 'TestWorkflow',
'osv': 'res.partner',
'on_create': True,
})
partner_act1_id = self.registry('workflow.activity').create(cr, uid, {
'name': 'PartnerStart',
'wkf_id': partner_wf_id,
'flow_start': True
})
partner_act2_id = self.registry('workflow.activity').create(cr, uid, {
'name': 'PartnerTwo',
'wkf_id': partner_wf_id,
'kind': 'function',
'action': 'True',
'action_id': act_id2,
})
partner_trs1_id = self.registry('workflow.transition').create(cr, uid, {
'signal': 'partner_trans',
'act_from': partner_act1_id,
'act_to': partner_act2_id
})
country_wf_id = self.registry('workflow').create(cr, uid, {
'name': 'TestWorkflow',
'osv': 'res.country',
'on_create': True,
})
country_act1_id = self.registry('workflow.activity').create(cr, uid, {
'name': 'CountryStart',
'wkf_id': country_wf_id,
'flow_start': True
})
country_act2_id = self.registry('workflow.activity').create(cr, uid, {
'name': 'CountryTwo',
'wkf_id': country_wf_id,
'kind': 'function',
'action': 'True',
'action_id': act_id3,
})
country_trs1_id = self.registry('workflow.transition').create(cr, uid, {
'signal': 'country_trans',
'act_from': country_act1_id,
'act_to': country_act2_id
})
# Data: re-create country and partner to benefit from the workflows
self.test_country_id = self.res_country.create(cr, uid, {
'name': 'TestingCountry2',
'code': 'T2',
})
self.test_country = self.res_country.browse(cr, uid, self.test_country_id)
self.test_partner_id = self.res_partner.create(cr, uid, {
'name': 'TestingPartner2',
'country_id': self.test_country_id,
})
self.test_partner = self.res_partner.browse(cr, uid, self.test_partner_id)
self.context = {
'active_id': self.test_partner_id,
'active_model': 'res.partner',
}
# Run the action on partner object itself ('base')
self.ir_actions_server.write(cr, uid, [self.act_id], {
'state': 'trigger',
'use_relational_model': 'base',
'wkf_model_id': self.res_partner_model_id,
'wkf_model_name': 'res.partner',
'wkf_transition_id': partner_trs1_id,
})
self.ir_actions_server.run(cr, uid, [self.act_id], self.context)
self.test_partner.refresh()
self.assertEqual(self.test_partner.comment, 'MyComment', 'ir_actions_server: incorrect signal trigger')
# Run the action on related country object ('relational')
self.ir_actions_server.write(cr, uid, [self.act_id], {
'use_relational_model': 'relational',
'wkf_model_id': self.res_country_model_id,
'wkf_model_name': 'res.country',
'wkf_field_id': self.res_partner_country_field_id,
'wkf_transition_id': country_trs1_id,
})
self.ir_actions_server.run(cr, uid, [self.act_id], self.context)
self.test_country.refresh()
self.assertEqual(self.test_country.code, 'ZZ', 'ir_actions_server: incorrect signal trigger')
# Clear workflow cache, otherwise openerp will try to create workflows even if it has been deleted
from openerp.workflow import clear_cache
clear_cache(cr, uid)
def test_30_client(self):
cr, uid = self.cr, self.uid
client_action_id = self.registry('ir.actions.client').create(cr, uid, {
'name': 'TestAction2',
'tag': 'Test',
})
self.ir_actions_server.write(cr, uid, [self.act_id], {
'state': 'client_action',
'action_id': client_action_id,
})
res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)
self.assertEqual(res['name'], 'TestAction2', 'ir_actions_server: incorrect return result for a client action')
def test_40_crud_create(self):
cr, uid = self.cr, self.uid
_city = 'TestCity'
_name = 'TestNew'
# Do: create a new record in the same model and link it
self.ir_actions_server.write(cr, uid, [self.act_id], {
'state': 'object_create',
'use_create': 'new',
'link_new_record': True,
'link_field_id': self.res_partner_parent_field_id,
'fields_lines': [(0, 0, {'col1': self.res_partner_name_field_id, 'value': _name}),
(0, 0, {'col1': self.res_partner_city_field_id, 'value': _city})],
})
run_res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)
self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False')
# Test: new partner created
pids = self.res_partner.search(cr, uid, [('name', 'ilike', _name)])
self.assertEqual(len(pids), 1, 'ir_actions_server: TODO')
partner = self.res_partner.browse(cr, uid, pids[0])
self.assertEqual(partner.city, _city, 'ir_actions_server: TODO')
# Test: new partner linked
self.test_partner.refresh()
self.assertEqual(self.test_partner.parent_id.id, pids[0], 'ir_actions_server: TODO')
# Do: copy current record
self.ir_actions_server.write(cr, uid, [self.act_id], {'fields_lines': [[5]]})
self.ir_actions_server.write(cr, uid, [self.act_id], {
'state': 'object_create',
'use_create': 'copy_current',
'link_new_record': False,
'fields_lines': [(0, 0, {'col1': self.res_partner_name_field_id, 'value': 'TestCopyCurrent'}),
(0, 0, {'col1': self.res_partner_city_field_id, 'value': 'TestCity'})],
})
run_res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)
self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False')
# Test: new partner created
pids = self.res_partner.search(cr, uid, [('name', 'ilike', 'TestingPartner (copy)')]) # currently res_partner overrides default['name'] whatever its value
self.assertEqual(len(pids), 1, 'ir_actions_server: TODO')
partner = self.res_partner.browse(cr, uid, pids[0])
self.assertEqual(partner.city, 'TestCity', 'ir_actions_server: TODO')
self.assertEqual(partner.country_id.id, self.test_partner.country_id.id, 'ir_actions_server: TODO')
# Do: create a new record in another model
self.ir_actions_server.write(cr, uid, [self.act_id], {'fields_lines': [[5]]})
self.ir_actions_server.write(cr, uid, [self.act_id], {
'state': 'object_create',
'use_create': 'new_other',
'crud_model_id': self.res_country_model_id,
'link_new_record': False,
'fields_lines': [(0, 0, {'col1': self.res_country_name_field_id, 'value': 'obj.name', 'type': 'equation'}),
(0, 0, {'col1': self.res_country_code_field_id, 'value': 'obj.name[0:2]', 'type': 'equation'})],
})
run_res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)
self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False')
# Test: new country created
cids = self.res_country.search(cr, uid, [('name', 'ilike', 'TestingPartner')])
self.assertEqual(len(cids), 1, 'ir_actions_server: TODO')
country = self.res_country.browse(cr, uid, cids[0])
self.assertEqual(country.code, 'TE', 'ir_actions_server: TODO')
# Do: copy a record in another model
self.ir_actions_server.write(cr, uid, [self.act_id], {'fields_lines': [[5]]})
self.ir_actions_server.write(cr, uid, [self.act_id], {
'state': 'object_create',
'use_create': 'copy_other',
'crud_model_id': self.res_country_model_id,
'link_new_record': False,
'ref_object': 'res.country,%s' % self.test_country_id,
'fields_lines': [(0, 0, {'col1': self.res_country_name_field_id, 'value': 'NewCountry', 'type': 'value'}),
(0, 0, {'col1': self.res_country_code_field_id, 'value': 'NY', 'type': 'value'})],
})
run_res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)
self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False')
# Test: new country created
cids = self.res_country.search(cr, uid, [('name', 'ilike', 'NewCountry')])
self.assertEqual(len(cids), 1, 'ir_actions_server: TODO')
country = self.res_country.browse(cr, uid, cids[0])
self.assertEqual(country.code, 'NY', 'ir_actions_server: TODO')
self.assertEqual(country.address_format, 'SuperFormat', 'ir_actions_server: TODO')
def test_50_crud_write(self):
cr, uid = self.cr, self.uid
_name = 'TestNew'
# Do: create a new record in the same model and link it
self.ir_actions_server.write(cr, uid, [self.act_id], {
'state': 'object_write',
'use_write': 'current',
'fields_lines': [(0, 0, {'col1': self.res_partner_name_field_id, 'value': _name})],
})
run_res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)
self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False')
# Test: new partner created
pids = self.res_partner.search(cr, uid, [('name', 'ilike', _name)])
self.assertEqual(len(pids), 1, 'ir_actions_server: TODO')
partner = self.res_partner.browse(cr, uid, pids[0])
self.assertEqual(partner.city, 'OrigCity', 'ir_actions_server: TODO')
# Do: copy current record
self.ir_actions_server.write(cr, uid, [self.act_id], {'fields_lines': [[5]]})
self.ir_actions_server.write(cr, uid, [self.act_id], {
'use_write': 'other',
'crud_model_id': self.res_country_model_id,
'ref_object': 'res.country,%s' % self.test_country_id,
'fields_lines': [(0, 0, {'col1': self.res_country_name_field_id, 'value': 'obj.name', 'type': 'equation'})],
})
run_res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)
self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False')
# Test: new country created
cids = self.res_country.search(cr, uid, [('name', 'ilike', 'TestNew')])
self.assertEqual(len(cids), 1, 'ir_actions_server: TODO')
# Do: copy a record in another model
self.ir_actions_server.write(cr, uid, [self.act_id], {'fields_lines': [[5]]})
self.ir_actions_server.write(cr, uid, [self.act_id], {
'use_write': 'expression',
'crud_model_id': self.res_country_model_id,
'write_expression': 'object.country_id',
'fields_lines': [(0, 0, {'col1': self.res_country_name_field_id, 'value': 'NewCountry', 'type': 'value'})],
})
run_res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)
self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False')
# Test: new country created
cids = self.res_country.search(cr, uid, [('name', 'ilike', 'NewCountry')])
self.assertEqual(len(cids), 1, 'ir_actions_server: TODO')
@mute_logger('openerp.addons.base.ir.ir_model', 'openerp.osv.orm')
def test_60_multi(self):
cr, uid = self.cr, self.uid
# Data: 2 server actions that will be nested
act1_id = self.ir_actions_server.create(cr, uid, {
'name': 'Subaction1',
'model_id': self.res_partner_model_id,
'state': 'code',
'code': 'action = {"type": "ir.actions.act_window"}',
})
# Do: create a new record in the same model and link it
act2_id = self.ir_actions_server.create(cr, uid, {
'name': 'Subaction2',
'model_id': self.res_partner_model_id,
'state': 'object_create',
'use_create': 'copy_current',
})
self.ir_actions_server.write(cr, uid, [self.act_id], {
'state': 'multi',
'child_ids': [(6, 0, [act1_id, act2_id])],
})
# Do: run the action
res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)
# Test: new partner created
pids = self.res_partner.search(cr, uid, [('name', 'ilike', 'TestingPartner (copy)')]) # currently res_partner overrides default['name'] whatever its value
self.assertEqual(len(pids), 1, 'ir_actions_server: TODO')
# Test: action returned
self.assertEqual(res.get('type'), 'ir.actions.act_window', '')
# Test loops
self.assertRaises(except_orm, self.ir_actions_server.write, cr, uid, [self.act_id], {
'child_ids': [(6, 0, [self.act_id])]
})
if __name__ == '__main__':
unittest2.main()

Some files were not shown because too many files have changed in this diff Show More