Merged Latest.

bzr revid: tta@openerp.com-20121122110225-xb5vv67c6rw1dr90
This commit is contained in:
Tejas Tank 2012-11-22 16:32:25 +05:30
commit e3a89f4fb2
174 changed files with 5945 additions and 3229 deletions

View File

@ -391,29 +391,34 @@ class account_invoice(osv.osv):
'''
This function opens a window to compose an email, with the edi invoice template message loaded by default
'''
mod_obj = self.pool.get('ir.model.data')
template = mod_obj.get_object_reference(cr, uid, 'account', 'email_template_edi_invoice')
template_id = template and template[1] or False
res = mod_obj.get_object_reference(cr, uid, 'mail', 'email_compose_message_wizard_form')
res_id = res and res[1] or False
assert len(ids) == 1, 'This option should only be used for a single id at a time.'
ir_model_data = self.pool.get('ir.model.data')
try:
template_id = ir_model_data.get_object_reference(cr, uid, 'account', 'email_template_edi_invoice')[1]
except ValueError:
template_id = False
try:
compose_form_id = ir_model_data.get_object_reference(cr, uid, 'mail', 'email_compose_message_wizard_form')[1]
except ValueError:
compose_form_id = False
ctx = dict(context)
ctx.update({
'default_model': 'account.invoice',
'default_res_id': ids[0],
'default_use_template': True,
'default_use_template': bool(template_id),
'default_template_id': template_id,
'default_composition_mode': 'comment',
'mark_invoice_as_sent': True,
})
return {
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
'res_model': 'mail.compose.message',
'views': [(res_id, 'form')],
'view_id': res_id,
'type': 'ir.actions.act_window',
'views': [(compose_form_id, 'form')],
'view_id': compose_form_id,
'target': 'new',
'context': ctx,
'nodestroy': True,
}
def confirm_paid(self, cr, uid, ids, context=None):
@ -1726,8 +1731,6 @@ class account_invoice_tax(osv.osv):
})
return res
account_invoice_tax()
class res_partner(osv.osv):
""" Inherits partner and adds invoice information in the partner form """
@ -1741,16 +1744,14 @@ class res_partner(osv.osv):
default.update({'invoice_ids' : []})
return super(res_partner, self).copy(cr, uid, id, default, context)
res_partner()
class mail_message(osv.osv):
_name = 'mail.message'
_inherit = 'mail.message'
class mail_compose_message(osv.osv):
_inherit = 'mail.compose.message'
def _postprocess_sent_message(self, cr, uid, message, context=None):
if message.model == 'account.invoice':
self.pool.get('account.invoice').write(cr, uid, [message.res_id], {'sent':True}, context=context)
return super(mail_message, self)._postprocess_sent_message(cr, uid, message=message, context=context)
def send_mail(self, cr, uid, ids, context=None):
context = context or {}
if context.get('default_model') == 'account.invoice' and context.get('default_res_id') and context.get('mark_invoice_as_sent'):
self.pool.get('account.invoice').write(cr, uid, [context['default_res_id']], {'sent': True}, context=context)
return super(mail_compose_message, self).send_mail(cr, uid, ids, context=context)
mail_message()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -6,7 +6,7 @@
<menuitem name="Invoicing"
id="menu_finance"
groups="group_account_user,group_account_manager,group_account_invoice"
sequence="100"/>
sequence="50"/>
<menuitem id="menu_finance_receivables" name="Customers" parent="menu_finance" sequence="2"/>
<menuitem id="menu_finance_payables" name="Suppliers" parent="menu_finance" sequence="3"/>

View File

@ -2,7 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Business Applications
# Copyright (c) 2011 OpenERP S.A. <http://openerp.com>
# Copyright (c) 2011-2012 OpenERP S.A. <http://openerp.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@ -19,9 +19,8 @@
#
##############################################################################
from osv import fields, osv, orm
from openerp.osv import osv
from edi import EDIMixin
from edi.models import edi
INVOICE_LINE_EDI_STRUCT = {
'name': True,
@ -71,16 +70,6 @@ INVOICE_EDI_STRUCT = {
class account_invoice(osv.osv, EDIMixin):
_inherit = 'account.invoice'
def action_invoice_sent(self, cr, uid, ids, context=None):
""""Override this method to add a link to mail"""
if context is None:
context = {}
invoice_objs = self.browse(cr, uid, ids, context=context)
edi_token = self.pool.get('edi.document').export_edi(cr, uid, invoice_objs, context = context)[0]
web_root_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
ctx = dict(context, edi_web_url_view=edi.EDI_VIEW_WEB_URL % (web_root_url, cr.dbname, edi_token))
return super(account_invoice, self).action_invoice_sent(cr, uid, ids, context=ctx)
def edi_export(self, cr, uid, records, edi_struct=None, context=None):
"""Exports a supplier or customer invoice"""
edi_struct = dict(edi_struct or INVOICE_EDI_STRUCT)
@ -111,8 +100,8 @@ class account_invoice(osv.osv, EDIMixin):
return tax_account
def _edi_invoice_account(self, cr, uid, partner_id, invoice_type, context=None):
partner_pool = self.pool.get('res.partner')
partner = partner_pool.browse(cr, uid, partner_id, context=context)
res_partner = self.pool.get('res.partner')
partner = res_partner.browse(cr, uid, partner_id, context=context)
if invoice_type in ('out_invoice', 'out_refund'):
invoice_account = partner.property_account_receivable
else:
@ -136,31 +125,30 @@ class account_invoice(osv.osv, EDIMixin):
self._edi_requires_attributes(('company_id','company_address','type'), edi_document)
res_partner = self.pool.get('res.partner')
src_company_id, src_company_name = edi_document.pop('company_id')
xid, company_name = edi_document.pop('company_id')
# Retrofit address info into a unified partner info (changed in v7 - used to keep them separate)
company_address_edi = edi_document.pop('company_address')
company_address_edi['name'] = company_name
company_address_edi['is_company'] = True
company_address_edi['__import_model'] = 'res.partner'
company_address_edi['__id'] = xid # override address ID, as of v7 they should be the same anyway
if company_address_edi.get('logo'):
company_address_edi['image'] = company_address_edi.pop('logo')
invoice_type = edi_document['type']
partner_value = {}
if invoice_type in ('out_invoice', 'out_refund'):
partner_value.update({'customer': True})
if invoice_type in ('in_invoice', 'in_refund'):
partner_value.update({'supplier': True})
# imported company_address = new partner address
address_info = edi_document.pop('company_address')
if 'name' not in address_info:
address_info['name'] = src_company_name
address_info['type'] = 'invoice'
address_info.update(partner_value)
address_id = res_partner.edi_import(cr, uid, address_info, context=context)
if invoice_type.startswith('out_'):
company_address_edi['customer'] = True
else:
company_address_edi['supplier'] = True
partner_id = res_partner.edi_import(cr, uid, company_address_edi, context=context)
# modify edi_document to refer to new partner
partner_address = res_partner.browse(cr, uid, address_id, context=context)
address_edi_m2o = self.edi_m2o(cr, uid, partner_address, context=context)
edi_document['partner_id'] = address_edi_m2o
edi_document.pop('partner_address', False) # ignored
return address_id
partner = res_partner.browse(cr, uid, partner_id, context=context)
partner_edi_m2o = self.edi_m2o(cr, uid, partner, context=context)
edi_document['partner_id'] = partner_edi_m2o
edi_document.pop('partner_address', None) # ignored, that's supposed to be our own address!
return partner_id
def edi_import(self, cr, uid, edi_document, context=None):
""" During import, invoices will import the company that is provided in the invoice as
@ -200,7 +188,7 @@ class account_invoice(osv.osv, EDIMixin):
invoice_type = invoice_type.startswith('in_') and invoice_type.replace('in_','out_') or invoice_type.replace('out_','in_')
edi_document['type'] = invoice_type
#import company as a new partner
# import company as a new partner
partner_id = self._edi_import_company(cr, uid, edi_document, context=context)
# Set Account

View File

@ -1,17 +1,6 @@
<?xml version="1.0" ?>
<openerp>
<data>
<!-- EDI Export + Send email Action -->
<record id="ir_actions_server_edi_invoice" model="ir.actions.server">
<field name="code">if (object.type in ('out_invoice', 'out_refund')) and not object.partner_id.opt_out: object.edi_export_and_email(template_ext_id='account.email_template_edi_invoice', context=context)</field>
<field eval="6" name="sequence"/>
<field name="state">code</field>
<field name="type">ir.actions.server</field>
<field name="model_id" ref="account.model_account_invoice"/>
<field name="condition">True</field>
<field name="name">Auto-email confirmed invoices</field>
</record>
<!-- EDI related Email Templates menu -->
<record model="ir.actions.act_window" id="action_email_templates">
<field name="name">Email Templates</field>
@ -27,28 +16,25 @@
</data>
<!-- Mail template and workflow bindings are done in a NOUPDATE block
<!-- Mail template are declared in a NOUPDATE block
so users can freely customize/delete them -->
<data noupdate="1">
<!-- bind the mailing server action to invoice open activity -->
<record id="account.act_open" model="workflow.activity">
<field name="action_id" ref="ir_actions_server_edi_invoice"/>
</record>
<!--Email template -->
<record id="email_template_edi_invoice" model="email.template">
<field name="name">Automated Invoice Notification Mail</field>
<field name="name">Invoice - Send by Email</field>
<field name="email_from">${object.user_id.email or object.company_id.email or 'noreply@localhost'}</field>
<field name="subject">${object.company_id.name} Invoice (Ref ${object.number or 'n/a' })</field>
<field name="email_recipients">${object.partner_id.id}</field>
<field name="model_id" ref="account.model_account_invoice"/>
<field name="auto_delete" eval="True"/>
<field name="report_template" ref="account_invoices"/>
<field name="report_name">Invoice_${(object.number or '').replace('/','_')}_${object.state == 'draft' and 'draft' or ''}</field>
<field name="body_html"><![CDATA[
<div style="font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, 255, 255); ">
<p>Hello${object.partner_id.name and ' ' or ''}${object.partner_id.name or ''},</p>
<p>A new invoice is available for ${object.partner_id.name}: </p>
<p>A new invoice is available for you: </p>
<p style="border-left: 1px solid #8e0000; margin-left: 30px;">
&nbsp;&nbsp;<strong>REFERENCES</strong><br />
@ -58,21 +44,17 @@
% if object.origin:
&nbsp;&nbsp;Order reference: ${object.origin}<br />
% endif
% if object.user_id:
&nbsp;&nbsp;Your contact: <a href="mailto:${object.user_id.email or ''}?subject=Invoice%20${object.number}">${object.user_id.name}</a>
% endif
</p>
<p>
You can view the invoice document, download it and pay online using the following link:
</p>
<a style="display:block; width: 150px; height:20px; margin-left: 120px; color: #FFF; font-family: 'Lucida Grande', Helvetica, Arial, sans-serif; font-size: 13px; font-weight: bold; text-align: center; text-decoration: none !important; line-height: 1; padding: 5px 0px 0px 0px; background-color: #8E0000; border-radius: 5px 5px; background-repeat: repeat no-repeat;"
href="${ctx.get('edi_web_url_view') or ''}">View Invoice</a>
% if object.company_id.paypal_account and object.type in ('out_invoice', 'in_refund'):
<%
comp_name = quote(object.company_id.name)
inv_number = quote(object.number)
paypal_account = quote(object.company_id.paypal_account)
inv_amount = quote(str(object.amount_total))
inv_amount = quote(str(object.residual))
cur_name = quote(object.currency_id.name)
paypal_url = "https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=%s&amp;item_name=%s%%20Invoice%%20%s&amp;" \
"invoice=%s&amp;amount=%s&amp;currency_code=%s&amp;button_subtype=services&amp;no_note=1&amp;bn=OpenERP_Invoice_PayNow_%s" % \

View File

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
"PO-Revision-Date: 2012-06-20 16:18+0000\n"
"Last-Translator: mikel <mikel.martin@gmail.com>\n"
"PO-Revision-Date: 2012-11-21 18:46+0000\n"
"Last-Translator: Pedro Manuel Baeza <pedro.baeza@gmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:04+0000\n"
"X-Generator: Launchpad (build 16206)\n"
"X-Launchpad-Export-Date: 2012-11-22 05:07+0000\n"
"X-Generator: Launchpad (build 16293)\n"
#. module: account
#: view:account.invoice.report:0
@ -2166,9 +2166,7 @@ msgstr "Pro-forma"
msgid ""
"There is no default default debit account defined \n"
"on journal \"%s\""
msgstr ""
"No se ha definido una cuenta debe por defecto \n"
"en el diario \"%s\""
msgstr "No se ha definido una cuenta deudora por defecto en el diario \"%s\""
#. module: account
#: help:account.account.template,type:0
@ -2375,8 +2373,7 @@ msgid ""
"There is no default default credit account defined \n"
"on journal \"%s\""
msgstr ""
"No se ha definido una cuenta haber por defecto \n"
"en el diario \"%s\""
"No se ha definido una cuenta acreedora por defecto en el diario \"%s\""
#. module: account
#: model:ir.actions.act_window,help:account.action_review_financial_journals_installer
@ -3252,7 +3249,7 @@ msgstr "Plantillas para el plan contable"
#. module: account
#: model:ir.actions.act_window,name:account.action_wizard_multi_chart
msgid "Set Your Accounting Options"
msgstr ""
msgstr "Establezca las opciones de contabilidad"
#. module: account
#: view:report.account.sales:0
@ -4010,7 +4007,7 @@ msgid ""
msgstr ""
"Lo más recomendable es usar un diario dedicado a contener los asientos de "
"apertura de todos los ejercicios. Tenga en cuenta que lo debería definir con "
"cuentas de debe/haber por defecto, de tipo 'situación' y con una "
"cuentas acreedora/deudora por defecto, de tipo 'situación' y con una "
"contrapartida centralizada."
#. module: account
@ -6387,7 +6384,7 @@ msgstr "Otra información"
#. module: account
#: field:account.journal,default_credit_account_id:0
msgid "Default Credit Account"
msgstr "Cuenta haber por defecto"
msgstr "Cuenta acreedora por defecto"
#. module: account
#: help:account.analytic.line,currency_id:0
@ -7696,7 +7693,7 @@ msgstr "Información opcional"
#: code:addons/account/wizard/account_fiscalyear_close.py:100
#, python-format
msgid "The journal must have default credit and debit account"
msgstr "El diario debe tener una cuenta haber y debe por defecto."
msgstr "El diario debe tener una cuenta acreedora y deudora por defecto."
#. module: account
#: report:account.general.journal:0

View File

@ -227,7 +227,7 @@
</div>
</group>
<separator string="Bank &amp; Cash"/>
<group>
<group name="bank_cash">
<label for="id" string="Configuration"/>
<div>
<div>

View File

@ -38,45 +38,46 @@
-
Then I export the customer invoice
-
!python {model: edi.document}: |
!python {model: edi.edi}: |
import json
invoice_pool = self.pool.get('account.invoice')
invoice = invoice_pool.browse(cr, uid, ref("invoice_edi_1"))
token = self.export_edi(cr, uid, [invoice])
assert token, 'Invalid EDI Token'
edi_doc = self.generate_edi(cr, uid, [invoice])
assert isinstance(json.loads(edi_doc)[0], dict), 'EDI doc should be a JSON dict'
-
Then I import a sample EDI document of another customer invoice
Then I import a sample EDI document of another customer invoice from OpenERP 7.0
-
!python {model: account.invoice}: |
import time
edi_document = {
"__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.random_invoice_763jsms",
"__id": "account:b33adf8a-decd-11f0-a4de-702a04e25700.random_invoice_763jsms",
"__module": "account",
"__model": "account.invoice",
"__version": [6,1,0],
"internal_number": time.strftime("SAJ/%Y/002"),
"__version": [7,0,0],
"internal_number": time.strftime("SAJ/%Y/070"),
"company_address": {
"__id": "base:b22acf7a-ddcd-11e0-a4db-701a04e25543.main_address",
"__id": "base:b33adf8a-decd-11f0-a4de-702a04e25700.main_address",
"__module": "base",
"__model": "res.partner",
"city": "Gerompont",
"name": "Company main address",
"zip": "1367",
"country_id": ["base:b22acf7a-ddcd-11e0-a4db-701a04e25543.be", "Belgium"],
"country_id": ["base:b33adf8a-decd-11f0-a4de-702a04e25700.be", "Belgium"],
"phone": "(+32).81.81.37.00",
"street": "Chaussee de Namur 40",
"bank_ids": [
["base:b22acf7a-ddcd-11e0-a4db-701a04e25543.res_partner_bank-ZrTWzesfsdDJzGbp","Sample bank: 123465789-156113"]
["base:b33adf8a-decd-11f0-a4de-702a04e25700.res_partner_bank-ZrTWzesfsdDJzGbp","Sample bank: 70-123465789-156113"]
],
},
"company_id": ["account:b22acf7a-ddcd-11e0-a4db-701a04e25543.res_company_test11", "Thomson pvt. ltd."],
"company_id": ["account:b33adf8a-decd-11f0-a4de-702a04e25700.res_company_test11", "Thomson pvt. ltd."],
"currency": {
"__id": "base:b22acf7a-ddcd-11e0-a4db-701a04e25543.EUR",
"__id": "base:b33adf8a-decd-11f0-a4de-702a04e25700.EUR",
"__module": "base",
"__model": "res.currency",
"code": "EUR",
"symbol": "€",
},
"partner_id": ["account:b22acf7a-ddcd-11e0-a4db-701a04e25543.res_partner_test20", "Junjun wala"],
"partner_id": ["account:b33adf8a-decd-11f0-a4de-702a04e25700.res_partner_test20", "Junjun wala"],
"partner_address": {
"__id": "base:5af1272e-dd26-11e0-b65e-701a04e25543.res_partner_address_7wdsjasdjh",
"__module": "base",
@ -91,7 +92,7 @@
"date_invoice": time.strftime('%Y-%m-%d'),
"name": "sample invoice",
"tax_line": [{
"__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.account_invoice_tax-4g4EutbiEMVl",
"__id": "account:b33adf8a-decd-11f0-a4de-702a04e25700.account_invoice_tax-4g4EutbiEMVl",
"__module": "account",
"__model": "account.invoice.tax",
"amount": 1000.0,
@ -102,21 +103,21 @@
"invoice_line": [{
"__module": "account",
"__model": "account.invoice.line",
"__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.account_invoice_line-1RP3so",
"uos_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_uom_unit", "Unit"],
"__id": "account:b33adf8a-decd-11f0-a4de-702a04e25700.account_invoice_line-1RP3so",
"uos_id": ["product:b33adf8a-decd-11f0-a4de-702a04e25700.product_uom_unit", "Unit"],
"name": "PC Assemble SC234",
"price_unit": 10.0,
"product_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_product_3", "[PCSC234] PC Assemble SC234"],
"product_id": ["product:b33adf8a-decd-11f0-a4de-702a04e25700.product_product_3", "[PCSC234] PC Assemble SC234"],
"quantity": 1.0
},
{
"__module": "account",
"__model": "account.invoice.line",
"__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.account_invoice_line-u2XV5",
"uos_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_uom_unit", "Unit"],
"__id": "account:b33adf8a-decd-11f0-a4de-702a04e25700.account_invoice_line-u2XV5",
"uos_id": ["product:b33adf8a-decd-11f0-a4de-702a04e25700.product_uom_unit", "Unit"],
"name": "PC on Demand",
"price_unit": 100.0,
"product_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_product_5", "[PC-DEM] PC on Demand"],
"product_id": ["product:b33adf8a-decd-11f0-a4de-702a04e25700.product_product_5", "[PC-DEM] PC on Demand"],
"quantity": 5.0
}]
}
@ -125,12 +126,13 @@
invoice_new = self.browse(cr, uid, invoice_id)
# check bank info on partner
assert invoice_new.partner_id.supplier, "Imported partner should be a supplier, as we just imported the document as a supplier invoice"
assert len(invoice_new.partner_id.bank_ids) == 1, "Expected 1 bank entry related to partner"
bank_info = invoice_new.partner_id.bank_ids[0]
assert bank_info.acc_number == "Sample bank: 123465789-156113", 'Expected "Sample bank: 123465789-156113", got %s' % bank_info.acc_number
assert bank_info.acc_number == "Sample bank: 70-123465789-156113", 'Expected "Sample bank: 70-123465789-156113", got %s' % bank_info.acc_number
assert invoice_new.partner_id.supplier, 'Imported Partner is not marked as supplier'
assert invoice_new.reference == time.strftime("SAJ/%Y/002"), "internal number is not stored in reference"
assert invoice_new.reference == time.strftime("SAJ/%Y/070"), "internal number is not stored in reference"
assert invoice_new.reference_type == 'none', "reference type is not set to 'none'"
assert invoice_new.internal_number == False, "internal number is not reset"
assert invoice_new.journal_id.id, "journal id is not selected"
@ -152,3 +154,111 @@
for inv_tax in invoice_new.tax_line:
assert inv_tax.manual, "tax line not set to manual"
assert inv_tax.account_id, "missing tax line account"
-
Then I import a sample EDI document of another customer invoice from OpenERP 6.1 (to test backwards compatibility)
-
!python {model: account.invoice}: |
import time
edi_document = {
"__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.random_invoice_763jsms",
"__module": "account",
"__model": "account.invoice",
"__version": [6,1,0],
"internal_number": time.strftime("SAJ/%Y/061"),
"company_address": {
"__id": "base:b22acf7a-ddcd-11e0-a4db-701a04e25543.main_address",
"__module": "base",
"__model": "res.partner.address",
"city": "Gerompont",
"zip": "1367",
"country_id": ["base:b22acf7a-ddcd-11e0-a4db-701a04e25543.be", "Belgium"],
"phone": "(+32).81.81.37.00",
"street": "Chaussee de Namur 40",
"bank_ids": [
["base:b22acf7a-ddcd-11e0-a4db-701a04e25543.res_partner_bank-ZrTWzesfsdDJzGbp","Sample bank: 123465789-156113"]
],
},
"company_id": ["account:b22acf7a-ddcd-11e0-a4db-701a04e25543.res_company_test11", "Thomson pvt. ltd."],
"currency": {
"__id": "base:b22acf7a-ddcd-11e0-a4db-701a04e25543.EUR",
"__module": "base",
"__model": "res.currency",
"code": "EUR",
"symbol": "€",
},
"partner_id": ["account:b22acf7a-ddcd-11e0-a4db-701a04e25543.res_partner_test20", "Junjun wala"],
"partner_address": {
"__id": "base:5af1272e-dd26-11e0-b65e-701a04e25543.res_partner_address_7wdsjasdjh",
"__module": "base",
"__model": "res.partner.address",
"phone": "(+32).81.81.37.00",
"street": "Chaussee de Namur 40",
"city": "Gerompont",
"zip": "1367",
"country_id": ["base:5af1272e-dd26-11e0-b65e-701a04e25543.be", "Belgium"],
},
"date_invoice": time.strftime('%Y-%m-%d'),
"name": "sample invoice",
"tax_line": [{
"__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.account_invoice_tax-4g4EutbiEMVl",
"__module": "account",
"__model": "account.invoice.tax",
"amount": 1000.0,
"manual": True,
"name": "sale tax",
}],
"type": "out_invoice",
"invoice_line": [{
"__module": "account",
"__model": "account.invoice.line",
"__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.account_invoice_line-1RP3so",
"uos_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_uom_unit", "PCE"],
"name": "Basic PC",
"price_unit": 10.0,
"product_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_product_pc1", "[PC1] Basic PC"],
"quantity": 1.0
},
{
"__module": "account",
"__model": "account.invoice.line",
"__id": "account:b22acf7a-ddcd-11e0-a4db-701a04e25543.account_invoice_line-u2XV5",
"uos_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_uom_unit", "PCE"],
"name": "Medium PC",
"price_unit": 100.0,
"product_id": ["product:b22acf7a-ddcd-11e0-a4db-701a04e25543.product_product_pc3", "[PC3] Medium PC"],
"quantity": 5.0
}]
}
invoice_id = self.edi_import(cr, uid, edi_document, context=context)
assert invoice_id, 'EDI import failed'
invoice_new = self.browse(cr, uid, invoice_id)
# check bank info on partner
assert invoice_new.partner_id.supplier, "Imported partner should be a supplier, as we just imported the document as a supplier invoice"
assert len(invoice_new.partner_id.bank_ids) == 1, "Expected 1 bank entry related to partner"
bank_info = invoice_new.partner_id.bank_ids[0]
assert bank_info.acc_number == "Sample bank: 123465789-156113", 'Expected "Sample bank: 123465789-156113", got %s' % bank_info.acc_number
assert invoice_new.partner_id.supplier, 'Imported Partner is not marked as supplier'
assert invoice_new.reference == time.strftime("SAJ/%Y/061"), "internal number is not stored in reference"
assert invoice_new.reference_type == 'none', "reference type is not set to 'none'"
assert invoice_new.internal_number == False, "internal number is not reset"
assert invoice_new.journal_id.id, "journal id is not selected"
assert invoice_new.type == 'in_invoice', "Invoice type was not set properly"
assert len(invoice_new.invoice_line) == 2, "invoice lines are not same"
for inv_line in invoice_new.invoice_line:
if inv_line.name == 'Basic PC':
assert inv_line.uos_id.name == "PCE" , "uom is not same"
assert inv_line.price_unit == 10 , "price unit is not same"
assert inv_line.quantity == 1 , "product qty is not same"
assert inv_line.price_subtotal == 10, "price sub total is not same"
elif inv_line.name == 'Medium PC':
assert inv_line.uos_id.name == "PCE" , "uom is not same"
assert inv_line.price_unit == 100 , "price unit is not same"
assert inv_line.quantity == 5 , "product qty is not same"
assert inv_line.price_subtotal == 500, "price sub total is not same"
else:
raise AssertionError('unknown invoice line: %s' % inv_line)
for inv_tax in invoice_new.tax_line:
assert inv_tax.manual, "tax line not set to manual"
assert inv_tax.account_id, "missing tax line account"

View File

@ -34,7 +34,8 @@
</field>
</record>
<!-- where and when is this view used?? -->
<!-- This general view is used in
Invoicing - Journal Entries - Journal Vouchers -->
<record model="ir.ui.view" id="view_voucher_form">
<field name="name">account.voucher.form</field>
<field name="model">account.voucher</field>

View File

@ -0,0 +1,79 @@
# Macedonian translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
"PO-Revision-Date: 2012-11-20 17:57+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Macedonian <mk@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-11-21 04:48+0000\n"
"X-Generator: Launchpad (build 16293)\n"
#. module: analytic_user_function
#: field:analytic.user.funct.grid,product_id:0
msgid "Product"
msgstr "Производ"
#. module: analytic_user_function
#: model:ir.model,name:analytic_user_function.model_analytic_user_funct_grid
msgid "Relation table between users and products on a analytic account"
msgstr ""
#. module: analytic_user_function
#: constraint:hr.analytic.timesheet:0
msgid "You cannot modify an entry in a Confirmed/Done timesheet !."
msgstr ""
#. module: analytic_user_function
#: field:analytic.user.funct.grid,account_id:0
#: model:ir.model,name:analytic_user_function.model_account_analytic_account
msgid "Analytic Account"
msgstr "Аналитичко конто"
#. module: analytic_user_function
#: view:account.analytic.account:0
#: field:account.analytic.account,user_product_ids:0
msgid "Users/Products Rel."
msgstr ""
#. module: analytic_user_function
#: field:analytic.user.funct.grid,user_id:0
msgid "User"
msgstr "Корисник"
#. module: analytic_user_function
#: code:addons/analytic_user_function/analytic_user_function.py:96
#: code:addons/analytic_user_function/analytic_user_function.py:131
#, python-format
msgid "There is no expense account define for this product: \"%s\" (id:%d)"
msgstr ""
#. module: analytic_user_function
#: code:addons/analytic_user_function/analytic_user_function.py:95
#: code:addons/analytic_user_function/analytic_user_function.py:130
#, python-format
msgid "Error !"
msgstr "Грешка !"
#. module: analytic_user_function
#: constraint:account.analytic.account:0
msgid "Error! You can not create recursive analytic accounts."
msgstr ""
#. module: analytic_user_function
#: model:ir.model,name:analytic_user_function.model_hr_analytic_timesheet
msgid "Timesheet Line"
msgstr ""
#. module: analytic_user_function
#: view:analytic.user.funct.grid:0
msgid "User's Product for this Analytic Account"
msgstr ""

View File

@ -6,7 +6,7 @@
<menuitem name="Association"
id="base.menu_association"
groups="base.group_user"
sequence="70"/>
sequence="45"/>
<menuitem name="Configuration" id="base.menu_event_config" parent="base.menu_association" sequence="30"/>
<menuitem name="Association" id="base.menu_report_association" parent="base.menu_reporting" sequence="23"/>

View File

@ -25,10 +25,10 @@
'version': '1.0',
'category': 'Tools',
'description': """
Allow users to login through Google OAuth2.
===========================================
Allow users to login through OAuth2 Provider.
=============================================
""",
'author': 'Victor Tabuenca',
'author': 'OpenERP s.a.',
'maintainer': 'OpenERP s.a.',
'website': 'http://www.openerp.com',
'depends': ['base', 'web', 'base_setup'],

View File

@ -39,6 +39,8 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_oauth_providers" parent="base.menu_users" name="OAuth Providers" action="action_oauth_provider" sequence="30"/>
<menuitem id="menu_oauth_providers" name="OAuth Providers"
parent="base.menu_users" sequence="30"
action="action_oauth_provider" groups="base.group_no_one"/>
</data>
</openerp>

View File

@ -34,7 +34,6 @@ class Controller(openerp.addons.web.http.Controller):
def retrieve(self, req, dbname, token):
""" retrieve the user info (name, login or email) corresponding to a signup token """
registry = RegistryManager.get(dbname)
user_info = None
with registry.cursor() as cr:
res_partner = registry.get('res.partner')
user_info = res_partner.signup_retrieve_info(cr, openerp.SUPERUSER_ID, token)

View File

@ -23,9 +23,7 @@ import time
import urllib
import urlparse
import openerp
from openerp.osv import osv, fields
from openerp import SUPERUSER_ID
from openerp.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
from openerp.tools.safe_eval import safe_eval
@ -35,7 +33,7 @@ class SignupError(Exception):
def random_token():
# the token has an entropy of about 120 bits (6 bits/char * 20 chars)
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
return ''.join(random.choice(chars) for i in xrange(20))
return ''.join(random.choice(chars) for _ in xrange(20))
def now():
return time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
@ -51,29 +49,44 @@ class res_partner(osv.Model):
(not partner.signup_expiration or dt <= partner.signup_expiration)
return res
def _get_signup_url(self, cr, uid, ids, name, arg, context=None):
""" determine a signup url for a given partner """
base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
# if required, make sure that every partner without user has a valid signup token
if context and context.get('signup_valid'):
unsigned_ids = [p.id for p in self.browse(cr, uid, ids, context) if not p.user_ids]
self.signup_prepare(cr, uid, unsigned_ids, context=context)
def _get_signup_url_for_action(self, cr, uid, ids, action='login', view_type=None, menu_id=None, res_id=None, context=None):
""" generate a signup url for the given partner ids and action, possibly overriding
the url state components (menu_id, id, view_type) """
res = dict.fromkeys(ids, False)
base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
for partner in self.browse(cr, uid, ids, context):
# when required, make sure the partner has a valid signup token
if context and context.get('signup_valid') and not partner.user_ids:
self.signup_prepare(cr, uid, [partner.id], context=context)
action_template = None
params = {
'action': urllib.quote(action),
'db': urllib.quote(cr.dbname),
}
if partner.signup_token:
params = (urllib.quote(cr.dbname), urllib.quote(partner.signup_token))
res[partner.id] = urlparse.urljoin(base_url, "#action=login&db=%s&token=%s" % params)
action_template = "?db=%(db)s#action=%(action)s&token=%(token)s"
params['token'] = urllib.quote(partner.signup_token)
elif partner.user_ids:
user = partner.user_ids[0]
params = (urllib.quote(cr.dbname), urllib.quote(user.login))
res[partner.id] = urlparse.urljoin(base_url, "#action=login&db=%s&login=%s" % params)
action_template = "?db=%(db)s#action=%(action)s&db=%(db)s&login=%(login)s"
params['login'] = urllib.quote(partner.user_ids[0].login)
if action_template:
if view_type:
action_template += '&view_type=%s' % urllib.quote(view_type)
if menu_id:
action_template += '&menu_id=%s' % urllib.quote(str(menu_id))
if res_id:
action_template += '&id=%s' % urllib.quote(str(res_id))
res[partner.id] = urlparse.urljoin(base_url, action_template % params)
return res
def _get_signup_url(self, cr, uid, ids, name, arg, context=None):
""" proxy for function field towards actual implementation """
return self._get_signup_url_for_action(cr, uid, ids, context=context)
_columns = {
'signup_token': fields.char(size=24, string='Signup Token'),
'signup_expiration': fields.datetime(string='Signup Expiration'),
'signup_token': fields.char('Signup Token'),
'signup_expiration': fields.datetime('Signup Expiration'),
'signup_valid': fields.function(_get_signup_valid, type='boolean', string='Signup Token is Valid'),
'signup_url': fields.function(_get_signup_url, type='char', string='Signup URL'),
}

View File

@ -16,7 +16,7 @@
<group col="4">
<field name="name"/>
<field name="model_id"/>
<field name="filter_id" domain="[('model_id','=',model)]" context="{'default_model_id': model}"/>
<field name="filter_id" domain="[('model_id','=',model), ('user_id', '=', False)]" context="{'default_model_id': model}"/>
<field name="sequence"/>
<field name="active"/>
<field name="model" invisible="1"/>

View File

@ -1,32 +0,0 @@
# Arabic translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-08-23 01:58+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Arabic <ar@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "قاعدة أساسية لأدوات البرامج"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Bulgarian translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-18 09:39+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Bulgarian <bg@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Обща база за модули на Инструменти"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Catalan translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-03-13 17:59+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Catalan <ca@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Base comú per a mòduls eines"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Czech translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2012-04-06 06:17+0000\n"
"Last-Translator: Jiří Hajda <robie@centrum.cz>\n"
"Language-Team: Czech <cs@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Obecný základ pro nástrojové moduly"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Danish translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-11-08 10:44+0000\n"
"Last-Translator: OpenERP Danmark / Mikhael Saxtorph <Unknown>\n"
"Language-Team: Danish <da@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Fælles grundlag for værktøjsmoduler"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# German translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-15 15:36+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: German <de@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Gemeinsame Basis für Module \"Tools\""
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# English (United Kingdom) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-08-25 11:52+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Common base for tools modules"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Spanish translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-15 15:36+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Base común para módulos herramientas"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Spanish (Argentina) translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2012-06-18 18:37+0000\n"
"Last-Translator: Eduardo Alberto Calvo <Unknown>\n"
"Language-Team: Spanish (Argentina) <es_AR@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Base común para módulos herramientas"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Spanish (Chile) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-10-03 16:53+0000\n"
"Last-Translator: David Acevedo Toledo <Unknown>\n"
"Language-Team: Spanish (Chile) <es_CL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Base común para módulos de herramientas"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,34 +0,0 @@
# Spanish translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2012-02-13 19:12+0000\n"
"Last-Translator: Carlos Vásquez (CLEARCORP) "
"<carlos.vasquez@clearcorp.co.cr>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
"Language: es\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Base común para módulos herramientas"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Spanish (Ecuador) translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2012-03-24 04:09+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Spanish (Ecuador) <es_EC@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Base común para módulos herramientas"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Spanish (Paraguay) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-03-18 12:37+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Spanish (Paraguay) <es_PY@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Base común para módulos herramientas"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Persian translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-12-19 09:39+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Persian <fa@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "پایه‌ی معمول برای ماژول‌های ابزار"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Finnish translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-15 15:36+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Finnish <fi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Yhteinen pohja työkalumoduleille"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# French translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-15 15:36+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: French <fr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Base commune pour les modules utilitaires"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Galician translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-15 15:36+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Galician <gl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Base común para módulos de ferramentas"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Gujarati translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2012-04-23 06:10+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Gujarati <gu@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr ""
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Hindi translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-15 15:36+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Hindi <hi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "उपकरण मॉड्यूल के लिए सामान्य आधार"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Croatian translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-12-19 11:40+0000\n"
"Last-Translator: Tomislav Bosnjakovic <Unknown>\n"
"Language-Team: Croatian <hr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Zajednička osnova za alatne module"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,30 +0,0 @@
# Hungarian translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2012-11-13 16:00+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Hungarian <hu@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-11-14 04:40+0000\n"
"X-Generator: Launchpad (build 16251)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr ""
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""

View File

@ -1,32 +0,0 @@
# Indonesian translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-15 15:36+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Indonesian <id@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Dasar umum untuk modul alat"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Italian translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-15 15:36+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Italian <it@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Base comune per moduli di strumenti"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Japanese translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2012-03-31 18:52+0000\n"
"Last-Translator: Masaki Yamaya <Unknown>\n"
"Language-Team: Japanese <ja@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "ツールモジュールの共通基盤"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,30 +0,0 @@
# Lithuanian translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2012-08-28 13:53+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Lithuanian <lt@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr ""
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""

View File

@ -1,32 +0,0 @@
# Mongolian translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2012-07-08 19:30+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Mongolian <mn@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Багажийн модулиудын ерөнхий суурь"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-15 15:36+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Felles base for verktøy moduler"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Dutch translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-16 11:39+0000\n"
"Last-Translator: Douwe Wullink (Dypalio) <Unknown>\n"
"Language-Team: Dutch <nl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Algemene basis voor tools modules"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Dutch (Belgium) translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2012-03-01 17:18+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Gemeenschappelijke basis voor hulpmiddelen"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-11-20 09:19+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Basa comuna pels moduls utilitaris"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Portuguese translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-12-10 12:08+0000\n"
"Last-Translator: Paulino Ascenção <Unknown>\n"
"Language-Team: Portuguese <pt@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Base comum para módulos de ferramentas"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Brazilian Portuguese translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-16 22:10+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Base Comum para módulos de ferramentas"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Romanian translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2012-01-03 16:01+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Romanian <ro@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Baza comuna pentru modulele unelte"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Russian translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-03-09 15:57+0000\n"
"Last-Translator: Stanislav Hanzhin <Unknown>\n"
"Language-Team: Russian <ru@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Общая основа для всех модулей-инструментов"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Slovak translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-21 08:17+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Slovak <sk@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Spoločný základ pre nástroje modulov"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Slovenian translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-05-22 17:15+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Slovenian <sl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Skupna osnova za module orodij"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,30 +0,0 @@
# Albanian translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-03-28 15:36+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Albanian <sq@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr ""
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""

View File

@ -1,32 +0,0 @@
# Serbian Latin translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-10-06 13:41+0000\n"
"Last-Translator: Milan Milosevic <Unknown>\n"
"Language-Team: Serbian Latin <sr@latin@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Uobičajena osnova za alatne module"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"modul: base_tools\n"
" "

View File

@ -1,32 +0,0 @@
# Swedish translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-11-10 15:12+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Swedish <sv@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Gemensam bas för verktygsmoduler"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Turkish translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-02-15 15:36+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Turkish <tr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Araçlar modülleri için ortak taban"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Vietnamese translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-05-04 18:47+0000\n"
"Last-Translator: OpenBMS JSC <Unknown>\n"
"Language-Team: Vietnamese <vi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Cơ sở chung cho mô-đun công cụ"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Chinese (Simplified) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-06-29 01:21+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "常见的基础工具模块"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -1,32 +0,0 @@
# Chinese (Traditional) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-09-27 14:45+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-10-30 05:34+0000\n"
"X-Generator: Launchpad (build 16206)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "工具模組共同基礎"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "

View File

@ -99,7 +99,6 @@ Dashboard for CRM will include:
'board_crm_view.xml',
'res_config_view.xml',
],
'demo': [
'crm_demo.xml',

View File

@ -46,6 +46,7 @@ Thanks,
<field name="name">Filter on leads which are draft.</field>
<field name="model_id">crm.lead</field>
<field name="domain">[('state','=','draft')]</field>
<field name="user_id" eval="False"/>
</record>
<!-- automated actions -->
@ -64,6 +65,7 @@ Thanks,
<field name="name">Filter on leads which come from USA.</field>
<field name="model_id">crm.lead</field>
<field name="domain">[('country_id','=','United States')]</field>
<field name="user_id" eval="False"/>
</record>
<record id="rule_set_followers_lead" model="base.action.rule">

View File

@ -832,7 +832,7 @@ class crm_lead(base_stage, format_address, osv.osv):
}
for line in msg.get('body', '').split('\n'):
line = line.strip()
res = tools.misc.command_re.match(line)
res = tools.command_re.match(line)
if res and maps.get(res.group(1).lower()):
key = maps.get(res.group(1).lower())
update_vals[key] = res.group(2).lower()
@ -846,7 +846,7 @@ class crm_lead(base_stage, format_address, osv.osv):
def stage_set_send_note(self, cr, uid, ids, stage_id, context=None):
""" Override of the (void) default notification method. """
stage_name = self.pool.get('crm.case.stage').name_get(cr, uid, [stage_id], context=context)[0][1]
return self.message_post(cr, uid, ids, body= _("Stage changed to <b>%s</b>.") % (stage_name), context=context)
return self.message_post(cr, uid, ids, body=_("Stage changed to <b>%s</b>.") % (stage_name), subtype="mt_crm_stage", context=context)
def case_get_note_msg_prefix(self, cr, uid, lead, context=None):
if isinstance(lead, (int, long)):
@ -855,17 +855,17 @@ class crm_lead(base_stage, format_address, osv.osv):
def create_send_note(self, cr, uid, ids, context=None):
for id in ids:
message = _("%s has been <b>created</b>.")% (self.case_get_note_msg_prefix(cr, uid, id, context=context))
message = _("%s has been <b>created</b>.") % (self.case_get_note_msg_prefix(cr, uid, id, context=context))
self.message_post(cr, uid, [id], body=message, context=context)
return True
def case_mark_lost_send_note(self, cr, uid, ids, context=None):
message = _("Opportunity has been <b>lost</b>.")
return self.message_post(cr, uid, ids, body=message, context=context)
return self.message_post(cr, uid, ids, body=message, subtype="mt_crm_lost", context=context)
def case_mark_won_send_note(self, cr, uid, ids, context=None):
message = _("Opportunity has been <b>won</b>.")
return self.message_post(cr, uid, ids, body=message, context=context)
return self.message_post(cr, uid, ids, body=message, subtype="mt_crm_won", context=context)
def schedule_phonecall_send_note(self, cr, uid, ids, phonecall_id, action, context=None):
phonecall = self.pool.get('crm.phonecall').browse(cr, uid, [phonecall_id], context=context)[0]

View File

@ -154,5 +154,21 @@
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
</record>
<!-- mail subtype -->
<record id="mail.mt_crm_won" model="mail.message.subtype">
<field name="name">Won</field>
<field name="res_model">crm.lead</field>
</record>
<record id="mail.mt_crm_lost" model="mail.message.subtype">
<field name="name">Lost</field>
<field name="res_model">crm.lead</field>
<field name="default" eval="False"/>
</record>
<record id="mail.mt_crm_stage" model="mail.message.subtype">
<field name="name">Stage Changed</field>
<field name="res_model">crm.lead</field>
<field name="default" eval="False"/>
</record>
</data>
</openerp>

View File

@ -324,12 +324,14 @@ Andrew</field>
<record id="crm_case_15" model="crm.lead">
<field name="type">opportunity</field>
<field name="name">Plan to buy a Laptop</field>
<field eval="2570" name="planned_revenue"/>
<field name="name">Plan to buy RedHat servers</field>
<field eval="35000" name="planned_revenue"/>
<field eval="30.0" name="probability"/>
<field name="street">12 rue Albert Einstein</field>
<field name="country_id" ref="base.tr"/>
<field name="city">Istanbul</field>
<field name="street">69 rue de Chimay</field>
<field name="country_id" ref="base.be"/>
<field name="city">Wavre</field>
<field name="email_from">virginie@agrolait.com</field>
<field name="partner_id" ref="base.res_partner_2"/>
<field name="type_id" ref="type_lead8"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor1])]"/>
<field name="priority">1</field>
@ -337,7 +339,7 @@ Andrew</field>
<field eval="time.strftime('%Y-%m-10')" name="date_action"/>
<field name="title_action">Call to ask system requirement</field>
<field name="section_id" ref="crm_case_section_3"/>
<field name="user_id" ref="base.user_root"/>
<field name="user_id" ref="base.user_demo"/>
<field name="stage_id" ref="crm.stage_lead4"/>
<field eval="1" name="active"/>
</record>
@ -372,6 +374,8 @@ Andrew</field>
<field eval="100" name="planned_revenue"/>
<field eval="35.0" name="probability"/>
<field name="contact_name">Oliver Passot</field>
<field name="email_from">olivier.passo@balmer.inc.sa</field>
<field name="phone">+32 469 12 45 78</field>
<field name="partner_name">BalmerInc S.A.</field>
<field name="street">Rue des Palais 51, bte 33</field>
<field name="country_id" ref="base.be"/>
@ -391,14 +395,16 @@ Andrew</field>
<record id="crm_case_18" model="crm.lead">
<field name="type">opportunity</field>
<field name="name">Student's training plan in your Organization</field>
<field name="name">Trainee's training plan in your Organization</field>
<field eval="35000" name="planned_revenue"/>
<field eval="25.0" name="probability"/>
<field name="contact_name">Leland Martinez</field>
<field name="partner_name">Toronto University</field>
<field name="street">2488 Queens Bay</field>
<field name="country_id" ref="base.ca"/>
<field name="city">Toronto</field>
<field name="email_from">info@deltapc.com</field>
<field name="partner_name">Delta PC</field>
<field name="city">Fremont</field>
<field name="street">3661 Station Street</field>
<field name="country_id" ref="base.us"/>
<field name="partner_id" ref="base.res_partner_4"/>
<field name="type_id" ref="type_lead8"/>
<field name="categ_ids" eval="[(6, 0, [categ_oppor4,categ_oppor6])]"/>
<field name="priority">4</field>
@ -406,7 +412,7 @@ Andrew</field>
<field eval="time.strftime('%Y-%m-4')" name="date_action"/>
<field name="title_action">Call to define real needs about training</field>
<field name="section_id" ref="crm_case_section_2"/>
<field name="user_id" ref="base.user_root"/>
<field name="user_id" ref="base.user_demo"/>
<field name="stage_id" ref="crm.stage_lead3"/>
<field eval="1" name="active"/>
</record>
@ -542,77 +548,127 @@ Andrew</field>
<field eval="1" name="active"/>
</record>
<!-- Some messages linked to the previous opportunity -->
<record id="message_email0" model="mail.message">
<field name="subject">Plan to buy a Laptop</field>
<!-- Unsubscribe Admin from case15, subscribe Demo -->
<record id="crm_case_15" model="crm.lead">
<field name="message_follower_ids" eval="[(3, ref('base.partner_root')), (4, ref('base.partner_demo'))]"/>
</record>
<record id="crm_case_17" model="crm.lead">
<field name="message_follower_ids" eval="[(3, ref('base.partner_root')), (4, ref('base.partner_demo'))]"/>
</record>
<record id="crm_case_18" model="crm.lead">
<field name="message_follower_ids" eval="[(4, ref('base.partner_demo'))]"/>
</record>
<!-- Some messages linked to the previous opportunities -->
<record id="msg_case15_attach1" model="ir.attachment">
<field name="datas">bWlncmF0aW9uIHRlc3Q=</field>
<field name="datas_fname">YourCompany2012.doc</field>
<field name="name">YourCompany2012.doc</field>
</record>
<record id="msg_case15_1" model="mail.message">
<field name="subject">Plan to buy RedHat servers</field>
<field name="model">crm.lead</field>
<field name="res_id" ref="crm_case_15"/>
<field name="body">&lt;![CDATA[Email0 inquiry]]&gt;&lt;div&gt;&lt;font size="2"&gt;Hello,&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size="2"&gt;&lt;br&gt;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size="2"&gt;I am interested in your company's product and I plan to buy a new laptop having latest technologies and affordable price.&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font size="2"&gt;Can you please send me product catalogue?&lt;/font&gt;&lt;/div&gt;</field>
<field name="body"><![CDATA[<div>
<p>Hello,</p>
<p>I am interested in your company's products and I plan to buy a new laptop having latest technologies as well as an affordable price.</p>
<p>Could you please send me the product catalog?</p>]]></field>
<field name="type">email</field>
<field name="subtype_id" ref="mail.mt_comment"/>
<field name="email_from">virginie@agrolait.fr</field>
<field name="author_id" eval="False"/>
</record>
<record id="message_note0" model="mail.message">
<field name="subject">Re: Plan to buy a Laptop</field>
<record id="msg_case15_1_1" model="mail.message">
<field name="subject">Re: Plan to buy RedHat servers</field>
<field name="model">crm.lead</field>
<field name="res_id" ref="crm_case_15"/>
<field name="type">comment</field>
<field name="body">Dear Customer,
Thanks for showing interest in our products.
We have attached the catalogue,
We would like to know your interests, so let us know when we can call you for more details.
Regards</field>
<field name="parent_id" ref="message_email0"/>
<field name="author_id" ref="base.partner_root"/>
<field name="subtype_id" ref="mail.mt_comment"/>
<field name="body"><![CDATA[<p>Dear customer,<br/>
Thanks for showing interest in our products! As requested, I send to you our products catalog.<br />
To be able to finely tune the solution, we would like to know precise needs. This way we wil be able to help you choosing the right infrastructure according to your requirements.<br/>
Best regards,</p>]]></field>
<field name="parent_id" ref="msg_case15_1"/>
<field name="author_id" ref="base.partner_demo"/>
<field name="attachment_ids" eval="[(6, 0, [ref('msg_case15_attach1')])]"/>
</record>
<record id="message_note0_comment0" model="mail.message">
<field name="subject">Re: Plan to buy a Laptop</field>
<record id="msg_case15_1_2" model="mail.message">
<field name="subject">Re: Plan to buy RedHat servers</field>
<field name="model">crm.lead</field>
<field name="res_id" ref="crm_case_15"/>
<field name="type">comment</field>
<field name="body">&lt;div&gt;Thanks for the information,&lt;/div&gt;&lt;div&gt;I will visit the store soon.&lt;/div&gt;</field>
<field name="parent_id" ref="message_note0"/>
<field name="body"><![CDATA[<p>Thanks for the information!<br />I asked a precise specification to our technical expert. Here is what we precisely need:</p>
<ul>
<li>weekly backups, every Monday</li>
<li>backup time is not a blocking point for us, as we are closed all Monday, leaving time enough to perform the backup</li>
<li>reliability is very important; we need redundant servers and rollback capacity</li>
<li>a total capacity of about 2 TB</li>
</ul>
<p>Best regards,</p>]]></field>
<field name="type">email</field>
<field name="subtype_id" ref="mail.mt_comment"/>
<field name="parent_id" ref="msg_case15_1"/>
<field name="email_from">virginie@agrolait.fr</field>
<field name="author_id" eval="False"/>
</record>
<record id="msg_case15_1_3" model="mail.message">
<field name="subject">Re: Plan to buy RedHat servers</field>
<field name="model">crm.lead</field>
<field name="res_id" ref="crm_case_15"/>
<field name="body"><![CDATA[<p>Hello</p>
<p>After our phonecall and discussion with our technical experts, here is the offer of YourCompany. We believe it will meet every requirement you had in mind. Please feel free to contact me for any detail or technical detail that is not clear enough for you.</p>
<p>Notice that as agreed on phone, we offer you a <b>10% discount on the hardware</b>!</p>
<p>Best regards,</p>]]></field>
<field name="type">email</field>
<field name="parent_id" ref="msg_case15_1"/>
<field name="author_id" ref="base.partner_demo"/>
</record>
<record id="message_note0_comment1" model="mail.message">
<field name="subject">Re: Plan to buy a Laptop</field>
<record id="msg_case17_1" model="mail.message">
<field name="subject">Catalog to send</field>
<field name="model">crm.lead</field>
<field name="res_id" ref="crm_case_15"/>
<field name="res_id" ref="crm_case_17"/>
<field name="body"><![CDATA[<p>They just want pricing information about our services. I think sending our catalog should be sufficient.</p>]]></field>
<field name="type">comment</field>
<field name="body">&lt;font color="#1f1f1f"&gt;Can you tell me if the store is open at 9:00 PM?&lt;/b&gt;&lt;/font&gt;</field>
<field name="parent_id" ref="message_note0"/>
<field name="subtype_id" ref="mail.mt_comment"/>
<field name="author_id" ref="base.partner_demo"/>
</record>
<record id="message_email1" model="mail.message">
<field name="subject">Re: Plan to buy a Laptop</field>
<record id="msg_case18_1" model="mail.message">
<field name="subject">Inquiry</field>
<field name="model">crm.lead</field>
<field name="res_id" ref="crm_case_15"/>
<field name="body">Yes, its open till 10:00 PM, you are welcome!</field>
<field name="type">email</field>
<field name="author_id" ref="base.partner_root"/>
<field name="res_id" ref="crm_case_18"/>
<field name="body"><![CDATA[<p>Hello!<br />
I am Leland Martinez, from the Delta PC. Maybe you remember, we talked a bit last month at this international conference.<br />
We would like to attend a training, but we are not quite sure about what we can ask. Maybe we should meet and talk about that?<br />
Best regards,</p>]]></field>
<field name="type">comment</field>
<field name="subtype_id" ref="mail.mt_comment"/>
<field name="author_id" ref="base.res_partner_4"/>
<field name="favorite_user_ids" eval="[(6, 0, [ref('base.user_root')])]"/>
</record>
<record id="message_email_12" model="mail.message">
<record id="msg_case18_2" model="mail.message">
<field name="model">crm.lead</field>
<field name="res_id" ref="crm_case_18"/>
<field name="body"><![CDATA[<p>It seems very interesting. As you say, first of all we will have to define precisely what the training will be about, and your precise needs.</p>]]></field>
<field name="type">comment</field>
<field name="subtype_id" ref="mail.mt_comment"/>
<field name="parent_id" ref="msg_case18_1"/>
<field name="author_id" ref="base.partner_demo"/>
<field name="favorite_user_ids" eval="[(6, 0, [ref('base.user_root')])]"/>
</record>
<record id="msg_case1_1" model="mail.message">
<field name="subject">Inquiry</field>
<field name="model">crm.lead</field>
<field name="res_id" ref="crm_case_1"/>
<field name="body">Hello,
I am Jason from Le Club SARL.
I am intertested to attend a training organized in your company.
Can you send me the details ?</field>
<field name="body"><![CDATA[<p>Hello,<br />
I am Jason from Le Club SARL. I am interested to attend a training organized in your company.<br />
Can you send me the details ?</p>]]></field>
<field name="type">email</field>
</record>
<record id="message_email_13" model="mail.message">
<record id="msg_case2_1" model="mail.message">
<field name="subject">Need Details</field>
<field name="model">crm.lead</field>
<field name="res_id" ref="crm_case_2"/>
<field name="body">Want to know features and benifits to use the new software.</field>
<field name="body">Want to know features and benefits to use the new software.</field>
<field name="type">comment</field>
</record>
<!-- Call Function to set the opportunities as Unread -->
<function model="crm.lead" name="message_mark_as_unread"
eval="[ ref('crm_case_15'), ref('crm_case_16'),
ref('crm_case_23'), ref('crm_case_19')], {}"
/>
</data>
</openerp>

View File

@ -317,7 +317,7 @@
<div>
<b><field name="name"/></b>
<t t-if="record.planned_revenue.raw_value">
- <b><t t-esc="Math.round(record.planned_revenue.value)"/>
- <b><t t-esc="record.planned_revenue.value"/>
<field name="company_currency"/></b>
</t>
</div>

View File

@ -224,7 +224,7 @@ class crm_claim(base_stage, osv.osv):
}
for line in msg['body'].split('\n'):
line = line.strip()
res = tools.misc.command_re.match(line)
res = tools.command_re.match(line)
if res and maps.get(res.group(1).lower()):
key = maps.get(res.group(1).lower())
update_vals[key] = res.group(2).lower()

View File

@ -6,7 +6,7 @@
<menuitem name="Project"
id="base.menu_main_pm"
groups="base.group_sale_salesman"
sequence="90"/>
sequence="40"/>
<menuitem id="base.menu_aftersale" name="After-Sale Services"
groups="base.group_sale_salesman"

795
addons/crm_claim/i18n/nb.po Normal file
View File

@ -0,0 +1,795 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-11-20 12:52+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-11-21 04:48+0000\n"
"X-Generator: Launchpad (build 16293)\n"
#. module: crm_claim
#: field:crm.claim.report,nbr:0
msgid "# of Cases"
msgstr "# av Saker."
#. module: crm_claim
#: view:crm.claim:0
#: view:crm.claim.report:0
msgid "Group By..."
msgstr "Grupper etter ..."
#. module: crm_claim
#: view:crm.claim:0
msgid "Responsibilities"
msgstr "Ansvaret."
#. module: crm_claim
#: field:crm.claim,date_action_next:0
msgid "Next Action Date"
msgstr "Neste aksjonsdato"
#. module: crm_claim
#: selection:crm.claim.report,month:0
msgid "March"
msgstr "Mars"
#. module: crm_claim
#: field:crm.claim.report,delay_close:0
msgid "Delay to close"
msgstr "Forsinket mht lukking"
#. module: crm_claim
#: field:crm.claim,resolution:0
msgid "Resolution"
msgstr "Oppløsning"
#. module: crm_claim
#: field:crm.claim,company_id:0
#: view:crm.claim.report:0
#: field:crm.claim.report,company_id:0
msgid "Company"
msgstr "Firma"
#. module: crm_claim
#: field:crm.claim,email_cc:0
msgid "Watchers Emails"
msgstr ""
#. module: crm_claim
#: view:crm.claim.report:0
msgid "#Claim"
msgstr "#Krav"
#. module: crm_claim
#: model:ir.actions.act_window,help:crm_claim.crm_claim_stage_act
msgid ""
"You can create claim stages to categorize the status of every claim entered "
"in the system. The stages define all the steps required for the resolution "
"of a claim."
msgstr ""
#. module: crm_claim
#: code:addons/crm_claim/crm_claim.py:132
#, python-format
msgid "The claim '%s' has been opened."
msgstr "Kravet '% s' har blitt åpnet."
#. module: crm_claim
#: view:crm.claim:0
msgid "Date Closed"
msgstr "Dato lukket"
#. module: crm_claim
#: view:crm.claim.report:0
#: field:crm.claim.report,day:0
msgid "Day"
msgstr "Dag"
#. module: crm_claim
#: view:crm.claim:0
msgid "Add Internal Note"
msgstr "Legg til internt notat."
#. module: crm_claim
#: help:crm.claim,section_id:0
msgid ""
"Sales team to which Case belongs to.Define Responsible user and Email "
"account for mail gateway."
msgstr ""
#. module: crm_claim
#: view:crm.claim:0
msgid "Claim Description"
msgstr "Hevder Beskrivelse."
#. module: crm_claim
#: field:crm.claim,message_ids:0
msgid "Messages"
msgstr "Meldinger"
#. module: crm_claim
#: model:crm.case.categ,name:crm_claim.categ_claim1
msgid "Factual Claims"
msgstr ""
#. module: crm_claim
#: selection:crm.claim,state:0
#: selection:crm.claim.report,state:0
msgid "Cancelled"
msgstr "Kansellert"
#. module: crm_claim
#: model:crm.case.resource.type,name:crm_claim.type_claim2
msgid "Preventive"
msgstr "Forebyggende"
#. module: crm_claim
#: field:crm.claim.report,date_closed:0
msgid "Close Date"
msgstr "Lukkingsdato"
#. module: crm_claim
#: field:crm.claim,ref:0
msgid "Reference"
msgstr "Referanse"
#. module: crm_claim
#: view:crm.claim.report:0
msgid "Date of claim"
msgstr "Dato av krav."
#. module: crm_claim
#: view:crm.claim:0
msgid "All pending Claims"
msgstr "Alle utestående krav."
#. module: crm_claim
#: view:crm.claim.report:0
msgid "# Mails"
msgstr "# E-poster"
#. module: crm_claim
#: view:crm.claim:0
msgid "Reset to Draft"
msgstr "Sett tilbake til utkast"
#. module: crm_claim
#: view:crm.claim:0
#: field:crm.claim,date_deadline:0
#: field:crm.claim.report,date_deadline:0
msgid "Deadline"
msgstr "Frist"
#. module: crm_claim
#: view:crm.claim:0
#: field:crm.claim,partner_id:0
#: view:crm.claim.report:0
#: field:crm.claim.report,partner_id:0
#: model:ir.model,name:crm_claim.model_res_partner
msgid "Partner"
msgstr "Partner"
#. module: crm_claim
#: view:crm.claim.report:0
msgid "Month of claim"
msgstr ""
#. module: crm_claim
#: selection:crm.claim,type_action:0
#: selection:crm.claim.report,type_action:0
msgid "Preventive Action"
msgstr ""
#. module: crm_claim
#: field:crm.claim.report,section_id:0
msgid "Section"
msgstr "Seksjon"
#. module: crm_claim
#: view:crm.claim:0
msgid "Root Causes"
msgstr ""
#. module: crm_claim
#: field:crm.claim,user_fault:0
msgid "Trouble Responsible"
msgstr "Problemer ansvarlig."
#. module: crm_claim
#: field:crm.claim,priority:0
#: view:crm.claim.report:0
#: field:crm.claim.report,priority:0
msgid "Priority"
msgstr "Prioritet"
#. module: crm_claim
#: view:crm.claim:0
msgid "Send New Email"
msgstr "Send ny e-post."
#. module: crm_claim
#: view:crm.claim:0
#: selection:crm.claim,state:0
#: view:crm.claim.report:0
msgid "New"
msgstr "Ny"
#. module: crm_claim
#: view:crm.claim:0
#: view:crm.claim.report:0
msgid "Type"
msgstr "Type"
#. module: crm_claim
#: field:crm.claim,email_from:0
msgid "Email"
msgstr "E-post"
#. module: crm_claim
#: selection:crm.claim,priority:0
#: selection:crm.claim.report,priority:0
msgid "Lowest"
msgstr "Laveste"
#. module: crm_claim
#: field:crm.claim,action_next:0
msgid "Next Action"
msgstr "Neste handling"
#. module: crm_claim
#: view:crm.claim.report:0
msgid "My Sales Team(s)"
msgstr "Mine salgs lag"
#. module: crm_claim
#: model:crm.case.stage,name:crm_claim.stage_claim3
msgid "Won't fix"
msgstr "Vil ikke fikses."
#. module: crm_claim
#: field:crm.claim,create_date:0
msgid "Creation Date"
msgstr "Opprettelses dato."
#. module: crm_claim
#: field:crm.claim,name:0
msgid "Claim Subject"
msgstr ""
#. module: crm_claim
#: model:ir.actions.act_window,help:crm_claim.action_report_crm_claim
msgid ""
"Have a general overview of all claims processed in the system by sorting "
"them with specific criteria."
msgstr ""
#. module: crm_claim
#: selection:crm.claim.report,month:0
msgid "July"
msgstr "juli"
#. module: crm_claim
#: model:ir.actions.act_window,name:crm_claim.crm_claim_stage_act
msgid "Claim Stages"
msgstr "Krav stadier."
#. module: crm_claim
#: model:ir.ui.menu,name:crm_claim.menu_crm_case_claim-act
msgid "Categories"
msgstr "Kategorier"
#. module: crm_claim
#: view:crm.claim:0
#: field:crm.claim,stage_id:0
#: view:crm.claim.report:0
#: field:crm.claim.report,stage_id:0
msgid "Stage"
msgstr "Fase"
#. module: crm_claim
#: view:crm.claim:0
msgid "History Information"
msgstr "Historisk informasjon"
#. module: crm_claim
#: view:crm.claim:0
msgid "Dates"
msgstr "Datoer"
#. module: crm_claim
#: view:crm.claim:0
msgid "Contact"
msgstr "Kontakt"
#. module: crm_claim
#: view:crm.claim.report:0
msgid "Month-1"
msgstr "Måned-1"
#. module: crm_claim
#: model:ir.actions.act_window,name:crm_claim.action_report_crm_claim
#: model:ir.ui.menu,name:crm_claim.menu_report_crm_claim_tree
msgid "Claims Analysis"
msgstr ""
#. module: crm_claim
#: help:crm.claim.report,delay_close:0
msgid "Number of Days to close the case"
msgstr "Antall dager til sak lukkes."
#. module: crm_claim
#: model:ir.model,name:crm_claim.model_crm_claim_report
msgid "CRM Claim Report"
msgstr ""
#. module: crm_claim
#: model:crm.case.stage,name:crm_claim.stage_claim1
msgid "Accepted as Claim"
msgstr ""
#. module: crm_claim
#: model:crm.case.resource.type,name:crm_claim.type_claim1
msgid "Corrective"
msgstr "Korrigerende."
#. module: crm_claim
#: selection:crm.claim.report,month:0
msgid "September"
msgstr "September."
#. module: crm_claim
#: selection:crm.claim.report,month:0
msgid "December"
msgstr "Desember"
#. module: crm_claim
#: view:crm.claim.report:0
#: field:crm.claim.report,month:0
msgid "Month"
msgstr "Måned"
#. module: crm_claim
#: field:crm.claim,type_action:0
#: view:crm.claim.report:0
#: field:crm.claim.report,type_action:0
msgid "Action Type"
msgstr "Handlings type."
#. module: crm_claim
#: field:crm.claim,write_date:0
msgid "Update Date"
msgstr "Dato oppdatert."
#. module: crm_claim
#: view:crm.claim.report:0
msgid "Year of claim"
msgstr ""
#. module: crm_claim
#: view:crm.claim.report:0
msgid "Salesman"
msgstr "Salgs man."
#. module: crm_claim
#: field:crm.claim,categ_id:0
#: view:crm.claim.report:0
#: field:crm.claim.report,categ_id:0
msgid "Category"
msgstr "Kategori"
#. module: crm_claim
#: model:crm.case.categ,name:crm_claim.categ_claim2
msgid "Value Claims"
msgstr ""
#. module: crm_claim
#: view:crm.claim:0
msgid "Responsible User"
msgstr "Ansvarlig bruker."
#. module: crm_claim
#: help:crm.claim,email_cc:0
msgid ""
"These email addresses will be added to the CC field of all inbound and "
"outbound emails for this record before being sent. Separate multiple email "
"addresses with a comma"
msgstr ""
"Disse e-postadressene vil bli lagt til kopi-feltet for alle inngående og "
"utgående e-poster før de sendes. Skill flere e-postadresser med komma."
#. module: crm_claim
#: selection:crm.claim.report,state:0
msgid "Draft"
msgstr "Kladd"
#. module: crm_claim
#: selection:crm.claim,priority:0
#: selection:crm.claim.report,priority:0
msgid "Low"
msgstr "Lav"
#. module: crm_claim
#: field:crm.claim,date_closed:0
#: selection:crm.claim,state:0
#: selection:crm.claim.report,state:0
msgid "Closed"
msgstr "Lukket"
#. module: crm_claim
#: view:crm.claim:0
msgid "Reply"
msgstr "Svar"
#. module: crm_claim
#: view:crm.claim:0
#: selection:crm.claim,state:0
#: view:crm.claim.report:0
#: selection:crm.claim.report,state:0
msgid "Pending"
msgstr "Venter"
#. module: crm_claim
#: view:crm.claim:0
msgid "Communication & History"
msgstr "Kommunikasjon & Historikk"
#. module: crm_claim
#: selection:crm.claim.report,month:0
msgid "August"
msgstr "August"
#. module: crm_claim
#: selection:crm.claim,priority:0
#: selection:crm.claim.report,priority:0
msgid "Normal"
msgstr "Normal"
#. module: crm_claim
#: view:crm.claim:0
msgid "Global CC"
msgstr ""
#. module: crm_claim
#: selection:crm.claim.report,month:0
msgid "June"
msgstr "Juni"
#. module: crm_claim
#: view:res.partner:0
msgid "Partners Claim"
msgstr ""
#. module: crm_claim
#: field:crm.claim,partner_phone:0
msgid "Phone"
msgstr "Telefon"
#. module: crm_claim
#: field:crm.claim.report,user_id:0
msgid "User"
msgstr "Bruker"
#. module: crm_claim
#: field:crm.claim,active:0
msgid "Active"
msgstr "Aktiv"
#. module: crm_claim
#: selection:crm.claim.report,month:0
msgid "November"
msgstr "November"
#. module: crm_claim
#: view:crm.claim.report:0
msgid "Extended Filters..."
msgstr "Utvidet Filtere ..."
#. module: crm_claim
#: view:crm.claim:0
msgid "Closure"
msgstr ""
#. module: crm_claim
#: view:crm.claim.report:0
msgid "Search"
msgstr "Søk"
#. module: crm_claim
#: selection:crm.claim.report,month:0
msgid "October"
msgstr "Oktober"
#. module: crm_claim
#: selection:crm.claim.report,month:0
msgid "January"
msgstr "Januar"
#. module: crm_claim
#: view:crm.claim:0
#: field:crm.claim,date:0
msgid "Claim Date"
msgstr ""
#. module: crm_claim
#: help:crm.claim,email_from:0
msgid "These people will receive email."
msgstr "Disse personene vil motta e-post."
#. module: crm_claim
#: model:ir.actions.act_window,name:crm_claim.crm_claim_categ_action
msgid "Claim Categories"
msgstr "Krav kategorier."
#. module: crm_claim
#: view:crm.claim:0
#: view:crm.claim.report:0
#: model:ir.actions.act_window,name:crm_claim.act_claim_partner
#: model:ir.actions.act_window,name:crm_claim.act_claim_partner_address
#: model:ir.actions.act_window,name:crm_claim.crm_case_categ_claim0
#: model:ir.ui.menu,name:crm_claim.menu_crm_case_claims
#: field:res.partner,claims_ids:0
msgid "Claims"
msgstr "Kravene."
#. module: crm_claim
#: selection:crm.claim,type_action:0
#: selection:crm.claim.report,type_action:0
msgid "Corrective Action"
msgstr "Korrigerende handling."
#. module: crm_claim
#: model:crm.case.categ,name:crm_claim.categ_claim3
msgid "Policy Claims"
msgstr "Politikk krav."
#. module: crm_claim
#: view:crm.claim:0
msgid "History"
msgstr "Historie"
#. module: crm_claim
#: model:ir.model,name:crm_claim.model_crm_claim
#: model:ir.ui.menu,name:crm_claim.menu_config_claim
msgid "Claim"
msgstr "Krav"
#. module: crm_claim
#: selection:crm.claim,priority:0
#: selection:crm.claim.report,priority:0
msgid "Highest"
msgstr "Høyest"
#. module: crm_claim
#: field:crm.claim,partner_address_id:0
msgid "Partner Contact"
msgstr "Partnerkontakt"
#. module: crm_claim
#: view:crm.claim:0
#: field:crm.claim,state:0
#: view:crm.claim.report:0
#: field:crm.claim.report,state:0
msgid "State"
msgstr "Stat"
#. module: crm_claim
#: view:crm.claim:0
#: view:crm.claim.report:0
msgid "Done"
msgstr "Ferdig"
#. module: crm_claim
#: view:crm.claim:0
msgid "Claim Reporter"
msgstr "Krav rapporter."
#. module: crm_claim
#: view:crm.claim:0
#: view:crm.claim.report:0
msgid "Cancel"
msgstr "Avbryt"
#. module: crm_claim
#: view:crm.claim:0
msgid "Close"
msgstr "Lukke"
#. module: crm_claim
#: view:crm.claim:0
#: view:crm.claim.report:0
#: selection:crm.claim.report,state:0
msgid "Open"
msgstr "Åpne"
#. module: crm_claim
#: view:crm.claim:0
msgid "New Claims"
msgstr "Nye krav."
#. module: crm_claim
#: view:crm.claim:0
#: selection:crm.claim,state:0
msgid "In Progress"
msgstr "I arbeid"
#. module: crm_claim
#: view:crm.claim:0
#: field:crm.claim,user_id:0
msgid "Responsible"
msgstr "Ansvarlig"
#. module: crm_claim
#: view:crm.claim.report:0
msgid "Claims created in current year"
msgstr "Krav opprettet i nåværende år."
#. module: crm_claim
#: view:crm.claim:0
msgid "Unassigned Claims"
msgstr ""
#. module: crm_claim
#: view:crm.claim.report:0
msgid "Claims created in current month"
msgstr ""
#. module: crm_claim
#: field:crm.claim.report,delay_expected:0
msgid "Overpassed Deadline"
msgstr "Passert frist"
#. module: crm_claim
#: field:crm.claim,cause:0
msgid "Root Cause"
msgstr ""
#. module: crm_claim
#: view:crm.claim:0
msgid "Claim/Action Description"
msgstr "Krav/handling beskrivelse."
#. module: crm_claim
#: field:crm.claim,description:0
msgid "Description"
msgstr "Beskrivelse."
#. module: crm_claim
#: view:crm.claim:0
msgid "Search Claims"
msgstr "Søk krav"
#. module: crm_claim
#: field:crm.claim,section_id:0
#: view:crm.claim.report:0
msgid "Sales Team"
msgstr "Salgsteam"
#. module: crm_claim
#: selection:crm.claim.report,month:0
msgid "May"
msgstr "Mai"
#. module: crm_claim
#: view:crm.claim:0
msgid "Resolution Actions"
msgstr ""
#. module: crm_claim
#: model:ir.actions.act_window,help:crm_claim.crm_case_categ_claim0
msgid ""
"Record and track your customers' claims. Claims may be linked to a sales "
"order or a lot. You can send emails with attachments and keep the full "
"history for a claim (emails sent, intervention type and so on). Claims may "
"automatically be linked to an email address using the mail gateway module."
msgstr ""
#. module: crm_claim
#: field:crm.claim.report,email:0
msgid "# Emails"
msgstr "# E-poster"
#. module: crm_claim
#: model:crm.case.stage,name:crm_claim.stage_claim2
msgid "Actions Done"
msgstr "Handlinger ferdig."
#. module: crm_claim
#: view:crm.claim.report:0
msgid "Claims created in last month"
msgstr "Krav opprettet i den siste måneden."
#. module: crm_claim
#: model:crm.case.stage,name:crm_claim.stage_claim5
msgid "Actions Defined"
msgstr ""
#. module: crm_claim
#: view:crm.claim:0
msgid "Follow Up"
msgstr "Følg opp."
#. module: crm_claim
#: help:crm.claim,state:0
msgid ""
"The state is set to 'Draft', when a case is created. "
" \n"
"If the case is in progress the state is set to 'Open'. "
" \n"
"When the case is over, the state is set to 'Done'. "
" \n"
"If the case needs to be reviewed then the state is set to 'Pending'."
msgstr ""
#. module: crm_claim
#: selection:crm.claim.report,month:0
msgid "February"
msgstr "Februar"
#. module: crm_claim
#: view:crm.claim.report:0
#: field:crm.claim.report,name:0
msgid "Year"
msgstr "År"
#. module: crm_claim
#: view:crm.claim.report:0
msgid "My company"
msgstr "Min bedrift."
#. module: crm_claim
#: selection:crm.claim.report,month:0
msgid "April"
msgstr "April"
#. module: crm_claim
#: view:crm.claim.report:0
msgid "My Case(s)"
msgstr "Min(e) sak(er)"
#. module: crm_claim
#: field:crm.claim,id:0
msgid "ID"
msgstr "ID"
#. module: crm_claim
#: constraint:res.partner:0
msgid "Error ! You cannot create recursive associated members."
msgstr "Feil! Du kan ikke opprette rekursive tilknyttede medlemmer."
#. module: crm_claim
#: view:crm.claim:0
msgid "Actions"
msgstr "Handlinger"
#. module: crm_claim
#: selection:crm.claim,priority:0
#: selection:crm.claim.report,priority:0
msgid "High"
msgstr "Høy"
#. module: crm_claim
#: model:ir.actions.act_window,help:crm_claim.crm_claim_categ_action
msgid ""
"Create claim categories to better manage and classify your claims. Some "
"example of claims can be: preventive action, corrective action."
msgstr ""
#. module: crm_claim
#: field:crm.claim.report,create_date:0
msgid "Create Date"
msgstr "Opprettet dato."
#. module: crm_claim
#: view:crm.claim:0
msgid "In Progress Claims"
msgstr ""

View File

@ -133,7 +133,7 @@ class crm_helpdesk(base_state, base_stage, osv.osv):
}
for line in msg['body'].split('\n'):
line = line.strip()
res = tools.misc.command_re.match(line)
res = tools.command_re.match(line)
if res and maps.get(res.group(1).lower()):
key = maps.get(res.group(1).lower())
update_vals[key] = res.group(2).lower()

View File

@ -0,0 +1,742 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-11-21 11:04+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-11-22 05:08+0000\n"
"X-Generator: Launchpad (build 16293)\n"
#. module: crm_helpdesk
#: field:crm.helpdesk.report,delay_close:0
msgid "Delay to Close"
msgstr "Forsinkelse til lukking"
#. module: crm_helpdesk
#: field:crm.helpdesk.report,nbr:0
msgid "# of Cases"
msgstr "# av Saker."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
#: view:crm.helpdesk.report:0
msgid "Group By..."
msgstr "Grupper etter ..."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Today"
msgstr "I dag."
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,month:0
msgid "March"
msgstr "Mars."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "Helpdesk requests occurred in current year"
msgstr "Kundestøtte forespørsler skjedde i inneværende år."
#. module: crm_helpdesk
#: field:crm.helpdesk,company_id:0
#: view:crm.helpdesk.report:0
#: field:crm.helpdesk.report,company_id:0
msgid "Company"
msgstr "Firma."
#. module: crm_helpdesk
#: field:crm.helpdesk,email_cc:0
msgid "Watchers Emails"
msgstr ""
#. module: crm_helpdesk
#: selection:crm.helpdesk,priority:0
#: selection:crm.helpdesk.report,priority:0
msgid "Highest"
msgstr "Høyest."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
#: field:crm.helpdesk.report,day:0
msgid "Day"
msgstr "Dag."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Add Internal Note"
msgstr "Legg til internt notat."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "Date of helpdesk requests"
msgstr "Dato for kundestøtte forespørsler."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Notes"
msgstr "Notater"
#. module: crm_helpdesk
#: field:crm.helpdesk,message_ids:0
msgid "Messages"
msgstr "Meldinger."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "My company"
msgstr "Min bedrift."
#. module: crm_helpdesk
#: selection:crm.helpdesk,state:0
#: selection:crm.helpdesk.report,state:0
msgid "Cancelled"
msgstr "Kansellert."
#. module: crm_helpdesk
#: model:ir.actions.act_window,name:crm_helpdesk.action_report_crm_helpdesk
#: model:ir.ui.menu,name:crm_helpdesk.menu_report_crm_helpdesks_tree
msgid "Helpdesk Analysis"
msgstr "Kundestøtte Analyse."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
#: field:crm.helpdesk.report,date_closed:0
msgid "Close Date"
msgstr "Lukkingsdato."
#. module: crm_helpdesk
#: field:crm.helpdesk,ref:0
msgid "Reference"
msgstr "Referanse."
#. module: crm_helpdesk
#: field:crm.helpdesk,date_action_next:0
msgid "Next Action"
msgstr "Neste handling."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Helpdesk Supports"
msgstr "Kundestøtte Støtter."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Extra Info"
msgstr "Ekstra informasjon."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
#: field:crm.helpdesk,partner_id:0
#: view:crm.helpdesk.report:0
#: field:crm.helpdesk.report,partner_id:0
msgid "Partner"
msgstr "Partner."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Estimates"
msgstr ""
#. module: crm_helpdesk
#: field:crm.helpdesk.report,section_id:0
msgid "Section"
msgstr "Seksjon."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "Helpdesk requests occurred in last month"
msgstr "Kundestøtte forespørsler skjedde i forrige måned."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Send New Email"
msgstr "Send ny e-post."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Helpdesk requests during last 7 days"
msgstr "Kundestøtte forespørsler under de siste 7 dager."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
#: selection:crm.helpdesk,state:0
#: view:crm.helpdesk.report:0
msgid "New"
msgstr "Ny."
#. module: crm_helpdesk
#: model:ir.model,name:crm_helpdesk.model_crm_helpdesk_report
msgid "Helpdesk report after Sales Services"
msgstr "Kundestøtte rapport etter salg tjenester."
#. module: crm_helpdesk
#: field:crm.helpdesk,email_from:0
msgid "Email"
msgstr "E-post."
#. module: crm_helpdesk
#: field:crm.helpdesk,channel_id:0
#: view:crm.helpdesk.report:0
#: field:crm.helpdesk.report,channel_id:0
msgid "Channel"
msgstr "Kanal."
#. module: crm_helpdesk
#: selection:crm.helpdesk,priority:0
#: selection:crm.helpdesk.report,priority:0
msgid "Lowest"
msgstr "Laveste."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "# Mails"
msgstr "# E-poster."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
#: view:crm.helpdesk.report:0
msgid "My Sales Team(s)"
msgstr "Mine salgs lag."
#. module: crm_helpdesk
#: field:crm.helpdesk,create_date:0
#: field:crm.helpdesk.report,create_date:0
msgid "Creation Date"
msgstr "Opprettelses dato."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Reset to Draft"
msgstr "Sett tilbake til utkast."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
#: selection:crm.helpdesk,state:0
#: selection:crm.helpdesk.report,state:0
msgid "Pending"
msgstr "Venter."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
#: field:crm.helpdesk,date_deadline:0
#: field:crm.helpdesk.report,date_deadline:0
msgid "Deadline"
msgstr "Frist."
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,month:0
msgid "July"
msgstr "juli"
#. module: crm_helpdesk
#: model:ir.actions.act_window,name:crm_helpdesk.crm_helpdesk_categ_action
msgid "Helpdesk Categories"
msgstr "Kundestøtte kategorier."
#. module: crm_helpdesk
#: model:ir.ui.menu,name:crm_helpdesk.menu_crm_case_helpdesk-act
msgid "Categories"
msgstr "Kategorier."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "New Helpdesk Request"
msgstr "Ny kundestøtte forespørsel."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "History Information"
msgstr "Historisk informasjon."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Dates"
msgstr "Datoer."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "Month of helpdesk requests"
msgstr "Måned for kundestøtte forespørsler."
#. module: crm_helpdesk
#: code:addons/crm_helpdesk/crm_helpdesk.py:101
#, python-format
msgid "No Subject"
msgstr "Ingen emne."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "#Helpdesk"
msgstr "#Kundestøtte."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "All pending Helpdesk Request"
msgstr "Alle venter på Kundestøtte forespørsel."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "Year of helpdesk requests"
msgstr "År for kundestøtte forespørsel."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "References"
msgstr "Referanser"
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,month:0
msgid "September"
msgstr "September."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Communication"
msgstr "Kommunikasjon."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
#: field:crm.helpdesk.report,month:0
msgid "Month"
msgstr "Måned"
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Escalate"
msgstr ""
#. module: crm_helpdesk
#: field:crm.helpdesk,write_date:0
msgid "Update Date"
msgstr "Dato oppdatert."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "Helpdesk requests occurred in current month"
msgstr "Kundestøtte forespørsler skjedde i nåeværende måned."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "Salesman"
msgstr "Salgs man."
#. module: crm_helpdesk
#: field:crm.helpdesk,ref2:0
msgid "Reference 2"
msgstr "Referanse 2"
#. module: crm_helpdesk
#: field:crm.helpdesk,categ_id:0
#: field:crm.helpdesk.report,categ_id:0
msgid "Category"
msgstr "Kategori"
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Responsible User"
msgstr "Ansvarlig bruker."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Helpdesk Support"
msgstr ""
#. module: crm_helpdesk
#: field:crm.helpdesk,planned_cost:0
#: field:crm.helpdesk.report,planned_cost:0
msgid "Planned Costs"
msgstr "Budsjett kostnader."
#. module: crm_helpdesk
#: help:crm.helpdesk,channel_id:0
msgid "Communication channel."
msgstr "Kommunikasjons kanal."
#. module: crm_helpdesk
#: help:crm.helpdesk,email_cc:0
msgid ""
"These email addresses will be added to the CC field of all inbound and "
"outbound emails for this record before being sent. Separate multiple email "
"addresses with a comma"
msgstr ""
"Disse e-postadressene vil bli lagt til kopi-feltet for alle inngående og "
"utgående e-poster før de sendes. Skill flere e-postadresser med komma."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Search Helpdesk"
msgstr "Søk kundestøtte."
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,state:0
msgid "Draft"
msgstr "Kladd"
#. module: crm_helpdesk
#: selection:crm.helpdesk,priority:0
#: selection:crm.helpdesk.report,priority:0
msgid "Low"
msgstr "Lav"
#. module: crm_helpdesk
#: field:crm.helpdesk,date_closed:0
#: selection:crm.helpdesk,state:0
#: view:crm.helpdesk.report:0
#: selection:crm.helpdesk.report,state:0
msgid "Closed"
msgstr "Lukket."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Reply"
msgstr "Svar."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "7 Days"
msgstr "7 dager"
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Communication & History"
msgstr "Kommunikasjon & Historikk."
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,month:0
msgid "August"
msgstr "August"
#. module: crm_helpdesk
#: selection:crm.helpdesk,priority:0
#: selection:crm.helpdesk.report,priority:0
msgid "Normal"
msgstr "Normal"
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Global CC"
msgstr "Global CC"
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,month:0
msgid "June"
msgstr "Juni."
#. module: crm_helpdesk
#: field:crm.helpdesk,planned_revenue:0
msgid "Planned Revenue"
msgstr "Planlagt omsetning."
#. module: crm_helpdesk
#: field:crm.helpdesk.report,user_id:0
msgid "User"
msgstr "Bruker."
#. module: crm_helpdesk
#: field:crm.helpdesk,active:0
msgid "Active"
msgstr "Aktiv."
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,month:0
msgid "November"
msgstr "November."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "Extended Filters..."
msgstr "Utvidet Filtere ..."
#. module: crm_helpdesk
#: model:ir.actions.act_window,name:crm_helpdesk.crm_case_helpdesk_act111
msgid "Helpdesk Requests"
msgstr "Kundestøtte forespørsel."
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "Search"
msgstr "Søk"
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,month:0
msgid "October"
msgstr "Oktober"
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,month:0
msgid "January"
msgstr "Januar"
#. module: crm_helpdesk
#: help:crm.helpdesk,email_from:0
msgid "These people will receive email."
msgstr "Disse personene vil motta e-post."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
#: field:crm.helpdesk,date:0
msgid "Date"
msgstr "Dato"
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "History"
msgstr "Historie."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
#: field:crm.helpdesk,priority:0
#: view:crm.helpdesk.report:0
#: field:crm.helpdesk.report,priority:0
msgid "Priority"
msgstr "Prioritet."
#. module: crm_helpdesk
#: field:crm.helpdesk,partner_address_id:0
msgid "Partner Contact"
msgstr "Partner kontakt."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Misc"
msgstr "Div."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
#: field:crm.helpdesk,state:0
#: view:crm.helpdesk.report:0
#: field:crm.helpdesk.report,state:0
msgid "State"
msgstr "Stat."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "General"
msgstr "Generelt."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Send Reminder"
msgstr "Send påminnelse."
#. module: crm_helpdesk
#: help:crm.helpdesk,section_id:0
msgid ""
"Sales team to which Case belongs to. Define "
"Responsible user and Email account for mail gateway."
msgstr ""
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Done"
msgstr "Ferdig"
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,month:0
msgid "December"
msgstr "Desember"
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Cancel"
msgstr "Avbryt"
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Close"
msgstr "Lukke"
#. module: crm_helpdesk
#: view:crm.helpdesk:0
#: view:crm.helpdesk.report:0
#: selection:crm.helpdesk.report,state:0
msgid "Open"
msgstr "Åpne"
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Helpdesk Support Tree"
msgstr ""
#. module: crm_helpdesk
#: selection:crm.helpdesk,state:0
msgid "In Progress"
msgstr "I arbeid."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Categorization"
msgstr "Kategorisering"
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
#: model:ir.model,name:crm_helpdesk.model_crm_helpdesk
#: model:ir.ui.menu,name:crm_helpdesk.menu_config_helpdesk
msgid "Helpdesk"
msgstr "Kundestøtte."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
#: field:crm.helpdesk,user_id:0
msgid "Responsible"
msgstr "Ansvarlig."
#. module: crm_helpdesk
#: field:crm.helpdesk.report,delay_expected:0
msgid "Overpassed Deadline"
msgstr "Passert frist."
#. module: crm_helpdesk
#: field:crm.helpdesk,description:0
msgid "Description"
msgstr "Beskrivelse."
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,month:0
msgid "May"
msgstr "Mai."
#. module: crm_helpdesk
#: field:crm.helpdesk,probability:0
msgid "Probability (%)"
msgstr "Sannsynlighet (%)"
#. module: crm_helpdesk
#: field:crm.helpdesk.report,email:0
msgid "# Emails"
msgstr "# E-poster"
#. module: crm_helpdesk
#: model:ir.actions.act_window,help:crm_helpdesk.action_report_crm_helpdesk
msgid ""
"Have a general overview of all support requests by sorting them with "
"specific criteria such as the processing time, number of requests answered, "
"emails sent and costs."
msgstr ""
#. module: crm_helpdesk
#: help:crm.helpdesk,state:0
msgid ""
"The state is set to 'Draft', when a case is created. "
" \n"
"If the case is in progress the state is set to 'Open'. "
" \n"
"When the case is over, the state is set to 'Done'. "
" \n"
"If the case needs to be reviewed then the state is set to 'Pending'."
msgstr ""
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,month:0
msgid "February"
msgstr "Februar"
#. module: crm_helpdesk
#: field:crm.helpdesk,name:0
msgid "Name"
msgstr "Navn"
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "Month-1"
msgstr "Måned-1"
#. module: crm_helpdesk
#: model:ir.ui.menu,name:crm_helpdesk.menu_help_support_main
msgid "Helpdesk and Support"
msgstr "Kundestøtte og støtte."
#. module: crm_helpdesk
#: selection:crm.helpdesk.report,month:0
msgid "April"
msgstr "April"
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
msgid "My Case(s)"
msgstr "Min(e) sak(er)"
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Query"
msgstr ""
#. module: crm_helpdesk
#: field:crm.helpdesk,id:0
msgid "ID"
msgstr "ID"
#. module: crm_helpdesk
#: model:ir.actions.act_window,help:crm_helpdesk.crm_helpdesk_categ_action
msgid ""
"Create and manage helpdesk categories to better manage and classify your "
"support requests."
msgstr ""
"Opprette og administrere kundestøtte kategorier til å administrere og "
"klassifisere support."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Todays's Helpdesk Requests"
msgstr "Dagens kundestøtte forespørsler."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Request Date"
msgstr "Forespørsels dato."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
msgid "Open Helpdesk Request"
msgstr "Åpen kundestøtte forespørsel."
#. module: crm_helpdesk
#: selection:crm.helpdesk,priority:0
#: selection:crm.helpdesk.report,priority:0
msgid "High"
msgstr "Høy."
#. module: crm_helpdesk
#: view:crm.helpdesk:0
#: field:crm.helpdesk,section_id:0
#: view:crm.helpdesk.report:0
msgid "Sales Team"
msgstr "Salgsteam"
#. module: crm_helpdesk
#: field:crm.helpdesk,date_action_last:0
msgid "Last Action"
msgstr "Siste handling."
#. module: crm_helpdesk
#: model:ir.actions.act_window,help:crm_helpdesk.crm_case_helpdesk_act111
msgid ""
"Helpdesk and Support allow you to track your interventions. Select a "
"customer, add notes and categorize interventions with partners if necessary. "
"You can also assign a priority level. Use the OpenERP Issues system to "
"manage your support activities. Issues can be connected to the email "
"gateway: new emails may create issues, each of them automatically gets the "
"history of the conversation with the customer."
msgstr ""
#. module: crm_helpdesk
#: view:crm.helpdesk.report:0
#: field:crm.helpdesk.report,name:0
msgid "Year"
msgstr "År."
#. module: crm_helpdesk
#: field:crm.helpdesk,duration:0
msgid "Duration"
msgstr "Varighet."

View File

@ -63,7 +63,6 @@ class crm_lead_forward_to_partner(osv.osv_memory):
_defaults = {
'history_mode': 'latest',
'content_subtype': lambda self,cr, uid, context={}: 'html',
}
def get_record_data(self, cr, uid, model, res_id, context=None):

1008
addons/document/i18n/nb.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -18,20 +18,9 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import logging
import models
import edi_service
from models.edi import EDIMixin, edi_document
_logger = logging.getLogger(__name__)
# web
try:
import controllers
except ImportError:
_logger.warning(
"""Could not load openerp-web section of EDI, EDI will not behave correctly
To fix, launch openerp-web in embedded mode""")
from . import controllers
from . import models
from . import edi_service
from .models.edi import EDIMixin, edi
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -36,12 +36,10 @@ documentation at http://doc.openerp.com.
'website': 'http://www.openerp.com',
'depends': ['base', 'email_template'],
'icon': '/edi/static/src/img/knowledge.png',
'data': ['security/ir.model.access.csv'],
'test': ['test/edi_partner_test.yml'],
'js': ['static/src/js/edi.js'],
'css': ['static/src/css/edi.css'],
'qweb': ['static/src/xml/*.xml'],
'installable': True,
'auto_install': False,
}

View File

@ -1,85 +1,32 @@
import json
import textwrap
import simplejson
import werkzeug.wrappers
import openerp.addons.web.http as openerpweb
import openerp.addons.web.controllers.main as webmain
class EDI(openerpweb.Controller):
# http://hostname:8069/edi/view?db=XXXX&token=XXXXXXXXXXX
# http://hostname:8069/edi/import_url?url=URIEncodedURL
_cp_path = "/edi"
def template(self, req, mods='web,edi'):
d = {}
d["js"] = "\n".join('<script type="text/javascript" src="%s"></script>'%i for i in webmain.manifest_list(req, mods, 'js'))
d["css"] = "\n".join('<link rel="stylesheet" href="%s">'%i for i in webmain.manifest_list(req, mods, 'css'))
d["modules"] = simplejson.dumps(mods.split(','))
return d
@openerpweb.httprequest
def view(self, req, db, token):
d = self.template(req)
d["init"] = 's.edi.edi_view("%s","%s");'%(db,token)
r = webmain.html_template % d
return r
@openerpweb.httprequest
def import_url(self, req, url):
d = self.template(req)
d["init"] = 's.edi.edi_import("%s");'%(url)
r = webmain.html_template % d
return r
@openerpweb.httprequest
def download(self, req, db, token):
result = req.session.proxy('edi').get_edi_document(db, token)
response = werkzeug.wrappers.Response( result, headers=[('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', len(result))])
return response
@openerpweb.httprequest
def download_attachment(self, req, db, token):
result = req.session.proxy('edi').get_edi_document(db, token)
doc = json.loads(result)[0]
attachment = doc['__attachments'] and doc['__attachments'][0]
if attachment:
result = attachment["content"].decode('base64')
import email.Utils as utils
# Encode as per RFC 2231
filename_utf8 = attachment['file_name']
filename_encoded = "%s=%s" % ('filename*',
utils.encode_rfc2231(filename_utf8, 'utf-8'))
response = werkzeug.wrappers.Response(result, headers=[('Content-Type', 'application/pdf'),
('Content-Disposition', 'inline; ' + filename_encoded),
('Content-Length', len(result))])
return response
@openerpweb.httprequest
def binary(self, req, db, token, field_path="company_address.logo", content_type='image/png'):
result = req.session.proxy('edi').get_edi_document(db, token)
doc = json.loads(result)[0]
for name in field_path.split("."):
doc = doc[name]
result = doc.decode('base64')
response = werkzeug.wrappers.Response(result, headers=[('Content-Type', content_type),
('Content-Length', len(result))])
return response
@openerpweb.jsonrequest
def get_edi_document(self, req, db, token):
result = req.session.proxy('edi').get_edi_document(db, token)
return json.loads(result)
modules = webmain.module_boot(req) + ['edi']
modules_str = ','.join(modules)
modules_json = simplejson.dumps(modules)
js = "\n ".join('<script type="text/javascript" src="%s"></script>' % i for i in webmain.manifest_list(req, modules_str, 'js'))
css = "\n ".join('<link rel="stylesheet" href="%s">' % i for i in webmain.manifest_list(req, modules_str, 'css'))
return webmain.html_template % {
'js': js,
'css': css,
'modules': modules_json,
'init': 's.edi.edi_import("%s");' % url,
}
@openerpweb.jsonrequest
def import_edi_url(self, req, url):
context = req.session.eval_context(req.context)
result = req.session.proxy('edi').import_edi_url(req.session._db, req.session._uid, req.session._password, url)
if len(result) == 1:
return {"action": webmain.clean_action(req, result[0][2])}
return {"action": webmain.clean_action(req, result[0][2], context)}
return True
#
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -20,8 +20,8 @@
##############################################################################
import logging
import netsvc
import openerp
import openerp.netsvc as netsvc
_logger = logging.getLogger(__name__)
@ -34,10 +34,10 @@ class edi(netsvc.ExportService):
try:
registry = openerp.modules.registry.RegistryManager.get(db_name)
assert registry, 'Unknown database %s' % db_name
edi_document = registry['edi.document']
edi = registry['edi.edi']
cr = registry.db.cursor()
res = None
res = getattr(edi_document, method_name)(cr, *method_args)
res = getattr(edi, method_name)(cr, *method_args)
cr.commit()
except Exception:
_logger.exception('Failed to execute EDI method %s with args %r.', method_name, method_args)
@ -46,9 +46,6 @@ class edi(netsvc.ExportService):
cr.close()
return res
def exp_get_edi_document(self, db_name, edi_token):
return self._edi_dispatch(db_name, 'get_document', 1, edi_token)
def exp_import_edi_document(self, db_name, uid, passwd, edi_document, context=None):
return self._edi_dispatch(db_name, 'import_edi', uid, edi_document, None)
@ -59,9 +56,6 @@ class edi(netsvc.ExportService):
if method in ['import_edi_document', 'import_edi_url']:
(db, uid, passwd ) = params[0:3]
openerp.service.security.check(db, uid, passwd)
elif method in ['get_edi_document']:
# No security check for these methods
pass
else:
raise KeyError("Method not found: %s." % method)
fn = getattr(self, 'exp_'+method)

View File

@ -24,15 +24,13 @@ import hashlib
import json
import logging
import re
import threading
import time
import urllib2
import openerp
import openerp.release as release
import netsvc
import pooler
from osv import osv,fields,orm
import openerp.netsvc as netsvc
from openerp.osv import osv, fields
from tools.translate import _
from tools.safe_eval import safe_eval as eval
_logger = logging.getLogger(__name__)
@ -74,16 +72,9 @@ def last_update_for(record):
return False
class edi_document(osv.osv):
_name = 'edi.document'
_description = 'EDI Document'
_columns = {
'name': fields.char("EDI token", size = 128, help="Unique identifier for retrieving an EDI document."),
'document': fields.text("Document", help="EDI document content")
}
_sql_constraints = [
('name_uniq', 'unique (name)', 'EDI Tokens must be unique!')
]
class edi(osv.AbstractModel):
_name = 'edi.edi'
_description = 'EDI Subsystem'
def new_edi_token(self, cr, uid, record):
"""Return a new, random unique token to identify this model record,
@ -109,7 +100,7 @@ class edi_document(osv.osv):
"""Generates a final EDI document containing the EDI serialization
of the given records, which should all be instances of a Model
that has the :meth:`~.edi` mixin. The document is not saved in the
database, this is done by :meth:`~.export_edi`.
database.
:param list(browse_record) records: records to export as EDI
:return: UTF-8 encoded string containing the serialized records
@ -120,19 +111,6 @@ class edi_document(osv.osv):
edi_list += record_model_obj.edi_export(cr, uid, [record], context=context)
return self.serialize(edi_list)
def get_document(self, cr, uid, edi_token, context=None):
"""Retrieve the EDI document corresponding to the given edi_token.
:return: EDI document string
:raise: ValueError if requested EDI token does not match any know document
"""
_logger.debug("get_document(%s)", edi_token)
edi_ids = self.search(cr, uid, [('name','=', edi_token)], context=context)
if not edi_ids:
raise ValueError('Invalid EDI token: %s.' % edi_token)
edi = self.browse(cr, uid, edi_ids[0], context=context)
return edi.document
def load_edi(self, cr, uid, edi_documents, context=None):
"""Import the given EDI document structures into the system, using
:meth:`~.import_edi`.
@ -171,38 +149,18 @@ class edi_document(osv.osv):
"""
return json.loads(edi_documents_string)
def export_edi(self, cr, uid, records, context=None):
"""Export the given database records as EDI documents, stores them
permanently with a new unique EDI token, for later retrieval via :meth:`~.get_document`,
and returns the list of the new corresponding ``ir.edi.document`` records.
:param records: list of browse_record of any model
:return: list of IDs of the new ``ir.edi.document`` entries, in the same
order as the provided ``records``.
"""
exported_ids = []
for record in records:
document = self.generate_edi(cr, uid, [record], context)
token = self.new_edi_token(cr, uid, record)
self.create(cr, uid, {
'name': token,
'document': document
}, context=context)
exported_ids.append(token)
return exported_ids
def import_edi(self, cr, uid, edi_document=None, edi_url=None, context=None):
"""Import a JSON serialized EDI Document string into the system, first retrieving it
from the given ``edi_url`` if provided.
:param str|unicode edi_document: UTF-8 string or unicode containing JSON-serialized
:param str|unicode edi: UTF-8 string or unicode containing JSON-serialized
EDI Document to import. Must not be provided if
``edi_url`` is given.
:param str|unicode edi_url: URL where the EDI document (same format as ``edi_document``)
:param str|unicode edi_url: URL where the EDI document (same format as ``edi``)
may be retrieved, without authentication.
"""
if edi_url:
assert not edi_document, 'edi_document must not be provided if edi_url is given.'
assert not edi_document, 'edi must not be provided if edi_url is given.'
edi_document = urllib2.urlopen(edi_url).read()
assert edi_document, 'EDI Document is empty!'
edi_documents = self.deserialize(edi_document)
@ -215,10 +173,10 @@ class EDIMixin(object):
``edi_import()`` and ``edi_export()`` methods to implement their
specific behavior, based on the primitives provided by this mixin."""
def _edi_requires_attributes(self, attributes, edi_document):
model_name = edi_document.get('__imported_model') or edi_document.get('__model') or self._name
def _edi_requires_attributes(self, attributes, edi):
model_name = edi.get('__imported_model') or edi.get('__model') or self._name
for attribute in attributes:
assert edi_document.get(attribute),\
assert edi.get(attribute),\
'Attribute `%s` is required in %s EDI documents.' % (attribute, model_name)
# private method, not RPC-exposed as it creates ir.model.data entries as
@ -318,7 +276,6 @@ class EDIMixin(object):
:return: list of dicts containing boilerplate EDI metadata for each record,
at the corresponding index from ``records``.
"""
data_ids = []
ir_attachment = self.pool.get('ir.attachment')
results = []
for record in records:
@ -398,7 +355,7 @@ class EDIMixin(object):
return [self.edi_m2o(cr, uid, r, context=context) for r in records]
def edi_export(self, cr, uid, records, edi_struct=None, context=None):
"""Returns a list of dicts representing an edi.document containing the
"""Returns a list of dicts representing EDI documents containing the
records, and matching the given ``edi_struct``, if provided.
:param edi_struct: if provided, edi_struct should be a dictionary
@ -443,50 +400,6 @@ class EDIMixin(object):
results.append(edi_dict)
return results
def edi_export_and_email(self, cr, uid, ids, template_ext_id, context=None):
"""Export the given records just like :meth:`~.export_edi`, the render the
given email template, in order to trigger appropriate notifications.
This method is intended to be called as part of business documents'
lifecycle, so it silently ignores any error occurring during the process,
as this is usually non-critical. To avoid any delay, it is also asynchronous
and will spawn a short-lived thread to perform the action.
:param str template_ext_id: external id of the email.template to use for
the mail notifications
:return: True
"""
def email_task():
db = pooler.get_db(cr.dbname)
local_cr = None
try:
time.sleep(3) # lame workaround to wait for commit of parent transaction
# grab a fresh browse_record on local cursor
local_cr = db.cursor()
web_root_url = self.pool.get('ir.config_parameter').get_param(local_cr, uid, 'web.base.url')
if not web_root_url:
_logger.warning('Ignoring EDI mail notification, web.base.url is not defined in parameters.')
return
mail_tmpl = self._edi_get_object_by_external_id(local_cr, uid, template_ext_id, 'email.template', context=context)
if not mail_tmpl:
# skip EDI export if the template was not found
_logger.warning('Ignoring EDI mail notification, template %s cannot be located.', template_ext_id)
return
for edi_record in self.browse(local_cr, uid, ids, context=context):
edi_token = self.pool.get('edi.document').export_edi(local_cr, uid, [edi_record], context = context)[0]
edi_context = dict(context, edi_web_url_view=EDI_VIEW_WEB_URL % (web_root_url, local_cr.dbname, edi_token))
self.pool.get('email.template').send_mail(local_cr, uid, mail_tmpl.id, edi_record.id,
force_send=False, context=edi_context)
_logger.info('EDI export successful for %s #%s, email notification sent.', self._name, edi_record.id)
except Exception:
_logger.warning('Ignoring EDI mail notification, failed to generate it.', exc_info=True)
finally:
if local_cr:
local_cr.commit()
local_cr.close()
threading.Thread(target=email_task, name='EDI ExportAndEmail for %s %r' % (self._name, ids)).start()
return True
def _edi_get_object_by_name(self, cr, uid, name, model_name, context=None):
model = self.pool.get(model_name)
search_results = model.name_search(cr, uid, name, operator='=', context=context)
@ -515,18 +428,20 @@ class EDIMixin(object):
file_name = record.name_get()[0][1]
file_name = re.sub(r'[^a-zA-Z0-9_-]', '_', file_name)
file_name += ".pdf"
ir_attachment = self.pool.get('ir.attachment').create(cr, uid,
{'name': file_name,
'datas': result,
'datas_fname': file_name,
'res_model': self._name,
'res_id': record.id,
'type': 'binary'},
context=context)
self.pool.get('ir.attachment').create(cr, uid,
{
'name': file_name,
'datas': result,
'datas_fname': file_name,
'res_model': self._name,
'res_id': record.id,
'type': 'binary'
},
context=context)
def _edi_import_attachments(self, cr, uid, record_id, edi_document, context=None):
def _edi_import_attachments(self, cr, uid, record_id, edi, context=None):
ir_attachment = self.pool.get('ir.attachment')
for attachment in edi_document.get('__attachments', []):
for attachment in edi.get('__attachments', []):
# check attachment data is non-empty and valid
file_data = None
try:
@ -573,8 +488,10 @@ class EDIMixin(object):
if data_ids:
model = self.pool.get(model)
data = ir_model_data.browse(cr, uid, data_ids[0], context=context)
result = model.browse(cr, uid, data.res_id, context=context)
return result
if model.exists(cr, uid, [data.res_id]):
return model.browse(cr, uid, data.res_id, context=context)
# stale external-id, cleanup to allow re-import, as the corresponding record is gone
ir_model_data.unlink(cr, 1, [data_ids[0]])
def edi_import_relation(self, cr, uid, model, value, external_id, context=None):
"""Imports a M2O/M2M relation EDI specification ``[external_id,value]`` for the
@ -588,6 +505,10 @@ class EDIMixin(object):
* If previous steps gave no result, create a new record with the given
value in the target model, assign it the given external_id, and return
the new database ID
:param str value: display name of the record to import
:param str external_id: fully-qualified external ID of the record
:return: database id of newly-imported or pre-existing record
"""
_logger.debug("%s: Importing EDI relationship [%r,%r]", model, external_id, value)
target = self._edi_get_object_by_external_id(cr, uid, external_id, model, context=context)
@ -602,9 +523,11 @@ class EDIMixin(object):
self._name, external_id, value)
# also need_new_ext_id here, but already been set above
model = self.pool.get(model)
# should use name_create() but e.g. res.partner won't allow it at the moment
res_id = model.create(cr, uid, {model._rec_name: value}, context=context)
res_id, _ = model.name_create(cr, uid, value, context=context)
target = model.browse(cr, uid, res_id, context=context)
else:
_logger.debug("%s: Importing EDI relationship [%r,%r] - record already exists with ID %s, using it",
self._name, external_id, value, target.id)
if need_new_ext_id:
ext_id_members = split_external_id(external_id)
# module name is never used bare when creating ir.model.data entries, in order
@ -614,19 +537,19 @@ class EDIMixin(object):
self._edi_external_id(cr, uid, target, existing_id=ext_id_members['id'], existing_module=module, context=context)
return target.id
def edi_import(self, cr, uid, edi_document, context=None):
"""Imports a dict representing an edi.document into the system.
def edi_import(self, cr, uid, edi, context=None):
"""Imports a dict representing an EDI document into the system.
:param dict edi_document: EDI document to import
:param dict edi: EDI document to import
:return: the database ID of the imported record
"""
assert self._name == edi_document.get('__import_model') or \
('__import_model' not in edi_document and self._name == edi_document.get('__model')), \
assert self._name == edi.get('__import_model') or \
('__import_model' not in edi and self._name == edi.get('__model')), \
"EDI Document Model and current model do not match: '%s' (EDI) vs '%s' (current)." % \
(edi_document['__model'], self._name)
(edi.get('__model'), self._name)
# First check the record is now already known in the database, in which case it is ignored
ext_id_members = split_external_id(edi_document['__id'])
ext_id_members = split_external_id(edi['__id'])
existing = self._edi_get_object_by_external_id(cr, uid, ext_id_members['full'], self._name, context=context)
if existing:
_logger.info("'%s' EDI Document with ID '%s' is already known, skipping import!", self._name, ext_id_members['full'])
@ -634,7 +557,7 @@ class EDIMixin(object):
record_values = {}
o2m_todo = {} # o2m values are processed after their parent already exists
for field_name, field_value in edi_document.iteritems():
for field_name, field_value in edi.iteritems():
# skip metadata and empty fields
if field_name.startswith('__') or field_value is None or field_value is False:
continue
@ -679,7 +602,7 @@ class EDIMixin(object):
dest_model.edi_import(cr, uid, o2m_line, context=context)
# process the attachments, if any
self._edi_import_attachments(cr, uid, record_id, edi_document, context=context)
self._edi_import_attachments(cr, uid, record_id, edi, context=context)
return record_id

View File

@ -2,7 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Business Applications
# Copyright (c) 2011 OpenERP S.A. <http://openerp.com>
# Copyright (c) 2011-2012 OpenERP S.A. <http://openerp.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@ -19,7 +19,7 @@
#
##############################################################################
from osv import fields,osv
from openerp.osv import osv
class res_company(osv.osv):
"""Helper subclass for res.company providing util methods for working with

View File

@ -2,7 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Business Applications
# Copyright (c) 2011 OpenERP S.A. <http://openerp.com>
# Copyright (c) 2011-2012 OpenERP S.A. <http://openerp.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@ -19,7 +19,7 @@
#
##############################################################################
from osv import fields,osv
from openerp.osv import osv
from edi import EDIMixin
from openerp import SUPERUSER_ID

View File

@ -2,7 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Business Applications
# Copyright (c) 2011 OpenERP S.A. <http://openerp.com>
# Copyright (c) 2011-2012 OpenERP S.A. <http://openerp.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@ -20,10 +20,9 @@
##############################################################################
import logging
from osv import fields,osv
from openerp.osv import osv
from edi import EDIMixin
from openerp import SUPERUSER_ID
from tools.translate import _
_logger = logging.getLogger(__name__)
RES_PARTNER_EDI_STRUCT = {

View File

@ -1,3 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_ir_edi_all_read,access_ir_edi_all_read,model_edi_document,,1,0,0,0
access_ir_edi_employee_create,access_ir_edi_employee_create,model_edi_document,base.group_user,1,0,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_ir_edi_all_read access_ir_edi_all_read model_edi_document 1 0 0 0
3 access_ir_edi_employee_create access_ir_edi_employee_create model_edi_document base.group_user 1 0 1 0

View File

@ -1,210 +0,0 @@
/** EDI content **/
.openerp .company_logo {
background-size: 180px 46px;
}
.oe_edi_view {
width: 65%;
vertical-align: top;
padding: 0px 25px;
border-right: 1px solid #D2CFCF;
}
.oe_edi_sidebar_container {
width: 35%;
padding: 0px 10px;
vertical-align: top;
}
button.oe_edi_action_print {
font-size: 1.5em;
margin-left: 35%;
margin-bottom: 20px;
}
button.oe_edi_action_print img {
vertical-align: bottom;
width: 32px;
height: 32px;
}
/** EDI Sidebar **/
.oe_edi_sidebar_title {
border-bottom: 1px solid #D2CFCF;
font-weight: bold;
font-size: 1.3em;
min-width: 10em;
}
.oe_edi_nested_block, .oe_edi_nested_block_import, .oe_edi_nested_block_pay {
margin: 0px 40px;
min-width: 10em;
display: none; /* made visible by click on parent input/label */
}
.oe_edi_right_top .oe_edi_nested_block label {
float: left;
text-align: right;
margin-right: 0.5em;
line-height: 180%;
font-weight: bold;
min-width: 5em;
}
.oe_edi_option {
padding-left: 5px;
line-height: 2em;
}
.oe_edi_option:hover {
background: #e8e8e8;
}
.oe_edi_import_button {
margin: 2px 10px;
white-space: nowrap;
}
.oe_edi_small, .oe_edi_small input {
font-size: 90%;
}
/** Sidebar bottom **/
.oe_edi_paypal_button {
margin: 6px;
}
/** Paperbox, from http://www.sitepoint.com/pure-css3-paper-curl/ **/
.oe_edi_paperbox {
position: relative;
width: 700px;
padding: 30px;
padding-bottom: 50px;
margin: 20px auto;
background-color: #fff;
-webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
-moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
box-shadow: 0 0 5px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
}
.oe_edi_paperbox:before, .oe_edi_paperbox:after {
position: absolute;
width: 40%;
height: 10px;
content: ' ';
left: 12px;
bottom: 15px;
background: transparent;
-webkit-transform: skew(-5deg) rotate(-5deg);
-moz-transform: skew(-5deg) rotate(-5deg);
-ms-transform: skew(-5deg) rotate(-5deg);
-o-transform: skew(-5deg) rotate(-5deg);
transform: skew(-5deg) rotate(-5deg);
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
-moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
z-index: -1;
}
.oe_edi_paperbox:after {
left: auto; right: 12px;
-webkit-transform: skew(5deg) rotate(5deg);
-moz-transform: skew(5deg) rotate(5deg);
-ms-transform: skew(5deg) rotate(5deg);
-o-transform: skew(5deg) rotate(5deg);
transform: skew(5deg) rotate(5deg);
}
/** Sale Order / Purchase Order Preview **/
table.oe_edi_data, .oe_edi_doc_title {
border-collapse: collapse;
clear: both;
}
.oe_edi_data th {
white-space: nowrap;
}
.oe_edi_data .oe_edi_floor {
border-bottom: 1px solid black;
}
.oe_edi_data .oe_edi_ceiling {
border-top: 1px solid black;
}
.oe_edi_data .oe_edi_data_row {
border-bottom: 1px solid #D2CFCF;
}
.oe_edi_data_row td {
vertical-align: top;
}
.oe_edi_inner_note {
font-style: italic;
font-size: 95%;
padding-left: 10px;
/* prevent wide notes from disrupting layout due to <pre> styling */
white-space: pre-line;
width: 90%;
}
.oe_edi_data_row .oe_edi_inner_note {
/* prevent wide notes from disrupting layout due to <pre> styling */
width: 25em;
}
.oe_edi_shade {
background: #e8e8e8;
}
.oe_edi_company_name {
text-transform: uppercase;
font-weight: bold;
}
.oe_edi_address_from {
float: left;
}
.oe_edi_address_to {
float: right;
margin-top: 25px;
margin-bottom: 30px;
}
.oe_edi_company_block_title {
width: 375px;
margin: 0px;
padding: 2px 14px;
background-color: #252525;
border-top-left-radius: 5px 5px;
border-top-right-radius: 5px 5px;
background-repeat: repeat no-repeat;
}
.oe_edi_company_block_title .oe_edi_company_name {
margin: 0px;
font-size: 1em;
color: #FFF;
}
.oe_edi_company_block_body {
width: 375px;
margin: 0px;
padding: 5px 14px;
line-height: 16px;
background-color: rgb(242, 242, 242);
}
.oe_edi_company_block_body p {
color: #222;
margin: 5px 0px;
}
.oe_edi_summary_label {
float: left;
}
.oe_edi_summary_value {
float: right;
}
/** Python code highlighting **/
/* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
(http://qbnz.com/highlighter/ and http://geshi.org/) */
.python .de1, .python .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
.python {font-family:monospace;}
.python .imp {font-weight: bold; color: red;}
.python li, .python .li1 {background: #ffffff; list-style: none;}
.python .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
.python .li2 {background: #f8f8f8;}
.python .kw1 {color: #ff7700;font-weight:bold;}
.python .kw2 {color: #008000;}
.python .kw3 {color: #dc143c;}
.python .kw4 {color: #0000cd;}
.python .co1 {color: #808080; font-style: italic;}
.python .coMULTI {color: #808080; font-style: italic;}
.python .es0 {color: #000099; font-weight: bold;}
.python .br0 {color: black;}
.python .sy0 {color: #66cc66;}
.python .st0 {color: #483d8b;}
.python .nu0 {color: #ff4500;}
.python .me1 {color: black;}
.python span.xtra { display:block; }
.python ol { padding: 0px; }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

View File

@ -1,119 +1,9 @@
openerp.edi = function(openerp) {
openerp.edi = {}
openerp.edi = function(instance) {
var _t = instance.web._t;
instance.edi = {}
openerp.edi.EdiView = openerp.web.Widget.extend({
init: function(parent, db, token) {
this._super();
this.db = db;
this.token = token;
this.session = openerp.session;
this.template = "EdiEmpty";
this.content = "";
this.sidebar = "";
},
start: function() {
this._super();
var self = this;
var param = {"db": self.db, "token": self.token};
return self.rpc('/edi/get_edi_document', param).done(this.on_document_loaded).fail(this.on_document_failed);
},
on_document_loaded: function(docs){
this.doc = docs[0];
var template_content = "Edi." + this.doc.__model + ".content";
var template_sidebar = "Edi." + this.doc.__model + ".sidebar";
var param = {"widget":this, "doc":this.doc};
if (openerp.web.qweb.templates[template_sidebar]) {
this.sidebar = openerp.web.qweb.render(template_sidebar, param);
}
if (openerp.web.qweb.templates[template_content]) {
this.content = openerp.web.qweb.render(template_content, param);
}
this.$el.html(openerp.web.qweb.render("EdiView", param));
this.$el.find('button.oe_edi_action_print').bind('click', this.do_print);
this.$el.find('button#oe_edi_import_existing').bind('click', this.do_import_existing);
this.$el.find('button#oe_edi_import_create').bind('click', this.do_import_create);
this.$el.find('button#oe_edi_download').bind('click', this.do_download);
this.$el.find('.oe_edi_import_choice, .oe_edi_import_choice_label').bind('click', this.toggle_choice('import'));
this.$el.find('.oe_edi_pay_choice, .oe_edi_pay_choice_label').bind('click', this.toggle_choice('pay'));
this.$el.find('#oe_edi_download_show_code').bind('click', this.show_code);
},
on_document_failed: function(response) {
var self = this;
var params = {
error: response,
//TODO: should this be _t() wrapped?
message: "Sorry, this document cannot be located. Perhaps the link you are using has expired?"
}
$(openerp.web.qweb.render("DialogWarning", params)).dialog({
title: "Document not found",
modal: true,
});
},
show_code: function($event) {
$('#oe_edi_download_code').toggle();
},
get_download_url: function() {
var l = window.location;
var url_prefix = l.protocol + '//' + l.host;
return url_prefix +'/edi/download?db=' + this.db + '&token=' + this.token;
},
get_paypal_url: function(document_type, ref_field) {
var comp_name = encodeURIComponent(this.doc.company_id[1]);
var doc_ref = encodeURIComponent(this.doc[ref_field]);
var paypal_account = encodeURIComponent(this.doc.company_address.paypal_account);
var amount = encodeURIComponent(this.doc.amount_total);
var cur_code = encodeURIComponent(this.doc.currency.code);
var paypal_url = "https://www.paypal.com/cgi-bin/webscr?cmd=_xclick" +
"&business=" + paypal_account +
"&item_name=" + document_type + "%20" + comp_name + "%20" + doc_ref +
"&invoice=" + doc_ref +
"&amount=" + amount +
"&currency_code=" + cur_code +
"&button_subtype=services&amp;no_note=1&amp;bn=OpenERP_PayNow_" + cur_code;
return paypal_url;
},
toggle_choice: function(mode) {
return function($e) {
$('.oe_edi_nested_block_'+mode).hide();
$('.'+$e.target.id+'_nested').show();
return true;
}
},
do_print: function(e){
var l = window.location;
window.location = l.protocol + '//' + l.host + "/edi/download_attachment?db=" + this.db + "&token=" + this.token;
},
do_import_existing: function(e) {
var url_download = this.get_download_url();
var $edi_text_server_input = this.$el.find('#oe_edi_txt_server_url');
var server_url = $edi_text_server_input.val();
$edi_text_server_input.removeClass('invalid');
if (!server_url) {
$edi_text_server_input.addClass('invalid');
return false;
}
var protocol = "http://";
if (server_url.toLowerCase().lastIndexOf('http', 0) == 0 ) {
protocol = '';
}
window.location = protocol + server_url + '/edi/import_url?url=' + encodeURIComponent(url_download);
},
do_import_create: function(e){
var url_download = this.get_download_url();
window.location = "https://cc.my.openerp.com/odms/create_edi?url=" + encodeURIComponent(url_download);
},
do_download: function(e){
window.location = this.get_download_url();
}
});
instance.edi.EdiImport = instance.web.Widget.extend({
openerp.edi.edi_view = function (db, token) {
openerp.session.session_bind().done(function () {
new openerp.edi.EdiView(null,db,token).appendTo($("body").addClass('openerp'));
});
}
openerp.edi.EdiImport = openerp.web.Widget.extend({
init: function(parent,url) {
this._super();
this.url = url;
@ -137,7 +27,7 @@ openerp.edi.EdiImport = openerp.web.Widget.extend({
show_login: function() {
this.destroy_content();
this.login = new openerp.web.Login(this);
this.login = new instance.web.Login(this);
this.login.appendTo(this.$el);
},
@ -167,18 +57,18 @@ openerp.edi.EdiImport = openerp.web.Widget.extend({
window.location = "/";
}
}
}).html('The document has been successfully imported!');
}).html(_t('The document has been successfully imported!'));
}
},
on_imported_error: function(response){
var self = this;
var msg = "Sorry, the document could not be imported.";
var msg = _t("Sorry, the document could not be imported.");
if (response.data.fault_code) {
msg += "\n Reason:" + response.data.fault_code;
msg += "\n " + _t("Reason:") + response.data.fault_code;
}
var params = {error: response, message: msg};
$(openerp.web.qweb.render("CrashManagerWarning", params)).dialog({
title: "Document Import Notification",
$(instance.web.qweb.render("CrashManager.warning", params)).dialog({
title: _t("Document Import Notification"),
modal: true,
buttons: {
Ok: function() { $(this).dialog("close"); }
@ -187,9 +77,9 @@ openerp.edi.EdiImport = openerp.web.Widget.extend({
}
});
openerp.edi.edi_import = function (url) {
openerp.session.session_bind().done(function () {
new openerp.edi.EdiImport(null,url).appendTo($("body").addClass('openerp'));
instance.edi.edi_import = function (url) {
instance.session.session_bind().done(function () {
new instance.edi.EdiImport(null,url).appendTo($("body").addClass('openerp'));
});
}

View File

@ -1,93 +0,0 @@
<template>
<t t-name="EdiEmpty">
<div style="height:100%;"></div>
</t>
<t t-name="EdiImport">
<t t-call="WebClient"/>
</t>
<t t-name="EdiView">
<table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" id="oe_app" class="oe-application oe_forms oe_semantic_html_override">
<tr>
<td colspan="2" valign="top" id="oe_header" class="header">
<div> <a href="/" class="company_logo_link">
<div class="company_logo"
t-att-style="'background-size: 180px 46px; background: url('+ (doc.company_address ? '/edi/binary?db='+widget.db+'&amp;token='+widget.token : '/web/static/src/img/logo.png')+')'"/></a> </div>
</td>
</tr>
<tr>
<td colspan="2" valign="top" height="100%">
<table cellspacing="0" cellpadding="0" border="0" height="100%" width="100%">
<tr>
<td class="oe_edi_view">
<p class="oe_paragraph"><t t-raw="widget.content"/></p>
<button type="button" class="oe_edi_action_print">
View/Print <img src="/edi/static/src/img/pdf.png"/>
</button>
</td>
<td class="oe_edi_sidebar_container">
<p class="oe_edi_sidebar_title">
Import this document
</p>
<div class="oe_edi_option">
<input type="radio" id="oe_edi_import_openerp" name="oe_edi_import" class="oe_edi_import_choice"/>
<label for="oe_edi_import_openerp" id="oe_edi_import_openerp" class="oe_edi_import_choice_label">Import it into an existing OpenERP instance</label>
</div>
<p class="oe_edi_nested_block_import oe_edi_import_openerp_nested">
<label for="oe_edi_txt_server_url">OpenERP instance address:</label>
<br/>
<input type="text" id="oe_edi_txt_server_url" placeholder="http://example.my.openerp.com/"/><br/>
<button type="button" class="oe_edi_import_button" id="oe_edi_import_existing">Import</button>
</p>
<div class="oe_edi_option">
<input type="radio" id="oe_edi_import_saas" name="oe_edi_import" class="oe_edi_import_choice"/>
<label for="oe_edi_import_saas" id="oe_edi_import_saas" class="oe_edi_import_choice_label">Import it into a new OpenERP Online instance</label>
</div>
<p class="oe_edi_nested_block_import oe_edi_import_saas_nested">
<button type="button" class="oe_edi_import_button" id="oe_edi_import_create">Create my new OpenERP instance</button>
</p>
<div class="oe_edi_option">
<input type="radio" id="oe_edi_import_download" name="oe_edi_import" class="oe_edi_import_choice"/>
<label for="oe_edi_import_download" id="oe_edi_import_download" class="oe_edi_import_choice_label">Import into another application</label>
</div>
<p class="oe_edi_nested_block_import oe_edi_small oe_edi_import_download_nested">
OpenERP's Electronic Data Interchange documents are based on a generic and language
independent <a href="http://json.org">JSON</a> serialization of the document's attribute.
It is usually very quick and straightforward to create a small plug-in for your preferred
application that will be capable of importing any OpenERP EDI document.
You can find out more details about how to do this and what the content of OpenERP EDI documents
is like in the <a href="http://doc.openerp.com/search.html?q=edi">OpenERP documentation</a>.
<br/>
To get started immediately, <a href="#" id="oe_edi_download_show_code">see is all it takes to use this EDI document in Python</a>.
</p>
<div class="python oe_edi_nested_block_import oe_edi_small" id="oe_edi_download_code" t-translation="off">
<ol><li class="li1"><div class="de1"><span class="kw1">import</span> <span class="kw3">urllib2</span><span class="sy0">,</span> simplejson</div></li>
<li class="li1"><div class="de1">edi_document <span class="sy0">=</span> <span class="kw3">urllib2</span>.<span class="me1">urlopen</span><span class="br0">(</span><span class="st0">'<t t-esc="widget.get_download_url()"/>'</span><span class="br0">)</span>.<span class="me1">read</span><span class="br0">(</span><span class="br0">)</span></div></li>
<li class="li2"><div class="de2">document_data <span class="sy0">=</span> simplejson.<span class="me1">loads</span><span class="br0">(</span>edi_document<span class="br0">)</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">print</span> <span class="st0">"Amount: "</span><span class="sy0">,</span> document_data<span class="br0">[</span><span class="st0">'amount_total'</span><span class="br0">]</span></div></li>
</ol></div>
<p class="oe_edi_nested_block_import oe_edi_small oe_edi_import_download_nested">
You can download the raw EDI document here:<br/>
<input type="text" readonly="readonly" t-att-value="widget.get_download_url()"/>
<button type="button" class="oe_edi_import_button" id="oe_edi_download">Download</button>
</p>
<div class="oe_edi_right_bottom">
<t t-raw="widget.sidebar"/>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="2">
<div id="oe_footer" class="oe_footer">
<p class="oe_footer_powered">Powered by <a href="http://www.openerp.com">OpenERP</a></p>
</div>
</td>
</tr>
</table>
</t>
</template>

View File

@ -1,163 +0,0 @@
<template>
<t t-name="Edi.account.invoice.content">
<div class="oe_edi_paperbox">
<div class="oe_edi_address_from">
<div class="oe_edi_company_block_title">
<span class="oe_edi_company_name"><t t-esc="doc.company_id[1]"/></span>
</div>
<div class="oe_edi_company_block_body">
<p>
<t t-if="doc.company_address">
<t t-if="doc.company_address.street" t-esc="doc.company_address.street"/><br/>
<t t-if="doc.company_address.street2"><t t-esc="doc.company_address.street2"/><br/></t>
<t t-if="doc.company_address.zip" t-esc="doc.company_address.zip"/> <t t-if="doc.company_address.city" t-esc="doc.company_address.city"/> <br/>
<t t-if="doc.company_address.country_id"><t t-esc="doc.company_address.country_id[1]"/><br/></t>
</t>
</p>
</div>
</div>
<div class="oe_edi_address_to">
<div class="oe_edi_company_block_title">
<span class="oe_edi_company_name"><t t-esc="doc.partner_id[1]"/></span>
</div>
<div class="oe_edi_company_block_body">
<p>
<t t-if="doc.partner_address">
<t t-if="doc.partner_address.street" t-esc="doc.partner_address.street"/><br/>
<t t-if="doc.partner_address.street2"><t t-esc="doc.partner_address.street2"/><br/></t>
<t t-if="doc.partner_address.zip" t-esc="doc.partner_address.zip"/> <t t-if="doc.partner_address.city" t-esc="doc.partner_address.city"/> <br/>
<t t-if="doc.partner_address.country_id"><t t-esc="doc.partner_address.country_id[1]"/><br/></t>
</t>
</p>
</div>
</div>
<h1 class="oe_edi_doc_title">Invoice <t t-esc="doc.internal_number"/>: <t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></h1>
<table width="100%" class="oe_edi_data oe_edi_shade">
<tr class="oe_edi_floor">
<th align="left">Description</th>
<th align="left">Date</th>
<th align="left">Your Reference</th>
</tr>
<tr class="oe_edi_data_row">
<td align="left"><t t-if="doc.name" t-esc="doc.name"/></td>
<td align="left"><t t-if="doc.date_invoice" t-esc="doc.date_invoice"/></td>
<td align="left"><t t-if="doc.partner_ref" t-esc="doc.partner_ref"/></td>
</tr>
</table>
<p/>
<table width="100%" class="oe_edi_data">
<tr class="oe_edi_floor">
<th align="left">Product Description</th>
<th align="right">Quantity</th>
<th align="right">Unit Price</th>
<th align="right">Discount</th>
<th align="right">Price</th>
</tr>
<t t-if="doc.invoice_line" t-foreach="doc.invoice_line" t-as="invoice_line">
<tr class="oe_edi_data_row">
<td align="left"><t t-esc="invoice_line.name"/>
<t t-if="invoice_line.note">
<pre class="oe_edi_inner_note"><t t-esc="invoice_line.note"/></pre>
</t>
</td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',invoice_line.quantity)"/> <t t-esc="invoice_line.uos_id[1]"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',invoice_line.price_unit)"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',invoice_line.discount)"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',invoice_line.price_subtotal)"/> <t t-esc="doc.currency.code"/></td>
</tr>
</t>
<tr>
<td colspan="3"></td>
<td colspan="2" class="oe_edi_ceiling">
<div class="oe_edi_summary_label">
Net Total:
</div>
<div class="oe_edi_summary_value">
<t t-esc="_.str.sprintf('%.2f',doc.amount_untaxed)"/> <t t-esc="doc.currency.code"/>
</div>
</td>
</tr>
<tr>
<td colspan="3"></td>
<td colspan="2" class="oe_edi_floor">
<div class="oe_edi_summary_label">
Taxes:
</div>
<div class="oe_edi_summary_value">
<t t-esc="_.str.sprintf('%.2f',doc.amount_tax)"/> <t t-esc="doc.currency.code"/>
</div>
</td>
</tr>
<tr>
<td colspan="3"></td>
<th colspan="2" class="oe_edi_shade">
<div class="oe_edi_summary_label">
Total:
</div>
<div class="oe_edi_summary_value">
<t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/>
</div>
</th>
</tr>
</table>
<t t-if="doc.tax_line">
<table class="oe_edi_data" width="40%">
<tr class="oe_edi_floor">
<th align="left">Tax</th>
<th align="right">Base Amount</th>
<th align="right">Amount</th>
</tr>
<t t-if="doc.tax_line"><t t-foreach="doc.tax_line" t-as="tax_line">
<tr class="oe_edi_data_row">
<td align="left"><t t-esc="tax_line.name"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',tax_line.base_amount)"/> <t t-esc="doc.currency.code"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',tax_line.amount)"/> <t t-esc="doc.currency.code"/></td>
</tr>
</t>
</t>
</table>
</t>
<t t-if="doc.comment">
<p>Notes:</p>
<pre class="oe_edi_inner_note"><t t-esc="doc.comment"/></pre>
</t>
</div>
</t>
<t t-name="Edi.account.invoice.sidebar">
<t t-if="!doc.reconciled &amp;&amp; (doc.type == 'out_invoice' or doc.type == 'in_refund')">
<t t-if="doc.company_address.paypal_account || doc.company_address.bank_ids">
<p class="oe_edi_sidebar_title">Pay Online</p>
<t t-if="doc.company_address.paypal_account">
<div class="oe_edi_option">
<input type="radio" id="oe_edi_paypal" name="oe_edi_pay" class="oe_edi_pay_choice"/>
<label for="oe_edi_paypal" id="oe_edi_paypal" class="oe_edi_pay_choice_label">Paypal</label>
</div>
<p class="oe_edi_nested_block_pay oe_edi_paypal_nested">
You may directly pay this invoice online via Paypal's secure payment gateway:<br/>
<a t-att-href="widget.get_paypal_url('Invoice','internal_number')" target="_new">
<img class="oe_edi_paypal_button" src="https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif"/>
</a>
</p>
</t>
<t t-if="doc.company_address.bank_ids">
<div class="oe_edi_option">
<input type="radio" id="oe_edi_pay_wire" name="oe_edi_pay" class="oe_edi_pay_choice"/>
<label for="oe_edi_pay_wire" id="oe_edi_pay_wire" class="oe_edi_pay_choice_label">Bank Wire Transfer</label>
</div>
<p class="oe_edi_nested_block_pay oe_edi_pay_wire_nested">
Please transfer <strong><t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></strong> to
<strong><t t-esc="doc.company_id[1]"/></strong> (postal address on the invoice header)
using one of the following bank accounts. Be sure to mention the invoice
reference <strong><t t-esc="doc.internal_number"/></strong> on the transfer:
<br/><br/>
</p>
<ul class="oe_edi_nested_block_pay oe_edi_pay_wire_nested">
<t t-foreach="doc.company_address.bank_ids" t-as="bank_info">
<li><t t-esc="bank_info[1]"/></li>
</t>
</ul>
</t>
</t>
</t>
</t>
</template>

View File

@ -1,169 +0,0 @@
<template>
<t t-name="Edi.sale.order.content">
<div class="oe_edi_paperbox">
<div class="oe_edi_address_from">
<div class="oe_edi_company_block_title">
<span class="oe_edi_company_name"><t t-esc="doc.company_id[1]"/></span>
</div>
<div class="oe_edi_company_block_body">
<p>
<t t-if="doc.company_address">
<t t-if="doc.company_address.street" t-esc="doc.company_address.street"/><br/>
<t t-if="doc.company_address.street2"><t t-esc="doc.company_address.street2"/><br/></t>
<t t-if="doc.company_address.zip" t-esc="doc.company_address.zip"/> <t t-if="doc.company_address.city" t-esc="doc.company_address.city"/> <br/>
<t t-if="doc.company_address.country_id"><t t-esc="doc.company_address.country_id[1]"/><br/></t>
</t>
</p>
</div>
</div>
<div class="oe_edi_address_to">
<div class="oe_edi_company_block_title">
<span class="oe_edi_company_name"><t t-esc="doc.partner_id[1]"/></span>
</div>
<div class="oe_edi_company_block_body">
<p>
<t t-if="doc.partner_address">
<t t-if="doc.partner_address.street" t-esc="doc.partner_address.street"/><br/>
<t t-if="doc.partner_address.street2"><t t-esc="doc.partner_address.street2"/><br/></t>
<t t-if="doc.partner_address.zip" t-esc="doc.partner_address.zip"/> <t t-if="doc.partner_address.city" t-esc="doc.partner_address.city"/> <br/>
<t t-if="doc.partner_address.country_id"><t t-esc="doc.partner_address.country_id[1]"/><br/></t>
</t>
</p>
</div>
</div>
<t t-if="(doc.state == 'draft' or doc.state == 'sent') and doc.__model == 'sale.order'">
<h1 class="oe_edi_doc_title">Quotation <t t-esc="doc.name"/>: <t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></h1>
</t>
<t t-if="(doc.state == 'draft' or doc.state == 'sent') and doc.__model == 'purchase.order'">
<h1 class="oe_edi_doc_title">Request for Quotation <t t-esc="doc.name"/>: <t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></h1>
</t>
<t t-if="(doc.state != 'draft' and doc.state != 'sent')">
<h1 class="oe_edi_doc_title">Order <t t-esc="doc.name"/>: <t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></h1>
</t>
<table width="100%" class="oe_edi_data oe_edi_shade">
<tr class="oe_edi_floor">
<th align="left">Your Reference</th>
<th align="left">Date</th>
<th align="left">Salesperson</th>
<th align="left">Payment terms</th>
</tr>
<tr class="oe_edi_data_row">
<td align="left"><t t-if="doc.partner_ref" t-esc="doc.partner_ref"/></td>
<td align="left"><t t-esc="doc.date_order"/></td>
<td align="left"><t t-if="doc.user_id" t-esc="doc.user_id[1]"/></td>
<td align="left">
<t t-if="doc.payment_term" t-esc="doc.payment_term[1]"/>
</td>
</tr>
</table>
<p/>
<table width="100%" class="oe_edi_data">
<tr class="oe_edi_floor">
<th align="left">Product Description</th>
<th align="right">Quantity</th>
<th align="right">Unit Price</th>
<th align="right">Discount(%)</th>
<th align="right">Price</th>
</tr>
<t t-if="doc.order_line" t-foreach="doc.order_line" t-as="doc_line">
<tr class="oe_edi_data_row">
<td align="left"><t t-esc="doc_line.name"/>
<t t-if="doc_line.notes">
<pre class="oe_edi_inner_note"><t t-esc="doc_line.notes"/></pre>
</t>
</td>
<td align="right">
<t t-esc="_.str.sprintf('%.2f',doc_line.product_qty)"/> <t t-esc="doc_line.product_uom[1]"/>
</td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',doc_line.price_unit)"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',doc_line.discount or 0.0)"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',doc_line.price_subtotal)"/> <t t-esc="doc.currency.code"/></td>
</tr>
</t>
<tr>
<td colspan="3"></td>
<td colspan="2" class="oe_edi_ceiling">
<div class="oe_edi_summary_label">
Net Total:
</div>
<div class="oe_edi_summary_value">
<t t-esc="_.str.sprintf('%.2f',doc.amount_untaxed)"/> <t t-esc="doc.currency.code"/>
</div>
</td>
</tr>
<tr>
<td colspan="3"></td>
<td colspan="2" class="oe_edi_floor">
<div class="oe_edi_summary_label">
Taxes:
</div>
<div class="oe_edi_summary_value">
<t t-esc="_.str.sprintf('%.2f',doc.amount_tax)"/> <t t-esc="doc.currency.code"/>
</div>
</td>
</tr>
<tr>
<td colspan="3"></td>
<th colspan="2" class="oe_edi_shade">
<div class="oe_edi_summary_label">
Total:
</div>
<div class="oe_edi_summary_value">
<t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/>
</div>
</th>
</tr>
</table>
<t t-if="doc.notes">
<p>Notes:</p>
<pre class="oe_edi_inner_note"><t t-esc="doc.notes"/></pre>
</t>
</div>
</t>
<t t-name="Edi.sale.order.sidebar">
<t t-if="doc.order_policy and (doc.order_policy == 'prepaid' || doc.order_policy == 'manual') and (doc.state != 'draft' and doc.state != 'sent')">
<t t-if="doc.company_address.paypal_account || doc.company_address.bank_ids">
<p class="oe_edi_sidebar_title">Pay Online</p>
<t t-if="doc.company_address.paypal_account">
<div class="oe_edi_option">
<input type="radio" id="oe_edi_paypal" name="oe_edi_pay" class="oe_edi_pay_choice"/>
<label for="oe_edi_paypal" id="oe_edi_paypal" class="oe_edi_pay_choice_label">Paypal</label>
</div>
<p class="oe_edi_nested_block_pay oe_edi_paypal_nested">
You may directly pay this order online via Paypal's secure payment gateway:<br/>
<a t-att-href="widget.get_paypal_url('Sale Order','name')" target="_new">
<img class="oe_edi_paypal_button" src="https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif"/>
</a>
</p>
</t>
<t t-if="doc.company_address.bank_ids">
<div class="oe_edi_option">
<input type="radio" id="oe_edi_pay_wire" name="oe_edi_pay" class="oe_edi_pay_choice"/>
<label for="oe_edi_pay_wire" id="oe_edi_pay_wire" class="oe_edi_pay_choice_label">Bank Wire Transfer</label>
</div>
<p class="oe_edi_nested_block_pay oe_edi_pay_wire_nested">
Please transfer <strong><t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></strong> to
<strong><t t-esc="doc.company_id[1]"/></strong> (postal address on the order header)
using one of the following bank accounts. Be sure to mention the document
reference <strong><t t-esc="doc.name"/></strong> on the transfer:
<br/><br/>
</p>
<ul class="oe_edi_nested_block_pay oe_edi_pay_wire_nested">
<t t-foreach="doc.company_address.bank_ids" t-as="bank_info">
<li><t t-esc="bank_info[1]"/></li>
</t>
</ul>
</t>
</t>
</t>
</t>
<t t-name="Edi.purchase.order.content">
<t t-call="Edi.sale.order.content"/>
</t>
<t t-name="Edi.purchase.order.sidebar">
<t t-call="Edi.sale.order.sidebar"/>
</t>
</template>

View File

@ -6,11 +6,10 @@
with an attached file, check the result, the alter the data
and reimport it.
-
!python {model: edi.document}: |
!python {model: edi.edi}: |
import json
partner_obj = self.pool.get('res.partner')
tokens = self.export_edi(cr, uid, [partner_obj.browse(cr, uid, ref('base.res_partner_2'))])
doc = self.get_document(cr, uid, tokens[0], context=context)
res_partner = self.pool.get('res.partner')
doc = self.generate_edi(cr, uid, [res_partner.browse(cr, uid, ref('base.res_partner_2'))])
edi_doc, = json.loads(doc)
# check content of the document
@ -36,8 +35,7 @@
"Expected (%r,> %r) after import 1, got %r" % ('res.partner', ref('base.res_partner_2'), result)
# export the same partner we just created, and see if the output matches the input
tokens = self.export_edi(cr, uid, [partner_obj.browse(cr, uid, result[1])])
doc_output = self.get_document(cr, uid, tokens[0], context=context)
doc_output = self.generate_edi(cr, uid, [res_partner.browse(cr, uid, result[1])])
edi_doc_output, = json.loads(doc_output)
for attribute in ('__model', '__module', '__id', 'name', '__attachments'):
assert edi_doc_output.get(attribute) == edi_doc.get(attribute), \

View File

@ -100,25 +100,27 @@ class test_message_compose(test_mail_mockup.TestMailMockups):
# ----------------------------------------
# 1. Comment on pigs
compose_id = mail_compose.create(cr, uid,
{'subject': 'Forget me subject', 'body': 'Dummy body'},
{'default_composition_mode': 'comment',
'default_model': 'mail.group',
'default_res_id': self.group_pigs_id,
'default_use_template': False,
'default_template_id': email_template_id,
'active_ids': [self.group_pigs_id, self.group_bird_id]})
compose = mail_compose.browse(cr, uid, compose_id)
# 2. Perform 'toggle_template', to set use_template and use template_id
mail_compose.toggle_template(cr, uid, [compose_id], {'default_composition_mode': 'comment', 'default_model': 'mail.group'})
context = {
'default_composition_mode': 'comment',
'default_model': 'mail.group',
'default_res_id': self.group_pigs_id,
'default_use_template': False,
'default_template_id': email_template_id,
'active_ids': [self.group_pigs_id, self.group_bird_id]
}
compose_id = mail_compose.create(cr, uid, {'subject': 'Forget me subject', 'body': 'Dummy body'}, context)
compose = mail_compose.browse(cr, uid, compose_id, context)
onchange_res = compose.onchange_template_id(email_template_id, 'comment', 'mail.group', self.group_pigs_id)['value']
onchange_res['partner_ids'] = [(4, partner_id) for partner_id in onchange_res.pop('partner_ids', [])]
onchange_res['attachment_ids'] = [(4, attachment_id) for attachment_id in onchange_res.pop('attachment_ids', [])]
compose.write(onchange_res)
compose.refresh()
message_pids = [partner.id for partner in compose.partner_ids]
partner_ids = self.res_partner.search(cr, uid, [('email', 'in', ['b@b.b', 'c@c.c', 'd@d.d'])])
# Test: mail.compose.message: subject, body, content_subtype, partner_ids
# Test: mail.compose.message: subject, body, partner_ids
self.assertEqual(compose.subject, _subject1, 'mail.compose.message subject incorrect')
self.assertEqual(compose.body, _body_html1, 'mail.compose.message body incorrect')
self.assertEqual(compose.content_subtype, 'html', 'mail.compose.message content_subtype incorrect')
self.assertEqual(set(message_pids), set(partner_ids), 'mail.compose.message partner_ids incorrect')
# Test: mail.compose.message: attachments
# Test: mail.message: attachments
@ -128,41 +130,34 @@ class test_message_compose(test_mail_mockup.TestMailMockups):
self.assertIn((attach.name, base64.b64decode(attach.datas)), _attachments_test,
'mail.message attachment name / data incorrect')
# 3. Perform 'toggle_template': template is not set anymore
mail_compose.toggle_template(cr, uid, [compose_id], {'default_composition_mode': 'comment', 'default_model': 'mail.group'})
compose.refresh()
# Test: subject, body, partner_ids
self.assertEqual(compose.subject, False, 'mail.compose.message subject incorrect')
self.assertEqual(compose.body, '', 'mail.compose.message body incorrect')
# ----------------------------------------
# CASE3: mass_mail with template
# ----------------------------------------
# 1. Mass_mail on pigs and bird, with a default_partner_ids set to check he is correctly added
compose_id = mail_compose.create(cr, uid,
{'subject': 'Forget me subject', 'body': 'Dummy body'},
{'default_composition_mode': 'mass_mail',
'default_model': 'mail.group',
'default_res_id': self.group_pigs_id,
'default_use_template': False,
'default_template_id': email_template_id,
'default_partner_ids': [p_a_id],
'active_ids': [self.group_pigs_id, self.group_bird_id]})
compose = mail_compose.browse(cr, uid, compose_id)
# 2. Perform 'toggle_template', to set use_template and use template_id
mail_compose.toggle_template(cr, uid, [compose_id], {'default_composition_mode': 'comment', 'default_model': 'mail.group'})
context = {
'default_composition_mode': 'mass_mail',
'default_model': 'mail.group',
'default_res_id': self.group_pigs_id,
'default_template_id': email_template_id,
'default_partner_ids': [p_a_id],
'active_ids': [self.group_pigs_id, self.group_bird_id]
}
compose_id = mail_compose.create(cr, uid, {'subject': 'Forget me subject', 'body': 'Dummy body'}, context)
compose = mail_compose.browse(cr, uid, compose_id, context)
onchange_res = compose.onchange_template_id(email_template_id, 'mass_mail', 'mail.group', self.group_pigs_id)['value']
onchange_res['partner_ids'] = [(4, partner_id) for partner_id in onchange_res.pop('partner_ids', [])]
onchange_res['attachment_ids'] = [(4, attachment_id) for attachment_id in onchange_res.pop('attachment_ids', [])]
compose.write(onchange_res)
compose.refresh()
message_pids = [partner.id for partner in compose.partner_ids]
partner_ids = [p_a_id]
# Test: mail.compose.message: subject, body, content_subtype, partner_ids
self.assertEqual(compose.subject, '${object.name}', 'mail.compose.message subject incorrect')
self.assertEqual(compose.body, '${object.description}', 'mail.compose.message body incorrect')
self.assertEqual(compose.content_subtype, 'html', 'mail.compose.message content_subtype incorrect')
self.assertEqual(set(message_pids), set(partner_ids), 'mail.compose.message partner_ids incorrect')
# 3. Post the comment, get created message
# 2. Post the comment, get created message
mail_compose.send_mail(cr, uid, [compose_id], {'default_res_id': -1, 'active_ids': [self.group_pigs_id, self.group_bird_id]})
group_pigs.refresh()
group_bird.refresh()

View File

@ -19,11 +19,8 @@
#
##############################################################################
import tools
from osv import osv
from osv import fields
from openerp import tools
from openerp.osv import osv, fields
def _reopen(self, res_id, model):
return {'type': 'ir.actions.act_window',
@ -39,7 +36,6 @@ def _reopen(self, res_id, model):
},
}
class mail_compose_message(osv.TransientModel):
_inherit = 'mail.compose.message'
@ -60,37 +56,19 @@ class mail_compose_message(osv.TransientModel):
record_ids = email_template_obj.search(cr, uid, [('model', '=', model)], context=context)
return email_template_obj.name_get(cr, uid, record_ids, context) + [(False, '')]
def default_get(self, cr, uid, fields, context=None):
if context is None:
context = {}
result = super(mail_compose_message, self).default_get(cr, uid, fields, context=context)
result['template_id'] = context.get('default_template_id', context.get('mail.compose.template_id', False))
# pre-render the template if any
if result.get('use_template') and result.get('template_id'):
onchange_res = self.onchange_use_template(cr, uid, [], result.get('use_template'), result.get('template_id'),
result.get('composition_mode'), result.get('model'), result.get('res_id'), context=context)
result.update(onchange_res['value'])
return result
_columns = {
'use_template': fields.boolean('Use Template'),
# incredible hack of the day: size=-1 means we want an int db column instead of an str one
'template_id': fields.selection(_get_templates, 'Template', size=-1),
}
_defaults = {
'use_template': True,
}
def onchange_template_id(self, cr, uid, ids, use_template, template_id, composition_mode, model, res_id, context=None):
""" - use_template not set: return default_get
- use_template set in mass_mailing: we cannot render, so return the template values
- use_template set: return rendered values """
if use_template and template_id and composition_mode == 'mass_mail':
def onchange_template_id(self, cr, uid, ids, template_id, composition_mode, model, res_id, context=None):
""" - mass_mailing: we cannot render, so return the template values
- normal mode: return rendered values """
if template_id and composition_mode == 'mass_mail':
values = self.pool.get('email.template').read(cr, uid, template_id, ['subject', 'body_html'], context)
values.pop('id')
elif use_template and template_id:
elif template_id:
# FIXME odo: change the mail generation to avoid attachment duplication
values = self.generate_email_for_composer(cr, uid, template_id, res_id, context=context)
# transform attachments into attachment_ids
values['attachment_ids'] = []
@ -102,39 +80,16 @@ class mail_compose_message(osv.TransientModel):
'datas_fname': attach_fname,
'res_model': model,
'res_id': res_id,
'type': 'binary', # overwrite the context default_value
'type': 'binary', # override default_type from context, possibly meant for another model!
}
values['attachment_ids'].append(ir_attach_obj.create(cr, uid, data_attach, context=context))
else:
values = self.default_get(cr, uid, ['body', 'body_html', 'subject', 'partner_ids', 'attachment_ids'], context=context)
values = self.default_get(cr, uid, ['body', 'subject', 'partner_ids', 'attachment_ids'], context=context)
if values.get('body_html'):
values['body'] = values.pop('body_html')
values.update(use_template=use_template, template_id=template_id)
return {'value': values}
def toggle_template(self, cr, uid, ids, context=None):
""" hit toggle template mode button: calls onchange_use_template to
emulate an on_change, then writes the values to update the form. """
for record in self.browse(cr, uid, ids, context=context):
onchange_res = self.onchange_use_template(cr, uid, ids, not record.use_template,
record.template_id, record.composition_mode, record.model, record.res_id, context=context).get('value', {})
# update partner_ids and attachment_ids
onchange_res['partner_ids'] = [(4, partner_id) for partner_id in onchange_res.pop('partner_ids', [])]
onchange_res['attachment_ids'] = [(4, attachment_id) for attachment_id in onchange_res.pop('attachment_ids', [])]
record.write(onchange_res)
return _reopen(self, record.id, record.model)
def onchange_use_template(self, cr, uid, ids, use_template, template_id, composition_mode, model, res_id, context=None):
""" onchange_use_template (values: True or False). If use_template is
False, we do as an onchange with template_id False for values """
values = self.onchange_template_id(cr, uid, ids, use_template,
template_id, composition_mode, model, res_id, context=context)
# force html when using templates
if use_template:
values['value']['content_subtype'] = 'html'
return values
def save_as_template(self, cr, uid, ids, context=None):
""" hit save as template button: current form value will be a new
template attached to the current document. """
@ -155,7 +110,7 @@ class mail_compose_message(osv.TransientModel):
'attachment_ids': [(6, 0, [att.id for att in record.attachment_ids])]
}
template_id = email_template.create(cr, uid, values, context=context)
record.write(record.onchange_template_id(True, template_id, record.composition_mode, record.model, record.res_id)['value'])
record.write(record.onchange_template_id(template_id, record.composition_mode, record.model, record.res_id)['value'])
return _reopen(self, record.id, record.model)
#------------------------------------------------------
@ -167,7 +122,7 @@ class mail_compose_message(osv.TransientModel):
mail.compose.message, transform email_cc and email_to into partner_ids """
template_values = self.pool.get('email.template').generate_email(cr, uid, template_id, res_id, context=context)
# filter template values
fields = ['body', 'body_html', 'subject', 'email_to', 'email_recipients', 'email_cc', 'attachments']
fields = ['body_html', 'subject', 'email_to', 'email_recipients', 'email_cc', 'attachments']
values = dict((field, template_values[field]) for field in fields if template_values.get(field))
values['body'] = values.pop('body_html', '')
# transform email_to, email_cc into partner_ids

View File

@ -7,25 +7,17 @@
<field name="model">mail.compose.message</field>
<field name="inherit_id" ref="mail.email_compose_message_wizard_form"/>
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='content_subtype']" position="after">
<field name="use_template" invisible="1"
on_change="onchange_use_template(use_template, template_id, composition_mode, model, res_id, context)"/>
</xpath>
<xpath expr="//footer" position="inside">
<group class="oe_right" col="1">
<div attrs="{'invisible':[('use_template','=',False)]}">Use template
<field name="template_id" attrs="{'invisible':[('use_template','=',False)]}"
nolabel="1"
on_change="onchange_template_id(use_template, template_id, composition_mode, model, res_id, context)"/>
</div>
<button icon="/email_template/static/src/img/email_template_save.png"
type="object" name="save_as_template" string="Save as new template" class="oe_link"
help="Save as a new template"
attrs="{'invisible':[('content_subtype','!=','html')]}"/>
</group>
</xpath>
</data>
<xpath expr="//footer" position="inside">
<group class="oe_right" col="1">
<div>Use template
<field name="template_id" nolabel="1"
on_change="onchange_template_id(template_id, composition_mode, model, res_id, context)"/>
</div>
<button icon="/email_template/static/src/img/email_template_save.png"
type="object" name="save_as_template" string="Save as new template" class="oe_link"
help="Save as a new template"/>
</group>
</xpath>
</field>
</record>

View File

@ -14,7 +14,7 @@
<menuitem name="Events"
id="event_main_menu"
groups="base.group_user"
sequence="80"/>
sequence="115"/>
<menuitem name="Events Organization" id="base.menu_event_main" parent="event_main_menu"/>
<!-- EVENTS -->

View File

@ -149,7 +149,7 @@
</field>
</record>
<menuitem name="Fleet" id="menu_root" sequence="70" />
<menuitem name="Fleet" id="menu_root" sequence="110" />
<menuitem name="Configuration" parent="menu_root" id="fleet_configuration" sequence="3" />
<menuitem action="fleet_vehicle_model_act" parent="fleet_configuration" id="fleet_vehicle_model_menu" groups="base.group_no_one"/>
<menuitem action="fleet_vehicle_model_brand_act" parent="fleet_configuration" id="fleet_vehicle_model_brand_menu" groups="base.group_no_one"/>

File diff suppressed because one or more lines are too long

View File

@ -6,7 +6,7 @@
<menuitem name="Human Resources"
id="menu_hr_root"
groups="base.group_hr_manager,base.group_hr_user,base.group_user"
sequence="110"/>
sequence="90"/>
<menuitem id="menu_hr_main" parent="menu_hr_root" name="Human Resources" sequence="0"/>
<menuitem id="menu_hr_configuration" name="Configuration" parent="hr.menu_hr_root" groups="base.group_hr_manager" sequence="50"/>
<menuitem id="menu_hr_management" name="Human Resources" parent="hr.menu_hr_configuration" groups="base.group_no_one" sequence="25"/>

View File

@ -22,7 +22,7 @@
-moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
-o-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
box-shadow: 0 1px 4px 3px rgba(0, 0, 0, 0.4);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
}
.oe_employee_picture {

View File

@ -0,0 +1,864 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
"PO-Revision-Date: 2012-11-21 11:45+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-11-22 05:07+0000\n"
"X-Generator: Launchpad (build 16293)\n"
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Blue"
msgstr "Blå"
#. module: hr_holidays
#: field:hr.holidays,holiday_type:0
msgid "Allocation Type"
msgstr "Tildeling type."
#. module: hr_holidays
#: selection:hr.employee,current_leave_state:0
#: selection:hr.holidays,state:0
msgid "Waiting Second Approval"
msgstr ""
#. module: hr_holidays
#: help:hr.holidays.status,remaining_leaves:0
msgid "Maximum Leaves Allowed - Leaves Already Taken"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Leaves Management"
msgstr "Etterlater ledelse."
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Group By..."
msgstr "Grupper etter ..."
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Allocation Mode"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
#: field:hr.holidays,department_id:0
msgid "Department"
msgstr "Avdeling"
#. module: hr_holidays
#: model:ir.actions.act_window,name:hr_holidays.request_approve_holidays
msgid "Requests Approve"
msgstr "Godta forespørsler ."
#. module: hr_holidays
#: selection:hr.employee,current_leave_state:0
#: selection:hr.holidays,state:0
msgid "Refused"
msgstr "Avvist"
#. module: hr_holidays
#: help:hr.holidays,category_id:0
msgid "Category of Employee"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid " Month-1"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Brown"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Remaining Days"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays,holiday_type:0
msgid "By Employee"
msgstr ""
#. module: hr_holidays
#: help:hr.holidays,employee_id:0
msgid ""
"Leave Manager can let this field empty if this leave request/allocation is "
"for every employee"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Set to Draft"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Light Cyan"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Light Green"
msgstr ""
#. module: hr_holidays
#: field:hr.employee,current_leave_id:0
msgid "Current Leave Type"
msgstr ""
#. module: hr_holidays
#: model:ir.actions.act_window,help:hr_holidays.open_ask_holidays
msgid ""
"Leave requests can be recorded by employees and validated by their managers. "
"Once a leave request is validated, it appears automatically in the agenda of "
"the employee. You can define several allowance types (paid holidays, "
"sickness, etc.) and manage allowances per type."
msgstr ""
#. module: hr_holidays
#: model:ir.actions.report.xml,name:hr_holidays.report_holidays_summary
msgid "Summary Of Leaves"
msgstr ""
#. module: hr_holidays
#: selection:hr.employee,current_leave_state:0
#: view:hr.holidays:0
#: selection:hr.holidays,state:0
msgid "Approved"
msgstr ""
#. module: hr_holidays
#: field:hr.employee,last_login:0
msgid "Latest Connection"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Refuse"
msgstr ""
#. module: hr_holidays
#: code:addons/hr_holidays/hr_holidays.py:344
#, python-format
msgid ""
"You cannot validate leaves for employee %s: too few remaining days (%s)."
msgstr ""
#. module: hr_holidays
#: help:hr.holidays,state:0
msgid ""
"The state is set to 'Draft', when a holiday request is created. \n"
"The state is 'Waiting Approval', when holiday request is confirmed by user. "
" \n"
"The state is 'Refused', when holiday request is refused by manager. "
" \n"
"The state is 'Approved', when holiday request is approved by manager."
msgstr ""
#. module: hr_holidays
#: view:board.board:0
#: model:ir.actions.act_window,name:hr_holidays.act_hr_employee_holiday_request
#: model:ir.ui.menu,name:hr_holidays.menu_hr_reporting_holidays
#: model:ir.ui.menu,name:hr_holidays.menu_open_ask_holidays
msgid "Leaves"
msgstr ""
#. module: hr_holidays
#: model:ir.model,name:hr_holidays.model_hr_holidays
msgid "Leave"
msgstr ""
#. module: hr_holidays
#: model:ir.ui.menu,name:hr_holidays.menu_request_approve_holidays
msgid "Leave Requests to Approve"
msgstr ""
#. module: hr_holidays
#: model:ir.ui.menu,name:hr_holidays.menu_account_central_journal
msgid "Leaves by Department"
msgstr ""
#. module: hr_holidays
#: selection:hr.employee,current_leave_state:0
#: selection:hr.holidays,state:0
msgid "Cancelled"
msgstr ""
#. module: hr_holidays
#: help:hr.holidays,type:0
msgid ""
"Choose 'Leave Request' if someone wants to take an off-day. \n"
"Choose 'Allocation Request' if you want to increase the number of leaves "
"available for someone"
msgstr ""
#. module: hr_holidays
#: help:hr.employee,remaining_leaves:0
msgid ""
"Total number of legal leaves allocated to this employee, change this value "
"to create allocation/leave requests."
msgstr ""
#. module: hr_holidays
#: view:hr.holidays.status:0
msgid "Validation"
msgstr ""
#. module: hr_holidays
#: code:addons/hr_holidays/hr_holidays.py:377
#, python-format
msgid "Warning !"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays.status,color_name:0
msgid "Color in Report"
msgstr ""
#. module: hr_holidays
#: model:ir.model,name:hr_holidays.model_hr_holidays_summary_employee
msgid "HR Holidays Summary Report By Employee"
msgstr ""
#. module: hr_holidays
#: help:hr.holidays,manager_id:0
msgid "This area is automatically filled by the user who validate the leave"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays,holiday_status_id:0
#: field:hr.holidays.remaining.leaves.user,leave_type:0
#: view:hr.holidays.status:0
#: field:hr.holidays.status,name:0
#: field:hr.holidays.summary.dept,holiday_type:0
#: model:ir.actions.act_window,name:hr_holidays.open_view_holiday_status
#: model:ir.model,name:hr_holidays.model_hr_holidays_status
#: model:ir.ui.menu,name:hr_holidays.menu_open_view_holiday_status
msgid "Leave Type"
msgstr ""
#. module: hr_holidays
#: code:addons/hr_holidays/hr_holidays.py:199
#: code:addons/hr_holidays/hr_holidays.py:344
#, python-format
msgid "Warning!"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Magenta"
msgstr ""
#. module: hr_holidays
#: code:addons/hr_holidays/wizard/hr_holidays_summary_department.py:44
#, python-format
msgid "You have to select at least 1 Department. And try again"
msgstr ""
#. module: hr_holidays
#: code:addons/hr_holidays/report/holidays_summary_report.py:114
#: selection:hr.holidays.summary.dept,holiday_type:0
#: selection:hr.holidays.summary.employee,holiday_type:0
#, python-format
msgid "Confirmed"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays.summary.dept,date_from:0
#: field:hr.holidays.summary.employee,date_from:0
msgid "From"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Confirm"
msgstr ""
#. module: hr_holidays
#: code:addons/hr_holidays/hr_holidays.py:384
#, python-format
msgid "Leave Request for %s"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays.status,remaining_leaves:0
msgid "Remaining Leaves"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
#: field:hr.holidays,state:0
msgid "State"
msgstr ""
#. module: hr_holidays
#: model:ir.model,name:hr_holidays.model_hr_holidays_remaining_leaves_user
msgid "Total holidays by type"
msgstr ""
#. module: hr_holidays
#: view:hr.employee:0
#: view:hr.holidays:0
#: field:hr.holidays,employee_id:0
#: field:hr.holidays.remaining.leaves.user,name:0
#: model:ir.model,name:hr_holidays.model_hr_employee
msgid "Employee"
msgstr ""
#. module: hr_holidays
#: selection:hr.employee,current_leave_state:0
#: selection:hr.holidays,state:0
msgid "New"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Type"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Red"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays.remaining.leaves.user:0
msgid "Leaves by Type"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Light Salmon"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Wheat"
msgstr ""
#. module: hr_holidays
#: constraint:resource.calendar.leaves:0
msgid "Error! leave start-date must be lower then leave end-date."
msgstr ""
#. module: hr_holidays
#: code:addons/hr_holidays/hr_holidays.py:382
#, python-format
msgid "Allocation for %s"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
#: field:hr.holidays,number_of_days:0
#: field:hr.holidays,number_of_days_temp:0
msgid "Number of Days"
msgstr ""
#. module: hr_holidays
#: code:addons/hr_holidays/hr_holidays.py:377
#, python-format
msgid ""
"The feature behind the field 'Remaining Legal Leaves' can only be used when "
"there is only one leave type with the option 'Allow to Override Limit' "
"unchecked. (%s Found). Otherwise, the update is ambiguous as we cannot "
"decide on which leave type the update has to be done. \n"
"You may prefer to use the classic menus 'Leave Requests' and 'Allocation "
"Requests' located in 'Human Resources \\ Leaves' to manage the leave days of "
"the employees if the configuration does not allow to use this field."
msgstr ""
#. module: hr_holidays
#: view:hr.holidays.status:0
msgid "Search Leave Type"
msgstr ""
#. module: hr_holidays
#: sql_constraint:hr.holidays:0
msgid "You have to select an employee or a category"
msgstr ""
#. module: hr_holidays
#: help:hr.holidays.status,double_validation:0
msgid ""
"When selected, the Allocation/Leave Requests for this type require a second "
"validation to be approved."
msgstr ""
#. module: hr_holidays
#: selection:hr.employee,current_leave_state:0
#: selection:hr.holidays,state:0
msgid "Waiting Approval"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays.summary.employee,emp:0
msgid "Employee(s)"
msgstr ""
#. module: hr_holidays
#: help:hr.holidays.status,categ_id:0
msgid ""
"If you set a meeting type, OpenERP will create a meeting in the calendar "
"once a leave is validated."
msgstr ""
#. module: hr_holidays
#: field:hr.holidays,linked_request_ids:0
msgid "Linked Requests"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays,parent_id:0
msgid "Parent"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Lavender"
msgstr ""
#. module: hr_holidays
#: xsl:holidays.summary:0
#: view:hr.holidays:0
msgid "Month"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
#: model:ir.actions.act_window,name:hr_holidays.open_ask_holidays
#: model:ir.ui.menu,name:hr_holidays.menu_open_ask_holidays_new
msgid "Leave Requests"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays.status,limit:0
msgid "Allow to Override Limit"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays.summary.employee:0
#: model:ir.actions.act_window,name:hr_holidays.action_hr_holidays_summary_employee
msgid "Employee's Holidays"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
#: field:hr.holidays,category_id:0
msgid "Category"
msgstr ""
#. module: hr_holidays
#: help:hr.holidays.status,max_leaves:0
msgid ""
"This value is given by the sum of all holidays requests with a positive "
"value."
msgstr ""
#. module: hr_holidays
#: view:board.board:0
msgid "All Employee Leaves"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Light Coral"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays.summary.dept:0
#: model:ir.actions.act_window,name:hr_holidays.action_hr_holidays_summary_dept
msgid "Holidays by Department"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Black"
msgstr ""
#. module: hr_holidays
#: model:ir.actions.act_window,name:hr_holidays.hr_holidays_leaves_assign_legal
msgid "Allocate Leaves for Employees"
msgstr ""
#. module: hr_holidays
#: field:resource.calendar.leaves,holiday_id:0
msgid "Holiday"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays,case_id:0
#: field:hr.holidays.status,categ_id:0
msgid "Meeting"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Ivory"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.summary.dept,holiday_type:0
#: selection:hr.holidays.summary.employee,holiday_type:0
msgid "Both Validated and Confirmed"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays.status,leaves_taken:0
msgid "Leaves Already Taken"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays,user_id:0
#: field:hr.holidays.remaining.leaves.user,user_id:0
msgid "User"
msgstr ""
#. module: hr_holidays
#: sql_constraint:hr.holidays:0
msgid "The start date must be before the end date !"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays.status,active:0
msgid "Active"
msgstr ""
#. module: hr_holidays
#: constraint:hr.employee:0
msgid "Error ! You cannot create recursive Hierarchy of Employees."
msgstr ""
#. module: hr_holidays
#: view:hr.employee:0
#: field:hr.employee,remaining_leaves:0
msgid "Remaining Legal Leaves"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays,manager_id:0
msgid "First Approval"
msgstr ""
#. module: hr_holidays
#: model:hr.holidays.status,name:hr_holidays.holiday_status_unpaid
msgid "Unpaid"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
#: model:ir.actions.act_window,name:hr_holidays.open_company_allocation
#: model:ir.ui.menu,name:hr_holidays.menu_open_company_allocation
msgid "Leaves Summary"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Holidays during last month"
msgstr ""
#. module: hr_holidays
#: code:addons/hr_holidays/wizard/hr_holidays_summary_department.py:44
#, python-format
msgid "Error"
msgstr ""
#. module: hr_holidays
#: view:hr.employee:0
msgid "Assign Leaves"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Light Blue"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "My Department Leaves"
msgstr ""
#. module: hr_holidays
#: field:hr.employee,current_leave_state:0
msgid "Current Leave Status"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays,type:0
msgid "Request Type"
msgstr ""
#. module: hr_holidays
#: help:hr.holidays.status,active:0
msgid ""
"If the active field is set to false, it will allow you to hide the leave "
"type without removing it."
msgstr ""
#. module: hr_holidays
#: view:hr.holidays.status:0
msgid "Misc"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "General"
msgstr ""
#. module: hr_holidays
#: model:hr.holidays.status,name:hr_holidays.holiday_status_comp
msgid "Compensatory Days"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
#: field:hr.holidays,notes:0
msgid "Reasons"
msgstr ""
#. module: hr_holidays
#: model:ir.actions.act_window,name:hr_holidays.action_hr_available_holidays_report
#: model:ir.ui.menu,name:hr_holidays.menu_hr_available_holidays_report_tree
msgid "Leaves Analysis"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays.summary.dept:0
#: view:hr.holidays.summary.employee:0
msgid "Cancel"
msgstr ""
#. module: hr_holidays
#: help:hr.holidays.status,color_name:0
msgid ""
"This color will be used in the leaves summary located in Reporting\\Leaves "
"by Departement"
msgstr ""
#. module: hr_holidays
#: code:addons/hr_holidays/report/holidays_summary_report.py:117
#: view:hr.holidays:0
#: selection:hr.holidays.summary.dept,holiday_type:0
#: selection:hr.holidays.summary.employee,holiday_type:0
#, python-format
msgid "Validated"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
#: selection:hr.holidays,type:0
msgid "Allocation Request"
msgstr ""
#. module: hr_holidays
#: model:ir.model,name:hr_holidays.model_resource_calendar_leaves
msgid "Leave Detail"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays,double_validation:0
#: field:hr.holidays.status,double_validation:0
msgid "Apply Double Validation"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays.summary.dept:0
#: view:hr.holidays.summary.employee:0
msgid "Print"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays.status:0
msgid "Details"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
#: model:ir.actions.act_window,name:hr_holidays.action_hr_holidays_leaves_by_month
msgid "My Leaves"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays,holiday_type:0
msgid "By Employee Category"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
#: selection:hr.holidays,type:0
msgid "Leave Request"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays,name:0
msgid "Description"
msgstr ""
#. module: hr_holidays
#: model:hr.holidays.status,name:hr_holidays.holiday_status_cl
msgid "Legal Leaves"
msgstr ""
#. module: hr_holidays
#: sql_constraint:hr.holidays:0
msgid "The number of days must be greater than 0 !"
msgstr ""
#. module: hr_holidays
#: help:hr.holidays,holiday_type:0
msgid ""
"By Employee: Allocation/Request for individual Employee, By Employee "
"Category: Allocation/Request for group of employees in category"
msgstr ""
#. module: hr_holidays
#: code:addons/hr_holidays/hr_holidays.py:199
#, python-format
msgid "You cannot delete a leave which is not in draft state !"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Search Leave"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays.summary.employee,holiday_type:0
msgid "Select Holiday Type"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays.remaining.leaves.user,no_of_leaves:0
msgid "Remaining leaves"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays.summary.dept,depts:0
msgid "Department(s)"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays,manager_id2:0
msgid "Second Approval"
msgstr ""
#. module: hr_holidays
#: field:hr.holidays,date_to:0
msgid "End Date"
msgstr ""
#. module: hr_holidays
#: model:hr.holidays.status,name:hr_holidays.holiday_status_sl
msgid "Sick Leaves"
msgstr ""
#. module: hr_holidays
#: help:hr.holidays.status,limit:0
msgid ""
"If you select this checkbox, the system allows the employees to take more "
"leaves than the available ones for this type."
msgstr ""
#. module: hr_holidays
#: help:hr.holidays.status,leaves_taken:0
msgid ""
"This value is given by the sum of all holidays requests with a negative "
"value."
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Violet"
msgstr ""
#. module: hr_holidays
#: model:ir.actions.act_window,help:hr_holidays.hr_holidays_leaves_assign_legal
msgid ""
"You can assign remaining Legal Leaves for each employee, OpenERP will "
"automatically create and validate allocation requests."
msgstr ""
#. module: hr_holidays
#: field:hr.holidays.status,max_leaves:0
msgid "Maximum Allowed"
msgstr ""
#. module: hr_holidays
#: help:hr.holidays,manager_id2:0
msgid ""
"This area is automaticly filled by the user who validate the leave with "
"second level (If Leave type need second validation)"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Mode"
msgstr ""
#. module: hr_holidays
#: model:ir.model,name:hr_holidays.model_hr_holidays_summary_dept
msgid "HR Holidays Summary Report By Department"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Approve"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
#: field:hr.holidays,date_from:0
msgid "Start Date"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
#: model:ir.actions.act_window,name:hr_holidays.open_allocation_holidays
#: model:ir.ui.menu,name:hr_holidays.menu_open_allocation_holidays
msgid "Allocation Requests"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Light Yellow"
msgstr ""
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
msgid "Light Pink"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Manager"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "To Confirm"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Year"
msgstr ""
#. module: hr_holidays
#: view:hr.holidays:0
msgid "To Approve"
msgstr ""

View File

@ -356,7 +356,8 @@ class hr_applicant(base_stage, osv.Model):
"""
if isinstance(ids, (str, int, long)):
ids = [ids]
if update_vals is None: vals = {}
if update_vals is None:
update_vals = {}
update_vals.update({
'description': msg.get('body'),
@ -373,12 +374,12 @@ class hr_applicant(base_stage, osv.Model):
}
for line in msg.get('body', '').split('\n'):
line = line.strip()
res = tools.misc.command_re.match(line)
res = tools.command_re.match(line)
if res and maps.get(res.group(1).lower(), False):
key = maps.get(res.group(1).lower())
update_vals[key] = res.group(2).lower()
return super(hr_applicant, self).message_update(cr, uids, ids, update_vals=update_vals, context=context)
return super(hr_applicant, self).message_update(cr, uid, ids, msg, update_vals=update_vals, context=context)
def create(self, cr, uid, vals, context=None):
obj_id = super(hr_applicant, self).create(cr, uid, vals, context=context)
@ -420,7 +421,7 @@ class hr_applicant(base_stage, osv.Model):
self.write(cr, uid, [applicant.id], {'emp_id': emp_id}, context=context)
self.case_close(cr, uid, [applicant.id], context)
else:
raise osv.except_osv(_('Warning!'),_('You must define Applied Job for this applicant.'))
raise osv.except_osv(_('Warning!'), _('You must define Applied Job for this applicant.'))
action_model, action_id = model_data.get_object_reference(cr, uid, 'hr', 'open_view_employee_list')
dict_act_window = act_window.read(cr, uid, action_id, [])
@ -433,13 +434,13 @@ class hr_applicant(base_stage, osv.Model):
"""Overrides cancel for crm_case for setting probability
"""
res = super(hr_applicant, self).case_cancel(cr, uid, ids, context)
self.write(cr, uid, ids, {'probability' : 0.0})
self.write(cr, uid, ids, {'probability': 0.0})
return res
def case_pending(self, cr, uid, ids, context=None):
"""Marks case as pending"""
res = super(hr_applicant, self).case_pending(cr, uid, ids, context)
self.write(cr, uid, ids, {'probability' : 0.0})
self.write(cr, uid, ids, {'probability': 0.0})
return res
def case_reset(self, cr, uid, ids, context=None):
@ -452,7 +453,7 @@ class hr_applicant(base_stage, osv.Model):
def set_priority(self, cr, uid, ids, priority, *args):
"""Set applicant priority
"""
return self.write(cr, uid, ids, {'priority' : priority})
return self.write(cr, uid, ids, {'priority': priority})
def set_high_priority(self, cr, uid, ids, *args):
"""Set applicant priority to high
@ -475,7 +476,7 @@ class hr_applicant(base_stage, osv.Model):
return self.message_post(cr, uid, ids, body=_("Stage changed to <b>%s</b>.") % (stage_name), context=context)
def case_get_note_msg_prefix(self, cr, uid, id, context=None):
return 'Applicant'
return 'Applicant'
def case_open_send_note(self, cr, uid, ids, context=None):
message = _("Applicant has been set <b>in progress</b>.")

View File

@ -2,7 +2,7 @@
<openerp>
<data>
<!-- Top menu item -->
<menuitem name="Tools" id="base.menu_tools" sequence="160"/>
<menuitem name="Tools" id="base.menu_tools" sequence="120"/>
<!-- Idea Categories Search View-->
<record model="ir.ui.view" id="view_idea_category_search">
<field name="name">idea.category.search</field>

View File

@ -6,7 +6,7 @@
<menuitem name="Knowledge"
id="knowledge.menu_document"
groups="base.group_system,base.group_document_user"
sequence="130"/>
sequence="116"/>
<menuitem name="Configuration" id="knowledge.menu_document_configuration"
parent="knowledge.menu_document" sequence="50"/>

View File

@ -1,8 +1,8 @@
<?xml version="1.0"?>
<openerp>
<data>
<!--Menu and Title-->
<menuitem id='menu_lunch' name='Lunch' sequence="300"/>
<!-- Top menu item -->
<menuitem id='menu_lunch' name='Lunch' sequence="100"/>
<menuitem name="Lunch" parent="menu_lunch" id="menu_lunch_title" sequence="50" />
<menuitem name="Administrate Orders" parent="menu_lunch" id="menu_lunch_admin" sequence="51" groups="group_lunch_manager"/>
<menuitem name="Administrate Cash Moves" parent="menu_lunch" id="menu_lunch_cash" sequence="52" groups="group_lunch_manager"/>

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