Merge lp:openobject-server
bzr revid: jra@tinyerp.com-20120904105151-x80la9q1mvfrqhfv bzr revid: tpa@tinyerp.com-20120907071127-kodz8my0bycwt4sw bzr revid: jam@tinyerp.com-20120910043029-y9xvj90x4e19m421
This commit is contained in:
Vendored
+1
@@ -16,6 +16,7 @@ Depends:
|
||||
python,
|
||||
postgresql-client,
|
||||
python-dateutil,
|
||||
python-docutils,
|
||||
python-feedparser,
|
||||
python-gdata,
|
||||
python-ldap,
|
||||
|
||||
@@ -35,6 +35,8 @@ The kernel of OpenERP, needed for all installation.
|
||||
'depends': [],
|
||||
'data': [
|
||||
'base_data.xml',
|
||||
'currency_data.xml',
|
||||
'country_data.xml',
|
||||
'security/base_security.xml',
|
||||
'base_menu.xml',
|
||||
'res/res_security.xml',
|
||||
|
||||
@@ -1054,9 +1054,8 @@
|
||||
<field name="code">zw</field>
|
||||
</record>
|
||||
|
||||
<record id="main_partner" model="res.partner">
|
||||
<record id="main_partner" model="res.partner" context="{'default_is_company': True}">
|
||||
<field name="name">Your Company</field>
|
||||
<!-- Address and Company ID will be set later -->
|
||||
<field name="company_id" eval="None"/>
|
||||
<field name="customer" eval="False"/>
|
||||
<field name="is_company" eval="True"/>
|
||||
@@ -1111,644 +1110,9 @@
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
|
||||
<!-- The Following currency rates are considered as on 1st Jan,2010 against EUR. -->
|
||||
<!-- Currencies -->
|
||||
<record id="EUR" model="res.currency">
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="USD" model="res.currency">
|
||||
<field name="name">USD</field>
|
||||
<field name="symbol">$</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateUSD" model="res.currency.rate">
|
||||
<field name="rate">1.2834</field>
|
||||
<field name="currency_id" ref="USD"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<!-- VEF was previously VEB -->
|
||||
<record id="VEF" model="res.currency">
|
||||
<field name="name">VEF</field>
|
||||
<field name="symbol">Bs.F</field>
|
||||
<field name="rounding">0.0001</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateVEF" model="res.currency.rate">
|
||||
<field name="rate">5.864</field>
|
||||
<field name="currency_id" ref="VEF"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="CAD" model="res.currency">
|
||||
<field name="name">CAD</field>
|
||||
<field name="symbol">$</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateCAD" model="res.currency.rate">
|
||||
<field name="rate">1.3388</field>
|
||||
<field name="currency_id" ref="CAD"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="CHF" model="res.currency">
|
||||
<field name="name">CHF</field>
|
||||
<field name="symbol">CHF</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateCHF" model="res.currency.rate">
|
||||
<field name="rate">1.3086</field>
|
||||
<field name="currency_id" ref="CHF"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="BRL" model="res.currency">
|
||||
<field name="name">BRL</field>
|
||||
<field name="symbol">R$</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateBRL" model="res.currency.rate">
|
||||
<field name="rate">2.2344</field>
|
||||
<field name="currency_id" ref="BRL"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="CNY" model="res.currency">
|
||||
<field name="name">CNY</field>
|
||||
<field name="symbol">¥</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateCNY" model="res.currency.rate">
|
||||
<field name="rate">8.7556</field>
|
||||
<field name="currency_id" ref="CNY"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="COP" model="res.currency">
|
||||
<field name="name">COP</field>
|
||||
<field name="symbol">$</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateCOP" model="res.currency.rate">
|
||||
<field name="rate">2933.8378</field>
|
||||
<field name="currency_id" ref="COP"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="CZK" model="res.currency">
|
||||
<field name="name">CZK</field>
|
||||
<field name="symbol">Kč</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateCZK" model="res.currency.rate">
|
||||
<field name="rate">26.5634</field>
|
||||
<field name="currency_id" ref="CZK"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="DKK" model="res.currency">
|
||||
<field name="name">DKK</field>
|
||||
<field name="symbol">kr</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateDKK" model="res.currency.rate">
|
||||
<field name="rate">7.4445</field>
|
||||
<field name="currency_id" ref="DKK"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="HUF" model="res.currency">
|
||||
<field name="name">HUF</field>
|
||||
<field name="symbol">Ft</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateHUF" model="res.currency.rate">
|
||||
<field name="rate">271.5621</field>
|
||||
<field name="currency_id" ref="HUF"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="IDR" model="res.currency">
|
||||
<field name="name">IDR</field>
|
||||
<field name="symbol">Rp</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateIDR1" model="res.currency.rate">
|
||||
<field name="rate">14352.00</field>
|
||||
<field name="currency_id" ref="IDR"/>
|
||||
<field eval="time.strftime('2009-01-01')" name="name"/>
|
||||
</record>
|
||||
<record id="rateIDR" model="res.currency.rate">
|
||||
<field name="rate">11796.39</field>
|
||||
<field name="currency_id" ref="IDR"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="LVL" model="res.currency">
|
||||
<field name="name">LVL</field>
|
||||
<field name="symbol">Ls</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateLVL" model="res.currency.rate">
|
||||
<field name="rate">0.7086</field>
|
||||
<field name="currency_id" ref="LVL"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="NOK" model="res.currency">
|
||||
<field name="name">NOK</field>
|
||||
<field name="symbol">kr</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateNOK" model="res.currency.rate">
|
||||
<field name="rate">7.8668</field>
|
||||
<field name="currency_id" ref="NOK"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="XPF" model="res.currency">
|
||||
<field name="name">XPF</field>
|
||||
<field name="symbol">XPF</field>
|
||||
<field name="rounding">1.00</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateXPF" model="res.currency.rate">
|
||||
<field name="rate">119.331742</field>
|
||||
<field name="currency_id" ref="XPF"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="PAB" model="res.currency">
|
||||
<field name="name">PAB</field>
|
||||
<field name="symbol">B/.</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="ratePAB" model="res.currency.rate">
|
||||
<field name="rate">1.2676</field>
|
||||
<field name="currency_id" ref="PAB"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="PLN" model="res.currency">
|
||||
<field name="name">PLN</field>
|
||||
<field name="symbol">zł</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="ratePLN" model="res.currency.rate">
|
||||
<field name="rate">4.1005</field>
|
||||
<field name="currency_id" ref="PLN"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="SEK" model="res.currency">
|
||||
<field name="name">SEK</field>
|
||||
<field name="symbol">kr</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateSEK" model="res.currency.rate">
|
||||
<field name="rate">10.3004</field>
|
||||
<field name="currency_id" ref="SEK"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="GBP" model="res.currency">
|
||||
<field name="name">GBP</field>
|
||||
<field name="symbol">£</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateGBP" model="res.currency.rate">
|
||||
<field name="rate">0.8333</field>
|
||||
<field name="currency_id" ref="GBP"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="ARS" model="res.currency">
|
||||
<field name="name">ARS</field>
|
||||
<field name="symbol">$</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateARS" model="res.currency.rate">
|
||||
<field name="rate">5.0881</field>
|
||||
<field name="currency_id" ref="ARS"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="INR" model="res.currency">
|
||||
<field name="name">INR</field>
|
||||
<field name="symbol">₹</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateINR" model="res.currency.rate">
|
||||
<field name="rate">59.9739</field>
|
||||
<field name="currency_id" ref="INR"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="AUD" model="res.currency">
|
||||
<field name="name">AUD</field>
|
||||
<field name="symbol">$</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateAUD" model="res.currency.rate">
|
||||
<field name="rate">1.4070</field>
|
||||
<field name="currency_id" ref="AUD"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="UAH" model="res.currency">
|
||||
<field name="name">UAH</field>
|
||||
<field name="symbol">₴</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateUAH" model="res.currency.rate">
|
||||
<field name="rate">10.1969</field>
|
||||
<field name="currency_id" ref="UAH"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="VND" model="res.currency">
|
||||
<field name="name">VND</field>
|
||||
<field name="symbol">₫</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateVND" model="res.currency.rate">
|
||||
<field name="rate">26330.01</field>
|
||||
<field name="currency_id" ref="VND"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="HKD" model="res.currency">
|
||||
<field name="name">HKD</field>
|
||||
<field name="symbol">$</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateHKD" model="res.currency.rate">
|
||||
<field name="rate">11.1608</field>
|
||||
<field name="currency_id" ref="HKD"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="JPY" model="res.currency">
|
||||
<field name="name">JPY</field>
|
||||
<field name="symbol">¥</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateJPY" model="res.currency.rate">
|
||||
<field name="rate">133.62</field>
|
||||
<field name="currency_id" ref="JPY"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="BGN" model="res.currency">
|
||||
<field name="name">BGN</field>
|
||||
<field name="symbol">лв</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateBGN" model="res.currency.rate">
|
||||
<field name="rate">1.9558</field>
|
||||
<field name="currency_id" ref="BGN"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="LTL" model="res.currency">
|
||||
<field name="name">LTL</field>
|
||||
<field name="symbol">Lt</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateLTL" model="res.currency.rate">
|
||||
<field name="rate">3.4528</field>
|
||||
<field name="currency_id" ref="LTL"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="RON" model="res.currency">
|
||||
<field name="name">RON</field>
|
||||
<field name="symbol">lei</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateRON" model="res.currency.rate">
|
||||
<field name="rate">4.2253</field>
|
||||
<field name="currency_id" ref="RON"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="HRK" model="res.currency">
|
||||
<field name="name">HRK</field>
|
||||
<field name="symbol">kn</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateHRK" model="res.currency.rate">
|
||||
<field name="rate">7.2936</field>
|
||||
<field name="currency_id" ref="HRK"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="RUB" model="res.currency">
|
||||
<field name="name">RUB</field>
|
||||
<field name="symbol">руб</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateRUB" model="res.currency.rate">
|
||||
<field name="rate">43.16</field>
|
||||
<field name="currency_id" ref="RUB"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="TRY" model="res.currency">
|
||||
<field name="name">TRY</field>
|
||||
<field name="symbol">TL</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateTRY" model="res.currency.rate">
|
||||
<field name="rate">2.1411</field>
|
||||
<field name="currency_id" ref="TRY"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="KRW" model="res.currency">
|
||||
<field name="name">KRW</field>
|
||||
<field name="symbol">₩</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateKRW" model="res.currency.rate">
|
||||
<field name="rate">1662.37</field>
|
||||
<field name="currency_id" ref="KRW"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="MXN" model="res.currency">
|
||||
<field name="name">MXN</field>
|
||||
<field name="symbol">$</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateMXN" model="res.currency.rate">
|
||||
<field name="rate">18.6664</field>
|
||||
<field name="currency_id" ref="MXN"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="MYR" model="res.currency">
|
||||
<field name="name">MYR</field>
|
||||
<field name="symbol">RM</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateMYR" model="res.currency.rate">
|
||||
<field name="rate">4.8887</field>
|
||||
<field name="currency_id" ref="MYR"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="NZD" model="res.currency">
|
||||
<field name="name">NZD</field>
|
||||
<field name="symbol">$</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateNZD" model="res.currency.rate">
|
||||
<field name="rate">1.9764</field>
|
||||
<field name="currency_id" ref="NZD"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="PHP" model="res.currency">
|
||||
<field name="name">PHP</field>
|
||||
<field name="symbol">Php</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="ratePHP" model="res.currency.rate">
|
||||
<field name="rate">66.1</field>
|
||||
<field name="currency_id" ref="PHP"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="SGD" model="res.currency">
|
||||
<field name="name">SGD</field>
|
||||
<field name="symbol">$</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateSGD" model="res.currency.rate">
|
||||
<field name="rate">2.0126</field>
|
||||
<field name="currency_id" ref="SGD"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="THB" model="res.currency">
|
||||
<field name="name">THB</field>
|
||||
<field name="symbol">฿</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateTHB" model="res.currency.rate">
|
||||
<field name="rate">47.779</field>
|
||||
<field name="currency_id" ref="THB"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="ZAR" model="res.currency">
|
||||
<field name="name">ZAR</field>
|
||||
<field name="symbol">R</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateZAR" model="res.currency.rate">
|
||||
<field name="rate">10.5618</field>
|
||||
<field name="currency_id" ref="ZAR"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="res_bank_1" model="res.bank">
|
||||
<field name="name">International Bank</field>
|
||||
</record>
|
||||
|
||||
<record id="CRC" model="res.currency">
|
||||
<field name="name">CRC</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="symbol">¢</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateCRC" model="res.currency.rate">
|
||||
<field name="rate">691.3153</field>
|
||||
<field name="currency_id" ref="CRC"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="ir_mail_server_localhost0" model="ir.mail_server">
|
||||
<field name="name">localhost</field>
|
||||
<field name="smtp_host">localhost</field>
|
||||
<field eval="25" name="smtp_port"/>
|
||||
<field eval="10" name="sequence"/>
|
||||
</record>
|
||||
|
||||
<record id="MUR" model="res.currency">
|
||||
<field name="name">MUR</field>
|
||||
<field name="symbol">Rs</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateMUR" model="res.currency.rate">
|
||||
<field name="rate">40.28</field>
|
||||
<field name="currency_id" ref="MUR"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="XOF" model="res.currency">
|
||||
<field name="name">XOF</field>
|
||||
<field name="symbol">CFA</field>
|
||||
<field name="rounding">1</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateXOF" model="res.currency.rate">
|
||||
<field name="rate">655.957</field>
|
||||
<field name="currency_id" ref="XOF"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="XAF" model="res.currency">
|
||||
<field name="name">XAF</field>
|
||||
<field name="symbol">FCFA</field>
|
||||
<field name="rounding">1</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateXAF" model="res.currency.rate">
|
||||
<field name="rate">655.957</field>
|
||||
<field name="currency_id" ref="XAF"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="UGX" model="res.currency">
|
||||
<field name="name">UGX</field>
|
||||
<field name="symbol">USh</field>
|
||||
<field name="rounding">1</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateUGX" model="res.currency.rate">
|
||||
<field name="rate">3401.91388</field>
|
||||
<field name="currency_id" ref="UGX"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<record id="HNL" model="res.currency">
|
||||
<field name="name">HNL</field>
|
||||
<field name="symbol">L</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateHNL" model="res.currency.rate">
|
||||
<field name="rate">25</field>
|
||||
<field name="currency_id" ref="HNL"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<!-- Chilean peso -->
|
||||
<record id="CLP" model="res.currency">
|
||||
<field name="name">CLP</field>
|
||||
<field name="symbol">$</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateCLP" model="res.currency.rate">
|
||||
<field name="rate">710</field>
|
||||
<field name="currency_id" ref="CLP"/>
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
</record>
|
||||
|
||||
<!-- Uruguayan peso -->
|
||||
<record id="UYU" model="res.currency">
|
||||
<field name="name">UYU</field>
|
||||
<field name="symbol">$</field>
|
||||
<field name="rounding">0.01</field>
|
||||
<field name="accuracy">4</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
</record>
|
||||
<record id="rateUYU" model="res.currency.rate">
|
||||
<field name="currency_id" ref="UYU" />
|
||||
<field eval="time.strftime('%Y-01-01')" name="name"/>
|
||||
<field name="rate">28.36</field>
|
||||
</record>
|
||||
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
<record id="partner_demo" model="res.partner">
|
||||
<field name="name">Demo User</field>
|
||||
<field name="company_id" ref="main_company"/>
|
||||
<field name="customer" eval="False"/>
|
||||
</record>
|
||||
<record id="user_demo" model="res.users">
|
||||
<field name="partner_id" ref="base.partner_demo"/>
|
||||
<field name="login">demo</field>
|
||||
<field name="password">demo</field>
|
||||
<field name="name">Demo User</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')])]"/>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
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-08-28 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:37+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\n"
|
||||
"X-Poedit-Language: Czech\n"
|
||||
|
||||
#. module: base
|
||||
|
||||
@@ -14,8 +14,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-08-28 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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-08-28 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -9,8 +9,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-08-28 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\n"
|
||||
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
|
||||
"X-Poedit-Language: Persian\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-08-28 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\n"
|
||||
"Language: hr\n"
|
||||
|
||||
#. module: base
|
||||
|
||||
@@ -14,8 +14,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-08-28 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
@@ -921,7 +921,7 @@ msgid ""
|
||||
"The module adds google contact in partner address and add google calendar "
|
||||
"events details in Meeting"
|
||||
msgstr ""
|
||||
"Deze module voegt Google contact[ersonen in relatie adressen en voegt Google "
|
||||
"Deze module voegt Google contactersonen in relatie adressen en voegt Google "
|
||||
"agenda items details in OpenERP agenda."
|
||||
|
||||
#. module: base
|
||||
@@ -942,6 +942,15 @@ msgid ""
|
||||
"delete on objects and can check logs.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Met deze module heeft de administrator de mogelijkheid om iedere gebruikers "
|
||||
"handeling op alle objecten in het systeem te volgen.\n"
|
||||
"============================================================================="
|
||||
"=======================\n"
|
||||
"\n"
|
||||
"De administrator kan regels voor lezen, schrijven en verwijderen definiëren "
|
||||
"en logs hiervan bekijken\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:res.partner.category,name:base.res_partner_category_4
|
||||
@@ -2482,6 +2491,18 @@ msgid ""
|
||||
"and categorize your interventions with a channel and a priority level.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Helpdesk management.\n"
|
||||
"===================\n"
|
||||
"\n"
|
||||
"Net als administratie en verwerking van claims is de Helpdesk en "
|
||||
"ondersteuning tool, een goed instrument\n"
|
||||
"om uw acties vast te leggen. Dit menu is meer aangepast aan de mondelinge "
|
||||
"communicatie,\n"
|
||||
"die niet noodzakelijkerwijs verband houden met een claim. Selecteer een "
|
||||
"klant, voeg notities toe\n"
|
||||
"en deel uw acties in.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: sql_constraint:ir.ui.view_sc:0
|
||||
@@ -2542,6 +2563,11 @@ msgid ""
|
||||
"\n"
|
||||
"Configure servers and trigger synchronization with its database objects.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Synchronisatie van objecten.\n"
|
||||
"=======================\n"
|
||||
"Configureer servers and trigger database synchronisatie van de database "
|
||||
"objecten.\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.mg
|
||||
@@ -7548,6 +7574,14 @@ msgid ""
|
||||
"that exceeds minimum amount set by configuration wizard.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Dubbele controle voor inkopen, welke een minimum bedrag overstijgen.\n"
|
||||
"==========================================================\n"
|
||||
"\n"
|
||||
"Deze module past de inkoop workflow aan, zodat inkopen, welke een \n"
|
||||
"minimum bedrag overstijgen moeten worden gecontroleerd. Dit kan worden\n"
|
||||
"ingesteld in de configuratie wizard.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: field:res.currency,rounding:0
|
||||
@@ -10556,6 +10590,11 @@ msgid ""
|
||||
"\n"
|
||||
"Adds a Claim link to the delivery order.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Maak een claim van een uitgaande levering.\n"
|
||||
"===================================\n"
|
||||
"\n"
|
||||
"Voegt claim link toe aan een uitgaande order.\n"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.model:0
|
||||
@@ -11772,6 +11811,13 @@ msgid ""
|
||||
"the invoicing wizard if the delivery is to be invoiced.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Factuur wizard bij levering.\n"
|
||||
"======================\n"
|
||||
"\n"
|
||||
"Deze module start de factuur wizard, direct na het verzamelen van een\n"
|
||||
"inkomende of uitgaande levering en deze levering moet worden gefactureerd.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: code:addons/orm.py:1388
|
||||
@@ -13330,6 +13376,13 @@ msgid ""
|
||||
"marketing_campaign.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Demo data voor de module marketing_campaign.\n"
|
||||
"========================================\n"
|
||||
"\n"
|
||||
"maakt demo data aan, zoals leads, campagnes en segmenten voor de module "
|
||||
"marketing_campaign.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.actions.act_window.view,view_mode:0
|
||||
@@ -13962,6 +14015,17 @@ msgid ""
|
||||
"\n"
|
||||
"Used, for example, in food industries."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Traceer verschillende datums van producten and productie partijen.\n"
|
||||
"=======================================================\n"
|
||||
"\n"
|
||||
"de volgende datums kunnen worden getraceerd:\n"
|
||||
" - THT datum\n"
|
||||
" - Te gebruiken voor datum\n"
|
||||
" - verwijder datum\n"
|
||||
" - waarschuwing datum\n"
|
||||
"\n"
|
||||
"Wordt bijvoorbeeld gebruikt in de voedingsmiddelen industrie."
|
||||
|
||||
#. module: base
|
||||
#: field:ir.exports.line,export_id: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-08-28 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\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-08-28 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 15864)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-05 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build 15901)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
||||
@@ -556,29 +556,6 @@
|
||||
|
||||
<menuitem action="ir_action_wizard" id="menu_ir_action_wizard" parent="base.next_id_6"/>
|
||||
|
||||
<!-- Needaction mechanism -->
|
||||
<record model="ir.ui.view" id="view_ir_needaction_users_rel_tree">
|
||||
<field name="name">ir.needaction_users_rel.tree</field>
|
||||
<field name="model">ir.needaction_users_rel</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Subscription">
|
||||
<field name="user_id"/>
|
||||
<field name="res_model"/>
|
||||
<field name="res_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_view_needaction_users_rel" model="ir.actions.act_window">
|
||||
<field name="name">Need action relationships</field>
|
||||
<field name="res_model">ir.needaction_users_rel</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_needaction_users_rel" name="Need actions" parent="base.menu_users" sequence="20" action="action_view_needaction_users_rel" groups="base.group_no_one"/>
|
||||
|
||||
|
||||
<!-- View -->
|
||||
<record id="view_view_form" model="ir.ui.view">
|
||||
<field name="name">ir.ui.view</field>
|
||||
@@ -599,8 +576,15 @@
|
||||
<field name="xml_id"/>
|
||||
</group>
|
||||
</group>
|
||||
<field name="arch"/>
|
||||
</sheet>
|
||||
<notebook>
|
||||
<page string="Architecture">
|
||||
<field name="arch"/>
|
||||
</page>
|
||||
<page string="Groups">
|
||||
<field name="groups_id"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
@@ -1173,6 +1157,7 @@
|
||||
<filter icon="terp-gdu-smart-failing"
|
||||
string="Untranslated"
|
||||
domain="['|',('value', '=', False),('value','=','')]"/>
|
||||
<field name="name" operator="="/>
|
||||
<field name="lang"/>
|
||||
<field name="src"/>
|
||||
<field name="value"/>
|
||||
@@ -1213,12 +1198,12 @@
|
||||
<field name="name">Translations</field>
|
||||
<field name="model">ir.translation</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Translations">
|
||||
<field name="src"/>
|
||||
<tree string="Translations" editable="bottom">
|
||||
<field name="src" readonly="True"/>
|
||||
<field name="value"/>
|
||||
<field name="name"/>
|
||||
<field name="lang"/>
|
||||
<field name="type"/>
|
||||
<field name="name" readonly="True"/>
|
||||
<field name="lang" readonly="True"/>
|
||||
<field name="type" readonly="True"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -44,7 +44,7 @@ class actions(osv.osv):
|
||||
_table = 'ir_actions'
|
||||
_order = 'name'
|
||||
_columns = {
|
||||
'name': fields.char('Action Name', required=True, size=64),
|
||||
'name': fields.char('Name', size=64, required=True),
|
||||
'type': fields.char('Action Type', required=True, size=32,readonly=True),
|
||||
'usage': fields.char('Action Usage', size=32),
|
||||
}
|
||||
@@ -861,11 +861,10 @@ class act_client(osv.osv):
|
||||
_order = 'name'
|
||||
|
||||
def _get_params(self, cr, uid, ids, field_name, arg, context):
|
||||
return dict([
|
||||
((record.id, ast.literal_eval(record.params_store))
|
||||
if record.params_store else (record.id, False))
|
||||
for record in self.browse(cr, uid, ids, context=context)
|
||||
])
|
||||
result = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
result[record.id] = record.params_store and eval(record.params_store, {'uid': uid}) or False
|
||||
return result
|
||||
|
||||
def _set_params(self, cr, uid, id, field_name, field_value, arg, context):
|
||||
if isinstance(field_value, dict):
|
||||
@@ -874,10 +873,15 @@ class act_client(osv.osv):
|
||||
self.write(cr, uid, id, {'params_store': field_value}, context=context)
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Action Name', required=True, size=64, translate=True),
|
||||
'tag': fields.char('Client action tag', size=64, required=True,
|
||||
help="An arbitrary string, interpreted by the client"
|
||||
" according to its own needs and wishes. There "
|
||||
"is no central tag repository across clients."),
|
||||
'res_model': fields.char('Destination Model', size=64,
|
||||
help="Optional model, mostly used for needactions."),
|
||||
'context': fields.char('Context Value', size=250, required=True,
|
||||
help="Context dictionary as Python expression, empty by default (Default: {})"),
|
||||
'params': fields.function(_get_params, fnct_inv=_set_params,
|
||||
type='binary',
|
||||
string="Supplementary arguments",
|
||||
@@ -887,6 +891,7 @@ class act_client(osv.osv):
|
||||
}
|
||||
_defaults = {
|
||||
'type': 'ir.actions.client',
|
||||
'context': '{}',
|
||||
|
||||
}
|
||||
act_client()
|
||||
|
||||
@@ -19,180 +19,45 @@
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import openerp.pooler as pooler
|
||||
from operator import itemgetter
|
||||
from osv import osv, fields
|
||||
from tools.translate import _
|
||||
from osv import osv
|
||||
|
||||
class ir_needaction_users_rel(osv.Model):
|
||||
''' ir_needaction_users_rel holds data related to the needaction
|
||||
mechanism inside OpenERP. A row in this model is characterized
|
||||
by:
|
||||
- res_model: model of the record requiring an action
|
||||
- res_id: ID of the record requiring an action
|
||||
- user_id: foreign key to the res.users table, to the user that has to
|
||||
perform the action
|
||||
This model can be seen as a many2many, linking (res_model, res_id) to users
|
||||
(those whose attention is required on the record). '''
|
||||
|
||||
_name = 'ir.needaction_users_rel'
|
||||
_description = 'Needaction relationship table'
|
||||
_rec_name = 'id'
|
||||
_order = 'id desc'
|
||||
_columns = {
|
||||
'res_model': fields.char('Related Document Model', size=128,
|
||||
select=1, required=True),
|
||||
'res_id': fields.integer('Related Document ID',
|
||||
select=1, required=True),
|
||||
'user_id': fields.many2one('res.users', string='Related User',
|
||||
ondelete='cascade', select=1, required=True),
|
||||
}
|
||||
|
||||
def _get_users(self, cr, uid, res_ids, res_model, context=None):
|
||||
"""Given res_ids of res_model, get user_ids present in table"""
|
||||
rel_ids = self.search(cr, uid, [('res_model', '=', res_model), ('res_id', 'in', res_ids)], context=context)
|
||||
return list(set(map(itemgetter('user_id'), self.read(cr, uid, rel_ids, ['user_id'], context=context))))
|
||||
|
||||
def create_users(self, cr, uid, res_ids, res_model, user_ids, context=None):
|
||||
"""Given res_ids of res_model, add user_ids to the relationship table"""
|
||||
for res_id in res_ids:
|
||||
for user_id in user_ids:
|
||||
self.create(cr, uid, {'res_model': res_model, 'res_id': res_id, 'user_id': user_id}, context=context)
|
||||
return True
|
||||
|
||||
def unlink_users(self, cr, uid, res_ids, res_model, context=None):
|
||||
"""Given res_ids of res_model, delete all entries in the relationship table"""
|
||||
to_del_ids = self.search(cr, uid, [('res_model', '=', res_model), ('res_id', 'in', res_ids)], context=context)
|
||||
return self.unlink(cr, uid, to_del_ids, context=context)
|
||||
|
||||
def update_users(self, cr, uid, res_ids, res_model, user_ids, context=None):
|
||||
"""Given res_ids of res_model, update their entries in the relationship table to user_ids"""
|
||||
# read current records
|
||||
cur_users = self._get_users(cr, uid, res_ids, res_model, context=context)
|
||||
if len(cur_users) == len(user_ids) and all(cur_user in user_ids for cur_user in cur_users):
|
||||
return True
|
||||
# unlink old records
|
||||
self.unlink_users(cr, uid, res_ids, res_model, context=context)
|
||||
# link new records
|
||||
self.create_users(cr, uid, res_ids, res_model, user_ids, context=context)
|
||||
return True
|
||||
|
||||
|
||||
class ir_needaction_mixin(osv.Model):
|
||||
class ir_needaction_mixin(osv.AbstractModel):
|
||||
'''Mixin class for objects using the need action feature.
|
||||
|
||||
Need action feature can be used by objects having to be able to
|
||||
signal that an action is required on a particular record. If in
|
||||
the business logic an action must be performed by somebody, for
|
||||
instance validation by a manager, this mechanism allows to set a
|
||||
|
||||
Need action feature can be used by models that have to be able to
|
||||
signal that an action is required on a particular record. If in
|
||||
the business logic an action must be performed by somebody, for
|
||||
instance validation by a manager, this mechanism allows to set a
|
||||
list of users asked to perform an action.
|
||||
|
||||
This class wraps a class (ir.ir_needaction_users_rel) that
|
||||
behaves like a many2many field. This class handles the low-level
|
||||
considerations of updating relationships. Every change made on
|
||||
the record calls a method that updates the relationships.
|
||||
|
||||
Objects using the 'need_action' feature should override the
|
||||
``get_needaction_user_ids`` method. This methods returns a
|
||||
dictionary whose keys are record ids, and values a list of user
|
||||
ids, like in a many2many relationship. Therefore by defining
|
||||
only one method, you can specify if an action is required by
|
||||
defining the users that have to do it, in every possible
|
||||
situation.
|
||||
|
||||
This class also offers several global services:
|
||||
- ``needaction_get_record_ids``: for the current model and uid, get
|
||||
all record ids that ask this user to perform an action. This
|
||||
mechanism is used for instance to display the number of pending
|
||||
actions in menus, such as Leads (12)
|
||||
- ``needaction_get_action_count``: as ``needaction_get_record_ids``
|
||||
but returns only the number of action, not the ids (performs a
|
||||
search with count=True)
|
||||
|
||||
The ``ir_needaction_mixin`` class adds a calculated field
|
||||
``needaction_pending``. This function field allows to state
|
||||
whether a given record has a needaction for the current user.
|
||||
This is usefull if you want to customize views according to the
|
||||
needaction feature. For example, you may want to set records in
|
||||
bold in a list view if the current user has an action to perform
|
||||
on the record. '''
|
||||
|
||||
Models using the 'need_action' feature should override the
|
||||
``_needaction_domain_get`` method. This method returns a
|
||||
domain to filter records requiring an action for a specific user.
|
||||
|
||||
This class also offers several global services:
|
||||
- ``_needaction_count``: returns the number of actions uid has to perform
|
||||
'''
|
||||
|
||||
_name = 'ir.needaction_mixin'
|
||||
_description = 'Need action mixin'
|
||||
|
||||
def get_needaction_pending(self, cr, uid, ids, name, arg, context=None):
|
||||
res = {}
|
||||
needaction_user_ids = self.get_needaction_user_ids(cr, uid, ids, context=context)
|
||||
for id in ids:
|
||||
res[id] = uid in needaction_user_ids[id]
|
||||
return res
|
||||
_needaction = True
|
||||
|
||||
def search_needaction_pending(self, cr, uid, self_again, field_name, criterion, context=None):
|
||||
ids = self.needaction_get_record_ids(
|
||||
cr, uid, uid, limit=1024, context=context)
|
||||
return [('id', 'in', ids)]
|
||||
|
||||
_columns = {
|
||||
'needaction_pending': fields.function(
|
||||
get_needaction_pending, type='boolean',
|
||||
fnct_search=search_needaction_pending,
|
||||
string='Need action pending',
|
||||
help="If True, this field states that users have to perform an " \
|
||||
"action This field comes from the ir.needaction_mixin class."),
|
||||
}
|
||||
|
||||
#------------------------------------------------------
|
||||
# Addon API
|
||||
# Addons API
|
||||
#------------------------------------------------------
|
||||
|
||||
def get_needaction_user_ids(self, cr, uid, ids, context=None):
|
||||
""" Returns the user_ids that have to perform an action
|
||||
:return: dict { record_id: [user_ids], }
|
||||
|
||||
def _needaction_domain_get(self, cr, uid, context=None):
|
||||
""" Returns the domain to filter records that require an action
|
||||
:return: domain or False is no action
|
||||
"""
|
||||
return dict((id,list()) for id in ids)
|
||||
|
||||
def create(self, cr, uid, values, context=None):
|
||||
rel_obj = self.pool.get('ir.needaction_users_rel')
|
||||
# perform create
|
||||
obj_id = super(ir_needaction_mixin, self).create(cr, uid, values, context=context)
|
||||
# link user_ids
|
||||
needaction_user_ids = self.get_needaction_user_ids(cr, uid, [obj_id], context=context)
|
||||
rel_obj.create_users(cr, uid, [obj_id], self._name, needaction_user_ids[obj_id], context=context)
|
||||
return obj_id
|
||||
|
||||
def write(self, cr, uid, ids, values, context=None):
|
||||
rel_obj = self.pool.get('ir.needaction_users_rel')
|
||||
# perform write
|
||||
write_res = super(ir_needaction_mixin, self).write(cr, uid, ids, values, context=context)
|
||||
# get and update user_ids
|
||||
needaction_user_ids = self.get_needaction_user_ids(cr, uid, ids, context=context)
|
||||
for id in ids:
|
||||
rel_obj.update_users(cr, uid, [id], self._name, needaction_user_ids[id], context=context)
|
||||
return write_res
|
||||
|
||||
def unlink(self, cr, uid, ids, context=None):
|
||||
# unlink user_ids
|
||||
rel_obj = self.pool.get('ir.needaction_users_rel')
|
||||
rel_obj.unlink_users(cr, uid, ids, self._name, context=context)
|
||||
# perform unlink
|
||||
return super(ir_needaction_mixin, self).unlink(cr, uid, ids, context=context)
|
||||
|
||||
return False
|
||||
|
||||
#------------------------------------------------------
|
||||
# "Need action" API
|
||||
#------------------------------------------------------
|
||||
|
||||
def needaction_get_record_ids(self, cr, uid, user_id, limit=80, context=None):
|
||||
"""Given the current model and a user_id
|
||||
return the record ids that require the user to perform an
|
||||
action"""
|
||||
rel_obj = self.pool.get('ir.needaction_users_rel')
|
||||
rel_ids = rel_obj.search(cr, uid, [('res_model', '=', self._name), ('user_id', '=', user_id)], limit=limit, context=context)
|
||||
return map(itemgetter('res_id'), rel_obj.read(cr, uid, rel_ids, ['res_id'], context=context))
|
||||
|
||||
def needaction_get_action_count(self, cr, uid, user_id, limit=80, context=None):
|
||||
"""Given the current model and a user_id
|
||||
get the number of actions it has to perform"""
|
||||
rel_obj = self.pool.get('ir.needaction_users_rel')
|
||||
return rel_obj.search(cr, uid, [('res_model', '=', self._name), ('user_id', '=', user_id)], limit=limit, count=True, context=context)
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
def _needaction_count(self, cr, uid, domain=[], context=None):
|
||||
""" Get the number of actions uid has to perform. """
|
||||
dom = self._needaction_domain_get(cr, uid, context=context)
|
||||
if not dom:
|
||||
return 0
|
||||
return self.search(cr, uid, (domain or []) +dom, context=context, count=True)
|
||||
|
||||
@@ -210,7 +210,7 @@ class ir_sequence(openerp.osv.osv.osv):
|
||||
|
||||
def next_by_id(self, cr, uid, sequence_id, context=None):
|
||||
""" Draw an interpolated string using the specified sequence."""
|
||||
self.check_read(cr, uid)
|
||||
self.check_access_rights(cr, uid, 'read')
|
||||
company_ids = self.pool.get('res.company').search(cr, uid, [], order='company_id', context=context) + [False]
|
||||
ids = self.search(cr, uid, ['&',('id','=', sequence_id),('company_id','in',company_ids)])
|
||||
return self._next(cr, uid, ids, context)
|
||||
@@ -227,7 +227,7 @@ class ir_sequence(openerp.osv.osv.osv):
|
||||
sequence selection. A matching sequence for that
|
||||
specific company will get higher priority.
|
||||
"""
|
||||
self.check_read(cr, uid)
|
||||
self.check_access_rights(cr, uid, 'read')
|
||||
company_ids = self.pool.get('res.company').search(cr, uid, [], order='company_id', context=context) + [False]
|
||||
ids = self.search(cr, uid, ['&',('code','=', sequence_code),('company_id','in',company_ids)])
|
||||
return self._next(cr, uid, ids, context)
|
||||
|
||||
@@ -328,6 +328,52 @@ class ir_translation(osv.osv):
|
||||
result = super(ir_translation, self).unlink(cursor, user, ids, context=context)
|
||||
return result
|
||||
|
||||
def translate_fields(self, cr, uid, model, id, field=None, context=None):
|
||||
trans_model = self.pool.get(model)
|
||||
domain = ['&', ('res_id', '=', id), ('name', '=like', model + ',%')]
|
||||
langs_ids = self.pool.get('res.lang').search(cr, uid, [('code', '!=', 'en_US')], context=context)
|
||||
langs = [lg.code for lg in self.pool.get('res.lang').browse(cr, uid, langs_ids, context=context)]
|
||||
main_lang = 'en_US'
|
||||
translatable_fields = []
|
||||
for f, info in trans_model._all_columns.items():
|
||||
if info.column.translate:
|
||||
if info.parent_model:
|
||||
parent_id = trans_model.read(cr, uid, [id], [info.parent_column], context=context)[0][info.parent_column][0]
|
||||
translatable_fields.append({ 'name': f, 'id': parent_id, 'model': info.parent_model })
|
||||
domain.insert(0, '|')
|
||||
domain.extend(['&', ('res_id', '=', parent_id), ('name', '=', "%s,%s" % (info.parent_model, f))])
|
||||
else:
|
||||
translatable_fields.append({ 'name': f, 'id': id, 'model': model })
|
||||
if len(langs):
|
||||
fields = [f.get('name') for f in translatable_fields]
|
||||
record = trans_model.read(cr, uid, [id], fields, context={ 'lang': main_lang })[0]
|
||||
for lg in langs:
|
||||
for f in translatable_fields:
|
||||
# Check if record exists, else create it (at once)
|
||||
sql = """INSERT INTO ir_translation (lang, src, name, type, res_id, value)
|
||||
SELECT %s, %s, %s, 'model', %s, %s WHERE NOT EXISTS
|
||||
(SELECT 1 FROM ir_translation WHERE lang=%s AND name=%s AND res_id=%s AND type='model');
|
||||
UPDATE ir_translation SET src = %s WHERE lang=%s AND name=%s AND res_id=%s AND type='model';
|
||||
"""
|
||||
src = record[f['name']] or None
|
||||
name = "%s,%s" % (f['model'], f['name'])
|
||||
cr.execute(sql, (lg, src , name, f['id'], src, lg, name, f['id'], src, lg, name, id))
|
||||
|
||||
action = {
|
||||
'name': 'Translate',
|
||||
'res_model': 'ir.translation',
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree,form',
|
||||
'domain': domain,
|
||||
}
|
||||
if field:
|
||||
info = trans_model._all_columns[field]
|
||||
action['context'] = {
|
||||
'search_default_name': "%s,%s" % (info.parent_model or model, field)
|
||||
}
|
||||
return action
|
||||
|
||||
def _get_import_cursor(self, cr, uid, context=None):
|
||||
""" Return a cursor-like object for fast inserting translations
|
||||
"""
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
import base64
|
||||
import re
|
||||
import threading
|
||||
|
||||
from tools.safe_eval import safe_eval as eval
|
||||
import tools
|
||||
import openerp.modules
|
||||
from osv import fields, osv
|
||||
@@ -256,23 +256,24 @@ class ir_ui_menu(osv.osv):
|
||||
|
||||
return res
|
||||
|
||||
def _get_needaction_info(self, cr, uid, id, domain=[], context={}):
|
||||
return [False, 0]
|
||||
|
||||
def _get_needaction(self, cr, uid, ids, field_names, args, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
res = {}
|
||||
for menu in self.browse(cr, uid, ids, context=context):
|
||||
res[menu.id] = {}
|
||||
if menu.action and menu.action.type == 'ir.actions.act_window' and menu.action.res_model:
|
||||
menu_needaction_res = self.pool.get(menu.action.res_model)._get_needaction_info(cr, uid, uid, domain=menu.action.domain, context=context)
|
||||
else:
|
||||
menu_needaction_res = [False, 0]
|
||||
res[menu.id]['needaction_enabled'] = menu_needaction_res[0]
|
||||
res[menu.id]['needaction_counter'] = menu_needaction_res[1]
|
||||
res[menu.id] = {
|
||||
'needaction_enabled': False,
|
||||
'needaction_counter': False,
|
||||
}
|
||||
if menu.action and menu.action.type in ('ir.actions.act_window','ir.actions.client') and menu.action.res_model:
|
||||
obj = self.pool.get(menu.action.res_model)
|
||||
if obj._needaction:
|
||||
if menu.action.type=='ir.actions.act_window':
|
||||
dom = menu.action.domain and eval(menu.action.domain, {'uid': uid}) or []
|
||||
else:
|
||||
dom = eval(menu.action.params_store or '{}', {'uid': uid}).get('domain')
|
||||
res[menu.id]['needaction_enabled'] = obj._needaction
|
||||
res[menu.id]['needaction_counter'] = obj._needaction_count(cr, uid, dom, context=context)
|
||||
return res
|
||||
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Menu', size=64, required=True, translate=True),
|
||||
'sequence': fields.integer('Sequence'),
|
||||
|
||||
@@ -78,6 +78,8 @@ class view(osv.osv):
|
||||
'field_parent': fields.char('Child Field',size=64),
|
||||
'xml_id': fields.function(osv.osv.get_xml_id, type='char', size=128, string="External ID",
|
||||
help="ID of the view defined in xml file"),
|
||||
'groups_id': fields.many2many('res.groups', 'ir_ui_view_group_rel', 'view_id', 'group_id',
|
||||
string='Groups', help="If this field is empty, the view applies to all users. Otherwise, the view applies to the users of those groups only."),
|
||||
}
|
||||
_defaults = {
|
||||
'arch': '<?xml version="1.0"?>\n<tree string="My view">\n\t<field name="name"/>\n</tree>',
|
||||
@@ -167,20 +169,25 @@ class view(osv.osv):
|
||||
:rtype: list of tuples
|
||||
:return: [(view_arch,view_id), ...]
|
||||
"""
|
||||
user_groups = frozenset(self.pool.get('res.users').browse(cr, 1, uid, context).groups_id)
|
||||
if self.pool._init:
|
||||
# Module init currently in progress, only consider views from modules whose code was already loaded
|
||||
query = """SELECT v.arch, v.id FROM ir_ui_view v LEFT JOIN ir_model_data md ON (md.model = 'ir.ui.view' AND md.res_id = v.id)
|
||||
query = """SELECT v.id FROM ir_ui_view v LEFT JOIN ir_model_data md ON (md.model = 'ir.ui.view' AND md.res_id = v.id)
|
||||
WHERE v.inherit_id=%s AND v.model=%s AND md.module in %s
|
||||
ORDER BY priority"""
|
||||
query_params = (view_id, model, tuple(self.pool._init_modules))
|
||||
else:
|
||||
# Modules fully loaded, consider all views
|
||||
query = """SELECT v.arch, v.id FROM ir_ui_view v
|
||||
query = """SELECT v.id FROM ir_ui_view v
|
||||
WHERE v.inherit_id=%s AND v.model=%s
|
||||
ORDER BY priority"""
|
||||
query_params = (view_id, model)
|
||||
cr.execute(query, query_params)
|
||||
return cr.fetchall()
|
||||
view_ids = [v[0] for v in cr.fetchall()]
|
||||
# filter views based on user groups
|
||||
return [(view.arch, view.id)
|
||||
for view in self.browse(cr, 1, view_ids, context)
|
||||
if not (view.groups_id and user_groups.isdisjoint(view.groups_id))]
|
||||
|
||||
def write(self, cr, uid, ids, vals, context=None):
|
||||
if not isinstance(ids, (list, tuple)):
|
||||
|
||||
@@ -146,7 +146,12 @@ class res_company(osv.osv):
|
||||
if vat: val.append(_('TIN: ')+vat)
|
||||
if reg: val.append(_('Reg: ')+reg)
|
||||
return {'value': {'rml_footer1':' | '.join(val)}}
|
||||
|
||||
|
||||
def on_change_country(self, cr, uid, ids, country_id, context=None):
|
||||
currency_id = self._get_euro(cr, uid, context=context)
|
||||
if country_id:
|
||||
currency_id = self.pool.get('res.country').browse(cr, uid, country_id, context=context).currency_id.id
|
||||
return {'value': {'currency_id': currency_id}}
|
||||
|
||||
def _search(self, cr, uid, args, offset=0, limit=None, order=None,
|
||||
context=None, count=False, access_rights_uid=None):
|
||||
@@ -228,10 +233,9 @@ class res_company(osv.osv):
|
||||
return super(res_company, self).write(cr, *args, **argv)
|
||||
|
||||
def _get_euro(self, cr, uid, context=None):
|
||||
try:
|
||||
return self.pool.get('res.currency').search(cr, uid, [])[0]
|
||||
except:
|
||||
return False
|
||||
rate_obj = self.pool.get('res.currency.rate')
|
||||
rate_id = rate_obj.search(cr, uid, [('rate', '=', 1)], context=context)
|
||||
return rate_id and rate_obj.browse(cr, uid, rate_id[0], context=context).currency_id.id or False
|
||||
|
||||
def _get_logo(self, cr, uid, ids):
|
||||
return open(os.path.join( tools.config['root_path'], 'addons', 'base', 'res', 'res_company_logo.png'), 'rb') .read().encode('base64')
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
<field name="state_id" class="oe_no_button" placeholder="State" style="width: 24%%" options='{"no_open": true}'/>
|
||||
<field name="zip" placeholder="ZIP" style="width: 34%%"/>
|
||||
</div>
|
||||
<field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": true}'/>
|
||||
<field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": true}' on_change="on_change_country(country_id)"/>
|
||||
</div>
|
||||
<field name="website" widget="url" placeholder="e.g. www.openerp.com"/>
|
||||
</group>
|
||||
|
||||
@@ -55,6 +55,7 @@ addresses belonging to this country.\n\nYou can use the python-style string pate
|
||||
\n%(state_code)s: the code of the state
|
||||
\n%(country_name)s: the name of the country
|
||||
\n%(country_code)s: the code of the country"""),
|
||||
'currency_id': fields.many2one('res.currency', 'Currency'),
|
||||
}
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique (name)',
|
||||
|
||||
@@ -22,11 +22,17 @@
|
||||
<field name="model">res.country</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Country" version="7.0">
|
||||
<group col="4">
|
||||
<field name="name"/>
|
||||
<field name="code"/>
|
||||
<field name="address_format" colspan="4" groups="base.group_no_one"/>
|
||||
<group>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="currency_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="code"/>
|
||||
</group>
|
||||
</group>
|
||||
<label for="address_format" string="Address Format"/>
|
||||
<field name="address_format" colspan="4" groups="base.group_no_one"/>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -56,7 +56,7 @@ class res_currency(osv.osv):
|
||||
_columns = {
|
||||
# Note: 'code' column was removed as of v6.0, the 'name' should now hold the ISO code.
|
||||
'name': fields.char('Currency', size=32, required=True, help="Currency Code (ISO 4217)"),
|
||||
'symbol': fields.char('Symbol', size=3, help="Currency sign, to be used when printing amounts."),
|
||||
'symbol': fields.char('Symbol', size=4, help="Currency sign, to be used when printing amounts."),
|
||||
'rate': fields.function(_current_rate, string='Current Rate', digits=(12,6),
|
||||
help='The rate of the currency to the currency of rate 1.'),
|
||||
'rate_ids': fields.one2many('res.currency.rate', 'currency_id', 'Rates'),
|
||||
|
||||
@@ -215,6 +215,7 @@ class res_partner(osv.osv):
|
||||
"Use this field anywhere a small image is required."),
|
||||
'company_id': fields.many2one('res.company', 'Company', select=1),
|
||||
'color': fields.integer('Color Index'),
|
||||
'user_ids': fields.one2many('res.users', 'partner_id', 'Users'),
|
||||
'contact_address': fields.function(_address_display, type='char', string='Complete Address'),
|
||||
}
|
||||
|
||||
@@ -225,14 +226,16 @@ class res_partner(osv.osv):
|
||||
return [context['category_id']]
|
||||
return False
|
||||
|
||||
def _get_default_image(self, cr, uid, is_company, context=None):
|
||||
def _get_default_image(self, cr, uid, is_company, context=None, colorize=False):
|
||||
if is_company:
|
||||
image = open(openerp.modules.get_module_resource('base', 'static/src/img', 'company_image.png')).read()
|
||||
else:
|
||||
from PIL import Image
|
||||
from StringIO import StringIO
|
||||
from random import random
|
||||
color = (int(random() * 192 + 32), int(random() * 192 + 32), int(random() * 192 + 32))
|
||||
color = (255,255,255)
|
||||
if colorize:
|
||||
from random import random
|
||||
color = (int(random() * 192 + 32), int(random() * 192 + 32), int(random() * 192 + 32))
|
||||
face = Image.open(openerp.modules.get_module_resource('base', 'static/src/img', 'avatar.png'))
|
||||
avatar = Image.new('RGB', face.size)
|
||||
avatar.paste(color)
|
||||
@@ -240,7 +243,7 @@ class res_partner(osv.osv):
|
||||
buffer = StringIO()
|
||||
avatar.save(buffer, 'PNG')
|
||||
image = buffer.getvalue()
|
||||
return tools.image_resize_image_big(image.encode('base64'))
|
||||
return image.encode('base64')
|
||||
|
||||
_defaults = {
|
||||
'active': True,
|
||||
@@ -253,9 +256,7 @@ class res_partner(osv.osv):
|
||||
'is_company': False,
|
||||
'type': 'default',
|
||||
'use_parent_address': True,
|
||||
'image': lambda self, cr, uid, context: self._get_default_image(cr, uid, False, context),
|
||||
'image_small': lambda self, cr, uid, context: self._get_default_image(cr, uid, False, context),
|
||||
'image_medium': lambda self, cr, uid, context: self._get_default_image(cr, uid, False, context),
|
||||
'image': lambda self, cr, uid, context: self._get_default_image(cr, uid, context.get('default_is_company', False), context),
|
||||
}
|
||||
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
@@ -333,9 +334,6 @@ class res_partner(osv.osv):
|
||||
domain_siblings = [('parent_id', '=', vals['parent_id']), ('use_parent_address', '=', True)]
|
||||
update_ids = [vals['parent_id']] + self.search(cr, uid, domain_siblings, context=context)
|
||||
self.update_address(cr, uid, update_ids, vals, context)
|
||||
if 'image' not in vals :
|
||||
image_value = self._get_default_image(cr, uid, vals.get('is_company', False) or context.get('default_is_company'), context)
|
||||
vals.update(tools.image_get_resized_images(image_value, return_big=True))
|
||||
return super(res_partner,self).create(cr, uid, vals, context=context)
|
||||
|
||||
def update_address(self, cr, uid, ids, vals, context=None):
|
||||
@@ -360,37 +358,34 @@ class res_partner(osv.osv):
|
||||
res.append((record.id, name))
|
||||
return res
|
||||
|
||||
def _parse_partner_name(self, text, context=None):
|
||||
""" Supported syntax:
|
||||
- 'Raoul <raoul@grosbedon.fr>': will find name and email address
|
||||
- otherwise: default, everything is set as the name """
|
||||
match = re.search(r'([^\s,<@]+@[^>\s,]+)', text)
|
||||
if match:
|
||||
email = match.group(1)
|
||||
name = text[:text.index(email)].replace('"','').replace('<','').strip()
|
||||
else:
|
||||
name, email = text, ''
|
||||
return name, email
|
||||
|
||||
def name_create(self, cr, uid, name, context=None):
|
||||
""" Override of orm's name_create method for partners. The purpose is
|
||||
to handle some basic formats to create partners using the
|
||||
name_create.
|
||||
Supported syntax:
|
||||
- 'raoul@grosbedon.fr': create a partner with name raoul@grosbedon.fr
|
||||
and sets its email to raoul@grosbedon.fr
|
||||
- 'Raoul Grosbedon <raoul@grosbedon.fr>': create a partner with name
|
||||
Raoul Grosbedon, and set its email to raoul@grosbedon.fr
|
||||
- anything else: fall back on the default name_create
|
||||
Regex :
|
||||
- ([a-zA-Z0-9._%-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9._]{1,8}): raoul@grosbedon.fr
|
||||
- ([\w\s.\\-]+)[\<]([a-zA-Z0-9._%-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9._]{1,8})[\>]:
|
||||
Raoul Grosbedon, raoul@grosbedon.fr
|
||||
"""
|
||||
contact_regex = re.compile('([\w\s.\\-]+)[\<]([a-zA-Z0-9._%-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9._]{1,8})[\>]')
|
||||
email_regex = re.compile('([a-zA-Z0-9._%-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9._]{1,8})')
|
||||
contact_regex_res = contact_regex.findall(name)
|
||||
email_regex_res = email_regex.findall(name)
|
||||
if contact_regex_res:
|
||||
name = contact_regex_res[0][0].rstrip(' ') # remove extra spaces on the right
|
||||
email = contact_regex_res[0][1]
|
||||
rec_id = self.create(cr, uid, {self._rec_name: name, 'email': email}, context);
|
||||
return self.name_get(cr, uid, [rec_id], context)[0]
|
||||
elif email_regex_res:
|
||||
email = '%s' % (email_regex_res[0])
|
||||
rec_id = self.create(cr, uid, {self._rec_name: email, 'email': email}, context);
|
||||
return self.name_get(cr, uid, [rec_id], context)[0]
|
||||
else:
|
||||
rec_id = super(res_partner, self).create(cr, uid, {self._rec_name: name}, context)
|
||||
return self.name_get(cr, uid, [rec_id], context)[0]
|
||||
If only an email address is received and that the regex cannot find
|
||||
a name, the name will have the email value.
|
||||
If 'force_email' key in context: must find the email address. """
|
||||
if context is None:
|
||||
context = {}
|
||||
name, email = self._parse_partner_name(name, context=context)
|
||||
if context.get('force_email') and not email:
|
||||
raise osv.except_osv(_('Warning'), _("Couldn't create contact without email address !"))
|
||||
if not name and email:
|
||||
name = email
|
||||
rec_id = self.create(cr, uid, {self._rec_name: name or email, 'email': email or False}, context=context)
|
||||
return self.name_get(cr, uid, [rec_id], context)[0]
|
||||
|
||||
def name_search(self, cr, uid, name, args=None, operator='ilike', context=None, limit=100):
|
||||
if not args:
|
||||
@@ -414,6 +409,21 @@ class res_partner(osv.osv):
|
||||
return self.name_get(cr, uid, ids, context)
|
||||
return super(res_partner,self).name_search(cr, uid, name, args, operator=operator, context=context, limit=limit)
|
||||
|
||||
def find_or_create(self, cr, uid, email, context=None):
|
||||
""" Find a partner with the given ``email`` or use :py:method:`~.name_create`
|
||||
to create one
|
||||
|
||||
:param str email: email-like string, which should contain at least one email,
|
||||
e.g. ``"Raoul Grosbedon <r.g@grosbedon.fr>"``"""
|
||||
assert email, 'an email is required for find_or_create to work'
|
||||
emails = tools.email_split(email)
|
||||
if emails:
|
||||
email = emails[0]
|
||||
ids = self.search(cr, uid, [('email','ilike',email)], context=context)
|
||||
if not ids:
|
||||
return self.name_create(cr, uid, email, context=context)[0]
|
||||
return ids[0]
|
||||
|
||||
def _email_send(self, cr, uid, ids, email_from, subject, body, on_error=None):
|
||||
partners = self.browse(cr, uid, ids)
|
||||
for partner in partners:
|
||||
|
||||
@@ -130,8 +130,8 @@
|
||||
<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: 24%%" options='{"no_open": true}'/>
|
||||
<field name="zip" placeholder="ZIP" style="width: 34%%"/>
|
||||
<field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": true}'/>
|
||||
<field name="zip" placeholder="ZIP" style="width: 20%%"/>
|
||||
</div>
|
||||
<field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": true}'/>
|
||||
</div>
|
||||
@@ -186,13 +186,10 @@
|
||||
<td class="oe_kanban_title1" align="left" valign="middle">
|
||||
<h4><a type="open"><field name="name"/></a></h4>
|
||||
<i><div t-if="record.function.raw_value">
|
||||
<field name="function"/><br/></div></i>
|
||||
</td>
|
||||
<td valign="top" align="right">
|
||||
<a t-if="record.email.raw_value" title="Mail" t-att-href="'mailto:'+record.email.value" style="text-decoration: none;" >
|
||||
<img src="/web/static/src/img/icons/terp-mail-message-new.png" border="0" width="16" height="16"/>
|
||||
</a>
|
||||
|
||||
<field name="function"/></div></i>
|
||||
<div><a t-if="record.email.raw_value" title="Mail" t-att-href="'mailto:'+record.email.value">
|
||||
<field name="email"/>
|
||||
</a></div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -301,7 +298,7 @@
|
||||
<field name="category_id"/>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div class="oe_kanban_vignette">
|
||||
<div class="oe_kanban_vignette oe_semantic_html_override">
|
||||
<a type="open">
|
||||
<img t-att-src="kanban_image('res.partner', 'image_small', record.id.value)" class="oe_kanban_image"/>
|
||||
</a>
|
||||
|
||||
@@ -251,6 +251,7 @@ class res_users(osv.osv):
|
||||
'company_id': _get_company,
|
||||
'company_ids': _get_companies,
|
||||
'groups_id': _get_group,
|
||||
'image': lambda self, cr, uid, context: self.pool.get('res.partner')._get_default_image(cr, uid, False, context, colorize=True),
|
||||
}
|
||||
|
||||
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
<form string="Users" version="7.0">
|
||||
<field name="id" invisible="1"/>
|
||||
<sheet>
|
||||
<field name="image_medium" widget='image' class="oe_avatar oe_left"/>
|
||||
<field name="image" widget='image' class="oe_avatar oe_left" options='{"preview_image": "image_medium"}'/>
|
||||
<div class="oe_title">
|
||||
<label for="name" class="oe_edit_only"/>
|
||||
<h1><field name="name"/></h1>
|
||||
@@ -195,9 +195,7 @@
|
||||
<field eval="18" name="priority"/>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Users" version="7.0">
|
||||
<div class="oe_right oe_avatar">
|
||||
<field name="image_small" widget='image' class="oe_image_small"/>
|
||||
</div>
|
||||
<field name="image" widget='image' class="oe_right oe_avatar" options='{"preview_image": "image_small"}'/>
|
||||
<h1>
|
||||
<field name="name" readonly="1" class="oe_inline"/>
|
||||
(<field name="login" readonly="1" class="oe_inline"/>)
|
||||
|
||||
@@ -172,6 +172,9 @@
|
||||
<rng:define name="form">
|
||||
<rng:element name="form">
|
||||
<rng:ref name="overload"/>
|
||||
<rng:optional><rng:attribute name="create" /></rng:optional>
|
||||
<rng:optional><rng:attribute name="delete" /></rng:optional>
|
||||
<rng:optional><rng:attribute name="edit" /></rng:optional>
|
||||
<rng:optional><rng:attribute name="string"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="type"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="link"/></rng:optional>
|
||||
@@ -181,7 +184,8 @@
|
||||
|
||||
<rng:define name="diagram">
|
||||
<rng:element name="diagram">
|
||||
<rng:optional><rng:attribute name="string"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="create" /></rng:optional>
|
||||
<rng:optional><rng:attribute name="string"/></rng:optional>
|
||||
<rng:ref name="node"/>
|
||||
<rng:ref name="arrow"/>
|
||||
<rng:zeroOrMore>
|
||||
@@ -223,6 +227,8 @@
|
||||
<rng:attribute name="default_group_by" />
|
||||
</rng:optional>
|
||||
<rng:optional><rng:attribute name="create" /></rng:optional>
|
||||
<rng:optional><rng:attribute name="delete" /></rng:optional>
|
||||
<rng:optional><rng:attribute name="edit" /></rng:optional>
|
||||
<rng:optional><rng:attribute name="quick_create" /></rng:optional>
|
||||
<rng:zeroOrMore>
|
||||
<rng:ref name="field"/>
|
||||
@@ -238,6 +244,9 @@
|
||||
<rng:define name="tree">
|
||||
<rng:element name="tree">
|
||||
<rng:ref name="overload"/>
|
||||
<rng:optional><rng:attribute name="create" /></rng:optional>
|
||||
<rng:optional><rng:attribute name="delete" /></rng:optional>
|
||||
<rng:optional><rng:attribute name="edit" /></rng:optional>
|
||||
<rng:optional><rng:attribute name="string"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="colors"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="fonts"/></rng:optional>
|
||||
@@ -376,6 +385,9 @@
|
||||
<rng:value>5years</rng:value>
|
||||
</rng:choice></rng:attribute>
|
||||
</rng:optional>
|
||||
<rng:optional><rng:attribute name="create"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="delete"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="edit"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="color"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="date_delay"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="day_length"/></rng:optional>
|
||||
|
||||
@@ -120,6 +120,5 @@
|
||||
"access_ir_config_parameter","ir_config_parameter","model_ir_config_parameter",,1,0,0,0
|
||||
"access_ir_mail_server_all","ir_mail_server","model_ir_mail_server",,1,0,0,0
|
||||
"access_ir_actions_client","ir_actions_client all","model_ir_actions_client",,1,0,0,0
|
||||
"access_ir_needaction_users_rel","ir_needaction_users_rel","model_ir_needaction_users_rel",,1,1,1,1
|
||||
"access_ir_needaction_mixin","ir_needaction_mixin","model_ir_needaction_mixin",,1,1,1,1
|
||||
|
||||
|
||||
|
Binary file not shown.
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 22 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 22 KiB |
@@ -1,5 +1,5 @@
|
||||
import test_ir_values
|
||||
import test_ir_values, test_base
|
||||
|
||||
checks = [
|
||||
test_ir_values,
|
||||
test_ir_values, test_base
|
||||
]
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
import unittest2
|
||||
|
||||
import openerp.tests.common as common
|
||||
|
||||
class test_base(common.TransactionCase):
|
||||
|
||||
def setUp(self):
|
||||
super(test_base,self).setUp()
|
||||
self.res_partner = self.registry('res.partner')
|
||||
|
||||
# samples use effective TLDs from the Mozilla public suffix
|
||||
# list at http://publicsuffix.org
|
||||
self.samples = [
|
||||
('"Raoul Grosbedon" <raoul@chirurgiens-dentistes.fr> ', 'Raoul Grosbedon', 'raoul@chirurgiens-dentistes.fr'),
|
||||
('ryu+giga-Sushi@aizubange.fukushima.jp', '', 'ryu+giga-Sushi@aizubange.fukushima.jp'),
|
||||
('Raoul chirurgiens-dentistes.fr', 'Raoul chirurgiens-dentistes.fr', ''),
|
||||
(" Raoul O'hara <!@historicalsociety.museum>", "Raoul O'hara", '!@historicalsociety.museum')
|
||||
]
|
||||
|
||||
def test_00_res_partner_name_create(self):
|
||||
cr, uid = self.cr, self.uid
|
||||
parse = self.res_partner._parse_partner_name
|
||||
for text, name, mail in self.samples:
|
||||
self.assertEqual((name,mail), parse(text), 'Partner name parsing failed')
|
||||
partner_id, dummy = self.res_partner.name_create(cr, uid, text)
|
||||
partner = self.res_partner.browse(cr, uid, partner_id)
|
||||
self.assertEqual(name or mail, partner.name, 'Partner name incorrect')
|
||||
self.assertEqual(mail or False, partner.email, 'Partner email incorrect')
|
||||
|
||||
def test_10_res_partner_find_or_create(self):
|
||||
cr,uid = self.cr, self.uid
|
||||
email = self.samples[0][0]
|
||||
partner_id, dummy = self.res_partner.name_create(cr, uid, email)
|
||||
found_id = self.res_partner.find_or_create(cr, uid, email)
|
||||
self.assertEqual(partner_id, found_id, 'find_or_create failed')
|
||||
new_id = self.res_partner.find_or_create(cr, uid, self.samples[1][0])
|
||||
self.assertTrue(new_id > partner_id, 'find_or_create failed - should have created new one')
|
||||
new_id2 = self.res_partner.find_or_create(cr, uid, self.samples[2][0])
|
||||
self.assertTrue(new_id2 > new_id, 'find_or_create failed - should have created new one again')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest2.main()
|
||||
+15
-12
@@ -162,7 +162,7 @@ def initialize_sys_path():
|
||||
return
|
||||
|
||||
ad_paths = map(lambda m: os.path.abspath(tools.ustr(m.strip())), tools.config['addons_path'].split(','))
|
||||
ad_paths.append(_ad) # for get_module_path
|
||||
ad_paths.append(os.path.abspath(_ad)) # for get_module_path
|
||||
sys.meta_path.append(AddonsImportHook())
|
||||
|
||||
def get_module_path(module, downloaded=False, display_warning=True):
|
||||
@@ -283,25 +283,28 @@ def get_module_as_zip(modulename, b64enc=True, src=True):
|
||||
def get_module_resource(module, *args):
|
||||
"""Return the full path of a resource of the given module.
|
||||
|
||||
@param module: the module
|
||||
@param args: the resource path components
|
||||
:param module: module name
|
||||
:param list(str) args: resource path components within module
|
||||
|
||||
@return: absolute path to the resource
|
||||
:rtype: str
|
||||
:return: absolute path to the resource
|
||||
|
||||
TODO name it get_resource_path
|
||||
TODO make it available inside on osv object (self.get_resource_path)
|
||||
"""
|
||||
a = get_module_path(module)
|
||||
if not a: return False
|
||||
resource_path = opj(a, *args)
|
||||
if zipfile.is_zipfile( a +'.zip') :
|
||||
zip = zipfile.ZipFile( a + ".zip")
|
||||
mod_path = get_module_path(module)
|
||||
if not mod_path: return False
|
||||
resource_path = opj(mod_path, *args)
|
||||
if os.path.isdir(mod_path):
|
||||
# the module is a directory - ignore zip behavior
|
||||
if os.path.exists(resource_path):
|
||||
return resource_path
|
||||
elif zipfile.is_zipfile(mod_path + '.zip'):
|
||||
zip = zipfile.ZipFile( mod_path + ".zip")
|
||||
files = ['/'.join(f.split('/')[1:]) for f in zip.namelist()]
|
||||
resource_path = '/'.join(args)
|
||||
if resource_path in files:
|
||||
return opj(a, resource_path)
|
||||
elif os.path.exists(resource_path):
|
||||
return resource_path
|
||||
return opj(mod_path, resource_path)
|
||||
return False
|
||||
|
||||
def get_module_icon(module):
|
||||
|
||||
@@ -515,7 +515,8 @@ class one2many(_column):
|
||||
for id in ids:
|
||||
res[id] = []
|
||||
|
||||
ids2 = obj.pool.get(self._obj).search(cr, user, self._domain + [(self._fields_id, 'in', ids)], limit=self._limit, context=context)
|
||||
domain = self._domain(obj) if callable(self._domain) else self._domain
|
||||
ids2 = obj.pool.get(self._obj).search(cr, user, domain + [(self._fields_id, 'in', ids)], limit=self._limit, context=context)
|
||||
for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'):
|
||||
if r[self._fields_id] in res:
|
||||
res[r[self._fields_id]].append(r['id'])
|
||||
@@ -557,7 +558,8 @@ class one2many(_column):
|
||||
reverse_rel = obj._all_columns.get(self._fields_id)
|
||||
assert reverse_rel, 'Trying to unlink the content of a o2m but the pointed model does not have a m2o'
|
||||
# if the o2m has a static domain we must respect it when unlinking
|
||||
extra_domain = self._domain if isinstance(getattr(self, '_domain', None), list) else []
|
||||
domain = self._domain(obj) if callable(self._domain) else self._domain
|
||||
extra_domain = domain or []
|
||||
ids_to_unlink = obj.search(cr, user, [(self._fields_id,'=',id)] + extra_domain, context=context)
|
||||
# If the model has cascade deletion, we delete the rows because it is the intended behavior,
|
||||
# otherwise we only nullify the reverse foreign key column.
|
||||
@@ -575,7 +577,8 @@ class one2many(_column):
|
||||
return result
|
||||
|
||||
def search(self, cr, obj, args, name, value, offset=0, limit=None, uid=None, operator='like', context=None):
|
||||
return obj.pool.get(self._obj).name_search(cr, uid, value, self._domain, operator, context=context,limit=limit)
|
||||
domain = self._domain(obj) if callable(self._domain) else self._domain
|
||||
return obj.pool.get(self._obj).name_search(cr, uid, value, domain, operator, context=context,limit=limit)
|
||||
|
||||
|
||||
@classmethod
|
||||
@@ -1540,9 +1543,7 @@ def field_to_dict(model, cr, user, field, context=None):
|
||||
"""
|
||||
|
||||
res = {'type': field._type}
|
||||
# This additional attributes for M2M and function field is added
|
||||
# because we need to display tooltip with this additional information
|
||||
# when client is started in debug mode.
|
||||
# some attributes for m2m/function field are added as debug info only
|
||||
if isinstance(field, function):
|
||||
res['function'] = field._fnct and field._fnct.func_name or False
|
||||
res['store'] = field.store
|
||||
@@ -1577,7 +1578,7 @@ def field_to_dict(model, cr, user, field, context=None):
|
||||
res['selection'] = field.selection(model, cr, user, context)
|
||||
if res['type'] in ('one2many', 'many2many', 'many2one'):
|
||||
res['relation'] = field._obj
|
||||
res['domain'] = field._domain
|
||||
res['domain'] = field._domain(model) if callable(field._domain) else field._domain
|
||||
res['context'] = field._context
|
||||
|
||||
if isinstance(field, one2many):
|
||||
|
||||
+28
-56
@@ -654,6 +654,7 @@ class BaseModel(object):
|
||||
may be set to False.
|
||||
"""
|
||||
__metaclass__ = MetaModel
|
||||
_auto = True # create database backend
|
||||
_register = False # Set to false if the model shouldn't be automatically discovered.
|
||||
_name = None
|
||||
_columns = {}
|
||||
@@ -667,8 +668,9 @@ class BaseModel(object):
|
||||
_order = 'id'
|
||||
_sequence = None
|
||||
_description = None
|
||||
_needaction = False
|
||||
|
||||
# dict of {field:method}, with method returning the name_get of records
|
||||
# dict of {field:method}, with method returning the (name_get of records, {id: fold})
|
||||
# to include in the _read_group, if grouped on this field
|
||||
_group_by_full = {}
|
||||
|
||||
@@ -1823,8 +1825,11 @@ class BaseModel(object):
|
||||
fields = {}
|
||||
if node.tag == 'diagram':
|
||||
if node.getchildren()[0].tag == 'node':
|
||||
node_fields = self.pool.get(node.getchildren()[0].get('object')).fields_get(cr, user, None, context)
|
||||
node_model = self.pool.get(node.getchildren()[0].get('object'))
|
||||
node_fields = node_model.fields_get(cr, user, None, context)
|
||||
fields.update(node_fields)
|
||||
if not node.get("create") and not node_model.check_access_rights(cr, user, 'create', raise_exception=False):
|
||||
node.set("create", 'false')
|
||||
if node.getchildren()[1].tag == 'arrow':
|
||||
arrow_fields = self.pool.get(node.getchildren()[1].get('object')).fields_get(cr, user, None, context)
|
||||
fields.update(arrow_fields)
|
||||
@@ -1832,6 +1837,10 @@ class BaseModel(object):
|
||||
fields = self.fields_get(cr, user, None, context)
|
||||
fields_def = self.__view_look_dom(cr, user, node, view_id, False, fields, context=context)
|
||||
node = self._disable_workflow_buttons(cr, user, node)
|
||||
if node.tag in ('kanban', 'tree', 'form', 'gantt'):
|
||||
for action, operation in (('create', 'create'), ('delete', 'unlink'), ('edit', 'write')):
|
||||
if not node.get(action) and not self.check_access_rights(cr, user, operation, raise_exception=False):
|
||||
node.set(action, 'false')
|
||||
arch = etree.tostring(node, encoding="utf-8").replace('\t', '')
|
||||
for k in fields.keys():
|
||||
if k not in fields_def:
|
||||
@@ -2346,7 +2355,7 @@ class BaseModel(object):
|
||||
def read_string(self, cr, uid, id, langs, fields=None, context=None):
|
||||
res = {}
|
||||
res2 = {}
|
||||
self.pool.get('ir.translation').check_read(cr, uid)
|
||||
self.pool.get('ir.translation').check_access_rights(cr, uid, 'read')
|
||||
if not fields:
|
||||
fields = self._columns.keys() + self._inherit_fields.keys()
|
||||
#FIXME: collect all calls to _get_source into one SQL call.
|
||||
@@ -2370,7 +2379,7 @@ class BaseModel(object):
|
||||
return res
|
||||
|
||||
def write_string(self, cr, uid, id, langs, vals, context=None):
|
||||
self.pool.get('ir.translation').check_write(cr, uid)
|
||||
self.pool.get('ir.translation').check_access_rights(cr, uid, 'write')
|
||||
#FIXME: try to only call the translation in one SQL
|
||||
for lang in langs:
|
||||
for field in vals:
|
||||
@@ -2438,7 +2447,7 @@ class BaseModel(object):
|
||||
|
||||
# Grab the list of all groups that should be displayed, including all present groups
|
||||
present_group_ids = [x[groupby][0] for x in read_group_result if x[groupby]]
|
||||
all_groups = self._group_by_full[groupby](self, cr, uid, present_group_ids, domain,
|
||||
all_groups,folded = self._group_by_full[groupby](self, cr, uid, present_group_ids, domain,
|
||||
read_group_order=read_group_order,
|
||||
access_rights_uid=openerp.SUPERUSER_ID,
|
||||
context=context)
|
||||
@@ -2489,6 +2498,10 @@ class BaseModel(object):
|
||||
append_left(read_group_result.pop(0))
|
||||
else:
|
||||
append_right(all_groups.pop(0))
|
||||
|
||||
if folded:
|
||||
for r in result:
|
||||
r['__fold'] = folded.get(r[groupby] and r[groupby][0], False)
|
||||
return result
|
||||
|
||||
def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False):
|
||||
@@ -2518,7 +2531,7 @@ class BaseModel(object):
|
||||
|
||||
"""
|
||||
context = context or {}
|
||||
self.check_read(cr, uid)
|
||||
self.check_access_rights(cr, uid, 'read')
|
||||
if not fields:
|
||||
fields = self._columns.keys()
|
||||
|
||||
@@ -3399,8 +3412,7 @@ class BaseModel(object):
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
write_access = self.check_write(cr, user, False) or \
|
||||
self.check_create(cr, user, False)
|
||||
write_access = self.check_access_rights(cr, user, 'write') or self.check_access_rights(cr, user, 'create')
|
||||
|
||||
res = {}
|
||||
|
||||
@@ -3464,7 +3476,7 @@ class BaseModel(object):
|
||||
|
||||
if not context:
|
||||
context = {}
|
||||
self.check_read(cr, user)
|
||||
self.check_access_rights(cr, user, 'read')
|
||||
if not fields:
|
||||
fields = list(set(self._columns.keys() + self._inherit_fields.keys()))
|
||||
if isinstance(ids, (int, long)):
|
||||
@@ -3738,18 +3750,6 @@ class BaseModel(object):
|
||||
according to the access rights."""
|
||||
return self.pool.get('ir.model.access').check(cr, uid, self._name, operation, raise_exception)
|
||||
|
||||
def check_create(self, cr, uid, raise_exception=True):
|
||||
return self.check_access_rights(cr, uid, 'create', raise_exception)
|
||||
|
||||
def check_read(self, cr, uid, raise_exception=True):
|
||||
return self.check_access_rights(cr, uid, 'read', raise_exception)
|
||||
|
||||
def check_unlink(self, cr, uid, raise_exception=True):
|
||||
return self.check_access_rights(cr, uid, 'unlink', raise_exception)
|
||||
|
||||
def check_write(self, cr, uid, raise_exception=True):
|
||||
return self.check_access_rights(cr, uid, 'write', raise_exception)
|
||||
|
||||
def check_access_rule(self, cr, uid, ids, operation, context=None):
|
||||
"""Verifies that the operation given by ``operation`` is allowed for the user
|
||||
according to ir.rules.
|
||||
@@ -3813,7 +3813,7 @@ class BaseModel(object):
|
||||
|
||||
self._check_concurrency(cr, ids, context)
|
||||
|
||||
self.check_unlink(cr, uid)
|
||||
self.check_access_rights(cr, uid, 'unlink')
|
||||
|
||||
ir_property = self.pool.get('ir.property')
|
||||
|
||||
@@ -3949,7 +3949,7 @@ class BaseModel(object):
|
||||
ids = [ids]
|
||||
|
||||
self._check_concurrency(cr, ids, context)
|
||||
self.check_write(cr, user)
|
||||
self.check_access_rights(cr, user, 'write')
|
||||
|
||||
result = self._store_get_values(cr, user, ids, vals.keys(), context) or []
|
||||
|
||||
@@ -4169,7 +4169,7 @@ class BaseModel(object):
|
||||
if self.is_transient():
|
||||
self._transient_vacuum(cr, user)
|
||||
|
||||
self.check_create(cr, user)
|
||||
self.check_access_rights(cr, user, 'create')
|
||||
|
||||
if self._log_access:
|
||||
for f in LOG_ACCESS_COLUMNS:
|
||||
@@ -4661,7 +4661,7 @@ class BaseModel(object):
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
self.check_read(cr, access_rights_uid or user)
|
||||
self.check_access_rights(cr, access_rights_uid or user, 'read')
|
||||
|
||||
# For transient models, restrict acces to the current user, except for the super-user
|
||||
if self.is_transient() and self._log_access and user != SUPERUSER_ID:
|
||||
@@ -4961,37 +4961,7 @@ class BaseModel(object):
|
||||
# backwards compatibility
|
||||
get_xml_id = get_external_id
|
||||
_get_xml_ids = _get_external_ids
|
||||
|
||||
def _get_needaction_info(self, cr, uid, user_id, limit=None, order=None, domain=False, context=None):
|
||||
"""Base method for needaction mechanism
|
||||
- see ir.needaction for actual implementation
|
||||
- if the model uses the need action mechanism
|
||||
(hasattr(model_obj, 'needaction_get_record_ids')):
|
||||
- get the record ids on which the user has actions to perform
|
||||
- evaluate the menu domain
|
||||
- compose a new domain: menu domain, limited to ids of
|
||||
records requesting an action
|
||||
- count the number of records maching that domain, that
|
||||
is the number of actions the user has to perform
|
||||
- this method returns default values
|
||||
:param: model_name: the name of the model (ex: hr.holidays)
|
||||
:param: user_id: the id of user
|
||||
:return: [uses_needaction=True/False, needaction_uid_ctr=%d]
|
||||
"""
|
||||
if hasattr(self, 'needaction_get_record_ids'):
|
||||
# Arbitrary limit, but still much lower thant infinity, to avoid
|
||||
# getting too much data.
|
||||
ids = self.needaction_get_record_ids(cr, uid, user_id, limit=8192, context=context)
|
||||
if not ids:
|
||||
return [True, 0]
|
||||
if domain:
|
||||
new_domain = eval(domain, locals_dict={'uid': user_id}) + [('id', 'in', ids)]
|
||||
else:
|
||||
new_domain = [('id', 'in', ids)]
|
||||
return [True, self.search(cr, uid, new_domain, limit=limit, order=order, count=True, context=context)]
|
||||
else:
|
||||
return [False, 0]
|
||||
|
||||
|
||||
# Transience
|
||||
def is_transient(self):
|
||||
""" Return whether the model is transient.
|
||||
@@ -5118,6 +5088,7 @@ class Model(BaseModel):
|
||||
The system will later instantiate the class once per database (on
|
||||
which the class' module is installed).
|
||||
"""
|
||||
_auto = True
|
||||
_register = False # not visible in ORM registry, meant to be python-inherited only
|
||||
_transient = False # True in a TransientModel
|
||||
|
||||
@@ -5130,6 +5101,7 @@ class TransientModel(BaseModel):
|
||||
records they created. The super-user has unrestricted access
|
||||
to all TransientModel records.
|
||||
"""
|
||||
_auto = True
|
||||
_register = False # not visible in ORM registry, meant to be python-inherited only
|
||||
_transient = True
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ See the :ref:`test-framework` section in the :ref:`features` list.
|
||||
"""
|
||||
|
||||
from . import test_expression, test_html_sanitize, test_ir_sequence, test_orm,\
|
||||
test_view_validation, test_uninstall
|
||||
test_view_validation, test_uninstall, test_misc
|
||||
|
||||
fast_suite = [
|
||||
test_ir_sequence,
|
||||
@@ -20,6 +20,7 @@ checks = [
|
||||
test_html_sanitize,
|
||||
test_orm,
|
||||
test_view_validation,
|
||||
test_misc,
|
||||
]
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -26,11 +26,15 @@ 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_test_case(self):
|
||||
def test_no_exception(self):
|
||||
html_sanitize(test_case)
|
||||
|
||||
def test_crm(self):
|
||||
def test_unicode(self):
|
||||
html_sanitize("Merci à l'intérêt pour notre produit.nous vous contacterons bientôt. Merci")
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -186,7 +186,7 @@ class test_ir_sequence_generate(unittest2.TestCase):
|
||||
|
||||
cr = cursor()
|
||||
f = lambda *a: registry('ir.sequence').next_by_code(cr, ADMIN_USER_ID, 'test_sequence_type_5', {})
|
||||
assert all(str(x) == f() for x in xrange(1,1000))
|
||||
assert all(str(x) == f() for x in xrange(1,10))
|
||||
cr.commit()
|
||||
cr.close()
|
||||
|
||||
@@ -204,7 +204,7 @@ class test_ir_sequence_generate(unittest2.TestCase):
|
||||
|
||||
cr = cursor()
|
||||
f = lambda *a: registry('ir.sequence').next_by_code(cr, ADMIN_USER_ID, 'test_sequence_type_6', {})
|
||||
assert all(str(x) == f() for x in xrange(1,1000))
|
||||
assert all(str(x) == f() for x in xrange(1,10))
|
||||
cr.commit()
|
||||
cr.close()
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
# This test can be run stand-alone with something like:
|
||||
# > PYTHONPATH=. python2 openerp/tests/test_misc.py
|
||||
|
||||
import unittest2
|
||||
|
||||
class test_misc(unittest2.TestCase):
|
||||
""" Test some of our generic utility functions """
|
||||
|
||||
def test_append_to_html(self):
|
||||
from openerp.tools import append_content_to_html
|
||||
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(append_content_to_html(html,content,flag), expected, 'append_content_to_html is broken')
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest2.main()
|
||||
@@ -88,8 +88,8 @@ def amount_to_text(number, currency):
|
||||
end_word = english_number(int(list[1]))
|
||||
cents_number = int(list[1])
|
||||
cents_name = (cents_number > 1) and 'Cents' or 'Cent'
|
||||
final_result = start_word +' '+units_name+' and ' + end_word +' '+cents_name
|
||||
return final_result
|
||||
|
||||
return ' '.join(filter(None, [start_word, units_name, (start_word or units_name) and (end_word or cents_name) and 'and', end_word, cents_name]))
|
||||
|
||||
|
||||
#-------------------------------------------------------------
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user