diff --git a/addons/account/account.py b/addons/account/account.py index 5de913c45a7..8ef5004df04 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -1215,7 +1215,8 @@ class account_move(osv.osv): # # TODO: Check if period is closed ! # - def create(self, cr, uid, vals, context={}): + def create(self, cr, uid, vals, context=None): + context = context or {} if 'line_id' in vals and context.get('copy'): for l in vals['line_id']: if not l[0]: @@ -1256,6 +1257,7 @@ class account_move(osv.osv): return result def copy(self, cr, uid, id, default={}, context={}): + context = context or {} default.update({ 'state':'draft', 'name':'/', @@ -1265,7 +1267,8 @@ class account_move(osv.osv): }) return super(account_move, self).copy(cr, uid, id, default, context) - def unlink(self, cr, uid, ids, context={}, check=True): + def unlink(self, cr, uid, ids, context=None, check=True): + context = context or {} toremove = [] obj_move_line = self.pool.get('account.move.line') for move in self.browse(cr, uid, ids, context): @@ -1605,7 +1608,7 @@ class account_tax_code(osv.osv): if isinstance(ids, (int, long)): ids = [ids] reads = self.read(cr, uid, ids, ['name','code'], context, load='_classic_write') - return [(x['id'], (x['code'] and x['code'] + ' - ' or '') + x['name']) \ + return [(x['id'], (x['code'] and (x['code'] + ' - ') or '') + x['name']) \ for x in reads] def _default_company(self, cr, uid, context={}): @@ -2544,9 +2547,17 @@ class wizard_multi_charts_accounts(osv.osv_memory): if ids: return ids[0] return False + + def _get_default_accounts(self, cr, uid, context=None): + accounts = [{'acc_name':'Current','account_type':'bank'}, + {'acc_name':'Deposit','account_type':'bank'}, + {'acc_name':'Cash','account_type':'cash'}] + return accounts + _defaults = { 'company_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, [uid], c)[0].company_id.id, 'chart_template_id': _get_chart, + 'bank_accounts_id': _get_default_accounts, 'code_digits': 6, 'seq_journal': True } diff --git a/addons/account/account_analytic_line.py b/addons/account/account_analytic_line.py index a982ca51182..f3c2b71122f 100644 --- a/addons/account/account_analytic_line.py +++ b/addons/account/account_analytic_line.py @@ -24,8 +24,6 @@ import time from osv import fields from osv import osv from tools.translate import _ -import tools -from tools import config class account_analytic_line(osv.osv): _inherit = 'account.analytic.line' @@ -82,12 +80,13 @@ class account_analytic_line(osv.osv): return {} product_obj = self.pool.get('product.product') analytic_journal_obj =self.pool.get('account.analytic.journal') + company_obj = self.pool.get('res.company') + product_price_type_obj = self.pool.get('product.price.type') j_id = analytic_journal_obj.browse(cr, uid, journal_id, context=context) prod = product_obj.browse(cr, uid, prod_id) if not company_id: company_id = j_id.company_id.id result = 0.0 - is_purchase = False if j_id.type <> 'sale': a = prod.product_tmpl_id.property_account_expense.id @@ -99,8 +98,6 @@ class account_analytic_line(osv.osv): 'for this product: "%s" (id:%d)') % \ (prod.name, prod.id,)) amount_unit = prod.price_get('standard_price', context)[prod.id] - is_purchase = True - else: a = prod.product_tmpl_id.property_account_income.id if not a: @@ -128,9 +125,8 @@ class account_analytic_line(osv.osv): if pricetype.field == 'list_price': flag = True amount_unit = prod.price_get(pricetype.field, context)[prod.id] - amount = amount_unit*unit_amount or 1.0 prec = self.pool.get('decimal.precision').precision_get(cr, uid, 'Account') - amount = amount_unit*unit_amount or 1.0 + amount = amount_unit*unit or 1.0 result = round(amount, prec) if not flag: result *= -1 diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index 0b240663943..cf50a1ab62e 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -378,7 +378,7 @@ class account_bank_statement(osv.osv): self.create_move_from_st_line(cr, uid, st_line.id, company_currency_id, st_line_number, context) self.write(cr, uid, [st.id], {'name': st_number}, context=context) - self.log(cr, uid, st.id, 'Statement %s is confirmed and entries are created.' % st_number) + self.log(cr, uid, st.id, _('Statement %s is confirmed, journal items are created.') % (st_number,)) done.append(st.id) return self.write(cr, uid, ids, {'state':'confirm'}, context=context) @@ -501,4 +501,4 @@ class account_bank_statement_line(osv.osv): account_bank_statement_line() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# 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 18484a7d1c8..28d2f5a06a6 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -430,7 +430,7 @@ [('type','=','out_invoice')] {'type':'out_invoice', 'journal_type': 'sale'} - Most of customer invoices are automatically generated in draft mode by OpenERP flows, following a purchase order for instance. Review, confirm or cancel, pay or refund your customers' invoices here. A manual invoice can be created here. + Customer Invoices allows you create and manage invoices issued to your customers. OpenERP generates draft of invoices automatically so that you only have to confirm them before sending them to your customers. @@ -458,7 +458,7 @@ [('type','=','in_invoice')] {'type':'in_invoice', 'journal_type': 'purchase'} - Proposal for supplier invoices are usually automatically generate by OpenERP, following a procurement order or a production order for instance. To consult and to check for, or to manually create a customer invoice, use this menu. You can review, confirm or cancel, pay or refund an invoice from the view from of the invoices. + Supplier Invoices allows you to enter and manage invoices issued by your suppliers. OpenERP generates draft of supplier invoices automatically so that you can control what you received from your supplier according to what you purchased or received. @@ -471,7 +471,7 @@ [('type','=','out_refund')] {'type':'out_refund', 'journal_type': 'sale_refund'} - A customer refund is a credit note to your customer that cancel invoice or a part of it. + Customer Refunds helps you manage the credit notes issued/to be issued for your customers. A refund invoice is a document that cancels an invoice or a part of it. You can easily generate refunds and reconcile them from the invoice form. @@ -510,22 +510,5 @@ res_model="account.invoice" src_model="account.journal"/> - - - - diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 49de367122b..8217522715e 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -635,6 +635,7 @@ [('journal_id.type', '=', 'bank')] {'journal_type':'bank'} + A bank statement is a summary of all financial transactions occurring over a given period of time on a deposit account, a credit card, or any other type of account. Start by encoding the starting and closing balance, then record all lines of your statement. When you are in the Payment column of the a line, you can press F1 to open the reconciliation form. @@ -956,7 +957,7 @@ [('parent_id','=',False)] tree - Chart of Taxes is a tree view reflecting the structure of the Tax Cases (or tax codes) and shows the current tax situation. The tax chart represents the amount of each area of the tax declaration for your country. It’s presented in a hierarchical structure, which can be modified to fit your needs. + The chart of taxes is used to generate your periodic tax statement. You will see here the taxes with codes related to your legal statement according to your country. diff --git a/addons/account/i18n/mn.po b/addons/account/i18n/mn.po index 7c955886d37..6c82bfecfd2 100644 --- a/addons/account/i18n/mn.po +++ b/addons/account/i18n/mn.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-15 03:35+0000\n" -"Last-Translator: sugi \n" +"PO-Revision-Date: 2010-10-16 07:37+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Mongolian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: account @@ -647,7 +647,7 @@ msgstr "Харилцагчийн төлбөрийн нөхцөл" #. module: account #: view:account.move.reconcile:0 msgid "Account Entry Reconcile" -msgstr "Дансны бичилт гүйцээлт" +msgstr "Дансны бичилт бууралт" #. module: account #: wizard_button:account.move.bank.reconcile,init,open:0 @@ -3119,7 +3119,7 @@ msgstr "Аналитик Журнал" #. module: account #: rml:account.general.ledger:0 msgid "Entry Label" -msgstr "Бичлэгийн нэр" +msgstr "Гүйлгээний нэр" #. module: account #: model:process.transition,note:account.process_transition_paymentreconcile0 @@ -3498,7 +3498,9 @@ msgstr "Өдрийн огноо" msgid "" "The amount expressed in an optional other currency if it is a multi-currency " "entry." -msgstr "Өөр валютаар илэрхийлсэн дүн байна" +msgstr "" +"Хэрэв энэ гүйлгээ гадаад валютаар хийгдсэн бол гүйлгээний дүнг гадаад " +"валютаар илэрхийлнэ." #. module: account #: field:account.tax,parent_id:0 @@ -3599,7 +3601,7 @@ msgstr "Шинэ нийлүүлэгчийн буцаалт" #. module: account #: view:account.model:0 msgid "Entry Model" -msgstr "Гүйлгээний модель" +msgstr "Гүйлгээний загвар" #. module: account #: wizard_field:account.general.ledger.report,checktype,amount_currency:0 @@ -3764,7 +3766,7 @@ msgstr "Биелэх огноо" #. module: account #: view:account.subscription:0 msgid "Entry Subscription" -msgstr "захиалгын бичилт" +msgstr "Гүйлгээний тэмдэглэл" #. module: account #: selection:account.print.journal.report,init,sort_selection:0 @@ -4126,6 +4128,8 @@ msgid "" "You can check this box to mark the entry line as a litigation with the " "associated partner" msgstr "" +"Журналын бичилт нь холбогдох харилцагчийн хувьд маргаантай гэж үзвэл энэ " +"нүдийг сонгох хэрэгтэй" #. module: account #: model:ir.actions.act_window,name:account.action_invoice_tree1 @@ -4478,7 +4482,7 @@ msgstr "Санхүүгийн жилийн дарааллууд" #. module: account #: view:account.model.line:0 msgid "Entry Model Line" -msgstr "Бүртгэл загвар шугам" +msgstr "Гүйлгээний загварын мөр" #. module: account #: view:account.tax.template:0 @@ -4542,7 +4546,7 @@ msgstr "Дансны бичилт" #. module: account #: model:ir.actions.act_window,name:account.act_account_partner_account_move_unreconciled msgid "Receivables & Payables" -msgstr "Авлагын данс болон төлбөр" +msgstr "Авлага & Өглөг" #. module: account #: rml:account.general.ledger:0 @@ -4625,7 +4629,7 @@ msgstr "Нийлүүлэгчийн санхүү бүртгэл" #. module: account #: view:account.analytic.account:0 msgid "Analytic Account Statistics" -msgstr "" +msgstr "Аналитик санхүүгийн статистик" #. module: account #: view:wizard.multi.charts.accounts:0 @@ -4657,7 +4661,7 @@ msgstr "Аналитик дансны мод" #. module: account #: wizard_field:account.aged.trial.balance,init,result_selection:0 msgid "Filter on Partners" -msgstr "" +msgstr "Харилцагч дээр шүүлт хийх" #. module: account #: field:account.tax,price_include:0 @@ -4837,7 +4841,7 @@ msgstr "А/к дугаар" #: model:ir.actions.act_window,name:account.report_account_analytic_journal_tree_month #: model:ir.ui.menu,name:account.report_account_analytic_journal_print_month msgid "Account cost and revenue by journal (This Month)" -msgstr "" +msgstr "Дансны өртөг, орлого журналаар" #. module: account #: selection:account.partner.balance.report,init,result_selection:0 @@ -5036,7 +5040,7 @@ msgstr "Татварын тайлбар" #. module: account #: help:account.invoice,move_id:0 msgid "Link to the automatically generated account moves." -msgstr "" +msgstr "Дансны автомат үүссэн шилжилтүүд рүү холбох" #. module: account #: wizard_field:account.automatic.reconcile,reconcile,reconciled:0 @@ -5058,7 +5062,7 @@ msgstr "/" #: model:process.node,note:account.process_node_invoiceinvoice0 #: model:process.node,note:account.process_node_supplierinvoiceinvoice0 msgid "Have a number and entries are generated" -msgstr "" +msgstr "Үүсгэгдсэн тоо болон бичлэгүүдийг агуулж байна" #. module: account #: rml:account.analytic.account.analytic.check:0 @@ -5094,7 +5098,7 @@ msgstr "Журналын бүтэц" #. module: account #: view:account.subscription.line:0 msgid "Subscription lines" -msgstr "" +msgstr "Бүртгэлийн мөрүүд" #. module: account #: field:account.chart.template,property_account_income:0 @@ -5276,9 +5280,7 @@ msgstr "Томьёолол" #. module: account #: help:account.move.line,currency_id:0 msgid "The optional other currency if it is a multi-currency entry." -msgstr "" -"Тухайн дансны валютаас өөр валютаар бичилт хийх үед хэрэглэгдэх валютын " -"төрөл." +msgstr "Гадаад валютын гүйлгээ бол валютыг сонгоно." #. module: account #: view:account.invoice:0 @@ -5368,7 +5370,7 @@ msgstr "PRO-FORMA" #. module: account #: field:account.move.reconcile,line_partial_ids:0 msgid "Partial Entry lines" -msgstr "" +msgstr "Хэсэгчилсэн журналын бичилт" #. module: account #: help:account.move.line,statement_id:0 @@ -5425,7 +5427,7 @@ msgstr "Төлөлтийн нөхцөл" #. module: account #: selection:account.aged.trial.balance,init,result_selection:0 msgid "Receivable and Payable" -msgstr "" +msgstr "Авлага болон өглөг" #. module: account #: rml:account.account.balance:0 @@ -5528,7 +5530,7 @@ msgstr "Ерөнхий журнал" #: rml:account.third_party_ledger:0 #: rml:account.third_party_ledger_other:0 msgid "Balance" -msgstr "Тэнцэл" +msgstr "Баланс" #. module: account #: rml:account.invoice:0 @@ -5899,7 +5901,7 @@ msgstr "Бичилт тулгах" #. module: account #: field:account.subscription.line,move_id:0 msgid "Entry" -msgstr "Бичилт" +msgstr "Ажил гүйлгээ" #. module: account #: model:process.node,note:account.process_node_paidinvoice0 @@ -6044,7 +6046,7 @@ msgstr "Хэрэглэгч уг дансны гүйлгээг банкны ху #. module: account #: wizard_button:account.subscription.generate,init,generate:0 msgid "Compute Entry Dates" -msgstr "" +msgstr "Гүйлгээний огноо тооцоолол" #. module: account #: view:board.board:0 @@ -6077,7 +6079,7 @@ msgstr "Үнийн нэхэмжлэл" #. module: account #: view:board.board:0 msgid "Aged receivables" -msgstr "Насжилтын авлагын данс" +msgstr "Авлагын насжилт" #. module: account #: model:ir.module.module,shortdesc:account.module_meta_information @@ -6326,7 +6328,7 @@ msgstr "Дансны төрлөөр" #. module: account #: model:ir.model,name:report_account.model_report_aged_receivable msgid "Aged Receivable Till Today" -msgstr "" +msgstr "Өнөөдрийг хүртэлх авлагын насжилт" #. module: account #: model:ir.model,name:report_account.model_report_account_receivable @@ -6368,7 +6370,7 @@ msgstr "Үүсгэх огноо" #: model:ir.actions.act_window,name:report_account.action_aged_receivable_graph #: view:report.aged.receivable:0 msgid "Aged Receivable" -msgstr "Насжилтын авлага" +msgstr "Авлагын насжилт" #. module: account #: view:report.invoice.created:0 diff --git a/addons/account/installer.py b/addons/account/installer.py index b85b2dc21e2..b689697d7a8 100644 --- a/addons/account/installer.py +++ b/addons/account/installer.py @@ -604,8 +604,7 @@ class account_installer(osv.osv_memory): new_paid_tax_code = self.pool.get('account.tax.code').create(cr, uid, vals_paid_tax_code) sales_tax = obj_tax.create(cr, uid, - {'name':'TAX%s%%'%(s_tax*100), - 'description':'TAX%s%%'%(s_tax*100), + {'name':'TAX %s%%'%(s_tax*100), 'amount':s_tax, 'base_code_id':new_tax_code, 'tax_code_id':new_paid_tax_code, @@ -640,8 +639,7 @@ class account_installer(osv.osv_memory): new_paid_tax_code = self.pool.get('account.tax.code').create(cr, uid, vals_paid_tax_code) purchase_tax = obj_tax.create(cr, uid, - {'name':'TAX%s%%'%(p_tax*100), - 'description':'TAX%s%%'%(p_tax*100), + {'name':'TAX %s%%'%(p_tax*100), 'amount':p_tax, 'base_code_id':new_tax_code, 'tax_code_id':new_paid_tax_code, diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 25b2ffffa91..23978296367 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -351,7 +351,7 @@ class account_invoice(osv.osv): if view_type == 'tree': doc = etree.XML(res['arch']) nodes = doc.xpath("//field[@name='partner_id']") - partner_string = 'Customer' + partner_string = _('Customer') if context.get('type', 'out_invoice') in ('in_invoice', 'in_refund'): partner_string = _('Supplier') for node in nodes: @@ -363,7 +363,7 @@ class account_invoice(osv.osv): try: res = super(account_invoice, self).create(cr, uid, vals, context) for inv_id, name in self.name_get(cr, uid, [res], context=context): - message = _('Invoice ') + " '" + name + "' "+ _("is waiting for validation.") + message = _("Invoice '%s' is waiting for validation.") % name self.log(cr, uid, inv_id, message) return res except Exception, e: @@ -375,6 +375,9 @@ class account_invoice(osv.osv): def confirm_paid(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'paid'}, context=context) + for inv_id, name in self.name_get(cr, uid, ids, context=context): + message = _("Invoice '%s' is paid.") % name + self.log(cr, uid, inv_id, message) return True def unlink(self, cr, uid, ids, context=None): @@ -674,7 +677,7 @@ class account_invoice(osv.osv): return (ref or '').replace('/','') def _get_analytic_lines(self, cr, uid, id): - inv = self.browse(cr, uid, [id])[0] + inv = self.browse(cr, uid, id) cur_obj = self.pool.get('res.currency') company_currency = inv.company_id.currency_id.id @@ -690,6 +693,8 @@ class account_invoice(osv.osv): ref = inv.reference else: ref = self._convert_ref(cr, uid, inv.number) + if not inv.journal_id.analytic_journal_id: + raise osv.except_osv(_('No Analytic Journal !'),_("You have to define an analytic journal on the '%s' journal!") % (inv.journal_id.name,)) il['analytic_lines'] = [(0,0, { 'name': il['name'], 'date': inv['date_invoice'], @@ -699,7 +704,7 @@ class account_invoice(osv.osv): 'product_id': il['product_id'], 'product_uom_id': il['uos_id'], 'general_account_id': il['account_id'], - 'journal_id': self._get_journal_analytic(cr, uid, inv.type), + 'journal_id': inv.journal_id.analytic_journal_id.id, 'ref': ref, })] return iml @@ -1218,12 +1223,13 @@ class account_invoice(osv.osv): inv_id, name = self.name_get(cr, uid, [invoice.id], context=context)[0] if (not round(total,self.pool.get('decimal.precision').precision_get(cr, uid, 'Account'))) or writeoff_acc_id: - self.log(cr, uid, inv_id, _('Invoice ') + " '" + name + "' "+ _("is totally paid.")) self.pool.get('account.move.line').reconcile(cr, uid, line_ids, 'manual', writeoff_acc_id, writeoff_period_id, writeoff_journal_id, context) else: code = invoice.currency_id.code - amt = str(pay_amount) + code + ' on ' + str(invoice.amount_total) + code + ' (' + str(total) + code + ' remaining)' - self.log(cr, uid, inv_id, _('Invoice ') + " '" + name + "' "+ _("is paid partially: ") + amt) + # TODO: use currency's formatting function + msg = _("Invoice '%s' is paid partially: %s%s of %s%s (%s%s remaining)") % \ + (name, pay_amount, code, invoice.amount_total, code, total, code) + self.log(cr, uid, inv_id, msg) self.pool.get('account.move.line').reconcile_partial(cr, uid, line_ids, 'manual', context) # Update the stored value (fields.function), so we write to trigger recompute @@ -1289,14 +1295,6 @@ class account_invoice_line(osv.osv): 'price_unit': _price_unit_default, } - def product_id_change_unit_price_inv(self, cr, uid, tax_id, price_unit, qty, address_invoice_id, product, partner_id, context=None): - tax_obj = self.pool.get('account.tax') - if price_unit: - taxes = tax_obj.browse(cr, uid, tax_id) - for tax in tax_obj.compute_inv(cr, uid, taxes, price_unit, qty, address_invoice_id, product, partner_id): - price_unit = price_unit - tax['amount'] - return {'price_unit': price_unit,'invoice_line_tax_id': tax_id} - def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fposition_id=False, price_unit=False, address_invoice_id=False, currency_id=False, context=None): if context is None: context = {} @@ -1396,8 +1394,7 @@ class account_invoice_line(osv.osv): taxes = res.supplier_taxes_id and res.supplier_taxes_id or (a and self.pool.get('account.account').browse(cr, uid, a).tax_ids or False) tax_id = fpos_obj.map_tax(cr, uid, fpos, taxes) if type in ('in_invoice', 'in_refund'): - to_update = self.product_id_change_unit_price_inv(cr, uid, tax_id, price_unit or res.standard_price, qty, address_invoice_id, product, partner_id, context=context) - result.update(to_update) + result.update( {'price_unit': price_unit or res.standard_price,'invoice_line_tax_id': tax_id} ) else: result.update({'price_unit': res.list_price, 'invoice_line_tax_id': tax_id}) diff --git a/addons/account/project/project_view.xml b/addons/account/project/project_view.xml index 6795ae6a0f8..9a482155b4f 100644 --- a/addons/account/project/project_view.xml +++ b/addons/account/project/project_view.xml @@ -129,7 +129,7 @@ tree [('parent_id','=',False)] - Analytic Charts of Accounts allows you to access to reports by analytic accounts (or cost accounts) . From this menu you can access to analytic balance, a report that relates the analytic accounts to the general accounts. It is useful for analyzing the profitability of projects, giving you the profitability of a project for the different operations that you used to carry out the project. + The normal chart of accounts has a structure defined by the legal requirement of the country. The analytic chart of account structure should reflect your own business needs in term of costs/revenues reporting. They are usually structured by contracts, projects, products or departements. Most of the OpenERP operations (invoices, timesheets, expenses, etc) generate analytic entries on the related account. diff --git a/addons/account/report/account_tax_report.py b/addons/account/report/account_tax_report.py index 02ade140d34..d968ee9029e 100644 --- a/addons/account/report/account_tax_report.py +++ b/addons/account/report/account_tax_report.py @@ -37,7 +37,7 @@ class tax_report(rml_parse.rml_parse): 'get_company': self._get_company, 'get_currency': self._get_currency, 'get_lines': self._get_lines, - 'get_years': self.get_years, + 'get_years': self.get_years, }) @@ -51,12 +51,12 @@ class tax_report(rml_parse.rml_parse): if form['periods']: periods_l = self.pool.get('account.period').read(self.cr, self.uid, form['periods'], ['name']) for period in periods_l: - if res['periods']=='': - res['periods'] = period['name'] - else: - res['periods'] += ", "+ period['name'] + if res['periods']=='': + res['periods'] = period['name'] + else: + res['periods'] += ", "+ period['name'] return res - + def _get_lines(self, based_on, period_list, company_id=False, parent=False, level=0, context={}): res = self._get_codes(based_on, company_id, parent, level, period_list, context=context) diff --git a/addons/account/security/ir.model.access.csv b/addons/account/security/ir.model.access.csv index 56e75a3c036..124593ff8f5 100644 --- a/addons/account/security/ir.model.access.csv +++ b/addons/account/security/ir.model.access.csv @@ -31,7 +31,7 @@ "access_account_chart_template","account.chart.template","model_account_chart_template","account.group_account_manager",1,1,1,1 "access_account_tax_template","account.tax.template","model_account_tax_template","account.group_account_manager",1,1,1,1 "access_account_bank_statement","account.bank.statement","model_account_bank_statement","account.group_account_user",1,0,0,0 -"access_account_bank_statement_line","account.bank.statement.line","model_account_bank_statement_line","account.group_account_user",1,0,0,0 +"access_account_bank_statement_line","account.bank.statement.line","model_account_bank_statement_line","account.group_account_user",1,1,1,1 "access_account_analytic_line","account.analytic.line","model_account_analytic_line","account.group_account_user",1,1,1,1 "access_account_analytic_line_manager","account.analytic.line manager","model_account_analytic_line","account.group_account_manager",1,0,0,0 "access_account_analytic_account","account.analytic.account","analytic.model_account_analytic_account","base.group_user",1,0,0,0 @@ -39,7 +39,7 @@ "access_account_invoice_uinvoice","account.invoice","model_account_invoice","account.group_account_invoice",1,1,1,1 "access_account_invoice_line_uinvoice","account.invoice.line","model_account_invoice_line","account.group_account_invoice",1,1,1,1 "access_account_invoice_tax_uinvoice","account.invoice.tax","model_account_invoice_tax","account.group_account_invoice",1,1,1,1 -"access_account_move_uinvoice","account.move","model_account_move","account.group_account_invoice",1,0,0,0 +"access_account_move_uinvoice","account.move","model_account_move","account.group_account_invoice",1,1,1,1 "access_account_move_line_uinvoice","account.move.line invoice","model_account_move_line","account.group_account_invoice",1,1,1,1 "access_account_move_reconcile_uinvoice","account.move.reconcile","model_account_move_reconcile","account.group_account_invoice",1,1,1,1 "access_account_journal_period_uinvoice","account.journal.period","model_account_journal_period","account.group_account_invoice",1,1,1,1 @@ -94,47 +94,12 @@ "access_account_move_line_manager","account.move.line manager","model_account_move_line","account.group_account_manager",1,0,0,0 "access_account_move_manager","account.move manager","model_account_move","account.group_account_manager",1,0,0,0 "access_account_invoice_manager","account.invoice manager","model_account_invoice","account.group_account_manager",1,0,0,0 -"access_account_bank_statement_manager","account.bank.statement manager","model_account_bank_statement","account.group_account_manager",1,0,0,0 +"access_account_bank_statement_manager","account.bank.statement manager","model_account_bank_statement","account.group_account_manager",1,1,1,1 "access_account_entries_report_manager","account.entries.report","model_account_entries_report","account.group_account_manager",1,1,1,1 "access_analytic_entries_report_manager","analytic.entries.report","model_analytic_entries_report","account.group_account_manager",1,0,0,0 -"access_account_cashbox_line","account.cashbox.line","model_account_cashbox_line","account.group_account_manager",1,0,0,0 -"access_account_cashbox_line","account.cashbox.line","model_account_cashbox_line","account.group_account_user",1,0,0,0 -"access_account_move_line_system","account.move.line system","model_account_move_line","base.group_system",1,0,0,0 -"access_account_invoice_system","account.invoice system","model_account_invoice","base.group_system",1,0,0,0 -"access_account_bank_statement_system","account.bank.statement system","model_account_bank_statement","base.group_system",1,0,0,0 -"access_account_move_system","account.move system","model_account_move","base.group_system",1,0,0,0 -"access_account_analytic_line_system","account.analytic.line system","model_account_analytic_line","base.group_system",1,0,0,0 -"access_account_tax_code_system","account.tax.code system","model_account_tax_code","base.group_system",1,1,1,1 -"access_account_journal_system","account.journal system","model_account_journal","base.group_system",1,1,1,1 -"access_account_period_system","account.period system","model_account_period","base.group_system",1,1,1,1 -"access_account_journal_view_system","account.journal.view system","model_account_journal_view","base.group_system",1,1,1,1 -"access_account_account_type_system","account.account.type system","model_account_account_type","base.group_system",1,1,1,1 -"access_account_analytic_journal_system","account.analytic.journal system","model_account_analytic_journal","base.group_system",1,1,1,1 -"access_account_fiscalyear_system","account.fiscalyear system","model_account_fiscalyear","base.group_system",1,1,1,1 -"access_account_tax_system","account.tax system","model_account_tax","base.group_system",1,1,1,1 -"access_account_model_system","account.model system","model_account_model","base.group_system",1,1,1,1 -"access_account_subscription_system","account.subscription system","model_account_subscription","base.group_system",1,1,1,1 -"access_account_journal_column_system","account.journal.column system","model_account_journal_column","base.group_system",1,1,1,1 -"access_account_invoice_report_system","account.invoice.report system","model_account_invoice_report","base.group_system",1,0,0,0 -"access_account_entries_report_system","account.entries.report system","model_account_entries_report","base.group_system",1,0,0,0 -"access_analytic_entries_report_system","analytic.entries.report system","model_analytic_entries_report","base.group_system",1,0,0,0 -"access_account_journal_period_system","account.journal.period system","model_account_journal_period","base.group_system",1,0,0,0 -"access_account_invoice_tax_system","account.invoice.tax system","model_account_invoice_tax","base.group_system",1,0,0,0 -"access_account_tax_code_template_system","account.tax.code.template system","model_account_tax_code_template","base.group_system",1,1,1,1 -"access_account_sequence_fiscal_year_system","account.sequence.fiscalyear system","model_account_sequence_fiscalyear","base.group_system",1,1,1,1 -"access_account_fiscal_position_system","account.fiscal.position system","model_account_fiscal_position","base.group_system",1,1,1,1 -"access_account_move_reconcile_system","account.move.reconcile system","model_account_move_reconcile","base.group_system",1,0,0,0 -"access_account_account_system","account.account system","model_account_account","base.group_system",1,1,1,1 -"access_account_analytic_system","account.analytic.account system","analytic.model_account_analytic_account","base.group_system",1,1,1,1 -"access_account_model_line_system","account.model.line system","model_account_model_line","base.group_system",1,1,1,1 -"access_account_subscription_line_system","account.subscription.line system","model_account_subscription_line","base.group_system",1,1,1,1 -"access_account_payment_term_system","account.payment.term system","model_account_payment_term","base.group_system",1,1,1,1 -"access_account_payment_term_line_system","account.payment.term.line system","model_account_payment_term_line","base.group_system",1,1,1,1 -"access_report_account_receivable_system","report.account.receivable system","model_report_account_receivable","base.group_system",1,1,1,1 -"access_account_fiscal_position_tax_system","account.fiscal.position.tax system","model_account_fiscal_position_tax","base.group_system",1,1,1,1 -"access_account_fiscal_position_account_template_system","account.fiscal.position.account.template system","model_account_fiscal_position_account_template","base.group_system",1,1,1,1 +"access_account_cashbox_line","account.cashbox.line","model_account_cashbox_line","account.group_account_manager",1,1,1,1 +"access_account_cashbox_line","account.cashbox.line","model_account_cashbox_line","account.group_account_user",1,1,1,1 "access_account_journal_view_invoice","account.journal.view invoice","model_account_journal_view","account.group_account_invoice",1,1,1,1 -"access_account_fiscal_position_account_system","account.fiscal.position.account system","model_account_fiscal_position_account","base.group_system",1,1,1,1 "access_account_journal_column_invoice","account.journal.column invoice","model_account_journal_column","account.group_account_invoice",1,1,1,1 "access_account_invoice_tax_manager","account.invoice.tax manager","model_account_invoice_tax","account.group_account_manager",1,0,0,0 "access_account_invoice_tax_accountant","account.invoice.tax accountant","model_account_invoice_tax","account.group_account_user",1,0,0,0 @@ -145,7 +110,6 @@ "access_account_invoice_line_manager","account.invoice.line manager","model_account_invoice_line","account.group_account_manager",1,0,0,0 "access_account_account_invoice","account.account invoice","model_account_account","account.group_account_invoice",1,1,1,1 "access_res_partner_address_invoice","res.partner.address invoice","base.model_res_partner_address","account.group_account_invoice",1,1,1,1 -"access_account_invoice_line_system","account.invoice.line system","model_account_invoice_line","base.group_system",1,0,0,0 "access_account_analytic_accountant","account.analytic.account accountant","analytic.model_account_analytic_account","account.group_account_user",1,1,1,1 "access_account_account_type_invoice","account.account.type invoice","model_account_account_type","account.group_account_invoice",1,1,1,1 "access_report_account_receivable_invoice","report.account.receivable.invoice","model_report_account_receivable","account.group_account_invoice",1,1,1,1 diff --git a/addons/account/test/account_report.yml b/addons/account/test/account_report.yml index 0aae9dbe3d0..d91e4771d6f 100644 --- a/addons/account/test/account_report.yml +++ b/addons/account/test/account_report.yml @@ -67,8 +67,8 @@ import netsvc, tools, os, time import datetime from mx.DateTime import * - import warnings - warnings.filterwarnings('ignore',".*struct integer overflow masking is deprecated*") + import warnings + warnings.filterwarnings('ignore',".*struct integer overflow masking is deprecated*") start = datetime.date.fromtimestamp(time.mktime(time.strptime(time.strftime('%Y-%m-%d'), "%Y-%m-%d"))) start = DateTime(int(start.year), int(start.month), int(start.day)) res = {} diff --git a/addons/account/wizard/account_chart_view.xml b/addons/account/wizard/account_chart_view.xml index f35a2c5480c..f2e278b06ce 100644 --- a/addons/account/wizard/account_chart_view.xml +++ b/addons/account/wizard/account_chart_view.xml @@ -31,6 +31,7 @@ tree,form new + Display your company chart of accounts per fiscal year and filter by period. Have a complete tree view of all journal items per account code by clicking on an account. {'journal_type':'sale','view_mode':False} new + This view is used by accountants in order to record entries massively in OpenERP. If you want to record a customer invoice, select the journal and the period in the search toolbar. Then, start by recording the entry line of the income account. OpenERP will propose to you automatically the Tax related to this account and the counter-part "Account receivable". @@ -31,6 +32,7 @@ {'journal_type':'purchase','view_mode':False} new + This view is used by accountants in order to record entries massively in OpenERP. If you want to record a supplier invoice, start by recording the line of the expense account, OpenERP will propose to you automatically the Tax related to this account and the counter-part "Account Payable". {'journal_type':'bank','view_mode':False} new + This view is used by accountants in order to record entries massively in OpenERP. Journal items are created by OpenERP if you use Bank Statements, Cash Registers, or Customer/Supplier payments. - + diff --git a/addons/account_analytic_analysis/security/ir.model.access.csv b/addons/account_analytic_analysis/security/ir.model.access.csv index 4db9c88f766..80b9f37db1f 100644 --- a/addons/account_analytic_analysis/security/ir.model.access.csv +++ b/addons/account_analytic_analysis/security/ir.model.access.csv @@ -1,5 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_account_analytic_analysis_summary_user,account_analytic_analysis.summary.user,model_account_analytic_analysis_summary_user,account.group_account_manager,1,0,0,0 access_account_analytic_analysis_summary_month,account_analytic_analysis.summary.month,model_account_analytic_analysis_summary_month,account.group_account_manager,1,0,0,0 -access_account_analytic_account_user,account.analytic.account.user,model_account_analytic_account,base.group_user,1,0,0,0 -access_account_analytic_account_system,account.analytic.account.system,model_account_analytic_account,base.group_system,1,0,0,0 diff --git a/addons/account_analytic_plans/security/ir.model.access.csv b/addons/account_analytic_plans/security/ir.model.access.csv index 708094dc520..f7f141ac15a 100644 --- a/addons/account_analytic_plans/security/ir.model.access.csv +++ b/addons/account_analytic_plans/security/ir.model.access.csv @@ -6,5 +6,3 @@ "access_account_analytic_plan_line_invoice","account.analytic.plan.line.invoice","model_account_analytic_plan_line","account.group_account_user",1,1,1,1 "access_account_analytic_plan_instance_manager","account.analytic.plan.instance manager","model_account_analytic_plan_instance","account.group_account_manager",1,1,1,1 "access_account_analytic_plan_instance_line_manager","account.analytic.plan.instance.line manager","model_account_analytic_plan_instance_line","account.group_account_manager",1,1,1,1 -"access_account_analytic_plan_system","account.analytic.plan system","model_account_analytic_plan","base.group_system",1,1,1,1 -"access_account_analytic_plan_line_system","account.analytic.plan.line system","model_account_analytic_plan_line","base.group_system",1,1,1,1 diff --git a/addons/account_anglo_saxon/i18n/mn.po b/addons/account_anglo_saxon/i18n/mn.po new file mode 100644 index 00000000000..2fd75bcc245 --- /dev/null +++ b/addons/account_anglo_saxon/i18n/mn.po @@ -0,0 +1,66 @@ +# Mongolian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-11-24 12:50+0000\n" +"PO-Revision-Date: 2010-10-16 09:58+0000\n" +"Last-Translator: OpenERP Administrators \n" +"Language-Team: Mongolian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: account_anglo_saxon +#: view:product.category:0 +msgid " Accounting Property" +msgstr "" + +#. module: account_anglo_saxon +#: model:ir.module.module,description:account_anglo_saxon.module_meta_information +msgid "" +"This module will support the Anglo-Saxons accounting methodology by \n" +" changing the accounting logic with stock transactions. The difference " +"between the Anglo-Saxon accounting countries \n" +" and the Rhine or also called Continental accounting countries is the " +"moment of taking the Cost of Goods Sold versus Cost of Sales. \n" +" Anglo-Saxons accounting does take the cost when sales invoice is " +"created, Continental accounting will take the cost at he moment the goods " +"are shipped.\n" +" This module will add this functionality by using a interim account, to " +"store the value of shipped goods and will contra book this interim account \n" +" when the invoice is created to transfer this amount to the debtor or " +"creditor account." +msgstr "" + +#. module: account_anglo_saxon +#: model:ir.module.module,shortdesc:account_anglo_saxon.module_meta_information +msgid "Stock Account" +msgstr "Агуулахын данс" + +#. module: account_anglo_saxon +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Дэлгэцийн XML алдаатай!" + +#. module: account_anglo_saxon +#: field:product.category,property_account_creditor_price_difference_categ:0 +#: field:product.template,property_account_creditor_price_difference:0 +msgid "Price Difference Account" +msgstr "Үнийн өөрчлөлтийн данс" + +#. module: account_anglo_saxon +#: help:product.category,property_account_creditor_price_difference_categ:0 +#: help:product.template,property_account_creditor_price_difference:0 +msgid "" +"This account will be used to value price difference between purchase price " +"and cost price." +msgstr "" +"Энэ данс нь худалдан авалтын үнэ болон өртгийн үнийн хоорондох үнийн " +"өөрчлөлтийг дүгнэхийн тулд ашиглагдана." diff --git a/addons/account_budget/i18n/sr.po b/addons/account_budget/i18n/sr.po index 44d9554c859..c98287d9e32 100644 --- a/addons/account_budget/i18n/sr.po +++ b/addons/account_budget/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 10:57+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 08:22+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: account_budget diff --git a/addons/account_budget/security/ir.model.access.csv b/addons/account_budget/security/ir.model.access.csv index 9e604ed5bee..b2eb33f3d04 100644 --- a/addons/account_budget/security/ir.model.access.csv +++ b/addons/account_budget/security/ir.model.access.csv @@ -4,7 +4,4 @@ "access_account_budget_post","account.budget.post","model_account_budget_post","account.group_account_manager",1,0,0,0 "access_account_budget_post_accountant","account.budget.post accountant","model_account_budget_post","account.group_account_user",1,1,1,1 "access_crossovered_budget_accountant","crossovered.budget accountant","model_crossovered_budget","account.group_account_user",1,1,1,1 -"access_account_budget_post_system","account.budget.post system","model_account_budget_post","base.group_system",1,0,0,0 -"access_crossovered_budget_system","crossovered.budget system","model_crossovered_budget","base.group_system",1,0,0,0 -"access_crossovered_budget_lines_system","crossovered.budget.lines system","model_crossovered_budget_lines","base.group_system",1,1,1,1 "access_crossovered_budget_lines_accountant","crossovered.budget.lines accountant","model_crossovered_budget_lines","account.group_account_user",1,1,1,1 diff --git a/addons/account_cancel/i18n/mn.po b/addons/account_cancel/i18n/mn.po new file mode 100644 index 00000000000..0750c13f415 --- /dev/null +++ b/addons/account_cancel/i18n/mn.po @@ -0,0 +1,37 @@ +# Mongolian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2010-08-19 12:03+0000\n" +"PO-Revision-Date: 2010-10-16 08:58+0000\n" +"Last-Translator: OpenERP Administrators \n" +"Language-Team: Mongolian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: account_cancel +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Дэлгэцийн XML алдаатай!" + +#. module: account_cancel +#: model:ir.module.module,description:account_cancel.module_meta_information +msgid "" +"\n" +" Module adds 'Allow cancelling entries' field on form view of account " +"journal. If set to true it allows user to cancel entries & invoices.\n" +" " +msgstr "" + +#. module: account_cancel +#: model:ir.module.module,shortdesc:account_cancel.module_meta_information +msgid "Account Cancel" +msgstr "Данс цуцлах" diff --git a/addons/account_coda/i18n/hr.po b/addons/account_coda/i18n/hr.po index a7212b53edf..0b56b4f2664 100644 --- a/addons/account_coda/i18n/hr.po +++ b/addons/account_coda/i18n/hr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-24 13:11+0000\n" -"PO-Revision-Date: 2010-10-14 20:51+0000\n" -"Last-Translator: robert \n" +"PO-Revision-Date: 2010-10-15 09:33+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: account_coda diff --git a/addons/account_coda/i18n/sr.po b/addons/account_coda/i18n/sr.po index 2c8e5a84e9e..c5af7899172 100644 --- a/addons/account_coda/i18n/sr.po +++ b/addons/account_coda/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-24 13:11+0000\n" -"PO-Revision-Date: 2010-10-14 11:15+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 08:49+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: account_coda diff --git a/addons/account_coda/security/ir.model.access.csv b/addons/account_coda/security/ir.model.access.csv index df4faec11ee..3ab8dccd4ad 100644 --- a/addons/account_coda/security/ir.model.access.csv +++ b/addons/account_coda/security/ir.model.access.csv @@ -3,4 +3,3 @@ "access_account_coda_manager","account.coda","model_account_coda","account.group_account_manager",1,1,1,1 "access_account_coda_import_manager","account.coda.import","model_account_coda_import","account.group_account_manager",1,1,1,1 "access_account_coda_import_user","account.coda","model_account_coda","account.group_account_user",1,0,0,0 -"access_account_coda_system","account.coda system","model_account_coda","base.group_system",1,0,0,0 diff --git a/addons/account_followup/account_followup_view.xml b/addons/account_followup/account_followup_view.xml index 85b21ff9e4e..e246e3659e1 100644 --- a/addons/account_followup/account_followup_view.xml +++ b/addons/account_followup/account_followup_view.xml @@ -86,7 +86,8 @@ form - + diff --git a/addons/account_followup/i18n/sr.po b/addons/account_followup/i18n/sr.po index 1501c7191d7..d882a65d26a 100644 --- a/addons/account_followup/i18n/sr.po +++ b/addons/account_followup/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 11:52+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:03+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: account_followup diff --git a/addons/account_followup/report/account_followup_print.rml b/addons/account_followup/report/account_followup_print.rml index a87b6e5b46e..fb0f93b4a38 100644 --- a/addons/account_followup/report/account_followup_print.rml +++ b/addons/account_followup/report/account_followup_print.rml @@ -1,6 +1,6 @@ - + @@ -59,7 +59,6 @@ - @@ -127,7 +126,7 @@ - + Invoice Date @@ -192,7 +191,7 @@ - + @@ -218,7 +217,7 @@ - + @@ -238,8 +237,5 @@ - - - \ No newline at end of file diff --git a/addons/account_followup/security/ir.model.access.csv b/addons/account_followup/security/ir.model.access.csv index ccf257b3ecf..60d179d3cbe 100644 --- a/addons/account_followup/security/ir.model.access.csv +++ b/addons/account_followup/security/ir.model.access.csv @@ -1,9 +1,6 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_account_followup_followup","account_followup.followup","model_account_followup_followup","base.group_system",1,1,1,1 "access_account_followup_followup_line","account_followup.followup.line","model_account_followup_followup_line","account.group_account_user",1,0,0,0 "access_account_followup_stat_manager","account_followup.stat.manager","model_account_followup_stat","account.group_account_manager",1,1,1,1 -"access_account_followup_followup_manager","account_followup.followup.manager","model_account_followup_followup","base.group_system",1,1,1,1 "access_account_followup_followup_line_manager","account_followup.followup.line.manager","model_account_followup_followup_line","account.group_account_manager",1,1,1,1 -"access_account_followup_followup_line_system","account_followup.followup.line system","model_account_followup_followup_line","base.group_system",1,1,1,1 "access_account_followup_followup_accountant","account_followup.followup user","model_account_followup_followup","account.group_account_user",1,0,0,0 "access_account_followup_stat_invoice","account_followup.stat.invoice","model_account_followup_stat","account.group_account_invoice",1,1,1,1 diff --git a/addons/account_invoice_layout/account_invoice_layout_view.xml b/addons/account_invoice_layout/account_invoice_layout_view.xml index c6283ce05dc..0d6a3565784 100644 --- a/addons/account_invoice_layout/account_invoice_layout_view.xml +++ b/addons/account_invoice_layout/account_invoice_layout_view.xml @@ -100,7 +100,7 @@ - + diff --git a/addons/account_invoice_layout/i18n/sr.po b/addons/account_invoice_layout/i18n/sr.po index 58532d22362..ae168dc498c 100644 --- a/addons/account_invoice_layout/i18n/sr.po +++ b/addons/account_invoice_layout/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 12:09+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:39+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: account_invoice_layout diff --git a/addons/account_invoice_layout/security/ir.model.access.csv b/addons/account_invoice_layout/security/ir.model.access.csv index 6eede39eb70..c838392e6eb 100644 --- a/addons/account_invoice_layout/security/ir.model.access.csv +++ b/addons/account_invoice_layout/security/ir.model.access.csv @@ -1,3 +1,2 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_notify_message,notify.message,model_notify_message,account.group_account_invoice,1,1,1,1 -access_notify_message_system,notify.message system,model_notify_message,base.group_system,1,1,1,1 diff --git a/addons/account_payment/i18n/mn.po b/addons/account_payment/i18n/mn.po index 03ae6c68183..5bd7975811f 100644 --- a/addons/account_payment/i18n/mn.po +++ b/addons/account_payment/i18n/mn.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 06:58+0000\n" -"Last-Translator: Jacara \n" +"PO-Revision-Date: 2010-10-15 09:14+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Mongolian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: account_payment diff --git a/addons/account_payment/i18n/ru.po b/addons/account_payment/i18n/ru.po index a77dfcf2567..0ab2bcf63ff 100644 --- a/addons/account_payment/i18n/ru.po +++ b/addons/account_payment/i18n/ru.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-09-29 10:53+0000\n" -"Last-Translator: Chertykov Denis \n" +"PO-Revision-Date: 2010-10-16 09:33+0000\n" +"Last-Translator: Nikolay Chesnokov \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-30 04:43+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: account_payment @@ -275,7 +275,7 @@ msgstr "Произвести платежи" #. module: account_payment #: field:payment.line,state:0 msgid "Communication Type" -msgstr "" +msgstr "Тип коммуникации" #. module: account_payment #: model:ir.module.module,shortdesc:account_payment.module_meta_information @@ -332,7 +332,7 @@ msgstr "Партнер" #. module: account_payment #: help:payment.line,communication2:0 msgid "The successor message of Communication." -msgstr "" +msgstr "Приемник сообщения коммуникации" #. module: account_payment #: help:payment.line,info_partner:0 @@ -502,7 +502,7 @@ msgstr "Сумма в валюте партнера" #. module: account_payment #: field:payment.line,communication2:0 msgid "Communication 2" -msgstr "" +msgstr "Коммуникации 2" #. module: account_payment #: field:payment.line,bank_id:0 diff --git a/addons/account_payment/i18n/sr.po b/addons/account_payment/i18n/sr.po index d563ea941c0..4fd733e9ea5 100644 --- a/addons/account_payment/i18n/sr.po +++ b/addons/account_payment/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 13:06+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:18+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: account_payment diff --git a/addons/account_payment/security/ir.model.access.csv b/addons/account_payment/security/ir.model.access.csv index 1d39372a6b3..a4b6fe0af5e 100644 --- a/addons/account_payment/security/ir.model.access.csv +++ b/addons/account_payment/security/ir.model.access.csv @@ -7,7 +7,5 @@ "access_account_move_line_payment","account.move.line payment","account.model_account_move_line","group_account_payment",1,0,0,0 "access_payment_order_accountant","payment.order accountant","model_payment_order","account.group_account_user",1,1,1,1 "access_payment_order_manager","payment.order manager","model_payment_order","account.group_account_manager",1,0,0,0 -"access_payment_order_system","payment.order system","model_payment_order","base.group_system",1,0,0,0 -"access_payment_mode_system","payment.mode system","model_payment_mode","base.group_system",1,1,1,1 "access_payment_order_invoice","payment.order invoice","model_payment_order","account.group_account_invoice",1,1,1,1 "access_payment_line_invoice","payment.line invoice","model_payment_line","account.group_account_invoice",1,1,1,1 diff --git a/addons/account_report/security/ir.model.access.csv b/addons/account_report/security/ir.model.access.csv index 66fe44b6714..789f18530e0 100644 --- a/addons/account_report/security/ir.model.access.csv +++ b/addons/account_report/security/ir.model.access.csv @@ -1,5 +1,4 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_account_report_report_system","account.report.report system","model_account_report_report","base.group_system",1,0,0,0 "access_account_report_history","account.report.history","model_account_report_history","account.group_account_manager",1,0,0,0 "access_account_report_report","account.report.report","model_account_report_report","account.group_account_user",1,1,0,0 "access_account_report_report_manager","account.report.report manager","model_account_report_report","account.group_account_manager",1,1,1,1 diff --git a/addons/account_reporting/i18n/sr.po b/addons/account_reporting/i18n/sr.po index c79527b314f..38289723f44 100644 --- a/addons/account_reporting/i18n/sr.po +++ b/addons/account_reporting/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 13:59+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:23+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: account_reporting diff --git a/addons/account_reporting/security/ir.model.access.csv b/addons/account_reporting/security/ir.model.access.csv index e84e663dfda..78dfe260864 100644 --- a/addons/account_reporting/security/ir.model.access.csv +++ b/addons/account_reporting/security/ir.model.access.csv @@ -1,3 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_color_rml,color.rml,model_color_rml,account.group_account_manager,1,1,1,1 -access_account_report_bs,account.report.bs,model_account_report_bs,base.group_system,1,1,1,1 +access_account_report_bs,account.report.bs,model_account_report_bs,account.group_account_manager,1,1,1,1 diff --git a/addons/account_tax_include/__init__.py b/addons/account_tax_include/__init__.py deleted file mode 100644 index f96eb08f2fe..00000000000 --- a/addons/account_tax_include/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -import account_tax_include - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - diff --git a/addons/account_tax_include/__openerp__.py b/addons/account_tax_include/__openerp__.py deleted file mode 100644 index a6bab18ce01..00000000000 --- a/addons/account_tax_include/__openerp__.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - - -{ - 'name': 'Invoices and prices with taxes included', - 'version': '1.0', - 'category': 'Generic Modules/Accounting', - 'description': """Allow the user to work tax included prices. -Especially useful for b2c businesses. - -This module implements the modification on the invoice form. -""", - 'author': 'OpenERP SA', - 'website': 'http://www.openerp.com', - 'depends': ['account'], - 'init_xml': [], - 'update_xml': ['account_tax_include_view.xml'], - 'demo_xml': [], - 'test': ['test/account_tax_include.yml'], - 'installable': True, - 'active': False, - 'certificate': '0070514190381', -} - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_tax_include/account_tax_include.py b/addons/account_tax_include/account_tax_include.py deleted file mode 100644 index afd1ef36ae7..00000000000 --- a/addons/account_tax_include/account_tax_include.py +++ /dev/null @@ -1,228 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -import time - -from osv import fields, osv - -class account_invoice(osv.osv): - _inherit = "account.invoice" - _columns = { - 'price_type': fields.selection([('tax_included','Tax included'), - ('tax_excluded','Tax excluded')], - 'Price method', required=True, readonly=True, - states={'draft': [('readonly', False)]}), - } - _defaults = { - 'price_type': 'tax_excluded', - } - - def refund(self, cr, uid, ids, date=None, period_id=None, description=None, journal_id=None): - map_old_new = {} - refund_ids = [] - for old_inv_id in ids: - new_id = super(account_invoice,self).refund(cr, uid, ids, date=date, period_id=period_id, description=description, journal_id=journal_id) - refund_ids += new_id - map_old_new[old_inv_id] = new_id[0] - - for old_inv_id in map_old_new.keys(): - old_inv_record = self.read(cr, uid, [old_inv_id], ['price_type'])[0]['price_type'] - self.write(cr, uid, [map_old_new[old_inv_id]], {'price_type' : old_inv_record}) - return refund_ids - -account_invoice() - -class account_invoice_line(osv.osv): - _inherit = "account.invoice.line" - - def _amount_line2(self, cr, uid, ids, name, args, context=None): - """ - Return the subtotal excluding taxes with respect to price_type. - """ - res = {} - tax_obj = self.pool.get('account.tax') - cur_obj = self.pool.get('res.currency') - dec_obj = self.pool.get('decimal.precision') - for line in self.browse(cr, uid, ids): - cur = line.invoice_id and line.invoice_id.currency_id or False - res_init = super(account_invoice_line, self)._amount_line(cr, uid, [line.id], name, args, context) - res[line.id] = { - 'price_subtotal': 0.0, - 'price_subtotal_incl': 0.0, - 'data': [] - } - if not line.quantity: - continue - if line.invoice_id: - product_taxes = [] - if line.product_id: - if line.invoice_id.type in ('out_invoice', 'out_refund'): - product_taxes = filter(lambda x: x.price_include, line.product_id.taxes_id) - else: - product_taxes = filter(lambda x: x.price_include, line.product_id.supplier_taxes_id) - - if ((set(product_taxes) == set(line.invoice_line_tax_id)) or not product_taxes) and (line.invoice_id.price_type == 'tax_included'): - res[line.id]['price_subtotal_incl'] = cur and cur_obj.round(cr, uid, cur, res_init[line.id]) or res_init[line.id] - else: - res[line.id]['price_subtotal'] = cur and cur_obj.round(cr, uid, cur, res_init[line.id]) or res_init[line.id] - for tax in tax_obj.compute_inv(cr, uid, product_taxes, res_init[line.id]/line.quantity, line.quantity): - res[line.id]['price_subtotal'] = res[line.id]['price_subtotal'] - round(tax['amount'], dec_obj.precision_get(cr, uid, 'Account')) - else: - res[line.id]['price_subtotal'] = cur and cur_obj.round(cr, uid, cur, res_init[line.id]) or res_init[line.id] - - if res[line.id]['price_subtotal']: - res[line.id]['price_subtotal_incl'] = res[line.id]['price_subtotal'] - for tax in tax_obj.compute(cr, uid, line.invoice_line_tax_id, res[line.id]['price_subtotal']/line.quantity, line.quantity): - res[line.id]['price_subtotal_incl'] = res[line.id]['price_subtotal_incl'] + tax['amount'] - res[line.id]['data'].append(tax) - else: - res[line.id]['price_subtotal'] = res[line.id]['price_subtotal_incl'] - for tax in tax_obj.compute_inv(cr, uid, line.invoice_line_tax_id, res[line.id]['price_subtotal_incl']/line.quantity, line.quantity): - res[line.id]['price_subtotal'] = res[line.id]['price_subtotal'] - tax['amount'] - res[line.id]['data'].append(tax) - - res[line.id]['price_subtotal']= round(res[line.id]['price_subtotal'], dec_obj.precision_get(cr, uid, 'Account')) - res[line.id]['price_subtotal_incl']= round(res[line.id]['price_subtotal_incl'], dec_obj.precision_get(cr, uid, 'Account')) - return res - - def _price_unit_default(self, cr, uid, context=None): - if context is None: - context = {} - if 'check_total' in context: - t = context['check_total'] - if context.get('price_type', False) == 'tax_included': - for l in context.get('invoice_line', {}): - if len(l) >= 3 and l[2]: - p = l[2].get('price_unit', 0) * (1-l[2].get('discount', 0)/100.0) - t = t - (p * l[2].get('quantity')) - return t - return super(account_invoice_line, self)._price_unit_default(cr, uid, context) - return 0 - - def _get_invoice(self, cr, uid, ids, context=None): - result = {} - for inv in self.pool.get('account.invoice').browse(cr, uid, ids, context=context): - for line in inv.invoice_line: - result[line.id] = True - return result.keys() - - _columns = { - 'price_subtotal': fields.function(_amount_line2, method=True, string='Subtotal w/o tax', multi='amount', - store={'account.invoice':(_get_invoice,['price_type'], 10), 'account.invoice.line': (lambda self, cr, uid, ids, c={}: ids, None,10)}), - 'price_subtotal_incl': fields.function(_amount_line2, method=True, string='Subtotal', multi='amount', - store={'account.invoice':(_get_invoice,['price_type'], 10), 'account.invoice.line': (lambda self, cr, uid, ids, c={}: ids, None,10)}), - } - - _defaults = { - 'price_unit': _price_unit_default, - } - - def move_line_get_item(self, cr, uid, line, context=None): - return { - 'type':'src', - 'name':line.name, - 'price_unit':(line.quantity) and (line.price_subtotal / line.quantity) or line.price_subtotal, - 'quantity':line.quantity, - 'price':line.price_subtotal, - 'account_id':line.account_id.id, - 'product_id': line.product_id.id, - 'uos_id':line.uos_id.id, - 'account_analytic_id':line.account_analytic_id.id, - } - - def product_id_change_unit_price_inv(self, cr, uid, tax_id, price_unit, qty, address_invoice_id, product, partner_id, context=None): - if context is None: - context = {} - # if the tax is already included, just return the value without calculations - if context.get('price_type', False) == 'tax_included': - return {'price_unit': price_unit,'invoice_line_tax_id': tax_id} - else: - return super(account_invoice_line, self).product_id_change_unit_price_inv(cr, uid, tax_id, price_unit, qty, address_invoice_id, product, partner_id, context=context) - - def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fposition_id=False, price_unit=False, address_invoice_id=False, currency_id=False, context=None): - # note: will call product_id_change_unit_price_inv with context... - - # Temporary trap, for bad context that came from koo: - - ctx = (context and context.copy()) or {} - ctx.update({'price_type': ctx.get('price_type', 'tax_excluded')}) - return super(account_invoice_line, self).product_id_change(cr, uid, ids, product, uom, qty, name, type, partner_id, fposition_id, price_unit, address_invoice_id, currency_id=currency_id, context=ctx) - -account_invoice_line() - -class account_invoice_tax(osv.osv): - _inherit = "account.invoice.tax" - - def compute(self, cr, uid, invoice_id, context=None): - tax_grouped = {} - tax_obj = self.pool.get('account.tax') - cur_obj = self.pool.get('res.currency') - line_obj = self.pool.get('account.invoice.line') - - inv = self.pool.get('account.invoice').browse(cr, uid, invoice_id) - line_ids = map(lambda x: x.id, inv.invoice_line) - - cur = inv.currency_id - company_currency = inv.company_id.currency_id.id - - for line in inv.invoice_line: - data = line_obj._amount_line2(cr, uid, [line.id], [], [], context)[line.id] - for tax in data['data']: - val={} - val['invoice_id'] = inv.id - val['name'] = tax['name'] - val['amount'] = tax['amount'] - val['manual'] = False - val['sequence'] = tax['sequence'] - val['base'] = tax['price_unit'] * line['quantity'] - - if inv.type in ('out_invoice','in_invoice'): - val['base_code_id'] = tax['base_code_id'] - val['tax_code_id'] = tax['tax_code_id'] - val['base_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['base'] * tax['base_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False) - val['tax_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['amount'] * tax['tax_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False) - val['account_id'] = tax['account_collected_id'] or line.account_id.id - else: - val['base_code_id'] = tax['ref_base_code_id'] - val['tax_code_id'] = tax['ref_tax_code_id'] - val['base_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['base'] * tax['ref_base_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False) - val['tax_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['amount'] * tax['ref_tax_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False) - val['account_id'] = tax['account_paid_id'] or line.account_id.id - - key = (val['tax_code_id'], val['base_code_id'], val['account_id']) - if not key in tax_grouped: - tax_grouped[key] = val - else: - tax_grouped[key]['amount'] += val['amount'] - tax_grouped[key]['base'] += val['base'] - tax_grouped[key]['base_amount'] += val['base_amount'] - tax_grouped[key]['tax_amount'] += val['tax_amount'] - - for t in tax_grouped.values(): - t['amount'] = cur_obj.round(cr, uid, cur, t['amount']) - t['base_amount'] = cur_obj.round(cr, uid, cur, t['base_amount']) - t['tax_amount'] = cur_obj.round(cr, uid, cur, t['tax_amount']) - - return tax_grouped - -account_invoice_tax() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/account_tax_include/account_tax_include_view.xml b/addons/account_tax_include/account_tax_include_view.xml deleted file mode 100644 index 4c103cd0d50..00000000000 --- a/addons/account_tax_include/account_tax_include_view.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - account.tax.exlcuded.view.form - form - account.tax - - - - - - - - - - - account.invoice.vat.exlcuded.view.form - form - account.invoice - - - - - - - - - - account.invoice.supplier.tax_include - form - account.invoice - - - - - - - - - - account.invoice.supplier.tax_include2 - form - account.invoice - - - - - - - - - - account.invoice.supplier.tax_include3 - form - account.invoice - - - - - - - - - - account.invoice.line.tree - account.invoice.line - tree - - - - - - - - - - diff --git a/addons/account_tax_include/i18n/account_tax_include.pot b/addons/account_tax_include/i18n/account_tax_include.pot deleted file mode 100644 index da7622102bd..00000000000 --- a/addons/account_tax_include/i18n/account_tax_include.pot +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01:51+0000\n" -"PO-Revision-Date: 2009-08-28 16:01:51+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" - diff --git a/addons/account_tax_include/i18n/ar.po b/addons/account_tax_include/i18n/ar.po deleted file mode 100644 index 5090a5e011f..00000000000 --- a/addons/account_tax_include/i18n/ar.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 5.0.4\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-02-03 06:24+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" diff --git a/addons/account_tax_include/i18n/bg.po b/addons/account_tax_include/i18n/bg.po deleted file mode 100644 index f0b055241cc..00000000000 --- a/addons/account_tax_include/i18n/bg.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-08 12:06+0000\n" -"Last-Translator: lem0na \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Невалиден XML за преглед на архитектурата" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Начин на изчисляване" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "С включен данък" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Без данък" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" diff --git a/addons/account_tax_include/i18n/bs.po b/addons/account_tax_include/i18n/bs.po deleted file mode 100644 index 97a0c10e367..00000000000 --- a/addons/account_tax_include/i18n/bs.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-02-10 12:26+0000\n" -"Last-Translator: adnan \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Neodgovarajući XML za arhitekturu prikaza!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Cjenovna procedura" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Računi i cijene sa uključenim porezom" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Porez uključen" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Porez nije uključen" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Izračunaj cijene sa porezima" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Sub-ukupno" diff --git a/addons/account_tax_include/i18n/ca.po b/addons/account_tax_include/i18n/ca.po deleted file mode 100644 index ce0276a8c26..00000000000 --- a/addons/account_tax_include/i18n/ca.po +++ /dev/null @@ -1,53 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-29 06:30+0000\n" -"Last-Translator: Jordi Esteve (www.zikzakmedia.com) " -"\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "XML invàlid per a la definició de la vista!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Mètode preu" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Factures i preus amb impostos inclosos" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Impostos inclosos" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Impostos exclosos" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Codi pel càlcul dels preus amb impostos inclosos" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotal" diff --git a/addons/account_tax_include/i18n/cs.po b/addons/account_tax_include/i18n/cs.po deleted file mode 100644 index a8958b780d7..00000000000 --- a/addons/account_tax_include/i18n/cs.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-08-02 23:35+0000\n" -"Last-Translator: mga (Open ERP) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Neplatný XML pro zobrazení architektury" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Metoda určování cen" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Faktury a ceny včetně daní" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Daně zahrnuty" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Daně vyloučeny" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Výpočetní kód pro ceny včetně daně" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Mezisoučet" diff --git a/addons/account_tax_include/i18n/de.po b/addons/account_tax_include/i18n/de.po deleted file mode 100644 index 4635a414aaa..00000000000 --- a/addons/account_tax_include/i18n/de.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-04-09 13:20+0000\n" -"Last-Translator: Ferdinand @ ChriCar \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Fehlerhafter xml Code für diese Ansicht!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Preismethode" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Rechnungen und Preise mit inkludierten Steuern" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Steuer inklusive" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Steuern exklusive" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Berechnungsgrundlage (inkl. Steuer)" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Zwischensumme" diff --git a/addons/account_tax_include/i18n/el.po b/addons/account_tax_include/i18n/el.po deleted file mode 100644 index 74d719a9b9e..00000000000 --- a/addons/account_tax_include/i18n/el.po +++ /dev/null @@ -1,53 +0,0 @@ -# Greek translation for openobject-addons -# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2009. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-08 15:27+0000\n" -"Last-Translator: Makis Nicolaou \n" -"Language-Team: Greek \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Άκυρο XML για την αρχιτεκτονική όψης!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Μέθοδος Τιμής" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Τιμολόγια και τιμές με ενσωμάτωση φόρων" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Συμπερίληψη φόρου" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Εξαιρούνται φόροι" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Κωδικός Υπολογισμού για Φόρους που εμπεριέχονται στις τιμές" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Υποσύνολο" diff --git a/addons/account_tax_include/i18n/en_AU.po b/addons/account_tax_include/i18n/en_AU.po deleted file mode 100644 index 4c0e3609f24..00000000000 --- a/addons/account_tax_include/i18n/en_AU.po +++ /dev/null @@ -1,53 +0,0 @@ -# English (Australia) translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-05-09 21:19+0000\n" -"Last-Translator: MoLE \n" -"Language-Team: English (Australia) \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Invalid XML for View Architecture!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Price method" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Invoices and prices with taxes included" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Tax included" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Tax excluded" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Compute Code for Taxes included prices" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotal" diff --git a/addons/account_tax_include/i18n/en_GB.po b/addons/account_tax_include/i18n/en_GB.po deleted file mode 100644 index cd72d7a2cac..00000000000 --- a/addons/account_tax_include/i18n/en_GB.po +++ /dev/null @@ -1,53 +0,0 @@ -# English (United Kingdom) translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-05-09 21:20+0000\n" -"Last-Translator: MoLE \n" -"Language-Team: English (United Kingdom) \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Invalid XML for View Architecture!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Price method" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Invoices and prices with taxes included" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Tax included" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Tax excluded" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Compute Code for Taxes included prices" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotal" diff --git a/addons/account_tax_include/i18n/es.po b/addons/account_tax_include/i18n/es.po deleted file mode 100644 index b01d20c9ec8..00000000000 --- a/addons/account_tax_include/i18n/es.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-24 20:17+0000\n" -"Last-Translator: Borja López Soilán (Pexego) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "¡XML inválido para la definición de la vista!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Método precio" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Facturas y precios con impuestos incluidos" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Impuestos incluidos" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Impuestos excluidos" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Código para el cálculo de precios con impuestos incluidos" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotal" diff --git a/addons/account_tax_include/i18n/es_AR.po b/addons/account_tax_include/i18n/es_AR.po deleted file mode 100644 index a9cc40c0d4c..00000000000 --- a/addons/account_tax_include/i18n/es_AR.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 5.0.0\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-14 18:28+0000\n" -"Last-Translator: Silvana Herrera \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "XML inválido para la definición de la vista!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Método de precio" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Facturas y precios con impuestos incluidos" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Impuestos incluidos" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Impuestos no incluidos" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Código del cálculo para precios con impuestos incluídos" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotal" diff --git a/addons/account_tax_include/i18n/es_EC.po b/addons/account_tax_include/i18n/es_EC.po deleted file mode 100644 index 1858f2a52bc..00000000000 --- a/addons/account_tax_include/i18n/es_EC.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-09-17 17:47+0000\n" -"Last-Translator: Borja López Soilán (Pexego) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "¡XML inválido para la definición de la vista!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Método precio" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Facturas y precios con impuestos incluidos" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Impuestos incluidos" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Impuestos excluidos" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Código para el cálculo de precios con impuestos incluidos" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotal" diff --git a/addons/account_tax_include/i18n/et.po b/addons/account_tax_include/i18n/et.po deleted file mode 100644 index d4398a2ae58..00000000000 --- a/addons/account_tax_include/i18n/et.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-11-09 16:28+0000\n" -"Last-Translator: Fabien (Open ERP) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Vigane XML vaate arhitektuurile!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Hinna meetod" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Makse sisaldavad arved ja hinnad" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Maksuga" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Maksuta" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Arvuta kood maksuga hindadele" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Vahesumma" diff --git a/addons/account_tax_include/i18n/fi.po b/addons/account_tax_include/i18n/fi.po deleted file mode 100644 index 0b8e8dfcee2..00000000000 --- a/addons/account_tax_include/i18n/fi.po +++ /dev/null @@ -1,53 +0,0 @@ -# Finnish translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-08-02 23:40+0000\n" -"Last-Translator: mga (Open ERP) \n" -"Language-Team: Finnish \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Virheellinen XML näkymä-arkkitehtuurille!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Hinnan tyyppi" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Laskut ja hinnat veroilla" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Vero sisältyy" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Ilman veroa" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Laske koodi hinnoille joissa on vero mukana" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Välisumma" diff --git a/addons/account_tax_include/i18n/fr.po b/addons/account_tax_include/i18n/fr.po deleted file mode 100644 index 3f912c6ffba..00000000000 --- a/addons/account_tax_include/i18n/fr.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-11-17 09:23+0000\n" -"Last-Translator: Fabien (Open ERP) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "XML non valide pour l'architecture de la vue" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Méthode de prix" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Factures et prix avec taxes comprises" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Taxe comprise" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Hors-taxe" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Code de calcul pour les prix taxes comprises" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Sous-total" diff --git a/addons/account_tax_include/i18n/gl.po b/addons/account_tax_include/i18n/gl.po deleted file mode 100644 index 96e95387061..00000000000 --- a/addons/account_tax_include/i18n/gl.po +++ /dev/null @@ -1,54 +0,0 @@ -# translation of account-tax-include-es.po to Galego -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -# Frco. Javier Rial Rodríguez , 2009. -msgid "" -msgstr "" -"Project-Id-Version: account-tax-include-es\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-08 12:37+0000\n" -"Last-Translator: Fabien (Open ERP) \n" -"Language-Team: Galego \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "¡XML non válido para a definición da vista!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Método prezo" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Facturas e prezos con impostos incluídos" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Imposto incluído" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Imposto excluído" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Código para o cálculo dos impostos en prezos incluídos" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotal" diff --git a/addons/account_tax_include/i18n/hr.po b/addons/account_tax_include/i18n/hr.po deleted file mode 100644 index ba46ce2f95a..00000000000 --- a/addons/account_tax_include/i18n/hr.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-08-02 23:43+0000\n" -"Last-Translator: Dragan Jovanovic \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Nevažeći XML za Arhitekturu Prikaza!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Cjenovna metoda" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Računi i cijene sa uključenim porezom" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Porez uključen" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Nije uključen porez" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Kod za izračun cijena sa uključenim porezima" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Podzbroj" diff --git a/addons/account_tax_include/i18n/hu.po b/addons/account_tax_include/i18n/hu.po deleted file mode 100644 index 5090a5e011f..00000000000 --- a/addons/account_tax_include/i18n/hu.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 5.0.4\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-02-03 06:24+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" diff --git a/addons/account_tax_include/i18n/id.po b/addons/account_tax_include/i18n/id.po deleted file mode 100644 index e0d1f76a6b1..00000000000 --- a/addons/account_tax_include/i18n/id.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-08-02 14:41+0000\n" -"Last-Translator: mga (Open ERP) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "XML tidak valid untuk Menampilkan Arsitektur!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Metode Harga" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Faktur dan harga sudah termasuk pajak" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Termasuk Pajak" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Tidak termasuk pajak" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "menghitung kode untuk Pajak termasuk harga" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Sub Total" diff --git a/addons/account_tax_include/i18n/it.po b/addons/account_tax_include/i18n/it.po deleted file mode 100644 index 8b6d0f9df36..00000000000 --- a/addons/account_tax_include/i18n/it.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 5.0.4\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 07:31+0000\n" -"Last-Translator: OpenERP Administrators \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "XML non valido per Visualizzazione Architettura!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Metodo di pagamento" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Tasse incluse" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Tasse escluse" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotale" diff --git a/addons/account_tax_include/i18n/ko.po b/addons/account_tax_include/i18n/ko.po deleted file mode 100644 index 254d3ffc1b1..00000000000 --- a/addons/account_tax_include/i18n/ko.po +++ /dev/null @@ -1,53 +0,0 @@ -# Korean translation for openobject-addons -# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2009. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-08 16:43+0000\n" -"Last-Translator: ekodaq \n" -"Language-Team: Korean \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "뷰 아키텍처의 XML이 유효하지 않습니다." - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "가격 방식" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "세금이 포함된 인보이스와 가격" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "세금 포함" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "세금 제외" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "세금 포함 가격을 위한 컴퓨터 코드" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "서브토털" diff --git a/addons/account_tax_include/i18n/lt.po b/addons/account_tax_include/i18n/lt.po deleted file mode 100644 index 35af6cdcb04..00000000000 --- a/addons/account_tax_include/i18n/lt.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-08 15:54+0000\n" -"Last-Translator: Donatas Stonys TeraxIT \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" diff --git a/addons/account_tax_include/i18n/nb.po b/addons/account_tax_include/i18n/nb.po deleted file mode 100644 index a457b6a3c49..00000000000 --- a/addons/account_tax_include/i18n/nb.po +++ /dev/null @@ -1,53 +0,0 @@ -# Norwegian Bokmal translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-09-09 07:22+0000\n" -"Last-Translator: OpenERP Administrators \n" -"Language-Team: Norwegian Bokmal \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Ugyldig XML for visningsarkitektur!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotal" diff --git a/addons/account_tax_include/i18n/nl.po b/addons/account_tax_include/i18n/nl.po deleted file mode 100644 index cfccf0663d4..00000000000 --- a/addons/account_tax_include/i18n/nl.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-12-14 21:11+0000\n" -"Last-Translator: Pieter J. Kersten (EduSense BV) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Ongeldige XML voor weergave!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Prijsmethode" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Facturen en prijzen inclusief belastingen" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Inclusief belastingen" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Exclusief belastingen" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Bereken code voor prijzen inclusief belastingen" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotaal" diff --git a/addons/account_tax_include/i18n/nl_BE.po b/addons/account_tax_include/i18n/nl_BE.po deleted file mode 100644 index 68a51f90ec3..00000000000 --- a/addons/account_tax_include/i18n/nl_BE.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 5.0.0\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-04-24 15:12+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" diff --git a/addons/account_tax_include/i18n/oc.po b/addons/account_tax_include/i18n/oc.po deleted file mode 100644 index 95700dc830e..00000000000 --- a/addons/account_tax_include/i18n/oc.po +++ /dev/null @@ -1,53 +0,0 @@ -# Occitan (post 1500) translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-08-02 23:48+0000\n" -"Last-Translator: Cédric VALMARY (Tot en òc) \n" -"Language-Team: Occitan (post 1500) \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "XML invalid per l'arquitectura de la vista" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Metòde de prètz" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Facturas e prèses amb taxas inclusas" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Taxa inclusa" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Fòra taxa" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Còde de calcul pels prèses amb taxas compresas" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Sostotal" diff --git a/addons/account_tax_include/i18n/pl.po b/addons/account_tax_include/i18n/pl.po deleted file mode 100644 index efa5a2bfdfb..00000000000 --- a/addons/account_tax_include/i18n/pl.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-11-21 15:43+0000\n" -"Last-Translator: Andrzej MoST (Marcin Ostajewski) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "XML niewłaściwy dla tej architektury wyświetlania!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Metoda wyceny" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Faktury i ceny zawierające podatki." - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Zawiera podatek" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Nie zawiera podatku" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Wylicz kod dla cen z podatkiem" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Suma częściowa" diff --git a/addons/account_tax_include/i18n/pt.po b/addons/account_tax_include/i18n/pt.po deleted file mode 100644 index 9f5c11b9832..00000000000 --- a/addons/account_tax_include/i18n/pt.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-08-02 23:49+0000\n" -"Last-Translator: mga (Open ERP) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "XML inválido para a arquitectura da vista" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Método do preço" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Facturas e preços com imposto incluído" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Imposto incluído" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Imposto excluído" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Código de cálculo para preços com imposto incluído" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotal" diff --git a/addons/account_tax_include/i18n/pt_BR.po b/addons/account_tax_include/i18n/pt_BR.po deleted file mode 100644 index bd8ff06c8e4..00000000000 --- a/addons/account_tax_include/i18n/pt_BR.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-08 12:28+0000\n" -"Last-Translator: Pedro_Maschio \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Invalido XML para Arquitetura da View" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" diff --git a/addons/account_tax_include/i18n/ro.po b/addons/account_tax_include/i18n/ro.po deleted file mode 100644 index c6c5a81169c..00000000000 --- a/addons/account_tax_include/i18n/ro.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-08-02 23:52+0000\n" -"Last-Translator: mga (Open ERP) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "XML invalid pentru arhitectura machetei de afișare !" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Metoda de pret" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Facturi şi preţuri cu taxele incluse" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Taxe incluse" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Fără taxe" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Calcul cod pentru preţuri cu taxe incluse" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotal" diff --git a/addons/account_tax_include/i18n/ru.po b/addons/account_tax_include/i18n/ru.po deleted file mode 100644 index 0d7efd3ffdf..00000000000 --- a/addons/account_tax_include/i18n/ru.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-06-06 06:51+0000\n" -"Last-Translator: mr.The \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Неправильный XML для просмотра архитектуры!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Метод расчета цены" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Счета и цены с налогами" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "С налогами" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "До налогов" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Выполнить код для цен с налогами" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Промежуточный итог" diff --git a/addons/account_tax_include/i18n/sk.po b/addons/account_tax_include/i18n/sk.po deleted file mode 100644 index eedd88d3edc..00000000000 --- a/addons/account_tax_include/i18n/sk.po +++ /dev/null @@ -1,53 +0,0 @@ -# Slovak translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-08-02 23:53+0000\n" -"Last-Translator: Peter Kohaut \n" -"Language-Team: Slovak \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Neplatné XML pre zobrazenie architektúry!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Faktúry a ceny zahrnuté s DPH" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Medzisúčet" diff --git a/addons/account_tax_include/i18n/sl.po b/addons/account_tax_include/i18n/sl.po deleted file mode 100644 index 22db03c5894..00000000000 --- a/addons/account_tax_include/i18n/sl.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-11-17 09:23+0000\n" -"Last-Translator: Fabien (Open ERP) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Neveljaven XML za arhitekturo pogleda." - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Metoda cene" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Računi in cene z vključenimi davki" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Davek vključen" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Davek ni vključen" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Koda izračuna za davke v cenah" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Delna vsota" diff --git a/addons/account_tax_include/i18n/sq.po b/addons/account_tax_include/i18n/sq.po deleted file mode 100644 index 7c7b2189fd2..00000000000 --- a/addons/account_tax_include/i18n/sq.po +++ /dev/null @@ -1,53 +0,0 @@ -# Albanian translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-08-02 14:41+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: Albanian \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" diff --git a/addons/account_tax_include/i18n/sr.po b/addons/account_tax_include/i18n/sr.po deleted file mode 100644 index a74323d1144..00000000000 --- a/addons/account_tax_include/i18n/sr.po +++ /dev/null @@ -1,53 +0,0 @@ -# Serbian translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 14:04+0000\n" -"Last-Translator: zmmaj \n" -"Language-Team: Serbian \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Nevažeći XML za pregled arhitekture" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Cenovna metoda" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Računi i cene sa uključenim porezom" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "Porez uključen" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "Nije uključen porez" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "Kompjuterski kod za izračunavanje cijena sa uključenim porezima" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Subtotal" diff --git a/addons/account_tax_include/i18n/sv.po b/addons/account_tax_include/i18n/sv.po deleted file mode 100644 index 30a63ed1824..00000000000 --- a/addons/account_tax_include/i18n/sv.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-08-03 02:42+0000\n" -"Last-Translator: mga (Open ERP) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Felaktig XML för Vyarkitektur!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" diff --git a/addons/account_tax_include/i18n/tlh.po b/addons/account_tax_include/i18n/tlh.po deleted file mode 100644 index 334e888d03d..00000000000 --- a/addons/account_tax_include/i18n/tlh.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev_rc3\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-02-03 06:24+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" diff --git a/addons/account_tax_include/i18n/tr.po b/addons/account_tax_include/i18n/tr.po deleted file mode 100644 index a719aaf1b2b..00000000000 --- a/addons/account_tax_include/i18n/tr.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-09-09 06:58+0000\n" -"Last-Translator: Fabien (Open ERP) \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Görüntüleme mimarisi için Geçersiz XML" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "Fiyat Yöntemi" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "Vergiler dahil fiyat ve faturalar" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "KDV Dahil" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "KDV Hariç" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "Alt Toplam" diff --git a/addons/account_tax_include/i18n/uk.po b/addons/account_tax_include/i18n/uk.po deleted file mode 100644 index 8b467132fb9..00000000000 --- a/addons/account_tax_include/i18n/uk.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-08 15:16+0000\n" -"Last-Translator: Eugene Babiy \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "Неправильний XML для Архітектури Вигляду!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" diff --git a/addons/account_tax_include/i18n/vi.po b/addons/account_tax_include/i18n/vi.po deleted file mode 100644 index 055c2581901..00000000000 --- a/addons/account_tax_include/i18n/vi.po +++ /dev/null @@ -1,53 +0,0 @@ -# Vietnamese translation for openobject-addons -# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 -# This file is distributed under the same license as the openobject-addons package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: openobject-addons\n" -"Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-08-02 14:41+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: Vietnamese \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" diff --git a/addons/account_tax_include/i18n/zh_CN.po b/addons/account_tax_include/i18n/zh_CN.po deleted file mode 100644 index b5ed33802ae..00000000000 --- a/addons/account_tax_include/i18n/zh_CN.po +++ /dev/null @@ -1,63 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0dev\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-07-13 16:34+0000\n" -"Last-Translator: Black Jack \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "无效XML视图结构!" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "价格规则" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "发票和含税价" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "含税" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "不含税" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "含税价格计算代码" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "小计" - -#~ msgid "" -#~ "Allow the user to work tax included prices.\n" -#~ "Especially useful for b2c businesses.\n" -#~ " \n" -#~ "This module implement the modification on the invoice form.\n" -#~ msgstr "" -#~ "允许用户使用含税价格\n" -#~ "特别适用于B2C商务\n" -#~ "\n" -#~ "这模块使发票的格式生效\n" diff --git a/addons/account_tax_include/i18n/zh_TW.po b/addons/account_tax_include/i18n/zh_TW.po deleted file mode 100644 index cc456963251..00000000000 --- a/addons/account_tax_include/i18n/zh_TW.po +++ /dev/null @@ -1,52 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_tax_include -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 5.0.4\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-01-30 12:43+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:00+0000\n" -"X-Generator: Launchpad (build Unknown)\n" - -#. module: account_tax_include -#: constraint:ir.ui.view:0 -msgid "Invalid XML for View Architecture!" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice,price_type:0 -msgid "Price method" -msgstr "" - -#. module: account_tax_include -#: model:ir.module.module,shortdesc:account_tax_include.module_meta_information -msgid "Invoices and prices with taxes included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax included" -msgstr "" - -#. module: account_tax_include -#: selection:account.invoice,price_type:0 -msgid "Tax excluded" -msgstr "" - -#. module: account_tax_include -#: view:account.tax:0 -msgid "Compute Code for Taxes included prices" -msgstr "" - -#. module: account_tax_include -#: field:account.invoice.line,price_subtotal_incl:0 -msgid "Subtotal" -msgstr "" diff --git a/addons/account_tax_include/test/account_tax_include.yml b/addons/account_tax_include/test/account_tax_include.yml deleted file mode 100644 index a4b0f8531b9..00000000000 --- a/addons/account_tax_include/test/account_tax_include.yml +++ /dev/null @@ -1,93 +0,0 @@ - -- - Creating a tax record -- - !record {model: account.tax, id: account_tax_a0}: - amount: 0.10000000000000001 - applicable_type: 'true' - company_id: base.main_company - description: a - name: a - sequence: 1 - type: percent - type_tax_use: all - -- - Creating a account invoice record with tax excluded -- - !record {model: account.invoice, id: account_invoice_tax_exclude}: - account_id: account.a_recv - address_contact_id: base.res_partner_address_3000 - address_invoice_id: base.res_partner_address_3000 - company_id: base.main_company - currency_id: base.EUR - invoice_line: - - account_id: account.a_sale - name: '[PC1] Basic PC' - price_unit: 100.0 - quantity: 1.0 - invoice_line_tax_id: - - account_tax_a0 - product_id: product.product_product_pc1 - uos_id: product.product_uom_unit - journal_id: account.sales_journal - partner_id: base.res_partner_desertic_hispafuentes - price_type: tax_excluded - reference_type: none - -- - Performing an osv_memory action button_reset_taxes on module account.invoice -- - !python {model: account.invoice}: | - self.button_reset_taxes(cr, uid, [ref("account_invoice_tax_exclude")], {"lang": "en_US", "tz": False, - "active_model": "ir.ui.menu", "active_ids": [ref("account.menu_action_invoice_tree1")], - "type": "out_invoice", "active_id": ref("account.menu_action_invoice_tree1"), - }) -- - Check if tax is excluded in invoice -- - !assert {model: account.invoice, id: account_invoice_tax_exclude, severity: error, string: price type is tax excluded}: - - state == "draft" - - amount_untaxed == 100.0 - - amount_tax == 10.0 - - amount_total == 110.0 - -- - Creating a account invoice record with tax include -- - !record {model: account.invoice, id: account_invoice_tax_include}: - account_id: account.a_recv - address_contact_id: base.res_partner_address_3000 - address_invoice_id: base.res_partner_address_3000 - company_id: base.main_company - currency_id: base.EUR - invoice_line: - - account_id: account.a_sale - name: '[PC1] Basic PC' - price_unit: 100.0 - quantity: 1.0 - invoice_line_tax_id: - - account_tax_a0 - product_id: product.product_product_pc1 - uos_id: product.product_uom_unit - journal_id: account.sales_journal - partner_id: base.res_partner_desertic_hispafuentes - price_type: tax_included - reference_type: none - -- - Performing an osv_memory action button_reset_taxes on module account.invoice -- - !python {model: account.invoice}: | - self.button_reset_taxes(cr, uid, [ref("account_invoice_tax_include")], {"lang": "en_US", "tz": False, - "active_model": "ir.ui.menu", "active_ids": [ref("account.menu_action_invoice_tree1")], - "type": "out_invoice", "active_id": ref("account.menu_action_invoice_tree1"), - }) -- - Check if tax is included in invoice -- - !assert {model: account.invoice, id: account_invoice_tax_include, severity: error, string: price type is tax included}: - - state == "draft" - - amount_untaxed == 90.91 - - amount_tax == 9.09 - - amount_total == 100.00 \ No newline at end of file diff --git a/addons/account_voucher/__openerp__.py b/addons/account_voucher/__openerp__.py index 683cca2442e..ce5cd607332 100644 --- a/addons/account_voucher/__openerp__.py +++ b/addons/account_voucher/__openerp__.py @@ -22,7 +22,7 @@ { "name" : "Accounting Voucher Entries", "version" : "1.0", - "author" : 'OpenERP SA & Axelor', + "author" : 'OpenERP SA', "description": """Account Voucher module includes all the basic requirements of Voucher Entries for Bank, Cash, Sales, Purchase, Expanse, Contra, etc... * Voucher Entry diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 6883a53b13f..a59b36a2736 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -257,10 +257,9 @@ class account_voucher(osv.osv): total = 0.0 total_tax = 0.0 - for line in line_ids: line_amount = 0.0 - line_amount = line[2].get('amount') + line_amount = line[2] and line[2].get('amount',0.0) or 0.0 voucher_line_ids += [line[1]] voucher_total += line_amount @@ -573,7 +572,6 @@ class account_voucher(osv.osv): move_pool = self.pool.get('account.move') move_line_pool = self.pool.get('account.move.line') currency_pool = self.pool.get('res.currency') - bank_st_line_obj = self.pool.get('account.bank.statement.line') tax_obj = self.pool.get('account.tax') for inv in self.browse(cr, uid, ids): if inv.move_id: @@ -594,11 +592,6 @@ class account_voucher(osv.osv): 'period_id': inv.period_id and inv.period_id.id or False } move_id = move_pool.create(cr, uid, move) - line_bank_ids = bank_st_line_obj.search(cr, uid, [('voucher_id', '=', inv.id)], context=context) - if line_bank_ids: - bank_st_line_obj.write(cr, uid, line_bank_ids, { - 'move_ids': [(4, move_id, False)] - }) #create the first line manually company_currency = inv.journal_id.company_id.currency_id.id @@ -868,13 +861,20 @@ class account_bank_statement(osv.osv): def create_move_from_st_line(self, cr, uid, st_line_id, company_currency_id, next_number, context=None): voucher_obj = self.pool.get('account.voucher') wf_service = netsvc.LocalService("workflow") - st_line = self.pool.get('account.bank.statement.line').browse(cr, uid, st_line_id, context=context) + bank_st_line_obj = self.pool.get('account.bank.statement.line') + st_line = bank_st_line_obj.browse(cr, uid, st_line_id, context=context) if st_line.voucher_id: voucher_obj.write(cr, uid, [st_line.voucher_id.id], {'number': next_number}, context=context) if st_line.voucher_id.state == 'cancel': voucher_obj.action_cancel_draft(cr, uid, [st_line.voucher_id.id], context=context) wf_service.trg_validate(uid, 'account.voucher', st_line.voucher_id.id, 'proforma_voucher', cr) - return self.pool.get('account.move.line').write(cr, uid, [x.id for x in st_line.voucher_id.move_ids], {'statement_id': st_line.statement_id.id}, context=context) + + v = voucher_obj.browse(cr, uid, st_line.voucher_id.id, context=context) + bank_st_line_obj.write(cr, uid, [st_line_id], { + 'move_ids': [(4, v.move_id.id, False)] + }) + + return self.pool.get('account.move.line').write(cr, uid, [x.id for x in v.move_ids], {'statement_id': st_line.statement_id.id}, context=context) return super(account_bank_statement, self).create_move_from_st_line(cr, uid, st_line.id, company_currency_id, next_number, context=context) account_bank_statement() @@ -916,4 +916,4 @@ class account_bank_statement_line(osv.osv): self.pool.get('account.voucher').unlink(cr, uid, unlink_ids, context=context) return super(account_bank_statement_line, self).unlink(cr, uid, ids, context=context) -account_bank_statement_line() \ No newline at end of file +account_bank_statement_line() diff --git a/addons/account_voucher/i18n/sr.po b/addons/account_voucher/i18n/sr.po index abad7de54da..b9f3ee0d7e1 100644 --- a/addons/account_voucher/i18n/sr.po +++ b/addons/account_voucher/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 14:35+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:35+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: account_voucher diff --git a/addons/account_voucher/security/ir.model.access.csv b/addons/account_voucher/security/ir.model.access.csv index b27392628f0..e2b048dcedd 100644 --- a/addons/account_voucher/security/ir.model.access.csv +++ b/addons/account_voucher/security/ir.model.access.csv @@ -4,6 +4,4 @@ "access_account_voucher_manager","account.voucher","model_account_voucher","account.group_account_manager",1,0,0,0 "access_account_voucher_line_manager","account.voucher.line","model_account_voucher_line","account.group_account_manager",1,0,0,0 "access_account_voucher_invoice","account.voucher invoice","model_account_voucher","account.group_account_invoice",1,1,1,1 -"access_account_voucher_system","account.voucher system","model_account_voucher","base.group_system",1,0,0,0 -"access_account_voucher_line_system","account.voucher.line.system","model_account_voucher_line","base.group_system",1,0,0,0 "access_account_voucher_line_invoice","account.voucher.line invoice","model_account_voucher_line","account.group_account_invoice",1,1,1,1 diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml index 8169cac31e3..a8f827e7bb8 100644 --- a/addons/account_voucher/voucher_payment_receipt_view.xml +++ b/addons/account_voucher/voucher_payment_receipt_view.xml @@ -235,6 +235,7 @@ current + The supplier payment form allows you to track the payment you do to your suppliers. When you select a supplier, the payment method and an amount for the payment, OpenERP will propose to reconcile your payment with the open supplier invoices or bills. @@ -342,6 +343,7 @@ current + Sales payment allows you to register the payments you receive from your customers. In order to record a payment, you must enter the customer, the payment method (=the journal) and the payment amount. OpenERP will propose to you automatically the reconciliation of this payment with the open invoices or sales receipts. diff --git a/addons/account_voucher/voucher_sales_purchase_view.xml b/addons/account_voucher/voucher_sales_purchase_view.xml index ad44b842587..ed6e98ad17d 100644 --- a/addons/account_voucher/voucher_sales_purchase_view.xml +++ b/addons/account_voucher/voucher_sales_purchase_view.xml @@ -172,6 +172,7 @@ current + When you sell products to a customer, you can give him a sales receipt or an invoice. When the sales receipt is confirmed, it creates journal items automatically and you can record the customer payment related to this sales receipt. diff --git a/addons/analytic/i18n/sr.po b/addons/analytic/i18n/sr.po index f2fc1ab5105..77fb1553933 100644 --- a/addons/analytic/i18n/sr.po +++ b/addons/analytic/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-06-18 10:59+0000\n" -"PO-Revision-Date: 2010-10-14 15:01+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 08:47+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: analytic diff --git a/addons/analytic_journal_billing_rate/i18n/sr.po b/addons/analytic_journal_billing_rate/i18n/sr.po index d65fb0fd7fb..cad00d3772c 100644 --- a/addons/analytic_journal_billing_rate/i18n/sr.po +++ b/addons/analytic_journal_billing_rate/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 15:09+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:19+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: analytic_journal_billing_rate diff --git a/addons/analytic_user_function/i18n/sr.po b/addons/analytic_user_function/i18n/sr.po index ff890fa4c9e..846409dd53d 100644 --- a/addons/analytic_user_function/i18n/sr.po +++ b/addons/analytic_user_function/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 15:16+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:40+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: analytic_user_function diff --git a/addons/auction/auction_view.xml b/addons/auction/auction_view.xml index 43de651e554..36a1b60096c 100644 --- a/addons/auction/auction_view.xml +++ b/addons/auction/auction_view.xml @@ -2,8 +2,8 @@ - + groups="group_auction_manager,group_auction_user"/> + @@ -82,7 +82,7 @@ + id="menu_auction_object_cat" groups="group_auction_manager"/> @@ -765,7 +765,7 @@ - + - + diff --git a/addons/auction/security/ir.model.access.csv b/addons/auction/security/ir.model.access.csv index 31f3182fa04..5458e6c2ac3 100644 --- a/addons/auction/security/ir.model.access.csv +++ b/addons/auction/security/ir.model.access.csv @@ -18,15 +18,6 @@ "access_report_auction_adjudication","report.auction.adjudication","model_report_auction_adjudication","group_auction_manager",1,1,1,1 "access_report_object_encoded","report.object.encoded","model_report_object_encoded","group_auction_manager",1,1,1,1 "access_aie_category","aie.category","model_aie_category","group_auction_manager",1,1,1,1 -"access_auction_dates_system","auction.dates system","model_auction_dates","base.group_system",1,0,0,0 -"access_auction_lots_system","auction.lots system","model_auction_lots","base.group_system",1,0,0,0 -"access_auction_deposit_system","auction.deposit system","model_auction_deposit","base.group_system",1,0,0,0 -"access_auction_bid_system","auction.bid system","model_auction_bid","base.group_system",1,0,0,0 -"access_auction_artists_system","auction.artists system","model_auction_artists","base.group_system",1,1,1,1 -"access_auction_lot_category_system","auction.lot.category system","model_auction_lot_category","base.group_system",1,1,1,1 -"access_auction_lot_history_system","auction.lot.history system","model_auction_lot_history","base.group_system",1,0,0,0 -"access_auction_deposit_cost_system","auction.deposit.cost system","model_auction_deposit_cost","base.group_system",1,0,0,0 -"access_auction_bid_line_system","auction.bid.line system","model_auction_bid_line","base.group_system",1,0,0,0 "access_auction_account_tax","account.tax manager","account.model_account_tax","group_auction_manager",1,1,1,0 "access_auction_account_fiscalyear","account.fiscalyear manager","account.model_account_fiscalyear","group_auction_manager",1,1,1,0 "access_auction_account_journal","account.journal manager","account.model_account_journal","group_auction_manager",1,1,1,0 diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py index dd843449c8c..c2ef5f5d4a4 100644 --- a/addons/audittrail/audittrail.py +++ b/addons/audittrail/audittrail.py @@ -456,7 +456,7 @@ class audittrail_objects_proxy(osv_pool): """ Overrides Object Proxy execute method @param db: the current database - @param uid: the current user’s ID for security checks, + @param uid: the current user's ID for security checks, @param object: Object who's values are being changed @param method: get any method and create log @@ -500,49 +500,47 @@ class audittrail_objects_proxy(osv_pool): return self.log_fct(db, uid, model, method, fct_src, *args) return fct_src(db, uid, model, method, *args) - res = my_fct(db, uid, model, method, *args) - cr.close() - return res - + try: + res = my_fct(db, uid, model, method, *args) + return res + finally: + cr.close() def exec_workflow(self, db, uid, model, method, *args, **argv): pool = pooler.get_pool(db) - cr = pooler.get_db(db).cursor() - cr.autocommit(True) logged_uids = [] fct_src = super(audittrail_objects_proxy, self).exec_workflow field = method rule = False model_pool = pool.get('ir.model') rule_pool = pool.get('audittrail.rule') - model_ids = model_pool.search(cr, uid, [('model', '=', model)]) - for obj_name in pool.obj_list(): - if obj_name == 'audittrail.rule': - rule = True - if not rule: - cr.close() - return super(audittrail_objects_proxy, self).exec_workflow(db, uid, model, method, *args, **argv) - if not model_ids: - cr.close() - return super(audittrail_objects_proxy, self).exec_workflow(db, uid, model, method, *args, **argv) + cr = pooler.get_db(db).cursor() + cr.autocommit(True) + try: + model_ids = model_pool.search(cr, uid, [('model', '=', model)]) + for obj_name in pool.obj_list(): + if obj_name == 'audittrail.rule': + rule = True + if not rule: + return super(audittrail_objects_proxy, self).exec_workflow(db, uid, model, method, *args, **argv) + if not model_ids: + return super(audittrail_objects_proxy, self).exec_workflow(db, uid, model, method, *args, **argv) - rule_ids = rule_pool.search(cr, uid, [('object_id', 'in', model_ids), ('state', '=', 'subscribed')]) - if not rule_ids: - cr.close() - return super(audittrail_objects_proxy, self).exec_workflow(db, uid, model, method, *args, **argv) + rule_ids = rule_pool.search(cr, uid, [('object_id', 'in', model_ids), ('state', '=', 'subscribed')]) + if not rule_ids: + return super(audittrail_objects_proxy, self).exec_workflow(db, uid, model, method, *args, **argv) - for thisrule in rule_pool.browse(cr, uid, rule_ids): - for user in thisrule.user_id: - logged_uids.append(user.id) - if not logged_uids or uid in logged_uids: - if thisrule.log_workflow: - cr.close() - return self.log_fct(db, uid, model, method, fct_src, *args) + for thisrule in rule_pool.browse(cr, uid, rule_ids): + for user in thisrule.user_id: + logged_uids.append(user.id) + if not logged_uids or uid in logged_uids: + if thisrule.log_workflow: + return self.log_fct(db, uid, model, method, fct_src, *args) + return super(audittrail_objects_proxy, self).exec_workflow(db, uid, model, method, *args, **argv) + + return True + finally: cr.close() - return super(audittrail_objects_proxy, self).exec_workflow(db, uid, model, method, *args, **argv) - - cr.close() - return True audittrail_objects_proxy() diff --git a/addons/audittrail/audittrail_view.xml b/addons/audittrail/audittrail_view.xml index 218db24d89a..5fdcfcd5558 100644 --- a/addons/audittrail/audittrail_view.xml +++ b/addons/audittrail/audittrail_view.xml @@ -55,7 +55,7 @@ - Rules + Audit Rules audittrail.rule ir.actions.act_window form @@ -63,12 +63,8 @@ - - + action="action_audittrail_rule_tree" parent="base.menu_audit" /> @@ -152,12 +148,12 @@ - Logs + Audit Logs audittrail.log form + action="action_audittrail_log_tree" parent="base.menu_audit" /> diff --git a/addons/audittrail/i18n/ru.po b/addons/audittrail/i18n/ru.po index 9bc201a24c2..30a63c8c88d 100644 --- a/addons/audittrail/i18n/ru.po +++ b/addons/audittrail/i18n/ru.po @@ -7,19 +7,19 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-08-03 00:52+0000\n" -"Last-Translator: mga (Open ERP) \n" +"PO-Revision-Date: 2010-10-16 09:06+0000\n" +"Last-Translator: Nikolay Chesnokov \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:13+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: audittrail #: model:ir.module.module,shortdesc:audittrail.module_meta_information msgid "Audit Trail" -msgstr "" +msgstr "Проведение аудита" #. module: audittrail #: constraint:ir.model:0 @@ -43,6 +43,8 @@ msgstr "Подписка" #: view:audittrail.log:0 msgid "Old Value : " msgstr "" +"Старое значение.\\nпредставление пробела. Введите пробел в эквивалентную " +"позицию перевода " #. module: audittrail #: selection:audittrail.log,method:0 @@ -52,7 +54,7 @@ msgstr "Создать" #. module: audittrail #: wizard_view:audittrail.view.log,init:0 msgid "Audit Logs" -msgstr "" +msgstr "Логи аудита" #. module: audittrail #: field:audittrail.rule,state:0 @@ -82,7 +84,7 @@ msgstr "Просмотреть журнал" #. module: audittrail #: model:ir.model,name:audittrail.model_audittrail_log_line msgid "audittrail.log.line" -msgstr "" +msgstr "Строки лога аудита" #. module: audittrail #: field:audittrail.log,method:0 @@ -92,17 +94,17 @@ msgstr "Метод" #. module: audittrail #: wizard_field:audittrail.view.log,init,from:0 msgid "Log From" -msgstr "" +msgstr "Форма лога" #. module: audittrail #: field:audittrail.log.line,log:0 msgid "Log ID" -msgstr "" +msgstr "Идентификатор лога" #. module: audittrail #: field:audittrail.log,res_id:0 msgid "Resource Id" -msgstr "" +msgstr "Идентификатор записи" #. module: audittrail #: selection:audittrail.log,method:0 @@ -112,12 +114,12 @@ msgstr "Написать" #. module: audittrail #: model:ir.ui.menu,name:audittrail.menu_action_audittrail msgid "Audittrails" -msgstr "" +msgstr "Проведение аудита" #. module: audittrail #: view:audittrail.log:0 msgid "Log Lines" -msgstr "" +msgstr "Строки лога" #. module: audittrail #: view:audittrail.rule:0 @@ -138,17 +140,17 @@ msgstr "Объект" #. module: audittrail #: view:audittrail.rule:0 msgid "AuditTrail Rule" -msgstr "" +msgstr "Правила проведения аудита" #. module: audittrail #: wizard_field:audittrail.view.log,init,to:0 msgid "Log To" -msgstr "" +msgstr "Запись лога по" #. module: audittrail #: view:audittrail.log:0 msgid "New Value Text: " -msgstr "" +msgstr "Новое значение текста: " #. module: audittrail #: model:ir.module.module,description:audittrail.module_meta_information @@ -158,6 +160,9 @@ msgid "" " Subscribe Rules for read, write, create and delete on objects and check " "logs" msgstr "" +"Позволяет администратору отслеживать операции каждого пользователя по всем " +"объектам системы.\\nУстанавливает правила читать, писать, создавать и " +"удалять на объектах и проверить журналы." #. module: audittrail #: field:audittrail.log,timestamp:0 @@ -172,7 +177,7 @@ msgstr "Пользователь" #. module: audittrail #: view:audittrail.log:0 msgid "Old Value Text : " -msgstr "" +msgstr "Старое значение текста: " #. module: audittrail #: constraint:ir.ui.view:0 @@ -187,12 +192,12 @@ msgstr "Название" #. module: audittrail #: field:audittrail.log,line_ids:0 msgid "Log lines" -msgstr "" +msgstr "Строги лога" #. module: audittrail #: model:ir.ui.menu,name:audittrail.menu_action_audittrail_rule_tree_sub msgid "Subscribed Rules" -msgstr "" +msgstr "Правила подписки" #. module: audittrail #: field:audittrail.log.line,field_id:0 @@ -202,12 +207,12 @@ msgstr "Поля" #. module: audittrail #: view:audittrail.rule:0 msgid "AuditTrail Rules" -msgstr "" +msgstr "Правила проведения аудита" #. module: audittrail #: model:ir.model,name:audittrail.model_audittrail_rule msgid "audittrail.rule" -msgstr "" +msgstr "Правила аудита" #. module: audittrail #: view:audittrail.rule:0 @@ -217,17 +222,17 @@ msgstr "Отписаться" #. module: audittrail #: field:audittrail.rule,log_write:0 msgid "Log writes" -msgstr "" +msgstr "Записи лога" #. module: audittrail #: model:ir.model,name:audittrail.model_audittrail_log msgid "audittrail.log" -msgstr "" +msgstr "Журнал проведения аудита" #. module: audittrail #: field:audittrail.log.line,field_description:0 msgid "Field Description" -msgstr "" +msgstr "Описание поля" #. module: audittrail #: selection:audittrail.log,method:0 @@ -237,12 +242,12 @@ msgstr "Удалить" #. module: audittrail #: wizard_button:audittrail.view.log,init,open:0 msgid "Open Logs" -msgstr "" +msgstr "Открыть лог" #. module: audittrail #: field:audittrail.log.line,new_value_text:0 msgid "New value Text" -msgstr "" +msgstr "Новое значение текста" #. module: audittrail #: field:audittrail.rule,name:0 @@ -252,7 +257,7 @@ msgstr "Название правила" #. module: audittrail #: field:audittrail.rule,log_read:0 msgid "Log reads" -msgstr "" +msgstr "Чтение лога" #. module: audittrail #: model:ir.ui.menu,name:audittrail.menu_action_audittrail_log_tree @@ -262,22 +267,22 @@ msgstr "Журналы" #. module: audittrail #: field:audittrail.log.line,new_value:0 msgid "New Value" -msgstr "" +msgstr "Новое значение" #. module: audittrail #: model:ir.ui.menu,name:audittrail.menu_action_log_tree2 msgid "View Logs" -msgstr "" +msgstr "Чтение лога" #. module: audittrail #: field:audittrail.rule,log_create:0 msgid "Log creates" -msgstr "" +msgstr "Созданные журналы" #. module: audittrail #: view:audittrail.log:0 msgid "AuditTrail Logs" -msgstr "" +msgstr "Логи проведения аудита" #. module: audittrail #: model:ir.ui.menu,name:audittrail.menu_action_audittrail_rule_tree @@ -287,7 +292,7 @@ msgstr "Правила" #. module: audittrail #: view:audittrail.log:0 msgid "New Value : " -msgstr "" +msgstr "Новое значение " #. module: audittrail #: field:audittrail.rule,user_id:0 @@ -297,7 +302,7 @@ msgstr "Пользователи" #. module: audittrail #: field:audittrail.log.line,old_value_text:0 msgid "Old value Text" -msgstr "" +msgstr "Старое значение текста" #. module: audittrail #: wizard_button:audittrail.view.log,init,end:0 @@ -307,4 +312,4 @@ msgstr "Отмена" #. module: audittrail #: field:audittrail.rule,log_unlink:0 msgid "Log deletes" -msgstr "" +msgstr "Удаленные логи" diff --git a/addons/audittrail/security/ir.model.access.csv b/addons/audittrail/security/ir.model.access.csv index ac367182f26..877cf622ad4 100644 --- a/addons/audittrail/security/ir.model.access.csv +++ b/addons/audittrail/security/ir.model.access.csv @@ -1,7 +1,4 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_audittrail_rule_group_system","audittrail rule system","model_audittrail_rule","base.group_system",1,1,1,1 -"access_audittrail_log_group_system","audittrail log system","model_audittrail_log","base.group_system",1,1,1,1 -"access_audittrail_logline_group_system","audittrail log line system","model_audittrail_log_line","base.group_system",1,1,1,1 "access_audittrail_rule_all_users","audittrail rule all","model_audittrail_rule","base.group_user",1,0,0,0 "access_audittrail_log_all_users","audittrail log all","model_audittrail_log","base.group_user",1,0,1,0 "access_audittrail_log_line_all_users","audittrail log line all","model_audittrail_log_line","base.group_user",1,0,1,0 diff --git a/addons/base_action_rule/base_action_rule_view.xml b/addons/base_action_rule/base_action_rule_view.xml index 01951b3c9b8..cc8966316fd 100644 --- a/addons/base_action_rule/base_action_rule_view.xml +++ b/addons/base_action_rule/base_action_rule_view.xml @@ -114,6 +114,7 @@ form tree,form + Create actions automatically triggered based on a user activity in the system.E.g.: an opportunity created by a specific user can be automatically maintained with a specific sales team, or an opportunity which still has status pending after 14 days triggers an automatic reminder email. 1: #If interval is other than 1 rule is custom rrule_type = 'custom' - qry = "UPDATE %(table)s set rrule_type=\'%(rule_type)s\' " + qry = "UPDATE \"%s\" set rrule_type=%%s " % self._table + qry_args = [ rrule_type, ] if rrule_type == 'custom': new_val = val.copy() @@ -1055,17 +1056,12 @@ class calendar_event(osv.osv): new_val.pop('bymonth') for k, v in new_val.items(): - temp = ", %s='%s'" % (k, v) - qry += temp + qry += ", %s=%%s" % k + qry_args.append(v) - whr = " where id=%(id)s" - qry = qry + whr - val.update({ - 'table': self._table, - 'rule_type': rrule_type, - 'id': id, - }) - cr.execute(qry % val) + qry = qry + " where id=%s" + qry_args.append(id) + cr.execute(qry, qry_args) return True def _get_rulestring(self, cr, uid, ids, name, arg, context=None): @@ -1479,6 +1475,8 @@ true, it will allow you to hide the event alarm information without removing it. if not real_event_id in new_ids: new_ids.append(real_event_id) + if vals.get('vtimezone', '').startswith('/freeassociation.sourceforge.net/tzfile/'): + vals['vtimezone'] = vals['vtimezone'][40:] if new_ids: res = super(calendar_event, self).write(cr, uid, new_ids, vals, context=context) if (vals.has_key('alarm_id') or vals.has_key('base_calendar_alarm_id'))\ @@ -1489,7 +1487,7 @@ true, it will allow you to hide the event alarm information without removing it. context=context) return res - def browse(self, cr, uid, ids, context=None, list_class=None, fields_process={}): + def browse(self, cr, uid, ids, context=None, list_class=None, fields_process=None): """ Overrides orm browse method. @param self: the object pointer @@ -1608,6 +1606,8 @@ true, it will allow you to hide the event alarm information without removing it. """ if not context: context = {} + if vals.get('vtimezone', '') and vals.get('vtimezone', '').startswith('/freeassociation.sourceforge.net/tzfile/'): + vals['vtimezone'] = vals['vtimezone'][40:] res = super(calendar_event, self).create(cr, uid, vals, context) alarm_obj = self.pool.get('res.alarm') alarm_obj.do_alarm_create(cr, uid, [res], self._name, 'date', context=context) @@ -1682,7 +1682,7 @@ class calendar_todo(osv.osv): @param args: list of tuples of form [(‘name_of_the_field’, ‘operator’, value), ...]. @param context: A standard dictionary for contextual values """ - + assert name == 'date' return self.write(cr, uid, id, { 'date_start': value }, context=context) diff --git a/addons/base_calendar/base_calendar_view.xml b/addons/base_calendar/base_calendar_view.xml index b5f234aa7cb..9f27e79d5a5 100644 --- a/addons/base_calendar/base_calendar_view.xml +++ b/addons/base_calendar/base_calendar_view.xml @@ -157,12 +157,12 @@ - + - @@ -208,6 +208,7 @@ res.alarm form tree,form + Create specific calendar alarms that can be assigned to calendar events or meetings. diff --git a/addons/base_calendar/security/ir.model.access.csv b/addons/base_calendar/security/ir.model.access.csv index 0ae628fb720..aa269e9ff18 100644 --- a/addons/base_calendar/security/ir.model.access.csv +++ b/addons/base_calendar/security/ir.model.access.csv @@ -1,5 +1,5 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_calendar_attendee","calendar.attendee","model_calendar_attendee","base.group_user",1,1,1,0 +"access_calendar_attendee","calendar.attendee","model_calendar_attendee","base.group_user",1,1,1,1 "access_calendar_alarm","calendar.alarm","model_calendar_alarm","base.group_user",1,1,1,1 "access_res_alarm","res.alarm","model_res_alarm","base.group_user",1,1,1,1 "access_calendar_todo","calendar.todo","model_calendar_todo","base.group_user",1,1,1,1 diff --git a/addons/base_contact/i18n/sr.po b/addons/base_contact/i18n/sr.po index 9a3fb65353b..b8dc4170bdf 100644 --- a/addons/base_contact/i18n/sr.po +++ b/addons/base_contact/i18n/sr.po @@ -8,35 +8,36 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-21 12:30+0000\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2010-10-16 09:28+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 04:58+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base_contact #: field:res.partner.job,sequence_contact:0 msgid "Contact Seq." -msgstr "" +msgstr "Seq. Osobe" #. module: base_contact #: model:ir.model,name:base_contact.model_res_partner_contact msgid "res.partner.contact" -msgstr "" +msgstr "es.partner.contact" #. module: base_contact #: constraint:ir.model:0 msgid "" "The Object name must start with x_ and not contain any special character !" msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" #. module: base_contact #: field:res.partner.job,function_id:0 msgid "Partner Function" -msgstr "" +msgstr "Funkcija Partnera" #. module: base_contact #: model:ir.actions.act_window,name:base_contact.action_partner_contact_form @@ -46,97 +47,97 @@ msgstr "" #: view:res.partner.address:0 #: field:res.partner.address,job_ids:0 msgid "Contacts" -msgstr "" +msgstr "Kontakti" #. module: base_contact #: field:res.partner.job,sequence_partner:0 msgid "Partner Seq." -msgstr "" +msgstr "Partner Seq." #. module: base_contact #: selection:res.partner.job,state:0 msgid "Current" -msgstr "" +msgstr "Trenutni" #. module: base_contact #: field:res.partner.contact,first_name:0 msgid "First Name" -msgstr "" +msgstr "Ime" #. module: base_contact #: model:ir.model,name:base_contact.model_res_partner_job msgid "Contact Partner Function" -msgstr "" +msgstr "Funkcija Kontakta Partnera" #. module: base_contact #: field:res.partner.job,other:0 msgid "Other" -msgstr "" +msgstr "Drugo" #. module: base_contact #: model:process.transition,name:base_contact.process_transition_contacttofunction0 msgid "Contact to function" -msgstr "" +msgstr "Kontakt na funkciju" #. module: base_contact #: constraint:ir.actions.act_window:0 msgid "Invalid model name in the action definition." -msgstr "" +msgstr "Pogrešno ime modela u definiciji akcije." #. module: base_contact #: model:process.transition,name:base_contact.process_transition_partnertoaddress0 msgid "Partner to address" -msgstr "" +msgstr "Partner na adresu" #. module: base_contact #: view:res.partner.address:0 msgid "# of Contacts" -msgstr "" +msgstr "# Kontakata" #. module: base_contact #: help:res.partner.job,other:0 msgid "Additional phone field" -msgstr "" +msgstr "Dodatno polje za Tel" #. module: base_contact #: model:process.node,name:base_contact.process_node_function0 msgid "Function" -msgstr "" +msgstr "Funkcija" #. module: base_contact #: field:res.partner.job,fax:0 msgid "Fax" -msgstr "" +msgstr "Faks" #. module: base_contact #: field:res.partner.contact,lang_id:0 msgid "Language" -msgstr "" +msgstr "Jezik" #. module: base_contact #: field:res.partner.job,phone:0 msgid "Phone" -msgstr "" +msgstr "Telefon" #. module: base_contact #: model:process.transition,note:base_contact.process_transition_contacttofunction0 msgid "Defines contacts and functions." -msgstr "" +msgstr "Određuje Osobe i Funkcije" #. module: base_contact #: field:res.partner.contact,title:0 msgid "Title" -msgstr "" +msgstr "Naslov" #. module: base_contact #: view:res.partner.job:0 msgid "Contact Functions" -msgstr "" +msgstr "Funkcije Osoba" #. module: base_contact #: model:ir.module.module,shortdesc:base_contact.module_meta_information msgid "Base Contact" -msgstr "" +msgstr "Osnovni Kontakt" #. module: base_contact #: help:res.partner.job,sequence_partner:0 @@ -144,212 +145,214 @@ msgid "" "Order of importance of this job title in the list of job title of the linked " "partner" msgstr "" +"redosled važnosti ovog naziva Posla-Radnog mesta u listi naziva Poslova-" +"Radnih mesta povezanog Partnera" #. module: base_contact #: field:res.partner.contact,email:0 #: field:res.partner.job,email:0 msgid "E-Mail" -msgstr "" +msgstr "E-Mail" #. module: base_contact #: field:res.partner.job,date_stop:0 msgid "Date Stop" -msgstr "" +msgstr "Datum Završetka" #. module: base_contact #: view:res.partner:0 #: field:res.partner.job,address_id:0 msgid "Address" -msgstr "" +msgstr "Adresa" #. module: base_contact #: model:ir.actions.act_window,name:base_contact.action_res_partner_job #: model:ir.ui.menu,name:base_contact.menu_action_res_partner_job msgid "Contact's Jobs" -msgstr "" +msgstr "Poslovi kontakta" #. module: base_contact #: field:res.partner.contact,country_id:0 msgid "Nationality" -msgstr "" +msgstr "Nacionalnost" #. module: base_contact #: help:res.partner.job,sequence_contact:0 msgid "" "Order of importance of this address in the list of addresses of the linked " "contact" -msgstr "" +msgstr "redosled važnosti ove Adrese u listi Adresa povezanog Partnera" #. module: base_contact #: field:res.partner.address,job_id:0 #: field:res.partner.contact,job_id:0 msgid "Main Job" -msgstr "" +msgstr "Glavni Posao" #. module: base_contact #: view:res.partner:0 msgid "Categories" -msgstr "" +msgstr "Kategorije" #. module: base_contact #: field:res.partner.contact,function_id:0 msgid "Main Function" -msgstr "" +msgstr "Glavna Funkcija" #. module: base_contact #: model:process.transition,note:base_contact.process_transition_partnertoaddress0 msgid "Define partners and their addresses." -msgstr "" +msgstr "Definisi Partnere i njihove Adrese" #. module: base_contact #: constraint:ir.ui.view:0 msgid "Invalid XML for View Architecture!" -msgstr "" +msgstr "Nevažeći XML za pregled arhitekture" #. module: base_contact #: model:process.process,name:base_contact.process_process_basecontactprocess0 msgid "Base Contact Process" -msgstr "" +msgstr "Postupak Osnovnog Kontakta" #. module: base_contact #: view:res.partner.contact:0 msgid "Seq." -msgstr "" +msgstr "Sekv." #. module: base_contact #: field:res.partner.job,extension:0 msgid "Extension" -msgstr "" +msgstr "Dodatak" #. module: base_contact #: field:res.partner.contact,mobile:0 msgid "Mobile" -msgstr "" +msgstr "Mobilni" #. module: base_contact #: help:res.partner.job,extension:0 msgid "Internal/External extension phone number" -msgstr "" +msgstr "Interna/Externa Ekstenzija Tel. broja" #. module: base_contact #: model:process.node,note:base_contact.process_node_contacts0 msgid "People you work with." -msgstr "" +msgstr "Ljudi s kojima radite." #. module: base_contact #: view:res.partner.contact:0 msgid "Extra Information" -msgstr "" +msgstr "Dodatne informacije" #. module: base_contact #: view:res.partner.contact:0 #: field:res.partner.contact,job_ids:0 msgid "Functions and Addresses" -msgstr "" +msgstr "Funkcije i Adrese" #. module: base_contact #: field:res.partner.contact,active:0 msgid "Active" -msgstr "" +msgstr "Aktivan" #. module: base_contact #: field:res.partner.job,contact_id:0 msgid "Contact" -msgstr "" +msgstr "Kontakt" #. module: base_contact #: model:process.node,note:base_contact.process_node_partners0 msgid "Companies you work with." -msgstr "" +msgstr "Kompanije s kojima radite." #. module: base_contact #: field:res.partner.contact,partner_id:0 msgid "Main Employer" -msgstr "" +msgstr "Glavni Poslodavac." #. module: base_contact #: model:process.transition,name:base_contact.process_transition_functiontoaddress0 msgid "Function to address" -msgstr "" +msgstr "Funkcija na Adresu" #. module: base_contact #: model:ir.actions.act_window,name:base_contact.act_res_partner_jobs msgid "Partner Contacts" -msgstr "" +msgstr "Kontakti partnera" #. module: base_contact #: view:res.partner.contact:0 msgid "Partner Contact" -msgstr "" +msgstr "Kontakt partnera" #. module: base_contact #: model:process.node,name:base_contact.process_node_partners0 msgid "Partners" -msgstr "" +msgstr "Partneri" #. module: base_contact #: model:process.node,name:base_contact.process_node_addresses0 #: view:res.partner:0 msgid "Addresses" -msgstr "" +msgstr "Adrese" #. module: base_contact #: model:process.node,note:base_contact.process_node_addresses0 msgid "Working and private addresses." -msgstr "" +msgstr "Rad na Privatnoj adresi" #. module: base_contact #: field:res.partner.contact,name:0 msgid "Last Name" -msgstr "" +msgstr "Prezime" #. module: base_contact #: field:res.partner.job,state:0 msgid "State" -msgstr "" +msgstr "Stanje" #. module: base_contact #: view:res.partner.contact:0 #: view:res.partner.job:0 msgid "General" -msgstr "" +msgstr "Opšte" #. module: base_contact #: selection:res.partner.job,state:0 msgid "Past" -msgstr "" +msgstr "Prošlost" #. module: base_contact #: view:res.partner.contact:0 msgid "General Information" -msgstr "" +msgstr "Opšte informacije" #. module: base_contact #: model:process.node,note:base_contact.process_node_function0 msgid "Jobs at a same partner address." -msgstr "" +msgstr "Poslovi na istoj Adresi Partnera" #. module: base_contact #: field:res.partner.job,name:0 msgid "Partner" -msgstr "" +msgstr "Partner" #. module: base_contact #: field:res.partner.job,date_start:0 msgid "Date Start" -msgstr "" +msgstr "Početni datum" #. module: base_contact #: model:process.transition,note:base_contact.process_transition_functiontoaddress0 msgid "Define functions and address." -msgstr "" +msgstr "Definisi Funkcije i Adrese" #. module: base_contact #: field:res.partner.contact,website:0 msgid "Website" -msgstr "" +msgstr "Internet stranica" #. module: base_contact #: field:res.partner.contact,birthdate:0 msgid "Birth Date" -msgstr "" +msgstr "Datum rođenja" diff --git a/addons/base_iban/i18n/sr.po b/addons/base_iban/i18n/sr.po index 23ba5329fd3..cd0a36c5208 100644 --- a/addons/base_iban/i18n/sr.po +++ b/addons/base_iban/i18n/sr.po @@ -8,57 +8,57 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-21 12:29+0000\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2010-10-16 09:02+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 04:52+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base_iban #: constraint:ir.ui.view:0 msgid "Invalid XML for View Architecture!" -msgstr "" +msgstr "Nevažeći XML za pregled arhitekture" #. module: base_iban #: model:res.partner.bank.type.field,name:base_iban.bank_zip_field msgid "zip" -msgstr "" +msgstr "Pošt. Broj" #. module: base_iban #: help:res.partner.bank,iban:0 msgid "International Bank Account Number" -msgstr "" +msgstr "Međunarodni broj Bankovnog računa" #. module: base_iban #: model:res.partner.bank.type.field,name:base_iban.bank_country_field msgid "country_id" -msgstr "" +msgstr "country_id" #. module: base_iban #: model:res.partner.bank.type.field,name:base_iban.bank_swift_field msgid "bic" -msgstr "" +msgstr "bic" #. module: base_iban #: model:res.partner.bank.type.field,name:base_iban.bank_iban_field msgid "iban" -msgstr "" +msgstr "iban" #. module: base_iban #: model:ir.module.module,shortdesc:base_iban.module_meta_information #: field:res.partner.bank,iban:0 msgid "IBAN" -msgstr "" +msgstr "IBAN" #. module: base_iban #: model:res.partner.bank.type,name:base_iban.bank_iban msgid "IBAN Account" -msgstr "" +msgstr "IBAN konto" #. module: base_iban #: model:res.partner.bank.type.field,name:base_iban.bank_acc_number_field msgid "acc_number" -msgstr "" +msgstr "Broj konta" diff --git a/addons/base_module_quality/i18n/it.po b/addons/base_module_quality/i18n/it.po index 6f151909339..72b5fbe607d 100644 --- a/addons/base_module_quality/i18n/it.po +++ b/addons/base_module_quality/i18n/it.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-09-29 11:04+0000\n" -"Last-Translator: OpenERP Administrators \n" +"PO-Revision-Date: 2010-10-16 08:17+0000\n" +"Last-Translator: simone.sandri \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-30 04:43+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base_module_quality @@ -38,7 +38,7 @@ msgstr "Modulo base di qualità" #. module: base_module_quality #: field:module.quality.check,name:0 msgid "Rated Module" -msgstr "" +msgstr "Valuta Modulo" #. module: base_module_quality #: view:module.quality.detail:0 diff --git a/addons/base_module_quality/i18n/sr.po b/addons/base_module_quality/i18n/sr.po index 083bd2bfafd..83992eb2640 100644 --- a/addons/base_module_quality/i18n/sr.po +++ b/addons/base_module_quality/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 15:37+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-16 11:23+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base_module_quality @@ -138,32 +138,32 @@ msgstr "Sumarno" #. module: base_module_quality #: model:ir.actions.wizard,name:base_module_quality.quality_detail_save msgid "Report Save" -msgstr "" +msgstr "Sacuvaj Izvestaj" #. module: base_module_quality #: wizard_view:quality_detail_save,init:0 msgid "Standard entries" -msgstr "" +msgstr "Standardne stavke" #. module: base_module_quality #: view:module.quality.detail:0 msgid "Save Report" -msgstr "" +msgstr "Sacuvaj Izvestaj" #. module: base_module_quality #: model:ir.actions.wizard,name:base_module_quality.create_quality_check_id msgid "Quality Check" -msgstr "" +msgstr "Provera Kvaliteta" #. module: base_module_quality #: model:ir.model,name:base_module_quality.model_module_quality_detail msgid "module.quality.detail" -msgstr "" +msgstr "modul.detalj.kvalitet" #. module: base_module_quality #: selection:module.quality.detail,state:0 msgid "Done" -msgstr "" +msgstr "Gotovo" #. module: base_module_quality #: view:module.quality.check:0 @@ -174,12 +174,12 @@ msgstr "Rezultat" #. module: base_module_quality #: wizard_button:quality_detail_save,init,end:0 msgid "Cancel" -msgstr "" +msgstr "Otkaži" #. module: base_module_quality #: field:module.quality.detail,message:0 msgid "Message" -msgstr "" +msgstr "Poruka" #. module: base_module_quality #: field:module.quality.detail,quality_check_id:0 diff --git a/addons/base_module_record/i18n/sr.po b/addons/base_module_record/i18n/sr.po index 65d7ba6bb4f..40a3beef7c4 100644 --- a/addons/base_module_record/i18n/sr.po +++ b/addons/base_module_record/i18n/sr.po @@ -8,99 +8,100 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-21 12:24+0000\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2010-10-16 10:25+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 04:58+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,intro,category:0 #: wizard_field:base_module_record.module_save,info,category:0 msgid "Category" -msgstr "" +msgstr "Категорија" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save:0 #: wizard_field:base_module_record.module_save,init,info_text:0 #: wizard_view:base_module_record.module_save,save:0 msgid "Information" -msgstr "" +msgstr "Informacija" #. module: base_module_record #: model:ir.model,name:base_module_record.model_ir_module_record msgid "ir.module.record" -msgstr "" +msgstr "ir.module.record" #. module: base_module_record #: constraint:ir.model:0 msgid "" "The Object name must start with x_ and not contain any special character !" msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,init:0 msgid "Choose objects to record" -msgstr "" +msgstr "Izaberi objekat za cuvanje" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,intro,author:0 #: wizard_field:base_module_record.module_save,info,author:0 msgid "Author" -msgstr "" +msgstr "Autor" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,intro,directory_name:0 #: wizard_field:base_module_record.module_save,info,directory_name:0 msgid "Directory Name" -msgstr "" +msgstr "Ime Direktorijuma" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,init,filter_cond:0 msgid "Records only" -msgstr "" +msgstr "Samo Zapisi" #. module: base_module_record #: selection:base_module_record.module_record_objects,intro,data_kind:0 #: selection:base_module_record.module_save,info,data_kind:0 msgid "Demo Data" -msgstr "" +msgstr "Demo Podaci" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,save,module_filename:0 #: wizard_field:base_module_record.module_save,save,module_filename:0 msgid "Filename" -msgstr "" +msgstr "Ime Fajla" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,intro,version:0 #: wizard_field:base_module_record.module_save,info,version:0 msgid "Version" -msgstr "" +msgstr "Verzija" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,init:0 msgid "Objects Recording" -msgstr "" +msgstr "Objekti se Snimaju" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,init,check_date:0 msgid "Record from Date" -msgstr "" +msgstr "Zapis od Datuma" #. module: base_module_record #: wizard_view:base_module_record.module_record,stop:0 #: wizard_view:base_module_record.module_save,init:0 msgid "Recording Information" -msgstr "" +msgstr "Informacija o Snimanju" #. module: base_module_record #: wizard_field:base_module_record.module_save,init,info_status:0 msgid "Status" -msgstr "" +msgstr "Status" #. module: base_module_record #: wizard_view:base_module_record.module_record,stop:0 @@ -112,111 +113,111 @@ msgstr "" #: wizard_view:base_module_record.module_save,init:0 #: wizard_view:base_module_record.module_save,save:0 msgid "Module Recording" -msgstr "" +msgstr "Snimanje Modula" #. module: base_module_record #: model:ir.actions.wizard,name:base_module_record.wizard_base_module_record_objects #: model:ir.ui.menu,name:base_module_record.menu_wizard_base_module_record_objects msgid "Export Customizations As a Module" -msgstr "" +msgstr "Izvezi Podesavanja kao Modul" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save:0 #: wizard_view:base_module_record.module_save,save:0 msgid "Thanks in advance for your contribution." -msgstr "" +msgstr "Hvala unaprijed na Vašem Doprinosu" #. module: base_module_record #: help:base_module_record.module_record_objects,init,objects:0 msgid "List of objects to be recorded" -msgstr "" +msgstr "Lista Objekata za zapis" #. module: base_module_record #: wizard_button:base_module_record.module_record,start,start_confirm:0 #: model:ir.ui.menu,name:base_module_record.menu_wizard_base_module_record msgid "Start Recording" -msgstr "" +msgstr "Počni Snimanje" #. module: base_module_record #: selection:base_module_record.module_save,init,info_status:0 msgid "Not Recording" -msgstr "" +msgstr "Ne Snima" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,intro,description:0 #: wizard_field:base_module_record.module_save,info,description:0 msgid "Full Description" -msgstr "" +msgstr "Puni Opis" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,intro,name:0 #: wizard_field:base_module_record.module_save,info,name:0 msgid "Module Name" -msgstr "" +msgstr "Naziv Modula" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,init,objects:0 msgid "Objects" -msgstr "" +msgstr "Objekti" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,save,module_file:0 #: wizard_field:base_module_record.module_save,save,module_file:0 msgid "Module .zip File" -msgstr "" +msgstr ".zip datoteka Modula" #. module: base_module_record #: wizard_view:base_module_record.module_record,start:0 msgid "Recording information" -msgstr "" +msgstr "Informacija o Snimanju" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save:0 #: wizard_view:base_module_record.module_save,save:0 msgid "Module successfully created !" -msgstr "" +msgstr "Modul uspješno kreiran !" #. module: base_module_record #: wizard_view:base_module_record.module_record,start:0 msgid "Recording Stopped" -msgstr "" +msgstr "Snimanje zaustavljeno" #. module: base_module_record #: selection:base_module_record.module_record_objects,init,filter_cond:0 msgid "Created" -msgstr "" +msgstr "Kreirano" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,end:0 #: wizard_view:base_module_record.module_save,end:0 msgid "Thanks For using Module Recorder" -msgstr "" +msgstr "Hvala što ste koristili Snimač Modula" #. module: base_module_record #: wizard_field:base_module_record.module_record,start,continue:0 msgid "Continue Previous Session" -msgstr "" +msgstr "Nastavi Prethodnu Sesiju" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,intro,website:0 #: wizard_field:base_module_record.module_save,info,website:0 msgid "Documentation URL" -msgstr "" +msgstr "URL Dokumentacije" #. module: base_module_record #: selection:base_module_record.module_record_objects,init,filter_cond:0 msgid "Modified" -msgstr "" +msgstr "Izmenjen" #. module: base_module_record #: selection:base_module_record.module_save,init,info_status:0 msgid "Recording" -msgstr "" +msgstr "Snimanje" #. module: base_module_record #: wizard_button:base_module_record.module_record_objects,init,record:0 msgid "Record" -msgstr "" +msgstr "Snima" #. module: base_module_record #: wizard_button:base_module_record.module_record,stop,end:0 @@ -224,25 +225,25 @@ msgstr "" #: wizard_button:base_module_record.module_save,info,save:0 #: wizard_button:base_module_record.module_save,init,check:0 msgid "Continue" -msgstr "" +msgstr "Nastavi" #. module: base_module_record #: model:ir.module.module,shortdesc:base_module_record.module_meta_information #: model:ir.ui.menu,name:base_module_record.menu_wizard_base_mod_rec_rec msgid "Module Recorder" -msgstr "" +msgstr "Snimač Modula" #. module: base_module_record #: selection:base_module_record.module_record_objects,intro,data_kind:0 #: selection:base_module_record.module_save,info,data_kind:0 msgid "Normal Data" -msgstr "" +msgstr "Obični podaci" #. module: base_module_record #: wizard_button:base_module_record.module_record_objects,end,end:0 #: wizard_button:base_module_record.module_save,end,end:0 msgid "OK" -msgstr "" +msgstr "U redu" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save:0 @@ -252,6 +253,9 @@ msgid "" "publish it on OpenERP.com, in the 'Modules' section. You can do it through " "the website or using features of the 'base_module_publish' module." msgstr "" +"Ako mislite da bi Vaš Modul mogao nekog zanimati, voljeli bismo da ga " +"publicirate na OpenERP.com u sekciji \"Modules\". To možete putem weba ili " +"korištenjem mogućnosti Modula: 'base_module_publish'." #. module: base_module_record #: wizard_view:base_module_record.module_record,start:0 @@ -260,16 +264,19 @@ msgid "" "ERP client and save them as a module. You will be able to install this " "module on any database to reuse and/or publish it." msgstr "" +"Snimač Modula omogućuje Vam da snimite svaku operaciju izvršenu u Open ERP " +"klijentu i izmjene spremite kao Modul. Moći ćete instalirati taj Modul na " +"bilo kojoj Bazi Podataka za ponovnu upotrebu ili publiciranje." #. module: base_module_record #: model:ir.actions.wizard,name:base_module_record.wizard_base_module_record msgid "Record module" -msgstr "" +msgstr "Snimi Modul" #. module: base_module_record #: model:ir.ui.menu,name:base_module_record.menu_wizard_base_mod_rec msgid "Module Creation" -msgstr "" +msgstr "Kreacija Modula" #. module: base_module_record #: wizard_view:base_module_record.module_record,stop:0 @@ -277,30 +284,33 @@ msgid "" "You can continue the recording session by relauching the 'start recording' " "wizard." msgstr "" +"Možete nastaviti snimanje tako da ponovo pokrenete Čarobnjak \"Počni " +"Snimanje\"" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,intro,data_kind:0 #: wizard_field:base_module_record.module_save,info,data_kind:0 msgid "Type of Data" -msgstr "" +msgstr "Tip Podataka" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,intro:0 #: wizard_view:base_module_record.module_save,info:0 msgid "Module Information" -msgstr "" +msgstr "Informacija o Modulu" #. module: base_module_record #: model:ir.actions.wizard,name:base_module_record.wizard_base_module_save #: model:ir.ui.menu,name:base_module_record.menu_wizard_base_module_save msgid "Save Recorded Module" -msgstr "" +msgstr "Sacuvaj Snimljen Modul" #. module: base_module_record #: wizard_view:base_module_record.module_record,stop:0 msgid "" "Open ERP recording is stopped. Don't forget to save the recorded module." msgstr "" +"OpenERP Snimač je zaustavljen. Ne zaboravite da sacuvate snimljen Modul." #. module: base_module_record #: wizard_button:base_module_record.module_record,start,end:0 @@ -309,20 +319,20 @@ msgstr "" #: wizard_button:base_module_record.module_save,info,end:0 #: wizard_button:base_module_record.module_save,init,end:0 msgid "Cancel" -msgstr "" +msgstr "Otkaži" #. module: base_module_record #: wizard_button:base_module_record.module_record_objects,save,end:0 #: wizard_button:base_module_record.module_save,save,end:0 msgid "Close" -msgstr "" +msgstr "Zatvori" #. module: base_module_record #: selection:base_module_record.module_record_objects,init,filter_cond:0 msgid "Created & Modified" -msgstr "" +msgstr "Kreiran & Izmijenjen" #. module: base_module_record #: model:ir.ui.menu,name:base_module_record.menu_wizard_base_module_record_stop msgid "Stop Recording" -msgstr "" +msgstr "Zaustavi Snimanje" diff --git a/addons/base_report_creator/i18n/sr.po b/addons/base_report_creator/i18n/sr.po index a0d62708967..d8c008b6b9e 100644 --- a/addons/base_report_creator/i18n/sr.po +++ b/addons/base_report_creator/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-21 12:24+0000\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2010-10-16 09:40+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:12+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base_report_creator @@ -24,378 +24,381 @@ msgid "" "records.\n" " e.g. res_partner.id=3" msgstr "" +"Unesite izraz za polje po kojem želite filtrirati zapise.\n" +"npr. res_partner.id=3" #. module: base_report_creator #: field:base_report_creator.report,view_graph_type:0 msgid "Graph Type" -msgstr "" +msgstr "Tip grafikona" #. module: base_report_creator #: view:base_report_creator.report:0 msgid "Used View" -msgstr "" +msgstr "Korišten prikaz" #. module: base_report_creator #: wizard_view:base_report_creator.report_filter.fields,set_value_select_field:0 msgid "Filter Values" -msgstr "" +msgstr "Vrednosti filtra" #. module: base_report_creator #: field:base_report_creator.report.fields,graph_mode:0 msgid "Graph Mode" -msgstr "" +msgstr "Grafički" #. module: base_report_creator #: constraint:ir.actions.act_window:0 msgid "Invalid model name in the action definition." -msgstr "" +msgstr "Pogrešno ime modela u definiciji akcije." #. module: base_report_creator #: view:base_report_creator.report:0 msgid "Graph View" -msgstr "" +msgstr "Grafički prikaz" #. module: base_report_creator #: field:base_report_creator.report.filter,expression:0 msgid "Value" -msgstr "" +msgstr "Vrednost" #. module: base_report_creator #: model:ir.actions.wizard,name:base_report_creator.wizard_set_filter_fields msgid "Set Filter Fields" -msgstr "" +msgstr "Postavi filterska polja" #. module: base_report_creator #: selection:base_report_creator.report.fields,calendar_mode:0 msgid "Ending Date" -msgstr "" +msgstr "Datum završetka" #. module: base_report_creator #: model:ir.model,name:base_report_creator.model_base_report_creator_report_filter msgid "Report Filters" -msgstr "" +msgstr "Filteri izvještaja" #. module: base_report_creator #: view:base_report_creator.report:0 #: field:base_report_creator.report,sql_query:0 msgid "SQL Query" -msgstr "" +msgstr "SQL upit" #. module: base_report_creator #: view:base_report_creator.report:0 #: wizard_button:base_report_creator.report.menu.create,init,create_menu:0 msgid "Create Menu" -msgstr "" +msgstr "Kreiraj Meni" #. module: base_report_creator #: selection:base_report_creator.report.fields,group_method:0 msgid "Minimum" -msgstr "" +msgstr "Minimum" #. module: base_report_creator #: wizard_field:base_report_creator.report_filter.fields,set_value_select_field,operator:0 msgid "Operator" -msgstr "" +msgstr "Operator" #. module: base_report_creator #: selection:base_report_creator.report.filter,condition:0 #: selection:base_report_creator.report_filter.fields,set_value_select_field,condition:0 msgid "OR" -msgstr "" +msgstr "ILI" #. module: base_report_creator #: model:ir.ui.menu,name:base_report_creator.menu_base_report_creator_action #: model:ir.ui.menu,name:base_report_creator.menu_base_report_creator_action_config msgid "Custom Reports" -msgstr "" +msgstr "Prilagođeni izvještaji" #. module: base_report_creator #: wizard_view:base_report_creator.report.menu.create,init:0 msgid "Menu Information" -msgstr "" +msgstr "Informacije Menija" #. module: base_report_creator #: selection:base_report_creator.report.fields,group_method:0 msgid "Sum" -msgstr "" +msgstr "Suma" #. module: base_report_creator #: field:base_report_creator.report,model_ids:0 msgid "Reported Objects" -msgstr "" +msgstr "Navedeni objekti" #. module: base_report_creator #: view:base_report_creator.report:0 msgid "Field List" -msgstr "" +msgstr "Lista polja" #. module: base_report_creator #: field:base_report_creator.report,type:0 msgid "Report Type" -msgstr "" +msgstr "Tip izveštaja" #. module: base_report_creator #: view:base_report_creator.report:0 msgid "State" -msgstr "" +msgstr "Stanje" #. module: base_report_creator #: selection:base_report_creator.report,state:0 msgid "Valid" -msgstr "" +msgstr "Potvrđeno" #. module: base_report_creator #: view:base_report_creator.report:0 msgid "Add filter" -msgstr "" +msgstr "Dodaj Filter" #. module: base_report_creator #: model:ir.actions.wizard,name:base_report_creator.wizard_menu_create msgid "Create Menu for Report" -msgstr "" +msgstr "Kreiraj Meni za Izveštaje" #. module: base_report_creator #: selection:base_report_creator.report,view_type1:0 #: selection:base_report_creator.report,view_type2:0 #: selection:base_report_creator.report,view_type3:0 msgid "Form" -msgstr "" +msgstr "Obrazac" #. module: base_report_creator #: selection:base_report_creator.report,view_type3:0 #: selection:base_report_creator.report.fields,calendar_mode:0 #: selection:base_report_creator.report.fields,graph_mode:0 msgid "/" -msgstr "" +msgstr "/" #. module: base_report_creator #: field:base_report_creator.report.fields,report_id:0 #: field:base_report_creator.report.filter,report_id:0 #: model:ir.model,name:base_report_creator.model_base_report_creator_report msgid "Report" -msgstr "" +msgstr "Izveštaj" #. module: base_report_creator #: selection:base_report_creator.report.fields,calendar_mode:0 msgid "Starting Date" -msgstr "" +msgstr "Početni datum" #. module: base_report_creator #: constraint:ir.ui.view:0 msgid "Invalid XML for View Architecture!" -msgstr "" +msgstr "Nevažeći XML za pregled arhitekture" #. module: base_report_creator #: selection:base_report_creator.report,view_type1:0 #: selection:base_report_creator.report,view_type2:0 #: selection:base_report_creator.report,view_type3:0 msgid "Tree" -msgstr "" +msgstr "Stablo" #. module: base_report_creator #: field:base_report_creator.report,group_ids:0 msgid "Authorized Groups" -msgstr "" +msgstr "Autorizovane Grupe" #. module: base_report_creator #: field:base_report_creator.report,view_graph_orientation:0 msgid "Graph Orientation" -msgstr "" +msgstr "Orjentacija grafikona" #. module: base_report_creator #: view:base_report_creator.report:0 msgid "Authorized Groups (empty for all)" -msgstr "" +msgstr "Autorizovane Grupe(Prazno za sve)" #. module: base_report_creator #: view:base_report_creator.report:0 msgid "Security" -msgstr "" +msgstr "Bezbednost" #. module: base_report_creator #: wizard_field:base_report_creator.report.menu.create,init,menu_name:0 msgid "Menu Name" -msgstr "" +msgstr "Naziv Menija" #. module: base_report_creator #: selection:base_report_creator.report.filter,condition:0 #: selection:base_report_creator.report_filter.fields,set_value_select_field,condition:0 msgid "AND" -msgstr "" +msgstr "I" #. module: base_report_creator #: field:base_report_creator.report.fields,calendar_mode:0 msgid "Calendar Mode" -msgstr "" +msgstr "Kalendar Mod" #. module: base_report_creator #: model:ir.model,name:base_report_creator.model_base_report_creator_report_fields msgid "Display Fields" -msgstr "" +msgstr "Polja Displeja" #. module: base_report_creator #: selection:base_report_creator.report.fields,graph_mode:0 msgid "Y Axis" -msgstr "" +msgstr "Y osa" #. module: base_report_creator #: selection:base_report_creator.report,view_type1:0 #: selection:base_report_creator.report,view_type2:0 #: selection:base_report_creator.report,view_type3:0 msgid "Calendar" -msgstr "" +msgstr "Kalendar" #. module: base_report_creator #: selection:base_report_creator.report,view_type1:0 #: selection:base_report_creator.report,view_type2:0 #: selection:base_report_creator.report,view_type3:0 msgid "Graph" -msgstr "" +msgstr "Grafikon" #. module: base_report_creator #: wizard_field:base_report_creator.report_filter.fields,set_value_select_field,field_id:0 msgid "Field Name" -msgstr "" +msgstr "Naziv polja" #. module: base_report_creator #: selection:base_report_creator.report,state:0 msgid "Draft" -msgstr "" +msgstr "Priprema" #. module: base_report_creator #: wizard_view:base_report_creator.report_filter.fields,set_value_select_field:0 msgid "Set Filter Values" -msgstr "" +msgstr "Postavi Vrednosti Filtera" #. module: base_report_creator #: field:base_report_creator.report,state:0 msgid "Status" -msgstr "" +msgstr "Status" #. module: base_report_creator #: selection:base_report_creator.report,view_graph_orientation:0 msgid "Vertical" -msgstr "" +msgstr "Uspravno" #. module: base_report_creator #: selection:base_report_creator.report,type:0 msgid "Rows And Columns Report" -msgstr "" +msgstr "Izvestaj redova i kolona" #. module: base_report_creator #: view:base_report_creator.report:0 msgid "General Configuration" -msgstr "" +msgstr "Opšte podešavanje" #. module: base_report_creator #: wizard_view:base_report_creator.report_filter.fields,init:0 msgid "Select Field to filter" -msgstr "" +msgstr "Odaberite polje za filtriranje" #. module: base_report_creator #: field:base_report_creator.report,active:0 msgid "Active" -msgstr "" +msgstr "Aktivan" #. module: base_report_creator #: selection:base_report_creator.report,view_graph_orientation:0 msgid "Horizontal" -msgstr "" +msgstr "Vodoravno" #. module: base_report_creator #: field:base_report_creator.report.fields,group_method:0 msgid "Grouping Method" -msgstr "" +msgstr "Metod grupisanja" #. module: base_report_creator #: field:base_report_creator.report.filter,condition:0 #: wizard_field:base_report_creator.report_filter.fields,set_value_select_field,condition:0 msgid "Condition" -msgstr "" +msgstr "Uslov" #. module: base_report_creator #: selection:base_report_creator.report.fields,group_method:0 msgid "Count" -msgstr "" +msgstr "Brojanje" #. module: base_report_creator #: selection:base_report_creator.report.fields,graph_mode:0 msgid "X Axis" -msgstr "" +msgstr "X osa" #. module: base_report_creator #: wizard_field:base_report_creator.report.menu.create,init,menu_parent_id:0 msgid "Parent Menu" -msgstr "" +msgstr "Roditeljski Meni" #. module: base_report_creator #: wizard_button:base_report_creator.report_filter.fields,set_value_select_field,set_value:0 msgid "Confirm Filter" -msgstr "" +msgstr "Potvrdi Filter" #. module: base_report_creator #: field:base_report_creator.report.filter,name:0 msgid "Filter Name" -msgstr "" +msgstr "Naziv Filtera" #. module: base_report_creator #: model:ir.actions.wizard,name:base_report_creator.wizard_report_open msgid "Open Report" -msgstr "" +msgstr "Otvori izveštaj" #. module: base_report_creator #: selection:base_report_creator.report.fields,group_method:0 msgid "Grouped" -msgstr "" +msgstr "Grupisano" #. module: base_report_creator #: view:base_report_creator.report:0 #: model:ir.module.module,shortdesc:base_report_creator.module_meta_information msgid "Report Creator" -msgstr "" +msgstr "Kreator izveštaja" #. module: base_report_creator #: wizard_button:base_report_creator.report.menu.create,init,end:0 #: wizard_button:base_report_creator.report_filter.fields,init,end:0 #: wizard_button:base_report_creator.report_filter.fields,set_value_select_field,end:0 msgid "Cancel" -msgstr "" +msgstr "Otkaži" #. module: base_report_creator #: constraint:ir.model:0 msgid "" "The Object name must start with x_ and not contain any special character !" msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" #. module: base_report_creator #: field:base_report_creator.report,view_type1:0 msgid "First View" -msgstr "" +msgstr "Prvi pogled" #. module: base_report_creator #: selection:base_report_creator.report.fields,calendar_mode:0 msgid "Delay" -msgstr "" +msgstr "Kašnjenje" #. module: base_report_creator #: field:base_report_creator.report.fields,field_id:0 msgid "Field" -msgstr "" +msgstr "Polje" #. module: base_report_creator #: view:base_report_creator.report:0 msgid "Filters on Fields" -msgstr "" +msgstr "Filteri na poljima" #. module: base_report_creator #: selection:base_report_creator.report,view_graph_type:0 msgid "Pie Chart" -msgstr "" +msgstr "Tortni grafikon" #. module: base_report_creator #: field:base_report_creator.report,view_type3:0 msgid "Third View" -msgstr "" +msgstr "Treći pogled" #. module: base_report_creator #: model:ir.module.module,description:base_report_creator.module_meta_information @@ -407,85 +410,91 @@ msgid "" "After installing the module, it adds a menu to define custom report in\n" "the \"Dashboard\" menu.\n" msgstr "" +"Ovi moduli vam dozvoljavaju kreiranje bilo kojeg statističkog\n" +"izvještaja iz više objekata. To je graditelj SQL upita i pretrazivac\n" +"za krajnje korisnike.\n" +"\n" +"Nakon instalacije, modul dodaje Meni za kreiranje prilagođenog izvještaja\n" +"na Meniju Glavne Table.\n" #. module: base_report_creator #: selection:base_report_creator.report.fields,calendar_mode:0 msgid "Uniq Colors" -msgstr "" +msgstr "Jedinstvene boje" #. module: base_report_creator #: field:base_report_creator.report,name:0 msgid "Report Name" -msgstr "" +msgstr "Naziv izveštaja" #. module: base_report_creator #: view:base_report_creator.report:0 msgid "Fields" -msgstr "" +msgstr "Polja" #. module: base_report_creator #: selection:base_report_creator.report.fields,group_method:0 msgid "Average" -msgstr "" +msgstr "Prosečno" #. module: base_report_creator #: view:base_report_creator.report:0 msgid "Reports" -msgstr "" +msgstr "Izveštaji" #. module: base_report_creator #: selection:base_report_creator.report.fields,group_method:0 msgid "Maximum" -msgstr "" +msgstr "Maksimum" #. module: base_report_creator #: wizard_button:base_report_creator.report_filter.fields,init,set_value_select_field:0 msgid "Continue" -msgstr "" +msgstr "Nastavi" #. module: base_report_creator #: wizard_field:base_report_creator.report_filter.fields,set_value_select_field,value:0 msgid "Values" -msgstr "" +msgstr "Вредности" #. module: base_report_creator #: selection:base_report_creator.report,view_graph_type:0 msgid "Bar Chart" -msgstr "" +msgstr "Bar grafikon" #. module: base_report_creator #: field:base_report_creator.report,view_type2:0 msgid "Second View" -msgstr "" +msgstr "Drugi pogled" #. module: base_report_creator #: wizard_view:base_report_creator.report.menu.create,init:0 msgid "Create Menu For This Report" -msgstr "" +msgstr "Kreiraj Meni za ovaj izveštaj" #. module: base_report_creator #: view:base_report_creator.report:0 msgid "View parameters" -msgstr "" +msgstr "Parametri prikaza" #. module: base_report_creator #: field:base_report_creator.report.fields,sequence:0 msgid "Sequence" -msgstr "" +msgstr "Sekvenca" #. module: base_report_creator #: wizard_field:base_report_creator.report_filter.fields,init,field_id:0 msgid "Filter Field" -msgstr "" +msgstr "polje Filtera" #. module: base_report_creator #: view:base_report_creator.report:0 #: field:base_report_creator.report,field_ids:0 msgid "Fields to Display" -msgstr "" +msgstr "Polja za Prikaz" #. module: base_report_creator #: view:base_report_creator.report:0 #: field:base_report_creator.report,filter_ids:0 msgid "Filters" -msgstr "" +msgstr "Filteri" diff --git a/addons/base_report_designer/i18n/sr.po b/addons/base_report_designer/i18n/sr.po index bee67bea6e7..74bacc3daa9 100644 --- a/addons/base_report_designer/i18n/sr.po +++ b/addons/base_report_designer/i18n/sr.po @@ -8,89 +8,89 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-09-21 12:23+0000\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2010-10-16 09:24+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:08+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base_report_designer #: wizard_field:base_report_designer.modify,init,text:0 msgid "Introduction" -msgstr "" +msgstr "Predstavljanje" #. module: base_report_designer #: wizard_view:base_report_designer.modify,send_form:0 msgid "Upload your modified report" -msgstr "" +msgstr "Pošalji promenjen izveštaj na Server" #. module: base_report_designer #: wizard_button:base_report_designer.modify,get_form_result,send_form:0 msgid "Upload the modified report" -msgstr "" +msgstr "Pošalji promenjen izveštaj na Server" #. module: base_report_designer #: wizard_view:base_report_designer.modify,get_form_result:0 msgid "The .SXW report" -msgstr "" +msgstr ".SXW Izveštaj" #. module: base_report_designer #: wizard_view:base_report_designer.modify,send_form_result:0 msgid "Report modified" -msgstr "" +msgstr "Izveštaj je promenjen" #. module: base_report_designer #: wizard_button:base_report_designer.modify,init,get_form:0 msgid "Modify a report" -msgstr "" +msgstr "Izmeni Izveštaj" #. module: base_report_designer #: wizard_view:base_report_designer.modify,send_form_result:0 msgid "Your report has been modified." -msgstr "" +msgstr "Vaš je Izveštaj izmenjen" #. module: base_report_designer #: model:ir.module.module,shortdesc:base_report_designer.module_meta_information msgid "Report designer interface module" -msgstr "" +msgstr "Modul Interfejsa Dizajnera Izveštaja" #. module: base_report_designer #: wizard_field:base_report_designer.modify,get_form,report_id:0 #: wizard_field:base_report_designer.modify,get_form_result,report_id:0 #: wizard_field:base_report_designer.modify,send_form,report_id:0 msgid "Report" -msgstr "" +msgstr "Izveštaj" #. module: base_report_designer #: model:ir.ui.menu,name:base_report_designer.menu_wizard_report_designer_modify msgid "Report Designer" -msgstr "" +msgstr "Dizajner Izvještaja" #. module: base_report_designer #: wizard_view:base_report_designer.modify,get_form:0 #: wizard_view:base_report_designer.modify,get_form_result:0 #: wizard_view:base_report_designer.modify,send_form:0 msgid "Get a report" -msgstr "" +msgstr "Napravi Izvještaj" #. module: base_report_designer #: wizard_button:base_report_designer.modify,get_form,get_form_result:0 msgid "Continue" -msgstr "" +msgstr "Nastavi" #. module: base_report_designer #: wizard_field:base_report_designer.modify,get_form_result,file_sxw:0 #: wizard_field:base_report_designer.modify,send_form,file_sxw:0 msgid "Your .SXW file" -msgstr "" +msgstr "Vaša .SXW datoteka" #. module: base_report_designer #: wizard_view:base_report_designer.modify,init:0 msgid "Report designer" -msgstr "" +msgstr "Dizajner Izveštaja" #. module: base_report_designer #: wizard_view:base_report_designer.modify,get_form_result:0 @@ -100,47 +100,51 @@ msgid "" "to modify it. Once it is modified, re-upload it in Open ERP using this " "wizard." msgstr "" +"Ovo je Predložak vašeg traženog Izveštaja. Spremite ga kao .SXW datoteku i " +"otvorite s programon OpenOffice. Ne zaboravite instalirati Tiny OpenOffice " +"paket kako biste mogli vršiti izmjene. kad izvršite izmjene, vratite " +"datoteku u Open ERP koristeći ovaj Čarobnjak." #. module: base_report_designer #: wizard_button:base_report_designer.modify,send_form,send_form_result:0 msgid "Update the report" -msgstr "" +msgstr "Ažurirajte Izvještaj" #. module: base_report_designer #: selection:base_report_designer.modify,init,operation:0 msgid "Create a new report" -msgstr "" +msgstr "Napravi novi Izvještaj" #. module: base_report_designer #: selection:base_report_designer.modify,init,operation:0 #: model:ir.actions.wizard,name:base_report_designer.wizard_report_designer_modify msgid "Modify an existing report" -msgstr "" +msgstr "Izmeni postojeći izveštaj" #. module: base_report_designer #: wizard_button:base_report_designer.modify,get_form,end:0 #: wizard_button:base_report_designer.modify,init,end:0 msgid "Cancel" -msgstr "" +msgstr "Otkaži" #. module: base_report_designer #: wizard_button:base_report_designer.modify,get_form_result,end:0 #: wizard_button:base_report_designer.modify,send_form,end:0 #: wizard_button:base_report_designer.modify,send_form_result,end:0 msgid "Close" -msgstr "" +msgstr "Zatvori" #. module: base_report_designer #: wizard_field:base_report_designer.modify,init,operation:0 msgid "Operation" -msgstr "" +msgstr "Postupak" #. module: base_report_designer #: wizard_view:base_report_designer.modify,init:0 msgid "Report designer introduction" -msgstr "" +msgstr "Uvod u Dizajner Izveštaja" #. module: base_report_designer #: wizard_view:base_report_designer.modify,get_form:0 msgid "Select your report" -msgstr "" +msgstr "Odaberite izvještaj" diff --git a/addons/base_setup/i18n/sr.po b/addons/base_setup/i18n/sr.po index cb71335bbef..1c11be3bb17 100644 --- a/addons/base_setup/i18n/sr.po +++ b/addons/base_setup/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 15:31+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 08:51+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base_setup diff --git a/addons/base_synchro/__openerp__.py b/addons/base_synchro/__openerp__.py index bd285821e2b..3bb46827d68 100644 --- a/addons/base_synchro/__openerp__.py +++ b/addons/base_synchro/__openerp__.py @@ -22,7 +22,7 @@ { "name":"Base Synchro", "version":"0.1", - "author":"Tiny", + "author":"OpenERP SA", "category":"Generic Modules/Base", "description": """Synchronization with all objects.""", "depends":["base"], diff --git a/addons/base_vat/i18n/sr.po b/addons/base_vat/i18n/sr.po index f9cd814e4ad..98aecb1e7f2 100644 --- a/addons/base_vat/i18n/sr.po +++ b/addons/base_vat/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 15:18+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 08:42+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base_vat diff --git a/addons/board/board_administration_view.xml b/addons/board/board_administration_view.xml index 675143342c0..86222cbad43 100644 --- a/addons/board/board_administration_view.xml +++ b/addons/board/board_administration_view.xml @@ -1,57 +1,6 @@ - - - latest.activities.tree - res.log - tree - - - - - - - - - - - - Latest Activities - res.log - form - tree,form - - - - - board.administration.form - board.board - form - - - - - - - - - - - - - - Administration Dashboard - board.board - form - form - - - - - - user.connection.tree @@ -72,18 +21,37 @@ - - board.user.connection.form + + + Latest Activities + res.log + form + tree,form + + + board.administration.form board.board form - - - - + + + + + + + + - + + Administration Dashboard + board.board + form + form + + + + diff --git a/addons/caldav/__openerp__.py b/addons/caldav/__openerp__.py index cdb06a17a1f..40088cb0bac 100644 --- a/addons/caldav/__openerp__.py +++ b/addons/caldav/__openerp__.py @@ -21,12 +21,12 @@ { - "name" : "Share Calendar using Caldav", - "version" : "1.0", + "name" : "Share Calendar using CalDAV", + "version" : "1.1", "depends" : [ "base", "document_webdav", - ], + ], 'description': """ This module Contains basic functionality for caldav system like: - Webdav server that provides remote access to calendar @@ -34,7 +34,10 @@ - Customize calendar event and todo attribute with any of OpenERP model - Provides iCal Import/Export functionality - To access OpenERP Calendar using caldav to remote site use the URL like: + To access Calendars using CalDAV clients, point them to: + http://HOSTNAME:PORT/webdav/DATABASE_NAME/calendars/users/USERNAME/c + + To access OpenERP Calendar using WebCal to remote site use the URL like: http://HOSTNAME:PORT/webdav/DATABASE_NAME/Calendars/CALENDAR_NAME.ics Where, @@ -53,7 +56,8 @@ 'wizard/calendar_event_export_view.xml', 'wizard/calendar_event_import_view.xml', 'wizard/calendar_event_subscribe_view.xml', - 'caldav_view.xml' + 'caldav_view.xml', + 'caldav_setup.xml' ], "installable" : True, "active" : False, diff --git a/addons/caldav/caldav_node.py b/addons/caldav/caldav_node.py index 11f720bdcab..b735d853025 100644 --- a/addons/caldav/caldav_node.py +++ b/addons/caldav/caldav_node.py @@ -20,41 +20,29 @@ ############################################################################## import time -from document import nodes +from document_webdav import nodes +from document.nodes import _str2time +import logging import StringIO +from orm_utils import get_last_modified -class node_database(nodes.node_database): - def _child_get(self, cr, name=False, parent_id=False, domain=None): - dirobj = self.context._dirobj - uid = self.context.uid - ctx = self.context.context.copy() - ctx.update(self.dctx) - if not domain: - domain = [] - domain2 = domain + [('calendar_collection','=', False)] - res = super(node_database, self)._child_get(cr, name=name, parent_id=parent_id, domain=domain2) - where = [('parent_id','=',parent_id)] - domain2 = domain + [('calendar_collection','=', True)] - if name: - where.append(('name','=',name)) - if domain2: - where += domain2 +try: + from tools.dict_tools import dict_merge, dict_merge2 +except ImportError: + from document.dict_tools import dict_merge, dict_merge2 - where2 = where + [('type', '=', 'directory')] - ids = dirobj.search(cr, uid, where2, context=ctx) - for dirr in dirobj.browse(cr,uid,ids,context=ctx): - res.append(node_calendar_collection(dirr.name,self,self.context,dirr)) - return res +# TODO: implement DAV-aware errors, inherit from IOError + +# Assuming that we have set global properties right, we mark *all* +# directories as having calendar-access. +nodes.node_dir.http_options = dict_merge2(nodes.node_dir.http_options, + { 'DAV': ['calendar-access',] }) class node_calendar_collection(nodes.node_dir): - DAV_PROPS = { - "http://calendarserver.org/ns/" : ('getctag',), - } - DAV_M_NS = { - "http://calendarserver.org/ns/" : '_get_dav', - } - - http_options = { 'DAV': ['calendar-access'] } + DAV_PROPS = dict_merge2(nodes.node_dir.DAV_PROPS, + { "http://calendarserver.org/ns/" : ('getctag',), } ) + DAV_M_NS = dict_merge2(nodes.node_dir.DAV_M_NS, + { "http://calendarserver.org/ns/" : '_get_dav', } ) def _file_get(self,cr, nodename=False): return [] @@ -80,45 +68,117 @@ class node_calendar_collection(nodes.node_dir): for cal in fil_obj.browse(cr, uid, ids, context=ctx): if (not name) or not ext: res.append(node_calendar(cal.name, self, self.context, cal)) - if (not name) or ext: + if self.context.get('DAV-client', '') in ('iPhone', 'iCalendar'): + # these ones must not see the webcal entry. + continue + if cal.has_webcal and (not name) or ext: res.append(res_node_calendar(cal.name+'.ics', self, self.context, cal)) # May be both of them! return res - def _get_dav_owner(self, cr): - # Todo? - return False - def _get_ttag(self, cr): return 'calen-dir-%d' % self.dir_id def _get_dav_getctag(self, cr): - result = self.get_etag(cr) - return str(result) + dirobj = self.context._dirobj + uid = self.context.uid + ctx = self.context.context.copy() + ctx.update(self.dctx) + where = [('collection_id','=',self.dir_id)] + bc_obj = dirobj.pool.get('basic.calendar') + + res = get_last_modified(bc_obj, cr, uid, where, context=ctx) + return _str2time(res) + +class node_calendar_res_col(nodes.node_res_obj): + """ Calendar collection, as a dynamically created node + + This class shall be used instead of node_calendar_collection, when the + node is under dynamic ones. + """ + DAV_PROPS = dict_merge2(nodes.node_res_obj.DAV_PROPS, + { "http://calendarserver.org/ns/" : ('getctag',), } ) + DAV_M_NS = dict_merge2(nodes.node_res_obj.DAV_M_NS, + { "http://calendarserver.org/ns/" : '_get_dav', } ) + + def _file_get(self,cr, nodename=False): + return [] + + def _child_get(self, cr, name=False, parent_id=False, domain=None): + dirobj = self.context._dirobj + uid = self.context.uid + ctx = self.context.context.copy() + ctx.update(self.dctx) + where = [('collection_id','=',self.dir_id)] + ext = False + if name and name.endswith('.ics'): + name = name[:-4] + ext = True + if name: + where.append(('name','=',name)) + if not domain: + domain = [] + where = where + domain + fil_obj = dirobj.pool.get('basic.calendar') + ids = fil_obj.search(cr,uid,where,context=ctx) + res = [] + # TODO: shall we use any of our dynamic information?? + for cal in fil_obj.browse(cr, uid, ids, context=ctx): + if (not name) or not ext: + res.append(node_calendar(cal.name, self, self.context, cal)) + if self.context.get('DAV-client', '') in ('iPhone', 'iCalendar'): + # these ones must not see the webcal entry. + continue + if cal.has_webcal and (not name) or ext: + res.append(res_node_calendar(cal.name+'.ics', self, self.context, cal)) + # May be both of them! + return res + + def _get_ttag(self, cr): + return 'calen-dir-%d' % self.dir_id + + def _get_dav_getctag(self, cr): + dirobj = self.context._dirobj + uid = self.context.uid + ctx = self.context.context.copy() + ctx.update(self.dctx) + where = [('collection_id','=',self.dir_id)] + bc_obj = dirobj.pool.get('basic.calendar') + + res = get_last_modified(bc_obj, cr, uid, where, context=ctx) + return _str2time(res) class node_calendar(nodes.node_class): our_type = 'collection' DAV_PROPS = { - "DAV:": ('principal-collection-set'), - "http://cal.me.com/_namespace/" : ('user-state'), - "http://calendarserver.org/ns/" : ( - 'dropbox-home-URL', - 'notification-URL', - 'getctag',), + "DAV:": ('supported-report-set',), + # "http://cal.me.com/_namespace/" : ('user-state',), + "http://calendarserver.org/ns/" : ( 'getctag',), 'http://groupdav.org/': ('resourcetype',), "urn:ietf:params:xml:ns:caldav" : ( - 'calendar-description', + 'calendar-description', + 'supported-calendar-component-set', + ), + "http://apple.com/ns/ical/": ("calendar-color", "calendar-order"), + } + DAV_PROPS_HIDDEN = { + "urn:ietf:params:xml:ns:caldav" : ( 'calendar-data', - 'calendar-home-set', - 'calendar-user-address-set', - 'schedule-inbox-URL', - 'schedule-outbox-URL',)} + 'calendar-timezone', + 'supported-calendar-data', + 'max-resource-size', + 'min-date-time', + 'max-date-time', + )} + DAV_M_NS = { "DAV:" : '_get_dav', - "http://cal.me.com/_namespace/": '_get_dav', + # "http://cal.me.com/_namespace/": '_get_dav', 'http://groupdav.org/': '_get_gdav', "http://calendarserver.org/ns/" : '_get_dav', - "urn:ietf:params:xml:ns:caldav" : '_get_caldav'} + "urn:ietf:params:xml:ns:caldav" : '_get_caldav', + "http://apple.com/ns/ical/": '_get_apple_cal', + } http_options = { 'DAV': ['calendar-access'] } @@ -131,42 +191,33 @@ class node_calendar(nodes.node_class): self.content_length = 0 self.displayname = calendar.name self.cal_type = calendar.type + self.cal_color = calendar.calendar_color or None + self.cal_order = calendar.calendar_order or None + try: + self.uuser = (calendar.user_id and calendar.user_id.login) or 'nobody' + except Exception: + self.uuser = 'nobody' def _get_dav_getctag(self, cr): - result = self._get_ttag(cr) + ':' + str(time.time()) - return str(result) + dirobj = self.context._dirobj + uid = self.context.uid + ctx = self.context.context.copy() + ctx.update(self.dctx) - def _get_dav_dropbox_home_URL(self, cr): - import urllib - uid = self.context.uid - ctx = self.context.context.copy() - ctx.update(self.dctx) - calendar_obj = self.context._dirobj.pool.get('basic.calendar') - calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx) - res = '%s/%s' %(calendar.collection_id.name, calendar.name) - url = urllib.quote('/%s/%s' % (cr.dbname, res)) - return url - - def _get_dav_notification_URL(self, cr): - import urllib - uid = self.context.uid - ctx = self.context.context.copy() - ctx.update(self.dctx) - calendar_obj = self.context._dirobj.pool.get('basic.calendar') - calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx) - res = '%s/%s' %(calendar.collection_id.name, calendar.name) - url = urllib.quote('/%s/%s' % (cr.dbname, res)) - return url + bc_obj = dirobj.pool.get('basic.calendar') + res = bc_obj.get_cal_max_modified(cr, uid, [self.calendar_id], self, domain=[], context=ctx) + return _str2time(res) def _get_dav_user_state(self, cr): #TODO - return True - + return 'online' def get_dav_resourcetype(self, cr): res = [ ('collection', 'DAV:'), - (str(self.cal_type + '-collection'), 'http://groupdav.org/'), - ('calendar', 'urn:ietf:params:xml:ns:caldav') ] + ('calendar', 'urn:ietf:params:xml:ns:caldav'), + ] + if self.context.get('DAV-client', '') == 'GroupDAV': + res.append((str(self.cal_type + '-collection'), 'http://groupdav.org/')) return res def get_domain(self, cr, filters): @@ -174,6 +225,7 @@ class node_calendar(nodes.node_class): res = [] if not filters: return res + _log = logging.getLogger('caldav.query') if filters.localName == 'calendar-query': res = [] for filter_child in filters.childNodes: @@ -189,26 +241,33 @@ class node_calendar(nodes.node_class): if vevent_filter.nodeType == vevent_filter.TEXT_NODE: continue if vevent_filter.localName == 'comp-filter': - if vevent_filter.getAttribute('name') == 'VEVENT': - res = [('type','=','vevent')] - if vevent_filter.getAttribute('name') == 'VTODO': - res = [('type','=','vtodo')] + if vevent_filter.getAttribute('name'): + res = [('type','=',vevent_filter.getAttribute('name').lower() )] + + for cfe in vevent_filter.childNodes: + if cfe.localName == 'time-range': + if cfe.getAttribute('start'): + _log.warning("Ignore start.. ") + # No, it won't work in this API + #val = cfe.getAttribute('start') + #res += [('dtstart','=', cfe)] + elif cfe.getAttribute('end'): + _log.warning("Ignore end.. ") + else: + _log.debug("Unknown comp-filter: %s", cfe.localName) + else: + _log.debug("Unknown comp-filter: %s", vevent_filter.localName) + else: + _log.debug("Unknown filter element: %s", vcalendar_filter.localName) + else: + _log.debug("Unknown calendar-query element: %s", filter_child.localName) return res elif filters.localName == 'calendar-multiget': - names = [] - for filter_child in filters.childNodes: - if filter_child.nodeType == filter_child.TEXT_NODE: - continue - if filter_child.localName == 'href': - if not filter_child.firstChild: - continue - uri = filter_child.firstChild.data - caluri = uri.split('/') - if len(caluri): - caluri = caluri[-2] - if caluri not in names : names.append(caluri) - res = [('name','in',names)] - return res + # this is not the place to process, as it wouldn't support multi-level + # hrefs. So, the code is moved to document_webdav/dav_fs.py + pass + else: + _log.debug("Unknown element in REPORT: %s", filters.localName) return res def children(self, cr, domain=None): @@ -227,26 +286,33 @@ class node_calendar(nodes.node_class): ctx = self.context.context.copy() ctx.update(self.dctx) where = [] + bc_obj = dirobj.pool.get('basic.calendar') + if name: if name.endswith('.ics'): name = name[:-4] try: - where.append(('id','=',int(name))) + if name.isdigit(): + where.append(('id','=',int(name))) + else: + bca_obj = dirobj.pool.get('basic.calendar.alias') + bc_alias = bca_obj.search(cr, uid, + [('cal_line_id.calendar_id', '=', self.calendar_id), + ('name', '=', name)] ) + if not bc_alias: + return [] + bc_val = bca_obj.read(cr, uid, bc_alias, ['res_id',]) + where.append(('id', '=', bc_val[0]['res_id'])) except ValueError: # if somebody requests any other name than the ones we # generate (non-numeric), it just won't exist - # FIXME: however, this confuses Evolution (at least), which - # thinks the .ics node hadn't been saved. return [] if not domain: domain = [] - fil_obj = dirobj.pool.get('basic.calendar') - ids = fil_obj.search(cr, uid, domain) - res = [] - if self.calendar_id in ids: - res = fil_obj.get_calendar_objects(cr, uid, [self.calendar_id], self, domain=where, context=ctx) + # we /could/ be supplying an invalid calendar id to bc_obj, it has to check + res = bc_obj.get_calendar_objects(cr, uid, [self.calendar_id], self, domain=where, context=ctx) return res def create_child(self, cr, path, data): @@ -268,7 +334,24 @@ class node_calendar(nodes.node_class): assert isinstance(res[0], (int, long)) fnodes = fil_obj.get_calendar_objects(cr, uid, [self.calendar_id], self, domain=[('id','=',res[0])], context=ctx) + if self.context.get('DAV-client','') in ('iPhone', 'iCalendar',): + # For those buggy clients, register the alias + bca_obj = fil_obj.pool.get('basic.calendar.alias') + ourcal = fil_obj.browse(cr, uid, self.calendar_id) + line_id = None + for line in ourcal.line_ids: + if line.name == ourcal.type: + line_id = line.id + break + assert line_id, "Calendar #%d must have at least one %s line" % \ + (ourcal.id, ourcal.type) + if path.endswith('.ics'): + path = path[:-4] + bca_obj.create(cr, uid, { 'cal_line_id': line_id, + 'res_id': res[0], 'name': path}, context=ctx) return fnodes[0] + # If we reach this line, it means that we couldn't import any useful + # (and matching type vs. our node kind) data from the iCal content. return None @@ -287,8 +370,12 @@ class node_calendar(nodes.node_class): def rmcol(self, cr): return False - def _get_caldav_calendar_data(self, cr): + if self.context.get('DAV-client', '') in ('iPhone', 'iCalendar'): + # Never return collective data to iClients, they get confused + # because they do propfind on the calendar node with Depth=1 + # and only expect the childrens' data + return None res = [] for child in self.children(cr): res.append(child._get_caldav_calendar_data(cr)) @@ -299,86 +386,54 @@ class node_calendar(nodes.node_class): calendar_obj = self.context._dirobj.pool.get('basic.calendar') ctx = self.context.context.copy() ctx.update(self.dctx) - calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx) - return calendar.description + try: + calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx) + return calendar.description or calendar.name + except Exception, e: + return None - def _get_dav_principal_collection_set(self, cr): - import xml - import urllib - uid = self.context.uid - ctx = self.context.context.copy() - ctx.update(self.dctx) - calendar_obj = self.context._dirobj.pool.get('basic.calendar') - calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx) - res = '%s/%s' %(calendar.collection_id.name, calendar.name) - doc = xml.dom.minidom.getDOMImplementation().createDocument(None, 'href', None) - href = doc.documentElement - href.tagName = 'D:href' - huri = doc.createTextNode(urllib.quote('/%s/%s' % (cr.dbname, res))) - href.appendChild(huri) - return href + def _get_dav_supported_report_set(self, cr): + + return ('supported-report', 'DAV:', + ('report','DAV:', + ('principal-match','DAV:') + ) + ) - def _get_caldav_calendar_home_set(self, cr): - import xml.dom.minidom - import urllib - uid = self.context.uid - ctx = self.context.context.copy() - ctx.update(self.dctx) - doc = xml.dom.minidom.getDOMImplementation().createDocument(None, 'href', None) + def _get_caldav_supported_calendar_component_set(self, cr): + return ('comp', 'urn:ietf:params:xml:ns:caldav', None, + {'name': self.cal_type.upper()} ) + + def _get_caldav_calendar_timezone(self, cr): + return None #TODO + + def _get_caldav_supported_calendar_data(self, cr): + return ('calendar-data', 'urn:ietf:params:xml:ns:caldav', None, + {'content-type': "text/calendar", 'version': "2.0" } ) + + def _get_caldav_max_resource_size(self, cr): + return 65535 - calendar_obj = self.context._dirobj.pool.get('basic.calendar') - calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx) - huri = doc.createTextNode(urllib.quote('/%s/%s' % (cr.dbname, calendar.collection_id.name))) - href = doc.documentElement - href.tagName = 'D:href' - href.appendChild(huri) - return href + def _get_caldav_min_date_time(self, cr): + return "19700101T000000Z" - def _get_caldav_calendar_user_address_set(self, cr): - import xml.dom.minidom - uid = self.context.uid - ctx = self.context.context.copy() - ctx.update(self.dctx) - user_obj = self.context._dirobj.pool.get('res.users') - user = user_obj.browse(cr, uid, uid, context=ctx) - doc = xml.dom.minidom.getDOMImplementation().createDocument(None, 'href', None) - href = doc.documentElement - href.tagName = 'D:href' - huri = doc.createTextNode('MAILTO:' + str(user.email) or str(user.name)) - href.appendChild(huri) - return href - - def _get_caldav_schedule_outbox_URL(self, cr): - return self._get_caldav_schedule_inbox_URL(cr) - - def _get_caldav_schedule_inbox_URL(self, cr): - import xml.dom.minidom - import urllib - uid = self.context.uid - ctx = self.context.context.copy() - ctx.update(self.dctx) - calendar_obj = self.context._dirobj.pool.get('basic.calendar') - calendar = calendar_obj.browse(cr, uid, self.calendar_id, context=ctx) - res = '%s/%s' %(calendar.collection_id.name, calendar.name) - doc = xml.dom.minidom.getDOMImplementation().createDocument(None, 'href', None) - href = doc.documentElement - href.tagName = 'D:href' - huri = doc.createTextNode(urllib.quote('/%s/%s' % (cr.dbname, res))) - href.appendChild(huri) - return href + def _get_caldav_max_date_time(self, cr): + return "21001231T235959Z" # I will be dead by then + + def _get_apple_cal_calendar_color(self, cr): + return self.cal_color + def _get_apple_cal_calendar_order(self, cr): + return self.cal_order class res_node_calendar(nodes.node_class): our_type = 'file' DAV_PROPS = { - "http://calendarserver.org/ns/" : ('getctag'), + "http://calendarserver.org/ns/" : ('getctag',), "urn:ietf:params:xml:ns:caldav" : ( 'calendar-description', 'calendar-data', - 'calendar-home-set', - 'calendar-user-address-set', - 'schedule-inbox-URL', - 'schedule-outbox-URL',)} + )} DAV_M_NS = { "http://calendarserver.org/ns/" : '_get_dav', "urn:ietf:params:xml:ns:caldav" : '_get_caldav'} @@ -393,7 +448,7 @@ class res_node_calendar(nodes.node_class): self.calendar_id = hasattr(parent, 'calendar_id') and parent.calendar_id or False if res_obj: if not self.calendar_id: self.calendar_id = res_obj.id - pr = res_obj.perm_read()[0] + pr = res_obj.perm_read(context=context, details=False)[0] self.create_date = pr.get('create_date') self.write_date = pr.get('write_date') or pr.get('create_date') self.displayname = res_obj.name @@ -414,6 +469,7 @@ class res_node_calendar(nodes.node_class): uid = self.context.uid calendar_obj = self.context._dirobj.pool.get('basic.calendar') context = self.context.context.copy() + context.update(self.dctx) context.update({'model': self.model, 'res_id':self.res_id}) res = calendar_obj.export_cal(cr, uid, [self.calendar_id], context=context) return res @@ -426,8 +482,11 @@ class res_node_calendar(nodes.node_class): def set_data(self, cr, data, fil_obj = None): uid = self.context.uid + context = self.context.context.copy() + context.update(self.dctx) + context.update({'model': self.model, 'res_id':self.res_id}) calendar_obj = self.context._dirobj.pool.get('basic.calendar') - res = calendar_obj.import_cal(cr, uid, data, self.calendar_id) + res = calendar_obj.import_cal(cr, uid, data, self.calendar_id, context=context) return res def _get_ttag(self,cr): @@ -438,7 +497,6 @@ class res_node_calendar(nodes.node_class): res = '%d' % (self.calendar_id) return res - def rm(self, cr): uid = self.context.uid res = False diff --git a/addons/caldav/caldav_setup.xml b/addons/caldav/caldav_setup.xml new file mode 100644 index 00000000000..c33edbc75f7 --- /dev/null +++ b/addons/caldav/caldav_setup.xml @@ -0,0 +1,88 @@ + + + + + + [] + + + + + + directory + + calendars + + + [] + + + + + directory + + resources + + + [] + + + + + + ressource + + + __uids__ + + + [] + + + + + + + ressource + + + users + + + + user_id + res_id + + + [] + + + + + + directory + + c + + + + [] + + + + + + directory + + groups + + + + urn:ietf:params:xml:ns:caldav + + calendar-home-set + ('href','DAV:','/%s/%s/calendars/users/%s/c' % ('webdav',dbname,username) ) + + + + diff --git a/addons/caldav/caldav_view.xml b/addons/caldav/caldav_view.xml index 2e9719efead..97656a954ad 100644 --- a/addons/caldav/caldav_view.xml +++ b/addons/caldav/caldav_view.xml @@ -74,6 +74,9 @@ + + + diff --git a/addons/caldav/calendar.py b/addons/caldav/calendar.py index 068af56459f..ccc4bf39fac 100644 --- a/addons/caldav/calendar.py +++ b/addons/caldav/calendar.py @@ -30,7 +30,10 @@ import pytz import re import tools import time +import logging from caldav_node import res_node_calendar +from orm_utils import get_last_modified +from tools.safe_eval import safe_eval as eval try: import vobject @@ -63,12 +66,13 @@ def uid2openobjectid(cr, uidval, oomodel, rdate): return (False, None) qry = 'SELECT DISTINCT(id) FROM %s' % model_obj._table if rdate: - qry += " where recurrent_id='%s'" % (rdate) #TOFIX: sql injection - cr.execute(qry) + qry += " WHERE recurrent_id=%s" + cr.execute(qry, (rdate,)) r_id = cr.fetchone() if r_id: return (id, r_id[0]) - + else: + return (False, None) cr.execute(qry) ids = map(lambda x: str(x[0]), cr.fetchall()) if id in ids: @@ -232,6 +236,7 @@ def map_data(cr, uid, obj, context=None): class CalDAV(object): __attribute__ = {} + _logger = logging.getLogger('document.caldav') def ical_set(self, name, value, type): """ set calendar Attribute @@ -294,6 +299,7 @@ class CalDAV(object): att_data = [] exdates = [] + _server_tzinfo = pytz.timezone(tools.get_server_timezone()) for cal_data in child.getChildren(): if cal_data.name.lower() == 'organizer': @@ -329,8 +335,8 @@ class CalDAV(object): if cal_data.name.lower() in self.__attribute__: if cal_data.params.get('X-VOBJ-ORIGINAL-TZID'): self.ical_set('vtimezone', cal_data.params.get('X-VOBJ-ORIGINAL-TZID'), 'value') - date_utc = cal_data.value.astimezone(pytz.utc) - self.ical_set(cal_data.name.lower(), date_utc, 'value') + date_local = cal_data.value.astimezone(_server_tzinfo) + self.ical_set(cal_data.name.lower(), date_local, 'value') continue self.ical_set(cal_data.name.lower(), cal_data.value, 'value') vals = map_data(cr, uid, self, context=context) @@ -576,6 +582,13 @@ class Calendar(CalDAV, osv.osv): 'create_date': fields.datetime('Created Date', readonly=True), 'write_date': fields.datetime('Modifided Date', readonly=True), 'description': fields.text("description"), + 'calendar_color': fields.char('Color', size=20, help="For supporting clients, the color of the calendar entries"), + 'calendar_order': fields.integer('Order', help="For supporting clients, the order of this folder among the calendars"), + 'has_webcal': fields.boolean('WebCal', required=True, help="Also export a .ics entry next to the calendar folder, with WebCal content."), + } + + _defaults = { + 'has_webcal': False, } def get_calendar_objects(self, cr, uid, ids, parent=None, domain=None, context=None): @@ -592,7 +605,7 @@ class Calendar(CalDAV, osv.osv): continue if line.name in ('valarm', 'attendee'): continue - line_domain = eval(line.domain or '[]') + line_domain = eval(line.domain or '[]', context) line_domain += domain if ctx_res_id: line_domain += [('id','=',ctx_res_id)] @@ -606,6 +619,32 @@ class Calendar(CalDAV, osv.osv): node = res_node_calendar('%s.ics' %data.id, parent, ctx, data, line.object_id.model, data.id) res.append(node) return res + + + def get_cal_max_modified(self, cr, uid, ids, parent=None, domain=None, context=None): + if not context: + context = {} + if not domain: + domain = [] + res = None + ctx_res_id = context.get('res_id', None) + ctx_model = context.get('model', None) + for cal in self.browse(cr, uid, ids): + for line in cal.line_ids: + if ctx_model and ctx_model != line.object_id.model: + continue + if line.name in ('valarm', 'attendee'): + continue + line_domain = eval(line.domain or '[]', context) + line_domain += domain + if ctx_res_id: + line_domain += [('id','=',ctx_res_id)] + mod_obj = self.pool.get(line.object_id.model) + max_data = get_last_modified(mod_obj, cr, uid, line_domain, context=context) + if res and res > max_data: + continue + res = max_data + return res def export_cal(self, cr, uid, ids, vobj='vevent', context=None): """ Export Calendar @@ -624,7 +663,7 @@ class Calendar(CalDAV, osv.osv): continue if line.name in ('valarm', 'attendee'): continue - domain = eval(line.domain or '[]') + domain = eval(line.domain or '[]', context) if ctx_res_id: domain += [('id','=',ctx_res_id)] mod_obj = self.pool.get(line.object_id.model) @@ -668,6 +707,15 @@ class Calendar(CalDAV, osv.osv): val = self.parse_ics(cr, uid, child, cal_children=cal_children, context=context) vals.append(val) objs.append(cal_children[child.name.lower()]) + elif child.name.upper() == 'CALSCALE': + if child.value.upper() != 'GREGORIAN': + self._logger.warning('How do I handle %s calendars?',child.value) + elif child.name.upper() in ('PRODID', 'VERSION'): + pass + elif child.name.upper().startswith('X-'): + self._logger.debug("skipping custom node %s", child.name) + else: + self._logger.debug("skipping node %s", child.name) res = [] for obj_name in list(set(objs)): @@ -728,6 +776,30 @@ line "%s" more than once' % (vals.get('name')))) basic_calendar_line() +class basic_calendar_alias(osv.osv): + """ Mapping of client filenames to ORM ids of calendar records + + Since some clients insist on putting arbitrary filenames on the .ics data + they send us, and they won't respect the redirection "Location:" header, + we have to store those filenames and allow clients to call our calendar + records with them. + Note that adding a column to all tables that would possibly hold calendar- + mapped data won't work. The user is always allowed to specify more + calendars, on any arbitrary ORM object, without need to alter those tables' + data or structure + """ + _name = 'basic.calendar.alias' + _columns = { + 'name': fields.char('Filename', size=512, required=True, select=1), + 'cal_line_id': fields.many2one('basic.calendar.lines', 'Calendar', required=True, + select=1, help='The calendar/line this mapping applies to'), + 'res_id': fields.integer('Res. ID', required=True, select=1), + } + + _sql_constraints = [ ('name_cal_uniq', 'UNIQUE(cal_line_id, name)', + _('The same filename cannot apply to two records!')), ] + +basic_calendar_alias() class basic_calendar_attribute(osv.osv): _name = 'basic.calendar.attributes' diff --git a/addons/caldav/calendar_collection.py b/addons/caldav/calendar_collection.py index 8dd4ff053c9..52fe698647c 100644 --- a/addons/caldav/calendar_collection.py +++ b/addons/caldav/calendar_collection.py @@ -18,9 +18,11 @@ # along with this program. If not, see . # ############################################################################## + from osv import osv, fields from tools.translate import _ import caldav_node +import logging class calendar_collection(osv.osv): _inherit = 'document.directory' @@ -30,7 +32,8 @@ class calendar_collection(osv.osv): } _default = { 'calendar_collection' : False, - } + } + def _get_root_calendar_directory(self, cr, uid, context=None): objid = self.pool.get('ir.model.data') try: @@ -40,18 +43,25 @@ class calendar_collection(osv.osv): root_id = objid.read(cr, uid, mid, ['res_id'])['res_id'] root_cal_dir = self.browse(cr,uid, root_id, context=context) return root_cal_dir.name - except Exception, e: - import netsvc - logger = netsvc.Logger() - logger.notifyChannel("document", netsvc.LOG_WARNING, 'Cannot set root directory for Calendars:'+ str(e)) + except Exception: + logger = logging.getLogger('document') + logger.warning('Cannot set root directory for Calendars:', exc_info=True) return False return False - def _locate_child(self, cr, uid, root_id, uri,nparent, ncontext): - """ try to locate the node in uri, - Return a tuple (node_dir, remaining_path) - """ - return (caldav_node.node_database(context=ncontext), uri) + def get_node_class(self, cr, uid, ids, dbro=None, dynamic=False, context=None): + if dbro is None: + dbro = self.browse(cr, uid, ids, context=context) + + if dbro.calendar_collection: + if dynamic: + return caldav_node.node_calendar_res_col + else: + return caldav_node.node_calendar_collection + else: + return super(calendar_collection, self).\ + get_node_class(cr, uid, ids, dbro=dbro,dynamic=dynamic, + context=context) def get_description(self, cr, uid, ids, context=None): #TODO : return description of all calendars diff --git a/addons/caldav/doc/Path discovery.rst b/addons/caldav/doc/Path discovery.rst new file mode 100644 index 00000000000..d2d434b5fb6 --- /dev/null +++ b/addons/caldav/doc/Path discovery.rst @@ -0,0 +1,43 @@ +=============================== +Discovery of calendar resources +=============================== + +1. Srv record +-------------- +Calendar server and port should be advertised by a DNS _srv record. +Although this is beyond the capabilities of the OpenERP server, an +example setup is listed below: + -- TODO -- + +DNS -> http://our-host-ip:port/ + +2. Well-known uris +------------------- +The OpenERP server may have the 'well-known URIs' servlet activated, +which means that it will advertise its main database and the correct +location of the main CalDAV resource. +http://our-host-ip:port/.well-known/caldav -> http://our-host-ip:port/webdav/dbname/calendars/ + + +3. Caldav collection +--------------------- +The CalDAV "collection" is not necessarily a calendar or a folder just +containing calendars under it. It is a DAV resource (aka folder) which +has special DAV properties, so that clients are redirected to the right +urls (like per-user calendars etc.). + +http://our-host-ip:port/webdav/dbname/calendars/ -> http://our-host-ip:port/webdav/dbname/calendars/users/user-login/c/ + +4. Calendar home for user +-------------------------- +There can be one dynamic folder per user, which will in turn contain the calendars + +http://our-host-ip:port/webdav/dbname/calendars/users/user-login/c/ -> +http://our-host-ip:port/webdav/dbname/calendars/users/user-login/c/[Meetings, Tasks] + +5. Calendars +-------------- +Each calendar will contain the resource nodes: + .../c/Meetings/ -> .../c/Meetings/123.ics + +Principal url diff --git a/addons/caldav/doc/iPhone.rst b/addons/caldav/doc/iPhone.rst new file mode 100644 index 00000000000..4a3af7724d2 --- /dev/null +++ b/addons/caldav/doc/iPhone.rst @@ -0,0 +1,97 @@ +========================== +CalDAV with iPhone How-To +========================== + +As from OpenERP v6.0, document_webdav v2.2, the iPhone has been thoroughly +tested and supported as a Calendaring client for the OpenERP CalDAV module. + +However, keep in mind that OpenERP is not a straightforward calendaring +server, but an ERP application (with more data + structure) which exposes +that data to calendar clients. That said, the full features that would be +accessible through the Gtk or Web OpenERP clients cannot be crammed into +the Calendar clients (such as the iPhone). + +OpenERP server Setup +-------------------- +Some modules need to be installed at the OpenERP server. These are: + - caldav: Required, has the reference setup and the necessary + underlying code. Will also cause document, document_webdav + to be installed. + - crm_caldav: Optional, will export the CRM Meetings as a calendar. + - project_caldav: Optional, will export project tasks as calendar. + - http_well_known: Optional, experimental. Will ease bootstrapping, + but only when a DNS srv record is also used. + +These will also install a reference setup of the folders, ready to go. +The administrator of OpenERP can add more calendars and structure, if +needed. + +DNS server setup +------------------ +To be documented. + +SSL setup +---------- +It is highly advisable that you also setup SSL to work for the OpenERP +server. HTTPS is a server-wide feature in OpenERP, which means a +certificate will be set at the openerp-server.conf and will be the same +for XML-RPC, HTTP, WebDAV and CalDAV. +The iPhone also supports secure connections with SSL, although it does +not expect a self-signed certificate (or one that is not verified by +one of the "big" certificate authorities [1] ). + +Phone setup +------------- +The iPhone is fairly easy to setup. +IF you need SSL (and your certificate is not a verified one, as usual), +then you first will need to let the iPhone trust that. Follow these +steps: + s1. Open Safari and enter the https location of the OpenERP server: + https://my.server.ip:8071/ + (assuming you have the server at "my.server.ip" and the HTTPS port + is the default 8071) + s2. Safari will try to connect and issue a warning about the certificate + used. Inspect the certificate and click "Accept" so that iPhone + now trusts it. + +Now, to setup the calendars, you need to: +1. Click on the "Settings" and go to the "Mail, Contacts, Calendars" page. +2. Go to "Add account..." +3. Click on "Other" +4. From the "Calendars" group, select "Add CalDAV Account" +5. Enter the server's name or IP address at the "Server" entry, the + OpenERP username and password at the next ones. + As a description, you can either leave the server's name or + something like "OpenERP calendars". +6. You _will_ get the "Unable to verify account" error message. That is + because our server is not at the port iPhone expects[2]. But no + need to worry, click OK. +7. At the next page, enter the "Advanced Settings" to specify the right + ports and paths +8. If you have SSL, turn the switch on. Note that port will be changed + to 8443. +9. Specify the port for the OpenERP server: 8071 for SSL, 8069 without. +10. Set the "Account URL" to the right path of the OpenERP webdav: + https://my.server.ip:8071/webdav/dbname/calendars + Where "https://my.server.ip:8071" is the protocol, server name + and port as discussed above, "dbname" is the name of the database. + [Note that the default + "https://my.server.ip:8071/principals/users/username" might also + be edited to + "https://my.server.ip:8071/webdav/dbname/principals/users/username" ] +11. Click on Done. The phone will hopefully connect to the OpenERP server + and verify it can use the account. +12. Go to the main menu of the iPhone and enter the Calendar application. + Your OpenERP calendars will be visible inside the selection of the + "Calendars" button. + Note that when creating a new calendar entry, you will have to specify + which calendar it should be saved at. + + + + +[1] I remember one guy that made *lots* of money selling his CA business +off, and since then uses this money to create a software monopoly. +[2] This may not happen if the SRV records at DNS and the well-known URIs +are setup right. But we appreciate that a default OpenERP installation will +not have the DNS server of the company's domain configured. diff --git a/addons/caldav/orm_utils.py b/addons/caldav/orm_utils.py new file mode 100644 index 00000000000..ab0b4bbb8db --- /dev/null +++ b/addons/caldav/orm_utils.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010 OpenERP SA (www.openerp.com) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +if True: # we need this indentation level ;) + + def get_last_modified(self, cr, user, args, context=None, access_rights_uid=None): + """Return the last modification date of objects in 'domain' + This function has similar semantics to orm.search(), apart from the + limit, offset and order arguments, which make no sense here. + It is useful when we want to find if the table (aka set of records) + has any modifications we should update at the client. + """ + if context is None: + context = {} + self.pool.get('ir.model.access').check(cr, access_rights_uid or user, self._name, 'read', context=context) + + query = self._where_calc(cr, user, args, context=context) + self._apply_ir_rules(cr, user, query, 'read', context=context) + from_clause, where_clause, where_clause_params = query.get_sql() + + where_str = where_clause and (" WHERE %s" % where_clause) or '' + + cr.execute('SELECT MAX(COALESCE("%s".write_date, "%s".create_date)) FROM ' % (self._table, self._table) + + from_clause + where_str , + where_clause_params) + res = cr.fetchall() + return res[0][0] + +#eof diff --git a/addons/caldav/security/ir.model.access.csv b/addons/caldav/security/ir.model.access.csv index bb16603b904..ce3f3c90e32 100644 --- a/addons/caldav/security/ir.model.access.csv +++ b/addons/caldav/security/ir.model.access.csv @@ -3,3 +3,4 @@ "access_basic_calendar_attributes","basic.calendar.attributes","model_basic_calendar_attributes","base.group_user",1,1,1,1 "access_basic_calendar_fields","basic.calendar.fields","model_basic_calendar_fields","base.group_user",1,1,1,1 "access_basic_calendar","basic.calendar","model_basic_calendar","base.group_user",1,1,1,1 +"access_basic_calendar_alias","basic.calendar.alias","model_basic_calendar_alias","base.group_user",1,1,1,1 diff --git a/addons/caldav/wizard/calendar_event_export.py b/addons/caldav/wizard/calendar_event_export.py index ea90686b347..0a55f8b4fbe 100644 --- a/addons/caldav/wizard/calendar_event_export.py +++ b/addons/caldav/wizard/calendar_event_export.py @@ -37,8 +37,11 @@ class calendar_event_export(osv.osv_memory): """ Get Default value for Name field. """ - if not context: + if context is None: context = {} + else: + context= context.copy() + context['uid'] = uid model = context.get('model', 'basic.calendar') model_obj = self.pool.get(model) res = super(calendar_event_export, self).default_get( cr, uid, fields, context=context) diff --git a/addons/caldav/wizard/calendar_event_import.py b/addons/caldav/wizard/calendar_event_import.py index 875e48d7d47..11f9f9b4afb 100644 --- a/addons/caldav/wizard/calendar_event_import.py +++ b/addons/caldav/wizard/calendar_event_import.py @@ -42,6 +42,11 @@ class calendar_event_import(osv.osv_memory): @param ids: List of calendar event import’s IDs @return: dictionary of calendar evet import window with Import successful msg. """ + if context is None: + context = {} + else: + context = context.copy() + context['uid'] = uid for data in self.read(cr, uid, ids): model = data.get('model', 'basic.calendar') diff --git a/addons/caldav/wizard/calendar_event_subscribe.py b/addons/caldav/wizard/calendar_event_subscribe.py index de673b5d7c0..f8dc7614507 100644 --- a/addons/caldav/wizard/calendar_event_subscribe.py +++ b/addons/caldav/wizard/calendar_event_subscribe.py @@ -44,6 +44,12 @@ class calendar_event_subscribe(osv.osv_memory): @return: dictionary of calendar evet subscribe window with Import successful msg. """ global cnt + if context is None: + context = {} + else: + context = context.copy() + context['uid'] = uid + for data in self.read(cr, uid, ids): try: f = urllib.urlopen(data['url_path']) diff --git a/addons/claim_from_delivery/i18n/sr.po b/addons/claim_from_delivery/i18n/sr.po new file mode 100644 index 00000000000..602957aa82a --- /dev/null +++ b/addons/claim_from_delivery/i18n/sr.po @@ -0,0 +1,60 @@ +# Serbian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2010-08-20 12:02+0000\n" +"PO-Revision-Date: 2010-10-16 08:05+0000\n" +"Last-Translator: zmmaj \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: claim_from_delivery +#: model:ir.actions.act_window,name:claim_from_delivery.action_claim_from_delivery +msgid "Claim" +msgstr "Zahtev" + +#. module: claim_from_delivery +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: claim_from_delivery +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" + +#. module: claim_from_delivery +#: model:ir.module.module,description:claim_from_delivery.module_meta_information +msgid "Create Claim from delivery order:\n" +msgstr "Kreiraj Zahtev iz Naloga Isporuke\n" + +#. module: claim_from_delivery +#: model:ir.module.module,shortdesc:claim_from_delivery.module_meta_information +msgid "Claim from delivery" +msgstr "Zahtev od Isporuke" + +#. module: claim_from_delivery +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Pogrešno ime modela u definiciji akcije." + +#. module: claim_from_delivery +#: model:ir.model,name:claim_from_delivery.model_stock_picking +msgid "Picking List" +msgstr "Izborna Lista" + +#. module: claim_from_delivery +#: field:stock.picking,partner_id:0 +msgid "Partner" +msgstr "Partner" diff --git a/addons/crm/board_crm_view.xml b/addons/crm/board_crm_view.xml index 72368d1413a..79dadadbcd0 100644 --- a/addons/crm/board_crm_view.xml +++ b/addons/crm/board_crm_view.xml @@ -159,6 +159,5 @@ sequence="1" id="menu_board_crm" icon="terp-graph" groups="base.group_sale_salesman"/> - diff --git a/addons/crm/crm.py b/addons/crm/crm.py index d6194254c65..c809857de66 100644 --- a/addons/crm/crm.py +++ b/addons/crm/crm.py @@ -322,11 +322,7 @@ class crm_case(object): 'active': True}) self._action(cr, uid, cases, 'cancel') for case in cases: - message = "The " + self._description + " '" + case.name + "' has been Cancelled." - #TODO: Need to differentiate lead and opportunity -# if hasattr(case, 'type'): -# #TO CHECK: hasattr gives warning for other crm objects that don't have field 'type' -# message = "The " + (case.type or 'Case').title() + " '" + case.name + "' has been Cancelled." + message = _("The case '%s' has been cancelled.") % (case.name,) self.log(cr, uid, case.id, message) return True diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 23b1af57b28..6a113a42c2a 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -197,10 +197,14 @@ class crm_lead(crm_case, osv.osv): value.update({'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) self.write(cr, uid, ids, value) - for (id, name) in self.name_get(cr, uid, ids): - type = self.browse(cr, uid, id).type or 'Lead' - message = (_('The ') + type.title()) + " '" + name + "' "+ _("has been Opened.") - self.log(cr, uid, id, message) + for case in self.browse(cr, uid, ids): + if case.type == 'lead': + message = _("The lead '%s' has been opened.") % case.name + elif case.type == 'opportunity': + message = _("The opportunity '%s' has been opened.") % case.name + else: + message = _("The case '%s' has been opened.") % case.name + self.log(cr, uid, case.id, message) return res def case_close(self, cr, uid, ids, *args): @@ -213,11 +217,14 @@ class crm_lead(crm_case, osv.osv): """ res = super(crm_lead, self).case_close(cr, uid, ids, args) self.write(cr, uid, ids, {'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')}) - for (id, name) in self.name_get(cr, uid, ids): - lead = self.browse(cr, uid, id) - if lead.type == 'lead': - message = _('The Lead') + " '" + name + "' "+ _("has been Closed.") - self.log(cr, uid, id, message) + for case in self.browse(cr, uid, ids): + if case.type == 'lead': + message = _("The lead '%s' has been closed.") % case.name + elif case.type == 'opportunity': + message = _("The opportunity '%s' has been closed.") % case.name + else: + message = _("The case '%s' has been closed.") % case.name + self.log(cr, uid, case.id, message) return res def convert_opportunity(self, cr, uid, ids, context=None): @@ -315,8 +322,6 @@ class crm_lead(crm_case, osv.osv): vals.update(res) res = self.create(cr, uid, vals, context) - message = _('A Lead created') + " '" + subject + "' " + _("from Mailgate.") - self.log(cr, uid, res, message) attachents = msg.get('attachments', []) for attactment in attachents or []: data_attach = { diff --git a/addons/crm/crm_lead_menu.xml b/addons/crm/crm_lead_menu.xml index b26dcc29f41..a92a36aba33 100644 --- a/addons/crm/crm_lead_menu.xml +++ b/addons/crm/crm_lead_menu.xml @@ -10,7 +10,7 @@ {'search_default_current':1, 'default_type': 'lead', 'search_default_section_id': section_id} - A lead is a first, unqualified, contact with a new prospect. Use leads when you import a database of prospects or integrate your website's contact form with OpenERP. After having been qualified, the lead can be converted to a partner and a business opportunity for a further detailed tracking of the related activities. + 'Leads' allows you to manage and keep track of all first potential interests of a partner in one of your products or services. A lead is a first, unqualified, contact with a prospect or customer. After being qualified, a lead can be converted into a business opportunity with the creation of the related partner for further detailed tracking of any linked activities. You can use leads when you import a database of prospects or to integrate your website's contact form with OpenERP. diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index 99ebcf63592..fb45e8a7b1b 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -11,6 +11,7 @@ [('object_id.model', '=', 'crm.lead')] {'object_id':'crm.lead'} + Create specific stages that will help your sales better organise their sales pipeline by maintaining them to their leads and sales opportunities. It will allow them to easily track how is positioned a specific lead or opportunity in the sales cycle. form [('object_id.model', '=', 'crm.lead')] + Create specific categories that fit your company's activities in order to better classify and analyse them after they have been maintained in your leads and opportunities. You can use categories to reflect your product structure or the different types of sales you do. {"search_default_user_id":uid, 'search_default_section_id': section_id} - The calendar of meetings is shared between sales teams and fully integrated with the others applications like the employee holidays. You can also synchronize meetings with your mobile phone using the caldav interface. + The meeting calendar is shared between the sales teams and fully integrated with other applications such as the employee holidays or the business opportunities. You can also synchronize meetings with your mobile phone using the caldav interface. @@ -106,12 +106,13 @@ [('ref','like','crm.meeting,')] {"search_default_toreview":1, "search_default_user_id":uid} + 'Meeting Invitations' allows you to create and manage the meeting invitations sent/to be sent to your colleagues/partners. + groups="base.group_no_one" /> diff --git a/addons/crm/crm_meeting_view.xml b/addons/crm/crm_meeting_view.xml index dfeadb85bcc..163a2f5878a 100644 --- a/addons/crm/crm_meeting_view.xml +++ b/addons/crm/crm_meeting_view.xml @@ -11,6 +11,7 @@ [('object_id.model', '=', 'crm.meeting')] {'object_id':'crm.meeting'} + Create different meeting categories to better organize and classify your meetings. {'search_default_user_id':uid,'search_default_current':1, 'search_default_section_id':section_id,'default_type': 'opportunity'} - Opportunities allows you to track your best deals pipeline: history of -the communication, expected revenues, stage of each opportunity, -excepted closings, etc. Opportunities are usually connected with the -email gateway: new emails may create opportunities and each opportunity -automatically gets the history of the conversation with the customer. + Opportunities allows you to manage and keep track of your sales pipeline by creating specific customer or prospect related sales documents in order to follow up potential sales. Information such as the expected revenue, opportunity stage, expected closing date, communication history and so on can be maintained in them. Opportunities can be connected with the email gateway: new emails create opportunities, each of them automatically gets the history of the conversation with the customer. -Your teams will be able to plan meeting and phonecalls from -opportunities, to convert opportunities into quotations, to manage -documents related to the opportunity, to track all activities related to -this customer, etc. +You and your team(s) will be able to plan meetings and phone calls from opportunities, convert them into quotations, manage related documents, track all customer related activities, and much more. diff --git a/addons/crm/crm_opportunity_view.xml b/addons/crm/crm_opportunity_view.xml index 5bb55a2320d..644d12cfc77 100644 --- a/addons/crm/crm_opportunity_view.xml +++ b/addons/crm/crm_opportunity_view.xml @@ -76,6 +76,9 @@ + @@ -89,9 +92,6 @@ states="open,pending" type="object" groups="base.group_extended" icon="gtk-go-up" /> - diff --git a/addons/crm/crm_phonecall_menu.xml b/addons/crm/crm_phonecall_menu.xml index 5c5a43edbd8..d030a4f24f6 100644 --- a/addons/crm/crm_phonecall_menu.xml +++ b/addons/crm/crm_phonecall_menu.xml @@ -69,7 +69,7 @@ - Trace easily all your Inbound calls. The Inbound menu open a search view in editable mode, so you can easily modify or add a new call record. With the actions buttons convert a lead into an opportunity or plan a meeting. + The Inbound Calls tool allows you to log your inbound calls on the fly. Each call you get will appear on the partner form for the traceability of every contact you get with a partner. From the call record, you can trigger a request for another call, a meeting or a business opportunity. @@ -107,7 +107,7 @@ - The Outbound menu open a search view in editable mode, so you can easily modify or plan a new call. Actions buttons allows you to to make you call status evolved for a better follow up of your planned calls. During calls, convert your lead into an opportunity, plan a meeting or canceled it. + Outbound Calls lists all the calls to be performed by your sales team. They can record the information about the call on the form view. These information will appear on the partner form for the traceability of every contact you get with a customer. You can import a .CSV file with a list of calls to be done for your sales team. diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml index ca38f587f00..5b796d20b8d 100644 --- a/addons/crm/crm_phonecall_view.xml +++ b/addons/crm/crm_phonecall_view.xml @@ -11,6 +11,7 @@ [('object_id.model', '=', 'crm.phonecall')] {'object_id':'crm.phonecall'} + Create specific phone call categories to better sort the type of calls tracked in the system. - + + parent="base.menu_base_config" sequence="1" groups="base.group_sale_manager"/> + parent="base.menu_base_config" sequence="0" groups="base.group_sale_manager"/> + parent="base.menu_base_config" sequence="5" groups="base.group_extended"/> @@ -85,6 +86,7 @@ crm.case.section form + Sales team allows you to organize your different salesmen or departments into separate teams. Each team will work in his own list of opportunities, sales orders, eso. Each user can set a team by default in his preferences. The opportunities and sales order he will see, will be automatically filtered according to his team. crm.segmentation form tree,form + Create specific partner categories that you will then be able to assign to your partners to better manage your interactions with them. The segmentation tool will assign categories to partners based on defined criteria. {'search_default_filter_lead': 1, 'search_default_lead':1, "search_default_user":1,"search_default_this_month":1,'group_by_no_leaf':1,'group_by':[]} tree,graph [('type', '=', 'lead')] - Leads Analysis allows you to consult different informations relative to CRM. Check for treatments delays, number of responses given and emails send. You can sort out your leads analysis on different groups to get fine grained analysis. + Leads Analysis allows you to check different CRM related information. Check for treatment delays, number of responses given and emails sent. You can sort out your leads analysis by different groups to get accurate grained analysis. @@ -226,7 +226,7 @@ {"search_default_filter_opportunity":1, "search_default_opportunity": 1, "search_default_user":1,"search_default_this_month":1,'group_by_no_leaf':1,'group_by':[]} tree,graph [('type', '=', 'opportunity')] - Opportunities Analysis menu gives you an instant access to your opportunities like expected revenue, planned cost, overpassed deadline or the number of exchanges by opportunity. + Opportunities Analysis gives you an instant access to your opportunities with information such as the expected revenue, planned cost, missed deadlines or the number of interactions per opportunity. This report is mainly used by the sales manager in order to do the periodic review with the teams of the sales pipeline. diff --git a/addons/crm/report/crm_phonecall_report_view.xml b/addons/crm/report/crm_phonecall_report_view.xml index 9100c75a7ae..69dd06c5ad6 100644 --- a/addons/crm/report/crm_phonecall_report_view.xml +++ b/addons/crm/report/crm_phonecall_report_view.xml @@ -159,7 +159,7 @@ {"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]} - Get an anlysis of Phone Calls number and delay to close, stage, user suits to different groups for a global or a fine grained analysis. + From this report, you can analyse the performance of your sales team, based on their phone calls. You can group or filter the information according to several criteria and drill down the information, by adding more groups in the report. diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv index 5f695b5e5c1..9abdaed00c5 100644 --- a/addons/crm/security/ir.model.access.csv +++ b/addons/crm/security/ir.model.access.csv @@ -7,7 +7,6 @@ "access_crm_case_categ","crm.case.categ","model_crm_case_categ","base.group_sale_salesman",1,1,1,0 "access_crm_meeting_manager","crm.meeting.manager","model_crm_meeting","base.group_sale_manager",1,1,1,1 "access_crm_lead_manager","crm.lead.manager","model_crm_lead","base.group_sale_manager",1,1,1,1 -"access_crm_phonecall_system","crm.phonecall.system","model_crm_phonecall","base.group_system",1,0,0,0 "access_crm_phonecall_manager","crm.phonecall.manager","model_crm_phonecall","base.group_sale_manager",1,1,1,1 "access_crm_case_categ","crm.case.categ","model_crm_case_categ","base.group_user",1,0,0,0 "access_crm_meeting","crm.meeting","model_crm_meeting","base.group_sale_salesman",1,1,1,0 @@ -18,7 +17,6 @@ "access_crm_phonecall.all","crm.phonecall.all","model_crm_phonecall","base.group_user",1,0,0,0 "access_crm_case_section_user","crm.case.section.user","model_crm_case_section","base.group_sale_salesman",1,1,1,0 "access_crm_case_section_manager","crm.case.section.manager","model_crm_case_section","base.group_sale_manager",1,1,1,1 -"access_crm_case_categ","crm.case.categ","model_crm_case_categ","base.group_system",1,1,1,1 "access_crm_case_stage","crm.case.stage","model_crm_case_stage","base.group_user",1,0,0,0 "access_crm_case_stage_manager","crm.case.stage","model_crm_case_stage","base.group_sale_manager",1,1,1,1 "access_crm_case_resource_type_user","crm_case_resource_type user","model_crm_case_resource_type","base.group_sale_salesman",1,1,1,0 @@ -36,30 +34,11 @@ "access_res_partner","res.partner.crm.user","base.model_res_partner","base.group_sale_salesman",1,1,1,0 "access_res_partner_address","res.partner.address.crm.user","base.model_res_partner_address","base.group_sale_salesman",1,1,1,0 "access_res_partner_category","res.partner.category.crm.user","base.model_res_partner_category","base.group_sale_salesman",1,1,1,0 -"mail_gateway_mailgate_message","mail_gateway.mailgate.message","mail_gateway.model_mailgate_message","base.group_system",1,1,1,1 "mail_gateway_mailgate_thread","mail_gateway.mailgate.thread","mail_gateway.model_mailgate_thread","base.group_sale_salesman",1,1,1,1 "mail_gateway_mailgate_message_user","mail_gateway.mailgate.message.user","mail_gateway.model_mailgate_message","base.group_sale_salesman",1,1,1,1 -"access_base_res_bank_system","base.res.bank system","base.model_res_bank","base.group_system",1,1,1,1 -"access_crm_case_stage_system","crm.case.stage system","model_crm_case_stage","base.group_system",1,1,1,1 "access_crm_case_categ_manager","crm.case.categ manager","model_crm_case_categ","base.group_sale_manager",1,1,1,1 -"access_crm_case_resource_type_system","crm.case.resource.type system","model_crm_case_resource_type","base.group_system",1,1,1,1 -"access_crm_case_section_system","crm.case.section system","model_crm_case_section","base.group_system",1,1,1,1 -"access_crm_lead_report_system","crm.lead.report system","model_crm_lead_report","base.group_system",1,1,1,1 -"access_base_res_country_system","base.res.country system","base.model_res_country","base.group_system",1,1,1,1 -"access_base_res_country_state_system","base.res.country.state system","base.model_res_country_state","base.group_system",1,1,1,1 "access_base_action_rule_manager","base.action.rule manager","model_base_action_rule","base.group_sale_manager",1,1,1,1 -"access_base_action_rule_system","base.action.rule system","model_base_action_rule","base.group_system",1,1,1,1 -"access_crm_segmentation_system","crm.segmentation system","model_crm_segmentation","base.group_system",1,1,1,1 -"access_crm_segmentation_line_system","crm.segmentation.line system","model_crm_segmentation_line","base.group_system",1,1,1,1 -"access_base_calendar_res_alarm_system","base.calendar.res.alarm system","base_calendar.model_res_alarm","base.group_system",1,1,1,1 -"access_res_partner_address_system","res.partner.address system","base.model_res_partner_address","base.group_system",1,0,0,0 "access_crm_lead_report_user","crm.lead.report user","model_crm_lead_report","base.group_sale_salesman",1,1,1,1 -"access_base_res_partner_canal_system","base.res.partner.canal system","base.model_res_partner_canal","base.group_system",1,1,1,1 -"access_res_partner_category_system","res.partner.category system","base.model_res_partner_category","base.group_system",1,1,1,1 -"access_res_partner_title_system","res.partner.title system","base.model_res_partner_title","base.group_system",1,1,1,1 -"access_crm_lead_system","crm.lead.system","model_crm_lead","base.group_system",1,0,0,0 -"access_crm_meeting_system","crm.meeting.system","model_crm_meeting","base.group_system",1,0,0,0 -"access_calendar_attendee_system","calendar.attendee.system","model_calendar_attendee","base.group_system",1,0,0,0 "access_res_partner_bank_type_crm_user","res.partner.bank.type.crm.user","base.model_res_partner_bank_type","base.group_sale_salesman",1,0,0,0 "access_res_partner_bank_type_crm_manager","res.partner.bank.type.crm.manager","base.model_res_partner_bank_type","base.group_sale_manager",1,0,0,0 "access_res_partner_canal_manager","res.partner.canal.manager","base.model_res_partner_canal","base.group_sale_manager",1,1,1,1 diff --git a/addons/crm/wizard/crm_merge_opportunities_view.xml b/addons/crm/wizard/crm_merge_opportunities_view.xml index cf1a7ee09a4..153267f0ad1 100644 --- a/addons/crm/wizard/crm_merge_opportunities_view.xml +++ b/addons/crm/wizard/crm_merge_opportunities_view.xml @@ -35,9 +35,10 @@ - \ No newline at end of file + diff --git a/addons/crm_caldav/__openerp__.py b/addons/crm_caldav/__openerp__.py index ce8f72a3e17..d0e04576b3b 100644 --- a/addons/crm_caldav/__openerp__.py +++ b/addons/crm_caldav/__openerp__.py @@ -22,24 +22,24 @@ { 'name': 'Extened Module to Add CalDav future on Meeting', - 'version': '1.0', + 'version': '1.1', 'category': 'Generic Modules/CRM & SRM', 'description': """ - New Futures in Meeting: - * Share meeting with other calendar clients like sunbird -""", - 'author': 'OpenERP SA', - 'website': 'http://www.openerp.com', - 'depends': ['caldav', 'crm' - ], - 'init_xml': [ - 'crm_caldav_data.xml', - ], + New Futures in Meeting: + * Share meeting with other calendar clients like sunbird +""", + 'author': 'OpenERP SA', + 'website': 'http://www.openerp.com', + 'depends': ['caldav', 'crm' ], + 'init_xml': [ + 'crm_caldav_data.xml', + 'crm_caldav_setup.xml', + ], 'update_xml': [], - 'demo_xml': [], - 'installable': True, - 'active': False, + 'demo_xml': [], + 'installable': True, + 'active': False, } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/crm_caldav/crm_caldav.py b/addons/crm_caldav/crm_caldav.py index 22f64f4d63d..1a2deae90be 100644 --- a/addons/crm_caldav/crm_caldav.py +++ b/addons/crm_caldav/crm_caldav.py @@ -77,7 +77,7 @@ class crm_meeting(osv.osv): try: for val in vals: # Compute value of duration - if 'date_deadline' in val and 'duration' not in val: + if val.get('date_deadline', False) and 'duration' not in val: start = datetime.strptime(val['date'], '%Y-%m-%d %H:%M:%S') end = datetime.strptime(val['date_deadline'], '%Y-%m-%d %H:%M:%S') diff = end - start diff --git a/addons/crm_caldav/crm_caldav_setup.xml b/addons/crm_caldav/crm_caldav_setup.xml new file mode 100644 index 00000000000..1a103f61811 --- /dev/null +++ b/addons/crm_caldav/crm_caldav_setup.xml @@ -0,0 +1,287 @@ + + + + + + + Meetings per user + #1E25FF + + vevent + Meetings + + + + + [] + attendee + + + + + + [] + valarm + + + + + + [('user_id','=', dctx_user_id)] + vevent + + + + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + {'tentative': 'draft', 'confirmed': 'open', 'cancelled': 'cancel'} + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + diff --git a/addons/crm_claim/crm_claim_menu.xml b/addons/crm_claim/crm_claim_menu.xml index c02bc33340d..18642f18282 100644 --- a/addons/crm_claim/crm_claim_menu.xml +++ b/addons/crm_claim/crm_claim_menu.xml @@ -16,7 +16,7 @@ {'search_default_section_id': section_id, "search_default_current":1,"search_default_user_id":uid} - Record and trace your customers' claims here. A claim is defined by a client name, several types, a status and a priority level. A claim can also be a preventive or repairing action. A claim can be linked to a reference like a sales order, or a lot. You can send emails with attachments and get the history of the claim treatment (emails send, interventions type, etc.). + Record and track your customers' claims. Claims can be linked to a sales order or a lot. You can send emails with attachments and get the history of everything that happened on a specific claim (emails sent, interventions type and so on..). Claims can be automatically linked to an email address using the mail gateway module. diff --git a/addons/crm_claim/crm_claim_view.xml b/addons/crm_claim/crm_claim_view.xml index 9839f03bd6d..975e8d33bec 100644 --- a/addons/crm_claim/crm_claim_view.xml +++ b/addons/crm_claim/crm_claim_view.xml @@ -3,7 +3,7 @@ @@ -15,6 +15,7 @@ [('object_id.model', '=', 'crm.claim')] {'object_id':'crm.claim'} + Create claim categories to better manage and classify your claims. Some example of claims can be: preventive action, corrective action. [('object_id.model', '=', 'crm.claim')] {'object_id':'crm.claim'} + You can create claim stages to categorize the status of every claim entered in the system. The stages define all the steps required for the resolution of a claim. {"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]} + Have a general overview of all claims processed in the system by sorting them with specific criteria. diff --git a/addons/crm_claim/security/ir.model.access.csv b/addons/crm_claim/security/ir.model.access.csv index e2563f7541a..ac2752f58b2 100644 --- a/addons/crm_claim/security/ir.model.access.csv +++ b/addons/crm_claim/security/ir.model.access.csv @@ -2,4 +2,3 @@ "access_crm_claim_manager","crm.claim.manager","model_crm_claim","base.group_sale_manager",1,1,1,1 "access_crm_claim_user","crm.claim.user","model_crm_claim","base.group_sale_salesman",1,1,1,0 "access_crm_claim_report_manager","crm.claim.report.manager","model_crm_claim_report","base.group_sale_manager",1,1,1,1 -"access_crm_claim_system","crm.claim.system","model_crm_claim","base.group_system",1,0,0,0 diff --git a/addons/crm_fundraising/crm_fundraising_menu.xml b/addons/crm_fundraising/crm_fundraising_menu.xml index d521bc91592..85fa4ffd70b 100644 --- a/addons/crm_fundraising/crm_fundraising_menu.xml +++ b/addons/crm_fundraising/crm_fundraising_menu.xml @@ -15,7 +15,7 @@ {"search_default_user_id":uid,"search_default_current":1, 'search_default_section_id': section_id} - When you wish to support your organization or a campaign, trace here all your activities for collecting money. The menu open a search list where you can find funds description, email, history, probability of success. Several actions buttons allows you to easily modify your different fund status. + If you need to support your organization or a campaign, with 'Fund Raising' you can track all you fund raising activities. The search list allows you to filter by funds description, email, history and probability of success. diff --git a/addons/crm_fundraising/crm_fundraising_view.xml b/addons/crm_fundraising/crm_fundraising_view.xml index 51650f8b7d5..eea653a4d48 100644 --- a/addons/crm_fundraising/crm_fundraising_view.xml +++ b/addons/crm_fundraising/crm_fundraising_view.xml @@ -15,6 +15,7 @@ [('object_id.model', '=', 'crm.fundraising')] {'object_id':'crm.fundraising'} + Manage and define the fund raising categories you want to be maintained in the system. [('object_id.model', '=', 'crm.fundraising')] {'object_id':'crm.fundraising'} + Create and manage fund raising activity categories you want to be maintained in the system. {"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]} - With Fund Raising get at a glance a view to your fund raising campaigns with the estimated revenue, average probability and delay to close. + Have a general overview of all fund raising activities by sorting them with specific criteria such as the estimated revenue, average success probability and delay to close. diff --git a/addons/crm_fundraising/security/ir.model.access.csv b/addons/crm_fundraising/security/ir.model.access.csv index 53d593589d4..703c899c096 100644 --- a/addons/crm_fundraising/security/ir.model.access.csv +++ b/addons/crm_fundraising/security/ir.model.access.csv @@ -3,4 +3,3 @@ "access_crm_fundraising_user","crm.fundraising.user","model_crm_fundraising","base.group_sale_salesman",1,1,1,0 "access_crm_fundraising_report_user","crm.fundraising.report.user","model_crm_fundraising_report","base.group_sale_salesman",1,0,0,0 "access_crm_fundraising_report_manager","crm.fundraising.report.manager","model_crm_fundraising_report","base.group_sale_manager",1,1,1,1 -"access_crm_fundraising_system","crm.fundraising.system","model_crm_fundraising","base.group_system",1,0,0,0 diff --git a/addons/crm_helpdesk/crm_helpdesk_menu.xml b/addons/crm_helpdesk/crm_helpdesk_menu.xml index 7bc6faf4ee0..80077e9a51e 100644 --- a/addons/crm_helpdesk/crm_helpdesk_menu.xml +++ b/addons/crm_helpdesk/crm_helpdesk_menu.xml @@ -13,7 +13,7 @@ {"search_default_user_id":uid, 'search_default_section_id': section_id} - Alike records and processing of claims, Helpdesk and Support is a good tool to trace your interventions. This menu is more adapted to an oral communication, which is not necessarily related to a claim. Select a customer, add notes and categorize your interventions with a channel and a priority level. + 'Helpdesk and Support' allows you to track your interventions. Select a customer, add notes and categorize interventions with partners if necessary and assign a priority level. Depending on your need, you may consider using the issues system of OpenERP to manage your support activities. diff --git a/addons/crm_helpdesk/crm_helpdesk_view.xml b/addons/crm_helpdesk/crm_helpdesk_view.xml index 9c0fe7ac254..55eaf16ff85 100644 --- a/addons/crm_helpdesk/crm_helpdesk_view.xml +++ b/addons/crm_helpdesk/crm_helpdesk_view.xml @@ -15,6 +15,7 @@ [('object_id.model', '=', 'crm.helpdesk')] {'object_id':'crm.helpdesk'} + Create and manage helpdesk categories to better manage and classify your support request. {"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]} - Helpdesk allows you to consult different informations relative to support demands. Check for treatments delays, number of responses given and emails send and costs. You can sort out your analysis on different groups to get fine grained analysis. + Have a general overview of all support requests by sorting them with specific criteria such as the processing time, number of requests answered, emails sent and costs. diff --git a/addons/crm_helpdesk/security/ir.model.access.csv b/addons/crm_helpdesk/security/ir.model.access.csv index 79cac379f91..2a0d8785122 100644 --- a/addons/crm_helpdesk/security/ir.model.access.csv +++ b/addons/crm_helpdesk/security/ir.model.access.csv @@ -2,4 +2,3 @@ "access_crm_helpdesk_manager","crm.helpdesk.manager","model_crm_helpdesk","base.group_sale_manager",1,1,1,1 "access_crm_helpdesk_user","crm.helpdesk.user","model_crm_helpdesk","base.group_sale_salesman",1,1,1,0 "access_report_crm_helpdesk_manager","report.crm.helpdesk.manager","model_crm_helpdesk_report","base.group_sale_manager",1,1,1,1 -"access_crm_helpdesk_system","crm.helpdesk.system","model_crm_helpdesk","base.group_system",1,0,0,0 diff --git a/addons/crm_profiling/crm_profiling_view.xml b/addons/crm_profiling/crm_profiling_view.xml index e0dbcce05a1..d029240a768 100644 --- a/addons/crm_profiling/crm_profiling_view.xml +++ b/addons/crm_profiling/crm_profiling_view.xml @@ -14,6 +14,7 @@ crm_profiling.questionnaire form tree,form + You can create specific topic related questionnaires that will be used to guide your team(s) in the sales cycle by helping them to ask the right questions. Using the segmentation tool, you will be able to automatically assign a partner to a category based on his answers to the different questionnaires. , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-08-28 16:01+0000\n" +"PO-Revision-Date: 2010-10-16 09:53+0000\n" +"Last-Translator: OpenERP Administrators \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: crm_profiling +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" + +#. module: crm_profiling +#: field:crm_profiling.answer,question_id:0 +#: field:crm_profiling.question,name:0 +#: model:ir.model,name:crm_profiling.model_crm_profiling_question +msgid "Question" +msgstr "Pitanje" + +#. module: crm_profiling +#: wizard_button:open_questionnaire,init,open:0 +msgid "Open Questionnaire" +msgstr "Otvori Upitnik" + +#. module: crm_profiling +#: field:crm.segmentation,child_ids:0 +msgid "Child Profiles" +msgstr "Pod Profili" + +#. module: crm_profiling +#: model:ir.module.module,shortdesc:crm_profiling.module_meta_information +msgid "crm_profiling management" +msgstr "crm_profiling upravljanje" + +#. module: crm_profiling +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Pogrešno ime modela u definiciji akcije." + +#. module: crm_profiling +#: field:crm_profiling.answer,name:0 +#: model:ir.model,name:crm_profiling.model_crm_profiling_answer +msgid "Answer" +msgstr "Odgovor" + +#. module: crm_profiling +#: view:res.partner:0 +msgid "Profiling" +msgstr "Profiliranje" + +#. module: crm_profiling +#: field:crm_profiling.questionnaire,description:0 +msgid "Description" +msgstr "Opis" + +#. module: crm_profiling +#: field:crm.segmentation,answer_no:0 +msgid "Excluded Answers" +msgstr "Isključeni Odgovori" + +#. module: crm_profiling +#: view:crm_profiling.answer:0 +#: view:crm_profiling.question:0 +#: field:res.partner,answers_ids:0 +msgid "Answers" +msgstr "Odgovori" + +#. module: crm_profiling +#: wizard_field:open_questionnaire,init,questionnaire_name:0 +msgid "Questionnaire name" +msgstr "Ime Upitnka" + +#. module: crm_profiling +#: view:res.partner:0 +msgid "Use a questionnaire" +msgstr "Koristi Upitnka" + +#. module: crm_profiling +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: crm_profiling +#: view:crm_profiling.questionnaire:0 +#: model:ir.actions.act_window,name:crm_profiling.open_questionnaires +#: model:ir.ui.menu,name:crm_profiling.menu_segm_questionnaire +msgid "Questionnaires" +msgstr "Upitnici" + +#. module: crm_profiling +#: field:crm_profiling.questionnaire,name:0 +#: model:ir.model,name:crm_profiling.model_crm_profiling_questionnaire +#: wizard_view:open_questionnaire,init:0 +msgid "Questionnaire" +msgstr "Upitnik" + +#. module: crm_profiling +#: constraint:crm.segmentation:0 +msgid "Error ! You can not create recursive profiles." +msgstr "Greška ! Ne možete kreirati rekurzivne profile." + +#. module: crm_profiling +#: field:crm.segmentation,profiling_active:0 +msgid "Use The Profiling Rules" +msgstr "Koristi Pravila Profiliranja" + +#. module: crm_profiling +#: view:crm_profiling.question:0 +#: field:crm_profiling.question,answers_ids:0 +msgid "Avalaible answers" +msgstr "Raspoloživi odgovori" + +#. module: crm_profiling +#: field:crm.segmentation,answer_yes:0 +msgid "Included Answers" +msgstr "Uključeni Odgovori" + +#. module: crm_profiling +#: help:crm.segmentation,profiling_active:0 +msgid "" +"Check this box if you want to use this tab as part of the segmentation rule. " +"If not checked, the criteria beneath will be ignored" +msgstr "" +"Označite ovde ako želite koristiti ovu karticu (Tab) kao deo pravila " +"segmentacije. Ako ne označite, kriterijum koji sledi će biti ignorisan." + +#. module: crm_profiling +#: view:crm_profiling.question:0 +#: field:crm_profiling.questionnaire,questions_ids:0 +#: model:ir.actions.act_window,name:crm_profiling.open_questions +#: model:ir.ui.menu,name:crm_profiling.menu_segm_answer +msgid "Questions" +msgstr "Pitanja" + +#. module: crm_profiling +#: field:crm.segmentation,parent_id:0 +msgid "Parent Profile" +msgstr "Roditeljski Profil" + +#. module: crm_profiling +#: wizard_button:open_questionnaire,init,end:0 +#: wizard_button:open_questionnaire,open,end:0 +msgid "Cancel" +msgstr "Otkaži" + +#. module: crm_profiling +#: view:crm.segmentation:0 +msgid "Partner Segmentations" +msgstr "Segmentacije Partnera" + +#. module: crm_profiling +#: model:ir.actions.wizard,name:crm_profiling.wizard_open_questionnaire +msgid "Using a questionnaire" +msgstr "Korištenje Upitnika" + +#. module: crm_profiling +#: wizard_button:open_questionnaire,open,compute:0 +msgid "Save Data" +msgstr "Sacuvaj Podatke" diff --git a/addons/crm_profiling/security/ir.model.access.csv b/addons/crm_profiling/security/ir.model.access.csv index f60a6041c9f..6ba022b2535 100644 --- a/addons/crm_profiling/security/ir.model.access.csv +++ b/addons/crm_profiling/security/ir.model.access.csv @@ -1,7 +1,4 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_crm_profiling_question","crm_profiling.question","model_crm_profiling_question","base.group_system",1,1,1,1 -"access_crm_profiling_questionnaire_manager","crm_profiling.questionnaire manager","model_crm_profiling_questionnaire","base.group_system",1,1,1,1 -"access_crm_profiling_answer_system","crm_profiling.answer system","model_crm_profiling_answer","base.group_system",1,1,1,1 "access_crm_profiling_answer_user","crm_profiling.answer user","model_crm_profiling_answer","base.group_sale_salesman",1,1,1,0 "access_crm_profiling_answer_manager","crm_profiling.answer manager","model_crm_profiling_answer","base.group_sale_manager",1,0,0,0 "access_crm_profiling_question_manager","crm_profiling.question manager","model_crm_profiling_question","base.group_sale_salesman",1,1,1,0 diff --git a/addons/decimal_precision/i18n/ru.po b/addons/decimal_precision/i18n/ru.po index 3088918479a..f9d9d6a3f5b 100644 --- a/addons/decimal_precision/i18n/ru.po +++ b/addons/decimal_precision/i18n/ru.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-08-20 05:24+0000\n" -"PO-Revision-Date: 2010-09-30 06:57+0000\n" -"Last-Translator: Chertykov Denis \n" +"PO-Revision-Date: 2010-10-16 10:39+0000\n" +"Last-Translator: Nikolay Chesnokov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-01 08:47+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: decimal_precision @@ -85,4 +85,4 @@ msgstr "Настройка точности" #. module: decimal_precision #: model:ir.model,name:decimal_precision.model_decimal_precision msgid "decimal.precision" -msgstr "" +msgstr "Точность десятичных знаков" diff --git a/addons/decimal_precision/i18n/sr.po b/addons/decimal_precision/i18n/sr.po new file mode 100644 index 00000000000..df13c1328b8 --- /dev/null +++ b/addons/decimal_precision/i18n/sr.po @@ -0,0 +1,88 @@ +# Serbian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2010-08-20 05:24+0000\n" +"PO-Revision-Date: 2010-10-16 17:13+0000\n" +"Last-Translator: zmmaj \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: decimal_precision +#: field:decimal.precision,digits:0 +msgid "Digits" +msgstr "Brojevi" + +#. module: decimal_precision +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: decimal_precision +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" + +#. module: decimal_precision +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Pogrešno ime modela u definiciji akcije." + +#. module: decimal_precision +#: view:decimal.precision:0 +msgid "Decimal Precision" +msgstr "Decimalna Preiznost" + +#. module: decimal_precision +#: model:ir.actions.act_window,name:decimal_precision.action_decimal_precision_form +#: model:ir.ui.menu,name:decimal_precision.menu_decimal_precision_form +msgid "Decimal Accuracy Definitions" +msgstr "Definicija Decimalne Preciznosti" + +#. module: decimal_precision +#: model:ir.module.module,description:decimal_precision.module_meta_information +msgid "" +"\n" +"This module allows to configure the price accuracy you need for different " +"kind\n" +"of usage: accounting, sales, purchases, ...\n" +"\n" +"The decimal precision is configured per company.\n" +msgstr "" +"\n" +"Ovaj modul vam omogucava za zaokruzujete cene na potrebne vrednosti za " +"nekoliko nacina\n" +"koriscenja: Racunanje, prodaja, nabavka ...\n" +"\n" +"Preciznost definisete za celo preduzece.\n" + +#. module: decimal_precision +#: constraint:ir.ui.menu:0 +msgid "Error ! You can not create recursive Menu." +msgstr "Greska! Ne mozete kreirati rekursivni meni." + +#. module: decimal_precision +#: field:decimal.precision,name:0 +msgid "Usage" +msgstr "Koriscenje" + +#. module: decimal_precision +#: model:ir.module.module,shortdesc:decimal_precision.module_meta_information +msgid "Decimal Precision Configuration" +msgstr "Podesavanje Decimalne Preciznosti" + +#. module: decimal_precision +#: model:ir.model,name:decimal_precision.model_decimal_precision +msgid "decimal.precision" +msgstr "decimal.precision" diff --git a/addons/decimal_precision/security/ir.model.access.csv b/addons/decimal_precision/security/ir.model.access.csv index f01ff24e34f..d53a5fef141 100644 --- a/addons/decimal_precision/security/ir.model.access.csv +++ b/addons/decimal_precision/security/ir.model.access.csv @@ -1,2 +1,3 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_decimal_precision","decimal.precision","model_decimal_precision",base.group_system,1,1,1,1 +"access_decimal_precision_config","decimal.precision configuration","model_decimal_precision",base.group_system,1,1,1,1 +"access_decimal_precision_all","decimal.precision","model_decimal_precision",,1,0,0,0 diff --git a/addons/delivery/delivery_data.xml b/addons/delivery/delivery_data.xml index 97e841ead45..ff0c90ad193 100644 --- a/addons/delivery/delivery_data.xml +++ b/addons/delivery/delivery_data.xml @@ -5,5 +5,54 @@ property_delivery_carrier + + + + + The Poste + + + default + + + + + + + Delivery by Poste + service + + + + + + + The Poste + + + + + + + + The Poste - Pricelist + + + + Weight <= 5kg + + + + + + + Weight > 5kg + + >= + + + + + diff --git a/addons/delivery/delivery_demo.xml b/addons/delivery/delivery_demo.xml index 2c05d4567a5..f247c53ed82 100644 --- a/addons/delivery/delivery_demo.xml +++ b/addons/delivery/delivery_demo.xml @@ -1,64 +1,14 @@ - - - - The Poste - http://www.openerp.com - - - Fabien Pinckaers - default - - - - - - - Delivery by Poste - service - - - - - - - The Poste - Express - - - - - - - - The Poste Express - Pricelist - - - Franco, price >= 300 - + Free if price >= 300 + >= price - - Weight <= 250 - - - - - - - Weight > 250 - - >= - - - - - diff --git a/addons/delivery/delivery_view.xml b/addons/delivery/delivery_view.xml index 3d03235d872..b7ec0fed61e 100644 --- a/addons/delivery/delivery_view.xml +++ b/addons/delivery/delivery_view.xml @@ -35,8 +35,9 @@ delivery.carrier form tree,form + Create and manage the delivery method(s) you want your sales to be processed with. Each delivery method can be assigned to a pricelist which computes the price of the delivery according to the products sold or delivered. - + @@ -84,6 +85,7 @@ delivery.grid form tree,form + The delivery pricelist allows you to compute the cost and sales price of the delivery based on the weight of the products and other criteria. You can define several pricelists for one delivery method, for each region such as countries or a zone in a specific country defined by a zip code range. @@ -232,10 +234,13 @@ stock.move - - - - + + + + + + + @@ -245,10 +250,13 @@ stock.move - - - - + + + + + + + diff --git a/addons/delivery/i18n/ru.po b/addons/delivery/i18n/ru.po index dd7cb8d23a2..1049fb707fe 100644 --- a/addons/delivery/i18n/ru.po +++ b/addons/delivery/i18n/ru.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-09-29 09:53+0000\n" -"Last-Translator: Chertykov Denis \n" +"PO-Revision-Date: 2010-10-16 09:49+0000\n" +"Last-Translator: Nikolay Chesnokov \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-30 04:38+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: delivery @@ -37,7 +37,7 @@ msgstr "Продажи и закупки" #. module: delivery #: view:delivery.grid:0 msgid "Destination" -msgstr "Назначение" +msgstr "Место назначения" #. module: delivery #: model:product.template,name:delivery.delivery_product_product_template @@ -68,6 +68,8 @@ msgstr "Недопустимое имя модели в определении #: help:res.partner,property_delivery_carrier:0 msgid "This delivery method will be used when invoicing from packing." msgstr "" +"Этот метод доставки должен использоваться при фактурировании на основании " +"данных упаковки." #. module: delivery #: model:ir.model,name:delivery.model_delivery_grid @@ -77,17 +79,17 @@ msgstr "Расценки на доставку" #. module: delivery #: field:delivery.grid,zip_from:0 msgid "Start Zip" -msgstr "" +msgstr "Почтовый индекс отправителя" #. module: delivery #: selection:delivery.grid.line,price_type:0 msgid "Fixed" -msgstr "" +msgstr "Фиксированный" #. module: delivery #: field:delivery.grid,line_ids:0 msgid "Grid Line" -msgstr "" +msgstr "Разделяемая строка" #. module: delivery #: model:ir.actions.act_window,name:delivery.action_delivery_grid_form @@ -104,7 +106,7 @@ msgstr "Генерировать черновики счетов при полу #. module: delivery #: model:ir.model,name:delivery.model_delivery_grid_line msgid "Delivery line of grid" -msgstr "" +msgstr "Разделяемая строка поставки" #. module: delivery #: model:ir.ui.menu,name:delivery.menu_delivery @@ -114,12 +116,12 @@ msgstr "Доставка" #. module: delivery #: view:delivery.grid.line:0 msgid "Grid Lines" -msgstr "" +msgstr "Разделяемые строки" #. module: delivery #: field:delivery.grid.line,grid_id:0 msgid "Grid" -msgstr "Расценка" +msgstr "Разделение" #. module: delivery #: view:res.partner:0 @@ -135,7 +137,7 @@ msgstr "Активен" #. module: delivery #: view:delivery.grid:0 msgid "Grid definition" -msgstr "" +msgstr "Определение разделения" #. module: delivery #: selection:delivery.grid.line,type:0 @@ -156,12 +158,12 @@ msgstr "Услуга или изделие, соответствующее до #. module: delivery #: view:delivery.grid.line:0 msgid "Condition" -msgstr "" +msgstr "Условие" #. module: delivery #: model:ir.model,name:delivery.model_delivery_carrier msgid "Carrier and delivery grids" -msgstr "" +msgstr "Разделение поставки и перевозчика" #. module: delivery #: field:delivery.grid.line,standard_price:0 @@ -190,6 +192,7 @@ msgstr "Страны" msgid "" "Error: The default UOM and the purchase UOM must be in the same category." msgstr "" +"Ошибка. ЕИМ по умолчанию и закупочная ЕИМ должны иметь одинаковую категорию." #. module: delivery #: view:sale.order:0 @@ -199,18 +202,18 @@ msgstr "Примечания" #. module: delivery #: field:delivery.grid.line,variable_factor:0 msgid "Variable Factor" -msgstr "" +msgstr "Переменный фактор" #. module: delivery #: selection:delivery.grid.line,price_type:0 #: field:delivery.grid.line,type:0 msgid "Variable" -msgstr "" +msgstr "Переменная" #. module: delivery #: field:delivery.grid,name:0 msgid "Grid Name" -msgstr "" +msgstr "Имя разделения" #. module: delivery #: view:delivery.carrier:0 @@ -235,7 +238,7 @@ msgstr "Максимальное значение" #. module: delivery #: wizard_button:delivery.sale.order,init,delivery:0 msgid "Add Delivery Costs" -msgstr "" +msgstr "Добавить стоимость доставки" #. module: delivery #: wizard_field:delivery.sale.order,init,carrier_id:0 @@ -248,7 +251,7 @@ msgstr "Метод доставки" #. module: delivery #: field:sale.order,id:0 msgid "ID" -msgstr "" +msgstr "Идентификатор" #. module: delivery #: field:delivery.grid.line,operator:0 @@ -258,12 +261,12 @@ msgstr "Оператор" #. module: delivery #: model:ir.module.module,shortdesc:delivery.module_meta_information msgid "Carriers and deliveries" -msgstr "" +msgstr "Перевозчики и поставки" #. module: delivery #: field:delivery.carrier,grids_id:0 msgid "Delivery Grids" -msgstr "" +msgstr "Разделение поставки" #. module: delivery #: selection:delivery.grid.line,type:0 @@ -289,28 +292,33 @@ msgid "" "define your own carrier and delivery grids for prices. When creating " "invoices from picking, Open ERP is able to add and compute the shipping line." msgstr "" +"Позволяет добавить методы доставки в заказы на продажу и упаковку. Вы можете " +"определить своего собственного перевозчика и выполнить разделение поставка " +"для определения стоимости. При создании счета-фактуры на основании упаковки, " +"Open ERP имеет возможность добавлять и вычислить строки доставки." #. module: delivery #: field:delivery.grid,zip_to:0 msgid "To Zip" -msgstr "" +msgstr "Почтовый индекс получателя" #. module: delivery #: model:ir.actions.act_window,name:delivery.action_picking_tree4 #: model:ir.ui.menu,name:delivery.menu_action_picking_tree3 msgid "Packing to be invoiced" -msgstr "" +msgstr "Фактурирование по упаковке" #. module: delivery #: help:sale.order,carrier_id:0 msgid "" "Complete this field if you plan to invoice the shipping based on packing." msgstr "" +"Заполните это поле, если вы планируете счет доставки основанный на упаковке." #. module: delivery #: model:ir.actions.wizard,name:delivery.wizard_deliver_line_add msgid "Delivery Costs" -msgstr "" +msgstr "Стоимость поставки" #. module: delivery #: field:delivery.grid.line,list_price:0 diff --git a/addons/delivery/i18n/sr.po b/addons/delivery/i18n/sr.po index 7c60150a88a..86c33eac8ec 100644 --- a/addons/delivery/i18n/sr.po +++ b/addons/delivery/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 17:38+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:04+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: delivery diff --git a/addons/delivery/security/ir.model.access.csv b/addons/delivery/security/ir.model.access.csv index 409fba3becd..52e60995519 100644 --- a/addons/delivery/security/ir.model.access.csv +++ b/addons/delivery/security/ir.model.access.csv @@ -6,6 +6,3 @@ "access_delivery_grid_manager","delivery.grid","model_delivery_grid","base.group_sale_manager",1,1,1,1 "access_delivery_grid_line_manager","delivery.grid.line","model_delivery_grid_line","base.group_sale_manager",1,1,1,1 "access_delivery_carrier_partner_manager","delivery.carrier partner_manager","model_delivery_carrier","base.group_partner_manager",1,0,0,0 -"access_delivery_carrier_stock_system","delivery.carrier stock_system","model_delivery_carrier","base.group_system",1,1,1,1 -"access_delivery_grid_system","delivery.grid.system","model_delivery_grid","base.group_system",1,1,1,1 -"access_delivery_grid_line_system","delivery.grid.line.system","model_delivery_grid_line","base.group_system",1,1,1,1 diff --git a/addons/document/__openerp__.py b/addons/document/__openerp__.py index 16bbcd41c83..5741a7223e0 100644 --- a/addons/document/__openerp__.py +++ b/addons/document/__openerp__.py @@ -22,7 +22,7 @@ { 'name': 'Integrated Document Management System', - 'version': '1.1', + 'version': '2.0', 'category': 'Generic Modules/Others', 'description': """This is a complete document management system: * User Authentication diff --git a/addons/document/content_index.py b/addons/document/content_index.py index e3b37914f8c..df2b12b5456 100644 --- a/addons/document/content_index.py +++ b/addons/document/content_index.py @@ -21,11 +21,11 @@ import logging import os import tempfile +from subprocess import Popen, PIPE class NhException(Exception): pass -from subprocess import Popen, PIPE class indexer(object): """ An indexer knows how to parse the content of some file. diff --git a/addons/document/dict_tools.py b/addons/document/dict_tools.py new file mode 100644 index 00000000000..10d2fdc69f3 --- /dev/null +++ b/addons/document/dict_tools.py @@ -0,0 +1,57 @@ +# -*- encoding: utf-8 -*- +# Copyright P. Christeas 2008-2010 +# Copyright 2010 OpenERP SA. http://www.openerp.com +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +############################################################################### + + +def dict_merge(*dicts): + """ Return a dict with all values of dicts + """ + res = {} + for d in dicts: + res.update(d) + return res + +def dict_merge2(*dicts): + """ Return a dict with all values of dicts. + If some key appears twice and contains iterable objects, the values + are merged (instead of overwritten). + """ + res = {} + for d in dicts: + for k in d.keys(): + if k in res and isinstance(res[k], (list, tuple)): + res[k] = res[k] + d[k] + elif k in res and isinstance(res[k], dict): + res[k].update(d[k]) + else: + res[k] = d[k] + return res + +def dict_filter(srcdic, keys, res=None): + ''' Return a copy of srcdic that has only keys set. + If any of keys are missing from srcdic, the result won't have them, + either. + @param res If given, result will be updated there, instead of a new dict. + ''' + if res is None: + res = {} + for k in keys: + if k in srcdic: + res[k] = srcdic[k] + return res + +#eof diff --git a/addons/document/document.py b/addons/document/document.py index 92a00f3222c..470d67c582b 100644 --- a/addons/document/document.py +++ b/addons/document/document.py @@ -28,6 +28,7 @@ import os import tools from tools.translate import _ import nodes +import logging DMS_ROOT_PATH = tools.config.get('document_path', os.path.join(tools.config['root_path'], 'filestore')) @@ -106,7 +107,7 @@ class document_file(osv.osv): 'parent_id': __get_def_directory } _sql_constraints = [ - ('filename_uniq', 'unique (name,parent_id,res_id,res_model)', 'The file name must be unique !') + # filename_uniq is not possible in pure SQL ] def _check_duplication(self, cr, uid, vals, ids=[], op='create'): name = vals.get('name', False) @@ -259,6 +260,9 @@ class document_file(osv.osv): r = stor.prepare_unlink(cr, uid, storage_id, f) if r: unres.append(r) + else: + logging.getLogger('document').warning("Unlinking attachment #%s %s that has no storage", + f.id, f.name) res = super(document_file, self).unlink(cr, uid, ids, context) stor.do_unlink(cr, uid, unres) return res diff --git a/addons/document/document_data.xml b/addons/document/document_data.xml index f13213034e8..ef829b6e258 100644 --- a/addons/document/document_data.xml +++ b/addons/document/document_data.xml @@ -11,12 +11,12 @@ Database storage db - + Documents - + 0 @@ -24,7 +24,7 @@ My Folder - + 0 @@ -37,7 +37,7 @@ 0 - + @@ -46,7 +46,7 @@ [('category_id','in',[active_id])] - + 0 @@ -62,7 +62,7 @@ Products - + 0 @@ -70,7 +70,7 @@ Sales Order - + 0 @@ -78,7 +78,7 @@ All Sales Order - + 0 @@ -86,7 +86,7 @@ Quotations - + 0 @@ -94,7 +94,7 @@ Projects - + 0 diff --git a/addons/document/document_directory.py b/addons/document/document_directory.py index 47cea1e86bf..9b7ba18b16f 100644 --- a/addons/document/document_directory.py +++ b/addons/document/document_directory.py @@ -125,6 +125,10 @@ class document_directory(osv.osv): def get_full_path(self, cr, uid, dir_id, context=None): """ Return the full path to this directory, in a list, root first """ + if isinstance(dir_id, (tuple, list)): + assert len(dir_id) == 1 + dir_id = dir_id[0] + def _parent(dir_id, path): parent=self.browse(cr, uid, dir_id) if parent.parent_id and not parent.ressource_parent_type_id: @@ -174,6 +178,39 @@ class document_directory(osv.osv): return nodes.get_node_context(cr, uid, context).get_uri(cr, uri) + def get_node_class(self, cr, uid, ids, dbro=None, dynamic=False, context=None): + """Retrieve the class of nodes for this directory + + This function can be overriden by inherited classes ;) + @param dbro The browse object, if caller already has it + """ + if dbro is None: + dbro = self.browse(cr, uid, ids, context=context) + + if dynamic: + assert dbro.type == 'directory' + return nodes.node_res_obj + elif dbro.type == 'directory': + return nodes.node_dir + elif dbro.type == 'ressource': + return nodes.node_res_dir + else: + raise ValueError("dir node for %s type", dbro.type) + + def _prepare_context(self, cr, uid, nctx, context): + """ Fill nctx with properties for this database + @param nctx instance of nodes.node_context, to be filled + @param context ORM context (dict) for us + + Note that this function is called *without* a list of ids, + it should behave the same for the whole database (based on the + ORM instance of document.directory). + + Some databases may override this and attach properties to the + node_context. See WebDAV, CalDAV. + """ + return + def get_dir_permissions(self, cr, uid, ids ): """Check what permission user 'uid' has on directory 'id' """ @@ -215,6 +252,7 @@ class document_directory(osv.osv): name=directory.name if not parent_id: parent_id=directory.parent_id and directory.parent_id.id or False + # TODO fix algo if not ressource_parent_type_id: ressource_parent_type_id=directory.ressource_parent_type_id and directory.ressource_parent_type_id.id or False if not ressource_id: @@ -235,8 +273,11 @@ class document_directory(osv.osv): def create(self, cr, uid, vals, context=None): if not self._check_duplication(cr, uid, vals): raise osv.except_osv(_('ValidateError'), _('Directory name must be unique!')) - if vals.get('name',False) and (vals.get('name').find('/')+1 or vals.get('name').find('@')+1 or vals.get('name').find('$')+1 or vals.get('name').find('#')+1) : - raise osv.except_osv(_('ValidateError'), _('Directory name contains special characters!')) + newname = vals.get('name',False) + if newname: + for illeg in ('/', '@', '$', '#'): + if illeg in newname: + raise osv.except_osv(_('ValidateError'), _('Directory name contains special characters!')) return super(document_directory,self).create(cr, uid, vals, context) # TODO def unlink(... @@ -255,7 +296,7 @@ class document_directory_dctx(osv.osv): _name = 'document.directory.dctx' _description = 'Directory Dynamic Context' _columns = { - 'dir_id': fields.many2one('document.directory', 'Directory', required=True), + 'dir_id': fields.many2one('document.directory', 'Directory', required=True, ondelete="cascade"), 'field': fields.char('Field', size=20, required=True, select=1, help="The name of the field. Note that the prefix \"dctx_\" will be prepended to what is typed here."), 'expr': fields.char('Expression', size=64, required=True, help="A python expression used to evaluate the field.\n" + \ "You can use 'dir_id' for current dir, 'res_id', 'res_model' as a reference to the current record, in dynamic folders"), diff --git a/addons/document/document_view.xml b/addons/document/document_view.xml index 840c8a4c9e1..e5719705ebe 100644 --- a/addons/document/document_view.xml +++ b/addons/document/document_view.xml @@ -277,7 +277,7 @@ - + IR Attachment0 ir.attachment @@ -296,9 +296,9 @@ - + IR Attachment2 ir.attachment search @@ -307,12 +307,14 @@ + ir.attachment ir.attachment diff --git a/addons/document/i18n/sr.po b/addons/document/i18n/sr.po new file mode 100644 index 00000000000..5ee380e0785 --- /dev/null +++ b/addons/document/i18n/sr.po @@ -0,0 +1,653 @@ +# Serbian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-08-28 16:01+0000\n" +"PO-Revision-Date: 2010-10-16 18:19+0000\n" +"Last-Translator: zmmaj \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: document +#: field:document.directory,create_date:0 +msgid "Date Created" +msgstr "Datum kreiranja" + +#. module: document +#: field:document.directory,ressource_id:0 +msgid "Resource ID" +msgstr "Šifra resursa" + +#. module: document +#: field:document.directory.content,include_name:0 +msgid "Include Record Name" +msgstr "Uključi naziv zapisa" + +#. module: document +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" + +#. module: document +#: field:ir.actions.report.xml,model_id:0 +msgid "Model Id" +msgstr "ID modela" + +#. module: document +#: constraint:document.directory:0 +msgid "Error! You can not create recursive Directories." +msgstr "Greška! Ne možete kreirati rekurzivne direktorijume." + +#. module: document +#: model:ir.ui.menu,name:document.menu_document_configuration +msgid "Document Configuration" +msgstr "Podesavanja Dokumenta" + +#. module: document +#: view:ir.attachment:0 +msgid "Preview" +msgstr "Pregled" + +#. module: document +#: field:ir.attachment,store_method:0 +msgid "Storing Method" +msgstr "Metoda cuvanja" + +#. module: document +#: model:ir.actions.act_window,name:document.action_config_auto_directory +msgid "Auto Configure Directory" +msgstr "Auto Podesavanje Direktorijuma" + +#. module: document +#: field:ir.attachment,file_size:0 +msgid "File Size" +msgstr "Veličina Datoteke" + +#. module: document +#: help:document.directory.content,include_name:0 +msgid "" +"Check this field if you want that the name of the file start by the record " +"name." +msgstr "" +"Uključite ovu opciju ako želite da naziv datoteke počinje s nazivom zapisa" + +#. module: document +#: selection:document.directory,type:0 +msgid "Other Resources" +msgstr "Drugi resursi" + +#. module: document +#: field:document.directory,ressource_parent_type_id:0 +msgid "Parent Model" +msgstr "Roditeljski Model" + +#. module: document +#: view:document.configuration.wizard:0 +msgid "Document Management System." +msgstr "Sistem za Upravljanje Dokumentima" + +#. module: document +#: view:ir.attachment:0 +msgid "Attachment" +msgstr "Dodatak" + +#. module: document +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Pogrešno ime modela u definiciji akcije." + +#. module: document +#: selection:document.directory,type:0 +msgid "Static Directory" +msgstr "Statički Direktorijum" + +#. module: document +#: model:ir.model,name:document.model_document_directory_content_type +msgid "Directory Content Type" +msgstr "Tip sadržaja Direktoriuma" + +#. module: document +#: help:document.directory,domain:0 +msgid "" +"Use a domain if you want to apply an automatic filter on visible resources." +msgstr "" +"Koristite domen ako želite postaviti automatski filter nad vidljivim " +"resursima" + +#. module: document +#: help:document.directory,ressource_tree:0 +msgid "" +"Check this if you want to use the same tree structure as the object selected " +"in the system." +msgstr "" +"Odaberite ovu opciju ako želite koristiti istu strukturu stabla kao odabrani " +"objekat sistema." + +#. module: document +#: field:document.directory,type:0 +msgid "Type" +msgstr "Tip" + +#. module: document +#: model:ir.actions.act_window,name:document.action_document_directory_tree +#: model:ir.ui.menu,name:document.menu_document_directories_tree +msgid "Directorie's Structure" +msgstr "Struktura Direktorijuma" + +#. module: document +#: field:document.directory,parent_id:0 +msgid "Parent Item" +msgstr "Roditeljska Stavka" + +#. module: document +#: view:ir.attachment:0 +msgid "File Information" +msgstr "Informacije o Fajlu" + +#. module: document +#: field:document.directory,file_ids:0 +#: view:ir.attachment:0 +msgid "Files" +msgstr "Fajlovi" + +#. module: document +#: field:ir.attachment,store_fname:0 +msgid "Stored Filename" +msgstr "Sacuvano IMe Fajla" + +#. module: document +#: field:document.directory,write_uid:0 +#: field:ir.attachment,write_uid:0 +msgid "Last Modification User" +msgstr "Korisnik poslednje promene" + +#. module: document +#: view:document.configuration.wizard:0 +msgid "Configure" +msgstr "Podesi" + +#. module: document +#: field:document.directory,ressource_tree:0 +msgid "Tree Structure" +msgstr "Struktura Stabla" + +#. module: document +#: field:ir.attachment,title:0 +msgid "Resource Title" +msgstr "Naslov resursa" + +#. module: document +#: model:ir.actions.todo,note:document.config_auto_directory +msgid "" +"This wizard will configure the URL of the server of the document management " +"system." +msgstr "" +"Ovaj ćecarobnjak podesiti URL server sistema za upravljanje dokumentima." + +#. module: document +#: model:ir.model,name:document.model_document_directory_content +msgid "Directory Content" +msgstr "Sadržaj Direktorijuma" + +#. module: document +#: help:document.directory,ressource_parent_type_id:0 +msgid "" +"If you put an object here, this directory template will appear bellow all of " +"these objects. Don't put a parent directory if you select a parent model." +msgstr "" +"Ako ovdje postavite objekt, predložak ove mape će biti prikazan ispod svih " +"takvih objekata. Nemojte postaviti mapu roditelja ako odabirete model " +"roditelja." + +#. module: document +#: model:ir.ui.menu,name:document.menu_document +msgid "Document Management" +msgstr "Upravljanje Dokumentima" + +#. module: document +#: selection:ir.attachment,store_method:0 +msgid "Link" +msgstr "Veza" + +#. module: document +#: view:document.directory:0 +msgid "Directory Type" +msgstr "Tip Direktorijuma" + +#. module: document +#: field:document.directory,group_ids:0 +#: field:ir.attachment,group_ids:0 +msgid "Groups" +msgstr "Grupe" + +#. module: document +#: field:document.directory.content,report_id:0 +msgid "Report" +msgstr "Izveštaj" + +#. module: document +#: help:document.configuration.wizard,host:0 +msgid "" +"Put here the server address or IP. Keep localhost if you don't know what to " +"write." +msgstr "" +"Ovdje upišite adresu servera ili IP adresu. Ostavite localhost ako ne znate " +"šta da napisete." + +#. module: document +#: view:document.configuration.wizard:0 +msgid "" +"This wizard will automatically configure the document management system " +"according to modules installed on your system." +msgstr "" +"Ovaj Carobnjak će automatski postaviti sistem za upravljanje dokumentima " +"ovisno o modulima koji su instalirani na vašem sistemu." + +#. module: document +#: view:ir.attachment:0 +msgid "Data" +msgstr "Podaci" + +#. module: document +#: view:ir.attachment:0 +msgid "Notes" +msgstr "Napomene" + +#. module: document +#: view:ir.attachment:0 +#: field:ir.attachment,index_content:0 +msgid "Indexed Content" +msgstr "Indeksirani sadržaj" + +#. module: document +#: view:document.directory:0 +msgid "Definition" +msgstr "Definicija" + +#. module: document +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: document +#: model:ir.module.module,description:document.module_meta_information +msgid "" +"This is a complete document management system:\n" +" * FTP Interface\n" +" * User Authentication\n" +" * Document Indexation\n" +msgstr "" +"Ovo je kompletni sistem za upravljanje dokumentima:\n" +"* FTP interfejs\n" +"* Autentifikacija korisnika\n" +"* Indeksiranje dokumenata\n" + +#. module: document +#: field:document.directory,name:0 +msgid "Name" +msgstr "Ime" + +#. module: document +#: field:document.directory.content.type,code:0 +msgid "Extension" +msgstr "Ekstenzija" + +#. module: document +#: selection:ir.attachment,store_method:0 +msgid "Database" +msgstr "Baza Podataka" + +#. module: document +#: field:document.directory,content_ids:0 +msgid "Virtual Files" +msgstr "Virtualne datoteke" + +#. module: document +#: view:document.directory:0 +#: model:ir.ui.menu,name:document.menu_document_directories +msgid "Directories" +msgstr "Direktorijumi" + +#. module: document +#: view:document.directory:0 +msgid "Seq." +msgstr "Sekv." + +#. module: document +#: model:ir.module.module,shortdesc:document.module_meta_information +msgid "Integrated Document Management System" +msgstr "Integrisani sistem za upravljanje dokumentima" + +#. module: document +#: field:document.directory.content,directory_id:0 +#: field:ir.attachment,parent_id:0 +msgid "Directory" +msgstr "Direktorijum" + +#. module: document +#: field:document.directory,user_id:0 +#: field:ir.attachment,user_id:0 +msgid "Owner" +msgstr "Vlasnik" + +#. module: document +#: model:ir.model,name:document.model_document_configuration_wizard +msgid "document.configuration.wizard" +msgstr "document.configuration.wizard" + +#. module: document +#: view:ir.attachment:0 +msgid "Attached To" +msgstr "Pridruženo" + +#. module: document +#: selection:ir.attachment,store_method:0 +msgid "Filesystem" +msgstr "Fajl sistem" + +#. module: document +#: field:document.directory,file_type:0 +#: field:document.directory.content.type,name:0 +#: field:ir.attachment,file_type:0 +msgid "Content Type" +msgstr "Tip Sadrzaja" + +#. module: document +#: view:document.directory:0 +#: view:ir.attachment:0 +msgid "Security" +msgstr "Bezbednost" + +#. module: document +#: model:ir.ui.menu,name:document.menu_document_browse +msgid "Browse Files Using FTP" +msgstr "Pregledaj datoteke koristeći FTP" + +#. module: document +#: field:document.directory,ressource_type_id:0 +msgid "Directories Mapped to Objects" +msgstr "Direktorijumi vezani uz objekte" + +#. module: document +#: view:ir.attachment:0 +msgid "History" +msgstr "Istorija" + +#. module: document +#: help:document.directory,ressource_type_id:0 +msgid "" +"Select an object here and Open ERP will create a mapping for each of these " +"objects, using the given domain, when browsing through FTP." +msgstr "" +"Ovdje odaberite objekt i Open ERP će uspostaviti mapiranje za svaki od ovih " +"objekata, koristeći zadani domen, prilikom predleda kroz FTP." + +#. module: document +#: view:ir.attachment:0 +msgid "Others Info" +msgstr "Ostale informacije" + +#. module: document +#: field:document.directory,domain:0 +msgid "Domain" +msgstr "Domen" + +#. module: document +#: field:document.directory,write_date:0 +#: field:ir.attachment,write_date:0 +msgid "Date Modified" +msgstr "Datum Izmene" + +#. module: document +#: field:document.directory.content,suffix:0 +msgid "Suffix" +msgstr "Sufiks" + +#. module: document +#: field:document.configuration.wizard,host:0 +msgid "Server Address" +msgstr "Adresa Servera" + +#. module: document +#: model:ir.actions.url,name:document.action_document_browse +msgid "Browse Files" +msgstr "Pretraži Fajlove" + +#. module: document +#: field:document.directory.content,name:0 +msgid "Content Name" +msgstr "Naziv sadržaja" + +#. module: document +#: model:ir.model,name:document.model_document_directory +#: field:process.node,directory_id:0 +msgid "Document directory" +msgstr "Direktorijum dokumenta" + +#. module: document +#: field:document.directory,create_uid:0 +msgid "Creator" +msgstr "Kreator" + +#. module: document +#: view:document.directory:0 +msgid "Auto-Generated Files" +msgstr "Auto-Generisani Fajlovi" + +#. module: document +#: field:document.directory.content,sequence:0 +msgid "Sequence" +msgstr "Sekvenca" + +#. module: document +#: model:ir.ui.menu,name:document.menu_document_files +msgid "Search a File" +msgstr "" + +#. module: document +#: view:document.configuration.wizard:0 +msgid "Auto Configure" +msgstr "Auto Podesavanje" + +#. module: document +#: view:document.configuration.wizard:0 +msgid "Cancel" +msgstr "Откажи" + +#. module: document +#: field:ir.attachment,partner_id:0 +msgid "Partner" +msgstr "Partner" + +#. module: document +#: view:document.directory:0 +msgid "PDF Report" +msgstr "PDF izveštaj" + +#. module: document +#: field:document.directory.content,extension:0 +msgid "Document Type" +msgstr "Tip Dokumenta" + +#. module: document +#: field:document.directory,child_ids:0 +msgid "Children" +msgstr "Podređeni" + +#. module: document +#: view:document.directory:0 +msgid "Contents" +msgstr "Sadržaj" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_files_by_partner +msgid "Files Per Month" +msgstr "Falova za Mesec" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_wall +#: model:ir.ui.menu,name:document.menu_action_view_my_document_report_shame +#: view:report.document.wall:0 +msgid "Wall of Shame" +msgstr "Zid Srama" + +#. module: document +#: model:ir.model,name:document.model_report_files_partner +msgid "Files details by Partners" +msgstr "Detalji Fajlova po Partneru" + +#. module: document +#: model:ir.ui.menu,name:document.menu_action_view_my_document_report_all +msgid "All Months" +msgstr "Svi meseci" + +#. module: document +#: model:ir.ui.menu,name:document.menu_action_view_my_document_report_all_myfile +#: model:ir.ui.menu,name:document.menu_action_view_my_document_report_this_myfile +msgid "My files" +msgstr "Moji Fajlovi" + +#. module: document +#: view:report.document.user:0 +msgid "Files by users" +msgstr "Fajlovi po Korisniku" + +#. module: document +#: view:report.files.partner:0 +msgid "Files per Month" +msgstr "Fajlova za Mesec" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_my_document_tree1 +msgid "My files (All months)" +msgstr "Moji Fajlovi (svi Meseci)" + +#. module: document +#: field:report.document.wall,file_name:0 +msgid "Last Posted File Name" +msgstr "Zadnje postavljeno Ime Fajla" + +#. module: document +#: model:ir.ui.menu,name:document.menu_action_view_my_document_report +msgid "Reporting" +msgstr "Izveštavanje" + +#. module: document +#: model:ir.model,name:document.model_report_document_wall +msgid "Users that did not inserted documents since one month" +msgstr "Korisnici koji jedan celi mjesec nisu unijeli Dokument" + +#. module: document +#: view:report.files.partner:0 +msgid "Files By Partner" +msgstr "Fajlovi po Partneru" + +#. module: document +#: model:ir.ui.menu,name:document.menu_action_view_my_document_report_this +msgid "This Month" +msgstr "Ovog meseca" + +#. module: document +#: field:report.document.user,user:0 field:report.document.wall,user:0 +msgid "User" +msgstr "Korisnik" + +#. module: document +#: model:ir.ui.menu,name:document.menu_action_view_my_document_report_all_userfile +#: model:ir.ui.menu,name:document.menu_action_view_my_document_report_this_userfile +msgid "All Users files" +msgstr "Svi Korisnikovi fajlovi" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_my_document_tree +msgid "My files (This months)" +msgstr "Moji Fajlovi(Ovaj Mesec)" + +#. module: document +#: model:ir.model,name:document.model_report_document_user +msgid "Files details by Users" +msgstr "Detalji fajlova po Korisnicima" + +#. module: document +#: field:report.document.file,nbr:0 field:report.document.user,nbr:0 +#: field:report.files.partner,nbr:0 +msgid "# of Files" +msgstr "# Fajlova" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_user_graph +msgid "Files By Users" +msgstr "Fajlovi po Korisnicima" + +#. module: document +#: model:ir.module.module,shortdesc:report_document.module_meta_information +msgid "Document Management - Reporting" +msgstr "Upravljanje Dokumentima - Izveštavanje" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_all_document_tree1 +msgid "All Users files (All months)" +msgstr "Fajlovi svih Korisnika (Svi meseci)" + +#. module: document +#: model:ir.model,name:document.model_report_document_file +msgid "Files details by Directory" +msgstr "Detalji Fajlova po Direktorijumu" + +#. module: document +#: field:report.document.user,change_date:0 +#: field:report.files.partner,change_date:0 +msgid "Modified Date" +msgstr "Izmjenjen Datum" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_size_month +#: view:report.document.file:0 +msgid "File Size by Month" +msgstr "Veličina fajlova po Mesecu" + +#. module: document +#: field:report.document.user,file_title:0 +#: field:report.files.partner,file_title:0 +msgid "File Name" +msgstr "Ime fajla" + +#. module: document +#: field:report.document.file,month:0 field:report.document.user,month:0 +#: field:report.document.user,name:0 field:report.document.wall,month:0 +#: field:report.document.wall,name:0 field:report.files.partner,name:0 +msgid "Month" +msgstr "Mesec" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_files_by_month_graph +#: view:report.document.user:0 +msgid "Files by Month" +msgstr "Fajlovi po Mesecu" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_document_by_resourcetype_graph +#: view:report.document.user:0 +msgid "Files by Resource Type" +msgstr "Fajlovi po Tipu Izvora" + +#. module: document +#: model:ir.actions.act_window,name:document.action_view_all_document_tree +msgid "All Users files (This month)" +msgstr "Svi Korisnicki Fajlovi ( Ovaj Mesec)" + +#. module: document +#: field:report.document.wall,last:0 +msgid "Last Posted Time" +msgstr "Zadnje postavljeno Vrijeme" diff --git a/addons/document/nodes.py b/addons/document/nodes.py index b849396498d..68220885dff 100644 --- a/addons/document/nodes.py +++ b/addons/document/nodes.py @@ -61,16 +61,27 @@ def get_node_context(cr, uid, context): return node_context(cr, uid, context) class node_context(object): - """ This is the root node, representing access to some particular - context """ + """ This is the root node, representing access to some particular context + + A context is a set of persistent data, which may influence the structure + of the nodes. All other transient information during a data query should + be passed down with function arguments. + """ cached_roots = {} + node_file_class = None def __init__(self, cr, uid, context=None): self.dbname = cr.dbname self.uid = uid self.context = context + if context is None: + context = {} + context['uid'] = uid self._dirobj = pooler.get_pool(cr.dbname).get('document.directory') + self.node_file_class = node_file + self.extra_ctx = {} # Extra keys for context, that do _not_ trigger inequality assert self._dirobj + self._dirobj._prepare_context(cr, uid, self, context=context) self.rootdir = False #self._dirobj._get_root_directory(cr,uid,context) def __eq__(self, other): @@ -88,10 +99,14 @@ class node_context(object): def __ne__(self, other): return not self.__eq__(other) + + def get(self, name, default=None): + return self.context.get(name, default) def get_uri(self, cr, uri): """ Although this fn passes back to doc.dir, it is needed since - it is a potential caching point """ + it is a potential caching point. + """ (ndir, duri) = self._dirobj._locate_child(cr, self.uid, self.rootdir, uri, None, self) while duri: ndir = ndir.child(cr, duri[0]) @@ -104,14 +119,10 @@ class node_context(object): """Create (or locate) a node for a directory @param dbro a browse object of document.directory """ - fullpath = self._dirobj.get_full_path(cr, self.uid, dbro.id, self.context) - if dbro.type == 'directory': - return node_dir(fullpath, None ,self, dbro) - elif dbro.type == 'ressource': - assert dbro.ressource_parent_type_id == False - return node_res_dir(fullpath, None, self, dbro) - else: - raise ValueError("dir node for %s type", dbro.type) + + fullpath = dbro.get_full_path(context=self.context) + klass = dbro.get_node_class(dbro, context=self.context) + return klass(fullpath, None ,self, dbro) def get_file_node(self, cr, fbro): """ Create or locate a node for a static file @@ -121,7 +132,7 @@ class node_context(object): if fbro.parent_id: parent = self.get_dir_node(cr, fbro.parent_id) - return node_file(fbro.name, parent, self, fbro) + return self.node_file_class(fbro.name, parent, self, fbro) class node_descriptor(object): @@ -266,22 +277,24 @@ class node_class(object): """ Get a tag, unique per object + modification. see. http://tools.ietf.org/html/rfc2616#section-13.3.3 """ - return self._get_ttag(cr) + ':' + self._get_wtag(cr) + return '"%s-%s"' % (self._get_ttag(cr), self._get_wtag(cr)) def _get_wtag(self, cr): """ Return the modification time as a unique, compact string """ - return str(_str2time(self.write_date)) + return str(_str2time(self.write_date)).replace('.','') - def _get_ttag(self,cr): + def _get_ttag(self, cr): """ Get a unique tag for this type/id of object. Must be overriden, so that each node is uniquely identified. """ print "node_class.get_ttag()",self - raise NotImplementedError("get_etag stub()") + raise NotImplementedError("get_ttag stub()") def get_dav_props(self, cr): """ If this class has special behaviour for GroupDAV etc, export its capabilities """ + # This fn is placed here rather than WebDAV, because we want the + # baseclass methods to apply to all node subclasses return self.DAV_PROPS or {} def match_dav_eprop(self, cr, match, ns, prop): @@ -438,22 +451,20 @@ class node_database(node_class): if not domain: domain = [] - where2 = where + domain + [('type', '=', 'directory')] + where2 = where + domain + ['|', ('type', '=', 'directory'), \ + '&', ('type', '=', 'ressource'), ('ressource_parent_type_id','=',False)] ids = dirobj.search(cr, uid, where2, context=ctx) res = [] for dirr in dirobj.browse(cr, uid, ids, context=ctx): - res.append(node_dir(dirr.name, self, self.context,dirr)) - - where2 = where + domain + [('type', '=', 'ressource'), ('ressource_parent_type_id','=',False)] - ids = dirobj.search(cr, uid, where2, context=ctx) - for dirr in dirobj.browse(cr, uid, ids, context=ctx): - res.append(node_res_dir(dirr.name, self, self.context, dirr)) + klass = dirr.get_node_class(dirr, context=ctx) + res.append(klass(dirr.name, self, self.context,dirr)) fil_obj = dirobj.pool.get('ir.attachment') ids = fil_obj.search(cr, uid, where, context=ctx) if ids: for fil in fil_obj.browse(cr, uid, ids, context=ctx): - res.append(node_file(fil.name, self, self.context, fil)) + klass = self.context.node_file_class + res.append(klass(fil.name, self, self.context, fil)) return res def _file_get(self,cr, nodename=False): @@ -463,9 +474,6 @@ class node_database(node_class): def _get_ttag(self,cr): return 'db-%s' % cr.dbname - def get_dav_resourcetype(self, cr): - return ('collection', 'DAV:') - def mkdosname(company_name, default='noname'): """ convert a string to a dos-like name""" if not company_name: @@ -492,7 +500,10 @@ class node_dir(node_database): self.write_date = dirr and (dirr.write_date or dirr.create_date) or False self.content_length = 0 self.unixperms = 040750 - self.uuser = (dirr.user_id and dirr.user_id.login) or 'nobody' + try: + self.uuser = (dirr.user_id and dirr.user_id.login) or 'nobody' + except Exception: + self.uuser = 'nobody' self.ugroup = mkdosname(dirr.company_id and dirr.company_id.name, default='nogroup') self.uidperms = dirr.get_dir_permissions() if dctx: @@ -505,7 +516,7 @@ class node_dir(node_database): for dfld in dirr.dctx_ids: try: self.dctx['dctx_' + dfld.field] = safe_eval(dfld.expr,dc2) - except Exception,e: + except Exception: print "Cannot eval %s" % dfld.expr print e pass @@ -670,12 +681,14 @@ class node_dir(node_database): return ret class node_res_dir(node_class): - """ A special sibling to node_dir, which does only contain dynamically + """ A folder containing dynamic folders + A special sibling to node_dir, which does only contain dynamically created folders foreach resource in the foreign model. All folders should be of type node_res_obj and merely behave like node_dirs (with limited domain). """ our_type = 'collection' + res_obj_class = None def __init__(self, path, parent, context, dirr, dctx=None ): super(node_res_dir,self).__init__(path, parent, context) self.dir_id = dirr.id @@ -687,7 +700,10 @@ class node_res_dir(node_class): self.write_date = dirr.write_date or dirr.create_date self.content_length = 0 self.unixperms = 040750 - self.uuser = (dirr.user_id and dirr.user_id.login) or 'nobody' + try: + self.uuser = (dirr.user_id and dirr.user_id.login) or 'nobody' + except Exception: + self.uuser = 'nobody' self.ugroup = mkdosname(dirr.company_id and dirr.company_id.name, default='nogroup') self.uidperms = dirr.get_dir_permissions() self.res_model = dirr.ressource_type_id and dirr.ressource_type_id.model or False @@ -782,17 +798,15 @@ class node_res_dir(node_class): continue # Yes! we can't do better but skip nameless records. - res.append(node_res_obj(name, self.dir_id, self, self.context, self.res_model, bo)) + res.append(self.res_obj_class(name, self.dir_id, self, self.context, self.res_model, bo)) return res def _get_ttag(self,cr): return 'rdir-%d' % self.dir_id - def get_dav_resourcetype(self, cr): - return ('collection', 'DAV:') - class node_res_obj(node_class): - """ A special sibling to node_dir, which does only contain dynamically + """ A dynamically created folder. + A special sibling to node_dir, which does only contain dynamically created folders foreach resource in the foreign model. All folders should be of type node_res_obj and merely behave like node_dirs (with limited domain). @@ -828,7 +842,7 @@ class node_res_obj(node_class): for fld,expr in self.dctx_dict.items(): try: self.dctx[fld] = safe_eval(expr, dc2) - except Exception,e: + except Exception: print "Cannot eval %s for %s" % (expr, fld) print e pass @@ -886,7 +900,8 @@ class node_res_obj(node_class): return res - def get_dav_props(self, cr): + def get_dav_props_DEPR(self, cr): + # Deprecated! (but document_ics must be cleaned, first) res = {} cntobj = self.context._dirobj.pool.get('document.directory.content') uid = self.context.uid @@ -899,7 +914,8 @@ class node_res_obj(node_class): res['http://groupdav.org/'] = ('resourcetype',) return res - def get_dav_eprop(self, cr, ns, prop): + def get_dav_eprop_DEPR(self, cr, ns, prop): + # Deprecated! if ns != 'http://groupdav.org/' or prop != 'resourcetype': logger.warning("Who asked for %s:%s?" % (ns, prop)) return None @@ -910,6 +926,7 @@ class node_res_obj(node_class): where = [('directory_id','=',self.dir_id) ] ids = cntobj.search(cr,uid,where,context=ctx) for content in cntobj.browse(cr, uid, ids, context=ctx): + # TODO: remove relic of GroupDAV if content.extension == '.ics': # FIXME: call the content class! return ('vevent-collection','http://groupdav.org/') return None @@ -944,20 +961,21 @@ class node_res_obj(node_class): res_name = getattr(bo, namefield) if not res_name: continue - res.append(node_res_obj(res_name, self.dir_id, self, self.context, self.res_model, res_bo = bo)) + # TODO Revise + klass = directory.get_node_class(directory, dynamic=True, context=ctx) + res.append(klass(res_name, self.dir_id, self, self.context, self.res_model, res_bo = bo)) where2 = where + [('parent_id','=',self.dir_id) ] ids = dirobj.search(cr, uid, where2, context=ctx) for dirr in dirobj.browse(cr, uid, ids, context=ctx): if dirr.type == 'directory': - res.append(node_res_obj(dirr.name, dirr.id, self, self.context, self.res_model, res_bo = None, res_id = self.res_id)) + klass = dirr.get_node_class(dirr, dynamic=True, context=ctx) + res.append(klass(dirr.name, dirr.id, self, self.context, self.res_model, res_bo = None, res_id = self.res_id)) elif dirr.type == 'ressource': # child resources can be controlled by properly set dctx - res.append(node_res_dir(dirr.name,self,self.context, dirr, {'active_id': self.res_id})) - - - + klass = dirr.get_node_class(dirr, context=ctx) + res.append(klass(dirr.name,self,self.context, dirr, {'active_id': self.res_id})) fil_obj = dirobj.pool.get('ir.attachment') if self.res_find_all: @@ -967,7 +985,8 @@ class node_res_obj(node_class): ids = fil_obj.search(cr, uid, where3, context=ctx) if ids: for fil in fil_obj.browse(cr, uid, ids, context=ctx): - res.append(node_file(fil.name, self, self.context, fil)) + klass = self.context.node_file_class + res.append(klass(fil.name, self, self.context, fil)) # Get Child Ressource Directories @@ -979,9 +998,11 @@ class node_res_obj(node_class): dirids = dirids + dirobj.search(cr,uid, where5) for dirr in dirobj.browse(cr, uid, dirids, context=ctx): if dirr.type == 'directory' and not dirr.parent_id: - res.append(node_res_obj(dirr.name, dirr.id, self, self.context, self.res_model, res_bo = None, res_id = self.res_id)) + klass = dirr.get_node_class(dirr, dynamic=True, context=ctx) + res.append(klass(dirr.name, dirr.id, self, self.context, self.res_model, res_bo = None, res_id = self.res_id)) if dirr.type == 'ressource': - res.append(node_res_dir(dirr.name, self, self.context, dirr, {'active_id': self.res_id})) + klass = dirr.get_node_class(dirr, context=ctx) + res.append(klass(dirr.name, self, self.context, dirr, {'active_id': self.res_id})) return res def create_child_collection(self, cr, objname): @@ -993,9 +1014,9 @@ class node_res_obj(node_class): uid = self.context.uid ctx = self.context.context.copy() ctx.update(self.dctx) - res_obj = dirobj.pool.get(self.context.context['res_model']) + res_obj = dirobj.pool.get(self.res_model) - object2 = res_obj.browse(cr, uid, self.context.context['res_id']) or False + object2 = res_obj.browse(cr, uid, self.res_id) or False obj = dirobj.browse(cr, uid, self.dir_id) if obj and (obj.type == 'ressource') and not object2: @@ -1038,7 +1059,8 @@ class node_res_obj(node_class): fil_id = fil_obj.create(cr, uid, val, context=ctx) fil = fil_obj.browse(cr, uid, fil_id, context=ctx) - fnode = node_file(path, self, self.context, fil) + klass = self.context.node_file_class + fnode = klass(path, self, self.context, fil) if data is not None: fnode.set_data(cr, data, fil) return fnode @@ -1046,8 +1068,7 @@ class node_res_obj(node_class): def _get_ttag(self,cr): return 'rodir-%d-%d' % (self.dir_id, self.res_id) - def get_dav_resourcetype(self, cr): - return ('collection', 'DAV:') +node_res_dir.res_obj_class = node_res_obj class node_file(node_class): our_type = 'file' @@ -1069,7 +1090,10 @@ class node_file(node_class): elif not parent.check_perms('w'): self.uidperms = 4 - self.uuser = (fil.user_id and fil.user_id.login) or 'nobody' + try: + self.uuser = (fil.user_id and fil.user_id.login) or 'nobody' + except Exception: + self.uuser = 'nobody' self.ugroup = mkdosname(fil.company_id and fil.company_id.name, default='nogroup') # This only propagates the problem to get_data. Better @@ -1183,9 +1207,6 @@ class node_file(node_class): def _get_ttag(self,cr): return 'file-%d' % self.file_id - def get_dav_resourcetype(self, cr): - return '' - def move_to(self, cr, ndir_node, new_name=False, fil_obj=None, ndir_obj=None, in_write=False): if ndir_node and ndir_node.context != self.context: raise NotImplementedError("Cannot move files between contexts") @@ -1382,3 +1403,5 @@ class nodefd_content(StringIO, node_descriptor): finally: cr.close() StringIO.close(self) + +#eof \ No newline at end of file diff --git a/addons/document/test/document_test2.yml b/addons/document/test/document_test2.yml index 34e834a5306..65312eaf10d 100644 --- a/addons/document/test/document_test2.yml +++ b/addons/document/test/document_test2.yml @@ -12,7 +12,7 @@ I create a "Testing" folder where all the test data will go. - !record {model: document.directory, id: dir_tests }: - name: 'Testing' + name: 'Testing (will be deleted!)' parent_id: dir_root - I create an attachment into the root folder (w. empty fields, test that @@ -52,7 +52,7 @@ I search the testing folder for attachments. - !python {model: ir.attachment}: | - ids = self.search(cr, uid, [('parent_id.name','=', 'Testing'), ('name','=','Test renamed 2')]) + ids = self.search(cr, uid, [('parent_id.name','=', 'Testing (will be deleted!)'), ('name','=','Test renamed 2')]) assert ids == [ ref("file_test2") ], ids - I create an attachment to a 3rd resource, eg. a res.country @@ -70,7 +70,14 @@ ids = self.search(cr, uid, [('res_model', '=', 'res.country'), ('res_id', '=', ref("base.za"))]) assert ids == [ ref("attach_3rd")], ids - - I delete the attachment + I delete the attachments - !python {model: ir.attachment}: | + self.unlink(cr, uid, [ref('file_test2')]) self.unlink(cr, uid, [ref('attach_3rd')]) +- + I delete the tests folder +- + !python {model: document.directory}: | + self.unlink(cr, uid, [ref('dir_tests')]) + cr.commit() diff --git a/addons/document_email/__openerp__.py b/addons/document_email/__openerp__.py index 0348665ffa0..6f61ba62858 100644 --- a/addons/document_email/__openerp__.py +++ b/addons/document_email/__openerp__.py @@ -25,7 +25,6 @@ "name" : "Email Integrated Document", "version" : "1.1", "depends" : ["base", "document", "fetchmail","mail_gateway"], - "author" : "Tiny", "description": """Email Integrated Document * Email based Document submission * user based document submission diff --git a/addons/document_ftp/ftpserver/abstracted_fs.py b/addons/document_ftp/ftpserver/abstracted_fs.py index f69a0bbbaad..9c16e7dde55 100644 --- a/addons/document_ftp/ftpserver/abstracted_fs.py +++ b/addons/document_ftp/ftpserver/abstracted_fs.py @@ -363,7 +363,6 @@ class abstracted_fs(object): """Remove the specified directory.""" cr, node, rem = datacr assert node - cr = self.get_node_cr(node) node.rmcol(cr) cr.commit() diff --git a/addons/document_ftp/test/document_ftp_test2.yml b/addons/document_ftp/test/document_ftp_test2.yml index 53d5a2b78bf..da55c353767 100644 --- a/addons/document_ftp/test/document_ftp_test2.yml +++ b/addons/document_ftp/test/document_ftp_test2.yml @@ -200,6 +200,11 @@ # TODO move - I remove the 'Test-Folder3' +- + !python {model: ir.attachment}: | + from document_ftp import test_easyftp as te + ftp = te.get_ftp_folder(cr, uid, self, 'Documents') + ftp.rmd("Test-Folder3") - I check that test3.txt is removed. - @@ -228,3 +233,22 @@ - I move the 200 files to 'Test-Folder2' # TODO + +- + I delete the 200 files +- + !python {model: ir.attachment}: | + from document_ftp import test_easyftp as te + from cStringIO import StringIO + ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Test-Folder2') + # TODO speed + ftp.delete('test3.txt') + for i in range(0, 200): + ftp.delete('test-name%s.txt' %i) +- + I remove the 'Test-Folder2' +- + !python {model: ir.attachment}: | + from document_ftp import test_easyftp as te + ftp = te.get_ftp_folder(cr, uid, self, 'Documents') + ftp.rmd("Test-Folder2") diff --git a/addons/document_ftp/test/document_ftp_test3.yml b/addons/document_ftp/test/document_ftp_test3.yml index dbdab370b97..a51f259f44e 100644 --- a/addons/document_ftp/test/document_ftp_test3.yml +++ b/addons/document_ftp/test/document_ftp_test3.yml @@ -5,10 +5,10 @@ from document_ftp import test_easyftp as te ftp = te.get_plain_ftp(timeout=1.0) - - I create a folder called '������������ ��������' in the server. + I create in the server a folder called 'Äïêéìáóôéêüò ÖÜêåëëïò' - !record {model: document.directory, id: dir_itests }: - name: '������������ ��������' + name: 'Äïêéìáóôéêüò ÖÜêåëëïò' parent_id: document.dir_root - And then I create another folder, under it, through FTP @@ -16,67 +16,77 @@ !python {model: ir.attachment}: | cr.commit() from document_ftp import test_easyftp as te - ftp = te.get_ftp_folder(cr, uid, self, 'Documents/������������ ��������') - ftp.mkd("�������� ��� ����") + ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Äïêéìáóôéêüò ÖÜêåëëïò') + ftp.mkd("ÖÜêåëëïò áðü êÜôù") - I check that this folder exists at the server - - !assert {model: document.directory, id: , search: "[('name','=','�������� ��� ����')]" }: + !assert {model: document.directory, id: , search: "[('name','=','ÖÜêåëëïò áðü êÜôù')]" }: - parent_id != False - - I login with FTP and check that '������������ ��������' is there + I login with FTP and check that 'Äïêéìáóôéêüò ÖÜêåëëïò' is there - !python {model: ir.attachment}: | from document_ftp import test_easyftp as te - ftp = te.get_ftp_folder(cr, uid, self, 'Documents/������������ ��������/�������� ��� ����') + ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Äïêéìáóôéêüò ÖÜêåëëïò/ÖÜêåëëïò áðü êÜôù') - - I create a file named '������' into that folder + I create a file named 'ÄïêéìÞ' into that folder - !python {model: ir.attachment}: | from document_ftp import test_easyftp as te from cStringIO import StringIO - ftp = te.get_ftp_folder(cr, uid, self, 'Documents/������������ ��������/�������� ��� ����') - fdata = StringIO('������� �� utf-8') - ftp.storbinary('STOR ������.txt', fdata) + ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Äïêéìáóôéêüò ÖÜêåëëïò/ÖÜêåëëïò áðü êÜôù') + fdata = StringIO('êåßìåíï ìå utf-8') + ftp.storbinary('STOR ÄïêéìÞ.txt', fdata) - - I remove the '������.txt' file + I remove the 'ÄïêéìÞ.txt' file - !python {model: ir.attachment}: | from document_ftp import test_easyftp as te from cStringIO import StringIO - ftp = te.get_ftp_folder(cr, uid, self, 'Documents/������������ ��������/�������� ��� ����') - ftp.delete('������.txt') + ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Äïêéìáóôéêüò ÖÜêåëëïò/ÖÜêåëëïò áðü êÜôù') + ftp.delete('ÄïêéìÞ.txt') - - I rename '�������� ��� ����' into '�����' + I rename 'ÖÜêåëëïò áðü êÜôù' into 'Üëëïò' - !python {model: ir.attachment}: | from document_ftp import test_easyftp as te - ftp = te.get_ftp_folder(cr, uid, self, 'Documents/������������ ��������') - ftp.rename("�������� ��� ����", "�����") + ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Äïêéìáóôéêüò ÖÜêåëëïò') + ftp.rename("ÖÜêåëëïò áðü êÜôù", "Üëëïò") - - I place a file 'file �3' in '�����' + I place a file 'file Ö3' in 'Üëëïò' - !python {model: ir.attachment}: | from document_ftp import test_easyftp as te from cStringIO import StringIO - ftp = te.get_ftp_folder(cr, uid, self, 'Documents/������������ ��������/�����') - fdata = StringIO('�� ���� �������') - ftp.storbinary('STOR file �3.txt', fdata) + ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Äïêéìáóôéêüò ÖÜêåëëïò/Üëëïò') + fdata = StringIO('êé Üëëï êåßìåíï') + ftp.storbinary('STOR file Ö3.txt', fdata) - I rename the file into file+range(1..200) (large filename) - !python {model: ir.attachment}: | from document_ftp import test_easyftp as te from cStringIO import StringIO - ftp = te.get_ftp_folder(cr, uid, self, 'Documents/������������ ��������/�����') + ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Äïêéìáóôéêüò ÖÜêåëëïò/Üëëïò') vuvuzela = 'b'+''.join('z' * 200)+'!' - ftp.rename("file �3.txt", vuvuzela) + ftp.rename("file Ö3.txt", vuvuzela) - I delete the file with the large name - !python {model: ir.attachment}: | from document_ftp import test_easyftp as te from cStringIO import StringIO - ftp = te.get_ftp_folder(cr, uid, self, 'Documents/������������ ��������/�����') + ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Äïêéìáóôéêüò ÖÜêåëëïò/Üëëïò') vuvuzela = 'b'+''.join('z' * 200)+'!' ftp.delete(vuvuzela) + +- + I delete the testing folders +- + !python {model: ir.attachment}: | + from document_ftp import test_easyftp as te + from cStringIO import StringIO + ftp = te.get_ftp_folder(cr, uid, self, 'Documents') + ftp.rmd('Äïêéìáóôéêüò ÖÜêåëëïò/Üëëïò') + ftp.rmd('Äïêéìáóôéêüò ÖÜêåëëïò') diff --git a/addons/document_ftp/test/document_ftp_test4.yml b/addons/document_ftp/test/document_ftp_test4.yml index eeed4b17dda..2bb616dc1bd 100644 --- a/addons/document_ftp/test/document_ftp_test4.yml +++ b/addons/document_ftp/test/document_ftp_test4.yml @@ -118,3 +118,10 @@ - | Bonus Piste: I create a 'Partner3' under 'all' +- + I delete the Partners Testing folder +- + !python {model: document.directory}: | + self.unlink(cr, uid, [ref('dir_tests2')]) + self.unlink(cr, uid, [ref('dir_respart1')]) + cr.commit() \ No newline at end of file diff --git a/addons/document_ics/i18n/sr.po b/addons/document_ics/i18n/sr.po new file mode 100644 index 00000000000..1ea7c46633f --- /dev/null +++ b/addons/document_ics/i18n/sr.po @@ -0,0 +1,334 @@ +# Serbian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-08-28 16:01+0000\n" +"PO-Revision-Date: 2010-10-16 18:48+0000\n" +"Last-Translator: zmmaj \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: document_ics +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" + +#. module: document_ics +#: selection:document.directory.ics.fields,name:0 +msgid "uid" +msgstr "uid" + +#. module: document_ics +#: constraint:document.directory:0 +msgid "Error! You can not create recursive Directories." +msgstr "Greška! Ne možete kreirati rekurzivne direktorijume." + +#. module: document_ics +#: field:document.ics.crm.wizard,jobs:0 +msgid "Jobs Hiring Process" +msgstr "Proces zapošljavanja" + +#. module: document_ics +#: view:document.ics.crm.wizard:0 +msgid "Configure Calendars for CRM Sections" +msgstr "Konfigurisi kalendare za CRM Sekcije" + +#. module: document_ics +#: field:document.ics.crm.wizard,helpdesk:0 +msgid "Helpdesk" +msgstr "Helpdesk" + +#. module: document_ics +#: field:document.directory.ics.fields,field_id:0 +msgid "Open ERP Field" +msgstr "Otvori ERP Polje" + +#. module: document_ics +#: view:document.ics.crm.wizard:0 +msgid "Next" +msgstr "Sledeće" + +#. module: document_ics +#: field:document.directory.ics.fields,content_id:0 +msgid "Content" +msgstr "Sadržaj" + +#. module: document_ics +#: field:document.ics.crm.wizard,meeting:0 +msgid "Calendar of Meetings" +msgstr "Kalendar Sastanaka" + +#. module: document_ics +#: model:crm.case.section,name:document_ics.section_meeting +msgid "Shared Calendar Meetings" +msgstr "Sastanci zajedničkog kalendara" + +#. module: document_ics +#: selection:document.directory.ics.fields,name:0 +msgid "url" +msgstr "url" + +#. module: document_ics +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Pogrešno ime modela u definiciji akcije." + +#. module: document_ics +#: help:document.ics.crm.wizard,bugs:0 +msgid "Used by companies to track bugs and support requests on softwares" +msgstr "" +"Korišten od firmi za praćenje grešaka i zahteva za podrškom na programima" + +#. module: document_ics +#: model:ir.actions.todo,note:document_ics.config_wizard_step_case_section_menu +msgid "" +"This Configuration step use to create Calendars in document for all Case " +"Sections" +msgstr "" +"Ovaj konfiguracioni korak se koristi za kreiranje kalendara u dokumentima ze " +"sve tipove Sekcija" + +#. module: document_ics +#: selection:document.directory.ics.fields,name:0 +msgid "dtend" +msgstr "dtend" + +#. module: document_ics +#: help:document.ics.crm.wizard,jobs:0 +msgid "" +"Help you to organise the jobs hiring process: evaluation, meetings, email " +"integration..." +msgstr "" +"Pomaže vam da organizujete proces zapošljavanja: procena, sastanci, " +"integracija elektronske pošte..." + +#. module: document_ics +#: selection:document.directory.ics.fields,name:0 +msgid "description" +msgstr "opis" + +#. module: document_ics +#: model:ir.actions.act_window,name:document_ics.action_view_document_ics_config_directories +msgid "Configure Calendars for Sections " +msgstr "Konfigurise Kalendare za Sekcije " + +#. module: document_ics +#: help:document.ics.crm.wizard,opportunity:0 +msgid "Tracks identified business opportunities for your sales pipeline." +msgstr "Prati prepoznate poslovne prilike za vašu prodajnu mrezu." + +#. module: document_ics +#: help:document.ics.crm.wizard,fund:0 +msgid "" +"This may help associations in their fund raising process and tracking." +msgstr "" +"Ovo može pomoći saradnicima u procesu prikupljanja i praćenja sredstava za " +"finansiranje." + +#. module: document_ics +#: help:document.ics.crm.wizard,helpdesk:0 +msgid "Manages an Helpdesk service." +msgstr "Upravlja uslugom Helpdesk-a." + +#. module: document_ics +#: field:document.ics.crm.wizard,fund:0 +msgid "Fund Raising Operations" +msgstr "Operacije za skupljanje sredstava" + +#. module: document_ics +#: field:document.directory.content,ics_object_id:0 +msgid "Object" +msgstr "Objekat" + +#. module: document_ics +#: constraint:crm.case.section:0 +msgid "Error ! You cannot create recursive sections." +msgstr "Greška ! Ne možete stvarati rekurzivne sekcije." + +#. module: document_ics +#: model:ir.module.module,shortdesc:document_ics.module_meta_information +msgid "Support for iCal based on Document Management System" +msgstr "Podrška za iCal baziranom na sistemu za upravljanje dokumentima." + +#. module: document_ics +#: selection:document.directory.ics.fields,name:0 +msgid "location" +msgstr "polozaj" + +#. module: document_ics +#: view:document.directory:0 +msgid "ICS Calendar" +msgstr "ICS Kalendar" + +#. module: document_ics +#: field:document.directory.ics.fields,name:0 +msgid "ICS Value" +msgstr "ICS Vrednost" + +#. module: document_ics +#: model:ir.module.module,description:document_ics.module_meta_information +msgid "Allows to synchronise calendars with others applications." +msgstr "omogucava vam da sinhronisete kalendar sa ostalim aplikacijama" + +#. module: document_ics +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: document_ics +#: help:document.ics.crm.wizard,lead:0 +msgid "" +"Allows you to track and manage prospects which are pre-sales requests or " +"contacts, the very first contact with a customer request." +msgstr "" +"Omogućava vam da pratite i upravljate prilikama koje uključuju predprodajne " +"zahteve ili kontakte, prvi kontakt s pitanjima korisnika." + +#. module: document_ics +#: field:document.ics.crm.wizard,name:0 +msgid "Name" +msgstr "Ime" + +#. module: document_ics +#: help:document.ics.crm.wizard,meeting:0 +msgid "Manages the calendar of meetings of the users." +msgstr "Upravlja kalendarom sastanaka korisnika" + +#. module: document_ics +#: field:document.directory.content,ics_domain:0 +msgid "Domain" +msgstr "Domen" + +#. module: document_ics +#: help:document.ics.crm.wizard,claims:0 +msgid "" +"Manages the supplier and customers claims, including your corrective or " +"preventive actions." +msgstr "" +"Upravlja pritužbama dobavljača i kupaca, uključujući korektivne ili " +"preventivne akcije." + +#. module: document_ics +#: selection:document.directory.ics.fields,name:0 +msgid "last-modified" +msgstr "poslednja-promjena" + +#. module: document_ics +#: view:document.directory:0 +msgid "ICS Mapping" +msgstr "ICS mapiranje" + +#. module: document_ics +#: view:crm.case:0 +msgid "Duration(In Hour)" +msgstr "Trajanje (u satima)" + +#. module: document_ics +#: field:document.ics.crm.wizard,document_ics:0 +msgid "Shared Calendar" +msgstr "Deljeni Kalendar" + +#. module: document_ics +#: field:document.ics.crm.wizard,claims:0 +msgid "Claims" +msgstr "Pritužbe" + +#. module: document_ics +#: help:document.ics.crm.wizard,phonecall:0 +msgid "" +"Help you to encode the result of a phone call or to planify a list of phone " +"calls to process." +msgstr "" +"Pomaže vam pri unosu rezultata telefonskih poziva ili pri planiranju popisa " +"poziva za obradu." + +#. module: document_ics +#: selection:document.directory.ics.fields,name:0 +msgid "dtstart" +msgstr "dtstart" + +#. module: document_ics +#: field:document.ics.crm.wizard,phonecall:0 +msgid "Phone Calls" +msgstr "Telefonski Pozivi" + +#. module: document_ics +#: field:document.ics.crm.wizard,bugs:0 +msgid "Bug Tracking" +msgstr "Praćenje Grešaka" + +#. module: document_ics +#: selection:document.directory.ics.fields,name:0 +msgid "categories" +msgstr "kategorije" + +#. module: document_ics +#: field:document.ics.crm.wizard,lead:0 +msgid "Prospect" +msgstr "Prilika" + +#. module: document_ics +#: view:document.ics.crm.wizard:0 +msgid "Create Pre-Configured Calendars" +msgstr "Kreiraj predkonfigurisani Kalendar" + +#. module: document_ics +#: selection:document.directory.ics.fields,name:0 +msgid "created" +msgstr "Kreiran" + +#. module: document_ics +#: field:crm.case,code:0 +msgid "Calendar Code" +msgstr "Šifra kalendara" + +#. module: document_ics +#: selection:document.directory.ics.fields,name:0 +msgid "summary" +msgstr "Sumarno" + +#. module: document_ics +#: model:ir.model,name:document_ics.model_document_ics_crm_wizard +msgid "document.ics.crm.wizard" +msgstr "document.ics.crm.wizard" + +#. module: document_ics +#: selection:document.directory.ics.fields,name:0 +msgid "attendee" +msgstr "prisutan" + +#. module: document_ics +#: model:ir.model,name:document_ics.model_document_directory_ics_fields +msgid "document.directory.ics.fields" +msgstr "document.directory.ics.fields" + +#. module: document_ics +#: field:document.directory.content,ics_field_ids:0 +msgid "Fields Mapping" +msgstr "Mapiranje polja" + +#. module: document_ics +#: view:document.ics.crm.wizard:0 +msgid "Cancel" +msgstr "Otkaži" + +#. module: document_ics +#: field:document.ics.crm.wizard,opportunity:0 +msgid "Business Opportunities" +msgstr "Poslovne Prilike" + +#. module: document_ics +#: selection:document.directory.ics.fields,name:0 +msgid "dtstamp" +msgstr "dtstamp" diff --git a/addons/document_webdav/__init__.py b/addons/document_webdav/__init__.py index 69312668a74..ac417e18087 100644 --- a/addons/document_webdav/__init__.py +++ b/addons/document_webdav/__init__.py @@ -21,3 +21,7 @@ import webdav import webdav_server + +import document_webdav + +#eof \ No newline at end of file diff --git a/addons/document_webdav/__openerp__.py b/addons/document_webdav/__openerp__.py index 39330f68dea..1c2e232e914 100644 --- a/addons/document_webdav/__openerp__.py +++ b/addons/document_webdav/__openerp__.py @@ -29,20 +29,23 @@ ############################################################################## { - "name" : "WebDAV server for Document Management", - "version" : "2.0", - "author" : "OpenERP SA", - "category" : "Generic Modules/Others", - "website": "http://www.openerp.com", - "description": """ With this module, the WebDAV server for the documents is activated. - You can then use any compatible browser to remotely see the attachments of OpenObject. + "name" : "WebDAV server for Document Management", + "version" : "2.2", + "author" : "OpenERP SA", + "category" : "Generic Modules/Others", + "website": "http://www.openerp.com", + "description": """ With this module, the WebDAV server for the documents is activated. + You can then use any compatible browser to remotely see the attachments of OpenObject. - After installation, the webDAV server can be controlled by a [webdav] section in the server's config. + After installation, the webDAV server can be controlled by a [webdav] section in the server's config. """, - "depends" : ["base", "document"], - "init_xml" : [], - "update_xml" : [], - "demo_xml" : [], - "active": False, - "installable": True + "depends" : ["base", "document"], + "init_xml" : [], + "update_xml" : ['security/ir.model.access.csv', + 'webdav_view.xml', + 'webdav_setup.xml', + ], + "demo_xml" : [], + "active": False, + "installable": True } diff --git a/addons/document_webdav/dav_fs.py b/addons/document_webdav/dav_fs.py index f3c8201bafc..3e8e1c2b3e5 100644 --- a/addons/document_webdav/dav_fs.py +++ b/addons/document_webdav/dav_fs.py @@ -26,8 +26,6 @@ import os import time from string import joinfields, split, lower -from service import security - import netsvc import urlparse @@ -37,9 +35,13 @@ from DAV.iface import * import urllib from DAV.davcmd import copyone, copytree, moveone, movetree, delone, deltree -from document.nodes import node_res_dir, node_res_obj from cache import memoize from tools import misc +try: + from tools.dict_tools import dict_merge2 +except ImportError: + from document.dict_tools import dict_merge2 + CACHE_SIZE=20000 #hack for urlparse: add webdav in the net protocols @@ -96,8 +98,7 @@ class openerp_dav_handler(dav_interface): return props node = self.uri2object(cr, uid, pool, uri2) if node: - props = props.copy() - props.update(node.get_dav_props(cr)) + props = dict_merge2(props, node.get_dav_props(cr)) cr.close() return props @@ -134,11 +135,11 @@ class openerp_dav_handler(dav_interface): self.parent.log_message("Exc: %s",traceback.format_exc()) raise default_exc("Operation failed") - def _get_dav_lockdiscovery(self, uri): - raise DAV_NotFound + #def _get_dav_lockdiscovery(self, uri): + # raise DAV_NotFound - def _get_dav_supportedlock(self, uri): - raise DAV_NotFound + #def A_get_dav_supportedlock(self, uri): + # raise DAV_NotFound def match_prop(self, uri, match, ns, propname): if self.M_NS.has_key(ns): @@ -186,6 +187,16 @@ class openerp_dav_handler(dav_interface): cr.close() return ret + def reduce_useragent(self): + ua = self.parent.headers.get('User-Agent', False) + ctx = {} + if ua: + if 'iPhone' in ua: + ctx['DAV-client'] = 'iPhone' + elif 'Konqueror' in ua: + ctx['DAV-client'] = 'GroupDAV' + return ctx + def get_prop(self, uri, ns, propname): """ return the value of a given property @@ -194,17 +205,23 @@ class openerp_dav_handler(dav_interface): pname -- name of the property """ if self.M_NS.has_key(ns): - return dav_interface.get_prop(self, uri, ns, propname) + try: + # if it's not in the interface class, a "DAV:" property + # may be at the node class. So shouldn't give up early. + return dav_interface.get_prop(self, uri, ns, propname) + except DAV_NotFound: + pass cr, uid, pool, dbname, uri2 = self.get_cr(uri) if not dbname: if cr: cr.close() raise DAV_NotFound - node = self.uri2object(cr, uid, pool, uri2) - if not node: + try: + node = self.uri2object(cr, uid, pool, uri2) + if not node: + raise DAV_NotFound + res = node.get_dav_eprop(cr, ns, propname) + finally: cr.close() - raise DAV_NotFound - res = node.get_dav_eprop(cr, ns, propname) - cr.close() return res def get_db(self, uri, rest_ret=False, allow_last=False): @@ -283,26 +300,55 @@ class openerp_dav_handler(dav_interface): result = [] node = self.uri2object(cr, uid, pool, uri2[:]) - if not node: - if cr: cr.close() - raise DAV_NotFound2(uri2) - else: - fp = node.full_path() - if fp and len(fp): - self.parent.log_message('childs: @%s' % fp) - fp = '/'.join(fp) + try: + if not node: + raise DAV_NotFound2(uri2) else: - fp = None - domain = None - if filters: - domain = node.get_domain(cr, filters) - for d in node.children(cr, domain): - self.parent.log_message('child: %s' % d.path) - if fp: - result.append( self.urijoin(dbname,fp,d.path) ) + fp = node.full_path() + if fp and len(fp): + fp = '/'.join(fp) + self.parent.log_message('childs for: %s' % fp) else: - result.append( self.urijoin(dbname,d.path) ) - if cr: cr.close() + fp = None + domain = None + if filters: + domain = node.get_domain(cr, filters) + + if hasattr(filters, 'getElementsByTagNameNS'): + hrefs = filters.getElementsByTagNameNS('DAV:', 'href') + if hrefs: + ul = self.parent.davpath + self.uri2local(uri) + for hr in hrefs: + turi = '' + for tx in hr.childNodes: + if tx.nodeType == hr.TEXT_NODE: + turi += tx.data + if not turi.startswith('/'): + # it may be an absolute URL, decode to the + # relative part, because ul is relative, anyway + uparts=urlparse.urlparse(turi) + turi=uparts[2] + if turi.startswith(ul): + result.append( turi[len(self.parent.davpath):]) + else: + self.parent.log_error("ignore href %s because it is not under request path %s", turi, ul) + return result + # We don't want to continue with the children found below + # Note the exceptions and that 'finally' will close the + # cursor + for d in node.children(cr, domain): + self.parent.log_message('child: %s' % d.path) + if fp: + result.append( self.urijoin(dbname,fp,d.path) ) + else: + result.append( self.urijoin(dbname,d.path) ) + except DAV_Error: + raise + except Exception, e: + self.parent.log_error("cannot get_childs: "+ str(e)) + raise + finally: + if cr: cr.close() return result def uri2local(self, uri): @@ -338,7 +384,8 @@ class openerp_dav_handler(dav_interface): def uri2object(self, cr, uid, pool, uri): if not uid: return None - return pool.get('document.directory').get_object(cr, uid, uri) + context = self.reduce_useragent() + return pool.get('document.directory').get_object(cr, uid, uri, context=context) def get_data(self,uri, rrange=None): self.parent.log_message('GET: %s' % uri) diff --git a/addons/document_webdav/document_webdav.py b/addons/document_webdav/document_webdav.py new file mode 100644 index 00000000000..28b70c8d7e4 --- /dev/null +++ b/addons/document_webdav/document_webdav.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import osv, fields +import nodes +from tools import config + +class document_davdir(osv.osv): + _inherit = 'document.directory' + + _columns = { + # Placed here just for a reference + 'dav_prop_ids': fields.one2many('document.webdav.dir.property', 'dir_id', 'DAV properties'), + } + + def get_node_class(self, cr, uid, ids, dbro=None, dynamic=False, context=None): + # Note: in this function, nodes come from document_webdav/nodes.py ! + if dbro is None: + dbro = self.browse(cr, uid, ids, context=context) + + if dynamic: + assert dbro.type == 'directory' + return nodes.node_res_obj + elif dbro.type == 'directory': + return nodes.node_dir + elif dbro.type == 'ressource': + return nodes.node_res_dir + else: + raise ValueError("dir node for %s type", dbro.type) + + def _prepare_context(self, cr, uid, nctx, context): + nctx.node_file_class = nodes.node_file + # We can fill some more fields, but avoid any expensive function + # that might be not worth preparing. + nctx.extra_ctx['webdav_path'] = '/'+config.get_misc('webdav','vdir','webdav') + usr_obj = self.pool.get('res.users') + res = usr_obj.read(cr, uid, uid, ['login']) + if res: + nctx.extra_ctx['username'] = res['login'] + # TODO group + return + + def _locate_child(self, cr, uid, root_id, uri,nparent, ncontext): + """ try to locate the node in uri, + Return a tuple (node_dir, remaining_path) + """ + return (nodes.node_database(context=ncontext), uri) + +document_davdir() + +class dav_dir_property(osv.osv): + """ Arbitrary WebDAV properties, attached to document.directories. + + Some DAV properties have to be settable at directories, depending + on the database directory structure. + + Example would be the principal-URL. + + There _can_ be properties without a directory, which means that they + globally apply to all the directories (aka. collections) of the + present database. + """ + _name = 'document.webdav.dir.property' + + _columns = { + 'dir_id': fields.many2one('document.directory', 'Directory', required=False, select=1), + 'namespace': fields.char('Namespace', size=127, required=True), + 'name': fields.char('Name', size=64, required=True), + 'value': fields.text('Value'), + 'do_subst': fields.boolean('Substitute', required=True), + } + + _defaults = { + 'do_subst': False, + } + +dav_dir_property() + +#eof \ No newline at end of file diff --git a/addons/document_webdav/i18n/sr.po b/addons/document_webdav/i18n/sr.po new file mode 100644 index 00000000000..492769892a3 --- /dev/null +++ b/addons/document_webdav/i18n/sr.po @@ -0,0 +1,31 @@ +# Serbian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-05-30 15:14+0000\n" +"PO-Revision-Date: 2010-10-16 08:02+0000\n" +"Last-Translator: zmmaj \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: document_webdav_old +#: model:ir.module.module,description:document_webdav_old.module_meta_information +msgid "" +"This is a complete document management system:\n" +"\t* WebDav Interface\n" +"\t* User Authentification\n" +"\t* Document Indexation\n" +msgstr "" +"Ovo je kompletan sistem Dokument Menadzmenta\n" +"\t* WebDav Interfejs\n" +"\t* Autentifikacija korisnika\n" +"\t* Indeksacija Dokumenata\n" diff --git a/addons/document_webdav/nodes.py b/addons/document_webdav/nodes.py new file mode 100644 index 00000000000..8bea54ab7d3 --- /dev/null +++ b/addons/document_webdav/nodes.py @@ -0,0 +1,219 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from document import nodes +from tools.safe_eval import safe_eval as eval +try: + from tools.dict_tools import dict_filter +except ImportError: + from document.dict_tools import dict_filter + +import urllib + + +class node_acl_mixin(object): + def _get_dav_owner(self, cr): + return self.uuser + + def _get_dav_group(self, cr): + return self.ugroup + + def _get_dav_supported_privilege_set(self, cr): + return '' # TODO + + def _get_dav_current_user_privilege_set(self, cr): + return '' # TODO + + def _get_dav_props_hlpr(self, cr, par_class, prop_model, + prop_ref_field, res_id): + """ Helper for dav properties, usable in subclasses + + @param par_class The parent class + @param prop_model The name of the orm model holding the properties + @param prop_ref_field The name of the field at prop_model pointing to us + @param res_id the id of self in the corresponing orm table, that should + match prop_model.prop_ref_field + """ + ret = par_class.get_dav_props(self, cr) + if prop_model: + propobj = self.context._dirobj.pool.get(prop_model) + uid = self.context.uid + ctx = self.context.context.copy() + ctx.update(self.dctx) + # Not really needed because we don't do eval here: + # ctx.update({'uid': uid, 'dbname': self.context.dbname }) + # dict_filter(self.context.extra_ctx, ['username', 'groupname', 'webdav_path'], ctx) + sdomain = [(prop_ref_field, '=', False),] + if res_id: + sdomain = ['|', (prop_ref_field, '=', res_id)] + sdomain + prop_ids = propobj.search(cr, uid, sdomain, context=ctx) + if prop_ids: + ret = ret.copy() + for pbro in propobj.browse(cr, uid, prop_ids, context=ctx): + ret[pbro.namespace] = ret.get(pbro.namespace, ()) + \ + (pbro.name,) + # Note that we cannot have properties to conditionally appear + # on the context, yet. + + return ret + + def _get_dav_eprop_hlpr(self, cr, ns, prop, + par_class, prop_model, + prop_ref_field, res_id): + """ Helper for get dav eprop, usable in subclasses + + @param namespace the one to search for + @param name Name to search for + @param par_class The parent class + @param prop_model The name of the orm model holding the properties + @param prop_ref_field The name of the field at prop_model pointing to us + @param res_id the id of self in the corresponing orm table, that should + match prop_model.prop_ref_field + """ + ret = par_class.get_dav_eprop(self, cr, ns, prop) + if ret is not None: + return ret + if prop_model: + propobj = self.context._dirobj.pool.get(prop_model) + uid = self.context.uid + ctx = self.context.context.copy() + ctx.update(self.dctx) + ctx.update({'uid': uid, 'dbname': self.context.dbname }) + ctx['node_classname'] = "%s.%s" % (self.__class__.__module__, self.__class__.__name__) + dict_filter(self.context.extra_ctx, ['username', 'groupname', 'webdav_path'], ctx) + sdomain = [(prop_ref_field, '=', False),('namespace', '=', ns), ('name','=', prop)] + if res_id: + sdomain = ['|', (prop_ref_field, '=', res_id)] + sdomain + prop_ids = propobj.search(cr, uid, sdomain, context=ctx) + if prop_ids: + pbro = propobj.browse(cr, uid, prop_ids[0], context=ctx) + val = pbro.value + if pbro.do_subst: + if val.startswith("('") and val.endswith(")"): + glbls = { 'urlquote': urllib.quote, } + val = eval(val, glbls, ctx) + else: + val = val % ctx + return val + return None + +class node_dir(node_acl_mixin, nodes.node_dir): + """ override node_dir and add DAV functionality + """ + DAV_PROPS = { "DAV:": ('owner', 'group', + 'supported-privilege-set', + 'current-user-privilege-set'), + } + DAV_M_NS = { "DAV:" : '_get_dav',} + http_options = { 'DAV': ['access-control',] } + + def get_dav_resourcetype(self, cr): + return ('collection', 'DAV:') + + def get_dav_props(self, cr): + return self._get_dav_props_hlpr(cr, nodes.node_dir, + 'document.webdav.dir.property', 'dir_id', self.dir_id) + + def get_dav_eprop(self, cr, ns, prop): + return self._get_dav_eprop_hlpr(cr, ns, prop, nodes.node_dir, + 'document.webdav.dir.property', 'dir_id', self.dir_id) + + +class node_file(node_acl_mixin, nodes.node_file): + DAV_PROPS = { "DAV:": ('owner', 'group', + 'supported-privilege-set', + 'current-user-privilege-set'), + } + DAV_M_NS = { "DAV:" : '_get_dav',} + http_options = { 'DAV': ['access-control', ] } + pass + + def get_dav_resourcetype(self, cr): + return '' + + def get_dav_props(self, cr): + return self._get_dav_props_hlpr(cr, nodes.node_dir, + None, 'file_id', self.file_id) + #'document.webdav.dir.property', 'dir_id', self.dir_id) + + #def get_dav_eprop(self, cr, ns, prop): + +class node_database(nodes.node_database): + def get_dav_resourcetype(self, cr): + return ('collection', 'DAV:') + + def get_dav_props(self, cr): + return self._get_dav_props_hlpr(cr, nodes.node_dir, + 'document.webdav.dir.property', 'dir_id', False) + + def get_dav_eprop(self, cr, ns, prop): + return self._get_dav_eprop_hlpr(cr, nodes.node_dir, ns, prop, + 'document.webdav.dir.property', 'dir_id', False) + +class node_res_obj(node_acl_mixin, nodes.node_res_obj): + DAV_PROPS = { "DAV:": ('owner', 'group', + 'supported-privilege-set', + 'current-user-privilege-set'), + } + DAV_M_NS = { "DAV:" : '_get_dav',} + http_options = { 'DAV': ['access-control',] } + + def get_dav_resourcetype(self, cr): + return ('collection', 'DAV:') + + def get_dav_props(self, cr): + return self._get_dav_props_hlpr(cr, nodes.node_res_obj, + 'document.webdav.dir.property', 'dir_id', self.dir_id) + + def get_dav_eprop(self, cr, ns, prop): + return self._get_dav_eprop_hlpr(cr, ns, prop, nodes.node_res_obj, + 'document.webdav.dir.property', 'dir_id', self.dir_id) + + +class node_res_dir(node_acl_mixin, nodes.node_res_dir): + DAV_PROPS = { "DAV:": ('owner', 'group', + 'supported-privilege-set', + 'current-user-privilege-set'), + } + DAV_M_NS = { "DAV:" : '_get_dav',} + http_options = { 'DAV': ['access-control',] } + res_obj_class = node_res_obj + + def get_dav_resourcetype(self, cr): + return ('collection', 'DAV:') + + def get_dav_props(self, cr): + return self._get_dav_props_hlpr(cr, nodes.node_res_dir, + 'document.webdav.dir.property', 'dir_id', self.dir_id) + + def get_dav_eprop(self, cr, ns, prop): + return self._get_dav_eprop_hlpr(cr, ns, prop, nodes.node_res_dir, + 'document.webdav.dir.property', 'dir_id', self.dir_id) + +# Some copies, so that this module can replace 'from document import nodes' +get_node_context = nodes.get_node_context +node_context = nodes.node_context +node_class = nodes.node_class +node_descriptor = nodes.node_descriptor + + +#eof diff --git a/addons/document_webdav/security/ir.model.access.csv b/addons/document_webdav/security/ir.model.access.csv new file mode 100644 index 00000000000..a77304eb297 --- /dev/null +++ b/addons/document_webdav/security/ir.model.access.csv @@ -0,0 +1,4 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_webdav_dir_property_all","webdav.dir.property all","model_document_webdav_dir_property",,1,0,0,0 +"access_webdav_dir_property_group_doc_manager","webdav.dir.property document manager","model_document_webdav_dir_property","base.group_system",1,1,1,1 +"access_webdav_dir_property_group_system","webdav.dir.property group system","model_document_webdav_dir_property","base.group_system",1,1,1,1 diff --git a/addons/document_webdav/webdav.py b/addons/document_webdav/webdav.py index 3b6cf582067..bb2b8caf470 100644 --- a/addons/document_webdav/webdav.py +++ b/addons/document_webdav/webdav.py @@ -22,6 +22,8 @@ import xml.dom.minidom domimpl = xml.dom.minidom.getDOMImplementation() +from xml.dom.minicompat import StringTypes + import urlparse import urllib from osv import osv @@ -29,12 +31,28 @@ from osv import osv try: from DAV import utils from DAV.propfind import PROPFIND + from DAV.report import REPORT except ImportError: raise osv.except_osv('PyWebDAV Import Error!','Please install PyWebDAV \ from http://code.google.com/p/pywebdav/downloads/detail?name=PyWebDAV-0.9.4.tar.gz&can=2&q=/') import tools +class Text2(xml.dom.minidom.Text): + def writexml(self, writer, indent="", addindent="", newl=""): + data = "%s%s%s" % (indent, self.data, newl) + data = data.replace("&", "&").replace("<", "<") + data = data.replace(">", ">") + writer.write(data) + +def createText2Node(doc, data): + if not isinstance(data, StringTypes): + raise TypeError, "node contents must be a string" + t = Text2() + t.data = data + t.ownerDocument = doc + return t + super_mk_prop_response = PROPFIND.mk_prop_response def mk_prop_response(self, uri, good_props, bad_props, doc): @@ -48,7 +66,7 @@ def mk_prop_response(self, uri, good_props, bad_props, doc): re=doc.createElement("D:response") # append namespaces to response nsnum=0 - namespaces = self.namespaces + namespaces = self.namespaces[:] if 'DAV:' in namespaces: namespaces.remove('DAV:') for nsname in namespaces: @@ -67,6 +85,8 @@ def mk_prop_response(self, uri, good_props, bad_props, doc): string: text node tuple ('elem', 'ns') for empty sub-node tuple ('elem', 'ns', sub-elems) for sub-node with elements + tuple ('elem', 'ns', sub-elems, {attrs}) for sub-node with + optional elements and attributes list, of above tuples """ if ns == 'DAV:': @@ -108,13 +128,21 @@ def mk_prop_response(self, uri, good_props, bad_props, doc): ve=doc.createElement(ns_prefix+v[0]) if need_ns: ve.setAttribute("xmlns:ns"+str(nsnum), v[1]) - if len(v) > 2 and isinstance(v[2], list): - # support nested elements like: - # ( 'elem', 'ns:', [('sub-elem1', 'ns1'), ...] - _prop_elem_child(ve, v[1], v[2], ns_prefix) + if len(v) > 2 and v[2] is not None: + if isinstance(v[2], (list, tuple)): + # support nested elements like: + # ( 'elem', 'ns:', [('sub-elem1', 'ns1'), ...] + _prop_elem_child(ve, v[1], v[2], ns_prefix) + else: + vt=createText2Node(doc,tools.ustr(v[2])) + ve.appendChild(vt) + if len(v) > 3 and v[3]: + assert isinstance(v[3], dict) + for ak, av in v[3].items(): + ve.setAttribute(ak, av) pnode.appendChild(ve) else: - ve=doc.createTextNode(tools.ustr(v)) + ve=createText2Node(doc, tools.ustr(v)) pnode.appendChild(ve) # write href information @@ -124,7 +152,12 @@ def mk_prop_response(self, uri, good_props, bad_props, doc): fileloc = fileloc.encode('utf-8') href=doc.createElement("D:href") davpath = self._dataclass.parent.get_davpath() - hurl = '%s://%s%s%s' % (uparts[0], uparts[1], davpath, urllib.quote(fileloc)) + if uparts[0] and uparts[1]: + hurl = '%s://%s%s%s' % (uparts[0], uparts[1], davpath, urllib.quote(fileloc)) + else: + # When the request has been relative, we don't have enough data to + # reply with absolute url here. + hurl = '%s%s' % (davpath, urllib.quote(fileloc)) huri=doc.createTextNode(hurl) href.appendChild(huri) re.appendChild(href) @@ -133,6 +166,10 @@ def mk_prop_response(self, uri, good_props, bad_props, doc): ps=doc.createElement("D:propstat") if good_props: re.appendChild(ps) + s=doc.createElement("D:status") + t=doc.createTextNode("HTTP/1.1 200 OK") + s.appendChild(t) + ps.appendChild(s) gp=doc.createElement("D:prop") for ns in good_props.keys(): @@ -141,15 +178,11 @@ def mk_prop_response(self, uri, good_props, bad_props, doc): else: ns_prefix="ns"+str(namespaces.index(ns))+":" for p,v in good_props[ns].items(): - if not v: + if v is None: continue _prop_child(gp, ns, p, v) ps.appendChild(gp) - s=doc.createElement("D:status") - t=doc.createTextNode("HTTP/1.1 200 OK") - s.appendChild(t) - ps.appendChild(s) re.appendChild(ps) # now write the errors! @@ -159,6 +192,10 @@ def mk_prop_response(self, uri, good_props, bad_props, doc): for ecode in bad_props.keys(): ps=doc.createElement("D:propstat") re.appendChild(ps) + s=doc.createElement("D:status") + t=doc.createTextNode(utils.gen_estring(ecode)) + s.appendChild(t) + ps.appendChild(s) bp=doc.createElement("D:prop") ps.appendChild(bp) @@ -172,10 +209,6 @@ def mk_prop_response(self, uri, good_props, bad_props, doc): pe=doc.createElement(ns_prefix+str(p)) bp.appendChild(pe) - s=doc.createElement("D:status") - t=doc.createTextNode(utils.gen_estring(ecode)) - s.appendChild(t) - ps.appendChild(s) re.appendChild(ps) # return the new response element @@ -198,7 +231,12 @@ def mk_propname_response(self,uri,propnames,doc): fileloc = fileloc.encode('utf-8') href=doc.createElement("D:href") davpath = self._dataclass.parent.get_davpath() - hurl = '%s://%s%s%s' % (uparts[0], uparts[1], davpath, urllib.quote(fileloc)) + if uparts[0] and uparts[1]: + hurl = '%s://%s%s%s' % (uparts[0], uparts[1], davpath, urllib.quote(fileloc)) + else: + # When the request has been relative, we don't have enough data to + # reply with absolute url here. + hurl = '%s%s' % (davpath, urllib.quote(fileloc)) huri=doc.createTextNode(hurl) href.appendChild(huri) re.appendChild(href) @@ -230,3 +268,18 @@ def mk_propname_response(self,uri,propnames,doc): PROPFIND.mk_prop_response = mk_prop_response PROPFIND.mk_propname_response = mk_propname_response +super_create_prop = REPORT.create_prop + +def create_prop(self): + try: + if (self.filter is not None) and self._depth == "0": + hrefs = self.filter.getElementsByTagNameNS('DAV:', 'href') + if hrefs: + self._depth = "1" + except Exception: + pass + return super_create_prop(self) + +REPORT.create_prop = create_prop + +#eof diff --git a/addons/document_webdav/webdav_demo.xml b/addons/document_webdav/webdav_demo.xml new file mode 100644 index 00000000000..45cd17ed288 --- /dev/null +++ b/addons/document_webdav/webdav_demo.xml @@ -0,0 +1,22 @@ + + + + + debug: + node_class + %(node_classname)s + + + + + + + diff --git a/addons/document_webdav/webdav_server.py b/addons/document_webdav/webdav_server.py index 44592243480..df2c4a871f6 100644 --- a/addons/document_webdav/webdav_server.py +++ b/addons/document_webdav/webdav_server.py @@ -57,7 +57,7 @@ def OpenDAVConfig(**kw): class DAVHandler(HttpOptions, FixSendError, DAVRequestHandler): verbose = False protocol_version = 'HTTP/1.1' - _HTTP_OPTIONS= { 'DAV' : ['1',], + _HTTP_OPTIONS= { 'DAV' : ['1', '2'], 'Allow' : [ 'GET', 'HEAD', 'COPY', 'MOVE', 'POST', 'PUT', 'PROPFIND', 'PROPPATCH', 'OPTIONS', 'MKCOL', 'DELETE', 'TRACE', 'REPORT', ] @@ -81,7 +81,15 @@ class DAVHandler(HttpOptions, FixSendError, DAVRequestHandler): def setup(self): self.davpath = '/'+config.get_misc('webdav','vdir','webdav') - self.baseuri = "http://%s:%d/"% (self.server.server_name, self.server.server_port) + addr, port = self.server.server_name, self.server.server_port + server_proto = getattr(self.server,'proto', 'http').lower() + try: + if hasattr(self.request, 'getsockname'): + addr, port = self.request.getsockname() + except Exception, e: + self.log_error("Cannot calculate own address: %s" , e) + # Too early here to use self.headers + self.baseuri = "%s://%s:%d/"% (server_proto, addr, port) self.IFACE_CLASS = openerp_dav_handler(self, self.verbose) def copymove(self, CLASS): @@ -156,8 +164,6 @@ class DAVHandler(HttpOptions, FixSendError, DAVRequestHandler): etag = None for match in self.headers['If-Match'].split(','): - if match.startswith('"') and match.endswith('"'): - match = match[1:-1] if match == '*': if dc.exists(uri): test = True @@ -208,8 +214,9 @@ class DAVHandler(HttpOptions, FixSendError, DAVRequestHandler): if self.headers.has_key("Content-Type"): ct=self.headers['Content-Type'] try: - location = dc.put(uri,body,ct) + location = dc.put(uri, body, ct) except DAV_Error, (ec,dd): + self._logger.warning("Cannot PUT to %s: %s", uri, dd, exc_info=True) return self.send_status(ec) headers = {} @@ -264,8 +271,7 @@ try: handler.debug = config.get_misc('webdav','debug',True) _dc = { 'verbose' : verbose, 'directory' : directory, - 'lockemulation' : False, - + 'lockemulation' : True, } conf = OpenDAVConfig(**_dc) diff --git a/addons/document_webdav/webdav_setup.xml b/addons/document_webdav/webdav_setup.xml new file mode 100644 index 00000000000..2bd41ddb69c --- /dev/null +++ b/addons/document_webdav/webdav_setup.xml @@ -0,0 +1,99 @@ + + + + + + + + [] + + + + + + directory + + principals + + + + [] + + + + + + + directory + + groups + + + + [] + + + + + + directory + + resources + + + [] + + + + + + + ressource + + + __uids__ + + + [] + + + + + + + + ressource + + + users + + + [] + + + + + + directory + + locations + + + DAV: + current-user-principal + ('href','DAV:','/%s/%s/principals/users/%s' % ('webdav',dbname, username ) ) + + + + DAV: + principal-URL + ('href','DAV:','/%s/%s/principals/users/%s' % ('webdav',dbname, username ) ) + + + + + diff --git a/addons/document_webdav/webdav_view.xml b/addons/document_webdav/webdav_view.xml new file mode 100644 index 00000000000..2ea0bca5279 --- /dev/null +++ b/addons/document_webdav/webdav_view.xml @@ -0,0 +1,98 @@ + + + + + + document.webdav.dir.property.form + document.webdav.dir.property + form + + + + + + + + + + + + + + + document.webdav.dir.property.tree + document.webdav.dir.property + tree + + + + + + + + + + + Search View: Directory DAV properties + document.webdav.dir.property + search + + + + + + + + + + + + + + + ir.actions.act_window + document.webdav.dir.property + form + tree,form + + + + + + + document.directory.webdav.inherit + document.directory + + form + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/email_template/__openerp__.py b/addons/email_template/__openerp__.py index 6aa4899feb6..d5f5e9776d3 100644 --- a/addons/email_template/__openerp__.py +++ b/addons/email_template/__openerp__.py @@ -23,10 +23,10 @@ { "name" : "Email Template for OpenERP", "version" : "0.7 RC", - "author" : "Sharoon Thomas, Openlabs", + "author" : "Openlabs", "website" : "http://openerp.com", "category" : "Added functionality", - "depends" : ['base'], + "depends" : ['marketing'], "description": """ Email Template is extraction of Power Email basically just to send the emails. """, diff --git a/addons/email_template/email_template_account_view.xml b/addons/email_template/email_template_account_view.xml index 0c30d7d478f..97108cb9e33 100644 --- a/addons/email_template/email_template_account_view.xml +++ b/addons/email_template/email_template_account_view.xml @@ -2,7 +2,8 @@ - + diff --git a/addons/email_template/i18n/sr.po b/addons/email_template/i18n/sr.po new file mode 100644 index 00000000000..9d2d73ceafa --- /dev/null +++ b/addons/email_template/i18n/sr.po @@ -0,0 +1,1293 @@ +# Serbian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2010-08-20 05:34+0000\n" +"PO-Revision-Date: 2010-10-16 09:14+0000\n" +"Last-Translator: OpenERP Administrators \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: email_template +#: view:email_template.send.wizard:0 +msgid "Send mail Wizard" +msgstr "Carobnjak Slanja Emaila" + +#. module: email_template +#: view:email_template.account:0 +msgid "Email Account Configuration" +msgstr "Konfiguracija Email-a" + +#. module: email_template +#: code:addons/email_template/wizard/email_template_send_wizard.py:0 +#, python-format +msgid "Emails for multiple items saved in outbox." +msgstr "Emailovi sa vise stavki sacuvanih u outbox-u" + +#. module: email_template +#: view:email.template:0 +msgid "Email Data" +msgstr "Podaci Email-a" + +#. module: email_template +#: field:email.template,def_to:0 +#: field:email_template.mailbox,email_to:0 +msgid "Recipient (To)" +msgstr "Prima (za)" + +#. module: email_template +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Pogrešno ime modela u definiciji akcije." + +#. module: email_template +#: selection:email_template.send.wizard,state:0 +msgid "Wizard Complete" +msgstr "Carobnjak je Zavrsio" + +#. module: email_template +#: selection:email_template.mailbox,mail_type:0 +msgid "Plain Text & HTML with no attachments" +msgstr "Cisti Tekst & HTML bez attachemnta" + +#. module: email_template +#: code:addons/email_template/email_template_account.py:0 +#, python-format +msgid "" +"Mail from Account %s failed on login. Probable Reason:Could not login to " +"server\n" +"Error: %s" +msgstr "" +"Email naloga %s nije uspeo da se uloguje. MOguci Razlozi: Ne mogu se " +"konektovati ba server\n" +"Greska: %s" + +#. module: email_template +#: field:email_template.preview,body_html:0 +#: field:email_template.preview,body_text:0 +#: field:email_template.send.wizard,body_html:0 +#: field:email_template.send.wizard,body_text:0 +msgid "Body" +msgstr "Sadrzaj" + +#. module: email_template +#: code:addons/email_template/email_template.py:0 +#, python-format +msgid "Deletion of Record failed" +msgstr "Brisanje zapisa nije uspleo" + +#. module: email_template +#: help:email_template.account,company:0 +msgid "" +"Select if this mail account does not belong to specific user but to the " +"organization as a whole. eg: info@companydomain.com" +msgstr "" +"Selektuj ako ovaj nalog ne pripada specificiranom korisniku ali je deo neke " +"organizacije npr:info@companydomain.com" + +#. module: email_template +#: view:email_template.send.wizard:0 +msgid "Send now" +msgstr "Posalji sada" + +#. module: email_template +#: view:email_template.mailbox:0 +#: selection:email_template.mailbox,state:0 +msgid "Not Applicable" +msgstr "Ne moze se dodati" + +#. module: email_template +#: model:ir.ui.menu,name:email_template.menu_email_template_account_all +msgid "Email Accounts" +msgstr "Email Nalozi" + +#. module: email_template +#: view:email_template.send.wizard:0 +msgid "Send all mails" +msgstr "Posalji SVE Emailove" + +#. module: email_template +#: field:email_template.mailbox,server_ref:0 +msgid "Server Reference of mail" +msgstr "Referenca Servera Email-a" + +#. module: email_template +#: view:email_template.account:0 +msgid "My Accounts" +msgstr "Moji Nalozi" + +#. module: email_template +#: view:email_template.mailbox:0 +msgid "Send Mail" +msgstr "Pošalji poštu" + +#. module: email_template +#: selection:email_template.account,state:0 +msgid "Approved" +msgstr "Odobreno" + +#. module: email_template +#: field:email.template,table_html:0 +msgid "HTML code" +msgstr "HTML zapis" + +#. module: email_template +#: help:email.template,file_name:0 +msgid "" +"File name pattern can be specified with placeholders.eg. 2009_SO003.pdf" +msgstr "" +"Ime fajla moze biti napisano i sa razmaknicama( donja crta) npr " +"2009_SO003.pdf" + +#. module: email_template +#: field:email.template,from_account:0 +msgid "Email Account" +msgstr "Email nalog" + +#. module: email_template +#: code:addons/email_template/wizard/email_template_send_wizard.py:0 +#, python-format +msgid "Email sending failed for one or more objects." +msgstr "Slanje Emaila je neuspesno zbog jednog ili vise objekata" + +#. module: email_template +#: help:email.template,lang:0 +msgid "" +"The default language for the email. Placeholders can be used here. eg. " +"${object.partner_id.lang}" +msgstr "" +"Predlozeni jezik Email-a. Razmaknice(donja crta) se mogu ovde koristiti. Npr " +"${object.partner_id.lang}" + +#. module: email_template +#: help:email_template.account,smtpport:0 +msgid "Enter port number,eg:SMTP-587 " +msgstr "Upisi broj Port-a npr SMTP-587 " + +#. module: email_template +#: field:email.template,reply_to:0 +#: field:email_template.mailbox,reply_to:0 +#: field:email_template.preview,reply_to:0 +#: field:email_template.send.wizard,reply_to:0 +msgid "Reply-To" +msgstr "Odgovor - Za" + +#. module: email_template +#: view:email.template:0 +msgid "Delete Action" +msgstr "Obriši radnju" + +#. module: email_template +#: view:email_template.account:0 +msgid "Approve Account" +msgstr "Dozvoli Nalog" + +#. module: email_template +#: model:ir.ui.menu,name:email_template.menu_email_template_all +msgid "E-MAIL Templates" +msgstr "E-MAIL Obrasci" + +#. module: email_template +#: field:email_template.preview,rel_model_ref:0 +#: field:email_template.send.wizard,rel_model_ref:0 +msgid "Referred Document" +msgstr "Referentni Dokumenat" + +#. module: email_template +#: field:email_template.send.wizard,full_success:0 +msgid "Complete Success" +msgstr "Uspesno kompletirano" + +#. module: email_template +#: selection:email_template.account,send_pref:0 +msgid "Both HTML & Text (Mixed)" +msgstr "Oba HTML & Tekst ( Miksovano)" + +#. module: email_template +#: view:email_template.preview:0 +msgid "OK" +msgstr "U redu" + +#. module: email_template +#: selection:email_template.account,send_pref:0 +msgid "Both HTML & Text (Alternative)" +msgstr "Oba HTML & Tekst ( Aternativno)" + +#. module: email_template +#: code:addons/email_template/email_template.py:0 +#, python-format +msgid "Mako templates not installed" +msgstr "Mako Obrazac nije instaliran" + +#. module: email_template +#: field:email_template.send.wizard,requested:0 +msgid "No of requested Mails" +msgstr "Br. trazenih Poruka" + +#. module: email_template +#: view:email_template.mailbox:0 +msgid "Download Full Mail" +msgstr "Download Celu poruku" + +#. module: email_template +#: help:email.template,def_to:0 +msgid "The default recipient of email.Placeholders can be used here." +msgstr "" +"Predlozeni primalac Email-a. Razmaknice se mogu koristiti ( donja crta)" + +#. module: email_template +#: view:email_template.mailbox:0 +msgid "Mailboxes" +msgstr "Postanski Sanducici" + +#. module: email_template +#: field:email.template,attachment_ids:0 +msgid "Attached Files" +msgstr "Prikačeni fajlovi" + +#. module: email_template +#: field:email_template.account,smtpssl:0 +msgid "SSL/TLS (only in python 2.6)" +msgstr "SSL/TLS (samo u python 2.6)" + +#. module: email_template +#: field:email_template.account,email_id:0 +msgid "From Email" +msgstr "Od Email-a" + +#. module: email_template +#: code:addons/email_template/email_template.py:0 +#, python-format +msgid "Warning" +msgstr "Upozorenje" + +#. module: email_template +#: view:email_template.account:0 +#: model:ir.actions.act_window,name:email_template.action_email_template_account_tree_all +msgid "Accounts" +msgstr "Nalozi" + +#. module: email_template +#: field:email.template,track_campaign_item:0 +msgid "Track campaign items" +msgstr "Prati stavke Kampanje" + +#. module: email_template +#: view:email_template.preview:0 +msgid "Body(Text)" +msgstr "Sadrzaj ( text)" + +#. module: email_template +#: view:email_template.send.wizard:0 +msgid "" +"Tip: Multiple emails are sent in the same language (the first one is " +"proposed). We suggest you send emails in groups according to language." +msgstr "" +"TIP: Visestruki emailovi su poslati na istom jeziku( prvi koji je " +"predlozen). Savetujemo vam da saljete E mailove u grupama po odgovarajucim " +"jezicima." + +#. module: email_template +#: help:email.template,reply_to:0 +#: help:email_template.preview,reply_to:0 +#: help:email_template.send.wizard,reply_to:0 +msgid "" +"The address recipients should reply to, if different from the From address. " +"Placeholders can be used here." +msgstr "" + +#. module: email_template +#: field:email_template.mailbox,subject:0 +#: field:email_template.preview,subject:0 +#: field:email_template.send.wizard,subject:0 +msgid "Subject" +msgstr "Tema" + +#. module: email_template +#: code:addons/email_template/email_template_account.py:0 +#, python-format +msgid "Reason: %s" +msgstr "" + +#. module: email_template +#: help:email_template.account,email_id:0 +msgid "eg: yourname@yourdomain.com " +msgstr "npr: yourname@yourdomain.com " + +#. module: email_template +#: field:email_template.mailbox,email_from:0 +msgid "From" +msgstr "Od" + +#. module: email_template +#: field:email_template.preview,ref_template:0 +#: field:email_template.send.wizard,ref_template:0 +msgid "Template" +msgstr "Šablon" + +#. module: email_template +#: field:email.template,def_body_text:0 +#: view:email_template.mailbox:0 +#: field:email_template.mailbox,body_text:0 +msgid "Standard Body (Text)" +msgstr "Standarni Sadrzaj ( text)" + +#. module: email_template +#: view:email_template.mailbox:0 +#: selection:email_template.mailbox,state:0 +msgid "Sending" +msgstr "Слање" + +#. module: email_template +#: view:email.template:0 +msgid "Insert Simple Field" +msgstr "Ubaci Prosto polje" + +#. module: email_template +#: view:email_template.preview:0 +msgid "Body(Html)" +msgstr "Telo ( HTML )" + +#. module: email_template +#: view:email_template.account:0 +msgid "Send/Receive" +msgstr "Slanje/Prijem" + +#. module: email_template +#: model:ir.actions.act_window,name:email_template.wizard_email_template_preview +msgid "Template Preview" +msgstr "Pregled Šablona" + +#. module: email_template +#: field:email.template,def_body_html:0 +msgid "Body (Text-Web Client Only)" +msgstr "Sadrzaj ( Samo TEKST-WEB Klijent)" + +#. module: email_template +#: field:email.template,ref_ir_value:0 +msgid "Wizard Button" +msgstr "Dugme čarobnjaka" + +#. module: email_template +#: code:addons/email_template/email_template_account.py:0 +#, python-format +msgid "Out going connection test failed" +msgstr "Test izlazne konekcije nije uspeo" + +#. module: email_template +#: code:addons/email_template/email_template_account.py:0 +#, python-format +msgid "Mail from Account %s successfully Sent." +msgstr "Mail od naloga %s je uspesno poslat" + +#. module: email_template +#: view:email.template:0 +#: view:email_template.mailbox:0 +msgid "Standard Body" +msgstr "Standardan sadrzaj" + +#. module: email_template +#: selection:email.template,template_language:0 +msgid "Mako Templates" +msgstr "Mako Sabloni" + +#. module: email_template +#: help:email.template,def_body_html:0 +#: help:email.template,def_body_text:0 +msgid "The text version of the mail" +msgstr "Tekstualna verzija poruke" + +#. module: email_template +#: code:addons/email_template/email_template.py:0 +#, python-format +msgid " (Email Attachment)" +msgstr " (Email Attachment)" + +#. module: email_template +#: selection:email_template.mailbox,folder:0 +msgid "Sent Items" +msgstr "Poslate Stavke" + +#. module: email_template +#: code:addons/email_template/email_template_mailbox.py:0 +#, python-format +msgid "" +"Sending of Mail %s failed. Probable Reason:Could not login to server\n" +"Error: %s" +msgstr "" +"Slanje poruke %s nije uspelo. Verovatan uzrok: Ne mogu se logovati na " +"server\n" +"Greska: %s" + +#. module: email_template +#: view:email_template.account:0 +msgid "Test Outgoing Connection" +msgstr "Test Izlazne Konekcije" + +#. module: email_template +#: model:ir.actions.act_window,name:email_template.action_email_template_mailbox +msgid "Mailbox" +msgstr "Postansko Sanduče" + +#. module: email_template +#: help:email.template,attachment_ids:0 +msgid "" +"You may attach existing files to this template, so they will be added in all " +"emails created from this template" +msgstr "" +"Mozete pridodati postojeci fajl ovom sablonu, tako da ce on biti dodat u " +"svim poruka,a kreiranih iz ovog sablona" + +#. module: email_template +#: field:email_template.mailbox,account_id:0 +msgid "User account" +msgstr "Korisnicki nalog" + +#. module: email_template +#: field:email_template.send.wizard,signature:0 +msgid "Attach my signature to mail" +msgstr "Dodaj moj potpis poruci" + +#. module: email_template +#: code:addons/email_template/wizard/email_template_send_wizard.py:0 +#: view:email.template:0 +#, python-format +msgid "Report" +msgstr "Izveštaj" + +#. module: email_template +#: help:email.template,model_object_field:0 +msgid "" +"Select the field from the model you want to use.\n" +"If it is a relationship field you will be able to choose the nested values " +"in the box below\n" +"(Note:If there are no values make sure you have selected the correct model)" +msgstr "" +"Selektuj polje modela koje zelis da koristis\n" +"Ako je to vezno polje,. bicete u mogucnosti da izaberete podveze u polju " +"ispod\n" +"( Napomena: Ako nema nikakvog izbora budite sigurni da ste izabrali ispravan " +"model)" + +#. module: email_template +#: view:email.template:0 +#: view:email_template.mailbox:0 +msgid "Advanced" +msgstr "Napredno" + +#. module: email_template +#: constraint:ir.cron:0 +msgid "Invalid arguments" +msgstr "Neispravni Argumenti" + +#. module: email_template +#: view:email.template:0 +msgid "Expression Builder" +msgstr "Gradilac Ekstenizja" + +#. module: email_template +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: email_template +#: selection:email_template.mailbox,mail_type:0 +msgid "HTML Body" +msgstr "HTML Sadrzaj" + +#. module: email_template +#: view:email_template.account:0 +msgid "Suspend Account" +msgstr "Suspendovan nalog" + +#. module: email_template +#: help:email.template,null_value:0 +msgid "This Value is used if the field is empty" +msgstr "Ova se vrednost koristi ako je polje prazno" + +#. module: email_template +#: view:email.template:0 +msgid "Preview Template" +msgstr "Pregled Sablona" + +#. module: email_template +#: field:email_template.account,smtpserver:0 +msgid "Server" +msgstr "Server" + +#. module: email_template +#: help:email.template,copyvalue:0 +msgid "" +"Copy and paste the value in the location you want to use a system value." +msgstr "" +"Iskopiraj i zalepi vrednost na lokaciju koju zelis da se koristi kao " +"sistemsku vrednost" + +#. module: email_template +#: help:email.template,sub_model_object_field:0 +msgid "" +"When you choose relationship fields this field will specify the sub value " +"you can use." +msgstr "" +"Kada izaberete vezu polja, ovo polje ce specificirati sub vrednost koju " +"mozete koristiti" + +#. module: email_template +#: help:email.template,sub_object:0 +msgid "" +"When a relation field is used this field will show you the type of field you " +"have selected" +msgstr "" +"Kada se koristi vezno polje, ovo polje ce vam pokazati tip polja koje ste " +"izabrali" + +#. module: email_template +#: field:email.template,lang:0 +msgid "Language" +msgstr "Jezik" + +#. module: email_template +#: view:email.template:0 +msgid "Body (Raw HTML)" +msgstr "Sadrzaj Texta (Raw HTML)" + +#. module: email_template +#: field:email.template,use_sign:0 +msgid "Signature" +msgstr "Potpis" + +#. module: email_template +#: field:email.template,sub_object:0 +msgid "Sub-model" +msgstr "Sub-model" + +#. module: email_template +#: view:email_template.send.wizard:0 +msgid "Body (Plain Text)" +msgstr "Telo teksta (Plain Text)" + +#. module: email_template +#: view:email.template:0 +msgid "Body (Text)" +msgstr "Telo teksta (Text)" + +#. module: email_template +#: field:email_template.mailbox,date_mail:0 +msgid "Rec/Sent Date" +msgstr "Datum Slanja/Prijema" + +#. module: email_template +#: field:email.template,report_template:0 +msgid "Report to send" +msgstr "Izvestaj za slanje" + +#. module: email_template +#: view:email_template.account:0 +msgid "Server Information" +msgstr "podaci o serveru" + +#. module: email_template +#: field:email_template.send.wizard,generated:0 +msgid "No of generated Mails" +msgstr "Br. Generisanih poruka" + +#. module: email_template +#: view:email.template:0 +msgid "Mail Details" +msgstr "Detalji poruke" + +#. module: email_template +#: code:addons/email_template/email_template_account.py:0 +#, python-format +msgid "SMTP SERVER or PORT not specified" +msgstr "SMTP SERVER ili PORT nije specificiran" + +#. module: email_template +#: view:email.template:0 +msgid "Note: This is Raw HTML." +msgstr "Napomena: Ovo je Raw HTML." + +#. module: email_template +#: selection:email_template.send.wizard,state:0 +msgid "Multiple Mail Wizard Step 1" +msgstr "Visestruki Carobnjak Meilova Korak 1" + +#. module: email_template +#: field:email_template.account,user:0 +msgid "Related User" +msgstr "Vezni Korisnik" + +#. module: email_template +#: field:email_template.mailbox,body_html:0 +msgid "Body (Rich Text Clients Only)" +msgstr "Telo poruke (Rich Text Clients Only)" + +#. module: email_template +#: selection:email_template.account,company:0 +msgid "Yes" +msgstr "Da" + +#. module: email_template +#: field:email.template,ref_ir_act_window:0 +msgid "Window Action" +msgstr "Radnja prozora" + +#. module: email_template +#: code:addons/email_template/email_template_account.py:0 +#, python-format +msgid "" +"Datetime Extraction failed.Date:%s \\n \tError:%s" +msgstr "" +"Preuzimanje datuma i vremena nije uspelo. Datum:Date:%s \\n \tGreska:%s" + +#. module: email_template +#: view:email_template.account:0 +msgid "SMTP Server" +msgstr "SMTP server" + +#. module: email_template +#: selection:email_template.account,send_pref:0 +msgid "HTML, otherwise Text" +msgstr "HTML, a drugacije Text" + +#. module: email_template +#: view:email_template.mailbox:0 +#: selection:email_template.mailbox,folder:0 +msgid "Drafts" +msgstr "U pripremi" + +#. module: email_template +#: selection:email_template.account,company:0 +msgid "No" +msgstr "Ne" + +#. module: email_template +#: field:email_template.mailbox,mail_type:0 +msgid "Mail Contents" +msgstr "Sadrzaj Poste" + +#. module: email_template +#: code:addons/email_template/email_template.py:0 +#, python-format +msgid "The template name must be unique !" +msgstr "Ime Sablona mora biti jedinstveno" + +#. module: email_template +#: field:email.template,def_bcc:0 +#: field:email_template.mailbox,email_bcc:0 +#: field:email_template.preview,bcc:0 +#: field:email_template.send.wizard,bcc:0 +msgid "BCC" +msgstr "BCC" + +#. module: email_template +#: code:addons/email_template/email_template_account.py:0 +#, python-format +msgid "" +"Mail from Account %s failed. Probable Reason:Server Send Error\n" +"Description: %s" +msgstr "" + +#. module: email_template +#: selection:email_template.mailbox,mail_type:0 +msgid "Plain Text" +msgstr "Samo tekst" + +#. module: email_template +#: view:email_template.account:0 +msgid "Draft" +msgstr "Priprema" + +#. module: email_template +#: constraint:ir.ui.menu:0 +msgid "Error ! You can not create recursive Menu." +msgstr "Greska! Ne mozete kreirati rekursivni meni." + +#. module: email_template +#: field:email.template,model_int_name:0 +msgid "Model Internal Name" +msgstr "Interni Naziv Modula" + +#. module: email_template +#: field:email.template,message_id:0 +#: field:email_template.mailbox,message_id:0 +#: field:email_template.preview,message_id:0 +#: field:email_template.send.wizard,message_id:0 +msgid "Message-ID" +msgstr "Sifra Poruke" + +#. module: email_template +#: help:email_template.mailbox,server_ref:0 +msgid "Applicable for inward items only" +msgstr "Prihvatljivo samo za unutrasnje stavke" + +#. module: email_template +#: view:email_template.send.wizard:0 +msgid "" +"After clicking send all mails, mails will be sent to outbox and cleared in " +"next Send/Recieve" +msgstr "" +"Nakon klika na 'posalji sve poruke', poruke ce biti poslate u outbox i " +"ociscene u sledecem koraku Posalji/Primi" + +#. module: email_template +#: field:email_template.account,state:0 +#: field:email_template.mailbox,state:0 +#: field:email_template.send.wizard,state:0 +msgid "Status" +msgstr "Status" + +#. module: email_template +#: view:email_template.account:0 +msgid "Outgoing" +msgstr "Odlazno" + +#. module: email_template +#: selection:email_template.account,state:0 +msgid "Initiated" +msgstr "Inicirano" + +#. module: email_template +#: help:email.template,use_sign:0 +msgid "the signature from the User details will be appended to the mail" +msgstr "Potpis iz detalja korisnika ce biti pridodat poruci" + +#. module: email_template +#: field:email_template.send.wizard,from:0 +msgid "From Account" +msgstr "Od Naloga" + +#. module: email_template +#: selection:email_template.mailbox,mail_type:0 +msgid "Intermixed content" +msgstr "Izmesani sadrzaj" + +#. module: email_template +#: view:email_template.account:0 +msgid "Request Re-activation" +msgstr "Zahtev za Re-Aktivacijom" + +#. module: email_template +#: view:email.template:0 +#: model:ir.actions.act_window,name:email_template.action_email_template_tree_all +msgid "Email Templates" +msgstr "Sabloni Poruka" + +#. module: email_template +#: field:email_template.account,smtpuname:0 +msgid "User Name" +msgstr "Korisničko ime" + +#. module: email_template +#: field:email.template,sub_model_object_field:0 +msgid "Sub Field" +msgstr "Pod Polje" + +#. module: email_template +#: field:email_template.mailbox,user:0 +msgid "User" +msgstr "Korisnik" + +#. module: email_template +#: help:email.template,allowed_groups:0 +msgid "" +"Only users from these groups will be allowed to send mails from this Template" +msgstr "" +"Samo korisnicima iz ovih grupa ce biti dozvoljeno da salju poruke iz ovog " +"Sablona" + +#. module: email_template +#: view:email_template.mailbox:0 +#: selection:email_template.mailbox,folder:0 +msgid "Outbox" +msgstr "OutBox" + +#. module: email_template +#: view:email_template.send.wizard:0 +msgid "Save in Drafts" +msgstr "Sacuvaj u Pripremi" + +#. module: email_template +#: help:email.template,def_subject:0 +msgid "The default subject of email. Placeholders can be used here." +msgstr "" +"Podrazumevana Tema poruke. Razmaknice se mogu ovde koristiti ( donja crta)" + +#. module: email_template +#: field:email_template.account,smtptls:0 +msgid "TLS" +msgstr "TLS" + +#. module: email_template +#: view:email_template.send.wizard:0 +msgid "" +"Add here all attachments of the current document you want to include in the " +"e-mail." +msgstr "" +"Ubaci ovde sve attachmente za dati dokument koji zelis da prikljucis poruci" + +#. module: email_template +#: model:ir.model,name:email_template.model_email_template_send_wizard +msgid "This is the wizard for sending mail" +msgstr "Craobnjak Slanja Poste" + +#. module: email_template +#: code:addons/email_template/email_template.py:0 +#: code:addons/email_template/email_template_account.py:0 +#: code:addons/email_template/email_template_mailbox.py:0 +#: code:addons/email_template/wizard/email_template_send_wizard.py:0 +#: model:ir.ui.menu,name:email_template.menu_email_template +#, python-format +msgid "Email Template" +msgstr "Sablon Poruka" + +#. module: email_template +#: model:ir.ui.menu,name:email_template.menu_email_template_personal_mails +msgid "Personal Mails" +msgstr "Licne Poruke" + +#. module: email_template +#: code:addons/email_template/email_template_mailbox.py:0 +#, python-format +msgid "" +"Error sending mail: %s\" % str(e)))\n" +" \n" +" def send_all_mail(self, cr, uid, ids=None, context=None):\n" +" if ids is None:\n" +" ids = []\n" +" if context is None:\n" +" context = {}\n" +" filters = [('folder', '=', 'outbox" +msgstr "" +"Greska slanja poruke: %s\" % str(e)))\n" +" \n" +" def send_all_mail(self, cr, uid, ids=None, context=None):\n" +"if ids is None:\n" +"ids = []\n" +"if context is None:\n" +"context = {}\n" +"filters = [('folder', '=', 'outbox" + +#. module: email_template +#: field:email.template,file_name:0 +msgid "File Name Pattern" +msgstr "Ime fajla paterna" + +#. module: email_template +#: code:addons/email_template/email_template.py:0 +#, python-format +msgid "Send Mail (%s)" +msgstr "Slanje POruke (%s)" + +#. module: email_template +#: field:email_template.send.wizard,report:0 +msgid "Report File Name" +msgstr "Ime Fajla Izvestaja" + +#. module: email_template +#: field:email.template,copyvalue:0 +msgid "Expression" +msgstr "Izraz" + +#. module: email_template +#: view:email_template.mailbox:0 +#: field:email_template.mailbox,history:0 +msgid "History" +msgstr "Istorija" + +#. module: email_template +#: code:addons/email_template/email_template.py:0 +#, python-format +msgid "Django templates not installed" +msgstr "Django Sabloni nisu instalirani" + +#. module: email_template +#: view:email.template:0 +#: view:email_template.mailbox:0 +#: field:email_template.mailbox,attachments_ids:0 +#: view:email_template.send.wizard:0 +#: field:email_template.send.wizard,attachment_ids:0 +msgid "Attachments" +msgstr "Prilozi" + +#. module: email_template +#: field:email_template.preview,to:0 +#: field:email_template.send.wizard,to:0 +msgid "To" +msgstr "Za" + +#. module: email_template +#: field:email_template.account,smtpport:0 +msgid "SMTP Port " +msgstr "SMTP Port " + +#. module: email_template +#: selection:email_template.account,send_pref:0 +msgid "Text, otherwise HTML" +msgstr "Text, inace HTML" + +#. module: email_template +#: code:addons/email_template/email_template.py:0 +#, python-format +msgid "Copy of template " +msgstr "Kopija Sablona " + +#. module: email_template +#: view:email_template.send.wizard:0 +msgid "Discard Mail" +msgstr "Izbrisi poruku" + +#. module: email_template +#: model:ir.model,name:email_template.model_email_template +msgid "Email Templates for Models" +msgstr "Sabloni Poruka za Modele" + +#. module: email_template +#: view:email_template.send.wizard:0 +msgid "Close" +msgstr "Zatvori" + +#. module: email_template +#: view:email_template.mailbox:0 +msgid "Body (HTML-Web Client Only)" +msgstr "Sadrzaj (HTML-Web Client Only)" + +#. module: email_template +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" + +#. module: email_template +#: code:addons/email_template/wizard/email_template_send_wizard.py:0 +#, python-format +msgid "%s (Email Attachment)" +msgstr "Copy text \t %s (Email Attachment)" + +#. module: email_template +#: code:addons/email_template/wizard/email_template_send_wizard.py:0 +#, python-format +msgid "" +"No personal email accounts are configured for you. \n" +"Either ask admin to enforce an account for this template or get yourself a " +"personal email account." +msgstr "" +"Ni jedan locni nalog nije kreiran za vas. \n" +"Ili pitajte administratora ili napravite sami sebi licni postanski nalog." + +#. module: email_template +#: field:email.template,allowed_groups:0 +msgid "Allowed User Groups" +msgstr "Dozvoljene Korisnicke Grupe" + +#. module: email_template +#: field:email.template,model_object_field:0 +msgid "Field" +msgstr "Polje" + +#. module: email_template +#: view:email_template.account:0 +msgid "User Information" +msgstr "Podaci o korisniku" + +#. module: email_template +#: view:email_template.account:0 +#: selection:email_template.account,state:0 +msgid "Suspended" +msgstr "Суспендован" + +#. module: email_template +#: field:email_template.mailbox,folder:0 +msgid "Folder" +msgstr "Fascikla" + +#. module: email_template +#: view:email_template.mailbox:0 +#: selection:email_template.mailbox,folder:0 +msgid "Trash" +msgstr "Smeće" + +#. module: email_template +#: model:ir.model,name:email_template.model_email_template_mailbox +msgid "Email Mailbox" +msgstr "Postansko Sanduce" + +#. module: email_template +#: help:email_template.account,smtpuname:0 +msgid "" +"Specify the username if your SMTP server requires authentication, otherwise " +"leave it empty." +msgstr "" +"Specificiraj korisnicko ime ako tvoj SMTP zahteva autorizaciju, inace ostavi " +"prazno." + +#. module: email_template +#: code:addons/email_template/wizard/email_template_send_wizard.py:0 +#, python-format +msgid "Missing mail account" +msgstr "Nedostaje Email nalog" + +#. module: email_template +#: code:addons/email_template/email_template_account.py:0 +#, python-format +msgid "SMTP Test Connection Was Successful" +msgstr "SMTP test je prosao uspesno" + +#. module: email_template +#: model:ir.module.module,shortdesc:email_template.module_meta_information +msgid "Email Template for OpenERP" +msgstr "Sablon poruka za OpenERP" + +#. module: email_template +#: field:email_template.account,name:0 +msgid "Description" +msgstr "Opis" + +#. module: email_template +#: view:email.template:0 +msgid "Create Action" +msgstr "Kreiraj akciju" + +#. module: email_template +#: code:addons/email_template/email_template_account.py:0 +#, python-format +msgid "Mail from Account %s failed. Probable Reason:Account not approved" +msgstr "Poruka sa naloga %s nije uspela. Moguci razlog: Nalog nije omogucen" + +#. module: email_template +#: field:email.template,null_value:0 +msgid "Null Value" +msgstr "Null вредност" + +#. module: email_template +#: field:email.template,template_language:0 +msgid "Templating Language" +msgstr "Jezik Sablona" + +#. module: email_template +#: field:email.template,def_cc:0 +#: field:email_template.mailbox,email_cc:0 +#: field:email_template.preview,cc:0 +#: field:email_template.send.wizard,cc:0 +msgid "CC" +msgstr "CC" + +#. module: email_template +#: view:email_template.mailbox:0 +msgid "Sent" +msgstr "Poslato" + +#. module: email_template +#: field:email_template.account,smtppass:0 +msgid "Password" +msgstr "Lozinka" + +#. module: email_template +#: help:email.template,message_id:0 +#: help:email_template.preview,message_id:0 +#: help:email_template.send.wizard,message_id:0 +msgid "" +"The Message-ID header value, if you need tospecify it, for example to " +"automatically recognize the replies later. Placeholders can be used here." +msgstr "" +"Vrednost Sifre poruke, ako trebas da je specificiras. Na primer da bi je " +"automatski prepoznao kasnije." + +#. module: email_template +#: model:ir.ui.menu,name:email_template.menu_email_template_configuration +msgid "Emails" +msgstr "Email-ovi" + +#. module: email_template +#: view:email.template:0 +msgid "Templates" +msgstr "Šabloni" + +#. module: email_template +#: field:email_template.preview,report:0 +msgid "Report Name" +msgstr "Naziv izveštaja" + +#. module: email_template +#: field:email.template,name:0 +msgid "Name" +msgstr "Ime" + +#. module: email_template +#: model:ir.model,name:email_template.model_email_template_preview +msgid "Email Template Preview" +msgstr "Pregled Sablona Poruke" + +#. module: email_template +#: view:email_template.preview:0 +msgid "Email Preview" +msgstr "Pregled Poruke" + +#. module: email_template +#: view:email.template:0 +msgid "Existing files" +msgstr "Postojeci fajlovi" + +#. module: email_template +#: view:email_template.account:0 +msgid "Personal Accounts" +msgstr "Licni Nalozi" + +#. module: email_template +#: model:ir.module.module,description:email_template.module_meta_information +msgid "" +"\n" +" Email Template is extraction of Power Email basically just to send the " +"emails.\n" +" " +msgstr "" +"\n" +" Sablon Poruke je izvucen iz Power Email, samo da bi poslao poruke.\n" +" " + +#. module: email_template +#: view:email_template.send.wizard:0 +msgid "Body (HTML)" +msgstr "Sadrzaj (HTML)" + +#. module: email_template +#: help:email.template,table_html:0 +msgid "" +"Copy this html code to your HTML message body for displaying the info in " +"your mail." +msgstr "" +"Iskopiraj ovaj HTML kod u telo svoje HTML poruke da bi se prikazala " +"informacija u vasoj poruci" + +#. module: email_template +#: model:ir.model,name:email_template.model_email_template_account +msgid "email_template.account" +msgstr "email_template.account" + +#. module: email_template +#: field:email.template,object_name:0 +#: field:email_template.preview,rel_model:0 +#: field:email_template.send.wizard,rel_model:0 +msgid "Model" +msgstr "Model" + +#. module: email_template +#: code:addons/email_template/email_template_account.py:0 +#, python-format +msgid "Core connection for the given ID does not exist" +msgstr "Osnovna Konekcija za datu Sifru NE postoji" + +#. module: email_template +#: field:email_template.account,company:0 +msgid "Corporate" +msgstr "Saradjivanje" + +#. module: email_template +#: help:email_template.account,smtpserver:0 +msgid "Enter name of outgoing server, eg:smtp.gmail.com " +msgstr "Upisi ime izlaznog servera, npr: smtp.gmail.com " + +#. module: email_template +#: model:ir.ui.menu,name:email_template.menu_email_template_company_mails +msgid "Company Mails" +msgstr "Poruke Preduzeca" + +#. module: email_template +#: view:email.template:0 +msgid "Addresses" +msgstr "Adrese" + +#. module: email_template +#: help:email.template,from_account:0 +msgid "Emails will be sent from this approved account." +msgstr "Poruke ce biti poslate sa ovog omogucenog naloga" + +#. module: email_template +#: field:email.template,def_subject:0 +msgid "Default Subject" +msgstr "Predefinisana tema" + +#. module: email_template +#: help:email.template,def_bcc:0 +msgid "" +"Blind Carbon Copy address(es), comma-separated. Placeholders can be used " +"here." +msgstr "" +"Blind Carbon Copy address(es), comma-separated. Placeholders can be used " +"here." + +#. module: email_template +#: code:addons/email_template/email_template_account.py:0 +#, python-format +msgid "" +"Mail from Account %s failed. Probable Reason:MIME Error\n" +"Description: %s" +msgstr "" +"Poruka sa Naloga %s nije prosla. MOguci Razlog: MIME GRESKA\n" +"Opis: %s" + +#. module: email_template +#: field:email_template.account,send_pref:0 +msgid "Mail Format" +msgstr "Format Poruke" + +#. module: email_template +#: view:email.template:0 +msgid "Actions" +msgstr "Akcije" + +#. module: email_template +#: view:email_template.account:0 +msgid "Company Accounts" +msgstr "Nalozi Preduzeca" + +#. module: email_template +#: code:addons/email_template/wizard/email_template_send_wizard.py:0 +#, python-format +msgid "email-template" +msgstr "sablon-poruke" + +#. module: email_template +#: help:email.template,def_cc:0 +msgid "" +"Carbon Copy address(es), comma-separated. Placeholders can be used here." +msgstr "" +"Carbon Copy address(es), comma-separated. Placeholders can be used here." + +#. module: email_template +#: selection:email_template.send.wizard,state:0 +msgid "Simple Mail Wizard Step 1" +msgstr "Jednostavni Carobnjak POruka Korak 1" + +#. module: email_template +#: selection:email_template.mailbox,mail_type:0 +msgid "Has Attachments" +msgstr "Ima Attachment" + +#. module: email_template +#: help:email.template,track_campaign_item:0 +msgid "" +"Enable this if you want the outgoing e-mails to include a tracking marker " +"that makes it possible to identify the replies an link them back to the " +"campaign item" +msgstr "" +"Omogucava vam , ako zelite da vase izlazne poruke sadrze markera pratnje " +"koji vam daju mogucnost da kasnije identifikujete odgovore i posaljewte ih " +"npr stavci Kampanje." + +#. module: email_template +#: code:addons/email_template/email_template.py:0 +#: code:addons/email_template/wizard/email_template_send_wizard.py:0 +#, python-format +msgid "No Description" +msgstr "Bez Opisa" diff --git a/addons/email_template/security/email_template_security.xml b/addons/email_template/security/email_template_security.xml index 7e6c1f4b560..e3f3401217c 100755 --- a/addons/email_template/security/email_template_security.xml +++ b/addons/email_template/security/email_template_security.xml @@ -2,9 +2,5 @@ - - Marketing / User - - diff --git a/addons/email_template/security/ir.model.access.csv b/addons/email_template/security/ir.model.access.csv index fd5cf2d0f09..79135b0de4d 100644 --- a/addons/email_template/security/ir.model.access.csv +++ b/addons/email_template/security/ir.model.access.csv @@ -1,7 +1,7 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_email_template_account","email_template.account","model_email_template_account","base.res_groups_email_template_admin",1,0,0,0 -"access_email_template","email.template","model_email_template","base.res_groups_email_template_admin",1,0,0,0 -"access_email_template_mailbox","email_template.mailbox","model_email_template_mailbox","base.res_groups_email_template_admin",1,1,1,1 +"access_email_template_account","email_template.account","model_email_template_account","marketing.group_marketing_user",1,0,0,0 +"access_email_template","email.template","model_email_template","marketing.group_marketing_user",1,0,0,0 +"access_email_template_mailbox","email_template.mailbox","model_email_template_mailbox","marketing.group_marketing_user",1,1,1,1 "access_email_template_account_system","email_template.account system","model_email_template_account","base.group_system",1,1,1,1 "access_email_template_system","email.template system","model_email_template","base.group_system",1,1,1,1 "access_email_template_mailbox_system","email_template.mailbox system","model_email_template_mailbox","base.group_system",1,0,0,0 diff --git a/addons/event/__openerp__.py b/addons/event/__openerp__.py index 4e65009f422..9f479a2d941 100644 --- a/addons/event/__openerp__.py +++ b/addons/event/__openerp__.py @@ -39,7 +39,7 @@ Events / Reporting """, 'author': 'OpenERP SA', - 'depends': ['crm', 'base_contact', 'account'], + 'depends': ['crm', 'base_contact', 'account', 'marketing'], 'init_xml': [], 'update_xml': [ 'security/event_security.xml', diff --git a/addons/event/board_association_view.xml b/addons/event/board_association_view.xml index 3acebb9d767..d62e4336202 100644 --- a/addons/event/board_association_view.xml +++ b/addons/event/board_association_view.xml @@ -80,7 +80,6 @@ sequence="1" id="menu_board_associations_manager" icon="terp-graph"/> - diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml index 2fe04b165aa..918147b79cb 100644 --- a/addons/event/event_view.xml +++ b/addons/event/event_view.xml @@ -272,6 +272,7 @@ tree,form,calendar,graph {"search_default_draft": "1", "search_default_section_id": section_id} + Event is the low-level object used by meeting and others documents that have to be synchronized with mobile or calendar applications through caldav. Most of the users should work on the Calendar menu, and not on the list of events. , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-08-28 16:01+0000\n" +"PO-Revision-Date: 2010-10-16 19:57+0000\n" +"Last-Translator: zmmaj \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: event +#: field:event.event,date_end:0 +#: field:report.event.registration,date_end:0 +msgid "Ending date" +msgstr "Datum zavrsetka" + +#. module: event +#: field:event.event,register_min:0 +msgid "Minimum Registrations" +msgstr "Registracioni Minimum" + +#. module: event +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Pogrešno ime modela u definiciji akcije." + +#. module: event +#: field:event.event,mail_registr:0 +msgid "Registration Email" +msgstr "" + +#. module: event +#: model:crm.case.section,name:event.event_0_crm_case_section +msgid "Concert of Bon Jovi" +msgstr "Bon Jovi Koncert" + +#. module: event +#: field:event.event,mail_confirm:0 +msgid "Confirmation Email" +msgstr "Konfirmacioni Email" + +#. module: event +#: constraint:crm.case.section:0 +msgid "Error ! You cannot create recursive sections." +msgstr "Greška ! Ne možete stvarati rekurzivne sekcije." + +#. module: event +#: model:ir.model,name:event.model_event_registration +msgid "Event Registration" +msgstr "Registracioni Dogadjaj" + +#. module: event +#: model:ir.actions.wizard,name:event.event_reg_invoice +msgid "Make Invoice" +msgstr "Kreiraj račun" + +#. module: event +#: field:report.event.type.registration,draft_state:0 +msgid "Draft Registrations" +msgstr "Registracije u Pripremi" + +#. module: event +#: view:report.event.registration:0 +msgid "Event on Registration" +msgstr "Sogadjaj pri registraciji" + +#. module: event +#: wizard_button:event.reg_make_invoice,init,end:0 +msgid "Ok" +msgstr "U redu" + +#. module: event +#: field:event.event,mail_auto_confirm:0 +msgid "Mail Auto Confirm" +msgstr "Auto potvrdjivanje Email-a" + +#. module: event +#: model:product.template,name:event.event_product_1_product_template +msgid "Ticket for Opera" +msgstr "Karta za Operu" + +#. module: event +#: wizard_field:event.reg_make_invoice,init,inv_rejected:0 +msgid "Invoice Rejected" +msgstr "Racun Odbijen" + +#. module: event +#: view:event.event:0 +msgid "Confirm Event" +msgstr "Potvrdi Dogadjaj" + +#. module: event +#: model:crm.case.section,name:event.event_1_crm_case_section +msgid "Opera of Verdi" +msgstr "Verdijeva Opera" + +#. module: event +#: field:report.event.registration,draft_state:0 +msgid "Draft Registration" +msgstr "Registracija u pripremi" + +#. module: event +#: wizard_view:event.reg_make_invoice,init:0 +msgid "Create Invoices" +msgstr "Kreiraj Racune" + +#. module: event +#: model:ir.module.module,description:event.module_meta_information +msgid "" +"Organization and management of events.\n" +"\n" +" This module allow you\n" +" * to manage your events and their registrations\n" +" * to use emails to automatically confirm and send acknowledgements " +"for any registration to an event\n" +" * ...\n" +"\n" +" Note that:\n" +" - You can define new types of events in\n" +" Events / Configuration / Types of Events\n" +" - You can access predefined reports about number of registration per " +"event or per event category in :\n" +" Events / Reporting\n" +msgstr "" +"Organizacija i Upravljanje Dogadjajima\n" +"\n" +" Ovaj vam modul omogucuje\n" +" *da upravljate dogadjajima i njihovim registracijama\n" +" *da koristite Emailove za automatsku potvrdu i slanje upozorenja za " +"bilo koju registraciju nekog dogadjaja\n" +" *\n" +" Upamtite da:\n" +" -Mozete da definisete nove tipove dogadjaja u\n" +" " +"Dogadjaji/Podesavanja/Tipovi Dogadjaja\n" +" -Mozete da pristupite predefinisanim izvestajima o broju registracija po " +"dogadjaju ili cak po kategorijama u:\n" +" " +"Dogadjaji/Izvestavanje\n" + +#. module: event +#: view:event.registration:0 +msgid "Extra Info" +msgstr "Dodatne Informacije" + +#. module: event +#: view:event.registration:0 +msgid "Registration" +msgstr "Registracija" + +#. module: event +#: field:event.type,name:0 +#: model:ir.model,name:event.model_event_type +msgid "Event type" +msgstr "Tip dogadjaja" + +#. module: event +#: view:event.event:0 +#: model:ir.model,name:event.model_event_event +#: model:ir.module.module,shortdesc:event.module_meta_information +#: field:report.event.registration,name:0 +msgid "Event" +msgstr "Događaj" + +#. module: event +#: selection:event.event,state:0 +msgid "Confirmed" +msgstr "Potvrđeno" + +#. module: event +#: wizard_view:event.confirm_registration,split:0 +msgid "Registration Confirmation" +msgstr "Potvrda Registracije" + +#. module: event +#: view:event.registration:0 +msgid "Dates" +msgstr "Datumi" + +#. module: event +#: field:event.event,register_current:0 +#: model:ir.actions.act_window,name:event.action_registration_confirm +#: model:ir.ui.menu,name:event.menu_action_registration_confirm +msgid "Confirmed Registrations" +msgstr "Potvrdjene Registracije" + +#. module: event +#: field:event.event,mail_auto_registr:0 +msgid "Mail Auto Register" +msgstr "Auto Registracija Mailom" + +#. module: event +#: view:event.registration:0 +msgid "Badge" +msgstr "Znacka" + +#. module: event +#: field:event.event,section_id:0 +msgid "Case section" +msgstr "Tip Sekcije" + +#. module: event +#: field:event.registration,tobe_invoiced:0 +msgid "To be Invoiced" +msgstr "Da bude Fakturisano" + +#. module: event +#: model:ir.ui.menu,name:event.menu_event_event +msgid "All Events" +msgstr "Svi Dogadjaji" + +#. module: event +#: model:ir.ui.menu,name:event.menu_report_event +msgid "Reporting" +msgstr "Izveštavanje" + +#. module: event +#: view:event.registration:0 +msgid "Cancel Registration" +msgstr "Otkazi Registraciju" + +#. module: event +#: model:ir.ui.menu,name:event.menu_action_event_categories +msgid "Events by Categories" +msgstr "Dogadjaji po Kategorijama" + +#. module: event +#: wizard_view:event.confirm_registration,split:0 +msgid "The event limit is reached. What do you want to do?" +msgstr "Limit Dogadjaja je postignut. Sta zelis da uradis?" + +#. module: event +#: field:report.event.type.registration,confirm_state:0 +msgid "Confirm Registrations" +msgstr "potvrdi Registraciju" + +#. module: event +#: view:event.registration:0 +msgid "References" +msgstr "Reference" + +#. module: event +#: model:ir.actions.act_window,name:event.action_event_type_registration +#: model:ir.ui.menu,name:event.menu_report_event_type_registration +#: view:report.event.type.registration:0 +msgid "Registration By Event Types" +msgstr "Registracije po Tipu Dogadjaja" + +#. module: event +#: model:ir.ui.menu,name:event.menu_event_config +msgid "Configuration" +msgstr "Podešavanje" + +#. module: event +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: event +#: wizard_button:event.confirm_registration,split,confirm:0 +msgid "Confirm Anyway" +msgstr "Sve jedno Potvrdi" + +#. module: event +#: constraint:product.template:0 +msgid "Error: UOS must be in a different category than the UOM" +msgstr "" +"Greška: JU (jedinice usluga) i JM moraju da budu u različitim kategorijama" + +#. module: event +#: view:event.event:0 +msgid "Parent Category" +msgstr "Roditeljska Kategorija" + +#. module: event +#: view:event.registration:0 +msgid "Registration Invoiced" +msgstr "Registracija fakturisana" + +#. module: event +#: field:report.event.type.registration,nbevent:0 +msgid "Number Of Events" +msgstr "Broj Dogadjaja" + +#. module: event +#: view:event.event:0 +msgid "Cancel Event" +msgstr "Otkazi Dogadjaj" + +#. module: event +#: wizard_field:event.reg_make_invoice,init,inv_rej_reason:0 +msgid "Error Messages" +msgstr "Poruke o greskama" + +#. module: event +#: view:event.event:0 +msgid "Mailing" +msgstr "E-Postanska" + +#. module: event +#: model:product.template,name:event.event_product_0_product_template +msgid "Ticket for Concert" +msgstr "Karta za koncert" + +#. module: event +#: field:event.event,register_prospect:0 +#: model:ir.actions.act_window,name:event.action_registration_draft +#: model:ir.ui.menu,name:event.menu_action_registration_draft +msgid "Unconfirmed Registrations" +msgstr "Nepotvrdjene Registracije" + +#. module: event +#: field:event.registration,partner_invoice_id:0 +msgid "Partner Invoiced" +msgstr "Partner Fakturisan" + +#. module: event +#: view:event.registration:0 +msgid "Communication history" +msgstr "Istorija Komunikacija" + +#. module: event +#: selection:event.event,state:0 +msgid "Canceled" +msgstr "Отказано" + +#. module: event +#: view:event.event:0 +msgid "Event Done" +msgstr "Dogadjaj Zavrsen" + +#. module: event +#: field:event.registration,badge_name:0 +msgid "Badge Name" +msgstr "Naziv Znacke" + +#. module: event +#: model:ir.actions.act_window,name:event.action_event_registration +#: model:ir.ui.menu,name:event.menu_report_event_registration +msgid "Events On Registrations" +msgstr "Dogadjaji pri Registraciji" + +#. module: event +#: constraint:product.template:0 +msgid "" +"Error: The default UOM and the purchase UOM must be in the same category." +msgstr "" +"Greška: Podrazumevana JM i kupljena JM moraju da budu u istoj kategoriji." + +#. module: event +#: wizard_field:event.reg_make_invoice,init,inv_created:0 +msgid "Invoice Created" +msgstr "Racun Kreiran" + +#. module: event +#: view:event.event:0 +msgid "Statistics" +msgstr "Statistike" + +#. module: event +#: selection:event.event,state:0 +msgid "Draft" +msgstr "Priprema" + +#. module: event +#: view:event.event:0 +msgid "Event description" +msgstr "Opis Dogadjaja" + +#. module: event +#: model:ir.model,name:event.model_report_event_type_registration +msgid "Event type on registration" +msgstr "Tip Dogadjaja pri registraciji" + +#. module: event +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" + +#. module: event +#: field:event.registration,event_id:0 +msgid "Event Related" +msgstr "Vezani Dogadjaj" + +#. module: event +#: model:crm.case.section,name:event.case_section_event +#: view:event.event:0 +#: model:ir.actions.act_window,name:event.action_event_view +msgid "Events" +msgstr "Događaji" + +#. module: event +#: field:event.registration,nb_register:0 +msgid "Number of Registration" +msgstr "Broj Registracija" + +#. module: event +#: view:event.event:0 +#: field:event.event,state:0 +#: view:event.registration:0 +msgid "Status" +msgstr "Status" + +#. module: event +#: model:ir.actions.act_window,name:event.action_event_categories +msgid "Events by section" +msgstr "Dogadjaji po Sekciji" + +#. module: event +#: model:ir.ui.menu,name:event.menu_action_registration +msgid "All Registrations" +msgstr "Sve Registracije" + +#. module: event +#: help:event.event,mail_auto_registr:0 +msgid "" +"Check this box if you want to use the automatic mailing for new registration" +msgstr "" +"Cekiraj ovu Kucicu ako zelite da koristite automatski mailing pri novoj " +"registraciji" + +#. module: event +#: view:event.event:0 +msgid "Set To Draft" +msgstr "" + +#. module: event +#: view:event.registration:0 +#: model:ir.actions.wizard,name:event.event_confirm_registration +#: field:report.event.registration,confirm_state:0 +msgid "Confirm Registration" +msgstr "Posalji na Pripremu" + +#. module: event +#: view:event.registration:0 +msgid "History" +msgstr "Istorija" + +#. module: event +#: model:ir.ui.menu,name:event.menu_event_type +msgid "Types of Events" +msgstr "Tipovi Dogadjaja" + +#. module: event +#: field:event.registration,contact_id:0 +msgid "Partner Contact" +msgstr "Kontakt partnera" + +#. module: event +#: view:event.event:0 +msgid "Auto Confirmation Email" +msgstr "Auto-Mail za potvrdu" + +#. module: event +#: view:event.event:0 +#: view:event.registration:0 +msgid "General" +msgstr "Opšte" + +#. module: event +#: view:event.registration:0 +msgid "Send Reminder" +msgstr "Posalji Podsetnik" + +#. module: event +#: selection:event.event,state:0 +msgid "Done" +msgstr "Gotovo" + +#. module: event +#: field:event.event,date_begin:0 +#: field:report.event.registration,date_begin:0 +msgid "Beginning date" +msgstr "Datum pocetka" + +#. module: event +#: field:event.registration,invoice_id:0 +msgid "Invoice" +msgstr "Račun" + +#. module: event +#: model:ir.model,name:event.model_report_event_registration +msgid "Events on registrations" +msgstr "Dogadjaji pri Registraciji" + +#. module: event +#: wizard_button:event.confirm_registration,split,end:0 +msgid "Cancel" +msgstr "Otkaži" + +#. module: event +#: wizard_button:event.reg_make_invoice,init,open:0 +msgid "Open" +msgstr "Otvori" + +#. module: event +#: field:event.registration,badge_title:0 +msgid "Badge Title" +msgstr "Naslov Znacke" + +#. module: event +#: model:ir.actions.act_window,name:event.action_new_event_form +#: model:ir.ui.menu,name:event.menu_event_new_event +msgid "New event" +msgstr "Novi Dogadjaj" + +#. module: event +#: field:event.registration,unit_price:0 +msgid "Unit Price" +msgstr "Jedinična cijena" + +#. module: event +#: model:crm.case.section,name:event.event_2_crm_case_section +msgid "Conference on ERP Buisness" +msgstr "Konferencija o ERP Biznisu" + +#. module: event +#: field:event.registration,badge_partner:0 +msgid "Badge Partner" +msgstr "Partner Znacke" + +#. module: event +#: model:ir.actions.act_window,name:event.action_event_view_confirm +#: model:ir.ui.menu,name:event.menu_event_event_confirm +msgid "Confirmed Events" +msgstr "Potvrdi Dogadjaje" + +#. module: event +#: field:event.event,register_max:0 +#: field:report.event.registration,register_max:0 +msgid "Maximum Registrations" +msgstr "Maksimum Registracija" + +#. module: event +#: field:event.event,type:0 +msgid "Type" +msgstr "Tip" + +#. module: event +#: help:event.event,mail_registr:0 +msgid "This email will be sent when someone subscribes to the event." +msgstr "Ovaj ce Email biti poslan kada se neko bude prijavio za dogadjaj" + +#. module: event +#: model:product.template,name:event.event_product_2_product_template +msgid "Ticket for Conference" +msgstr "Karta za konferenciju" + +#. module: event +#: field:event.registration,case_id:0 +msgid "Case" +msgstr "Slucaj" + +#. module: event +#: view:event.event:0 +msgid "Name" +msgstr "Ime" + +#. module: event +#: help:event.event,mail_auto_confirm:0 +msgid "" +"Check this box if you want ot use the automatic confirmation emailing or the " +"reminder" +msgstr "" +"Cekiraj ovu kucicu ako zelis da koristis automatsko slanje E-podsetnika" + +#. module: event +#: help:event.event,mail_confirm:0 +msgid "" +"This email will be sent when the event gets confimed or when someone " +"subscribes to a confirmed event. This is also the email sent to remind " +"someone about the event." +msgstr "" +"Ovaj ce Email biti poslan kada se dogadjaj potvrdi ili kada se neko upise na " +"potvrdjeni dogadjaj. Ovo je takodje Email koji ce biti poslat da podseti " +"nekog o dogadjaju." + +#. module: event +#: field:event.event,product_id:0 +msgid "Product" +msgstr "Proizvod" + +#. module: event +#: field:event.registration,invoice_label:0 +msgid "Label Invoice" +msgstr "" + +#. module: event +#: view:event.registration:0 +msgid "Payments" +msgstr "Isplate" + +#. module: event +#: view:event.type:0 +#: field:report.event.type.registration,name:0 +msgid "Event Type" +msgstr "Vrsta događaja" + +#. module: event +#: view:event.event:0 +#: model:ir.actions.act_window,name:event.action_registration +#: model:ir.actions.wizard,name:event.wizard_event_registration +msgid "Registrations" +msgstr "Registracije" + +#. module: event +#: model:ir.actions.act_window,name:event.action_event_view_draft +#: model:ir.ui.menu,name:event.menu_event_event_draft +msgid "Draft Events" +msgstr "Dodgadjaji iz Pripreme" + +#. module: event +#: model:ir.ui.menu,name:event.menu_event_main +msgid "Events Organisation" +msgstr "Organizacija Dogadjaja" + +#. module: event +#: view:event.registration:0 +msgid "Actions" +msgstr "Akcije" + +#. module: event +#: model:ir.actions.wizard,name:event.wizard_event_reg_partners +msgid "List Register Partners" +msgstr "Spisak Registrovanih Partnera" + +#. module: event +#: constraint:product.product:0 +msgid "Error: Invalid ean code" +msgstr "Greška: Neispravan EAN kod" + +#. module: event +#: view:event.event:0 +msgid "Auto Registration Email" +msgstr "Auto Registracioni Email" diff --git a/addons/event/report/report_event_registration_view.xml b/addons/event/report/report_event_registration_view.xml index 83d52d5ab12..d8cc84a0547 100644 --- a/addons/event/report/report_event_registration_view.xml +++ b/addons/event/report/report_event_registration_view.xml @@ -141,7 +141,7 @@ - + diff --git a/addons/event/security/event_security.xml b/addons/event/security/event_security.xml index bcd172ce8c7..4415b11a8e4 100644 --- a/addons/event/security/event_security.xml +++ b/addons/event/security/event_security.xml @@ -6,7 +6,7 @@ Marketing / Manager - + Marketing / User diff --git a/addons/event/security/ir.model.access.csv b/addons/event/security/ir.model.access.csv index c93c2baa65e..9ee5ae7ec80 100644 --- a/addons/event/security/ir.model.access.csv +++ b/addons/event/security/ir.model.access.csv @@ -1,9 +1,9 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_event_type","event.type","model_event_type","base.res_groups_email_template_admin",1,0,0,0 +"access_event_type","event.type","model_event_type","marketing.group_marketing_user",1,0,0,0 "access_event_type_manager","event.type manager","model_event_type","base.group_marketing_manager",1,1,1,1 -"access_event_event","event.event","model_event_event","base.res_groups_email_template_admin",1,1,1,0 -"access_event_registration","event.registration","model_event_registration","base.res_groups_email_template_admin",1,1,1,0 -"access_report_event_registration","report.event.registration","model_report_event_registration","base.res_groups_email_template_admin",1,1,1,1 +"access_event_event","event.event","model_event_event","marketing.group_marketing_user",1,1,1,0 +"access_event_registration","event.registration","model_event_registration","marketing.group_marketing_user",1,1,1,0 +"access_report_event_registration","report.event.registration","model_report_event_registration","marketing.group_marketing_user",1,1,1,1 "access_event_event_manager","event.event manager","model_event_event","base.group_marketing_manager",1,0,0,0 "access_event_registration_manager","event.registration manager","model_event_registration","base.group_marketing_manager",1,0,0,0 "access_crm_case_section_manager","crm.case.section manager","crm.model_crm_case_section","base.group_marketing_manager",1,1,1,1 @@ -11,10 +11,5 @@ "access_report_event_registration","report.event.registration","model_report_event_registration","base.group_marketing_manager",1,1,1,1 "access_event_registration_badge_manager","event.registration.badge manager","model_event_registration_badge","base.group_marketing_manager",1,1,1,1 "access_event_event_sale_salesman","event.event.sale","model_event_event","base.group_sale_salesman",1,0,0,0 -"access_event_event_system","event.event system","model_event_event","base.group_system",1,0,0,0 -"access_event_registration_system","event.registration system","model_event_registration","base.group_system",1,0,0,0 -"access_report_event_registration_system","report.event.registration system","model_report_event_registration","base.group_system",1,1,1,1 -"access_account_account_invoice_system","account.account.invoice","account.model_account_invoice","base.group_system",1,0,0,0 -"access_event_type_sytem","event.type system","model_event_type","base.group_system",1,1,1,1 "access_account_account_invoice_manager","account.account.invoice","account.model_account_invoice","base.group_marketing_manager",1,0,0,0 -"access_event_registration_badge","event.registration.badge","model_event_registration_badge","base.res_groups_email_template_admin",1,0,0,0 +"access_event_registration_badge","event.registration.badge","model_event_registration_badge","marketing.group_marketing_user",1,0,0,0 diff --git a/addons/event_project/i18n/it.po b/addons/event_project/i18n/it.po index 9d5270feb86..1b89667805f 100644 --- a/addons/event_project/i18n/it.po +++ b/addons/event_project/i18n/it.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.4\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-09-29 10:49+0000\n" -"Last-Translator: OpenERP Administrators \n" +"PO-Revision-Date: 2010-10-16 08:28+0000\n" +"Last-Translator: simone.sandri \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-30 04:43+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: event_project @@ -48,7 +48,7 @@ msgstr "Attività Rimanenti" #. module: event_project #: model:ir.module.module,shortdesc:event_project.module_meta_information msgid "Event - Project" -msgstr "" +msgstr "Evento - Progetto" #. module: event_project #: field:event.event,project_id:0 diff --git a/addons/event_project/i18n/sr.po b/addons/event_project/i18n/sr.po new file mode 100644 index 00000000000..70465d3c266 --- /dev/null +++ b/addons/event_project/i18n/sr.po @@ -0,0 +1,88 @@ +# Serbian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-08-28 16:01+0000\n" +"PO-Revision-Date: 2010-10-16 20:04+0000\n" +"Last-Translator: zmmaj \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: event_project +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: event_project +#: model:ir.actions.wizard,name:event_project.wizard_event_task +msgid "Tasks" +msgstr "Zadaci" + +#. module: event_project +#: wizard_button:event.project,init,done:0 +msgid "Ok" +msgstr "U redu" + +#. module: event_project +#: model:ir.module.module,description:event_project.module_meta_information +msgid "" +"Organization and management of events.\n" +"\n" +" This module allow you to create retro planning for managing your " +"events.\n" +msgstr "" +"Organizacija i Upravljanje Dogadjajima.\n" +"\n" +" Ovaj modul vam omogucava da kreirate retro planiranje za upravljanje " +"vasim dogadjajima.\n" + +#. module: event_project +#: view:event.event:0 +msgid "Remaining Tasks" +msgstr "Preostali Zadaci" + +#. module: event_project +#: model:ir.module.module,shortdesc:event_project.module_meta_information +msgid "Event - Project" +msgstr "Projekat-Dogadjaj" + +#. module: event_project +#: field:event.event,project_id:0 +#: wizard_field:event.project,init,project_id:0 +#: model:ir.actions.wizard,name:event_project.event_wiz +msgid "Project" +msgstr "Projekat" + +#. module: event_project +#: field:event.event,task_ids:0 +msgid "Project tasks" +msgstr "Projekat Zadataka" + +#. module: event_project +#: wizard_button:event.project,init,end:0 +msgid "Cancel" +msgstr "Otkaži" + +#. module: event_project +#: view:event.event:0 +msgid "Create Retro-Planning" +msgstr "Kreiraj Retro-Planiranje" + +#. module: event_project +#: wizard_view:event.project,init:0 +msgid "Event" +msgstr "Događaj" + +#. module: event_project +#: view:event.event:0 +msgid "Tasks management" +msgstr "Upravljanje Zadacima" diff --git a/addons/fetchmail/__openerp__.py b/addons/fetchmail/__openerp__.py index 94dbdf4ef5c..e9050fda075 100644 --- a/addons/fetchmail/__openerp__.py +++ b/addons/fetchmail/__openerp__.py @@ -33,7 +33,6 @@ * Automatic Email Receive * Email based Records (Add, Update) """, - 'author': 'Tiny', 'website': 'http://www.openerp.com', 'init_xml': [], 'update_xml': [ diff --git a/addons/fetchmail/fetchmail.py b/addons/fetchmail/fetchmail.py index 7d527442391..2147d774762 100644 --- a/addons/fetchmail/fetchmail.py +++ b/addons/fetchmail/fetchmail.py @@ -71,8 +71,9 @@ class email_server(osv.osv): } def check_duplicate(self, cr, uid, ids): + # RFC *-* Why this limitation? why not in SQL constraint? vals = self.read(cr, uid, ids, ['user', 'password'])[0] - cr.execute("select count(id) from email_server where user='%s' and password='%s'" % (vals['user'], vals['password'])) + cr.execute("select count(id) from email_server where user='%s' and password='%s'", (vals['user'], vals['password'])) res = cr.fetchone() if res: if res[0] > 1: diff --git a/addons/fetchmail/i18n/sr.po b/addons/fetchmail/i18n/sr.po new file mode 100644 index 00000000000..115ed3155f9 --- /dev/null +++ b/addons/fetchmail/i18n/sr.po @@ -0,0 +1,274 @@ +# Serbian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2010-08-20 13:33+0000\n" +"PO-Revision-Date: 2010-10-16 20:18+0000\n" +"Last-Translator: zmmaj \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: fetchmail +#: selection:email.server,state:0 +msgid "Confirmed" +msgstr "Potvrđeno" + +#. module: fetchmail +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" + +#. module: fetchmail +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Pogrešno ime modela u definiciji akcije." + +#. module: fetchmail +#: model:ir.actions.act_window,name:fetchmail.action_email_server_tree_imap +#: model:ir.ui.menu,name:fetchmail.menu_action_email_server_tree_imap +msgid "IMAP Servers" +msgstr "IMAP Serveri" + +#. module: fetchmail +#: field:email.server,action_id:0 +msgid "Reply Email" +msgstr "Odgovori na Email" + +#. module: fetchmail +#: view:email.server:0 +msgid "Server & Login" +msgstr "Server & Login" + +#. module: fetchmail +#: field:email.server,priority:0 +msgid "Server Priority" +msgstr "Prioritet Servera" + +#. module: fetchmail +#: field:email.server,state:0 +msgid "State" +msgstr "Stanje" + +#. module: fetchmail +#: constraint:ir.ui.menu:0 +msgid "Error ! You can not create recursive Menu." +msgstr "Greska! Ne mozete kreirati rekursivni meni." + +#. module: fetchmail +#: selection:email.server,state:0 +msgid "Not Confirmed" +msgstr "Nije potvrdjeno" + +#. module: fetchmail +#: view:email.server:0 +msgid "POP/IMAP Servers" +msgstr "POP/IMAP Serveri" + +#. module: fetchmail +#: model:ir.module.module,shortdesc:fetchmail.module_meta_information +msgid "Fetchmail Server" +msgstr "Email Server" + +#. module: fetchmail +#: view:email.server:0 +#: field:email.server,note:0 +msgid "Description" +msgstr "Opis" + +#. module: fetchmail +#: field:email.server,attach:0 +msgid "Add Attachments ?" +msgstr "Dodajes Attachmente ( dodatke) ?" + +#. module: fetchmail +#: view:email.server:0 +msgid "Set to Draft" +msgstr "Postavi u pripremu" + +#. module: fetchmail +#: field:email.server,user:0 +msgid "User Name" +msgstr "Korisničko ime" + +#. module: fetchmail +#: field:email.server,user_id:0 +msgid "User" +msgstr "Korisnik" + +#. module: fetchmail +#: field:email.server,date:0 +msgid "Date" +msgstr "Datum" + +#. module: fetchmail +#: selection:email.server,state:0 +msgid "Waiting for Verification" +msgstr "Cekanje na Potvrdu" + +#. module: fetchmail +#: field:email.server,password:0 +msgid "Password" +msgstr "Lozinka" + +#. module: fetchmail +#: constraint:ir.cron:0 +msgid "Invalid arguments" +msgstr "Neispravni Argumenti" + +#. module: fetchmail +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: fetchmail +#: view:email.server:0 +msgid "Auto Reply?" +msgstr "Auto Odgovor?" + +#. module: fetchmail +#: field:email.server,name:0 +msgid "Name" +msgstr "Ime" + +#. module: fetchmail +#: model:ir.model,name:fetchmail.model_mailgate_message +msgid "Mailgateway Message" +msgstr "Poruka Email prolaza" + +#. module: fetchmail +#: model:ir.actions.act_window,name:fetchmail.action_email_server_tree +#: model:ir.ui.menu,name:fetchmail.menu_action_email_server_tree +msgid "POP Servers" +msgstr "POP Serveri" + +#. module: fetchmail +#: model:ir.ui.menu,name:fetchmail.menu_action_fetchmail_server_tree +msgid "Fetchmail Services" +msgstr "Email Servisi" + +#. module: fetchmail +#: model:ir.actions.act_window,name:fetchmail.action_mailgate_message_tree +#: model:ir.actions.act_window,name:fetchmail.action_mailgate_message_tree_pop +#: model:ir.ui.menu,name:fetchmail.menu_action_mailgate_message_tree +#: model:ir.ui.menu,name:fetchmail.menu_action_mailgate_message_tree_pop +msgid "Received Email History" +msgstr "Istorija Primljenih E-mailova" + +#. module: fetchmail +#: field:email.server,active:0 +msgid "Active" +msgstr "Aktivan" + +#. module: fetchmail +#: view:email.server:0 +msgid "Process Parameter" +msgstr "Obradi Parametar" + +#. module: fetchmail +#: field:email.server,is_ssl:0 +msgid "SSL ?" +msgstr "SSL ?" + +#. module: fetchmail +#: selection:email.server,type:0 +#: selection:mailgate.message,type:0 +msgid "IMAP Server" +msgstr "MAP Server" + +#. module: fetchmail +#: field:email.server,object_id:0 +msgid "Model" +msgstr "Model" + +#. module: fetchmail +#: field:email.server,server:0 +msgid "Server" +msgstr "Server" + +#. module: fetchmail +#: model:ir.actions.act_window,name:fetchmail.act_server_history +msgid "Email History" +msgstr "Email Istorija" + +#. module: fetchmail +#: view:email.server:0 +#: model:ir.model,name:fetchmail.model_email_server +msgid "POP/IMAP Server" +msgstr "POP/IMAP Server" + +#. module: fetchmail +#: constraint:ir.rule:0 +msgid "Rules are not supported for osv_memory objects !" +msgstr "Pravila nisu podrzana od strane osv_memory objekata !" + +#. module: fetchmail +#: field:email.server,type:0 +#: field:mailgate.message,type:0 +msgid "Server Type" +msgstr "Tup Servera" + +#. module: fetchmail +#: view:email.server:0 +msgid "Login Information" +msgstr "Informacije o Prijavi" + +#. module: fetchmail +#: view:email.server:0 +msgid "Server Information" +msgstr "Podaci o Serveru" + +#. module: fetchmail +#: selection:email.server,type:0 +#: selection:mailgate.message,type:0 +msgid "POP Server" +msgstr "POP Server" + +#. module: fetchmail +#: field:email.server,port:0 +msgid "Port" +msgstr "Port" + +#. module: fetchmail +#: model:ir.module.module,description:fetchmail.module_meta_information +msgid "" +"Fetchmail: \n" +" * Fetch email from Pop / IMAP server\n" +" * Support SSL\n" +" * Integrated with all Modules\n" +" * Automatic Email Receive\n" +" * Email based Records (Add, Update)\n" +" " +msgstr "" +"Fetchmail: \n" +" *Hvata emailove sa pop/imap servera\n" +" *Podrzava SSL\n" +" *Integrise se sa svim modulima\n" +" *Automatski prima Emailove\n" +" *Na bazi Email-a pravi snimanja ( Dodaje, Dopunjava)\n" +" " + +#. module: fetchmail +#: help:email.server,priority:0 +msgid "Priority between 0 to 10, select define the order of Processing" +msgstr "Vaznost izmedju 0 i 10, izaberi i definisi redosled Procesuiranja" + +#. module: fetchmail +#: field:mailgate.message,server_id:0 +msgid "Mail Server" +msgstr "Email Server" + +#. module: fetchmail +#: view:email.server:0 +msgid "Fetch Emails" +msgstr "Hvata Emailove" diff --git a/addons/google_map/i18n/sr.po b/addons/google_map/i18n/sr.po new file mode 100644 index 00000000000..9cf75fa2c19 --- /dev/null +++ b/addons/google_map/i18n/sr.po @@ -0,0 +1,51 @@ +# Serbian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-08-28 16:01+0000\n" +"PO-Revision-Date: 2010-10-16 08:00+0000\n" +"Last-Translator: zmmaj \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: google_map +#: model:ir.actions.wizard,name:google_map.wizard_google_map +msgid "Launch Google Map" +msgstr "Ppkreni Google Map" + +#. module: google_map +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: google_map +#: view:res.partner:0 +#: view:res.partner.address:0 +msgid "Street2 : " +msgstr "Ulica2 " + +#. module: google_map +#: model:ir.module.module,description:google_map.module_meta_information +msgid "" +"The module adds google map field in partner address\n" +"so that we can directly open google map from the\n" +"url widget." +msgstr "" +"Ovaj Modul ubacuje sliku google map u partnerovoj adresi\n" +"tako da mozemo direktno da otvorimo google map iz tog\n" +"prozora." + +#. module: google_map +#: view:res.partner:0 +#: view:res.partner.address:0 +msgid "Map" +msgstr "mapa" diff --git a/addons/hr/board_hr_view.xml b/addons/hr/board_hr_view.xml index c740114789a..8e1a442e025 100644 --- a/addons/hr/board_hr_view.xml +++ b/addons/hr/board_hr_view.xml @@ -2,10 +2,6 @@ - @@ -32,6 +28,10 @@ menu - + diff --git a/addons/hr/hr.py b/addons/hr/hr.py index c05836c393a..240511a03a0 100644 --- a/addons/hr/hr.py +++ b/addons/hr/hr.py @@ -82,16 +82,23 @@ class hr_job(osv.osv): def _no_of_employee(self, cr, uid, ids, name, args, context=None): res = {} - for emp in self.browse(cr, uid, ids): - res[emp.id] = len(emp.employee_ids or []) + for job in self.browse(cr, uid, ids, context): + res[job.id] = len(job.employee_ids or []) + return res + + def _no_of_recruitement(self, cr, uid, ids, name, args, context=None): + res = {} + for job in self.browse(cr, uid, ids, context): + res[job.id] = job.expected_employees - job.no_of_employee return res _name = "hr.job" _description = "Job Description" _columns = { 'name': fields.char('Job Name', size=128, required=True, select=True), - 'expected_employees': fields.integer('Expected Employees', help='Required number of Employees'), - 'no_of_employee': fields.function(_no_of_employee, method=True, string='No of Employees', type='integer', help='Number of Employees selected'), + 'expected_employees': fields.integer('Expected Employees', help='Required number of Employees in total for that job.'), + 'no_of_employee': fields.function(_no_of_employee, method=True, string="No of Employee", help='Number of employee with that job.'), + 'no_of_recruitment': fields.function(_no_of_recruitement, method=True, string='Expected in Recruitment', readonly=True), 'employee_ids': fields.one2many('hr.employee', 'job_id', 'Employees'), 'description': fields.text('Job Description'), 'requirements': fields.text('Requirements'), @@ -102,9 +109,17 @@ class hr_job(osv.osv): _defaults = { 'expected_employees': 1, 'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'hr.job', context=c), - 'state': 'open' + 'state': 'open', } + def on_change_expected_employee(self, cr, uid, ids, expected_employee, no_of_employee, context=None): + if context is None: + context = {} + result={} + if expected_employee: + result['no_of_recruitment'] = expected_employee - no_of_employee + return {'value': result} + def job_old(self, cr, uid, ids, *args): self.write(cr, uid, ids, {'state': 'old'}) return True diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml index 2b1cd596024..9e807d43cab 100644 --- a/addons/hr/hr_view.xml +++ b/addons/hr/hr_view.xml @@ -2,8 +2,9 @@ - - + + @@ -324,8 +325,9 @@ - + + @@ -360,6 +362,7 @@ + diff --git a/addons/hr_attendance/__openerp__.py b/addons/hr_attendance/__openerp__.py index 3714050cbdb..8a52d0e2577 100644 --- a/addons/hr_attendance/__openerp__.py +++ b/addons/hr_attendance/__openerp__.py @@ -32,7 +32,6 @@ 'author': 'OpenERP SA', 'depends': ['hr'], 'update_xml': [ - 'security/hr_security.xml', 'security/ir.model.access.csv', 'hr_attendance_view.xml', 'hr_attendance_report.xml', diff --git a/addons/hr_attendance/report/attendance_by_month.py b/addons/hr_attendance/report/attendance_by_month.py index da761f3bb0c..c8d0378b971 100644 --- a/addons/hr_attendance/report/attendance_by_month.py +++ b/addons/hr_attendance/report/attendance_by_month.py @@ -80,11 +80,13 @@ class report_custom(report_rml): if attendences and attendences[-1]['action'] == 'sign_in': attendences.append({'name': tomor.strftime('%Y-%m-%d %H:%M:%S'), 'action':'sign_out'}) # sum up the attendances' durations + ldt = None for att in attendences: dt = datetime.strptime(att['name'], '%Y-%m-%d %H:%M:%S') - if att['action'] == 'sign_out': + if ldt and att['action'] == 'sign_out': wh += (dt - ldt).seconds/60/60 - ldt = dt + else: + ldt = dt # Week xml representation # wh = hour2str(wh) today_xml = '%s' % ((today - month).days+1, round(wh,2)) diff --git a/addons/hr_attendance/report/timesheet.py b/addons/hr_attendance/report/timesheet.py index abedddd50c5..ff759fb3eaf 100644 --- a/addons/hr_attendance/report/timesheet.py +++ b/addons/hr_attendance/report/timesheet.py @@ -79,10 +79,13 @@ class report_custom(report_rml): if attendances and attendances[-1]['action'] == 'sign_in': attendances.append({'name': n_monday.strftime('%Y-%m-%d %H:%M:%S'), 'action': 'sign_out'}) # sum up the attendances' durations + ldt = None for att in attendances: dt = datetime.strptime(att['name'], '%Y-%m-%d %H:%M:%S') - if att['action'] == 'sign_out': + if ldt and att['action'] == 'sign_out': week_wh[ldt.date().weekday()] = week_wh.get(ldt.date().weekday(), 0) + ((dt - ldt).seconds/3600) + else: + ldt = dt # Week xml representation week_repr = ['', '%s' % monday.strftime('%Y-%m-%d'), '%s' % n_monday.strftime('%Y-%m-%d')] diff --git a/addons/hr_attendance/security/hr_security.xml b/addons/hr_attendance/security/hr_security.xml deleted file mode 100644 index 39f923a895b..00000000000 --- a/addons/hr_attendance/security/hr_security.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/addons/hr_contract/__openerp__.py b/addons/hr_contract/__openerp__.py index 2851a9aa86b..aea686e4279 100755 --- a/addons/hr_contract/__openerp__.py +++ b/addons/hr_contract/__openerp__.py @@ -36,7 +36,6 @@ 'depends': ['hr'], 'init_xml': ['hr_contract_data.xml'], 'update_xml': [ - 'security/hr_contract_security.xml', 'security/ir.model.access.csv', 'hr_contract_view.xml' ], diff --git a/addons/hr_contract/security/hr_contract_security.xml b/addons/hr_contract/security/hr_contract_security.xml deleted file mode 100644 index 39f923a895b..00000000000 --- a/addons/hr_contract/security/hr_contract_security.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/addons/hr_evaluation/hr_evaluation.py b/addons/hr_evaluation/hr_evaluation.py index 960849bdfd4..20bd8a0b327 100644 --- a/addons/hr_evaluation/hr_evaluation.py +++ b/addons/hr_evaluation/hr_evaluation.py @@ -235,12 +235,12 @@ class hr_evaluation(osv.osv): hr_eval_inter_obj.survey_req_waiting_answer(cr, uid, [int_id], context=context) if (not wait) and phase.mail_feature: - body = phase.mail_body % {'employee_name': child.name, 'user_signature': user.signature, + body = phase.mail_body % {'employee_name': child.name, 'user_signature': child.user_id.signature, 'eval_name': phase.survey_id.title, 'date': time.strftime('%Y-%m-%d'), 'time': time } sub = phase.email_subject dest = [child.work_email] if dest: - tools.email_send(src, dest, sub, body) + tools.email_send(evaluation.employee_id.work_email, dest, sub, body) self.write(cr, uid, ids, {'state':'wait'}, context=context) return True @@ -267,7 +267,18 @@ class hr_evaluation(osv.osv): context = {} self.write(cr, uid, ids,{'state':'cancel'}, context=context) return True - + + def write(self, cr, uid, ids, vals, context=None): + if context is None: + context = {} + if 'date' in vals: + new_vals = {'date_deadline': vals.get('date')} + obj_hr_eval_iterview = self.pool.get('hr.evaluation.interview') + for evalutation in self.browse(cr, uid, ids, context=context): + for survey_req in evalutation.survey_request_ids: + obj_hr_eval_iterview.write(cr, uid, [survey_req.id], new_vals, context=context) + return super(hr_evaluation, self).write(cr, uid, ids, vals, context=context) + hr_evaluation() class survey_request(osv.osv): @@ -320,7 +331,7 @@ class hr_evaluation_interview(osv.osv): for id in self.browse(cr, uid, ids, context=context): flag = False wating_id = 0 - tot_done_req = 0 + tot_done_req = 1 if not id.evaluation_id.id: raise osv.except_osv(_('Warning !'),_("You cannot start evaluation without Evaluation.")) records = hr_eval_obj.browse(cr, uid, [id.evaluation_id.id], context=context)[0].survey_request_ids diff --git a/addons/hr_evaluation/i18n/ru.po b/addons/hr_evaluation/i18n/ru.po new file mode 100644 index 00000000000..343cc77f37c --- /dev/null +++ b/addons/hr_evaluation/i18n/ru.po @@ -0,0 +1,279 @@ +# Russian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-11-25 12:18+0000\n" +"PO-Revision-Date: 2010-10-16 08:48+0000\n" +"Last-Translator: Nikolay Chesnokov \n" +"Language-Team: Russian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: hr_evaluation +#: view:hr_evaluation.type:0 +#: field:hr_evaluation.type,info:0 +msgid "Information" +msgstr "Информация" + +#. module: hr_evaluation +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Название объекта должно начинаться с x_ и не должно содержать специальных " +"символов !" + +#. module: hr_evaluation +#: view:hr_evaluation.evaluation:0 +msgid "Schedule next evaluation" +msgstr "Расписание следующей оценки" + +#. module: hr_evaluation +#: view:hr_evaluation.evaluation:0 +#: field:hr_evaluation.evaluation,info_bad:0 +msgid "Bad Points" +msgstr "Плохие моменты" + +#. module: hr_evaluation +#: model:ir.actions.act_window,name:hr_evaluation.open_view_employee_evaluation_next_my_list +msgid "My Next Evaluation" +msgstr "Моя следуюшая оценка" + +#. module: hr_evaluation +#: field:hr_evaluation.type,value_ids:0 +msgid "Values" +msgstr "Значения" + +#. module: hr_evaluation +#: view:hr_evaluation.evaluation:0 +#: field:hr_evaluation.evaluation,info_good:0 +msgid "Good Points" +msgstr "Хорошие моменты" + +#. module: hr_evaluation +#: field:hr_evaluation.evaluation,state:0 +msgid "State" +msgstr "Статус" + +#. module: hr_evaluation +#: field:hr_evaluation.evaluation,score:0 +#: field:hr_evaluation.quote,score:0 +#: field:hr_evaluation.type,score:0 +#: field:hr_evaluation.type.value,score:0 +msgid "Score" +msgstr "Оценка" + +#. module: hr_evaluation +#: selection:hr_evaluation.evaluation,state:0 +msgid "Draft" +msgstr "Черновик" + +#. module: hr_evaluation +#: view:hr_evaluation.evaluation:0 +msgid "Informal Data" +msgstr "Неофициальные данные" + +#. module: hr_evaluation +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Недопустимое имя модели в определении действия." + +#. module: hr_evaluation +#: field:hr_evaluation.evaluation,employee_id:0 +msgid "Employee" +msgstr "Сотрудник" + +#. module: hr_evaluation +#: view:hr_evaluation.evaluation:0 +#: field:hr_evaluation.evaluation,info_improve:0 +msgid "To Improve" +msgstr "Улучшить" + +#. module: hr_evaluation +#: field:hr_evaluation.quote,evaluation_id:0 +msgid "Evaluation" +msgstr "Оценка" + +#. module: hr_evaluation +#: field:hr_evaluation.type.value,type_id:0 +msgid "Evaluation Type" +msgstr "Тип оценки" + +#. module: hr_evaluation +#: view:hr_evaluation.evaluation:0 +msgid "Status" +msgstr "Статус" + +#. module: hr_evaluation +#: view:hr_evaluation.type:0 +msgid "Apply to categories" +msgstr "Применить категории" + +#. module: hr_evaluation +#: model:ir.module.module,description:hr_evaluation.module_meta_information +msgid "Ability to create employees evaluation." +msgstr "Возможность создания оценки сотрудников." + +#. module: hr_evaluation +#: field:hr_evaluation.quote,name:0 +msgid "Quote" +msgstr "Цитата" + +#. module: hr_evaluation +#: field:hr_evaluation.type,category_ids:0 +msgid "Appliable Role" +msgstr "Гибкость роли" + +#. module: hr_evaluation +#: field:hr_evaluation.evaluation,user_id:0 +msgid "Evaluation User" +msgstr "Оценка пользователя" + +#. module: hr_evaluation +#: view:hr_evaluation.type:0 +msgid "Choices Results" +msgstr "Результаты выбора" + +#. module: hr_evaluation +#: field:hr_evaluation.evaluation,date:0 +msgid "Date" +msgstr "Дата" + +#. module: hr_evaluation +#: model:ir.ui.menu,name:hr_evaluation.menu_eval_hr +#: model:ir.ui.menu,name:hr_evaluation.menu_open_view_employee_evaluation_form +msgid "Evaluations" +msgstr "Оценки" + +#. module: hr_evaluation +#: model:ir.ui.menu,name:hr_evaluation.menu_eval_config +msgid "Configuration" +msgstr "Конфигурация" + +#. module: hr_evaluation +#: model:ir.ui.menu,name:hr_evaluation.menu_open_view_employee_evaluation_next_list +msgid "Next Evaluations" +msgstr "Последующие оценки" + +#. module: hr_evaluation +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Неправильный XML для просмотра архитектуры!" + +#. module: hr_evaluation +#: model:ir.ui.menu,name:hr_evaluation.menu_open_view_evaluation_type_form +msgid "Evaluation Criterions" +msgstr "Критерии оценки" + +#. module: hr_evaluation +#: model:ir.ui.menu,name:hr_evaluation.menu_open_view_employee_my_old_evaluation_list +msgid "My Preceeding Evaluations" +msgstr "Мои предыдущие оценки" + +#. module: hr_evaluation +#: model:ir.ui.menu,name:hr_evaluation.menu_resp_hr +msgid "HR Responsible" +msgstr "" + +#. module: hr_evaluation +#: field:hr_evaluation.quote,value_id:0 +#: field:hr_evaluation.type.value,name:0 +msgid "Value" +msgstr "" + +#. module: hr_evaluation +#: field:hr_evaluation.evaluation,name:0 +msgid "Summary" +msgstr "" + +#. module: hr_evaluation +#: field:hr_evaluation.type,active:0 +msgid "Active" +msgstr "" + +#. module: hr_evaluation +#: view:hr_evaluation.type:0 +msgid "Notes" +msgstr "" + +#. module: hr_evaluation +#: view:hr_evaluation.evaluation:0 +#: model:ir.model,name:hr_evaluation.model_hr_evaluation_evaluation +msgid "Employee Evaluation" +msgstr "" + +#. module: hr_evaluation +#: model:ir.model,name:hr_evaluation.model_hr_evaluation_type +msgid "Employee Evaluation Type" +msgstr "" + +#. module: hr_evaluation +#: view:hr_evaluation.evaluation:0 +msgid "Quotations" +msgstr "" + +#. module: hr_evaluation +#: model:ir.actions.act_window,name:hr_evaluation.open_view_employee_evaluation_next_list +msgid "Next Employee Evaluation" +msgstr "" + +#. module: hr_evaluation +#: field:hr_evaluation.quote,type_id:0 +msgid "Type" +msgstr "" + +#. module: hr_evaluation +#: view:hr_evaluation.type:0 +#: field:hr_evaluation.type,name:0 +msgid "Evaluation Criterion" +msgstr "" + +#. module: hr_evaluation +#: model:ir.ui.menu,name:hr_evaluation.menu_open_view_employee_evaluation_next_my_list +msgid "My Next Evaluations" +msgstr "" + +#. module: hr_evaluation +#: view:hr_evaluation.quote:0 +msgid "Evalution Quote" +msgstr "" + +#. module: hr_evaluation +#: model:ir.module.module,shortdesc:hr_evaluation.module_meta_information +msgid "Human Resources Evaluation" +msgstr "" + +#. module: hr_evaluation +#: field:hr_evaluation.evaluation,quote_ids:0 +msgid "Quotes" +msgstr "" + +#. module: hr_evaluation +#: view:hr_evaluation.evaluation:0 +#: selection:hr_evaluation.evaluation,state:0 +msgid "Done" +msgstr "" + +#. module: hr_evaluation +#: model:ir.model,name:hr_evaluation.model_hr_evaluation_quote +msgid "Employee Evaluation Quote" +msgstr "" + +#. module: hr_evaluation +#: view:hr_evaluation.evaluation:0 +#: field:hr_evaluation.evaluation,info_employee:0 +msgid "Employee Response" +msgstr "" + +#. module: hr_evaluation +#: model:ir.model,name:hr_evaluation.model_hr_evaluation_type_value +msgid "Evaluation Type Value" +msgstr "" diff --git a/addons/hr_evaluation/wizard/hr_evaluation_mail.py b/addons/hr_evaluation/wizard/hr_evaluation_mail.py index 576c782bfd8..3464c4beaee 100644 --- a/addons/hr_evaluation/wizard/hr_evaluation_mail.py +++ b/addons/hr_evaluation/wizard/hr_evaluation_mail.py @@ -29,14 +29,14 @@ class hr_evaluation_reminder(osv.osv_memory): } def send_mail(self, cr, uid, ids, context=None): - hr_evaluation_obj = self.pool.get('hr_evaluation.evaluation') + hr_evaluation_interview_obj = self.pool.get('hr.evaluation.interview') if context is None: context = {} evaluation_data = self.read(cr, uid, ids, context=context)[0] - for waiting_id in hr_evaluation_obj.browse(cr, uid, evaluation_data['evaluation_id'], context=context).survey_request_ids: - if waiting_id.state == "waiting_answer" and waiting_id.user_to_review_id.work_email : - msg = " Hello %s, \n\n Kindly post your response for %s survey. \n\n Thanks," %(waiting_id.user_to_review_id.name, waiting_id.survey_id.title) - tools.email_send(tools.config['email_from'], [waiting_id.user_to_review_id.work_email],\ + current_interview = hr_evaluation_interview_obj.browse(cr, uid, evaluation_data.get('evaluation_id')) + if current_interview.state == "waiting_answer" and current_interview.user_to_review_id.work_email : + msg = " Hello %s, \n\n Kindly post your response for '%s' survey interview. \n\n Thanks," %(current_interview.user_to_review_id.name, current_interview.survey_id.title) + tools.email_send(tools.config['email_from'], [current_interview.user_to_review_id.work_email],\ 'Reminder to fill up Survey', msg) return {'type': 'ir.actions.act_window_close'} diff --git a/addons/hr_expense/board_hr_expense_view.xml b/addons/hr_expense/board_hr_expense_view.xml index e79f581dce0..4b64a1bdf19 100644 --- a/addons/hr_expense/board_hr_expense_view.xml +++ b/addons/hr_expense/board_hr_expense_view.xml @@ -2,7 +2,7 @@ - + [('state','in',('confirm', 'accepted')),('user_id','=',uid)] - + board.hr.expense.form board.board - + form - + diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index 0679fee37b1..143d27f2d9b 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -226,7 +226,7 @@ class hr_expense_line(osv.osv): return res _columns = { - 'name': fields.char('Short Description', size=128, required=True), + 'name': fields.char('Expense Note', size=128, required=True), 'date_value': fields.date('Date', required=True), 'expense_id': fields.many2one('hr.expense.expense', 'Expense', ondelete='cascade', select=True), 'total_amount': fields.function(_amount, method=True, string='Total'), diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml index 3d92a76a3c3..9eb073ce52e 100644 --- a/addons/hr_expense/hr_expense_view.xml +++ b/addons/hr_expense/hr_expense_view.xml @@ -16,7 +16,7 @@ - + @@ -68,10 +68,9 @@ - + - - + @@ -81,17 +80,23 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -99,8 +104,8 @@ - - + + diff --git a/addons/hr_expense/report/hr_expense_report_view.xml b/addons/hr_expense/report/hr_expense_report_view.xml index 70b8625d7b6..0d94204f426 100644 --- a/addons/hr_expense/report/hr_expense_report_view.xml +++ b/addons/hr_expense/report/hr_expense_report_view.xml @@ -95,7 +95,7 @@ - + diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index eca3c02f301..79710a569fb 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -240,8 +240,7 @@ class hr_holidays(osv.osv): if record.case_id: self.pool.get('crm.meeting').unlink(cr, uid, [record.case_id.id]) if record.linked_request_ids: - list_ids = [] - [list_ids.append(i) for id in record.linked_request_ids] + list_ids = [ lr.id for lr in record.linked_request_ids] self.holidays_cancel(cr, uid, list_ids) self.unlink(cr, uid, list_ids) diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index b5380c4e5a9..0d78af87975 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -137,7 +137,7 @@ - + diff --git a/addons/hr_holidays/report/available_holidays_view.xml b/addons/hr_holidays/report/available_holidays_view.xml index ac607b6c78a..374e6300cd0 100644 --- a/addons/hr_holidays/report/available_holidays_view.xml +++ b/addons/hr_holidays/report/available_holidays_view.xml @@ -88,7 +88,7 @@ - Available Holidays + Leaves Analysis available.holidays.report form tree,graph @@ -110,7 +110,7 @@ - + diff --git a/addons/hr_holidays/report/holidays_summary.xsl b/addons/hr_holidays/report/holidays_summary.xsl index 67bb2a58769..c0a24e551ff 100644 --- a/addons/hr_holidays/report/holidays_summary.xsl +++ b/addons/hr_holidays/report/holidays_summary.xsl @@ -4,257 +4,257 @@ xmlns:fo="http://www.w3.org/1999/XSL/Format"> - + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0, - - - - 0, - - - - - - - - - - - - - - - lightgrey - - - ,0 - - - - ,-1 - - - - - - - - - - - - - - - - , - - - - - , - - - - - - - - - - - - lightgrey - - 0, - - - - 0, - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0, + + + + 0, + + + + + + + + + + + + + + + lightgrey + + + ,0 + + + + ,-1 + + + + + + + + + + + + + + + + , + + + + + , + + + + + + + + + + + + lightgrey + + 0, + + + + 0, + + + + + + + + + + + + - - - 13.7cm,13.7cm - - - header - - - - - - - - - - - - - - - - Off-Days' Summary - - Analyze from to of the holidays. - - - 0.7cm,5.0cm - - - products - - - Month - - - - - - - - - - - month - - - - - - - - - - - - - employee - Departments & Employees - - - - digits - - - - Sum + + + 13.7cm,13.7cm + + + header + + + + + + + + + + + + - - - - - - - - - - - dept - - - normal - - - - - - - - - digits - - + + + Off-Days' Summary + + Analyze from to of the holidays. + + + 0.7cm,5.0cm + + + products + + + Month + + + + + + + + - - - - sum - - + + month + + + + + + + + + + + + + employee + Departments and Employees + + + + digits + + + + Sum + + + + + + + + + + + + dept + + + normal + + + + + + + + + digits + + - - - - - legend - - - Color - Holiday Type + + + + sum + + - - - - - - digits - - - - - - normal - - - + + + + + legend + + + Color + Holiday Type + + + + + + + digits + + + + + + normal + + + - - + + diff --git a/addons/hr_holidays/report/hr_holidays_report.py b/addons/hr_holidays/report/hr_holidays_report.py index 5d2dc27c0de..f7b813f9cc5 100644 --- a/addons/hr_holidays/report/hr_holidays_report.py +++ b/addons/hr_holidays/report/hr_holidays_report.py @@ -22,67 +22,6 @@ import tools from osv import fields,osv -class hr_holidays_report(osv.osv): - _name = "hr.holidays.report" - _description = "Leaves Statistics By Employee and category" - _auto = False - _rec_name = 'date' - _columns = { - 'date': fields.date('Date', readonly=True), - 'delay_approve': fields.float('Delay to Approve', digits=(16,2),readonly=True), - 'year': fields.char('Year', size=4, readonly=True), - 'day': fields.char('Day', size=15, 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_from' : fields.datetime('Start Date', readonly=True), - 'date_to' : fields.datetime('End Date', readonly=True), - 'number_of_days_temp': fields.float('Number of Days', readonly=True), - 'employee_id' : fields.many2one('hr.employee', "Employee's Name", readonly=True), - 'category_id' : fields.many2one('hr.employee.category', "Category's Name", readonly=True), - 'user_id':fields.many2one('res.users', 'User', readonly=True), - 'holiday_status_id' : fields.many2one("hr.holidays.status", "Leave Type",readonly=True), - 'department_id':fields.many2one('hr.department','Department',readonly=True), - 'state': fields.selection([('draft', 'Draft'), - ('confirm', 'Waiting Validation'), - ('refuse', 'Refused'), - ('validate', 'Validated'), - ('cancel', 'Cancelled')] - ,'State', readonly=True), - } - _order = 'date desc' - def init(self, cr): - tools.drop_view_if_exists(cr, 'hr_holidays_report') - cr.execute(""" - create or replace view hr_holidays_report as ( - select - min(s.id) as id, - date_trunc('day',s.create_date) as date, - date_trunc('day',s.date_from) as date_from, - date_trunc('day',s.date_to) as date_to, - sum(s.number_of_days_temp) as number_of_days_temp, - s.employee_id, - s.category_id, - s.user_id as user_id, - to_char(s.date_from, 'YYYY') as year, - to_char(s.date_from, 'MM') as month, - to_char(s.date_from, 'YYYY-MM-DD') as day, - s.holiday_status_id, - s.department_id, - s.state, - avg(extract('epoch' from age(s.create_date,CURRENT_DATE)))/(3600*24) as delay_approve - from - hr_holidays s - WHERE type='remove' - GROUP BY - s.create_date,s.state,s.date_from,s.date_to, - s.employee_id,s.user_id,s.holiday_status_id, - s.department_id, s.category_id - ) - """) - -hr_holidays_report() - class hr_holidays_remaining_leaves_user(osv.osv): _name = "hr.holidays.remaining.leaves.user" _description = "Total holidays by type" diff --git a/addons/hr_holidays/report/hr_holidays_report_view.xml b/addons/hr_holidays/report/hr_holidays_report_view.xml index e59cf852366..51ff25fea75 100644 --- a/addons/hr_holidays/report/hr_holidays_report_view.xml +++ b/addons/hr_holidays/report/hr_holidays_report_view.xml @@ -2,111 +2,6 @@ - - hr.holidays.report.tree - hr.holidays.report - tree - - - - - - - - - - - - - - - - - - - - - - hr.holidays.report.graph - hr.holidays.report - graph - - - - - - - - - - - hr.holidays.report.search - hr.holidays.report - search - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Leaves Analysis - hr.holidays.report - form - tree,graph - {'search_default_Employee':1,'search_default_department':1,"search_default_Validated":1, 'group_by':[], 'group_by_no_leaf':1} - - - - - hr.holidays.remaining.leaves.user.tree hr.holidays.remaining.leaves.user diff --git a/addons/hr_holidays/security/ir.model.access.csv b/addons/hr_holidays/security/ir.model.access.csv index 20da4832fe2..f350b73ed64 100644 --- a/addons/hr_holidays/security/ir.model.access.csv +++ b/addons/hr_holidays/security/ir.model.access.csv @@ -2,6 +2,5 @@ "access_hr_holydays_status_user","hr.holidays.status user","model_hr_holidays_status","base.group_hr_user",1,1,1,1 "access_hr_holidays_user","hr.holidays.user","model_hr_holidays","base.group_hr_user",1,1,1,1 "access_hr_holidays_remain_user","hr.holidays.ramain.user","model_hr_holidays_remaining_leaves_user","base.group_hr_user",1,1,1,1 -"access_hr_holidays_report_manager","hr.holidays.report.manager","model_hr_holidays_report","base.group_hr_manager",1,1,1,1 "access_resource_calendar_leaves_manager","resource_calendar_leaves_manager","resource.model_resource_calendar_leaves","base.group_hr_manager",1,1,1,1 "access_available_holidays_report_user","hr.available.holidays.report.user","model_available_holidays_report","base.group_hr_user",1,1,1,1 diff --git a/addons/hr_payroll/__openerp__.py b/addons/hr_payroll/__openerp__.py index c9339ce013c..65b593c5891 100644 --- a/addons/hr_payroll/__openerp__.py +++ b/addons/hr_payroll/__openerp__.py @@ -33,7 +33,7 @@ * Monthly Payroll Register * Integrated with Holiday Management """, - 'author':'OpenERP SA/Axelor', + 'author':'OpenERP SA', 'website':'http://www.openerp.com', 'depends': [ 'hr', diff --git a/addons/hr_payroll/report/payroll_register.rml b/addons/hr_payroll/report/payroll_register.rml index e28353ecea9..7ad99b46502 100644 --- a/addons/hr_payroll/report/payroll_register.rml +++ b/addons/hr_payroll/report/payroll_register.rml @@ -1,8 +1,8 @@ - - + + - + @@ -10,10 +10,6 @@ - - - - @@ -29,6 +25,14 @@ + + + + + + + + @@ -91,30 +95,16 @@ - - - - Number - - - [[o.number]] - - - Date - - - [[formatLang(time.strftime('%Y-%m-%d'), date = True)]] - - - + Number : [[o.number]] + Date : [[formatLang(time.strftime('%Y-%m-%d'), date = True)]] + + + - - - - + # @@ -142,13 +132,10 @@ - - - [[repeatIn(o.line_ids, 'l')]] - + [[ get_no() ]] @@ -157,30 +144,27 @@ [[ l.employee_id.name ]] - [[ formatLang(l.basic) ]] [[ company.currency_id.symbol]] + [[ formatLang(l.basic) ]] [[ (company.currency_id and company.currency_id.symbol) or '']] - [[ formatLang(l.other_pay)]] [[ company.currency_id.symbol]] + [[ formatLang(l.other_pay)]] [[ (company.currency_id and company.currency_id.symbol) or '']] - [[ formatLang(l.allounce)]] [[ company.currency_id.symbol]] + [[ formatLang(l.allounce)]] [[ (company.currency_id and company.currency_id.symbol) or '']] - [[ formatLang(l.grows)]] [[ company.currency_id.symbol]] + [[ formatLang(l.grows)]] [[ (company.currency_id and company.currency_id.symbol) or '']] - [[ formatLang(l.deduction)]] [[ company.currency_id.symbol]] + [[ formatLang(l.deduction)]] [[ (company.currency_id and company.currency_id.symbol) or '']] - [[ formatLang(l.net)]] [[ company.currency_id.symbol]] + [[ formatLang(l.net)]] [[ (company.currency_id and company.currency_id.symbol) or '']] - - - - + @@ -191,22 +175,22 @@ Total Salary - [[formatLang(get_basic(o))]][[ company.currency_id.symbol]] + [[formatLang(get_basic(o))]][[ (company.currency_id and company.currency_id.symbol) or '']] - [[formatLang(get_other(o))]] [[ company.currency_id.symbol]] + [[formatLang(get_other(o))]] [[ (company.currency_id and company.currency_id.symbol) or '']] - [[formatLang(get_allow(o))]] [[ company.currency_id.symbol]] + [[formatLang(get_allow(o))]] [[ (company.currency_id and company.currency_id.symbol) or '']] - [[formatLang(get_grows(o))]] [[ company.currency_id.symbol]] + [[formatLang(get_grows(o))]] [[ (company.currency_id and company.currency_id.symbol) or '']] - [[formatLang(get_deduct(o))]] [[ company.currency_id.symbol]] + [[formatLang(get_deduct(o))]] [[ (company.currency_id and company.currency_id.symbol) or '']] - [[formatLang(get_net(o))]] [[ company.currency_id.symbol]] + [[formatLang(get_net(o))]] [[ (company.currency_id and company.currency_id.symbol) or '']] @@ -216,7 +200,7 @@ - + For [[company.name]], @@ -243,4 +227,4 @@ - + \ No newline at end of file diff --git a/addons/hr_payroll/report/report_employees_detail.rml b/addons/hr_payroll/report/report_employees_detail.rml index 6d8e6b18fc8..a74ca7ee6f8 100644 --- a/addons/hr_payroll/report/report_employees_detail.rml +++ b/addons/hr_payroll/report/report_employees_detail.rml @@ -1,6 +1,6 @@ - - + + @@ -202,8 +202,6 @@ - - @@ -264,7 +262,7 @@ - Employees Salary Details + Employees Salary Details From [[ formatLang(data['form']['date_from'], date=True) ]] To [[ formatLang(data['form']['date_to'], date=True) ]] @@ -342,8 +340,8 @@ - [[ repeatIn(get_periods(data['form']),'m') ]] [[ get_employee_detail(o) ]] - + [[ repeatIn(get_periods(data['form']),'m') ]] [[ get_employee_detail(o) ]] + Title @@ -396,52 +394,76 @@ - Allowances with Basic: + Allowances with Basic: [[ repeatIn(get_allow(),'e1') ]] - + [[ e1[0] ]] - [[ formatLang(e1[1]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e1[1]!='' and formatLang(e1[1])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e1[2]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e1[2]!='' and formatLang(e1[2])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e1[3]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e1[3]!='' and formatLang(e1[3])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e1[4]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e1[4]!='' and formatLang(e1[4])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e1[5]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e1[5]!='' and formatLang(e1[5])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e1[6]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e1[6]!='' and formatLang(e1[6])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e1[7]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e1[7]!='' and formatLang(e1[7])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e1[8]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e1[8]!='' and formatLang(e1[8])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e1[9]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e1[9]!='' and formatLang(e1[9])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e1[10]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e1[10]!='' and formatLang(e1[10])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e1[11]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e1[11]!='' and formatLang(e1[11])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e1[12]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e1[12]!='' and formatLang(e1[12])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + [[ formatLang(e1[13]) ]] [[ company.currency_id.symbol ]] @@ -452,52 +474,76 @@ - Deductions: + Deductions: [[ repeatIn(get_deduct(),'e2') ]] - + [[ e2[0] ]] - [[ formatLang(e2[1]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e2[1]!='' and formatLang(e2[1])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e2[2]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e2[2]!='' and formatLang(e2[2])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e2[3]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e2[3]!='' and formatLang(e2[3])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e2[4]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e2[4]!='' and formatLang(e2[4])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e2[5]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e2[5]!='' and formatLang(e2[5])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e2[6]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e2[6]!='' and formatLang(e2[6])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e2[7]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e2[7]!='' and formatLang(e2[7])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e2[8]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e2[8]!='' and formatLang(e2[8])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e2[9]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e2[9]!='' and formatLang(e2[9])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e2[10]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e2[10]!='' and formatLang(e2[10])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e2[11]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e2[11]!='' and formatLang(e2[11])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e2[12]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e2[12]!='' and formatLang(e2[12])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + [[ formatLang(e2[13]) ]] [[ company.currency_id.symbol ]] @@ -508,52 +554,76 @@ - Others: + Others: [[ repeatIn(get_other(),'e3') ]] - + [[ e3[0] ]] - [[ formatLang(e3[1]) or removeParentNode('para') ]] [[ company.currency_id.symbol ]] + + [[ (e3[1]!='' and formatLang(e3[1])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e3[2]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e3[2]!='' and formatLang(e3[2])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e3[3]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e3[3]!='' and formatLang(e3[3])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e3[4]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e3[4]!='' and formatLang(e3[4])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e3[5]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e3[5]!='' and formatLang(e3[5])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e3[6]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e3[6]!='' and formatLang(e3[6])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e3[7]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e3[7]!='' and formatLang(e3[7])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e3[8]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e3[8]!='' and formatLang(e3[8])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e3[9]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e3[9]!='' and formatLang(e3[9])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e3[10]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e3[10]!='' and formatLang(e3[10])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e3[11]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e3[11]!='' and formatLang(e3[11])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e3[12]) or removeParentNode('para')]] [[ company.currency_id.symbol ]] + + [[ (e3[12]!='' and formatLang(e3[12])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + [[ formatLang(e3[13]) ]] [[ company.currency_id.symbol ]] @@ -562,7 +632,7 @@ - + [[ get_monthly_total()[0] ]] @@ -608,12 +678,6 @@ - - - - - - - + \ No newline at end of file diff --git a/addons/hr_payroll/report/report_payroll_advice.rml b/addons/hr_payroll/report/report_payroll_advice.rml index 8fe18772c2f..18f56cc9883 100644 --- a/addons/hr_payroll/report/report_payroll_advice.rml +++ b/addons/hr_payroll/report/report_payroll_advice.rml @@ -1,6 +1,6 @@ - - + + @@ -41,6 +41,12 @@ + + + + + + @@ -212,9 +218,6 @@ - - - [[ repeatIn(get_detail(o.line_ids),'line') ]] @@ -229,10 +232,10 @@ [[ line['name'] ]] - [[ formatLang(line['amount' ]) ]] [[ company.currency_id.symbol ]] + [[ formatLang(line['amount' ]) ]] [[ (company.currency_id and company.currency_id.symbol) or '' ]] - [[ formatLang(line['bysal']) ]] [[ company.currency_id.symbol ]] + [[ formatLang(line['bysal']) ]] [[ (company.currency_id and company.currency_id.symbol) or '' ]] [[ line['acc_no'] ]] @@ -242,13 +245,7 @@ - - - - - - @@ -257,13 +254,13 @@ - Total([[ company.currency_id.code ]]): + Total: - [[ formatLang(get_total()) ]] [[ company.currency_id.symbol ]] + [[ formatLang(get_total()) ]] [[ (company.currency_id and company.currency_id.symbol) or '' ]] - [[ formatLang(get_bysal_total()) ]] [[ company.currency_id.symbol ]] + [[ formatLang(get_bysal_total()) ]] [[ (company.currency_id and company.currency_id.symbol) or '' ]] @@ -338,4 +335,4 @@ - + \ No newline at end of file diff --git a/addons/hr_payroll/report/report_year_report.rml b/addons/hr_payroll/report/report_year_report.rml index da988e94f7e..d121ce0dd98 100755 --- a/addons/hr_payroll/report/report_year_report.rml +++ b/addons/hr_payroll/report/report_year_report.rml @@ -1,6 +1,6 @@ - - + + @@ -201,40 +201,64 @@ [[ e[0] ]] - [[ formatLang(e[1]) or removeParentNode('para') ]] [[company.currency_id.symbol]] + + [[ (e[1]!='' and formatLang(e[1])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e[2]) or removeParentNode('para') ]] [[company.currency_id.symbol]] + + [[ (e[2]!='' and formatLang(e[2])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e[3]) or removeParentNode('para')]] [[company.currency_id.symbol]] + + [[ (e[3]!='' and formatLang(e[3])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e[4]) or removeParentNode('para') ]] [[company.currency_id.symbol]] + + [[ (e[4]!='' and formatLang(e[4])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e[5]) or removeParentNode('para')]] [[company.currency_id.symbol]] + + [[ (e[5]!='' and formatLang(e[5])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e[6]) or removeParentNode('para')]] [[company.currency_id.symbol]] + + [[ (e[6]!='' and formatLang(e[6])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e[7]) or removeParentNode('para')]] [[company.currency_id.symbol]] + + [[ (e[7]!='' and formatLang(e[7])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e[8]) or removeParentNode('para')]] [[company.currency_id.symbol]] + + [[ (e[8]!='' and formatLang(e[8])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e[9]) or removeParentNode('para')]] [[company.currency_id.symbol]] + + [[ (e[9]!='' and formatLang(e[9])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e[10]) or removeParentNode('para')]] [[company.currency_id.symbol]] + + [[ (e[10]!='' and formatLang(e[10])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e[11]) or removeParentNode('para')]] [[company.currency_id.symbol]] + + [[ (e[11]!='' and formatLang(e[11])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + - [[ formatLang(e[12]) or removeParentNode('para')]] [[company.currency_id.symbol]] + + [[ (e[12]!='' and formatLang(e[12])) or removeParentNode('font') ]] [[company.currency_id.symbol]] + [[ formatLang(e[13]) ]] [[company.currency_id.symbol]] @@ -296,4 +320,4 @@ - + \ No newline at end of file diff --git a/addons/hr_payroll/report/rml_parse.py b/addons/hr_payroll/report/rml_parse.py index 7abb29711b6..0eb783de39f 100755 --- a/addons/hr_payroll/report/rml_parse.py +++ b/addons/hr_payroll/report/rml_parse.py @@ -68,7 +68,7 @@ class rml_parse(report_sxw.rml_parse): def _get_and_change_date_format_for_swiss (self,date_to_format): date_formatted='' if date_to_format: - date_formatted = strptime (date_to_format,'%Y-%m-%d').strftime('%d.%m.%Y') + date_formatted = strptime(date_to_format,'%Y-%m-%d').strftime('%d.%m.%Y') return date_formatted def _explode_name(self,chaine,length): @@ -107,7 +107,7 @@ class rml_parse(report_sxw.rml_parse): return Stringer def explode_this(self,chaine,length): - chaine = rstrip(chaine) + chaine = chaine.rstrip() ast = list(chaine) i = length while i <= len(ast): diff --git a/addons/hr_payroll_account/__openerp__.py b/addons/hr_payroll_account/__openerp__.py index 97ae94a361c..d65570a1ad9 100644 --- a/addons/hr_payroll_account/__openerp__.py +++ b/addons/hr_payroll_account/__openerp__.py @@ -28,7 +28,7 @@ * Payment Encoding * Company Contribution Management """, - 'author':'OpenERP SA/Axelor', + 'author':'OpenERP SA', 'website':'http://www.openerp.com', 'depends': [ 'hr_payroll', diff --git a/addons/hr_payroll_account/hr_payroll_account.py b/addons/hr_payroll_account/hr_payroll_account.py index dcef94c3f35..d9f963ed537 100644 --- a/addons/hr_payroll_account/hr_payroll_account.py +++ b/addons/hr_payroll_account/hr_payroll_account.py @@ -28,8 +28,6 @@ from osv import fields, osv from tools import config from tools.translate import _ - - def prev_bounds(cdate=False): when = date.fromtimestamp(time.mktime(time.strptime(cdate,"%Y-%m-%d"))) this_first = date(when.year, when.month, 1) @@ -572,8 +570,9 @@ class hr_payslip(osv.osv): line_ids += [movel_pool.create(cr, uid, rec, context=context)] - for contrub in line.category_id.contribute_ids: - print contrib.name, contrub.code, contrub.amount_type, contrib.contribute_per, line.total + # if self._debug: + # for contrib in line.category_id.contribute_ids: + # _log.debug("%s %s %s %s %s", contrib.name, contrub.code, contrub.amount_type, contrib.contribute_per, line.total) adj_move_id = False if total_deduct > 0: diff --git a/addons/hr_recruitment/board_hr_recruitment_statistical_view.xml b/addons/hr_recruitment/board_hr_recruitment_statistical_view.xml index 7416ff8b0ab..0cf34e36de4 100644 --- a/addons/hr_recruitment/board_hr_recruitment_statistical_view.xml +++ b/addons/hr_recruitment/board_hr_recruitment_statistical_view.xml @@ -38,7 +38,7 @@ - + form - + diff --git a/addons/hr_recruitment/report/hr_recruitment_report_view.xml b/addons/hr_recruitment/report/hr_recruitment_report_view.xml index f5e74724c25..a38cf0185df 100644 --- a/addons/hr_recruitment/report/hr_recruitment_report_view.xml +++ b/addons/hr_recruitment/report/hr_recruitment_report_view.xml @@ -49,39 +49,39 @@ search - - - - - - - - + + + + + + + + - - - + icon="terp-camera_test" + domain="[('state','=','done')]" + help = "Hired employees"/> + + + - - + + - - - + + + @@ -130,7 +130,7 @@ {'search_default_month':1,'search_default_department':1,'group_by_no_leaf':1,'group_by':[]} - + diff --git a/addons/hr_recruitment/wizard/hr_recruitment_phonecall.py b/addons/hr_recruitment/wizard/hr_recruitment_phonecall.py index 7cb5366a275..6e817eaf49a 100644 --- a/addons/hr_recruitment/wizard/hr_recruitment_phonecall.py +++ b/addons/hr_recruitment/wizard/hr_recruitment_phonecall.py @@ -42,8 +42,10 @@ class job2phonecall(osv.osv_memory): return case.user_id and case.user_id.id or False def _date_category(self, cr, uid, context=None): + case_obj = self.pool.get('hr.applicant') if context is None: context = {} + case = case_obj.browse(cr, uid, context['active_id'], context=context) categ_id = self.pool.get('crm.case.categ').search(cr, uid, [('name','=','Outbound')], context=context) return categ_id and categ_id[0] or case.categ_id and case.categ_id.id or False diff --git a/addons/hr_timesheet/hr_timesheet.py b/addons/hr_timesheet/hr_timesheet.py index 84e7db409ab..20d97634214 100644 --- a/addons/hr_timesheet/hr_timesheet.py +++ b/addons/hr_timesheet/hr_timesheet.py @@ -23,7 +23,6 @@ import time from osv import fields from osv import osv -from osv.orm import except_orm from tools.translate import _ class hr_employee(osv.osv): @@ -39,7 +38,7 @@ class hr_employee(osv.osv): try: result = md.get_object_reference(cr, uid, 'hr_timesheet', 'analytic_journal') return result[1] - except ValueError, e: + except ValueError: pass return False @@ -48,7 +47,7 @@ class hr_employee(osv.osv): try: result = md.get_object_reference(cr, uid, 'hr_timesheet', 'product_consultant') return result[1] - except ValueError, e: + except ValueError: pass return False @@ -87,7 +86,9 @@ class hr_analytic_timesheet(osv.osv): if prod_id and unit_amount: # find company company_id = self.pool.get('res.company')._company_default_get(cr, uid, 'account.analytic.line', context=context) - res.update(self.pool.get('account.analytic.line').on_change_unit_amount(cr, uid, id, prod_id, unit_amount, company_id, unit, journal_id, context=context)) + r = self.pool.get('account.analytic.line').on_change_unit_amount(cr, uid, id, prod_id, unit_amount, company_id, unit, journal_id, context=context) + if r: + res.update(r) # update unit of measurement if prod_id: uom = self.pool.get('product.product').browse(cr, uid, prod_id, context=context) diff --git a/addons/hr_timesheet/hr_timesheet_data.xml b/addons/hr_timesheet/hr_timesheet_data.xml index e7cb3d5e0d4..a19b2c67291 100644 --- a/addons/hr_timesheet/hr_timesheet_data.xml +++ b/addons/hr_timesheet/hr_timesheet_data.xml @@ -18,5 +18,10 @@ + + + + + diff --git a/addons/hr_timesheet/hr_timesheet_view.xml b/addons/hr_timesheet/hr_timesheet_view.xml index d2da8e6ea9e..98c4413ade1 100644 --- a/addons/hr_timesheet/hr_timesheet_view.xml +++ b/addons/hr_timesheet/hr_timesheet_view.xml @@ -5,7 +5,6 @@ - hr.analytic.timesheet.tree hr.analytic.timesheet @@ -70,9 +69,8 @@ - - - + + @@ -96,12 +94,11 @@ tree,form {"search_default_user_id":uid, "search_default_today":1} - This functionality gives you a list of work done by user, product and analytic account (or project). A search tool allows you to make fine-grained analysis. + Working Hours allows you to log your working hours by project every day. - hr.timesheet.employee.extd_form diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py index f605fd760be..cc1ff3b9324 100644 --- a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py +++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py @@ -27,8 +27,8 @@ class hr_timesheet_invoice_factor(osv.osv): _name = "hr_timesheet_invoice.factor" _description = "Invoice Rate" _columns = { - 'name': fields.char('Internal name', size=128, required=True), - 'customer_name': fields.char('Name', size=128, help="Name of the customer"), + 'name': fields.char('Internal name', size=128, required=True, translate=True), + 'customer_name': fields.char('Name', size=128, help="Label for the customer"), 'factor': fields.float('Discount (%)', required=True, help="Discount in percentage"), } _defaults = { @@ -45,7 +45,10 @@ class account_analytic_account(osv.osv): context = {} res = {} - cr.execute('select account_id as account_id, l.invoice_id from hr_analytic_timesheet h left join account_analytic_line l on (h.line_id=l.id)') + cr.execute('SELECT account_id as account_id, l.invoice_id ' + 'FROM hr_analytic_timesheet h LEFT JOIN account_analytic_line l ' + 'ON (h.line_id=l.id) ' + 'WHERE l.account_id = ANY(%s)', (ids,)) account_to_invoice_map = {} for rec in cr.dictfetchall(): account_to_invoice_map.setdefault(rec['account_id'], []).append(rec['invoice_id']) @@ -163,6 +166,7 @@ class account_invoice(osv.osv): obj_analytic_account = self.pool.get('account.analytic.account') for il in iml: if il['account_analytic_id']: + # *-* browse (or refactor to avoid read inside the loop) to_invoice = obj_analytic_account.read(cr, uid, [il['account_analytic_id']], ['to_invoice'])[0]['to_invoice'] if to_invoice: il['analytic_lines'][0][2]['to_invoice'] = to_invoice[0] diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice_data.xml b/addons/hr_timesheet_invoice/hr_timesheet_invoice_data.xml index a81af0788b6..462888e0b39 100644 --- a/addons/hr_timesheet_invoice/hr_timesheet_invoice_data.xml +++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice_data.xml @@ -6,5 +6,15 @@ 100% 0.0 + + 90% + 90% + 10.0 + + + 50% + 50% + 50.0 + diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice_view.xml b/addons/hr_timesheet_invoice/hr_timesheet_invoice_view.xml index 2caa7b15d77..408835fe993 100644 --- a/addons/hr_timesheet_invoice/hr_timesheet_invoice_view.xml +++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice_view.xml @@ -118,7 +118,7 @@ tree,form [] {'search_default_to_invoice': 1} - OpenERP automatically group the entries to be invoiced so you can keep an eye on them on real time in one glance. + This lists show you every task work you can invoice to the customer. Select the lines in order to generate the invoices automatically. - + diff --git a/addons/hr_timesheet_invoice/test/test_hr_timesheet_invoice.yml b/addons/hr_timesheet_invoice/test/test_hr_timesheet_invoice.yml index cda4574845a..9a22de4d828 100644 --- a/addons/hr_timesheet_invoice/test/test_hr_timesheet_invoice.yml +++ b/addons/hr_timesheet_invoice/test/test_hr_timesheet_invoice.yml @@ -28,8 +28,6 @@ I create invoice on analytic Line using "Invoice analytic Line" wizard. - !record {model: hr.timesheet.invoice.create, id: hr_timesheet_invoice_create_0}: - accounts: - - account.analytic_sednacom date: 1 name: 1 price: 1 @@ -46,10 +44,12 @@ I check that Invoice is created for this timesheet. - !python {model: account.analytic.line}: | + account_id = self.pool.get('account.analytic.line') + accounts = account_id.browse(cr, uid, [ref("account_analytic_line_developyamlforhrmodule0")])[0] exp = self.browse(cr, uid, [ref('account_analytic_line_developyamlforhrmodule0')])[0] analytic_account_obj = self.pool.get('account.analytic.account') data = self.pool.get('hr.timesheet.invoice.create').read(cr, uid, [ref("hr_timesheet_invoice_create_0")], [], context)[0] - account_ids = data['accounts'] + account_ids = accounts['account_id'] for account in analytic_account_obj.browse(cr, uid, account_ids, context): partner = account.partner_id.id @@ -81,4 +81,4 @@ - I can also make some theoretical revenue reports. - - I can also see timesheet profit using Timesheet profit report. \ No newline at end of file + I can also see timesheet profit using Timesheet profit report. diff --git a/addons/hr_timesheet_sheet/__openerp__.py b/addons/hr_timesheet_sheet/__openerp__.py index d00ee91a304..383521b399d 100644 --- a/addons/hr_timesheet_sheet/__openerp__.py +++ b/addons/hr_timesheet_sheet/__openerp__.py @@ -55,6 +55,7 @@ The validation can be configured in the company: 'process/hr_timesheet_sheet_process.xml', 'board_hr_timesheet_view.xml', 'report/hr_timesheet_report_view.xml', + 'report/timesheet_report_view.xml', 'wizard/hr_timesheet_current_view.xml', 'hr_timesheet_sheet_data.xml' ], diff --git a/addons/hr_timesheet_sheet/board_hr_timesheet_view.xml b/addons/hr_timesheet_sheet/board_hr_timesheet_view.xml index a50042c3dfb..13193e66d99 100644 --- a/addons/hr_timesheet_sheet/board_hr_timesheet_view.xml +++ b/addons/hr_timesheet_sheet/board_hr_timesheet_view.xml @@ -3,7 +3,7 @@ + sequence="0"/> + + @@ -322,8 +325,8 @@ - diff --git a/addons/hr_timesheet_sheet/report/__init__.py b/addons/hr_timesheet_sheet/report/__init__.py index 8dac73f07ec..b06b0608356 100644 --- a/addons/hr_timesheet_sheet/report/__init__.py +++ b/addons/hr_timesheet_sheet/report/__init__.py @@ -19,5 +19,7 @@ # ############################################################################## +import timesheet_report import hr_timesheet_report +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml index 36ea5b6418a..054a4def9f2 100644 --- a/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml +++ b/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml @@ -72,7 +72,7 @@ - + diff --git a/addons/hr_timesheet_sheet/report/timesheet_report.py b/addons/hr_timesheet_sheet/report/timesheet_report.py new file mode 100644 index 00000000000..a8c0440a053 --- /dev/null +++ b/addons/hr_timesheet_sheet/report/timesheet_report.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import tools +from osv import fields,osv + +class timesheet_report(osv.osv): + _name = "timesheet.report" + _description = "Timesheet" + _auto = False + _columns = { + 'year': fields.char('Year',size=64,required=False, 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), + 'day': fields.char('Day', size=128, readonly=True), + 'name': fields.char('Description', size=64,readonly=True), + 'product_id' : fields.many2one('product.product', 'Product'), + 'general_account_id' : fields.many2one('account.account', 'General Account', readonly=True), + 'user_id': fields.many2one('res.users', 'User',readonly=True), + 'to_invoice': fields.many2one('hr_timesheet_invoice.factor', 'Type of Invoicing',readonly=True), + 'account_id': fields.many2one('account.analytic.account', 'Analytic Account',readonly=True), + 'nbr': fields.integer('#Nbr',readonly=True), + 'total_diff': fields.float('#Total Diff',readonly=True), + 'total_timesheet': fields.float('#Total Timesheet',readonly=True), + 'total_attendance': fields.float('#Total Attendance',readonly=True), + 'company_id': fields.many2one('res.company', 'Company',readonly=True), + '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'), + ('confirm','Confirmed'), + ('done','Done')], 'State', readonly=True), + 'quantity': fields.float('#Quantity',readonly=True), + 'cost': fields.float('#Cost',readonly=True), + } + + def init(self, cr): + tools.drop_view_if_exists(cr, 'timesheet_report') + cr.execute(""" + create or replace view timesheet_report as ( + select + min(aal.id) as id, + htss.date_current, + htss.name, + htss.date_from, + htss.date_to, + to_char(htss.date_current,'YYYY') as year, + to_char(htss.date_current,'MM') as month, + to_char(htss.date_current, 'YYYY-MM-DD') as day, + count(*) as nbr, + aal.unit_amount as quantity, + aal.amount as cost, + aal.account_id, + aal.product_id, + (SELECT sum(day.total_difference) + FROM hr_timesheet_sheet_sheet AS sheet + LEFT JOIN hr_timesheet_sheet_sheet_day AS day + ON (sheet.id = day.sheet_id + AND day.name = sheet.date_current) where sheet.id=htss.id) as total_diff, + (SELECT sum(day.total_timesheet) + FROM hr_timesheet_sheet_sheet AS sheet + LEFT JOIN hr_timesheet_sheet_sheet_day AS day + ON (sheet.id = day.sheet_id + AND day.name = sheet.date_current) where sheet.id=htss.id) as total_timesheet, + (SELECT sum(day.total_attendance) + FROM hr_timesheet_sheet_sheet AS sheet + LEFT JOIN hr_timesheet_sheet_sheet_day AS day + ON (sheet.id = day.sheet_id + AND day.name = sheet.date_current) where sheet.id=htss.id) as total_attendance, + aal.to_invoice, + aal.general_account_id, + htss.user_id, + htss.company_id, + htss.department_id, + htss.state + from account_analytic_line as aal + left join hr_analytic_timesheet as hat ON (hat.line_id=aal.id) + left join hr_timesheet_sheet_sheet as htss ON (hat.line_id=htss.id) + group by + to_char(htss.date_current,'YYYY'), + to_char(htss.date_current,'MM'), + to_char(htss.date_current, 'YYYY-MM-DD'), + aal.account_id, + htss.date_from, + htss.date_to, + aal.unit_amount, + aal.amount, + htss.date_current, + aal.to_invoice, + aal.product_id, + aal.general_account_id, + htss.name, + htss.company_id, + htss.state, + htss.id, + htss.department_id, + htss.user_id + ) + """) +timesheet_report() diff --git a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml new file mode 100644 index 00000000000..08abc6db63b --- /dev/null +++ b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml @@ -0,0 +1,126 @@ + + + + + timesheet.report.graph + timesheet.report + graph + + + + + + + + + + timesheet.report.tree + timesheet.report + tree + + + + + + + + + + + + + + + + + + + + + + + + + + + timesheet.report.search + timesheet.report + search + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Timesheet Sheet Analysis + timesheet.report + form + tree,graph + {'search_default_month':1,'search_default_User_id':1,'group_by_no_leaf':1,'group_by':[]} + + + + + diff --git a/addons/hr_timesheet_sheet/security/ir.model.access.csv b/addons/hr_timesheet_sheet/security/ir.model.access.csv index 9d0159bbc1a..f55ee0fb5e0 100644 --- a/addons/hr_timesheet_sheet/security/ir.model.access.csv +++ b/addons/hr_timesheet_sheet/security/ir.model.access.csv @@ -6,3 +6,4 @@ "access_hr_timesheet_report","hr.timesheet.report","model_hr_timesheet_report","base.group_hr_manager",1,1,1,1 "access_hr_analytic_timesheet_system_user","hr.analytic.timesheet.system.user","model_hr_analytic_timesheet","base.group_user",1,0,0,0 "access_hr_timesheet_sheet_sheet_day","hr.timesheet.sheet.sheet.day.user","model_hr_timesheet_sheet_sheet_day","base.group_user",1,0,0,0 +"access_timesheet_report_user","timesheet.report.user","model_timesheet_report","base.group_hr_manager",1,1,1,1 diff --git a/addons/hr_timesheet_sheet/wizard/hr_timesheet_current_view.xml b/addons/hr_timesheet_sheet/wizard/hr_timesheet_current_view.xml index f9944d0949f..fe63a4ce7b3 100644 --- a/addons/hr_timesheet_sheet/wizard/hr_timesheet_current_view.xml +++ b/addons/hr_timesheet_sheet/wizard/hr_timesheet_current_view.xml @@ -23,6 +23,7 @@ tree,form new + My Timesheet opens your timesheet so that you can book your activities into the system. From the same form, you can register your attendances (Sign In/Out) and describe the working hours made on the different projects. At the end of the period defined in the company, the timesheet is confirmed by the user and can be validated by his manager. If required, as defined on the project, you can generate the invoices based on the timesheet. diff --git a/addons/lunch/lunch_demo.xml b/addons/lunch/lunch_demo.xml index 91be819d430..30172b9e0a2 100644 --- a/addons/lunch/lunch_demo.xml +++ b/addons/lunch/lunch_demo.xml @@ -14,7 +14,7 @@ Cashbox - + diff --git a/addons/lunch/report/order.py b/addons/lunch/report/order.py index 838ab108c23..29c9d381745 100644 --- a/addons/lunch/report/order.py +++ b/addons/lunch/report/order.py @@ -26,18 +26,38 @@ from osv import osv class order(report_sxw.rml_parse): - def sum_price(self, orders): - res = 0.0 - for o in orders: - res += o.price - return res + def get_lines(self, user,objects): + lines=[] + for obj in objects: + if user.id==obj.user_id.id: + lines.append(obj) + return lines + + def get_total(self, user,objects): + lines=[] + for obj in objects: + if user.id==obj.user_id.id: + lines.append(obj) + total=0.0 + for line in lines: + total+=line.price + return total + + def get_users(self, objects): + users=[] + for obj in objects: + if obj.user_id not in users: + users.append(obj.user_id) + return users def __init__(self, cr, uid, name, context): super(order, self).__init__(cr, uid, name, context) self.localcontext.update({ 'time': time, - 'sum_price': self.sum_price, + 'get_lines': self.get_lines, + 'get_users': self.get_users, + 'get_total': self.get_total, }) report_sxw.report_sxw('report.lunch.order', 'lunch.order', diff --git a/addons/lunch/report/order.rml b/addons/lunch/report/order.rml index 62003478c4c..d47816abd9c 100644 --- a/addons/lunch/report/order.rml +++ b/addons/lunch/report/order.rml @@ -1,6 +1,6 @@ - - + + @@ -10,89 +10,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - @@ -108,112 +56,96 @@ + + + + + + + - [[repeatIn(objects,'o')]] + + + + + + + + + [[ (user.address_id and user.address_id.partner_id and user.address_id.partner_id.title and user.address_id.partner_id.title.name) or '' ]] [[ (user.address_id and user.address_id.partner_id and user.address_id.partner_id.name) or '' ]] + [[ (user.address_id and user.address_id.street) or '' ]] + [[ (user.address_id and user.address_id.street2) or removeParentNode('para') ]] + [[ (user.address_id and user.address_id.zip) or '' ]] [[ (user.address_id and user.address_id.city) or '' ]] + [[ (user.address_id and user.address_id.state_id and user.address_id.state_id.name) or removeParentNode('para')]] + [[ (user.address_id and user.address_id.country_id and user.address_id.country_id.name) or '' ]] + + + + Lunch Order + + + [[repeatIn(get_users(objects),'o')]] + + + + Name + + + Date + + + Order + + + Description + + + Unit Price + + + - - - - + [[ repeatIn(get_lines(o,objects),'lines') ]] + - - - + [[ (lines.user_id and lines.user_id.name) or '']] - - - + [[ formatLang(lines.date,date='True') ]] - [[ o.user_id.address_id.partner_id.title.name or '' ]] [[ o.user_id.address_id.partner_id.name ]] - [[ o.user_id.address_id.street ]] - [[ o.user_id.address_id.street2 or removeParentNode('para') ]] - [[ o.user_id.address_id.zip or '' ]] [[ o.user_id.address_id.city or '' ]] - [[ (o.user_id.address_id.state_id and o.user_id.address_id.state_id.name) or removeParentNode('para')]] [[ (o.user_id.address_id.country_id and o.user_id.address_id.country_id.name) or '' ]] - - - - - - - - - - - - - - - - Lunch Order - - - - - - - - - - - - - Name + [[ (lines.product and lines.product.name) or '' ]] - Order + [[ lines.descript]] - Description - - - Unit Price + [[ lines.price ]] [[ (o.company_id and o.company_id.currency_id and o.company_id.currency_id.symbol) or '' ]] - + - [[ o.user_id.name ]] - - - [[o.product.name ]] - - - [[ o.descript ]] - - - [[formatLang(o.price) ]] [[company.currency_id.symbol]] - - - - - - - + - - - + Total: - Total: - - - [[ formatLang(sum_price(objects)) ]] [[company.currency_id.symbol]] + [[ formatLang(get_total(o,objects)) ]] [[ (o.company_id and o.company_id.currency_id and o.company_id.currency_id.symbol) or '' ]] - + + - \ No newline at end of file + diff --git a/addons/mail_gateway/mail_gateway_view.xml b/addons/mail_gateway/mail_gateway_view.xml index ab118295db5..f3be1eff422 100644 --- a/addons/mail_gateway/mail_gateway_view.xml +++ b/addons/mail_gateway/mail_gateway_view.xml @@ -1,6 +1,10 @@ + + + mailgate.message.form mailgate.message @@ -85,6 +89,20 @@ + + + + + Message + mailgate.message + form + tree,form + + + + + + mailgate.thread.form mailgate.thread @@ -134,6 +152,9 @@ + + + Mailgateway Threads @@ -192,5 +213,8 @@ src_model="mailgate.message" domain="[('res_id', '=', res_id),('res_model','=',model)]"/> + + diff --git a/addons/marketing/marketing_view.xml b/addons/marketing/marketing_view.xml index 9edd7689484..69ee91d52dc 100644 --- a/addons/marketing/marketing_view.xml +++ b/addons/marketing/marketing_view.xml @@ -2,7 +2,7 @@ - + marketing.installer.view diff --git a/addons/marketing/marketing_wizard.py b/addons/marketing/marketing_wizard.py index 4b95bbb86da..a97d0ca16bc 100644 --- a/addons/marketing/marketing_wizard.py +++ b/addons/marketing/marketing_wizard.py @@ -32,6 +32,10 @@ class marketing_installer(osv.osv_memory): 'crm_profiling':fields.boolean('Profiling Tools', help="Helps you to perform segmentation of partners and design segmentation questionnaires") } + _defaults = { + 'marketing_campaign': lambda *a: 1, + } + marketing_installer() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/marketing/security/marketing_security.xml b/addons/marketing/security/marketing_security.xml index 2eda88c4481..740b9b3a2c5 100644 --- a/addons/marketing/security/marketing_security.xml +++ b/addons/marketing/security/marketing_security.xml @@ -1,7 +1,7 @@ - + Marketing / User diff --git a/addons/marketing_campaign/marketing_campaign_view.xml b/addons/marketing_campaign/marketing_campaign_view.xml index b23826969a8..26690757234 100644 --- a/addons/marketing_campaign/marketing_campaign_view.xml +++ b/addons/marketing_campaign/marketing_campaign_view.xml @@ -115,9 +115,9 @@ form tree,form,diagram - {'group_by': []} - - + {'group_by': []} + + Campaigns are used to tag the source of the new business opportunities or leads. They are mainly used for reporting on the performance of each marketing campaign. diff --git a/addons/marketing_campaign/security/ir.model.access.csv b/addons/marketing_campaign/security/ir.model.access.csv index ae5cad3d706..082cafd7054 100644 --- a/addons/marketing_campaign/security/ir.model.access.csv +++ b/addons/marketing_campaign/security/ir.model.access.csv @@ -1,13 +1,13 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_marketing_campaign_admin","marketing.campaign","model_marketing_campaign","base.res_groups_email_template_admin",1,1,1,1 -"access_marketing_campaign_segment_campaignadmin","marketing.campaign.segment","model_marketing_campaign_segment","base.res_groups_email_template_admin",1,1,1,1 -"access_marketing_campaign_activity_campaignadmin","marketing.campaign.activity","model_marketing_campaign_activity","base.res_groups_email_template_admin",1,1,1,1 -"access_marketing_campaign_workitem_campaignadmin","marketing.campaign.workitem","model_marketing_campaign_workitem","base.res_groups_email_template_admin",1,1,1,1 -"access_marketing_campaign_transition_campaignadmin","marketing.campaign.transition","model_marketing_campaign_transition","base.res_groups_email_template_admin",1,1,1,1 -"access_marketing_campaign_analysis_campaignadmin","campaign.analysis","model_campaign_analysis","base.res_groups_email_template_admin",1,1,1,1 +"access_marketing_campaign_admin","marketing.campaign","model_marketing_campaign","marketing.group_marketing_user",1,1,1,1 +"access_marketing_campaign_segment_campaignadmin","marketing.campaign.segment","model_marketing_campaign_segment","marketing.group_marketing_user",1,1,1,1 +"access_marketing_campaign_activity_campaignadmin","marketing.campaign.activity","model_marketing_campaign_activity","marketing.group_marketing_user",1,1,1,1 +"access_marketing_campaign_workitem_campaignadmin","marketing.campaign.workitem","model_marketing_campaign_workitem","marketing.group_marketing_user",1,1,1,1 +"access_marketing_campaign_transition_campaignadmin","marketing.campaign.transition","model_marketing_campaign_transition","marketing.group_marketing_user",1,1,1,1 +"access_marketing_campaign_analysis_campaignadmin","campaign.analysis","model_campaign_analysis","marketing.group_marketing_user",1,1,1,1 "access_marketing_campaign_workitem_all","marketing.campaign.workitem","model_marketing_campaign_workitem","base.group_user",1,0,0,0 -"access_email_template_user","email.template","model_email_template","base.res_groups_email_template_admin",1,1,1,1 -"access_email_template_account_user","email_template.account.user","email_template.model_email_template_account","base.res_groups_email_template_admin",1,1,1,1 +"access_email_template_user","email.template","model_email_template","marketing.group_marketing_user",1,1,1,1 +"access_email_template_account_user","email_template.account.user","email_template.model_email_template_account","marketing.group_marketing_user",1,1,1,1 "access_marketing_campaign_system","marketing.campaign system","model_marketing_campaign","base.group_system",1,0,0,0 "access_marketing_campaign_segment_system","marketing.campaign.segment system","model_marketing_campaign_segment","base.group_system",1,0,0,0 "access_marketing_campaign_workitem_system","marketing.campaign.workitem system","model_marketing_campaign_workitem","base.group_system",1,0,0,0 diff --git a/addons/marketing_campaign/security/marketing_campaign_security.xml b/addons/marketing_campaign/security/marketing_campaign_security.xml index bb933fdcdc3..14710cf8f37 100644 --- a/addons/marketing_campaign/security/marketing_campaign_security.xml +++ b/addons/marketing_campaign/security/marketing_campaign_security.xml @@ -2,9 +2,5 @@ - - Marketing / User - - diff --git a/addons/mrp/board_manufacturing_view.xml b/addons/mrp/board_manufacturing_view.xml index c36ac668b45..a181e5ba41d 100644 --- a/addons/mrp/board_manufacturing_view.xml +++ b/addons/mrp/board_manufacturing_view.xml @@ -42,8 +42,5 @@ id="menu_board_manufacturing" parent="menus_dash_mrp" sequence="1" groups="mrp.group_mrp_manager,mrp.group_mrp_user"/> - diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 5f2695cf3a7..50ed21eb298 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -644,11 +644,7 @@ class mrp_production(osv.osv): move_obj.write(cr, uid, [production.move_prod_id.id], {'location_id': production.location_dest_id.id}) - message = ("Manufacturing Order '%s' for %s %s is Ready to produce.") % ( - name, - production.product_qty, - production.product_id.name, - ) + message = _("Manufacturing order '%s' is ready to produce.") % ( name,) self.log(cr, uid, production_id, message) return True @@ -759,9 +755,6 @@ class mrp_production(osv.osv): wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, 'mrp.production', production_id, 'button_produce_done', cr) - for (id, name) in self.pool.get('product.product').name_get(cr, uid, [production.product_id.id]): - message = str(production_qty) + ' ' + production.product_uom.name +" '" + name + _("' have been manufactured for ") + production.name - self.log(cr, uid, production_id, message) return True def _costs_generate(self, cr, uid, production): @@ -929,16 +922,10 @@ class mrp_production(osv.osv): proc_ids.append(proc_id) wf_service.trg_validate(uid, 'stock.picking', picking_id, 'button_confirm', cr) self.write(cr, uid, [production.id], {'picking_id': picking_id, 'move_lines': [(6,0,moves)], 'state':'confirmed'}) - message = ("%s '%s' %s %s %s %s %s %s.") % ( - _('Manufacturing Order'), - production.name, - _('for'), - production.product_qty, - production.product_id.name, - _('scheduled for date '), - datetime.strptime(production.date_planned,'%Y-%m-%d %H:%M:%S').strftime('%Y-%m-%d'), - _('is waiting') - ) + message = _("Manufacturing order '%s' is scheduled for the %s.") % ( + production.name, + datetime.strptime(production.date_planned,'%Y-%m-%d %H:%M:%S').strftime('%m/%d/%Y'), + ) self.log(cr, uid, production.id, message) return picking_id diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml index 32f3100b868..c946777b219 100644 --- a/addons/mrp/mrp_view.xml +++ b/addons/mrp/mrp_view.xml @@ -3,7 +3,7 @@ + groups="group_mrp_user,group_mrp_manager" sequence="8"/> @@ -11,7 +11,7 @@ @@ -432,7 +433,7 @@ action="mrp_bom_form_action" id="menu_mrp_bom_form_action" parent="menu_mrp_bom" - groups="mrp.group_mrp_user,mrp.group_mrp_manager,base.group_system" + groups="mrp.group_mrp_user,mrp.group_mrp_manager" sequence="10"/> {'search_default_Current':1} - Manufacturing Orders describe the operations that need to be carried out and the raw materials usage for each stage of production. You use specifications (bills of materials) to work out the raw material requirements and the manufacturing orders needed for the finished products. Once the bills of materials have been defined, OpenERP becomes capable of automatically deciding on the manufacturing route depending on the needs of the company. + Manufacturing Orders are usually proposed automatically by OpenERP based on the bill of materials and the procurement rules, but you can also create manufacturing orders manually. OpenERP will handle the consumation of the raw materials (stock decrease) and the production of the finished products (stock increase) when the order is processed. - + Manufacturing Orders Planning @@ -882,10 +883,10 @@ - - - - + + + + diff --git a/addons/mrp/procurement.py b/addons/mrp/procurement.py index 29eb2d3bddf..9af65a473a3 100644 --- a/addons/mrp/procurement.py +++ b/addons/mrp/procurement.py @@ -40,10 +40,10 @@ class procurement_order(osv.osv): """ properties = [x.id for x in procurement.property_ids] bom_id = self.pool.get('mrp.bom')._bom_find(cr, uid, procurement.product_id.id, procurement.product_uom.id, properties) - if not bom_id: + if not bom_id: cr.execute('update procurement_order set message=%s where id=%s', (_('No BoM defined for this product !'), procurement.id)) for (id, name) in self.name_get(cr, uid, procurement.id): - message = _('Procurement ') + " '" + name + "' "+ _("has an exception.") + _('No BoM defined for this product !') + message = _("Procurement '%s' has an exception: 'No BoM defined for this product !'") % name self.log(cr, uid, id, message) return False return True diff --git a/addons/mrp/report/mrp_production_order_view.xml b/addons/mrp/report/mrp_production_order_view.xml index 01b3381b0bb..61a0c641a24 100644 --- a/addons/mrp/report/mrp_production_order_view.xml +++ b/addons/mrp/report/mrp_production_order_view.xml @@ -111,6 +111,7 @@ {'search_default_Product': 1,'search_default_month':1,'group_by_no_leaf':1,'group_by':[]} + This reporting allows you to analyse your manufacturing activities and performance. diff --git a/addons/mrp/report/mrp_report_view.xml b/addons/mrp/report/mrp_report_view.xml index dcb2bcb3566..db628eb5431 100644 --- a/addons/mrp/report/mrp_report_view.xml +++ b/addons/mrp/report/mrp_report_view.xml @@ -47,7 +47,7 @@ form graph,tree - Work Center Load is a projection of load in a work center given a period. The load is express in hour and cycle (for machines). + Work Center Loads gives you a projection of work center loads over a specified period. It is expressed in number of hours and machine related cycles. @@ -99,7 +99,7 @@ report.mrp.inout form graph,tree - Weekly Stock Value Variation enables you to track stock value evolution as a result of manufacturing activities (consumption of raw materials, production of finished goods, added accounting value of stock by the creation of value following the transformation of products). + Weekly Stock Value Variation enables you to track the stock value evolution linked to manufacturing activities, receptions of products and delivery orders. diff --git a/addons/mrp/security/ir.model.access.csv b/addons/mrp/security/ir.model.access.csv index e63ced14997..586f82f1b53 100644 --- a/addons/mrp/security/ir.model.access.csv +++ b/addons/mrp/security/ir.model.access.csv @@ -62,33 +62,6 @@ "access_stock_move_mrp_manager","stock.move mrp_manager","stock.model_stock_move","mrp.group_mrp_manager",1,0,0,1 "access_mrp_production_product_line_manager","mrp.production.product.line manager","model_mrp_production_product_line","mrp.group_mrp_manager",1,0,0,0 "access_account_sequence_fiscalyear_system","account.sequence.fiscalyear.system","account.model_account_sequence_fiscalyear","mrp.group_mrp_manager",1,0,0,0 -"access_product_template_system","product.template mgr.system","product.model_product_template","base.group_system",1,0,0,0 -"access_product_uom_system","product.uom user.system","product.model_product_uom","base.group_system",1,0,0,0 -"access_product_supplierinfo_system","product.supplierinfo system","product.model_product_supplierinfo","base.group_system",1,0,0,0 -"access_res_partner_address_system","res.partner.address.system","base.model_res_partner_address","base.group_system",1,0,0,0 -"access_stock_tracking_system","stock.tracking.system","stock.model_stock_tracking","base.group_system",1,0,0,0 -"access_res_partner_system","res.partner.system","base.model_res_partner","base.group_system",1,0,0,0 -"access_product_puom_categ_system","product.uom.categ.system","product.model_product_uom_categ","base.group_system",1,0,0,0 -"access_resource_resource_system","resource.resource.system","resource.model_resource_resource","base.group_system",1,0,0,0 -"access_board_board_system","mrp.board.board.system","board.model_board_board","base.group_system",1,0,0,0 -"access_mrp_production_system","mrp.production.system","model_mrp_production","base.group_system",1,0,0,0 -"access_procurement_system","procurement.order.system","model_procurement_order","base.group_system",1,0,0,0 -"access_workcenter_system","mrp.production.workcenter.line.system","model_mrp_production_workcenter_line","base.group_system",1,0,0,0 -"access_stock_move_mrp_system","stock.move mrp_manager.system","stock.model_stock_move","base.group_system",1,0,0,0 -"access_mrp_production_product_line_system","mrp.production.product.line manager.system","model_mrp_production_product_line","base.group_system",1,0,0,0 -"access_mrp_production_order_system","mrp.production.order.system","model_mrp_production_order","base.group_system",1,0,0,0 -"access_report_workcenter_load_system","report.workcenter.load.system","model_report_workcenter_load","base.group_system",1,0,0,0 -"access_report_mrp_inout_system","report.mrp.inout.system","model_report_mrp_inout","base.group_system",1,0,0,0 -"access_product_product_system","product.product system","model_product_product","base.group_system",1,0,0,0 -"access_mrp_routing_system","mrp.routing.system","model_mrp_routing","base.group_system",1,0,0,0 -"access_mrp_routing_workcenter_system","mrp.routing.workcenter.system","model_mrp_routing_workcenter","base.group_system",1,0,0,0 -"access_mrp_bom_system","mrp.bom.system","model_mrp_bom","base.group_system",1,0,0,0 -"access_mrp_bom_revision_system","mrp.bom.revision.system","model_mrp_bom_revision","base.group_system",1,0,0,0 -"access_mrp_property_system","mrp.property.system","procurement.model_mrp_property","base.group_system",1,1,1,1 -"access_mrp_property_group_system","mrp.property.group.system","procurement.model_mrp_property_group","base.group_system",1,1,1,1 -"access_mrp_routing_system","mrp.routing.system","model_mrp_routing","base.group_system",1,1,1,1 -"access_mrp_workcenter_system","mrp.workcenter.system","model_mrp_workcenter","base.group_system",1,0,0,0 -"access_mrp_production_system","mrp.production system","model_mrp_production","base.group_system",1,0,0,0 "access_stock_production_lot_user","stock.production.lot","stock.model_stock_production_lot","mrp.group_mrp_user",1,1,1,1 "access_stock_warehouse_orderpoint_manager","stock.warehouse.orderpoint","procurement.model_stock_warehouse_orderpoint","mrp.group_mrp_manager",1,0,0,0 "access_stock_picking_mrp_manager","stock.picking mrp_manager","stock.model_stock_picking","mrp.group_mrp_manager",1,0,0,0 diff --git a/addons/mrp_jit/i18n/ru.po b/addons/mrp_jit/i18n/ru.po index eb080bbdf16..6a197c5f042 100644 --- a/addons/mrp_jit/i18n/ru.po +++ b/addons/mrp_jit/i18n/ru.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.4\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 15:05+0000\n" -"Last-Translator: Ivan Y \n" +"PO-Revision-Date: 2010-10-15 09:29+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: mrp_jit diff --git a/addons/mrp_operations/i18n/hr.po b/addons/mrp_operations/i18n/hr.po index ac409da6df1..362ffedb2c2 100644 --- a/addons/mrp_operations/i18n/hr.po +++ b/addons/mrp_operations/i18n/hr.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.4\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 20:48+0000\n" -"Last-Translator: robert \n" +"PO-Revision-Date: 2010-10-15 09:07+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: mrp_operations diff --git a/addons/mrp_operations/i18n/sr.po b/addons/mrp_operations/i18n/sr.po new file mode 100644 index 00000000000..bf173288c9d --- /dev/null +++ b/addons/mrp_operations/i18n/sr.po @@ -0,0 +1,443 @@ +# Serbian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-08-28 16:01+0000\n" +"PO-Revision-Date: 2010-10-16 09:44+0000\n" +"Last-Translator: OpenERP Administrators \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: mrp_operations +#: model:process.node,name:mrp_operations.process_node_startoperation0 +msgid "Start Operation" +msgstr "Započni postupak" + +#. module: mrp_operations +#: selection:mrp.production.workcenter.line,state:0 +msgid "In Progress" +msgstr "U toku" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +#: selection:mrp.production.workcenter.line,state:0 +#: selection:mrp_operations.operation.code,start_stop:0 +msgid "Pause" +msgstr "Pauza" + +#. module: mrp_operations +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" + +#. module: mrp_operations +#: model:process.node,note:mrp_operations.process_node_startoperation0 +msgid "Operation is started" +msgstr "Postupak je pokrenut" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +msgid "Information" +msgstr "Informacija" + +#. module: mrp_operations +#: model:process.transition,name:mrp_operations.process_transition_startcanceloperation0 +msgid "Start Cancel Operation" +msgstr "Pokreni ponistenje Operacije" + +#. module: mrp_operations +#: selection:mrp.production.workcenter.line,production_state:0 +msgid "In Production" +msgstr "U produkciji" + +#. module: mrp_operations +#: model:ir.actions.act_window,name:mrp_operations.mrp_production_code_action +msgid "Operations Code" +msgstr "Sifre Operacija" + +#. module: mrp_operations +#: model:process.process,name:mrp_operations.process_process_mrpoperationprocess0 +msgid "Mrp Operation Process" +msgstr "Mrp Procesni Postupak" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +#: field:mrp.production.workcenter.line,state:0 +#: field:mrp_operations.operation.code,start_stop:0 +msgid "Status" +msgstr "Status" + +#. module: mrp_operations +#: model:process.transition,name:mrp_operations.process_transition_startdoneoperation0 +msgid "Start Done Operation" +msgstr "Pokreni Zavrsetak Postupka" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +#: selection:mrp_operations.operation.code,start_stop:0 +msgid "Start" +msgstr "Pokreni" + +#. module: mrp_operations +#: field:mrp_operations.operation,production_id:0 +msgid "Production" +msgstr "Proizvodnja" + +#. module: mrp_operations +#: view:mrp_operations.operation:0 +msgid "Calendar View" +msgstr "Kalendarski pogled" + +#. module: mrp_operations +#: model:process.node,name:mrp_operations.process_node_workorder0 +msgid "Work Center" +msgstr "Radionica" + +#. module: mrp_operations +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Pogrešno ime modela u definiciji akcije." + +#. module: mrp_operations +#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_operation_action +msgid "Work Order Events Using Bar Codes" +msgstr "Radni Nalozi Koriscenjem Bar-Koda" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +msgid "Set Draft" +msgstr "Postavi u Pripremu" + +#. module: mrp_operations +#: model:ir.actions.act_window,name:mrp_operations.mrp_production_wc_action_form +#: view:mrp.production.workcenter.line:0 +msgid "Work Orders" +msgstr "Radni Nalozi" + +#. module: mrp_operations +#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_code_action +msgid "Start - Stop Codes" +msgstr "Pokreni - Zaustavi Sifre" + +#. module: mrp_operations +#: field:mrp.production.workcenter.line,uom:0 +msgid "UOM" +msgstr "JM" + +#. module: mrp_operations +#: view:mrp_operations.operation.code:0 +msgid "Production Operation Code" +msgstr "Operaciona Sifra Proizvodnje" + +#. module: mrp_operations +#: field:mrp.production.workcenter.line,date_planned:0 +msgid "Scheduled Date" +msgstr "Planirani datum" + +#. module: mrp_operations +#: model:process.transition,note:mrp_operations.process_transition_productionstart0 +msgid "From production order, create the workorder" +msgstr "Iz Naloga proizvodnje kreiraj Radni Nalog" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +msgid "Hours by Workcenter" +msgstr "Radionicki Sati" + +#. module: mrp_operations +#: help:mrp.production,allow_reorder:0 +msgid "" +"Check this to be able to move independently all production orders, without " +"moving dependent ones." +msgstr "" +"Cekiraj ovde da bi bio u mogucnosti da nezavisno premestas sve proizvodne " +"naloge, bez pomeranja onih zavisnih." + +#. module: mrp_operations +#: model:ir.actions.act_window,name:mrp_operations.mrp_production_wc_action +#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_wc_action +msgid "All Work Orders" +msgstr "Svi Radni Nalozi" + +#. module: mrp_operations +#: rml:mrp.code.barcode:0 +msgid "(" +msgstr "(" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +msgid "Product to Produce" +msgstr "Proizvod za Proizvodnju" + +#. module: mrp_operations +#: model:ir.actions.report.xml,name:mrp_operations.report_wc_barcode +msgid "Workcenters Barcode" +msgstr "Radionicki Bar-Kod" + +#. module: mrp_operations +#: model:process.node,note:mrp_operations.process_node_doneoperation0 +#: model:process.transition,note:mrp_operations.process_transition_startdoneoperation0 +msgid "Operation is done" +msgstr "Postupak je zavrsen" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +msgid "Planned Date" +msgstr "Planirani datum" + +#. module: mrp_operations +#: selection:mrp.production.workcenter.line,production_state:0 +msgid "Ready to Produce" +msgstr "Spreman za Proizvodnju" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +#: selection:mrp_operations.operation.code,start_stop:0 +msgid "Cancel" +msgstr "Otkaži" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +#: selection:mrp.production.workcenter.line,state:0 +msgid "Finished" +msgstr "Završeno" + +#. module: mrp_operations +#: field:mrp.production,allow_reorder:0 +msgid "Free Serialisation" +msgstr "Slobodna Serializacija" + +#. module: mrp_operations +#: model:ir.actions.act_window,name:mrp_operations.mrp_production_wc_action_planning +#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_wc_draft_action_planning +msgid "Work Orders Planning" +msgstr "Planiranje Radnih Naloga" + +#. module: mrp_operations +#: model:process.node,name:mrp_operations.process_node_productionorder0 +msgid "Production Order" +msgstr "Proizvodni Nalog" + +#. module: mrp_operations +#: model:process.node,note:mrp_operations.process_node_productionorder0 +msgid "Production order for any products" +msgstr "Proizvodni nalog za bilo koji proizvod" + +#. module: mrp_operations +#: field:stock.move,move_dest_id_lines:0 +msgid "Children Moves" +msgstr "Pomeranje Podgurpa" + +#. module: mrp_operations +#: field:mrp_operations.operation.code,name:0 +msgid "Operation Name" +msgstr "Ime Postupka" + +#. module: mrp_operations +#: model:ir.model,name:mrp_operations.model_mrp_operations_operation +msgid "mrp_operations.operation" +msgstr "mrp_operacije.operacija" + +#. module: mrp_operations +#: field:mrp.production.workcenter.line,date_finished:0 +#: field:mrp.production.workcenter.line,date_planned_end:0 +#: field:mrp_operations.operation,date_finished:0 +msgid "End Date" +msgstr "Završni Datum" + +#. module: mrp_operations +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +msgid "Real" +msgstr "Реални" + +#. module: mrp_operations +#: model:ir.module.module,shortdesc:mrp_operations.module_meta_information +msgid "Workcenter Production start end workflow" +msgstr "Radionicka Proizvodnja pocetak i kraj posla" + +#. module: mrp_operations +#: help:mrp.production.workcenter.line,delay:0 +msgid "This is delay between operation start and stop in this workcenter" +msgstr "Ovo je razlika izmedju pocetka i kraja posla ove Radionice" + +#. module: mrp_operations +#: field:mrp.production.workcenter.line,product:0 +msgid "Product" +msgstr "Proizvod" + +#. module: mrp_operations +#: model:process.transition,note:mrp_operations.process_transition_workstartoperation0 +msgid "From work order, define the cycles and hour for creating product" +msgstr "" +"Iz Radnog Naloga, definisi cikluse i sate potrebne za zavrsetak proizvoda" + +#. module: mrp_operations +#: field:mrp.production.workcenter.line,delay:0 +msgid "Working Hours" +msgstr "Radni Sati" + +#. module: mrp_operations +#: model:ir.actions.act_window,name:mrp_operations.mrp_production_wc_draft_action +#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_wc_draft_action +msgid "Future Work Orders" +msgstr "Buduci Radni Nalozi" + +#. module: mrp_operations +#: field:mrp.production.workcenter.line,production_state:0 +msgid "Prod.State" +msgstr "Stanje Proizvoda" + +#. module: mrp_operations +#: field:mrp_operations.operation,order_date:0 +msgid "Order Date" +msgstr "Datum Naloga" + +#. module: mrp_operations +#: model:process.node,note:mrp_operations.process_node_workorder0 +msgid "Production Work Center" +msgstr "Proizvodna Radionica" + +#. module: mrp_operations +#: model:process.transition,name:mrp_operations.process_transition_productionstart0 +msgid "Production start Operation" +msgstr "Pocetak Operacije Proizvodnje" + +#. module: mrp_operations +#: selection:mrp.production.workcenter.line,production_state:0 +msgid "Packing Exception" +msgstr "Izuzetak Pakovanja" + +#. module: mrp_operations +#: field:mrp_operations.operation,workcenter_id:0 +msgid "Workcenter" +msgstr "Radionica" + +#. module: mrp_operations +#: field:mrp.production.workcenter.line,date_start:0 +#: field:mrp.production.workcenter.line,date_start_date:0 +#: field:mrp_operations.operation,date_start:0 +msgid "Start Date" +msgstr "Početni datum" + +#. module: mrp_operations +#: model:ir.model,name:mrp_operations.model_mrp_operations_operation_code +msgid "mrp_operations.operation.code" +msgstr "mrp_operacije.postupak.sifra" + +#. module: mrp_operations +#: model:ir.actions.act_window,name:mrp_operations.mrp_production_operation_action +#: view:mrp.production.workcenter.line:0 +msgid "Operations" +msgstr "Radnje" + +#. module: mrp_operations +#: field:mrp_operations.operation,code_id:0 +#: field:mrp_operations.operation.code,code:0 +msgid "Code" +msgstr "Šifra" + +#. module: mrp_operations +#: model:ir.actions.act_window,name:mrp_operations.mrp_production_wc_confirm_action +msgid "Confirmed Work Orders" +msgstr "Potvrdi Radne naloge" + +#. module: mrp_operations +#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_wc_confirm_action +msgid "Work Orders to Do" +msgstr "Radni Nalozi na cekanju" + +#. module: mrp_operations +#: model:process.node,name:mrp_operations.process_node_canceloperation0 +msgid "Cancel Operation" +msgstr "Otkazi Operaciju" + +#. module: mrp_operations +#: model:process.transition,name:mrp_operations.process_transition_workstartoperation0 +msgid "Work start Operation" +msgstr "Pocetak Rada Operacije" + +#. module: mrp_operations +#: model:ir.actions.report.xml,name:mrp_operations.report_code_barcode +msgid "Start/Stop Barcode" +msgstr "pokreni/Zaustavi Bar-Kod" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +#: selection:mrp_operations.operation.code,start_stop:0 +msgid "Resume" +msgstr "Nastavi" + +#. module: mrp_operations +#: model:process.node,name:mrp_operations.process_node_doneoperation0 +msgid "Done Operation" +msgstr "Zavrsena Operacija" + +#. module: mrp_operations +#: field:mrp.production.workcenter.line,qty:0 +msgid "Qty" +msgstr "Kol." + +#. module: mrp_operations +#: rml:mrp.code.barcode:0 +msgid ")" +msgstr ")" + +#. module: mrp_operations +#: view:mrp_operations.operation:0 +msgid "Production Operation" +msgstr "Operacije Proizvoda" + +#. module: mrp_operations +#: selection:mrp.production.workcenter.line,production_state:0 +#: selection:mrp_operations.operation.code,start_stop:0 +msgid "Done" +msgstr "Gotovo" + +#. module: mrp_operations +#: selection:mrp.production.workcenter.line,production_state:0 +msgid "Waiting Goods" +msgstr "Cekamo Dobra" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +msgid "Duration" +msgstr "Trajanje" + +#. module: mrp_operations +#: selection:mrp.production.workcenter.line,production_state:0 +#: selection:mrp.production.workcenter.line,state:0 +msgid "Draft" +msgstr "Priprema" + +#. module: mrp_operations +#: model:process.node,note:mrp_operations.process_node_canceloperation0 +#: model:process.transition,note:mrp_operations.process_transition_startcanceloperation0 +msgid "Operation is cancelled" +msgstr "Operacija je otkazana" + +#. module: mrp_operations +#: selection:mrp.production.workcenter.line,production_state:0 +#: selection:mrp.production.workcenter.line,state:0 +msgid "Canceled" +msgstr "Отказано" + +#. module: mrp_operations +#: view:mrp.production.workcenter.line:0 +msgid "Start working" +msgstr "Pocetak Posla" diff --git a/addons/mrp_operations/mrp_operations_view.xml b/addons/mrp_operations/mrp_operations_view.xml index 62298f4aa5f..cd208b2d5a6 100644 --- a/addons/mrp_operations/mrp_operations_view.xml +++ b/addons/mrp_operations/mrp_operations_view.xml @@ -202,7 +202,7 @@ form tree,form,gantt,calendar,graph - Work Orders are manufacturing operations required to produce or assemble products. The different work orders will have different impacts on the costs of manufacture and planning depending on the available workload. + Work Orders is the list of operations to be performed for each manufacturing order. Once you start the first work order of a manufacturing order, the manufacturing order is automatically marked as started. Once you finish the latest operation of a manufacturing order, the MO is automatically done and the related products are produced. diff --git a/addons/mrp_repair/i18n/sr.po b/addons/mrp_repair/i18n/sr.po new file mode 100644 index 00000000000..743247668bc --- /dev/null +++ b/addons/mrp_repair/i18n/sr.po @@ -0,0 +1,685 @@ +# Serbian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-08-28 16:01+0000\n" +"PO-Revision-Date: 2010-10-16 08:53+0000\n" +"Last-Translator: OpenERP Administrators \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Fees Line" +msgstr "Dodatne Linije" + +#. module: mrp_repair +#: field:mrp.repair.fee,repair_id:0 +#: field:mrp.repair.line,repair_id:0 +msgid "Repair Order Ref" +msgstr "Ref.Nalog za Popravku" + +#. module: mrp_repair +#: field:mrp.repair.line,move_id:0 +msgid "Inventory Move" +msgstr "Premesti Inventar" + +#. module: mrp_repair +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "Pogrešno ime modela u definiciji akcije." + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Untaxed amount" +msgstr "Iznos bez Poreza" + +#. module: mrp_repair +#: field:mrp.repair,state:0 +msgid "Repair State" +msgstr "Stanje Popravke" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "Printing Date" +msgstr "Datum štampe" + +#. module: mrp_repair +#: field:mrp.repair.fee,product_uom_qty:0 +#: rml:repair.order:0 +msgid "Quantity" +msgstr "Količina" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Set to Draft" +msgstr "Postavi u pripremu" + +#. module: mrp_repair +#: selection:mrp.repair,state:0 +msgid "Invoice Exception" +msgstr "Izuzetak u izdavanju Računa" + +#. module: mrp_repair +#: field:mrp.repair,address_id:0 +msgid "Delivery Address" +msgstr "Adresa Dostave" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Make Invoice" +msgstr "Kreiraj račun" + +#. module: mrp_repair +#: field:mrp.repair.fee,price_subtotal:0 +#: field:mrp.repair.line,price_subtotal:0 +msgid "Subtotal" +msgstr "Subtotal" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "Invoice address :" +msgstr "Adresa računa:" + +#. module: mrp_repair +#: field:mrp.repair,guarantee_limit:0 +msgid "Guarantee limit" +msgstr "Garancija" + +#. module: mrp_repair +#: field:mrp.repair,amount_tax:0 +#: field:mrp.repair.fee,tax_id:0 +#: field:mrp.repair.line,tax_id:0 +msgid "Taxes" +msgstr "Porezi" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "Net Total :" +msgstr "Ukupno neto" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "VAT" +msgstr "PDV" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Operations" +msgstr "Radnje" + +#. module: mrp_repair +#: field:mrp.repair,move_id:0 +msgid "Move" +msgstr "Pomeri" + +#. module: mrp_repair +#: model:ir.actions.act_window,name:mrp_repair.action_repair_order_tree +msgid "Repair Orders" +msgstr "Nalozi Popravke" + +#. module: mrp_repair +#: model:ir.actions.report.xml,name:mrp_repair.report_mrp_repair +msgid "Quotation / Order" +msgstr "Ponude / Nalozi" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Extra Info" +msgstr "Dodatne Informacije" + +#. module: mrp_repair +#: field:mrp.repair,partner_id:0 +msgid "Partner" +msgstr "Partner" + +#. module: mrp_repair +#: model:ir.actions.act_window,name:mrp_repair.action_repair_quotation_tree +#: model:ir.ui.menu,name:mrp_repair.menu_repair_quotation +msgid "Repairs in quotation" +msgstr "Popravke u Najavi" + +#. module: mrp_repair +#: selection:mrp.repair,state:0 +#: selection:mrp.repair.line,state:0 +msgid "Confirmed" +msgstr "Potvrđeno" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Recreate Invoice" +msgstr "Osvežavanje računa" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Repairs order" +msgstr "Nalozi Popravke" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "Repair Order N° :" +msgstr "Nalog Br :" + +#. module: mrp_repair +#: field:mrp.repair,prodlot_id:0 +#: rml:repair.order:0 +msgid "Lot Number" +msgstr "Serijski Broj" + +#. module: mrp_repair +#: selection:mrp.repair,state:0 +msgid "Under Repair" +msgstr "Popravka u Toku" + +#. module: mrp_repair +#: field:mrp.repair,fees_lines:0 +msgid "Fees Lines" +msgstr "Dodatne Linije" + +#. module: mrp_repair +#: model:ir.model,name:mrp_repair.model_mrp_repair_fee +msgid "Repair Fees line" +msgstr "Dodatne Linije Popravke" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "Fees Line(s)" +msgstr "Dodana linija(e)" + +#. module: mrp_repair +#: selection:mrp.repair,state:0 +msgid "To be Invoiced" +msgstr "Da bude Fakturisano" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "Shipping address :" +msgstr "Adresa isporuke:" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Start Repair" +msgstr "Start Popravke" + +#. module: mrp_repair +#: field:mrp.repair.line,product_uom_qty:0 +msgid "Quantity (UoM)" +msgstr "Količina (UoM)" + +#. module: mrp_repair +#: field:mrp.repair.fee,to_invoice:0 +#: field:mrp.repair.line,to_invoice:0 +msgid "To Invoice" +msgstr "Fakturisati" + +#. module: mrp_repair +#: model:ir.ui.menu,name:mrp_repair.menu_repair_order +msgid "Repairs" +msgstr "Popravke" + +#. module: mrp_repair +#: field:mrp.repair,picking_id:0 +msgid "Packing" +msgstr "Pakovanje" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "Total :" +msgstr "Ukupno:" + +#. module: mrp_repair +#: field:mrp.repair,pricelist_id:0 +msgid "Pricelist" +msgstr "Cenovnik" + +#. module: mrp_repair +#: help:mrp.repair,state:0 +msgid "Gives the state of the Repair Order" +msgstr "Dato Stanje Naloga Popravke" + +#. module: mrp_repair +#: view:mrp.repair:0 +#: field:mrp.repair,quotation_notes:0 +msgid "Quotation Notes" +msgstr "Kotacija napomene" + +#. module: mrp_repair +#: model:ir.actions.act_window,name:mrp_repair.action_repair_progress_tree +#: model:ir.ui.menu,name:mrp_repair.menu_repair_progress +msgid "Repairs in progress" +msgstr "Popravka u Toku" + +#. module: mrp_repair +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: mrp_repair +#: help:mrp.repair,guarantee_limit:0 +msgid "" +"The garantee limit is computed as: last move date + warranty defined on " +"selected product. If the current date is below the garantee limit, each " +"operation and fee you will add will be set as 'not to invoiced' by default. " +"Note that you can change manually afterwards." +msgstr "" +"Garancija je izracunata kao: Datum odlaska + garancija definisana za dati " +"proizvod. Ako je dati datum manji od garanciskog limita, svaka radnja i " +"dopune bice poostavljene kao \"za ne fakturisati' kao osnovna postavka. " +"Trebate znati da ovo mozete kasnije rucno promeniri." + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Repair Line" +msgstr "Linija Popravke" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "N° :" +msgstr "Br.:" + +#. module: mrp_repair +#: field:mrp.repair,invoice_method:0 +msgid "Invoice Method" +msgstr "Metod Fakturisanja" + +#. module: mrp_repair +#: field:mrp.repair,repaired:0 +msgid "Repaired" +msgstr "Popravljeno" + +#. module: mrp_repair +#: wizard_field:mrp.repair.make_invoice,init,group:0 +msgid "Group by partner invoice address" +msgstr "Grupisano po adresama faktura partnera" + +#. module: mrp_repair +#: field:mrp.repair.fee,invoice_line_id:0 +#: field:mrp.repair.line,invoice_line_id:0 +msgid "Invoice Line" +msgstr "Red računa" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Total amount" +msgstr "Ukupan iznos" + +#. module: mrp_repair +#: selection:mrp.repair.line,state:0 +msgid "Canceled" +msgstr "Отказано" + +#. module: mrp_repair +#: selection:mrp.repair,invoice_method:0 +msgid "Before Repair" +msgstr "Pre POpravke" + +#. module: mrp_repair +#: field:mrp.repair,location_id:0 +msgid "Current Location" +msgstr "Trenutna Lokacija" + +#. module: mrp_repair +#: wizard_button:mrp.repair.cancel,display,yes:0 +msgid "Yes" +msgstr "Da" + +#. module: mrp_repair +#: field:mrp.repair,invoiced:0 +#: field:mrp.repair.fee,invoiced:0 +#: field:mrp.repair.line,invoiced:0 +msgid "Invoiced" +msgstr "Fakturisano" + +#. module: mrp_repair +#: wizard_button:mrp.repair.cancel,display,end:0 +msgid "No" +msgstr "Ne" + +#. module: mrp_repair +#: wizard_view:mrp.repair.make_invoice,init:0 +#: wizard_button:mrp.repair.make_invoice,init,invoice:0 +msgid "Create invoices" +msgstr "Kreiranje računa" + +#. module: mrp_repair +#: selection:mrp.repair.line,type:0 +#: rml:repair.order:0 +msgid "Add" +msgstr "Dodaj" + +#. module: mrp_repair +#: selection:mrp.repair.line,state:0 +msgid "Draft" +msgstr "Priprema" + +#. module: mrp_repair +#: model:ir.actions.act_window,name:mrp_repair.action_repair_order_form +#: model:ir.ui.menu,name:mrp_repair.menu_repair_form +msgid "New Repair" +msgstr "Nova Popravka" + +#. module: mrp_repair +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" + +#. module: mrp_repair +#: field:mrp.repair,amount_untaxed:0 +msgid "Untaxed Amount" +msgstr "Iznos bez poreza" + +#. module: mrp_repair +#: field:mrp.repair.line,state:0 +msgid "Status" +msgstr "Status" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "Guarantee Limit" +msgstr "Garancija traje do" + +#. module: mrp_repair +#: field:mrp.repair,product_id:0 +#: rml:repair.order:0 +msgid "Product to Repair" +msgstr "Proizvod za Popravku" + +#. module: mrp_repair +#: help:mrp.repair,pricelist_id:0 +msgid "The pricelist comes from the selected partner, by default." +msgstr "Cenovnik stize od selektovanog partnera, po postavci" + +#. module: mrp_repair +#: wizard_view:mrp.repair.cancel,display:0 +msgid "" +"This operation will cancel the Repair process, but will not cancel it's " +"Invoice. Do you want to continue?" +msgstr "" +"Ova operacija ce otkazati proces popravke, ali nece ponistiti i fakturu " +"iste. Zelis li da nastavim" + +#. module: mrp_repair +#: selection:mrp.repair,state:0 +msgid "Quotation" +msgstr "Najava" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Compute" +msgstr "Izracunaj" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Confirm Repair" +msgstr "Potvrdi Popravku" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "Repair Quotation" +msgstr "Pretpostavka Popravke" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "End Repair" +msgstr "Kraj Popravke" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "History" +msgstr "" + +#. module: mrp_repair +#: model:ir.model,name:mrp_repair.model_mrp_repair +msgid "Repairs Order" +msgstr "Nalog Popravki" + +#. module: mrp_repair +#: model:ir.actions.act_window,name:mrp_repair.action_repair_ready_tree +#: model:ir.ui.menu,name:mrp_repair.menu_repair_ready +msgid "Repairs Ready to Start" +msgstr "Popravke spremne za start" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Qty" +msgstr "Kol." + +#. module: mrp_repair +#: selection:mrp.repair,state:0 +#: selection:mrp.repair.line,state:0 +msgid "Done" +msgstr "Gotovo" + +#. module: mrp_repair +#: model:ir.actions.act_window,name:mrp_repair.action_repair_2binvoiced_tree +#: model:ir.ui.menu,name:mrp_repair.menu_repair_2binvoiced +msgid "Repairs to be invoiced" +msgstr "Popravke za fakturisanje" + +#. module: mrp_repair +#: field:mrp.repair,invoice_id:0 +msgid "Invoice" +msgstr "Račun" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Fees" +msgstr "Porezi" + +#. module: mrp_repair +#: selection:mrp.repair,state:0 +#: wizard_button:mrp.repair.make_invoice,init,end:0 +msgid "Cancel" +msgstr "Otkaži" + +#. module: mrp_repair +#: field:mrp.repair.line,location_dest_id:0 +msgid "Dest. Location" +msgstr "Odredišna lokacija" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "Operation Line(s)" +msgstr "Linija(e) Operacije" + +#. module: mrp_repair +#: model:ir.model,name:mrp_repair.model_mrp_repair_line +msgid "Repair Operations Lines" +msgstr "Operacione Linije Popravke" + +#. module: mrp_repair +#: field:mrp.repair,location_dest_id:0 +msgid "Delivery Location" +msgstr "Lokacija Ispostave" + +#. module: mrp_repair +#: model:ir.module.module,shortdesc:mrp_repair.module_meta_information +msgid "Products Repairs Module" +msgstr "Modul Popravki Proizvoda" + +#. module: mrp_repair +#: help:mrp.repair,invoice_method:0 +msgid "" +"This field allow you to change the workflow of the repair order. If value " +"selected is different from 'No Invoice', it also allow you to select the " +"pricelist and invoicing address." +msgstr "" +"Ovo ti polje omogucava da promenis radni prozor u nalogu popravki. Ako je " +"selektovana vrednost drugacija od onog gde pise ( nema Faktura), on ti " +"takodje omogucava da selektujes cenovnik i adresu afkturisanja." + +#. module: mrp_repair +#: field:mrp.repair.fee,price_unit:0 +#: field:mrp.repair.line,price_unit:0 +#: rml:repair.order:0 +msgid "Unit Price" +msgstr "Jedinična cijena" + +#. module: mrp_repair +#: wizard_view:mrp.repair.make_invoice,init:0 +msgid "Do you really want to create the invoices ?" +msgstr "Da li zaista želite da kreirate račun?" + +#. module: mrp_repair +#: field:mrp.repair.fee,name:0 +#: field:mrp.repair.line,name:0 +#: rml:repair.order:0 +msgid "Description" +msgstr "Opis" + +#. module: mrp_repair +#: field:mrp.repair,operations:0 +msgid "Operation Lines" +msgstr "Operacione Linije" + +#. module: mrp_repair +#: field:mrp.repair.fee,product_id:0 +#: field:mrp.repair.line,product_id:0 +msgid "Product" +msgstr "Proizvod" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Invoice Corrected" +msgstr "Ispravljen račun" + +#. module: mrp_repair +#: help:mrp.repair,deliver_bool:0 +msgid "" +"Check this box if you want to manage the delivery once the product is " +"repaired. If cheked, it will create a packing with selected product. Note " +"that you can select the locations in the Info tab, if you have the extended " +"view." +msgstr "" +"Cekiraj ovu kucicu ako zelis da upravljas sa isporukama, onda kada je " +"proizvod popravljen. ako je cekirano, kreirace pakovanje za selektovani " +"proizvod. Treba napomenuti da mozes selektovati lokaciju u Info tabu, ako si " +"omogucio prosireni prozor," + +#. module: mrp_repair +#: field:mrp.repair.line,type:0 +msgid "Type" +msgstr "Tip" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "Price" +msgstr "Cena" + +#. module: mrp_repair +#: field:mrp.repair,deliver_bool:0 +msgid "Deliver" +msgstr "Isporuka" + +#. module: mrp_repair +#: view:mrp.repair:0 +#: field:mrp.repair,internal_notes:0 +msgid "Internal Notes" +msgstr "Interne Napomene" + +#. module: mrp_repair +#: rml:repair.order:0 +msgid "Taxes:" +msgstr "Porezi:" + +#. module: mrp_repair +#: model:ir.actions.wizard,name:mrp_repair.wizard_mrp_repair_make_invoice +msgid "Make invoices" +msgstr "Kreiranje računa" + +#. module: mrp_repair +#: field:mrp.repair,name:0 +msgid "Repair Ref" +msgstr "Ref Popravke" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "UoM" +msgstr "JM" + +#. module: mrp_repair +#: selection:mrp.repair.line,type:0 +#: rml:repair.order:0 +msgid "Remove" +msgstr "Уклони" + +#. module: mrp_repair +#: wizard_view:mrp.repair.cancel,display:0 +msgid "Cancel Repair...??" +msgstr "Otkazujes Popravku ??" + +#. module: mrp_repair +#: field:mrp.repair.fee,product_uom:0 +#: field:mrp.repair.line,product_uom:0 +msgid "Product UoM" +msgstr "JM Proizvoda" + +#. module: mrp_repair +#: field:mrp.repair,partner_invoice_id:0 +msgid "Invoicing Address" +msgstr "Adresa Fakturisanja" + +#. module: mrp_repair +#: selection:mrp.repair,invoice_method:0 +msgid "After Repair" +msgstr "Nakon Popravke" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Invoicing" +msgstr "Fakturisanje" + +#. module: mrp_repair +#: field:mrp.repair.line,location_id:0 +msgid "Source Location" +msgstr "Lokacija izvora" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "Quality" +msgstr "Kvalitet" + +#. module: mrp_repair +#: model:ir.actions.wizard,name:mrp_repair.action_cancel_repair +#: view:mrp.repair:0 +msgid "Cancel Repair" +msgstr "Otkazi Popravku" + +#. module: mrp_repair +#: selection:mrp.repair,invoice_method:0 +msgid "No Invoice" +msgstr "Ne Fakturisi" + +#. module: mrp_repair +#: view:mrp.repair:0 +msgid "States" +msgstr "Stanja" + +#. module: mrp_repair +#: help:mrp.repair,partner_id:0 +msgid "" +"This field allow you to choose the parner that will be invoiced and delivered" +msgstr "" +"Ovo polje ti omogucava da izaberes partnera kojem ce biti isporuceno i " +"fakturisano" + +#. module: mrp_repair +#: field:mrp.repair,amount_total:0 +msgid "Total" +msgstr "Ukupno" + +#. module: mrp_repair +#: selection:mrp.repair,state:0 +msgid "Ready to Repair" +msgstr "Spremno za Popravku" diff --git a/addons/mrp_repair/mrp_repair_view.xml b/addons/mrp_repair/mrp_repair_view.xml index 15878ec1b37..756fa94568a 100644 --- a/addons/mrp_repair/mrp_repair_view.xml +++ b/addons/mrp_repair/mrp_repair_view.xml @@ -211,6 +211,7 @@ form tree,form + Repair orders allows you to organize your reparations on the products. On a repair order, you can detail the components you remove, add or replace and record the time you spent on the different operations. The repair order uses the warranty date on the production lot in order to know if you have to invoice the reparation to the customer or not. diff --git a/addons/mrp_subproduct/i18n/sr.po b/addons/mrp_subproduct/i18n/sr.po new file mode 100644 index 00000000000..a0427bb3356 --- /dev/null +++ b/addons/mrp_subproduct/i18n/sr.po @@ -0,0 +1,90 @@ +# Serbian translation for openobject-addons +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-08-28 16:01+0000\n" +"PO-Revision-Date: 2010-10-16 09:18+0000\n" +"Last-Translator: OpenERP Administrators \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#. module: mrp_subproduct +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "Nevažeći XML za pregled arhitekture" + +#. module: mrp_subproduct +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Ime objekta mora da počinje sa x_ i ne sme da sadrži specijalne karaktere !" + +#. module: mrp_subproduct +#: view:mrp.bom:0 +msgid "sub products" +msgstr "pod proizvodi" + +#. module: mrp_subproduct +#: field:mrp.subproduct,product_id:0 +msgid "Product" +msgstr "Proizvod" + +#. module: mrp_subproduct +#: model:ir.model,name:mrp_subproduct.model_mrp_subproduct +msgid "Mrp Sub Product" +msgstr "Mrp Pod Proizvod" + +#. module: mrp_subproduct +#: field:mrp.subproduct,subproduct_type:0 +msgid "Quantity Type" +msgstr "Tip Kolicine" + +#. module: mrp_subproduct +#: field:mrp.subproduct,product_qty:0 +msgid "Product Qty" +msgstr "Kol, Proizvoda" + +#. module: mrp_subproduct +#: field:mrp.subproduct,product_uom:0 +msgid "Product UOM" +msgstr "JM proizvoda" + +#. module: mrp_subproduct +#: field:mrp.subproduct,bom_id:0 +msgid "BoM" +msgstr "BoM" + +#. module: mrp_subproduct +#: view:mrp.bom:0 +msgid "Sub Products" +msgstr "Pod proizvodi" + +#. module: mrp_subproduct +#: selection:mrp.subproduct,subproduct_type:0 +msgid "Variable" +msgstr "Promjenljiva" + +#. module: mrp_subproduct +#: field:mrp.bom,sub_products:0 +msgid "sub_products" +msgstr "pod_proizvod" + +#. module: mrp_subproduct +#: selection:mrp.subproduct,subproduct_type:0 +msgid "Fixed" +msgstr "Fiksno" + +#. module: mrp_subproduct +#: model:ir.module.module,shortdesc:mrp_subproduct.module_meta_information +msgid "MRP Sub Product" +msgstr "MRP Pod Proizvod" diff --git a/addons/mrp_subproduct/security/ir.model.access.csv b/addons/mrp_subproduct/security/ir.model.access.csv index cd093fa6ff1..307827265f2 100644 --- a/addons/mrp_subproduct/security/ir.model.access.csv +++ b/addons/mrp_subproduct/security/ir.model.access.csv @@ -1,4 +1,3 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" "access_mrp_subproduct_user","mrp.subproduct","model_mrp_subproduct","mrp.group_mrp_user",1,1,1,1 "access_mrp_subproduct_manager","mrp.subproduct manager","model_mrp_subproduct","mrp.group_mrp_manager",1,0,0,0 -"access_mrp_subproduct_system","mrp.subproduct system","model_mrp_subproduct","base.group_system",1,0,0,0 diff --git a/addons/outlook/plugin/openerp-outlook-plugin/tiny_xmlrpc.py b/addons/outlook/plugin/openerp-outlook-plugin/tiny_xmlrpc.py index af2c5afd35c..d520283bd2d 100755 --- a/addons/outlook/plugin/openerp-outlook-plugin/tiny_xmlrpc.py +++ b/addons/outlook/plugin/openerp-outlook-plugin/tiny_xmlrpc.py @@ -43,7 +43,7 @@ def execute(connector, method, *args): if e.args[0] == 111: if wait_count > wait_limit: print "Server is taking too long to start, it has exceeded the maximum limit of %d seconds."%(wait_limit) - clean() + # clean() Commented... sys.exit(1) print 'Please wait %d sec to start server....'%(waittime) wait_count += 1 diff --git a/addons/point_of_sale/i18n/sr.po b/addons/point_of_sale/i18n/sr.po index 06121a92100..4efa16dc46b 100644 --- a/addons/point_of_sale/i18n/sr.po +++ b/addons/point_of_sale/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 16:21+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 07:35+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: point_of_sale diff --git a/addons/point_of_sale/pos_view.xml b/addons/point_of_sale/pos_view.xml index 7453682f566..4d277d216c8 100644 --- a/addons/point_of_sale/pos_view.xml +++ b/addons/point_of_sale/pos_view.xml @@ -3,7 +3,7 @@ + groups="group_pos_manager,group_pos_user"/> pos.order @@ -150,7 +150,7 @@ - + @@ -697,7 +697,7 @@ - + @@ -706,7 +706,7 @@ + id="menu_point_config_product" sequence="25" groups="group_pos_manager"/> Products @@ -732,7 +732,7 @@ parent="menu_point_config_product" action="action_product_input" id="products_for_input_operations" - groups="base.group_system,group_pos_manager"/> + groups="group_pos_manager"/> Products @@ -758,7 +758,7 @@ parent="menu_point_config_product" action="action_product_output" id="products_for_output_operations" - groups="base.group_system,group_pos_manager"/> + groups="group_pos_manager"/> - + diff --git a/addons/point_of_sale/security/ir.model.access.csv b/addons/point_of_sale/security/ir.model.access.csv index 70a98128c2a..db62c9c8361 100644 --- a/addons/point_of_sale/security/ir.model.access.csv +++ b/addons/point_of_sale/security/ir.model.access.csv @@ -21,11 +21,9 @@ "access_report_sales_by_margin_pos","report.sales.by.margin.pos","model_report_sales_by_margin_pos","group_pos_user",1,0,0,0 "access_report_sales_by_margin_pos_month","report.sales.by.margin.pos.month","model_report_sales_by_margin_pos_month","group_pos_user",1,0,0,0 "access_report_pos_order","report.pos.order","model_report_pos_order","group_pos_user",1,1,1,1 -"access_report_pos_order_system","report.pos.order.system","model_report_pos_order","base.group_system",1,1,1,1 "access_report_pos_order","report.pos.order","model_report_pos_order","group_pos_manager",1,1,1,1 "access_account_bank_statement","account.bank.statement","account.model_account_bank_statement","group_pos_user",1,1,1,0 "access_account_bank_statement_manager","account.bank.statement manager","account.model_account_bank_statement","group_pos_manager",1,1,1,1 -"access_account_bank_statement_system","account.bank.statement system","account.model_account_bank_statement","base.group_system",1,0,0,0 "access_account_bank_statement_line","account.bank.statement.line","account.model_account_bank_statement_line","group_pos_user",1,1,1,0 "access_account_invoice_pos","account.invoice pos user","account.model_account_invoice","group_pos_user",1,1,1,0 "access_account_invoice_pos_manager","account.invoice pos manager","account.model_account_invoice","group_pos_manager",1,0,0,0 @@ -35,10 +33,8 @@ "access_account_invoice_tax_pos_manager","account.invoice.tax pos manager","account.model_account_invoice_tax","group_pos_manager",1,0,0,0 "access_account_period_pos","account.period pos user","account.model_account_period","group_pos_user",1,1,1,0 "access_account_period_pos_manager","account.period pos manager","account.model_account_period","group_pos_manager",1,0,0,0 -"access_account_period_pos_system","account.period pos system","account.model_account_period","base.group_system",1,0,0,0 "access_account_fiscalyear_pos_user","account.fiscalyear user","account.model_account_fiscalyear","group_pos_user",1,1,1,0 "access_account_fiscalyear_pos_manager","account.fiscalyear manager","account.model_account_fiscalyear","group_pos_manager",1,0,0,0 -"access_account_fiscalyear_pos_system","account.fiscalyear user","account.model_account_fiscalyear","base.group_system",1,0,0,0 "access_account_cashbox_line","account.cashbox.line","account.model_account_cashbox_line","group_pos_user",1,1,1,0 "access_account_cashbox_line_manager","account.cashbox.line manager","account.model_account_cashbox_line","group_pos_manager",1,1,1,1 "access_product_product","product.product","product.model_product_product","group_pos_user",1,0,0,0 @@ -50,31 +46,20 @@ "access_account_move","account.move","account.model_account_move","group_pos_manager",1,0,0,0 "access_account_journal","account.journal","account.model_account_journal","group_pos_user",1,1,1,0 "access_account_journal_manager","account.journal manager","account.model_account_journal","group_pos_manager",1,0,0,0 -"access_account_journal_system","account.journal system","account.model_account_journal","base.group_system",1,0,0,0 "access_account_journal_period_user","account.journal.period user","account.model_account_journal_period","group_pos_user",1,1,1,1 "access_account_journal_period_manager","account.journal.period manager","account.model_account_journal_period","group_pos_manager",1,0,0,0 "access_account_journal_view","account.journal.view","account.model_account_journal_view","group_pos_user",1,1,1,0 "access_account_journal_view_manager","account.journal.view manager","account.model_account_journal_view","group_pos_manager",1,0,0,0 -"access_account_journal_view_system","account.journal.view system","account.model_account_journal_view","base.group_system",1,0,0,0 "access_account_analytic_line","account.analytic.line","analytic.model_account_analytic_line","group_pos_user",1,1,1,0 "access_account_analytic_account","account.analytic.account","analytic.model_account_analytic_account","group_pos_user",1,1,1,0 "access_account_journal_column","account.journal.column","account.model_account_journal_column","group_pos_user",1,1,1,0 "access_account_journal_column_manager","account.journal.column manager","account.model_account_journal_column","group_pos_manager",1,0,0,0 -"access_account_journal_column_system","account.journal.column system","account.model_account_journal_column","base.group_system",1,0,0,0 "access_report_check_register","report.cash.register","model_report_cash_register","group_pos_manager",1,1,1,1 -"access_product_product_pos","product.product.pos","product.model_product_product","base.group_system",1,0,0,0 -"access_product_template_pos","product.template pos","product.model_product_template","base.group_system",1,1,1,1 "access_ir_property_pos_manager","ir.property manager","base.model_ir_property","group_pos_manager",1,1,1,1 -"access_pos_order_system","pos.order system","model_pos_order","base.group_system",1,0,0,0 -"access_pos_order_line_system","pos.order.line system","model_pos_order_line","base.group_system",1,0,0,0 "access_account_bank_statement_line_manager","account.bank.statement.line manager","account.model_account_bank_statement_line","group_pos_manager",1,1,1,1 "access_account_invoice_manager","account.invoice manager","account.model_account_invoice","group_pos_manager",1,1,1,1 -"access_report_transaction_pos_system","report.transaction.pos system","model_report_transaction_pos","base.group_system",1,1,1,1 -"access_account_bank_statement_line_system","account.bank.statement.line system","account.model_account_bank_statement_line","base.group_system",1,0,0,0 -"access_product_product_supplierinfo","product.supplierinfo system","product.model_product_supplierinfo","base.group_system",1,0,0,0 "access_product_product_supplierinfo_manager","product.supplierinfo manager","product.model_product_supplierinfo","group_pos_manager",1,0,0,0 "access_product_product_supplierinfo_user","product.supplierinfo user","product.model_product_supplierinfo","group_pos_user",1,0,0,0 -"access_product_product_packaging_system","product.packaging system","product.model_product_packaging","base.group_system",1,0,0,0 "access_product_product_packaging_user","product.packaging user","product.model_product_packaging","group_pos_user",1,0,0,0 "access_product_product_packaging_manager","product.packaging manager","product.model_product_packaging","group_pos_manager",1,0,0,0 "access_account_sequence_fiscalyear_manager","account.sequence.fiscalyear manager","account.model_account_sequence_fiscalyear","group_pos_manager",1,0,0,0 diff --git a/addons/point_of_sale/wizard/pos_payment.xml b/addons/point_of_sale/wizard/pos_payment.xml index 58b4dc447cd..f0536ae0ac8 100644 --- a/addons/point_of_sale/wizard/pos_payment.xml +++ b/addons/point_of_sale/wizard/pos_payment.xml @@ -1,48 +1,48 @@ - + - + Add payment : pos.make.payment form - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -54,5 +54,5 @@ new - - + + diff --git a/addons/point_of_sale/wizard/pos_return.py b/addons/point_of_sale/wizard/pos_return.py index 99e697ea826..abeadfc9931 100644 --- a/addons/point_of_sale/wizard/pos_return.py +++ b/addons/point_of_sale/wizard/pos_return.py @@ -143,6 +143,23 @@ class pos_return(osv.osv_memory): @return: Return the add product form again for adding more product """ + current_rec = self.read(cr, uid, data[0], context=context) + order_obj =self.pool.get('pos.order') + line_obj = self.pool.get('pos.order.line') + pos_current = order_obj.browse(cr, uid, context.get('active_id')) + pos_line_ids = pos_current.lines + if pos_line_ids: + for pos_line in pos_line_ids: + line_field = "return"+str(pos_line.id) + pos_list = current_rec.keys() + newline_vals = {} + if line_field in pos_list : + less_qty = current_rec.get(line_field) + pos_cur_line = line_obj.browse(cr, uid, pos_line.id, context=context) + qty = pos_cur_line.qty + qty = qty - less_qty + newline_vals.update({'qty':qty}) + line_obj.write(cr, uid, pos_line.id, newline_vals, context=context) return { 'name': _('Add Product'), 'view_type': 'form', diff --git a/addons/process/i18n/sr.po b/addons/process/i18n/sr.po index 4adb94895c5..a27778e2c95 100644 --- a/addons/process/i18n/sr.po +++ b/addons/process/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 17:10+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 08:27+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: process diff --git a/addons/process/process.py b/addons/process/process.py index 479b8748ff3..544ff73e761 100644 --- a/addons/process/process.py +++ b/addons/process/process.py @@ -30,16 +30,12 @@ class Env(dict): self.__usr = user def __getitem__(self, name): - if name in ('__obj', '__user'): - return super(ExprContext, self).__getitem__(name) - + return super(Env, self).__getitem__(name) if name == 'user': return self.__user - if name == 'object': return self.__obj - return self.__obj[name] class process_process(osv.osv): diff --git a/addons/process/security/ir.model.access.csv b/addons/process/security/ir.model.access.csv index 064f0454d02..7356880f47a 100644 --- a/addons/process/security/ir.model.access.csv +++ b/addons/process/security/ir.model.access.csv @@ -4,8 +4,3 @@ "access_process_transition","process.transition","model_process_transition","base.group_user",1,0,0,0 "access_process_transition_action","process.transition.action","model_process_transition_action","base.group_user",1,0,0,0 "access_process_condition","process.condition","model_process_condition","base.group_user",1,0,0,0 -"access_process_process_manager","process.process manager","model_process_process","base.group_system",1,1,1,1 -"access_process_node_manager","process.node manager","model_process_node","base.group_system",1,1,1,1 -"access_process_transition_manager","process.transition manager","model_process_transition","base.group_system",1,1,1,1 -"access_process_transition_action_manager","process.transition.action manager","model_process_transition_action","base.group_system",1,1,1,1 -"access_process_condition_manager","process.condition manager","model_process_condition","base.group_system",1,1,1,1 diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py index 4f0d3530a80..359586fae7e 100644 --- a/addons/procurement/procurement.py +++ b/addons/procurement/procurement.py @@ -335,8 +335,6 @@ class procurement_order(osv.osv): }) move_obj.action_confirm(cr, uid, [id], context=context) self.write(cr, uid, [procurement.id], {'move_id': id, 'close_move': 1}) - message = _("Procurement '%s' is running.") % procurement.name - self.log(cr, uid, procurement.id, message) self.write(cr, uid, ids, {'state': 'confirmed', 'message': ''}) return True @@ -370,9 +368,8 @@ class procurement_order(osv.osv): cr.execute('update procurement_order set message=%s where id=%s', (_('Not enough stock and no minimum orderpoint rule defined.'), procurement.id)) - message = _("Procurement '%s' has an exception." \ - "Not enough stock and no minimum orderpoint rule defined.") % \ - procurement.name + message = _("Procurement '%s' is in exception: not enough stock.") % \ + (procurement.name,) self.log(cr, uid, procurement.id, message) return ok @@ -451,8 +448,6 @@ class procurement_order(osv.osv): if procurement.move_id: if procurement.close_move and (procurement.move_id.state <> 'done'): move_obj.action_done(cr, uid, [procurement.move_id.id]) - message = _("Procurement '%s' is done.") % procurement.name - self.log(cr, uid, procurement.id, message) res = self.write(cr, uid, ids, {'state': 'done', 'date_close': time.strftime('%Y-%m-%d')}) wf_service = netsvc.LocalService("workflow") for id in ids: diff --git a/addons/procurement/procurement_view.xml b/addons/procurement/procurement_view.xml index 4d54fa256a8..53f84367b17 100644 --- a/addons/procurement/procurement_view.xml +++ b/addons/procurement/procurement_view.xml @@ -132,7 +132,7 @@ {'search_default_current':1} - Procurement Orders represent the need for a certain quantity of products, at a given time, in a given location. Sale Orders are one typical source of Procurement Orders (but these are distinct documents). Depending on the procurement parameters and the products configuration, the procurement engine will attempt to satisfy the need by reserving products from stock, or ordering products from a supplier, or passing a manufacturing order, etc. + A procurement order is used to record a need in a specific product at a specific location. They are usually created automatically by the sales orders, the Pull Logistics rules or the minimum stock rules. When the procurement order is confirmed, it creates automatically the necessary operations to fullfil the need: purchase order proposition, manufacturing order, etc. @@ -235,6 +235,7 @@ form + You can define your minimum stock rules, so that OpenERP will trigger automatically the propositions of manufacturing or purchase orders according to the stock level. Once the virtual stock of a product (=stock on hand minus all confirmed orders and reservations) is bellow the minimum quantity, OpenERP will generate a procurement request in order to fullfil the stock up to the maximum quantity. form - + diff --git a/addons/product/i18n/sr.po b/addons/product/i18n/sr.po index 2a17ab4b5a7..8cc0f2990fa 100644 --- a/addons/product/i18n/sr.po +++ b/addons/product/i18n/sr.po @@ -8,19 +8,19 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-09-09 07:17+0000\n" -"Last-Translator: Sonja Sardelić \n" +"PO-Revision-Date: 2010-10-16 08:45+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:06+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: product #: view:product.pricelist.item:0 msgid "Max. Margin" -msgstr "" +msgstr "Maks. marža" #. module: product #: view:product.pricelist.item:0 @@ -121,7 +121,7 @@ msgstr "Obezbeđene metode" #. module: product #: constraint:ir.actions.act_window:0 msgid "Invalid model name in the action definition." -msgstr "" +msgstr "Pogrešno ime modela u definiciji akcije." #. module: product #: model:process.process,name:product.process_process_productprocess0 @@ -197,7 +197,7 @@ msgstr "Zalihe proizvoda" #. module: product #: model:product.category,name:product.product_category_services msgid "Services" -msgstr "Servisi" +msgstr "Usluge" #. module: product #: help:product.template,list_price:0 @@ -230,12 +230,12 @@ msgstr "Datum od kada je ova verzija cenovnika validna." #. module: product #: field:product.product,incoming_qty:0 msgid "Incoming" -msgstr "Dolazno" +msgstr "Ulazna" #. module: product #: selection:product.template,procure_method:0 msgid "Make to Stock" -msgstr "Pravljenje zaliha" +msgstr "Prebaci na zalihu" #. module: product #: view:product.product:0 @@ -246,7 +246,7 @@ msgstr "Težina" #. module: product #: model:product.template,name:product.product_product_fan2_product_template msgid "Silent fan" -msgstr "" +msgstr "Tihi ventilator" #. module: product #: help:product.template,supply_method:0 @@ -276,7 +276,7 @@ msgstr "Prodajni cenovnik" #. module: product #: field:product.pricelist.item,base_pricelist_id:0 msgid "If Other Pricelist" -msgstr "" +msgstr "Ako je drugi cjenik" #. module: product #: model:ir.actions.act_window,name:product.product_normal_action @@ -294,7 +294,7 @@ msgid "" "Rounding is applied after the discount and before the surcharge.\n" "To have prices that end in 9.99, set rounding 10, surcharge -0.01" msgstr "" -"Postavite cenu tako da je ona višestruka ova vrednost.\n" +"Postavlja cenu tako da je ona višestruka vrednost ove vrednosti.\n" "Zaokruženje se primenjuje nakon popusta a pre poskupljenja.\n" "Ako hoćete da Vam se cena završava sa 9.99, postavite zaokruženje 10, " "dodatak -0.01" @@ -307,7 +307,7 @@ msgstr "Nova cena =" #. module: product #: field:product.product,virtual_available:0 msgid "Virtual Stock" -msgstr "Stvarne zalihe" +msgstr "Efektivna zaliha" #. module: product #: selection:product.template,mes_type:0 @@ -355,7 +355,7 @@ msgstr "Naziv pravila" #. module: product #: model:ir.ui.menu,name:product.menu_config_product msgid "Configuration" -msgstr "Konfiguracija" +msgstr "Podešavanje" #. module: product #: field:product.packaging,rows:0 @@ -401,7 +401,7 @@ msgstr "Tastatura" #. module: product #: field:product.supplierinfo,name:0 msgid "Partner" -msgstr "Партнер" +msgstr "Partner" #. module: product #: field:product.template,sale_delay:0 @@ -452,7 +452,7 @@ msgstr "Eksplicitno ime pravila za ovu stavku cenovnika." #. module: product #: view:product.pricelist.item:0 msgid "Min. Margin" -msgstr "" +msgstr "Min. marža" #. module: product #: view:product.pricelist.item:0 @@ -467,7 +467,7 @@ msgstr "Procesor AMD Athlon XP 1800+" #. module: product #: selection:product.template,state:0 msgid "In Production" -msgstr "U produkciji" +msgstr "U proizvodnji" #. module: product #: field:product.category,child_id:0 @@ -536,7 +536,7 @@ msgstr "Cenovnici" #. module: product #: field:product.supplierinfo,product_name:0 msgid "Partner Product Name" -msgstr "Naziv proizvoda partnera" +msgstr "Partnerov naziv proizvoda" #. module: product #: view:product.product:0 diff --git a/addons/product/pricelist_view.xml b/addons/product/pricelist_view.xml index 589dfb5f290..76623dc5710 100644 --- a/addons/product/pricelist_view.xml +++ b/addons/product/pricelist_view.xml @@ -42,6 +42,7 @@ product.pricelist.version form + There can be more than one version of a pricelist. If you need to create new versions of a pricelist, you can do it and manage them from here. Some examples of versions: 2010, 2011, Promotion of February 2010, etc. form tree,form + A pricelist contains rules to be evaluated in order to compute the purchase or sale price for all the partners assigned to a pricelist. Pricelists have several versions (2010, 2011, Promotion of February 2010, etc.) and each version has several rules. Example: the customer price of this category of product will be based on the supplier price multiplied by 1.80. - + - + @@ -53,7 +53,7 @@ - + @@ -90,6 +90,16 @@ + + + + + + + + + + @@ -98,11 +108,11 @@ - + - + - + @@ -140,16 +150,7 @@ - - - - - - - - - - + @@ -193,11 +194,11 @@ form - In OpenERP, a product is something you can buy and sell. It can be a raw material, a stockable product, a consumable or a service. The product form contains a detailed information on the products like procurement logistic, sales price, product category, suppliers, etc. + You must define a Product for everything you buy or sell. They can be raw materials, stockable products, consumables or services. The Product form contains a detailed information of your products related to procurement logistics, sales price, product category, suppliers and so on. - - + + Products @@ -207,6 +208,7 @@ [('purchase_ok','=',1)] + Products can be purchased and/or sold. They can be raw materials, stockable products, consumables or services. The Product form contains a detailed information on your products related to procurement logistics, sales price, product category, suppliers and so on. @@ -252,7 +254,7 @@ [('parent_id','=',False)] tree - This is a hyerarchical structure of your product's categories, you can enter a category to browse all products in this category and his children. + Create and manage product categories you want to be maintained in the system. This allows you to classify your products according to your needs. product.uom form + Create and manage the units of measure you want to be used in your system. You can define a conversion rate to be used between the several Unit of Measure within the same category. @@ -366,6 +369,7 @@ product.uom.categ form tree,form + Create and manage the units of measure categories you want to be used in your system. If several units of measures are in the same category, they can be converted within each other. For example, in the unit of measure category "Time", you will have the following UoM: Hours, Days. @@ -397,6 +401,7 @@ product.ul form tree,form + Create and manage your packaging dimensions and types you want to be maintained in your system. @@ -526,7 +531,7 @@ - + @@ -555,6 +560,13 @@ + + + + + + + @@ -562,11 +574,11 @@ - + - + @@ -601,12 +613,7 @@ - - - - - - + diff --git a/addons/product/security/ir.model.access.csv b/addons/product/security/ir.model.access.csv index 7b8da0dd675..2e4e598fdfe 100644 --- a/addons/product/security/ir.model.access.csv +++ b/addons/product/security/ir.model.access.csv @@ -30,14 +30,4 @@ "access_product_pricelist_partner_manager","product.pricelist partner manager","model_product_pricelist","base.group_partner_manager",1,0,0,0 "access_ir_property_group_product_manager","ir_property group_product_manager","base.model_ir_property","product.group_product_manager",1,1,1,1 "access_product_group_res_partner","res_partner group_product_manager","base.model_res_partner","product.group_product_manager",1,1,1,1 -"access_product_price_type","product.price.type ","model_product_price_type","base.group_system",1,1,1,1 -"access_product_pricelist_type","product.pricelist.type ","model_product_pricelist_type","base.group_system",1,1,1,1 -"access_product_pricelist","product.pricelist ","model_product_pricelist","base.group_system",1,1,1,1 -"access_product_pricelist_version","product.pricelist.version ","model_product_pricelist_version","base.group_system",1,1,1,1 -"access_product_pricelist_item","product.pricelist.item ","model_product_pricelist_item","base.group_system",1,1,1,1 -"access_product_uom_categ","product.uom.categ","model_product_uom_categ","base.group_system",1,1,1,1 -"access_product_uom","product.uom","model_product_uom","base.group_system",1,1,1,1 -"access_product_ul_system","product.ul system","model_product_ul","base.group_system",1,1,1,1 -"access_product_product_system","product.product system","model_product_product","base.group_system",1,0,0,0 -"access_product_category_system","product.category.system","model_product_category","base.group_system",1,1,1,1 "access_product_product_employee","product.product employee","model_product_product","base.group_user",1,0,0,0 diff --git a/addons/product/security/product_security.xml b/addons/product/security/product_security.xml index 171cf523b8b..32399358f68 100644 --- a/addons/product/security/product_security.xml +++ b/addons/product/security/product_security.xml @@ -6,7 +6,7 @@ Useability / Product UoS View - Product / Manager + Product Manager diff --git a/addons/product_expiry/i18n/sr.po b/addons/product_expiry/i18n/sr.po index 45aff2de715..0e23a25ed56 100644 --- a/addons/product_expiry/i18n/sr.po +++ b/addons/product_expiry/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-06-30 15:09+0000\n" -"PO-Revision-Date: 2010-10-14 16:33+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:06+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: product_expiry diff --git a/addons/product_manufacturer/i18n/mn.po b/addons/product_manufacturer/i18n/mn.po index 634d811682c..b8c7ddbf7b7 100644 --- a/addons/product_manufacturer/i18n/mn.po +++ b/addons/product_manufacturer/i18n/mn.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-08-12 12:35+0000\n" -"PO-Revision-Date: 2010-08-13 08:22+0000\n" -"Last-Translator: ub121 \n" +"PO-Revision-Date: 2010-10-15 10:00+0000\n" +"Last-Translator: sugi \n" "Language-Team: Mongolian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:17+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: product_manufacturer @@ -27,7 +27,7 @@ msgstr "" #. module: product_manufacturer #: field:product.product,manufacturer_pref:0 msgid "Manufacturer Product Code" -msgstr "" +msgstr "Бараа үйлдвэрлэгчийн код" #. module: product_manufacturer #: constraint:ir.ui.view:0 @@ -56,7 +56,7 @@ msgstr "Барааны атрибутууд" #: view:product.manufacturer.attribute:0 #: view:product.product:0 msgid "Product Attributes" -msgstr "" +msgstr "Барааны онцлогууд" #. module: product_manufacturer #: field:product.manufacturer.attribute,name:0 @@ -88,7 +88,7 @@ msgstr "Бүтээгдэхүүний Атрибут & Үйлдвэрлэгч" #. module: product_manufacturer #: field:product.product,manufacturer_pname:0 msgid "Manufacturer Product Name" -msgstr "" +msgstr "Бараа үйлдвэрлэгчийн нэр" #. module: product_manufacturer #: view:product.product:0 diff --git a/addons/product_margin/i18n/sr.po b/addons/product_margin/i18n/sr.po index 093d6fe3963..c2e99bd2878 100644 --- a/addons/product_margin/i18n/sr.po +++ b/addons/product_margin/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 16:52+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:21+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: product_margin diff --git a/addons/product_margin/product_margin_view.xml b/addons/product_margin/product_margin_view.xml index 7ebd5f34588..cde2d514560 100644 --- a/addons/product_margin/product_margin_view.xml +++ b/addons/product_margin/product_margin_view.xml @@ -84,7 +84,7 @@ - + diff --git a/addons/product_visible_discount/i18n/sr.po b/addons/product_visible_discount/i18n/sr.po index ec3aaa917c3..94fa025a2e8 100644 --- a/addons/product_visible_discount/i18n/sr.po +++ b/addons/product_visible_discount/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-03-25 12:11+0000\n" -"PO-Revision-Date: 2010-10-14 16:57+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:38+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: product_visible_discount diff --git a/addons/profile_tools/installer.py b/addons/profile_tools/installer.py index 54fd0602802..6ea024aebbe 100644 --- a/addons/profile_tools/installer.py +++ b/addons/profile_tools/installer.py @@ -29,9 +29,10 @@ class misc_tools_installer(osv.osv_memory): 'subscription':fields.boolean('Recurring Documents',help='Helps to generate automatically recurring documents.'), 'survey':fields.boolean('Survey',help='Allows you to organize surveys.'), 'idea':fields.boolean('Ideas Box',help='Promote ideas of the employees, votes and discussion on best ideas.'), + 'share':fields.boolean('Share Data / Portals',help='This module allows you to easily give restricted access of any filtered list of objects to any customer or supplier.' \ + 'Just click on the share icon to give access to your customers on their project\'s tasks, support requests, invoices, etc.'), } _defaults = { - 'lunch': True, } misc_tools_installer() diff --git a/addons/profile_tools/misc_tools_installer.xml b/addons/profile_tools/misc_tools_installer.xml index b59f95ab908..d81936756a6 100644 --- a/addons/profile_tools/misc_tools_installer.xml +++ b/addons/profile_tools/misc_tools_installer.xml @@ -25,6 +25,7 @@ Configure + diff --git a/addons/project/board_project_view.xml b/addons/project/board_project_view.xml index dc985d4e515..bc86872110a 100644 --- a/addons/project/board_project_view.xml +++ b/addons/project/board_project_view.xml @@ -23,7 +23,7 @@ - + @@ -36,25 +36,16 @@ tree - - + + - - - - + @@ -137,10 +128,5 @@ parent="next_id_86" sequence="1"/> - - diff --git a/addons/project/company.py b/addons/project/company.py index 18f970118a4..0967d130737 100644 --- a/addons/project/company.py +++ b/addons/project/company.py @@ -31,13 +31,5 @@ class res_company(osv.osv): "forget to setup the right unit of measure in your employees.", ), } - - def write(self, cr, uid, ids,vals, context={}): - task_ids=self.pool.get('project.task').search(cr, uid, [('state','in',['open', 'pending'])]) - if ('project_time_mode_id' in vals) and task_ids: - raise osv.except_osv(_('Error !'), _('You cannot modify Project Time Unit as there are open or pending tasks created with current time unit.')) - return super(res_company,self).write(cr, uid, ids, vals, context=context) - res_company() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project/installer.py b/addons/project/installer.py index 7a147737768..693e2d58018 100644 --- a/addons/project/installer.py +++ b/addons/project/installer.py @@ -47,11 +47,6 @@ class project_installer(osv.osv_memory): 'project_gtd': fields.boolean('Getting Things Done', help="GTD is a methodology to efficiently organise yourself and your tasks. This module fully integrates GTD principle with OpenERP's project management."), } - - _defaults={ - 'project_issue': True, - } - project_installer() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project/project.py b/addons/project/project.py index 26f67d706ba..254d447b618 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -78,82 +78,30 @@ class project(osv.osv): pricelist_id = pricelist.get('property_product_pricelist', False) and pricelist.get('property_product_pricelist')[0] or False return {'value':{'contact_id': addr['contact'], 'pricelist_id': pricelist_id}} - def _get_user_and_default_uom_ids(self, cr, uid): - users_obj = self.pool.get('res.users') - model_data_obj = self.pool.get('ir.model.data') - model_data_id = model_data_obj._get_id(cr, uid, 'product', 'uom_hour') - default_uom = user_uom = model_data_obj.read(cr, uid, [model_data_id], ['res_id'])[0]['res_id'] - obj_tm = users_obj.browse(cr, uid, uid).company_id.project_time_mode_id - if obj_tm: - user_uom = obj_tm.id - return user_uom, default_uom - def _progress_rate(self, cr, uid, ids, names, arg, context=None): - def _get_all_child_projects(ids): - """Recursively get child project ids""" - child_ids = flatten([project_hierarchy.get(idn, []) for idn in ids]) - if child_ids: - child_ids = _get_all_child_projects(child_ids) - return ids + child_ids - # END _get_all_child_projects - res = {}.fromkeys(ids, 0.0) progress = {} if not ids: return res - - par_child_projects = {} - all_projects = list(ids) - - # get project hierarchy: - cr.execute('''SELECT prp.id AS pr_parent_id, prpc.id AS pr_child_id - FROM account_analytic_account AS p - JOIN account_analytic_account AS c ON p.id = c.parent_id - JOIN project_project AS prp ON prp.analytic_account_id = p.id - JOIN project_project AS prpc ON prpc.analytic_account_id = c.id''') - - project_hierarchy = dict((k, list(set([v[1] for v in itr]))) for k, itr in groupby(cr.fetchall(), itemgetter(0))) - - for id in ids: - child_projects = _get_all_child_projects([id]) - par_child_projects[id] = child_projects - all_projects.extend(child_projects) - - all_projects = dict.fromkeys(all_projects).keys() cr.execute('''SELECT project_id, sum(planned_hours), sum(total_hours), sum(effective_hours) FROM - project_task + project_task WHERE - project_id IN %s AND + project_id in %s AND state<>'cancelled' GROUP BY - project_id''',(tuple(all_projects),)) - progress = dict(map(lambda x: (x[0], (x[1] or 0.0, x[2] or 0.0, x[3] or 0.0)), cr.fetchall())) + project_id''', + (tuple(ids),)) + progress = dict(map(lambda x: (x[0], (x[1],x[2],x[3])), cr.fetchall())) - user_uom, def_uom = self._get_user_and_default_uom_ids(cr, uid) - for project in self.browse(cr, uid, par_child_projects.keys(), context=context): - s = [0.0, 0.0, 0.0] - tocompute = par_child_projects[project.id] - while tocompute: - p = tocompute.pop() - for i in range(3): - s[i] += progress.get(p, (0.0, 0.0, 0.0))[i] - - uom_obj = self.pool.get('product.uom') - if user_uom != def_uom: - s[0] = uom_obj._compute_qty(cr, uid, user_uom, s[0], def_uom) - s[1] = uom_obj._compute_qty(cr, uid, user_uom, s[1], def_uom) - s[2] = uom_obj._compute_qty(cr, uid, user_uom, s[2], def_uom) - if project.state == 'close': - progress_rate = 100.0 - else: - progress_rate = s[1] and round(min(100.0 * s[2] / s[1], 99.99), 2) + for project in self.browse(cr, uid, ids, context=context): + s = progress.get(project.id, (0.0,0.0,0.0)) res[project.id] = { 'planned_hours': s[0], 'effective_hours': s[2], 'total_hours': s[1], - 'progress_rate': progress_rate + 'progress_rate': s[1] and (100.0 * s[2] / s[1]) or 0.0 } return res @@ -173,7 +121,6 @@ class project(osv.osv): if work.task_id and work.task_id.project_id: result[work.task_id.project_id.id] = True return result.keys() - def unlink(self, cr, uid, ids, *args, **kwargs): for proj in self.browse(cr, uid, ids): if proj.tasks: @@ -189,13 +136,13 @@ class project(osv.osv): 'warn_manager': fields.boolean('Warn Manager', help="If you check this field, the project manager will receive a request each time a task is completed by his team.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'members': fields.many2many('res.users', 'project_user_rel', 'project_id', 'uid', 'Project Members', help="Project's member. Not used in any computation, just for information purpose.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'tasks': fields.one2many('project.task', 'project_id', "Project tasks"), - 'planned_hours': fields.function(_progress_rate, multi="progress", method=True, string='Planned Time', help="Sum of planned hours of all tasks related to this project and its child projects.", + 'planned_hours': fields.function(_progress_rate, multi="progress", method=True, string='Planned Time', help="Sum of planned hours of all tasks related to this project and its child projects.", store = { 'project.project': (lambda self, cr, uid, ids, c={}: ids, ['tasks'], 10), 'project.task': (_get_project_task, ['planned_hours', 'effective_hours', 'remaining_hours', 'total_hours', 'progress', 'delay_hours'], 10), 'project.task.work': (_get_project_work, ['hours'], 10), }), - 'effective_hours': fields.function(_progress_rate, multi="progress", method=True, string='Time Spent', help="Sum of spent hours of all tasks related to this project and its child projects.", + 'effective_hours': fields.function(_progress_rate, multi="progress", method=True, string='Time Spent', help="Sum of spent hours of all tasks related to this project and its child projects.", store = { 'project.project': (lambda self, cr, uid, ids, c={}: ids, ['tasks'], 10), 'project.task': (_get_project_task, ['planned_hours', 'effective_hours', 'remaining_hours', 'total_hours', 'progress', 'delay_hours'], 10), @@ -227,11 +174,12 @@ class project(osv.osv): 'sequence': 10, } + # TODO: Why not using a SQL contraints ? def _check_dates(self, cr, uid, ids): - leave = self.read(cr, uid, ids[0], ['date_start', 'date']) - if leave['date_start'] and leave['date']: - if leave['date_start'] > leave['date']: - return False + for leave in self.read(cr, uid, ids, ['date_start', 'date']): + if leave['date_start'] and leave['date']: + if leave['date_start'] > leave['date']: + return False return True _constraints = [ @@ -248,7 +196,7 @@ class project(osv.osv): task_obj.write(cr, uid, task_ids, {'state': 'done', 'date_end':time.strftime('%Y-%m-%d %H:%M:%S'), 'remaining_hours': 0.0}) self.write(cr, uid, ids, {'state':'close'}, context=context) for (id, name) in self.name_get(cr, uid, ids): - message = _('Project ') + " '" + name + "' "+ _("is Closed.") + message = _("The project '%s' has been closed.") % name self.log(cr, uid, id, message) return True @@ -270,7 +218,7 @@ class project(osv.osv): def reset_project(self, cr, uid, ids, context=None): res = self.setActive(cr, uid, ids, value=True, context=context) for (id, name) in self.name_get(cr, uid, ids): - message = _('Project ') + " '" + name + "' "+ _("is Open.") + message = _("The project '%s' has been opened.") % name self.log(cr, uid, id, message) return res @@ -387,17 +335,8 @@ class task(osv.osv): res = {} cr.execute("SELECT task_id, COALESCE(SUM(hours),0) FROM project_task_work WHERE task_id IN %s GROUP BY task_id",(tuple(ids),)) hours = dict(cr.fetchall()) - - uom_obj = self.pool.get('product.uom') - user_uom, default_uom = project_obj._get_user_and_default_uom_ids(cr, uid) - if user_uom != default_uom: - for task in self.browse(cr, uid, ids, context=context): - if hours.get(task.id, False): - dur_in_user_uom = uom_obj._compute_qty(cr, uid, default_uom, hours.get(task.id, 0.0), user_uom) - hours[task.id] = dur_in_user_uom - for task in self.browse(cr, uid, ids, context=context): - res[task.id] = {'effective_hours': hours.get(task.id, 0.0), 'total_hours': task.remaining_hours + hours.get(task.id, 0.0)} + res[task.id] = {'effective_hours': hours.get(task.id, 0.0), 'total_hours': (task.remaining_hours or 0.0) + hours.get(task.id, 0.0)} res[task.id]['delay_hours'] = res[task.id]['total_hours'] - task.planned_hours res[task.id]['progress'] = 0.0 if (task.remaining_hours + hours.get(task.id, 0.0)): @@ -463,7 +402,7 @@ class task(osv.osv): 'description': fields.text('Description'), 'priority': fields.selection([('4','Very Low'), ('3','Low'), ('2','Medium'), ('1','Urgent'), ('0','Very urgent')], 'Priority'), 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of tasks."), - 'type_id': fields.many2one('project.task.type', 'Stage',), + 'type_id': fields.many2one('project.task.type', 'Stage'), 'state': fields.selection([('draft', 'Draft'),('open', 'In Progress'),('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')], 'State', readonly=True, required=True, help='If the task is created the state is \'Draft\'.\n If the task is started, the state becomes \'In Progress\'.\n If review is needed the task is in \'Pending\' state.\ \n If the task is over, the states is set to \'Done\'.'), @@ -478,23 +417,23 @@ class task(osv.osv): 'planned_hours': fields.float('Planned Hours', help='Estimated time to do the task, usually set by the project manager when the task is in draft state.'), 'effective_hours': fields.function(_hours_get, method=True, string='Hours Spent', multi='hours', help="Computed using the sum of the task work done.", store = { - 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['work_ids'], 10), + 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['work_ids', 'remaining_hours', 'planned_hours'], 10), 'project.task.work': (_get_task, ['hours'], 10), }), 'remaining_hours': fields.float('Remaining Hours', digits=(16,2), help="Total remaining time, can be re-estimated periodically by the assignee of the task."), 'total_hours': fields.function(_hours_get, method=True, string='Total Hours', multi='hours', help="Computed as: Time Spent + Remaining Time.", store = { - 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['work_ids'], 10), + 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['work_ids', 'remaining_hours', 'planned_hours'], 10), 'project.task.work': (_get_task, ['hours'], 10), }), 'progress': fields.function(_hours_get, method=True, string='Progress (%)', multi='hours', group_operator="avg", help="Computed as: Time Spent / Total Time.", store = { - 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['work_ids'], 10), + 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['work_ids', 'remaining_hours', 'planned_hours','state'], 10), 'project.task.work': (_get_task, ['hours'], 10), }), 'delay_hours': fields.function(_hours_get, method=True, string='Delay Hours', multi='hours', help="Computed as difference of the time estimated by the project manager and the real time to close the task.", store = { - 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['work_ids'], 10), + 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['work_ids', 'remaining_hours', 'planned_hours'], 10), 'project.task.work': (_get_task, ['hours'], 10), }), 'user_id': fields.many2one('res.users', 'Assigned to'), @@ -629,7 +568,7 @@ class task(osv.osv): if reopen: self.do_reopen(cr, uid, [parent_id.id]) self.write(cr, uid, [task.id], {'state': 'done', 'date_end':time.strftime('%Y-%m-%d %H:%M:%S'), 'remaining_hours': 0.0}) - message = _('Task ') + " '" + task.name + "' "+ _("is Done.") + message = _("The task '%s' is done") % (task.name,) self.log(cr, uid, task.id, message) return True @@ -670,7 +609,7 @@ class task(osv.osv): 'ref_doc1': 'project.task,%d' % task.id, 'ref_doc2': 'project.project,%d' % project.id, }) - message = _('Task ') + " '" + task.name + "' "+ _("is Cancelled.") + message = _("The task '%s' is cancelled.") % (task.name,) self.log(cr, uid, task.id, message) self.write(cr, uid, [task.id], {'state': 'cancelled', 'remaining_hours':0.0}) return True @@ -682,7 +621,7 @@ class task(osv.osv): if not t.date_start: data['date_start'] = time.strftime('%Y-%m-%d %H:%M:%S') self.write(cr, uid, [t.id], data) - message = _('Task ') + " '" + t.name + "' "+ _("is Open.") + message = _("The task '%s' is opened.") % (t.name,) self.log(cr, uid, t.id, message) return True @@ -719,15 +658,15 @@ class task(osv.osv): else: self.do_close(cr, uid, [task.id], context) user_pool = self.pool.get('res.users') - delegrate_user = user_pool.browse(cr, uid, delegate_data['user_id'], context=context) - message = _('Task ') + " '" + delegate_data['name'] + "' "+ _("is Delegated to User:") +" '"+ delegrate_user.name +"' " + delegate_user = user_pool.browse(cr, uid, delegate_data['user_id'], context=context) + message = _("The task '%s' has been delegated to %s.") % (delegate_data['name'], delegate_user.name) self.log(cr, uid, task.id, message) return True def do_pending(self, cr, uid, ids, *args): self.write(cr, uid, ids, {'state': 'pending'}) for (id, name) in self.name_get(cr, uid, ids): - message = _('Task ') + " '" + name + "' "+ _("is Pending.") + message = _("The task '%s' is pending.") % name self.log(cr, uid, id, message) return True @@ -773,54 +712,25 @@ class project_work(osv.osv): } _order = "date desc" - def create(self, cr, uid, vals, *args, **kwargs): - project_obj = self.pool.get('project.project') - uom_obj = self.pool.get('product.uom') - if vals.get('hours', False): - user_uom, default_uom = project_obj._get_user_and_default_uom_ids(cr, uid) - duration = vals['hours'] - if user_uom != default_uom: - duration = uom_obj._compute_qty(cr, uid, default_uom, duration, user_uom) - cr.execute('update project_task set remaining_hours=remaining_hours - %s where id=%s', (duration, vals['task_id'])) - return super(project_work, self).create(cr, uid, vals, *args, **kwargs) + if 'hours' in vals and (not vals['hours']): + vals['hours'] = 0.00 + if 'task_id' in vals: + cr.execute('update project_task set remaining_hours=remaining_hours - %s where id=%s', (vals.get('hours',0.0), vals['task_id'])) + return super(project_work,self).create(cr, uid, vals, *args, **kwargs) - def write(self, cr, uid, ids, vals, context=None): - project_obj = self.pool.get('project.project') - uom_obj = self.pool.get('product.uom') - if vals.get('hours', False): - old_hours = self.browse(cr, uid, ids, context=context) - user_uom, default_uom = project_obj._get_user_and_default_uom_ids(cr, uid) - duration = vals['hours'] - for old in old_hours: - if vals.get('hours') != old.hours: - # this code is only needed when we update the hours of the project - # TODO: it may still a second calculation if the task.id is changed - # at this task. - if user_uom == default_uom: - for work in self.browse(cr, uid, ids, context=context): - cr.execute('update project_task set remaining_hours=remaining_hours - %s + (%s) where id=%s', (duration, work.hours, work.task_id.id)) - else: - for work in self.browse(cr, uid, ids, context=context): - duration = uom_obj._compute_qty(cr, uid, default_uom, duration, user_uom) - del_work = uom_obj._compute_qty(cr, uid, default_uom, work.hours, user_uom) - cr.execute('update project_task set remaining_hours=remaining_hours - %s + (%s) where id=%s', (duration, del_work, work.task_id.id)) - return super(project_work,self).write(cr, uid, ids, vals, context=context) + def write(self, cr, uid, ids,vals,context={}): + if 'hours' in vals and (not vals['hours']): + vals['hours'] = 0.00 + if 'hours' in vals: + for work in self.browse(cr, uid, ids, context): + cr.execute('update project_task set remaining_hours=remaining_hours - %s + (%s) where id=%s', (vals.get('hours',0.0), work.hours, work.task_id.id)) + return super(project_work,self).write(cr, uid, ids, vals, context) def unlink(self, cr, uid, ids, *args, **kwargs): - context = kwargs.get('context', {}) - project_obj = self.pool.get('project.project') - uom_obj = self.pool.get('product.uom') - user_uom, default_uom = project_obj._get_user_and_default_uom_ids(cr, uid) - if user_uom == default_uom: - for work in self.browse(cr, uid, ids, context): - cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (work.hours, work.task_id.id)) - else: - for work in self.browse(cr, uid, ids, context): - duration = uom_obj._compute_qty(cr, uid, default_uom, work.hours, user_uom) - cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (duration, work.task_id.id)) - return super(project_work, self).unlink(cr, uid, ids, *args, **kwargs) - + for work in self.browse(cr, uid, ids): + cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (work.hours, work.task_id.id)) + return super(project_work,self).unlink(cr, uid, ids,*args, **kwargs) project_work() class account_analytic_account(osv.osv): diff --git a/addons/project/project_demo.xml b/addons/project/project_demo.xml index e365d095a20..0c1c386a700 100644 --- a/addons/project/project_demo.xml +++ b/addons/project/project_demo.xml @@ -2,6 +2,216 @@ + + + + Phuong + + phu + phu + + + Anthony + + al + al + + + Quentin + + qdp + qdp + + + Francois + + fpi + fpi + + + Julien + + jth + jth + + + Alien + + apr + apr + + + Fabian + + fbs + fbs + + + + + + open + normal + Integrate a Sale and Warehouse Management. + + + Integrate a Sale and Warehouse Management. + + + + + + + + 2 + + Prepare Requirements Document + + + + + + 2 + + Make SRS + + + + + + 2 + + Design Use Cases + + + + + + 2 + + Budget Planning + + + + + + 2 + + Quality Planning + + + + + + 2 + + Risk Management Planning + + + + + + 2 + + Create Project Schedules + + + + + + 2 + + Dataflow Design + + + + + + 2 + + User Interface Design + + + + + + 2 + + Develop Module in Sale Management + + + + + + 2 + + Develop module in Warehouse + + + + + + 2 + + Integrate Modules + + + + + + 2 + + Unit Testing + + + + + + 2 + + Regression Test + + + + + + 2 + + Documentation + + + + + + + 2 + + Performance Tuning + + + + + + 2 + + Deploy and Review on Customer System + + + + + + 2 + + Training and Presentation + + @@ -61,7 +271,7 @@ 38.0 38.0 - + BoM, After sales returns, interventions. Traceability. @@ -70,7 +280,7 @@ 16.0 16.0 - + Data importation + Doc @@ -78,7 +288,7 @@ 16.0 16.0 - + Modifications asked by the customer. @@ -86,7 +296,7 @@ 16.0 16.0 - + 0 @@ -96,7 +306,7 @@ 15 8.0 8.0 - + Internal testing + Software Install @@ -105,7 +315,7 @@ 17 16.0 16.0 - + 2 open @@ -147,7 +357,6 @@ MRP; functional layer done - 30 diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 3ea6dab6649..8cf262237da 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -5,10 +5,10 @@ + groups="group_project_manager,group_project_user"/> - + @@ -158,7 +158,7 @@ {'search_default_Current':1} - Consult and define your projects here. A project contains a set of related activities that will be performed by your company. Any project can be put into a hierarchy, as a child of a Parent Project. This allows you to design large project structure very useful for work organization. + A project contains a set of tasks or issues that will be performed by your resources assigned on it. A project can be put into a hierarchy, as a child of a Parent Project. This allows you to design large project structure with different phases spread over the project duration cycle. Each user can set his default project in his own preferences, in order to filter automatically the tasks or issues he usually works on. @@ -304,15 +304,14 @@ tree - + - - + - - + + @@ -389,11 +388,9 @@ icon="gtk-execute" groups="base.group_extended"/> - + - - @@ -405,7 +402,7 @@ - + @@ -428,9 +425,9 @@ {"search_default_project_id":project_id, "search_default_user_id":uid, "search_default_current": 1} - In OpenERP, a project is made of a set of activities (or tasks) for completion. A list view allows the manager to quickly check for task status and make it evolve, delegate task, etc. A search tool allows a multi-criteria sort of activities. + A task represents a work that has to be done. Each user works in his own list of tasks where he can record his task work in hours. He can work and close the task itself or delegate it to antoher user. If you delegate a task to another user, you get a new task in pending state, which will be re-opened when you have to review the work achieved. If you install the project_timesheet module, tasks works can be invoiced based on the project configuration. With the project_mrp module, sales orders can create tasks automatically when they are confirmed. - + Overpassed Tasks @@ -492,15 +489,16 @@ project.task.type form + Define here the steps that will be used on the project from the creation of the task, up to the closing of the task or issue. You will use these stages in order to track the progress of the resolution of a task or an issue. - + - @@ -115,13 +115,13 @@ - + - + - + @@ -146,10 +146,10 @@ tree,graph {'search_default_month':1,'search_default_project':1,'group_by_no_leaf':1,'group_by':[]} - Get detailed analysis by task + This report allows you to analyse the performance of your projects and users. You can analyse the quantities of tasks, the hours spent compared to the planned hours, the average number of days to open or close a task, etc. - + diff --git a/addons/project/security/ir.model.access.csv b/addons/project/security/ir.model.access.csv index cdd939c79ec..fb237e88769 100644 --- a/addons/project/security/ir.model.access.csv +++ b/addons/project/security/ir.model.access.csv @@ -1,12 +1,12 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" "access_project_project_manager","project.project manager","model_project_project","project.group_project_manager",1,1,1,1 -"access_account_analytic_account_manager","account.analytic.account","analytic.model_account_analytic_account","project.group_project_manager",1,0,0,0 +"access_account_analytic_account_manager","account.analytic.account","analytic.model_account_analytic_account","project.group_project_manager",1,1,1,1 "access_project_project","project.project","model_project_project","project.group_project_user",1,1,1,1 "access_account_analytic_account","account.analytic.account","analytic.model_account_analytic_account","project.group_project_user",1,1,1,1 "access_project_task_type_user","project.task.type user","model_project_task_type","project.group_project_user",1,1,1,1 "access_project_task_type","project.task.type","model_project_task_type","project.group_project_manager",1,1,1,1 "access_project_task_manager","project.task manager","model_project_task","project.group_project_manager",1,1,1,1 -"access_project_task","project.task","model_project_task","project.group_project_user",1,1,1,1 +"access_project_task","project.task","model_project_task","project.group_project_user",1,1,1,0 "access_project_task_work","project.task.work","model_project_task_work","project.group_project_user",1,1,1,1 "access_project_task_work_manager","project.task.work.manager","model_project_task_work","project.group_project_manager",1,1,1,1 "access_report_project_task_user","report.project.task.user","model_report_project_task_user","project.group_project_manager",1,1,1,1 @@ -18,13 +18,6 @@ "access_partner_address_task manager","base.res.partner.address manager","base.model_res_partner_address","project.group_project_manager",1,0,0,0 "access_task_on_partner","project.task on partners","model_project_task","base.group_user",1,0,0,0 "access_project_on_partner","project.project on partners","model_project_project","base.group_user",1,0,0,0 -"access_project_task_system","project.task system","model_project_task","base.group_system",1,0,0,0 -"access_project_project_system","project.project system","model_project_project","base.group_system",1,1,1,1 -"access_project_task_work_system","project.task.work system","model_project_task_work","base.group_system",1,0,0,0 -"access_project_task_type_system","project.task.type system","model_project_task_type","base.group_system",1,1,1,1 -"access_report_project_task_user_system","report.project.task.user system","model_report_project_task_user","base.group_system",1,0,0,0 "access_project_vs_hours_manager","project.vs.hours.manager","model_project_vs_hours","project.group_project_manager",1,1,1,1 -"access_account_analytic_account_system","account.analytic.account system","analytic.model_account_analytic_account","base.group_system",1,0,0,0 -"access_project_vs_hours_system","project.vs.hours.system","model_project_vs_hours","base.group_system",1,0,0,0 "access_project_task_sale_user","project.task salesman","model_project_task","base.group_sale_salesman",1,0,0,0 "access_project_project_sale_user","project.project salesman","model_project_project","base.group_sale_salesman",1,0,0,0 diff --git a/addons/project/security/project_security.xml b/addons/project/security/project_security.xml index 97453dcb33b..e77b1f338d1 100644 --- a/addons/project/security/project_security.xml +++ b/addons/project/security/project_security.xml @@ -2,14 +2,6 @@ - - Project / Financial Manager - - - - Project / Financial User - - Project / Manager diff --git a/addons/project/test/test_project.yml b/addons/project/test/test_project.yml index bc65ab67f77..8cf8e0afb19 100644 --- a/addons/project/test/test_project.yml +++ b/addons/project/test/test_project.yml @@ -65,10 +65,6 @@ - !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error, string: Project is in open state}: - state == "open" - - - - - Test for different project-states - @@ -109,8 +105,6 @@ - !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error, string: Project is in open state}: - state == "open" - - - Test for task work allocation - @@ -140,7 +134,7 @@ - Make a work task entry 'Training on OpenERP modules, models and classes' of 10 hours - - !record {model: project.task, id: project_task_technicaltraining0, context: {'withoutemployee': True}}: + !record {model: project.task, id: project_task_technicaltraining0}: work_ids: - date: '2010-05-31 15:04:22' hours: 10.0 @@ -155,7 +149,7 @@ - Make a work task entry 'Training on OpenERP xml views' of 10 hours - - !record {model: project.task, id: project_task_technicaltraining0, context: {'withoutemployee': True}}: + !record {model: project.task, id: project_task_technicaltraining0}: work_ids: - date: '2010-06-01 15:04:46' hours: 10.0 @@ -170,7 +164,7 @@ - Make a work task entry 'Training on workflows' of 10 hours - - !record {model: project.task, id: project_task_technicaltraining0, context: {'withoutemployee': True}}: + !record {model: project.task, id: project_task_technicaltraining0}: work_ids: - date: '2010-06-02 15:05:24' hours: 10.0 @@ -206,7 +200,7 @@ - Make a work task entry 'Training on reports and wizards' of 10 hours - - !record {model: project.task, id: project_task_technicaltraining0, context: {'withoutemployee': True}}: + !record {model: project.task, id: project_task_technicaltraining0}: work_ids: - date: '2010-05-31 15:08:40' hours: 10.0 @@ -257,7 +251,7 @@ - Make a work task entry 'Training on yml' of 5 hours - - !record {model: project.task, id: project_task_technicaltraining0, context: {'withoutemployee': True}}: + !record {model: project.task, id: project_task_technicaltraining0}: work_ids: - date: '2010-05-31 16:55:27' hours: 5.0 diff --git a/addons/project_caldav/__openerp__.py b/addons/project_caldav/__openerp__.py index 1e78db79bf0..f298fc9e1d5 100644 --- a/addons/project_caldav/__openerp__.py +++ b/addons/project_caldav/__openerp__.py @@ -20,13 +20,13 @@ ############################################################################## { - "name": "Caldav task management", - "version": "1.0", + "name": "CalDAV for task management", + "version": "1.1", "author": "OpenERP SA", "category": "Generic Modules/Others", "description": """ Synchronize between Project task and Caldav Vtodo.""", "depends": ["project", "caldav", "base_calendar"], - "init_xml": ["project_caldav_data.xml"], + "init_xml": ["project_caldav_data.xml", 'project_caldav_setup.xml', ], "demo_xml": [], "update_xml": ["project_caldav_view.xml"], "active": False, diff --git a/addons/project_caldav/project_caldav_data.xml b/addons/project_caldav/project_caldav_data.xml index 0a4d36580fc..3030b28dba9 100644 --- a/addons/project_caldav/project_caldav_data.xml +++ b/addons/project_caldav/project_caldav_data.xml @@ -3,10 +3,10 @@ - Tasks - - vtodo - + Tasks + + vtodo + vtodo diff --git a/addons/project_caldav/project_caldav_setup.xml b/addons/project_caldav/project_caldav_setup.xml new file mode 100644 index 00000000000..96d9c0ad3b6 --- /dev/null +++ b/addons/project_caldav/project_caldav_setup.xml @@ -0,0 +1,272 @@ + + + + + + Tasks per user + #FFEF74 + + vtodo + Tasks + + + + + [] + attendee + + + + + [] + valarm + + + + + [('user_id','=', dctx_user_id)] + vtodo + + + + + + + + {'needs-action': 'draft', 'completed': 'done', 'in-process': 'open', 'cancelled': 'cancelled'} + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + {'1': '0', '2': '1', '3': '1','4': '1', '5': '2', '6': '3', '7': '3', '8': '3', '9': '4'} + field + + + + + + field + + + + + + field + + + + + + hours + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + + + field + + + + \ No newline at end of file diff --git a/addons/project_gtd/project_gtd.py b/addons/project_gtd/project_gtd.py index 092738d2cf6..bac2f621f37 100644 --- a/addons/project_gtd/project_gtd.py +++ b/addons/project_gtd/project_gtd.py @@ -29,7 +29,7 @@ class project_gtd_context(osv.osv): _name = "project.gtd.context" _description = "Context" _columns = { - 'name': fields.char('Context', size=64, required=True, select=1), + 'name': fields.char('Context', size=64, required=True, select=1, translate=1), 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of contexts."), } _defaults = { @@ -44,7 +44,7 @@ class project_gtd_timebox(osv.osv): _name = "project.gtd.timebox" _order = "sequence" _columns = { - 'name': fields.char('Timebox', size=64, required=True, select=1), + 'name': fields.char('Timebox', size=64, required=True, select=1, translate=1), 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of timebox."), 'icon': fields.selection(tools.icons, 'Icon', size=64), } @@ -104,9 +104,10 @@ class project_task(osv.osv): res = super(project_task,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) search_extended = False timebox_obj = self.pool.get('project.gtd.timebox') - if res['type'] == 'search': + access_pool = self.pool.get('ir.model.access') + if (res['type'] == 'search') and access_pool.check_groups(cr, uid, "project_gtd.group_project_getting"): tt = timebox_obj.browse(cr, uid, timebox_obj.search(cr,uid,[])) - search_extended ='''''' % (len(tt)+7,_('Getting Things Done')) + search_extended ='''''' % (len(tt)+7,1,_('Getting Things Done')) search_extended += '''''' % (_('Inbox'),) search_extended += '''''' % (_('GTD'),) search_extended += '''''' diff --git a/addons/project_gtd/project_gtd_view.xml b/addons/project_gtd/project_gtd_view.xml index fc05ee00e61..427bd7fd87e 100644 --- a/addons/project_gtd/project_gtd_view.xml +++ b/addons/project_gtd/project_gtd_view.xml @@ -28,9 +28,10 @@ Contexts project.gtd.context + Contexts are defined in the "Getting Things Done" methodology. It allows you to categorize your tasks according to the context in which they have to be done: at office, at home, when I take my car, etc. - @@ -66,6 +67,7 @@ form tree,form + Timeboxes are defined in the "Getting Things Done" methodology. It defines a period of time in order to categorize your tasks: today, this week, this month, long term. diff --git a/addons/project_gtd/security/ir.model.access.csv b/addons/project_gtd/security/ir.model.access.csv index 210ac9f6c4a..0398fbfb0ee 100644 --- a/addons/project_gtd/security/ir.model.access.csv +++ b/addons/project_gtd/security/ir.model.access.csv @@ -5,5 +5,3 @@ "access_project_gtd_timebox_user","project.gtd.timebox project user","model_project_gtd_timebox","project.group_project_user",1,0,0,0 "access_project_gtd_context_manager","project.gtd.context project manager","model_project_gtd_context","project.group_project_manager",1,1,1,1 "access_project_gtd_timebox_manager","project.gtd.timebox project manager","model_project_gtd_timebox","project.group_project_manager",1,1,1,1 -"access_project_gtd_context_system","project.gtd.context system","model_project_gtd_context","base.group_system",1,1,1,1 -"access_project_gtd_timebox_system","project.gtd.timebox system","model_project_gtd_timebox","base.group_system",1,1,1,1 diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 0e9807c865b..2887b25610d 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -58,7 +58,7 @@ class project_issue(crm.crm_case, osv.osv): res = super(project_issue, self).case_open(cr, uid, ids, *args) self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) for (id, name) in self.name_get(cr, uid, ids): - message = _('Issue ') + " '" + name + "' "+ _("is Open.") + message = _("Issue '%s' has been opened.") % name self.log(cr, uid, id, message) return res @@ -73,7 +73,7 @@ class project_issue(crm.crm_case, osv.osv): res = super(project_issue, self).case_close(cr, uid, ids, *args) for (id, name) in self.name_get(cr, uid, ids): - message = _('Issue ') + " '" + name + "' "+ _("is Closed.") + message = _("Issue '%s' has been closed.") % name self.log(cr, uid, id, message) return res @@ -401,8 +401,6 @@ class project_issue(crm.crm_case, osv.osv): vals.update(res) context.update({'state_to' : 'draft'}) res = self.create(cr, uid, vals, context) - message = _('An Issue created') + " '" + subject + "' " + _("from Mailgate.") - self.log(cr, uid, res, message) self.convert_to_bug(cr, uid, [res], context=context) attachents = msg.get('attachments', []) diff --git a/addons/project_issue/project_issue_menu.xml b/addons/project_issue/project_issue_menu.xml index df76e808bff..518fc37056a 100644 --- a/addons/project_issue/project_issue_menu.xml +++ b/addons/project_issue/project_issue_menu.xml @@ -15,7 +15,7 @@ {"search_default_user_id": uid, "search_default_current":1, "search_default_project_id":project_id} - Issues like bugs in a system, client complain, materials breakdown are collected here. A list view allows the manager to quickly check for them, assign them, make their status evolved. + Issues such as system bugs, client complains, material breakdowns are collected here. You can define the stages assigned to the resolution of the issue on the project. (analysis, development, done) Using the mailgateway module, the issues can be integrated to an email address (example: support@mycompany.com) @@ -49,6 +49,6 @@ view_type="form"/> + action="project_issue_categ_act0" sequence="4"/> diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index 1298a6f8852..3894740f0f1 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -2,7 +2,7 @@ - + Issue Version @@ -30,6 +30,7 @@ Versions project.issue.version form + You can use the issues tracker in OpenERP to handle bugs in the software development project, to handle claims in after-sales services, etc. Define here the different versions of your products on which you can work on issues. @@ -236,7 +237,7 @@ - diff --git a/addons/project_issue/report/project_issue_report_view.xml b/addons/project_issue/report/project_issue_report_view.xml index e6fc4cb5a43..5a8c4886d2f 100644 --- a/addons/project_issue/report/project_issue_report_view.xml +++ b/addons/project_issue/report/project_issue_report_view.xml @@ -56,7 +56,7 @@ + /> - + {'search_default_This Month':1,'search_default_project':1,'group_by_no_leaf':1,'group_by':[]} - Track your projects issues and fixing delay with a high accuracy. A multicriteria search tool allows fine-grained analysis. + This report on the project issues allows you to analyse the quality of your support or after-sales services. You can track the issues per age. You can analyse the time required to open or close an issue, the number of email to exchange and the time spent on average by issues. diff --git a/addons/project_issue/security/ir.model.access.csv b/addons/project_issue/security/ir.model.access.csv index ece2be3a784..f5602f5ae4b 100755 --- a/addons/project_issue/security/ir.model.access.csv +++ b/addons/project_issue/security/ir.model.access.csv @@ -1,5 +1,5 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_project_issue_all","project.issue","model_project_issue","project.group_project_manager",1,0,0,0 +"access_project_issue_all","project.issue","model_project_issue","project.group_project_manager",1,1,1,1 "access_project_issue_user","project.issue","model_project_issue","project.group_project_user",1,1,1,1 "access_project_issue","project.issue","model_project_issue","project_issue.group_project_supporter",1,1,1,1 "access_project_issue_report_all","project.issue.report","model_project_issue_report","project.group_project_manager",1,1,1,1 @@ -8,7 +8,7 @@ "access_crm_case_categ_supp","crm.case.categ","crm.model_crm_case_categ","project_issue.group_project_supporter",1,0,0,0 "access_project_issue_version_project","project_issue_version manager","model_project_issue_version","project.group_project_manager",1,1,1,1 "access_project_issue_version","project_issue_version manager","model_project_issue_version","project_issue.group_project_supporter",1,0,0,0 -"access_project_issue_system","project.issue system","model_project_issue","base.group_system",1,0,0,0 -"access_project_issue_report_system","project.issue.report system","model_project_issue_report","base.group_system",1,0,0,0 -"access_crm_case_section_system","crm.case.section system","crm.model_crm_case_section","base.group_system",1,1,1,1 -"access_project_issue_report_user","project.issue.report user","model_project_issue_report","project.group_project_user",1,0,0,0 +"access_mailgate_message_project_manager","mailgate.message.manager","mail_gateway.model_mailgate_message","project.group_project_manager",1,1,1,1 +"access_resource_calendar_project_manager","resource.calendar.project.manager","resource.model_resource_calendar","project.group_project_manager",1,1,1,1 +"access_project_issue_report_user","project.issue.report user","model_project_issue_report","project.group_project_user",1,1,1,0 +"access_mailgate_message_issue_project_user","project.mailgate.message.issue.user","mail_gateway.model_mailgate_message","project.group_project_user",1,1,1,0 diff --git a/addons/project_issue_sheet/security/ir.model.access.csv b/addons/project_issue_sheet/security/ir.model.access.csv index 235bb4d1bfc..0e6c92c038b 100644 --- a/addons/project_issue_sheet/security/ir.model.access.csv +++ b/addons/project_issue_sheet/security/ir.model.access.csv @@ -3,6 +3,13 @@ "access_hr_analytic_timesheet_project_user","hr_analytic_timesheet user","hr_timesheet_sheet.model_hr_analytic_timesheet","project.group_project_user",1,1,1,0 "access_hr_analytic_timesheet_project_manager","hr_analytic_timesheet manager","hr_timesheet_sheet.model_hr_analytic_timesheet","project.group_project_manager",1,0,0,0 "access_hr_timesheet_sheet_sheet_project_manager","hr_timesheet_sheet.sheet manager","hr_timesheet_sheet.model_hr_timesheet_sheet_sheet","project.group_project_manager",1,0,0,0 -"access_hr_analytic_timesheet_system","hr_analytic_timesheet system","hr_timesheet_sheet.model_hr_analytic_timesheet","base.group_system",1,0,0,0 -"access_hr_timesheet_sheet_sheet_project_system","hr_timesheet_sheet.sheet system","hr_timesheet_sheet.model_hr_timesheet_sheet_sheet","base.group_system",1,0,0,0 - +"access_hr_analytic_timesheet_project_manager","account.analytic.line.timesheet.project.manager","account.model_account_analytic_line","project.group_project_manager",1,1,1,1 +"access_account_analytic_journal_project_manager","account.analytic.journal.project.manager","account.model_account_analytic_journal","project.group_project_manager",1,1,1,1 +"access_account_fiscalyear_project_manager","account.fiscalyear.project.manager","account.model_account_fiscalyear","project.group_project_manager",1,1,1,1 +"access_hr_timesheet_invoice_factor_project_manager","hr_timesheet_invoice.factor.project.manager","hr_timesheet_invoice.model_hr_timesheet_invoice_factor","project.group_project_manager",1,1,1,1 +"access_account_invoice_project_manager","account.invoice.project.manager","account.model_account_invoice","project.group_project_manager",1,1,1,1 +"access_analytic_account_line_project_user","analytic_account_line_timesheet user","analytic.model_account_analytic_line","project.group_project_user",1,1,1,0 +"access_account_analytic_journal_project_user","account.analytic.journal.project.user","account.model_account_analytic_journal","project.group_project_user",1,1,1,0 +"access_account_fiscalyear_project_user","account.fiscalyear.project.user","account.model_account_fiscalyear","project.group_project_user",1,1,1,0 +"access_hr_timesheet_invoice_factor_project_user","hr_timesheet_invoice.factor.project.user","hr_timesheet_invoice.model_hr_timesheet_invoice_factor","project.group_project_user",1,1,1,0 +"access_account_invoice_project_user","account.invoice.project.user","account.model_account_invoice","project.group_project_user",1,1,1,0 diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index d6d43f83c5d..faea0916906 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -395,7 +395,16 @@ class project_resource_allocation(osv.osv): _name = 'project.resource.allocation' _description = 'Project Resource Allocation' _rec_name = 'resource_id' + + def get_name(self, cr, uid, ids, field_name, arg, context=None): + res = {} + for allocation in self.browse(cr, uid, ids, context=context): + name = allocation.phase_id.name + name += ' (%s%%)' %(allocation.useability) + res[allocation.id] = name + return res _columns = { + 'name': fields.function(get_name, method=True, type='char', size=256), 'resource_id': fields.many2one('resource.resource', 'Resource', required=True), 'phase_id': fields.many2one('project.phase', 'Project Phase', ondelete='cascade', required=True), 'project_id': fields.related('phase_id', 'project_id', type='many2one', relation="project.project", string='Project', store=True), diff --git a/addons/project_long_term/project_long_term_demo.xml b/addons/project_long_term/project_long_term_demo.xml index 4730706f758..8a37f4cc444 100644 --- a/addons/project_long_term/project_long_term_demo.xml +++ b/addons/project_long_term/project_long_term_demo.xml @@ -2,115 +2,54 @@ - - - - Phuong - - phu - phu - - - Anthony - - al - al - - - Quentin - - qdp - qdp - - - Francois - - fpi - fpi - - - Julien - - jth - jth - - - Aline - - apr - apr - - - Fabian - - fbs - fbs - - - + Analyst - + Project Manager - + Technical Leader - + Developer - + Designer - + Tester - + Project Finacial Manager - - - - open - normal - Integrate an Sale and Warehouse Management. - - - Integrate an Sale and Warehouse Management. - + @@ -119,8 +58,8 @@ This Demo data file includes Users, Human Resources, Projects and it' members li 30 - - + + @@ -129,8 +68,8 @@ This Demo data file includes Users, Human Resources, Projects and it' members li 20 - - + + @@ -139,8 +78,8 @@ This Demo data file includes Users, Human Resources, Projects and it' members li 20 - - + + @@ -149,8 +88,8 @@ This Demo data file includes Users, Human Resources, Projects and it' members li 90 - - + + @@ -159,8 +98,8 @@ This Demo data file includes Users, Human Resources, Projects and it' members li 30 - - + + @@ -169,8 +108,8 @@ This Demo data file includes Users, Human Resources, Projects and it' members li 10 - - + + @@ -221,173 +160,82 @@ This Demo data file includes Users, Human Resources, Projects and it' members li - - - - 2 - - Prepare Requirements Document + - - - - 2 - - Make SRS + - - - - 2 - - Design Use Cases + - - - - 2 - - Budget Planning + - - - - 2 - - Quality Planning + - - - - 2 - - Risk Management Planning + - - - - 2 - - Create Project Schedules + - - - - 2 - - Dataflow Design + - - - - 2 - - User Interface Design + - - - - 2 - - Develop Module in Sale Management + - - - - 2 - - Develop module in Warehouse + - - - - 2 - - Integrate Modules + - - - - 2 - - Unit Testing + - - - - 2 - - Regression Test + - - - - 2 - - Documentation + - - - - - 2 - - Performance Tuning + - - - - 2 - - Deploy and Review on Customer System + - - - - 2 - - Training and Presentation + - + - + diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index 713322f5f0e..71e96543232 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -13,9 +13,9 @@ project.resource.allocation gantt - - - + + + @@ -73,7 +73,7 @@ project.resource.allocation search - + @@ -83,15 +83,14 @@ - + - - Resource Allocations + Resources Allocation project.resource.allocation form gantt,tree,form,calendar @@ -243,7 +242,7 @@ gantt - + @@ -264,7 +263,7 @@ - + @@ -273,7 +272,7 @@ - + @@ -290,7 +289,7 @@ gantt,tree,form,calendar {'search_default_responsible_id':uid,'search_default_project':1} - You can subdivide your larger projects into several phases. For each phase, you can define your resources allocation (humans or engine), describe de differend task and link your phase with previous and next one, add constraints date and scheduling. A gantt view of your project phase is also available from this menu. Gantt view is a graphically draw of the project plan; it includes any task dependencies by visually adjusting task durations and priorities, and by linking tasks to each other. + A project can be split into the different phases. For each phase, you can define your resources allocation, describe different tasks and link your phase to previous and next ones, add date constraints for the automated scheduling. Use the long term planning in order to planify your available human resources, convert your phases into a series of tasks when you start working on it. @@ -298,7 +297,7 @@ project.phase form tree,form,calendar - {'search_default_responsible_id':uid,'search_default_project':1} + {'search_default_responsible_id':uid,'search_default_project':1} @@ -356,7 +355,7 @@ context="{'search_default_phase_id': [active_id]}"/> + + name="Resource Allocations" parent="base.menu_project_long_term" sequence="2"/> - - + + diff --git a/addons/project_long_term/security/ir.model.access.csv b/addons/project_long_term/security/ir.model.access.csv index 7af7984d7e6..3aaebb64294 100644 --- a/addons/project_long_term/security/ir.model.access.csv +++ b/addons/project_long_term/security/ir.model.access.csv @@ -1,10 +1,9 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" "access_project_phase","project.phase","model_project_phase","project.group_project_user",1,1,1,0 -"access_project_resource_allocation","project.resource.allocation","model_project_resource_allocation","project.group_project_user",1,1,1,0 +"access_project_resource_allocation","project.resource.allocation","model_project_resource_allocation","project.group_project_user",1,0,0,0 "access_project_phase_manager","project.phase manager","model_project_phase","project.group_project_manager",1,0,0,0 "access_project_resource_allocation_manager","project.resource.allocation manager","model_project_resource_allocation","project.group_project_manager",1,0,0,0 -"access_project_resource_allocation_system","project.resource.allocation system","model_project_resource_allocation","base.group_system",1,0,0,0 -"access_project_phase_system","project.phase system","model_project_phase","base.group_system",1,0,0,0 -"access_resource_resource_user","resource.resource user","resource.model_resource_resource","project.group_project_user",1,0,1,1 +"access_resource_resource_user","resource.resource user","resource.model_resource_resource","project.group_project_user",1,0,0,0 "access_resource_calendar_leaves_user","resource.calendar.leaves user","resource.model_resource_calendar_leaves","project.group_project_user",1,1,1,1 "access_resource_resource_manager","resource.resource manager","resource.model_resource_resource","project.group_project_manager",1,1,1,1 +"access_project_resource_allocation_manager","project.resource.allocation.manager","model_project_resource_allocation","project.group_project_manager",1,1,1,1 diff --git a/addons/project_long_term/test/schedule_phase_tasks.yml b/addons/project_long_term/test/schedule_phase_tasks.yml index 150d80af822..aa54fa1ac57 100644 --- a/addons/project_long_term/test/schedule_phase_tasks.yml +++ b/addons/project_long_term/test/schedule_phase_tasks.yml @@ -4,13 +4,13 @@ !record {model: project.project, id: project_project_project0}: name: Develop an outlook-openerp synchronization plugin members: - - project_long_term.res_users_project_manager - - project_long_term.res_users_technical_leader - - project_long_term.res_users_developer - - project_long_term.res_users_designer - - project_long_term.res_users_tester - - project_long_term.res_users_analyst - - project_long_term.res_users_finacial_manager + - project.res_users_project_manager + - project.res_users_technical_leader + - project.res_users_developer + - project.res_users_designer + - project.res_users_tester + - project.res_users_analyst + - project.res_users_finacial_manager - Create phase 'Develop GUI' in Outlook - @@ -40,7 +40,7 @@ state: draft phase_id: project_phase_phase0 project_id: project_project_project0 - user_id: project_long_term.res_users_developer + user_id: project.res_users_developer - Create the phase task 'Develop GUI for Modules Configuration' @@ -52,7 +52,7 @@ state: draft phase_id: project_phase_phase0 project_id: project_project_project0 - user_id: project_long_term.res_users_developer + user_id: project.res_users_developer - Create the phase task 'Develop GUI for OpenERP Synchronisation' - @@ -63,7 +63,7 @@ state: draft phase_id: project_phase_phase0 project_id: project_project_project0 - user_id: project_long_term.res_users_developer + user_id: project.res_users_developer - Create the phase task 'Design required GUI/Menus' - @@ -74,7 +74,7 @@ state: draft phase_id: project_phase_phase0 project_id: project_project_project0 - user_id: project_long_term.res_users_designer + user_id: project.res_users_designer - Schedule phase tasks diff --git a/addons/project_long_term/test/schedule_project_tasks.yml b/addons/project_long_term/test/schedule_project_tasks.yml index dfc4cf1fc5e..04a05437487 100644 --- a/addons/project_long_term/test/schedule_project_tasks.yml +++ b/addons/project_long_term/test/schedule_project_tasks.yml @@ -4,13 +4,13 @@ !record {model: project.project, id: project_project_project1}: name: Develop a thunderbird-openerp synchronization plugin members: - - project_long_term.res_users_project_manager - - project_long_term.res_users_technical_leader - - project_long_term.res_users_developer - - project_long_term.res_users_designer - - project_long_term.res_users_tester - - project_long_term.res_users_analyst - - project_long_term.res_users_finacial_manager + - project.res_users_project_manager + - project.res_users_technical_leader + - project.res_users_developer + - project.res_users_designer + - project.res_users_tester + - project.res_users_analyst + - project.res_users_finacial_manager - Create phase 'Develop GUI' in thunderbird @@ -41,7 +41,7 @@ state: draft phase_id: project_phase_phase1 project_id: project_project_project1 - user_id: project_long_term.res_users_developer + user_id: project.res_users_developer - Create the phase task 'Develop GUI for Modules Configuration' @@ -53,7 +53,7 @@ state: draft phase_id: project_phase_phase1 project_id: project_project_project1 - user_id: project_long_term.res_users_developer + user_id: project.res_users_developer - Create the phase task 'Develop GUI for OpenERP Synchronisation' - @@ -64,7 +64,7 @@ state: draft phase_id: project_phase_phase1 project_id: project_project_project1 - user_id: project_long_term.res_users_developer + user_id: project.res_users_developer - Create the phase task 'Design required GUI/Menus' - @@ -75,7 +75,7 @@ state: draft phase_id: project_phase_phase1 project_id: project_project_project1 - user_id: project_long_term.res_users_designer + user_id: project.res_users_designer - diff --git a/addons/project_mailgate/__openerp__.py b/addons/project_mailgate/__openerp__.py index cd3d0caeaf8..a5e7fd46f4c 100644 --- a/addons/project_mailgate/__openerp__.py +++ b/addons/project_mailgate/__openerp__.py @@ -29,11 +29,11 @@ "depends": ["project", "mail_gateway"], "description": """This module is an interface that synchronises mails with OpenERP Project Task. -It allows creating tasks as soon as a new mail arrives in our configured mail server. -Moreover, it keeps track of all further communications and task states. +It allows creating tasks as soon as a new mail arrives in our configured mail server. +Moreover, it keeps track of all further communications and task states. """, "init_xml": [], - "update_xml": [ + "update_xml": ["security/ir.model.access.csv", "project_mailgate_view.xml", ], 'demo_xml': [ diff --git a/addons/project_mailgate/project_mailgate.py b/addons/project_mailgate/project_mailgate.py index 9b6b7d77f7b..c232b41fe76 100644 --- a/addons/project_mailgate/project_mailgate.py +++ b/addons/project_mailgate/project_mailgate.py @@ -54,9 +54,6 @@ class project_tasks(osv.osv): data.update(res) res = self.create(cr, uid, data) - message = _('A task created') + " '" + subject + "' " + _("from Mailgate.") - self.log(cr, uid, res, message) - attachments = msg.get('attachments', []) for attachment in attachments or []: data_attach = { diff --git a/addons/project_mailgate/security/ir.model.access.csv b/addons/project_mailgate/security/ir.model.access.csv new file mode 100644 index 00000000000..1a840d89e9a --- /dev/null +++ b/addons/project_mailgate/security/ir.model.access.csv @@ -0,0 +1,3 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_mailgate_message_project_manager","project.mailgate.message.manager","mail_gateway.model_mailgate_message","project.group_project_manager",1,1,1,0 +"access_mailgate_message_project_user","project.mailgate.message.user","mail_gateway.model_mailgate_message","project.group_project_user",1,1,1,0 diff --git a/addons/project_messages/__openerp__.py b/addons/project_messages/__openerp__.py index 352fe797f22..97f9c4f2be5 100644 --- a/addons/project_messages/__openerp__.py +++ b/addons/project_messages/__openerp__.py @@ -32,7 +32,8 @@ """, 'website': 'http://www.openerp.com', 'init_xml': [], - 'update_xml': ['project_messages_view.xml'], + 'update_xml': ['security/ir.model.access.csv', + 'project_messages_view.xml'], 'demo_xml': [], 'installable': True, 'active': False, diff --git a/addons/project_messages/i18n/sr.po b/addons/project_messages/i18n/sr.po index 422799eed49..cb2e777e123 100644 --- a/addons/project_messages/i18n/sr.po +++ b/addons/project_messages/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-08-20 10:28+0000\n" -"PO-Revision-Date: 2010-10-14 20:39+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:07+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: project_messages diff --git a/addons/project_messages/project_messages_view.xml b/addons/project_messages/project_messages_view.xml index e270d2d001a..bffd1af0503 100644 --- a/addons/project_messages/project_messages_view.xml +++ b/addons/project_messages/project_messages_view.xml @@ -82,7 +82,7 @@ - + @@ -109,6 +109,6 @@ tree,form - + diff --git a/addons/project_messages/security/ir.model.access.csv b/addons/project_messages/security/ir.model.access.csv index fb0b4e8255a..5756a7456bb 100644 --- a/addons/project_messages/security/ir.model.access.csv +++ b/addons/project_messages/security/ir.model.access.csv @@ -1,3 +1,4 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" "access_project_messages","project.messages","model_project_messages","project.group_project_user",1,1,1,1 "access_project_messages_manager","project.messages manager","model_project_messages","project.group_project_manager",1,1,1,1 +"access_project_message_project_user","project.project.user","model_project_project","project.group_project_user",1,0,0,0 diff --git a/addons/project_planning/project_planning_view.xml b/addons/project_planning/project_planning_view.xml index 5c8d4cc5af9..9abff817d17 100644 --- a/addons/project_planning/project_planning_view.xml +++ b/addons/project_planning/project_planning_view.xml @@ -219,7 +219,7 @@ parent="base.menu_main_pm" /> + id="menu_report_account_analytic_planning" parent="base.menu_project_long_term" sequence="3" groups="project.group_project_user,project.group_project_manager"/> + + + + + + + + + + + + + + Phuong + + + + + + + + + Francois + + + + + + + + Julien + + + + + + + + Alien + + + + + + + + Fabian + + + + + + + + + diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml index 61834abbe66..5ceaf83890e 100644 --- a/addons/project_timesheet/project_timesheet_view.xml +++ b/addons/project_timesheet/project_timesheet_view.xml @@ -27,14 +27,16 @@ - + - - + diff --git a/addons/project_timesheet/security/ir.model.access.csv b/addons/project_timesheet/security/ir.model.access.csv index ab1e82cacb6..4888811df2f 100644 --- a/addons/project_timesheet/security/ir.model.access.csv +++ b/addons/project_timesheet/security/ir.model.access.csv @@ -2,5 +2,3 @@ "access_report_timesheet_task_user_manager","report.timesheet.task.user.manager","model_report_timesheet_task_user","project.group_project_manager",1,1,1,1 "access_hr_analytic_timesheet_user","hr.analytic.timesheet.user","hr_timesheet_sheet.model_hr_analytic_timesheet","project.group_project_user",1,1,1,0 "access_hr_timesheet_sheet_sheet_user","hr.timesheet.sheet.sheet.user","hr_timesheet_sheet.model_hr_timesheet_sheet_sheet","project.group_project_user",1,1,1,0 -"access_hr_analytic_timesheet_system","hr.analytic.timesheet.system","hr_timesheet_sheet.model_hr_analytic_timesheet","base.group_system",1,1,1,1 -"access_hr_timesheet_sheet_sheet_system","hr.timesheet.sheet.sheet.system","hr_timesheet_sheet.model_hr_timesheet_sheet_sheet","base.group_system",1,1,1,1 diff --git a/addons/purchase/board_purchase_view.xml b/addons/purchase/board_purchase_view.xml index ffcd14213f2..28394102922 100644 --- a/addons/purchase/board_purchase_view.xml +++ b/addons/purchase/board_purchase_view.xml @@ -156,7 +156,6 @@ id="menu_board_purchase" parent="menu_purchase_deshboard" sequence="4"/> - diff --git a/addons/purchase/i18n/ru.po b/addons/purchase/i18n/ru.po index ab3c213f91d..6fbade8ce73 100644 --- a/addons/purchase/i18n/ru.po +++ b/addons/purchase/i18n/ru.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-09-30 06:38+0000\n" +"PO-Revision-Date: 2010-10-16 14:12+0000\n" "Last-Translator: Chertykov Denis \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-01 08:47+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: purchase @@ -373,7 +373,7 @@ msgstr "Планируемая дата" #. module: purchase #: view:purchase.order:0 msgid "Approved by Supplier" -msgstr "Утверждено поставщком" +msgstr "Утверждено поставщиком" #. module: purchase #: model:ir.actions.act_window,name:purchase.act_purchase_order_2_stock_picking diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index a0c6b66d29a..57b9a477ac9 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -37,6 +37,7 @@ from osv.orm import browse_record, browse_null # Model definition # class purchase_order(osv.osv): + def _calc_amount(self, cr, uid, ids, prop, unknow_none, unknow_dict): res = {} for order in self.browse(cr, uid, ids): @@ -44,7 +45,7 @@ class purchase_order(osv.osv): for oline in order.order_line: res[order.id] += oline.price_unit * oline.product_qty return res - + def _amount_all(self, cr, uid, ids, field_name, arg, context=None): res = {} cur_obj=self.pool.get('res.currency') @@ -269,9 +270,6 @@ class purchase_order(osv.osv): def wkf_approve_order(self, cr, uid, ids, context={}): self.write(cr, uid, ids, {'state': 'approved', 'date_approve': time.strftime('%Y-%m-%d')}) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Purchase order ') + " '" + name + "' "+_("is approved by the supplier") - self.log(cr, uid, id, message) return True #TODO: implement messages system @@ -284,15 +282,12 @@ class purchase_order(osv.osv): for line in po.order_line: if line.state=='draft': todo.append(line.id) + message = _("Purchase order '%s' is confirmed.") % (po.name,) + self.log(cr, uid, po.id, message) current_name = self.name_get(cr, uid, ids)[0][1] self.pool.get('purchase.order.line').action_confirm(cr, uid, todo, context) for id in ids: self.write(cr, uid, [id], {'state' : 'confirmed', 'validator' : uid}) - for line in po.order_line: - product.append(line.product_id.default_code or '') - params = ', '.join(map(lambda x : str(x), product)) - message = _('Purchase order ') + " '" + po.name + "' "+_('placed on')+ " '" + po.date_order + "' "+_('for')+" '" + params + "' "+ _("is confirmed") - self.log(cr, uid, id, message) return True def wkf_warn_buyer(self, cr, uid, ids): @@ -335,8 +330,8 @@ class purchase_order(osv.osv): wf_service.trg_delete(uid, 'purchase.order', p_id, cr) wf_service.trg_create(uid, 'purchase.order', p_id, cr) for (id,name) in self.name_get(cr, uid, ids): - message = _('Purchase order') + " '" + name + "' "+ _("is in the draft state") - self.log(cr, uid, id, message) + message = _("Purchase order '%s' has been set in draft state.") % name + self.log(cr, uid, id, message) return True def action_invoice_create(self, cr, uid, ids, *args): @@ -416,8 +411,8 @@ class purchase_order(osv.osv): wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, 'account.invoice', inv.id, 'invoice_cancel', cr) self.write(cr,uid,ids,{'state':'cancel'}) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Purchase order ') + " '" + purchase.name + "' "+ _("is cancelled") + for (id,name) in self.name_get(cr, uid, ids): + message = _("Purchase order '%s' is cancelled.") % name self.log(cr, uid, id, message) return True @@ -722,9 +717,6 @@ class purchase_order_line(osv.osv): def action_confirm(self, cr, uid, ids, context={}): self.write(cr, uid, ids, {'state': 'confirmed'}, context) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Purchase order line') + " '" + name + "' "+ _("is confirmed") - self.log(cr, uid, id, message) return True purchase_order_line() diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml index a9996202b20..f825a11cac5 100644 --- a/addons/purchase/purchase_view.xml +++ b/addons/purchase/purchase_view.xml @@ -1,7 +1,8 @@ - + @@ -13,6 +14,7 @@ form {"search_default_supplier":1} + Access your supplier records and maintain your relationship with them. You can track all your interactions with them through the history tab: emails, orders, meeting, etc. @@ -55,7 +57,7 @@ [('type','=','in_invoice')] {'type':'in_invoice', 'journal_type': 'purchase', 'search_default_draft': 1} - This is the list of supplier invoice you are waiting for. You can select invoices and validate them once you have received the invoice and checked his data. + Use this menu to control the invoices to be received by your supplier. OpenERP pre-generates draft of invoices based on your purchase orders or your receptions. Once you receive a supplier invoice, you can control it according to the draft of invoice and validate it. {'search_default_draft': 1} tree,form,graph,calendar - With the Requests for quotation menu you can create new quotations, review existing one and confirm them to order once the supplier offer is approved. + With the Requests for quotation menu you can create new request for quotations, review existing one and confirm them to order once the supplier offer is approved. When you confirm a RfQ, OpenERP will convert it to a Purchase Order and generate the next steps: draft reception of the products, invoice to control. @@ -251,7 +253,8 @@ tree,form,graph,calendar {'search_default_approved': 1,'search_default_create_uid':uid} - From the Purchase Orders menu, you can create directly new orders and consult the list of your orders in their various state. + From the Purchase Orders menu, you can track the status of your orders: products received, invoice received and controlled. + @@ -401,7 +404,8 @@ [('state','in',('confirmed','done')), ('invoiced','=',False)] form tree,form - + + If you set the invoicing control on a purchase order as "Manual", you can track here all the purchase order lines for which you did not received the supplier invoice yet. Once you are ready to receive a supplier invoice, you can generate a draft supplier invoice based on the lines from this menu. diff --git a/addons/purchase/report/purchase_report_view.xml b/addons/purchase/report/purchase_report_view.xml index d2dbff3be94..f5d1f7a3b42 100644 --- a/addons/purchase/report/purchase_report_view.xml +++ b/addons/purchase/report/purchase_report_view.xml @@ -149,6 +149,7 @@ tree,graph {'search_default_month':1,'search_default_group_partner_id':1,'search_default_group_product_id': 1, 'search_default_orders': 1, 'group_by_no_leaf':1,'group_by':[]} + Purchase Analysis allows you to easily check and analyse your company purchase history and performance. From this menu you can track your negotiation performance, the delivery performance of your suppliers, etc. @@ -177,6 +178,7 @@ form tree,graph {'search_default_month':1, 'search_default_group_product':1, 'search_default_group_partner':1, 'search_default_done':1, 'search_default_in': 1, 'group_by':[], 'group_by_no_leaf':1} + Reception Analysis allows you to easily check and analyse your company order receptions and the performance of your supplier's deliveries. diff --git a/addons/purchase/security/ir.model.access.csv b/addons/purchase/security/ir.model.access.csv index 77a0aff7bb4..ef854f8f038 100644 --- a/addons/purchase/security/ir.model.access.csv +++ b/addons/purchase/security/ir.model.access.csv @@ -18,7 +18,7 @@ "access_stock_picking_purchase_user_manager","stock.picking","stock.model_stock_picking","group_purchase_manager",1,1,1,1 "access_stock_move_purchase_user_manager","stock.move","stock.model_stock_move","group_purchase_manager",1,1,1,1 "access_account_tax_purchase_user_manager","account.tax","account.model_account_tax","group_purchase_manager",1,0,0,0 -"access_product_product_purchase_user","product.product.purchase.user","product.model_product_product","group_purchase_user",1,1,1,1 +"access_product_product_purchase_user","product.product.purchase.user","product.model_product_product","group_purchase_user",1,0,0,0 "access_product_product_purchase_manager","product.product.purchase.manager","product.model_product_product","group_purchase_manager",1,0,0,0 "access_product_template_purchase_user","product.template purchase_user","product.model_product_template","group_purchase_user",1,1,1,1 "access_product_template_purchase_manager","product.template purchase_manager","product.model_product_template","group_purchase_manager",1,0,0,0 diff --git a/addons/purchase/test/purchase_from_picking.yml b/addons/purchase/test/purchase_from_picking.yml index d0c1cbcb527..20dd3f0f907 100644 --- a/addons/purchase/test/purchase_from_picking.yml +++ b/addons/purchase/test/purchase_from_picking.yml @@ -122,36 +122,23 @@ I check that an entry gets created related to stock move. - !python {model: purchase.order}: | - from tools.translate import _ pur_id1=self.browse(cr, uid, ref("purchase_order_po2")) picking_obj = self.pool.get('stock.picking') ids = picking_obj.search(cr, uid, [('origin', '=', pur_id1.name)]) pick_id = picking_obj.browse(cr, uid, ids)[0] move_obj = self.pool.get('stock.move') search_id = move_obj.search(cr, uid, [('picking_id', '=', pick_id.name)]) - assert search_id, _('No Incoming Product!') -- - I check that Traceability moves are created. + assert search_id, 'No Incoming Product!' - Then I create an invoice from picking by clicking on "Create Invoice" wizard -- - I create stock invoice on shipping entry. -- - !record {model: stock.invoice.onshipping, id: stock_invoice_onshipping_0}: - invoice_date: '2010-05-11' - journal_id: account.bank_journal - type: in_invoice -- - I create Invoice. - !python {model: stock.invoice.onshipping}: | - pur_obj=self.pool.get('purchase.order') + pur_obj=self.pool.get('purchase.order') pur_id1=pur_obj.browse(cr, uid, ref("purchase_order_po2")) - picking_obj = self.pool.get('stock.picking') - ids = picking_obj.search(cr, uid, [('origin', '=', pur_id1.name)]) - self.create_invoice(cr, uid, [ref("stock_invoice_onshipping_0")], {"lang": "en_US", - "tz": False, "search_default_approved": 1, "active_model": "stock.picking", - "active_ids": ids, "active_id": ids[0], }) + pick_ids = [x.id for x in pur_id1.picking_ids] + id = self.create(cr, uid, {'invoice_date': '2010-05-11', 'journal_id': ref('account.expenses_journal')}, + {'active_ids': pick_ids}) + self.create_invoice(cr, uid, [id], {"active_ids": pick_ids}) - I check that an invoice_id field of Delivery&Invoices gets bind with the value. - diff --git a/addons/purchase/wizard/purchase_order_group_view.xml b/addons/purchase/wizard/purchase_order_group_view.xml index fe04af1a32b..cb67f489a99 100644 --- a/addons/purchase/wizard/purchase_order_group_view.xml +++ b/addons/purchase/wizard/purchase_order_group_view.xml @@ -30,7 +30,8 @@ Lines will only be merged if: res_model="purchase.order.group" src_model="purchase.order" view_mode="form" - target="new" + target="new" + multi="True" key2="client_action_multi" groups="base.group_extended" id="action_view_purchase_order_group"/> diff --git a/addons/purchase_analytic_plans/i18n/sr.po b/addons/purchase_analytic_plans/i18n/sr.po index e9fba1bf5fa..f3a1d1b86dc 100644 --- a/addons/purchase_analytic_plans/i18n/sr.po +++ b/addons/purchase_analytic_plans/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 20:32+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:31+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: purchase_analytic_plans diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py index 1e0c4f06838..c22ced3e159 100644 --- a/addons/purchase_requisition/purchase_requisition.py +++ b/addons/purchase_requisition/purchase_requisition.py @@ -68,30 +68,18 @@ class purchase_requisition(osv.osv): if str(purchase_id.state) in('draft','wait'): purchase_order_obj.action_cancel(cr,uid,[purchase_id.id]) self.write(cr, uid, ids, {'state': 'cancel'}) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Tender') + " '" + name + "' "+ _("is cancelled") - self.log(cr, uid, id, message) return True def tender_in_progress(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'in_progress'} ,context=context) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Tender') + " '" + name + "' "+ _(" is In Progress") - self.log(cr, uid, id, message) return True def tender_reset(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state': 'draft'}) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Tender') + " '" + name + "' "+ _("is in draft state") - self.log(cr, uid, id, message) return True def tender_done(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'done', 'date_end':time.strftime('%Y-%m-%d %H:%M:%S')}, context=context) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Tender') + " '" + name + "' "+ _("is done") - self.log(cr, uid, id, message) return True purchase_requisition() diff --git a/addons/purchase_requisition/purchase_requisition_view.xml b/addons/purchase_requisition/purchase_requisition_view.xml index d209ef6b3fd..2a30c3789df 100644 --- a/addons/purchase_requisition/purchase_requisition_view.xml +++ b/addons/purchase_requisition/purchase_requisition_view.xml @@ -152,6 +152,7 @@ tree,form {"search_default_create_uid":uid,'search_default_draft': 1} + A purchase requisition is a step before the request for quotation. In a purchase requisition (or purchase tender), you can record the products you need to buy and trigger the creation of RfQs to supplier. After the negotiation, once you have reviewed all the supplier's offers, you can validate some and cancel others. tree,form {} - There you can find clusters of your resources type involved in a specific project phase as well as their workload. + Resources allows you to create and manage resources that should be involved in a specific project phase. It also allows you to set their efficiency level and workload based on their weekly working hours diff --git a/addons/sale/i18n/mn.po b/addons/sale/i18n/mn.po index 006f67fca37..7ed2bf0c80c 100644 --- a/addons/sale/i18n/mn.po +++ b/addons/sale/i18n/mn.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-09-29 11:07+0000\n" -"Last-Translator: ub121 \n" +"PO-Revision-Date: 2010-10-16 11:51+0000\n" +"Last-Translator: sugi \n" "Language-Team: Mongolian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-30 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: sale @@ -58,6 +58,8 @@ msgid "" "If you don't have enough stock available to deliver all at once, do you " "accept partial shipments or not?" msgstr "" +"Хэрэв та бүгдийг нэгэн зэрэг багтаахад хангалтгүй агуулахтай бол хэсэгчилсэн " +"барааг хүлээж авдаг уу эсвэл авдгүй юу?" #. module: sale #: selection:sale.order.line,type:0 @@ -84,7 +86,7 @@ msgstr "Таны нэхэмжлэл амжилттай үүслээ !" #: view:sale.order:0 #: view:sale.order.line:0 msgid "Automatic Declaration" -msgstr "" +msgstr "Автомат мэдэгдэл" #. module: sale #: model:ir.actions.act_window,name:sale.action_order_line_tree3 @@ -281,6 +283,11 @@ msgid "" "choose if you invoice based on ordered or shipped quantities. If the product " "is a service, shipped quantities means hours spent on the associated tasks." msgstr "" +"Борлуулалтын захиалга нь автоматаар нэхэмжлэлийн баталгааг үүсгэдэг. " +"Захиалсан болон хүргэж өгсөн тоо хэмжээ нь адилхан биш байх боломжтой. Хэрэв " +"нэхэмжлэл гаргах бол захиалагдсан эсвэл тээвэрлэгдсэн тоо хэмжээн дээр " +"суурилан гаргах хэрэгтэй. Хэрэв бүтээгдэхүүн үйлчилгээ бол тээвэрлэгдсэн тоо " +"хэмжээ нь холбоотой дааллгавар дээр зарцуулсан цаг болно." #. module: sale #: selection:sale.order.line,state:0 @@ -386,6 +393,8 @@ msgid "" "When you select Shipping Ploicy = 'Automatic Invoice after delivery' , it " "will automatic create after delivery." msgstr "" +"Тээвэрлэлтийн удирдамж нь = 'Хүргэлтийн дараах автомат нэхэмжлэл ' гэсэн " +"сонголттой үед хүргэлтийн дараа автоматаар үүсэх болно." #. module: sale #: selection:sale.order,picking_policy:0 @@ -524,7 +533,7 @@ msgstr "Нэхэмжлэлийг бүлэглэх" #: model:ir.actions.act_window,name:sale.action_order_tree5 #: model:ir.ui.menu,name:sale.menu_action_order_tree5 msgid "All Quotations" -msgstr "" +msgstr "Бүх ханш" #. module: sale #: field:sale.order.line,discount:0 @@ -540,18 +549,18 @@ msgstr "Ноорог нэхэмжлэл нягтлангаар хянагдах #: model:ir.actions.act_window,name:sale.action_order_tree3 #: model:ir.ui.menu,name:sale.menu_action_order_tree3 msgid "Sales Order To Be Invoiced" -msgstr "" +msgstr "Борлуулалтын захаилга нэхэмжлэгдсэн байх" #. module: sale #: model:process.node,note:sale.process_node_saleorderprocurement0 msgid "Procurement for each line" -msgstr "" +msgstr "Мөр бүрээр татан авалт хийх" #. module: sale #: model:ir.actions.act_window,name:sale.action_order_tree10 #: model:ir.ui.menu,name:sale.menu_action_order_tree10 msgid "My Quotations" -msgstr "" +msgstr "Миний ханш" #. module: sale #: wizard_view:sale.advance_payment_inv,create:0 @@ -566,17 +575,17 @@ msgstr "Захиалгын шугам" #. module: sale #: field:sale.config.picking_policy,picking_policy:0 msgid "Packing Default Policy" -msgstr "" +msgstr "Савлах заяамал удирдамж" #. module: sale #: model:process.node,note:sale.process_node_saleorder0 msgid "Manages the delivery and invoicing progress" -msgstr "" +msgstr "Хүргэлт болон нэхэмжлэх үйл ажиллагааг удирдах" #. module: sale #: field:sale.config.picking_policy,order_policy:0 msgid "Shipping Default Policy" -msgstr "" +msgstr "Тээвэрлэлтийн заяамал арга" #. module: sale #: field:sale.order.line,product_packaging:0 @@ -625,7 +634,7 @@ msgstr "Нэхэмжилсэн" #. module: sale #: model:ir.actions.wizard,name:sale.advance_payment msgid "Advance Invoice" -msgstr "" +msgstr "Урьдчилсан нэхэмжлэл" #. module: sale #: field:sale.order,state:0 @@ -636,7 +645,7 @@ msgstr "Төлөв" #: model:ir.actions.act_window,name:sale.action_order_line_tree2 #: model:ir.ui.menu,name:sale.menu_action_order_line_tree2 msgid "Uninvoiced Lines" -msgstr "" +msgstr "Нэхэмжлэлгүй мөр" #. module: sale #: model:ir.actions.todo,note:sale.config_wizard_step_sale_picking_policy @@ -669,7 +678,7 @@ msgstr "" #: model:ir.actions.act_window,name:sale.action_order_tree7 #: model:ir.ui.menu,name:sale.menu_action_order_tree7 msgid "My sales in shipping exception" -msgstr "" +msgstr "Миний борлуулалтын алдаатай тээвэрлэлт" #. module: sale #: view:sale.config.picking_policy:0 @@ -705,7 +714,7 @@ msgstr "Засварласан нийлүүлэлт" #. module: sale #: selection:sale.order,order_policy:0 msgid "Shipping & Manual Invoice" -msgstr "" +msgstr "Тээвэрлэх болон нэхэмжлэх заавар" #. module: sale #: model:process.transition,name:sale.process_transition_saleorderprocurement0 @@ -716,7 +725,7 @@ msgstr "Борлуулалт нийлүүлэлт" #. module: sale #: view:sale.config.picking_policy:0 msgid "Configure Sale Order Logistic" -msgstr "" +msgstr "Борлуулалтын захиалгын Ложистик тохиргоо" #. module: sale #: field:sale.order,amount_untaxed:0 @@ -751,7 +760,7 @@ msgstr "Урьдчилсан нэхэмжлэл үүсгэх" #. module: sale #: model:process.node,note:sale.process_node_saleprocurement0 msgid "One procurement for each product." -msgstr "" +msgstr "Бүтээгдэхүүн бүр дээр нэг татан авалт" #. module: sale #: model:ir.actions.act_window,name:sale.action_order_form @@ -785,7 +794,7 @@ msgstr "Үнэ бүүралт" #. module: sale #: model:product.template,name:sale.advance_product_0_product_template msgid "Advance Product" -msgstr "" +msgstr "Төлсөн бүтээгдэхүүн" #. module: sale #: model:process.transition,note:sale.process_transition_invoice0 @@ -856,7 +865,7 @@ msgstr "Зөвхөн хүргэх захиалга" #: view:sale.order:0 #: view:sale.order.line:0 msgid "Sales order lines" -msgstr "" +msgstr "Борлуулалтын захиалгын мөр" #. module: sale #: field:sale.order.line,sequence:0 @@ -866,7 +875,7 @@ msgstr "Дараалал" #. module: sale #: model:ir.actions.act_window,name:sale.act_res_partner_2_sale_order msgid "Sales" -msgstr "" +msgstr "Борлуулалт" #. module: sale #: view:sale.order:0 @@ -968,12 +977,12 @@ msgstr "" #. module: sale #: model:process.transition,note:sale.process_transition_saleinvoice0 msgid "Confirm sale order and Create invoice." -msgstr "" +msgstr "Борлуулалтын захиалгыг батлах болон нэхэмжлэл үүсгэх" #. module: sale #: selection:sale.config.picking_policy,step:0 msgid "Packing List & Delivery Order" -msgstr "" +msgstr "Савлагааны жагсаалт ба Хүргэлтийн захаилга" #. module: sale #: selection:sale.order.line,state:0 @@ -1005,7 +1014,7 @@ msgstr "" #. module: sale #: view:sale.config.picking_policy:0 msgid "Set Default" -msgstr "" +msgstr "Үндсэн утга болгох" #. module: sale #: view:sale.order:0 @@ -1087,13 +1096,13 @@ msgstr "Эрх шилжүүлэхийг цуцлах" #. module: sale #: selection:sale.order,order_policy:0 msgid "Invoice from the Packing" -msgstr "" +msgstr "Савлагааны нэхэмжлэл" #. module: sale #: model:ir.actions.wizard,name:sale.wizard_sale_order_line_invoice #: model:ir.actions.wizard,name:sale.wizard_sale_order_make_invoice msgid "Make invoices" -msgstr "" +msgstr "Нэхэмжлэл үүсгэх" #. module: sale #: help:sale.order,partner_order_id:0 @@ -1135,7 +1144,7 @@ msgstr "Нэхэмжлэх арга" #: model:ir.actions.act_window,name:sale.action_order_tree_new #: model:ir.ui.menu,name:sale.menu_action_order_tree_new msgid "New Quotation" -msgstr "" +msgstr "Шинэ ханш" #. module: sale #: view:sale.order:0 @@ -1156,7 +1165,7 @@ msgstr "Барааны зарах нэгж" #. module: sale #: selection:sale.order,state:0 msgid "Manual In Progress" -msgstr "" +msgstr "Үйл явцын заавар" #. module: sale #: field:sale.order.line,product_uom:0 diff --git a/addons/sale/i18n/ru.po b/addons/sale/i18n/ru.po index 556ed670eaf..5e2db5aff01 100644 --- a/addons/sale/i18n/ru.po +++ b/addons/sale/i18n/ru.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-09-30 06:52+0000\n" +"PO-Revision-Date: 2010-10-16 11:15+0000\n" "Last-Translator: Chertykov Denis \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-01 08:47+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: sale @@ -762,7 +762,7 @@ msgstr "" #. module: sale #: model:process.node,note:sale.process_node_saleprocurement0 msgid "One procurement for each product." -msgstr "" +msgstr "Одна закупка для каждого товара." #. module: sale #: model:ir.actions.act_window,name:sale.action_order_form @@ -773,12 +773,12 @@ msgstr "Заказы" #. module: sale #: field:product.product,pricelist_sale:0 msgid "Sale Pricelists" -msgstr "" +msgstr "Каталоги продаж" #. module: sale #: selection:sale.config.picking_policy,picking_policy:0 msgid "Direct Delivery" -msgstr "" +msgstr "Прямая доставка" #. module: sale #: view:sale.order:0 @@ -831,7 +831,7 @@ msgstr "Заказы в процессе выполнения" #. module: sale #: model:process.transition.action,name:sale.process_transition_action_assign0 msgid "Assign" -msgstr "" +msgstr "Назначить" #. module: sale #: view:sale.order:0 @@ -905,7 +905,7 @@ msgstr "Цена за ед." #. module: sale #: field:sale.order,fiscal_position:0 msgid "Fiscal Position" -msgstr "" +msgstr "Налоговая позиция" #. module: sale #: rml:sale.order:0 diff --git a/addons/sale/report/sale_report_view.xml b/addons/sale/report/sale_report_view.xml index 87f134e857c..c4cc59f7b9a 100644 --- a/addons/sale/report/sale_report_view.xml +++ b/addons/sale/report/sale_report_view.xml @@ -102,7 +102,7 @@ - + @@ -125,7 +125,7 @@ {'search_default_month':1,'search_default_User':1,'group_by_no_leaf':1,'group_by':[]} - With Sales Analysis consult your sales total amount suits to different group criteria (salesman, partner, product, etc.) + This report performs analysis on your quotations and sales orders. Analysis check your sales revenues and sort it by different group criteria (salesman, partner, product, etc.) Use this report to perform analysis on sales not having invoiced yet. If you want to analyse your turnover, you should use the Invoice Analysis report in the Accounting application. diff --git a/addons/sale/sale.py b/addons/sale/sale.py index e8ccb657bc2..409be07a765 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -54,7 +54,7 @@ def _incoterm_get(self, cr, uid, context=None): class sale_order(osv.osv): _name = "sale.order" _description = "Sale Order" - + def copy(self, cr, uid, id, default=None, context=None): if context is None: context = {} @@ -331,7 +331,7 @@ class sale_order(osv.osv): wf_service.trg_delete(uid, 'sale.order', inv_id, cr) wf_service.trg_create(uid, 'sale.order', inv_id, cr) for (id,name) in self.name_get(cr, uid, ids): - message = _('Sale order ') + " '" + name + "' "+ _("is in draft state") + message = _("The sale order '%s' has been set in draft state.") %(name,) self.log(cr, uid, id, message) return True @@ -486,9 +486,9 @@ class sale_order(osv.osv): 'context': "{'type':'out_invoice'}", 'type': 'ir.actions.act_window', 'nodestroy' :True, - 'target': 'new', + 'target': 'current', 'res_id': inv_ids and inv_ids[0] or False, - } + } return result @@ -618,7 +618,7 @@ class sale_order(osv.osv): wf_service.trg_validate(uid, 'account.invoice', inv, 'invoice_cancel', cr) sale_order_line_obj.write(cr, uid, [l.id for l in sale.order_line], {'state': 'cancel'}) - message = _('Sale order') + " '" + sale.name + _(" is cancelled") + message = _("The sale order '%s' has been cancelled.") % (sale.name,) self.log(cr, uid, sale.id, message) self.write(cr, uid, ids, {'state': 'cancel'}) return True @@ -630,7 +630,7 @@ class sale_order(osv.osv): else: self.write(cr, uid, [o.id], {'state': 'progress', 'date_confirm': time.strftime('%Y-%m-%d')}) self.pool.get('sale.order.line').button_confirm(cr, uid, [x.id for x in o.order_line]) - message = _('Quotation') + " '" + o.name + "' "+ _("is converted to Sale order") + message = _("The quotation '%s' has been converted to a sale order.") % (o.name,) self.log(cr, uid, o.id, message) return True @@ -989,8 +989,6 @@ class sale_order_line(osv.osv): raise osv.except_osv( _('Could not cancel sale order line!'), _('You must first cancel stock moves attached to this sale order line.')) - message = _('Sale order line') + " '" + line.name + "' "+_("is cancelled") - self.log(cr, uid, id, message) return self.write(cr, uid, ids, {'state': 'cancel'}) def button_confirm(self, cr, uid, ids, context=None): diff --git a/addons/sale/sale_installer.py b/addons/sale/sale_installer.py index 4197c0a370b..a8cc5432020 100644 --- a/addons/sale/sale_installer.py +++ b/addons/sale/sale_installer.py @@ -28,11 +28,8 @@ class sale_installer(osv.osv_memory): _columns = { 'delivery': fields.boolean('Delivery Costs', help="Allows you to compute delivery costs on your quotations."), - 'sale_journal': fields.boolean('Sales and deliveries by journal', - help="Allows you to categorise your " - "sales and deliveries (picking lists) between different journals. " - "This module is very helpful for bigger companies that " - "work by departments."), + 'sale_journal': fields.boolean('Invoicing journals', + help="Allows you to group and invoice your delivery orders according to different invoicing types: daily, weekly, etc."), 'sale_layout': fields.boolean('Sales Order Layout Improvement', help="Provides some features to improve the layout of the Sales Order reports."), 'sale_margin': fields.boolean('Margins in Sales Orders', diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml index 85dd4c86c27..b9eabcaa02e 100644 --- a/addons/sale/sale_view.xml +++ b/addons/sale/sale_view.xml @@ -1,9 +1,9 @@ - + groups="base.group_sale_salesman,base.group_sale_manager"/> + @@ -46,11 +46,14 @@ form tree,form + If you have more than one shops reselling your company products, you can create and manage them from here. Whenever you will record a new quotation or sale order, it has to be linked to a shop. The shop also defines the warehouse from which the products will be delivered for each particular sale. + + parent="menu_config_sale" sequence="0" /> sale.order.calendar @@ -197,7 +200,8 @@ - + @@ -206,7 +210,7 @@ - + @@ -288,12 +292,7 @@ form tree,form,calendar,graph - The sales order manages the invoicing, the product fullfilment and the -delivery processes. OpenERP can handle products, services and -consumables so that a sales order can trigger tasks, manufacturing -orders, purchases, etc. It support several invoicing methods according -to your configuration: from the sales order, from the pickings, etc. - + Sales Orders helps you manage quotations and orders done with your customers. OpenERP suggests that you to start by creating a quotation. Once the order is confirmed, the quotation is converted into a Sale Order. OpenERP can handle several types of products so that a sales order can trigger tasks, delivery orders, manufacturing orders, purchases and so on. Based on the configuration of the sale order, a draft invoice will be generated so that you just have to confirm it when you want to bill your customer. @@ -378,14 +377,15 @@ to your configuration: from the sales order, from the pickings, etc. - + + + - + - @@ -398,20 +398,21 @@ to your configuration: from the sales order, from the pickings, etc. - + states="confirmed,exception"/> + + states="confirmed,exception" + icon="gtk-go-forward" /> @@ -448,10 +449,15 @@ to your configuration: from the sales order, from the pickings, etc. search - + {"search_default_uninvoiced":1} - Lines to invoice opens a search view with sales order and their status. + Here is a list of each sales order line to be invoiced. This view allows you to invoice sales orders partially, by lines of sales order. You don't need this list if you invoice based on the delivery orders or if you invoice sales totally. @@ -518,7 +524,7 @@ to your configuration: from the sales order, from the pickings, etc. src_model="product.product" groups="base.group_extended"/> - @@ -534,8 +540,7 @@ to your configuration: from the sales order, from the pickings, etc. Sales Application Configuration - Configure Sales Order Logistic + Configure Sales Order Logistic Setup your sales workflow and default values. diff --git a/addons/sale/security/ir.model.access.csv b/addons/sale/security/ir.model.access.csv index 3675ccf32ae..11718051d04 100644 --- a/addons/sale/security/ir.model.access.csv +++ b/addons/sale/security/ir.model.access.csv @@ -1,8 +1,8 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_sale_shop","sale.shop","model_sale_shop","base.group_sale_salesman",1,0,0,0 +"access_sale_shop","sale.shop","model_sale_shop","base.group_user",1,0,0,0 "access_sale_order","sale.order","model_sale_order","base.group_sale_salesman",1,1,1,0 "access_sale_order_line","sale.order.line","model_sale_order_line","base.group_sale_salesman",1,1,1,1 -"access_sale_shop_admin","sale.shop","model_sale_shop","base.group_system",1,1,1,1 +"access_account_invoice_tax_salesman","account_invoice_tax salesman","account.model_account_invoice_tax","base.group_sale_salesman",1,1,1,0 "access_account_invoice_salesman","account_invoice salesman","account.model_account_invoice","base.group_sale_salesman",1,1,1,0 "access_account_invoice_manager","account_invoice manager","account.model_account_invoice","base.group_sale_manager",1,1,1,1 "access_account_invoice_line_salesman","account_invoice.line salesman","account.model_account_invoice_line","base.group_sale_salesman",1,1,1,0 @@ -23,7 +23,6 @@ "access_sale_account_journal","account.journal sale order.user","account.model_account_journal","base.group_sale_salesman",1,0,0,0 "access_res_partner_sale_user","res.partner.sale.user","base.model_res_partner","base.group_sale_salesman",1,0,0,0 "access_res_partner_sale_manager","res.partner.sale.user","base.model_res_partner","base.group_sale_manager",1,0,0,0 -"access_res_partner_sale_system","res.partner.sale.system","base.model_res_partner","base.group_system",1,0,0,0 "access_report_stock_move_sales","report.stock.move.sale","stock.model_report_stock_move","base.group_sale_manager",1,1,1,1 "access_stock_picking_sales","stock.picking.sales","stock.model_stock_picking","base.group_sale_manager",1,1,1,1 "access_product_template_sale_user","product.template sale use","product.model_product_template","base.group_sale_salesman",1,0,0,0 @@ -36,18 +35,8 @@ "access_res_partner_address_user","res.partner.address.user","base.model_res_partner_address","base.group_sale_salesman",1,0,0,0 "access_account_tax_user","account.tax.user","account.model_account_tax","base.group_sale_salesman",1,1,1,0 "access_product_packaging_user","product.packaging.user","product.model_product_packaging","base.group_sale_salesman",1,1,1,0 -"access_res_country_system","res.country system","base.model_res_country","base.group_system",1,1,1,1 -"access_res_country_state_system","res.country.state system","base.model_res_country_state","base.group_system",1,1,1,1 -"access_res_partner_title_system","res.partner.title system","base.model_res_partner_title","base.group_system",1,1,1,1 -"access_sale_order_system","sale.order.system","model_sale_order","base.group_system",1,0,0,0 -"access_sale_order_line_system","sale.order.line.system","model_sale_order_line","base.group_system",1,0,0,0 -"access_product_product_system","product.product.system","product.model_product_product","base.group_system",1,0,0,0 -"access_stock_picking_system","stock.picking.system","stock.model_stock_picking","base.group_system",1,0,0,0 -"access_sale_report_system","sale.report.system","model_sale_report","base.group_system",1,0,0,0 -"access_ir_attachment_system","ir.attachment.system","base.model_ir_attachment","base.group_system",1,0,0,0 "access_ir_attachment_sales","ir.attachment.sales","base.model_ir_attachment","base.group_sale_salesman",1,1,1,0 "access_ir_attachment_manager","ir.attachment.manager","base.model_ir_attachment","base.group_sale_manager",1,1,1,1 -"access_res_partner_bank_type_system","res.partner.bank.type.system","base.model_res_partner_bank_type","base.group_system",1,0,0,0 "access_stock_warehouse_manager","stock.warehouse.manager","stock.model_stock_warehouse","base.group_sale_manager",1,0,0,0 "access_product_uom_manager","product.uom.manager","product.model_product_uom","base.group_sale_manager",1,0,0,0 "access_product_supplierinfo_manager","product.supplierinfo.manager","product.model_product_supplierinfo","base.group_sale_manager",1,0,0,0 @@ -60,6 +49,5 @@ "access_res_partner_bank_type_field_user","res.partner.bank.type.field.user","base.model_res_partner_bank_type_field","base.group_sale_salesman",1,0,0,0 "access_product_uom_user","product.uom.user","product.model_product_uom","base.group_sale_salesman",1,0,0,0 "access_product_supplierinfo_user","product.supplierinfo.user","product.model_product_supplierinfo","base.group_sale_salesman",1,0,0,0 -"access_res_partner_bank_type_field_system","res.partner.bank.type.field.system","base.model_res_partner_bank_type_field","base.group_system",1,0,0,0 "access_product_pricelist_sale_user","product.pricelist.sale.user","product.model_product_pricelist","base.group_sale_salesman",1,0,0,0 "access_account_account_salesman","account_account salesman","account.model_account_account","base.group_sale_salesman",1,0,0,0 diff --git a/addons/sale/stock_view.xml b/addons/sale/stock_view.xml index dddcad07932..4075c523cb9 100644 --- a/addons/sale/stock_view.xml +++ b/addons/sale/stock_view.xml @@ -25,6 +25,7 @@ + @@ -61,5 +63,18 @@ + + + Deliveries to Invoice + stock.picking + ir.actions.act_window + form + tree,form,calendar + [('type','=','out')] + {'contact_display': 'partner_address', 'search_default_to_invoice': 1, 'search_default_done': 1} + + + + diff --git a/addons/sale/test/invoice_on_shipped_qty.yml b/addons/sale/test/invoice_on_shipped_qty.yml index ab24c8541fd..3ed4387067a 100644 --- a/addons/sale/test/invoice_on_shipped_qty.yml +++ b/addons/sale/test/invoice_on_shipped_qty.yml @@ -65,24 +65,16 @@ 'product_uom': move.product_uom.id, } self.do_partial(cr, uid, [pick.id],partial_datas) -- - Then I create the invoice from the two partial picking -- - !record {model: stock.invoice.onshipping, id: stock_invoice_onshipping_6}: - invoice_date: '2010-07-17' - journal_id: account.sales_journal - type: out_invoice - Then I click on 'Create Invoices' button - !python {model: stock.invoice.onshipping}: | sale_obj = self.pool.get('sale.order') sale_id = sale_obj.browse(cr, uid, ref("sale_order_so6")) - picking_obj = self.pool.get('stock.picking') - ids = picking_obj.search(cr, uid, [('origin', '=', sale_id.name)]) - self.create_invoice(cr, uid, [ref("stock_invoice_onshipping_6")], {"lang": "en_US", - "search_default_available": 1, "tz": False, "active_model": "stock.picking", - "contact_display": "partner", "active_ids": ids, "active_id": ids[0]}) + ids = [x.id for x in sale_id.picking_ids] + wiz_id = self.create(cr, uid, {'invoice_date': '2010-07-17', 'journal_id': ref('account.sales_journal')}, + {'active_ids': ids}) + self.create_invoice(cr, uid, [wiz_id], {"active_ids": ids}) - I verify whether the invoice has been generated for SO - diff --git a/addons/sale/test/picking_order_policy.yml b/addons/sale/test/picking_order_policy.yml index c3f4ba87aaf..b12bddd7ecc 100644 --- a/addons/sale/test/picking_order_policy.yml +++ b/addons/sale/test/picking_order_policy.yml @@ -58,24 +58,16 @@ 'product_uom': move.product_uom.id, } self.do_partial(cr, uid, [pick.id],partial_datas) -- - Then I create invoice from picking -- - !record {model: stock.invoice.onshipping, id: stock_invoice_onshipping_0}: - invoice_date: '2010-07-15' - journal_id: account.sales_journal - type: out_invoice - Then I click on 'Create Invoices' button - !python {model: stock.invoice.onshipping}: | sale_obj=self.pool.get('sale.order') sale_id=sale_obj.browse(cr, uid, ref("sale_order_so7")) - picking_obj = self.pool.get('stock.picking') - ids = picking_obj.search(cr, uid, [('origin', '=', sale_id.name)]) - self.create_invoice(cr, uid, [ref("stock_invoice_onshipping_0")], {"lang": "en_US", - "search_default_available": 1, "tz": False, "active_model": "stock.picking", - "contact_display": "partner", "active_ids": ids, "active_id": ids[0]}) + ids = [x.id for x in sale_id.picking_ids] + wiz_id = self.create(cr, uid, {'invoice_date': '2010-07-15', 'journal_id': ref('account.sales_journal')}, + {'active_ids': ids}) + self.create_invoice(cr, uid, [wiz_id], {"active_ids": ids}) - I check that an invoice has been created. - diff --git a/addons/sale/wizard/sale_make_invoice.xml b/addons/sale/wizard/sale_make_invoice.xml index e8e698e56b9..267167237bc 100644 --- a/addons/sale/wizard/sale_make_invoice.xml +++ b/addons/sale/wizard/sale_make_invoice.xml @@ -26,6 +26,7 @@ form new + True diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py index 0eac0308acc..0037c10405d 100644 --- a/addons/sale/wizard/sale_make_invoice_advance.py +++ b/addons/sale/wizard/sale_make_invoice_advance.py @@ -26,8 +26,9 @@ class sale_advance_payment_inv(osv.osv_memory): _name = "sale.advance.payment.inv" _description = "Sale Advance Payment Invoice" _columns = { - 'product_id': fields.many2one('product.product', 'Product', required=True), - 'amount': fields.float('Unit Price', size=(16, 2), required=True), + 'product_id': fields.many2one('product.product', 'Advance Product', required=True, + help="Select a product of type service which is called 'Advance Product'. You may have to create it and set it as a default value on this field."), + 'amount': fields.float('Advance Amount', size=(16, 2), required=True, help="The amount to be invoiced in advance."), 'qtty': fields.float('Quantity', size=(16, 2), required=True), } _defaults = { @@ -95,6 +96,7 @@ class sale_advance_payment_inv(osv.osv_memory): } inv_id = inv_obj.create(cr, uid, inv) + inv_obj.button_reset_taxes(cr, uid, [inv_id], context=context) for inv in sale.invoice_ids: ids_inv.append(inv.id) @@ -168,7 +170,7 @@ class sale_open_invoice(osv.osv_memory): tree_id = mod_obj._get_id(cr, uid, 'account', 'invoice_tree') tree_res = mod_obj.browse(cr, uid, tree_id, context=context).res_id return { - 'name': 'Invoices', + 'name': _('Advance Invoice'), 'view_type': 'form', 'view_mode': 'form,tree', 'res_model': 'account.invoice', @@ -181,4 +183,4 @@ class sale_open_invoice(osv.osv_memory): sale_open_invoice() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale/wizard/sale_make_invoice_advance.xml b/addons/sale/wizard/sale_make_invoice_advance.xml index 6e192d31108..2cdcb9b8c99 100644 --- a/addons/sale/wizard/sale_make_invoice_advance.xml +++ b/addons/sale/wizard/sale_make_invoice_advance.xml @@ -2,26 +2,26 @@ - Deposit Invoice + Advance Invoice sale.advance.payment.inv form - + - + - - + + - Deposit + Advance Invoice ir.actions.act_window sale.advance.payment.inv form @@ -34,15 +34,15 @@ sale.open.invoice form - - + + - - - - - + + + + + diff --git a/addons/sale_analytic_plans/i18n/sr.po b/addons/sale_analytic_plans/i18n/sr.po index ceaa67abddb..5332a39285e 100644 --- a/addons/sale_analytic_plans/i18n/sr.po +++ b/addons/sale_analytic_plans/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 20:30+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 08:33+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: sale_analytic_plans diff --git a/addons/sale_journal/__init__.py b/addons/sale_journal/__init__.py index b41a4be55d1..b05803da6c6 100644 --- a/addons/sale_journal/__init__.py +++ b/addons/sale_journal/__init__.py @@ -20,7 +20,4 @@ ############################################################################## import sale_journal -import report - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale_journal/__openerp__.py b/addons/sale_journal/__openerp__.py index 4fde94fc709..37fc05fd066 100644 --- a/addons/sale_journal/__openerp__.py +++ b/addons/sale_journal/__openerp__.py @@ -53,14 +53,9 @@ 'update_xml': [ 'security/ir.model.access.csv', 'sale_journal_view.xml', - 'report/sale_journal_report_view.xml', - 'report/picking_journal_report_view.xml', ], 'demo_xml': ['sale_journal_demo.xml'], - 'test': [ - 'test/sale_journal.yml', - 'test/picking_journal.yml', - ], + 'test': [ ], 'installable': True, 'active': False, 'certificate': '0077661619085', diff --git a/addons/sale_journal/report/__init__.py b/addons/sale_journal/report/__init__.py deleted file mode 100644 index bfe23eb8cce..00000000000 --- a/addons/sale_journal/report/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -import sale_journal_report -import picking_journal_report - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/sale_journal/report/picking_journal_report.py b/addons/sale_journal/report/picking_journal_report.py deleted file mode 100644 index 74c00367838..00000000000 --- a/addons/sale_journal/report/picking_journal_report.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -from osv import fields, osv -import tools -from decimal_precision import decimal_precision as dp - - -class sale_journal_picking_report(osv.osv): - """ - Picking list by journal and by invoice - """ - _name = "sale.journal.picking.report" - _description = "Picking lists" - _auto = False - _columns = { - 'name': fields.char('Year', size=64, required=False, 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), - - 'invoice_state':fields.selection([ - ("invoiced", "invoiced"), - ("2binvoiced", "to be invoiced"), - ("none", "None") - ], "Invoice state", readonly=True), - 'state': fields.selection([ - ('draft', 'draft'), - ('auto', 'waiting'), - ('confirmed', 'confirmed'), - ('assigned', 'assigned'), - ('done', 'done'), - ('cancel', 'cancel'), - ], 'State', readonly=True), - 'invoice_type_id': fields.many2one('sale_journal.invoice.type', 'Invoicing method', readonly=True), - 'journal_id': fields.many2one('sale_journal.picking.journal', 'Journal', readonly=True), - 'quantity': fields.float('Quantities', readonly=True), - 'price_total': fields.float('Total Price', readonly=True, digits_compute=dp.get_precision('Sale Price')), - 'price_average': fields.float('Average Price', readonly=True, digits_compute=dp.get_precision('Sale Price')), - 'count': fields.integer('# of Lines', readonly=True), - } - _order = 'journal_id, name desc, price_total desc' - - def init(self, cr): - tools.drop_view_if_exists(cr, 'sale_journal_picking_report') - - cr.execute(""" - create or replace view sale_journal_picking_report as ( - select - min(l.id) as id, - to_char(s.date, 'YYYY') as name, - to_char(s.date, 'MM') as month, - s.state, - s.invoice_state, - s.invoice_type_id, - s.journal_id, - sum(l.product_qty) as quantity, - count(*) as count, - sum(l.product_qty*ol.price_unit*(1.0-ol.discount/100.0)) as price_total, - (sum(l.product_qty*ol.price_unit*(1.0-ol.discount/100.0))/sum(l.product_qty))::decimal(16,2) as price_average - from stock_picking s - right join stock_move l on (s.id=l.picking_id) - left join sale_order_line ol on (l.sale_line_id=ol.id) - group by s.journal_id, s.invoice_type_id, to_char(s.date, 'YYYY'),to_char(s.date, 'MM'),s.state, s.invoice_state - order by s.invoice_type_id, s.invoice_state, s.state - ) - """) - -sale_journal_picking_report() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale_journal/report/picking_journal_report_view.xml b/addons/sale_journal/report/picking_journal_report_view.xml deleted file mode 100644 index bcfa293a64c..00000000000 --- a/addons/sale_journal/report/picking_journal_report_view.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - sale.journal.picking.report.tree - sale.journal.picking.report - tree - - - - - - - - - - - - - - - - - - - - sale.journal.picking.report.graph - sale.journal.picking.report - graph - - - - - - - - - - - - - sale.journal.picking.report.search - sale.journal.picking.report - search - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Statistics on picking to invoice - sale.journal.picking.report - ir.actions.act_window - form - tree,form - [('invoice_state','=','2binvoiced'),('invoice_type_id','=',active_id)] - - - - - - Picking Journal - sale.journal.picking.report - ir.actions.act_window - form - tree,graph - - {'search_default_month':1, 'group_by_no_leaf':1,'group_by':[]} - - - - - - diff --git a/addons/sale_journal/report/sale_journal_report.py b/addons/sale_journal/report/sale_journal_report.py deleted file mode 100644 index 723a7f88722..00000000000 --- a/addons/sale_journal/report/sale_journal_report.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -from osv import fields, osv -import tools - -class sale_journal_report(osv.osv): - _name = "sale.journal.report" - _description = "Sales Orders by Journal" - _auto = False - _columns = { - 'name': fields.char('Year', size=64, required=False, 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), - 'state': fields.selection([ - ('draft', 'Quotation'), - ('waiting_date', 'Waiting Schedule'), - ('manual', 'Manual in progress'), - ('progress', 'In progress'), - ('shipping_except', 'Shipping Exception'), - ('invoice_except', 'Invoice Exception'), - ('done', 'Done'), - ('cancel', 'Cancel') - ], 'Order State', readonly=True), - 'journal_id': fields.many2one('sale_journal.sale.journal', 'Journal', readonly=True), - 'quantity': fields.float('Quantities', readonly=True), - 'price_total': fields.float('Total Price', readonly=True), - 'price_average': fields.float('Average Price', readonly=True), - 'count': fields.integer('# of Lines', readonly=True), - } - - _order = 'journal_id, name desc,price_total desc' - - def init(self, cr): - tools.drop_view_if_exists(cr, 'sale_journal_report') - cr.execute(""" - create or replace view sale_journal_report as ( - select - min(l.id) as id, - to_char(s.date_order, 'YYYY') as name, - to_char(s.date_order,'MM') as month, - s.state, - s.journal_id, - sum(l.product_uom_qty) as quantity, - count(*), - sum(l.product_uom_qty*l.price_unit) as price_total, - (sum(l.product_uom_qty*l.price_unit)/sum(l.product_uom_qty))::decimal(16,2) as price_average - from sale_order s - right join sale_order_line l on (s.id=l.order_id) - group by s.journal_id , to_char(s.date_order, 'YYYY'),to_char(s.date_order, 'MM'), s.state - ) - """) - -sale_journal_report() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale_journal/report/sale_journal_report_view.xml b/addons/sale_journal/report/sale_journal_report_view.xml deleted file mode 100644 index 63caea90768..00000000000 --- a/addons/sale_journal/report/sale_journal_report_view.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - sale.journal.report.tree - sale.journal.report - tree - - - - - - - - - - - - - - - - - sale.journal.report.graph - sale.journal.report - graph - - - - - - - - - - - - sale.journal.report.search - sale.journal.report - search - - - - - - - - - - - - - - - - - - - - - - - - - - - Sales by Journal - sale.journal.report - ir.actions.act_window - form - tree,graph - - {'search_default_journal': 1,'group_by_no_leaf':1,'group_by':[]} - - - - - - diff --git a/addons/sale_journal/sale_journal.py b/addons/sale_journal/sale_journal.py index 10f2606955a..09902b21099 100644 --- a/addons/sale_journal/sale_journal.py +++ b/addons/sale_journal/sale_journal.py @@ -39,181 +39,6 @@ class sale_journal_invoice_type(osv.osv): } sale_journal_invoice_type() -class sale_journal(osv.osv): - _name = 'sale_journal.sale.journal' - _description = 'Sale Journal' - _columns = { - 'name': fields.char('Journal', size=64, required=True, states={'close':[('readonly',True)]}), - 'code': fields.char('Code', size=16, required=True, states={'close':[('readonly',True)]}), - 'user_id': fields.many2one('res.users', 'Responsible', required=True, states={'close':[('readonly',True)]}), - 'date': fields.date('Journal date', required=True, states={'close':[('readonly',True)]}), - 'date_created': fields.date('Creation date', readonly=True, required=True), - 'date_close': fields.date('Close date ', readonly=True), - 'sale_stats_ids': fields.one2many("sale.journal.report", "journal_id", 'Sale stats', readonly=True), - 'state': fields.selection([ - ('draft','Draft'), - ('open','Open'), - ('cancel','Cancel'), - ('confirm','Confirm'), - ('close','Close'), - ], 'State', required=True, readonly=True), - 'note': fields.text('Note'), - } - _defaults = { - 'date': time.strftime('%Y-%m-%d'), - 'date_created': time.strftime('%Y-%m-%d'), - 'user_id': lambda self,cr,uid,context: uid, - 'state': lambda self,cr,uid,context: 'draft', - } - - def button_sale_cancel(self, cr, uid, ids, context={}): - self.write(cr, uid, ids, {'state':'cancel'}) - for id in ids: - sale_ids = self.pool.get('sale.order').search(cr, uid, [('journal_id','=',id),('state','=','draft')]) - for saleid in sale_ids: - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'sale.order', saleid, 'cancel', cr) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Sale order of Journal') + " '" + name + "' "+ _("is cancelled") - self.log(cr, uid, id, message) - return True - - def button_sale_confirm(self, cr, uid, ids, context={}): - self.write(cr, uid, ids, {'state':'confirm'}) - for id in ids: - sale_ids = self.pool.get('sale.order').search(cr, uid, [('journal_id','=',id),('state','=','draft')]) - for saleid in sale_ids: - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'sale.order', saleid, 'order_confirm', cr) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Sale orders of Journal') + " '" + name + "' "+ _("is confirmed") - self.log(cr, uid, id, message) - return True - - def button_open(self, cr, uid, ids, context={}): - self.write(cr, uid, ids, {'state':'open'}) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Sale orders of Journal') + " '" + name + "' "+ _("is opened") - self.log(cr, uid, id, message) - return True - - def button_draft(self, cr, uid, ids, context={}): - self.write(cr, uid, ids, {'state':'draft'}) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Sale orders of Journal') + " '" + name + "' "+ _("is in draft state") - self.log(cr, uid, id, message) - return True - - def button_close(self, cr, uid, ids, context={}): - self.write(cr, uid, ids, {'state':'close', 'date_close':time.strftime('%Y-%m-%d')}) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Sale orders of Journal') + " '" + name + "' "+ _("is closed") - self.log(cr, uid, id, message) - return True - def button_reset(self, cr, uid, ids, context=None): - self.write(cr, uid, ids, {'state': 'draft'}) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Sale orders of Journal') + " '" + name + "' "+ _("is in draft state") - self.log(cr, uid, id, message) - return True - def copy(self, cr, uid, id, default=None, context=None): - """Overrides orm copy method - @param self: The object pointer - @param cr: the current row, from the database cursor, - @param uid: the current user’s ID for security checks, - @param ids: List of case’s IDs - @param context: A standard dictionary for contextual values - """ - if context is None: - context = {} - if default is None: - default = {} - default.update({'sale_stats_ids': []}) - return super(sale_journal, self).copy(cr, uid, id, default=default, context=context) - -sale_journal() - -class picking_journal(osv.osv): - _name = 'sale_journal.picking.journal' - _description = 'Picking Journal' - _columns = { - 'name': fields.char('Journal', size=64, required=True), - 'code': fields.char('Code', size=16, required=True), - 'user_id': fields.many2one('res.users', 'Responsible', required=True), - 'date': fields.date('Journal date', required=True), - 'date_created': fields.date('Creation date', readonly=True, required=True), - 'date_close': fields.date('Close date', readonly=True), - 'picking_stats_ids': fields.one2many("sale.journal.picking.report", "journal_id", 'Journal Stats', readonly=True), - 'state': fields.selection([ - ('draft','Draft'), - ('open','Open'), - ('cancel','Cancel'), - ('close','Close'), - ('confirm','Confirm'), - ], 'Creation date', required=True, readonly=True), - 'note': fields.text('Note'), - } - _defaults = { - 'date': time.strftime('%Y-%m-%d'), - 'date_created': time.strftime('%Y-%m-%d'), - 'user_id': lambda self,cr,uid,context: uid, - 'state': lambda self,cr,uid,context: 'draft', - } - def button_picking_cancel(self, cr, uid, ids, context={}): - self.write(cr, uid, ids, {'state':'cancel'}) - for id in ids: - pick_ids = self.pool.get('stock.picking').search(cr, uid, [('journal_id','=',id)]) - for pickid in pick_ids: - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'stock.picking', pickid, 'button_cancel', cr) - return True - - def button_open(self, cr, uid, ids, context={}): - self.write(cr, uid, ids, {'state':'open'}) - return True - - def button_draft(self, cr, uid, ids, context={}): - self.write(cr, uid, ids, {'state':'draft'}) - return True - - def button_close(self, cr, uid, ids, context={}): - self.write(cr, uid, ids, {'state':'close', 'date_close':time.strftime('%Y-%m-%d')}) - return True - - def button_reset(self, cr, uid, ids, context=None): - self.write(cr, uid, ids, {'state': 'draft'}) - for (id,name) in self.name_get(cr, uid, ids): - message = _('Sale orders of Journal') + " '" + name + "' "+ _("is in draft state") - self.log(cr, uid, id, message) - return True - - def button_picking_confirm(self, cr, uid, ids, context={}): - - self.write(cr, uid, ids, {'state':'confirm'}) - for id in ids: - pick_ids = self.pool.get('stock.picking').search(cr, uid, [('journal_id','=',id)]) - for pickid in pick_ids: - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'stock.picking', pickid, 'button_confirm', cr) - return True - - def copy(self, cr, uid, id, default=None, context=None): - """Overrides orm copy method - @param self: The object pointer - @param cr: the current row, from the database cursor, - @param uid: the current user’s ID for security checks, - @param ids: List of case’s IDs - @param context: A standard dictionary for contextual values - """ - if context is None: - context = {} - if default is None: - default = {} - default.update({'picking_stats_ids': []}) - return super(picking_journal, self).copy(cr, uid, id, default=default, context=context) - -picking_journal() - #============================================== # sale journal inherit #============================================== @@ -222,22 +47,20 @@ class res_partner(osv.osv): _inherit = 'res.partner' _columns = { 'property_invoice_type': fields.property( - 'sale_journal.invoice.type', - type = 'many2one', - relation = 'sale_journal.invoice.type', - string = "Invoicing Method", - method = True, - view_load = True, - group_name = "Accounting Properties", - help = "The type of journal used for sales and picking."), + 'sale_journal.invoice.type', + type = 'many2one', + relation = 'sale_journal.invoice.type', + string = "Invoicing Method", + method = True, + view_load = True, + group_name = "Accounting Properties", + help = "The type of journal used for sales and picking."), } res_partner() class picking(osv.osv): _inherit = "stock.picking" _columns = { - 'journal_id': fields.many2one('sale_journal.picking.journal', 'Picking Journal', domain=[('state','!=', 'close')],help="Picking Journal"), - 'sale_journal_id': fields.many2one('sale_journal.sale.journal', 'Sale Journal'), 'invoice_type_id': fields.many2one('sale_journal.invoice.type', 'Invoice Type', readonly=True) } picking() @@ -245,7 +68,6 @@ picking() class sale(osv.osv): _inherit = "sale.order" _columns = { - 'journal_id': fields.many2one('sale_journal.sale.journal', 'Journal', domain=[('state','not in', ('done', 'draft''cancel'))]), 'invoice_type_id': fields.many2one('sale_journal.invoice.type', 'Invoice Type') } def action_ship_create(self, cr, uid, ids, *args): @@ -253,18 +75,16 @@ class sale(osv.osv): for order in self.browse(cr, uid, ids, context={}): pids = [ x.id for x in order.picking_ids] self.pool.get('stock.picking').write(cr, uid, pids, { - 'invoice_type_id': order.invoice_type_id.id, - 'sale_journal_id': order.journal_id.id + 'invoice_type_id': order.invoice_type_id and order.invoice_type_id.id or False, }) return result def onchange_partner_id(self, cr, uid, ids, part): result = super(sale, self).onchange_partner_id(cr, uid, ids, part) if part: - itype = self.pool.get('res.partner').browse(cr, uid, part).property_invoice_type.id - result['value']['invoice_type_id'] = itype + itype = self.pool.get('res.partner').browse(cr, uid, part).property_invoice_type + if itype: + result['value']['invoice_type_id'] = itype.id return result sale() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/sale_journal/sale_journal_data.xml b/addons/sale_journal/sale_journal_data.xml index 3639f945c83..9d305fe9912 100644 --- a/addons/sale_journal/sale_journal_data.xml +++ b/addons/sale_journal/sale_journal_data.xml @@ -2,11 +2,11 @@ - - property_invoice_type - - - + + property_invoice_type + + + diff --git a/addons/sale_journal/sale_journal_demo.xml b/addons/sale_journal/sale_journal_demo.xml index 30606e25145..061a5af8544 100644 --- a/addons/sale_journal/sale_journal_demo.xml +++ b/addons/sale_journal/sale_journal_demo.xml @@ -2,17 +2,17 @@ - - Daily invoicing - - - Monthly invoicing - grouped - + + Daily invoicing + + + Monthly invoicing + grouped + - - - + + + diff --git a/addons/sale_journal/sale_journal_view.xml b/addons/sale_journal/sale_journal_view.xml index 029908da37a..ad160ec28ae 100644 --- a/addons/sale_journal/sale_journal_view.xml +++ b/addons/sale_journal/sale_journal_view.xml @@ -1,10 +1,5 @@ - - - @@ -14,13 +9,12 @@ - - - + + + - - - + + @@ -42,111 +36,15 @@ + Invoice Types sale_journal.invoice.type form tree,form + Invoice types are used on partners, sales order and delivery orders. You can create journal to group your invoicing according to customer's needs: daily, each wednesday, monthly, etc. - - - - - - sale_journal.sale.journal.form - sale_journal.sale.journal - form - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sale_journal.sale.journal.tree - sale_journal.sale.journal - tree - - - - - - - - - - - - - - - sale_journal.sale.journal.search - sale_journal.sale.journal - search - - - - - - - - - - - - - - - - - - - - - - sale_journal.sale.journal - form - tree,form - {'search_default_user_id':uid} - - - - - + @@ -157,11 +55,7 @@ - - - - - + @@ -175,8 +69,7 @@ - - + @@ -190,9 +83,7 @@ - - - + @@ -206,9 +97,7 @@ - - @@ -220,8 +109,6 @@ - - @@ -234,9 +121,7 @@ - - @@ -248,8 +133,6 @@ - - @@ -262,73 +145,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - res.partner.journal.property.form.inherit res.partner @@ -336,161 +157,13 @@ - + + + + - - - - - - sale_journal.picking.journal.form - sale_journal.picking.journal - form - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sale_journal.picking.journal.tree - sale_journal.picking.journal - tree - - - - - - - - - - - - - - - sale_journal.picking.journal.search - sale_journal.picking.journal - search - - - - - - - - - - - - - - - - - - - - - Picking Journals - sale_journal.picking.journal - form - tree,form - {'search_default_user_id':uid} - - - - - - - Picking by invoice_method - sale_journal.invoice.type - ir.actions.act_window - tree - - - - Picking to invoice - stock.picking - ir.actions.act_window - form - tree,form - [('state','=','done'),('invoice_state','=','2binvoiced'),('invoice_type_id','=',active_id)] - - - - tree_but_open - sale_journal.invoice.type - Picking to invoice - - - - - - stock.picking.journal.search - stock.picking - search - - - - - - - - - - stock.picking.journal.search - stock.picking - search - - - - - - - - - - stock.picking.journal.search - stock.picking - search - - - - - - - - - diff --git a/addons/sale_journal/security/ir.model.access.csv b/addons/sale_journal/security/ir.model.access.csv index 645ee5bd534..bc1a3b003c3 100644 --- a/addons/sale_journal/security/ir.model.access.csv +++ b/addons/sale_journal/security/ir.model.access.csv @@ -1,18 +1,6 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_sale_journal_invoice_type_finance_invoice","sale_journal.invoice.type invoice","model_sale_journal_invoice_type","account.group_account_invoice",1,0,0,0 +"access_sale_journal_invoice_type_finance_invoice","sale_journal.invoice.type invoice","model_sale_journal_invoice_type","account.group_account_invoice",1,1,1,1 "access_sale_journal_invoice_type_partner_manager","sale_journal.invoice.type partner manager","model_sale_journal_invoice_type","base.group_partner_manager",1,0,0,0 "access_sale_journal_invoice_type_salesman","sale_journal.invoice.type salesman","model_sale_journal_invoice_type","base.group_sale_salesman",1,0,0,0 -"access_sale_journal_sale_journal","sale_journal.sale.journal","model_sale_journal_sale_journal","base.group_sale_salesman",1,0,0,0 "access_sale_journal_invoice_type_manager","sale_journal.invoice.type.manager","model_sale_journal_invoice_type","base.group_sale_manager",1,1,1,1 -"access_sale_journal_sale_journal_manager","sale_journal.sale.journal.manager","model_sale_journal_sale_journal","base.group_sale_manager",1,1,1,1 -"access_sale_journal_picking_journal_manager","sale_journal.picking.journal.manager","model_sale_journal_picking_journal","base.group_sale_manager",1,1,1,1 -"access_sale_journal_sale_journal_stock_worker","sale_journal.sale.journal stock worker","model_sale_journal_sale_journal","stock.group_stock_user",1,0,0,0 -"access_sale_journal_picking_journal_stock_worker","sale_journal.picking.journal stock worker","model_sale_journal_picking_journal","stock.group_stock_user",1,0,0,0 "access_sale_journal_invoice_type_stock_worker","sale_journal.invoice_type stock worker","model_sale_journal_invoice_type","stock.group_stock_user",1,0,0,0 -"access_sale_journal_sale_journal_report_manager","sale_journal_sale_journal_report_manager","model_sale_journal_report","base.group_sale_manager",1,1,1,1 -"access_sale_journal_sale_journal_report_system","sale_journal_sale_journal_report_system","model_sale_journal_report","base.group_system",1,0,0,0 -"access_sale_journal_picking_report","sale_journal_picking_report","model_sale_journal_picking_report","stock.group_stock_manager",1,1,1,1 -"access_sale_journal_picking_journal","sale_journal_picking_journal","model_sale_journal_picking_journal","base.group_system",1,1,1,1 -"access_stock_picking_journal_system","stock_picking_journal_system","stock.model_stock_picking","base.group_system",1,1,1,1 -"access_sale_journal_invoice_type_system","sale_journal.invoice.type.system","model_sale_journal_invoice_type","base.group_system",1,1,1,1 -"access_sale_journal_sale_journal_system","sale_journal.sale.journal.system","model_sale_journal_sale_journal","base.group_system",1,1,1,1 diff --git a/addons/sale_journal/test/picking_journal.yml b/addons/sale_journal/test/picking_journal.yml deleted file mode 100644 index 9412c3d40d1..00000000000 --- a/addons/sale_journal/test/picking_journal.yml +++ /dev/null @@ -1,87 +0,0 @@ -- - In order to test the sale_journal module in OpenERP, - I create a picking journal -- - !record {model: sale_journal.picking.journal, id: sale_journal_picking_journal_pickjournal0}: - code: PJ - date: '2010-08-04' - date_created: '2010-08-04' - name: Pick_journal - state: draft - user_id: base.user_root -- - I create a picking for product keyboard, quantity 50 -- - !record {model: stock.picking, id: stock_picking_out0}: - address_id: base.res_partner_address_6 - company_id: base.main_company - invoice_state: none - journal_id: sale_journal_picking_journal_pickjournal0 - move_lines: - - company_id: base.main_company - date_expected: '2010-08-04 14:09:38' - date: '2010-08-04 14:09:38' - location_id: stock.stock_location_stock - product_id: product.product_product_24 - product_qty: 50.0 - product_uom: product.product_uom_unit - location_dest_id: stock.stock_location_customers - name: '[KEYA] Keyboard - AZERTY' - product_uos_qty: 50.0 - move_type: direct - name: OUT/00007 - type: out -- - I verify that a Journal consist of picking order -- - !python {model: sale_journal.picking.journal}: | - pick_jour = self.browse(cr, uid, ref("sale_journal_picking_journal_pickjournal0")) - assert pick_jour.picking_stats_ids, "Journal does not consist of a picking order" -- - Then I click on the 'Open Journal' button -- - !python {model: sale_journal.picking.journal}: | - self.button_open(cr, uid, [ref("sale_journal_picking_journal_pickjournal0")], {"lang": "en_US", "search_default_user_id": - 1, "tz": False, "active_model": "ir.ui.menu", "active_ids": [ref("sale_journal.menu_definition_journal_picking")], - "active_id": ref("sale_journal.menu_definition_journal_picking")}) -- - I verify that a state of journal has transit from draft to open state -- - !python {model: sale_journal.picking.journal}: | - pick_jour = self.browse(cr, uid, ref("sale_journal_picking_journal_pickjournal0")) - assert (pick_jour.state == 'open'), "Journal is not in the open state" -- - Then I click on the 'Confirm Picking' button -- - !python {model: sale_journal.picking.journal}: | - self.button_picking_confirm(cr, uid, [ref("sale_journal_picking_journal_pickjournal0")], {"lang": "en_US", "search_default_user_id": - 1, "tz": False, "active_model": "ir.ui.menu", "active_ids": [ref("sale_journal.menu_definition_journal_picking")], - "active_id": ref("sale_journal.menu_definition_journal_picking")}) -- - I verify that a state of journal has transit from open to confirm state -- - !python {model: sale_journal.picking.journal}: | - pick_jour = self.browse(cr, uid, ref("sale_journal_picking_journal_pickjournal0")) - assert (pick_jour.state == 'confirm'), "Journal is not in the open state" -- - I verify that an picking order is now in the confirm state -- - !python {model: stock.picking}: | - pick_jour_obj = self.pool.get('sale_journal.picking.journal') - jour = pick_jour_obj.browse(cr, uid, ref("sale_journal_picking_journal_pickjournal0")) - stock_pick = self.browse(cr, uid, ref("stock_picking_out0")) - pick_jour = self.search(cr, uid, [('journal_id','=',jour.name) and ('state','=','confirmed')]) - assert pick_jour, "Sale order is not in the confirm state" -- - Then I click on the 'Close Journal' button -- - !python {model: sale_journal.picking.journal}: | - self.button_close(cr, uid, [ref("sale_journal_picking_journal_pickjournal0")], {"lang": "en_US", "search_default_user_id": - 1, "tz": False, "active_model": "ir.ui.menu", "active_ids": [ref("sale_journal.menu_definition_journal_picking")], - "active_id": ref("sale_journal.menu_definition_journal_picking")}) -- - I verify that a state of journal has transit from confirm to close state -- - !python {model: sale_journal.picking.journal}: | - pick_jour = self.browse(cr, uid, ref("sale_journal_picking_journal_pickjournal0")) - assert (pick_jour.state == 'close'), "Journal is not in the open state" diff --git a/addons/sale_journal/test/sale_journal.yml b/addons/sale_journal/test/sale_journal.yml deleted file mode 100644 index 365e2640031..00000000000 --- a/addons/sale_journal/test/sale_journal.yml +++ /dev/null @@ -1,95 +0,0 @@ -- - In order to test the sale_journal module in OpenERP, - I create a sale journal and place a sale order related to a journal -- - I create a sale journal -- - !record {model: sale_journal.sale.journal, id: sale_journal_sale_journal_journal0}: - code: J1 - date: '2010-08-04' - date_created: '2010-08-04' - name: Journal_1 - state: draft - user_id: base.user_root -- - I place a sale order for product keyboard, quantity 100 -- - !record {model: sale.order, id: sale_order_so0}: - date_order: '2010-08-04' - invoice_quantity: order - invoice_type_id: sale_journal.daily - journal_id: sale_journal_sale_journal_journal0 - name: Test_SO012 - order_line: - - name: '[KEYA] Keyboard - AZERTY' - price_unit: 7.0 - product_uom: product.product_uom_unit - product_uom_qty: 100.0 - state: draft - delay: 7.0 - product_id: product.product_product_24 - product_uos_qty: 100.0 - th_weight: 0.0 - type: make_to_stock - order_policy: manual - partner_id: base.res_partner_4 - partner_invoice_id: base.res_partner_address_7 - partner_order_id: base.res_partner_address_7 - partner_shipping_id: base.res_partner_address_7 - picking_policy: direct - pricelist_id: product.list0 - shop_id: sale.shop -- - I verify that a Journal consist of sale order -- - !python {model: sale_journal.sale.journal}: | - sal_jour = self.browse(cr, uid, ref("sale_journal_sale_journal_journal0")) - assert sal_jour.sale_stats_ids, "Journal does not consist of a sale order details" -- - Then I click on the 'Open Journal' button -- - !python {model: sale_journal.sale.journal}: | - self.button_open(cr, uid, [ref("sale_journal_sale_journal_journal0")], {"lang": "en_US", "search_default_user_id": - 1, "tz": False, "active_model": "ir.ui.menu", "active_ids": [ref("sale_journal.menu_definition_journal")], - "active_id": ref("sale_journal.menu_definition_journal")}) -- - I verify that a state of journal has transit from draft to open state -- - !python {model: sale_journal.sale.journal}: | - sal_jour = self.browse(cr, uid, ref("sale_journal_sale_journal_journal0")) - assert (sal_jour.state == 'open'), "Journal is not in the open state" -- - Then I click on the 'Confirm Sales' button -- - !python {model: sale_journal.sale.journal}: | - self.button_sale_confirm(cr, uid, [ref("sale_journal_sale_journal_journal0")], {"lang": "en_US", "search_default_user_id": - 1, "tz": False, "active_model": "ir.ui.menu", "active_ids": [ref("sale_journal.menu_definition_journal")], - "active_id": ref("sale_journal.menu_definition_journal")}) -- - I verify that a state of journal has transit from open to confirm state -- - !python {model: sale_journal.sale.journal}: | - sal_jour = self.browse(cr, uid, ref("sale_journal_sale_journal_journal0")) - assert (sal_jour.state == 'confirm'), "Journal is not in the confirm state" -- - I verify that a sale order is now in the confirm state -- - !python {model: sale.order}: | - sale_jour_obj = self.pool.get('sale_journal.sale.journal') - jour = sale_jour_obj.browse(cr, uid, ref("sale_journal_sale_journal_journal0")) - so = self.browse(cr, uid, ref("sale_order_so0")) - so_jour = self.search(cr, uid, [('journal_id','=',jour.name) and ('state','=','manual')]) - assert so_jour, "Sale order is not in the confirm state" -- - Then I click on the 'Close Journal' button -- - !python {model: sale_journal.sale.journal}: | - self.button_close(cr, uid, [ref("sale_journal_sale_journal_journal0")], {"lang": "en_US", "search_default_user_id": - 1, "tz": False, "active_model": "ir.ui.menu", "active_ids": [ref("sale_journal.menu_definition_journal")], - "active_id": ref("sale_journal.menu_definition_journal")}) -- - I verify that a state of journal has transit from confirm to close state -- - !python {model: sale_journal.sale.journal}: | - sal_jour = self.browse(cr, uid, ref("sale_journal_sale_journal_journal0")) - assert (sal_jour.state == 'close'), "Journal is not in the close state" \ No newline at end of file diff --git a/addons/share/__init__.py b/addons/share/__init__.py index eff88be137d..9c0c7bf7da2 100644 --- a/addons/share/__init__.py +++ b/addons/share/__init__.py @@ -18,5 +18,6 @@ # along with this program. If not, see . # ############################################################################## -import share + +import res_users import wizard diff --git a/addons/share/__openerp__.py b/addons/share/__openerp__.py index 9dc2a6658d8..4f2eafb4e52 100644 --- a/addons/share/__openerp__.py +++ b/addons/share/__openerp__.py @@ -21,24 +21,34 @@ { - "name" : "Share Management", + "name" : "Sharing Tools", "version" : "1.1", "depends" : ["base"], "author" : "OpenERP SA", "category": 'Generic Modules', - "description": """The goal is to implement a generic sharing mechanism, where user of OpenERP -can share data from OpenERP to their colleagues, customers, or friends. -The system will work by creating new users and groups on the fly, and by -combining the appropriate access rights and ir.rules to ensure that the /shared -users/ will only have access to the correct data. + "description": """ + + This module adds generic sharing tools to your current OpenERP database, + and specifically a 'share' button that is available in the Web client to + share any kind of OpenERP data with colleagues, customers, friends, etc. + + The system will work by creating new users and groups on the fly, and by + combining the appropriate access rights and ir.rules to ensure that the + shared users only have access to the data that has been shared with them. + + This is extremely useful for collaborative work, knowledge sharing, + synchronization with other companies, etc. + """, 'website': 'http://www.openerp.com', - 'init_xml': [], - 'update_xml': [ + 'data': [ + 'security/share_security.xml', + 'security/ir.model.access.csv', 'share_view.xml', + 'res_users_view.xml', 'wizard/share_wizard_view.xml' - ], + ], 'installable': True, - 'active': False, } + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/share/share.py b/addons/share/res_users.py similarity index 74% rename from addons/share/share.py rename to addons/share/res_users.py index 6e3c4932a1e..81683066220 100644 --- a/addons/share/share.py +++ b/addons/share/res_users.py @@ -18,12 +18,14 @@ # along with this program. If not, see . # ############################################################################## -from osv import fields, osv, orm +from osv import fields, osv + class res_groups(osv.osv): _name = "res.groups" _inherit = 'res.groups' _columns = { - 'share': fields.boolean('Share') + 'share': fields.boolean('Share Group', groups='share.group_share', readonly=True, + help="Group created to set access rights for sharing data with some users.") } res_groups() @@ -31,6 +33,7 @@ class res_users(osv.osv): _name = 'res.users' _inherit = 'res.users' _columns = { - 'share': fields.boolean('Share') + 'share': fields.boolean('Share User', groups='share.group_share', readonly=True, + help="External user with limited access, created only for the purpose of sharing data.") } res_users() diff --git a/addons/share/res_users_view.xml b/addons/share/res_users_view.xml new file mode 100644 index 00000000000..09733e81a01 --- /dev/null +++ b/addons/share/res_users_view.xml @@ -0,0 +1,44 @@ + + + + + res.users.search.share + res.users + search + + + + + + + + + + + + {'search_default_no_share': 1} + + + + res.groups.search.share + res.groups + search + + + + + + + + + + + + + {'search_default_no_share': 1} + + + + \ No newline at end of file diff --git a/addons/share/security/ir.model.access.csv b/addons/share/security/ir.model.access.csv new file mode 100644 index 00000000000..a8f37d300c6 --- /dev/null +++ b/addons/share/security/ir.model.access.csv @@ -0,0 +1,2 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_share_wizard_user","access_share_wizard_user","model_share_wizard","share.group_share_user",1,1,1,1 \ No newline at end of file diff --git a/addons/share/security/share_security.xml b/addons/share/security/share_security.xml new file mode 100644 index 00000000000..0b2e8c4c1fd --- /dev/null +++ b/addons/share/security/share_security.xml @@ -0,0 +1,8 @@ + + + + + Sharing / User + + + diff --git a/addons/share/share_view.xml b/addons/share/share_view.xml index 24736b3d53a..863da6ea747 100644 --- a/addons/share/share_view.xml +++ b/addons/share/share_view.xml @@ -6,7 +6,7 @@ res.groups form - + @@ -17,7 +17,7 @@ res.users form - + diff --git a/addons/share/wizard/__init__.py b/addons/share/wizard/__init__.py index b906abf5e56..2034dfe2fc6 100644 --- a/addons/share/wizard/__init__.py +++ b/addons/share/wizard/__init__.py @@ -20,3 +20,4 @@ ############################################################################## import share_wizard + diff --git a/addons/share/wizard/share_wizard.py b/addons/share/wizard/share_wizard.py index add9c4f9352..2d1fd252ecf 100644 --- a/addons/share/wizard/share_wizard.py +++ b/addons/share/wizard/share_wizard.py @@ -18,480 +18,448 @@ # along with this program. If not, see . # ############################################################################## -from osv import osv, fields -from tools.translate import _ -import tools +import logging +import random +import time + +import tools +from osv import osv, fields +from osv.expression import expression +from tools.translate import _ +from tools.safe_eval import safe_eval + +FULL_ACCESS = ('perm_read', 'perm_write', 'perm_create', 'perm_unlink') +READ_ONLY_ACCESS = ('perm_read',) + + +RANDOM_PASS_CHARACTERS = [chr(x) for x in range(48, 58) + range(97, 123) + range(65, 91)] +RANDOM_PASS_CHARACTERS.remove('l') #lowercase l, easily mistaken as one or capital i +RANDOM_PASS_CHARACTERS.remove('I') #uppercase i, easily mistaken as one or lowercase L +RANDOM_PASS_CHARACTERS.remove('O') #uppercase o, mistaken with zero +RANDOM_PASS_CHARACTERS.remove('o') #lowercase o, mistaken with zero +RANDOM_PASS_CHARACTERS.remove('0') #zero, mistaken with o-letter +RANDOM_PASS_CHARACTERS.remove('1') #one, mistaken with lowercase-L or capital i +def generate_random_pass(): + pass_chars = RANDOM_PASS_CHARACTERS[:] + random.shuffle(pass_chars) + return ''.join(pass_chars[0:10]) -def _generate_random_number(): - import random - RANDOM_PASS_CHARACTERS = [chr(x) for x in range(48,58) + range(97,123) + range(65,91)] - RANDOM_PASS_CHARACTERS.remove('l') #lowercase l, easily mistaken as one or capital i - RANDOM_PASS_CHARACTERS.remove('I') #uppercase i, easily mistaken as one or lowercase l - RANDOM_PASS_CHARACTERS.remove('O') #uppercase o, mistaken with zero - RANDOM_PASS_CHARACTERS.remove('o') #lowercase o, mistaken with zero - RANDOM_PASS_CHARACTERS.remove('0') #zero, mistaken with o-letter - def generate_random_pass(): - pass_chars = RANDOM_PASS_CHARACTERS[:] - random.shuffle(pass_chars) - return ''.join(pass_chars[0:10]) - return generate_random_pass() class share_create(osv.osv_memory): - _name = 'share.create' - _description = 'Create share' - - def _access(self, cr, uid, ids, field_name, arg, context=None): - if context is None: - context = {} - res = {} - action_id = context.get('action_id', False) - access_obj = self.pool.get('ir.model.access') - action_obj = self.pool.get('ir.actions.act_window') - model_obj = self.pool.get('ir.model') - user_obj = self.pool.get('res.users') - current_user = user_obj.browse(cr, uid, uid) - access_ids = [] - if action_id: - action = action_obj.browse(cr, uid, action_id, context=context) - active_model_ids = model_obj.search(cr, uid, [('model','=',action.res_model)]) - active_model_id = active_model_ids and active_model_ids[0] or False - access_ids = access_obj.search(cr, uid, [ - ('group_id','in',map(lambda x:x.id, current_user.groups_id)), - ('model_id','',active_model_id)]) - for rec_id in ids: - write_access = False - read_access = False - for access in access_obj.browse(cr, uid, access_ids, context=context): - if access.perm_write: - write_access = True - if access.perm_read: - read_access = True - res[rec_id]['write_access'] = write_access - res[rec_id]['read_access'] = read_access - return res + __logger = logging.getLogger('share.wizard') + _name = 'share.wizard' + _description = 'Share Wizard' _columns = { - 'action_id': fields.many2one('ir.actions.act_window', 'Action', required=True), - 'domain': fields.char('Domain', size=64), - 'user_type': fields.selection( [ ('existing','Existing'),('new','New')],'User Type'), - 'user_ids': fields.many2many('res.users', 'share_user_rel', 'share_id','user_id', 'Share Users'), - 'new_user': fields.text("New user"), - 'access_mode': fields.selection([('readwrite','READ & WRITE'),('readonly','READ ONLY')],'Access Mode'), - 'write_access': fields.function(_access, method=True, string='Write Access',type='boolean', multi='write_access'), - 'read_access': fields.function(_access, method=True, string='Write Access',type='boolean', multi='read_access'), + 'action_id': fields.many2one('ir.actions.act_window', 'Action to share', required=True, + help="The action that opens the screen containing the data you wish to share."), + 'domain': fields.char('Domain', size=256, help="Optional domain for further data filtering"), + 'user_type': fields.selection([('existing','Existing external users'),('new','New users (emails required)')],'Users to share with', + help="Select the type of user(s) you would like to share data with."), + 'user_ids': fields.one2many('share.wizard.user', 'share_wizard_id', 'Users'), + 'new_users': fields.text("New users"), + 'access_mode': fields.selection([('readwrite','Read & Write'),('readonly','Read-only')],'Access Mode'), + 'result_line_ids': fields.one2many('share.wizard.result.line', 'share_wizard_id', 'Summary'), + 'share_root_url': fields.char('Generic Share Access URL', size=512, tooltip='Main access page for users that are granted shared access') } _defaults = { - 'user_type' : 'existing', - 'domain': '[]', + 'user_type' : lambda self, cr, uid, *a: 'existing' if self.pool.get('res.users').search(cr, uid, [('share', '=', True)]) else 'new', + 'domain': lambda self, cr, uid, context, *a: context.get('domain', '[]'), + 'share_root_url': lambda self, cr, uid, context, *a: context.get('share_root_url', + _('Please specify "share_root_url" in server configuration or in context')), + 'action_id': lambda self, cr, uid, context, *a: context.get('action_id'), 'access_mode': 'readonly' - } - def default_get(self, cr, uid, fields, context=None): - """ - To get default values for the object. - """ - - res = super(share_create, self).default_get(cr, uid, fields, context=context) - if not context: - context={} - action_id = context.get('action_id', False) - domain = context.get('domain', '[]') - - - if 'action_id' in fields: - res['action_id'] = action_id - if 'domain' in fields: - res['domain'] = domain - return res - - def do_step_1(self, cr, uid, ids, context=None): - """ - This action to excute step 1 - - """ - if not context: - context = {} - - data_obj = self.pool.get('ir.model.data') - - step1_form_view = data_obj._get_id(cr, uid, 'share', 'share_step1_form') - - if step1_form_view: - step1_form_view_id = data_obj.browse(cr, uid, step1_form_view, context=context).res_id - - step1_id = False - for this in self.browse(cr, uid, ids, context=context): - vals ={ - 'domain': this.domain, - 'action_id': this.action_id and this.action_id.id or False, - } - step1_id = this.id - - context.update(vals) - value = { - 'name': _('Step:2 Sharing Wizard'), + def go_step_1(self, cr, uid, ids, context=None): + dummy, step1_form_view_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'share', 'share_step1_form') + return { + 'name': _('Sharing Wizard - Step 1'), 'view_type': 'form', 'view_mode': 'form', - 'res_model': 'share.create', + 'res_model': 'share.wizard', 'view_id': False, - 'res_id': step1_id, + 'res_id': ids[0], 'views': [(step1_form_view_id, 'form'), (False, 'tree'), (False, 'calendar'), (False, 'graph')], 'type': 'ir.actions.act_window', - 'context': context, 'target': 'new' } - return value - - - def do_step_2(self, cr, uid, ids, context=None): - """ - This action to excute step 2 - - """ - if not context: - context = {} - - data_obj = self.pool.get('ir.model.data') - - step2_form_view = data_obj._get_id(cr, uid, 'share', 'share_step2_form') - - if step2_form_view: - step2_form_view_id = data_obj.browse(cr, uid, step2_form_view, context=context).res_id - - step1_id = False - for this in self.browse(cr, uid, ids, context=context): - vals = { - 'user_type': this.user_type, - 'existing_user_ids': map(lambda x:x.id, this.user_ids), - 'new_user': this.new_user, - } - - context.update(vals) - value = { - 'name': _('Step:3 Sharing Wizard'), - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'share.create', - 'view_id': False, - 'views': [(step2_form_view_id, 'form'), (False, 'tree'), (False, 'calendar'), (False, 'graph')], - 'type': 'ir.actions.act_window', - 'context': context, - 'target': 'new' - } - return value - - - def do_step_3(self, cr, uid, ids, context=None): - """ - This action to excute step 3 - - """ - if not context: - context = {} - - for this in self.browse(cr, uid, ids, context=context): - vals = { - 'access_mode': this.access_mode, - } - - context.update(vals) + def _create_share_group(self, cr, uid, wizard_data, context=None): group_obj = self.pool.get('res.groups') + share_group_name = '%s: %s (%d-%s)' %('Sharing', wizard_data.action_id.res_model, uid, time.time()) + # create share group without putting admin in it + return group_obj.create(cr, 1, {'name': share_group_name, 'share': True}, {'noadmin': True}) + + def _create_new_share_users(self, cr, uid, wizard_data, group_id, context=None): user_obj = self.pool.get('res.users') - fields_obj = self.pool.get('ir.model.fields') - model_access_obj = self.pool.get('ir.model.access') - model_obj = self.pool.get('ir.model') - rule_obj = self.pool.get('ir.rule') - action_obj = self.pool.get('ir.actions.act_window') - - new_users = context.get('new_user', False) - action_id = context.get('action_id', False) - user_type = context.get('user_type', False) - access_mode = context.get('access_mode', False) - action = action_obj.browse(cr, uid, action_id, context=context) - active_model = action.res_model - - active_id = False #TODO: Pass record id of res_model of action - existing_user_ids = context.get('existing_user_ids', False) - domain = eval(context.get('domain', '[]')) - - # Create Share Group - share_group_name = '%s: %s' %('Sharing', active_model) - group_ids = group_obj.search(cr, uid, [('name','=',share_group_name)]) - group_id = group_ids and group_ids[0] or False - if not group_id: - group_id = group_obj.create(cr, uid, {'name': share_group_name, 'share': True}) - else: - group = group_obj.browse(cr, uid, group_id, context=context) - if not group.share: - raise osv.except_osv(_('Error'), _("Share Group is exits without sharing !")) - - # Create new user - current_user = user_obj.browse(cr, uid, uid) user_ids = [] - if user_type == 'new' and new_users: - for new_user in new_users.split('\n'): - password = _generate_random_number() - user_id = user_obj.create(cr, uid, { + if wizard_data.user_type == 'new': + for new_user in wizard_data.new_users.split('\n'): + # attempt to show more user-friendly msg than default constraint error + existing = user_obj.search(cr, 1, [('login', '=', new_user)]) + if existing: + raise osv.except_osv(_('User already exists'), + _('This username (%s) already exists, perhaps data has already been shared with this person.\nYou may want to try selecting existing shared users instead.')) + user_id = user_obj.create(cr, 1, { 'login': new_user, - 'password': password, + 'password': generate_random_pass(), 'name': new_user, 'user_email': new_user, 'groups_id': [(6,0,[group_id])], - 'action_id': action_id, 'share': True, 'company_id': current_user.company_id and current_user.company_id.id }) user_ids.append(user_id) - context['new_user_ids'] = user_ids + return user_ids - # Modify existing user - if user_type == 'existing': - user_obj.write(cr, uid, existing_user_ids , { - 'groups_id': [(4,group_id)], - 'action_id': action_id - }) + def _setup_action_and_shortcut(self, cr, uid, wizard_data, user_ids, new_users, context=None): + menu_obj = self.pool.get('ir.ui.menu') + user_obj = self.pool.get('res.users') + menu_action_id = user_obj._get_menu(cr, uid, context=context) + values = { + 'name': (_('%s (Shared)') % wizard_data.action_id.name)[:64], + 'domain': wizard_data.domain, + 'context': wizard_data.action_id.context, + 'res_model': wizard_data.action_id.res_model, + 'view_mode': wizard_data.action_id.view_mode, + 'view_type': wizard_data.action_id.view_type, + 'search_view_id': wizard_data.action_id.search_view_id.id, + } + for user_id in user_ids: + action_id = menu_obj.create_shortcut(cr, user_id, values) + if new_users: + user_obj.write(cr, 1, [user_id], {'action_id': action_id}) + else: + user_obj.write(cr, 1, [user_id], {'action_id': menu_action_id}) + def _get_recursive_relations(self, cr, uid, model, ttypes, relation_fields=None, suffix=None, context=None): + """Returns list of tuples representing recursive relationships of type ``ttypes`` starting from + model with ID ``model_id``. - #ACCESS RIGHTS / IR.RULES COMPUTATION + @param model: browsable model to start loading relationships from + @param ttypes: list of relationship types to follow (e.g: ['one2many','many2many']) + @param relation_fields: list of previously followed relationship tuples - to avoid duplicates + during recursion + @param suffix: optional suffix to append to the field path to reach the main object + """ + if relation_fields is None: + relation_fields = [] + local_rel_fields = [] + models = [x[1].model for x in relation_fields] + model_obj = self.pool.get('ir.model') + model_osv = self.pool.get(model.model) + for field in model_osv._columns.values() + [x[2] for x in model_osv._inherit_fields]: + if field._type in ttypes and field._obj not in models: + relation_model_id = model_obj.search(cr, uid, [('model','=',field._obj)])[0] + if field._type == 'one2many': + relation_field = '%s.%s'%(field._fields_id, suffix) if suffix else field._fields_id + else: + relation_field = None # TODO: add some filtering for m2m and m2o - not always possible... + model_browse = model_obj.browse(cr, uid, relation_model_id, context=context) + local_rel_fields.append((relation_field, model_browse)) + if relation_model_id != model.id and field._type in ['one2many', 'many2many']: + local_rel_fields += self._get_recursive_relations(cr, uid, model_browse, + [field._type], local_rel_fields, suffix=relation_field, context=context) + return local_rel_fields - active_model_ids = model_obj.search(cr, uid, [('model','=',active_model)]) - active_model_id = active_model_ids and active_model_ids[0] or False + def _get_relationship_classes(self, cr, uid, model, context=None): + obj0 = [(None, model)] + obj1 = self._get_recursive_relations(cr, uid, model, ['one2many'], context=context) + obj2 = self._get_recursive_relations(cr, uid, model, ['one2many', 'many2many'], + context=context) + obj3 = self._get_recursive_relations(cr, uid, model, ['many2one'], context=context) + for dummy, model in obj1: + obj3 += self._get_recursive_relations(cr, uid, model, ['many2one'], context=context) + return obj0, obj1, obj2, obj3 - def _get_relation(model_id, ttypes, new_obj=[]): - obj = [] - models = map(lambda x:x[1].model, new_obj) - field_ids = fields_obj.search(cr, uid, [('model_id','=',model_id),('ttype','in', ttypes)]) - for field in fields_obj.browse(cr, uid, field_ids, context=context): - if field.relation not in models: - relation_model_ids = model_obj.search(cr, uid, [('model','=',field.relation)]) - relation_model_id = relation_model_ids and relation_model_ids[0] or False - relation_model = model_obj.browse(cr, uid, relation_model_id, context=context) - obj.append((field.relation_field, relation_model)) - - if relation_model_id != model_id and field.ttype in ['one2many', 'many2many']: - obj += _get_relation(relation_model_id, [field.ttype], obj) - - return obj - - active_model = model_obj.browse(cr, uid, active_model_id, context=context) - obj0 = [(None, active_model)] - obj1 = _get_relation(active_model_id, ['one2many']) - obj2 = _get_relation(active_model_id, ['one2many', 'many2many']) - obj3 = _get_relation(active_model_id, ['many2one']) - for rel_field, model in obj1: - obj3 += _get_relation(model.id, ['many2one']) + def _get_access_map_for_groups_and_models(self, cr, uid, group_ids, model_ids, context=None): + model_access_obj = self.pool.get('ir.model.access') + user_right_ids = model_access_obj.search(cr, uid, + [('group_id', 'in', group_ids), ('model_id', 'in', model_ids)], + context=context) + user_access_matrix = {} + if user_right_ids: + for access_right in model_access_obj.browse(cr, uid, user_right_ids, context=context): + access_line = user_access_matrix.setdefault(access_right.model_id.model, set()) + for perm in FULL_ACCESS: + if getattr(access_right, perm, 0): + access_line.add(perm) + return user_access_matrix + def _add_access_rights_for_share_group(self, cr, uid, group_id, mode, + fields_relations, context=None): + """Adds access rights to group_id on object models referenced in ``fields_relations``, + intersecting with access rights of current user to avoid granting too much rights + """ + model_access_obj = self.pool.get('ir.model.access') + user_obj = self.pool.get('res.users') + target_model_ids = [x[1].id for x in fields_relations] + perms_to_add = (mode == 'readonly') and READ_ONLY_ACCESS or FULL_ACCESS current_user = user_obj.browse(cr, uid, uid, context=context) - if access_mode == 'readonly': - res = [] - # intersect with read access rights of user running the - # wizard, to avoid adding more access than current - for group in current_user.groups_id: - for access_control in group.model_access: - if access_control.model_id.id in res: - continue - if access_control.perm_read: - res.append(access_control.model_id.id) - model_access_obj.create(cr, uid, { - 'name': 'Read Access of group %s on %s model'%(share_group_name, access_control.model_id.name), - 'model_id' : access_control.model_id.id, - 'group_id' : group_id, - 'perm_read' : True - }) - res = [] - for rel_field, model in obj0+obj1+obj2+obj3: - if model.id in res: - continue - res.append(model.id) - model_access_obj.create(cr, uid, { - 'name': 'Read Access of group %s on %s model'%(share_group_name, model.name), - 'model_id' : model.id, - 'group_id' : group_id, - 'perm_read' : True - }) - if access_mode == 'readwrite': - res = [] - for rel_field, model in obj0+obj1: - if model.id in res: - continue - res.append(model.id) - model_access_obj.create(cr, uid, { - 'name': 'Write Access of group %s on %s model'%(share_group_name, model.name), - 'model_id' : model.id, - 'group_id' : group_id, - 'perm_read' : True, - 'perm_write' : True, - 'perm_unlink' : True, - 'perm_create' : True, - }) - # intersect with access rights of user - # running the wizard, to avoid adding more access than current - for group in current_user.groups_id: - for access_control in group.model_access: - if access_control.model_id.id in res: - continue - if access_control.perm_read: - res.append(access_control.model_id.id) - model_access_obj.create(cr, uid, { - 'name': 'Read Access of group %s on %s model'%(share_group_name, access_control.model_id.name), - 'model_id' : access_control.model_id.id, - 'group_id' : group_id, - 'perm_read' : True - }) - for rel_field, model in obj2+obj3: - if model.id in res: - continue - res.append(model.id) - model_access_obj.create(cr, uid, { - 'name': 'Read Access of group %s on %s model'%(share_group_name, model.name), - 'model_id' : model.id, - 'group_id' : group_id, - 'perm_read' : True - }) - # - # And on OBJ0, OBJ1, OBJ2, OBJ3: add all rules from groups of the user - # that is sharing in the many2many of the rules on the new group - # (rule must be copied instead of adding it if it contains a reference to uid - # or user.xxx so it can be replaced correctly) + current_user_access_map = self._get_access_map_for_groups_and_models(cr, uid, + [x.id for x in current_user.groups_id], target_model_ids, context=context) + group_access_map = self._get_access_map_for_groups_and_models(cr, uid, + [group_id], target_model_ids, context=context) + self.__logger.debug("Current user access matrix: %r", current_user_access_map) + self.__logger.debug("New group current access matrix: %r", group_access_map) + # Create required rights if allowed by current user rights and not + # already granted + for dummy, model in fields_relations: + values = { + 'name': _('Copied access for sharing'), + 'group_id': group_id, + 'model_id': model.id, + } + current_user_access_line = current_user_access_map.get(model.model,set()) + existing_group_access_line = group_access_map.get(model.model,set()) + need_creation = False + for perm in perms_to_add: + if perm in current_user_access_line \ + and perm not in existing_group_access_line: + values.update({perm:True}) + group_access_map.setdefault(model.model, set()).add(perm) + need_creation = True + if need_creation: + model_access_obj.create(cr, 1, values) + self.__logger.debug("Creating access right for model %s with values: %r", model.model, values) + + def _link_or_copy_current_user_rules(self, cr, uid, group_id, fields_relations, context=None): + user_obj = self.pool.get('res.users') + rule_obj = self.pool.get('ir.rule') + current_user = user_obj.browse(cr, uid, uid, context=context) + completed_models = set() for group in current_user.groups_id: - res = [] - for rel_field, model in obj0+obj1+obj2+obj3: - if model.id in res: + for dummy, model in fields_relations: + if model.id in completed_models: continue - res.append(model.id) + completed_models.add(model.id) for rule in group.rule_groups: if rule.model_id == model.id: - rule_obj.copy(cr, uid, rule.id, default={ - 'name': '%s-%s'%(share_group_name, model.model), - 'groups': [(6,0,[group_id])] - }, context=context) + if 'user.' in rule.domain_force: + # Above pattern means there is likely a condition + # specific to current user, so we must copy the rule using + # the evaluated version of the domain. + # And it's better to copy one time too much than too few + rule_obj.copy(cr, 1, rule.id, default={ + 'name': '%s (%s)' %(rule.name, _('(Copy for sharing)')), + 'groups': [(6,0,[group_id])], + 'domain_force': rule.domain, # evaluated version! + }) + self.__logger.debug("Copying rule %s (%s) on model %s with domain: %s", rule.name, rule.id, model.model, rule.domain_force) + else: + # otherwise we can simply link the rule to keep it dynamic + rule_obj.write(cr, 1, [rule.id], { + 'groups': [(4,group_id)] + }) + self.__logger.debug("Linking rule %s (%s) on model %s with domain: %s", rule.name, rule.id, model.model, rule.domain_force) - rule_obj.create(cr, uid, { - 'name': '%s-%s'%(share_group_name, active_model.model), - 'model_id': active_model.id, - 'domain_force': domain, - 'groups': [(6,0,[group_id])] + def _create_indirect_sharing_rules(self, cr, uid, wizard_data, group_id, fields_relations, context=None): + user_obj = self.pool.get('res.users') + current_user = user_obj.browse(cr, uid, uid, context=context) + rule_obj = self.pool.get('ir.rule') + try: + domain = safe_eval(wizard_data.domain) + if domain: + domain_expr = expression(domain) + for rel_field, model in fields_relations: + related_domain = [] + for element in domain: + if domain_expr._is_leaf(element): + left, operator, right = element + left = '%s.%s'%(rel_field, left) + element = left, operator, right + related_domain.append(element) + rule_obj.create(cr, 1, { + 'name': _('Indirect sharing filter created by user %s (%s) for group %s') % \ + (current_user.name, current_user.login, group_id), + 'model_id': model.id, + 'domain_force': str(related_domain), + 'groups': [(4,group_id)] + }) + self.__logger.debug("Created indirect rule on model %s with domain: %s", model.model, repr(related_domain)) + except Exception: + self.__logger.exception('Failed to create share access') + raise osv.except_osv(_('Sharing access could not be setup'), + _('Sorry, the current screen and filter you are trying to share are not supported at the moment.\nYou may want to try a simpler filter.')) + + def _create_result_lines(self, cr, uid, wizard_data, context=None): + user_obj = self.pool.get('res.users') + result_obj = self.pool.get('share.wizard.result.line') + share_root_url = wizard_data.share_root_url + format_url = '%(login)' in share_root_url and '%(password)' in share_root_url + existing_passwd_str = _('*usual password*') + if wizard_data.user_type == 'new': + for email in wizard_data.new_users.split('\n'): + user_id = user_obj.search(cr, 1, [('login', '=', email)], context=context) + password = user_obj.read(cr, 1, user_id[0], ['password'])['password'] + share_url = share_root_url % \ + {'login': email, + 'password': password} if format_url else share_root_url + result_obj.create(cr, uid, { + 'share_wizard_id': wizard_data.id, + 'login': email, + 'password': password, + 'share_url': share_url, + }, context=context) + else: + # existing users + for user in wizard_data.user_ids: + share_url = share_root_url % \ + {'login': email, + 'password': ''} if format_url else share_root_url + result_obj.create(cr, uid, { + 'share_wizard_id': wizard_data.id, + 'login': user.user_id.login, + 'password': existing_passwd_str, + 'share_url': share_url, + 'newly_created': False, + }, context=context) + + def go_step_2(self, cr, uid, ids, context=None): + wizard_data = self.browse(cr, uid, ids and ids[0], context=context) + assert wizard_data.action_id and wizard_data.access_mode and \ + ((wizard_data.user_type == 'new' and wizard_data.new_users) or \ + (wizard_data.user_type == 'existing' and wizard_data.user_ids)) + + # Create shared group and users + group_id = self._create_share_group(cr, uid, wizard_data, context=context) + user_obj = self.pool.get('res.users') + current_user = user_obj.browse(cr, uid, uid, context=context) + if wizard_data.user_type == 'new': + user_ids = self._create_new_share_users(cr, uid, wizard_data, group_id, context=context) + else: + user_ids = [x.user_id.id for x in wizard_data.user_ids] + # reset home action to regular menu as user needs access to multiple items + user_obj.write(cr, 1, user_ids, { + 'groups_id': [(4,group_id)], + }) + self._setup_action_and_shortcut(cr, uid, wizard_data, user_ids, + (wizard_data.user_type == 'new'), context=context) + + + model_obj = self.pool.get('ir.model') + model_id = model_obj.search(cr, uid, [('model','=', wizard_data.action_id.res_model)])[0] + model = model_obj.browse(cr, uid, model_id, context=context) + + # ACCESS RIGHTS + # We have several classes of objects that should receive different access rights: + # Let: + # - [obj0] be the target model itself + # - [obj1] be the target model and all other models recursively accessible from + # obj0 via one2many relationships + # - [obj2] be the target model and all other models recursively accessible from + # obj0 via one2many and many2many relationships + # - [obj3] be all models recursively accessible from obj1 via many2one relationships + obj0, obj1, obj2, obj3 = self._get_relationship_classes(cr, uid, model, context=context) + mode = wizard_data.access_mode + + # Add access to [obj0] and [obj1] according to chosen mode + self._add_access_rights_for_share_group(cr, uid, group_id, mode, obj0, context=context) + self._add_access_rights_for_share_group(cr, uid, group_id, mode, obj1, context=context) + + # Add read-only access (always) to [obj2] and [obj3] + self._add_access_rights_for_share_group(cr, uid, group_id, 'readonly', obj2, context=context) + self._add_access_rights_for_share_group(cr, uid, group_id, 'readonly', obj3, context=context) + + + # IR.RULES + # A. On [obj0]: 1 rule with domain of shared action + # B. For each model in [obj1]: 1 rule in the form: + # many2one_rel.domain_of_obj0 + # where many2one_rel is the many2one used in the definition of the + # one2many, and domain_of_obj0 is the sharing domain + # For example if [obj0] is project.project with a domain of + # ['id', 'in', [1,2]] + # then we will have project.task in [obj1] and we need to create this + # ir.rule on project.task: + # ['project_id.id', 'in', [1,2]] + # C. And on [obj0], [obj1], [obj2], [obj3]: add all rules from all groups of + # the user that is sharing + # (Warning: rules must be copied instead of linked if they contain a reference + # to uid, and it must be replaced correctly) + rule_obj = self.pool.get('ir.rule') + # A. + rule_obj.create(cr, 1, { + 'name': _('Sharing filter created by user %s (%s) for group %s') % \ + (current_user.name, current_user.login, group_id), + 'model_id': model.id, + 'domain_force': wizard_data.domain, + 'groups': [(4,group_id)] }) - for rel_field, model in obj1: - obj1_domain = [] - for opr1, opt, opr2 in domain: - new_opr1 = '%s.%s'%(rel_field, opr1) - obj1_domain.append((new_opr1, opt, opr2)) + # B. + self._create_indirect_sharing_rules(cr, uid, wizard_data, group_id, obj1, context=context) + # C. + all_relations = obj0 + obj1 + obj2 + obj3 + self._link_or_copy_current_user_rules(cr, uid, group_id, all_relations, context=context) - rule_obj.create(cr, uid, { - 'name': '%s-%s'%(share_group_name, model.model), - 'model_id': model.id, - 'domain_force': obj1_domain, - 'groups': [(6,0,[group_id])] - }) - context['share_model'] = active_model.model - context['share_rec_id'] = active_id + # so far, so good -> populate summary results and return them + self._create_result_lines(cr, uid, wizard_data, context=context) - - data_obj = self.pool.get('ir.model.data') - - form_view = data_obj._get_id(cr, uid, 'share', 'share_result_form') - form_view_id = False - if form_view: - form_view_id = data_obj.browse(cr, uid, form_view, context=context).res_id - - - value = { - 'name': _('Step:4 Share Users Detail'), + dummy, step2_form_view_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'share', 'share_step2_form') + return { + 'name': _('Sharing Wizard - Step 2'), 'view_type': 'form', 'view_mode': 'form', - 'res_model': 'share.result', + 'res_model': 'share.wizard', 'view_id': False, - 'views': [(form_view_id, 'form'), (False, 'tree'), (False, 'calendar'), (False, 'graph')], + 'res_id': ids[0], + 'views': [(step2_form_view_id, 'form'), (False, 'tree'), (False, 'calendar'), (False, 'graph')], 'type': 'ir.actions.act_window', - 'context': context, 'target': 'new' } - return value + + def send_emails(self, cr, uid, ids, context=None): + user = self.pool.get('res.users').browse(cr, uid, uid, context=context) + if not user.user_email: + raise osv.except_osv(_('Email required'), _('The current user must have an email address configured in User Preferences to be able to send outgoing emails.')) + for wizard_data in self.browse(cr, uid, ids, context=context): + for result_line in wizard_data.result_line_ids: + email_to = result_line.login + subject = _('%s has shared OpenERP %s information with you') % (user.name, wizard_data.action_id.name) + body = _("Dear,\n\n") + subject + "\n\n" + body += _("To access it, you can go to the following URL:\n %s") % wizard_data.share_root_url + body += "\n\n" + if result_line.newly_created: + body += _("You may use the following login and password to get access to this protected area:") + "\n" + body += "%s: %s" % (_("Username"), result_line.login) + "\n" + body += "%s: %s" % (_("Password"), result_line.password) + "\n" + else: + body += _("This additional data has been automatically added to your current access.\n") + body += _("You may use your existing login and password to view it. As a reminder, your login is %s.\n") % result_line.login + + if not tools.email_send( + user.user_email, + email_to, + subject, + body): + self.__logger.warning('Failed to send sharing email from %s to %s', user.user_email, email_to) + return {'type': 'ir.actions.act_window_close'} share_create() - -class share_result(osv.osv_memory): - _name = "share.result" +class share_user_ref(osv.osv_memory): + _name = 'share.wizard.user' + _rec_name = 'user_id' _columns = { - 'users': fields.text("Users", readonly=True), - } + 'user_id': fields.many2one('res.users', 'Users', required=True, domain=[('share', '=', True)]), + 'share_wizard_id': fields.many2one('share.wizard', 'Share Wizard', required=True), + } +share_user_ref() - - - def do_send_email(self, cr, uid, ids, context=None): - user_obj = self.pool.get('res.users') - if not context: - context={} - existing_user_ids = context.get('existing_user_ids', []) - new_user_ids = context.get('new_user_ids', []) - share_url = tools.config.get('share_root_url', False) - user = user_obj.browse(cr, uid, uid, context=context) - for share_user in user_obj.browse(cr, uid, new_user_ids+existing_user_ids, context=context): - email_to = share_user.user_email - subject = '%s wants to share private data with you' %(user.name) - body = """ - Dear, - - %s wants to share private data from OpenERP with you! - """%(user.name) - if share_url: - body += """ - To view it, you can access the following URL: - %s - """%(user.name, share_url) - if share_user.id in new_user_ids: - body += """ - You may use the following login and password to get access to this - protected area: - login: %s - password: %s - """%(user.login, user.password) - elif share_user.id in existing_user_ids: - body += """ - You may use your existing login and password to get access to this - additional data. As a reminder, your login is %s. - """%(user.name) - - flag = tools.email_send( - user.user_email, - email_to, - subject, - body - ) - return flag - - - def default_get(self, cr, uid, fields, context=None): - """ - To get default values for the object. - """ - - res = super(share_result, self).default_get(cr, uid, fields, context=context) - user_obj = self.pool.get('res.users') - if not context: - context={} - existing_user_ids = context.get('existing_user_ids', []) - new_user_ids = context.get('new_user_ids', []) - share_url = tools.config.get('share_root_url', False) - if 'users' in fields: - users = [] - for user in user_obj.browse(cr, uid, new_user_ids): - txt = 'Login: %s Password: %s' %(user.login, user.password) - if share_url: - txt += ' Share URL: %s' %(share_url) - users.append(txt) - for user in user_obj.browse(cr, uid, existing_user_ids): - txt = 'Login: %s' %(user.login) - if share_url: - txt += ' Share URL: %s' %(share_url) - users.append(txt) - res['users'] = '\n'.join(users) - return res - -share_result() +class share_result_line(osv.osv_memory): + _name = 'share.wizard.result.line' + _rec_name = 'login' + _columns = { + 'login': fields.char('Username', size=64, required=True, readonly=True), + 'password': fields.char('Password', size=64, readonly=True), + 'share_url': fields.char('Share URL', size=512, required=True), + 'share_wizard_id': fields.many2one('share.wizard', 'Share Wizard', required=True), + 'newly_created': fields.boolean('Newly created', readonly=True), + } + _defaults = { + 'newly_created': True, + } +share_result_line() diff --git a/addons/share/wizard/share_wizard_view.xml b/addons/share/wizard/share_wizard_view.xml index 159583eecbb..e6cade91c84 100644 --- a/addons/share/wizard/share_wizard_view.xml +++ b/addons/share/wizard/share_wizard_view.xml @@ -1,106 +1,125 @@ - + - + share.step0.form - share.create + share.wizard form - - - - - - - - - - + + + + + + + + + + + share.step1.form - share.create + share.wizard form - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + share.step2.form - share.create + share.wizard form - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - Share Access Rules + + + Share Wizard ir.actions.act_window - share.create + share.wizard form form - + new - - - - - - - share.result.form - share.result - form - - - - - - - - - - - - - + + + Share Wizard + ir.actions.act_window + share.wizard + form + form + + new + - + + - + diff --git a/addons/stock/board_warehouse_view.xml b/addons/stock/board_warehouse_view.xml index ac8acb2922f..fd68f0a2eb5 100644 --- a/addons/stock/board_warehouse_view.xml +++ b/addons/stock/board_warehouse_view.xml @@ -6,7 +6,7 @@ - + Incoming Product stock.move ir.actions.act_window @@ -16,33 +16,33 @@ - + Outgoing Product stock.move ir.actions.act_window form tree,form ['|','&',('picking_id','=',False),('location_dest_id.usage', 'in', ['customer','supplier']),'&',('picking_id','!=',False),('picking_id.type','=','out')] - + - - report.stock.move - form - graph,tree - [('type','=','in')] - - {'search_default_month-1':1,'search_default_in':1,'group_by':['day'], 'group_by_no_leaf':1} + + report.stock.move + form + graph,tree + [('type','=','in')] + + {'search_default_month-1':1,'search_default_in':1,'group_by':['day'], 'group_by_no_leaf':1} - - report.stock.move - form - graph,tree - [('type','=','out')] - - {'search_default_month-1':1,'search_default_out':1,'group_by':['day'], 'group_by_no_leaf':1} + + report.stock.move + form + graph,tree + [('type','=','out')] + + {'search_default_month-1':1,'search_default_out':1,'group_by':['day'], 'group_by_no_leaf':1} - + board.warehouse.form board.board form @@ -50,8 +50,8 @@ - - + + @@ -71,9 +71,9 @@ - + - + diff --git a/addons/stock/i18n/mn.po b/addons/stock/i18n/mn.po index ab28ad3cc9a..33e60ea3573 100644 --- a/addons/stock/i18n/mn.po +++ b/addons/stock/i18n/mn.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 13:27+0000\n" -"Last-Translator: sugi \n" +"PO-Revision-Date: 2010-10-15 08:16+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Mongolian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: stock diff --git a/addons/stock/product.py b/addons/stock/product.py index e1d4c71b46c..ddb582f4a3c 100644 --- a/addons/stock/product.py +++ b/addons/stock/product.py @@ -188,6 +188,7 @@ class product_product(osv.osv): if not ids: return res + # TODO: write in more ORM way, less queries, more pg84 magic if context.get('shop', False): cr.execute('select warehouse_id from sale_shop where id=%s', (int(context['shop']),)) res2 = cr.fetchone() @@ -246,6 +247,7 @@ class product_product(osv.osv): date_values = [to_date] + # TODO: perhaps merge in one query. if date_values: where.append(tuple(date_values)) if 'in' in what: diff --git a/addons/stock/product_view.xml b/addons/stock/product_view.xml index 60fab009d0e..35715a9e1fb 100644 --- a/addons/stock/product_view.xml +++ b/addons/stock/product_view.xml @@ -60,9 +60,11 @@ - - - + + + + diff --git a/addons/stock/report/report_stock_move_view.xml b/addons/stock/report/report_stock_move_view.xml index 34e6e53dbdf..507f475a13e 100644 --- a/addons/stock/report/report_stock_move_view.xml +++ b/addons/stock/report/report_stock_move_view.xml @@ -143,6 +143,7 @@ tree,graph {'full':'1','contact_display': 'partner','search_default_done':1, 'search_default_month':1, 'search_default_group_type':1, 'group_by': [], 'group_by_no_leaf':1,} + Moves Analysis allows you to easily check and analyse your company stock moves. Use this report when you want to analyse the different routes taken by your products and inventory management performance. @@ -240,8 +241,9 @@ tree,graph {'contact_display': 'partner', 'search_default_real':1, 'search_default_location_type_internal':1,'search_default_group_product':1,'group_by':[], 'group_by_no_leaf':1} + Inventory Analysis allows you to easily check and analyse your company stock levels. Sort and group by selection criteria in order to better analyse and manage your company activities. - + diff --git a/addons/stock/report/report_stock_view.xml b/addons/stock/report/report_stock_view.xml index cb690cea931..0fc7f206c6b 100644 --- a/addons/stock/report/report_stock_view.xml +++ b/addons/stock/report/report_stock_view.xml @@ -67,6 +67,7 @@ form {'search_default_stockable':1} tree,form + Display the last inventories done on your products and easily sort them with specific filtering criteria. If you do frequent and partial inventories, you need this report in order to ensure that the stock of each product is controlled at least once a year. diff --git a/addons/stock/security/ir.model.access.csv b/addons/stock/security/ir.model.access.csv index e879a03e9e1..4d9c44edd79 100644 --- a/addons/stock/security/ir.model.access.csv +++ b/addons/stock/security/ir.model.access.csv @@ -9,40 +9,26 @@ "access_stock_journal_manager","stock.journal.manager","model_stock_journal","stock.group_stock_manager",1,1,1,1 "access_stock_tracking_user","stock.tracking user","model_stock_tracking","stock.group_stock_user",1,1,1,1 "access_stock_tracking_manager","stock.tracking manager","model_stock_tracking","stock.group_stock_manager",1,0,0,0 -"access_stock_tracking_system","stock.tracking systen","model_stock_tracking","base.group_system",1,0,0,0 "access_stock_picking_user","stock.picking user","model_stock_picking","stock.group_stock_user",1,1,1,1 "access_stock_picking_manager","stock.picking manager","model_stock_picking","stock.group_stock_manager",1,0,0,0 -"access_stock_picking_system","stock.picking system","model_stock_picking","base.group_system",1,0,0,0 "access_stock_production_lot_manager","stock.production.lot manager","model_stock_production_lot","stock.group_stock_manager",1,0,0,0 -"access_stock_production_lot_system","stock.production.lot system","model_stock_production_lot","base.group_system",1,0,0,0 "access_stock_production_lot_user","stock.production.lot user","model_stock_production_lot","stock.group_stock_user",1,1,1,1 "access_stock_production_lot_revision","stock.production.lot.revision","model_stock_production_lot_revision","stock.group_stock_user",1,1,1,1 "access_stock_move_manager","stock.move manager","model_stock_move","stock.group_stock_manager",1,0,0,0 "access_stock_move_user","stock.move user","model_stock_move","stock.group_stock_user",1,1,1,1 -"access_stock_move_system","stock.move system","model_stock_move","base.group_system",1,0,0,0 "access_stock_inventory_user","stock.inventory user","model_stock_inventory","stock.group_stock_user",1,1,1,1 -"access_stock_inventory_system","stock.inventory system","model_stock_inventory","base.group_system",1,0,0,0 "access_stock_inventory_manager","stock.inventory manager","model_stock_inventory","stock.group_stock_manager",1,0,0,0 "access_stock_inventory_line_user","stock.inventory.line user","model_stock_inventory_line","stock.group_stock_user",1,1,1,1 "access_stock_inventory_line_manager","stock.inventory.line manager","model_stock_inventory_line","stock.group_stock_manager",1,0,0,0 -"access_stock_inventory_line_system","stock.inventory.line system","model_stock_inventory_line","base.group_system",1,0,0,0 "access_stock_report_prodlots","stock.report.prodlots","model_stock_report_prodlots","stock.group_stock_manager",1,0,0,0 "access_stock_location_product_manager","stock.location product manager","model_stock_location","product.group_product_manager",1,0,0,0 "access_stock_lines_date_user","report.stock.lines.date user","model_report_stock_lines_date","stock.group_stock_user",1,0,0,0 "access_stock_lines_date_manager","report.stock.lines.date manager","model_report_stock_lines_date","stock.group_stock_manager",1,1,1,1 -"access_stock_lines_date_system","report.stock.lines.date system","model_report_stock_lines_date","base.group_system",1,0,0,0 "access_stock_report_tracklots","stock.report.tracklots","model_stock_report_tracklots","stock.group_stock_user",1,1,1,1 "access_report_stock_move_user","report.stock.move user","model_report_stock_move","stock.group_stock_user",1,0,0,0 -"access_report_stock_move_system","report.stock.move system","model_report_stock_move","base.group_system",1,0,0,0 "access_report_stock_move_manager","report.stock.move manager","model_report_stock_move","stock.group_stock_manager",1,1,1,1 "access_report_stock_inventory_user","report.stock.inventory user","model_report_stock_inventory","stock.group_stock_user",1,1,1,1 "access_report_stock_inventory_manager","report.stock.inventory manager","model_report_stock_inventory","stock.group_stock_manager",1,1,1,1 -"access_report_stock_inventory_system","report.stock.inventory system","model_report_stock_inventory","base.group_system",1,0,0,0 -"access_stock_warehouse_system","stock.warehouse.system","model_stock_warehouse","base.group_system",1,1,1,1 -"access_stock_location_system","stock.location.system","model_stock_location","base.group_system",1,1,1,1 -"access_stock_journal_system","stock.journal.system","model_stock_journal","base.group_system",1,1,1,1 -"access_product_product_stock","product_product_stock","product.model_product_product","base.group_system",1,0,0,0 -"access_product_template_stock_system","product.template stock system","product.model_product_template","base.group_system",1,0,0,0 "access_product_product_stock_user","product_product_stock_user","product.model_product_product","stock.group_stock_user",1,1,1,1 "access_product_template_stock_user","product.template stock user","product.model_product_template","stock.group_stock_user",1,1,1,1 "access_product_product_stock_manager","product_product_stock_manager","product.model_product_product","stock.group_stock_manager",1,0,0,0 diff --git a/addons/stock/security/stock_security.xml b/addons/stock/security/stock_security.xml index 60be468d17e..717486413c6 100644 --- a/addons/stock/security/stock_security.xml +++ b/addons/stock/security/stock_security.xml @@ -9,10 +9,6 @@ Warehouse / User - - - - diff --git a/addons/stock/stock.py b/addons/stock/stock.py index f46f0c2ab08..831b1dafcb5 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -632,7 +632,7 @@ class stock_picking(osv.osv): 'move_lines': fields.one2many('stock.move', 'picking_id', 'Internal Moves', states={'done': [('readonly', True)], 'cancel': [('readonly', True)]}), 'auto_picking': fields.boolean('Auto-Picking'), 'address_id': fields.many2one('res.partner.address', 'Address', help="Address of partner"), - 'partner_id': fields.related('address_id','partner_id',type='many2one',relation='res.partner',string='Partner',store=True), + 'partner_id': fields.related('address_id','partner_id',type='many2one',relation='res.partner',string='Partner'), 'invoice_state': fields.selection([ ("invoiced", "Invoiced"), ("2binvoiced", "To Be Invoiced"), @@ -1247,23 +1247,25 @@ class stock_picking(osv.osv): @param ids: List of Picking Ids @param context: A standard dictionary for contextual values """ - msg='' for pick in self.browse(cr, uid, ids, context=context): + msg='' + if pick.auto_picking: + continue type_list = { - 'out':'Picking List', - 'in':'Reception', - 'internal': 'Internal picking', + 'out':_("Delivery Order"), + 'in':_('Reception'), + 'internal': _('Internal picking'), } - message = type_list.get(pick.type, _('Document')) + " '" + (pick.name or 'n/a') + "' " + message = type_list.get(pick.type, _('Document')) + " '" + (pick.name or '?') + "' " if pick.min_date: - msg=datetime.strptime(pick.min_date, '%Y-%m-%d %H:%M:%S').strftime('%Y-%m-%d') + "'." + msg= _(' for the ')+ datetime.strptime(pick.min_date, '%Y-%m-%d %H:%M:%S').strftime('%m/%d/%Y') state_list = { - 'confirmed': "is scheduled for the '" + msg , - 'assigned': 'is ready to process.', - 'cancel': 'is Cancelled.', - 'done': 'is processed.', - 'draft':'is draft.', - } + 'confirmed': _("is scheduled") + msg +'.', + 'assigned': _('is ready to process.'), + 'cancel': _('is cancelled.'), + 'done': _('is done.'), + 'draft':_('is in draft state.'), + } message += state_list[pick.state] self.log(cr, uid, pick.id, message) return True @@ -1997,7 +1999,6 @@ class stock_move(osv.osv): for pick_id in picking_ids: wf_service.trg_write(uid, 'stock.picking', pick_id, cr) - picking_obj.log_picking(cr, uid, picking_ids, context=context) return True def _create_account_move_line(self, cr, uid, move, src_account_id, dest_account_id, reference_amount, reference_currency_id, context=None): @@ -2371,7 +2372,7 @@ class stock_inventory(osv.osv): 'state': 'draft', 'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.inventory', context=c) } - + def _inventory_line_hook(self, cr, uid, inventory_line, move_vals): """ Creates a stock move from an inventory line @param inventory_line: diff --git a/addons/stock/stock_demo.xml b/addons/stock/stock_demo.xml index bce4de8b593..bdc11f208ca 100644 --- a/addons/stock/stock_demo.xml +++ b/addons/stock/stock_demo.xml @@ -244,7 +244,7 @@ - + Shop 2 @@ -262,9 +262,8 @@ out direct 2binvoiced - + - diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml index 9f6d71b99b0..9a53b6d01d2 100644 --- a/addons/stock/stock_view.xml +++ b/addons/stock/stock_view.xml @@ -3,12 +3,12 @@ - + - - + + @@ -93,6 +93,7 @@ + @@ -100,21 +101,20 @@ - + + - - @@ -151,6 +151,7 @@ {'full':'1'} + The Periodical Inventories are used when you count your number of products available per location. You can use it, once a year, when you do the general inventory or, once you need it, to correct the current stock level of a product. @@ -209,6 +210,7 @@ stock.tracking form + This is the list of all your packs. After having selected a Pack, you can get the up-stream or down-stream traceability of the products contained in the pack. {'full':'1',"search_default_available":1} + This is the list of all the production lots (serial numbers) you recorded. After having selected a lot, you can get the up-stream or down-stream traceability of the products contained in lot. @@ -507,8 +510,9 @@ {'full':1, 'search_default_in_location':1} + Define your locations in order to reflect to your warehouse structure and organization. OpenERP is able to manage physical locations (warehouses, shelves, bin, etc), partners location (customers, suppliers) and virtual locations which are the counter-part of the stock operations like the manufacturing orders consummations, the inventories, etc. Every stock operation in OpenERP 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 location into the Stock location. Each report can be performed on physicals, partners or virtual locations. - + stock.location.tree @@ -528,6 +532,7 @@ [('location_id','=',False)] tree + This is the structure of your company's warehouses and locations. You can click on a location in order to get the list of the products and their stock level in this particular location and all its children. @@ -567,8 +572,9 @@ ir.actions.act_window form + Create and manage your warehouses and assign them a location from here - + stock.picking.calendar @@ -720,7 +726,9 @@ - + + + @@ -748,6 +756,7 @@ + @@ -765,6 +774,10 @@ + + + + @@ -779,7 +792,7 @@ stock.picking tree - + @@ -798,7 +811,7 @@ stock.picking form - + @@ -907,10 +920,12 @@ - + - + + + @@ -935,11 +950,14 @@ - - + + + + + @@ -962,7 +980,7 @@ - Outgoing Orders + Outgoing Deliveries stock.picking ir.actions.act_window form @@ -970,6 +988,7 @@ [('type','=','out')] {'contact_display': 'partner_address', 'search_default_available': 1} + This is the list of all delivery orders that must be prepared, according to your different sales orders and your logistics rules. @@ -1125,7 +1144,9 @@ - + + + @@ -1145,9 +1166,10 @@ stock.picking search - + - + + @@ -1168,6 +1190,9 @@ + + + @@ -1182,6 +1207,7 @@ [('type','=','in')] {'contact_display': 'partner_address',"search_default_available":1} + The Incoming Shipments is the list of all orders you will receive from your supplier. An incoming shipment contains a list of products to be received according to the original purchase order. You can validate the shipment totally or partially. @@ -1241,6 +1267,7 @@ [('type','=','internal')] {'contact_display': 'partner_address',"search_default_available":1} + The Internal Moves lists all inventory operations you have to perform in your warehouse. All operations can be categorized into stock journals, so that each worker has it's own list of operations to perform in his own journal. Most operations are prepared automatically by OpenERP according to your pre-configured logistics rules but you can also record manual stock operations. @@ -1314,35 +1341,38 @@ - - - - - + + + + - + + + + + + + + + - - - + - - - - + + + - @@ -1365,10 +1395,10 @@ - - + + - + @@ -1428,6 +1458,7 @@ {'search_default_Available':1} + This menu gives you the full traceability of inventory operations made on a specific product. You can filter on the product to see all the past or future movements made on the product. @@ -1501,36 +1532,39 @@ form - - - - - - + + + + + - + + + + + + + + + - + - - - + - - - - + + + - @@ -1539,7 +1573,7 @@ + states="draft,assigned,confirmed,done" colspan="1"/> + string="Split" type="action" icon="terp-stock_effects-object-colorize" colspan="1"/> + - - - - + + + + @@ -1634,15 +1669,16 @@ - Incoming Products + Receive Products stock.move ir.actions.act_window form tree,form ['|','&',('picking_id','=',False),('location_id.usage', 'in', ['customer','supplier']),'&',('picking_id','!=',False),('picking_id.type','=','in')] - {"search_default_receive":1} + + You will find here the list of all products you are waiting for, according to your preceding purchase orders. Once you receive an order, you can filter based on the name of the supplier or the purchase order reference. Then you can confirm all products received using the buttons on the right of each line. @@ -1768,15 +1804,16 @@ - Outgoing Products + Deliver Products stock.move ir.actions.act_window form tree,form ['|','&',('picking_id','=',False),('location_dest_id.usage', 'in', ['customer','supplier']),'&',('picking_id','!=',False),('picking_id.type','=','out')] - {"search_default_receive":1} + + The 'Deliver Products' menu lists all products you have to deliver to your customers. You can process the deliveries directly from this list, line by or line or through the Delivery Orders menu. @@ -1788,7 +1825,7 @@ form - + @@ -1834,6 +1871,7 @@ stock.journal ir.actions.act_window form + The stock journals system allows you assign each stock operation into a specific journal according to the type of operation to perform or the worker/team that should perform the operation. Examples of stock journals may be: quality control, pick lists, packing, etc. - + Import Inventory stock.fill.inventory form - - - - - - - - - + + + + + + + + + - + - + id="action_view_stock_fill_inventory"/> diff --git a/addons/stock/wizard/stock_inventory_merge_view.xml b/addons/stock/wizard/stock_inventory_merge_view.xml index 62cac877179..7a4735bdf41 100644 --- a/addons/stock/wizard/stock_inventory_merge_view.xml +++ b/addons/stock/wizard/stock_inventory_merge_view.xml @@ -22,6 +22,7 @@ res_model="stock.inventory.merge" src_model="stock.inventory" view_mode="form" + multi="True" target="new" key2="client_action_multi" id="action_view_stock_merge_inventories"/> diff --git a/addons/stock/wizard/stock_invoice_onshipping.py b/addons/stock/wizard/stock_invoice_onshipping.py index 7e0693b9045..d841c7cb37a 100644 --- a/addons/stock/wizard/stock_invoice_onshipping.py +++ b/addons/stock/wizard/stock_invoice_onshipping.py @@ -29,95 +29,77 @@ class stock_invoice_onshipping(osv.osv_memory): _columns = { 'journal_id': fields.many2one('account.journal', 'Destination Journal', required=True), 'group': fields.boolean("Group by partner"), - 'type': fields.selection([('out_invoice', 'Customer Invoice'), - ('in_invoice', 'Supplier Invoice'), - ('out_refund', 'Customer Refund'), - ('in_refund', 'Supplier Refund')] , 'Type', required=True), 'invoice_date': fields.date('Invoiced date'), } - def _get_type(self, cr, uid, context=None): - """ To get invoice type. - @param self: The object pointer. - @param cr: A database cursor - @param uid: ID of the user currently logged in - @param ids: The ID or list of IDs if we want more than one - @param context: A standard dictionary - @return: Invoice type - """ + def view_init(self, cr, uid, fields_list, context=None): if context is None: context = {} - picking_obj = self.pool.get('stock.picking') + res = super(stock_invoice_onshipping, self).view_init(cr, uid, fields_list, context=context) + pick_obj = self.pool.get('stock.picking') + count = 0 + active_ids = context.get('active_ids',[]) + for pick in pick_obj.browse(cr, uid, active_ids): + if pick.invoice_state != '2binvoiced': + count += 1 + if len(active_ids) == 1 and count: + raise osv.except_osv(_('Warning !'), _('This picking list does not require invoicing.')) + if len(active_ids) == count: + raise osv.except_osv(_('Warning !'), _('None of these picking lists require invoicing.')) + return res + + def _get_type(self, pick): src_usage = dest_usage = None - pick = picking_obj.browse(cr, uid, context['active_id'], context=context) - if pick.invoice_state == 'invoiced': - raise osv.except_osv(_('UserError'), _('Invoice is already created.')) - if pick.invoice_state == 'none': - raise osv.except_osv(_('UserError'), _('This picking does not require any invoicing.')) - if pick.move_lines: - src_usage = pick.move_lines[0].location_id.usage - dest_usage = pick.move_lines[0].location_dest_id.usage - if pick.type == 'out' and dest_usage == 'supplier': - type = 'in_refund' - elif pick.type == 'out' and dest_usage == 'customer': - type = 'out_invoice' - elif pick.type == 'in' and src_usage == 'supplier': - type = 'in_invoice' - elif pick.type == 'in' and src_usage == 'customer': - type = 'out_refund' - else: - type = 'out_invoice' - return type + pick_type = None + if pick.invoice_state=='2binvoiced': + if pick.move_lines: + src_usage = pick.move_lines[0].location_id.usage + dest_usage = pick.move_lines[0].location_dest_id.usage + if pick.type == 'out' and dest_usage == 'supplier': + pick_type = 'in_refund' + elif pick.type == 'out' and dest_usage == 'customer': + pick_type = 'out_invoice' + elif pick.type == 'in' and src_usage == 'supplier': + pick_type = 'in_invoice' + elif pick.type == 'in' and src_usage == 'customer': + pick_type = 'out_refund' + else: + pick_type = 'out_invoice' + return pick_type - _defaults = { - 'type': _get_type, - } - - def create_invoice(self, cr, uid, ids, context): - """ To create invoice - @param self: The object pointer. - @param cr: A database cursor - @param uid: ID of the user currently logged in - @param ids: the ID or list of IDs if we want more than one - @param context: A standard dictionary - @return: Invoice ids - """ + def create_invoice(self, cr, uid, ids, context=None): + if context is None: + context = {} result = [] picking_obj = self.pool.get('stock.picking') - mod_obj = self.pool.get('ir.model.data') - act_obj = self.pool.get('ir.actions.act_window') + onshipdata_obj = self.read(cr, uid, ids[0], ['journal_id', 'group', 'invoice_date']) + if context.get('new_picking', False): + onshipdata_obj['id'] = onshipdata_obj.new_picking + onshipdata_obj[ids] = onshipdata_obj.new_picking - for onshipdata_obj in self.read(cr, uid, ids, ['journal_id', 'group', 'type', 'invoice_date']): - if context.get('new_picking', False): - onshipdata_obj[id] = onshipdata_obj.new_picking - onshipdata_obj[ids] = onshipdata_obj.new_picking + context['date_inv'] = onshipdata_obj['invoice_date'] + invoice_ids = [] + for picking in picking_obj.browse(cr, uid, context.get('active_ids', []), context=context): + if picking.invoice_state == '2binvoiced': + res = picking_obj.action_invoice_create(cr, uid, [picking.id], + journal_id = onshipdata_obj['journal_id'], + group=onshipdata_obj['group'], + type=self._get_type(picking), + context=context) + invoice_ids.extend(res.values()) - type = onshipdata_obj['type'] - context['date_inv'] = onshipdata_obj['invoice_date'] - res = picking_obj.action_invoice_create(cr, uid,context['active_ids'], - journal_id = onshipdata_obj['journal_id'], - group=onshipdata_obj['group'], - type=type, - context=context) - invoice_ids = res.values() - if not invoice_ids: - raise osv.except_osv(_('Error'), _('Invoice is not created')) + if not invoice_ids: + raise osv.except_osv(_('Error'), _('No invoice were created')) - if type == 'out_invoice': - xml_id = 'action_invoice_tree1' - elif type == 'in_invoice': - xml_id = 'action_invoice_tree2' - elif type == 'out_refund': - xml_id = 'action_invoice_tree3' - else: - xml_id = 'action_invoice_tree4' - - result = mod_obj._get_id(cr, uid, 'account', xml_id) - id = mod_obj.read(cr, uid, result, ['res_id'], context=context) - result = act_obj.read(cr, uid, id['res_id'], context=context) - result['res_id'] = invoice_ids - result['context'] = context - return result + return { + 'domain': "[('id','in', ["+','.join(map(str,invoice_ids))+"])]", + 'name' : _('New picking invoices'), + 'view_type': 'form', + 'view_mode': 'tree,form', + 'res_model': 'account.invoice', + 'context': context, + 'type': 'ir.actions.act_window', + } stock_invoice_onshipping() diff --git a/addons/stock/wizard/stock_invoice_onshipping_view.xml b/addons/stock/wizard/stock_invoice_onshipping_view.xml index 6284121553c..6a4cfec5fca 100644 --- a/addons/stock/wizard/stock_invoice_onshipping_view.xml +++ b/addons/stock/wizard/stock_invoice_onshipping_view.xml @@ -1,36 +1,34 @@ - + Stock Invoice Onshipping stock.invoice.onshipping form - - - - - - - - - - - - + + + + + + + + + + - + - - Create Invoice - stock.invoice.onshipping - ir.actions.act_window - form - tree,form - - new - - + + diff --git a/addons/stock/wizard/stock_partial_picking.py b/addons/stock/wizard/stock_partial_picking.py index 1b746f230b5..6f84e5ec12c 100644 --- a/addons/stock/wizard/stock_partial_picking.py +++ b/addons/stock/wizard/stock_partial_picking.py @@ -60,13 +60,10 @@ class stock_partial_picking(osv.osv_memory): result = super(stock_partial_picking, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar,submenu) pick_obj = self.pool.get('stock.picking') picking_ids = context.get('active_ids', False) - _moves_arch_lst = """ - - - - - - """ + _moves_arch_lst = """ + + + """ % (_('Process Document'), _('Products')) _moves_fields = result['fields'] if picking_ids and view_type in ['form']: for pick in pick_obj.browse(cr, uid, picking_ids, context): @@ -101,13 +98,20 @@ class stock_partial_picking(osv.osv_memory): } }) + invisible = "1" + if pick.type=='in' and m.product_id.track_incoming: + invisible="" + if pick.type=='out' and m.product_id.track_outgoing: + invisible="" + + _moves_arch_lst += """ - + - - """%(m.id, m.id, m.id, m.id,m.id) + + """%(m.id, m.id, m.id, m.id,m.id, invisible) if (need_product_cost and m.product_id.cost_method == 'average'): _moves_fields.update({ diff --git a/addons/stock/wizard/stock_return_picking.py b/addons/stock/wizard/stock_return_picking.py index 4bddc9a7ee4..78852202440 100644 --- a/addons/stock/wizard/stock_return_picking.py +++ b/addons/stock/wizard/stock_return_picking.py @@ -83,7 +83,7 @@ class stock_return_picking(osv.osv_memory): if 'return%s'%(m.id) not in self._columns: self._columns['return%s'%(m.id)] = fields.float(string=m.name, required=True) if 'invoice_state' not in self._columns: - self._columns['invoice_state'] = fields.selection([('2binvoiced', 'To be Invoiced'), ('none', 'None')], string='Invoice State', required=True) + self._columns['invoice_state'] = fields.selection([('2binvoiced', 'To be refunded/invoiced'), ('none', 'No invoicing')], string='Invoicing', required=True) if not valid_lines: raise osv.except_osv(_('Warning !'), _("There are no products to return (only lines in Done state and not fully returned yet can be returned)!")) return res @@ -119,7 +119,7 @@ class stock_return_picking(osv.osv_memory): res['fields']['return%s' % m.id]={'string':m.name, 'type':'float', 'required':True} res.setdefault('returns', []).append(m.id) arch_lst.append('\n') - res['fields']['invoice_state']={'string':_('Invoice state'), 'type':'selection','required':True, 'selection':[('2binvoiced', _('To Be Invoiced')), ('none', _('None'))]} + res['fields']['invoice_state']={'string':_('Invoicing'), 'type':'selection','required':True, 'selection':[('2binvoiced', _('To be refunded/invoiced')), ('none', _('No invoicing'))]} arch_lst.append('') arch_lst.append('') arch_lst.append('') diff --git a/addons/stock_invoice_directly/test/stock_invoice_directly.yml b/addons/stock_invoice_directly/test/stock_invoice_directly.yml index 6a7e99276b9..4a0708b84d9 100644 --- a/addons/stock_invoice_directly/test/stock_invoice_directly.yml +++ b/addons/stock_invoice_directly/test/stock_invoice_directly.yml @@ -65,7 +65,6 @@ !record {model: stock.invoice.onshipping, id: stock_invoice_onshipping_0}: invoice_date: '2010-08-04' journal_id: account.bank_journal - type: out_invoice - I create a Customer invoice for my outgoing picking order. - @@ -82,4 +81,4 @@ partner = picking[0].address_id.partner_id.id inv_ids = self.search(cr, uid, [('type','=','out_invoice'),('partner_id','=',partner)]) assert inv_ids, 'No Invoice is generated!' - \ No newline at end of file + diff --git a/addons/stock_location/procurement_pull.py b/addons/stock_location/procurement_pull.py index 8b780d7a7a6..31316bf4eae 100644 --- a/addons/stock_location/procurement_pull.py +++ b/addons/stock_location/procurement_pull.py @@ -42,8 +42,6 @@ class procurement_order(osv.osv): for procurement in self.browse(cr, uid, ids): for line in procurement.product_id.flow_pull_ids: if line.location_id==procurement.location_id: - if not line.location_src_id: - self.write(cr, uid, procurement.id, {'message': _('No source location defined to generate the picking !')}) return (line.type_proc=='move') and (line.location_src_id) return False diff --git a/addons/stock_location/stock_location_view.xml b/addons/stock_location/stock_location_view.xml index eca4ade39fa..96d3fd84809 100644 --- a/addons/stock_location/stock_location_view.xml +++ b/addons/stock_location/stock_location_view.xml @@ -43,7 +43,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/addons/stock_no_autopicking/i18n/it.po b/addons/stock_no_autopicking/i18n/it.po index bc0cc16eef2..96669fda8c6 100644 --- a/addons/stock_no_autopicking/i18n/it.po +++ b/addons/stock_no_autopicking/i18n/it.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.4\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2009-02-03 09:22+0000\n" -"Last-Translator: Fabien (Open ERP) \n" +"PO-Revision-Date: 2010-10-16 08:12+0000\n" +"Last-Translator: simone.sandri \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-09-29 05:13+0000\n" +"X-Launchpad-Export-Date: 2010-10-17 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: stock_no_autopicking @@ -24,7 +24,7 @@ msgstr "XML non valido per Visualizzazione Architettura!" #. module: stock_no_autopicking #: field:product.product,auto_pick:0 msgid "Auto Picking" -msgstr "" +msgstr "Scelta Automatica" #. module: stock_no_autopicking #: help:product.product,auto_pick:0 diff --git a/addons/stock_planning/security/ir.model.access.csv b/addons/stock_planning/security/ir.model.access.csv index d4d543e25c4..d83c6d2f4d8 100644 --- a/addons/stock_planning/security/ir.model.access.csv +++ b/addons/stock_planning/security/ir.model.access.csv @@ -1,8 +1,5 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_stock_planning_system","stock.planning system","model_stock_planning","base.group_system",1,0,0,0 "access_stock_planning_manager","stock.planning manager","model_stock_planning","stock.group_stock_manager",1,0,0,0 "access_stock_planning_user","stock.planning user","model_stock_planning","stock.group_stock_user",1,1,1,1 -"access_stock_period_","stock.period","model_stock_period","base.group_system",1,1,1,1 "access_stock_sale_forecast_user","stock.sale.forecast user","model_stock_sale_forecast","base.group_sale_salesman",1,1,1,1 "access_stock_sale_forecast_manager","stock.sale.forecast manager","model_stock_sale_forecast","base.group_sale_manager",1,0,0,0 -"access_stock_sale_forecast_system","stock.sale.forecast system","model_stock_sale_forecast","base.group_system",1,0,0,0 diff --git a/addons/stock_planning/stock_planning_view.xml b/addons/stock_planning/stock_planning_view.xml index 704703cb13a..8d8c3cd3790 100644 --- a/addons/stock_planning/stock_planning_view.xml +++ b/addons/stock_planning/stock_planning_view.xml @@ -3,7 +3,7 @@ + parent="base.menu_base_config" sequence="20"/> @@ -182,7 +182,7 @@ + parent="base.menu_base_partner" sequence="6" groups="base.group_extended"/> stock.sale.forecast.list.select diff --git a/addons/survey/report/survey_browse_response.py b/addons/survey/report/survey_browse_response.py index 2cdb98622a9..a2ee95e417e 100644 --- a/addons/survey/report/survey_browse_response.py +++ b/addons/survey/report/survey_browse_response.py @@ -204,6 +204,7 @@ class survey_browse_response(report_rml): rml += """ Answer Create Date:- + # *-* formatting hard coded, breaks with utf8 """ + to_xml(time.strftime('%d-%m-%Y %I:%M:%S %p', time.strptime(response.date_create.split('.')[0], '%Y-%m-%d %H:%M:%S'))) + """ Answer By:- diff --git a/addons/survey/survey.py b/addons/survey/survey.py index 57a78e9ac5d..5343ef3c229 100644 --- a/addons/survey/survey.py +++ b/addons/survey/survey.py @@ -68,6 +68,7 @@ class survey(osv.osv): 'users': fields.many2many('res.users', 'survey_users_rel', 'sid', 'uid', 'Users'), 'send_response': fields.boolean('E-mail Notification on Answer'), 'type': fields.many2one('survey.type', 'Type'), + 'invited_user_ids': fields.many2many('res.users', 'survey_invited_user_rel', 'sid', 'uid', 'Invited User'), } _defaults = { 'state': lambda * a: "draft", diff --git a/addons/survey/survey_view.xml b/addons/survey/survey_view.xml index 44bcb4475b5..713f3dbf7a4 100644 --- a/addons/survey/survey_view.xml +++ b/addons/survey/survey_view.xml @@ -206,6 +206,9 @@ + + + diff --git a/addons/survey/wizard/survey_selection.py b/addons/survey/wizard/survey_selection.py index 69cc8e10796..0f7ca8628f0 100644 --- a/addons/survey/wizard/survey_selection.py +++ b/addons/survey/wizard/survey_selection.py @@ -62,9 +62,20 @@ class survey_name_wiz(osv.osv_memory): for sur in surv_obj.browse(cr, uid, [context.get('survey_id',False)]): result.append((sur.id, sur.title)) return result + survey_user_group_id = self.pool.get('res.groups').search(cr, uid, [('name', '=', 'Survey / User')]) group_id = self.pool.get('res.groups').search(cr, uid, [('name', 'in', ('Tools / Manager','Tools / User','Survey / User'))]) user_obj = self.pool.get('res.users') user_rec = user_obj.read(cr, uid, uid) + if survey_user_group_id: + if survey_user_group_id == user_rec['groups_id']: + for sur in surv_obj.browse(cr, uid, surv_obj.search(cr, uid, [])): + if sur.state == 'open': + u_list = [] + for use in sur.invited_user_ids: + u_list.append(use.id) + if uid in u_list: + result.append((sur.id, sur.title)) + return result for sur in surv_obj.browse(cr, uid, surv_obj.search(cr, uid, [])): if sur.state == 'open': res = False diff --git a/addons/survey/wizard/survey_send_invitation.py b/addons/survey/wizard/survey_send_invitation.py index b9740fba6ba..92ba965d880 100644 --- a/addons/survey/wizard/survey_send_invitation.py +++ b/addons/survey/wizard/survey_send_invitation.py @@ -113,7 +113,13 @@ class survey_send_invitation(osv.osv_memory): error = "" res_user = "" user_exists = False + new_user = [] attachments = [] + current_sur = survey_ref.browse(cr, uid, context.get('active_id'), context=context) + exist_user = current_sur.invited_user_ids + if exist_user: + for use in exist_user: + new_user.append(use.id) for id in survey_ref.browse(cr, uid, survey_ids): report = self.create_report(cr, uid, [id.id], 'report.survey.form', id.title) file = open(tools.config['addons_path'] + '/survey/report/' + id.title +".pdf") @@ -134,6 +140,8 @@ class survey_send_invitation(osv.osv_memory): continue user = user_ref.search(cr, uid, [('login', "=", addr.email)]) if user: + if user[0] not in new_user: + new_user.append(user[0]) user = user_ref.browse(cr, uid, user[0]) user_ref.write(cr, uid, user.id, {'survey_id':[[6, 0, survey_ids]]}) mail = record['mail']%{'login':addr.email, 'passwd':user.password, \ @@ -172,11 +180,17 @@ class survey_send_invitation(osv.osv_memory): 'survey_id': [[6, 0, survey_ids]] } user = user_ref.create(cr, uid, res_data) + if user not in new_user: + new_user.append(user) created+= "- %s (Login: %s, Password: %s)\n" % (addr.name or 'Unknown',\ addr.email, passwd) else: error+= "- %s (Login: %s, Password: %s)\n" % (addr.name or 'Unknown',\ addr.email, passwd) + + new_vals = {} + new_vals.update({'invited_user_ids':[[6,0,new_user]]}) + survey_ref.write(cr, uid, context.get('active_id'),new_vals) note= "" if created: note += 'Created users:\n%s\n\n' % (created) diff --git a/addons/warning/i18n/sr.po b/addons/warning/i18n/sr.po index 9f01330dfd7..733a627ada9 100644 --- a/addons/warning/i18n/sr.po +++ b/addons/warning/i18n/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-28 16:01+0000\n" -"PO-Revision-Date: 2010-10-14 17:20+0000\n" -"Last-Translator: zmmaj \n" +"PO-Revision-Date: 2010-10-15 09:41+0000\n" +"Last-Translator: OpenERP Administrators \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-15 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-10-16 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: warning diff --git a/addons/wiki/web/widgets/wikimarkup/__init__.py b/addons/wiki/web/widgets/wikimarkup/__init__.py index 91fec4bc4fd..5eceea0e86d 100644 --- a/addons/wiki/web/widgets/wikimarkup/__init__.py +++ b/addons/wiki/web/widgets/wikimarkup/__init__.py @@ -455,7 +455,6 @@ class BaseParser(object): if hasattr(self, 'count'): data = self.env[namespace] test = key in data - ls self.count = True return key in self.env[namespace] @@ -1114,7 +1113,7 @@ class BaseParser(object): trail = url[i:] + trail url = url[0:i] - url = cleanURL(url) + url = self.cleanURL(url) sb.append(u'\n") toc.append(u"\n\n" * max(0, toclevel - 1)) - toc.insert(0, u'' + _('Table of Contents') + '') + #TODO: use gettext + #toc.insert(0, u'' + _('Table of Contents') + '') + toc.insert(0, u'Table of Contents') toc.append(u'\n') # split up and insert constructed headlines diff --git a/addons/wiki/wiki_view.xml b/addons/wiki/wiki_view.xml index 9730031f630..8afd0435a41 100644 --- a/addons/wiki/wiki_view.xml +++ b/addons/wiki/wiki_view.xml @@ -6,7 +6,7 @@ + parent="knowledge.menu_document" sequence="50"/> diff --git a/addons/wiki_sale_faq/wiki_sale_faq_view.xml b/addons/wiki_sale_faq/wiki_sale_faq_view.xml index f65e542aed9..d1432c74b02 100644 --- a/addons/wiki_sale_faq/wiki_sale_faq_view.xml +++ b/addons/wiki_sale_faq/wiki_sale_faq_view.xml @@ -13,7 +13,7 @@ ir.attachment form - Documents give your access to all attached documents; it's a repository of all attached documents (mails, documents attached to a project, etc.) + Documents gives you an access to all attached files to any record. It is a repository of all documents such as emails, project related attachments or any other documents. From this view, you can search on the content of the documents. OpenERP automatically assign meta-data based on the record like the related partner and indexes the content of .DOC, .ODT, .TXT, .SXW and .PDF documents. @@ -23,7 +23,7 @@ tree,form - FAQ is a wiki page used to share frequently ask questions. + Wiki pages allow you to share ideas and questions with co-workers. You can create a new document that can be linked to one or several applications (specifications of a project, a FAQ for sales teams, etc.). Keywords can be used to easily tag wiki pages. You should use this application with the OpenERP web client interface.