"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:46+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:46+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:46+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:46+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:46+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:46+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:46+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
"X-Poedit-Language: Swedish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:46+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:46+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:46+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:46+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. Type: string
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:46+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
"X-Poedit-Country: TAIWAN\n"
"X-Poedit-Language: Chinese\n"
--- /dev/null
+excludes: pychart release openerp-server test run_tests addons/base_quality_interrogation
\ No newline at end of file
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:34+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:54+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:34+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:54+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:34+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:54+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
#: field:ir.rule,domain_force:0
#: field:res.partner.title,domain:0
msgid "Domain"
-msgstr ""
+msgstr "النطاق"
#. module: base
#: model:res.country,name:base.sh
#. module: base
#: view:ir.actions.report.xml:0
msgid "Other Configuration"
-msgstr ""
+msgstr "عدادت أخري"
#. module: base
#: selection:ir.property,type:0
msgid "DateTime"
-msgstr ""
+msgstr "الوقت و التاريخ"
#. module: base
#: code:addons/fields.py:534
#: view:ir.values:0
#: field:ir.values,meta_unpickle:0
msgid "Metadata"
-msgstr "الفوقية"
+msgstr "بيانات وصفية"
#. module: base
#: field:ir.ui.view,arch:0
#: field:ir.ui.view.custom,arch:0
msgid "View Architecture"
-msgstr ""
+msgstr "العرض الهندسي"
#. module: base
#: field:base.language.import,code:0
msgid "Code (eg:en__US)"
-msgstr ""
+msgstr "الرمز (مثال: ar_EG)"
#. module: base
#: view:workflow:0
#: field:workflow.transition,wkf_id:0
#: field:workflow.workitem,wkf_id:0
msgid "Workflow"
-msgstr ""
+msgstr "مسار العمل"
#. module: base
#: view:partner.sms.send:0
msgid "SMS - Gateway: clickatell"
-msgstr ""
+msgstr "بوابة خدمة الرسائل القصيرة: كليكاتل (clickatell)"
#. module: base
#: selection:base.language.install,lang:0
msgid "Hungarian / Magyar"
-msgstr "المجرية / Magyar"
+msgstr "المجرية"
#. module: base
#: selection:ir.model.fields,select_level:0
msgid "Not Searchable"
-msgstr ""
+msgstr "لا يمكن البحث"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (VE) / Español (VE)"
-msgstr ""
+msgstr "الأسبانية"
#. module: base
#: field:ir.actions.server,wkf_model_id:0
msgid "Workflow On"
-msgstr ""
+msgstr "سير العمل نشط"
#. module: base
#: field:ir.actions.act_window,display_menu_tip:0
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:35+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:55+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:35+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:55+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:35+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:55+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:35+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:55+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:36+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:56+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:37+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:57+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:37+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:57+0000\n"
"X-Generator: Launchpad (build 13168)\n"
"X-Poedit-Country: GREECE\n"
"X-Poedit-Language: Greek\n"
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2011-06-27 13:53+0000\n"
+"PO-Revision-Date: 2011-06-30 15:19+0000\n"
"Last-Translator: John Bradshaw <Unknown>\n"
"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-28 04:39+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:03+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
#: code:addons/orm.py:1622
#, python-format
msgid "There is no view of type '%s' defined for the structure!"
-msgstr ""
+msgstr "There is no view of type '%s' defined for the structure!"
#. module: base
#: field:ir.default,ref_id:0
#. module: base
#: help:ir.property,res_id:0
msgid "If not set, acts as a default value for new resources"
-msgstr ""
+msgstr "If not set, acts as a default value for new resources"
#. module: base
#: code:addons/orm.py:3448
#. module: base
#: view:res.lang:0
msgid "%w - Weekday number [0(Sunday),6]."
-msgstr ""
+msgstr "%w - Weekday number [0(Sunday),6]."
#. module: base
#: model:ir.actions.act_window,help:base.action_partner_form
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:42+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:02+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:44+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:03+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:04+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:36+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:56+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:34+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:55+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:40+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:59+0000\n"
"X-Generator: Launchpad (build 13168)\n"
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
"X-Poedit-Language: Persian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:04+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:36+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:56+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:37+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:57+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:37+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:57+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:37+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:57+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:41+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:01+0000\n"
"X-Generator: Launchpad (build 13168)\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:38+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:57+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:34+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:54+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:38+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:58+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:38+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:58+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:38+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:58+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:38+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:58+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:39+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:58+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:39+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:59+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:39+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:58+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:39+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:59+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:39+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:59+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:39+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:59+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:36+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:56+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:44+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:04+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:40+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:00+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:40+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:00+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:43+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:03+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:40+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:00+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:41+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:00+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
#: view:ir.ui.view_sc:0
#: field:res.partner.title,shortcut:0
msgid "Shortcut"
-msgstr "Закладка"
+msgstr "Сокращение"
#. module: base
#: field:ir.model.data,date_init:0
#. module: base
#: field:ir.actions.act_window,search_view_id:0
msgid "Search View Ref."
-msgstr "Поиск ссылки на обзор"
+msgstr "Ссылка на поиск вида"
#. module: base
#: field:ir.module.module,installed_version:0
#. module: base
#: model:ir.ui.menu,name:base.menu_administration_shortcut
msgid "Custom Shortcuts"
-msgstr "Пользовательские комбинации клавиш"
+msgstr "Пользовательские закладки"
#. module: base
#: selection:base.language.install,lang:0
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:41+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:01+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:42+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:01+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:34+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 04:54+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:41+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:01+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:45+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:05+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:42+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:02+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:42+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:02+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:42+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:02+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:43+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:02+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
#. module: base
#: view:partner.sms.send:0
msgid "SMS - Gateway: clickatell"
-msgstr "SMS - Gateway: Clickatell Hizmeti"
+msgstr "SMS - Geçidi: Clickatell Hizmeti"
#. module: base
#: selection:base.language.install,lang:0
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:43+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:02+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:43+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:03+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:43+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:03+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:44+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:04+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-06-27 04:44+0000\n"
+"X-Launchpad-Export-Date: 2011-07-02 05:04+0000\n"
"X-Generator: Launchpad (build 13168)\n"
#. module: base
sock.close()
+#.apidoc title: Common Services: netsvc
+#.apidoc module-mods: member-order: bysource
+
class Service(object):
""" Base class for *Local* services
logger.setLevel(logging.ERROR)
class Agent(object):
- """Singleton that keeps track of cancellable tasks to run at a given
- timestamp.
- The tasks are caracterised by:
+ """ Singleton that keeps track of cancellable tasks to run at a given
+ timestamp.
+
+ The tasks are characterised by:
+
* a timestamp
* the database on which the task run
* the function to call
* the arguments and keyword arguments to pass to the function
Implementation details:
- Tasks are stored as list, allowing the cancellation by setting
- the timestamp to 0.
- A heapq is used to store tasks, so we don't need to sort
- tasks ourself.
+
+ - Tasks are stored as list, allowing the cancellation by setting
+ the timestamp to 0.
+ - A heapq is used to store tasks, so we don't need to sort
+ tasks ourself.
"""
__tasks = []
__tasks_by_db = {}
import osv
import fields
+#.apidoc title: Object Services and Relational Mapping
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
from openerp.tools import flatten, reverse_enumerate
import fields
+#.apidoc title: Domain Expressions
+
NOT_OPERATOR = '!'
OR_OPERATOR = '|'
AND_OPERATOR = '&'
#
##############################################################################
-# . Fields:
-# - simple
-# - relations (one2many, many2one, many2many)
-# - function
-#
-# Fields Attributes:
-# _classic_read: is a classic sql fields
-# _type : field type
-# readonly
-# required
-# size
-#
+""" Fields:
+ - simple
+ - relations (one2many, many2one, many2many)
+ - function
+
+ Fields Attributes:
+ * _classic_read: is a classic sql fields
+ * _type : field type
+ * readonly
+ * required
+ * size
+"""
+
import datetime as DT
import string
import sys
class _column(object):
+ """ Base of all fields, a database column
+
+ An instance of this object is a *description* of a database column. It will
+ not hold any data, but only provide the methods to manipulate data of an
+ ORM record or even prepare/update the database to hold such a field of data.
+ """
_classic_read = True
_classic_write = True
_prefetch = True
# Function fields
# ---------------------------------------------------------
class function(_column):
+ """
+ A field whose value is computed by a function (rather
+ than being read from the database).
+
+ :param fnct: the callable that will compute the field value.
+ :param arg: arbitrary value to be passed to ``fnct`` when computing the value.
+ :param fnct_inv: the callable that will allow writing values in that field
+ (if not provided, the field is read-only).
+ :param fnct_inv_arg: arbitrary value to be passed to ``fnct_inv`` when
+ writing a value.
+ :param str type: type of the field simulated by the function field
+ :param fnct_search: the callable that allows searching on the field
+ (if not provided, search will not return any result).
+ :param store: store computed value in database
+ (see :ref:`The *store* parameter <field-function-store>`).
+ :type store: True or dict specifying triggers for field computation
+ :param multi: name of batch for batch computation of function fields.
+ All fields with the same batch name will be computed by
+ a single function call. This changes the signature of the
+ ``fnct`` callable.
+
+ .. _field-function-fnct: The ``fnct`` parameter
+
+ .. rubric:: The ``fnct`` parameter
+
+ The callable implementing the function field must have the following signature:
+
+ .. function:: fnct(model, cr, uid, ids, field_name(s), arg, context)
+
+ Implements the function field.
+
+ :param orm_template model: model to which the field belongs (should be ``self`` for
+ a model method)
+ :param field_name(s): name of the field to compute, or if ``multi`` is provided,
+ list of field names to compute.
+ :type field_name(s): str | [str]
+ :param arg: arbitrary value passed when declaring the function field
+ :rtype: dict
+ :return: mapping of ``ids`` to computed values, or if multi is provided,
+ to a map of field_names to computed values
+
+ The values in the returned dictionary must be of the type specified by the type
+ argument in the field declaration.
+
+ Here is an example with a simple function ``char`` function field::
+
+ # declarations
+ def compute(self, cr, uid, ids, field_name, arg, context):
+ result = {}
+ # ...
+ return result
+ _columns['my_char'] = fields.function(compute, type='char', size=50)
+
+ # when called with ``ids=[1,2,3]``, ``compute`` could return:
+ {
+ 1: 'foo',
+ 2: 'bar',
+ 3: False # null values should be returned explicitly too
+ }
+
+ If ``multi`` is set, then ``field_name`` is replaced by ``field_names``: a list
+ of the field names that should be computed. Each value in the returned
+ dictionary must then be a dictionary mapping field names to values.
+
+ Here is an example where two function fields (``name`` and ``age``)
+ are both computed by a single function field::
+
+ # declarations
+ def compute(self, cr, uid, ids, field_names, arg, context):
+ result = {}
+ # ...
+ return result
+ _columns['name'] = fields.function(compute_person_data, type='char',\
+ size=50, multi='person_data')
+ _columns[''age'] = fields.function(compute_person_data, type='integer',\
+ multi='person_data')
+
+ # when called with ``ids=[1,2,3]``, ``compute_person_data`` could return:
+ {
+ 1: {'name': 'Bob', 'age': 23},
+ 2: {'name': 'Sally', 'age': 19},
+ 3: {'name': 'unknown', 'age': False}
+ }
+
+ .. _field-function-fnct-inv:
+
+ .. rubric:: The ``fnct_inv`` parameter
+
+ This callable implements the write operation for the function field
+ and must have the following signature:
+
+ .. function:: fnct_inv(model, cr, uid, ids, field_name, field_value, fnct_inv_arg, context)
+
+ Callable that implements the ``write`` operation for the function field.
+
+ :param orm_template model: model to which the field belongs (should be ``self`` for
+ a model method)
+ :param str field_name: name of the field to set
+ :param fnct_inv_arg: arbitrary value passed when declaring the function field
+ :return: True
+
+ When writing values for a function field, the ``multi`` parameter is ignored.
+
+ .. _field-function-fnct-search:
+
+ .. rubric:: The ``fnct_search`` parameter
+
+ This callable implements the search operation for the function field
+ and must have the following signature:
+
+ .. function:: fnct_search(model, cr, uid, model_again, field_name, criterion, context)
+
+ Callable that implements the ``search`` operation for the function field by expanding
+ a search criterion based on the function field into a new domain based only on
+ columns that are stored in the database.
+
+ :param orm_template model: model to which the field belongs (should be ``self`` for
+ a model method)
+ :param orm_template model_again: same value as ``model`` (seriously! this is for backwards
+ compatibility)
+ :param str field_name: name of the field to search on
+ :param list criterion: domain component specifying the search criterion on the field.
+ :rtype: list
+ :return: domain to use instead of ``criterion`` when performing the search.
+ This new domain must be based only on columns stored in the database, as it
+ will be used directly without any translation.
+
+ The returned value must be a domain, that is, a list of the form [(field_name, operator, operand)].
+ The most generic way to implement ``fnct_search`` is to directly search for the records that
+ match the given ``criterion``, and return their ``ids`` wrapped in a domain, such as
+ ``[('id','in',[1,3,5])]``.
+
+ .. _field-function-store:
+
+ .. rubric:: The ``store`` parameter
+
+ The ``store`` parameter allows caching the result of the field computation in the
+ database, and defining the triggers that will invalidate that cache and force a
+ recomputation of the function field.
+ When not provided, the field is computed every time its value is read.
+ The value of ``store`` may be either ``True`` (to recompute the field value whenever
+ any field in the same record is modified), or a dictionary specifying a more
+ flexible set of recomputation triggers.
+
+ A trigger specification is a dictionary that maps the names of the models that
+ will trigger the computation, to a tuple describing the trigger rule, in the
+ following form::
+
+ store = {
+ 'trigger_model': (mapping_function,
+ ['trigger_field1', 'trigger_field2'],
+ priority),
+ }
+
+ A trigger rule is defined by a 3-item tuple where:
+
+ * The ``mapping_function`` is defined as follows:
+
+ .. function:: mapping_function(trigger_model, cr, uid, trigger_ids, context)
+
+ Callable that maps record ids of a trigger model to ids of the
+ corresponding records in the source model (whose field values
+ need to be recomputed).
+
+ :param orm_template model: trigger_model
+ :param list trigger_ids: ids of the records of trigger_model that were
+ modified
+ :rtype: list
+ :return: list of ids of the source model whose function field values
+ need to be recomputed
+
+ * The second item is a list of the fields who should act as triggers for
+ the computation. If an empty list is given, all fields will act as triggers.
+ * The last item is the priority, used to order the triggers when processing them
+ after any write operation on a model that has function field triggers. The
+ default priority is 10.
+
+ In fact, setting store = True is the same as using the following trigger dict::
+
+ store = {
+ 'model_itself': (lambda self, cr, uid, ids, context: ids,
+ [],
+ 10)
+ }
+
+ """
_classic_read = False
_classic_write = False
_prefetch = False
#
# multi: compute several fields in one call
#
- def __init__(self, fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type='float', fnct_search=None, obj=None, method=False, store=False, multi=False, **args):
+ def __init__(self, fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type='float', fnct_search=None, obj=None, store=False, multi=False, **args):
_column.__init__(self, **args)
self._obj = obj
- self._method = method
self._fnct = fnct
self._fnct_inv = fnct_inv
self._arg = arg
return result
def get(self, cr, obj, ids, name, uid=False, context=None, values=None):
- result = {}
- if self._method:
- result = self._fnct(obj, cr, uid, ids, name, self._arg, context)
- else:
- result = self._fnct(cr, obj._table, ids, name, self._arg, context)
+ result = self._fnct(obj, cr, uid, ids, name, self._arg, context)
for id in ids:
if self._multi and id in result:
for field, value in result[id].iteritems():
# ---------------------------------------------------------
class related(function):
+ """Field that points to some data inside another field of the current record.
+
+ Example::
+
+ _columns = {
+ 'foo_id': fields.many2one('my.foo', 'Foo'),
+ 'bar': fields.related('frol', 'foo_id', type='char', string='Frol of Foo'),
+ }
+ """
def _fnct_search(self, tobj, cr, uid, obj=None, name=None, domain=None, context=None):
self._field_get2(cr, uid, obj, context)
def __init__(self, *arg, **args):
self.arg = arg
self._relations = []
- super(related, self).__init__(self._fnct_read, arg, self._fnct_write, fnct_inv_arg=arg, method=True, fnct_search=self._fnct_search, **args)
+ super(related, self).__init__(self._fnct_read, arg, self._fnct_write, fnct_inv_arg=arg, fnct_search=self._fnct_search, **args)
if self.store is True:
# TODO: improve here to change self.store = {...} according to related objects
pass
def __init__(self, *arg, **args):
self.arg = arg
self._relations = []
- super(dummy, self).__init__(self._fnct_read, arg, self._fnct_write, fnct_inv_arg=arg, method=True, fnct_search=None, **args)
+ super(dummy, self).__init__(self._fnct_read, arg, self._fnct_write, fnct_inv_arg=arg, fnct_search=None, **args)
# ---------------------------------------------------------
# Serialized fields
res['fnct_inv'] = field._fnct_inv and field._fnct_inv.func_name or False
res['fnct_inv_arg'] = field._fnct_inv_arg or False
res['func_obj'] = field._obj or False
- res['func_method'] = field._method
if isinstance(field, many2many):
res['related_columns'] = list((field._id1, field._id2))
res['third_table'] = field._rel
#
##############################################################################
-#
-# Object relationnal mapping to postgresql module
-# . Hierarchical structure
-# . Constraints consistency, validations
-# . Object meta Data depends on its status
-# . Optimised processing by complex query (multiple actions at once)
-# . Default fields value
-# . Permissions optimisation
-# . Persistant object: DB postgresql
-# . Datas conversions
-# . Multi-level caching system
-# . 2 different inheritancies
-# . Fields:
-# - classicals (varchar, integer, boolean, ...)
-# - relations (one2many, many2one, many2many)
-# - functions
-#
-#
+#.apidoc title: Object Relational Mapping
+#.apidoc module-mods: member-order: bysource
+
+"""
+ Object relational mapping to database (postgresql) module
+ * Hierarchical structure
+ * Constraints consistency, validations
+ * Object meta Data depends on its status
+ * Optimised processing by complex query (multiple actions at once)
+ * Default fields value
+ * Permissions optimisation
+ * Persistant object: DB postgresql
+ * Datas conversions
+ * Multi-level caching system
+ * 2 different inheritancies
+ * Fields:
+ - classicals (varchar, integer, boolean, ...)
+ - relations (one2many, many2one, many2many)
+ - functions
+
+"""
+
import calendar
import copy
import datetime
class BrowseRecordError(Exception):
pass
-# Readonly python database object browser
class browse_null(object):
+ """ Readonly python database object browser
+ """
def __init__(self):
self.id = False
# TODO: execute an object method on browse_record_list
#
class browse_record_list(list):
+ """ Collection of browse objects
+
+ Such an instance will be returned when doing a ``browse([ids..])``
+ and will be iterable, yielding browse() objects
+ """
def __init__(self, lst, context=None):
if not context:
class browse_record(object):
+ """ An object that behaves like a row of an object's table.
+ It has attributes after the columns of the corresponding object.
+
+ Examples::
+
+ uobj = pool.get('res.users')
+ user_rec = uobj.browse(cr, uid, 104)
+ name = user_rec.name
+ """
logger = netsvc.Logger()
def __init__(self, cr, uid, id, table, cache, context=None, list_class=None, fields_process=None):
- '''
- table : the object (inherited from orm)
- context : dictionary with an optional context
- '''
+ """
+ @param cache a dictionary of model->field->data to be shared accross browse
+ objects, thus reducing the SQL read()s . It can speed up things a lot,
+ but also be disastrous if not discarded after write()/unlink() operations
+ @param table the object (inherited from orm)
+ @param context dictionary with an optional context
+ """
if fields_process is None:
fields_process = {}
if context is None:
def get_pg_type(f):
- '''
+ """
returns a tuple
(type returned by postgres when the column was created, type expression to create the column)
- '''
+ """
type_dict = {
fields.boolean: 'bool',
:param cr: database cursor
:param user: current user id
- :param select: id or list of ids
+ :param select: id or list of ids.
:param context: context arguments, like lang, time zone
:rtype: object or list of objects requested
#
##############################################################################
-#
-# OSV: Objects Services
-#
+#.apidoc title: Objects Services (OSV)
import orm
import openerp.netsvc as netsvc
#
##############################################################################
+#.apidoc title: Query object
def _quote(to_quote):
if '"' not in to_quote:
import printscreen
+#.apidoc title: Reporting Support and Engines
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
import ps_list
import ps_form
+#.apidoc title: Printscreen Support
+
+""" A special report, that is automatically formatted to look like the
+ screen contents of Form/List Views.
+"""
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
import time, os
+#.apidoc title: Printscreen for Form Views
+
class report_printscreen_list(report_int):
def __init__(self, name):
report_int.__init__(self, name)
from operator import itemgetter
from datetime import datetime
+#.apidoc title: Printscreen for List Views
+
class report_printscreen_list(report_int):
def __init__(self, name):
report_int.__init__(self, name)
from pdf import PdfFileReader, PdfFileWriter
+#.apidoc title: pyPdf Engine
+
__all__ = ["pdf"]
+
from rml import rml, rml2html, rml2txt, odt2odt , html2html, makohtml2html
from render import render
+#.apidoc title: Report Rendering
+
try:
import Image
except ImportError:
from html2html import parseString
+#.apidoc title: HTML to HTML engine
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
#
##############################################################################
-from makohtml2html import parseNode
\ No newline at end of file
+from makohtml2html import parseNode
+
+#.apidoc title: MAKO to HTML engine
+
from odt2odt import parseNode
+#.apidoc title: ODT to ODT engine
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
from rml2html import parseString
+#.apidoc title: RML to HTML engine
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
from trml2pdf import parseString, parseNode
+#.apidoc title: RML to PDF engine
+
from openerp.tools import config
+#.apidoc title: TTF Font Table
+
"""This module allows the mapping of some system-available TTF fonts to
the reportlab engine.
from rml2txt import parseString, parseNode
+#.apidoc title: RML to TXT engine
+
+""" This engine is the minimalistic renderer of RML documents into text files,
+ using spaces and newlines to format.
+
+ It was needed in some special applications, where legal reports need to be
+ printed in special (dot-matrix) printers.
+"""
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
import netrpc_server
import web_services
+#.apidoc title: RPC Services
+
+""" Classes of this module implement the network protocols that the
+ OpenERP server uses to communicate with remote clients.
+
+ Some classes are mostly utilities, whose API need not be visible to
+ the average user/developer. Study them only if you are about to
+ implement an extension to the network protocols, or need to debug some
+ low-level behavior of the wire.
+"""
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
###############################################################################
-""" This file contains instance of the http server.
+#.apidoc title: HTTP and XML-RPC Server
+""" This module offers the family of HTTP-based servers. These are not a single
+ class/functionality, but a set of network stack layers, implementing
+ extendable HTTP protocols.
+ The OpenERP server defines a single instance of a HTTP server, listening at
+ the standard 8069, 8071 ports (well, it is 2 servers, and ports are
+ configurable, of course). This "single" server then uses a `MultiHTTPHandler`
+ to dispatch requests to the appropriate channel protocol, like the XML-RPC,
+ static HTTP, DAV or other.
"""
+
from websrv_lib import *
import openerp.netsvc as netsvc
import errno
#
##############################################################################
+#.apidoc title: NET-RPC Server
+
""" This file contains instance of the net-rpc server
import openerp.pooler as pooler
import openerp.tools as tools
-# When rejecting a password, hide the traceback
+#.apidoc title: Authentication helpers
+
class ExceptionNoTb(Exception):
+ """ When rejecting a password, hide the traceback
+ """
def __init__(self, msg):
super(ExceptionNoTb, self).__init__(msg)
self.traceback = ('','','')
import logging
from cStringIO import StringIO
+#.apidoc title: Exported Service methods
+#.apidoc module-mods: member-order: bysource
+
+""" This python module defines the RPC methods available to remote clients.
+
+ Each 'Export Service' is a group of 'methods', which in turn are RPC
+ procedures to be called. Each method has its own arguments footprint.
+"""
+
class db(netsvc.ExportService):
def __init__(self, name="db"):
netsvc.ExportService.__init__(self, name)
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
###############################################################################
+#.apidoc title: HTTP Layer library (websrv_lib)
+
""" Framework for generic http servers
+ This library contains *no* OpenERP-specific functionality. It should be
+ usable in other projects, too.
"""
import socket
#
##############################################################################
+#.apidoc title: PostgreSQL interface
+
+"""
+The PostgreSQL connector is a connectivity layer between the OpenERP code and
+the database, *not* a database abstraction toolkit. Database abstraction is what
+the ORM does, in fact.
+
+See also: the `pooler` module
+"""
+
+#.apidoc add-functions: print_stats
+#.apidoc add-classes: Cursor Connection ConnectionPool
+
__all__ = ['db_connect', 'close_db']
from threading import currentThread
sql_counter = 0
class Cursor(object):
+ """ Cursor is an open transaction to Postgres, utilizing a TCP connection
+
+ A lightweight wrapper around psycopg2's `psycopg1cursor` objects
+
+ This is the object behind the `cr` variable used all over the OpenERP
+ code.
+ """
IN_MAX = 1000 # decent limit on size of IN queries - guideline = Oracle limit
__logger = None
@check
def commit(self):
+ """ Perform an SQL `COMMIT`
+ """
return self._cnx.commit()
@check
def rollback(self):
+ """ Perform an SQL `ROLLBACK`
+ """
return self._cnx.rollback()
@check
def __getattr__(self, name):
return getattr(self._obj, name)
+ """ Set the mode of postgres operations for all cursors
+ """
+ """Obtain the mode of postgres operations for all cursors
+ """
class PsycoConnection(psycopg2.extensions.connection):
pass
class ConnectionPool(object):
-
+ """ The pool of connections to database(s)
+
+ Keep a set of connections to pg databases open, and reuse them
+ to open cursors for all transactions.
+
+ The connections are *not* automatically closed. Only a close_db()
+ can trigger that.
+ """
__logger = logging.getLogger('db.connection_pool')
def locked(fun):
class Connection(object):
+ """ A lightweight instance of a connection to postgres
+ """
__logger = logging.getLogger('db.connection')
def __init__(self, pool, dbname):
import netsvc
+#.apidoc title: Net-RPC classes
+
class Myexception(Exception):
"""
- custome exception object store
+ custom exception object store
* faultcode
* faulestring
* args
from yaml_import import *
from sql import *
+#.apidoc title: Tools
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
'Décillion', 'Undecillion', 'Duodecillion', 'Tredecillion', 'Quattuordecillion',
'Sexdecillion', 'Septendecillion', 'Octodecillion', 'Icosillion', 'Vigintillion' )
-# convert a value < 100 to French.
def _convert_nn_fr(val):
+ """ convert a value < 100 to French
+ """
if val < 20:
return to_19_fr[val]
for (dcap, dval) in ((k, 20 + (10 * v)) for (v, k) in enumerate(tens_fr)):
return dcap + '-' + to_19_fr[val % 10]
return dcap
-# convert a value < 1000 to french, special cased because it is the level that kicks
-# off the < 100 special case. The rest are more general. This also allows you to
-# get strings in the form of 'forty-five hundred' if called directly.
def _convert_nnn_fr(val):
+ """ convert a value < 1000 to french
+
+ special cased because it is the level that kicks
+ off the < 100 special case. The rest are more general. This also allows you to
+ get strings in the form of 'forty-five hundred' if called directly.
+ """
word = ''
(mod, rem) = (val % 100, val // 100)
if rem > 0:
'Decillion', 'Undecillion', 'Duodecillion', 'Tredecillion', 'Quattuordecillion',
'Sexdecillion', 'Septendecillion', 'Octodecillion', 'Novemdecillion', 'Vigintillion' )
-# convert a value < 100 to Dutch.
def _convert_nn_nl(val):
+ """ convert a value < 100 to Dutch
+ """
if val < 20:
return to_19_nl[val]
for (dcap, dval) in ((k, 20 + (10 * v)) for (v, k) in enumerate(tens_nl)):
return dcap + '-' + to_19_nl[val % 10]
return dcap
-# convert a value < 1000 to Dutch, special cased because it is the level that kicks
-# off the < 100 special case. The rest are more general. This also allows you to
-# get strings in the form of 'forty-five hundred' if called directly.
def _convert_nnn_nl(val):
+ """ convert a value < 1000 to Dutch
+
+ special cased because it is the level that kicks
+ off the < 100 special case. The rest are more general. This also allows you to
+ get strings in the form of 'forty-five hundred' if called directly.
+ """
word = ''
(mod, rem) = (val % 100, val // 100)
if rem > 0:
#TODO: we should use the country AND language (ex: septante VS soixante dix)
#TODO: we should use en by default, but the translation func is yet to be implemented
def amount_to_text(nbr, lang='fr', currency='euro'):
- """
- Converts an integer to its textual representation, using the language set in the context if any.
- Example:
- 1654: mille six cent cinquante-quatre.
+ """ Converts an integer to its textual representation, using the language set in the context if any.
+
+ Example::
+
+ 1654: mille six cent cinquante-quatre.
"""
# if nbr > 1000000:
##TODO: use logger
'Decillion', 'Undecillion', 'Duodecillion', 'Tredecillion', 'Quattuordecillion',
'Sexdecillion', 'Septendecillion', 'Octodecillion', 'Novemdecillion', 'Vigintillion' )
-# convert a value < 100 to English.
def _convert_nn(val):
+ """convert a value < 100 to English.
+ """
if val < 20:
return to_19[val]
for (dcap, dval) in ((k, 20 + (10 * v)) for (v, k) in enumerate(tens)):
return dcap + '-' + to_19[val % 10]
return dcap
-# convert a value < 1000 to english, special cased because it is the level that kicks
-# off the < 100 special case. The rest are more general. This also allows you to
-# get strings in the form of 'forty-five hundred' if called directly.
def _convert_nnn(val):
+ """
+ convert a value < 1000 to english, special cased because it is the level that kicks
+ off the < 100 special case. The rest are more general. This also allows you to
+ get strings in the form of 'forty-five hundred' if called directly.
+ """
word = ''
(mod, rem) = (val % 100, val // 100)
if rem > 0:
#TODO: we should use the country AND language (ex: septante VS soixante dix)
#TODO: we should use en by default, but the translation func is yet to be implemented
def amount_to_text(nbr, lang='en', currency='euro'):
- """
- Converts an integer to its textual representation, using the language set in the context if any.
- Example:
- 1654: thousands six cent cinquante-quatre.
+ """ Converts an integer to its textual representation, using the language set in the context if any.
+
+ Example::
+
+ 1654: thousands six cent cinquante-quatre.
"""
import openerp.loglevels as loglevels
# if nbr > 10000000:
self.my_default = attrs.pop('my_default', None)
super(MyOption, self).__init__(*opts, **attrs)
+#.apidoc title: Server Configuration Loader
+
def check_ssl():
try:
from OpenSSL import SSL
# http://svn.python.org/view/python/tags/r254/Lib/functools.py?view=markup
def partial(fun, *args, **kwargs):
+ """ Partial implementation
+
+ See: http://svn.python.org/view/python/tags/r254/Lib/functools.py
+ """
def _partial(*args2, **kwargs2):
return fun(*(args+args2), **dict(kwargs, **kwargs2))
return _partial
class graph(object):
def __init__(self, nodes, transitions, no_ancester=None):
- """Initailize graph's object
+ """Initialize graph's object
- @param nodes: list of ids of nodes in the graph
- @param transitions: list of edges in the graph in the form (source_node, destination_node)
- @param no_ancester: list of nodes with no incoming edges
+ @param nodes list of ids of nodes in the graph
+ @param transitions list of edges in the graph in the form (source_node, destination_node)
+ @param no_ancester list of nodes with no incoming edges
"""
self.nodes = nodes or []
def exchange(self, e, f):
"""Exchange edges to make feasible-tree optimized
- @param edge: edge with negative cut-value
- @param edge: new edge with minimum slack-value
+ @param edge edge with negative cut-value
+ @param edge new edge with minimum slack-value
"""
self.tree_edges.__delitem__(self.tree_edges.index(e))
self.tree_edges.append(f)
def enter_edge(self, edge):
"""Finds a new_edge with minimum slack value to replace an edge with negative cut-value
- @param edge: edge with negative cut-value
+ @param edge edge with negative cut-value
"""
self.head_nodes = []
def median_value(self, node, adj_rank):
"""Returns median value of a vertex , defined as the median position of the adjacent vertices
- @param node: node to process
- @param adj_rank: rank 1 less than the node's rank
+ @param node node to process
+ @param adj_rank rank 1 less than the node's rank
"""
adj_nodes = self.adj_position(node, adj_rank)
l = len(adj_nodes)
def adj_position(self, node, adj_rank):
"""Returns list of the present positions of the nodes adjacent to node in the given adjacent rank.
- @param node: node to process
- @param adj_rank: rank 1 less than the node's rank
+ @param node node to process
+ @param adj_rank rank 1 less than the node's rank
"""
pre_level_nodes = self.levels.get(adj_rank, [])
def rank(self):
"""Finds the optimized rank of the nodes using Network-simplex algorithm
- @param start: starting node of the component
+ @param start starting node of the component
"""
self.levels = {}
self.critical_edges = []
def process(self, starting_node):
"""Process the graph to find ranks and order of the nodes
- @param starting_node: node from where to start the graph search
+ @param starting_node node from where to start the graph search
"""
self.start_nodes = starting_node or []
#
##############################################################################
+#.apidoc title: Utilities: tools.misc
+
"""
Miscelleanous tools used by OpenERP.
"""
def file_open(name, mode="r", subdir='addons', pathinfo=False):
"""Open a file from the OpenERP root, using a subdir folder.
+ Example::
+
>>> file_open('hr/report/timesheer.xsl')
>>> file_open('addons/hr/report/timesheet.xsl')
>>> file_open('../../base/report/rml_template.xsl', subdir='addons/hr/report', pathinfo=True)
- @param name: name of the file
- @param mode: file open mode
- @param subdir: subdirectory
- @param pathinfo: if True returns tupple (fileobject, filepath)
+ @param name name of the file
+ @param mode file open mode
+ @param subdir subdirectory
+ @param pathinfo if True returns tupple (fileobject, filepath)
- @return: fileobject if pathinfo is False else (fileobject, filepath)
+ @return fileobject if pathinfo is False else (fileobject, filepath)
"""
import openerp.modules as addons
adps = addons.module.ad_paths
"""Flatten a list of elements into a uniqu list
Author: Christophe Simonis (christophe@tinyerp.com)
- Examples:
+ Examples::
>>> flatten(['a'])
['a']
>>> flatten('b')
def reverse_enumerate(l):
"""Like enumerate but in the other sens
+
+ Usage::
>>> a = ['a', 'b', 'c']
>>> it = reverse_enumerate(a)
>>> it.next()
}
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
-
- """ from an HTML text, convert the HTML to plain text.
- If @body_id is provided then this is the tag where the
- body (not necessarily <body>) starts.
- """
-
html = ustr(html)
from lxml.etree import tostring
return html
def generate_tracking_message_id(openobject_id):
- """Returns a string that can be used in the Message-ID RFC822 header field so we
- can track the replies related to a given object thanks to the "In-Reply-To" or
- "References" fields that Mail User Agents will set.
+ """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.
"""
return "<%s-openobject-%s@%s>" % (time.time(), openobject_id, socket.gethostname())
def _email_send(smtp_from, smtp_to_list, message, openobject_id=None, ssl=False, debug=False):
- """Low-level method to send directly a Message through the configured smtp server.
+ """ Low-level method to send directly a Message through the configured smtp server.
+
:param smtp_from: RFC-822 envelope FROM (not displayed to recipient)
:param smtp_to_list: RFC-822 envelope RCPT_TOs (not displayed to recipient)
:param message: an email.message.Message to send
"""Send an email.
- Arguments:
-
- `email_from`: A string used to fill the `From` header, if falsy,
+ @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
- `email_to`: a sequence of addresses to send the mail to.
+ @param email_to a sequence of addresses to send the mail to.
"""
if x_headers is None:
x_headers = {}
+
if not (email_from or config['email_from']):
raise ValueError("Sending an email requires either providing a sender "
# FIXME: Use the logger if there is an error
return True
-#---------------------------------------------------------
-# Class that stores an updateable string (used in wizards)
-#---------------------------------------------------------
class UpdateableStr(local):
+ """ Class that stores an updateable string (used in wizards)
+ """
def __init__(self, string=''):
self.string = string
class UpdateableDict(local):
- '''Stores an updateable dict to use in wizards'''
+ """Stores an updateable dict to use in wizards
+ """
def __init__(self, dict=None):
if dict is None:
return self.dict.__ne__(y)
-# Don't use ! Use res.currency.round()
class currency(float):
+ """ Deprecate
+
+ .. warning::
+
+ Don't use ! Use res.currency.round()
+ """
def __init__(self, value, accuracy=2, rounding=None):
if rounding is None:
# times.
def get_win32_timezone():
"""Attempt to return the "standard name" of the current timezone on a win32 system.
- @return: the standard name of the current win32 timezone, or False if it cannot be found.
+ @return the standard name of the current win32 timezone, or False if it cannot be found.
"""
res = False
if (sys.platform == "win32"):
def detect_server_timezone():
"""Attempt to detect the timezone to use on the server side.
Defaults to UTC if no working timezone can be found.
- @return: the timezone identifier as expected by pytz.timezone.
+ @return the timezone identifier as expected by pytz.timezone.
"""
try:
import pytz
@param ignore_unparsable_time: if True, return False if src_tstamp_str cannot be parsed
using src_format or formatted using dst_format.
- @return: local/client formatted timestamp, expressed in the local/client timezone if possible
+ @return local/client formatted timestamp, expressed in the local/client timezone if possible
and if tz_offset is true, or src_tstamp_str if timezone offset could not be determined.
"""
if not src_tstamp_str:
Return a generator which yields full paths in which the *file* name exists
in a directory that is part of the file name, or on *path*,
and has the given *mode*.
- By default, *mode* matches an inclusive OR of os.F_OK and os.X_OK
- - an existing executable file.
+ By default, *mode* matches an inclusive OR of os.F_OK and os.X_OK - an
+ existing executable file.
The *path* is, by default, the ``PATH`` variable on the platform,
or the string/iterable passed in as *path*.
In the event that a ``PATH`` variable is not found, :const:`os.defpath` is used.
import wkf_service
+#.apidoc title: Workflow objects
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: