[Merge]with: lp:openobject-addons

bzr revid: dbr@tinyerp.com-20111122052259-ujqowej61mn43p4j
This commit is contained in:
DBR (OpenERP)
2011-11-22 10:52:59 +05:30
73 changed files with 6396 additions and 623 deletions
+3
View File
@@ -286,6 +286,9 @@ class account_invoice(osv.osv):
'internal_number': False,
'user_id': lambda s, cr, u, c: u,
}
_sql_constraints = [
('number_uniq', 'unique(number, company_id)', 'Invoice Number must be unique per Company!'),
]
def fields_view_get(self, cr, uid, view_id=None, view_type=False, context=None, toolbar=False, submenu=False):
journal_obj = self.pool.get('account.journal')
@@ -55,10 +55,10 @@ class analytic_entries_report(osv.osv):
select
min(a.id) as id,
count(distinct a.id) as nbr,
a.create_date as date,
to_char(a.create_date, 'YYYY') as year,
to_char(a.create_date, 'MM') as month,
to_char(a.create_date, 'YYYY-MM-DD') as day,
a.date as date,
to_char(a.date, 'YYYY') as year,
to_char(a.date, 'MM') as month,
to_char(a.date, 'YYYY-MM-DD') as day,
a.user_id as user_id,
a.name as name,
analytic.partner_id as partner_id,
@@ -76,7 +76,7 @@ class analytic_entries_report(osv.osv):
account_analytic_line a, account_analytic_account analytic
where analytic.id = a.account_id
group by
a.create_date, a.user_id,a.name,analytic.partner_id,a.company_id,a.currency_id,
a.date, a.user_id,a.name,analytic.partner_id,a.company_id,a.currency_id,
a.account_id,a.general_account_id,a.journal_id,
a.move_id,a.product_id,a.product_uom_id
)
+36
View File
@@ -0,0 +1,36 @@
# Bengali translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-11-21 12:33+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Bengali <bn@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: 2011-11-22 05:00+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: account_accountant
#: model:ir.module.module,description:account_accountant.module_meta_information
msgid ""
"\n"
"This module gives the admin user the access to all the accounting features "
"like the journal\n"
"items and the chart of accounts.\n"
" "
msgstr ""
"\n"
"এই মডিউল admin ব্যবহারকারীকে সকল হিসাবরক্ষন এর সুবিধা দিবে\n"
" "
#. module: account_accountant
#: model:ir.module.module,shortdesc:account_accountant.module_meta_information
msgid "Accountant"
msgstr "হিসাবরক্ষনকারী"
+33
View File
@@ -0,0 +1,33 @@
# Hebrew translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-11-18 17:39+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Hebrew <he@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: 2011-11-19 05:13+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: account_accountant
#: model:ir.module.module,description:account_accountant.module_meta_information
msgid ""
"\n"
"This module gives the admin user the access to all the accounting features "
"like the journal\n"
"items and the chart of accounts.\n"
" "
msgstr ""
#. module: account_accountant
#: model:ir.module.module,shortdesc:account_accountant.module_meta_information
msgid "Accountant"
msgstr ""
+38
View File
@@ -0,0 +1,38 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-11-20 09:14+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: account_accountant
#: model:ir.module.module,description:account_accountant.module_meta_information
msgid ""
"\n"
"This module gives the admin user the access to all the accounting features "
"like the journal\n"
"items and the chart of accounts.\n"
" "
msgstr ""
"\n"
"Aqueste modul balha a l'administrator los accèsses a totas las "
"foncionalitats comptablas talas coma las linhas\n"
"d'escritura e lo plan comptable.\n"
" "
#. module: account_accountant
#: model:ir.module.module,shortdesc:account_accountant.module_meta_information
msgid "Accountant"
msgstr "Comptable"
+36
View File
@@ -0,0 +1,36 @@
# Bengali translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-11-21 12:37+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Bengali <bn@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: 2011-11-22 05:00+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. 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 ""
"\n"
" মডিউলটি 'Allow cancelling entries' ফিল্ড যুক্ত করবে যা দিয়ে জাবেদা "
"অন্তর্ভুক্তি বাতিল করা যাবে।\n"
" "
#. module: account_cancel
#: model:ir.module.module,shortdesc:account_cancel.module_meta_information
msgid "Account Cancel"
msgstr "হিসাব বাতিল"
+37
View File
@@ -0,0 +1,37 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-11-20 09:15+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. 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 ""
"\n"
" Lo modul apond lo camp 'Permetre l'anullacion de las entradas' dins la "
"vista formulari del jornal. S'es egal a Verai, aquò permet a l'utilizaire "
"d'anullar l'entrada e la factura.\n"
" "
#. module: account_cancel
#: model:ir.module.module,shortdesc:account_cancel.module_meta_information
msgid "Account Cancel"
msgstr "Anullacion comptabla"
+1 -1
View File
@@ -28,7 +28,7 @@ class followup(osv.osv):
'name': fields.char('Name', size=64, required=True),
'description': fields.text('Description'),
'followup_line': fields.one2many('account_followup.followup.line', 'followup_id', 'Follow-Up'),
'company_id': fields.many2one('res.company', 'Company'),
'company_id': fields.many2one('res.company', 'Company', required=True),
}
_defaults = {
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'account_followup.followup', context=c),
@@ -35,45 +35,44 @@ class report_rappel(report_sxw.rml_parse):
'get_text': self._get_text
})
def _ids_to_objects(self, partner_ids):
def _ids_to_objects(self, ids):
pool = pooler.get_pool(self.cr.dbname)
all_partners = []
for partner in pool.get('res.partner').browse(self.cr, self.uid, partner_ids):
if partner not in all_partners:
all_partners.append(partner)
return all_partners
all_lines = []
for line in pool.get('account_followup.stat.by.partner').browse(self.cr, self.uid, ids):
if line not in all_lines:
all_lines.append(line)
return all_lines
def _adr_get(self, partner, type):
def _adr_get(self, stat_line, type):
res_partner = pooler.get_pool(self.cr.dbname).get('res.partner')
res_partner_address = pooler.get_pool(self.cr.dbname).get('res.partner.address')
adr = res_partner.address_get(self.cr, self.uid, [partner.id], [type])[type]
adr = res_partner.address_get(self.cr, self.uid, [stat_line.partner_id.id], [type])[type]
return adr and res_partner_address.read(self.cr, self.uid, [adr]) or [{}]
def _lines_get(self, partner):
def _lines_get(self, stat_by_partner_line):
pool = pooler.get_pool(self.cr.dbname)
moveline_obj = pool.get('account.move.line')
company_obj = pool.get('res.company')
obj_currency = pool.get('res.currency')
#FIXME: search on company accounting entries only
movelines = moveline_obj.search(self.cr, self.uid,
[('partner_id', '=', partner.id),
[('partner_id', '=', stat_by_partner_line.partner_id.id),
('account_id.type', '=', 'receivable'),
('reconcile_id', '=', False), ('state', '<>', 'draft')])
('reconcile_id', '=', False), ('state', '<>', 'draft'),('company_id','=', stat_by_partner_line.company_id.id)])
movelines = moveline_obj.browse(self.cr, self.uid, movelines)
base_currency = movelines[0].company_id.currency_id
final_res = []
line_cur = {base_currency.id: {'line': []}}
for line in movelines:
if line.currency_id and (not line.currency_id.id in line_cur):
line_cur[line.currency_id.id] = {'line': []}
currency = line.currency_id or line.company_id.currency_id
if line.account_id.currency_id and (not line.account_id.currency_id.id in line_cur):
line_cur[line.account_id.currency_id.id] = {'line': []}
currency = line.account_id.currency_id or line.company_id.currency_id
line_data = {
'name': line.move_id.name,
'ref': line.ref,
'date':line.date,
'date_maturity': line.date_maturity,
'balance': line.currency_id and line.amount_currency or (line.debit - line.credit),
'balance': currency.id <> line.company_id.currency_id.id and line.amount_currency or (line.debit - line.credit),
'blocked': line.blocked,
'currency_id': currency.symbol or currency.name,
}
@@ -85,7 +84,7 @@ class report_rappel(report_sxw.rml_parse):
return final_res
def _get_text(self, partner, followup_id, context=None):
def _get_text(self, stat_line, followup_id, context=None):
if context is None:
context = {}
fp_obj = pooler.get_pool(self.cr.dbname).get('account_followup.followup')
@@ -96,10 +95,10 @@ class report_rappel(report_sxw.rml_parse):
li_delay.sort(reverse=True)
text = ""
a = {}
partner_line = pooler.get_pool(self.cr.dbname).get('account.move.line').search(self.cr, self.uid, [('partner_id','=',partner.id),('reconcile_id','=',False)])
partner_line_ids = pooler.get_pool(self.cr.dbname).get('account.move.line').search(self.cr, self.uid, [('partner_id','=',stat_line.partner_id.id),('reconcile_id','=',False),('company_id','=',stat_line.company_id.id)])
partner_delay = []
context.update({'lang': partner.lang})
for i in pooler.get_pool(self.cr.dbname).get('account.move.line').browse(self.cr, self.uid, partner_line, context):
context.update({'lang': stat_line.partner_id.lang})
for i in pooler.get_pool(self.cr.dbname).get('account.move.line').browse(self.cr, self.uid, partner_line_ids, context):
for delay in li_delay:
if i.followup_line_id and str(i.followup_line_id.delay)==str(delay):
text = i.followup_line_id.description
@@ -108,16 +107,16 @@ class report_rappel(report_sxw.rml_parse):
text = partner_delay and a[max(partner_delay)] or ''
if text:
text = text % {
'partner_name': partner.name,
'partner_name': stat_line.partner_id.name,
'date': time.strftime('%Y-%m-%d'),
'company_name': fp_obj.browse(self.cr, self.uid, followup_id).company_id.name,
'company_name': stat_line.company_id.name,
'user_signature': pooler.get_pool(self.cr.dbname).get('res.users').browse(self.cr, self.uid, self.uid, context).signature or '',
}
return text
report_sxw.report_sxw('report.account_followup.followup.print',
'res.partner', 'addons/account_followup/report/account_followup_print.rml',
'account_followup.stat.by.partner', 'addons/account_followup/report/account_followup_print.rml',
parser=report_rappel)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
@@ -124,7 +124,7 @@
</stylesheet>
<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>
<para style="terp_default_8">[[ setLang(o.partner_id.lang) ]]</para>
<blockTable colWidths="298.0,234.0" style="Tableau2">
<tr>
@@ -132,7 +132,7 @@
<para style="terp_default_9">[[ repeatIn(adr_get(o,'invoice'),'a' )]]</para>
</td>
<td>
<para style="terp_default_9">[[ o.name or '' ]]</para>
<para style="terp_default_9">[[ o.partner_id.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'] or '' ]] [[ a['city'] or '' ]]</para>
@@ -141,7 +141,7 @@
<para style="terp_default_9">
<font color="white"> </font>
</para>
<para style="terp_default_9">VAT: [[ o.vat or removeParentNode('para') ]]</para>
<para style="terp_default_9">VAT: [[ o.partner_id.vat or removeParentNode('para') ]]</para>
</td>
</tr>
</blockTable>
@@ -150,7 +150,7 @@
</para>
<para style="terp_default_9">Document : Customer account statement</para>
<para style="terp_default_9">Date : [[ formatLang(data['form']['date'],date=True) ]]</para>
<para style="terp_default_9">Customer Ref : [[ o.ref or '' ]]</para>
<para style="terp_default_9">Customer Ref : [[ o.partner_id.ref or '' ]]</para>
<para style="terp_default_8">
<font color="white"> </font>
</para>
@@ -68,7 +68,7 @@ class account_followup_stat(osv.osv):
cr.execute("""
create or replace view account_followup_stat as (
SELECT
l.partner_id as id,
l.id as id,
l.partner_id AS partner_id,
min(l.date) AS date_move,
max(l.date) AS date_move_last,
@@ -105,4 +105,5 @@
self.do_print(cr, uid, [ref("account_followup_print_all_0")], {"lang": 'en_US',
"active_model": "ir.ui.menu", "active_ids": [ref("account_followup.account_followup_print_menu")],
"tz": False, "date": time.strftime('%Y-%m-%d'), "followup_id": ref("account_followup_followup_testfollowups0"), "active_id": ref("account_followup.account_followup_print_menu"),
"company_id": ref('base.main_company'),
})
@@ -31,7 +31,7 @@ class account_followup_print(osv.osv_memory):
_description = 'Print Followup & Send Mail to Customers'
_columns = {
'date': fields.date('Follow-up Sending Date', required=True, help="This field allow you to select a forecast date to plan your follow-ups"),
'followup_id': fields.many2one('account_followup.followup', 'Follow-up', required=True)
'followup_id': fields.many2one('account_followup.followup', 'Follow-up', required=True),
}
def _get_followup(self, cr, uid, context=None):
@@ -51,7 +51,7 @@ class account_followup_print(osv.osv_memory):
data = self.browse(cr, uid, ids, context=context)[0]
model_data_ids = mod_obj.search(cr, uid, [('model','=','ir.ui.view'),('name','=','view_account_followup_print_all')], context=context)
resource_id = mod_obj.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id']
context.update({'followup_id': data.followup_id.id, 'date':data.date})
context.update({'followup_id': data.followup_id.id, 'date': data.date, 'company_id': data.followup_id.company_id.id})
return {
'name': _('Select Partners'),
'view_type': 'form',
@@ -87,10 +87,13 @@ class account_followup_stat_by_partner(osv.osv):
def init(self, cr):
tools.drop_view_if_exists(cr, 'account_followup_stat_by_partner')
# Here we don't have other choice but to create a virtual ID based on the concatenation
# of the partner_id and the company_id. An assumption that the number of companies will
# not reach 10 000 records is made, what should be enough for a time.
cr.execute("""
create or replace view account_followup_stat_by_partner as (
SELECT
l.partner_id AS id,
l.partner_id * 10000 + l.company_id as id,
l.partner_id AS partner_id,
min(l.date) AS date_move,
max(l.date) AS date_move_last,
@@ -148,6 +151,8 @@ class account_followup_print_all(osv.osv_memory):
context = {}
if ids:
data = self.browse(cr, uid, ids, context=context)[0]
company_id = 'company_id' in context and context['company_id'] or data.company_id.id
cr.execute(
"SELECT l.partner_id, l.followup_line_id,l.date_maturity, l.date, l.id "\
"FROM account_move_line AS l "\
@@ -159,7 +164,8 @@ class account_followup_print_all(osv.osv_memory):
"AND (l.partner_id is NOT NULL) "\
"AND (a.active) "\
"AND (l.debit > 0) "\
"ORDER BY l.date")
"AND (l.company_id = %s) "\
"ORDER BY l.date", (company_id,))
move_lines = cr.fetchall()
old = None
fups = {}
@@ -189,16 +195,16 @@ class account_followup_print_all(osv.osv_memory):
continue
if followup_line_id not in fups:
continue
stat_line_id = partner_id * 10000 + company_id
if date_maturity:
if date_maturity <= fups[followup_line_id][0].strftime('%Y-%m-%d'):
if partner_id not in partner_list:
partner_list.append(partner_id)
partner_list.append(stat_line_id)
to_update[str(id)]= {'level': fups[followup_line_id][1], 'partner_id': partner_id}
elif date and date <= fups[followup_line_id][0].strftime('%Y-%m-%d'):
if partner_id not in partner_list:
partner_list.append(partner_id)
to_update[str(id)]= {'level': fups[followup_line_id][1], 'partner_id': partner_id}
partner_list.append(stat_line_id)
to_update[str(id)]= {'level': fups[followup_line_id][1], 'partner_id': stat_line_id}
return {'partner_ids': partner_list, 'to_update': to_update}
def do_mail(self ,cr, uid, ids, context=None):
@@ -225,7 +231,7 @@ class account_followup_print_all(osv.osv_memory):
partners.append(line.partner_id)
dict_lines[line.partner_id.id] =line
for partner in partners:
ids_lines = move_obj.search(cr,uid,[('partner_id','=',partner.id),('reconcile_id','=',False),('account_id.type','in',['receivable'])])
ids_lines = move_obj.search(cr,uid,[('partner_id','=',partner.id),('reconcile_id','=',False),('account_id.type','in',['receivable']),('company_id','=',context.get('company_id', False))])
data_lines = move_obj.browse(cr, uid, ids_lines, context=context)
followup_data = dict_lines[partner.id]
dest = False
@@ -13,7 +13,6 @@
<group col="4" colspan="6">
<field name="followup_id"/>
<field name="date"/>
<newline/>
</group>
<separator colspan="4"/>
<group col="2" colspan="4">
@@ -81,7 +80,7 @@
<notebook>
<page string="Partner Selection">
<separator string="Select Partners to Remind" colspan="4"/>
<field name="partner_ids" colspan="4" nolabel="1" context="{'search_default_balance_positive': 1}"/>
<field name="partner_ids" colspan="4" nolabel="1" context="{'search_default_balance_positive': 1}" domain="[('company_id','=',context.get('company_id',False))]"/>
</page>
<page string="Email Settings">
<field name="email_conf" colspan="4"/>
@@ -137,7 +136,5 @@
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</data>
</openerp>
@@ -48,7 +48,7 @@
-
Now I create a Vendor Voucher
-
!record {model: account.voucher, id: account_voucher_voucheraxelor0}:
!record {model: account.voucher, id: account_voucher_voucheraxelor0, view: False}:
account_id: account.cash
amount: 1000.0
company_id: base.main_company
+258 -231
View File
@@ -43,22 +43,17 @@ class audittrail_rule(osv.osv):
"log_create": fields.boolean("Log Creates",help="Select this if you want to keep track of creation on any record of the object of this rule"),
"log_action": fields.boolean("Log Action",help="Select this if you want to keep track of actions on the object of this rule"),
"log_workflow": fields.boolean("Log Workflow",help="Select this if you want to keep track of workflow on any record of the object of this rule"),
"state": fields.selection((("draft", "Draft"),
("subscribed", "Subscribed")),
"State", required=True),
"state": fields.selection((("draft", "Draft"), ("subscribed", "Subscribed")), "State", required=True),
"action_id": fields.many2one('ir.actions.act_window', "Action ID"),
}
_defaults = {
'state': lambda *a: 'draft',
'log_create': lambda *a: 1,
'log_unlink': lambda *a: 1,
'log_write': lambda *a: 1,
'state': 'draft',
'log_create': 1,
'log_unlink': 1,
'log_write': 1,
}
_sql_constraints = [
('model_uniq', 'unique (object_id)', """There is a rule defined on this object\n You cannot define another one the same object!""")
('model_uniq', 'unique (object_id)', """There is already a rule defined on this object\n You cannot define another: please edit the existing one.""")
]
__functions = {}
@@ -178,54 +173,33 @@ class audittrail_log_line(osv.osv):
class audittrail_objects_proxy(object_proxy):
""" Uses Object proxy for auditing changes on object of subscribed Rules"""
def get_value_text(self, cr, uid, field_name, values, model, context=None):
def get_value_text(self, cr, uid, pool, resource_pool, method, field, value):
"""
Gets textual values for the fields.
If the field is a many2one, it returns the name.
If it's a one2many or a many2many, it returns a list of name.
In other cases, it just returns the value.
:param cr: the current row, from the database cursor,
:param uid: the current user’s ID for security checks,
:param pool: current db's pooler object.
:param resource_pool: pooler object of the model which values are being changed.
:param field: for which the text value is to be returned.
:param value: value of the field.
:param recursive: True or False, True will repeat the process recursively
:return: string value or a list of values(for O2M/M2M)
"""
Gets textual values for the fields
e.g.: For field of type many2one it gives its name value instead of id
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param field_name: List of fields for text values
@param values: Values for field to be converted into textual values
@return: values: List of textual values for given fields
"""
if not context:
context = {}
if field_name in('__last_update','id'):
return values
pool = pooler.get_pool(cr.dbname)
field_pool = pool.get('ir.model.fields')
model_pool = pool.get('ir.model')
obj_pool = pool.get(model.model)
if obj_pool._inherits:
inherits_ids = model_pool.search(cr, uid, [('model', '=', obj_pool._inherits.keys()[0])])
field_ids = field_pool.search(cr, uid, [('name', '=', field_name), ('model_id', 'in', (model.id, inherits_ids[0]))])
field_obj = (resource_pool._all_columns.get(field)).column
if field_obj._type in ('one2many','many2many'):
data = pool.get(field_obj._obj).name_get(cr, uid, value)
#return the modifications on x2many fields as a list of names
res = map(lambda x:x[1], data)
elif field_obj._type == 'many2one':
#return the modifications on a many2one field as its value returned by name_get()
res = value and value[1] or value
else:
field_ids = field_pool.search(cr, uid, [('name', '=', field_name), ('model_id', '=', model.id)])
field_id = field_ids and field_ids[0] or False
assert field_id, _("'%s' field does not exist in '%s' model" %(field_name, model.model))
field = field_pool.read(cr, uid, field_id)
relation_model = field['relation']
relation_model_pool = relation_model and pool.get(relation_model) or False
if field['ttype'] == 'many2one':
res = False
relation_id = False
if values and type(values) == tuple:
relation_id = values[0]
if relation_id and relation_model_pool:
relation_model_object = relation_model_pool.read(cr, uid, relation_id, [relation_model_pool._rec_name])
res = relation_model_object[relation_model_pool._rec_name]
return res
elif field['ttype'] in ('many2many','one2many'):
res = []
for relation_model_object in relation_model_pool.read(cr, uid, values, [relation_model_pool._rec_name]):
res.append(relation_model_object[relation_model_pool._rec_name])
return res
return values
res = value
return res
def create_log_line(self, cr, uid, log_id, model, lines=[]):
"""
@@ -233,7 +207,7 @@ class audittrail_objects_proxy(object_proxy):
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@param model: Object who's values are being changed
@param model: Object which values are being changed
@param lines: List of values for line is to be created
"""
pool = pooler.get_pool(cr.dbname)
@@ -241,216 +215,273 @@ class audittrail_objects_proxy(object_proxy):
model_pool = pool.get('ir.model')
field_pool = pool.get('ir.model.fields')
log_line_pool = pool.get('audittrail.log.line')
#start Loop
for line in lines:
if line['name'] in('__last_update','id'):
continue
field_obj = obj_pool._all_columns.get(line['name'])
assert field_obj, _("'%s' field does not exist in '%s' model" %(line['name'], model.model))
field_obj = field_obj.column
old_value = line.get('old_value', '')
new_value = line.get('new_value', '')
search_models = [model.id]
if obj_pool._inherits:
inherits_ids = model_pool.search(cr, uid, [('model', '=', obj_pool._inherits.keys()[0])])
field_ids = field_pool.search(cr, uid, [('name', '=', line['name']), ('model_id', 'in', (model.id, inherits_ids[0]))])
else:
field_ids = field_pool.search(cr, uid, [('name', '=', line['name']), ('model_id', '=', model.id)])
field_id = field_ids and field_ids[0] or False
assert field_id, _("'%s' field does not exist in '%s' model" %(line['name'], model.model))
field = field_pool.read(cr, uid, field_id)
old_value = 'old_value' in line and line['old_value'] or ''
new_value = 'new_value' in line and line['new_value'] or ''
old_value_text = 'old_value_text' in line and line['old_value_text'] or ''
new_value_text = 'new_value_text' in line and line['new_value_text'] or ''
if old_value_text == new_value_text:
continue
if field['ttype'] == 'many2one':
if type(old_value) == tuple:
old_value = old_value[0]
if type(new_value) == tuple:
new_value = new_value[0]
search_models += model_pool.search(cr, uid, [('model', 'in', obj_pool._inherits.keys())])
field_id = field_pool.search(cr, uid, [('name', '=', line['name']), ('model_id', 'in', search_models)])
if field_obj._type == 'many2one':
old_value = old_value and old_value[0] or old_value
new_value = new_value and new_value[0] or new_value
vals = {
"log_id": log_id,
"field_id": field_id,
"field_id": field_id and field_id[0] or False,
"old_value": old_value,
"new_value": new_value,
"old_value_text": old_value_text,
"new_value_text": new_value_text,
"field_description": field['field_description']
"old_value_text": line.get('old_value_text', ''),
"new_value_text": line.get('new_value_text', ''),
"field_description": field_obj.string
}
line_id = log_line_pool.create(cr, uid, vals)
cr.commit()
#End Loop
return True
def log_fct(self, cr, uid, model, method, fct_src, *args):
def log_fct(self, cr, uid_orig, model, method, fct_src, *args):
"""
Logging function: This function is performs logging oprations according to method
@param db: the current database
@param uid: the current user’s ID for security checks,
@param object: Object who's values are being changed
@param method: method to log: create, read, write, unlink
Logging function: This function is performing the logging operation
@param model: Object whose values are being changed
@param method: method to log: create, read, write, unlink, action or workflow action
@param fct_src: execute method of Object proxy
@return: Returns result as per method of Object proxy
"""
uid_orig = uid
uid = 1
res2 = args
pool = pooler.get_pool(cr.dbname)
resource_pool = pool.get(model)
log_pool = pool.get('audittrail.log')
model_pool = pool.get('ir.model')
model_ids = model_pool.search(cr, uid, [('model', '=', model)])
model_ids = model_pool.search(cr, 1, [('model', '=', model)])
model_id = model_ids and model_ids[0] or False
assert model_id, _("'%s' Model does not exist..." %(model))
model = model_pool.browse(cr, uid, model_id)
model = model_pool.browse(cr, 1, model_id)
if method in ('create'):
res_id = fct_src(cr, uid_orig, model.model, method, *args)
resource = resource_pool.read(cr, uid, res_id, args[0].keys())
vals = {
"method": method,
"object_id": model.id,
"user_id": uid_orig,
"res_id": resource['id'],
}
if 'id' in resource:
del resource['id']
log_id = log_pool.create(cr, uid, vals)
lines = []
for field in resource:
line = {
'name': field,
'new_value': resource[field],
'new_value_text': self.get_value_text(cr, uid, field, resource[field], model)
}
lines.append(line)
self.create_log_line(cr, uid, log_id, model, lines)
# fields to log. currently only used by log on read()
field_list = []
old_values = new_values = {}
return res_id
elif method in ('read'):
res_ids = args[0]
old_values = {}
if method == 'create':
res = fct_src(cr, uid_orig, model.model, method, *args)
if type(res) == list:
for v in res:
old_values[v['id']] = v
else:
old_values[res['id']] = res
for res_id in old_values:
vals = {
"method": method,
"object_id": model.id,
"user_id": uid_orig,
"res_id": res_id,
}
log_id = log_pool.create(cr, uid, vals)
lines = []
for field in old_values[res_id]:
line = {
'name': field,
'old_value': old_values[res_id][field],
'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model)
}
lines.append(line)
self.create_log_line(cr, uid, log_id, model, lines)
return res
elif method in ('unlink'):
res_ids = args[0]
old_values = {}
for res_id in res_ids:
old_values[res_id] = resource_pool.read(cr, uid, res_id)
for res_id in res_ids:
vals = {
"method": method,
"object_id": model.id,
"user_id": uid_orig,
"res_id": res_id,
}
log_id = log_pool.create(cr, uid, vals)
lines = []
for field in old_values[res_id]:
if field in ('id'):
continue
line = {
'name': field,
'old_value': old_values[res_id][field],
'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model)
}
lines.append(line)
self.create_log_line(cr, uid, log_id, model, lines)
if res:
res_ids = [res]
new_values = self.get_data(cr, uid_orig, pool, res_ids, model, method)
elif method == 'read':
res = fct_src(cr, uid_orig, model.model, method, *args)
return res
else:
# build the res_ids and the old_values dict. Here we don't use get_data() to
# avoid performing an additional read()
res_ids = []
for record in res:
res_ids.append(record['id'])
old_values[(model.id, record['id'])] = {'value': record, 'text': record}
# log only the fields read
field_list = args[1]
elif method == 'unlink':
res_ids = args[0]
old_values = self.get_data(cr, uid_orig, pool, res_ids, model, method)
res = fct_src(cr, uid_orig, model.model, method, *args)
else: # method is write, action or workflow action
res_ids = []
res = True
if args:
res_ids = args[0]
old_values = {}
fields = []
if len(args)>1 and type(args[1]) == dict:
fields = args[1].keys()
if type(res_ids) in (long, int):
if isinstance(res_ids, (long, int)):
res_ids = [res_ids]
if res_ids:
for resource in resource_pool.read(cr, uid, res_ids):
resource_id = resource['id']
if 'id' in resource:
del resource['id']
old_values_text = {}
old_value = {}
for field in resource.keys():
old_value[field] = resource[field]
old_values_text[field] = self.get_value_text(cr, uid, field, resource[field], model)
old_values[resource_id] = {'text':old_values_text, 'value': old_value}
# store the old values into a dictionary
old_values = self.get_data(cr, uid_orig, pool, res_ids, model, method)
# process the original function, workflow trigger...
res = fct_src(cr, uid_orig, model.model, method, *args)
if method == 'copy':
res_ids = [res]
if res_ids:
for resource in resource_pool.read(cr, uid, res_ids):
resource_id = resource['id']
if 'id' in resource:
del resource['id']
vals = {
"method": method,
"object_id": model.id,
"user_id": uid_orig,
"res_id": resource_id,
}
# check the new values and store them into a dictionary
new_values = self.get_data(cr, uid_orig, pool, res_ids, model, method)
# compare the old and new values and create audittrail log if needed
self.process_data(cr, uid_orig, pool, res_ids, model, method, old_values, new_values, field_list)
return res
def get_data(self, cr, uid, pool, res_ids, model, method):
"""
This function simply read all the fields of the given res_ids, and also recurisvely on
all records of a x2m fields read that need to be logged. Then it returns the result in
convenient structure that will be used as comparison basis.
log_id = log_pool.create(cr, uid, vals)
lines = []
for field in resource.keys():
line = {
'name': field,
'new_value': resource[field],
'old_value': old_values[resource_id]['value'][field],
'new_value_text': self.get_value_text(cr, uid, field, resource[field], model),
'old_value_text': old_values[resource_id]['text'][field]
}
lines.append(line)
:param cr: the current row, from the database cursor,
:param uid: the current user’s ID. This parameter is currently not used as every
operation to get data is made as super admin. Though, it could be usefull later.
:param pool: current db's pooler object.
:param res_ids: Id's of resource to be logged/compared.
:param model: Object whose values are being changed
:param method: method to log: create, read, unlink, write, actions, workflow actions
:return: dict mapping a tuple (model_id, resource_id) with its value and textual value
{ (model_id, resource_id): { 'value': ...
'textual_value': ...
},
}
"""
data = {}
resource_pool = pool.get(model.model)
# read all the fields of the given resources in super admin mode
for resource in resource_pool.read(cr, 1, res_ids):
values = {}
values_text = {}
resource_id = resource['id']
# loop on each field on the res_ids we just have read
for field in resource:
if field in ('__last_update', 'id'):
continue
values[field] = resource[field]
# get the textual value of that field for this record
values_text[field] = self.get_value_text(cr, 1, pool, resource_pool, method, field, resource[field])
self.create_log_line(cr, uid, log_id, model, lines)
return res
field_obj = resource_pool._all_columns.get(field).column
if field_obj._type in ('one2many','many2many'):
# check if an audittrail rule apply in super admin mode
if self.check_rules(cr, 1, field_obj._obj, method):
# check if the model associated to a *2m field exists, in super admin mode
x2m_model_ids = pool.get('ir.model').search(cr, 1, [('model', '=', field_obj._obj)])
x2m_model_id = x2m_model_ids and x2m_model_ids[0] or False
assert x2m_model_id, _("'%s' Model does not exist..." %(field_obj._obj))
x2m_model = pool.get('ir.model').browse(cr, 1, x2m_model_id)
#recursive call on x2m fields that need to be checked too
data.update(self.get_data(cr, 1, pool, resource[field], x2m_model, method))
data[(model.id, resource_id)] = {'text':values_text, 'value': values}
return data
def prepare_audittrail_log_line(self, cr, uid, pool, model, resource_id, method, old_values, new_values, field_list=[]):
"""
This function compares the old data (i.e before the method was executed) and the new data
(after the method was executed) and returns a structure with all the needed information to
log those differences.
:param cr: the current row, from the database cursor,
:param uid: the current user’s ID. This parameter is currently not used as every
operation to get data is made as super admin. Though, it could be usefull later.
:param pool: current db's pooler object.
:param model: model object which values are being changed
:param resource_id: ID of record to which values are being changed
:param method: method to log: create, read, unlink, write, actions, workflow actions
:param old_values: dict of values read before execution of the method
:param new_values: dict of values read after execution of the method
:param field_list: optional argument containing the list of fields to log. Currently only
used when performing a read, it could be usefull later on if we want to log the write
on specific fields only.
:return: dictionary with
* keys: tuples build as ID of model object to log and ID of resource to log
* values: list of all the changes in field values for this couple (model, resource)
return {
(model.id, resource_id): []
}
The reason why the structure returned is build as above is because when modifying an existing
record (res.partner, for example), we may have to log a change done in a x2many field (on
res.partner.address, for example)
"""
key = (model.id, resource_id)
lines = {
key: []
}
# loop on all the fields
for field_name, field_definition in pool.get(model.model)._all_columns.items():
#if the field_list param is given, skip all the fields not in that list
if field_list and field_name not in field_list:
continue
field_obj = field_definition.column
if field_obj._type in ('one2many','many2many'):
# checking if an audittrail rule apply in super admin mode
if self.check_rules(cr, 1, field_obj._obj, method):
# checking if the model associated to a *2m field exists, in super admin mode
x2m_model_ids = pool.get('ir.model').search(cr, 1, [('model', '=', field_obj._obj)])
x2m_model_id = x2m_model_ids and x2m_model_ids[0] or False
assert x2m_model_id, _("'%s' Model does not exist..." %(field_obj._obj))
x2m_model = pool.get('ir.model').browse(cr, 1, x2m_model_id)
# the resource_ids that need to be checked are the sum of both old and previous values (because we
# need to log also creation or deletion in those lists).
x2m_old_values_ids = old_values.get(key, {'value': {}})['value'].get(field_name, [])
x2m_new_values_ids = new_values.get(key, {'value': {}})['value'].get(field_name, [])
# We use list(set(...)) to remove duplicates.
res_ids = list(set(x2m_old_values_ids + x2m_new_values_ids))
for res_id in res_ids:
lines.update(self.prepare_audittrail_log_line(cr, 1, pool, x2m_model, res_id, method, old_values, new_values, field_list))
# if the value value is different than the old value: record the change
if key not in old_values or key not in new_values or old_values[key]['value'][field_name] != new_values[key]['value'][field_name]:
data = {
'name': field_name,
'new_value': key in new_values and new_values[key]['value'].get(field_name),
'old_value': key in old_values and old_values[key]['value'].get(field_name),
'new_value_text': key in new_values and new_values[key]['text'].get(field_name),
'old_value_text': key in old_values and old_values[key]['text'].get(field_name)
}
lines[key].append(data)
return lines
def process_data(self, cr, uid, pool, res_ids, model, method, old_values={}, new_values={}, field_list=[]):
"""
This function processes and iterates recursively to log the difference between the old
data (i.e before the method was executed) and the new data and creates audittrail log
accordingly.
:param cr: the current row, from the database cursor,
:param uid: the current user’s ID,
:param pool: current db's pooler object.
:param res_ids: Id's of resource to be logged/compared.
:param model: model object which values are being changed
:param method: method to log: create, read, unlink, write, actions, workflow actions
:param old_values: dict of values read before execution of the method
:param new_values: dict of values read after execution of the method
:param field_list: optional argument containing the list of fields to log. Currently only
used when performing a read, it could be usefull later on if we want to log the write
on specific fields only.
:return: True
"""
# loop on all the given ids
for res_id in res_ids:
# compare old and new values and get audittrail log lines accordingly
lines = self.prepare_audittrail_log_line(cr, uid, pool, model, res_id, method, old_values, new_values, field_list)
# if at least one modification has been found
for model_id, resource_id in lines:
vals = {
'method': method,
'object_id': model_id,
'user_id': uid,
'res_id': resource_id,
}
if (model_id, resource_id) not in old_values and method not in ('copy', 'read'):
# the resource was not existing so we are forcing the method to 'create'
# (because it could also come with the value 'write' if we are creating
# new record through a one2many field)
vals.update({'method': 'create'})
if (model_id, resource_id) not in new_values and method not in ('copy', 'read'):
# the resource is not existing anymore so we are forcing the method to 'unlink'
# (because it could also come with the value 'write' if we are deleting the
# record through a one2many field)
vals.update({'method': 'unlink'})
# create the audittrail log in super admin mode, only if a change has been detected
if lines[(model_id, resource_id)]:
log_id = pool.get('audittrail.log').create(cr, 1, vals)
model = pool.get('ir.model').browse(cr, uid, model_id)
self.create_log_line(cr, 1, log_id, model, lines[(model_id, resource_id)])
return True
def check_rules(self, cr, uid, model, method):
"""
Checks if auditrails is installed for that db and then if one rule match
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID,
@param model: value of _name of the object which values are being changed
@param method: method to log: create, read, unlink,write,actions,workflow actions
@return: True or False
"""
pool = pooler.get_pool(cr.dbname)
# Check if auditrails is installed for that db and then if one rule match
if 'audittrail.rule' in pool.models:
model_ids = pool.get('ir.model').search(cr, 1, [('model', '=', model)])
model_id = model_ids and model_ids[0] or False
if model_id:
rule_ids = pool.get('audittrail.rule').search(cr, 1, [('object_id', '=', model_id), ('state', '=', 'subscribed')])
for rule in pool.get('audittrail.rule').read(cr, 1, rule_ids, ['user_id','log_read','log_write','log_create','log_unlink','log_action','log_workflow']):
if len(rule['user_id'])==0 or uid in rule['user_id']:
if len(rule['user_id']) == 0 or uid in rule['user_id']:
if rule.get('log_'+method,0):
return True
elif method not in ('default_get','read','fields_view_get','fields_get','search','search_count','name_search','name_get','get','request_get', 'get_sc', 'unlink', 'write', 'create'):
@@ -460,18 +491,14 @@ class audittrail_objects_proxy(object_proxy):
def execute_cr(self, cr, uid, model, method, *args, **kw):
fct_src = super(audittrail_objects_proxy, self).execute_cr
if self.check_rules(cr,uid,model,method):
res = self.log_fct(cr, uid, model, method, fct_src, *args)
else:
res = fct_src(cr, uid, model, method, *args)
return res
return self.log_fct(cr, uid, model, method, fct_src, *args)
return fct_src(cr, uid, model, method, *args)
def exec_workflow_cr(self, cr, uid, model, method, *args, **argv):
fct_src = super(audittrail_objects_proxy, self).exec_workflow_cr
if self.check_rules(cr,uid,model,'workflow'):
res = self.log_fct(cr, uid, model, method, fct_src, *args)
else:
res = fct_src(cr, uid, model, method, *args)
return res
return self.log_fct(cr, uid, model, method, fct_src, *args)
return fct_src(cr, uid, model, method, *args)
audittrail_objects_proxy()
File diff suppressed because it is too large Load Diff
+73
View File
@@ -0,0 +1,73 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-11-20 09:17+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: base_crypt
#: sql_constraint:res.users:0
msgid "You can not have two users with the same login !"
msgstr "Podètz pas aver dos utilizaires amb lo meteis identificant !"
#. module: base_crypt
#: model:ir.model,name:base_crypt.model_res_users
msgid "res.users"
msgstr "res.users"
#. module: base_crypt
#: constraint:res.users:0
msgid "The chosen company is not in the allowed companies for this user"
msgstr ""
"La societat causida fa pas partida de las societats autorizadas per aqueste "
"utilizaire"
#. module: base_crypt
#: code:addons/base_crypt/crypt.py:132
#, python-format
msgid "Please specify the password !"
msgstr "Entratz un senhal"
#. module: base_crypt
#: model:ir.module.module,shortdesc:base_crypt.module_meta_information
msgid "Base - Password Encryption"
msgstr "Basa - Chifratge del senhal"
#. module: base_crypt
#: code:addons/base_crypt/crypt.py:132
#, python-format
msgid "Error"
msgstr "Error"
#. module: base_crypt
#: model:ir.module.module,description:base_crypt.module_meta_information
msgid ""
"This module replaces the cleartext password in the database with a password "
"hash,\n"
"preventing anyone from reading the original password.\n"
"For your existing user base, the removal of the cleartext passwords occurs "
"the first time\n"
"a user logs into the database, after installing base_crypt.\n"
"After installing this module it won't be possible to recover a forgotten "
"password for your\n"
"users, the only solution is for an admin to set a new password.\n"
"\n"
"Note: installing this module does not mean you can ignore basic security "
"measures,\n"
"as the password is still transmitted unencrypted on the network (by the "
"client),\n"
"unless you are using a secure protocol such as XML-RPCS.\n"
" "
msgstr ""
+32
View File
@@ -0,0 +1,32 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-11-20 09:19+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
msgid "Common base for tools modules"
msgstr "Basa comuna pels moduls utilitaris"
#. module: base_tools
#: model:ir.module.module,description:base_tools.module_meta_information
msgid ""
"\n"
" "
msgstr ""
"\n"
" "
+1 -1
View File
@@ -158,7 +158,7 @@
</record>
<!-- bind adminitration dashboard to the root administration -->
<menuitem id="base.menu_administration" icon="terp-administration" name="Administration" sequence="50" action="open_board_administration_form"/>
<menuitem id="base.menu_administration" icon="terp-administration" name="Settings" sequence="50" action="open_board_administration_form"/>
<!-- add a menu item in adminitration/reporting/dashboards -->
<menuitem id="base.menu_reporting" name="Reporting" parent="base.menu_administration" sequence="11" groups="base.group_extended"/>
+33
View File
@@ -0,0 +1,33 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
"PO-Revision-Date: 2011-11-20 09:19+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: claim_from_delivery
#: model:ir.actions.act_window,name:claim_from_delivery.action_claim_from_delivery
msgid "Claim"
msgstr "Reclamacion"
#. module: claim_from_delivery
#: model:ir.module.module,description:claim_from_delivery.module_meta_information
msgid "Create Claim from delivery order:\n"
msgstr "Crear una reclamacion sus un bon de liurason :\n"
#. module: claim_from_delivery
#: model:ir.module.module,shortdesc:claim_from_delivery.module_meta_information
msgid "Claim from delivery"
msgstr "Reclamacion sus la liurason"
+10 -4
View File
@@ -42,11 +42,17 @@ class crm_lead(crm_case, osv.osv):
_order = "priority,date_action,id desc"
_inherit = ['mail.thread','res.partner.address']
def _read_group_stage_ids(self, cr, uid, ids, domain, context=None):
context = context or {}
def _read_group_stage_ids(self, cr, uid, ids, domain, read_group_order=None, context=None):
stage_obj = self.pool.get('crm.case.stage')
stage_ids = stage_obj.search(cr, uid, ['|', ('id','in',ids), ('case_default','=',1)], context=context)
return stage_obj.name_get(cr, uid, stage_ids, context=context)
order = stage_obj._order
if read_group_order == 'stage_id desc':
# lame hack to allow reverting search, should just work in the trivial case
order = "%s desc" % order
stage_ids = stage_obj.search(cr, uid, ['|', ('id','in',ids),('case_default','=',1)], order=order, context=context)
result = stage_obj.name_get(cr, uid, stage_ids, context=context)
# restore order of the search
result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0])))
return result
_group_by_full = {
'stage_id': _read_group_stage_ids
+50
View File
@@ -0,0 +1,50 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
"PO-Revision-Date: 2011-11-20 09:20+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: crm_caldav
#: model:ir.actions.act_window,name:crm_caldav.action_caldav_browse
msgid "Caldav Browse"
msgstr "Navigar dins CalDav"
#. module: crm_caldav
#: model:ir.model,name:crm_caldav.model_crm_meeting
msgid "Meeting"
msgstr "Rendètz-vos"
#. module: crm_caldav
#: model:ir.module.module,shortdesc:crm_caldav.module_meta_information
msgid "Extended Module to Add CalDav feature on Meeting"
msgstr "Modul espandit per apondre la foncionalitat CalDav a las acampadas"
#. module: crm_caldav
#: model:ir.module.module,description:crm_caldav.module_meta_information
msgid ""
"\n"
" New Features in Meeting:\n"
" * Share meeting with other calendar clients like sunbird\n"
msgstr ""
"\n"
" Foncionalitats novèlas per las acampadas :\n"
" * Partiment d'acampadas amb d'autres clients de calendièrs coma "
"sunbird\n"
#. module: crm_caldav
#: model:ir.ui.menu,name:crm_caldav.menu_caldav_browse
msgid "Synchronyze this calendar"
msgstr "Sincronizar aqueste calendièr"
+135
View File
@@ -0,0 +1,135 @@
# Arabic translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
"PO-Revision-Date: 2011-11-18 07:10+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Arabic <ar@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-19 05:13+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: document_ftp
#: model:ir.model,name:document_ftp.model_document_ftp_configuration
msgid "Auto Directory Configuration"
msgstr ""
#. module: document_ftp
#: view:document.ftp.configuration:0
msgid ""
"Indicate the network address on which your OpenERP server should be "
"reachable for end-users. This depends on your network topology and "
"configuration, and will only affect the links displayed to the users. The "
"format is HOST:PORT and the default host (localhost) is only suitable for "
"access from the server machine itself.."
msgstr ""
#. module: document_ftp
#: field:document.ftp.configuration,progress:0
msgid "Configuration Progress"
msgstr ""
#. module: document_ftp
#: model:ir.actions.url,name:document_ftp.action_document_browse
msgid "Browse Files"
msgstr ""
#. module: document_ftp
#: field:document.ftp.configuration,config_logo:0
msgid "Image"
msgstr "الصورة"
#. module: document_ftp
#: field:document.ftp.configuration,host:0
msgid "Address"
msgstr "العنوان"
#. module: document_ftp
#: field:document.ftp.browse,url:0
msgid "FTP Server"
msgstr ""
#. module: document_ftp
#: model:ir.actions.act_window,name:document_ftp.action_config_auto_directory
msgid "FTP Server Configuration"
msgstr ""
#. module: document_ftp
#: model:ir.module.module,description:document_ftp.module_meta_information
msgid ""
"This is a support FTP Interface with document management system.\n"
" With this module you would not only be able to access documents through "
"OpenERP\n"
" but you would also be able to connect with them through the file system "
"using the\n"
" FTP client.\n"
msgstr ""
#. module: document_ftp
#: view:document.ftp.browse:0
msgid "_Browse"
msgstr ""
#. module: document_ftp
#: help:document.ftp.configuration,host:0
msgid ""
"Server address or IP and port to which users should connect to for DMS access"
msgstr ""
#. module: document_ftp
#: model:ir.ui.menu,name:document_ftp.menu_document_browse
msgid "Shared Repository (FTP)"
msgstr ""
#. module: document_ftp
#: view:document.ftp.browse:0
msgid "_Cancel"
msgstr ""
#. module: document_ftp
#: view:document.ftp.configuration:0
msgid "Configure FTP Server"
msgstr ""
#. module: document_ftp
#: model:ir.module.module,shortdesc:document_ftp.module_meta_information
msgid "Integrated FTP Server with Document Management System"
msgstr ""
#. module: document_ftp
#: view:document.ftp.configuration:0
msgid "title"
msgstr ""
#. module: document_ftp
#: model:ir.model,name:document_ftp.model_document_ftp_browse
msgid "Document FTP Browse"
msgstr ""
#. module: document_ftp
#: view:document.ftp.configuration:0
msgid "Knowledge Application Configuration"
msgstr ""
#. module: document_ftp
#: model:ir.actions.act_window,name:document_ftp.action_ftp_browse
msgid "Document Browse"
msgstr ""
#. module: document_ftp
#: view:document.ftp.browse:0
msgid "Browse Document"
msgstr ""
#. module: document_ftp
#: view:document.ftp.configuration:0
msgid "res_config_contents"
msgstr ""
+8 -1
View File
@@ -18,10 +18,17 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import logging
import models
import edi_service
from models.edi import EDIMixin, edi_document
# web
import controllers
try:
import controllers
except ImportError:
logging.getLogger('init.load').warn(
"""Could not load openerp-web section of EDI, EDI will not behave correctly
To fix, launch openerp-web in embedded mode""")
-1
View File
@@ -1,5 +1,4 @@
openerp.edi = function(openerp) {
openerp.web.qweb.add_template("/web/static/src/xml/base.xml");
openerp.web.qweb.add_template("/edi/static/src/xml/edi.xml");
openerp.web.qweb.add_template("/edi/static/src/xml/edi_account.xml");
openerp.web.qweb.add_template("/edi/static/src/xml/edi_sale_purchase.xml");
+11 -11
View File
@@ -31,7 +31,7 @@
</p>
</div>
</div>
<h1 class="oe_edi_doc_title">Invoice <t t-esc="doc.internal_number"/>: <t t-esc="_.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></h1>
<h1 class="oe_edi_doc_title">Invoice <t t-esc="doc.internal_number"/>: <t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></h1>
<table width="100%" class="oe_edi_data oe_edi_shade">
<tr class="oe_edi_floor">
<th align="left">Description</th>
@@ -60,10 +60,10 @@
<pre class="oe_edi_inner_note"><t t-esc="invoice_line.note"/></pre>
</t>
</td>
<td align="right"><t t-esc="_.sprintf('%.2f',invoice_line.quantity)"/> <t t-esc="invoice_line.uos_id[1]"/></td>
<td align="right"><t t-esc="_.sprintf('%.2f',invoice_line.price_unit)"/></td>
<td align="right"><t t-esc="_.sprintf('%.2f',invoice_line.discount)"/></td>
<td align="right"><t t-esc="_.sprintf('%.2f',invoice_line.price_subtotal)"/> <t t-esc="doc.currency.code"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',invoice_line.quantity)"/> <t t-esc="invoice_line.uos_id[1]"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',invoice_line.price_unit)"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',invoice_line.discount)"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',invoice_line.price_subtotal)"/> <t t-esc="doc.currency.code"/></td>
</tr>
</t>
<tr>
@@ -73,7 +73,7 @@
Net Total:
</div>
<div class="oe_edi_summary_value">
<t t-esc="_.sprintf('%.2f',doc.amount_untaxed)"/> <t t-esc="doc.currency.code"/>
<t t-esc="_.str.sprintf('%.2f',doc.amount_untaxed)"/> <t t-esc="doc.currency.code"/>
</div>
</td>
</tr>
@@ -84,7 +84,7 @@
Taxes:
</div>
<div class="oe_edi_summary_value">
<t t-esc="_.sprintf('%.2f',doc.amount_tax)"/> <t t-esc="doc.currency.code"/>
<t t-esc="_.str.sprintf('%.2f',doc.amount_tax)"/> <t t-esc="doc.currency.code"/>
</div>
</td>
</tr>
@@ -95,7 +95,7 @@
Total:
</div>
<div class="oe_edi_summary_value">
<t t-esc="_.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/>
<t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/>
</div>
</th>
</tr>
@@ -110,8 +110,8 @@
<t t-if="doc.tax_line"><t t-foreach="doc.tax_line" t-as="tax_line">
<tr class="oe_edi_data_row">
<td align="left"><t t-esc="tax_line.name"/></td>
<td align="right"><t t-esc="_.sprintf('%.2f',tax_line.base_amount)"/> <t t-esc="doc.currency.code"/></td>
<td align="right"><t t-esc="_.sprintf('%.2f',tax_line.amount)"/> <t t-esc="doc.currency.code"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',tax_line.base_amount)"/> <t t-esc="doc.currency.code"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',tax_line.amount)"/> <t t-esc="doc.currency.code"/></td>
</tr>
</t>
</t>
@@ -145,7 +145,7 @@
<label for="oe_edi_pay_wire" id="oe_edi_pay_wire" class="oe_edi_pay_choice_label">Bank Wire Transfer</label>
</div>
<p class="oe_edi_nested_block_pay oe_edi_pay_wire_nested">
Please transfer <strong><t t-esc="_.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></strong> to
Please transfer <strong><t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></strong> to
<strong><t t-esc="doc.company_id[1]"/></strong> (postal address on the invoice header)
using one of the following bank accounts. Be sure to mention the invoice
reference <strong><t t-esc="doc.internal_number"/></strong> on the transfer:
@@ -33,7 +33,7 @@
</div>
</div>
<h1 class="oe_edi_doc_title">Order <t t-esc="doc.name"/>: <t t-esc="_.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></h1>
<h1 class="oe_edi_doc_title">Order <t t-esc="doc.name"/>: <t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></h1>
<table width="100%" class="oe_edi_data oe_edi_shade">
<tr class="oe_edi_floor">
@@ -68,11 +68,11 @@
</t>
</td>
<td align="right">
<t t-esc="_.sprintf('%.2f',doc_line.product_qty)"/> <t t-esc="doc_line.product_uom[1]"/>
<t t-esc="_.str.sprintf('%.2f',doc_line.product_qty)"/> <t t-esc="doc_line.product_uom[1]"/>
</td>
<td align="right"><t t-esc="_.sprintf('%.2f',doc_line.price_unit)"/></td>
<td align="right"><t t-esc="_.sprintf('%.2f',doc_line.discount or 0.0)"/></td>
<td align="right"><t t-esc="_.sprintf('%.2f',doc_line.price_subtotal)"/> <t t-esc="doc.currency.code"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',doc_line.price_unit)"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',doc_line.discount or 0.0)"/></td>
<td align="right"><t t-esc="_.str.sprintf('%.2f',doc_line.price_subtotal)"/> <t t-esc="doc.currency.code"/></td>
</tr>
</t>
<tr>
@@ -82,7 +82,7 @@
Net Total:
</div>
<div class="oe_edi_summary_value">
<t t-esc="_.sprintf('%.2f',doc.amount_untaxed)"/> <t t-esc="doc.currency.code"/>
<t t-esc="_.str.sprintf('%.2f',doc.amount_untaxed)"/> <t t-esc="doc.currency.code"/>
</div>
</td>
</tr>
@@ -93,7 +93,7 @@
Taxes:
</div>
<div class="oe_edi_summary_value">
<t t-esc="_.sprintf('%.2f',doc.amount_tax)"/> <t t-esc="doc.currency.code"/>
<t t-esc="_.str.sprintf('%.2f',doc.amount_tax)"/> <t t-esc="doc.currency.code"/>
</div>
</td>
</tr>
@@ -104,7 +104,7 @@
Total:
</div>
<div class="oe_edi_summary_value">
<t t-esc="_.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/>
<t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/>
</div>
</th>
</tr>
@@ -137,7 +137,7 @@
<label for="oe_edi_pay_wire" id="oe_edi_pay_wire" class="oe_edi_pay_choice_label">Bank Wire Transfer</label>
</div>
<p class="oe_edi_nested_block_pay oe_edi_pay_wire_nested">
Please transfer <strong><t t-esc="_.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></strong> to
Please transfer <strong><t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></strong> to
<strong><t t-esc="doc.company_id[1]"/></strong> (postal address on the order header)
using one of the following bank accounts. Be sure to mention the document
reference <strong><t t-esc="doc.name"/></strong> on the transfer:
+829
View File
@@ -0,0 +1,829 @@
# Bengali translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
"PO-Revision-Date: 2011-11-21 12:43+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Bengali <bn@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: 2011-11-22 05:00+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: hr
#: model:process.node,name:hr.process_node_openerpuser0
msgid "Openerp user"
msgstr "Openerp ব্যাবহারকারী"
#. module: hr
#: view:hr.job:0
#: field:hr.job,requirements:0
msgid "Requirements"
msgstr "আবশ্যকতা"
#. module: hr
#: constraint:hr.department:0
msgid "Error! You can not create recursive departments."
msgstr "ভুল! আপনি রিকারসিভ দপ্তর তৈরি করতে পারবেন না।"
#. module: hr
#: model:process.transition,name:hr.process_transition_contactofemployee0
msgid "Link the employee to information"
msgstr "তথ্যের সাথে কর্মচারী যুক্ত করুন"
#. module: hr
#: field:hr.employee,sinid:0
msgid "SIN No"
msgstr "ন্যাশনাল আইডি নং"
#. module: hr
#: model:ir.module.module,shortdesc:hr.module_meta_information
#: model:ir.ui.menu,name:hr.menu_hr_deshboard
#: model:ir.ui.menu,name:hr.menu_hr_main
#: model:ir.ui.menu,name:hr.menu_hr_management
#: model:ir.ui.menu,name:hr.menu_hr_root
msgid "Human Resources"
msgstr "জনসম্পদ"
#. module: hr
#: view:hr.employee:0
#: view:hr.job:0
msgid "Group By..."
msgstr "...দিয়ে গ্রুপ করুন"
#. module: hr
#: model:ir.actions.act_window,help:hr.action_hr_job
msgid ""
"Job Positions are used to define jobs and their requirements. You can keep "
"track of the number of employees you have per job position and how many you "
"expect in the future. You can also attach a survey to a job position that "
"will be used in the recruitment process to evaluate the applicants for this "
"job position."
msgstr ""
#. module: hr
#: view:hr.employee:0
#: field:hr.employee,department_id:0
#: view:hr.job:0
#: field:hr.job,department_id:0
#: view:res.users:0
msgid "Department"
msgstr "বিভাগ"
#. module: hr
#: help:hr.installer,hr_attendance:0
msgid "Simplifies the management of employee's attendances."
msgstr "কর্মচারী উপস্থিতি ম্যানেজমেন্ট সহজতর করে"
#. module: hr
#: view:hr.job:0
msgid "Mark as Old"
msgstr ""
#. module: hr
#: view:hr.job:0
msgid "Jobs"
msgstr "কাজ"
#. module: hr
#: view:hr.job:0
msgid "In Recruitment"
msgstr "নিয়োগপ্রাপ্ত"
#. module: hr
#: view:hr.installer:0
msgid "title"
msgstr "শিরোনাম"
#. module: hr
#: field:hr.department,company_id:0
#: view:hr.employee:0
#: view:hr.job:0
#: field:hr.job,company_id:0
msgid "Company"
msgstr "কোম্পানি"
#. module: hr
#: field:hr.job,no_of_recruitment:0
msgid "Expected in Recruitment"
msgstr "নিয়োগে কাম্য"
#. module: hr
#: model:ir.ui.menu,name:hr.menu_open_view_attendance_reason_config
msgid "Holidays"
msgstr "ছুটির দিন"
#. module: hr
#: help:hr.installer,hr_holidays:0
msgid "Tracks employee leaves, allocation requests and planning."
msgstr "কর্মচারীদের ছুটির হিসাব রাখে"
#. module: hr
#: model:ir.model,name:hr.model_hr_employee_marital_status
msgid "Employee Marital Status"
msgstr "কর্মচারীর বৈবাহিক অবস্থা"
#. module: hr
#: help:hr.employee,partner_id:0
msgid ""
"Partner that is related to the current employee. Accounting transaction will "
"be written on this partner belongs to employee."
msgstr ""
#. module: hr
#: model:process.transition,name:hr.process_transition_employeeuser0
msgid "Link a user to an employee"
msgstr ""
#. module: hr
#: field:hr.installer,hr_contract:0
msgid "Employee's Contracts"
msgstr ""
#. module: hr
#: help:hr.installer,hr_payroll:0
msgid "Generic Payroll system."
msgstr ""
#. module: hr
#: view:hr.employee:0
msgid "My Departments Employee"
msgstr ""
#. module: hr
#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_married
msgid "Married"
msgstr ""
#. module: hr
#: constraint:hr.employee:0
msgid ""
"Error ! You cannot select a department for which the employee is the manager."
msgstr ""
#. module: hr
#: help:hr.employee,passport_id:0
msgid "Employee Passport Information"
msgstr ""
#. module: hr
#: model:ir.actions.act_window,help:hr.open_module_tree_department
msgid ""
"Your Company's Department Structure is used to manage all documents related "
"to employees by departments: expenses and timesheet validation, leaves "
"management, recruitments, etc."
msgstr ""
#. module: hr
#: view:hr.employee:0
msgid "Position"
msgstr "পদ"
#. module: hr
#: model:ir.actions.act_window,name:hr.action2
msgid "Employee Hierarchy"
msgstr ""
#. module: hr
#: model:process.transition,note:hr.process_transition_employeeuser0
msgid ""
"The Related user field on the Employee form allows to link the OpenERP user "
"(and her rights) to the employee."
msgstr ""
#. module: hr
#: view:hr.job:0
#: selection:hr.job,state:0
msgid "In Recruitement"
msgstr ""
#. module: hr
#: field:hr.employee,identification_id:0
msgid "Identification No"
msgstr ""
#. module: hr
#: field:hr.job,no_of_employee:0
msgid "No of Employee"
msgstr ""
#. module: hr
#: selection:hr.employee,gender:0
msgid "Female"
msgstr "মহিলা"
#. module: hr
#: help:hr.installer,hr_timesheet_sheet:0
msgid ""
"Tracks and helps employees encode and validate timesheets and attendances."
msgstr ""
#. module: hr
#: field:hr.installer,hr_evaluation:0
msgid "Periodic Evaluations"
msgstr ""
#. module: hr
#: field:hr.installer,hr_timesheet_sheet:0
msgid "Timesheets"
msgstr ""
#. module: hr
#: model:ir.actions.act_window,name:hr.open_view_employee_tree
msgid "Employees Structure"
msgstr ""
#. module: hr
#: view:hr.employee:0
msgid "Social IDs"
msgstr ""
#. module: hr
#: help:hr.job,no_of_employee:0
msgid "Number of employee with that job."
msgstr ""
#. module: hr
#: field:hr.employee,work_phone:0
msgid "Work Phone"
msgstr "কর্মস্থলের ফোন"
#. module: hr
#: field:hr.employee.category,child_ids:0
msgid "Child Categories"
msgstr ""
#. module: hr
#: view:hr.job:0
#: field:hr.job,description:0
#: model:ir.model,name:hr.model_hr_job
msgid "Job Description"
msgstr ""
#. module: hr
#: field:hr.employee,work_location:0
msgid "Office Location"
msgstr ""
#. module: hr
#: view:hr.employee:0
#: view:hr.job:0
#: model:ir.model,name:hr.model_hr_employee
#: model:process.node,name:hr.process_node_employee0
msgid "Employee"
msgstr ""
#. module: hr
#: model:process.node,note:hr.process_node_employeecontact0
msgid "Other information"
msgstr ""
#. module: hr
#: field:hr.employee,work_email:0
msgid "Work E-mail"
msgstr ""
#. module: hr
#: field:hr.department,complete_name:0
#: field:hr.employee.category,complete_name:0
msgid "Name"
msgstr "নাম"
#. module: hr
#: field:hr.employee,birthday:0
msgid "Date of Birth"
msgstr "জন্মদিন"
#. module: hr
#: model:ir.ui.menu,name:hr.menu_hr_reporting
msgid "Reporting"
msgstr ""
#. module: hr
#: model:ir.model,name:hr.model_ir_actions_act_window
msgid "ir.actions.act_window"
msgstr ""
#. module: hr
#: model:ir.actions.act_window,name:hr.open_board_hr
msgid "Human Resources Dashboard"
msgstr ""
#. module: hr
#: view:hr.employee:0
#: field:hr.employee,job_id:0
#: view:hr.job:0
msgid "Job"
msgstr ""
#. module: hr
#: view:hr.department:0
#: field:hr.department,member_ids:0
msgid "Members"
msgstr ""
#. module: hr
#: model:ir.ui.menu,name:hr.menu_hr_configuration
msgid "Configuration"
msgstr ""
#. module: hr
#: view:hr.installer:0
msgid ""
"You can enhance the base HR Application by installing few HR-related "
"functionalities."
msgstr ""
#. module: hr
#: view:hr.employee:0
msgid "Categories"
msgstr ""
#. module: hr
#: field:hr.job,expected_employees:0
msgid "Expected Employees"
msgstr ""
#. module: hr
#: help:hr.employee,sinid:0
msgid "Social Insurance Number"
msgstr ""
#. module: hr
#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_divorced
msgid "Divorced"
msgstr ""
#. module: hr
#: field:hr.employee.category,parent_id:0
msgid "Parent Category"
msgstr ""
#. module: hr
#: constraint:hr.employee.category:0
msgid "Error ! You cannot create recursive Categories."
msgstr ""
#. module: hr
#: view:hr.department:0
#: model:ir.actions.act_window,name:hr.open_module_tree_department
#: model:ir.ui.menu,name:hr.menu_hr_department_tree
#: view:res.users:0
#: field:res.users,context_department_id:0
msgid "Departments"
msgstr ""
#. module: hr
#: model:process.node,name:hr.process_node_employeecontact0
msgid "Employee Contact"
msgstr ""
#. module: hr
#: view:board.board:0
msgid "My Board"
msgstr ""
#. module: hr
#: selection:hr.employee,gender:0
msgid "Male"
msgstr ""
#. module: hr
#: field:hr.installer,progress:0
msgid "Configuration Progress"
msgstr ""
#. module: hr
#: model:ir.actions.act_window,name:hr.open_view_categ_form
#: model:ir.ui.menu,name:hr.menu_view_employee_category_form
msgid "Categories of Employee"
msgstr ""
#. module: hr
#: view:hr.employee.category:0
#: model:ir.model,name:hr.model_hr_employee_category
msgid "Employee Category"
msgstr ""
#. module: hr
#: field:hr.installer,config_logo:0
msgid "Image"
msgstr ""
#. module: hr
#: model:process.process,name:hr.process_process_employeecontractprocess0
msgid "Employee Contract"
msgstr ""
#. module: hr
#: help:hr.installer,hr_evaluation:0
msgid ""
"Lets you create and manage the periodic evaluation and performance review of "
"employees."
msgstr ""
#. module: hr
#: model:ir.model,name:hr.model_hr_department
msgid "hr.department"
msgstr ""
#. module: hr
#: help:hr.employee,parent_id:0
msgid "It is linked with manager of Department"
msgstr ""
#. module: hr
#: field:hr.installer,hr_recruitment:0
msgid "Recruitment Process"
msgstr ""
#. module: hr
#: field:hr.employee,category_ids:0
#: field:hr.employee.category,name:0
msgid "Category"
msgstr ""
#. module: hr
#: model:ir.actions.act_window,help:hr.open_view_employee_list_my
msgid ""
"Here you can manage your work force by creating employees and assigning them "
"specific properties in the system. Maintain all employee related information "
"and keep track of anything that needs to be recorded for them. The personal "
"information tab will help you maintain their identity data. The Categories "
"tab gives you the opportunity to assign them related employee categories "
"depending on their position and activities within the company. A category "
"can be a seniority level within the company or a department. The Timesheets "
"tab allows to assign them a specific timesheet and analytic journal where "
"they will be able to enter time through the system. In the note tab, you can "
"enter text data that should be recorded for a specific employee."
msgstr ""
#. module: hr
#: help:hr.employee,bank_account_id:0
msgid "Employee bank salary account"
msgstr ""
#. module: hr
#: field:hr.department,note:0
msgid "Note"
msgstr ""
#. module: hr
#: constraint:res.users:0
msgid "The chosen company is not in the allowed companies for this user"
msgstr ""
#. module: hr
#: view:hr.employee:0
msgid "Contact Information"
msgstr ""
#. module: hr
#: field:hr.employee,address_id:0
msgid "Working Address"
msgstr ""
#. module: hr
#: model:ir.actions.act_window,name:hr.open_board_hr_manager
msgid "HR Manager Dashboard"
msgstr ""
#. module: hr
#: view:hr.employee:0
msgid "Status"
msgstr ""
#. module: hr
#: view:hr.installer:0
msgid "Configure"
msgstr ""
#. module: hr
#: model:ir.actions.act_window,name:hr.open_view_categ_tree
#: model:ir.ui.menu,name:hr.menu_view_employee_category_tree
msgid "Categories structure"
msgstr ""
#. module: hr
#: field:hr.employee,partner_id:0
msgid "unknown"
msgstr ""
#. module: hr
#: field:hr.installer,hr_holidays:0
msgid "Holidays / Leaves Management"
msgstr ""
#. module: hr
#: field:hr.employee,ssnid:0
msgid "SSN No"
msgstr ""
#. module: hr
#: view:hr.employee:0
msgid "Active"
msgstr ""
#. module: hr
#: constraint:hr.employee:0
msgid "Error ! You cannot create recursive Hierarchy of Employees."
msgstr ""
#. module: hr
#: view:hr.department:0
msgid "Companies"
msgstr ""
#. module: hr
#: model:ir.module.module,description:hr.module_meta_information
msgid ""
"\n"
" Module for human resource management. You can manage:\n"
" * Employees and hierarchies : You can define your employee with User and "
"display hierarchies\n"
" * HR Departments\n"
" * HR Jobs\n"
" "
msgstr ""
#. module: hr
#: model:process.transition,note:hr.process_transition_contactofemployee0
msgid ""
"In the Employee form, there are different kind of information like Contact "
"information."
msgstr ""
#. module: hr
#: help:hr.job,expected_employees:0
msgid "Required number of Employees in total for that job."
msgstr ""
#. module: hr
#: selection:hr.job,state:0
msgid "Old"
msgstr ""
#. module: hr
#: field:hr.employee.marital.status,description:0
msgid "Status Description"
msgstr ""
#. module: hr
#: sql_constraint:res.users:0
msgid "You can not have two users with the same login !"
msgstr ""
#. module: hr
#: view:hr.job:0
#: field:hr.job,state:0
msgid "State"
msgstr ""
#. module: hr
#: field:hr.employee,marital:0
#: view:hr.employee.marital.status:0
#: field:hr.employee.marital.status,name:0
#: model:ir.actions.act_window,name:hr.action_hr_marital_status
#: model:ir.ui.menu,name:hr.hr_menu_marital_status
msgid "Marital Status"
msgstr ""
#. module: hr
#: help:hr.installer,hr_recruitment:0
msgid "Helps you manage and streamline your recruitment process."
msgstr ""
#. module: hr
#: model:process.node,note:hr.process_node_employee0
msgid "Employee form and structure"
msgstr ""
#. module: hr
#: field:hr.employee,photo:0
msgid "Photo"
msgstr ""
#. module: hr
#: model:ir.model,name:hr.model_res_users
msgid "res.users"
msgstr ""
#. module: hr
#: field:hr.installer,hr_payroll_account:0
msgid "Payroll Accounting"
msgstr ""
#. module: hr
#: view:hr.employee:0
msgid "Personal Information"
msgstr ""
#. module: hr
#: field:hr.employee,passport_id:0
msgid "Passport No"
msgstr ""
#. module: hr
#: view:res.users:0
msgid "Current Activity"
msgstr ""
#. module: hr
#: help:hr.installer,hr_expense:0
msgid ""
"Tracks and manages employee expenses, and can automatically re-invoice "
"clients if the expenses are project-related."
msgstr ""
#. module: hr
#: view:hr.job:0
msgid "Current"
msgstr ""
#. module: hr
#: field:hr.department,parent_id:0
msgid "Parent Department"
msgstr ""
#. module: hr
#: view:hr.employee.category:0
msgid "Employees Categories"
msgstr ""
#. module: hr
#: field:hr.employee,address_home_id:0
msgid "Home Address"
msgstr ""
#. module: hr
#: field:hr.installer,hr_attendance:0
#: model:ir.ui.menu,name:hr.menu_open_view_attendance_reason_new_config
msgid "Attendances"
msgstr ""
#. module: hr
#: view:hr.employee.marital.status:0
#: view:hr.job:0
msgid "Description"
msgstr ""
#. module: hr
#: help:hr.installer,hr_contract:0
msgid "Extends employee profiles to help manage their contracts."
msgstr ""
#. module: hr
#: field:hr.installer,hr_payroll:0
msgid "Payroll"
msgstr ""
#. module: hr
#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_single
msgid "Single"
msgstr ""
#. module: hr
#: field:hr.job,name:0
msgid "Job Name"
msgstr ""
#. module: hr
#: view:hr.job:0
#: selection:hr.job,state:0
msgid "In Position"
msgstr ""
#. module: hr
#: field:hr.employee,mobile_phone:0
msgid "Mobile"
msgstr ""
#. module: hr
#: view:hr.department:0
msgid "department"
msgstr ""
#. module: hr
#: field:hr.employee,country_id:0
msgid "Nationality"
msgstr ""
#. module: hr
#: view:hr.department:0
#: view:hr.employee:0
#: field:hr.employee,notes:0
msgid "Notes"
msgstr ""
#. module: hr
#: model:ir.model,name:hr.model_hr_installer
msgid "hr.installer"
msgstr ""
#. module: hr
#: view:board.board:0
msgid "HR Manager Board"
msgstr ""
#. module: hr
#: field:hr.employee,resource_id:0
msgid "Resource"
msgstr ""
#. module: hr
#: view:hr.installer:0
#: model:ir.actions.act_window,name:hr.action_hr_installer
msgid "Human Resources Application Configuration"
msgstr ""
#. module: hr
#: field:hr.employee,gender:0
msgid "Gender"
msgstr ""
#. module: hr
#: view:hr.employee:0
#: field:hr.job,employee_ids:0
#: model:ir.actions.act_window,name:hr.hr_employee_normal_action_tree
#: model:ir.actions.act_window,name:hr.open_view_employee_list
#: model:ir.actions.act_window,name:hr.open_view_employee_list_my
#: model:ir.ui.menu,name:hr.menu_open_view_employee_list_my
#: model:ir.ui.menu,name:hr.menu_view_employee_category_configuration_form
msgid "Employees"
msgstr ""
#. module: hr
#: field:hr.employee,bank_account_id:0
msgid "Bank Account"
msgstr ""
#. module: hr
#: field:hr.department,name:0
msgid "Department Name"
msgstr ""
#. module: hr
#: help:hr.employee,ssnid:0
msgid "Social Security Number"
msgstr ""
#. module: hr
#: model:process.node,note:hr.process_node_openerpuser0
msgid "Creation of a OpenERP user"
msgstr ""
#. module: hr
#: field:hr.department,child_ids:0
msgid "Child Departments"
msgstr ""
#. module: hr
#: model:ir.actions.act_window,name:hr.action_hr_job
#: model:ir.ui.menu,name:hr.menu_hr_job
msgid "Job Positions"
msgstr ""
#. module: hr
#: view:hr.employee:0
#: field:hr.employee,coach_id:0
msgid "Coach"
msgstr ""
#. module: hr
#: view:hr.installer:0
msgid "Configure Your Human Resources Application"
msgstr ""
#. module: hr
#: field:hr.installer,hr_expense:0
msgid "Expenses"
msgstr ""
#. module: hr
#: field:hr.department,manager_id:0
#: view:hr.employee:0
#: field:hr.employee,parent_id:0
msgid "Manager"
msgstr ""
#. module: hr
#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_widower
msgid "Widower"
msgstr ""
#. module: hr
#: help:hr.installer,hr_payroll_account:0
msgid "Generic Payroll system Integrated with Accountings."
msgstr ""
#. module: hr
#: field:hr.employee,child_ids:0
msgid "Subordinates"
msgstr ""
+1 -1
View File
@@ -39,7 +39,7 @@ level of employee hierarchy fills what and final review and evaluation
is done by the manager.Every evaluation filled by the employees can be viewed
in the form of pdf file. Implements a dashboard for My Current Evaluations
""",
"demo": [],
"demo": ["hr_evaluation_demo.xml"],
"data": [
"security/ir.model.access.csv",
"security/hr_evaluation_security.xml",
+1 -13
View File
@@ -1210,23 +1210,11 @@ Once the form had been filled, the employee send it to his supervisor.
<field eval="1" name="wait"/>
</record>
</data>
<data noupdate="1">
<record id="hr.employee" model="hr.employee">
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
</record>
<record id="hr.employee1" model="hr.employee">
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
</record>
<record id="hr.employee2" model="hr.employee">
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
</record>
<record id="hr.employee3" model="hr.employee">
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
</record>
</data>
<data>
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record id="hr.employee1" model="hr.employee">
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
</record>
<record id="hr.employee2" model="hr.employee">
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
</record>
<record id="hr.employee3" model="hr.employee">
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
</record>
</data>
</openerp>
+2 -1
View File
@@ -137,8 +137,9 @@ class hr_expense_expense(osv.osv):
inv_ids.append(self.browse(cr, uid, id).invoice_id.id)
return {
'name': _('Supplier Invoices'),
'view_type': 'form',
'view_mode': 'form',
'view_id': [res[1] if res else False],
'view_id': [res and res[1] or False],
'res_model': 'account.invoice',
'context': "{'type':'out_invoice', 'journal_type': 'purchase'}",
'type': 'ir.actions.act_window',
@@ -104,13 +104,6 @@
</record>
<record id="t10" model="workflow.transition">
<field name="act_from" ref="act_invoice"/>
<field name="act_to" ref="act_refused"/>
<field name="signal">subflow.cancel</field>
<field name="group_id" ref="base.group_hr_user"/>
</record>
<record id="t11" model="workflow.transition">
<field name="act_from" ref="act_refused"/>
<field name="act_to" ref="act_draft"/>
<field name="signal">draft</field>
@@ -39,7 +39,13 @@ class hr_payslip(osv.osv):
'journal_id': fields.many2one('account.journal', 'Expense Journal',states={'draft': [('readonly', False)]}, readonly=True, required=True),
'move_id': fields.many2one('account.move', 'Accounting Entry', readonly=True),
}
def copy(self, cr, uid, id, default=None, context=None):
if default is None:
default = {}
default['move_id'] = False
return super(hr_payslip, self).copy(cr, uid, id, default, context=context)
def create(self, cr, uid, vals, context=None):
if context is None:
context = {}
@@ -95,9 +101,9 @@ class hr_payslip(osv.osv):
partner_id = False
debit_account_id = line.salary_rule_id.account_debit.id
credit_account_id = line.salary_rule_id.account_credit.id
if debit_account_id:
debit_line = (0, 0, {
'name': line.name,
'date': timenow,
@@ -113,9 +119,9 @@ class hr_payslip(osv.osv):
})
line_ids.append(debit_line)
debit_sum += debit_line[2]['debit'] - debit_line[2]['credit']
if credit_account_id:
credit_line = (0, 0, {
'name': line.name,
'date': timenow,
@@ -147,7 +153,7 @@ class hr_payslip(osv.osv):
'credit': debit_sum - credit_sum,
})
line_ids.append(adjust_credit)
elif debit_sum < credit_sum:
acc_id = slip.journal_id.default_debit_account_id.id
if not acc_id:
+1 -1
View File
@@ -54,7 +54,7 @@ system to store and search in your CV base.
'hr_recruitment_data.xml'
],
'demo_xml': [
'hr_recruitment_demo.xml',
'hr_recruitment_demo.yml',
],
'test':['test/test_hr_recruitment.yml'],
'installable': True,
+22 -5
View File
@@ -197,11 +197,17 @@ class hr_applicant(crm.crm_case, osv.osv):
'color': 0,
}
def _read_group_stage_ids(self, cr, uid, ids, domain, context=None):
context = context or {}
def _read_group_stage_ids(self, cr, uid, ids, domain, read_group_order=None, context=None):
stage_obj = self.pool.get('hr.recruitment.stage')
stage_ids = stage_obj.search(cr, uid, ['|',('id','in',ids), ('department_id','=',False)], context=context)
return stage_obj.name_get(cr, uid, stage_ids, context=context)
order = stage_obj._order
if read_group_order == 'stage_id desc':
# lame hack to allow reverting search, should just work in the trivial case
order = "%s desc" % order
stage_ids = stage_obj.search(cr, uid, ['|',('id','in',ids),('department_id','=',False)], order=order, context=context)
result = stage_obj.name_get(cr, uid, stage_ids, context=context)
# restore order of the search
result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0])))
return result
_group_by_full = {
'stage_id': _read_group_stage_ids
@@ -440,7 +446,18 @@ class hr_applicant(crm.crm_case, osv.osv):
})
else:
raise osv.except_osv(_('Warning!'),_('You must define Applied Job for Applicant !'))
return self.case_close(cr, uid, ids, *args)
self.case_close(cr, uid, ids, *args)
mod_obj = self.pool.get('ir.model.data')
act = mod_obj.get_object_reference(cr, uid, 'hr', 'open_view_employee_list')
act_obj = self.pool.get('ir.actions.act_window')
act_win = act_obj.read(cr, uid, act[1], [])
act_win['domain'] = [('id','=',emp_id)]
act_win['view_mode'] = 'form,tree'
act_win['res_id'] = emp_id
return act_win
def case_reset(self, cr, uid, ids, *args):
"""Resets case as draft
@@ -19,19 +19,6 @@
</record>
<!-- CASE CATEGORY(categ_id) -->
<record model="crm.case.categ" id="categ_job1">
<field name="name">Salesman</field>
<field name="object_id" search="[('model','=','hr.applicant')]" model="ir.model"/>
</record>
<record model="crm.case.categ" id="categ_job2">
<field name="name">Junior Developer</field>
<field name="object_id" search="[('model','=','hr.applicant')]" model="ir.model"/>
</record>
<!-- Resource(type_id) -->
<record model="hr.recruitment.degree" id="degree_graduate">
@@ -1,178 +0,0 @@
<?xml version="1.0"?>
<openerp>
<data noupdate="1">
<!--
((((((((((( Demo Cases )))))))))))
-->
<!--For Jobs Requests-->
<record id="hr_case_salesman0" model="hr.applicant">
<field eval="time.strftime('%Y-%m-01 10:35:50')" name="date"/>
<field eval="time.strftime('%Y-%m-03')" name="date_deadline"/>
<field name="type_id" ref="degree_graduate"/>
<field name="partner_id" ref="base.res_partner_asus"/>
<field eval="'2'" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field eval="'Enrique Jones'" name="partner_name"/>
<field eval="'draft'" name="state"/>
<field eval="'enrique@rediff.com'" name="partner_name2"/>
<field eval="'9963214587'" name="partner_mobile"/>
<field eval="1" name="active"/>
<field eval="9.0" name="duration"/>
<field name="categ_id" ref="categ_job1"/>
<field name="stage_id" ref="stage_job1"/>
<field eval="'Salesman'" name="name"/>
<field eval="'1236547890'" name="partner_phone"/>
</record>
<record id="hr_case_traineemca0" model="hr.applicant">
<field name="partner_address_id" ref="base.res_partner_address_14"/>
<field eval="time.strftime('%Y-%m-10 18:15:00')" name="date"/>
<field name="type_id" ref="degree_bac5"/>
<field name="partner_id" ref="base.res_partner_15"/>
<field eval="'3'" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field eval="'Marie Justine'" name="partner_name"/>
<field eval="'open'" name="state"/>
<field eval="5.15" name="duration"/>
<field eval="'marie@gmail.com'" name="partner_name2"/>
<field eval="'9988774455'" name="partner_mobile"/>
<field eval="1" name="active"/>
<field name="categ_id" ref="categ_job2"/>
<field name="stage_id" ref="stage_job4"/>
<field eval="'Trainee - MCA'" name="name"/>
<field eval="time.strftime('%Y-%m-15')" name="date_deadline"/>
<field eval="'6633225'" name="partner_phone"/>
</record>
<record id="hr_case_fresher0" model="hr.applicant">
<field eval="time.strftime('%Y-%m-15 16:10:00')" name="date"/>
<field eval="time.strftime('%Y-%m-18')" name="date_deadline"/>
<field name="type_id" ref="degree_licenced"/>
<field name="partner_id" ref="base.res_partner_5"/>
<field eval="'1'" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field eval="1.45" name="duration"/>
<field eval="'Jose'" name="partner_name"/>
<field eval="'pending'" name="state"/>
<field eval="'jose@timesgroup.com'" name="partner_name2"/>
<field eval="1" name="active"/>
<field name="categ_id" ref="categ_job1"/>
<field name="stage_id" ref="stage_job3"/>
<field eval="'Fresher'" name="name"/>
<field eval="'999666735'" name="partner_phone"/>
</record>
<record id="hr_case_yrsexperienceinphp0" model="hr.applicant">
<field eval="time.strftime('%Y-%m-25 16:25:52')" name="date"/>
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
<field name="categ_id" ref="categ_job2"/>
<field name="type_id" ref="degree_bac5"/>
<field name="partner_id" ref="base.res_partner_10"/>
<field eval="'3'" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field eval="1.35" name="duration"/>
<field eval="'Sandra Elvis'" name="partner_name"/>
<field eval="'sandra@example.com'" name="partner_name2"/>
<field eval="'cancel'" name="state"/>
<field eval="1" name="active"/>
<field name="stage_id" ref="stage_job6"/>
<field eval="'More than 5 yrs Experience in PHP'" name="name"/>
</record>
<record id="hr_case_marketingjob0" model="hr.applicant">
<field eval="time.strftime('%Y-%m-26 17:15:32')" name="date"/>
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
<field name="type_id" ref="degree_licenced"/>
<field name="partner_id" ref="base.res_partner_11"/>
<field eval="'4'" name="priority"/>
<field name="user_id" ref="base.user_demo"/>
<field eval="2.0" name="duration"/>
<field eval="'John Bruno'" name="partner_name"/>
<field eval="'done'" name="state"/>
<field eval="'john@market.edu'" name="partner_name2"/>
<field eval="'9966332214'" name="partner_mobile"/>
<field eval="1" name="active"/>
<field name="categ_id" ref="categ_job1"/>
<field name="stage_id" ref="stage_job5"/>
<field eval="'Marketing Job'" name="name"/>
<field eval="'33968745'" name="partner_phone"/>
</record>
<record id="hr_case_financejob0" model="hr.applicant">
<field eval="time.strftime('%Y-%m-26 17:39:42')" name="date"/>
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
<field name="type_id" ref="degree_licenced"/>
<field name="partner_id" ref="base.res_partner_11"/>
<field eval="'4'" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field eval="'David Armstrong'" name="partner_name"/>
<field eval="'done'" name="state"/>
<field eval="'david@market.edu'" name="partner_name2"/>
<field eval="'9966332214'" name="partner_mobile"/>
<field eval="1" name="active"/>
<field eval="2.20" name="duration"/>
<field name="categ_id" ref="categ_job1"/>
<field name="stage_id" ref="stage_job5"/>
<field eval="'Finance Job'" name="name"/>
<field eval="'33968745'" name="partner_phone"/>
</record>
<record id="hr_case_traineemca1" model="hr.applicant">
<field name="partner_address_id" ref="base.res_partner_address_14"/>
<field eval="time.strftime('%Y-%m-12 17:49:19')" name="date"/>
<field name="type_id" ref="degree_bac5"/>
<field name="partner_id" ref="base.res_partner_15"/>
<field eval="'3'" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field eval="'Tina Augustie'" name="partner_name"/>
<field eval="'open'" name="state"/>
<field eval="1.15" name="duration"/>
<field eval="'tina_augustie@example.com'" name="partner_name2"/>
<field eval="'9898745745'" name="partner_mobile"/>
<field eval="1" name="active"/>
<field name="categ_id" ref="categ_job2"/>
<field name="stage_id" ref="stage_job4"/>
<field eval="'Trainee - MCA'" name="name"/>
<field eval="time.strftime('%Y-%m-15')" name="date_deadline"/>
<field eval="'6630125'" name="partner_phone"/>
</record>
<record id="hr_case_programmer" model="hr.applicant">
<field name="partner_address_id" ref="base.res_partner_address_14"/>
<field eval="time.strftime('%Y-%m-12 17:49:19')" name="date"/>
<field name="type_id" ref="degree_bac5"/>
<field name="partner_id" ref="base.res_partner_15"/>
<field eval="'3'" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field eval="'Shane Williams'" name="partner_name"/>
<field eval="'open'" name="state"/>
<field eval="1.15" name="duration"/>
<field eval="'tina_augustie@example.com'" name="partner_name2"/>
<field eval="'9812398524'" name="partner_mobile"/>
<field eval="1" name="active"/>
<field name="categ_id" ref="categ_job2"/>
<field name="stage_id" ref="stage_job4"/>
<field eval="'Programmer'" name="name"/>
<field eval="time.strftime('%Y-%m-15')" name="date_deadline"/>
<field eval="'6630125'" name="partner_phone"/>
<field name="job_id" ref="hr.job_jr_appli"/>
<field name="department_id" ref="hr.dep_it"/>
<field eval="11000.0" name="salary_expected"/>
</record>
<record id="hr_case_advertisement" model="hr.applicant">
<field eval="time.strftime('%Y-%m-26 17:39:42')" name="date"/>
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
<field name="type_id" ref="degree_licenced"/>
<field name="partner_id" ref="base.res_partner_11"/>
<field eval="'4'" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field eval="'David Armstrong'" name="partner_name"/>
<field eval="'done'" name="state"/>
<field eval="'david@market.edu'" name="partner_name2"/>
<field eval="'9925741564'" name="partner_mobile"/>
<field eval="1" name="active"/>
<field eval="2.20" name="duration"/>
<field name="categ_id" ref="categ_job1"/>
<field name="stage_id" ref="stage_job5"/>
<field eval="'Advertisement'" name="name"/>
<field eval="'25968745'" name="partner_phone"/>
<field eval="11000.0" name="salary_expected"/>
</record>
</data>
</openerp>
@@ -0,0 +1,109 @@
-
!record {model: hr.applicant, id: hr_case_salesman0}:
date: !eval time.strftime('%Y-%m-01 10:35:50')
type_id: degree_graduate
priority: '2'
partner_name: 'Enrique Jones'
partner_mobile: '9963214587'
job_id: hr.job_jr_appli
stage_id: stage_job1
name: 'Salesman'
partner_phone: '1236547890'
-
!record {model: hr.applicant, id: hr_case_traineemca0}:
partner_address_id: base.res_partner_address_14
date: !eval time.strftime('%Y-%m-10 18:15:00')
type_id: degree_bac5
priority: '3'
user_id: base.user_demo
partner_name: 'Marie Justine'
state: 'open'
partner_mobile: '9988774455'
job_id: hr.job_jr_appli
stage_id: stage_job4
name: 'Trainee - MCA'
partner_phone: '6633225'
-
!record {model: hr.applicant, id: hr_case_fresher0}:
date: !eval time.strftime('%Y-%m-15 16:10:00')
type_id: degree_licenced
priority: '1'
user_id: base.user_root
partner_name: 'Jose'
job_id: hr.job_jr_appli
stage_id: stage_job3
name: 'Fresher'
partner_phone: '999666735'
-
!record {model: hr.applicant, id: hr_case_yrsexperienceinphp0}:
date: !eval time.strftime('%Y-%m-25 16:25:52')
job_id: hr.job_jr_appli
type_id: degree_bac5
user_id: base.user_root
partner_name: 'Sandra Elvis'
state: 'cancel'
stage_id: stage_job6
name: 'More than 5 yrs Experience in PHP'
-
!record {model: hr.applicant, id: hr_case_marketingjob0}:
date: !eval time.strftime('%Y-%m-26 17:15:32')
type_id: degree_licenced
user_id: base.user_demo
partner_name: 'John Bruno'
state: 'done'
job_id: hr.job_jr_appli
stage_id: stage_job5
name: 'Marketing Job'
-
!record {model: hr.applicant, id: hr_case_financejob0}:
date: !eval time.strftime('%Y-%m-26 17:39:42')
type_id: degree_licenced
priority: '4'
partner_name: 'David Armstrong'
state: 'pending'
state: open
partner_mobile: '9966332214'
job_id: hr.job_jr_appli
stage_id: stage_job2
name: 'Finance Job'
partner_phone: '33968745'
-
!record {model: hr.applicant, id: hr_case_traineemca1}:
partner_address_id: base.res_partner_address_14
date: !eval time.strftime('%Y-%m-12 17:49:19')
type_id: degree_bac5
partner_name: 'Tina Augustie'
state: 'open'
partner_mobile: '9898745745'
job_id: hr.job_jr_appli
stage_id: stage_job4
name: 'Trainee - MCA'
partner_phone: '6630125'
-
!record {model: hr.applicant, id: hr_case_programmer}:
partner_address_id: base.res_partner_address_14
date: !eval time.strftime('%Y-%m-12 17:49:19')
type_id: degree_bac5
partner_name: 'Shane Williams'
state: 'open'
partner_mobile: '9812398524'
stage_id: stage_job4
name: 'Programmer'
partner_phone: '6630125'
job_id: hr.job_jr_appli
department_id: hr.dep_it
salary_expected: 11000.0
-
!record {model: hr.applicant, id: hr_case_advertisement}:
date: !eval time.strftime('%Y-%m-26 17:39:42')
type_id: degree_licenced
partner_id: base.res_partner_11
partner_name: 'David Armstrong'
job_id: hr.job_jr_appli
stage_id: stage_job2
name: 'Advertisement'
salary_expected: 11000.0
@@ -48,8 +48,7 @@ class hired_employee(osv.osv_memory):
"""
if context is None:
context = {}
self.pool.get('hr.applicant').case_close_with_emp(cr, uid,context.get('active_ids', []))
return {}
return self.pool.get('hr.applicant').case_close_with_emp(cr, uid,context.get('active_ids', []))
hired_employee()
+5 -3
View File
@@ -2,9 +2,6 @@
<openerp>
<data>
<record id="hr.employee" model="hr.employee">
<field name="product_id" ref="product.product_consultant"/>
</record>
<record id="analytic_journal" model="account.analytic.journal">
<field name="code">TS</field>
@@ -12,5 +9,10 @@
<field name="type">general</field>
</record>
<record id="hr.employee" model="hr.employee">
<field name="product_id" ref="product.product_consultant"/>
<field name="journal_id" ref="analytic_journal"/>
</record>
</data>
</openerp>
+36
View File
@@ -0,0 +1,36 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-07 06:40+0000\n"
"PO-Revision-Date: 2011-11-20 09:22+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: l10n_br
#: model:ir.actions.todo,note:l10n_br.config_call_account_template_brazilian_localization
msgid ""
"Generate Chart of Accounts from a Chart Template. You will be asked to pass "
"the name of the company, the chart template to follow, the no. of digits to "
"generate the code for your accounts and Bank account, currency to create "
"Journals. Thus,the pure copy of chart Template is generated.\n"
" This is the same wizard that runs from Financial "
"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
"Chart of Accounts from a Chart Template."
msgstr ""
#. module: l10n_br
#: model:ir.module.module,description:l10n_br.module_meta_information
#: model:ir.module.module,shortdesc:l10n_br.module_meta_information
msgid "Brazilian Localization"
msgstr "Localizacion brasilièra"
+1 -1
View File
@@ -63,7 +63,7 @@ TODO :
""",
"version" : "6.1",
"author" : "Camptocamp",
"category" : "Finance",
'category': 'Localization/Account Charts',
"website": "http://www.camptocamp.com",
"depends" : [
+39
View File
@@ -0,0 +1,39 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
"PO-Revision-Date: 2011-11-20 09:22+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: l10n_es
#: model:ir.module.module,shortdesc:l10n_es.module_meta_information
msgid "Spanish Charts of Accounts (PGCE 2008)"
msgstr "Plan comptable espanhòl (PGCE 2008)"
#. module: l10n_es
#: model:ir.module.module,description:l10n_es.module_meta_information
msgid ""
"Spanish Charts of Accounts (PGCE 2008)\n"
"\n"
"* Defines the following chart of account templates:\n"
" * Spanish General Chart of Accounts 2008.\n"
" * Spanish General Chart of Accounts 2008 for small and medium "
"companies.\n"
"* Defines templates for sale and purchase VAT.\n"
"* Defines tax code templates.\n"
"\n"
"Note: You should install the l10n_ES_account_balance_report module\n"
"for yearly account reporting (balance, profit & losses).\n"
msgstr ""
+39
View File
@@ -0,0 +1,39 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
"PO-Revision-Date: 2011-11-20 09:23+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: l10n_gt
#: model:ir.module.module,shortdesc:l10n_gt.module_meta_information
msgid "Guatemala - Plan contable general"
msgstr "Guatemala - Plan comptable general"
#. module: l10n_gt
#: model:ir.actions.todo,note:l10n_gt.config_call_account_template_gt_minimal
msgid ""
"Generar la nomenclatura contable a partir de un modelo. Deberá seleccionar "
"una compañía, el modelo a utilizar, el número de digitos a usar en la "
"nomenclatura, la moneda para crear los diarios."
msgstr ""
#. module: l10n_gt
#: model:ir.module.module,description:l10n_gt.module_meta_information
msgid ""
"Agrega una nomenclatura contable para Guatemala. También icluye impuestos y "
"la moneda del Quetzal. -- Adds accounting chart for Guatemala. It also "
"includes taxes and the Quetzal currency"
msgstr ""
+46
View File
@@ -0,0 +1,46 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
"PO-Revision-Date: 2011-11-20 09:23+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: l10n_in
#: model:ir.module.module,description:l10n_in.module_meta_information
msgid ""
"\n"
" Indian Accounting : chart of Account\n"
" "
msgstr ""
"\n"
" Comptabilitat indiana : plan de comptes\n"
" "
#. module: l10n_in
#: model:ir.module.module,shortdesc:l10n_in.module_meta_information
msgid "Indian Chart of Account"
msgstr "Plan comptable indian"
#. module: l10n_in
#: model:ir.actions.todo,note:l10n_in.config_call_account_template_in_minimal
msgid ""
"Generate Chart of Accounts from a Chart Template. You will be asked to pass "
"the name of the company, the chart template to follow, the no. of digits to "
"generate the code for your accounts and Bank account, currency to create "
"Journals. Thus,the pure copy of chart Template is generated.\n"
"\tThis is the same wizard that runs from Financial "
"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
"Chart of Accounts from a Chart Template."
msgstr ""
+2 -2
View File
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-17 05:22+0000\n"
"X-Generator: Launchpad (build 14291)\n"
"X-Launchpad-Export-Date: 2011-11-18 05:13+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: l10n_th
#: model:ir.actions.todo,note:l10n_th.config_call_account_template_th
+1 -1
View File
@@ -107,7 +107,7 @@
<field name="name">Membership Products</field>
<field name="res_model">product.product</field>
<field name="domain">[('membership','=',True), ('type', '=', 'service')]</field>
<field name="context">{'membership':True, 'type':'service'}</field>
<field name="context">{'membership':True, 'type':'service', 'default_membership': True, 'default_type': 'service'}</field>
<field name="search_view_id" ref="membership_product_search_form_view"/>
</record>
+3
View File
@@ -491,6 +491,9 @@ class mrp_production(osv.osv):
'name': lambda x, y, z, c: x.pool.get('ir.sequence').get(y, z, 'mrp.production') or '/',
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.production', context=c),
}
_sql_constraints = [
('name_uniq', 'unique(name, company_id)', 'Reference must be unique per Company!'),
]
_order = 'priority desc, date_planned asc';
def _check_qty(self, cr, uid, ids, context=None):
-2
View File
@@ -179,11 +179,9 @@
-
!record {model: mrp.production, id: mrp_production_mo0}:
bom_id: mrp.mrp_bom_orangejuice0
company_id: base.main_company
date_planned: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S")
location_dest_id: stock.stock_location_output
location_src_id: stock.stock_location_stock
name: MO/00002
product_id: mrp.product_product_orangejuice0
product_lines:
- name: Orange
@@ -106,14 +106,11 @@
-
!record {model: mrp.production, id: mrp_production_mo0}:
bom_id: mrp_bom_woodenchair0
company_id: base.main_company
date_planned: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S")
location_dest_id: stock.stock_location_stock
location_src_id: stock.stock_location_stock
name: MO/00004
product_id: product_product_woodenchair0
product_qty: 10.0
product_uom: product.product_uom_unit
product_uos_qty: 0.0
-
I compute the data of production order.
@@ -74,7 +74,7 @@
-
I click on the "Make Payment" wizard to pay the PoS order with a partial amount of 100.0 EUR
-
!record {model: pos.make.payment, id: pos_make_payment_0, context: {'active_id': ref('pos_order_pos0'), 'active_ids': [ref('pos_order_pos0')]} }:
!record {model: pos.make.payment, id: pos_make_payment_0, context: '{"active_id": ref("pos_order_pos0"), "active_ids": [ref("pos_order_pos0")]}' }:
amount: 100.0
-
I click on the validate button to register the payment.
@@ -95,7 +95,7 @@
-
I pay the remaining balance.
-
!record {model: pos.make.payment, id: pos_make_payment_1, context: {'active_id': [ref('pos_order_pos0')], 'active_ids': [ref('pos_order_pos0')]} }:
!record {model: pos.make.payment, id: pos_make_payment_1, context: '{"active_id": ref("pos_order_pos0"), "active_ids": [ref("pos_order_pos0")]}' }:
amount: !eval >
(450*2 + 300*3*1.05)*0.95-100.0
-
@@ -18,7 +18,7 @@
-
I click on the "Make Payment" wizard to pay the PoS order
-
!record {model: pos.make.payment, id: pos_make_payment_2, context: {'active_id': ref('pos_order_pos1'), 'active_ids': [ref('pos_order_pos1')]} }:
!record {model: pos.make.payment, id: pos_make_payment_2, context: '{"active_id": ref("pos_order_pos1"), "active_ids": [ref("pos_order_pos1")]}' }:
amount: !eval >
(450*2 + 300*3*1.05)*0.95
-
+97 -44
View File
@@ -78,7 +78,7 @@ class project(osv.osv):
return {'value':{'contact_id': False}}
addr = partner_obj.address_get(cr, uid, [part], ['contact'])
val = {'contact_id': addr['contact']}
if pricelist_id in self._columns:
if 'pricelist_id' in self.fields_get(cr, uid, context=context):
pricelist = partner_obj.read(cr, uid, part, ['property_product_pricelist'], context=context)
pricelist_id = pricelist.get('property_product_pricelist', False) and pricelist.get('property_product_pricelist')[0] or False
val['pricelist_id'] = pricelist_id
@@ -424,21 +424,53 @@ class task(osv.osv):
_log_create = True
_date_name = "date_start"
def _read_group_type_id(self, cr, uid, ids, domain, context=None):
context = context or {}
stage_obj = self.pool.get('project.task.type')
stage_ids = stage_obj.search(cr, uid, ['|',('id','in',ids)] + [('project_default','=',1)], context=context)
return stage_obj.name_get(cr, uid, stage_ids, context=context)
def _read_group_user_id(self, cr, uid, ids, domain, context={}):
context = context or {}
if type(context.get('project_id', None)) not in (int, long):
return None
proj = self.pool.get('project.project').browse(cr, uid, context['project_id'], context=context)
ids += map(lambda x: x.id, proj.members)
stage_obj = self.pool.get('res.users')
stage_ids = stage_obj.search(cr, uid, [('id','in',ids)], context=context)
return stage_obj.name_get(cr, uid, ids, context=context)
def _resolve_project_id_from_context(self, cr, uid, context=None):
"""Return ID of project based on the value of 'project_id'
context key, or None if it cannot be resolved to a single project.
"""
if context is None: context = {}
if type(context.get('project_id')) in (int, long):
project_id = context['project_id']
return project_id
if isinstance(context.get('project_id'), basestring):
project_name = context['project_id']
project_ids = self.pool.get('project.project').name_search(cr, uid, name=project_name)
if len(project_ids) == 1:
return project_ids[0][0]
def _read_group_type_id(self, cr, uid, ids, domain, read_group_order=None, context=None):
stage_obj = self.pool.get('project.task.type')
project_id = self._resolve_project_id_from_context(cr, uid, context=context)
order = stage_obj._order
if read_group_order == 'type_id desc':
# lame way to allow reverting search, should just work in the trivial case
order = '%s desc' % order
if project_id:
domain = ['|', ('id','in',ids), ('project_ids','in',project_id)]
else:
domain = ['|', ('id','in',ids), ('project_default','=',1)]
stage_ids = stage_obj.search(cr, uid, domain, order=order, context=context)
result = stage_obj.name_get(cr, uid, stage_ids, context=context)
# restore order of the search
result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0])))
return result
def _read_group_user_id(self, cr, uid, ids, domain, read_group_order=None, context=None):
res_users = self.pool.get('res.users')
project_id = self._resolve_project_id_from_context(cr, uid, context=context)
if project_id:
ids += self.pool.get('project.project').read(cr, uid, project_id, ['members'], context=context)['members']
order = res_users._order
# lame way to allow reverting search, should just work in the trivial case
if read_group_order == 'user_id desc':
order = '%s desc' % order
# de-duplicate and apply search order
ids = res_users.search(cr, uid, [('id','in',ids)], order=order, context=context)
result = res_users.name_get(cr, uid, ids, context=context)
# restore order of the search
result.sort(lambda x,y: cmp(ids.index(x[0]), ids.index(y[0])))
return result
_group_by_full = {
'type_id': _read_group_type_id,
@@ -560,7 +592,12 @@ class task(osv.osv):
'state': fields.selection([('draft', 'New'),('open', 'In Progress'),('pending', 'Pending'), ('done', 'Done'), ('cancelled', 'Cancelled')], 'State', readonly=True, required=True,
help='If the task is created the state is \'Draft\'.\n If the task is started, the state becomes \'In Progress\'.\n If review is needed the task is in \'Pending\' state.\
\n If the task is over, the states is set to \'Done\'.'),
'kanban_state': fields.selection([('blocked', 'Blocked'),('normal', 'Normal'),('done', 'Done')], 'Kanban State', readonly=True, required=False),
'kanban_state': fields.selection([('normal', 'Normal'),('blocked', 'Blocked'),('done', 'Ready To Pull')], 'Kanban State',
help="A task's kanban state indicates special situations affecting it:\n"
" * Normal is the default situation\n"
" * Blocked indicates something is preventing the progress of this task\n"
" * Ready To Pull indicates the task is ready to be pulled to the next stage",
readonly=True, required=False),
'create_date': fields.datetime('Create Date', readonly=True,select=True),
'date_start': fields.datetime('Starting Date',select=True),
'date_end': fields.datetime('Ending Date',select=True),
@@ -840,37 +877,39 @@ class task(osv.osv):
self.write(cr, uid, ids, {'state': 'draft'}, context=context)
return True
def do_delegate(self, cr, uid, task_id, delegate_data={}, context=None):
def do_delegate(self, cr, uid, ids, delegate_data={}, context=None):
"""
Delegate Task to another users.
"""
task = self.browse(cr, uid, task_id, context=context)
self.copy(cr, uid, task.id, {
'name': delegate_data['name'],
'user_id': delegate_data['user_id'],
'planned_hours': delegate_data['planned_hours'],
'remaining_hours': delegate_data['planned_hours'],
'parent_ids': [(6, 0, [task.id])],
'state': 'draft',
'description': delegate_data['new_task_description'] or '',
'child_ids': [],
'work_ids': []
}, context=context)
newname = delegate_data['prefix'] or ''
self.write(cr, uid, [task.id], {
'remaining_hours': delegate_data['planned_hours_me'],
'planned_hours': delegate_data['planned_hours_me'] + (task.effective_hours or 0.0),
'name': newname,
}, context=context)
if delegate_data['state'] == 'pending':
self.do_pending(cr, uid, [task.id], context)
else:
self.do_close(cr, uid, [task.id], context=context)
user_pool = self.pool.get('res.users')
delegate_user = user_pool.browse(cr, uid, delegate_data['user_id'], context=context)
message = _("The task '%s' has been delegated to %s.") % (delegate_data['name'], delegate_user.name)
self.log(cr, uid, task.id, message)
return True
assert delegate_data['user_id'], _("Delegated User should be specified")
delegrated_tasks = {}
for task in self.browse(cr, uid, ids, context=context):
delegrated_task_id = self.copy(cr, uid, task.id, {
'name': delegate_data['name'],
'project_id': delegate_data['project_id'] and delegate_data['project_id'][0] or False,
'user_id': delegate_data['user_id'] and delegate_data['user_id'][0] or False,
'planned_hours': delegate_data['planned_hours'] or 0.0,
'parent_ids': [(6, 0, [task.id])],
'state': 'draft',
'description': delegate_data['new_task_description'] or '',
'child_ids': [],
'work_ids': []
}, context=context)
newname = delegate_data['prefix'] or ''
task.write({
'remaining_hours': delegate_data['planned_hours_me'],
'planned_hours': delegate_data['planned_hours_me'] + (task.effective_hours or 0.0),
'name': newname,
}, context=context)
if delegate_data['state'] == 'pending':
self.do_pending(cr, uid, task.id, context=context)
elif delegate_data['state'] == 'done':
self.do_close(cr, uid, task.id, context=context)
message = _("The task '%s' has been delegated to %s.") % (delegate_data['name'], delegate_data['user_id'][1])
self.log(cr, uid, task.id, message)
delegrated_tasks[task.id] = delegrated_task_id
return delegrated_tasks
def do_pending(self, cr, uid, ids, context={}):
self.write(cr, uid, ids, {'state': 'pending'}, context=context)
@@ -933,6 +972,20 @@ class task(osv.osv):
def prev_type(self, cr, uid, ids, *args):
return self._change_type(cr, uid, ids, False, *args)
# Overridden to reset the kanban_state to normal whenever
# the stage (type_id) of the task changes.
def write(self, cr, uid, ids, vals, context=None):
if isinstance(ids, (int, long)):
ids = [ids]
if vals and not 'kanban_state' in vals and 'type_id' in vals:
new_stage = vals.get('type_id')
vals_reset_kstate = dict(vals, kanban_state='normal')
for t in self.browse(cr, uid, ids, context=context):
write_vals = vals_reset_kstate if t.type_id != new_stage else vals
super(task,self).write(cr, uid, [t.id], write_vals, context=context)
return True
return super(task,self).write(cr, uid, ids, vals, context=context)
def unlink(self, cr, uid, ids, context=None):
if context == None:
context = {}
+29 -7
View File
@@ -31,14 +31,23 @@ class project_task_delegate(osv.osv_memory):
_columns = {
'name': fields.char('Delegated Title', size=64, required=True, help="New title of the task delegated to the user"),
'prefix': fields.char('Your Task Title', size=64, required=True, help="Title for your validation task"),
'prefix': fields.char('Your Task Title', size=64, help="Title for your validation task"),
'project_id': fields.many2one('project.project', 'Project', help="User you want to delegate this task to"),
'user_id': fields.many2one('res.users', 'Assign To', required=True, help="User you want to delegate this task to"),
'new_task_description': fields.text('New Task Description', help="Reinclude the description of the task in the task of the user"),
'planned_hours': fields.float('Planned Hours', help="Estimated time to close this task by the delegated user"),
'planned_hours_me': fields.float('Hours to Validate', required=True, help="Estimated time for you to validate the work done by the user to whom you delegate this task"),
'state': fields.selection([('pending','Pending'), ('done','Done'), ], 'Validation State', required=True, help="New state of your own task. Pending will be reopened automatically when the delegated task is closed")
'planned_hours_me': fields.float('Hours to Validate', help="Estimated time for you to validate the work done by the user to whom you delegate this task"),
'state': fields.selection([('pending','Pending'), ('done','Done'), ], 'Validation State', help="New state of your own task. Pending will be reopened automatically when the delegated task is closed")
}
def onchange_project_id(self, cr, uid, ids, project_id=False, context=None):
project_project = self.pool.get('project.project')
if not project_id:
return {'value':{'user_id': False}}
project = project_project.browse(cr, uid, project_id, context=context)
return {'value': {'user_id': project.user_id and project.user_id.id or False}}
def default_get(self, cr, uid, fields, context=None):
"""
This function gets default values
@@ -47,10 +56,15 @@ class project_task_delegate(osv.osv_memory):
if context is None:
context = {}
record_id = context and context.get('active_id', False) or False
if not record_id:
return res
task_pool = self.pool.get('project.task')
task = task_pool.browse(cr, uid, record_id, context=context)
task_name =tools.ustr(task.name)
if 'project_id' in fields:
res.update({'project_id': task.project_id and task.project_id.id})
if 'name' in fields:
if task_name.startswith(_('CHECK: ')):
newname = tools.ustr(task_name).replace(_('CHECK: '), '')
@@ -105,9 +119,17 @@ class project_task_delegate(osv.osv_memory):
task_id = context.get('active_id', False)
task_pool = self.pool.get('project.task')
delegate_data = self.read(cr, uid, ids, context=context)[0]
delegate_data['user_id'] = delegate_data['user_id'][0]
delegate_data['name'] = tools.ustr(delegate_data['name'])
task_pool.do_delegate(cr, uid, task_id, delegate_data, context=context)
return {'type': 'ir.actions.act_window_close'}
delegated_tasks = task_pool.do_delegate(cr, uid, [task_id], delegate_data, context=context)
models_data = self.pool.get('ir.model.data')
action_model, action_id = models_data.get_object_reference(cr, uid, 'project', 'action_view_task')
view_model, task_view_form_id = models_data.get_object_reference(cr, uid, 'project', 'view_task_form2')
view_model, task_view_tree_id = models_data.get_object_reference(cr, uid, 'project', 'view_task_tree2')
action = self.pool.get(action_model).read(cr, uid, action_id, context=context)
action['res_id'] = delegated_tasks[task_id]
action['view_id'] = False
action['views'] = [(task_view_form_id, 'form'), (task_view_tree_id, 'tree')]
action['help'] = False
return action
project_task_delegate()
@@ -8,18 +8,19 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Project Task Delegate">
<field name="project_id" on_change="onchange_project_id(project_id)"/>
<field name="user_id"/>
<group colspan="2" col="2">
<separator string="Delegated Task" colspan="4"/>
<field name="user_id" colspan="4"/>
<field name="planned_hours" widget="float_time" colspan="4"/>
<field name="name" colspan="4"/>
<field name="name"/>
<field name="planned_hours"/>
<separator string="New Task Description" colspan="4"/>
<field name="new_task_description" colspan="4" nolabel="1"/>
<field name="new_task_description" colspan="4" nolabel="1"/>
</group>
<group colspan="2" col="2">
<separator string="Validation Task" colspan="4"/>
<field name="planned_hours_me" widget="float_time" colspan="4"/>
<field name="prefix" string="Validation Task Title" colspan="4"/>
<field name="prefix" string="Validation Task Title"/>
<field name="planned_hours_me"/>
<field name="state" colspan="4"/>
</group>
<separator string="" colspan="4"/>
@@ -40,7 +41,6 @@
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_project_task_delegate"/>
<field name="context">{'record_id' : active_id}</field>
<field name="target">new</field>
</record>
+47
View File
@@ -0,0 +1,47 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
"PO-Revision-Date: 2011-11-20 09:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: project_retro_planning
#: model:ir.model,name:project_retro_planning.model_project_project
msgid "Project"
msgstr "Projècte"
#. module: project_retro_planning
#: model:ir.module.module,shortdesc:project_retro_planning.module_meta_information
msgid "Project Retro planning"
msgstr "Retroplanificacion de projèctes"
#. module: project_retro_planning
#: model:ir.module.module,description:project_retro_planning.module_meta_information
msgid ""
"\n"
" - If end date of project is changed\n"
" then the deadline date and start date for all the tasks will "
"change accordingly "
msgstr ""
#. module: project_retro_planning
#: constraint:project.project:0
msgid "Error! project start-date must be lower then project end-date."
msgstr ""
#. module: project_retro_planning
#: constraint:project.project:0
msgid "Error! You cannot assign escalation to the same project!"
msgstr ""
+1 -1
View File
@@ -227,7 +227,7 @@ class purchase_order(osv.osv):
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'purchase.order', context=c),
}
_sql_constraints = [
('name_uniq', 'unique(name)', 'Order Reference must be unique !'),
('name_uniq', 'unique(name, company_id)', 'Order Reference must be unique per Company!'),
]
_name = "purchase.order"
_description = "Purchase Order"
+98
View File
@@ -0,0 +1,98 @@
# Thai translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
"PO-Revision-Date: 2011-11-17 07:34+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Thai <th@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: 2011-11-18 05:13+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: report_designer
#: model:ir.actions.act_window,name:report_designer.action_report_designer_installer
#: view:report_designer.installer:0
msgid "Reporting Tools Configuration"
msgstr ""
#. module: report_designer
#: field:report_designer.installer,base_report_creator:0
msgid "Query Builder"
msgstr ""
#. module: report_designer
#: view:report_designer.installer:0
msgid "Configure"
msgstr ""
#. module: report_designer
#: view:report_designer.installer:0
msgid "title"
msgstr ""
#. module: report_designer
#: model:ir.model,name:report_designer.model_report_designer_installer
msgid "report_designer.installer"
msgstr ""
#. module: report_designer
#: field:report_designer.installer,config_logo:0
msgid "Image"
msgstr ""
#. module: report_designer
#: field:report_designer.installer,base_report_designer:0
msgid "OpenOffice Report Designer"
msgstr ""
#. module: report_designer
#: model:ir.module.module,shortdesc:report_designer.module_meta_information
msgid "Reporting Tools"
msgstr ""
#. module: report_designer
#: view:report_designer.installer:0
msgid ""
"OpenERP's built-in reporting abilities can be improved even further with "
"some of the following applications"
msgstr ""
#. module: report_designer
#: view:report_designer.installer:0
msgid "Configure Reporting Tools"
msgstr ""
#. module: report_designer
#: help:report_designer.installer,base_report_creator:0
msgid ""
"Allows you to create any statistic reports on several objects. It's a SQL "
"query builder and browser for end users."
msgstr ""
#. module: report_designer
#: help:report_designer.installer,base_report_designer:0
msgid ""
"Adds wizards to Import/Export .SXW report which you can modify in "
"OpenOffice.Once you have modified it you can upload the report using the "
"same wizard."
msgstr ""
#. module: report_designer
#: model:ir.module.module,description:report_designer.module_meta_information
msgid ""
"Installer for reporting tools selection\n"
" "
msgstr ""
#. module: report_designer
#: field:report_designer.installer,progress:0
msgid "Configuration Progress"
msgstr ""
File diff suppressed because it is too large Load Diff
+8 -4
View File
@@ -280,7 +280,7 @@ class sale_order(osv.osv):
'partner_shipping_id': lambda self, cr, uid, context: context.get('partner_id', False) and self.pool.get('res.partner').address_get(cr, uid, [context['partner_id']], ['delivery'])['delivery'],
}
_sql_constraints = [
('name_uniq', 'unique(name)', 'Order Reference must be unique !'),
('name_uniq', 'unique(name, company_id)', 'Order Reference must be unique per Company!'),
]
_order = 'name desc'
@@ -772,6 +772,10 @@ class sale_order(osv.osv):
will be added. A new picking will be created if ommitted.
:return: True
"""
move_obj = self.pool.get('stock.move')
picking_obj = self.pool.get('stock.picking')
procurement_obj = self.pool.get('procurement.order')
proc_ids = []
move_obj = self.pool.get('stock.move')
for line in order_lines:
@@ -784,17 +788,17 @@ class sale_order(osv.osv):
if line.product_id:
if line.product_id.product_tmpl_id.type in ('product', 'consu'):
if not picking_id:
picking_id = self.pool.get('stock.picking').create(cr, uid, self._prepare_order_picking(cr, uid, order, *args))
picking_id = picking_obj.create(cr, uid, self._prepare_order_picking(cr, uid, order, *args))
move_id = move_obj.create(cr, uid, self._prepare_order_line_move(cr, uid, order, line, picking_id, date_planned, *args))
else:
# a service has no stock move
move_id = False
proc_id = self.pool.get('procurement.order').create(cr, uid, self._prepare_order_line_procurement(cr, uid, order, line, move_id, date_planned, *args))
proc_id = procurement_obj.create(cr, uid, self._prepare_order_line_procurement(cr, uid, order, line, move_id, date_planned, *args))
proc_ids.append(proc_id)
line.write({'procurement_id': proc_id})
self.ship_exception(cr, uid, order, move_obj, line, move_id, proc_id)
wf_service = netsvc.LocalService("workflow")
if picking_id:
wf_service.trg_validate(uid, 'stock.picking', picking_id, 'button_confirm', cr)
+45
View File
@@ -0,0 +1,45 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-03 16:58+0000\n"
"PO-Revision-Date: 2011-11-20 09:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: sale_analytic_plans
#: field:sale.order.line,analytics_id:0
msgid "Analytic Distribution"
msgstr "Distribucion analitica"
#. module: sale_analytic_plans
#: model:ir.module.module,shortdesc:sale_analytic_plans.module_meta_information
msgid "Sales Analytic Distribution Management"
msgstr "Gestion de la Distribucion Analitica de las Vendas"
#. module: sale_analytic_plans
#: model:ir.module.module,description:sale_analytic_plans.module_meta_information
msgid ""
"\n"
" The base module to manage analytic distribution and sales orders.\n"
" "
msgstr ""
"\n"
" Lo modul de basa per gerir la distribucion analitica e los bons de "
"comanda.\n"
" "
#. module: sale_analytic_plans
#: model:ir.model,name:sale_analytic_plans.model_sale_order_line
msgid "Sales Order Line"
msgstr "Linha de bon de comanda"
+4 -1
View File
@@ -661,6 +661,9 @@ class stock_picking(osv.osv):
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.picking', context=c)
}
_sql_constraints = [
('name_uniq', 'unique(name, company_id)', 'Reference must be unique per Company!'),
]
def action_process(self, cr, uid, ids, context=None):
if context is None: context = {}
@@ -1525,7 +1528,7 @@ class stock_move(osv.osv):
return True
_columns = {
'name': fields.char('Name', size=64, required=True, select=True),
'name': fields.char('Name', size=250, required=True, select=True),
'priority': fields.selection([('0', 'Not urgent'), ('1', 'Urgent')], 'Priority'),
'create_date': fields.datetime('Creation Date', readonly=True, select=True),
'date': fields.datetime('Date', required=True, select=True, help="Move date: scheduled date until move is done, then date of actual move processing", states={'done': [('readonly', True)]}),
@@ -43,15 +43,15 @@ class stock_location_product(osv.osv_memory):
location_products = self.read(cr, uid, ids, ['from_date', 'to_date'], context=context)
if location_products:
return {
'name': False,
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'product.product',
'type': 'ir.actions.act_window',
'context': {'location': context.get('active_id'),
'from_date': location_products[0]['from_date'],
'to_date': location_products[0]['to_date']},
'domain': [('type', '<>', 'service')],
'name': False,
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'product.product',
'type': 'ir.actions.act_window',
'context': {'location': context['active_id'],
'from_date': location_products[0]['from_date'],
'to_date': location_products[0]['to_date']},
'domain': [('type', '<>', 'service')],
}
stock_location_product()
+37
View File
@@ -0,0 +1,37 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-03 16:58+0000\n"
"PO-Revision-Date: 2011-11-20 09:30+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: stock_invoice_directly
#: model:ir.model,name:stock_invoice_directly.model_stock_partial_picking
msgid "Partial Picking"
msgstr "Tractament parcial"
#. module: stock_invoice_directly
#: model:ir.module.module,description:stock_invoice_directly.module_meta_information
msgid ""
"\n"
" When you send or deliver goods, this module automatically launch\n"
" the invoicing wizard if the delivery is to be invoiced.\n"
" "
msgstr ""
#. module: stock_invoice_directly
#: model:ir.module.module,shortdesc:stock_invoice_directly.module_meta_information
msgid "Invoice Picking Directly"
msgstr "Facturar la liurason dirèctament"
+70
View File
@@ -0,0 +1,70 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-03 16:58+0000\n"
"PO-Revision-Date: 2011-11-20 09:30+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: stock_no_autopicking
#: model:ir.model,name:stock_no_autopicking.model_product_product
msgid "Product"
msgstr "Produch"
#. module: stock_no_autopicking
#: model:ir.module.module,description:stock_no_autopicking.module_meta_information
msgid ""
"\n"
" This module allows an intermediate picking process to provide raw "
"materials\n"
" to production orders.\n"
"\n"
" One example of usage of this module is to manage production made by "
"your\n"
" suppliers (sub-contracting). To achieve this, set the assembled product\n"
" which is sub-contracted to \"No Auto-Picking\" and put the location of "
"the\n"
" supplier in the routing of the assembly operation.\n"
" "
msgstr ""
#. module: stock_no_autopicking
#: model:ir.model,name:stock_no_autopicking.model_mrp_production
msgid "Manufacturing Order"
msgstr "Òrdre de fabricacion"
#. module: stock_no_autopicking
#: field:product.product,auto_pick:0
msgid "Auto Picking"
msgstr "Prelevament automatic"
#. module: stock_no_autopicking
#: help:product.product,auto_pick:0
msgid "Auto picking for raw materials of production orders."
msgstr ""
#. module: stock_no_autopicking
#: constraint:product.product:0
msgid "Error: Invalid ean code"
msgstr "Error : Còde ean invalid"
#. module: stock_no_autopicking
#: model:ir.module.module,shortdesc:stock_no_autopicking.module_meta_information
msgid "Stock No Auto-Picking"
msgstr ""
#. module: stock_no_autopicking
#: constraint:mrp.production:0
msgid "Order quantity cannot be negative or zero !"
msgstr ""
@@ -142,11 +142,9 @@
product_uos_qty: 0.0
bom_id: mrp_bom_cupoftea0
routing_id: mrp_routing_productionrouting0
company_id: base.main_company
date_planned: !eval time.strftime('%Y-%m-%d %H:%M:%S')
location_dest_id: stock.stock_location_stock
location_src_id: stock.stock_location_stock
name: MO/00002
-
I compute the data of production order.
-
+41
View File
@@ -0,0 +1,41 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:16+0000\n"
"PO-Revision-Date: 2011-11-20 09:29+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: web_livechat
#: sql_constraint:publisher_warranty.contract:0
msgid ""
"Your publisher warranty contract is already subscribed in the system !"
msgstr ""
#. module: web_livechat
#: model:ir.module.module,shortdesc:web_livechat.module_meta_information
msgid "Live Chat Support"
msgstr "Supòrt per messatjariá instantanèa"
#. module: web_livechat
#: model:ir.model,name:web_livechat.model_publisher_warranty_contract
msgid "publisher_warranty.contract"
msgstr "publisher_warranty.contract"
#. module: web_livechat
#: model:ir.module.module,description:web_livechat.module_meta_information
msgid "Enable live chat support for whom have a maintenance contract"
msgstr ""
"Validar lo supòrt per messatjariá instantanèa pels detentors d'un contracte "
"de mantenença"
+29
View File
@@ -0,0 +1,29 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-12 16:15+0000\n"
"PO-Revision-Date: 2011-11-20 09:28+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: web_uservoice
#: model:ir.module.module,shortdesc:web_uservoice.module_meta_information
msgid "Add uservoice button in header"
msgstr "Apondre un boton \"viscut utilizaire\" dins l'entèsta"
#. module: web_uservoice
#: code:addons/web_uservoice/web/editors.py:72
#, python-format
msgid "feedback"
msgstr "retorn d'experiéncia"
+32
View File
@@ -0,0 +1,32 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:16+0000\n"
"PO-Revision-Date: 2011-11-20 09:27+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: wiki_faq
#: model:ir.module.module,description:wiki_faq.module_meta_information
msgid ""
"This module provides a wiki FAQ Template\n"
" "
msgstr ""
"Aqueste modul provesís un modèl de FAQ Wiki\n"
" "
#. module: wiki_faq
#: model:ir.module.module,shortdesc:wiki_faq.module_meta_information
msgid "Document Management - Wiki - FAQ"
msgstr "Gestion documentària - Wiki - FAQ"
+32
View File
@@ -0,0 +1,32 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:16+0000\n"
"PO-Revision-Date: 2011-11-20 09:27+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: wiki_quality_manual
#: model:ir.module.module,description:wiki_quality_manual.module_meta_information
msgid ""
"Quality Manual Template\n"
" "
msgstr ""
"Modèl de manual qualitat\n"
" "
#. module: wiki_quality_manual
#: model:ir.module.module,shortdesc:wiki_quality_manual.module_meta_information
msgid "Document Management - Wiki - Quality Manual"
msgstr "Gestion documentària - Wiki - Manual Qualitat"
+68
View File
@@ -0,0 +1,68 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-01-11 11:16+0000\n"
"PO-Revision-Date: 2011-11-20 09:26+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
"X-Generator: Launchpad (build 14299)\n"
#. module: wiki_sale_faq
#: model:ir.actions.act_window,name:wiki_sale_faq.action_document_form
#: model:ir.ui.menu,name:wiki_sale_faq.menu_document_files
#: model:ir.ui.menu,name:wiki_sale_faq.menu_sales
msgid "Documents"
msgstr "Documents"
#. module: wiki_sale_faq
#: model:ir.actions.act_window,name:wiki_sale_faq.action_wiki_test
msgid "Wiki Pages"
msgstr "Paginas del wiki"
#. module: wiki_sale_faq
#: model:ir.ui.menu,name:wiki_sale_faq.menu_action_wiki_wiki
msgid "FAQ"
msgstr "Questions frequentas (FAQ)"
#. module: wiki_sale_faq
#: model:ir.module.module,description:wiki_sale_faq.module_meta_information
msgid ""
"This module provides a wiki FAQ Template\n"
" "
msgstr ""
#. module: wiki_sale_faq
#: model:ir.actions.act_window,help:wiki_sale_faq.action_wiki_test
msgid ""
"Wiki pages allow you to share ideas and questions with coworkers. You can "
"create a new document that can be linked to one or several applications "
"(specifications of a project, FAQ for sales teams, etc.). Keywords can be "
"used to easily tag wiki pages. You should use this application with the "
"OpenERP web client interface."
msgstr ""
#. module: wiki_sale_faq
#: model:ir.module.module,shortdesc:wiki_sale_faq.module_meta_information
msgid "Wiki -Sale - FAQ"
msgstr "FAQ Wiki Vendas"
#. module: wiki_sale_faq
#: model:ir.actions.act_window,help:wiki_sale_faq.action_document_form
msgid ""
"Documents give you access to all files attached to any record. It is a "
"repository of all documents such as emails, project-related attachments or "
"any other documents. From this view, you can search through the content of "
"the documents. OpenERP automatically assign meta data based on the record "
"like the related partner and indexes the content of .DOC, .ODT, .TXT, .SXW "
"and .PDF documents."
msgstr ""