diff --git a/README.md b/README.md index d76976405b3..d5570e7a028 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[](http://runbot.odoo.com/runbot) +[](http://runbot.odoo.com/runbot) Odoo ---- diff --git a/addons/account/account.py b/addons/account/account.py index 1aa3d490f15..ac70559fe7d 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -669,7 +669,7 @@ class account_account(osv.osv): # For legal reason (forbiden to modify journal entries which belongs to a closed fy or period), Forbid to modify # the code of an account if journal entries have been already posted on this account. This cannot be simply - # 'configurable' since it can lead to a lack of confidence in OpenERP and this is what we want to change. + # 'configurable' since it can lead to a lack of confidence in Odoo and this is what we want to change. def _check_allow_code_change(self, cr, uid, ids, context=None): line_obj = self.pool.get('account.move.line') for account in self.browse(cr, uid, ids, context=context): @@ -2488,7 +2488,7 @@ class account_account_template(osv.osv): ('other','Regular'), ('closed','Closed'), ], 'Internal Type', required=True,help="This type is used to differentiate types with "\ - "special effects in OpenERP: view can not have entries, consolidation are accounts that "\ + "special effects in Odoo: view can not have entries, consolidation are accounts that "\ "can have children accounts for multi-company consolidations, payable/receivable are for "\ "partners accounts (for debit/credit computations), closed for depreciated accounts."), 'user_type': fields.many2one('account.account.type', 'Account Type', required=True, diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index 65dae8a2cc1..4d9c3f3efbd 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -326,16 +326,26 @@ class account_bank_statement(osv.osv): or (not st.journal_id.default_debit_account_id): raise osv.except_osv(_('Configuration Error!'), _('Please verify that an account is defined in the journal.')) for line in st.move_line_ids: - if line.state <> 'valid': + if line.state != 'valid': raise osv.except_osv(_('Error!'), _('The account entries lines are not in valid state.')) move_ids = [] for st_line in st.line_ids: if not st_line.amount: continue - if not st_line.journal_entry_id.id: + if st_line.account_id and not st_line.journal_entry_id.id: + #make an account move as before + vals = { + 'debit': st_line.amount < 0 and -st_line.amount or 0.0, + 'credit': st_line.amount > 0 and st_line.amount or 0.0, + 'account_id': st_line.account_id.id, + 'name': st_line.name + } + self.pool.get('account.bank.statement.line').process_reconciliation(cr, uid, st_line.id, [vals], context=context) + elif not st_line.journal_entry_id.id: raise osv.except_osv(_('Error!'), _('All the account entries lines must be processed in order to close the statement.')) move_ids.append(st_line.journal_entry_id.id) - self.pool.get('account.move').post(cr, uid, move_ids, context=context) + if move_ids: + self.pool.get('account.move').post(cr, uid, move_ids, context=context) self.message_post(cr, uid, [st.id], body=_('Statement %s confirmed, journal items were created.') % (st.name,), context=context) self.link_bank_to_partner(cr, uid, ids, context=context) return self.write(cr, uid, ids, {'state': 'confirm'}, context=context) @@ -728,7 +738,12 @@ class account_bank_statement_line(osv.osv): move_id = am_obj.create(cr, uid, move_vals, context=context) # Create the move line for the statement line - amount = currency_obj.compute(cr, uid, st_line.statement_id.currency.id, company_currency.id, st_line.amount, context=context) + if st_line.statement_id.currency.id != company_currency.id: + ctx = context.copy() + ctx['date'] = st_line.date + amount = currency_obj.compute(cr, uid, st_line.statement_id.currency.id, company_currency.id, st_line.amount_currency, context=ctx) + else: + amount = st_line.amount bank_st_move_vals = bs_obj._prepare_bank_move_line(cr, uid, st_line, move_id, amount, company_currency.id, context=context) aml_obj.create(cr, uid, bank_st_move_vals, context=context) # Complete the dicts @@ -805,18 +820,19 @@ class account_bank_statement_line(osv.osv): _description = "Bank Statement Line" _inherit = ['ir.needaction_mixin'] _columns = { - 'name': fields.char('Description', required=True, copy=False), - 'date': fields.date('Date', required=True, copy=False), + 'name': fields.char('Description', required=True), + 'date': fields.date('Date', required=True), 'amount': fields.float('Amount', digits_compute=dp.get_precision('Account')), 'partner_id': fields.many2one('res.partner', 'Partner'), 'bank_account_id': fields.many2one('res.partner.bank','Bank Account'), + 'account_id': fields.many2one('account.account', 'Account', help="This technical field can be used at the statement line creation/import time in order to avoid the reconciliation process on it later on. The statement line will simply create a counterpart on this account"), 'statement_id': fields.many2one('account.bank.statement', 'Statement', select=True, required=True, ondelete='cascade'), 'journal_id': fields.related('statement_id', 'journal_id', type='many2one', relation='account.journal', string='Journal', store=True, readonly=True), 'ref': fields.char('Structured Communication'), 'note': fields.text('Notes'), 'sequence': fields.integer('Sequence', select=True, help="Gives the sequence order when displaying a list of bank statement lines."), 'company_id': fields.related('statement_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True), - 'journal_entry_id': fields.many2one('account.move', 'Journal Entry'), + 'journal_entry_id': fields.many2one('account.move', 'Journal Entry', copy=False), 'amount_currency': fields.float('Amount Currency', help="The amount expressed in an optional other currency if it is a multi-currency entry.", digits_compute=dp.get_precision('Account')), 'currency_id': fields.many2one('res.currency', 'Currency', help="The optional other currency if it is a multi-currency entry."), } diff --git a/addons/account/account_bank_view.xml b/addons/account/account_bank_view.xml index ef793a1bef5..426309e0c34 100644 --- a/addons/account/account_bank_view.xml +++ b/addons/account/account_bank_view.xml @@ -47,7 +47,7 @@ Configure your company's bank account and select those that must appear on the report footer.
- If you use the accounting application of OpenERP, journals and + If you use the accounting application of Odoo, journals and accounts will be created automatically based on these data.
diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index f9e9ff2813d..f4b3ac26819 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -1005,15 +1005,18 @@ class account_invoice(models.Model): #TODO: implement messages system return True - @api.one - def _compute_display_name(self): + @api.multi + def name_get(self): TYPES = { 'out_invoice': _('Invoice'), 'in_invoice': _('Supplier Invoice'), 'out_refund': _('Refund'), 'in_refund': _('Supplier Refund'), } - self.display_name = "%s %s" % (self.number or TYPES[self.type], self.name or '') + result = [] + for inv in self: + result.append((inv.id, "%s %s" % (inv.number or TYPES[inv.type], inv.name or ''))) + return result @api.model def name_search(self, name, args=None, operator='ilike', limit=100): @@ -1627,8 +1630,8 @@ class mail_compose_message(models.Model): context.get('default_res_id') and context.get('mark_invoice_as_sent'): invoice = self.env['account.invoice'].browse(context['default_res_id']) invoice = invoice.with_context(mail_post_autofollow=True) - self.write({'sent': True}) - self.message_post(body=_("Invoice sent")) + invoice.write({'sent': True}) + invoice.message_post(body=_("Invoice sent")) return super(mail_compose_message, self).send_mail() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index 64159dab18d..93dd7bf2e41 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -61,7 +61,7 @@Click to create a customer invoice.
- OpenERP's electronic invoicing allows to ease and fasten the + Odoo's electronic invoicing allows to ease and fasten the collection of customer payments. Your customer receives the invoice by email and he can pay online and/or import it in his own system. @@ -564,7 +564,7 @@ Click to record a new supplier invoice.
You can control the invoice from your supplier according to - what you purchased or received. OpenERP can also generate + what you purchased or received. Odoo can also generate draft invoices automatically from purchase orders or receipts.
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 776111613ec..c513261a9cf 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -583,7 +583,7 @@ class account_move_line(osv.osv): def _check_no_view(self, cr, uid, ids, context=None): lines = self.browse(cr, uid, ids, context=context) for l in lines: - if l.account_id.type == 'view': + if l.account_id.type in ('view', 'consolidation'): return False return True @@ -635,7 +635,7 @@ class account_move_line(osv.osv): return True _constraints = [ - (_check_no_view, 'You cannot create journal items on an account of type view.', ['account_id']), + (_check_no_view, 'You cannot create journal items on an account of type view or consolidation.', ['account_id']), (_check_no_closed, 'You cannot create journal items on closed account.', ['account_id']), (_check_company_id, 'Account and Period must belong to the same company.', ['company_id']), (_check_date, 'The date of your Journal Entry is not in the defined period! You should change the date or remove this constraint from the journal.', ['date']), @@ -1038,6 +1038,8 @@ class account_move_line(osv.osv): all_moves = list(set(all_moves) - set(move_ids)) if unlink_ids: if opening_reconciliation: + raise osv.except_osv(_('Warning!'), + _('Opening Entries have already been generated. Please run "Cancel Closing Entries" wizard to cancel those entries and then run this wizard.')) obj_move_rec.write(cr, uid, unlink_ids, {'opening_reconciliation': False}) obj_move_rec.unlink(cr, uid, unlink_ids) if len(all_moves) >= 2: diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index d11fa30726c..47f21266c18 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -650,7 +650,7 @@ occurring over a given period of time on a bank account. You should receive this periodicaly from your bank.- OpenERP allows you to reconcile a statement line directly with + Odoo allows you to reconcile a statement line directly with the related sale or puchase invoices.
@@ -920,7 +920,7 @@ Click to define a new tax code.Depending on the country, a tax code is usually a cell to fill - in your legal tax statement. OpenERP allows you to define the + in your legal tax statement. Odoo allows you to define the tax structure and each tax computation will be registered in one or several tax code.
@@ -1269,8 +1269,8 @@ Select the period and the journal you want to fill.This view can be used by accountants in order to quickly record - entries in OpenERP. If you want to record a supplier invoice, - start by recording the line of the expense account. OpenERP + entries in Odoo. If you want to record a supplier invoice, + start by recording the line of the expense account. Odoo will propose to you automatically the Tax related to this account and the counterpart "Account Payable".
@@ -1506,7 +1506,7 @@ A journal entry consists of several journal items, each of which is either a debit or a credit transaction.
- OpenERP automatically creates one journal entry per accounting
+ Odoo automatically creates one journal entry per accounting
document: invoice, refund, supplier payment, bank statements,
etc. So, you should record journal entries manually only/mainly
for miscellaneous operations.
@@ -1925,7 +1925,7 @@
They are usually structured by contracts, projects, products or
- departements. Most of the OpenERP operations (invoices,
+ departements. Most of the Odoo operations (invoices,
timesheets, expenses, etc) generate analytic entries on the
related account.
-By far the most beautiful and full featured accounting software. OpenERP Accounting allows a better way to collaborate with your accountants, your customers and control your suppliers.
+By far the most beautiful and full featured accounting software. Odoo Accounting allows a better way to collaborate with your accountants, your customers and control your suppliers.Activate features on demand, from integrated analytic accounting to budget, assets and multiple companies consolidation.
@@ -29,7 +29,7 @@ Activate features on demand, from integrated analytic accounting to budget, asseRecord transactions in a few clicks and easily manage all financial activities -in one place. OpenERP's user interface is designed with productivity in mind. +in one place. Odoo's user interface is designed with productivity in mind.
-Manage your assets, track expenses, control budgets, multi-level analytic accounting; OpenERP has all the features you need to sustain all your business activities. +Manage your assets, track expenses, control budgets, multi-level analytic accounting; Odoo has all the features you need to sustain all your business activities.
-OpenERP supports multiple currencies, multiple users with different access rights, multiple companies with real time consolidation and unlimited analytic plans. +Odoo supports multiple currencies, multiple users with different access rights, multiple companies with real time consolidation and unlimited analytic plans.
- OpenERP Accounting is a great way to record all business transactions + Odoo Accounting is a great way to record all business transactions right when they happen. Awesome and cost-effective!@@ -178,7 +178,7 @@ OpenERP supports multiple currencies, multiple users with different access right
- We have found accounting module of OpenERP to be user + We have found accounting module of Odoo to be user friendly and highly customizable. It proved to be an accounting gem.diff --git a/addons/account/static/src/js/account_widgets.js b/addons/account/static/src/js/account_widgets.js index 3b04058c33f..c9bdaac7071 100644 --- a/addons/account/static/src/js/account_widgets.js +++ b/addons/account/static/src/js/account_widgets.js @@ -139,7 +139,7 @@ openerp.account = function (instance) { } // Retreive statement infos and reconciliation data from the model - var lines_filter = [['journal_entry_id', '=', false]]; + var lines_filter = [['journal_entry_id', '=', false], ['account_id', '=', false]]; var deferred_promises = []; if (self.statement_id) { diff --git a/addons/account/wizard/account_automatic_reconcile_view.xml b/addons/account/wizard/account_automatic_reconcile_view.xml index 62d985a29d5..22cd3a8b529 100644 --- a/addons/account/wizard/account_automatic_reconcile_view.xml +++ b/addons/account/wizard/account_automatic_reconcile_view.xml @@ -8,7 +8,7 @@
The check payment form allows you to track the payment you do to your suppliers using checks. When you select a supplier, the - payment method and an amount for the payment, OpenERP will + payment method and an amount for the payment, Odoo will propose to reconcile your payment with the open supplier invoices or bills.
diff --git a/addons/account_sequence/account_sequence_installer.py b/addons/account_sequence/account_sequence_installer.py index bcf1e14c20f..af3f5a971bf 100644 --- a/addons/account_sequence/account_sequence_installer.py +++ b/addons/account_sequence/account_sequence_installer.py @@ -31,7 +31,7 @@ class account_sequence_installer(osv.osv_memory): 'suffix': fields.char('Suffix', size=64, help="Suffix value of the record for the sequence"), 'number_next': fields.integer('Next Number', required=True, help="Next number of this sequence"), 'number_increment': fields.integer('Increment Number', required=True, help="The next number of the sequence will be incremented by this number"), - 'padding' : fields.integer('Number padding', required=True, help="OpenERP will automatically adds some '0' on the left of the 'Next Number' to get the required padding size."), + 'padding' : fields.integer('Number padding', required=True, help="Odoo will automatically adds some '0' on the left of the 'Next Number' to get the required padding size."), 'company_id': fields.many2one('res.company', 'Company'), } _defaults = { diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 275e002695e..6341c8b1e10 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -946,6 +946,8 @@ class account_voucher(osv.osv): # refresh to make sure you don't unlink an already removed move voucher.refresh() for line in voucher.move_ids: + # refresh to make sure you don't unreconcile an already unreconciled entry + line.refresh() if line.reconcile_id: move_lines = [move_line.id for move_line in line.reconcile_id.line_id] move_lines.remove(line.id) diff --git a/addons/account_voucher/account_voucher_data.xml b/addons/account_voucher/account_voucher_data.xml index 6329176c6e9..6d141869184 100644 --- a/addons/account_voucher/account_voucher_data.xml +++ b/addons/account_voucher/account_voucher_data.xml @@ -9,7 +9,7 @@You can track customer payments easily and automate follow-ups. You get an overview of the discussion with your customers on each invoice for easier traceability. For advanced accounting features, you should install the "Accounting and Finance" module.
]]>- OpenERP allowed us to automate sending 10.000 invoices per month. + Odoo allowed us to automate sending 10.000 invoices per month.
@@ -124,7 +124,7 @@ material. Define recurrencies to produce recurring invoice automatically.
- We have found invoicing module of OpenERP to be user + We have found invoicing module of Odoo to be user friendly and highly customizable.diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml index aa427bbf91e..dd316ea2600 100644 --- a/addons/account_voucher/voucher_payment_receipt_view.xml +++ b/addons/account_voucher/voucher_payment_receipt_view.xml @@ -270,7 +270,7 @@
Click to create a new supplier payment.
- OpenERP helps you easily track payments you make and the remaining balances you need to pay your suppliers. + Odoo helps you easily track payments you make and the remaining balances you need to pay your suppliers.
@@ -554,7 +554,7 @@ Click to register a new payment.Enter the customer and the payment method and then, either - create manually a payment record or OpenERP will propose to you + create manually a payment record or Odoo will propose to you automatically the reconciliation of this payment with the open invoices or sales receipts.
diff --git a/addons/analytic_user_function/analytic_user_function_view.xml b/addons/analytic_user_function/analytic_user_function_view.xml index 147e96f0be0..51e020b3f81 100644 --- a/addons/analytic_user_function/analytic_user_function_view.xml +++ b/addons/analytic_user_function/analytic_user_function_view.xml @@ -47,7 +47,7 @@ of the default values when invoicing the customer.
- OpenERP will recursively search on parent accounts
+ Odoo will recursively search on parent accounts
to check if specific conditions are defined for a
specific user. This allows to set invoicing
conditions for a group of contracts.
diff --git a/addons/auth_ldap/users_ldap.py b/addons/auth_ldap/users_ldap.py
index 9ddc3d6ed45..70323bb6a0e 100644
--- a/addons/auth_ldap/users_ldap.py
+++ b/addons/auth_ldap/users_ldap.py
@@ -190,7 +190,7 @@ class CompanyLDAP(osv.osv):
if res[1]:
user_id = res[0]
elif conf['create_user']:
- _logger.debug("Creating new OpenERP user \"%s\" from LDAP" % login)
+ _logger.debug("Creating new Odoo user \"%s\" from LDAP" % login)
user_obj = self.pool['res.users']
values = self.map_ldap_attributes(cr, uid, conf, login, ldap_entry)
if conf['user']:
diff --git a/addons/auth_oauth/controllers/main.py b/addons/auth_oauth/controllers/main.py
index 1a166c39cde..e48aeebd8a5 100644
--- a/addons/auth_oauth/controllers/main.py
+++ b/addons/auth_oauth/controllers/main.py
@@ -173,7 +173,7 @@ class OAuthController(http.Controller):
@http.route('/auth_oauth/oea', type='http', auth='none')
def oea(self, **kw):
- """login user via OpenERP Account provider"""
+ """login user via Odoo Account provider"""
dbname = kw.pop('db', None)
if not dbname:
dbname = db_monodb()
diff --git a/addons/auth_signup/auth_signup_data.xml b/addons/auth_signup/auth_signup_data.xml
index 2789fcd8315..096d2327393 100644
--- a/addons/auth_signup/auth_signup_data.xml
+++ b/addons/auth_signup/auth_signup_data.xml
@@ -28,7 +28,7 @@
A password reset was requested for the Odoo account linked to this email.
You may change your password by following this link.
@@ -37,18 +37,18 @@- You have been invited to connect to "${object.company_id.name}" in order to get access to your documents in OpenERP. + You have been invited to connect to "${object.company_id.name}" in order to get access to your documents in Odoo.
To accept the invitation, click on the following link:
diff --git a/addons/base_action_rule/test_models.py b/addons/base_action_rule/test_models.py
index 2a88def6f75..b931b0fc3be 100644
--- a/addons/base_action_rule/test_models.py
+++ b/addons/base_action_rule/test_models.py
@@ -1,4 +1,5 @@
from openerp.osv import fields, osv
+from openerp import api
AVAILABLE_STATES = [
('draft', 'New'),
@@ -25,6 +26,7 @@ class lead_test(osv.Model):
'active' : True,
}
+ @api.cr_uid_ids_context
def message_post(self, cr, uid, thread_id, body='', subject=None, type='notification', subtype=None, parent_id=False, attachments=None, context=None, **kwargs):
pass
diff --git a/addons/base_gengo/controller/gengo_callback.py b/addons/base_gengo/controller/gengo_callback.py
index 44fa9b9390a..328be0ae357 100644
--- a/addons/base_gengo/controller/gengo_callback.py
+++ b/addons/base_gengo/controller/gengo_callback.py
@@ -18,17 +18,18 @@ class website_gengo(http.Controller):
@http.route('/website/gengo_callback', type='http', auth='none')
def gengo_callback(self, **post):
+ print "IN website/gengo_callback"
cr, uid, context = request.cr, openerp.SUPERUSER_ID, request.context
translation_pool = request.registry['ir.translation']
if post and post.get('job') and post.get('pgk'):
if post.get('pgk') != self.get_gengo_key(cr):
- return Response("Bad authentication - 403/412", status=412)
+ return Response("Bad authentication", status=104)
job = json.loads(post['job'], 'utf-8')
tid = job.get('custom_data', False)
if (job.get('status') == 'approved') and tid:
term = translation_pool.browse(cr, uid, int(tid), context=context)
if term.src != job.get('body_src'):
- return Response("Text Altered - Not saved", status=100)
+ return Response("Text Altered - Not saved", status=418)
domain = [
'|',
('id', "=", int(tid)),
@@ -49,5 +50,5 @@ class website_gengo(http.Controller):
translation_pool.write(cr, uid, all_ir_tanslations, vals, context=context)
return Response("OK", status=200)
else:
- return Response("No terms found", status=104)
- return Response("Not saved", status=100)
+ return Response("No terms found", status=412)
+ return Response("Not saved", status=418)
diff --git a/addons/base_gengo/gengo_sync_schedular_data.xml b/addons/base_gengo/gengo_sync_schedular_data.xml
index e916489e5f7..0af74d8ccf1 100644
--- a/addons/base_gengo/gengo_sync_schedular_data.xml
+++ b/addons/base_gengo/gengo_sync_schedular_data.xml
@@ -8,7 +8,7 @@
If the file contains - the column names, OpenERP can try auto-detecting the + the column names, Odoo can try auto-detecting the field corresponding to the column. This makes imports simpler especially when the file has many columns.
@@ -85,7 +85,7 @@ different records, you should use the unique identifier from the original application and map it to the ID - column in OpenERP. When you + column in Odoo. When you import an other record that links to the first one, use XXX/ID to the original unique identifier. @@ -108,7 +108,7 @@ settings, you can modify the File Format Options (displayed under the Browse CSV file bar after you select your file).Note that if your CSV file - has a tabulation as separator, OpenERP will not + has a tabulation as separator, Odoo will not detect the separations. You will need to change the file format options in your spreadsheet application. See the following question.
@@ -141,15 +141,15 @@Some fields define a relationship with another object. For example, the country of a contact is a link to a record of the 'Country' object. When you - want to import such fields, OpenERP will have to + want to import such fields, Odoo will have to recreate links between the different records. - To help you import such fields, OpenERP provides 3 + To help you import such fields, Odoo provides 3 mechanisms. You must use one and only one mechanism per field you want to import.
For example, to - reference the country of a contact, OpenERP proposes + reference the country of a contact, Odoo proposes you 3 different fields to import:
This feature - allows you to use the Import/Export tool of OpenERP to + allows you to use the Import/Export tool of Odoo to modify a batch of records in your favorite spreadsheet application.
@@ -269,9 +269,9 @@ specific field?If you do not set all fields in your CSV file, - OpenERP will assign the default value for every non + Odoo will assign the default value for every non defined fields. But if you - set fields with empty values in your CSV file, OpenERP + set fields with empty values in your CSV file, Odoo will set the EMPTY value in the field, instead of assigning the default value.
If you need to import data from different tables, you will have to recreate relations between records @@ -288,7 +288,7 @@ companies and persons, you will have to recreate the link between each person and the company they work for).
To manage relations between tables, - you can use the "External ID" facilities of OpenERP. + you can use the "External ID" facilities of Odoo. The "External ID" of a record is the unique identifier of this record in another application. This "External ID" must be unique accoss all the records of all @@ -337,7 +337,7 @@ and company_1 who shared the same ID 1 in the orignial database).
The two files produced are ready to be imported in
- OpenERP without any modifications. After having
+ Odoo without any modifications. After having
imported these two CSV files, you will have 4 contacts
and 3 companies. (the firsts two contacts are linked
to the first company). You must first import the
diff --git a/addons/base_import/tests/test_cases.py b/addons/base_import/tests/test_cases.py
index ac5a4440523..bad79bc7cdc 100644
--- a/addons/base_import/tests/test_cases.py
+++ b/addons/base_import/tests/test_cases.py
@@ -11,18 +11,10 @@ ID_FIELD = {
'required': False,
'fields': [],
}
-DISPLAY_NAME_FIELD = {
- 'id': 'display_name',
- 'name': 'display_name',
- 'string': "Name",
- 'required': False,
- 'fields': [],
-}
def make_field(name='value', string='unknown', required=False, fields=[]):
return [
ID_FIELD,
- DISPLAY_NAME_FIELD,
{'id': name, 'name': name, 'string': string, 'required': required, 'fields': fields},
]
@@ -50,7 +42,7 @@ class test_basic_fields(BaseImportCase):
def test_readonly(self):
""" Readonly fields should be filtered out"""
- self.assertEqualFields(self.get_fields('char.readonly'), [ID_FIELD, DISPLAY_NAME_FIELD])
+ self.assertEqualFields(self.get_fields('char.readonly'), [ID_FIELD])
def test_readonly_states(self):
""" Readonly fields with states should not be filtered out"""
@@ -59,12 +51,12 @@ class test_basic_fields(BaseImportCase):
def test_readonly_states_noreadonly(self):
""" Readonly fields with states having nothing to do with
readonly should still be filtered out"""
- self.assertEqualFields(self.get_fields('char.noreadonly'), [ID_FIELD, DISPLAY_NAME_FIELD])
+ self.assertEqualFields(self.get_fields('char.noreadonly'), [ID_FIELD])
def test_readonly_states_stillreadonly(self):
""" Readonly fields with readonly states leaving them readonly
always... filtered out"""
- self.assertEqualFields(self.get_fields('char.stillreadonly'), [ID_FIELD, DISPLAY_NAME_FIELD])
+ self.assertEqualFields(self.get_fields('char.stillreadonly'), [ID_FIELD])
def test_m2o(self):
""" M2O fields should allow import of themselves (name_get),
@@ -92,7 +84,6 @@ class test_o2m(BaseImportCase):
def test_shallow(self):
self.assertEqualFields(self.get_fields('o2m'), make_field(fields=[
ID_FIELD,
- DISPLAY_NAME_FIELD,
# FIXME: should reverse field be ignored?
{'id': 'parent_id', 'name': 'parent_id', 'string': 'unknown', 'required': False, 'fields': [
{'id': 'parent_id', 'name': 'id', 'string': 'External ID', 'required': False, 'fields': []},
@@ -250,7 +241,6 @@ class test_preview(TransactionCase):
# Order depends on iteration order of fields_get
self.assertItemsEqual(result['fields'], [
ID_FIELD,
- DISPLAY_NAME_FIELD,
{'id': 'name', 'name': 'name', 'string': 'Name', 'required':False, 'fields': []},
{'id': 'somevalue', 'name': 'somevalue', 'string': 'Some Value', 'required':True, 'fields': []},
{'id': 'othervalue', 'name': 'othervalue', 'string': 'Other Variable', 'required':False, 'fields': []},
diff --git a/addons/base_report_designer/base_report_designer_installer.xml b/addons/base_report_designer/base_report_designer_installer.xml
index 74cfc63a6ce..2df241478cf 100644
--- a/addons/base_report_designer/base_report_designer_installer.xml
+++ b/addons/base_report_designer/base_report_designer_installer.xml
@@ -2,16 +2,16 @@
- OpenERP allows to automatically create leads (or others documents)
- from incoming emails. You can automatically synchronize emails with OpenERP
+ Odoo allows to automatically create leads (or others documents)
+ from incoming emails. You can automatically synchronize emails with Odoo
using regular POP/IMAP accounts, using a direct email integration script for your
- email server, or by manually pushing emails to OpenERP using specific
+ email server, or by manually pushing emails to Odoo using specific
plugins for your preferred email application.
Click to add a contact in your address book.
- OpenERP helps you easily track all activities related to + Odoo helps you easily track all activities related to a customer; discussions, history of business opportunities, documents, etc.
diff --git a/addons/crm/base_partner_merge_view.xml b/addons/crm/base_partner_merge_view.xml index 27455223b4d..8bda9607e0a 100644 --- a/addons/crm/base_partner_merge_view.xml +++ b/addons/crm/base_partner_merge_view.xml @@ -65,7 +65,7 @@Select the list of fields used to search for duplicated records. If you select several fields, - OpenERP will propose you to merge only those having + Odoo will propose you to merge only those having all these fields in common. (not one of the fields).
- OpenERP helps you keep track of your sales pipeline to follow + Odoo helps you keep track of your sales pipeline to follow up potential sales and better forecast your future revenues.
You will be able to plan meetings and phone calls from
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
index 3f10dcf2099..a567be10619 100644
--- a/addons/crm/crm_lead_view.xml
+++ b/addons/crm/crm_lead_view.xml
@@ -349,6 +349,9 @@
Click to log the summary of a phone call.
- OpenERP allows you to log inbound calls on the fly to track the + Odoo allows you to log inbound calls on the fly to track the history of the communication with a customer or to inform another team member.
@@ -112,7 +112,7 @@
Click to schedule a call
- OpenERP allows you to easily define all the calls to be done + Odoo allows you to easily define all the calls to be done by your sales team and follow up based on their summary.
You can use the import feature to massively import a new list of
diff --git a/addons/crm/crm_view.xml b/addons/crm/crm_view.xml
index b0e64042af7..3b76e458800 100644
--- a/addons/crm/crm_view.xml
+++ b/addons/crm/crm_view.xml
@@ -23,9 +23,6 @@
-
-
- OpenERP helps you keep track of your sales pipeline to follow
+ Odoo helps you keep track of your sales pipeline to follow
up potential sales and better forecast your future revenues.
You will be able to plan meetings and phone calls from
diff --git a/addons/crm/static/description/index.html b/addons/crm/static/description/index.html
index 799dee38cf0..7a749cb14f5 100644
--- a/addons/crm/static/description/index.html
+++ b/addons/crm/static/description/index.html
@@ -101,7 +101,7 @@ Follow opportunities that interest you to get notified upon specific events: dea
Work with the email applications you already use every day. Whether your company uses Microsoft Outlook or Gmail, no one needs to change the way they work, so everyone stays productive.
-Route, sort and filter incoming emails automatically. OpenERP CRM handles incoming emails and route them to the right opportunities or sales team. New leads are created on the fly and interested salespersons are notified automatically.
+Route, sort and filter incoming emails automatically. Odoo CRM handles incoming emails and route them to the right opportunities or sales team. New leads are created on the fly and interested salespersons are notified automatically.
- With OpenERP CRM I keep all the information about leads and customers + With Odoo CRM I keep all the information about leads and customers in a single place, and share it with my colleagues. It's great and effective.@@ -222,7 +222,7 @@ Customize your sales cycle by configuring sales stages that perfectly fit your s
- I am surprised by how good OpenERP CRM is. Awesome product. + I am surprised by how good Odoo CRM is. Awesome product.
diff --git a/addons/crm_claim/report/crm_claim_report.py b/addons/crm_claim/report/crm_claim_report.py
index 4323b7024d3..2855cc427a0 100644
--- a/addons/crm_claim/report/crm_claim_report.py
+++ b/addons/crm_claim/report/crm_claim_report.py
@@ -37,19 +37,12 @@ class crm_claim_report(osv.osv):
_description = "CRM Claim Report"
_columns = {
- 'name': fields.char('Year', required=False, readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
'nbr': fields.integer('# of Cases', readonly=True),
- 'month':fields.selection([('01', 'January'), ('02', 'February'), \
- ('03', 'March'), ('04', 'April'),\
- ('05', 'May'), ('06', 'June'), \
- ('07', 'July'), ('08', 'August'),\
- ('09', 'September'), ('10', 'October'),\
- ('11', 'November'), ('12', 'December')], 'Month', readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
'create_date': fields.datetime('Create Date', readonly=True, select=True),
- 'day': fields.char('Day', size=128, readonly=True),
+ 'claim_date': fields.datetime('Claim Date', readonly=True),
'delay_close': fields.float('Delay to close', digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
'stage_id': fields.many2one ('crm.case.stage', 'Stage', readonly=True,domain="[('section_ids','=',section_id)]"),
'categ_id': fields.many2one('crm.case.categ', 'Category',\
@@ -76,11 +69,9 @@ class crm_claim_report(osv.osv):
create or replace view crm_claim_report as (
select
min(c.id) as id,
- to_char(c.date, 'YYYY') as name,
- to_char(c.date, 'MM') as month,
- to_char(c.date, 'YYYY-MM-DD') as day,
- to_char(c.date_closed, 'YYYY-MM-DD') as date_closed,
- to_char(c.date_deadline, 'YYYY-MM-DD') as date_deadline,
+ c.date as claim_date,
+ date(c.date_closed) as date_closed,
+ c.date_deadline as date_deadline,
c.user_id,
c.stage_id,
c.section_id,
@@ -90,13 +81,13 @@ class crm_claim_report(osv.osv):
count(*) as nbr,
c.priority as priority,
c.type_action as type_action,
- date_trunc('day',c.create_date) as create_date,
+ c.create_date as create_date,
avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close,
(SELECT count(id) FROM mail_message WHERE model='crm.claim' AND res_id=c.id) AS email,
extract('epoch' from (c.date_deadline - c.date_closed))/(3600*24) as delay_expected
from
crm_claim c
- group by to_char(c.date, 'YYYY'), to_char(c.date, 'MM'),to_char(c.date, 'YYYY-MM-DD'),\
+ group by c.date,\
c.user_id,c.section_id, c.stage_id,\
c.categ_id,c.partner_id,c.company_id,c.create_date,
c.priority,c.type_action,c.date_deadline,c.date_closed,c.id
diff --git a/addons/crm_claim/report/crm_claim_report_view.xml b/addons/crm_claim/report/crm_claim_report_view.xml
index bc9293e7f91..cf365d06df6 100644
--- a/addons/crm_claim/report/crm_claim_report_view.xml
+++ b/addons/crm_claim/report/crm_claim_report_view.xml
@@ -53,9 +53,7 @@
Helpdesk and Support allow you to track your interventions.
- Use the OpenERP Issues system to manage your support
+ Use the Odoo 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.
diff --git a/addons/crm_helpdesk/report/crm_helpdesk_report.py b/addons/crm_helpdesk/report/crm_helpdesk_report.py
index f7180ef0908..590cadb0fed 100644
--- a/addons/crm_helpdesk/report/crm_helpdesk_report.py
+++ b/addons/crm_helpdesk/report/crm_helpdesk_report.py
@@ -39,17 +39,11 @@ class crm_helpdesk_report(osv.osv):
_auto = False
_columns = {
- 'name': fields.char('Year', required=False, readonly=True),
+ 'date': fields.datetime('Date', readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
'nbr': fields.integer('# of Cases', readonly=True),
'state': fields.selection(AVAILABLE_STATES, 'Status', readonly=True),
- 'month':fields.selection([('01', 'January'), ('02', 'February'), \
- ('03', 'March'), ('04', 'April'),\
- ('05', 'May'), ('06', 'June'), \
- ('07', 'July'), ('08', 'August'),\
- ('09', 'September'), ('10', 'October'),\
- ('11', 'November'), ('12', 'December')], 'Month', readonly=True),
'delay_close': fields.float('Delay to Close',digits=(16,2),readonly=True, group_operator="avg"),
'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
@@ -64,7 +58,6 @@ class crm_helpdesk_report(osv.osv):
'create_date': fields.date('Creation Date' , readonly=True, select=True),
'date_closed': fields.date('Close Date', readonly=True, select=True),
'delay_expected': fields.float('Overpassed Deadline',digits=(16,2),readonly=True, group_operator="avg"),
- 'day': fields.char('Day', size=128, readonly=True),
'email': fields.integer('# Emails', size=128, readonly=True),
}
@@ -80,11 +73,9 @@ class crm_helpdesk_report(osv.osv):
create or replace view crm_helpdesk_report as (
select
min(c.id) as id,
- to_char(c.date, 'YYYY') as name,
- to_char(c.date, 'MM') as month,
- to_char(c.date, 'YYYY-MM-DD') as day,
- to_char(c.create_date, 'YYYY-MM-DD') as create_date,
- to_char(c.date_closed, 'YYYY-mm-dd') as date_closed,
+ c.date as date,
+ date(c.create_date) as create_date,
+ date(c.date_closed) as date_closed,
c.state,
c.user_id,
c.section_id,
@@ -102,7 +93,7 @@ class crm_helpdesk_report(osv.osv):
from
crm_helpdesk c
where c.active = 'true'
- group by to_char(c.date, 'YYYY'), to_char(c.date, 'MM'),to_char(c.date, 'YYYY-MM-DD'),\
+ group by c.date,\
c.state, c.user_id,c.section_id,c.priority,\
c.partner_id,c.company_id,c.date_deadline,c.create_date,c.date,c.date_closed,\
c.categ_id,c.channel_id,c.planned_cost,c.id
diff --git a/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml b/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml
index adc788ad505..e37d9970c05 100644
--- a/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml
+++ b/addons/crm_helpdesk/report/crm_helpdesk_report_view.xml
@@ -49,9 +49,7 @@
OpenERP's Document Management System supports mapping virtual folders with documents. The virtual folder of a document can be used to manage the files attached to the document, or to print and download any report. This tool will create directories automatically according to modules installed. Odoo's Document Management System supports mapping virtual folders with documents. The virtual folder of a document can be used to manage the files attached to the document, or to print and download any report. This tool will create directories automatically according to modules installed. When executing this wizard, it will configure your directories automatically according to modules installed. Program: Conferences, workshops and trainings will be organized in 6 rooms:
Click to add a new event.
- OpenERP helps you schedule and efficiently organize your events:
+ Odoo helps you schedule and efficiently organize your events:
track subscriptions and participations, automate the confirmation emails,
sell tickets, etc.
- OpenERP helps you managing the costs for your different vehicles
+ Odoo helps you managing the costs for your different vehicles
Costs are generally created from services and contract and appears here.
- Thanks to the different filters, OpenERP can only print the effective
+ Thanks to the different filters, Odoo can only print the effective
costs, sort them by type and by vehicle.
- OpenERP helps you managing the costs for your different vehicles
+ Odoo helps you managing the costs for your different vehicles
Costs are generally created from services and contract and appears here.
- Thanks to the different filters, OpenERP can only print the effective
+ Thanks to the different filters, Odoo can only print the effective
costs, sort them by type and by vehicle.
-
diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml
index 73cbb7b0d1b..9433c0018e9 100644
--- a/addons/event/event_view.xml
+++ b/addons/event/event_view.xml
@@ -304,7 +304,7 @@
- OpenERP will warn you when services or contract have to be + Odoo will warn you when services or contract have to be renewed.
@@ -558,7 +558,7 @@ Click to create a new contract.Manage all your contracts (leasing, insurances, etc.) with - their related services, costs. OpenERP will automatically warn + their related services, costs. Odoo will automatically warn you when some contracts have to be renewed.
Each contract (e.g.: leasing) may include several services @@ -847,7 +847,7 @@
Click to create a new service entry.
- OpenERP helps you keeping track of all the services done + Odoo helps you keeping track of all the services done on your vehicle. Services can be of many type: occasional repair, fixed maintenance, etc.
@@ -919,13 +919,12 @@Click to create a new cost.
- OpenERP helps you managing the costs for your different + Odoo helps you managing the costs for your different vehicles. Costs are created automatically from services, contracts (fixed or recurring) and fuel logs.
diff --git a/addons/gamification/views/badge.xml b/addons/gamification/views/badge.xml index bdcb48240f8..302ad66caf0 100644 --- a/addons/gamification/views/badge.xml +++ b/addons/gamification/views/badge.xml @@ -40,7 +40,6 @@
- You can ask to have a alarm of type 'notification' in your Open ERP.
- You will have a notification in you OpenERP which ever the page you are.
+ You can ask to have a alarm of type 'notification' in your Odoo.
+ You will have a notification in you Odoo which ever the page you are.
- With the plugin Google_calendar, you can synchronize your OpenERP calendar with Google Calendar. + With the plugin Google_calendar, you can synchronize your Odoo calendar with Google Calendar.
To create a new filter:
- - Go to the OpenERP document you want to filter. For instance, go to Opportunities and search on Sales Department.
+ - Go to the Odoo document you want to filter. For instance, go to Opportunities and search on Sales Department.
- In this "Search" view, select the option "Save Current Filter", enter the name (Ex: Sales Department)
- If you select "Share with all users", link of google document in "More" options will appear for all users in opportunities of Sales Department.
- If you don't select "Share with all users", link of google document in "More" options will not appear for other users in opportunities of Sales Department.
@@ -45,7 +45,7 @@
The name of the attached document can use fixed or variable data. To distinguish between documents in Google Drive, use fixed words and fields. For instance, in the example above, if you wrote Agrolait_%%(name)s_Sales - in the Google Drive name field, the document in your Google Drive and in OpenERP attachment will be named + in the Google Drive name field, the document in your Google Drive and in Odoo attachment will be named 'Agrolait_SO0001_Sales'.
- Link your own google drive templates to any record of OpenERP. If you have really specific documents you want your collaborator fill in, e.g. Use a spreadsheet to control the quality of your product or review the delivery checklist for each order in a foreign country, ... Its very easy to manage them, link them to OpenERP and use them to collaborate with your employees. + Link your own google drive templates to any record of Odoo. If you have really specific documents you want your collaborator fill in, e.g. Use a spreadsheet to control the quality of your product or review the delivery checklist for each order in a foreign country, ... Its very easy to manage them, link them to Odoo and use them to collaborate with your employees.
diff --git a/addons/hr/hr.py b/addons/hr/hr.py index 0d287fcc645..5e081fab3bf 100644 --- a/addons/hr/hr.py +++ b/addons/hr/hr.py @@ -270,7 +270,7 @@ class hr_employee(osv.osv): partner_ids = list(set(u.partner_id.id for u in res_users.browse(cr, SUPERUSER_ID, user_ids, context=context))) self.message_post( cr, uid, [employee_id], - body=_('Welcome to %s! Please help him/her take the first steps with OpenERP!') % (employee.name), + body=_('Welcome to %s! Please help him/her take the first steps with Odoo!') % (employee.name), partner_ids=partner_ids, subtype='mail.mt_comment', context=context ) diff --git a/addons/hr/hr_data.xml b/addons/hr/hr_data.xml index c9b784c485d..382cc4dbdc4 100644 --- a/addons/hr/hr_data.xml +++ b/addons/hr/hr_data.xml @@ -8,7 +8,7 @@More HR features are available via extra applications: Recruitment Process (manage job positions and recruitment), Timesheet Validation (record timesheets and attendance), Leave Management (keep track of employee leaves), Expense Management (manage employee expenses), Employee Appraisals (organize employee surveys, where employees evaluate their subordinates or their manager).
]]>Click to add a new employee.
- With just a quick glance on the OpenERP employee screen, you + With just a quick glance on the Odoo employee screen, you can easily find all the information you need for each person; contact data, job position, availability, etc.
@@ -480,7 +480,7 @@Click to create a department.
- OpenERP's department structure is used to manage all documents + Odoo's department structure is used to manage all documents related to employees by departments: expenses, timesheets, leaves and holidays, recruitments, etc.
diff --git a/addons/hr/res_users.py b/addons/hr/res_users.py index 78c0b841255..e6f2ca36fe5 100644 --- a/addons/hr/res_users.py +++ b/addons/hr/res_users.py @@ -1,5 +1,5 @@ +from openerp import api from openerp.osv import fields, osv -from openerp.tools.translate import _ class res_users(osv.Model): @@ -52,6 +52,7 @@ class res_users(osv.Model): thread_id = thread_id[0] return self.pool.get('hr.employee').search(cr, uid, [('user_id', '=', thread_id)], context=context) + @api.cr_uid_ids_context def message_post(self, cr, uid, thread_id, context=None, **kwargs): """ Redirect the posting of message on res.users to the related employee. This is done because when giving the context of Chatter on the diff --git a/addons/hr/static/description/index.html b/addons/hr/static/description/index.html index 55e54aa92fb..08ebd101d69 100644 --- a/addons/hr/static/description/index.html +++ b/addons/hr/static/description/index.html @@ -115,7 +115,7 @@ Keep track of the vacation days accrued by each employee. Employees enter their-Get rid of the paper work and follow employee's expenses directly in OpenERP. Don't loose time or money by controlling the full flow: expense validation, reimbursement of employees, posting in the accounting and re-invoicing to customers. +Get rid of the paper work and follow employee's expenses directly in Odoo. Don't loose time or money by controlling the full flow: expense validation, reimbursement of employees, posting in the accounting and re-invoicing to customers.
-Set-up appraisals plans and/or surveys for your employees and watch their evolution. Define steps for interviews and OpenERP will notify managers or subordinates automatically to prepare appraisals. Keep track of the progress of your staff periodically. +Set-up appraisals plans and/or surveys for your employees and watch their evolution. Define steps for interviews and Odoo will notify managers or subordinates automatically to prepare appraisals. Keep track of the progress of your staff periodically.
- OpenERP helped us to effectively record our working time and invoice + Odoo helped us to effectively record our working time and invoice our customers while keeping track of our costs.@@ -195,7 +195,7 @@ Inspire achievement with challenges, goals and rewards. Define clear objectives
- Thanks to OpenERP, we have unified all our front-office and back-office + Thanks to Odoo, we have unified all our front-office and back-office HR applications for 300.000 users in a cost effective way.diff --git a/addons/hr_attendance/hr_attendance.py b/addons/hr_attendance/hr_attendance.py index a7950fef8d0..4887d41a52c 100644 --- a/addons/hr_attendance/hr_attendance.py +++ b/addons/hr_attendance/hr_attendance.py @@ -61,13 +61,16 @@ class hr_attendance(osv.osv): ('employee_id', '=', obj.employee_id.id), ('name', '<', obj.name), ('action', '=', 'sign_in') ], limit=1, order='name DESC') - last_signin = self.browse(cr, uid, last_signin_id, context=context)[0] + if last_signin_id: + last_signin = self.browse(cr, uid, last_signin_id, context=context)[0] - # Compute time elapsed between sign-in and sign-out - last_signin_datetime = datetime.strptime(last_signin.name, '%Y-%m-%d %H:%M:%S') - signout_datetime = datetime.strptime(obj.name, '%Y-%m-%d %H:%M:%S') - workedhours_datetime = (signout_datetime - last_signin_datetime) - res[obj.id] = ((workedhours_datetime.seconds) / 60) / 60 + # Compute time elapsed between sign-in and sign-out + last_signin_datetime = datetime.strptime(last_signin.name, '%Y-%m-%d %H:%M:%S') + signout_datetime = datetime.strptime(obj.name, '%Y-%m-%d %H:%M:%S') + workedhours_datetime = (signout_datetime - last_signin_datetime) + res[obj.id] = ((workedhours_datetime.seconds) / 60) / 60 + else: + res[obj.id] = False return res _columns = { diff --git a/addons/hr_attendance/hr_attendance_view.xml b/addons/hr_attendance/hr_attendance_view.xml index bd8fa81636b..5075cc13501 100644 --- a/addons/hr_attendance/hr_attendance_view.xml +++ b/addons/hr_attendance/hr_attendance_view.xml @@ -83,7 +83,7 @@
You can define appraisal plans (ex: first interview after 6 months, then every year). Then, each employee can be linked to - an appraisal plan so that OpenERP can automatically generate + an appraisal plan so that Odoo can automatically generate interview requests to managers and/or subordinates.
diff --git a/addons/hr_evaluation/hr_evaluation_view.xml b/addons/hr_evaluation/hr_evaluation_view.xml index cf6e24c694b..7ec83cdb2a8 100644 --- a/addons/hr_evaluation/hr_evaluation_view.xml +++ b/addons/hr_evaluation/hr_evaluation_view.xml @@ -251,7 +251,7 @@ Each employee may be assigned an Appraisal Plan. Such a plan defines the frequency and the way you manage your periodic personnel evaluation. You will be able to define steps and - attach interviews to each step. OpenERP manages all kinds of + attach interviews to each step. Odoo manages all kinds of evaluations: bottom-up, top-down, self-evaluation and final evaluation by the manager. @@ -364,7 +364,7 @@ Click to create a new interview request related to a personal evaluation.Interview requests are usually generated automatically by - OpenERP according to an employee's appraisal plan. Each user + Odoo according to an employee's appraisal plan. Each user receives automatic emails and requests to evaluate their colleagues periodically.
diff --git a/addons/hr_evaluation/report/hr_evaluation_report.py b/addons/hr_evaluation/report/hr_evaluation_report.py index 32ec3f43734..163562bfc72 100644 --- a/addons/hr_evaluation/report/hr_evaluation_report.py +++ b/addons/hr_evaluation/report/hr_evaluation_report.py @@ -31,14 +31,9 @@ class hr_evaluation_report(osv.Model): 'create_date': fields.date('Create Date', readonly=True), 'delay_date': fields.float('Delay to Start', digits=(16, 2), readonly=True), 'overpass_delay': fields.float('Overpassed Deadline', digits=(16, 2), readonly=True), - 'day': fields.char('Day', size=128, readonly=True), 'deadline': fields.date("Deadline", readonly=True), 'request_id': fields.many2one('survey.user_input', 'Request_id', readonly=True), 'closed': fields.date("closed", readonly=True), - 'year': fields.char('Year', size=4, readonly=True), - 'month': fields.selection([('01', 'January'), ('02', 'February'), ('03', 'March'), ('04', 'April'), - ('05', 'May'), ('06', 'June'), ('07', 'July'), ('08', 'August'), ('09', 'September'), - ('10', 'October'), ('11', 'November'), ('12', 'December')], 'Month', readonly=True), 'plan_id': fields.many2one('hr_evaluation.plan', 'Plan', readonly=True), 'employee_id': fields.many2one('hr.employee', "Employee", readonly=True), 'rating': fields.selection([ @@ -73,16 +68,13 @@ class hr_evaluation_report(osv.Model): create or replace view hr_evaluation_report as ( select min(l.id) as id, - date_trunc('day',s.create_date) as create_date, - to_char(s.create_date, 'YYYY-MM-DD') as day, + date(s.create_date) as create_date, s.employee_id, l.request_id, s.plan_id, s.rating, s.date as deadline, s.date_close as closed, - to_char(s.create_date, 'YYYY') as year, - to_char(s.create_date, 'MM') as month, count(l.*) as nbr, s.state, avg(extract('epoch' from age(s.create_date,CURRENT_DATE)))/(3600*24) as delay_date, @@ -93,10 +85,6 @@ class hr_evaluation_report(osv.Model): hr_evaluation_evaluation s on (s.id=l.evaluation_id) GROUP BY s.create_date, - date_trunc('day',s.create_date), - to_char(s.create_date, 'YYYY-MM-DD'), - to_char(s.create_date, 'YYYY'), - to_char(s.create_date, 'MM'), s.state, s.employee_id, s.date, diff --git a/addons/hr_evaluation/report/hr_evaluation_report_view.xml b/addons/hr_evaluation/report/hr_evaluation_report_view.xml index 073e648fe98..5793aa6d206 100644 --- a/addons/hr_evaluation/report/hr_evaluation_report_view.xml +++ b/addons/hr_evaluation/report/hr_evaluation_report_view.xml @@ -35,9 +35,7 @@Click to register new expenses.
- OpenERP will ensure the whole process is followed; the expense
+ Odoo will ensure the whole process is followed; the expense
sheet is validated by manager(s), the employee is reimbursed
from his expenses, some expenses must be re-invoiced to the
customers.
diff --git a/addons/hr_expense/report/hr_expense_report.py b/addons/hr_expense/report/hr_expense_report.py
index 667d9fba07d..531f5348357 100644
--- a/addons/hr_expense/report/hr_expense_report.py
+++ b/addons/hr_expense/report/hr_expense_report.py
@@ -32,11 +32,7 @@ class hr_expense_report(osv.osv):
_rec_name = 'date'
_columns = {
'date': fields.date('Date ', readonly=True),
- 'year': fields.char('Year', size=4, readonly=True),
- 'day': fields.char('Day', size=128, readonly=True),
- 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
- ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
- ('10','October'), ('11','November'), ('12','December')], 'Month', readonly=True),
+ 'create_date': fields.datetime('Creation Date', readonly=True),
'product_id':fields.many2one('product.product', 'Product', readonly=True),
'journal_id': fields.many2one('account.journal', 'Force Journal', readonly=True),
'product_qty':fields.float('Qty', readonly=True),
@@ -70,17 +66,15 @@ class hr_expense_report(osv.osv):
create or replace view hr_expense_report as (
select
min(l.id) as id,
- date_trunc('day',s.date) as date,
+ s.date as date,
+ s.create_date as create_date,
s.employee_id,
s.journal_id,
s.currency_id,
- to_date(to_char(s.date_confirm, 'dd-MM-YYYY'),'dd-MM-YYYY') as date_confirm,
- to_date(to_char(s.date_valid, 'dd-MM-YYYY'),'dd-MM-YYYY') as date_valid,
+ s.date_confirm as date_confirm,
+ s.date_valid as date_valid,
s.user_valid as user_id,
s.department_id,
- to_char(date_trunc('day',s.create_date), 'YYYY') as year,
- to_char(date_trunc('day',s.create_date), 'MM') as month,
- to_char(date_trunc('day',s.create_date), 'YYYY-MM-DD') as day,
avg(extract('epoch' from age(s.date_valid,s.date)))/(3600*24) as delay_valid,
avg(extract('epoch' from age(s.date_valid,s.date_confirm)))/(3600*24) as delay_confirm,
l.product_id as product_id,
@@ -97,12 +91,10 @@ class hr_expense_report(osv.osv):
left join hr_expense_expense s on (s.id=l.expense_id)
left join product_uom u on (u.id=l.uom_id)
group by
- date_trunc('day',s.date),
- to_char(date_trunc('day',s.create_date), 'YYYY'),
- to_char(date_trunc('day',s.create_date), 'MM'),
- to_char(date_trunc('day',s.create_date), 'YYYY-MM-DD'),
- to_date(to_char(s.date_confirm, 'dd-MM-YYYY'),'dd-MM-YYYY'),
- to_date(to_char(s.date_valid, 'dd-MM-YYYY'),'dd-MM-YYYY'),
+ s.date,
+ s.create_date,
+ s.date_confirm,
+ s.date_valid,
l.product_id,
l.analytic_account,
s.currency_id,
diff --git a/addons/hr_expense/report/hr_expense_report_view.xml b/addons/hr_expense/report/hr_expense_report_view.xml
index 5655b965f7c..bf44d5e27a2 100644
--- a/addons/hr_expense/report/hr_expense_report_view.xml
+++ b/addons/hr_expense/report/hr_expense_report_view.xml
@@ -43,9 +43,7 @@
- You can assign remaining Legal Leaves for each employee, OpenERP + You can assign remaining Legal Leaves for each employee, Odoo will automatically create and validate allocation requests.
- OpenERP helps you track applicants in the recruitment + Odoo helps you track applicants in the recruitment process and follow up all operations: meetings, interviews, etc.
Applicants and their attached CV are created automatically when an email is sent.
diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml
index b626edfde51..21c4af24223 100644
--- a/addons/hr_recruitment/hr_recruitment_view.xml
+++ b/addons/hr_recruitment/hr_recruitment_view.xml
@@ -313,7 +313,7 @@
- OpenERP helps you track applicants in the recruitment
+ Odoo helps you track applicants in the recruitment
process and follow up all operations: meetings, interviews, etc.
Applicants and their attached CV are created automatically when an email is sent.
diff --git a/addons/hr_recruitment/report/hr_recruitment_report.py b/addons/hr_recruitment/report/hr_recruitment_report.py
index e83b0d2cc3e..cef98c5a3de 100644
--- a/addons/hr_recruitment/report/hr_recruitment_report.py
+++ b/addons/hr_recruitment/report/hr_recruitment_report.py
@@ -61,11 +61,8 @@ class hr_recruitment_report(osv.Model):
select
min(s.id) as id,
s.create_date as date_create,
- date_trunc('day',s.date_closed) as date_closed,
- date_trunc('day',s.date_last_stage_update) as date_last_stage_update,
- to_char(s.create_date, 'YYYY') as year,
- to_char(s.create_date, 'MM') as month,
- to_char(s.create_date, 'YYYY-MM-DD') as day,
+ date(s.date_closed) as date_closed,
+ s.date_last_stage_update as date_last_stage_update,
s.partner_id,
s.company_id,
s.user_id,
@@ -84,8 +81,6 @@ class hr_recruitment_report(osv.Model):
count(*) as nbr
from hr_applicant s
group by
- date_trunc('day',s.create_date),
- date_trunc('day',s.date_closed),
s.date_open,
s.create_date,
s.write_date,
diff --git a/addons/hr_recruitment/report/hr_recruitment_report_view.xml b/addons/hr_recruitment/report/hr_recruitment_report_view.xml
index db3e15d10b8..633d53c3728 100644
--- a/addons/hr_recruitment/report/hr_recruitment_report_view.xml
+++ b/addons/hr_recruitment/report/hr_recruitment_report_view.xml
@@ -67,10 +67,7 @@
No activity yet on this contract.
- In OpenERP, contracts and projects are implemented using + In Odoo, contracts and projects are implemented using analytic account. So, you can track costs and revenues to analyse your margins easily.
diff --git a/addons/hr_timesheet/report/hr_timesheet_report.py b/addons/hr_timesheet/report/hr_timesheet_report.py
index 3ed396feefa..9b20f6978e7 100644
--- a/addons/hr_timesheet/report/hr_timesheet_report.py
+++ b/addons/hr_timesheet/report/hr_timesheet_report.py
@@ -8,11 +8,6 @@ class hr_timesheet_report(osv.osv):
_description = "Timesheet"
_auto = False
_columns = {
- 'year': fields.char('Year',size=64,required=False, readonly=True),
- 'day': fields.char('Day', size=128, readonly=True),
- 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
- ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
- ('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
'date': fields.date('Date', readonly=True),
'name': fields.char('Description', size=64,readonly=True),
'product_id' : fields.many2one('product.product', 'Product',readonly=True),
@@ -29,9 +24,6 @@ class hr_timesheet_report(osv.osv):
select_str = """
SELECT min(hat.id) as id,
aal.date as date,
- to_char(aal.date, 'YYYY-MM-DD') as day,
- to_char(aal.date,'YYYY') as year,
- to_char(aal.date,'MM') as month,
sum(aal.amount) as cost,
sum(aal.unit_amount) as quantity,
aal.account_id as account_id,
diff --git a/addons/hr_timesheet/report/hr_timesheet_report_view.xml b/addons/hr_timesheet/report/hr_timesheet_report_view.xml
index ec97447d7ff..0c9b5560ca4 100644
--- a/addons/hr_timesheet/report/hr_timesheet_report_view.xml
+++ b/addons/hr_timesheet/report/hr_timesheet_report_view.xml
@@ -35,9 +35,7 @@
- OpenERP allows you to create default invoicing types. You might
+ Odoo allows you to create default invoicing types. You might
have to regularly assign discounts because of a specific
contract or agreement with a customer. From this menu, you can
create additional types of invoicing to speed up your
diff --git a/addons/hr_timesheet_sheet/report/hr_timesheet_report.py b/addons/hr_timesheet_sheet/report/hr_timesheet_report.py
index 7cc59372d0a..74192027f3a 100644
--- a/addons/hr_timesheet_sheet/report/hr_timesheet_report.py
+++ b/addons/hr_timesheet_sheet/report/hr_timesheet_report.py
@@ -33,7 +33,6 @@ class hr_timesheet_report(osv.osv):
'department_id':fields.many2one('hr.department','Department',readonly=True),
'date_from': fields.date('Date from',readonly=True,),
'date_to': fields.date('Date to',readonly=True),
- 'date_current': fields.date('Current date', required=True),
'state' : fields.selection([
('new', 'New'),
('draft','Draft'),
diff --git a/addons/hw_scale/controllers/main.py b/addons/hw_scale/controllers/main.py
index 161a7896b38..fcfa6ede536 100644
--- a/addons/hw_scale/controllers/main.py
+++ b/addons/hw_scale/controllers/main.py
@@ -19,7 +19,7 @@ _logger = logging.getLogger(__name__)
try:
import serial
except ImportError:
- _logger.error('OpenERP module hw_scale depends on the pyserial python module')
+ _logger.error('Odoo module hw_scale depends on the pyserial python module')
serial = None
diff --git a/addons/hw_scanner/controllers/main.py b/addons/hw_scanner/controllers/main.py
index a0f225ab42f..237b301bb0e 100644
--- a/addons/hw_scanner/controllers/main.py
+++ b/addons/hw_scanner/controllers/main.py
@@ -19,7 +19,7 @@ _logger = logging.getLogger(__name__)
try:
import evdev
except ImportError:
- _logger.error('OpenERP module hw_scanner depends on the evdev python module')
+ _logger.error('Odoo module hw_scanner depends on the evdev python module')
evdev = None
diff --git a/addons/im_chat/im_chat.py b/addons/im_chat/im_chat.py
index 3617962aa16..4ca27282c6b 100644
--- a/addons/im_chat/im_chat.py
+++ b/addons/im_chat/im_chat.py
@@ -136,7 +136,8 @@ class im_chat_session(osv.Model):
if session_id:
# get the image of the user
res = self.pool["res.users"].read(cr, uid, [user_id], ["image_small"])[0]
- image_b64 = res["image_small"]
+ if res["image_small"]:
+ image_b64 = res["image_small"]
return image_b64
class im_chat_message(osv.Model):
diff --git a/addons/im_chat/security/ir.model.access.csv b/addons/im_chat/security/ir.model.access.csv
index a85541d1aa4..c1caaf14ce0 100644
--- a/addons/im_chat/security/ir.model.access.csv
+++ b/addons/im_chat/security/ir.model.access.csv
@@ -3,3 +3,7 @@ access_im_chat_message,im_chat.message,model_im_chat_message,base.group_user,1,0
access_im_chat_session,im_chat.session,model_im_chat_session,base.group_user,1,1,1,0
access_im_chat_conversation_state,im_chat.conversation_state,model_im_chat_conversation_state,base.group_user,1,1,1,0
access_im_chat_presence,im_chat.presence,model_im_chat_presence,base.group_user,1,1,1,1
+access_im_chat_message_portal,im_chat.message,model_im_chat_message,base.group_portal,1,0,1,0
+access_im_chat_session_portal,im_chat.session,model_im_chat_session,base.group_portal,1,1,1,0
+access_im_chat_conversation_state_portal,im_chat.conversation_state,model_im_chat_conversation_state,base.group_portal,1,1,1,0
+access_im_chat_presence_portal,im_chat.presence,model_im_chat_presence,base.group_portal,1,1,1,1
\ No newline at end of file
diff --git a/addons/im_chat/static/src/css/im_common.css b/addons/im_chat/static/src/css/im_common.css
index ef13d2a9c0d..c89acb7d6f1 100644
--- a/addons/im_chat/static/src/css/im_common.css
+++ b/addons/im_chat/static/src/css/im_common.css
@@ -29,6 +29,7 @@
border-top-left-radius: 5px;
border-top-right-radius: 5px;
cursor: pointer;
+ z-index:500;
}
/* conversations */
@@ -46,6 +47,7 @@
-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3);
box-shadow: 0 0 3px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3);
width: 240px;
+ z-index:500;
}
.oe_im_chatview .oe_im_chatview_disconnected {
display:none;
diff --git a/addons/im_chat/static/src/js/im_chat.js b/addons/im_chat/static/src/js/im_chat.js
index b08cd0d1e29..3ee54dbeddc 100644
--- a/addons/im_chat/static/src/js/im_chat.js
+++ b/addons/im_chat/static/src/js/im_chat.js
@@ -293,7 +293,7 @@
}
m.message = self.escape_keep_url(m.message);
m.message = self.smiley(m.message);
- m.create_date = Date.parse(m.create_date).setTimezone("UTC").toString("yyyy-dd-MM HH:mm:ss");
+ m.create_date = Date.parse(m.create_date).setTimezone("UTC").toString("yyyy-MM-dd HH:mm:ss");
return m;
});
this.set("messages", _.sortBy(this.get("messages").concat(messages), function(m){ return m.id; }));
@@ -528,6 +528,7 @@
});
},
switch_display: function() {
+ this.calc_box();
var fct = _.bind(function(place) {
this.set("right_offset", place + this.$el.outerWidth());
}, this);
diff --git a/addons/l10n_be_coda/wizard/account_coda_import.py b/addons/l10n_be_coda/wizard/account_coda_import.py
index a234dc5b180..2670a44ec33 100644
--- a/addons/l10n_be_coda/wizard/account_coda_import.py
+++ b/addons/l10n_be_coda/wizard/account_coda_import.py
@@ -167,13 +167,13 @@ class account_coda_import(osv.osv_memory):
statement['lines'].append(statementLine)
elif line[1] == '2':
if statement['lines'][-1]['ref'][0:4] != line[2:6]:
- raise osv.except_osv(_('Error') + 'R2004', _('CODA parsing error on movement data record 2.2, seq nr %s! Please report this issue via your OpenERP support channel.') % line[2:10])
+ raise osv.except_osv(_('Error') + 'R2004', _('CODA parsing error on movement data record 2.2, seq nr %s! Please report this issue via your Odoo support channel.') % line[2:10])
statement['lines'][-1]['communication'] += rmspaces(line[10:63])
statement['lines'][-1]['payment_reference'] = rmspaces(line[63:98])
statement['lines'][-1]['counterparty_bic'] = rmspaces(line[98:109])
elif line[1] == '3':
if statement['lines'][-1]['ref'][0:4] != line[2:6]:
- raise osv.except_osv(_('Error') + 'R2005', _('CODA parsing error on movement data record 2.3, seq nr %s! Please report this issue via your OpenERP support channel.') % line[2:10])
+ raise osv.except_osv(_('Error') + 'R2005', _('CODA parsing error on movement data record 2.3, seq nr %s! Please report this issue via your Odoo support channel.') % line[2:10])
if statement['version'] == '1':
statement['lines'][-1]['counterpartyNumber'] = rmspaces(line[10:22])
statement['lines'][-1]['counterpartyName'] = rmspaces(line[47:73])
@@ -206,11 +206,11 @@ class account_coda_import(osv.osv_memory):
statement['lines'].append(infoLine)
elif line[1] == '2':
if infoLine['ref'] != rmspaces(line[2:10]):
- raise osv.except_osv(_('Error') + 'R3004', _('CODA parsing error on information data record 3.2, seq nr %s! Please report this issue via your OpenERP support channel.') % line[2:10])
+ raise osv.except_osv(_('Error') + 'R3004', _('CODA parsing error on information data record 3.2, seq nr %s! Please report this issue via your Odoo support channel.') % line[2:10])
statement['lines'][-1]['communication'] += rmspaces(line[10:100])
elif line[1] == '3':
if infoLine['ref'] != rmspaces(line[2:10]):
- raise osv.except_osv(_('Error') + 'R3005', _('CODA parsing error on information data record 3.3, seq nr %s! Please report this issue via your OpenERP support channel.') % line[2:10])
+ raise osv.except_osv(_('Error') + 'R3005', _('CODA parsing error on information data record 3.3, seq nr %s! Please report this issue via your Odoo support channel.') % line[2:10])
statement['lines'][-1]['communication'] += rmspaces(line[10:100])
elif line[0] == '4':
comm_line = {}
diff --git a/addons/l10n_be_invoice_bba/invoice.py b/addons/l10n_be_invoice_bba/invoice.py
index 257347071e2..fdba030fb7c 100644
--- a/addons/l10n_be_invoice_bba/invoice.py
+++ b/addons/l10n_be_invoice_bba/invoice.py
@@ -153,7 +153,7 @@ class account_invoice(osv.osv):
else:
raise osv.except_osv(_('Error!'),
_("Unsupported Structured Communication Type Algorithm '%s' !" \
- "\nPlease contact your OpenERP support channel.") % algorithm)
+ "\nPlease contact your Odoo support channel.") % algorithm)
return {'value': {'reference': reference}}
def create(self, cr, uid, vals, context=None):
diff --git a/addons/mail/data/mail_group_data.xml b/addons/mail/data/mail_group_data.xml
index d61c883f447..707ba6f5589 100644
--- a/addons/mail/data/mail_group_data.xml
+++ b/addons/mail/data/mail_group_data.xml
@@ -14,7 +14,7 @@
The top menu bar contains all applications you installed. You can use the Settings menu to install more applications, activate other features or give access to new users.
To setup your preferences (name, email signature, avatar), click on the top right corner.
]]> diff --git a/addons/mail/data/mail_group_demo_data.xml b/addons/mail/data/mail_group_demo_data.xml index a6879c52a1a..fbd0e03c3b1 100644 --- a/addons/mail/data/mail_group_demo_data.xml +++ b/addons/mail/data/mail_group_demo_data.xml @@ -55,7 +55,7 @@I send an email to create a sense of emergency, like "can I call you this week about our quote?" and I call only those that answer this email.
You can use the email template feature of OpenERP to automate email composition.
]]>I send an email to create a sense of emergency, like "can I call you this week about our quote?" and I call only those that answer this email.
You can use the email template feature of Odoo to automate email composition.
]]>Next time you have a question for the marketing, sales, R&D or any other -department, don't send an email blast-post the question to OpenERP and get +department, don't send an email blast-post the question to Odoo and get answers from the right persons.
diff --git a/addons/mail/static/scripts/openerp_mailgate.py b/addons/mail/static/scripts/openerp_mailgate.py
index e3dbdf4adc0..601dc483dfc 100755
--- a/addons/mail/static/scripts/openerp_mailgate.py
+++ b/addons/mail/static/scripts/openerp_mailgate.py
@@ -120,13 +120,13 @@ def configure_parser():
parser = optparse.OptionParser(usage='usage: %prog [options]', version='%prog v1.1')
group = optparse.OptionGroup(parser, "Note",
"This program parse a mail from standard input and communicate "
- "with the OpenERP server for case management in the CRM module.")
+ "with the Odoo server for case management in the CRM module.")
parser.add_option_group(group)
parser.add_option("-u", "--user", dest="userid",
- help="OpenERP user id to connect with",
+ help="Odoo user id to connect with",
default=config.OPENERP_DEFAULT_USER_ID, type='int')
parser.add_option("-p", "--password", dest="password",
- help="OpenERP user password",
+ help="Odoo user password",
default=config.OPENERP_DEFAULT_PASSWORD)
parser.add_option("-o", "--model", dest="model",
help="Name or ID of destination model",
@@ -135,13 +135,13 @@ def configure_parser():
help="Admin email for error notifications.",
default=None)
parser.add_option("-d", "--dbname", dest="dbname",
- help="OpenERP database name (default: %default)",
+ help="Odoo database name (default: %default)",
default=config.OPENERP_DEFAULT_DATABASE)
parser.add_option("--host", dest="host",
- help="OpenERP Server hostname",
+ help="Odoo Server hostname",
default=config.OPENERP_HOSTNAME)
parser.add_option("--port", dest="port",
- help="OpenERP Server XML-RPC port number",
+ help="Odoo Server XML-RPC port number",
default=config.OPENERP_PORT)
parser.add_option("--custom-values", dest="custom_values",
help="Dictionary of extra values to pass when creating records",
@@ -187,13 +187,13 @@ def main():
'%s' % (cgitb.text(sys.exc_info())),
])
- subject = '[OPENERP]:ERROR: Mailgateway - %s' % time.strftime('%Y-%m-%d %H:%M:%S')
+ subject = '[Odoo]:ERROR: Mailgateway - %s' % time.strftime('%Y-%m-%d %H:%M:%S')
send_mail(
config.MAIL_ERROR,
config.MAIL_ADMINS,
subject, msg, files=[('message.txt', msg_txt)]
)
- sys.stderr.write("Failed to deliver email to OpenERP Server, sending error notification to %s\n" % config.MAIL_ADMINS)
+ sys.stderr.write("Failed to deliver email to Odoo Server, sending error notification to %s\n" % config.MAIL_ADMINS)
if __name__ == '__main__':
main()
diff --git a/addons/mail/tests/test_mail_features.py b/addons/mail/tests/test_mail_features.py
index d148a8aac4c..2a283a9e5b9 100644
--- a/addons/mail/tests/test_mail_features.py
+++ b/addons/mail/tests/test_mail_features.py
@@ -467,14 +467,10 @@ class test_mail(TestMail):
'message_post: notification email subject incorrect')
self.assertIn(_body1, sent_email['body'],
'message_post: notification email body incorrect')
- self.assertIn(user_raoul.signature, sent_email['body'],
- 'message_post: notification email body should contain the sender signature')
self.assertIn('Pigs rules', sent_email['body_alternative'],
'message_post: notification email body alternative should contain the body')
self.assertNotIn('', sent_email['body_alternative'], 'message_post: notification email body alternative still contains html') - self.assertIn(html2plaintext(user_raoul.signature), sent_email['body_alternative'], - 'message_post: notification email body alternative should contain the sender signature') self.assertFalse(sent_email['references'], 'message_post: references should be False when sending a message that is not a reply') @@ -538,14 +534,10 @@ class test_mail(TestMail): 'message_post: notification email subject incorrect') self.assertIn(html_sanitize(_body2), sent_email['body'], 'message_post: notification email does not contain the body') - self.assertIn(user_raoul.signature, sent_email['body'], - 'message_post: notification email body should contain the sender signature') self.assertIn('Pigs rocks', sent_email['body_alternative'], 'message_post: notification email body alternative should contain the body') self.assertNotIn('
', sent_email['body_alternative'],
'message_post: notification email body alternative still contains html')
- self.assertIn(html2plaintext(user_raoul.signature), sent_email['body_alternative'],
- 'message_post: notification email body alternative should contain the sender signature')
self.assertIn(msg_message_id, sent_email['references'],
'message_post: notification email references lacks parent message message_id')
# Test: attachments + download
diff --git a/addons/marketing_campaign/marketing_campaign_demo.xml b/addons/marketing_campaign/marketing_campaign_demo.xml
index a7b1a8bce0c..5f116cac945 100644
--- a/addons/marketing_campaign/marketing_campaign_demo.xml
+++ b/addons/marketing_campaign/marketing_campaign_demo.xml
@@ -4,7 +4,7 @@
Click to create a marketing campaign.
- OpenERP's marketing campaign allows you to automate communication
+ Odoo's marketing campaign allows you to automate communication
to your prospects. You can define a segment (set of conditions) on
your leads and partners to fullfil the campaign.
diff --git a/addons/marketing_campaign_crm_demo/crm_lead_mc_demo_report.rml b/addons/marketing_campaign_crm_demo/crm_lead_mc_demo_report.rml
index 1f1df2c713e..1661b34da77 100644
--- a/addons/marketing_campaign_crm_demo/crm_lead_mc_demo_report.rml
+++ b/addons/marketing_campaign_crm_demo/crm_lead_mc_demo_report.rml
@@ -1,6 +1,6 @@
-Get access to mass mailing features from every OpenERP app to improve
+Get access to mass mailing features from every Odoo app to improve
the way your users communicate.
Send template of emails from CRM opportunities, select leads based on
@@ -99,7 +99,7 @@ Answers to your emails appears automatically in the history of every document wi
Get a clean lead database that improves over the time using the
- performance of your mails. OpenERP handle bounce mails
+ performance of your mails. Odoo handle bounce mails
efficiently, flag erroneous leads accordingly and gives you
statistics on the quality of your leads.
Get all the negotiations and discussions attached to the right document
and relevent managers notified on specific events.
@@ -205,7 +205,7 @@ gives you a direct overview of your campaign performance.
Integrate a contact form in your website easily. Forms
- submissions create leads automatically in OpenERP CRM. Leads
+ submissions create leads automatically in Odoo CRM. Leads
can be used in marketing campaigns.
+
This application supports complete integration and production scheduling for stockable goods, consumables, and services. From the Manufacturing Settings, you can choose to compute production schedules periodically or just-in-time.
Define specific property groups that can be assigned to your
- bill of materials and sales orders. Properties allows OpenERP
+ bill of materials and sales orders. Properties allows Odoo
to automatically select the right bill of materials according
to properties selected in the sales order by salesperson.
For instance, in the property group "Warranty", you an have
two properties: 1 year warranty, 3 years warranty. Depending
- on the propoerties selected in the sales order, OpenERP will
+ on the propoerties selected in the sales order, Odoo will
schedule a production using the matching bill of materials.
Click to create a new property.
- The Properties in OpenERP are used to select the right bill of
+ The Properties in Odoo are used to select the right bill of
materials for manufacturing a product when you have different
ways of building the same product. You can assign several
properties to each bill of materials. When a salesperson
creates a sales order, they can relate it to several properties
- and OpenERP will automatically select the BoM to use according
+ and Odoo will automatically select the BoM to use according
the needs.
- OpenERP uses these BoMs to automatically propose manufacturing
+ Odoo uses these BoMs to automatically propose manufacturing
orders according to procurement needs.
-Get all your assembly or manufacturing operations managed by OpenERP. Schedule
+Get all your assembly or manufacturing operations managed by Odoo. Schedule
manufacturing orders and work orders automatically. Review the proposed
planning with the smart kanban and gantt views. Use the advanced analytics
features to detect bottleneck in resources capacities and inventory locations.
@@ -67,7 +67,7 @@ manufacturing orders.
Edit manually all proposed operations at any level of the progress.
- With OpenERP, you will not be frustrated by a rigid system.
+ With Odoo, you will not be frustrated by a rigid system.
-Everyone has their own way to organize activities. OpenERP Notes' smart kanban approach allows every user to customize their own steps to process it's to-dos and notes.
+Everyone has their own way to organize activities. Odoo Notes' smart kanban approach allows every user to customize their own steps to process it's to-dos and notes.
If you install the PoS proxy you will be able to interface OpenERP with retail hardware: barcode scanners, printers, cash registers, weighing machines, credit card payment terminals. If you install the PoS proxy you will be able to interface Odoo with retail hardware: barcode scanners, printers, cash registers, weighing machines, credit card payment terminals.
- OpenERP's Point of Sale introduces a super clean interface with no installation required
+ Odoo's Point of Sale introduces a super clean interface with no installation required
that runs online and offline on modern hardwares.
@@ -40,7 +40,7 @@
- OpenERP's POS is a web application that can run on any device that can
+ Odoo's POS is a web application that can run on any device that can
display websites with little to no setup required.
- Say goodbye to ugly, outdated POS software and enjoy the OpenERP
+ Say goodbye to ugly, outdated POS software and enjoy the Odoo
web interface designed for modern retailer.
Produce customer invoices in just a few clicks. Control sales and
- cash in real time and use OpenERP's powerful reporting to make
+ cash in real time and use Odoo's powerful reporting to make
smarter decisions to improve your store's efficiency.
No more hassle of having to integrate softwares: get all your sales
@@ -216,7 +216,7 @@
required to pilot a global strategy amongst all your stores.
- With OpenERP as a backend, you have a system proven to be perfectly
+ With Odoo as a backend, you have a system proven to be perfectly
suitable for small stores or large multinationals.
- With OpenERP, you get a 360° customer view, including cross-channel sales,
+ With Odoo, you get a 360° customer view, including cross-channel sales,
interaction history, profiles, and more.
- OpenERP's project management allows you to manage the pipeline
+ Odoo's project management allows you to manage the pipeline
of tasks in order to get things done efficiently. You can
track progress, discuss on tasks, attach documents, etc.
- OpenERP's project management allows you to manage the pipeline
+ Odoo's project management allows you to manage the pipeline
of tasks in order to get things done efficiently. You can
track progress, discuss on tasks, attach documents, etc.
-OpenERP's collaborative and realtime project management helps your team get
+Odoo's collaborative and realtime project management helps your team get
work done. Keep track of everything, from the big picture to the minute
details, from the customer contract to the billing.
- The OpenERP issues tacker allows you to efficiantly manage things
+ The Odoo issues tacker allows you to efficiantly manage things
like internal requests, software development bugs, customer
complaints, project troubles, material breakdowns, etc.
- The OpenERP issues tacker allows you to efficiantly manage things
+ The Odoo issues tacker allows you to efficiantly manage things
like internal requests, software development bugs, customer
complaints, project troubles, material breakdowns, etc.
- The OpenERP issues tacker allows you to efficiantly manage things
+ The Odoo issues tacker allows you to efficiantly manage things
like internal requests, software development bugs, customer
complaints, project troubles, material breakdowns, etc.
The request for quotation is the first step of the purchases flow. Once
- converted into a purchase order, you will be able to control the reception
+ converted into a purchase order, you will be able to control the receipt
of the products and the supplier invoice.
Supplier invoices can be pre-generated based on purchase
- orders or receptions. This allows you to control invoices
+ orders or receipts. This allows you to control invoices
you receive from your supplier according to the draft
- document in OpenERP.
+ document in Odoo.
Use this menu to control the invoices to be received from your
- supplier. OpenERP generates draft invoices from your purchase
- orders or receptions, according to your settings.
+ supplier. Odoo generates draft invoices from your purchase
+ orders or receipts, according to your settings.
Once you receive a supplier invoice, you can match it with the
draft invoice and validate it.
@@ -382,7 +382,7 @@
quotation is converted into a purchase order.
Most propositions of purchase orders are created automatically
- by OpenERP based on inventory needs.
+ by Odoo based on inventory needs.
-Use the costing method that reflects your business: standard price, average price, fifo or lifo. Get your accounting entries and the right inventory valuation in real-time; OpenERP manages everything for you, transparently.
+Use the costing method that reflects your business: standard price, average price, fifo or lifo. Get your accounting entries and the right inventory valuation in real-time; Odoo manages everything for you, transparently.
Click to create a new incoming shipment.
- Here you can track all the product receptions of purchase
+ Here you can track all the product receipts of purchase
orders where the invoicing is "Based on Incoming Shipments",
and for which you have not received a supplier invoice yet.
- You can generate a supplier invoice based on those receptions.
+ You can generate a supplier invoice based on those receipts.
Click to create a quotation or sales order for this customer.
- OpenERP will help you efficiently handle the complete sale flow:
+ Odoo will help you efficiently handle the complete sale flow:
quotation, sales order, delivery, invoicing and
payment.
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 8903f321310..03a2b570752 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -269,7 +269,7 @@ class sale_order(osv.osv):
return osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
def copy_quotation(self, cr, uid, ids, context=None):
- id = self.copy(cr, uid, ids[0], context=None)
+ id = self.copy(cr, uid, ids[0], context=context)
view_ref = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'sale', 'view_order_form')
view_id = view_ref and view_ref[1] or False,
return {
@@ -291,7 +291,7 @@ class sale_order(osv.osv):
value = {
'currency_id': self.pool.get('product.pricelist').browse(cr, uid, pricelist_id, context=context).currency_id.id
}
- if not order_lines:
+ if not order_lines or order_lines == [(6, 0, [])]:
return {'value': value}
warning = {
'title': _('Pricelist Warning!'),
@@ -632,7 +632,7 @@ class sale_order(osv.osv):
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 = dict()
ctx.update({
'default_model': 'sale.order',
'default_res_id': ids[0],
@@ -718,7 +718,7 @@ class sale_order(osv.osv):
procurement_obj.check(cr, uid, [x.id for x in line.procurement_ids if x.state not in ['cancel', 'done']])
line.refresh()
#run again procurement that are in exception in order to trigger another move
- proc_ids += [x.id for x in line.procurement_ids if x.state == 'exception']
+ proc_ids += [x.id for x in line.procurement_ids if x.state in ('exception', 'cancel')]
elif sale_line_obj.need_procurement(cr, uid, [line.id], context=context):
if (line.state == 'done') or not line.product_id:
continue
@@ -741,49 +741,7 @@ class sale_order(osv.osv):
order.write(val)
return True
- # if mode == 'finished':
- # returns True if all lines are done, False otherwise
- # if mode == 'canceled':
- # returns True if there is at least one canceled line, False otherwise
- def test_state(self, cr, uid, ids, mode, *args):
- assert mode in ('finished', 'canceled'), _("invalid mode for test_state")
- finished = True
- canceled = False
- write_done_ids = []
- write_cancel_ids = []
- for order in self.browse(cr, uid, ids, context={}):
- #TODO: Need to rethink what happens when cancelling
- for line in order.order_line:
- states = [x.state for x in line.procurement_ids]
- cancel = states and all([x == 'cancel' for x in states])
- doneorcancel = all([x in ('done', 'cancel') for x in states])
- if cancel:
- canceled = True
- if line.state != 'exception':
- write_cancel_ids.append(line.id)
- if not doneorcancel:
- finished = False
- if doneorcancel and not cancel:
- write_done_ids.append(line.id)
-
- if write_done_ids:
- self.pool.get('sale.order.line').write(cr, uid, write_done_ids, {'state': 'done'})
- if write_cancel_ids:
- self.pool.get('sale.order.line').write(cr, uid, write_cancel_ids, {'state': 'exception'})
-
- if mode == 'finished':
- return finished
- elif mode == 'canceled':
- return canceled
-
-
- def procurement_lines_get(self, cr, uid, ids, *args):
- res = []
- for order in self.browse(cr, uid, ids, context={}):
- for line in order.order_line:
- res += [x.id for x in line.procurement_ids]
- return res
def onchange_fiscal_position(self, cr, uid, ids, fiscal_position, order_lines, context=None):
'''Update taxes of order lines for each line where a product is defined
@@ -828,6 +786,20 @@ class sale_order(osv.osv):
order_line.append(line)
return {'value': {'order_line': order_line}}
+ def test_procurements_done(self, cr, uid, ids, context=None):
+ for sale in self.browse(cr, uid, ids, context=context):
+ for line in sale.order_line:
+ if not all([x.state == 'done' for x in line.procurement_ids]):
+ return False
+ return True
+
+ def test_procurements_except(self, cr, uid, ids, context=None):
+ for sale in self.browse(cr, uid, ids, context=context):
+ for line in sale.order_line:
+ if any([x.state == 'cancel' for x in line.procurement_ids]):
+ return True
+ return False
+
# TODO add a field price_unit_uos
# - update it on change product and unit price
@@ -924,6 +896,8 @@ class sale_order_line(osv.osv):
'delay': 0.0,
}
+
+
def _get_line_qty(self, cr, uid, line, context=None):
if line.product_uos:
return line.product_uos_qty or 0.0
@@ -1268,6 +1242,20 @@ class procurement_order(osv.osv):
'sale_line_id': fields.many2one('sale.order.line', string='Sale Order Line'),
}
+ def write(self, cr, uid, ids, vals, context=None):
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ res = super(procurement_order, self).write(cr, uid, ids, vals, context=context)
+ from openerp import workflow
+ if vals.get('state') in ['done', 'cancel', 'exception']:
+ for proc in self.browse(cr, uid, ids, context=context):
+ if proc.sale_line_id and proc.sale_line_id.order_id and proc.move_ids:
+ order_id = proc.sale_line_id.order_id.id
+ if self.pool.get('sale.order').test_procurements_done(cr, uid, [order_id], context=context):
+ workflow.trg_validate(uid, 'sale.order', order_id, 'ship_end', cr)
+ if self.pool.get('sale.order').test_procurements_except(cr, uid, [order_id], context=context):
+ workflow.trg_validate(uid, 'sale.order', order_id, 'ship_except', cr)
+ return res
class product_product(osv.Model):
_inherit = 'product.product'
@@ -1278,10 +1266,36 @@ class product_product(osv.Model):
product_id: SaleOrderLine.search_count(cr,uid, [('product_id', '=', product_id)], context=context)
for product_id in ids
}
+
_columns = {
'sales_count': fields.function(_sales_count, string='# Sales', type='integer'),
}
+class product_template(osv.Model):
+ _inherit = 'product.template'
+
+ def _sales_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict.fromkeys(ids, 0)
+ for template in self.browse(cr, uid, ids, context=context):
+ res[template.id] = sum([p.sales_count for p in template.product_variant_ids])
+ return res
+
+ def action_view_sales(self, cr, uid, ids, context=None):
+ act_obj = self.pool.get('ir.actions.act_window')
+ mod_obj = self.pool.get('ir.model.data')
+ product_ids = []
+ for template in self.browse(cr, uid, ids, context=context):
+ product_ids += [x.id for x in template.product_variant_ids]
+ result = mod_obj.xmlid_to_res_id(cr, uid, 'sale.action_order_line_product_tree',raise_if_not_found=True)
+ result = act_obj.read(cr, uid, [result], context=context)[0]
+ result['domain'] = "[('product_id','in',[" + ','.join(map(str, product_ids)) + "])]"
+ return result
+
+
+ _columns = {
+ 'sales_count': fields.function(_sales_count, string='# Sales', type='integer'),
+
+ }
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index 0295e61f516..f974ec5b540 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -284,7 +284,7 @@
Click to create a quotation that can be converted into a sales
order.
- OpenERP will help you efficiently handle the complete sales flow:
+ Odoo will help you efficiently handle the complete sales flow:
quotation, sales order, delivery, invoicing and payment.
Click to create a quotation, the first step of a new sale.
- OpenERP will help you handle efficiently the complete sale flow:
+ Odoo will help you handle efficiently the complete sale flow:
from the quotation to the sales order, the
delivery, the invoicing and the payment collection.
@@ -508,6 +508,21 @@
+
- OpenERP will help you efficiently handle the complete sales flow:
+ Odoo will help you efficiently handle the complete sales flow:
quotation, sales order, delivery, invoicing and payment.
Click to create a quotation, the first step of a new sale.
- OpenERP will help you handle efficiently the complete sale flow:
+ Odoo will help you handle efficiently the complete sale flow:
from the quotation to the sales order, the
delivery, the invoicing and the payment collection.
diff --git a/addons/sale/sale_workflow.xml b/addons/sale/sale_workflow.xml
index 831a0a9d12c..1dd093f4e1d 100644
--- a/addons/sale/sale_workflow.xml
+++ b/addons/sale/sale_workflow.xml
@@ -262,9 +262,7 @@
Whether you invoice based on time and materials, on delivery
- orders or fixed price; OpenERP supports all possible methods.
+ orders or fixed price; Odoo supports all possible methods.
Get recurring invoices produced automatically, create advances
@@ -149,7 +149,7 @@ managers get alerts before contracts have to be renewed.
The chatter feature enables you to communicate faster and more efficiently with
your customer. This takes place directly on a quotation or sale order from
-within OpenERP or via email.
+within Odoo or via email.
Get all the negotiations and discussions attached to the right document
@@ -248,7 +248,7 @@ applied automatically for all your sales teams.
- Click to register a reception for this product.
+ Click to register a receipt for this product.
- Here you will find the history of all receptions related to
- this product, as well as all future receptions you are waiting
+ Here you will find the history of all receipts related to
+ this product, as well as all future receipts you are waiting
from your suppliers.
-Decrease your process times, automate transactions, reduce your stock levels and get complete traceability on all operations with the OpenERP double entry inventory system.
+Decrease your process times, automate transactions, reduce your stock levels and get complete traceability on all operations with the Odoo double entry inventory system.
-Based on the concept of double entry that revolutionized accounting, OpenERP's
+Based on the concept of double entry that revolutionized accounting, Odoo's
inventory management isn't about consumption, loss or missing products;
products are just moved from one location to another.
@@ -69,7 +69,7 @@ delivery orders, internal controls, etc.
-OpenERP prepares all operations for you, according to your own logistic rules:
+Odoo prepares all operations for you, according to your own logistic rules:
routes, waves, removal/put away strategies, minimum stock rules, etc.
Optimizes the planning and jobs with the scheduler to reduce your process time.
-Get your procurements accurate as the OpenERP WMS is fully integrated with
+Get your procurements accurate as the Odoo WMS is fully integrated with
sales and purchases for accurate forecasts. The accounting integration allows
real time accounting valuation and deeper reporting on costs and revenues on
your inventory operations.
@@ -149,7 +149,7 @@ your inventory operations.
Assign serial numbers at every step of your reception or delivery flow.
-OpenERP handles unique serial numbers, batches of identical products or packaging units.
+Odoo handles unique serial numbers, batches of identical products or packaging units.
Manage your own internal and external locations, customers, suppliers or
-manufacturing inventories with the OpenERP multi-warehouse management system
+manufacturing inventories with the Odoo multi-warehouse management system
based on a hierarchical location structure.
-OpenERP's Warehouse Management is designed to scale from a few thousands
+Odoo's Warehouse Management is designed to scale from a few thousands
operations to several millions of transactions.
Use routes, waves and orderpoint rules to optimize the way you pick products in
-the warehouse. OpenERP supports most picking methods out-of-the-box like; wave
+the warehouse. Odoo supports most picking methods out-of-the-box like; wave
picking, batch picking and "by order" picking.
Define your locations to reflect your warehouse structure and
- organization. OpenERP is able to manage physical locations
+ organization. Odoo is able to manage physical locations
(warehouses, shelves, bin, etc), partner locations (customers,
suppliers) and virtual locations which are the counterpart of
the stock operations like the manufacturing orders
consumptions, inventories, etc.
- Every stock operation in OpenERP moves the products from one
+ Every stock operation in Odoo moves the products from one
location to another one. For instance, if you receive products
- from a supplier, OpenERP will move products from the Supplier
+ from a supplier, Odoo will move products from the Supplier
location to the Stock location. Each report can be performed on
physical, partner or virtual locations.
Click to create a stock operation.
- Most operations are prepared automatically by OpenERP according
+ Most operations are prepared automatically by Odoo according
to your preconfigured logistics rules, but you can also record
manual stock movements.
- Click to register a product reception.
+ Click to register a product receipt.
Here you can receive individual products, no matter what
purchase order or picking order they come from. You will find
@@ -1586,7 +1507,7 @@
Click to add a reordering rule.
- You can define your minimum stock rules, so that OpenERP will automatically create draft manufacturing orders or request for quotations according to the stock level. Once the virtual stock of a product (= stock on hand minus all confirmed orders and reservations) is below the minimum quantity, OpenERP will generate a procurement request to increase the stock up to the maximum quantity. You can define your minimum stock rules, so that Odoo will automatically create draft manufacturing orders or request for quotations according to the stock level. Once the virtual stock of a product (= stock on hand minus all confirmed orders and reservations) is below the minimum quantity, Odoo will generate a procurement request to increase the stock up to the maximum quantity.
+
- Fill in this form to create an OpenERP database. You can
+ Fill in this form to create an Odoo database. You can
create databases for different companies or for different
goals (testing, production). Once the database is created,
you will be able to install your first application.
@@ -112,7 +112,7 @@
Copyright © 2004-TODAY OpenERP SA. All Rights Reserved. Licenced under the terms of GNU Affero General Public License For more information visit Odoo.comIntegrated with OpenERP Apps
+ Integrated with Odoo Apps
- OpenERP allowed our company to efficiently manage a growth from a turnover of 2.4m€ to 15m€ in 4 years.
+ Odoo allowed our company to efficiently manage a growth from a turnover of 2.4m€ to 15m€ in 4 years.
diff --git a/addons/mrp/stock.py b/addons/mrp/stock.py
index 2718b77d051..4b442077a5d 100644
--- a/addons/mrp/stock.py
+++ b/addons/mrp/stock.py
@@ -85,6 +85,8 @@ class StockMove(osv.osv):
'product_uos_qty': line['product_uos_qty'],
'state': state,
'name': line['name'],
+ 'procurement_id': move.procurement_id.id,
+ 'split_from': move.id, #Needed in order to keep purchase connection, but will be removed by unlink
}
mid = move_obj.copy(cr, uid, move.id, default=valdef)
to_explode_again_ids.append(mid)
diff --git a/addons/mrp_operations/report/mrp_code_barcode.rml b/addons/mrp_operations/report/mrp_code_barcode.rml
index bcc4fc54870..a0a125f051d 100644
--- a/addons/mrp_operations/report/mrp_code_barcode.rml
+++ b/addons/mrp_operations/report/mrp_code_barcode.rml
@@ -1,6 +1,6 @@
* Open ERP: a modern approach to integrated business management
-
* Open ERP for Retail and Industrial Management
+
* Odoo: a modern approach to integrated business management
+
* Odoo for Retail and Industrial Management
]]>
* Open ERP: a modern approach to integrated business management
-
* Open ERP for Retail and Industrial Management
+
* Odoo: a modern approach to integrated business management
+
* Odoo for Retail and Industrial Management
]]>
Adapts to Your Creative Process
Customize to your own workflow
diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py
index 5c8103c7626..03e56800e5a 100644
--- a/addons/point_of_sale/point_of_sale.py
+++ b/addons/point_of_sale/point_of_sale.py
@@ -63,7 +63,7 @@ class pos_config(osv.osv):
help="Accounting journal used to post sales entries."),
'currency_id' : fields.function(_get_currency, type="many2one", string="Currency", relation="res.currency"),
'iface_self_checkout' : fields.boolean('Self Checkout Mode',
- help="Check this if this point of sale should open by default in a self checkout mode. If unchecked, OpenERP uses the normal cashier mode by default."),
+ help="Check this if this point of sale should open by default in a self checkout mode. If unchecked, Odoo uses the normal cashier mode by default."),
'iface_cashdrawer' : fields.boolean('Cashdrawer', help="Automatically open the cashdrawer"),
'iface_payment_terminal' : fields.boolean('Payment Terminal', help="Enables Payment Terminal integration"),
'iface_electronic_scale' : fields.boolean('Electronic Scale', help="Enables Electronic Scale integration"),
@@ -78,7 +78,7 @@ class pos_config(osv.osv):
'state' : fields.selection(POS_CONFIG_STATE, 'Status', required=True, readonly=True, copy=False),
'sequence_id' : fields.many2one('ir.sequence', 'Order IDs Sequence', readonly=True,
- help="This sequence is automatically created by OpenERP but you can change it "\
+ help="This sequence is automatically created by Odoo but you can change it "\
"to customize the reference numbers of your orders.", copy=False),
'session_ids': fields.one2many('pos.session', 'config_id', 'Sessions'),
'group_by' : fields.boolean('Group Journal Items', help="Check this if you want to group the Journal Items by Product while closing a Session"),
@@ -492,6 +492,8 @@ class pos_session(osv.osv):
pos_order_obj._create_account_move_line(cr, uid, order_ids, session, move_id, context=local_context)
for order in session.order_ids:
+ if order.state == 'done':
+ continue
if order.state not in ('paid', 'invoiced'):
raise osv.except_osv(
_('Error!'),
@@ -811,6 +813,16 @@ class pos_order(osv.osv):
'name': order.name + ': ' + (data.get('payment_name', '') or ''),
'partner_id': order.partner_id and order.partner_id.id or None,
}
+ account_def = property_obj.get(cr, uid, 'property_account_receivable', 'res.partner', context=context)
+ args['account_id'] = (order.partner_id and order.partner_id.property_account_receivable \
+ and order.partner_id.property_account_receivable.id) or (account_def and account_def.id) or False
+
+ if not args['account_id']:
+ if not args['partner_id']:
+ msg = _('There is no receivable account defined to make payment.')
+ else:
+ msg = _('There is no receivable account defined to make payment for the partner: "%s" (id:%d).') % (order.partner_id.name, order.partner_id.id,)
+ raise osv.except_osv(_('Configuration Error!'), msg)
context.pop('pos_session_id', False)
@@ -830,10 +842,10 @@ class pos_order(osv.osv):
raise osv.except_osv(_('Error!'), _('You have to open at least one cashbox.'))
args.update({
- 'statement_id' : statement_id,
- 'pos_statement_id' : order_id,
- 'journal_id' : journal_id,
- 'ref' : order.session_id.name,
+ 'statement_id': statement_id,
+ 'pos_statement_id': order_id,
+ 'journal_id': journal_id,
+ 'ref': order.session_id.name,
})
statement_line_obj.create(cr, uid, args, context=context)
diff --git a/addons/point_of_sale/point_of_sale_data.xml b/addons/point_of_sale/point_of_sale_data.xml
index 1cc69dd5f75..3f8016ffe05 100644
--- a/addons/point_of_sale/point_of_sale_data.xml
+++ b/addons/point_of_sale/point_of_sale_data.xml
@@ -40,7 +40,7 @@
In your web browser
Online and Offline
- OpenERP's POS stays reliable even if your connection isn't
+ Odoo's POS stays reliable even if your connection isn't
Simple and beautifull
@@ -50,8 +50,8 @@
- Each day of the week starts from 9 AM (CEST/PST) to 12 PM (CEST/PST). A Q&A session will be hosted by an OpenERP trainer.
+ introduction of Odoo is important before going through the other modules.
+ Each day of the week starts from 9 AM (CEST/PST) to 12 PM (CEST/PST). A Q&A session will be hosted by an Odoo trainer.
Each day, the participants are expected to have done the following BEFORE attending the Q&A session:
@@ -422,7 +422,7 @@
- Each day of the week is dedicated to specific applications in OpenERP as per the following planning:
+ Each day of the week is dedicated to specific applications in Odoo as per the following planning:
@@ -213,7 +213,7 @@
-
- The introduction exercises have been created to help you discover OpenERP in an easy way. Their main objective is to present the different applications, menus, view types, shortcuts, field types, wizards, actions, etc. It will help you to discover how to navigate in OpenERP!
+ The introduction exercises have been created to help you discover Odoo in an easy way. Their main objective is to present the different applications, menus, view types, shortcuts, field types, wizards, actions, etc. It will help you to discover how to navigate in Odoo!
Therefore, the Introduction is compulsory for everyone, even if you need to learn a specific module given on an other date. This obligation has been made to make sure that you are not lost if you arrive in the middle of the training for another module.
- OpenERP can work with independent applications, so the
+ Odoo can work with independent applications, so the
whole commercial process can be integrated together in
order to accomplish complete business flows.
@@ -257,7 +257,7 @@
- OpenERP Warehouse Management is at once very simple, flexible and complete. It is based on the concept of double entry that revolutionized accounting: ‘Nothing lost, everything moved’. In OpenERP, we don’t talk about disappearance, consumption or loss of products: instead we speak only of stock moves from one place to another.
+ Odoo Warehouse Management is at once very simple, flexible and complete. It is based on the concept of double entry that revolutionized accounting: ‘Nothing lost, everything moved’. In Odoo, we don’t talk about disappearance, consumption or loss of products: instead we speak only of stock moves from one place to another.
@@ -465,7 +465,7 @@
- From the sales perspective, you will have a manufacturing order generated based on a request coming from a customer without any manual operation. This integration of those two aplications allows you to perform the following flow in an automated way: Sale order –> Stock level verification –> Production of the missing units –> Reception in stock of the finished goods –> Delivery to the customer.
+ From the sales perspective, you will have a manufacturing order generated based on a request coming from a customer without any manual operation. This integration of those two aplications allows you to perform the following flow in an automated way: Sale order –> Stock level verification –> Production of the missing units –> Receival in stock of the finished goods –> Delivery to the customer.
@@ -484,9 +484,9 @@
@@ -540,7 +540,7 @@
-
- OpenERP offers a simple way to import and export data. OpenERP will guide you for this phase thanks to a FAQ directly integrated into the import screen
+ Odoo offers a simple way to import and export data. Odoo will guide you for this phase thanks to a FAQ directly integrated into the import screen
- OpenERP POS is the first POS running in a 100% web based environment, which means any computer with a browser can host the POS. The POS is a two-part system with a front-end (interaction with the client) and a back-end (managers can configure the system, print reports, analyse, ...)
+ Odoo POS is the first POS running in a 100% web based environment, which means any computer with a browser can host the POS. The POS is a two-part system with a front-end (interaction with the client) and a back-end (managers can configure the system, print reports, analyse, ...)
About the front-end:
- This features will help you to fully customize the standard documents made from OpenERP.
+ This features will help you to fully customize the standard documents made from Odoo.
@@ -612,7 +612,7 @@
-
- With the live sessions, we learned a lot more than what was covered in the videos. Definitely a good start for building up a solid base of working knowledge of OpenERP.
+ With the live sessions, we learned a lot more than what was covered in the videos. Definitely a good start for building up a solid base of working knowledge of Odoo.
The trainer did a wonderful job with the training! He was well informed and interactive online and offline. Thank you so much for the experience!
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index ee0d6a0e9df..5823f2cab05 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -61,7 +61,7 @@
- OpenERP provides essential platform for our project management.
+ Odoo provides essential platform for our project management.
Things are better organized and much more visible with it.
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index 0c3ba5683fd..016313b5e44 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -21,6 +21,7 @@
from datetime import datetime
+from openerp import api
from openerp import SUPERUSER_ID
from openerp import tools
from openerp.osv import fields, osv, orm
@@ -449,6 +450,7 @@ class project_issue(osv.Model):
res_id = super(project_issue, self).message_new(cr, uid, msg, custom_values=defaults, context=context)
return res_id
+ @api.cr_uid_ids_context
def message_post(self, cr, uid, thread_id, body='', subject=None, type='notification', subtype=None, parent_id=False, attachments=None, context=None, content_subtype='html', **kwargs):
""" Overrides mail_thread message_post so that we can set the date of last action field when
a new message is posted on the issue.
diff --git a/addons/project_issue/project_issue_menu.xml b/addons/project_issue/project_issue_menu.xml
index 308b4884844..26981256c7f 100644
--- a/addons/project_issue/project_issue_menu.xml
+++ b/addons/project_issue/project_issue_menu.xml
@@ -15,7 +15,7 @@
- OpenERP proved to be an effective tool to sustain our operations
+ Odoo proved to be an effective tool to sustain our operations
for the bright future. It's stable, robust and easy.
@@ -261,7 +261,7 @@ applied automatically for all your sales teams.
- OpenERP is a great tool to drive sales. We manage our prospects in different stages
+ Odoo is a great tool to drive sales. We manage our prospects in different stages
to get a proper overview of our success rate.
diff --git a/addons/sale/views/report_saleorder.xml b/addons/sale/views/report_saleorder.xml
index a6771823f55..45ec4a77ac7 100644
--- a/addons/sale/views/report_saleorder.xml
+++ b/addons/sale/views/report_saleorder.xml
@@ -45,6 +45,10 @@
Salesperson:
Nothing is lost, everything is moved
Decrease your process time
- We saved hundreds of thousands of dollars with OpenERP.
+ We saved hundreds of thousands of dollars with Odoo.
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index 1146d628ac9..fd2ff86da3b 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -928,8 +928,7 @@ class stock_picking(osv.osv):
'pack_operation_ids': [],
'backorder_id': picking.id,
})
- back_order_name = self.browse(cr, uid, backorder_id, context=context).name
- self.message_post(cr, uid, picking.id, body=_("Back order %s created.") % (back_order_name), context=context)
+ self.message_post(cr, uid, picking.id, body=_("Back order %s created.") % (picking.name), context=context)
move_obj = self.pool.get("stock.move")
move_obj.write(cr, uid, backorder_move_ids, {'picking_id': backorder_id}, context=context)
@@ -1448,7 +1447,7 @@ class stock_production_lot(osv.osv):
'product_id': lambda x, y, z, c: c.get('product_id', False),
}
_sql_constraints = [
- ('name_ref_uniq', 'unique (name, ref)', 'The combination of Serial Number and internal reference must be unique !'),
+ ('name_ref_uniq', 'unique (name, ref, product_id, company_id)', 'The combination of Serial Number, internal reference, Product and Company must be unique !'),
]
def action_traceability(self, cr, uid, ids, context=None):
@@ -1531,9 +1530,9 @@ class stock_move(osv.osv):
res = dict.fromkeys(ids, False)
for move in self.browse(cr, uid, ids, context=context):
if move.state == 'done':
- res[move.id] = [q.id for q in move.quant_ids]
+ res[move.id] = [q.lot_id.id for q in move.quant_ids if q.lot_id]
else:
- res[move.id] = [q.id for q in move.reserved_quant_ids]
+ res[move.id] = [q.lot_id.id for q in move.reserved_quant_ids if q.lot_id]
return res
def _get_product_availability(self, cr, uid, ids, field_name, args, context=None):
@@ -1688,7 +1687,7 @@ class stock_move(osv.osv):
'propagate': fields.boolean('Propagate cancel and split', help='If checked, when this move is cancelled, cancel the linked move too'),
'picking_type_id': fields.many2one('stock.picking.type', 'Picking Type'),
'inventory_id': fields.many2one('stock.inventory', 'Inventory'),
- 'lot_ids': fields.function(_get_lot_ids, type='many2many', relation='stock.quant', string='Lots'),
+ 'lot_ids': fields.function(_get_lot_ids, type='many2many', relation='stock.production.lot', string='Lots'),
'origin_returned_move_id': fields.many2one('stock.move', 'Origin return move', help='move that created the return move', copy=False),
'returned_move_ids': fields.one2many('stock.move', 'origin_returned_move_id', 'All returned moves', help='Optional: all returned moves created from this move'),
'reserved_availability': fields.function(_get_reserved_availability, type='float', string='Quantity Reserved', readonly=True, help='Quantity that has already been reserved for this move'),
@@ -1731,6 +1730,7 @@ class stock_move(osv.osv):
'date_expected': fields.datetime.now,
'procure_method': 'make_to_stock',
'propagate': True,
+ 'partially_available': False,
}
def _check_uom(self, cr, uid, ids, context=None):
@@ -1889,7 +1889,7 @@ class stock_move(osv.osv):
warning.update({
'title': _('Information'),
'message': _("By changing this quantity here, you accept the "
- "new quantity as complete: OpenERP will not "
+ "new quantity as complete: Odoo will not "
"automatically generate a back order.")})
break
@@ -2137,6 +2137,7 @@ class stock_move(osv.osv):
"""
procurement_obj = self.pool.get('procurement.order')
context = context or {}
+ procs_to_check = []
for move in self.browse(cr, uid, ids, context=context):
if move.state == 'done':
raise osv.except_osv(_('Operation Forbidden!'),
@@ -2147,21 +2148,21 @@ class stock_move(osv.osv):
if move.propagate:
procurement_ids = procurement_obj.search(cr, uid, [('move_dest_id', '=', move.id)], context=context)
procurement_obj.cancel(cr, uid, procurement_ids, context=context)
- elif move.move_dest_id:
- #cancel chained moves
- if move.propagate:
- self.action_cancel(cr, uid, [move.move_dest_id.id], context=context)
- # If we have a long chain of moves to be cancelled, it is easier for the user to handle
- # only the last procurement which will go into exception, instead of all procurements
- # along the chain going into exception. We need to check if there are no split moves not cancelled however
- if move.procurement_id:
- proc = move.procurement_id
- if all([x.state == 'cancel' for x in proc.move_ids if x.id != move.id]):
- procurement_obj.write(cr, uid, [proc.id], {'state': 'cancel'})
-
- elif move.move_dest_id.state == 'waiting':
- self.write(cr, uid, [move.move_dest_id.id], {'state': 'confirmed'}, context=context)
- return self.write(cr, uid, ids, {'state': 'cancel', 'move_dest_id': False}, context=context)
+ else:
+ if move.move_dest_id:
+ if move.propagate:
+ self.action_cancel(cr, uid, [move.move_dest_id.id], context=context)
+ elif move.move_dest_id.state == 'waiting':
+ #If waiting, the chain will be broken and we are not sure if we can still wait for it (=> could take from stock instead)
+ self.write(cr, uid, [move.move_dest_id.id], {'state': 'confirmed'}, context=context)
+ if move.procurement_id:
+ # Does the same as procurement check, only eliminating a refresh
+ procs_to_check.append(move.procurement_id.id)
+
+ res = self.write(cr, uid, ids, {'state': 'cancel', 'move_dest_id': False}, context=context)
+ if procs_to_check:
+ procurement_obj.check(cr, uid, procs_to_check, context=context)
+ return res
def _check_package_from_moves(self, cr, uid, ids, context=None):
pack_obj = self.pool.get("stock.quant.package")
@@ -2379,6 +2380,7 @@ class stock_move(osv.osv):
'restrict_lot_id': restrict_lot_id,
'restrict_partner_id': restrict_partner_id,
'split_from': move.id,
+ 'procurement_id': move.procurement_id.id,
'move_dest_id': move.move_dest_id.id,
}
if context.get('source_location_id'):
@@ -2767,7 +2769,7 @@ class stock_warehouse(osv.osv):
'in_type_id': fields.many2one('stock.picking.type', 'In Type'),
'int_type_id': fields.many2one('stock.picking.type', 'Internal Type'),
'crossdock_route_id': fields.many2one('stock.location.route', 'Crossdock Route'),
- 'reception_route_id': fields.many2one('stock.location.route', 'Reception Route'),
+ 'reception_route_id': fields.many2one('stock.location.route', 'Receipt Route'),
'delivery_route_id': fields.many2one('stock.location.route', 'Delivery Route'),
'resupply_from_wh': fields.boolean('Resupply From Other Warehouses'),
'resupply_wh_ids': fields.many2many('stock.warehouse', 'stock_wh_resupply_table', 'supplied_wh_id', 'supplier_wh_id', 'Resupply Warehouses'),
@@ -3069,7 +3071,7 @@ class stock_warehouse(osv.osv):
for pull_rule in pull_rules_list:
pull_obj.create(cr, uid, vals=pull_rule, context=context)
- #update reception route and rules: unlink the existing rules of the warehouse reception route and recreate it
+ #update receipt route and rules: unlink the existing rules of the warehouse receipt route and recreate it
pull_obj.unlink(cr, uid, [pu.id for pu in warehouse.reception_route_id.pull_ids], context=context)
push_obj.unlink(cr, uid, [pu.id for pu in warehouse.reception_route_id.push_ids], context=context)
route_name, values = routes_dict[new_reception_step]
@@ -3079,7 +3081,7 @@ class stock_warehouse(osv.osv):
for push_rule in push_rules_list:
push_obj.create(cr, uid, vals=push_rule, context=context)
for pull_rule in pull_rules_list:
- #all pull rules in reception route are mto, because we don't want to wait for the scheduler to trigger an orderpoint on input location
+ #all pull rules in receipt route are mto, because we don't want to wait for the scheduler to trigger an orderpoint on input location
pull_rule['procure_method'] = 'make_to_order'
pull_obj.create(cr, uid, vals=pull_rule, context=context)
@@ -3133,7 +3135,7 @@ class stock_warehouse(osv.osv):
max_sequence = max_sequence and max_sequence[0]['sequence'] or 0
in_type_id = picking_type_obj.create(cr, uid, vals={
- 'name': _('Receptions'),
+ 'name': _('Receipts'),
'warehouse_id': warehouse.id,
'code': 'incoming',
'sequence_id': in_seq_id,
@@ -3255,9 +3257,9 @@ class stock_warehouse(osv.osv):
customer_loc, supplier_loc = self._get_partner_locations(cr, uid, ids, context=context)
return {
- 'one_step': (_('Reception in 1 step'), []),
- 'two_steps': (_('Reception in 2 steps'), [(warehouse.wh_input_stock_loc_id, warehouse.lot_stock_id, warehouse.int_type_id.id)]),
- 'three_steps': (_('Reception in 3 steps'), [(warehouse.wh_input_stock_loc_id, warehouse.wh_qc_stock_loc_id, warehouse.int_type_id.id), (warehouse.wh_qc_stock_loc_id, warehouse.lot_stock_id, warehouse.int_type_id.id)]),
+ 'one_step': (_('Receipt in 1 step'), []),
+ 'two_steps': (_('Receipt in 2 steps'), [(warehouse.wh_input_stock_loc_id, warehouse.lot_stock_id, warehouse.int_type_id.id)]),
+ 'three_steps': (_('Receipt in 3 steps'), [(warehouse.wh_input_stock_loc_id, warehouse.wh_qc_stock_loc_id, warehouse.int_type_id.id), (warehouse.wh_qc_stock_loc_id, warehouse.lot_stock_id, warehouse.int_type_id.id)]),
'crossdock': (_('Cross-Dock'), [(warehouse.wh_input_stock_loc_id, warehouse.wh_output_stock_loc_id, warehouse.int_type_id.id), (warehouse.wh_output_stock_loc_id, customer_loc, warehouse.out_type_id.id)]),
'ship_only': (_('Ship Only'), [(warehouse.lot_stock_id, customer_loc, warehouse.out_type_id.id)]),
'pick_ship': (_('Pick + Ship'), [(warehouse.lot_stock_id, warehouse.wh_output_stock_loc_id, warehouse.pick_type_id.id), (warehouse.wh_output_stock_loc_id, customer_loc, warehouse.out_type_id.id)]),
@@ -3310,7 +3312,7 @@ class stock_warehouse(osv.osv):
def _check_reception_resupply(self, cr, uid, warehouse, new_location, context=None):
"""
- Will check if the resupply routes to this warehouse follow the changes of number of reception steps
+ Will check if the resupply routes to this warehouse follow the changes of number of receipt steps
"""
#Check routes that are being delivered by this warehouse and change the rule coming from transit location
route_obj = self.pool.get("stock.location.route")
@@ -3932,7 +3934,8 @@ class stock_warehouse_orderpoint(osv.osv):
continue
procurement_qty = uom_obj._compute_qty_obj(cr, uid, procurement.product_uom, procurement.product_qty, procurement.product_id.uom_id, context=context)
for move in procurement.move_ids:
- if move.state not in ('draft', 'cancel'):
+ #need to add the moves in draft as they aren't in the virtual quantity + moves that have not been created yet
+ if move.state not in ('draft'):
#if move is already confirmed, assigned or done, the virtual stock is already taking this into account so it shouldn't be deducted
procurement_qty -= move.product_qty
qty += procurement_qty
@@ -3948,7 +3951,6 @@ class stock_warehouse_orderpoint(osv.osv):
for rule in self.browse(cr, uid, ids, context=context):
if rule.product_id.uom_id.category_id.id != rule.product_uom.category_id.id:
return False
-
return True
def action_view_proc_to_process(self, cr, uid, ids, context=None):
@@ -3972,10 +3974,10 @@ class stock_warehouse_orderpoint(osv.osv):
'product_id': fields.many2one('product.product', 'Product', required=True, ondelete='cascade', domain=[('type', '=', 'product')]),
'product_uom': fields.related('product_id', 'uom_id', type='many2one', relation='product.uom', string='Product Unit of Measure', readonly=True, required=True),
'product_min_qty': fields.float('Minimum Quantity', required=True,
- help="When the virtual stock goes below the Min Quantity specified for this field, OpenERP generates "\
+ help="When the virtual stock goes below the Min Quantity specified for this field, Odoo generates "\
"a procurement to bring the forecasted quantity to the Max Quantity."),
'product_max_qty': fields.float('Maximum Quantity', required=True,
- help="When the virtual stock goes below the Min Quantity, OpenERP generates "\
+ help="When the virtual stock goes below the Min Quantity, Odoo generates "\
"a procurement to bring the forecasted quantity to the Quantity specified as Max Quantity."),
'qty_multiple': fields.integer('Qty Multiple', required=True,
help="The procurement quantity will be rounded up to this multiple."),
@@ -4146,7 +4148,7 @@ class stock_picking_type(osv.osv):
# Statistics for the kanban view
'last_done_picking': fields.function(_get_tristate_values,
- type='any',
+ type='char',
string='Last 10 Done Pickings'),
'count_picking_draft': fields.function(_get_picking_count,
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index daac80a6c7a..43e8c893be4 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -300,58 +300,6 @@
-
+
@@ -168,6 +190,14 @@
diff --git a/addons/survey/views/survey_templates.xml b/addons/survey/views/survey_templates.xml
index de186b85b92..b49a48d2a53 100644
--- a/addons/survey/views/survey_templates.xml
+++ b/addons/survey/views/survey_templates.xml
@@ -8,7 +8,7 @@
-
-
+
- Other Docs
-
Useful Links
diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js
index f5f8129d502..b0e22f918c8 100644
--- a/addons/web/static/src/js/chrome.js
+++ b/addons/web/static/src/js/chrome.js
@@ -185,12 +185,12 @@ instance.web.Dialog = instance.web.Widget.extend({
close: function(reason) {
if (this.dialog_inited && !this.__tmp_dialog_hiding) {
$('.tooltip').remove(); //remove open tooltip if any to prevent them staying when modal has disappeared
- this.trigger("closing", reason);
if (this.$el.is(":data(bs.modal)")) { // may have been destroyed by closing signal
this.__tmp_dialog_hiding = true;
this.$dialog_box.modal('hide');
this.__tmp_dialog_hiding = undefined;
}
+ this.trigger("closing", reason);
}
},
_closing: function() {
@@ -252,7 +252,7 @@ instance.web.CrashManager = instance.web.Class.extend({
return;
}
if (error.data.name === "openerp.http.SessionExpiredException" || error.data.name === "werkzeug.exceptions.Forbidden") {
- this.show_warning({type: "Session Expired", data: { message: _t("Your OpenERP session expired. Please refresh the current web page.") }});
+ this.show_warning({type: "Session Expired", data: { message: _t("Your Odoo session expired. Please refresh the current web page.") }});
return;
}
if (error.data.exception_type === "except_osv" || error.data.exception_type === "warning" || error.data.exception_type === "access_error") {
@@ -270,7 +270,7 @@ instance.web.CrashManager = instance.web.Class.extend({
}
new instance.web.Dialog(this, {
size: 'medium',
- title: "OpenERP " + (_.str.capitalize(error.type) || "Warning"),
+ title: "Odoo " + (_.str.capitalize(error.type) || "Warning"),
buttons: [
{text: _t("Ok"), click: function() { this.parents('.modal').modal('hide'); }}
],
@@ -285,7 +285,7 @@ instance.web.CrashManager = instance.web.Class.extend({
this.parents('.modal').modal('hide');
};
new instance.web.Dialog(this, {
- title: "OpenERP " + _.str.capitalize(error.type),
+ title: "Odoo " + _.str.capitalize(error.type),
buttons: buttons
}, QWeb.render('CrashManager.error', {session: instance.session, error: error})).open();
},
@@ -337,7 +337,7 @@ instance.web.RedirectWarningHandler = instance.web.Dialog.extend(instance.web.Ex
new instance.web.Dialog(this, {
size: 'medium',
- title: "OpenERP " + (_.str.capitalize(error.type) || "Warning"),
+ title: "Odoo " + (_.str.capitalize(error.type) || "Warning"),
buttons: [
{text: _t("Ok"), click: function() { self.$el.parents('.modal').modal('hide'); self.destroy();}},
{text: error.data.arguments[2],
@@ -910,7 +910,7 @@ instance.web.Menu = instance.web.Widget.extend({
}
// add a tooltip to cropped menu items
this.$secondary_menus.find('.oe_secondary_submenu li a span').each(function() {
- $(this).tooltip(this.scrollWidth > this.clientWidth ? {title: $(this).text().trim(), placement: 'auto right'} :'destroy');
+ $(this).tooltip(this.scrollWidth > this.clientWidth ? {title: $(this).text().trim(), placement: 'right'} :'destroy');
});
},
/**
@@ -1190,7 +1190,7 @@ instance.web.WebClient = instance.web.Client.extend({
this._current_state = null;
this.menu_dm = new instance.web.DropMisordered();
this.action_mutex = new $.Mutex();
- this.set('title_part', {"zopenerp": "OpenERP"});
+ this.set('title_part', {"zopenerp": "Odoo"});
},
start: function() {
var self = this;
diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js
index 1bfdc86fb5a..566179c2a38 100644
--- a/addons/web/static/src/js/search.js
+++ b/addons/web/static/src/js/search.js
@@ -782,6 +782,7 @@ instance.web.SearchViewDrawer = instance.web.Widget.extend({
start: function() {
var self = this;
+ if (this.searchview.headless) return $.when(this._super(), this.searchview.ready);
var filters_ready = this.searchview.fields_view_get
.then(this.proxy('prepare_filters'));
return $.when(this._super(), filters_ready).then(function () {
diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js
index 8a6c8def9ca..ac51a3445f2 100644
--- a/addons/web/static/src/js/views.js
+++ b/addons/web/static/src/js/views.js
@@ -691,8 +691,8 @@ instance.web.ViewManager = instance.web.Widget.extend({
var container = this.$el.find("> div > div > .oe_view_manager_body > .oe_view_manager_view_" + view_type);
var view_promise = controller.appendTo(container);
this.views[view_type].controller = controller;
- this.views[view_type].deferred.resolve(view_type);
return $.when(view_promise).done(function() {
+ self.views[view_type].deferred.resolve(view_type);
if (self.searchview
&& self.flags.auto_search
&& view.controller.searchable !== false) {
@@ -1122,7 +1122,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({
);
}
- $.when(defs).done(function() {
+ $.when(this.views[this.active_view] ? this.views[this.active_view].deferred : $.when(), defs).done(function() {
self.views[self.active_view].controller.do_load_state(state, warm);
});
},
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 2cce789480c..d77b8d3df46 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -85,7 +85,7 @@
- Check this box to evaluate OpenERP.
+ Check this box to evaluate Odoo.
@@ -372,7 +372,7 @@
- OpenERP is a trademark of the OpenERP SA Company.
<script type="text/javascript" src="/web/webclient/js"></script>
diff --git a/addons/web_graph/static/src/css/graph.css b/addons/web_graph/static/src/css/graph.css
index 6bc628f2eb7..fd6735961e1 100644
--- a/addons/web_graph/static/src/css/graph.css
+++ b/addons/web_graph/static/src/css/graph.css
@@ -113,6 +113,7 @@ span.field-selection {
border-radius: 3px;
}
+
.graph_widget .dropdown-menu li a, .graph_widget .dropdown-menu li a:hover, .graph_widget .dropdown-menu li a:focus {
color: black;
text-decoration: none;
@@ -124,3 +125,41 @@ th.measure_row {
padding:0px 5px 0px 5px ;
margin:0;
}
+
+
+.graph-dropdown-submenu {
+ position: relative;
+}
+
+.graph-dropdown-submenu>.dropdown-menu {
+ top: 0;
+ left: 100%;
+ margin-top: -6px;
+ margin-left: -1px;
+ -webkit-border-radius: 0 6px 6px 6px;
+ -moz-border-radius: 0 6px 6px;
+ border-radius: 0 6px 6px 6px;
+}
+
+.graph-dropdown-submenu:hover>.dropdown-menu {
+ display: block;
+}
+
+.graph-dropdown-submenu>a:after {
+ display: block;
+ content: " ";
+ float: right;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+ border-width: 5px 0 5px 5px;
+ border-left-color: #ccc;
+ margin-top: 5px;
+ margin-right: -10px;
+}
+
+.graph-dropdown-submenu:hover>a:after {
+ border-left-color: #fff;
+}
+
diff --git a/addons/web_graph/static/src/js/graph_widget.js b/addons/web_graph/static/src/js/graph_widget.js
index 59f0af95882..db33e567b42 100644
--- a/addons/web_graph/static/src/js/graph_widget.js
+++ b/addons/web_graph/static/src/js/graph_widget.js
@@ -57,7 +57,7 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
return this.model.call('fields_get', []).then(function (f) {
self.fields = f;
self.fields.__count = {field:'__count', type: 'integer', string:_t('Quantity')};
- self.important_fields = self.get_search_fields();
+ self.groupby_fields = self.get_groupby_fields();
self.measure_list = self.get_measures();
self.add_measures_to_options();
self.pivot_options.row_groupby = self.create_field_values(self.pivot_options.row_groupby || []);
@@ -81,6 +81,25 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
});
},
+ get_groupby_fields: function () {
+ var search_fields = this.get_search_fields(),
+ search_field_names = _.pluck(search_fields, 'field'),
+ other_fields = [],
+ groupable_types = ['many2one', 'char', 'boolean', 'selection', 'date', 'datetime'];
+
+ _.each(this.fields, function (val, key) {
+ if (!_.contains(search_field_names, key) &&
+ _.contains(groupable_types, val.type) &&
+ val.store === true) {
+ other_fields.push({
+ field: key,
+ string: val.string,
+ });
+ }
+ });
+ return search_fields.concat(other_fields);
+ },
+
// this method gets the fields that appear in the search view, under the
// 'Groupby' heading
get_search_fields: function () {
@@ -196,7 +215,7 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
create_field_value: function (f) {
var field = (_.contains(f, ':')) ? f.split(':')[0] : f,
- groupby_field = _.findWhere(this.important_fields, {field:field}),
+ groupby_field = _.findWhere(this.groupby_fields, {field:field}),
string = groupby_field ? groupby_field.string : this.fields[field].string,
result = {field: f, string: string, type: this.fields[field].type };
@@ -309,11 +328,11 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
this.expand(id);
return;
}
- if (!this.important_fields.length) {
+ if (!this.groupby_fields.length) {
return;
}
- var fields = _.map(this.important_fields, function (field) {
+ var fields = _.map(this.groupby_fields, function (field) {
return {id: field.field, value: field.string, type:self.fields[field.field.split(':')[0]].type};
});
if (this.dropdown) {
@@ -324,7 +343,7 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
this.dropdown.css({position:'absolute',
left:event.originalEvent.layerX,
top:event.originalEvent.layerY});
- this.$('.field-selection').next('.dropdown-menu').toggle();
+ this.$('.field-selection').next('.dropdown-menu').first().toggle();
},
@@ -423,23 +442,22 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
build_headers: function () {
var pivot = this.pivot,
nbr_measures = pivot.measures.length,
- height = _.max(_.map(pivot.cols.headers, function(g) {return g.path.length;})),
+ height = _.max(_.map(pivot.cols.headers, function(g) {return g.path.length;})) + 1,
rows = [];
_.each(pivot.cols.headers, function (col) {
- if (col.path.length === 0) { return;}
var cell_width = nbr_measures * (col.expanded ? pivot.get_ancestor_leaves(col).length : 1),
- cell_height = col.expanded ? 1 : height - col.path.length + 1,
+ cell_height = col.expanded ? 1 : height - col.path.length,
cell = {width: cell_width, height: cell_height, title: col.title, id: col.id, expanded: col.expanded};
- if (rows[col.path.length - 1]) {
- rows[col.path.length - 1].push(cell);
+ if (rows[col.path.length]) {
+ rows[col.path.length].push(cell);
} else {
- rows[col.path.length - 1] = [cell];
+ rows[col.path.length] = [cell];
}
});
if (pivot.get_cols_leaves().length > 1) {
- rows[0].push({width: nbr_measures, height: height, title: _t('Total'), id: pivot.main_col().id });
+ rows[0].push({width: nbr_measures, height: height, title: ' ', id: pivot.main_col().id });
}
if (pivot.cols.headers.length === 1) {
rows = [[{width: nbr_measures, height: 1, title: _t('Total'), id: pivot.main_col().id, expanded: false}]];
diff --git a/addons/web_graph/static/src/xml/web_graph.xml b/addons/web_graph/static/src/xml/web_graph.xml
index 81804e5a9b1..828d184dc24 100644
--- a/addons/web_graph/static/src/xml/web_graph.xml
+++ b/addons/web_graph/static/src/xml/web_graph.xml
@@ -57,35 +57,22 @@
OpenERP Web Client
+Odoo Web Client
To get more information, visit the OpenERP Official Website.
+To get more information, visit the Odoo Official Website.
Organize, promote and sell events online. Whether you organize - meetings, conferences, trainings or webinars, OpenERP gives you + meetings, conferences, trainings or webinars, Odoo gives you all the features you need to manage your events.
- OpenERP's unique 'edit inline' approach makes website + Odoo's unique 'edit inline' approach makes website creation surprisingly easy. "Want to introduce a speaker? to change the price of a ticket? to update a banner? promote sponsors?" just click and change. @@ -72,11 +72,11 @@
- Get a clear visibility of your sales funnel. OpenERP's Google + Get a clear visibility of your sales funnel. Odoo's Google Analytics trackers are configured by default to track all kind of events related to shopping carts, call-to-actions, etc.
- As OpenERP marketing tools (mass mailing, campaigns, etc) are also + As Odoo marketing tools (mass mailing, campaigns, etc) are also linked with Google Analytics, you get a full view of your business.
Themes are awesome and easy to design. You don't need to develop @@ -139,7 +139,7 @@
SEO tools are ready to use, with no configuration required. - OpenERP suggests keywords according to Google most searched + Odoo suggests keywords according to Google most searched terms, Google Analytics tracks your shopping cart events and sitemap are created automatically.
@@ -156,7 +156,7 @@
- Create new landing pages easily with the OpenERP inline edition + Create new landing pages easily with the Odoo inline edition feature. Send visitors of your different marketing campaigns to event landing pages to optimize conversions.
diff --git a/addons/website_event_track/data/event_demo.xml b/addons/website_event_track/data/event_demo.xml index 784d962e471..4df98815c19 100644 --- a/addons/website_event_track/data/event_demo.xml +++ b/addons/website_event_track/data/event_demo.xml @@ -77,10 +77,10 @@ develops software to help develop websites. He sold his first company at 30 years old and manage to grow OpenCorp from 1 to 55 employees mostly by reselling services on - OpenERP. + Odoo.Ayaan is the author of several books, including Amazon best seller - "How OpenERP will change the business world!". + "How Odoo will change the business world!".
diff --git a/addons/website_event_track/data/website_event_track_demo.xml b/addons/website_event_track/data/website_event_track_demo.xml index b54d114e127..3279cf80a5d 100644 --- a/addons/website_event_track/data/website_event_track_demo.xml +++ b/addons/website_event_track/data/website_event_track_demo.xml @@ -32,7 +32,7 @@Before you ask - please make sure to search for a similar question. You can @@ -135,7 +135,7 @@
The goal of this site is create a relevant knowledge base that would answer - questions related to OpenERP. + questions related to Odoo.
Therefore questions and answers can be edited like wiki pages by experienced users of
this site in order to improve the overall quality of the knowledge base content.
diff --git a/addons/website_forum/data/forum_demo.xml b/addons/website_forum/data/forum_demo.xml
index 85a8a8512bf..1223c950152 100644
--- a/addons/website_forum/data/forum_demo.xml
+++ b/addons/website_forum/data/forum_demo.xml
@@ -29,9 +29,9 @@
There seems to be an error with your request.
', + 'message': '%s
' % _('There seems to be an error with your request.'), } tx_ids = request.registry['payment.transaction'].search( @@ -672,7 +672,7 @@ class website_sale(http.Controller): if order.amount_total: return { 'state': 'error', - 'message': 'There seems to be an error with your request.
', + 'message': '%s
' % _('There seems to be an error with your request.'), } else: state = 'done' @@ -682,15 +682,15 @@ class website_sale(http.Controller): tx = request.registry['payment.transaction'].browse(cr, uid, tx_ids[0], context=context) state = tx.state if state == 'done': - message = 'Your payment has been received.
' + message = '%s
' % _('Your payment has been received.') elif state == 'cancel': - message = 'The payment seems to have been canceled.
' + message = '%s
' % _('The payment seems to have been canceled.') elif state == 'pending' and tx.acquirer_id.validation == 'manual': - message = 'Your transaction is waiting confirmation.
' + message = '%s
' % _('Your transaction is waiting confirmation.') if tx.acquirer_id.post_msg: message += tx.acquirer_id.post_msg else: - message = 'Your transaction is waiting confirmation.
' + message = '%s
' % _('Your transaction is waiting confirmation.') validation = tx.acquirer_id.validation return { @@ -820,9 +820,22 @@ class website_sale(http.Controller): product = product_obj.browse(request.cr, request.uid, id, context=request.context) return product.write({'website_size_x': x, 'website_size_y': y}) + def order_lines_2_google_api(self, order_lines): + """ Transforms a list of order lines into a dict for google analytics """ + ret = [] + for line in order_lines: + ret.append({ + 'id': line.order_id and line.order_id.id, + 'name': line.product_id.categ_id and line.product_id.categ_id.name or '-', + 'sku': line.product_id.id, + 'quantity': line.product_uom_qty, + 'price': line.price_unit, + }) + return ret + @http.route(['/shop/tracking_last_order'], type='json', auth="public") def tracking_cart(self, **post): - """ return JS code for google analytics""" + """ return data about order in JSON needed for google analytics""" cr, uid, context = request.cr, request.uid, request.context ret = {} sale_order_id = request.session.get('sale_last_order_id') @@ -834,16 +847,7 @@ class website_sale(http.Controller): 'revenue': order.amount_total, 'currency': order.currency_id.name } - ret['lines'] = [] - for line in order.order_line: - if not line.is_delivery: - ret['lines'].append({ - 'id': line.order_id and line.order_id.id, - 'name': line.product_id.categ_id and line.product_id.categ_id.name or '-', - 'sku': line.product_id.id, - 'quantity': line.product_uom_qty, - 'price': line.price_unit, - }) + ret['lines'] = self.order_lines_2_google_api(order.order_line) return ret # vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/website_sale/static/description/index.html b/addons/website_sale/static/description/index.html index 8a006ff9c56..e86260cd9a0 100644 --- a/addons/website_sale/static/description/index.html +++ b/addons/website_sale/static/description/index.html @@ -11,7 +11,7 @@- OpenERP e-Commerce is unlike anything you have ever seen before. + Odoo e-Commerce is unlike anything you have ever seen before. Get an awesome catalog of products and great product description pages.
@@ -31,7 +31,7 @@
- OpenERP's unique 'edit inline' and building blocks approach makes + Odoo's unique 'edit inline' and building blocks approach makes product pages creation surprisingly easy. "Want to change the price of a product? or put it in bold? Want to add a banner for a specific product?" just click and change. What you see is @@ -62,7 +62,7 @@ products related to what the shopper put in his cart. (e.g. accessories)
- OpenERP's upselling algorythm allows you to show visitors + Odoo's upselling algorythm allows you to show visitors similar but more expensive products than the one in view, with incentives.
@@ -80,11 +80,11 @@
- Get a clear visibility of your sales funnel. OpenERP's Google + Get a clear visibility of your sales funnel. Odoo's Google Analytics trackers are configured by default to track all kind of events related to shopping carts, call-to-actions, etc.
- As OpenERP marketing tools (mass mailing, campaigns, etc) are also + As Odoo marketing tools (mass mailing, campaigns, etc) are also linked with Google Analytics, you get a complete view of your business.
Get your website translated in multiple languages with no effort. - OpenERP proposes and propagates translations automatically + Odoo proposes and propagates translations automatically across pages.
Our translation "on demand" features allows you to benefit from @@ -153,7 +153,7 @@SEO tools are ready to use, with no configuration required. - OpenERP suggests keywords according to Google most searched + Odoo suggests keywords according to Google most searched terms, Google Analytics tracks your shopping cart events, sitemap are created automatically for Google indexation, etc.
@@ -170,7 +170,7 @@
- Create new landing pages easily with the OpenERP inline edition + Create new landing pages easily with the Odoo inline edition feature. Send visitors of your different marketing campaigns to specific landing pages to optimize conversions.
@@ -214,14 +214,14 @@- Benefit from the power of OpenERP, in your online store: a + Benefit from the power of Odoo, in your online store: a powerfull tax engine, flexible pricing structures, a real inventory management solution, a reseller interface, support for products with different behaviours; physical goods, events, services, variants and options, etc.
You don't need to interface with your warehouse, sales or - accounting software. Everything is integrated with OpenERP. No + accounting software. Everything is integrated with Odoo. No pain, real time.
- If you use the accounting application of OpenERP, journals and accounts will be created automatically based on these data. + If you use the accounting application of Odoo, journals and accounts will be created automatically based on these data.
diff --git a/openerp/addons/base/res/res_company.py b/openerp/addons/base/res/res_company.py index 1a83e8d8465..fc0c442c493 100644 --- a/openerp/addons/base/res/res_company.py +++ b/openerp/addons/base/res/res_company.py @@ -371,7 +371,7 @@ class res_company(osv.osv):- OpenERP helps you easily track all activities related to + Odoo helps you easily track all activities related to a customer; discussions, history of business opportunities, documents, etc.
@@ -468,7 +468,7 @@Click to add a contact in your address book.
- OpenERP helps you easily track all activities related to + Odoo helps you easily track all activities related to a customer: discussions, history of business opportunities, documents, etc.
@@ -488,7 +488,7 @@Click to add a contact in your address book.
- OpenERP helps you easily track all activities related to + Odoo helps you easily track all activities related to a supplier: discussions, history of purchases, documents, etc.
diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index fdf453ae4f3..f1ddf4f1b42 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -126,6 +126,7 @@ class res_groups(osv.osv): _('The name of the group can not start with "-"')) res = super(res_groups, self).write(cr, uid, ids, vals, context=context) self.pool['ir.model.access'].call_cache_clearing_methods(cr) + self.pool['res.users'].has_group.clear_cache(self.pool['res.users']) return res class res_users(osv.osv): @@ -225,8 +226,14 @@ class res_users(osv.osv): def _get_company(self,cr, uid, context=None, uid2=False): if not uid2: uid2 = uid - user = self.pool['res.users'].browse(cr, uid, uid2, context) - return user.company_id.id + # Use read() to compute default company, and pass load=_classic_write to + # avoid useless name_get() calls. This will avoid prefetching fields + # while computing default values for new db columns, as the + # db backend may not be fully initialized yet. + user_data = self.pool['res.users'].read(cr, uid, uid2, ['company_id'], + context=context, load='_classic_write') + comp_id = user_data['company_id'] + return comp_id or False def _get_companies(self, cr, uid, context=None): c = self._get_company(cr, uid, context) @@ -326,11 +333,12 @@ class res_users(osv.osv): if id in self._uid_cache[db]: del self._uid_cache[db][id] self.context_get.clear_cache(self) + self.has_group.clear_cache(self) return res def unlink(self, cr, uid, ids, context=None): if 1 in ids: - raise osv.except_osv(_('Can not remove root user!'), _('You can not remove the admin user as it is used internally for resources created by OpenERP (updates, module installation, ...)')) + raise osv.except_osv(_('Can not remove root user!'), _('You can not remove the admin user as it is used internally for resources created by Odoo (updates, module installation, ...)')) db = cr.dbname if db in self._uid_cache: for id in ids: @@ -508,6 +516,7 @@ class res_users(osv.osv): 'target': 'new', } + @tools.ormcache(skiparg=2) def has_group(self, cr, uid, group_ext_id): """Checks whether user belongs to given group. diff --git a/openerp/addons/base/tests/test_mail_examples.py b/openerp/addons/base/tests/test_mail_examples.py index 6886ce86baa..0760bd38bf8 100644 --- a/openerp/addons/base/tests/test_mail_examples.py +++ b/openerp/addons/base/tests/test_mail_examples.py @@ -897,7 +897,7 @@ BUG2 = """