[Merge] Merge with lp:openobject-server
bzr revid: pja@tinyerp.com-20121116050347-5w5v4h7stdn9oyhp
This commit is contained in:
+15
-280
@@ -155,6 +155,21 @@ You can specify alternate configuration files with ::
|
||||
|
||||
-c CONFIG, --config=CONFIG specify alternate config file
|
||||
|
||||
Configure addons locations
|
||||
--------------------------
|
||||
|
||||
By default, the only directory of addons known by the server is server/bin/addons.
|
||||
It is possible to add new addons by
|
||||
|
||||
- copying them in server/bin/addons, or creating a symbolic link to each
|
||||
of them in this directory, or
|
||||
- specifying another directory containing addons to the server. The later
|
||||
can be accomplished either by running the server with the ``--addons-path=``
|
||||
option, or by configuring this option in the openerp_serverrc file,
|
||||
automatically generated under Linux in your home directory by the
|
||||
server when executed with the ``--save`` option. You can provide several
|
||||
addons to the ``addons_path`` = option, separating them using commas.
|
||||
|
||||
Start-up script
|
||||
===============
|
||||
|
||||
@@ -173,283 +188,3 @@ Yet another alternative is to use a WSGI-compatible HTTP server and let it call
|
||||
into one of the WSGI entry points of the server.
|
||||
|
||||
|
||||
Appendix
|
||||
========
|
||||
|
||||
Command line options example
|
||||
++++++++++++++++++++++++++++
|
||||
|
||||
Usage: openerp-server [options]
|
||||
|
||||
**Options**::
|
||||
|
||||
--version show program's version number and exit
|
||||
-h, --help show this help message and exit
|
||||
|
||||
**Common options**::
|
||||
|
||||
-c CONFIG, --config=CONFIG
|
||||
specify alternate config file
|
||||
-s, --save save configuration to ~/.openerp_serverrc
|
||||
-i INIT, --init=INIT
|
||||
install one or more modules (comma-separated list, use
|
||||
"all" for all modules), requires -d
|
||||
-u UPDATE, --update=UPDATE
|
||||
update one or more modules (comma-separated list, use
|
||||
"all" for all modules). Requires -d.
|
||||
--without-demo=WITHOUT_DEMO
|
||||
disable loading demo data for modules to be installed
|
||||
(comma-separated, use "all" for all modules). Requires
|
||||
-d and -i. Default is none
|
||||
-P IMPORT_PARTIAL, --import-partial=IMPORT_PARTIAL
|
||||
Use this for big data importation, if it crashes you
|
||||
will be able to continue at the current state. Provide
|
||||
a filename to store intermediate importation states.
|
||||
--pidfile=PIDFILE file where the server pid will be stored
|
||||
--addons-path=ADDONS_PATH
|
||||
specify additional addons paths (separated by commas).
|
||||
--load=SERVER_WIDE_MODULES
|
||||
Comma-separated list of server-wide modules
|
||||
default=web
|
||||
|
||||
**XML-RPC Configuration**::
|
||||
|
||||
--xmlrpc-interface=XMLRPC_INTERFACE
|
||||
Specify the TCP IP address for the XML-RPC protocol.
|
||||
The empty string binds to all interfaces.
|
||||
--xmlrpc-port=XMLRPC_PORT
|
||||
specify the TCP port for the XML-RPC protocol
|
||||
--no-xmlrpc disable the XML-RPC protocol
|
||||
--proxy-mode Enable correct behavior when behind a reverse proxy
|
||||
|
||||
**XML-RPC Secure Configuration**::
|
||||
|
||||
--xmlrpcs-interface=XMLRPCS_INTERFACE
|
||||
Specify the TCP IP address for the XML-RPC Secure
|
||||
protocol. The empty string binds to all interfaces.
|
||||
--xmlrpcs-port=XMLRPCS_PORT
|
||||
specify the TCP port for the XML-RPC Secure protocol
|
||||
--no-xmlrpcs disable the XML-RPC Secure protocol
|
||||
--cert-file=SECURE_CERT_FILE
|
||||
specify the certificate file for the SSL connection
|
||||
--pkey-file=SECURE_PKEY_FILE
|
||||
specify the private key file for the SSL connection
|
||||
|
||||
**NET-RPC Configuration**::
|
||||
|
||||
--netrpc-interface=NETRPC_INTERFACE
|
||||
specify the TCP IP address for the NETRPC protocol
|
||||
--netrpc-port=NETRPC_PORT
|
||||
specify the TCP port for the NETRPC protocol
|
||||
--no-netrpc disable the NETRPC protocol
|
||||
|
||||
**Web interface Configuration**::
|
||||
|
||||
--db-filter=REGEXP Filter listed database
|
||||
|
||||
**Static HTTP service**::
|
||||
|
||||
--static-http-enable
|
||||
enable static HTTP service for serving plain HTML
|
||||
files
|
||||
--static-http-document-root=STATIC_HTTP_DOCUMENT_ROOT
|
||||
specify the directory containing your static HTML
|
||||
files (e.g '/var/www/')
|
||||
--static-http-url-prefix=STATIC_HTTP_URL_PREFIX
|
||||
specify the URL root prefix where you want web
|
||||
browsers to access your static HTML files (e.g '/')
|
||||
|
||||
**Testing Configuration**::
|
||||
|
||||
--test-file=TEST_FILE
|
||||
Launch a YML test file.
|
||||
--test-report-directory=TEST_REPORT_DIRECTORY
|
||||
If set, will save sample of all reports in this
|
||||
directory.
|
||||
--test-enable Enable YAML and unit tests.
|
||||
--test-commit Commit database changes performed by YAML or XML
|
||||
tests.
|
||||
|
||||
**Logging Configuration**::
|
||||
|
||||
--logfile=LOGFILE file where the server log will be stored
|
||||
--no-logrotate do not rotate the logfile
|
||||
--syslog Send the log to the syslog server
|
||||
--log-handler=PREFIX:LEVEL
|
||||
setup a handler at LEVEL for a given PREFIX. An empty
|
||||
PREFIX indicates the root logger. This option can be
|
||||
repeated. Example: "openerp.orm:DEBUG" or
|
||||
"werkzeug:CRITICAL" (default: ":INFO")
|
||||
--log-request shortcut for --log-
|
||||
handler=openerp.netsvc.rpc.request:DEBUG
|
||||
--log-response shortcut for --log-
|
||||
handler=openerp.netsvc.rpc.response:DEBUG
|
||||
--log-web shortcut for --log-
|
||||
handler=openerp.addons.web.common.http:DEBUG
|
||||
--log-sql shortcut for --log-handler=openerp.sql_db:DEBUG
|
||||
--log-level=LOG_LEVEL
|
||||
specify the level of the logging. Accepted values:
|
||||
['info', 'debug_rpc', 'warn', 'test', 'critical',
|
||||
'debug_sql', 'error', 'debug', 'debug_rpc_answer',
|
||||
'notset'] (deprecated option).
|
||||
|
||||
**SMTP Configuration**::
|
||||
|
||||
--email-from=EMAIL_FROM
|
||||
specify the SMTP email address for sending email
|
||||
--smtp=SMTP_SERVER specify the SMTP server for sending email
|
||||
--smtp-port=SMTP_PORT
|
||||
specify the SMTP port
|
||||
--smtp-ssl specify the SMTP server support SSL or not
|
||||
--smtp-user=SMTP_USER
|
||||
specify the SMTP username for sending email
|
||||
--smtp-password=SMTP_PASSWORD
|
||||
specify the SMTP password for sending email
|
||||
|
||||
**Database related options**::
|
||||
|
||||
-d DB_NAME, --database=DB_NAME
|
||||
specify the database name
|
||||
-r DB_USER, --db_user=DB_USER
|
||||
specify the database user name
|
||||
-w DB_PASSWORD, --db_password=DB_PASSWORD
|
||||
specify the database password
|
||||
--pg_path=PG_PATH specify the pg executable path
|
||||
--db_host=DB_HOST specify the database host
|
||||
--db_port=DB_PORT specify the database port
|
||||
--db_maxconn=DB_MAXCONN
|
||||
specify the the maximum number of physical connections
|
||||
to posgresql
|
||||
--db-template=DB_TEMPLATE
|
||||
specify a custom database template to create a new
|
||||
database
|
||||
|
||||
**Internationalisation options**::
|
||||
|
||||
Use these options to translate OpenERP to another language.See i18n
|
||||
section of the user manual. Option '-d' is mandatory.Option '-l' is
|
||||
mandatory in case of importation
|
||||
|
||||
--load-language=LOAD_LANGUAGE
|
||||
specifies the languages for the translations you want
|
||||
to be loaded
|
||||
-l LANGUAGE, --language=LANGUAGE
|
||||
specify the language of the translation file. Use it
|
||||
with --i18n-export or --i18n-import
|
||||
--i18n-export=TRANSLATE_OUT
|
||||
export all sentences to be translated to a CSV file, a
|
||||
PO file or a TGZ archive and exit
|
||||
--i18n-import=TRANSLATE_IN
|
||||
import a CSV or a PO file with translations and exit.
|
||||
The '-l' option is required.
|
||||
--i18n-overwrite overwrites existing translation terms on updating a
|
||||
module or importing a CSV or a PO file.
|
||||
--modules=TRANSLATE_MODULES
|
||||
specify modules to export. Use in combination with
|
||||
--i18n-export
|
||||
|
||||
**Security-related options**::
|
||||
|
||||
--no-database-list disable the ability to return the list of databases
|
||||
|
||||
**Advanced options**::
|
||||
|
||||
--cache-timeout=CACHE_TIMEOUT
|
||||
set the timeout for the cache system
|
||||
--debug enable debug mode
|
||||
--stop-after-init stop the server after its initialization
|
||||
-t TIMEZONE, --timezone=TIMEZONE
|
||||
specify reference timezone for the server (e.g.
|
||||
Europe/Brussels
|
||||
--osv-memory-count-limit=OSV_MEMORY_COUNT_LIMIT
|
||||
Force a limit on the maximum number of records kept in
|
||||
the virtual osv_memory tables. The default is False,
|
||||
which means no count-based limit.
|
||||
--osv-memory-age-limit=OSV_MEMORY_AGE_LIMIT
|
||||
Force a limit on the maximum age of records kept in
|
||||
the virtual osv_memory tables. This is a decimal value
|
||||
expressed in hours, and the default is 1 hour.
|
||||
--max-cron-threads=MAX_CRON_THREADS
|
||||
Maximum number of threads processing concurrently cron
|
||||
jobs.
|
||||
--virtual-memory-limit=VIRTUAL_MEMORY_LIMIT
|
||||
Maximum allowed virtual memory per Gunicorn process.
|
||||
When the limit is reached, any memory allocation will
|
||||
fail.
|
||||
--virtual-memory-reset=VIRTUAL_MEMORY_RESET
|
||||
Maximum allowed virtual memory per Gunicorn process.
|
||||
When the limit is reached, the worker will be reset
|
||||
after the current request.
|
||||
--cpu-time-limit=CPU_TIME_LIMIT
|
||||
Maximum allowed CPU time per Gunicorn process. When
|
||||
the limit is reached, an exception is raised.
|
||||
--unaccent Use the unaccent function provided by the database
|
||||
when available.
|
||||
|
||||
Server configuration file
|
||||
+++++++++++++++++++++++++
|
||||
|
||||
::
|
||||
|
||||
[options]
|
||||
addons_path = /home/openerp/workspace/openerp-dev/addons/trunk,/home/openerp/workspace/openerp-dev/web/trunk/addons
|
||||
admin_passwd = admin
|
||||
cache_timeout = 100000
|
||||
cpu_time_limit = 60
|
||||
csv_internal_sep = ,
|
||||
db_host = False
|
||||
db_maxconn = 64
|
||||
db_name = False
|
||||
db_password = False
|
||||
db_port = False
|
||||
db_template = template0
|
||||
db_user = openerp
|
||||
dbfilter = .*
|
||||
debug_mode = False
|
||||
demo = {}
|
||||
email_from = False
|
||||
import_partial =
|
||||
list_db = True
|
||||
log_handler = [':INFO']
|
||||
log_level = info
|
||||
logfile = False
|
||||
login_message = False
|
||||
logrotate = True
|
||||
max_cron_threads = 4
|
||||
netrpc = True
|
||||
netrpc_interface =
|
||||
netrpc_port = 8070
|
||||
osv_memory_age_limit = 1.0
|
||||
osv_memory_count_limit = False
|
||||
pg_path = None
|
||||
pidfile = False
|
||||
proxy_mode = False
|
||||
reportgz = False
|
||||
secure_cert_file = server.cert
|
||||
secure_pkey_file = server.pkey
|
||||
server_wide_modules = None
|
||||
smtp_password = False
|
||||
smtp_port = 25
|
||||
smtp_server = localhost
|
||||
smtp_ssl = False
|
||||
smtp_user = False
|
||||
static_http_document_root = None
|
||||
static_http_enable = False
|
||||
static_http_url_prefix = None
|
||||
syslog = False
|
||||
test_commit = False
|
||||
test_enable = False
|
||||
test_file = False
|
||||
test_report_directory = False
|
||||
timezone = False
|
||||
translate_modules = ['all']
|
||||
unaccent = False
|
||||
virtual_memory_limit = 805306368
|
||||
virtual_memory_reset = 671088640
|
||||
without_demo = False
|
||||
xmlrpc = True
|
||||
xmlrpc_interface =
|
||||
xmlrpc_port = 8069
|
||||
xmlrpcs = True
|
||||
xmlrpcs_interface =
|
||||
xmlrpcs_port = 8071
|
||||
|
||||
+26
-47
@@ -33,16 +33,11 @@ three main components:
|
||||
Another layer allows communications between the server and a web browser,
|
||||
the Web layer. Having more than one server is possible, for example in
|
||||
conjunction with a load balancing mechanism.
|
||||
- the client, which allow users to access OpenERP. Two clients exist, a
|
||||
desktop GTK client and a browser-based client
|
||||
- the client running in the a web browser as javascript application.
|
||||
|
||||
- the GTK client access directly to the OpenERP Server
|
||||
- users can also use standard web browsers to access OpenERP. In that
|
||||
case, an OpenERP application is loaded. It handles communications between
|
||||
the browser and the Web layer of the server.
|
||||
|
||||
The database server and the OpenERP server can be installed on the same computer,
|
||||
or distributed onto separate computer servers, for example for performance considerations.
|
||||
The database server and the OpenERP server can be installed on the same
|
||||
computer, or distributed onto separate computer servers, for example for
|
||||
performance considerations.
|
||||
|
||||
.. _`Figure 1`:
|
||||
.. figure:: _static/02_openerp_architecture.png
|
||||
@@ -116,8 +111,9 @@ The services granted by the ORM are among other :
|
||||
|
||||
The web layer offers an interface to communicate with standard browsers.
|
||||
In the 6.1 version of OpenERP, the web-client has been rewritten and integrated
|
||||
into the OpenERP server tier. This layer relies on CherryPy for the routing
|
||||
layer of communications, especially for session and cookies management.
|
||||
into the OpenERP server tier. This web layer is a WSGI-compatible application
|
||||
based on werkzeug. It handles regular http queries to server static file or
|
||||
dynamic content and JSON-RPC queries for the RPC made from the browser.
|
||||
|
||||
**Modules**
|
||||
|
||||
@@ -137,20 +133,8 @@ and display the result (e.g. a list of customers) in different ways
|
||||
(as forms, lists, calendars, ...). Upon user actions, it sends queries
|
||||
to modify data to the server.
|
||||
|
||||
Two clients can be used for user access to OpenERP, a GTK client and a
|
||||
browser-based client. The GTK client communicates directly with the server.
|
||||
Using the GTK client requires the client to be installed on the workstation
|
||||
of each user.
|
||||
|
||||
The browser-based client holds an OpenERP application that handles communications
|
||||
between the browser and the Web layer of the server. The static code of the web
|
||||
application is minimal. It consists of a minimal flow of HTML that is in charge
|
||||
of loading the application code in Javascript. This client-side OpenERP application
|
||||
sends user requests to the server, and gets data back. Data management is
|
||||
done dynamically in this client. Using this client is therefore easy for
|
||||
users, but also for administrators because it does not require any software
|
||||
installation on the user machine.
|
||||
|
||||
The default client of OpenERP is an JavaScript application running in the
|
||||
browser that communicates with the server using JSON-RPC.
|
||||
|
||||
MVC architecture in OpenERP
|
||||
===========================
|
||||
@@ -194,37 +178,32 @@ OpenERP follows the MVC semantic with
|
||||
- view : views are defined in XML files in OpenERP.
|
||||
- controller : The objects of OpenERP.
|
||||
|
||||
Network communications and WSGI
|
||||
===============================
|
||||
OpenERP is an HTTP web server and may also be deployed as an WSGI-compliant
|
||||
application.
|
||||
|
||||
Network communications
|
||||
======================
|
||||
|
||||
GTK clients communicate with the OpenERP server using XML-RPC protocol by
|
||||
default. However, using a secured version XML-RPCS is possible when configurating
|
||||
your OpenERP instance. In previous versions of OpenERP, a custom protocol
|
||||
called NET-RPC was used. It was a binary version of the XML-RPC protocol,
|
||||
allowing faster communications. However, this protocol will no longer be
|
||||
used in OpenERP. The use of JSON-RPC is also planned for the 6.1 version
|
||||
of OpenERP.
|
||||
|
||||
Web-based clients communicate using HTTP protocol. As for XML-RPC, it is
|
||||
possible to configure OpenERP to use secured HTTPS connections.
|
||||
|
||||
Services and WSGI
|
||||
=================
|
||||
Clients may communicate with OpenERP using sessionless XML-RPC, the recommended
|
||||
way to interoperate with OpenERP. Web-based clients communicates using the
|
||||
session aware JSON-RPC.
|
||||
|
||||
Everything in OpenERP, and objects methods in particular, are exposed via
|
||||
the network and a security layer. Access to the data model is in fact a ‘service’
|
||||
and it is possible to expose new services. For instance, a WebDAV service and
|
||||
a FTP service are available.
|
||||
|
||||
While not mandatory, the services can make use of the `WSGI
|
||||
<http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface>`_ stack. WSGI is
|
||||
a standard solution in the Python ecosystem to write HTTP servers, applications,
|
||||
and middleware which can be used in a mix-and-match fashion. By using WSGI,
|
||||
it is possible to run OpenERP in any WSGI compliant server. It is also
|
||||
possible to use OpenERP to host a WSGI application.
|
||||
Services can make use of the `WSGI
|
||||
<http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface>`_ stack. WSGI is a
|
||||
standard solution in the Python ecosystem to write HTTP servers, applications,
|
||||
and middleware which can be used in a mix-and-match fashion. By using WSGI, it
|
||||
is possible to run OpenERP in any WSGI compliant server. It is also possible to
|
||||
use OpenERP to host a WSGI application.
|
||||
|
||||
A striking example of this possibility is the OpenERP Web layer that is
|
||||
the server-side counter part to the web clients. It provides the requested
|
||||
data to the browser and manages web sessions. It is a WSGI-compliant application.
|
||||
As such, it can be run as a stand-alone HTTP server or embedded inside OpenERP.
|
||||
|
||||
The HTTP namespaces /openerp/ /object/ /common/ are reserved for the XML-RPC
|
||||
layer, every module restrict it's HTTP namespace to /<name_of_the_module>/
|
||||
|
||||
|
||||
+131
-218
@@ -3,16 +3,15 @@ Module structure
|
||||
|
||||
A module can contain the following elements:
|
||||
|
||||
- **Business object** : declared as Python classes extending the OpenObject c
|
||||
lass osv.Model, the persistence of these resource is completly managed
|
||||
by OpenObject,
|
||||
- **Business object** : declared as Python classes extending the class
|
||||
osv.Model, the persistence of these resource is completly managed by
|
||||
OpenERP's ORM.
|
||||
- **Data** : XML/CSV files with meta-data (views and workflows declaration),
|
||||
configuration data (modules parametrization) and demo data (optional but
|
||||
recommended for testing),
|
||||
- **Wizards** : stateful interactive forms used to assist users, often available
|
||||
as contextual actions on resources,
|
||||
- **Reports** : RML (XML format). MAKO or OpenOffice report templates, to be
|
||||
merged with any kind of business data, and generate HTML, ODT or PDF reports.
|
||||
- **Reports** : RML (XML format). HTML/MAKO or OpenOffice report templates, to
|
||||
be merged with any kind of business data, and generate HTML, ODT or PDF
|
||||
reports.
|
||||
|
||||
.. figure:: _static/03_module_gen_view.png
|
||||
:width: 75%
|
||||
@@ -23,120 +22,91 @@ A module can contain the following elements:
|
||||
|
||||
Each module is contained in its own directory within either the server/bin/addons
|
||||
directory or another directory of addons, configured in server installation.
|
||||
To create a new module, the following steps are required:
|
||||
To create a new module for example the 'OpenAcademy' module, the following
|
||||
steps are required:
|
||||
|
||||
- create a ``my_module`` subdirectory in the source/addons directory
|
||||
- create the module description file ``__init__.py``
|
||||
- create the module declaration file ``__openerp__.py``
|
||||
- create a ``openacademy`` subdirectory in the source/addons directory
|
||||
- create the module import file ``__init__.py``
|
||||
- create the module manifield file ``__openerp__.py``
|
||||
- create **Python** files containing **objects**
|
||||
- create **.xml files** holding module data such as views, menu entries
|
||||
or demo data
|
||||
- optionally create **reports**, **wizards** or **workflows**
|
||||
- optionally create **reports** or **workflows**
|
||||
|
||||
Description file __init__.py
|
||||
++++++++++++++++++++++++++++
|
||||
Python import file __init__.py
|
||||
++++++++++++++++++++++++++++++
|
||||
|
||||
The ``__init__.py`` file is the Python module descriptor, because an OpenERP
|
||||
module is also a regular Python module. Like any Python module, it is executed
|
||||
at program start. It needs to import the Python files that need to be loaded.
|
||||
The ``__init__.py`` file is the Python import file, because an OpenERP module
|
||||
is also a regular Python module. The file should import all the other python
|
||||
file or submodules.
|
||||
|
||||
It contains the importation instruction applied to all Python files of the
|
||||
module, without the .py extension. For example, if a module contains a single
|
||||
python file named ``mymodule.py``, the file should look like:
|
||||
For example, if a module contains a single python file named ``openacademy.py``,
|
||||
the file should look like:
|
||||
|
||||
import module
|
||||
import openacademy
|
||||
|
||||
Declaration file __openerp__.py
|
||||
Manifest file __openerp__.py
|
||||
+++++++++++++++++++++++++++++++
|
||||
|
||||
In the created module directory, you must add a **__openerp__.py** file.
|
||||
This file, which must be in Python format, is responsible to
|
||||
This file, which must be a Python dict literal, is responsible to
|
||||
|
||||
1. determine the *XML files that will be parsed* during the initialization
|
||||
of the server, and also to
|
||||
2. determine the *dependencies* of the created module.
|
||||
3. declare additional meta data
|
||||
|
||||
This file must contain a Python dictionary with the following values:
|
||||
|
||||
::
|
||||
|
||||
name The (Plain English) name of the module.
|
||||
name The name of the module in English.
|
||||
version The version of the module.
|
||||
summary Short description or keywords
|
||||
description The module description (text).
|
||||
category The categrory of the module
|
||||
author The author of the module.
|
||||
website The website of the module.
|
||||
license The license of the module (default:GPL-2).
|
||||
depends List of modules on which this module depends. The base
|
||||
module must almost always be in the dependencies because
|
||||
some necessary data for the views, reports, ... are in
|
||||
the base module.
|
||||
init_xml List of .xml files to load when the server is launched
|
||||
with the "--init=module" argument. Filepaths must be
|
||||
relative to the directory where the module is. OpenERP
|
||||
XML file format is detailed in this section.
|
||||
update_xml List of .xml files to load when the server is launched with
|
||||
the "--update=module" launched. Filepaths must be relative
|
||||
to the directory where the module is. Files in **update_xml**
|
||||
concern: views, reports and wizards.
|
||||
website URL of the website of the module.
|
||||
license The license of the module (default: AGPL-3).
|
||||
depends List of modules on which this module depends beside base.
|
||||
data List of .xml files to load when the module is installed or updated.
|
||||
demo List of additional .xml files to load when the module is
|
||||
installed or updated and demo flag is active.
|
||||
installable True or False. Determines whether the module is installable
|
||||
or not.
|
||||
auto_install True or False (default: False). If set to ``True``, the
|
||||
module is a link module. It will be installed as soon
|
||||
as all its dependencies are installed.
|
||||
|
||||
For the ``my_module`` module, here is an example of ``__openerp__.py``
|
||||
For the ``openacademy`` module, here is an example of ``__openerp__.py``
|
||||
declaration file:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
{
|
||||
'name' : "My Module",
|
||||
'name' : "OpenAcademy",
|
||||
'version' : "1.0",
|
||||
'author' : "OpenERP",
|
||||
'author' : "OpenERP SA",
|
||||
'category' : "Tools",
|
||||
'depends' : ['base',],
|
||||
'init_xml' : [],
|
||||
'demo_xml' : [
|
||||
'module_demo.xml'
|
||||
],
|
||||
'update_xml' : [
|
||||
'module_view.xml',
|
||||
'data/module_data.xml',
|
||||
'depends' : ['mail'],
|
||||
'data' : [
|
||||
'openacademy_view.xml',
|
||||
'openacademy_data.xml',
|
||||
'report/module_report.xml',
|
||||
'wizard/module_wizard.xml',
|
||||
],
|
||||
'demo' : [
|
||||
'openacademy_demo.xml'
|
||||
],
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
}
|
||||
|
||||
The files that must be placed in init_xml are the ones that relate to the
|
||||
workflow definition, data to load at the installation of the software and
|
||||
the data for the demonstrations.
|
||||
|
||||
|
||||
XML Files
|
||||
+++++++++
|
||||
|
||||
XML files located in the module directory are used to modify the structure of
|
||||
the database. They are used for many purposes, among which we can cite :
|
||||
|
||||
* initialization and demonstration data declaration,
|
||||
* views declaration,
|
||||
* reports declaration,
|
||||
* wizards declaration,
|
||||
* workflows declaration.
|
||||
|
||||
General structure of OpenERP XML files is more detailed in the
|
||||
:ref:`xml-serialization` section. Look here if you are interested in learning
|
||||
more about *initialization* and *demonstration data declaration* XML files. The
|
||||
following section are only related to XML specific to *actions, menu entries,
|
||||
reports, wizards* and *workflows* declaration.
|
||||
|
||||
|
||||
Objects
|
||||
+++++++
|
||||
|
||||
All OpenERP resources are objects: menus, actions, reports, invoices, partners, ... OpenERP is based on an object relational mapping of a database to control the information. Object names are hierarchical, as in the following examples:
|
||||
All OpenERP resources are objects: invoices, partners. Metadata are also object
|
||||
too: menus, actions, reports... Object names are hierarchical, as in the
|
||||
following examples:
|
||||
|
||||
* account.transfer : a money transfer
|
||||
* account.invoice : an invoice
|
||||
@@ -144,14 +114,15 @@ All OpenERP resources are objects: menus, actions, reports, invoices, partners,
|
||||
|
||||
Generally, the first word is the name of the module: account, stock, sale.
|
||||
|
||||
Other advantages of an ORM;
|
||||
Those object are declared in python be subclassing osv.Model
|
||||
|
||||
* simpler relations : invoice.partner.address[0].city
|
||||
* objects have properties and methods: invoice.pay(3400 EUR),
|
||||
* inheritance, high level constraints, ...
|
||||
|
||||
It is easier to manipulate one object (example, a partner) than several tables (partner address, categories, events, ...)
|
||||
The ORM of OpenERP is constructed over PostgreSQL. It is thus possible to
|
||||
query the object used by OpenERP using the object interface (ORM) or by
|
||||
directly using SQL statements.
|
||||
|
||||
But it is dangerous to write or read directly in the PostgreSQL database, as
|
||||
you will shortcut important steps like constraints checking or workflow
|
||||
modification.
|
||||
|
||||
.. figure:: images/pom_3_0_3.png
|
||||
:scale: 50
|
||||
@@ -160,23 +131,23 @@ It is easier to manipulate one object (example, a partner) than several tables (
|
||||
*The Physical Objects Model of [OpenERP version 3.0.3]*
|
||||
|
||||
|
||||
PostgreSQL and ORM
|
||||
------------------
|
||||
XML Files
|
||||
+++++++++
|
||||
|
||||
The ORM of OpenERP is constructed over PostgreSQL. It is thus possible to
|
||||
query the object used by OpenERP using the object interface or by directly
|
||||
using SQL statements.
|
||||
XML files located in the module directory are used to initialize or update the
|
||||
the database when the module is installed or updated. They are used for many
|
||||
purposes, among which we can cite :
|
||||
|
||||
But it is dangerous to write or read directly in the PostgreSQL database, as
|
||||
you will shortcut important steps like constraints checking or workflow
|
||||
modification.
|
||||
* initialization and demonstration data declaration,
|
||||
* views declaration,
|
||||
* reports declaration,
|
||||
* workflows declaration.
|
||||
|
||||
.. note::
|
||||
|
||||
The Physical Database Model of OpenERP
|
||||
|
||||
Pre-Installed Data
|
||||
------------------
|
||||
General structure of OpenERP XML files is more detailed in the
|
||||
:ref:`xml-serialization` section. Look here if you are interested in learning
|
||||
more about *initialization* and *demonstration data declaration* XML files. The
|
||||
following section are only related to XML specific to *actions, menu entries,
|
||||
reports, wizards* and *workflows* declaration.
|
||||
|
||||
Data can be inserted or updated into the PostgreSQL tables corresponding to the
|
||||
OpenERP objects using XML files. The general structure of an OpenERP XML file
|
||||
@@ -188,12 +159,8 @@ is as follows:
|
||||
<openerp>
|
||||
<data>
|
||||
<record model="model.name_1" id="id_name_1">
|
||||
<field name="field1">
|
||||
"field1 content"
|
||||
</field>
|
||||
<field name="field2">
|
||||
"field2 content"
|
||||
</field>
|
||||
<field name="field1"> "field1 content" </field>
|
||||
<field name="field2"> "field2 content" </field>
|
||||
(...)
|
||||
</record>
|
||||
<record model="model.name_2" id="id_name_2">
|
||||
@@ -203,7 +170,52 @@ is as follows:
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
Fields content are strings that must be encoded as *UTF-8* in XML files.
|
||||
Record Tag
|
||||
//////////
|
||||
|
||||
**Description**
|
||||
|
||||
The addition of new data is made with the record tag. This one takes a
|
||||
mandatory attribute : model. Model is the object name where the insertion has
|
||||
to be done. The tag record can also take an optional attribute: id. If this
|
||||
attribute is given, a variable of this name can be used later on, in the same
|
||||
file, to make reference to the newly created resource ID.
|
||||
|
||||
A record tag may contain field tags. They indicate the record's fields value.
|
||||
If a field is not specified the default value will be used.
|
||||
|
||||
The Record Field tag
|
||||
////////////////////
|
||||
|
||||
The attributes for the field tag are the following:
|
||||
|
||||
name : mandatory
|
||||
the field name
|
||||
|
||||
eval : optional
|
||||
python expression that indicating the value to add
|
||||
|
||||
ref
|
||||
reference to an id defined in this file
|
||||
|
||||
model
|
||||
model to be looked up in the search
|
||||
|
||||
search
|
||||
a query
|
||||
|
||||
|
||||
**Example**
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<record model="ir.actions.report.xml" id="l0">
|
||||
<field name="model">account.invoice</field>
|
||||
<field name="name">Invoices List</field>
|
||||
<field name="report_name">account.invoice.list</field>
|
||||
<field name="report_xsl">account/report/invoice.xsl</field>
|
||||
<field name="report_xml">account/report/invoice.xml</field>
|
||||
</record>
|
||||
|
||||
Let's review an example taken from the OpenERP source (base_demo.xml in the base module):
|
||||
|
||||
@@ -250,47 +262,6 @@ The field **company_id** is a many-to-one relation from the user object to the c
|
||||
|
||||
This is a classical example of the use of **search** in demo data: here we do not really care about which partner we want to use for the test, so we give an empty list. Notice the **model** attribute is currently mandatory.
|
||||
|
||||
Record Tag
|
||||
//////////
|
||||
|
||||
**Description**
|
||||
|
||||
The addition of new data is made with the record tag. This one takes a mandatory attribute : model. Model is the object name where the insertion has to be done. The tag record can also take an optional attribute: id. If this attribute is given, a variable of this name can be used later on, in the same file, to make reference to the newly created resource ID.
|
||||
|
||||
A record tag may contain field tags. They indicate the record's fields value. If a field is not specified the default value will be used.
|
||||
|
||||
**Example**
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<record model="ir.actions.report.xml" id="l0">
|
||||
<field name="model">account.invoice</field>
|
||||
<field name="name">Invoices List</field>
|
||||
<field name="report_name">account.invoice.list</field>
|
||||
<field name="report_xsl">account/report/invoice.xsl</field>
|
||||
<field name="report_xml">account/report/invoice.xml</field>
|
||||
</record>
|
||||
|
||||
Field tag
|
||||
/////////
|
||||
|
||||
The attributes for the field tag are the following:
|
||||
|
||||
name : mandatory
|
||||
the field name
|
||||
|
||||
eval : optional
|
||||
python expression that indicating the value to add
|
||||
|
||||
ref
|
||||
reference to an id defined in this file
|
||||
|
||||
model
|
||||
model to be looked up in the search
|
||||
|
||||
search
|
||||
a query
|
||||
|
||||
Function tag
|
||||
////////////
|
||||
|
||||
@@ -311,69 +282,9 @@ eval
|
||||
|
||||
<function model="ir.ui.menu" name="search" eval="[[('name','=','Operations')]]"/>
|
||||
|
||||
Getitem tag
|
||||
///////////
|
||||
|
||||
Takes a subset of the evaluation of the last child node of the tag.
|
||||
|
||||
type : mandatory
|
||||
int or list
|
||||
|
||||
index : mandatory
|
||||
int or string (a key of a dictionary)
|
||||
|
||||
**Example**
|
||||
|
||||
Evaluates to the first element of the list of ids returned by the function node
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<getitem index="0" type="list">
|
||||
<function model="ir.ui.menu" name="search" eval="[[('name','=','Operations')]]"/>
|
||||
</getitem>
|
||||
|
||||
i18n
|
||||
""""
|
||||
|
||||
Improving Translations
|
||||
//////////////////////
|
||||
|
||||
.. describe:: Translating in launchpad
|
||||
|
||||
Translations are managed by
|
||||
the `Launchpad Web interface <https://translations.launchpad.net/openobject>`_. Here, you'll
|
||||
find the list of translatable projects.
|
||||
|
||||
Please read the `FAQ <https://answers.launchpad.net/rosetta/+faqs>`_ before asking questions.
|
||||
|
||||
.. describe:: Translating your own module
|
||||
|
||||
.. versionchanged:: 5.0
|
||||
|
||||
Contrary to the 4.2.x version, the translations are now done by module. So,
|
||||
instead of an unique ``i18n`` folder for the whole application, each module has
|
||||
its own ``i18n`` folder. In addition, OpenERP can now deal with ``.po`` [#f_po]_
|
||||
files as import/export format. The translation files of the installed languages
|
||||
are automatically loaded when installing or updating a module. OpenERP can also
|
||||
generate a .tgz archive containing well organised ``.po`` files for each selected
|
||||
module.
|
||||
|
||||
.. [#f_po] http://www.gnu.org/software/autoconf/manual/gettext/PO-Files.html#PO-Files
|
||||
|
||||
Process
|
||||
"""""""
|
||||
|
||||
Defining the process
|
||||
////////////////////
|
||||
|
||||
Through the interface and module recorder.
|
||||
Then, put the generated XML in your own module.
|
||||
|
||||
Views
|
||||
"""""
|
||||
|
||||
Technical Specifications - Architecture - Views
|
||||
///////////////////////////////////////////////
|
||||
+++++
|
||||
|
||||
Views are a way to represent the objects on the client side. They indicate to the client how to lay out the data coming from the objects on the screen.
|
||||
|
||||
@@ -454,21 +365,23 @@ The squared nodes represent other Workflows;
|
||||
* the shipping
|
||||
|
||||
|
||||
i18n
|
||||
----
|
||||
|
||||
Appendix
|
||||
+++++++++
|
||||
.. versionchanged:: 5.0
|
||||
|
||||
Configure addons locations
|
||||
--------------------------
|
||||
Each module has its own ``i18n`` folder. In addition, OpenERP can now deal with
|
||||
``.po`` [#f_po]_ files as import/export format. The translation files of the
|
||||
installed languages are automatically loaded when installing or updating a
|
||||
module.
|
||||
|
||||
Translations are managed by the `Launchpad Web interface
|
||||
<https://translations.launchpad.net/openobject>`_. Here, you'll find the list
|
||||
of translatable projects.
|
||||
|
||||
Please read the `FAQ <https://answers.launchpad.net/rosetta/+faqs>`_ before asking questions.
|
||||
|
||||
|
||||
.. [#f_po] http://www.gnu.org/software/autoconf/manual/gettext/PO-Files.html#PO-Files
|
||||
|
||||
By default, the only directory of addons known by the server is server/bin/addons.
|
||||
It is possible to add new addons by
|
||||
|
||||
- copying them in server/bin/addons, or creating a symbolic link to each
|
||||
of them in this directory, or
|
||||
- specifying another directory containing addons to the server. The later
|
||||
can be accomplished either by running the server with the ``--addons-path=``
|
||||
option, or by configuring this option in the openerp_serverrc file,
|
||||
automatically generated under Linux in your home directory by the
|
||||
server when executed with the ``--save`` option. You can provide several
|
||||
addons to the ``addons_path`` = option, separating them using commas.
|
||||
|
||||
+147
-139
@@ -4,15 +4,24 @@ Views and Events
|
||||
Introduction to Views
|
||||
---------------------
|
||||
|
||||
As all data of the program is stored in objects, as explained in the Objects section, how are these objects exposed to the user ? We will try to answer this question in this section.
|
||||
As all data of the program is stored in objects, as explained in the Objects
|
||||
section, how are these objects exposed to the user ? We will try to answer this
|
||||
question in this section.
|
||||
|
||||
First of all, let's note that every resource type uses its own interface. For example, the screen to modify a partner's data is not the same as the one to modify an invoice.
|
||||
First of all, let's note that every resource type uses its own interface. For
|
||||
example, the screen to modify a partner's data is not the same as the one to
|
||||
modify an invoice.
|
||||
|
||||
Then, you have to know that the OpenERP user interface is dynamic, it means that it is not described "statically" by some code, but dynamically built from XML descriptions of the client screens.
|
||||
Then, you have to know that the OpenERP user interface is dynamic, it means
|
||||
that it is not described "statically" by some code, but dynamically built from
|
||||
XML descriptions of the client screens.
|
||||
|
||||
From now on, we will call these screen descriptions views.
|
||||
|
||||
A notable characteristic of these views is that they can be edited at any moment (even during the program execution). After a modification to a displayed view has occurred, you simply need to close the tab corresponding to that 'view' and re-open it for the changes to appear.
|
||||
A notable characteristic of these views is that they can be edited at any
|
||||
moment (even during the program execution). After a modification to a displayed
|
||||
view has occurred, you simply need to close the tab corresponding to that
|
||||
'view' and re-open it for the changes to appear.
|
||||
|
||||
Views principles
|
||||
++++++++++++++++
|
||||
@@ -57,9 +66,66 @@ As we can see below in the purple zone of the screen, there is also a way to dis
|
||||
:scale: 50
|
||||
:align: center
|
||||
|
||||
On Change
|
||||
+++++++++
|
||||
|
||||
The on_change attribute defines a method that is called when the content of a view field has changed.
|
||||
|
||||
This method takes at least arguments: cr, uid, ids, which are the three classical arguments and also the context dictionary. You can add parameters to the method. They must correspond to other fields defined in the view, and must also be defined in the XML with fields defined this way::
|
||||
|
||||
<field name="name_of_field" on_change="name_of_method(other_field'_1_', ..., other_field'_n_')"/>
|
||||
|
||||
The example below is from the sale order view.
|
||||
|
||||
You can use the 'context' keyword to access data in the context that can be used as params of the function.::
|
||||
|
||||
<field name="shop_id" on_change="onchange_shop_id(shop_id)"/>
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def onchange_shop_id(self, cr, uid, ids, shop_id):
|
||||
|
||||
v={}
|
||||
if shop_id:
|
||||
|
||||
shop=self.pool.get('sale.shop').browse(cr,uid,shop_id)
|
||||
v['project_id']=shop.project_id.id
|
||||
if shop.pricelist_id.id:
|
||||
|
||||
v['pricelist_id']=shop.pricelist_id.id
|
||||
|
||||
v['payment_default_id']=shop.payment_default_id.id
|
||||
|
||||
return {'value':v}
|
||||
|
||||
|
||||
When editing the shop_id form field, the onchange_shop_id method of the sale_order object is called and returns a dictionary where the 'value' key contains a dictionary of the new value to use in the 'project_id', 'pricelist_id' and 'payment_default_id' fields.
|
||||
|
||||
Note that it is possible to change more than just the values of
|
||||
fields. For example, it is possible to change the value of some fields
|
||||
and the domain of other fields by returning a value of the form:
|
||||
return {'domain': d, 'value': value}
|
||||
|
||||
:returns: a dictionary with any mix of the following keys:
|
||||
|
||||
``domain``
|
||||
A mapping of ``{field: domain}``.
|
||||
|
||||
The returned domains should be set on the fields instead of the
|
||||
default ones.
|
||||
|
||||
``value``
|
||||
A mapping of ``{field: value}}``, the values will be set on the
|
||||
corresponding fields and may trigger new onchanges or attrs
|
||||
changes
|
||||
|
||||
``warning`` A dict with the keys ``title`` and ``message``. Both
|
||||
are mandatory. Indicate that an error message should be
|
||||
displayed to the user.
|
||||
|
||||
|
||||
Tree views
|
||||
-----------
|
||||
----------
|
||||
|
||||
These views are used when we work in list mode (in order to visualize several resources at once) and in the search screen. These views are simpler than the form views and thus have less options.
|
||||
|
||||
@@ -67,81 +133,6 @@ These views are used when we work in list mode (in order to visualize several re
|
||||
:scale: 50
|
||||
:align: center
|
||||
|
||||
Graph views
|
||||
--------------
|
||||
|
||||
A graph is a new mode of view for all views of type form. If, for example, a sale order line must be visible as list or as graph, define it like this in the action that open this sale order line. Do not set the view mode as "tree,form,graph" or "form,graph" - it must be "graph,tree" to show the graph first or "tree,graph" to show the list first. (This view mode is extra to your "form,tree" view and should have a separate menu item):
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,graph</field>
|
||||
|
||||
view_type::
|
||||
|
||||
tree = (tree with shortcuts at the left), form = (switchable view form/list)
|
||||
|
||||
view_mode::
|
||||
|
||||
tree,graph : sequences of the views when switching
|
||||
|
||||
Then, the user will be able to switch from one view to the other. Unlike forms and trees, OpenERP is not able to automatically create a view on demand for the graph type. So, you must define a view for this graph:
|
||||
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<record model="ir.ui.view" id="view_order_line_graph">
|
||||
<field name="name">sale.order.line.graph</field>
|
||||
<field name="model">sale.order.line</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Sales Order Lines">
|
||||
<field name="product_id" group="True"/>
|
||||
<field name="price_unit" operator="*"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
The graph view
|
||||
|
||||
A view of type graph is just a list of fields for the graph.
|
||||
|
||||
Graph tag
|
||||
++++++++++
|
||||
|
||||
The default type of the graph is a pie chart - to change it to a barchart change **<graph string="Sales Order Lines">** to **<graph string="Sales Order Lines" type="bar">** You also may change the orientation.
|
||||
|
||||
:Example :
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<graph string="Sales Order Lines" orientation="horizontal" type="bar">
|
||||
|
||||
Field tag
|
||||
+++++++++
|
||||
|
||||
The first field is the X axis. The second one is the Y axis and the optional third one is the Z axis for 3 dimensional graphs. You can apply a few attributes to each field/axis:
|
||||
|
||||
* **group**: if set to true, the client will group all item of the same value for this field. For each other field, it will apply an operator
|
||||
* **operator**: the operator to apply is another field is grouped. By default it's '+'. Allowed values are:
|
||||
|
||||
+ +: addition
|
||||
+ \*: multiply
|
||||
+ \**: exponent
|
||||
+ min: minimum of the list
|
||||
+ max: maximum of the list
|
||||
|
||||
:Defining real statistics on objects:
|
||||
|
||||
The easiest method to compute real statistics on objects is:
|
||||
|
||||
1. Define a statistic object which is a postgresql view
|
||||
2. Create a tree view and a graph view on this object
|
||||
|
||||
You can get en example in all modules of the form: report\_.... Example: report_crm.
|
||||
|
||||
|
||||
Search views
|
||||
--------------
|
||||
|
||||
@@ -320,6 +311,82 @@ We can save this search criteria as a Shortcut or save as Filter.
|
||||
Filters are user specific and can be modified via the Manage Filters option in the filters drop-down.
|
||||
|
||||
|
||||
Graph views
|
||||
-----------
|
||||
|
||||
A graph is a new mode of view for all views of type form. If, for example, a sale order line must be visible as list or as graph, define it like this in the action that open this sale order line. Do not set the view mode as "tree,form,graph" or "form,graph" - it must be "graph,tree" to show the graph first or "tree,graph" to show the list first. (This view mode is extra to your "form,tree" view and should have a separate menu item):
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,graph</field>
|
||||
|
||||
view_type::
|
||||
|
||||
tree = (tree with shortcuts at the left), form = (switchable view form/list)
|
||||
|
||||
view_mode::
|
||||
|
||||
tree,graph : sequences of the views when switching
|
||||
|
||||
Then, the user will be able to switch from one view to the other. Unlike forms and trees, OpenERP is not able to automatically create a view on demand for the graph type. So, you must define a view for this graph:
|
||||
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<record model="ir.ui.view" id="view_order_line_graph">
|
||||
<field name="name">sale.order.line.graph</field>
|
||||
<field name="model">sale.order.line</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Sales Order Lines">
|
||||
<field name="product_id" group="True"/>
|
||||
<field name="price_unit" operator="*"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
The graph view
|
||||
|
||||
A view of type graph is just a list of fields for the graph.
|
||||
|
||||
Graph tag
|
||||
++++++++++
|
||||
|
||||
The default type of the graph is a pie chart - to change it to a barchart change **<graph string="Sales Order Lines">** to **<graph string="Sales Order Lines" type="bar">** You also may change the orientation.
|
||||
|
||||
:Example :
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<graph string="Sales Order Lines" orientation="horizontal" type="bar">
|
||||
|
||||
Field tag
|
||||
+++++++++
|
||||
|
||||
The first field is the X axis. The second one is the Y axis and the optional third one is the Z axis for 3 dimensional graphs. You can apply a few attributes to each field/axis:
|
||||
|
||||
* **group**: if set to true, the client will group all item of the same value for this field. For each other field, it will apply an operator
|
||||
* **operator**: the operator to apply is another field is grouped. By default it's '+'. Allowed values are:
|
||||
|
||||
+ +: addition
|
||||
+ \*: multiply
|
||||
+ \**: exponent
|
||||
+ min: minimum of the list
|
||||
+ max: maximum of the list
|
||||
|
||||
:Defining real statistics on objects:
|
||||
|
||||
The easiest method to compute real statistics on objects is:
|
||||
|
||||
1. Define a statistic object which is a postgresql view
|
||||
2. Create a tree view and a graph view on this object
|
||||
|
||||
You can get en example in all modules of the form: report\_.... Example: report_crm.
|
||||
|
||||
|
||||
|
||||
Calendar Views
|
||||
--------------
|
||||
|
||||
@@ -1367,62 +1434,3 @@ flexible if you define the child views separately and then specify which child
|
||||
view to use as part of the one2many field.
|
||||
|
||||
|
||||
Events
|
||||
------
|
||||
|
||||
On Change
|
||||
+++++++++
|
||||
|
||||
The on_change attribute defines a method that is called when the content of a view field has changed.
|
||||
|
||||
This method takes at least arguments: cr, uid, ids, which are the three classical arguments and also the context dictionary. You can add parameters to the method. They must correspond to other fields defined in the view, and must also be defined in the XML with fields defined this way::
|
||||
|
||||
<field name="name_of_field" on_change="name_of_method(other_field'_1_', ..., other_field'_n_')"/>
|
||||
|
||||
The example below is from the sale order view.
|
||||
|
||||
You can use the 'context' keyword to access data in the context that can be used as params of the function.::
|
||||
|
||||
<field name="shop_id" on_change="onchange_shop_id(shop_id)"/>
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def onchange_shop_id(self, cr, uid, ids, shop_id):
|
||||
|
||||
v={}
|
||||
if shop_id:
|
||||
|
||||
shop=self.pool.get('sale.shop').browse(cr,uid,shop_id)
|
||||
v['project_id']=shop.project_id.id
|
||||
if shop.pricelist_id.id:
|
||||
|
||||
v['pricelist_id']=shop.pricelist_id.id
|
||||
|
||||
v['payment_default_id']=shop.payment_default_id.id
|
||||
|
||||
return {'value':v}
|
||||
|
||||
|
||||
When editing the shop_id form field, the onchange_shop_id method of the sale_order object is called and returns a dictionary where the 'value' key contains a dictionary of the new value to use in the 'project_id', 'pricelist_id' and 'payment_default_id' fields.
|
||||
|
||||
Note that it is possible to change more than just the values of
|
||||
fields. For example, it is possible to change the value of some fields
|
||||
and the domain of other fields by returning a value of the form:
|
||||
return {'domain': d, 'value': value}
|
||||
|
||||
:returns: a dictionary with any mix of the following keys:
|
||||
|
||||
``domain``
|
||||
A mapping of ``{field: domain}``.
|
||||
|
||||
The returned domains should be set on the fields instead of the
|
||||
default ones.
|
||||
|
||||
``value``
|
||||
A mapping of ``{field: value}}``, the values will be set on the
|
||||
corresponding fields and may trigger new onchanges or attrs
|
||||
changes
|
||||
|
||||
``warning`` A dict with the keys ``title`` and ``message``. Both
|
||||
are mandatory. Indicate that an error message should be
|
||||
displayed to the user.
|
||||
|
||||
@@ -77,7 +77,8 @@
|
||||
<field name="company_id" ref="main_company"/>
|
||||
<field name="company_ids" eval="[(4, ref('main_company'))]"/>
|
||||
<field name="menu_id" ref="action_menu_admin"/>
|
||||
<field name="signature">Administrator</field>
|
||||
<field name="signature">--
|
||||
Administrator</field>
|
||||
</record>
|
||||
|
||||
<record id="main_partner" model="res.partner">
|
||||
|
||||
@@ -11,7 +11,8 @@
|
||||
<field name="partner_id" ref="base.partner_demo"/>
|
||||
<field name="login">demo</field>
|
||||
<field name="password">demo</field>
|
||||
<field name="signature">Mr Demo</field>
|
||||
<field name="signature">--
|
||||
Mr Demo</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
<field name="groups_id" eval="[(6,0,[ref('base.group_user')])]"/>
|
||||
</record>
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:07+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:07+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:07+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:07+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
"X-Poedit-Language: Czech\n"
|
||||
|
||||
#. module: base
|
||||
@@ -121,7 +121,7 @@ msgstr "Zobrazit tipy nabídky"
|
||||
#: help:ir.cron,model:0
|
||||
msgid ""
|
||||
"Model name on which the method to be called is located, e.g. 'res.partner'."
|
||||
msgstr ""
|
||||
msgstr "Název modelu umístění volané metody, např. 'res.partner'."
|
||||
|
||||
#. module: base
|
||||
#: view:ir.module.module:0
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 04:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:07+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:00+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:00+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
"X-Poedit-Country: GREECE\n"
|
||||
"X-Poedit-Language: Greek\n"
|
||||
"X-Poedit-SourceCharset: utf-8\n"
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:05+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
@@ -4473,7 +4473,7 @@ msgstr "Categories"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_web_mobile
|
||||
msgid "OpenERP Web mobile"
|
||||
msgstr ""
|
||||
msgstr "OpenERP Web mobile"
|
||||
|
||||
#. module: base
|
||||
#: view:base.language.import:0
|
||||
@@ -5092,7 +5092,7 @@ msgstr "License"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_web_graph
|
||||
msgid "web Graph"
|
||||
msgstr ""
|
||||
msgstr "web Graph"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.attachment,url:0
|
||||
@@ -5174,7 +5174,7 @@ msgstr "Equatorial Guinea"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_warning
|
||||
msgid "Warning Messages and Alerts"
|
||||
msgstr ""
|
||||
msgstr "Warning Messages and Alerts"
|
||||
|
||||
#. module: base
|
||||
#: view:base.module.import:0
|
||||
@@ -5185,7 +5185,7 @@ msgstr "Module Import"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_ch
|
||||
msgid "Switzerland - Accounting"
|
||||
msgstr ""
|
||||
msgstr "Switzerland - Accounting"
|
||||
|
||||
#. module: base
|
||||
#: field:res.bank,zip:0
|
||||
@@ -5231,7 +5231,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.category,description:base.module_category_marketing
|
||||
msgid "Helps you manage your marketing campaigns step by step."
|
||||
msgstr ""
|
||||
msgstr "Helps you manage your marketing campaigns step by step."
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -5275,7 +5275,7 @@ msgstr "Rules"
|
||||
#. module: base
|
||||
#: field:ir.mail_server,smtp_host:0
|
||||
msgid "SMTP Server"
|
||||
msgstr ""
|
||||
msgstr "SMTP Server"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/module/module.py:256
|
||||
@@ -5329,7 +5329,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.category,name:base.module_category_specific_industry_applications
|
||||
msgid "Specific Industry Applications"
|
||||
msgstr ""
|
||||
msgstr "Specific Industry Applications"
|
||||
|
||||
#. module: base
|
||||
#: model:res.partner.category,name:base.res_partner_category_retailers0
|
||||
@@ -5339,7 +5339,7 @@ msgstr "Retailers"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_web_uservoice
|
||||
msgid "Receive User Feedback"
|
||||
msgstr ""
|
||||
msgstr "Receive User Feedback"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.ls
|
||||
@@ -5349,12 +5349,12 @@ msgstr "Lesotho"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_base_vat
|
||||
msgid "VAT Number Validation"
|
||||
msgstr ""
|
||||
msgstr "VAT Number Validation"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_crm_partner_assign
|
||||
msgid "Partners Geo-Localization"
|
||||
msgstr ""
|
||||
msgstr "Partners Geo-Localisation"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.ke
|
||||
@@ -5365,7 +5365,7 @@ msgstr "Kenya"
|
||||
#: model:ir.actions.act_window,name:base.action_translation
|
||||
#: model:ir.ui.menu,name:base.menu_action_translation
|
||||
msgid "Translated Terms"
|
||||
msgstr ""
|
||||
msgstr "Translated Terms"
|
||||
|
||||
#. module: base
|
||||
#: view:res.partner.event:0
|
||||
@@ -5431,6 +5431,30 @@ msgid ""
|
||||
"Also implements IETF RFC 5785 for services discovery on a http server,\n"
|
||||
"which needs explicit configuration in openerp-server.conf, too.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"This module activates the WebDAV server for documents.\n"
|
||||
"===============================================================\n"
|
||||
"\n"
|
||||
"You can then use any compatible browser to remotely see the attachments of "
|
||||
"OpenObject.\n"
|
||||
"\n"
|
||||
"After installation, the WebDAV server can be controlled by a [webdav] "
|
||||
"section in the server's config.\n"
|
||||
"Server Configuration Parameter:\n"
|
||||
"\n"
|
||||
" [webdav]\n"
|
||||
" ; enable = True ; Serve webdav over the http(s) servers\n"
|
||||
" ; vdir = webdav ; the directory that webdav will be served at\n"
|
||||
" ; this default val means that webdav will be\n"
|
||||
" ; on \"http://localhost:8069/webdav/\n"
|
||||
" ; verbose = True ; Turn on the verbose messages of webdav\n"
|
||||
" ; debug = True ; Turn on the debugging messages of webdav\n"
|
||||
" ; since the messages are routed to the python logging, with\n"
|
||||
" ; levels \"debug\" and \"debug_rpc\" respectively, you can leave\n"
|
||||
" ; these options on\n"
|
||||
"\n"
|
||||
"Also implements IETF RFC 5785 for services discovery on a http server,\n"
|
||||
"which needs explicit configuration in openerp-server.conf, too.\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sm
|
||||
@@ -5485,7 +5509,7 @@ msgstr "That contract is already registered in the system."
|
||||
#: model:ir.actions.act_window,name:base.action_res_partner_bank_type_form
|
||||
#: model:ir.ui.menu,name:base.menu_action_res_partner_bank_typeform
|
||||
msgid "Bank Account Types"
|
||||
msgstr ""
|
||||
msgstr "Bank Account Types"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.sequence,suffix:0
|
||||
@@ -5495,7 +5519,7 @@ msgstr "Suffix value of the record for the sequence"
|
||||
#. module: base
|
||||
#: help:ir.mail_server,smtp_user:0
|
||||
msgid "Optional username for SMTP authentication"
|
||||
msgstr ""
|
||||
msgstr "Optional username for SMTP authentication"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_ir_actions_actions
|
||||
@@ -5549,12 +5573,12 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_web_chat
|
||||
msgid "Web Chat"
|
||||
msgstr ""
|
||||
msgstr "Web Chat"
|
||||
|
||||
#. module: base
|
||||
#: field:res.company,rml_footer2:0
|
||||
msgid "Bank Accounts Footer"
|
||||
msgstr ""
|
||||
msgstr "Bank Accounts Footer"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.mu
|
||||
@@ -5580,12 +5604,12 @@ msgstr "Security"
|
||||
#: code:addons/base/ir/ir_model.py:311
|
||||
#, python-format
|
||||
msgid "Changing the storing system for field \"%s\" is not allowed."
|
||||
msgstr ""
|
||||
msgstr "Changing the storing system for field \"%s\" is not allowed."
|
||||
|
||||
#. module: base
|
||||
#: help:res.partner.bank,company_id:0
|
||||
msgid "Only if this bank account belong to your company"
|
||||
msgstr ""
|
||||
msgstr "Only if this bank account belongs to your company"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.za
|
||||
@@ -5621,6 +5645,14 @@ msgid ""
|
||||
"This new object will regroup and will allow you to easily keep track and "
|
||||
"order all your purchase orders.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"This module lets you manage your Purchase Requisition.\n"
|
||||
"===========================================================\n"
|
||||
"\n"
|
||||
"When a purchase order is created, you now have the opportunity to save the "
|
||||
"related requisition.\n"
|
||||
"This new object will regroup and will let you easily track and order all "
|
||||
"your purchase orders.\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.hu
|
||||
@@ -5630,7 +5662,7 @@ msgstr "Hungary"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_hr_recruitment
|
||||
msgid "Recruitment Process"
|
||||
msgstr ""
|
||||
msgstr "Recruitment Process"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.br
|
||||
@@ -5691,12 +5723,12 @@ msgstr "System update completed"
|
||||
#. module: base
|
||||
#: sql_constraint:ir.model:0
|
||||
msgid "Each model must be unique!"
|
||||
msgstr ""
|
||||
msgstr "Each model must be unique!"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.category,name:base.module_category_localization
|
||||
msgid "Localization"
|
||||
msgstr ""
|
||||
msgstr "Localisation"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_sale_mrp
|
||||
@@ -5712,6 +5744,16 @@ msgid ""
|
||||
"It adds sales name and sales Reference on production order.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"This module provides facility to the user to install mrp and sales modules "
|
||||
"at a time.\n"
|
||||
"============================================================================="
|
||||
"=======\n"
|
||||
"\n"
|
||||
"It is used when we want to keep track of production\n"
|
||||
"orders generated from sales order.\n"
|
||||
"It adds sales name and sales Reference on production order.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: selection:res.request,state:0
|
||||
@@ -5829,6 +5871,12 @@ msgid ""
|
||||
" - InfoLogic UK counties listing\n"
|
||||
" - a few other adaptations"
|
||||
msgstr ""
|
||||
"This is the latest UK OpenERP localisation necessary to run OpenERP "
|
||||
"accounting for UK SMEs with:\n"
|
||||
" - a CT600-ready chart of accounts\n"
|
||||
" - VAT100-ready tax structure\n"
|
||||
" - InfoLogic UK counties listing\n"
|
||||
" - a few other adaptations"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.attachment,create_uid:0
|
||||
@@ -5844,6 +5892,11 @@ msgid ""
|
||||
" those assets. And it allows to create Move's of the depreciation lines.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"Financial and accounting asset management.\n"
|
||||
" This Module manages the assets owned by a company or individual. It will "
|
||||
"keep track of depreciation's occurred on\n"
|
||||
" those assets. And it allows to create moves of the depreciation lines.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.bv
|
||||
@@ -5917,7 +5970,7 @@ msgstr "Field"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_project_long_term
|
||||
msgid "Long Term Projects"
|
||||
msgstr ""
|
||||
msgstr "Long Term Projects"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.ve
|
||||
@@ -5937,7 +5990,7 @@ msgstr "Zambia"
|
||||
#. module: base
|
||||
#: view:ir.actions.todo:0
|
||||
msgid "Launch Configuration Wizard"
|
||||
msgstr ""
|
||||
msgstr "Launch Configuration Wizard"
|
||||
|
||||
#. module: base
|
||||
#: help:res.partner,user_id:0
|
||||
@@ -6040,7 +6093,7 @@ msgstr "Montserrat"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_decimal_precision
|
||||
msgid "Decimal Precision Configuration"
|
||||
msgstr ""
|
||||
msgstr "Decimal Precision Configuration"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.menu_translation_app
|
||||
|
||||
+1885
-352
File diff suppressed because it is too large
Load Diff
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:05+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:05+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
"Language: \n"
|
||||
|
||||
#. module: base
|
||||
|
||||
@@ -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: 2012-11-06 04:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16232)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 04:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:08+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:07+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -3,14 +3,14 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2012-02-08 00:44+0000\n"
|
||||
"PO-Revision-Date: 2012-08-20 15:53+0000\n"
|
||||
"Last-Translator: avion <nat@sethack.com>\n"
|
||||
"PO-Revision-Date: 2012-11-13 02:22+0000\n"
|
||||
"Last-Translator: fshahy <fshahy@gmail.com>\n"
|
||||
"Language-Team: OpenERP Iran <info@openerp-iran.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:02+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-14 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
|
||||
"X-Poedit-Language: Persian\n"
|
||||
|
||||
@@ -9654,7 +9654,7 @@ msgstr ""
|
||||
#: field:ir.model.fields,readonly:0
|
||||
#: field:res.partner.bank.type.field,readonly:0
|
||||
msgid "Readonly"
|
||||
msgstr "تنها خواندنی"
|
||||
msgstr "فقط خواندنی"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_crm_todo
|
||||
@@ -9681,7 +9681,7 @@ msgstr ""
|
||||
#: selection:ir.module.module,state:0
|
||||
#: selection:ir.module.module.dependency,state:0
|
||||
msgid "To be installed"
|
||||
msgstr "برای برپاسازی"
|
||||
msgstr "برای نصب"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.actions.act_window,display_menu_tip:0
|
||||
@@ -9956,12 +9956,12 @@ msgstr "بخشبندی"
|
||||
#. module: base
|
||||
#: field:res.lang,thousands_sep:0
|
||||
msgid "Thousands Separator"
|
||||
msgstr "جداساز هزارگانی"
|
||||
msgstr "جداساز هزارگان"
|
||||
|
||||
#. module: base
|
||||
#: field:res.request,create_date:0
|
||||
msgid "Created Date"
|
||||
msgstr "تاریخ پدیدن"
|
||||
msgstr "تاریخ ایجاد"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.module.module:0
|
||||
@@ -10027,7 +10027,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: field:ir.attachment,datas:0
|
||||
msgid "File Content"
|
||||
msgstr "محتوای پرونده"
|
||||
msgstr "محتوای فایل"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.pa
|
||||
@@ -10270,7 +10270,7 @@ msgstr "دوشیزه"
|
||||
#: field:ir.model.access,perm_write:0
|
||||
#: view:ir.rule:0
|
||||
msgid "Write Access"
|
||||
msgstr "دستی نوشتن"
|
||||
msgstr "دسترسی نوشتن"
|
||||
|
||||
#. module: base
|
||||
#: view:res.lang:0
|
||||
@@ -10608,13 +10608,13 @@ msgstr ""
|
||||
#: selection:ir.module.module,state:0
|
||||
#: selection:ir.module.module.dependency,state:0
|
||||
msgid "Not Installed"
|
||||
msgstr "برپاسازی نشده"
|
||||
msgstr "نصب نشده"
|
||||
|
||||
#. module: base
|
||||
#: view:workflow.activity:0
|
||||
#: field:workflow.activity,out_transitions:0
|
||||
msgid "Outgoing Transitions"
|
||||
msgstr "گذارهای صادره"
|
||||
msgstr "ترجمه های صادره"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.ui.menu,icon:0
|
||||
@@ -10785,7 +10785,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: view:base.module.import:0
|
||||
msgid "Import module"
|
||||
msgstr "درونش پیمانه"
|
||||
msgstr "درونش ماژول"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.server,loop_action:0
|
||||
@@ -10810,7 +10810,7 @@ msgstr "لائوس"
|
||||
#: field:res.company,email:0
|
||||
#: field:res.users,user_email:0
|
||||
msgid "Email"
|
||||
msgstr "ایمیل"
|
||||
msgstr "پست الکترونیک"
|
||||
|
||||
#. module: base
|
||||
#: field:res.users,action_id:0
|
||||
@@ -10932,7 +10932,7 @@ msgstr "3. %x ,%X ==> 12/05/08, 18:25:20"
|
||||
#. module: base
|
||||
#: selection:ir.model.fields,on_delete:0
|
||||
msgid "Cascade"
|
||||
msgstr "چینش"
|
||||
msgstr "آبشاری"
|
||||
|
||||
#. module: base
|
||||
#: field:workflow.transition,group_id:0
|
||||
@@ -10959,7 +10959,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: view:ir.actions.configuration.wizard:0
|
||||
msgid "Next Configuration Step"
|
||||
msgstr "گام پیکربندی پسین"
|
||||
msgstr "گام پیکربندی بعدی"
|
||||
|
||||
#. module: base
|
||||
#: field:res.groups,comment:0
|
||||
@@ -11083,7 +11083,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:res.country,name:base.by
|
||||
msgid "Belarus"
|
||||
msgstr "روسیه سفید"
|
||||
msgstr "بلاروس"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.act_window,name:0
|
||||
@@ -11166,7 +11166,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: field:ir.actions.act_window,filter:0
|
||||
msgid "Filter"
|
||||
msgstr "پالایه"
|
||||
msgstr "فیلتر"
|
||||
|
||||
#. module: base
|
||||
#: model:res.partner.title,shortcut:base.res_partner_title_madam
|
||||
@@ -11229,7 +11229,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_workflow
|
||||
msgid "workflow"
|
||||
msgstr "کارگردش"
|
||||
msgstr "گردش کار"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/ir/ir_model.py:255
|
||||
@@ -11414,7 +11414,7 @@ msgstr "پیمایش شمارگانی"
|
||||
#. module: base
|
||||
#: help:multi_company.default,field_id:0
|
||||
msgid "Select field property"
|
||||
msgstr "ویژگی فیلد را برگزینید"
|
||||
msgstr "فیلد ویژگی را انتحاب کنید"
|
||||
|
||||
#. module: base
|
||||
#: field:res.request.history,date_sent:0
|
||||
@@ -11477,7 +11477,7 @@ msgstr ""
|
||||
#: view:ir.actions.server:0
|
||||
#: model:ir.ui.menu,name:base.menu_server_action
|
||||
msgid "Server Actions"
|
||||
msgstr "کُنشهای کارپذیر"
|
||||
msgstr "کُنشهای سمت سرور"
|
||||
|
||||
#. module: base
|
||||
#: field:res.partner.bank.type,format_layout:0
|
||||
@@ -11884,7 +11884,7 @@ msgstr "4. %b, %B ==> Dec, December"
|
||||
#: view:base.language.install:0
|
||||
#: model:ir.ui.menu,name:base.menu_view_base_language_install
|
||||
msgid "Load an Official Translation"
|
||||
msgstr "بارگذاری یک برگردان رسمی"
|
||||
msgstr "بارگذاری یک ترجمه رسمی"
|
||||
|
||||
#. module: base
|
||||
#: view:res.currency:0
|
||||
@@ -11894,7 +11894,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:res.partner.category,name:base.res_partner_category_10
|
||||
msgid "Open Source Service Company"
|
||||
msgstr "شرکت خدماتی بازمتن"
|
||||
msgstr "شرکت خدماتی متن باز"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -11938,7 +11938,7 @@ msgid ""
|
||||
"If set to true, the wizard will not be displayed on the right toolbar of a "
|
||||
"form view."
|
||||
msgstr ""
|
||||
"اگر مقدار به درست تنظیم شده باشد، تَردست در سمت راست یک نمای فرمی نمایش داده "
|
||||
"اگر مقدار به درست تنظیم شده باشد، ویزارد در سمت راست یک نمای فرمی نمایش داده "
|
||||
"نخواهد شد."
|
||||
|
||||
#. module: base
|
||||
@@ -12069,7 +12069,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: selection:ir.translation,type:0
|
||||
msgid "Selection"
|
||||
msgstr "گزینش"
|
||||
msgstr "انتخاب"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.module.module,icon:0
|
||||
@@ -12221,7 +12221,7 @@ msgstr "ساعت ۰۰->۱۲: %(h12)s"
|
||||
#. module: base
|
||||
#: help:res.partner.address,active:0
|
||||
msgid "Uncheck the active field to hide the contact."
|
||||
msgstr "تیک فیلد فعال را برای مخفی شده تماس بردارد."
|
||||
msgstr "تیک فیلد فعال را برای مخفی شدن تماس بردارید."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_res_widget_wizard
|
||||
@@ -12439,7 +12439,7 @@ msgstr ""
|
||||
#: view:base.module.upgrade:0
|
||||
#: field:base.module.upgrade,module_info:0
|
||||
msgid "Modules to update"
|
||||
msgstr "پیمانهها برای بروزرسانی"
|
||||
msgstr "ماژول هایی که بروزرسانی می شوند"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.actions.server,sequence:0
|
||||
@@ -12529,7 +12529,7 @@ msgstr ""
|
||||
#: view:ir.model.fields:0
|
||||
#: field:ir.model.fields,translate:0
|
||||
msgid "Translate"
|
||||
msgstr "برگردانی"
|
||||
msgstr "ترجمه"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_users_ldap
|
||||
@@ -12656,7 +12656,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: selection:base.language.export,state:0
|
||||
msgid "choose"
|
||||
msgstr "گزینش"
|
||||
msgstr "انتخاب"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.model,osv_memory:0
|
||||
@@ -12690,7 +12690,7 @@ msgstr ""
|
||||
#: model:ir.ui.menu,name:base.menu_procurement_management_supplier_name
|
||||
#: view:res.partner:0
|
||||
msgid "Suppliers"
|
||||
msgstr "تامینکنندگان فرآورده"
|
||||
msgstr "تامینکنندگان"
|
||||
|
||||
#. module: base
|
||||
#: view:publisher_warranty.contract.wizard:0
|
||||
@@ -12724,12 +12724,12 @@ msgstr ""
|
||||
#: model:res.groups,name:base.group_erp_manager
|
||||
#: view:res.users:0
|
||||
msgid "Access Rights"
|
||||
msgstr "حقوق دسترسی"
|
||||
msgstr "سطوح دسترسی"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.gl
|
||||
msgid "Greenland"
|
||||
msgstr "گروئنلند"
|
||||
msgstr "گرینلند"
|
||||
|
||||
#. module: base
|
||||
#: model:res.groups,name:base.group_sale_salesman_all_leads
|
||||
@@ -13043,7 +13043,7 @@ msgstr "منظرهای"
|
||||
#: model:ir.actions.todo.category,name:base.category_administration_config
|
||||
#: model:ir.module.category,name:base.module_category_administration
|
||||
msgid "Administration"
|
||||
msgstr "راهبری"
|
||||
msgstr "مدیریت"
|
||||
|
||||
#. module: base
|
||||
#: view:base.module.update:0
|
||||
@@ -13186,7 +13186,7 @@ msgstr "ir.sequence.type"
|
||||
#. module: base
|
||||
#: selection:base.language.export,format:0
|
||||
msgid "CSV File"
|
||||
msgstr "پرونده CSV"
|
||||
msgstr "فایل CSV"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/res/res_company.py:154
|
||||
@@ -13253,7 +13253,7 @@ msgstr "جیبوتی"
|
||||
#. module: base
|
||||
#: field:ir.translation,value:0
|
||||
msgid "Translation Value"
|
||||
msgstr "مقدار برگردان"
|
||||
msgstr "مقدار ترجمه"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.ag
|
||||
@@ -13284,7 +13284,7 @@ msgstr "شناسه منبع"
|
||||
#: view:ir.cron:0
|
||||
#: field:ir.model,info:0
|
||||
msgid "Information"
|
||||
msgstr "آگهگان"
|
||||
msgstr "اطلاعات"
|
||||
|
||||
#. module: base
|
||||
#: view:res.widget.user:0
|
||||
@@ -13576,12 +13576,12 @@ msgstr "راهنمای فنی"
|
||||
#. module: base
|
||||
#: view:res.company:0
|
||||
msgid "Address Information"
|
||||
msgstr ""
|
||||
msgstr "اطلاعات آدرس"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.tz
|
||||
msgid "Tanzania"
|
||||
msgstr "تانزانیا، جمهوری متحد"
|
||||
msgstr "تانزانیا"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -13611,7 +13611,7 @@ msgstr "پیکربندی سایر کنشها"
|
||||
#. module: base
|
||||
#: selection:ir.module.module.dependency,state:0
|
||||
msgid "Uninstallable"
|
||||
msgstr "غیر قابل برپاسازی"
|
||||
msgstr "غیر قابل نصب"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_web_dashboard
|
||||
@@ -13634,7 +13634,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: view:ir.ui.view:0
|
||||
msgid "Extra Info"
|
||||
msgstr ""
|
||||
msgstr "اطلاعات بیشتر"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_l10n_be_hr_payroll
|
||||
@@ -13683,7 +13683,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: view:res.request:0
|
||||
msgid "Send"
|
||||
msgstr "فرستادن"
|
||||
msgstr "ارسال"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_process
|
||||
@@ -14130,7 +14130,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: selection:ir.module.module,state:0
|
||||
msgid "Not Installable"
|
||||
msgstr "غیرقابل برپاسازی"
|
||||
msgstr "غیرقابل نصب"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_product
|
||||
@@ -14197,7 +14197,7 @@ msgstr ""
|
||||
#: view:base.module.upgrade:0
|
||||
#: model:ir.ui.menu,name:base.menu_view_base_module_upgrade
|
||||
msgid "Apply Scheduled Upgrades"
|
||||
msgstr "بکاربندی ارتقای زمانبندیشده"
|
||||
msgstr "اعمال ارتقای زمانبندیشده"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_sale_journal
|
||||
@@ -14207,7 +14207,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
msgid "Persian / فارس"
|
||||
msgstr ""
|
||||
msgstr "Persian / فارسی"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.actions.act_window:0
|
||||
@@ -14269,7 +14269,7 @@ msgstr ""
|
||||
#: field:base.language.export,name:0
|
||||
#: field:ir.attachment,datas_fname:0
|
||||
msgid "Filename"
|
||||
msgstr "نام پرونده"
|
||||
msgstr "نام فایل"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.model,access_ids:0
|
||||
@@ -14296,7 +14296,7 @@ msgstr "آروبا"
|
||||
#: code:addons/base/module/wizard/base_module_import.py:60
|
||||
#, python-format
|
||||
msgid "File is not a zip file!"
|
||||
msgstr ""
|
||||
msgstr "این فایل یک فابل zip نیست!"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.ar
|
||||
@@ -14330,7 +14330,7 @@ msgstr "بحرین"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_web
|
||||
msgid "web"
|
||||
msgstr ""
|
||||
msgstr "وب"
|
||||
|
||||
#. module: base
|
||||
#: field:res.bank,fax:0
|
||||
@@ -14404,13 +14404,13 @@ msgstr "شرکت"
|
||||
#. module: base
|
||||
#: model:ir.module.category,name:base.module_category_report_designer
|
||||
msgid "Advanced Reporting"
|
||||
msgstr ""
|
||||
msgstr "گزارش گیری پیشرفته"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.actions.act_window,target:0
|
||||
#: selection:ir.actions.url,target:0
|
||||
msgid "New Window"
|
||||
msgstr "پنجره نو"
|
||||
msgstr "پنجره جدید"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_ir_model_data
|
||||
@@ -14430,17 +14430,17 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.menu_aftersale
|
||||
msgid "After-Sale Services"
|
||||
msgstr ""
|
||||
msgstr "خدمات پس از فروش"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_fr
|
||||
msgid "France - Accounting"
|
||||
msgstr ""
|
||||
msgstr "فرانسه - حسابداری"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.actions.todo:0
|
||||
msgid "Launch"
|
||||
msgstr ""
|
||||
msgstr "بارگذاری"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_caldav
|
||||
@@ -14515,7 +14515,7 @@ msgstr "جزایر ویرجین انگلستان"
|
||||
#: view:ir.property:0
|
||||
#: model:ir.ui.menu,name:base.next_id_15
|
||||
msgid "Parameters"
|
||||
msgstr ""
|
||||
msgstr "پارامترها"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.pm
|
||||
@@ -14631,7 +14631,7 @@ msgstr "جزایر کوک"
|
||||
#. module: base
|
||||
#: field:ir.model.data,noupdate:0
|
||||
msgid "Non Updatable"
|
||||
msgstr "بروزآوری نشدنی"
|
||||
msgstr "غیرقابل به روزرسانی"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -14744,7 +14744,7 @@ msgstr ""
|
||||
#: view:res.partner:0
|
||||
#: view:res.partner.address:0
|
||||
msgid "Change Color"
|
||||
msgstr ""
|
||||
msgstr "تغییر رنگ"
|
||||
|
||||
#. module: base
|
||||
#: model:res.partner.category,name:base.res_partner_category_15
|
||||
@@ -14754,7 +14754,7 @@ msgstr "بخش فنآوری اطلاعات"
|
||||
#. module: base
|
||||
#: view:ir.actions.act_window:0
|
||||
msgid "Select Groups"
|
||||
msgstr "گروهها را برگزینید"
|
||||
msgstr "گروهها را انتحاب کنید"
|
||||
|
||||
#. module: base
|
||||
#: view:res.lang:0
|
||||
@@ -14782,7 +14782,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: field:ir.module.module,auto_install:0
|
||||
msgid "Automatic Installation"
|
||||
msgstr ""
|
||||
msgstr "نصب خودکار"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.jp
|
||||
@@ -14798,7 +14798,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: selection:ir.translation,type:0
|
||||
msgid "Wizard Button"
|
||||
msgstr "دکمه تردست"
|
||||
msgstr "دکمه ویزارد"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.translation,type:0
|
||||
@@ -14851,7 +14851,7 @@ msgstr "ir.actions.server"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_ca
|
||||
msgid "Canada - Accounting"
|
||||
msgstr ""
|
||||
msgstr "کانادا - حسابداری"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.actions.act_window,name:base.act_ir_actions_todo_form
|
||||
@@ -14860,7 +14860,7 @@ msgstr ""
|
||||
#: model:ir.ui.menu,name:base.menu_ir_actions_todo_form
|
||||
#: model:ir.ui.menu,name:base.next_id_11
|
||||
msgid "Configuration Wizards"
|
||||
msgstr "تردستهای پیکربندی"
|
||||
msgstr "ویزارد پیکربندی"
|
||||
|
||||
#. module: base
|
||||
#: field:res.lang,code:0
|
||||
@@ -14890,7 +14890,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_ve
|
||||
msgid "Venezuela - Accounting"
|
||||
msgstr ""
|
||||
msgstr "ونزوپلا - حسابداری"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.cl
|
||||
@@ -14900,7 +14900,7 @@ msgstr "شیلی"
|
||||
#. module: base
|
||||
#: view:ir.cron:0
|
||||
msgid "Execution"
|
||||
msgstr ""
|
||||
msgstr "اجرا"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.server,condition:0
|
||||
@@ -14954,7 +14954,7 @@ msgstr "کرواسی"
|
||||
#. module: base
|
||||
#: field:ir.actions.server,mobile:0
|
||||
msgid "Mobile No"
|
||||
msgstr "شماره همرا"
|
||||
msgstr "شماره همراه"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.actions.act_window,name:base.action_partner_by_category
|
||||
@@ -14968,12 +14968,12 @@ msgstr "دستهبندیهای همکار"
|
||||
#. module: base
|
||||
#: view:base.module.upgrade:0
|
||||
msgid "System Update"
|
||||
msgstr ""
|
||||
msgstr "به روز رسانی سیستم"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.translation,type:0
|
||||
msgid "Wizard Field"
|
||||
msgstr "فیلد تردست"
|
||||
msgstr "فیلد ویزارد"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.sequence,prefix:0
|
||||
@@ -14999,7 +14999,7 @@ msgstr "حسابهای بانکی"
|
||||
#: field:ir.model,modules:0
|
||||
#: field:ir.model.fields,modules:0
|
||||
msgid "In modules"
|
||||
msgstr ""
|
||||
msgstr "در ماژولهای"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sl
|
||||
@@ -15010,7 +15010,7 @@ msgstr "سیرالئون"
|
||||
#: view:res.company:0
|
||||
#: view:res.partner:0
|
||||
msgid "General Information"
|
||||
msgstr "آگهگان عمومی"
|
||||
msgstr "اطلاعات عمومی"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.tc
|
||||
@@ -15109,7 +15109,7 @@ msgstr "همکاران: "
|
||||
#. module: base
|
||||
#: field:res.partner.bank,name:0
|
||||
msgid "Bank Account"
|
||||
msgstr ""
|
||||
msgstr "حساب بانکی"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.kp
|
||||
@@ -15119,7 +15119,7 @@ msgstr "کره شمالی"
|
||||
#. module: base
|
||||
#: selection:ir.actions.server,state:0
|
||||
msgid "Create Object"
|
||||
msgstr "پدیدن شی"
|
||||
msgstr "ایجاد شی"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.filters:0
|
||||
@@ -15130,12 +15130,12 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_sale_mrp
|
||||
msgid "Sales and MRP Management"
|
||||
msgstr ""
|
||||
msgstr "مدیریت فروش و تولید"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.actions.act_window,name:base.action_partner_sms_send
|
||||
msgid "Send an SMS"
|
||||
msgstr ""
|
||||
msgstr "ارسال پیامک"
|
||||
|
||||
#. module: base
|
||||
#: model:res.partner.category,name:base.res_partner_category_1
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 04:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:08+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 04:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:08+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:00+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:00+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
@@ -30,7 +30,7 @@ msgstr "બીજા કન્ફિગ્યુરેશન"
|
||||
#. module: base
|
||||
#: selection:ir.property,type:0
|
||||
msgid "DateTime"
|
||||
msgstr "દિવસ અને તારીખ"
|
||||
msgstr "દિવસ અને સમય"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_project_mailgate
|
||||
@@ -51,7 +51,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,description:base.module_project
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:00+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
"Language: hr\n"
|
||||
|
||||
#. module: base
|
||||
|
||||
+176
-40
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:00+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
@@ -401,7 +401,7 @@ msgstr "Invalid group_by"
|
||||
#. module: base
|
||||
#: field:ir.module.category,child_ids:0
|
||||
msgid "Child Applications"
|
||||
msgstr ""
|
||||
msgstr "Alárendelt/gyermek alkalmazások"
|
||||
|
||||
#. module: base
|
||||
#: field:res.partner,credit_limit:0
|
||||
@@ -436,7 +436,7 @@ msgstr "Forrás Objektum"
|
||||
#. 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
|
||||
@@ -466,6 +466,9 @@ msgid ""
|
||||
"Invalid date/time format directive specified. Please refer to the list of "
|
||||
"allowed directives, displayed when you edit a language."
|
||||
msgstr ""
|
||||
"Nem létező dátum/idő utasítás formátum lett megadva. Kérjük hivatkozzon a "
|
||||
"listában lévő utasítás formátumokra, mely a nyelv szerkesztése közben a "
|
||||
"képernyőn látható."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/orm.py:3895
|
||||
@@ -488,11 +491,13 @@ msgid ""
|
||||
"The user this filter is available to. When left empty the filter is usable "
|
||||
"by the system only."
|
||||
msgstr ""
|
||||
"A felhasználó is használhatja ezt a szűrőt. Ha üresen hagyja akkor a szűrőt "
|
||||
"csak a rendszer használhatja."
|
||||
|
||||
#. module: base
|
||||
#: help:res.partner,website:0
|
||||
msgid "Website of Partner."
|
||||
msgstr ""
|
||||
msgstr "A kapcsolat/partner weboldala"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.actions.act_window,views:0
|
||||
@@ -502,6 +507,10 @@ msgid ""
|
||||
"and reference view. The result is returned as an ordered list of pairs "
|
||||
"(view_id,view_mode)."
|
||||
msgstr ""
|
||||
"Ez a hivatkozási mező számítja ki a nézetek lista elrendezését amit be kell "
|
||||
"kapcsolni, ha ki szeretnénk jelezni a művelet eredményét, összesített nézet "
|
||||
"módot, nézeteket és a hivatkozási nézetet a képernyőre. Az eredményt "
|
||||
"visszakapjuk, mint egy megrendelési páros lista (nézet_id,nézet_mód)."
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.tv
|
||||
@@ -521,7 +530,7 @@ msgstr "Dátum Formátum"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_base_report_designer
|
||||
msgid "OpenOffice Report Designer"
|
||||
msgstr ""
|
||||
msgstr "OpenOffice Jelentés Szerkesztő"
|
||||
|
||||
#. module: base
|
||||
#: field:res.bank,email:0
|
||||
@@ -552,7 +561,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: view:ir.values:0
|
||||
msgid "Action Binding"
|
||||
msgstr ""
|
||||
msgstr "Művelet összekötés"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.gf
|
||||
@@ -591,7 +600,7 @@ msgstr "Spanyol (VE)"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_hr_timesheet_invoice
|
||||
msgid "Invoice on Timesheets"
|
||||
msgstr ""
|
||||
msgstr "Számlák az időkimutatásokon"
|
||||
|
||||
#. module: base
|
||||
#: view:base.module.upgrade:0
|
||||
@@ -627,6 +636,26 @@ msgid ""
|
||||
" Accounting/Reporting/Generic Reporting/Partners/Follow-ups Sent\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Modul az automata nem kiegyenlített számlák levelezéséhez, több-szintű "
|
||||
"emlékeztetőkkel.\n"
|
||||
"==========================================================================\n"
|
||||
"\n"
|
||||
"A menün keresztül meg tudja adni a többszintű emlékeztetőket:\n"
|
||||
" Könyvelés/Beállítások/Egyebek/Nyomon-követés\n"
|
||||
"Ha már meghatározott, akkor automatikussan nyomtathat emlékeztetőket minden "
|
||||
"nap egyszerűen a menüre kettintva:\n"
|
||||
" Könyvelés/Periódikus végrehajtás/Számlázás/Nyomon követés küldése\n"
|
||||
"\n"
|
||||
"PDF fájlt generál minden levélhez, \n"
|
||||
"melyet a különböző ismétlődési szintekhez rendelt. \n"
|
||||
"Mindegyik vállalathoz külön nyomtató eljárás rendelhető.\n"
|
||||
"Levelet is küldhet az ügyfélnek.\n"
|
||||
"\n"
|
||||
"Figyelje meg, hogy a partner/számla belyegyzéshez tartozó nyomon-követési "
|
||||
"szintet a menüből is ellenőrizheti:\n"
|
||||
" Könyvelés/Jelentés/Általános jelentés/Partnerek/Nyomon-követés küldve\n"
|
||||
"\n"
|
||||
|
||||
#. module: base
|
||||
#: field:res.country,name:0
|
||||
@@ -696,7 +725,7 @@ msgstr "Egyéni mező nevének 'x_'-el kell kezdődnie!"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_mx
|
||||
msgid "Mexico - Accounting"
|
||||
msgstr ""
|
||||
msgstr "Mexico - Könyvelés"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.actions.server,action_id:0
|
||||
@@ -716,7 +745,7 @@ msgstr "Exportálás kész."
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_plugin_outlook
|
||||
msgid "Outlook Plug-In"
|
||||
msgstr ""
|
||||
msgstr "Outlook Plug-In"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.model:0
|
||||
@@ -745,7 +774,7 @@ msgstr "Jordánia"
|
||||
#. module: base
|
||||
#: help:ir.cron,nextcall:0
|
||||
msgid "Next planned execution date for this job."
|
||||
msgstr ""
|
||||
msgstr "Ennek a munkának a következő tervezett végrehajtási dátuma."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/ir/ir_model.py:139
|
||||
@@ -761,7 +790,7 @@ msgstr "Eritrea"
|
||||
#. module: base
|
||||
#: sql_constraint:res.company:0
|
||||
msgid "The company name must be unique !"
|
||||
msgstr ""
|
||||
msgstr "A válláalkozás nevének egyedinek kell lennie"
|
||||
|
||||
#. module: base
|
||||
#: view:res.config:0
|
||||
@@ -778,7 +807,7 @@ msgstr "Automatizált műveletek"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_ro
|
||||
msgid "Romania - Accounting"
|
||||
msgstr ""
|
||||
msgstr "Romania - Könyvelés"
|
||||
|
||||
#. module: base
|
||||
#: view:partner.wizard.ean.check:0
|
||||
@@ -799,7 +828,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: view:ir.mail_server:0
|
||||
msgid "Security and Authentication"
|
||||
msgstr ""
|
||||
msgstr "Biztonság és Hitelesítés"
|
||||
|
||||
#. module: base
|
||||
#: view:base.language.export:0
|
||||
@@ -819,6 +848,10 @@ msgid ""
|
||||
"Launch Manually Once: after hacing been launched manually, it sets "
|
||||
"automatically to Done."
|
||||
msgstr ""
|
||||
"Kézi: Kézell elindított.\n"
|
||||
"Automatikus: A rendszer újrakonfigurációinál mindíg futtatva lesz.\n"
|
||||
"Egyseri futtatás kézzel: Kézzel való elindítás után, autómatán elvégzettre "
|
||||
"állítva."
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -889,7 +922,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_document_webdav
|
||||
msgid "Shared Repositories (WebDAV)"
|
||||
msgstr ""
|
||||
msgstr "Megosztott tárterület (WebDAV)"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_import_google
|
||||
@@ -897,11 +930,13 @@ msgid ""
|
||||
"The module adds google contact in partner address and add google calendar "
|
||||
"events details in Meeting"
|
||||
msgstr ""
|
||||
"A modul a google kapcsolatokat a partner címekhez adja valamint a google "
|
||||
"naptár bejegyzés részletit a Találkozókhoz"
|
||||
|
||||
#. module: base
|
||||
#: view:res.users:0
|
||||
msgid "Email Preferences"
|
||||
msgstr ""
|
||||
msgstr "Email preferencia"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_audittrail
|
||||
@@ -916,6 +951,15 @@ msgid ""
|
||||
"delete on objects and can check logs.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"A modul az adminisztrátor számára nyomonkövetést biztosít minden "
|
||||
"felhasználói művelethez minden rendszer objektumra vonatkozólag.\n"
|
||||
"============================================================================="
|
||||
"==============\n"
|
||||
"\n"
|
||||
"Az adminisztrátor feliratozhat az objektum olvasási, írási és törlési "
|
||||
"szabályhoz és ellenőrizheti a naplót.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:res.partner.category,name:base.res_partner_category_4
|
||||
@@ -978,7 +1022,7 @@ msgstr "Omán"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_mrp
|
||||
msgid "MRP"
|
||||
msgstr ""
|
||||
msgstr "MRP"
|
||||
|
||||
#. module: base
|
||||
#: report:ir.module.reference.graph:0
|
||||
@@ -993,7 +1037,7 @@ msgstr "Niue"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_membership
|
||||
msgid "Membership Management"
|
||||
msgstr ""
|
||||
msgstr "Tagok adatkezelése"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.module.module,license:0
|
||||
@@ -1020,7 +1064,7 @@ msgstr "Hivatkozás típusok kérése"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_google_base_account
|
||||
msgid "Google Users"
|
||||
msgstr ""
|
||||
msgstr "Google felhasználók"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.server.object.lines,value:0
|
||||
@@ -1057,6 +1101,8 @@ msgstr "TGZ Archívum"
|
||||
msgid ""
|
||||
"Users added to this group are automatically added in the following groups."
|
||||
msgstr ""
|
||||
"Ehhez a csoporthoz adott felhasználók automatikussan hozzá lesznek rendelve "
|
||||
"a következő csoportokhoz."
|
||||
|
||||
#. module: base
|
||||
#: view:res.lang:0
|
||||
@@ -1083,7 +1129,7 @@ msgstr "Típus"
|
||||
#. module: base
|
||||
#: field:ir.mail_server,smtp_user:0
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
msgstr "Felhasználó név"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/orm.py:398
|
||||
@@ -1110,7 +1156,7 @@ msgstr "Üres jelszó beállítása biztonsági okokból nem engedélyezett!"
|
||||
#: code:addons/base/ir/ir_mail_server.py:192
|
||||
#, python-format
|
||||
msgid "Connection test failed!"
|
||||
msgstr ""
|
||||
msgstr "Csatlakozás teszt nem sikerült!"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.actions.server,state:0
|
||||
@@ -1231,12 +1277,12 @@ msgstr "Spanyol (GT) / Español (GT)"
|
||||
#. module: base
|
||||
#: field:ir.mail_server,smtp_port:0
|
||||
msgid "SMTP Port"
|
||||
msgstr ""
|
||||
msgstr "SMTP Port"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_import_sugarcrm
|
||||
msgid "SugarCRM Import"
|
||||
msgstr ""
|
||||
msgstr "SugarCRM Import"
|
||||
|
||||
#. module: base
|
||||
#: view:res.lang:0
|
||||
@@ -1252,12 +1298,12 @@ msgstr ""
|
||||
#: code:addons/base/module/wizard/base_language_install.py:55
|
||||
#, python-format
|
||||
msgid "Language Pack"
|
||||
msgstr ""
|
||||
msgstr "Nyelvi csomag"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_web_tests
|
||||
msgid "Tests"
|
||||
msgstr ""
|
||||
msgstr "Teszts"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.ui.view_sc,res_id:0
|
||||
@@ -1318,7 +1364,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: field:ir.module.category,parent_id:0
|
||||
msgid "Parent Application"
|
||||
msgstr ""
|
||||
msgstr "Szülő alkalmazás"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/res/res_users.py:222
|
||||
@@ -1335,12 +1381,12 @@ msgstr "Új nyelv exportálásához ne válasszon ki nyelvet."
|
||||
#: model:ir.module.module,shortdesc:base.module_document
|
||||
#: model:ir.module.module,shortdesc:base.module_knowledge
|
||||
msgid "Document Management System"
|
||||
msgstr ""
|
||||
msgstr "Dokumentum kezelési rendszer"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_crm_claim
|
||||
msgid "Claims Management"
|
||||
msgstr ""
|
||||
msgstr "Igények kezelése"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.menu_purchase_root
|
||||
@@ -1365,6 +1411,10 @@ msgid ""
|
||||
"use the accounting application of OpenERP, journals and accounts will be "
|
||||
"created automatically based on these data."
|
||||
msgstr ""
|
||||
"A vállalata bank számláinak beállítása és a jelentés lábjegyzetben "
|
||||
"megjelenítani kívánt számla kiválasztása. A bankszámokat újrarendezheti a "
|
||||
"lista nézetből. Ha használja az OpenERP könyvelését akkor naplók és "
|
||||
"folyószámlák lesznek létrehozva automatikussan ezekből az adatokból."
|
||||
|
||||
#. module: base
|
||||
#: view:ir.module.module:0
|
||||
@@ -1384,11 +1434,19 @@ msgid ""
|
||||
" * Commitment Date\n"
|
||||
" * Effective Date\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Kiegészítő dátum információs adatokat ad a megrendeléshez.\n"
|
||||
"===================================================\n"
|
||||
"\n"
|
||||
"A következő kiegészítő adatokat adhatja a megrendeléshez:\n"
|
||||
" * Igényelt dátum\n"
|
||||
" * Elvállalt/elkötelezett dátum\n"
|
||||
" * Tényleges Date\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_account_sequence
|
||||
msgid "Entries Sequence Numbering"
|
||||
msgstr ""
|
||||
msgstr "Tételsorszámozás"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_ir_exports
|
||||
@@ -1425,6 +1483,26 @@ msgid ""
|
||||
"database,\n"
|
||||
" but in the servers rootpad like /server/bin/filestore.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Ez egy teljes dokumentum kezelő rendszer.\n"
|
||||
"==============================================\n"
|
||||
"\n"
|
||||
" * Felhasználó hitelesítés\n"
|
||||
" * Documentum Indexálás :- .pptx és .docx fájlok nem támogatottak Windows "
|
||||
"rendszerekben.\n"
|
||||
" * Dashboard dokumentumokhoz mely magában foglalja:\n"
|
||||
" * Új fájlok (lista)\n"
|
||||
" * Fájlok forrás tipusa szerint (grafikon)\n"
|
||||
" * Fájlok partnerek zerint (grafokon)\n"
|
||||
" * Fájlok nagysága havi lebontásban (grafokon)\n"
|
||||
"\n"
|
||||
"FIGYELEM:\n"
|
||||
" - Ha telepíti ezt a modult egy már meglévő vállalatra melyre már van PDF "
|
||||
"fájl tárolva az adatbázisban,\n"
|
||||
" akkor azt az összeset el fogja veszíteni.\n"
|
||||
" - Miután telepítette a modult a PDF-ek már nem az adatbázisban lesznek "
|
||||
"tárolva, \n"
|
||||
" hanem a server győkerében mint /server/bin/filestore.\n"
|
||||
|
||||
#. module: base
|
||||
#: view:res.lang:0
|
||||
@@ -1438,6 +1516,9 @@ msgid ""
|
||||
" OpenERP Web gantt chart view.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" OpenERP Web gantt diagram nézet.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: report:ir.module.reference.graph:0
|
||||
@@ -1490,6 +1571,15 @@ msgid ""
|
||||
"Web.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Ez a teszt modul megmutatja a HTML cimke támogatást normal XML forma "
|
||||
"nézetben.\n"
|
||||
"============================================================================="
|
||||
"\n"
|
||||
"\n"
|
||||
"Minta forma-nézetet hoz létre HTML cimkékkel. Kizárólag OpenERP Web-el "
|
||||
"tekinthető meg.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.category,description:base.module_category_purchase_management
|
||||
@@ -1497,6 +1587,8 @@ msgid ""
|
||||
"Helps you manage your purchase-related processes such as requests for "
|
||||
"quotations, supplier invoices, etc..."
|
||||
msgstr ""
|
||||
"Segít Önnek a beszerzéshez kapcsolódó folyamatainak kezelésében, mint "
|
||||
"például ajánlatkérések, szállítói számlák, stb..."
|
||||
|
||||
#. module: base
|
||||
#: help:base.language.install,overwrite:0
|
||||
@@ -1555,7 +1647,7 @@ msgstr "Bejelentkező név"
|
||||
#: model:ir.actions.act_window,name:base.action_wizard_update_translations
|
||||
#: model:ir.ui.menu,name:base.menu_wizard_update_translations
|
||||
msgid "Synchronize Terms"
|
||||
msgstr ""
|
||||
msgstr "Feltételek szinkronizáása"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.actions.server:0
|
||||
@@ -1583,6 +1675,19 @@ msgid ""
|
||||
" - You can define new types of events in\n"
|
||||
" Association / Configuration / Types of Events\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Rendezvények szervezése és kezelése.\n"
|
||||
"======================================\n"
|
||||
"\n"
|
||||
"Ez a modul lehetővé teszi\n"
|
||||
" * az rendezvényel szervezését és nyilvántartásait\n"
|
||||
" * automatikus elfogadó és visszaigazoló emailek használatát és küldését "
|
||||
"bármely bejegyzett eseményre\n"
|
||||
" * ...\n"
|
||||
"\n"
|
||||
"Vegye figyelembe:\n"
|
||||
" - Új tipusú eseményt definiálhat itt\n"
|
||||
" Asszociáció,összekapcsolás / Beállítások / Rendezvény típusa\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.menu_tools
|
||||
@@ -1598,7 +1703,7 @@ msgstr "Lebegőpontos"
|
||||
#: model:ir.module.category,name:base.module_category_warehouse_management
|
||||
#: model:ir.module.module,shortdesc:base.module_stock
|
||||
msgid "Warehouse Management"
|
||||
msgstr ""
|
||||
msgstr "Raktár kezelés"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_res_request_link
|
||||
@@ -1629,7 +1734,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_lu
|
||||
msgid "Luxembourg - Accounting"
|
||||
msgstr ""
|
||||
msgstr "Luxembourg - Könyvelés"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.tp
|
||||
@@ -1687,6 +1792,26 @@ msgid ""
|
||||
"\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Ez a modul általános megoszó eszköz a meglévő OpenERP adatbázishoz.\n"
|
||||
"========================================================================\n"
|
||||
"\n"
|
||||
"Kifejezetten hozzáad egy 'megoszt' kapcsológombot a Web clienshez, mellyel "
|
||||
"bármely \n"
|
||||
"OpenERP adat megosztható a kollégákkal, ügyfelekkel, barátokkal, stb.\n"
|
||||
"\n"
|
||||
"A rendszer úgy fog működni, hogy folyamatosan létrehoz új felhasználókat és "
|
||||
"csoportokat, melyek\n"
|
||||
"hozzáférési jogosultségainak kombinációival és ir.jogosultságokkal ahhoz, "
|
||||
"hogy\n"
|
||||
"biztosítva legyen, a megosztott adatot csak azok a felhasználók "
|
||||
"használhassák akikkel\n"
|
||||
"az meg lett osztva.\n"
|
||||
"\n"
|
||||
"Ez nagyon kihasználható egy közös munkában, ismeret átadásban, másik\n"
|
||||
"vállalat szinkronizációjánál, stb.\n"
|
||||
"\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: field:res.currency,accuracy:0
|
||||
@@ -1703,6 +1828,13 @@ msgid ""
|
||||
" Apply Different Category for the product.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Alap modul az ebédpénz nyilvántartásához\n"
|
||||
"\n"
|
||||
" nyilvántartja az ebéd rendelést, a pénz mozgást, kézi pénztárat, "
|
||||
"terméket.\n"
|
||||
" Különböző kategória alkalmazása a termékhez.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.kg
|
||||
@@ -1773,6 +1905,9 @@ msgid ""
|
||||
"simplified payment mode encoding, automatic picking lists generation and "
|
||||
"more."
|
||||
msgstr ""
|
||||
"Segít Önnek, hogy a legtöbbet hozza ki az értékesítési helyeiből gyors "
|
||||
"értékesítési kódolással, egyszerűsített fizetési mód kódolással, automatikus "
|
||||
"csomaglisták generálásával, stb."
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.mv
|
||||
@@ -1808,27 +1943,28 @@ msgstr "Napok"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_web_rpc
|
||||
msgid "OpenERP Web web"
|
||||
msgstr ""
|
||||
msgstr "OpenERP Web web"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_html_view
|
||||
msgid "Html View"
|
||||
msgstr ""
|
||||
msgstr "Html nézet"
|
||||
|
||||
#. module: base
|
||||
#: field:res.currency,position:0
|
||||
msgid "Symbol position"
|
||||
msgstr ""
|
||||
msgstr "Szinbólum pozíció"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_process
|
||||
msgid "Enterprise Process"
|
||||
msgstr ""
|
||||
msgstr "Vállalati folyamat"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.cron,function:0
|
||||
msgid "Name of the method to be called when this job is processed."
|
||||
msgstr ""
|
||||
"A módszer hivatkozási neve ha ez a munkavégzés végrehajtás alatt van."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_hr_evaluation
|
||||
@@ -1850,7 +1986,7 @@ msgstr " (másolat)"
|
||||
#. module: base
|
||||
#: field:res.company,rml_footer1:0
|
||||
msgid "General Information Footer"
|
||||
msgstr ""
|
||||
msgstr "Általános információ lábjegyzet"
|
||||
|
||||
#. module: base
|
||||
#: view:res.lang:0
|
||||
@@ -1872,7 +2008,7 @@ msgstr "Bal szülő"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_project_mrp
|
||||
msgid "Create Tasks on SO"
|
||||
msgstr ""
|
||||
msgstr "Munka végzés ezen a megrendelésen"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.attachment,res_model:0
|
||||
@@ -1882,7 +2018,7 @@ msgstr "Csatolt modell"
|
||||
#. module: base
|
||||
#: field:res.partner.bank,footer:0
|
||||
msgid "Display on Reports"
|
||||
msgstr ""
|
||||
msgstr "Megjenítés a jelentéseken"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_l10n_cn
|
||||
@@ -1957,7 +2093,7 @@ msgstr "%s (másolat)"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_account_chart
|
||||
msgid "Template of Charts of Accounts"
|
||||
msgstr ""
|
||||
msgstr "Számlatükrők sablonjai"
|
||||
|
||||
#. module: base
|
||||
#: field:res.partner.address,type:0
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 04:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:01+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:01+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:01+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:01+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 04:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:01+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:01+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:02+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
@@ -24,17 +24,17 @@ msgstr "Šv. Elenos sala"
|
||||
#. module: base
|
||||
#: view:ir.actions.report.xml:0
|
||||
msgid "Other Configuration"
|
||||
msgstr ""
|
||||
msgstr "Kiti nustatymai"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.property,type:0
|
||||
msgid "DateTime"
|
||||
msgstr ""
|
||||
msgstr "Data laikas"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_project_mailgate
|
||||
msgid "Tasks-Mail Integration"
|
||||
msgstr ""
|
||||
msgstr "Užduoties-Pašto sujungimas"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/fields.py:582
|
||||
@@ -43,6 +43,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 ""
|
||||
"many2many laukelio %s antrasis argumentas turi SQL lentelė! Naudojamas %s "
|
||||
"nėra SQL lentelės pavadinimas."
|
||||
|
||||
#. module: base
|
||||
#: field:ir.ui.view,arch:0
|
||||
@@ -88,7 +90,7 @@ msgstr "Darbų eiga"
|
||||
#. module: base
|
||||
#: selection:ir.sequence,implementation:0
|
||||
msgid "No gap"
|
||||
msgstr ""
|
||||
msgstr "Be tarpelių"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
@@ -219,7 +221,7 @@ msgstr "Svazilandas"
|
||||
#: code:addons/orm.py:4206
|
||||
#, python-format
|
||||
msgid "created."
|
||||
msgstr ""
|
||||
msgstr "sukurtas."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_tr
|
||||
@@ -963,7 +965,7 @@ msgstr ""
|
||||
#: model:ir.actions.act_window,name:base.act_menu_create
|
||||
#: view:wizard.ir.model.menu.create:0
|
||||
msgid "Create Menu"
|
||||
msgstr ""
|
||||
msgstr "Sukurti meniu"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.in
|
||||
@@ -1473,7 +1475,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: field:workflow,on_create:0
|
||||
msgid "On Create"
|
||||
msgstr ""
|
||||
msgstr "Sukuriant"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/ir/ir_model.py:681
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:02+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:02+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:02+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
@@ -8170,7 +8170,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: field:res.partner,title:0
|
||||
msgid "Partner Firm"
|
||||
msgstr "Түнш Фирм"
|
||||
msgstr "Харилцагчийн хэлбэр"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.actions.act_window,name:base.action_model_fields
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:02+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 04:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:08+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
@@ -3730,7 +3730,7 @@ msgid ""
|
||||
"button \"Install\" from the form view and then click on \"Start Upgrade\"."
|
||||
msgstr ""
|
||||
"U kunt nieuwe modules installeren om nieuwe functies, menu, rapporten of "
|
||||
"gegevens in OpenERP te activeren. Ommodules te installeren, klik op de knop "
|
||||
"gegevens in OpenERP te activeren. Om modules te installeren, klik op de knop "
|
||||
"\"Installeer\" uit de formulierweergave en klik dan op \"Start bijwerken\"."
|
||||
|
||||
#. module: base
|
||||
@@ -11307,6 +11307,14 @@ msgid ""
|
||||
"The wizard to launch the report has several options to help you get the data "
|
||||
"you need.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Deze module voegt een rapportage toe met verkopen, inkopen, marges en andere "
|
||||
"interessante gegevens, gebaseerd op facturen.\n"
|
||||
"============================================================================="
|
||||
"===================\n"
|
||||
"\n"
|
||||
"Bij het starten van het rapport krijgt u een wizard, die u helpt bij het "
|
||||
"kiezen van de juiste gegevens.\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.al
|
||||
@@ -11378,6 +11386,13 @@ msgid ""
|
||||
"Price and Cost Price.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Deze module voegt het veld \"marge\" toe aan de verkooporders.\n"
|
||||
"===================================================\n"
|
||||
"\n"
|
||||
"Het marge veld geeft de winstgevendheid aan door het berekenen van het "
|
||||
"verschil tussen de inkoopwaarde en verkoopwaarde.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:ir.actions.act_window,help:base.action_res_bank_form
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:05+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:02+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
@@ -34,7 +34,7 @@ msgstr "Data i godzina"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_project_mailgate
|
||||
msgid "Tasks-Mail Integration"
|
||||
msgstr ""
|
||||
msgstr "Integracja Mail-Zadania"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/fields.py:582
|
||||
@@ -43,6 +43,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 ""
|
||||
"Drugi argument definicji pola many2many (%s) musi być tabelą SQL! Użyłeś %s, "
|
||||
"to nie jest prawidłowa nazwa tabeli SQL."
|
||||
|
||||
#. module: base
|
||||
#: field:ir.ui.view,arch:0
|
||||
@@ -69,6 +71,21 @@ msgid ""
|
||||
" * Graph of My Remaining Hours by Project\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Moduł zarządzania projektami; pozwala zarządzać wielopoziomowymi projektami, "
|
||||
"zadaniami, wykonaną pracą itp.\n"
|
||||
"============================================================================="
|
||||
"===========\n"
|
||||
"\n"
|
||||
"Może przygotowywać plan, zlecać zadania itp.\n"
|
||||
"\n"
|
||||
"Pulpit dla członków projektów zawierający:\n"
|
||||
"--------------------------------------------\n"
|
||||
" * Listę otwartych zadań\n"
|
||||
" * Listę oddelegowanych zadań\n"
|
||||
" * Wykres projektów: Zaplanowane a Przepracowane Godziny\n"
|
||||
" * Wykres pozostałych godzin, z podziałem na projekty\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: field:base.language.import,code:0
|
||||
@@ -144,6 +161,11 @@ msgid ""
|
||||
"\n"
|
||||
"This module allows you to create retro planning for managing your events.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Organizacja i zarządzanie zdarzeniami\n"
|
||||
"======================================\n"
|
||||
"\n"
|
||||
"Moduł umożliwia planowanie wsteczne zarządzające twoimi wydarzeniami.\n"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.model.fields,domain:0
|
||||
@@ -176,7 +198,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_web_process
|
||||
msgid "Process"
|
||||
msgstr ""
|
||||
msgstr "Proces"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_analytic_journal_billing_rate
|
||||
@@ -201,7 +223,7 @@ msgstr ""
|
||||
#: code:addons/osv.py:129
|
||||
#, python-format
|
||||
msgid "Constraint Error"
|
||||
msgstr ""
|
||||
msgstr "Błąd ograniczeń"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_ir_ui_view_custom
|
||||
|
||||
@@ -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: 2012-10-20 05:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:05+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-26 04:55+0000\n"
|
||||
"X-Generator: Launchpad (build 16194)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:04+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-11-02 05:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16218)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:04+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:04+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:04+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:04+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:14+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:04+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:14+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:05+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:14+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:05+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:14+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-20 05:05+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -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: 2012-10-20 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16165)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-13 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -250,16 +250,6 @@ class res_users(osv.osv):
|
||||
'image': lambda self, cr, uid, ctx={}: self.pool.get('res.partner')._get_default_image(cr, uid, False, ctx, colorize=True),
|
||||
}
|
||||
|
||||
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
|
||||
""" Override of res.users fields_view_get.
|
||||
- if the view is specified: resume with normal behavior
|
||||
- else: the default view is overrided and redirected to the partner
|
||||
view
|
||||
"""
|
||||
if not view_id and view_type == 'form':
|
||||
return self.pool.get('res.partner').fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu)
|
||||
return super(res_users, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu)
|
||||
|
||||
# User can write on a few of his own fields (but not his groups for example)
|
||||
SELF_WRITEABLE_FIELDS = ['password', 'signature', 'action_id', 'company_id', 'email', 'name', 'image', 'image_medium', 'image_small', 'lang', 'tz']
|
||||
# User can read a few of his own fields
|
||||
|
||||
@@ -83,6 +83,49 @@
|
||||
|
||||
|
||||
<!-- res.users -->
|
||||
<record id="view_users_simple_form" model="ir.ui.view">
|
||||
<field name="name">res.users.simplified.form</field>
|
||||
<field name="model">res.users</field>
|
||||
<field name="priority">1</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Contact" version="7.0">
|
||||
<sheet>
|
||||
<field name="image" widget='image' class="oe_left oe_avatar" options='{"preview_image": "image_medium", "size": [90, 90]}'/>
|
||||
<div class="oe_title">
|
||||
<div class="oe_edit_only">
|
||||
<label for="name"/> (
|
||||
</div>
|
||||
<h1>
|
||||
<field name="name" default_focus="1" placeholder="Name" />
|
||||
</h1>
|
||||
<field name="category_id" widget="many2many_tags" placeholder="Tags..."/>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<label for="street" string="Address"/>
|
||||
<div>
|
||||
<field name="street" placeholder="Street..."/>
|
||||
<field name="street2"/>
|
||||
<div class="address_format">
|
||||
<field name="city" placeholder="City" style="width: 40%%"/>
|
||||
<field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": True}' on_change="onchange_state(state_id)"/>
|
||||
<field name="zip" placeholder="ZIP" style="width: 20%%"/>
|
||||
</div>
|
||||
<field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}'/>
|
||||
</div>
|
||||
<field name="website" widget="url" placeholder="e.g. www.openerp.com"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="phone" placeholder="e.g. +32.81.81.37.00"/>
|
||||
<field name="mobile"/>
|
||||
<field name="fax"/>
|
||||
<field name="email" widget="email"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_users_form" model="ir.ui.view">
|
||||
<field name="name">res.users.form</field>
|
||||
<field name="model">res.users</field>
|
||||
|
||||
@@ -112,6 +112,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
|
||||
if kind in ('demo', 'demo_xml'):
|
||||
noupdate = True
|
||||
try:
|
||||
ext = ext.lower()
|
||||
if ext == '.csv':
|
||||
if kind in ('init', 'init_xml'):
|
||||
noupdate = True
|
||||
@@ -120,8 +121,12 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
|
||||
process_sql_file(cr, fp)
|
||||
elif ext == '.yml':
|
||||
tools.convert_yaml_import(cr, module_name, fp, kind, idref, mode, noupdate, report)
|
||||
else:
|
||||
elif ext == '.xml':
|
||||
tools.convert_xml_import(cr, module_name, fp, idref, mode, noupdate, report)
|
||||
elif ext == '.js':
|
||||
pass # .js files are valid but ignored here.
|
||||
else:
|
||||
_logger.warning("Can't load unknown file type %s.", filename)
|
||||
finally:
|
||||
fp.close()
|
||||
|
||||
|
||||
@@ -28,15 +28,9 @@ import sys
|
||||
import types
|
||||
import zipimport
|
||||
|
||||
import openerp
|
||||
|
||||
import openerp.osv as osv
|
||||
import openerp.tools as tools
|
||||
import openerp.tools.osutil as osutil
|
||||
from openerp.tools.safe_eval import safe_eval as eval
|
||||
from openerp.tools.translate import _
|
||||
|
||||
import openerp.netsvc as netsvc
|
||||
|
||||
import zipfile
|
||||
import openerp.release as release
|
||||
@@ -48,9 +42,6 @@ from cStringIO import StringIO
|
||||
|
||||
import logging
|
||||
|
||||
import openerp.modules.db
|
||||
import openerp.modules.graph
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
_ad = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'addons') # default addons path (base)
|
||||
@@ -335,7 +326,6 @@ def load_information_from_description_file(module):
|
||||
'description': '',
|
||||
'icon': get_module_icon(module),
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
'license': 'AGPL-3',
|
||||
'name': False,
|
||||
'post_load': None,
|
||||
|
||||
@@ -44,8 +44,8 @@ import openerp
|
||||
import openerp.tools as tools
|
||||
from openerp.tools.translate import _
|
||||
from openerp.tools import float_round, float_repr
|
||||
from openerp.tools import html_sanitize
|
||||
import simplejson
|
||||
from openerp.tools.html_sanitize import html_sanitize
|
||||
from openerp import SUPERUSER_ID
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -3807,6 +3807,8 @@ class BaseModel(object):
|
||||
cr.execute('SELECT id FROM ' + self._table + ' WHERE id IN %s', (tuple(missing_ids),))
|
||||
if cr.rowcount:
|
||||
# the missing ids are (at least partially) hidden by access rules
|
||||
if uid == SUPERUSER_ID:
|
||||
return
|
||||
_logger.warning('Access Denied by record rules for operation: %s, uid: %s, model: %s', operation, uid, self._name)
|
||||
raise except_orm(_('Access Denied'),
|
||||
_('The requested operation cannot be completed due to security restrictions. Please contact your system administrator.\n\n(Document type: %s, Operation: %s)') % \
|
||||
|
||||
@@ -103,7 +103,7 @@ class db(netsvc.ExportService):
|
||||
if method in [ 'create', 'get_progress', 'drop', 'dump',
|
||||
'restore', 'rename',
|
||||
'change_admin_password', 'migrate_databases',
|
||||
'create_database' ]:
|
||||
'create_database', 'duplicate_database' ]:
|
||||
passwd = params[0]
|
||||
params = params[1:]
|
||||
security.check_super(passwd)
|
||||
@@ -158,11 +158,22 @@ class db(netsvc.ExportService):
|
||||
|
||||
self.actions[id] = {'clean': False}
|
||||
|
||||
_logger.info('CREATE DATABASE %s', db_name.lower())
|
||||
_logger.info('Create database `%s`.', db_name)
|
||||
self._create_empty_database(db_name)
|
||||
_initialize_db(self, id, db_name, demo, lang, user_password)
|
||||
return True
|
||||
|
||||
def exp_duplicate_database(self, db_original_name, db_name):
|
||||
_logger.info('Duplicate database `%s` to `%s`.', db_original_name, db_name)
|
||||
db = sql_db.db_connect('postgres')
|
||||
cr = db.cursor()
|
||||
try:
|
||||
cr.autocommit(True) # avoid transaction block
|
||||
cr.execute("""CREATE DATABASE "%s" ENCODING 'unicode' TEMPLATE "%s" """ % (db_name, db_original_name))
|
||||
finally:
|
||||
cr.close()
|
||||
return True
|
||||
|
||||
def exp_get_progress(self, id):
|
||||
if self.actions[id]['thread'].isAlive():
|
||||
# return openerp.modules.init_progress[db_name]
|
||||
|
||||
@@ -8,7 +8,7 @@ Tests can be explicitely added to the `fast_suite` or `checks` lists or not.
|
||||
See the :ref:`test-framework` section in the :ref:`features` list.
|
||||
"""
|
||||
|
||||
from . import test_expression, test_html_sanitize, test_ir_sequence, test_orm,\
|
||||
from . import test_expression, test_mail, test_ir_sequence, test_orm,\
|
||||
test_fields, test_basecase, \
|
||||
test_view_validation, test_uninstall, test_misc, test_db_cursor
|
||||
from . import test_ir_filters
|
||||
@@ -20,7 +20,7 @@ fast_suite = [
|
||||
|
||||
checks = [
|
||||
test_expression,
|
||||
test_html_sanitize,
|
||||
test_mail,
|
||||
test_db_cursor,
|
||||
test_orm,
|
||||
test_fields,
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
import unittest
|
||||
from openerp.tools.html_sanitize import html_sanitize
|
||||
|
||||
test_case = """
|
||||
<font size="2" style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; ">test1</font>
|
||||
<div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; font-style: normal; ">
|
||||
<b>test2</b></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; ">
|
||||
<i>test3</i></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; ">
|
||||
<u>test4</u></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; ">
|
||||
<strike>test5</strike></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; ">
|
||||
<font size="5">test6</font></div><div><ul><li><font color="#1f1f1f" face="monospace" size="2">test7</font></li><li>
|
||||
<font color="#1f1f1f" face="monospace" size="2">test8</font></li></ul><div><ol><li><font color="#1f1f1f" face="monospace" size="2">test9</font>
|
||||
</li><li><font color="#1f1f1f" face="monospace" size="2">test10</font></li></ol></div></div>
|
||||
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div><div><font color="#1f1f1f" face="monospace" size="2">
|
||||
test11</font></div></div></div></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;">
|
||||
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><font color="#1f1f1f" face="monospace" size="2">
|
||||
test12</font></div><div><font color="#1f1f1f" face="monospace" size="2"><br></font></div></blockquote></blockquote>
|
||||
<font color="#1f1f1f" face="monospace" size="2"><a href="http://google.com">google</a></font>
|
||||
<a href="javascript:alert('malicious code')">test link</a>
|
||||
"""
|
||||
|
||||
class TestSanitizer(unittest.TestCase):
|
||||
|
||||
def test_simple(self):
|
||||
x = "yop"
|
||||
self.assertEqual(x, html_sanitize(x))
|
||||
|
||||
def test_trailing_text(self):
|
||||
x = 'lala<p>yop</p>xxx'
|
||||
self.assertEqual(x, html_sanitize(x))
|
||||
|
||||
def test_no_exception(self):
|
||||
html_sanitize(test_case)
|
||||
|
||||
def test_unicode(self):
|
||||
html_sanitize("Merci à l'intérêt pour notre produit.nous vous contacterons bientôt. Merci")
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
@@ -0,0 +1,205 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
# This test can be run stand-alone with something like:
|
||||
# > PYTHONPATH=. python2 openerp/tests/test_misc.py
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Business Applications
|
||||
# Copyright (c) 2012-TODAY OpenERP S.A. <http://openerp.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import unittest2
|
||||
from openerp.tools import html_sanitize, html_email_clean, append_content_to_html, plaintext2html
|
||||
|
||||
HTML_SOURCE = """
|
||||
<font size="2" style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; ">test1</font>
|
||||
<div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; font-style: normal; ">
|
||||
<b>test2</b></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; ">
|
||||
<i>test3</i></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; ">
|
||||
<u>test4</u></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; ">
|
||||
<strike>test5</strike></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; ">
|
||||
<font size="5">test6</font></div><div><ul><li><font color="#1f1f1f" face="monospace" size="2">test7</font></li><li>
|
||||
<font color="#1f1f1f" face="monospace" size="2">test8</font></li></ul><div><ol><li><font color="#1f1f1f" face="monospace" size="2">test9</font>
|
||||
</li><li><font color="#1f1f1f" face="monospace" size="2">test10</font></li></ol></div></div>
|
||||
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div><div><font color="#1f1f1f" face="monospace" size="2">
|
||||
test11</font></div></div></div></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;">
|
||||
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><font color="#1f1f1f" face="monospace" size="2">
|
||||
test12</font></div><div><font color="#1f1f1f" face="monospace" size="2"><br></font></div></blockquote></blockquote>
|
||||
<font color="#1f1f1f" face="monospace" size="2"><a href="http://google.com">google</a></font>
|
||||
<a href="javascript:alert('malicious code')">test link</a>
|
||||
"""
|
||||
|
||||
TEXT_MAIL1 = """I contact you about our meeting for tomorrow. Here is the schedule I propose:
|
||||
9 AM: brainstorming about our new amazing business app</span></li>
|
||||
9.45 AM: summary
|
||||
10 AM: meeting with Fabien to present our app
|
||||
Is everything ok for you ?
|
||||
--
|
||||
Administrator"""
|
||||
|
||||
HTML_MAIL1 = """<div>
|
||||
<font><span>I contact you about our meeting for tomorrow. Here is the schedule I propose:</span></font>
|
||||
</div>
|
||||
<div><ul>
|
||||
<li><span>9 AM: brainstorming about our new amazing business app</span></li>
|
||||
<li><span>9.45 AM: summary</span></li>
|
||||
<li><span>10 AM: meeting with Fabien to present our app</span></li>
|
||||
</ul></div>
|
||||
<div><font><span>Is everything ok for you ?</span></font></div>"""
|
||||
|
||||
GMAIL_REPLY1_SAN = """Hello,<div><br></div><div>Ok for me. I am replying directly in gmail, without signature.</div><div><br></div><div>Kind regards,</div><div><br></div><div>Demo.<br><br><div>On Thu, Nov 8, 2012 at 5:29 PM, <span><<a href="mailto:dummy@example.com">dummy@example.com</a>></span> wrote:<br><blockquote><div>I contact you about our meeting for tomorrow. Here is the schedule I propose:</div><div><ul><li>9 AM: brainstorming about our new amazing business app</span></li></li>
|
||||
<li>9.45 AM: summary</li><li>10 AM: meeting with Fabien to present our app</li></ul></div><div>Is everything ok for you ?</div>
|
||||
<div><p>--<br>Administrator</p></div>
|
||||
|
||||
<div><p>Log in our portal at: <a href="http://localhost:8069#action=login&db=mail_1&login=demo">http://localhost:8069#action=login&db=mail_1&login=demo</a></p></div>
|
||||
</blockquote></div><br></div>"""
|
||||
|
||||
THUNDERBIRD_16_REPLY1_SAN = """ <div>On 11/08/2012 05:29 PM,
|
||||
<a href="mailto:dummy@example.com">dummy@example.com</a> wrote:<br></div>
|
||||
<blockquote>
|
||||
<div>I contact you about our meeting for tomorrow. Here is the
|
||||
schedule I propose:</div>
|
||||
<div>
|
||||
<ul><li>9 AM: brainstorming about our new amazing business
|
||||
app</span></li></li>
|
||||
<li>9.45 AM: summary</li>
|
||||
<li>10 AM: meeting with Fabien to present our app</li>
|
||||
</ul></div>
|
||||
<div>Is everything ok for you ?</div>
|
||||
<div>
|
||||
<p>--<br>
|
||||
Administrator</p>
|
||||
</div>
|
||||
<div>
|
||||
<p>Log in our portal at:
|
||||
<a href="http://localhost:8069#action=login&db=mail_1&token=rHdWcUART5PhEnJRaXjH">http://localhost:8069#action=login&db=mail_1&token=rHdWcUART5PhEnJRaXjH</a></p>
|
||||
</div>
|
||||
</blockquote>
|
||||
Ok for me. I am replying directly below your mail, using
|
||||
Thunderbird, with a signature.<br><br>
|
||||
Did you receive my email about my new laptop, by the way ?<br><br>
|
||||
Raoul.<br><pre>--
|
||||
Raoul Grosbedonnée
|
||||
</pre>"""
|
||||
|
||||
TEXT_TPL = """Salut Raoul!
|
||||
Le 28 oct. 2012 à 00:02, Raoul Grosbedon a écrit :
|
||||
|
||||
> C'est sûr que je suis intéressé (quote)!
|
||||
|
||||
Trouloulou pouet pouet. Je ne vais quand même pas écrire de vrais mails, non mais ho.
|
||||
|
||||
> 2012/10/27 Bert Tartopoils :
|
||||
>> Diantre, me disè-je en envoyant un message similaire à Martine, mais comment vas-tu (quote)?
|
||||
>>
|
||||
>> A la base le contenu était un vrai mail, mais je l'ai quand même réécrit pour ce test, histoire de dire que, quand même, on ne met pas n'importe quoi ici. (quote)
|
||||
>>
|
||||
>> Et sinon bon courage pour trouver tes clefs (quote).
|
||||
>>
|
||||
>> Bert TARTOPOILS
|
||||
>> bert.tartopoils@miam.miam
|
||||
>>
|
||||
>
|
||||
>
|
||||
> --
|
||||
> Raoul Grosbedon
|
||||
|
||||
Bert TARTOPOILS
|
||||
bert.tartopoils@miam.miam
|
||||
"""
|
||||
|
||||
|
||||
class TestSanitizer(unittest2.TestCase):
|
||||
""" Test the html sanitizer that filters html to remove unwanted attributes """
|
||||
|
||||
def test_simple(self):
|
||||
x = "yop"
|
||||
self.assertEqual(x, html_sanitize(x))
|
||||
|
||||
def test_trailing_text(self):
|
||||
x = 'lala<p>yop</p>xxx'
|
||||
self.assertEqual(x, html_sanitize(x))
|
||||
|
||||
def test_html(self):
|
||||
sanitized_html = html_sanitize(HTML_SOURCE)
|
||||
for tag in ['<font>', '<div>', '<b>', '<i>', '<u>', '<strike>', '<li>', '<blockquote>', '<a href']:
|
||||
self.assertIn(tag, sanitized_html, 'html_sanitize stripped too much of original html')
|
||||
for attr in ['style', 'javascript']:
|
||||
self.assertNotIn(attr, sanitized_html, 'html_sanitize did not remove enough unwanted attributes')
|
||||
|
||||
def test_unicode(self):
|
||||
html_sanitize("Merci à l'intérêt pour notre produit.nous vous contacterons bientôt. Merci")
|
||||
|
||||
|
||||
class TestCleaner(unittest2.TestCase):
|
||||
""" Test the email cleaner function that filters the content of incoming emails """
|
||||
|
||||
def test_html_email_clean(self):
|
||||
# Test1: reply through gmail: quote in blockquote, signature --\nAdministrator
|
||||
new_html = html_email_clean(GMAIL_REPLY1_SAN)
|
||||
self.assertNotIn('blockquote', new_html, 'html_email_cleaner did not remove a blockquote')
|
||||
self.assertNotIn('I contact you about our meeting', new_html, 'html_email_cleaner wrongly removed the quoted content')
|
||||
self.assertNotIn('Administrator', new_html, 'html_email_cleaner did not erase the signature')
|
||||
self.assertIn('Ok for me', new_html, 'html_email_cleaner erased too much content')
|
||||
|
||||
# Test2: reply through Tunderbird 16.0.2
|
||||
new_html = html_email_clean(THUNDERBIRD_16_REPLY1_SAN)
|
||||
self.assertNotIn('blockquote', new_html, 'html_email_cleaner did not remove a blockquote')
|
||||
self.assertNotIn('I contact you about our meeting', new_html, 'html_email_cleaner wrongly removed the quoted content')
|
||||
self.assertNotIn('Administrator', new_html, 'html_email_cleaner did not erase the signature')
|
||||
self.assertNotIn('Grosbedonn', new_html, 'html_email_cleaner did not erase the signature')
|
||||
self.assertIn('Ok for me', new_html, 'html_email_cleaner erased too much content')
|
||||
|
||||
# Test3: text email
|
||||
new_html = html_email_clean(TEXT_MAIL1)
|
||||
self.assertIn('I contact you about our meeting', new_html, 'html_email_cleaner wrongly removed the quoted content')
|
||||
self.assertNotIn('Administrator', new_html, 'html_email_cleaner did not erase the signature')
|
||||
|
||||
# Test4: more complex text email
|
||||
new_html = html_email_clean(TEXT_TPL)
|
||||
self.assertNotIn('quote', new_html, 'html_email_cleaner did not remove correctly plaintext quotes')
|
||||
|
||||
|
||||
class TestHtmlTools(unittest2.TestCase):
|
||||
""" Test some of our generic utility functions about html """
|
||||
|
||||
def test_plaintext2html(self):
|
||||
cases = [
|
||||
("First \nSecond \nThird\n \nParagraph\n\r--\nSignature paragraph", 'div',
|
||||
"<div><p>First <br/>Second <br/>Third</p><p>Paragraph</p><p>--<br/>Signature paragraph</p></div>"),
|
||||
("First<p>It should be escaped</p>\nSignature", False,
|
||||
"<p>First<p>It should be escaped</p><br/>Signature</p>")
|
||||
]
|
||||
for content, container_tag, expected in cases:
|
||||
html = plaintext2html(content, container_tag)
|
||||
self.assertEqual(html, expected, 'plaintext2html is broken')
|
||||
|
||||
def test_append_to_html(self):
|
||||
test_samples = [
|
||||
('<!DOCTYPE...><HTML encoding="blah">some <b>content</b></HtMl>', '--\nYours truly', True, True, False,
|
||||
'<!DOCTYPE...><html encoding="blah">some <b>content</b>\n<pre>--\nYours truly</pre>\n</html>'),
|
||||
('<!DOCTYPE...><HTML encoding="blah">some <b>content</b></HtMl>', '--\nYours truly', True, False, False,
|
||||
'<!DOCTYPE...><html encoding="blah">some <b>content</b>\n<p>--<br/>Yours truly</p>\n</html>'),
|
||||
('<html><body>some <b>content</b></body></html>', '<!DOCTYPE...>\n<html><body>\n<p>--</p>\n<p>Yours truly</p>\n</body>\n</html>', False, False, False,
|
||||
'<html><body>some <b>content</b>\n\n\n<p>--</p>\n<p>Yours truly</p>\n\n\n</body></html>'),
|
||||
]
|
||||
for html, content, plaintext_flag, preserve_flag, container_tag, expected in test_samples:
|
||||
self.assertEqual(append_content_to_html(html, content, plaintext_flag, preserve_flag, container_tag), expected, 'append_content_to_html is broken')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest2.main()
|
||||
@@ -4,18 +4,6 @@
|
||||
import unittest2
|
||||
from ..tools import misc
|
||||
|
||||
class append_content_to_html(unittest2.TestCase):
|
||||
""" Test some of our generic utility functions """
|
||||
|
||||
def test_append_to_html(self):
|
||||
test_samples = [
|
||||
('<!DOCTYPE...><HTML encoding="blah">some <b>content</b></HtMl>', '--\nYours truly', True,
|
||||
'<!DOCTYPE...><html encoding="blah">some <b>content</b>\n<pre>--\nYours truly</pre>\n</html>'),
|
||||
('<html><body>some <b>content</b></body></html>', '<!DOCTYPE...>\n<html><body>\n<p>--</p>\n<p>Yours truly</p>\n</body>\n</html>', False,
|
||||
'<html><body>some <b>content</b>\n\n\n<p>--</p>\n<p>Yours truly</p>\n\n\n</body></html>'),
|
||||
]
|
||||
for html, content, flag, expected in test_samples:
|
||||
self.assertEqual(misc.append_content_to_html(html,content,flag), expected, 'append_content_to_html is broken')
|
||||
|
||||
class test_countingstream(unittest2.TestCase):
|
||||
def test_empty_stream(self):
|
||||
|
||||
@@ -33,7 +33,7 @@ from pdf_utils import *
|
||||
from yaml_import import *
|
||||
from sql import *
|
||||
from float_utils import *
|
||||
from html_sanitize import *
|
||||
from mail import *
|
||||
|
||||
#.apidoc title: Tools
|
||||
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Business Applications
|
||||
# Copyright (C) 2012 OpenERP S.A. (<http://openerp.com>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import lxml.html
|
||||
import operator
|
||||
import re
|
||||
|
||||
from openerp.loglevels import ustr
|
||||
|
||||
def html_sanitize(src):
|
||||
if not src:
|
||||
return src
|
||||
src = ustr(src, errors='replace')
|
||||
root = lxml.html.fromstring(u"<div>%s</div>" % src)
|
||||
result = handle_element(root)
|
||||
res = []
|
||||
for element in children(result[0]):
|
||||
if isinstance(element, basestring):
|
||||
res.append(element)
|
||||
else:
|
||||
element.tail = ""
|
||||
res.append(lxml.html.tostring(element))
|
||||
return ''.join(res)
|
||||
|
||||
# FIXME: shouldn't this be a whitelist rather than a blacklist?!
|
||||
to_remove = set(["script", "head", "meta", "title", "link", "img"])
|
||||
to_unwrap = set(["html", "body"])
|
||||
|
||||
javascript_regex = re.compile(r"^\s*javascript\s*:.*$", re.IGNORECASE)
|
||||
|
||||
def handle_a(el, new):
|
||||
href = el.get("href", "#")
|
||||
if javascript_regex.search(href):
|
||||
href = "#"
|
||||
new.set("href", href)
|
||||
|
||||
special = {
|
||||
"a": handle_a,
|
||||
}
|
||||
|
||||
def handle_element(element):
|
||||
if isinstance(element, basestring):
|
||||
return [element]
|
||||
if element.tag in to_remove:
|
||||
return []
|
||||
if element.tag in to_unwrap:
|
||||
return reduce(operator.add, [handle_element(x) for x in children(element)])
|
||||
result = lxml.html.fromstring("<%s />" % element.tag)
|
||||
for c in children(element):
|
||||
append_to(handle_element(c), result)
|
||||
if element.tag in special:
|
||||
special[element.tag](element, result)
|
||||
return [result]
|
||||
|
||||
def children(node):
|
||||
res = []
|
||||
if node.text is not None:
|
||||
res.append(node.text)
|
||||
for child_node in node.getchildren():
|
||||
res.append(child_node)
|
||||
if child_node.tail is not None:
|
||||
res.append(child_node.tail)
|
||||
return res
|
||||
|
||||
def append_to(elements, dest_node):
|
||||
for element in elements:
|
||||
if isinstance(element, basestring):
|
||||
children = dest_node.getchildren()
|
||||
if len(children) == 0:
|
||||
dest_node.text = element
|
||||
else:
|
||||
children[-1].tail = element
|
||||
else:
|
||||
dest_node.append(element)
|
||||
+10
-14
@@ -20,11 +20,10 @@
|
||||
##############################################################################
|
||||
|
||||
import io
|
||||
import sys
|
||||
import StringIO
|
||||
|
||||
from PIL import Image
|
||||
from PIL import ImageFilter
|
||||
from PIL import ImageEnhance
|
||||
from random import random
|
||||
|
||||
# ----------------------------------------
|
||||
@@ -67,18 +66,15 @@ def image_resize_image(base64_source, size=(1024, 1024), encoding='base64', file
|
||||
# check image size: do not create a thumbnail if avoiding smaller images
|
||||
if avoid_if_small and image.size[0] <= size[0] and image.size[1] <= size[1]:
|
||||
return base64_source
|
||||
|
||||
if (float(image.size[0])/image.size[1]) > (float(size[0]) / size[1]):
|
||||
ibox = (size[1] * image.size[0] / image.size[1] , size[1])
|
||||
deltax = max((size[1] * image.size[0] / image.size[1] - size[0]) / 2, 0)
|
||||
deltay = 0
|
||||
else:
|
||||
ibox = (size[0],size[0] * image.size[1] / image.size[0])
|
||||
deltax = 0
|
||||
deltay = max((size[0] * image.size[1] / image.size[0] - size[1]) / 2, 0)
|
||||
|
||||
im2 = image.resize(ibox, Image.ANTIALIAS)
|
||||
background = im2.crop((deltax, deltay, deltax+size[0], deltay+size[1]))
|
||||
# create a thumbnail: will resize and keep ratios, then sharpen for better looking result
|
||||
image.thumbnail(size, Image.ANTIALIAS)
|
||||
sharpener = ImageEnhance.Sharpness(image.convert('RGB'))
|
||||
image = sharpener.enhance(2.0)
|
||||
# create a transparent image for background
|
||||
background = Image.new('RGBA', size, (255, 255, 255, 0))
|
||||
# past the resized image on the background
|
||||
background.paste(image, ((size[0] - image.size[0]) / 2, (size[1] - image.size[1]) / 2))
|
||||
# return an encoded image
|
||||
background_stream = StringIO.StringIO()
|
||||
background.save(background_stream, filetype)
|
||||
return background_stream.getvalue().encode(encoding)
|
||||
|
||||
@@ -0,0 +1,387 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Business Applications
|
||||
# Copyright (C) 2012 OpenERP S.A. (<http://openerp.com>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from lxml import etree
|
||||
import cgi
|
||||
import logging
|
||||
import lxml.html
|
||||
import openerp.pooler as pooler
|
||||
import operator
|
||||
import random
|
||||
import re
|
||||
import socket
|
||||
import threading
|
||||
import time
|
||||
|
||||
from openerp.loglevels import ustr
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
#----------------------------------------------------------
|
||||
# HTML Sanitizer
|
||||
#----------------------------------------------------------
|
||||
|
||||
def html_sanitize(src):
|
||||
if not src:
|
||||
return src
|
||||
src = ustr(src, errors='replace')
|
||||
root = lxml.html.fromstring(u"<div>%s</div>" % src)
|
||||
result = handle_element(root)
|
||||
res = []
|
||||
for element in children(result[0]):
|
||||
if isinstance(element, basestring):
|
||||
res.append(element)
|
||||
else:
|
||||
element.tail = ""
|
||||
res.append(lxml.html.tostring(element))
|
||||
return ''.join(res)
|
||||
|
||||
# FIXME: shouldn't this be a whitelist rather than a blacklist?!
|
||||
to_remove = set(["script", "head", "meta", "title", "link", "img"])
|
||||
to_unwrap = set(["html", "body"])
|
||||
|
||||
javascript_regex = re.compile(r"^\s*javascript\s*:.*$", re.IGNORECASE)
|
||||
|
||||
def handle_a(el, new):
|
||||
href = el.get("href", "#")
|
||||
if javascript_regex.search(href):
|
||||
href = "#"
|
||||
new.set("href", href)
|
||||
|
||||
special = {
|
||||
"a": handle_a,
|
||||
}
|
||||
|
||||
def handle_element(element):
|
||||
if isinstance(element, basestring):
|
||||
return [element]
|
||||
if element.tag in to_remove:
|
||||
return []
|
||||
if element.tag in to_unwrap:
|
||||
return reduce(operator.add, [handle_element(x) for x in children(element)])
|
||||
result = lxml.html.fromstring("<%s />" % element.tag)
|
||||
for c in children(element):
|
||||
append_to(handle_element(c), result)
|
||||
if element.tag in special:
|
||||
special[element.tag](element, result)
|
||||
return [result]
|
||||
|
||||
def children(node):
|
||||
res = []
|
||||
if node.text is not None:
|
||||
res.append(node.text)
|
||||
for child_node in node.getchildren():
|
||||
res.append(child_node)
|
||||
if child_node.tail is not None:
|
||||
res.append(child_node.tail)
|
||||
return res
|
||||
|
||||
def append_to(elements, dest_node):
|
||||
for element in elements:
|
||||
if isinstance(element, basestring):
|
||||
children = dest_node.getchildren()
|
||||
if len(children) == 0:
|
||||
dest_node.text = element
|
||||
else:
|
||||
children[-1].tail = element
|
||||
else:
|
||||
dest_node.append(element)
|
||||
|
||||
|
||||
#----------------------------------------------------------
|
||||
# HTML Cleaner
|
||||
#----------------------------------------------------------
|
||||
|
||||
def html_email_clean(html):
|
||||
""" html_email_clean: clean the html to display in the web client.
|
||||
- strip email quotes (remove blockquote nodes)
|
||||
- strip signatures (remove --\n{\n)Blahblah), by replacing <br> by
|
||||
\n to avoid ignoring signatures converted into html
|
||||
|
||||
:param string html: sanitized html; tags like html or head should not
|
||||
be present in the html string. This method therefore takes as input
|
||||
html code coming from a sanitized source, like fields.html.
|
||||
"""
|
||||
def _replace_matching_regex(regex, source, replace=''):
|
||||
dest = ''
|
||||
idx = 0
|
||||
for item in re.finditer(regex, source):
|
||||
dest += source[idx:item.start()] + replace
|
||||
idx = item.end()
|
||||
dest += source[idx:]
|
||||
return dest
|
||||
|
||||
html = ustr(html)
|
||||
|
||||
# 1. <br[ /]> -> \n, because otherwise the tree is obfuscated
|
||||
br_tags = re.compile(r'([<]\s*[bB][rR]\s*\/?[>])')
|
||||
html = _replace_matching_regex(br_tags, html, '__BR_TAG__')
|
||||
|
||||
# 2. form a tree, handle (currently ?) pure-text by enclosing them in a pre
|
||||
root = lxml.html.fromstring(html)
|
||||
if not len(root) and root.text is None and root.tail is None:
|
||||
html = '<div>%s</div>' % html
|
||||
root = lxml.html.fromstring(html)
|
||||
|
||||
# 2.5 remove quoted text in nodes
|
||||
quote_tags = re.compile(r'(\n(>)+[^\n\r]*)')
|
||||
for node in root.getiterator():
|
||||
if not node.text:
|
||||
continue
|
||||
node.text = _replace_matching_regex(quote_tags, node.text)
|
||||
|
||||
# 3. remove blockquotes
|
||||
quotes = [el for el in root.getiterator(tag='blockquote')]
|
||||
for node in quotes:
|
||||
# copy the node tail into parent text
|
||||
if node.tail:
|
||||
parent = node.getparent()
|
||||
parent.text = parent.text or '' + node.tail
|
||||
# remove the node
|
||||
node.getparent().remove(node)
|
||||
|
||||
# 4. strip signatures
|
||||
signature = re.compile(r'([-]{2}[\s]?[\r\n]{1,2}[^\z]+)')
|
||||
for elem in root.getiterator():
|
||||
if elem.text:
|
||||
match = re.search(signature, elem.text)
|
||||
if match:
|
||||
elem.text = elem.text[:match.start()] + elem.text[match.end():]
|
||||
if elem.tail:
|
||||
match = re.search(signature, elem.tail)
|
||||
if match:
|
||||
elem.tail = elem.tail[:match.start()] + elem.tail[match.end():]
|
||||
|
||||
# 5. \n back to <br/>
|
||||
html = etree.tostring(root, pretty_print=True)
|
||||
html = html.replace('__BR_TAG__', '<br />')
|
||||
|
||||
# 6. Misc cleaning :
|
||||
# - ClEditor seems to love using <div><br /><div> -> replace with <br />
|
||||
br_div_tags = re.compile(r'(<div>\s*<br\s*\/>\s*<\/div>)')
|
||||
html = _replace_matching_regex(br_div_tags, html, '<br />')
|
||||
|
||||
return html
|
||||
|
||||
|
||||
#----------------------------------------------------------
|
||||
# HTML/Text management
|
||||
#----------------------------------------------------------
|
||||
|
||||
def html2plaintext(html, body_id=None, encoding='utf-8'):
|
||||
""" From an HTML text, convert the HTML to plain text.
|
||||
If @param body_id is provided then this is the tag where the
|
||||
body (not necessarily <body>) starts.
|
||||
"""
|
||||
## (c) Fry-IT, www.fry-it.com, 2007
|
||||
## <peter@fry-it.com>
|
||||
## download here: http://www.peterbe.com/plog/html2plaintext
|
||||
|
||||
html = ustr(html)
|
||||
tree = etree.fromstring(html, parser=etree.HTMLParser())
|
||||
|
||||
if body_id is not None:
|
||||
source = tree.xpath('//*[@id=%s]' % (body_id,))
|
||||
else:
|
||||
source = tree.xpath('//body')
|
||||
if len(source):
|
||||
tree = source[0]
|
||||
|
||||
url_index = []
|
||||
i = 0
|
||||
for link in tree.findall('.//a'):
|
||||
url = link.get('href')
|
||||
if url:
|
||||
i += 1
|
||||
link.tag = 'span'
|
||||
link.text = '%s [%s]' % (link.text, i)
|
||||
url_index.append(url)
|
||||
|
||||
html = ustr(etree.tostring(tree, encoding=encoding))
|
||||
|
||||
html = html.replace('<strong>', '*').replace('</strong>', '*')
|
||||
html = html.replace('<b>', '*').replace('</b>', '*')
|
||||
html = html.replace('<h3>', '*').replace('</h3>', '*')
|
||||
html = html.replace('<h2>', '**').replace('</h2>', '**')
|
||||
html = html.replace('<h1>', '**').replace('</h1>', '**')
|
||||
html = html.replace('<em>', '/').replace('</em>', '/')
|
||||
html = html.replace('<tr>', '\n')
|
||||
html = html.replace('</p>', '\n')
|
||||
html = re.sub('<br\s*/?>', '\n', html)
|
||||
html = re.sub('<.*?>', ' ', html)
|
||||
html = html.replace(' ' * 2, ' ')
|
||||
|
||||
# strip all lines
|
||||
html = '\n'.join([x.strip() for x in html.splitlines()])
|
||||
html = html.replace('\n' * 2, '\n')
|
||||
|
||||
for i, url in enumerate(url_index):
|
||||
if i == 0:
|
||||
html += '\n\n'
|
||||
html += ustr('[%s] %s\n') % (i + 1, url)
|
||||
|
||||
return html
|
||||
|
||||
def plaintext2html(text, container_tag=False):
|
||||
""" Convert plaintext into html. Content of the text is escaped to manage
|
||||
html entities, using cgi.escape().
|
||||
- all \n,\r are replaced by <br />
|
||||
- enclose content into <p>
|
||||
- 2 or more consecutive <br /> are considered as paragraph breaks
|
||||
|
||||
:param string container_tag: container of the html; by default the
|
||||
content is embedded into a <div>
|
||||
"""
|
||||
text = cgi.escape(ustr(text))
|
||||
|
||||
# 1. replace \n and \r
|
||||
text = text.replace('\n', '<br/>')
|
||||
text = text.replace('\r', '<br/>')
|
||||
|
||||
# 2-3: form paragraphs
|
||||
idx = 0
|
||||
final = '<p>'
|
||||
br_tags = re.compile(r'(([<]\s*[bB][rR]\s*\/?[>]\s*){2,})')
|
||||
for item in re.finditer(br_tags, text):
|
||||
final += text[idx:item.start()] + '</p><p>'
|
||||
idx = item.end()
|
||||
final += text[idx:] + '</p>'
|
||||
|
||||
# 4. container
|
||||
if container_tag:
|
||||
final = '<%s>%s</%s>' % (container_tag, final, container_tag)
|
||||
return ustr(final)
|
||||
|
||||
def append_content_to_html(html, content, plaintext=True, preserve=False, container_tag=False):
|
||||
""" Append extra content at the end of an HTML snippet, trying
|
||||
to locate the end of the HTML document (</body>, </html>, or
|
||||
EOF), and converting the provided content in html unless ``plaintext``
|
||||
is False.
|
||||
Content conversion can be done in two ways:
|
||||
- wrapping it into a pre (preserve=True)
|
||||
- use plaintext2html (preserve=False, using container_tag to wrap the
|
||||
whole content)
|
||||
A side-effect of this method is to coerce all HTML tags to
|
||||
lowercase in ``html``, and strip enclosing <html> or <body> tags in
|
||||
content if ``plaintext`` is False.
|
||||
|
||||
:param str html: html tagsoup (doesn't have to be XHTML)
|
||||
:param str content: extra content to append
|
||||
:param bool plaintext: whether content is plaintext and should
|
||||
be wrapped in a <pre/> tag.
|
||||
:param bool preserve: if content is plaintext, wrap it into a <pre>
|
||||
instead of converting it into html
|
||||
"""
|
||||
html = ustr(html)
|
||||
if plaintext and preserve:
|
||||
content = u'\n<pre>%s</pre>\n' % ustr(content)
|
||||
elif plaintext:
|
||||
content = '\n%s\n' % plaintext2html(content, container_tag)
|
||||
else:
|
||||
content = re.sub(r'(?i)(</?html.*>|</?body.*>|<!\W*DOCTYPE.*>)', '', content)
|
||||
content = u'\n%s\n' % ustr(content)
|
||||
# Force all tags to lowercase
|
||||
html = re.sub(r'(</?)\W*(\w+)([ >])',
|
||||
lambda m: '%s%s%s' % (m.group(1), m.group(2).lower(), m.group(3)), html)
|
||||
insert_location = html.find('</body>')
|
||||
if insert_location == -1:
|
||||
insert_location = html.find('</html>')
|
||||
if insert_location == -1:
|
||||
return '%s%s' % (html, content)
|
||||
return '%s%s%s' % (html[:insert_location], content, html[insert_location:])
|
||||
|
||||
#----------------------------------------------------------
|
||||
# Emails
|
||||
#----------------------------------------------------------
|
||||
|
||||
email_re = re.compile(r"""
|
||||
([a-zA-Z][\w\.-]*[a-zA-Z0-9] # username part
|
||||
@ # mandatory @ sign
|
||||
[a-zA-Z0-9][\w\.-]* # domain must start with a letter ... Ged> why do we include a 0-9 then?
|
||||
\.
|
||||
[a-z]{2,3} # TLD
|
||||
)
|
||||
""", re.VERBOSE)
|
||||
res_re = re.compile(r"\[([0-9]+)\]", re.UNICODE)
|
||||
command_re = re.compile("^Set-([a-z]+) *: *(.+)$", re.I + re.UNICODE)
|
||||
|
||||
# Updated in 7.0 to match the model name as well
|
||||
# Typical form of references is <timestamp-openerp-record_id-model_name@domain>
|
||||
# group(1) = the record ID ; group(2) = the model (if any) ; group(3) = the domain
|
||||
reference_re = re.compile("<.*-open(?:object|erp)-(\\d+)(?:-([\w.]+))?.*@(.*)>", re.UNICODE)
|
||||
|
||||
def generate_tracking_message_id(res_id):
|
||||
"""Returns a string that can be used in the Message-ID RFC822 header field
|
||||
|
||||
Used to track the replies related to a given object thanks to the "In-Reply-To"
|
||||
or "References" fields that Mail User Agents will set.
|
||||
"""
|
||||
try:
|
||||
rnd = random.SystemRandom().random()
|
||||
except NotImplementedError:
|
||||
rnd = random.random()
|
||||
rndstr = ("%.15f" % rnd)[2:]
|
||||
return "<%.15f.%s-openerp-%s@%s>" % (time.time(), rndstr, res_id, socket.gethostname())
|
||||
|
||||
def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=None, reply_to=False,
|
||||
attachments=None, message_id=None, references=None, openobject_id=False, debug=False, subtype='plain', headers=None,
|
||||
smtp_server=None, smtp_port=None, ssl=False, smtp_user=None, smtp_password=None, cr=None, uid=None):
|
||||
"""Low-level function for sending an email (deprecated).
|
||||
|
||||
:deprecate: since OpenERP 6.1, please use ir.mail_server.send_email() instead.
|
||||
:param email_from: A string used to fill the `From` header, if falsy,
|
||||
config['email_from'] is used instead. Also used for
|
||||
the `Reply-To` header if `reply_to` is not provided
|
||||
:param email_to: a sequence of addresses to send the mail to.
|
||||
"""
|
||||
|
||||
# If not cr, get cr from current thread database
|
||||
if not cr:
|
||||
db_name = getattr(threading.currentThread(), 'dbname', None)
|
||||
if db_name:
|
||||
cr = pooler.get_db_only(db_name).cursor()
|
||||
else:
|
||||
raise Exception("No database cursor found, please pass one explicitly")
|
||||
|
||||
# Send Email
|
||||
try:
|
||||
mail_server_pool = pooler.get_pool(cr.dbname).get('ir.mail_server')
|
||||
res = False
|
||||
# Pack Message into MIME Object
|
||||
email_msg = mail_server_pool.build_email(email_from, email_to, subject, body, email_cc, email_bcc, reply_to,
|
||||
attachments, message_id, references, openobject_id, subtype, headers=headers)
|
||||
|
||||
res = mail_server_pool.send_email(cr, uid or 1, email_msg, mail_server_id=None,
|
||||
smtp_server=smtp_server, smtp_port=smtp_port, smtp_user=smtp_user, smtp_password=smtp_password,
|
||||
smtp_encryption=('ssl' if ssl else None), smtp_debug=debug)
|
||||
except Exception:
|
||||
_logger.exception("tools.email_send failed to deliver email")
|
||||
return False
|
||||
finally:
|
||||
cr.close()
|
||||
return res
|
||||
|
||||
def email_split(text):
|
||||
""" Return a list of the email addresses found in ``text`` """
|
||||
if not text:
|
||||
return []
|
||||
return re.findall(r'([^ ,<@]+@[^> ,]+)', text)
|
||||
@@ -30,8 +30,6 @@ from functools import wraps
|
||||
import subprocess
|
||||
import logging
|
||||
import os
|
||||
import random
|
||||
import re
|
||||
import socket
|
||||
import sys
|
||||
import threading
|
||||
@@ -48,8 +46,6 @@ try:
|
||||
except ImportError:
|
||||
html2text = None
|
||||
|
||||
import openerp.loglevels as loglevels
|
||||
import openerp.pooler as pooler
|
||||
from config import config
|
||||
from cache import *
|
||||
|
||||
@@ -274,168 +270,6 @@ def reverse_enumerate(l):
|
||||
"""
|
||||
return izip(xrange(len(l)-1, -1, -1), reversed(l))
|
||||
|
||||
#----------------------------------------------------------
|
||||
# Emails
|
||||
#----------------------------------------------------------
|
||||
email_re = re.compile(r"""
|
||||
([a-zA-Z][\w\.-]*[a-zA-Z0-9] # username part
|
||||
@ # mandatory @ sign
|
||||
[a-zA-Z0-9][\w\.-]* # domain must start with a letter ... Ged> why do we include a 0-9 then?
|
||||
\.
|
||||
[a-z]{2,3} # TLD
|
||||
)
|
||||
""", re.VERBOSE)
|
||||
res_re = re.compile(r"\[([0-9]+)\]", re.UNICODE)
|
||||
command_re = re.compile("^Set-([a-z]+) *: *(.+)$", re.I + re.UNICODE)
|
||||
|
||||
# Updated in 7.0 to match the model name as well
|
||||
# Typical form of references is <timestamp-openerp-record_id-model_name@domain>
|
||||
# group(1) = the record ID ; group(2) = the model (if any) ; group(3) = the domain
|
||||
reference_re = re.compile("<.*-open(?:object|erp)-(\\d+)(?:-([\w.]+))?.*@(.*)>", re.UNICODE)
|
||||
|
||||
def html2plaintext(html, body_id=None, encoding='utf-8'):
|
||||
""" From an HTML text, convert the HTML to plain text.
|
||||
If @param body_id is provided then this is the tag where the
|
||||
body (not necessarily <body>) starts.
|
||||
"""
|
||||
## (c) Fry-IT, www.fry-it.com, 2007
|
||||
## <peter@fry-it.com>
|
||||
## download here: http://www.peterbe.com/plog/html2plaintext
|
||||
|
||||
html = ustr(html)
|
||||
|
||||
from lxml.etree import tostring, fromstring, HTMLParser
|
||||
tree = fromstring(html, parser=HTMLParser())
|
||||
|
||||
if body_id is not None:
|
||||
source = tree.xpath('//*[@id=%s]'%(body_id,))
|
||||
else:
|
||||
source = tree.xpath('//body')
|
||||
if len(source):
|
||||
tree = source[0]
|
||||
|
||||
url_index = []
|
||||
i = 0
|
||||
for link in tree.findall('.//a'):
|
||||
url = link.get('href')
|
||||
if url:
|
||||
i += 1
|
||||
link.tag = 'span'
|
||||
link.text = '%s [%s]' % (link.text, i)
|
||||
url_index.append(url)
|
||||
|
||||
html = ustr(tostring(tree, encoding=encoding))
|
||||
|
||||
html = html.replace('<strong>','*').replace('</strong>','*')
|
||||
html = html.replace('<b>','*').replace('</b>','*')
|
||||
html = html.replace('<h3>','*').replace('</h3>','*')
|
||||
html = html.replace('<h2>','**').replace('</h2>','**')
|
||||
html = html.replace('<h1>','**').replace('</h1>','**')
|
||||
html = html.replace('<em>','/').replace('</em>','/')
|
||||
html = html.replace('<tr>', '\n')
|
||||
html = html.replace('</p>', '\n')
|
||||
html = re.sub('<br\s*/?>', '\n', html)
|
||||
html = re.sub('<.*?>', ' ', html)
|
||||
html = html.replace(' ' * 2, ' ')
|
||||
|
||||
# strip all lines
|
||||
html = '\n'.join([x.strip() for x in html.splitlines()])
|
||||
html = html.replace('\n' * 2, '\n')
|
||||
|
||||
for i, url in enumerate(url_index):
|
||||
if i == 0:
|
||||
html += '\n\n'
|
||||
html += ustr('[%s] %s\n') % (i+1, url)
|
||||
|
||||
return html
|
||||
|
||||
def generate_tracking_message_id(res_id):
|
||||
"""Returns a string that can be used in the Message-ID RFC822 header field
|
||||
|
||||
Used to track the replies related to a given object thanks to the "In-Reply-To"
|
||||
or "References" fields that Mail User Agents will set.
|
||||
"""
|
||||
try:
|
||||
rnd = random.SystemRandom().random()
|
||||
except NotImplementedError:
|
||||
rnd = random.random()
|
||||
rndstr = ("%.15f" % rnd)[2:]
|
||||
return "<%.15f.%s-openerp-%s@%s>" % (time.time(), rndstr, res_id, socket.gethostname())
|
||||
|
||||
def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=None, reply_to=False,
|
||||
attachments=None, message_id=None, references=None, openobject_id=False, debug=False, subtype='plain', headers=None,
|
||||
smtp_server=None, smtp_port=None, ssl=False, smtp_user=None, smtp_password=None, cr=None, uid=None):
|
||||
"""Low-level function for sending an email (deprecated).
|
||||
|
||||
:deprecate: since OpenERP 6.1, please use ir.mail_server.send_email() instead.
|
||||
:param email_from: A string used to fill the `From` header, if falsy,
|
||||
config['email_from'] is used instead. Also used for
|
||||
the `Reply-To` header if `reply_to` is not provided
|
||||
:param email_to: a sequence of addresses to send the mail to.
|
||||
"""
|
||||
|
||||
# If not cr, get cr from current thread database
|
||||
if not cr:
|
||||
db_name = getattr(threading.currentThread(), 'dbname', None)
|
||||
if db_name:
|
||||
cr = pooler.get_db_only(db_name).cursor()
|
||||
else:
|
||||
raise Exception("No database cursor found, please pass one explicitly")
|
||||
|
||||
# Send Email
|
||||
try:
|
||||
mail_server_pool = pooler.get_pool(cr.dbname).get('ir.mail_server')
|
||||
res = False
|
||||
# Pack Message into MIME Object
|
||||
email_msg = mail_server_pool.build_email(email_from, email_to, subject, body, email_cc, email_bcc, reply_to,
|
||||
attachments, message_id, references, openobject_id, subtype, headers=headers)
|
||||
|
||||
res = mail_server_pool.send_email(cr, uid or 1, email_msg, mail_server_id=None,
|
||||
smtp_server=smtp_server, smtp_port=smtp_port, smtp_user=smtp_user, smtp_password=smtp_password,
|
||||
smtp_encryption=('ssl' if ssl else None), smtp_debug=debug)
|
||||
except Exception:
|
||||
_logger.exception("tools.email_send failed to deliver email")
|
||||
return False
|
||||
finally:
|
||||
cr.close()
|
||||
return res
|
||||
|
||||
def email_split(text):
|
||||
""" Return a list of the email addresses found in ``text`` """
|
||||
if not text: return []
|
||||
return re.findall(r'([^ ,<@]+@[^> ,]+)', text)
|
||||
|
||||
def append_content_to_html(html, content, plaintext=True):
|
||||
"""Append extra content at the end of an HTML snippet, trying
|
||||
to locate the end of the HTML document (</body>, </html>, or
|
||||
EOF), and wrapping the provided content in a <pre/> block
|
||||
unless ``plaintext`` is False. A side-effect of this
|
||||
method is to coerce all HTML tags to lowercase in ``html``,
|
||||
and strip enclosing <html> or <body> tags in content if
|
||||
``plaintext`` is False.
|
||||
|
||||
:param str html: html tagsoup (doesn't have to be XHTML)
|
||||
:param str content: extra content to append
|
||||
:param bool plaintext: whether content is plaintext and should
|
||||
be wrapped in a <pre/> tag.
|
||||
"""
|
||||
html = ustr(html)
|
||||
if plaintext:
|
||||
content = u'\n<pre>%s</pre>\n' % ustr(content)
|
||||
else:
|
||||
content = re.sub(r'(?i)(</?html.*>|</?body.*>|<!\W*DOCTYPE.*>)', '', content)
|
||||
content = u'\n%s\n'% ustr(content)
|
||||
# Force all tags to lowercase
|
||||
html = re.sub(r'(</?)\W*(\w+)([ >])',
|
||||
lambda m: '%s%s%s' % (m.group(1),m.group(2).lower(),m.group(3)), html)
|
||||
insert_location = html.find('</body>')
|
||||
if insert_location == -1:
|
||||
insert_location = html.find('</html>')
|
||||
if insert_location == -1:
|
||||
return '%s%s' % (html, content)
|
||||
return '%s%s%s' % (html[:insert_location], content, html[insert_location:])
|
||||
|
||||
|
||||
#----------------------------------------------------------
|
||||
# SMS
|
||||
#----------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user