bzr revid: amp@tinyerp.com-20101016051746-yys8jymkqor51y72
This commit is contained in:
AMP (OpenERP)
2010-10-16 10:47:46 +05:30
220 changed files with 7443 additions and 2668 deletions
+2 -2
View File
@@ -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 and entries 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:
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+2 -2
View File
@@ -44,7 +44,7 @@
<form string="Account Board">
<hpaned>
<child1>
<action colspan="4" height="160" width="400" name="%(account.action_invoice_tree1)d" string="Draft Customer Invoices" domain="[('state','=','draft'),('type','=','out_invoice')]"/>
<action colspan="4" height="160" width="400" name="%(account.action_invoice_tree1)d" string="Customer Invoices to Validate" domain="[('state','=','draft'),('type','=','out_invoice')]"/>
<action colspan="4" height="160" width="400" name="%(action_company_analysis_tree)d" string="Company Analysis" />
</child1>
<child2>
@@ -68,6 +68,6 @@
<menuitem id="menu_dashboard_acc" name="Dashboard" sequence="2" parent="account.menu_finance_reporting" groups="group_account_user,group_account_manager"/>
<menuitem action="open_board_account" icon="terp-graph" id="menu_board_account" parent="menu_dashboard_acc" sequence="1"/>
</data>
</openerp>
+17 -17
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-15 03:35+0000\n"
"Last-Translator: sugi <Unknown>\n"
"PO-Revision-Date: 2010-10-16 04:44+0000\n"
"Last-Translator: Гоби <Unknown>\n"
"Language-Team: Mongolian <mn@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
@@ -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
@@ -4542,7 +4542,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 +4625,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 +4657,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 +4837,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 +5036,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 +5058,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 +5094,7 @@ msgstr "Журналын бүтэц"
#. module: account
#: view:account.subscription.line:0
msgid "Subscription lines"
msgstr ""
msgstr "Бүртгэлийн мөрүүд"
#. module: account
#: field:account.chart.template,property_account_income:0
@@ -5425,7 +5425,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 +5528,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
@@ -6077,7 +6077,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 +6326,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 +6368,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
+3
View File
@@ -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 ') + " '" + name + "' "+ _("is marked as paid.")
self.log(cr, uid, inv_id, message)
return True
def unlink(self, cr, uid, ids, context=None):
@@ -287,7 +287,7 @@
<td><para style="terp_tblheader_Details_Right">Currency</para></td>
</tr>
<tr>
<td><para style="terp_default_Bold_9">Total:([[ company.currency_id.code]])</para></td>
<td><para style="terp_default_Bold_9">Total:</para></td>
<td><para style="terp_default_Bold_9"><font color="white"> </font></para></td>
<td><para style="terp_default_Bold_9_Right">[[ formatLang(sum_debit()) ]]</para></td>
<td><para style="terp_default_Bold_9_Right">[[ formatLang( sum_credit()) ]]</para></td>
@@ -266,10 +266,10 @@
<tr>
<td><para style="Standard"><font color="white">[[ '..'*(o.level-1) ]]</font>[[ o.code ]] [[ o.name ]]</para></td>
<td><para style="Standard"></para></td>
<td alignment="right"><para style="P9b"><u>[[ formatLang(sum_debit_account(o), dp='Account') ]]</u></para></td>
<td alignment="right"><para style="P9b"><u>[[ formatLang(sum_credit_account(o), dp='Account') ]]</u></para></td>
<td><para style="P9b"><u>[[ formatLang(sum_balance_account(o), dp='Account') ]] [[ company.currency_id.symbol ]]</u></para></td>
<td><para style="P9b"><u>[[ o.currency_id and formatLang(sum_currency_amount_account(o), dp='Account') + o.currency_id.code or '' ]]</u></para></td>
<td alignment="right"><para style="P9b"><u>[[ formatLang(sum_debit_account(o), digits=get_digits(dp='Account')) ]]</u></para></td>
<td alignment="right"><para style="P9b"><u>[[ formatLang(sum_credit_account(o), digits=get_digits(dp='Account')) ]]</u></para></td>
<td><para style="P9b"><u>[[ formatLang(sum_balance_account(o), digits=get_digits(dp='Account')) ]] [[ company.currency_id.symbol ]]</u></para></td>
<td><para style="P9b"><u>[[ o.currency_id and formatLang(sum_currency_amount_account(o), digits=get_digits(dp='Account')) + o.currency_id.code or '' ]]</u></para></td>
</tr>
</blockTable>
</td>
@@ -292,9 +292,9 @@
<td><para style="P2_content">[[ line['move'] ]]</para></td>
<td><para style="P3_content">[[ line['lname'] ]]</para></td>
<td><para style="P3_content_center">[[ strip_name(line['line_corresp'].replace(', ',','),40) ]]</para></td>
<td><para style="P4_content">[[ formatLang(line['debit'], dp='Account') ]]</para></td>
<td><para style="P4_content">[[ formatLang(line['credit'], dp='Account') ]]</para></td>
<td><para style="P4_content">[[ formatLang(line['progress'], dp='Account') ]] [[ company.currency_id.symbol ]]</para></td>
<td><para style="P4_content">[[ formatLang(line['debit'], digits=get_digits(dp='Account')) ]]</para></td>
<td><para style="P4_content">[[ formatLang(line['credit'], digits=get_digits(dp='Account')) ]]</para></td>
<td><para style="P4_content">[[ formatLang(line['progress'], digits=get_digits(dp='Account')) ]] [[ company.currency_id.symbol ]]</para></td>
<td><para style="P4_content"><font>[[ (line['currency_id']==None or line['amount_currency']==None) and removeParentNode('font') ]] [[ formatLang(line['amount_currency'])]] [[ line['currency_code'] or '']]</font></para></td>
</tr>
</blockTable>
@@ -352,9 +352,9 @@
<td><para style="P2_content">[[ line['move'] ]]</para></td>
<td><para style="P3_content">[[ line['lname'] ]]</para></td>
<td><para style="P3_content_center">[[ strip_name(line['line_corresp'],15) ]]</para></td>
<td><para style="P4_content">[[ formatLang(line['debit'], dp='Account') ]] </para></td>
<td><para style="P4_content">[[ formatLang(line['credit'], dp='Account') ]]</para></td>
<td><para style="P4_content">[[ formatLang(line['progress'], dp='Account') ]] [[ company.currency_id.symbol ]]</para></td>
<td><para style="P4_content">[[ formatLang(line['debit'], digits=get_digits(dp='Account')) ]] </para></td>
<td><para style="P4_content">[[ formatLang(line['credit'], digits=get_digits(dp='Account')) ]]</para></td>
<td><para style="P4_content">[[ formatLang(line['progress'], digits=get_digits(dp='Account')) ]] [[ company.currency_id.symbol ]]</para></td>
</tr>
</blockTable>
@@ -140,7 +140,7 @@ class third_party_ledger(rml_parse.rml_parse, common_report_header):
else:
RECONCILE_TAG = "AND l.reconcile_id IS NULL"
self.cr.execute(
"SELECT l.id, l.date, j.code, acc.code as a_code, acc.name as a_name, l.ref, m.name as move_name, l.name, l.debit, l.credit, l.amount_currency, c.symbol AS currency_code " \
"SELECT l.id, l.date, j.code, acc.code as a_code, acc.name as a_name, l.ref, m.name as move_name, l.name, l.debit, l.credit, l.amount_currency,l.currency_id, c.symbol AS currency_code " \
"FROM account_move_line l " \
"LEFT JOIN account_journal j " \
"ON (l.journal_id = j.id) " \
@@ -487,7 +487,7 @@
<para style="terp_default_Right_9">[[ formatLang((line['progress'])) ]] [[ company.currency_id.symbol ]]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang(line['amount_currency'] or '') ]] [[ line['currency_code'] or '' ]]</para>
<para style="terp_default_Right_9"><font>[[ (line['currency_id']==None or line['amount_currency']==None) and removeParentNode('font') ]] [[ formatLang(line['amount_currency'] ) ]] [[ line['currency_code'] or '' ]]</font></para>
</td>
</tr>
</blockTable>
@@ -627,7 +627,7 @@
<para style="terp_default_Right_9">[[ formatLang((line['progress'])) ]] [[ company.currency_id.symbol ]]</para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang(line['amount_currency'] or '') ]] [[ line['currency_code'] or '' ]]</para>
<para style="terp_default_Right_9"><font>[[ (line['currency_id']==None or line['amount_currency']==None) and removeParentNode('font') ]] [[ formatLang(line['amount_currency'] ) ]] [[ line['currency_code'] or '' ]]</font></para>
</td>
</tr>
</blockTable>
+22 -19
View File
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<document filename="test.pdf">
<template pageSize="(595.0,842.0)" title="Invoices" author="OpenERP S.A. (sales@openerp.com)" allowSplitting="20">
<document filename="Invoices.pdf">
<template pageSize="(595.0,842.0)" title="Invoices" author="OpenERP S.A.(sales@openerp.com)" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="34.0" y1="28.0" width="530" height="786"/>
</pageTemplate>
@@ -140,18 +140,18 @@
</para>
</td>
<td>
<para style="terp_default_8">[[ o.partner_id.title.name or '' ]] [[ o.partner_id.name ]]</para>
<para style="terp_default_8">[[ o.address_invoice_id.street ]]</para>
<para style="terp_default_8">[[ o.address_invoice_id.street2 or removeParentNode('para') ]]</para>
<para style="terp_default_8">[[ o.address_invoice_id.zip or '' ]] [[ o.address_invoice_id.city or '' ]]</para>
<para style="terp_default_8">[[ o.address_invoice_id.state_id and o.address_invoice_id.state_id.name or removeParentNode('para') ]]</para>
<para style="terp_default_8">[[ o.address_invoice_id.country_id and o.address_invoice_id.country_id.name or '' ]]</para>
<para style="terp_default_8">[[ (o.partner_id and o.partner_id.title and o.partner_id.title.name) or '' ]] [[ (o.partner_id and o.partner_id.name) or '' ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.street) or '' ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.street2) or removeParentNode('para') ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.zip) or '' ]] [[ (o.address_invoice_id and o.address_invoice_id.city) or '' ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.state_id and o.address_invoice_id.state_id.name) or removeParentNode('para') ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.country_id and o.address_invoice_id.country_id.name) or '' ]]</para>
<para style="terp_default_8">
<font color="white"> </font>
</para>
<para style="terp_default_8">Tel. : [[ o.address_invoice_id.phone or removeParentNode('para') ]]</para>
<para style="terp_default_8">Fax : [[ o.address_invoice_id.fax or removeParentNode('para') ]]</para>
<para style="terp_default_8">VAT : [[ o.partner_id.vat or removeParentNode('para') ]]</para>
<para style="terp_default_8">Tel. : [[ (o.address_invoice_id and o.address_invoice_id.phone) or removeParentNode('para') ]]</para>
<para style="terp_default_8">Fax : [[ (o.address_invoice_id and o.address_invoice_id.fax) or removeParentNode('para') ]]</para>
<para style="terp_default_8">VAT : [[ (o.partner_id and o.partner_id.vat) or removeParentNode('para') ]]</para>
</td>
</tr>
</blockTable>
@@ -187,14 +187,14 @@
<para style="terp_default_Centre_9">[[ formatLang(o.date_invoice,date=True) ]]</para>
</td>
<td>
<para style="terp_default_Centre_9">[[ o.address_invoice_id.partner_id.ref or ' ' ]]</para>
<para style="terp_default_Centre_9">[[ (o.address_invoice_id and o.address_invoice_id.partner_id and o.address_invoice_id.partner_id.ref) or ' ' ]]</para>
</td>
</tr>
</blockTable>
<para style="terp_default_8">
<font color="white"> </font>
</para>
<blockTable colWidths="219.0,87.0,56.0,56.0,51.0,62.0" style="Table7">
<blockTable colWidths="219.0,87.0,62.0,56.0,46.0,62.0" style="Table7">
<tr>
<td>
<para style="terp_tblheader_Details">Description</para>
@@ -218,7 +218,7 @@
</blockTable>
<section>
<para style="terp_default_2">[[ repeatIn(o.invoice_line,'l') ]]</para>
<blockTable colWidths="218.0,88.0,56.0,56.0,51.0,62.0" style="Table8">
<blockTable colWidths="218.0,88.0,62.0,55.0,46.0,62.0" style="Table8">
<tr>
<td>
<para style="terp_default_9">[[ l.name ]]</para>
@@ -315,10 +315,10 @@
<para style="Text body">
<font color="white"> </font>
</para>
<blockTable colWidths="167.0,59.0,56.0,247.0" style="Table9">
<blockTable colWidths="206.0,51.0,49.0,225.0" style="Table9">
<tr>
<td>
<para style="terp_tblheader_Details">Tax</para>
<para style="terp_tblheader_Details">Tax [[ o.tax_line==[] and removeParentNode('blockTable') ]]</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">Base </para>
@@ -335,7 +335,7 @@
</blockTable>
<section>
<para style="terp_default_2">[[ repeatIn(o.tax_line,'t') ]]</para>
<blockTable colWidths="167.0,60.0,55.0,248.0" style="Table2">
<blockTable colWidths="205.0,52.0,49.0,224.0" style="Table2">
<tr>
<td>
<para style="terp_default_8">[[ t.name ]]</para>
@@ -354,11 +354,14 @@
</tr>
</blockTable>
</section>
<para style="terp_default_9">
<font color="white"> </font>
</para>
<para style="terp_default_9">[[ (o.comment and format(o.comment )) or removeParentNode('para') ]]</para>
<para style="terp_default_8">
<font color="white"> </font>
</para>
<para style="terp_default_9">[[ (o.payment_term.note and format(o.payment_term and o.payment_term.note)) or removeParentNode('para') ]]</para>
<para style="terp_default_9">[[ (o.payment_term and o.payment_term.note and format(o.payment_term and o.payment_term.note)) or removeParentNode('para') ]]</para>
<para style="terp_default_9">
<font color="white"> </font>
</para>
@@ -368,7 +371,7 @@
<para style="terp_default_Bold_9">Fiscal Position Remark : </para>
</td>
<td>
<para style="terp_default_9">[[ (o.fiscal_position.note and format(o.fiscal_position and o.fiscal_position.note)) or removeParentNode('blockTable') ]]</para>
<para style="terp_default_9">[[ (o.fiscal_position and o.fiscal_position.note and format(o.fiscal_position.note)) or removeParentNode('blockTable') ]]</para>
</td>
</tr>
</blockTable>
@@ -37,9 +37,26 @@ 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,
})
def get_years(self,form):
res={}
fiscal_year_name = self.pool.get('account.fiscalyear').name_get(self.cr,self.uid,form['fiscalyear'])
if fiscal_year_name:
res['fname'] = fiscal_year_name[0][1]
res['periods'] = ''
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']
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)
@@ -105,6 +105,16 @@
</stylesheet>
<story>
<para style="P2">Tax Statement</para>
<para style="P2"><font color="white"> </font></para>
<blockTable colWidths="538" style="Tableau1">
<tr>
<td><para style="P12">Year : [[ get_years(data['form'])['fname'] ]]</para></td>
</tr>
<tr>
<td><para style="P12">Periods : [[ get_years(data['form'])['periods'] or removeParentNode('tr')]]</para></td>
</tr>
</blockTable>
<para style="P2"><font color="white"> </font></para>
<blockTable colWidths="340.0,55.0,55.0,90.0" style="Table2" repeatRows="1">
<tr>
<td><para style="P12">Tax Name</para></td>
+9 -9
View File
@@ -24,13 +24,14 @@ from osv import osv, fields
class account_vat_declaration(osv.osv_memory):
_name = 'account.vat.declaration'
_description = 'Account Vat Declaration'
_inherit = "account.common.account.report"
_columns = {
'based_on': fields.selection([('invoices','Invoices'),
('payments','Payments'),],
'based_on': fields.selection([('invoices','Invoices'),
('payments','Payments'),],
'Based On', required=True),
'company_id': fields.many2one('res.company', 'Company', required=True),
'periods': fields.many2many('account.period', 'vat_period_rel', 'vat_id', 'period_id', 'Periods', help="All periods if empty"),
'fiscalyear': fields.many2many('account.fiscalyear','vat_fiscal_rel','fiscal_id','Fiscal Year',required=True),
}
def _get_company(self, cr, uid, context={}):
@@ -38,14 +39,14 @@ class account_vat_declaration(osv.osv_memory):
company_obj = self.pool.get('res.company')
user = user_obj.browse(cr, uid, uid, context=context)
if user.company_id:
return user.company_id.id
return user.company_id.id
else:
return company_obj.search(cr, uid, [('parent_id', '=', False)])[0]
_defaults = {
'based_on': 'invoices',
'company_id': _get_company
}
'based_on': 'invoices',
'company_id': _get_company
}
def create_vat(self, cr, uid, ids, context={}):
if context is None:
@@ -57,8 +58,7 @@ class account_vat_declaration(osv.osv_memory):
'type': 'ir.actions.report.xml',
'report_name': 'account.vat.declaration',
'datas': datas,
}
}
account_vat_declaration()
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+4 -2
View File
@@ -10,10 +10,12 @@
<form string="Select Period">
<field name="company_id" groups="base.group_multi_company" widget='selection'/>
<newline/>
<field name="based_on" invisible="1"/>
<field name="based_on"/>
<newline/>
<separator string="Select Period(s)" colspan="4"/>
<field name="periods" nolabel="1" colspan="2"/>
<field name="periods" nolabel="1" colspan="4"/>
<separator string="Select FiscalYear(s)" colspan="4"/>
<field name="fiscalyear" nolabel="1" colspan="4"/>
<group col="2" colspan="4">
<button icon='gtk-cancel' special="cancel" string="Cancel" />
<button name="create_vat" string="Print Tax Statement" colspan="1" type="object" icon="gtk-ok"/>
+66
View File
@@ -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 <EMAIL@ADDRESS>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-11-24 12:50+0000\n"
"PO-Revision-Date: 2010-10-15 11:31+0000\n"
"Last-Translator: sugi <Unknown>\n"
"Language-Team: Mongolian <mn@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-10-16 04:48+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 ""
"Энэ данс нь худалдан авалтын үнэ болон өртгийн үнийн хоорондох үнийн "
"өөрчлөлтийг дүгнэхийн тулд ашиглагдана."
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 10:57+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 08:22+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+37
View File
@@ -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 <EMAIL@ADDRESS>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-08-19 12:03+0000\n"
"PO-Revision-Date: 2010-10-15 11:33+0000\n"
"Last-Translator: sugi <Unknown>\n"
"Language-Team: Mongolian <mn@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-10-16 04:48+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 "Данс цуцлах"
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-11-24 13:11+0000\n"
"PO-Revision-Date: 2010-10-14 20:51+0000\n"
"Last-Translator: robert <Unknown>\n"
"PO-Revision-Date: 2010-10-15 09:33+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Croatian <hr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-11-24 13:11+0000\n"
"PO-Revision-Date: 2010-10-14 11:15+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 08:49+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 11:52+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 09:03+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
@@ -1,8 +1,8 @@
<?xml version="1.0"?>
<document filename="test.pdf">
<template pageSize="(595.0,842.0)" title="Follow UP" author="OpenERP S.A. (sales@openerp.com)" allowSplitting="20">
<document filename="Account Followup.pdf">
<template pageSize="(595.0,842.0)" title="Account Followup" author="OpenERP S.A. (sales@openerp.com)" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="42.0" y1="28.0" width="511" height="786"/>
<frame id="first" x1="31.0" y1="28.0" width="532" height="786"/>
</pageTemplate>
</template>
<stylesheet>
@@ -48,11 +48,13 @@
<lineStyle kind="LINEABOVE" colorName="#000000" start="3,0" stop="3,0"/>
<lineStyle kind="LINEABOVE" colorName="#000000" start="4,0" stop="4,0"/>
<lineStyle kind="LINEABOVE" colorName="#000000" start="5,0" stop="5,0"/>
<lineStyle kind="LINEABOVE" colorName="#000000" start="1,1" stop="1,1"/>
<lineStyle kind="LINEABOVE" colorName="#000000" start="2,1" stop="2,1"/>
<lineStyle kind="LINEABOVE" colorName="#000000" start="3,1" stop="3,1"/>
<lineStyle kind="LINEABOVE" colorName="#000000" start="4,1" stop="4,1"/>
<lineStyle kind="LINEABOVE" colorName="#000000" start="5,1" stop="5,1"/>
</blockTableStyle>
<blockTableStyle id="Table3">
<blockAlignment value="LEFT"/>
<blockValign value="TOP"/>
<lineStyle kind="LINEABOVE" colorName="#000000" start="1,0" stop="1,0"/>
<lineStyle kind="LINEABOVE" colorName="#000000" start="2,0" stop="2,0"/>
<lineStyle kind="LINEABOVE" colorName="#000000" start="3,0" stop="3,0"/>
</blockTableStyle>
<initialize>
<paraStyle name="all" alignment="justify"/>
@@ -92,16 +94,16 @@
<story>
<para style="terp_default_8">[[ repeatIn(ids_to_objects(data['form']['partner_ids']),'o') ]] </para>
<para style="terp_default_8">[[ setLang(o.lang) ]]</para>
<blockTable colWidths="286.0,224.0" style="Tableau2">
<blockTable colWidths="298.0,234.0" style="Tableau2">
<tr>
<td>
<para style="terp_default_9">[[ repeatIn(adr_get(o,'invoice'),'a' )]]</para>
</td>
<td>
<para style="terp_default_9">[[ o.name ]]</para>
<para style="terp_default_9">[[ a['street'] ]]</para>
<para style="terp_default_9">[[ o.name or '' ]]</para>
<para style="terp_default_9">[[ a['street'] or '']]</para>
<para style="terp_default_9">[[ a['street2'] or removeParentNode('para') ]]</para>
<para style="terp_default_9">[[ a['zip'] ]] [[ a['city'] ]]</para>
<para style="terp_default_9">[[ a['zip'] or '' ]] [[ a['city'] or '' ]]</para>
<para style="terp_default_9">[[( a['state_id'] and a['state_id'][1]) or removeParentNode('para') ]]</para>
<para style="terp_default_9">[[( a['country_id'] and a['country_id'][1]) or '']]</para>
<para style="terp_default_9">
@@ -124,7 +126,7 @@
<para style="terp_default_9">
<font color="white"> </font>
</para>
<blockTable colWidths="68.0,78.0,45.0,70.0,51.0,58.0,62.0,61.0,27.0" style="Table1">
<blockTable colWidths="66.0,77.0,46.0,74.0,52.0,62.0,59.0,67.0,29.0" style="Table1">
<tr>
<td>
<para style="terp_tblheader_Details_Centre">Invoice Date</para>
@@ -157,7 +159,7 @@
</blockTable>
<section>
<para style="terp_default_8">[[repeatIn(getLines(o), 'line') ]]</para>
<blockTable colWidths="68.0,79.0,44.0,69.0,49.0,62.0,61.0,60.0,26.0" style="Table5">
<blockTable colWidths="66.0,78.0,46.0,69.0,57.0,62.0,58.0,68.0,28.0" style="Table5">
<tr>
<td>
<para style="terp_default_9">[[ formatLang(line['date'],date = True) ]]</para>
@@ -189,7 +191,7 @@
</tr>
</blockTable>
</section>
<blockTable colWidths="191.0,108.0,73.0,61.0,60.0,26.0" style="Table2">
<blockTable colWidths="190.0,101.0,87.0,58.0,68.0,28.0" style="Table2">
<tr>
<td>
<para style="terp_default_8">
@@ -200,10 +202,10 @@
<para style="terp_tblheader_Details">Sub-Total: </para>
</td>
<td>
<para style="terp_default_Right_9">[[formatLang(reduce(lambda x,y: x+y['debit'], getLines(o), 0.00)) ]]</para>
<para style="terp_default_Right_9">[[formatLang(reduce(lambda x,y: x+y['debit'], getLines(o), 0.00)) ]] </para>
</td>
<td>
<para style="terp_default_Right_9">[[formatLang(reduce(lambda x,y: x+y['credit'], getLines(o), 0.00)) ]]</para>
<para style="terp_default_Right_9">[[formatLang(reduce(lambda x,y: x+y['credit'], getLines(o), 0.00)) ]] </para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang(reduce(lambda x,y: x+(y['debit'] - y['credit']), filter(lambda x: x['date_maturity'] &lt; time.strftime('%Y-%m-%d'), getLines(o)), 0)) ]] [[ company.currency_id.symbol ]]</para>
@@ -214,6 +216,8 @@
</para>
</td>
</tr>
</blockTable>
<blockTable colWidths="193.0,92.0,100.0,147.0" style="Table3">
<tr>
<td>
<para style="terp_default_8">
@@ -224,27 +228,14 @@
<para style="terp_tblheader_Details">Balance: </para>
</td>
<td>
<para style="terp_default_Right_9">[[ formatLang((reduce(lambda x,y: x+(y['debit'] - y['credit']), getLines(o), 0.00))) ]] [[ company.currency_id.symbol]] </para>
<para style="terp_tblheader_Details_Right">[[ formatLang((reduce(lambda x,y: x+(y['debit'] - y['credit']), getLines(o), 0.00))) ]] [[ company.currency_id.symbol]] </para>
</td>
<td>
<para style="terp_default_Right_9">
<font color="white"> </font>
</para>
</td>
<td>
<para style="Standard">
<font color="white"> </font>
</para>
</td>
<td>
<para style="Standard">
<para style="terp_default_8">
<font color="white"> </font>
</para>
</td>
</tr>
</blockTable>
<para style="terp_default_8">
<font color="white"> </font>
</para>
</story>
</document>
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 12:09+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 09:39+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<document filename="test.pdf">
<template pageSize="(595.0,842.0)" title="Invoices" author="OpenERP S.A. (sales@openerp.com)" allowSplitting="20">
<document filename="Invoices.pdf">
<template pageSize="(595.0,842.0)" title="Invoices" author="OpenERP S.A.(sales@openerp.com)" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="28.0" y1="28.0" width="539" height="786"/>
</pageTemplate>
@@ -185,18 +185,18 @@
</para>
</td>
<td>
<para style="terp_default_9">[[ o.partner_id.title.name or '' ]] [[ o.partner_id.name ]]</para>
<para style="terp_default_9">[[ o.address_invoice_id.street ]]</para>
<para style="terp_default_9">[[ o.address_invoice_id.street2 or removeParentNode('para') ]]</para>
<para style="terp_default_9">[[ o.address_invoice_id.zip or '' ]][[ o.address_invoice_id.city or '' ]]</para>
<para style="terp_default_9">[[ (o.address_invoice_id.state_id and o.address_invoice_id.state_id.name) or removeParentNode('para')]]</para>
<para style="terp_default_9">[[ o.address_invoice_id.country_id and o.address_invoice_id.country_id.name or '' ]]</para>
<para style="terp_default_9">
<para style="terp_default_8">[[ (o.partner_id and o.partner_id.title and o.partner_id.title.name) or '' ]] [[ (o.partner_id and o.partner_id.name) or '' ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.street) or '' ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.street2) or removeParentNode('para') ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.zip) or '' ]] [[ (o.address_invoice_id and o.address_invoice_id.city) or '' ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.state_id and o.address_invoice_id.state_id.name) or removeParentNode('para') ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.country_id and o.address_invoice_id.country_id.name) or '' ]]</para>
<para style="terp_default_8">
<font color="white"> </font>
</para>
<para style="terp_default_9">Tel. : [[ o.address_invoice_id.phone or removeParentNode('para') ]]</para>
<para style="terp_default_9">Fax : [[ o.address_invoice_id.fax or removeParentNode('para') ]]</para>
<para style="terp_default_9">VAT : [[ o.partner_id.vat or removeParentNode('para') ]]</para>
<para style="terp_default_8">Tel. : [[ (o.address_invoice_id and o.address_invoice_id.phone) or removeParentNode('para') ]]</para>
<para style="terp_default_8">Fax : [[ (o.address_invoice_id and o.address_invoice_id.fax) or removeParentNode('para') ]]</para>
<para style="terp_default_8">VAT : [[ (o.partner_id and o.partner_id.vat) or removeParentNode('para') ]]</para>
</td>
</tr>
</blockTable>
@@ -238,7 +238,7 @@
<para style="terp_default_Centre_8">[[ formatLang(o.date_invoice,date=True) ]]</para>
</td>
<td>
<para style="terp_default_Centre_8">[[ o.address_invoice_id.partner_id.ref or '' ]]</para>
<para style="terp_default_Centre_9">[[ (o.address_invoice_id and o.address_invoice_id.partner_id and o.address_invoice_id.partner_id.ref) or ' ' ]]</para>
</td>
</tr>
</blockTable>
@@ -416,10 +416,10 @@
<para style="terp_default_8">
<font color="white"> </font>
</para>
<blockTable colWidths="105.0,52.0,62.0,320.0" style="Table7">
<blockTable colWidths="206.0,50.0,52.0,230.0" style="Table7">
<tr>
<td>
<para style="terp_tblheader_Details">Tax</para>
<para style="terp_tblheader_Details">Tax [[ o.tax_line==[] and removeParentNode('blockTable') ]]</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">Base</para>
@@ -436,16 +436,16 @@
</blockTable>
<section>
<para style="terp_default_8">[[ repeatIn(o.tax_line,'t') ]]</para>
<blockTable colWidths="105.0,51.0,63.0,320.0" style="Table8">
<blockTable colWidths="206.0,49.0,52.0,230.0" style="Table8">
<tr>
<td>
<para style="terp_default_8">[[ t.name ]]</para>
</td>
<td>
<para style="terp_default_Right_8">[[ formatLang(t.base, digits=get_digits(dp='Account')) ]]</para>
<para style="terp_default_Right_8">[[ formatLang(t.base, digits=get_digits(dp='Account')) ]] [[ o.currency_id.symbol ]]</para>
</td>
<td>
<para style="terp_default_Right_8">[[ (t.tax_code_id and t.tax_code_id.notprintable) and removeParentNode('blockTable') or '' ]] [[ formatLang(t.amount, digits=get_digits(dp='Account')) ]]</para>
<para style="terp_default_Right_8">[[ (t.tax_code_id and t.tax_code_id.notprintable) and removeParentNode('blockTable') or '' ]] [[ formatLang(t.amount, digits=get_digits(dp='Account')) ]] [[ o.currency_id.symbol ]]</para>
</td>
<td>
<para style="terp_default_Right_8">
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<document filename="test.pdf">
<template pageSize="(595.0,842.0)" title="Invoices" author="OpenERP S.A. (sales@openerp.com)" allowSplitting="20">
<document filename="Invoices.pdf">
<template pageSize="(595.0,842.0)" title="Invoices" author="OpenERP S.A.(sales@openerp.com)" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="28.0" y1="28.0" width="539" height="786"/>
</pageTemplate>
@@ -189,18 +189,18 @@
</para>
</td>
<td>
<para style="terp_default_9">[[ o.partner_id.title.name or '' ]] [[ o.partner_id.name ]]</para>
<para style="terp_default_9">[[ o.address_invoice_id.street ]]</para>
<para style="terp_default_9">[[ o.address_invoice_id.street2 or removeParentNode('para')]]</para>
<para style="terp_default_9">[[ o.address_invoice_id.zip or '' ]][[ o.address_invoice_id.city or '' ]]</para>
<para style="terp_default_9">[[ (o.address_invoice_id.state_id and o.address_invoice_id.state_id.name) or removeParentNode('para') ]]</para>
<para style="terp_default_9">[[ o.address_invoice_id.country_id and o.address_invoice_id.country_id.name or '' ]]</para>
<para style="terp_default_9">
<para style="terp_default_8">[[ (o.partner_id and o.partner_id.title and o.partner_id.title.name) or '' ]] [[ (o.partner_id and o.partner_id.name) or '' ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.street) or '' ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.street2) or removeParentNode('para') ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.zip) or '' ]] [[ (o.address_invoice_id and o.address_invoice_id.city) or '' ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.state_id and o.address_invoice_id.state_id.name) or removeParentNode('para') ]]</para>
<para style="terp_default_8">[[ (o.address_invoice_id and o.address_invoice_id.country_id and o.address_invoice_id.country_id.name) or '' ]]</para>
<para style="terp_default_8">
<font color="white"> </font>
</para>
<para style="terp_default_9">Tel. : [[ o.address_invoice_id.phone or removeParentNode('para') ]]</para>
<para style="terp_default_9">Fax : [[ o.address_invoice_id.fax or removeParentNode('para') ]]</para>
<para style="terp_default_9">VAT : [[ o.partner_id.vat or removeParentNode('para') ]]</para>
<para style="terp_default_8">Tel. : [[ (o.address_invoice_id and o.address_invoice_id.phone) or removeParentNode('para') ]]</para>
<para style="terp_default_8">Fax : [[ (o.address_invoice_id and o.address_invoice_id.fax) or removeParentNode('para') ]]</para>
<para style="terp_default_8">VAT : [[ (o.partner_id and o.partner_id.vat) or removeParentNode('para') ]]</para>
</td>
</tr>
</blockTable>
@@ -242,7 +242,7 @@
<para style="terp_default_Centre_9">[[ formatLang(o.date_invoice,date=True) ]]</para>
</td>
<td>
<para style="terp_default_Centre_9">[[ o.address_invoice_id.partner_id.ref or '' ]]</para>
<para style="terp_default_Centre_9">[[ (o.address_invoice_id and o.address_invoice_id.partner_id and o.address_invoice_id.partner_id.ref) or ' ' ]]</para>
</td>
</tr>
</blockTable>
@@ -420,10 +420,10 @@
<para style="terp_default_8">
<font color="white"> </font>
</para>
<blockTable colWidths="119.0,50.0,59.0,310.0" style="Table7">
<blockTable colWidths="209.0,54.0,46.0,229.0" style="Table7">
<tr>
<td>
<para style="terp_tblheader_Details">Tax</para>
<para style="terp_tblheader_Details">Tax [[ o.tax_line==[] and removeParentNode('blockTable') ]]</para>
</td>
<td>
<para style="terp_tblheader_Details_Right">Base</para>
@@ -439,17 +439,17 @@
</tr>
</blockTable>
<section>
<para style="terp_default_8">[[ repeatIn(o.tax_line,'t') ]]</para>
<blockTable colWidths="120.0,49.0,60.0,310.0" style="Table8">
<para style="terp_default_1">[[ repeatIn(o.tax_line,'t') ]]</para>
<blockTable colWidths="209.0,55.0,46.0,229.0" style="Table8">
<tr>
<td>
<para style="terp_default_8">[[ t.name ]]</para>
</td>
<td>
<para style="terp_default_Right_8">[[ formatLang(t.base, digits=get_digits(dp='Account')) ]]</para>
<para style="terp_default_Right_8">[[ formatLang(t.base, digits=get_digits(dp='Account')) ]] [[ o.currency_id.symbol ]]</para>
</td>
<td>
<para style="terp_default_Right_8">[[ (t.tax_code_id and t.tax_code_id.notprintable) and removeParentNode('blockTable') or '' ]] [[ formatLang(t.amount, digits=get_digits(dp='Account')) ]]</para>
<para style="terp_default_Right_8">[[ (t.tax_code_id and t.tax_code_id.notprintable) and removeParentNode('blockTable') or '' ]] [[ formatLang(t.amount, digits=get_digits(dp='Account')) ]] [[ o.currency_id.symbol ]]</para>
</td>
<td>
<para style="terp_default_Right_8">
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 06:58+0000\n"
"Last-Translator: Jacara <Unknown>\n"
"PO-Revision-Date: 2010-10-15 09:14+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Mongolian <mn@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+6 -6
View File
@@ -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 <chertykov@gmail.com>\n"
"PO-Revision-Date: 2010-10-15 11:34+0000\n"
"Last-Translator: Nikolay Chesnokov <chesnokov_n@msn.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-30 04:43+0000\n"
"X-Launchpad-Export-Date: 2010-10-16 04:48+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
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 13:06+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 09:18+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 13:59+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 09:23+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 14:04+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 08:46+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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_tax_include
+1 -2
View File
@@ -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
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 14:35+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 09:35+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-06-18 10:59+0000\n"
"PO-Revision-Date: 2010-10-14 15:01+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 08:47+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 15:09+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 09:19+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 15:16+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 09:40+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+37 -32
View File
@@ -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) <Unknown>\n"
"PO-Revision-Date: 2010-10-15 12:05+0000\n"
"Last-Translator: Nikolay Chesnokov <chesnokov_n@msn.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:13+0000\n"
"X-Launchpad-Export-Date: 2010-10-16 04:48+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 "Удаленные логи"
@@ -114,6 +114,7 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_base_action_rule_tree"/>
<field name="help">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.</field>
</record>
<menuitem id="menu_base_action_rule_form"
+16 -16
View File
@@ -306,7 +306,7 @@ class calendar_attendee(osv.osv):
res = obj.read(cr, uid, ids, ['object', 'name'], context=context)
return [(r['object'], r['name']) for r in res]
def _lang_get(self, cr, uid, context={}):
def _lang_get(self, cr, uid, context=None):
"""
Get language for language selection field.
@param cr: the current row, from the database cursor,
@@ -912,10 +912,10 @@ class calendar_event(osv.osv):
_description = "Calendar Event"
__attribute__ = {}
def _tz_get(self, cr, uid, context={}):
def _tz_get(self, cr, uid, context=None):
return [(x.lower(), x) for x in pytz.all_timezones]
def onchange_allday(self, cr, uid, ids, allday, context={}):
def onchange_allday(self, cr, uid, ids, allday, context=None):
"""Sets duration as 24 Hours if event is selcted for all day
@param self: The object pointer
@param cr: the current row, from the database cursor,
@@ -1017,7 +1017,8 @@ class calendar_event(osv.osv):
elif int(val.get('interval')) > 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)
@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_calendar_attendee calendar.attendee model_calendar_attendee base.group_user 1 1 1 0 1
3 access_calendar_alarm calendar.alarm model_calendar_alarm base.group_user 1 1 1 1
4 access_res_alarm res.alarm model_res_alarm base.group_user 1 1 1 1
5 access_calendar_todo calendar.todo model_calendar_todo base.group_user 1 1 1 1
+68 -65
View File
@@ -8,35 +8,36 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2010-10-15 11:50+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-09-29 04:58+0000\n"
"X-Launchpad-Export-Date: 2010-10-16 04:47+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"
+12 -12
View File
@@ -8,57 +8,57 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2010-10-15 11:58+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-09-29 04:52+0000\n"
"X-Launchpad-Export-Date: 2010-10-16 04:47+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"
+10 -10
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 15:37+0000\n"
"PO-Revision-Date: 2010-10-15 12:04+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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: 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
+60 -50
View File
@@ -8,99 +8,100 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2010-10-15 12:24+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-09-29 04:58+0000\n"
"X-Launchpad-Export-Date: 2010-10-16 04:47+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"
+97 -88
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2010-10-15 12:52+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-09-29 05:12+0000\n"
"X-Launchpad-Export-Date: 2010-10-16 04:48+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"
+29 -25
View File
@@ -8,89 +8,89 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2010-10-15 13:03+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-09-29 05:08+0000\n"
"X-Launchpad-Export-Date: 2010-10-16 04:48+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"
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 15:31+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 08:51+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 15:18+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 08:42+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+1 -1
View File
@@ -26,7 +26,7 @@
'description': """Base module for all dashboards.""",
'author': 'OpenERP SA',
'depends': ['base'],
'update_xml': ['security/board_security.xml','security/ir.model.access.csv', 'wizard/board_menu_create_view.xml', 'board_view.xml'],
'update_xml': ['security/board_security.xml','security/ir.model.access.csv', 'wizard/board_menu_create_view.xml', 'board_view.xml','board_administration_view.xml'],
'demo_xml': [],
'installable': True,
'active': False,
+100
View File
@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Latest Activities -->
<record model="ir.ui.view" id="view_latest_activities_tree">
<field name="name">latest.activities.tree</field>
<field name="model">res.log</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Latest Activities">
<field name="name"/>
<field name="create_date"/>
<field name="user_id" />
<field name="res_model"/>
<field name="res_id"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="action_latest_activities_tree">
<field name="name">Latest Activities</field>
<field name="res_model">res.log</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_latest_activities_tree"></field>
</record>
<record id="board_administration_form" model="ir.ui.view">
<field name="name">board.administration.form</field>
<field name="model">board.board</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Administration Dashboard">
<hpaned position="100">
<child1>
<action name="%(action_latest_activities_tree)d" string="Latest Activities" sequence="1"/>
</child1>
<child2>
</child2>
</hpaned>
</form>
</field>
</record>
<record id="open_board_administration_form" model="ir.actions.act_window">
<field name="name">Administration Dashboard</field>
<field name="res_model">board.board</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="board_administration_form"/>
</record>
<menuitem id="menu_reporting" name="Reporting" parent="base.menu_administration" sequence="11"
groups="base.group_extended"/>
<menuitem id="board.admin_menu_dasboard" name="Dashboard" sequence="0" parent="menu_reporting"/>
<menuitem id="menu_board_admin" action="open_board_administration_form" icon="terp-graph" parent="board.admin_menu_dasboard" />
<!-- User Connection -->
<record model="ir.ui.view" id="view_user_connection_tree">
<field name="name">user.connection.tree</field>
<field name="model">res.users</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Latest Connections">
<field name="name"/>
<field name="date"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="action_user_connection_tree">
<field name="name">Latest Connections</field>
<field name="res_model">res.users</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_user_connection_tree"></field>
</record>
<record id="board_user_connection_form" model="ir.ui.view">
<field name="name">board.user.connection.form</field>
<field name="model">board.board</field>
<field name="type">form</field>
<field name="inherit_id" ref="board_administration_form"/>
<field name="arch" type="xml">
<xpath expr="/form/hpaned/child1/action[@string='Latest Activities']" position="after">
<action width="510" name="%(action_user_connection_tree)d" string="Latest Connections" />
</xpath>
</field>
</record>
</data>
</openerp>
+9 -5
View File
@@ -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,
+233 -175
View File
@@ -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
+88
View File
@@ -0,0 +1,88 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- /calendars tree -->
<record id="document_directory_calendars0" model="document.directory">
<field name="domain">[]</field>
<field eval="1" name="resource_find_all"/>
<field eval="0" name="ressource_tree"/>
<field name="user_id" ref="base.user_root"/>
<field name="company_id" ref="base.main_company"/>
<field name="storage_id" ref="document.storage_default"/>
<field name="type">directory</field>
<field eval="[(6,0,[])]" name="group_ids"/>
<field name="name">calendars</field>
</record>
<record id="document_directory_resources1" model="document.directory">
<field name="domain">[]</field>
<field eval="1" name="resource_find_all"/>
<field eval="0" name="ressource_tree"/>
<field name="company_id" ref="base.main_company"/>
<field model="document.directory" name="parent_id" ref="document_directory_calendars0"/>
<field name="type">directory</field>
<field eval="[(6,0,[])]" name="group_ids"/>
<field name="name">resources</field>
</record>
<record id="document_directory_uids0" model="document.directory">
<field name="domain">[]</field>
<field eval="1" name="resource_find_all"/>
<field eval="0" name="ressource_tree"/>
<field name="user_id" ref="base.user_root"/>
<field name="company_id" ref="base.main_company"/>
<field model="document.directory" name="parent_id" ref="document_directory_calendars0"/>
<field name="type">ressource</field>
<field name="ressource_type_id" ref="base.model_res_users"/>
<field eval="[(6,0,[ref('base.group_system')])]" name="group_ids"/>
<field name="name">__uids__</field>
</record>
<record id="document_directory_users0" model="document.directory">
<field name="domain">[]</field>
<field eval="1" name="resource_find_all"/>
<field eval="0" name="ressource_tree"/>
<field name="resource_field" ref="base.field_res_users_login"/>
<field name="company_id" ref="base.main_company"/>
<field model="document.directory" name="parent_id" ref="document_directory_calendars0"/>
<field name="storage_id" ref="document.storage_default"/>
<field name="type">ressource</field>
<field name="ressource_type_id" ref="base.model_res_users"/>
<field eval="[(6,0,[])]" name="group_ids"/>
<field name="name">users</field>
</record>
<record id="document_directory_dctx_0" model="document.directory.dctx">
<field model="document.directory" name="dir_id" ref="document_directory_users0"/>
<field name="field">user_id</field>
<field name="expr">res_id</field>
</record>
<record id="document_directory_c0" model="document.directory">
<field name="domain">[]</field>
<field eval="1" name="resource_find_all"/>
<field name="user_id" ref="base.user_root"/>
<field name="company_id" ref="base.main_company"/>
<field model="document.directory" name="parent_id" ref="document_directory_users0"/>
<field name="storage_id" ref="document.storage_default"/>
<field name="type">directory</field>
<field eval="[(6,0,[])]" name="group_ids"/>
<field name="name">c</field>
<field eval="1" name="calendar_collection"/>
</record>
<record id="document_directory_groups1" model="document.directory">
<field name="domain">[]</field>
<field eval="1" name="resource_find_all"/>
<field eval="0" name="ressource_tree"/>
<field name="company_id" ref="base.main_company"/>
<field model="document.directory" name="parent_id" ref="document_directory_calendars0"/>
<field name="storage_id" ref="document.storage_default"/>
<field name="type">directory</field>
<field eval="[(6,0,[])]" name="group_ids"/>
<field name="name">groups</field>
</record>
<record id="document_webdav_dir_property_calendarhomeset0" model="document.webdav.dir.property">
<field model="document.directory" name="dir_id" ref="document_directory_calendars0"/>
<field name="namespace">urn:ietf:params:xml:ns:caldav</field>
<!-- no parent, it is a global property -->
<field name="name">calendar-home-set</field>
<field name="value">('href','DAV:','/%s/%s/calendars/users/%s/c' % ('webdav',dbname,username) )</field>
<field eval="1" name="do_subst"/>
</record>
</data>
</openerp>
+3
View File
@@ -74,6 +74,9 @@
<field name="type"/>
<field name="user_id"/>
<field name="collection_id" required="1"/>
<field name="has_webcal" groups="base.group_extended" />
<field name="calendar_color" groups="base.group_extended" />
<field name="calendar_order" groups="base.group_extended" />
<notebook colspan="4">
<page string="Calendar Lines">
<field name="line_ids" mode="form,tree" colspan="4" nolabel="1">
+79 -7
View File
@@ -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 <name>.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'
+20 -10
View File
@@ -18,9 +18,11 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
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
+43
View File
@@ -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
+97
View File
@@ -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.
+48
View File
@@ -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 <http://www.gnu.org/licenses/>.
#
##############################################################################
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
@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
3 access_basic_calendar_attributes basic.calendar.attributes model_basic_calendar_attributes base.group_user 1 1 1 1
4 access_basic_calendar_fields basic.calendar.fields model_basic_calendar_fields base.group_user 1 1 1 1
5 access_basic_calendar basic.calendar model_basic_calendar base.group_user 1 1 1 1
6 access_basic_calendar_alias basic.calendar.alias model_basic_calendar_alias base.group_user 1 1 1 1
@@ -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)
@@ -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')
@@ -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'])
-19
View File
@@ -41,25 +41,6 @@ class crm_lead(crm_case, osv.osv):
_description = "Lead"
_order = "date_action, priority, id desc"
_inherit = ['mailgate.thread','res.partner.address']
def fields_view_get(self, cr, uid, view_id=None, view_type='form',
context=None, toolbar=False, submenu=False):
"""
Changes the view dynamically
@param self: The object pointer.
@param cr: A database cursor
@param uid: ID of the user currently logged in
@param context: A standard dictionary
@return: New arch of view.
"""
if not context:
context={}
res = super(crm_lead, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar,submenu=False)
if view_type == 'form':
if res['toolbar']['action'] and res['toolbar']['action'][0]['res_model']=='crm.merge.opportunity':
res['toolbar']['action']=[]
return res
def _compute_day(self, cr, uid, ids, fields, args, context={}):
"""
@param cr: the current row, from the database cursor,
+1 -1
View File
@@ -10,7 +10,7 @@
<field name="view_id" ref="crm_case_tree_view_leads"/>
<field name="search_view_id" ref="crm.view_crm_case_leads_filter"/>
<field name="context">{'search_default_current':1, 'default_type': 'lead', 'search_default_section_id': section_id}</field>
<field name="help">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.</field>
<field name="help">'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.</field>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_tree_view_leads_all">
+2
View File
@@ -11,6 +11,7 @@
<field name="view_id" ref="crm.crm_case_stage_tree"/>
<field name="domain">[('object_id.model', '=', 'crm.lead')]</field>
<field name="context">{'object_id':'crm.lead'}</field>
<field name="help">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.</field>
</record>
<menuitem action="crm_lead_stage_act" id="menu_crm_lead_stage_act" name="Stages"
@@ -26,6 +27,7 @@
<field name="view_type">form</field>
<field name="view_id" ref="crm_case_categ_tree-view"/>
<field name="domain">[('object_id.model', '=', 'crm.lead')]</field>
<field name="help">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.</field>
</record>
<menuitem action="crm_lead_categ_action"
+3 -2
View File
@@ -51,7 +51,7 @@
<field name="view_id" ref="crm_case_calendar_view_meet"/>
<field name="context">{"search_default_user_id":uid, 'search_default_section_id': section_id}</field>
<field name="search_view_id" ref="view_crm_case_meetings_filter"/>
<field name="help">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.</field>
<field name="help">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.</field>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_calendar_meet">
@@ -106,12 +106,13 @@
<field name="view_id" ref="base_calendar.base_calendar_attendee_tree_view" />
<field name="domain">[('ref','like','crm.meeting,')]</field>
<field name="context">{"search_default_toreview":1, "search_default_user_id":uid}</field>
<field name="help">'Meeting Invitations' allows you to create and manage the meeting invitations sent/to be sent to your colleagues/partners.</field>
</record>
<menuitem id="menu_attendee_invitations"
name="Meeting Invitations" parent="crm.menu_meeting_sale"
sequence="10" action="action_view_attendee_form"
groups="base.group_extended,base.group_sale_salesman" />
groups="base.group_no_one" />
</data>
</openerp>
+2 -9
View File
@@ -31,16 +31,9 @@
<field name="context">{'search_default_user_id':uid,'search_default_current':1, 'search_default_section_id':section_id,'default_type': 'opportunity'}</field>
<field name="view_id" ref="crm_case_tree_view_oppor"/>
<field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/>
<field name="help">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.
<field name="help">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.</field>
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.</field>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_tree_view_oppor11">
+2 -2
View File
@@ -69,7 +69,7 @@
<field name="domain" eval="'[(\'categ_id\',\'=\','+str(ref('categ_phone1'))+')]'"/>
<field name="context" eval="'{\'search_default_section_id\':section_id, \'set_editable\':True,\'default_state\':\'open\', \'search_default_current\':1,\'search_default_today\':1, \'default_categ_id\': ' + str(ref('categ_phone1')) +'}'"/>
<field name="search_view_id" ref="crm.view_crm_case_phonecalls_filter"/>
<field name="help">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.</field>
<field name="help">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.</field>
</record>
@@ -107,7 +107,7 @@
<field name="domain" eval="'[(\'categ_id\',\'=\','+str(ref('categ_phone2'))+')]'"/>
<field name="context" eval="'{\'search_default_section_id\':section_id, \'default_state\':\'open\', \'search_default_current\':1, \'default_categ_id\': ' + str(ref('categ_phone2')) +'}'"/>
<field name="search_view_id" ref="crm.view_crm_case_phonecalls_filter"/>
<field name="help">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.</field>
<field name="help">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.</field>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_tree_phone_outgoing0">
+1
View File
@@ -11,6 +11,7 @@
<field name="view_id" ref="crm.crm_case_categ_tree-view"/>
<field name="domain">[('object_id.model', '=', 'crm.phonecall')]</field>
<field name="context">{'object_id':'crm.phonecall'}</field>
<field name="help">Create specific phone call categories to better sort the type of calls tracked in the system.</field>
</record>
<menuitem action="crm_phonecall_categ_action" name="Categories"
+1
View File
@@ -85,6 +85,7 @@
<field name="res_model">crm.case.section</field>
<field name="view_type">form</field>
<field name="view_id" ref="crm_case_section_view_tree"/>
<field name="help">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.</field>
</record>
<menuitem action="crm_case_section_act"
+2 -2
View File
@@ -202,7 +202,7 @@
<field name="context">{'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':[]}</field>
<field name="view_mode">tree,graph</field>
<field name="domain">[('type', '=', 'lead')]</field>
<field name="help">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.</field>
<field name="help">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.</field>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_lead_tree">
@@ -226,7 +226,7 @@
<field name="context">{"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':[]}</field>
<field name="view_mode">tree,graph</field>
<field name="domain">[('type', '=', 'opportunity')]</field>
<field name="help">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.</field>
<field name="help">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.</field>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_opportunity_tree">
@@ -159,7 +159,7 @@
<field name="context">{"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}</field>
<field name="view_id" ref="view_report_crm_phonecall_tree"/>
<field name="search_view_id" ref="view_report_crm_phonecall_filter"/>
<field name="help">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.</field>
<field name="help">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.</field>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_phonecall_tree">
@@ -35,9 +35,10 @@
</record>
<act_window id="action_merge_opportunities"
multi="True"
key2="client_action_multi" name="Merge Opportunities"
res_model="crm.merge.opportunity" src_model="crm.lead"
view_mode="form" target="new" view_type="form" />
</data>
</openerp>
</openerp>
+14 -14
View File
@@ -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:
+1 -1
View File
@@ -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
+287
View File
@@ -0,0 +1,287 @@
<?xml version="1.0"?>
<openerp>
<data noupdate="1">
<record id="basic_calendar_meetings0" model="basic.calendar">
<field eval="1" name="has_webcal"/>
<field name="description">Meetings per user</field>
<field name="calendar_color">#1E25FF</field>
<field model="document.directory" name="collection_id" ref="caldav.document_directory_c0"/>
<field name="type">vevent</field>
<field name="name">Meetings</field>
</record>
<record id="basic_calendar_lines_attendee0" model="basic.calendar.lines">
<field name="calendar_id" ref="basic_calendar_meetings0"/>
<field name="domain">[]</field>
<field name="name">attendee</field>
<field name="object_id" ref="base_calendar.model_calendar_attendee"/>
</record>
<record id="basic_calendar_lines_valarm0" model="basic.calendar.lines">
<field name="calendar_id" ref="basic_calendar_meetings0"/>
<field name="domain">[]</field>
<field name="name">valarm</field>
<field name="object_id" ref="base_calendar.model_calendar_alarm"/>
</record>
<record id="basic_calendar_lines_vevent0" model="basic.calendar.lines">
<field name="calendar_id" ref="basic_calendar_meetings0"/>
<field name="domain">[('user_id','=', dctx_user_id)]</field>
<field name="name">vevent</field>
<field name="object_id" ref="crm.model_crm_meeting"/>
</record>
<record id="basic_calendar_fields_1" model="basic.calendar.fields">
<field name="name" ref="caldav.field_alarm_attendee"/>
<field name="type_id" ref="basic_calendar_lines_valarm0"/>
<field name="field_id" ref="base_calendar.field_calendar_alarm_attendee_ids"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_2" model="basic.calendar.fields">
<field name="name" ref="caldav.field_alarm_trigger_duration"/>
<field name="type_id" ref="basic_calendar_lines_valarm0"/>
<field name="field_id" ref="base_calendar.field_res_alarm_trigger_duration"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_3" model="basic.calendar.fields">
<field name="name" ref="caldav.field_alarm_description"/>
<field name="type_id" ref="basic_calendar_lines_valarm0"/>
<field name="field_id" ref="base_calendar.field_calendar_alarm_description"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_4" model="basic.calendar.fields">
<field name="name" ref="caldav.field_alarm_attach"/>
<field name="type_id" ref="basic_calendar_lines_valarm0"/>
<field name="field_id" ref="base_calendar.field_calendar_alarm_attach"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_5" model="basic.calendar.fields">
<field name="name" ref="caldav.field_alarm_trigger_occurs"/>
<field name="type_id" ref="basic_calendar_lines_valarm0"/>
<field name="field_id" ref="base_calendar.field_res_alarm_trigger_occurs"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_6" model="basic.calendar.fields">
<field name="name" ref="caldav.field_alarm_trigger_interval"/>
<field name="type_id" ref="basic_calendar_lines_valarm0"/>
<field name="field_id" ref="base_calendar.field_res_alarm_trigger_interval"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_7" model="basic.calendar.fields">
<field name="name" ref="caldav.field_alarm_summary"/>
<field name="type_id" ref="basic_calendar_lines_valarm0"/>
<field name="field_id" ref="base_calendar.field_calendar_alarm_name"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_8" model="basic.calendar.fields">
<field name="name" ref="caldav.field_alarm_duration"/>
<field name="type_id" ref="basic_calendar_lines_valarm0"/>
<field name="field_id" ref="base_calendar.field_res_alarm_duration"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_9" model="basic.calendar.fields">
<field name="name" ref="caldav.field_alarm_repeat"/>
<field name="type_id" ref="basic_calendar_lines_valarm0"/>
<field name="field_id" ref="base_calendar.field_res_alarm_repeat"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_10" model="basic.calendar.fields">
<field name="name" ref="caldav.field_alarm_action"/>
<field name="type_id" ref="basic_calendar_lines_valarm0"/>
<field name="field_id" ref="base_calendar.field_calendar_alarm_action"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_11" model="basic.calendar.fields">
<field name="name" ref="caldav.field_alarm_trigger_related"/>
<field name="type_id" ref="basic_calendar_lines_valarm0"/>
<field name="field_id" ref="base_calendar.field_res_alarm_trigger_related"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_12" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_organizer"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="crm.field_crm_meeting_organizer"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_13" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_uid"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_id"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_14" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_recurrence-id"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_recurrent_id"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_15" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_vtimezone"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_vtimezone"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_16" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_attendee"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="crm.field_crm_meeting_attendee_ids"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_17" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_rrule"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_rrule"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_18" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_dtend"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_date_deadline"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_19" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_valarm"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_base_calendar_alarm_id"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_20" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_location"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_location"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_21" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_exrule"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_exrule"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_22" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_status"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="crm.field_crm_meeting_state"/>
<field name="mapping">{'tentative': 'draft', 'confirmed': 'open', 'cancelled': 'cancel'}</field>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_23" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_exdate"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_exdate"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_24" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_dtstamp"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_date"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_25" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_description"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_description"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_26" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_dtstart"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_date"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_27" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_class"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_class"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_28" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_created"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_create_date"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_29" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_url"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_base_calendar_url"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_30" model="basic.calendar.fields">
<field name="name" ref="caldav.field_event_summary"/>
<field name="type_id" ref="basic_calendar_lines_vevent0"/>
<field name="field_id" ref="base_calendar.field_calendar_event_name"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_31" model="basic.calendar.fields">
<field name="name" ref="caldav.field_attendee_cn"/>
<field name="type_id" ref="basic_calendar_lines_attendee0"/>
<field name="field_id" ref="base_calendar.field_calendar_attendee_cn"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_32" model="basic.calendar.fields">
<field name="name" ref="caldav.field_attendee_sent-by"/>
<field name="type_id" ref="basic_calendar_lines_attendee0"/>
<field name="field_id" ref="base_calendar.field_calendar_attendee_sent_by"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_33" model="basic.calendar.fields">
<field name="name" ref="caldav.field_attendee_language"/>
<field name="type_id" ref="basic_calendar_lines_attendee0"/>
<field name="field_id" ref="base_calendar.field_calendar_attendee_language"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_34" model="basic.calendar.fields">
<field name="name" ref="caldav.field_attendee_delegated-from"/>
<field name="type_id" ref="basic_calendar_lines_attendee0"/>
<field name="field_id" ref="base_calendar.field_calendar_attendee_delegated_from"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_35" model="basic.calendar.fields">
<field name="name" ref="caldav.field_attendee_member"/>
<field name="type_id" ref="basic_calendar_lines_attendee0"/>
<field name="field_id" ref="base_calendar.field_calendar_attendee_member"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_36" model="basic.calendar.fields">
<field name="name" ref="caldav.field_attendee_cutype"/>
<field name="type_id" ref="basic_calendar_lines_attendee0"/>
<field name="field_id" ref="base_calendar.field_calendar_attendee_cutype"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_37" model="basic.calendar.fields">
<field name="name" ref="caldav.field_attendee_role"/>
<field name="type_id" ref="basic_calendar_lines_attendee0"/>
<field name="field_id" ref="base_calendar.field_calendar_attendee_role"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_38" model="basic.calendar.fields">
<field name="name" ref="caldav.field_attendee_partstat"/>
<field name="type_id" ref="basic_calendar_lines_attendee0"/>
<field name="field_id" ref="base_calendar.field_calendar_attendee_state"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_39" model="basic.calendar.fields">
<field name="name" ref="caldav.field_attendee_delegated-to"/>
<field name="type_id" ref="basic_calendar_lines_attendee0"/>
<field name="field_id" ref="base_calendar.field_calendar_attendee_delegated_to"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_40" model="basic.calendar.fields">
<field name="name" ref="caldav.field_attendee_dir"/>
<field name="type_id" ref="basic_calendar_lines_attendee0"/>
<field name="field_id" ref="base_calendar.field_calendar_attendee_dir"/>
<field name="fn">field</field>
</record>
<record id="basic_calendar_fields_41" model="basic.calendar.fields">
<field name="name" ref="caldav.field_attendee_rsvp"/>
<field name="type_id" ref="basic_calendar_lines_attendee0"/>
<field name="field_id" ref="base_calendar.field_calendar_attendee_rsvp"/>
<field name="fn">field</field>
</record>
</data>
</openerp>
+1 -1
View File
@@ -16,7 +16,7 @@
<field name="view_id" ref="crm_case_claims_tree_view"/>
<field name="context">{'search_default_section_id': section_id, "search_default_current":1,"search_default_user_id":uid}</field>
<field name="search_view_id" ref="crm_claim.view_crm_case_claims_filter"/>
<field name="help">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.). </field>
<field name="help">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.</field>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_tree_claim0">
@@ -196,6 +196,7 @@
<field name="context">{"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}</field>
<field name="view_id" ref="view_report_crm_claim_tree"/>
<field name="search_view_id" ref="view_report_crm_claim_filter"/>
<field name="help">Have a general overview of all claims processed in the system by sorting them with specific criteria.</field>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_claim_tree">
@@ -15,7 +15,7 @@
<field name="view_id" ref="crm_fundraising.crm_case_tree_view_fund"/>
<field name="context">{"search_default_user_id":uid,"search_default_current":1, 'search_default_section_id': section_id}</field>
<field name="search_view_id" ref="crm_fundraising.view_crm_case_fund_filter"/>
<field name="help">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.</field>
<field name="help">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.</field>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_tree_view_fund_all1">
@@ -172,7 +172,7 @@
<field name="context">{"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}</field>
<field name="view_id" ref="view_report_crm_fundraising_tree"/>
<field name="search_view_id" ref="view_report_crm_fundraising_filter"/>
<field name="help">With Fund Raising get at a glance a view to your fund raising campaigns with the estimated revenue, average probability and delay to close.</field>
<field name="help">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.</field>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_fundrising_tree">
+1 -1
View File
@@ -13,7 +13,7 @@
<field name="view_id" ref="crm_case_tree_view_helpdesk"/>
<field name="context">{"search_default_user_id":uid, 'search_default_section_id': section_id}</field>
<field name="search_view_id" ref="view_crm_case_helpdesk_filter"/>
<field name="help">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.</field>
<field name="help">'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.</field>
</record>
<record model="ir.actions.act_window.view" id="action_crm_sec_tree_view_act111">
@@ -162,7 +162,7 @@
<field name="context">{"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}</field>
<field name="view_id" ref="view_report_crm_helpdesk_tree"/>
<field name="search_view_id" ref="view_report_crm_helpdesk_filter"/>
<field name="help">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.</field>
<field name="help">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.</field>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_helpdesk_tree">
@@ -14,6 +14,7 @@
<field name="res_model">crm_profiling.questionnaire</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="help">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.</field>
</record>
<menuitem parent="base.menu_crm_config_lead" id="menu_segm_questionnaire"
+173
View File
@@ -0,0 +1,173 @@
# 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 <EMAIL@ADDRESS>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-15 11:26+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-10-16 04:48+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"
+4 -4
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <chertykov@gmail.com>\n"
"PO-Revision-Date: 2010-10-15 12:07+0000\n"
"Last-Translator: Nikolay Chesnokov <chesnokov_n@msn.com>\n"
"Language-Team: Russian <ru@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-10-01 08:47+0000\n"
"X-Launchpad-Export-Date: 2010-10-16 04:48+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 "Точность десятичных знаков"
+31 -23
View File
@@ -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 <chertykov@gmail.com>\n"
"PO-Revision-Date: 2010-10-15 12:51+0000\n"
"Last-Translator: Nikolay Chesnokov <chesnokov_n@msn.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-30 04:38+0000\n"
"X-Launchpad-Export-Date: 2010-10-16 04:47+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
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-10-14 17:38+0000\n"
"Last-Translator: zmmaj <Unknown>\n"
"PO-Revision-Date: 2010-10-15 09:04+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 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
+4 -10
View File
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<document filename="test.pdf">
<template pageSize="(595.0,842.0)" title="Delivery Order" author="OpenERP S.A. (sales@openerp.com)" allowSplitting="20">
<document filename="Delivery Order.pdf">
<template pageSize="(595.0,842.0)" title="Delivery Order" author="OpenERP S.A.(sales@openerp.com)" allowSplitting="20">
<pageTemplate id="first">
<frame id="first" x1="30.0" y1="27.0" width="508" height="815"/>
</pageTemplate>
@@ -189,11 +189,8 @@
</td>
</tr>
</blockTable>
<para style="terp_default_1">
<font color="white"> </font>
</para>
<section>
<para style="terp_default_9">[[repeatIn(o.move_lines,'line')]]</para>
<para style="terp_default_1">[[repeatIn(o.move_lines,'line')]]</para>
<blockTable colWidths="370.0,85.0,83.0" style="Table4">
<tr>
<td>
@@ -211,8 +208,5 @@
<font color="white"> </font>
</para>
</section>
<para style="Standard">
<font color="white"> </font>
</para>
</story>
</document>
</document>
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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.
+57
View File
@@ -0,0 +1,57 @@
# -*- encoding: utf-8 -*-
# Copyright P. Christeas <p_christ@hol.gr> 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
+5 -1
View File
@@ -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
+44 -3
View File
@@ -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"),
+4 -2
View File
@@ -277,7 +277,7 @@
</form>
</field>
</record>
<record id="view_attach_filter_inherit0" model="ir.ui.view">
<field name="name">IR Attachment0</field>
<field name="model">ir.attachment</field>
@@ -296,9 +296,9 @@
</field>
</record>
<record id="view_attach_filter_inherit2" model="ir.ui.view">
<field name="name">IR Attachment2</field>
<field name="model">ir.attachment</field>
<field name="type">search</field>
@@ -307,12 +307,14 @@
<filter string="Owner" position="replace">
<filter string="Owner" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
<filter string="Partner" icon="terp-partner" domain="[]"
context="{'group_by':'partner_id'}" groups="base.group_extended"/>
<filter string="Directory" icon="terp-folder-green" domain="[]" context="{'group_by':'parent_id'}"/>
</filter>
</field>
</record>
<record model="ir.ui.view" id="view_document_file_tree">
<field name="name">ir.attachment</field>
<field name="model">ir.attachment</field>
+80 -57
View File
@@ -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
+10 -3
View File
@@ -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()
@@ -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()
@@ -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")
+34 -24
View File
@@ -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('Äïêéìáóôéêüò ÖÜêåëëïò')
@@ -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()
+4
View File
@@ -21,3 +21,7 @@
import webdav
import webdav_server
import document_webdav
#eof

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