[MERGE] sync with trunk

bzr revid: mat@openerp.com-20131014101423-bvb7sr45rt7890aa
This commit is contained in:
Martin Trigaux 2013-10-14 12:14:23 +02:00
commit 4328f8253a
116 changed files with 3020 additions and 1273 deletions

View File

@ -1416,14 +1416,17 @@ class account_move(osv.osv):
l[2]['period_id'] = default_period l[2]['period_id'] = default_period
context['period_id'] = default_period context['period_id'] = default_period
if 'line_id' in vals: if vals.get('line_id', False):
c = context.copy() c = context.copy()
c['novalidate'] = True c['novalidate'] = True
c['period_id'] = vals['period_id'] if 'period_id' in vals else self._get_period(cr, uid, context) c['period_id'] = vals['period_id'] if 'period_id' in vals else self._get_period(cr, uid, context)
c['journal_id'] = vals['journal_id'] c['journal_id'] = vals['journal_id']
if 'date' in vals: c['date'] = vals['date'] if 'date' in vals: c['date'] = vals['date']
result = super(account_move, self).create(cr, uid, vals, c) result = super(account_move, self).create(cr, uid, vals, c)
self.validate(cr, uid, [result], context) tmp = self.validate(cr, uid, [result], context)
journal = self.pool.get('account.journal').browse(cr, uid, vals['journal_id'], context)
if journal.entry_posted and tmp:
self.button_validate(cr,uid, [result], context)
else: else:
result = super(account_move, self).create(cr, uid, vals, context) result = super(account_move, self).create(cr, uid, vals, context)
return result return result

View File

@ -349,6 +349,7 @@
<page string="Invoice Lines"> <page string="Invoice Lines">
<field name="invoice_line" nolabel="1" widget="one2many_list" context="{'type': type}"> <field name="invoice_line" nolabel="1" widget="one2many_list" context="{'type': type}">
<tree string="Invoice Lines" editable="bottom"> <tree string="Invoice Lines" editable="bottom">
<field name="sequence" widget="handle"/>
<field name="product_id" <field name="product_id"
on_change="product_id_change(product_id, uos_id, quantity, name, parent.type, parent.partner_id, parent.fiscal_position, price_unit, parent.currency_id, context, parent.company_id)"/> on_change="product_id_change(product_id, uos_id, quantity, name, parent.type, parent.partner_id, parent.fiscal_position, price_unit, parent.currency_id, context, parent.company_id)"/>
<field name="name"/> <field name="name"/>

View File

@ -1283,7 +1283,7 @@ class account_move_line(osv.osv):
self.create(cr, uid, data, context) self.create(cr, uid, data, context)
del vals['account_tax_id'] del vals['account_tax_id']
if check and ((not context.get('no_store_function')) or journal.entry_posted): if check and not context.get('novalidate') and ((not context.get('no_store_function')) or journal.entry_posted):
tmp = move_obj.validate(cr, uid, [vals['move_id']], context) tmp = move_obj.validate(cr, uid, [vals['move_id']], context)
if journal.entry_posted and tmp: if journal.entry_posted and tmp:
move_obj.button_validate(cr,uid, [vals['move_id']], context) move_obj.button_validate(cr,uid, [vals['move_id']], context)

View File

@ -1,7 +1,7 @@
- -
Create a user as 'Accountant' Create a user as 'Accountant'
- -
!record {model: res.users, id: res_users_account_user}: !record {model: res.users, id: res_users_account_user, view: False}:
company_id: base.main_company company_id: base.main_company
name: Accountant name: Accountant
login: acc login: acc
@ -17,7 +17,7 @@
- -
Create a user as 'Financial Manager' Create a user as 'Financial Manager'
- -
!record {model: res.users, id: res_users_account_manager}: !record {model: res.users, id: res_users_account_manager, view: False}:
company_id: base.main_company company_id: base.main_company
name: Financial Manager name: Financial Manager
login: fm login: fm

View File

@ -15,7 +15,7 @@
<newline/> <newline/>
</xpath> </xpath>
<xpath expr="//field[@name='filter']" position="replace"> <xpath expr="//field[@name='filter']" position="replace">
<field name="filter" on_change="onchange_filter(filter, fiscalyear_id)" colspan="4"/> <field name="filter" on_change="onchange_filter(filter, fiscalyear_id)"/>
<field name="initial_balance" attrs="{'readonly':[('filter', 'in', ('filter_no', 'unreconciled'))]}" /> <field name="initial_balance" attrs="{'readonly':[('filter', 'in', ('filter_no', 'unreconciled'))]}" />
</xpath> </xpath>
</data> </data>

View File

@ -1,4 +1,4 @@
# Danish translation for openobject-addons # Spanish (Argentina) translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package. # This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013. # FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
@ -7,19 +7,17 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: openobject-addons\n" "Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n" "POT-Creation-Date: 2012-12-21 17:04+0000\n"
"PO-Revision-Date: 2013-09-15 20:22+0000\n" "PO-Revision-Date: 2013-10-07 21:16+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Danish <da@li.org>\n" "Language-Team: Spanish (Argentina) <es_AR@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-16 05:42+0000\n" "X-Launchpad-Export-Date: 2013-10-08 05:42+0000\n"
"X-Generator: Launchpad (build 16761)\n" "X-Generator: Launchpad (build 16799)\n"
#. module: web_shortcuts #. module: account_accountant
#. openerp-web #: model:ir.actions.client,name:account_accountant.action_client_account_menu
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21 msgid "Open Accounting Menu"
#, python-format msgstr ""
msgid "Add / Remove Shortcut..."
msgstr "Tilføj/fjern genvej ..."

View File

@ -655,7 +655,7 @@ class account_analytic_account(osv.osv):
if not contract.partner_id: if not contract.partner_id:
raise osv.except_osv(_('No Customer Defined!'),_("You must first select a Customer for Contract %s!") % contract.name ) raise osv.except_osv(_('No Customer Defined!'),_("You must first select a Customer for Contract %s!") % contract.name )
fpos = contract.partner_id.property_account_position.id or False fpos = contract.partner_id.property_account_position or False
journal_ids = journal_obj.search(cr, uid, [('type', '=','sale'),('company_id', '=', contract.company_id.id or False)], limit=1) journal_ids = journal_obj.search(cr, uid, [('type', '=','sale'),('company_id', '=', contract.company_id.id or False)], limit=1)
if not journal_ids: if not journal_ids:
raise osv.except_osv(_('Error!'), raise osv.except_osv(_('Error!'),
@ -673,7 +673,7 @@ class account_analytic_account(osv.osv):
'journal_id': len(journal_ids) and journal_ids[0] or False, 'journal_id': len(journal_ids) and journal_ids[0] or False,
'date_invoice': contract.recurring_next_date, 'date_invoice': contract.recurring_next_date,
'origin': contract.name, 'origin': contract.name,
'fiscal_position': fpos, 'fiscal_position': fpos and fpos.id,
'payment_term': partner_payment_term, 'payment_term': partner_payment_term,
'company_id': contract.company_id.id or False, 'company_id': contract.company_id.id or False,
} }
@ -687,7 +687,7 @@ class account_analytic_account(osv.osv):
account_id = res.categ_id.property_account_income_categ.id account_id = res.categ_id.property_account_income_categ.id
account_id = fpos_obj.map_account(cr, uid, fpos, account_id) account_id = fpos_obj.map_account(cr, uid, fpos, account_id)
taxes = res.taxes_id and res.taxes_id or False taxes = res.taxes_id or False
tax_id = fpos_obj.map_tax(cr, uid, fpos, taxes) tax_id = fpos_obj.map_tax(cr, uid, fpos, taxes)
invoice_line_vals = { invoice_line_vals = {

View File

@ -0,0 +1,23 @@
# Estonian translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
"PO-Revision-Date: 2013-10-09 14:39+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Estonian <et@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: 2013-10-10 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
#. module: account_cancel
#: view:account.invoice:0
msgid "Cancel"
msgstr ""

View File

@ -1,7 +1,7 @@
- -
Create a user as 'Accountant for account voucher' Create a user as 'Accountant for account voucher'
- -
!record {model: res.users, id: res_users_account_voucher_user}: !record {model: res.users, id: res_users_account_voucher_user, view: False}:
company_id: base.main_company company_id: base.main_company
name: Voucher Accountant name: Voucher Accountant
login: vacc login: vacc
@ -17,7 +17,7 @@
- -
Create a user as 'Financial Manager for account voucher' Create a user as 'Financial Manager for account voucher'
- -
!record {model: res.users, id: res_users_account_voucher_manager}: !record {model: res.users, id: res_users_account_voucher_manager, view: False}:
company_id: base.main_company company_id: base.main_company
name: Financial Manager for voucher name: Financial Manager for voucher
login: fmv login: fmv

View File

@ -1,30 +1,28 @@
# Estonian translation for openobject-addons # Estonian translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package. # This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011. # FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: openobject-addons\n" "Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-03 16:03+0000\n" "POT-Creation-Date: 2012-12-21 17:05+0000\n"
"PO-Revision-Date: 2011-10-10 19:33+0000\n" "PO-Revision-Date: 2013-10-09 14:40+0000\n"
"Last-Translator: Aare Vesi <Unknown>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Estonian <et@li.org>\n" "Language-Team: Estonian <et@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-12-04 05:53+0000\n" "X-Launchpad-Export-Date: 2013-10-10 04:41+0000\n"
"X-Generator: Launchpad (build 16335)\n" "X-Generator: Launchpad (build 16799)\n"
#. module: base_crypt #. module: auth_crypt
#: model:ir.model,name:base_crypt.model_res_users #: field:res.users,password_crypt:0
msgid "Encrypted Password"
msgstr "Krüpteeritud Parool"
#. module: auth_crypt
#: model:ir.model,name:auth_crypt.model_res_users
msgid "Users" msgid "Users"
msgstr "" msgstr "Kasutajad"
#, python-format
#~ msgid "Error"
#~ msgstr "Viga"
#~ msgid "res.users"
#~ msgstr "res.users"

View File

@ -0,0 +1,23 @@
# Estonian translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
"PO-Revision-Date: 2013-10-09 14:34+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Estonian <et@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: 2013-10-10 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
#. module: auth_oauth_signup
#: model:ir.model,name:auth_oauth_signup.model_res_users
msgid "Users"
msgstr "Kasutajad"

View File

@ -114,19 +114,6 @@ def real_id2base_calendar_id(real_id, recurrent_date):
return '%d-%s' % (real_id, recurrent_date) return '%d-%s' % (real_id, recurrent_date)
return real_id return real_id
def _links_get(self, cr, uid, context=None):
"""
Get request link.
@param cr: the current row, from the database cursor
@param uid: the current user's ID for security checks
@param context: a standard dictionary for contextual values
@return: list of dictionary which contain object and name and id
"""
obj = self.pool.get('res.request.link')
ids = obj.search(cr, uid, [])
res = obj.read(cr, uid, ids, ['object', 'name'], context=context)
return [(r['object'], r['name']) for r in res]
html_invitation = """ html_invitation = """
<html> <html>
<head> <head>
@ -307,19 +294,6 @@ class calendar_attendee(osv.osv):
return result return result
def _links_get(self, cr, uid, context=None):
"""
Get request link for ref field in calendar attendee.
@param cr: the current row, from the database cursor
@param uid: the current user's id for security checks
@param context: A standard dictionary for contextual values
@return: list of dictionary which contain object and name and id
"""
obj = self.pool.get('res.request.link')
ids = obj.search(cr, uid, [])
res = obj.read(cr, uid, ids, ['object', 'name'], context=context)
return [(r['object'], r['name']) for r in res]
def _lang_get(self, cr, uid, context=None): def _lang_get(self, cr, uid, context=None):
""" """
Get language for language selection field. Get language for language selection field.
@ -385,7 +359,7 @@ property or property parameter."),
'event_end_date': fields.function(_compute_data, \ 'event_end_date': fields.function(_compute_data, \
string='Event End Date', type="datetime", \ string='Event End Date', type="datetime", \
multi='event_end_date'), multi='event_end_date'),
'ref': fields.reference('Event Ref', selection=_links_get, size=128), 'ref': fields.reference('Event Ref', selection=openerp.addons.base.res.res_request.referencable_models, size=128),
'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"), 'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"),
} }
_defaults = { _defaults = {
@ -1208,20 +1182,44 @@ rule or repeating pattern of time to exclude from the recurring rule."),
new_rrule_str = ';'.join(new_rrule_str) new_rrule_str = ';'.join(new_rrule_str)
rdates = get_recurrent_dates(str(new_rrule_str), exdate, event_date, data['exrule']) rdates = get_recurrent_dates(str(new_rrule_str), exdate, event_date, data['exrule'])
for r_date in rdates: for r_date in rdates:
ok = True # fix domain evaluation
# step 1: check date and replace expression by True or False, replace other expressions by True
# step 2: evaluation of & and |
# check if there are one False
pile = []
for arg in domain: for arg in domain:
if arg[0] in ('date', 'date_deadline'): if str(arg[0]) in (str('date'), str('date_deadline')):
if (arg[1]=='='): if (arg[1] == '='):
ok = ok and r_date.strftime('%Y-%m-%d')==arg[2] ok = r_date.strftime('%Y-%m-%d')==arg[2]
if (arg[1]=='>'): if (arg[1] == '>'):
ok = ok and r_date.strftime('%Y-%m-%d')>arg[2] ok = r_date.strftime('%Y-%m-%d')>arg[2]
if (arg[1]=='<'): if (arg[1] == '<'):
ok = ok and r_date.strftime('%Y-%m-%d')<arg[2] ok = r_date.strftime('%Y-%m-%d')<arg[2]
if (arg[1]=='>='): if (arg[1] == '>='):
ok = ok and r_date.strftime('%Y-%m-%d')>=arg[2] ok = r_date.strftime('%Y-%m-%d')>=arg[2]
if (arg[1]=='<='): if (arg[1] == '<='):
ok = ok and r_date.strftime('%Y-%m-%d')<=arg[2] ok = r_date.strftime('%Y-%m-%d')<=arg[2]
if not ok: pile.append(ok)
elif str(arg) == str('&') or str(arg) == str('|'):
pile.append(arg)
else:
pile.append(True)
pile.reverse()
new_pile = []
for item in pile:
if not isinstance(item, basestring):
res = item
elif str(item) == str('&'):
first = new_pile.pop()
second = new_pile.pop()
res = first and second
elif str(item) == str('|'):
first = new_pile.pop()
second = new_pile.pop()
res = first or second
new_pile.append(res)
if [True for item in new_pile if not item]:
continue continue
idval = real_id2base_calendar_id(data['id'], r_date.strftime("%Y-%m-%d %H:%M:%S")) idval = real_id2base_calendar_id(data['id'], r_date.strftime("%Y-%m-%d %H:%M:%S"))
result.append(idval) result.append(idval)
@ -1346,18 +1344,17 @@ rule or repeating pattern of time to exclude from the recurring rule."),
for arg in args: for arg in args:
new_arg = arg new_arg = arg
if arg[0] in ('date', unicode('date'), 'date_deadline', unicode('date_deadline')): if arg[0] in ('date_deadline', unicode('date_deadline')):
if context.get('virtual_id', True): if context.get('virtual_id', True):
new_args += ['|','&',('recurrency','=',1),('recurrent_id_date', arg[1], arg[2])] new_args += ['|','&',('recurrency','=',1),('end_date', arg[1], arg[2])]
elif arg[0] == "id": elif arg[0] == "id":
new_id = get_real_ids(arg[2]) new_id = get_real_ids(arg[2])
new_arg = (arg[0], arg[1], new_id) new_arg = (arg[0], arg[1], new_id)
new_args.append(new_arg) new_args.append(new_arg)
#offset, limit and count must be treated separately as we may need to deal with virtual ids #offset, limit and count must be treated separately as we may need to deal with virtual ids
res = super(calendar_event, self).search(cr, uid, new_args, offset=0, limit=0, order=order, context=context, count=False) res = super(calendar_event, self).search(cr, uid, new_args, offset=0, limit=0, order=order, context=context, count=False)
if context.get('virtual_id', True): if context.get('virtual_id', True):
res = self.get_recurrent_ids(cr, uid, res, new_args, limit, context=context) res = self.get_recurrent_ids(cr, uid, res, args, limit, context=context)
if count: if count:
return len(res) return len(res)
elif limit: elif limit:
@ -1436,6 +1433,14 @@ rule or repeating pattern of time to exclude from the recurring rule."),
vals['vtimezone'] = vals['vtimezone'][40:] vals['vtimezone'] = vals['vtimezone'][40:]
res = super(calendar_event, self).write(cr, uid, ids, vals, context=context) res = super(calendar_event, self).write(cr, uid, ids, vals, context=context)
# set end_date for calendar searching
if vals.get('recurrency', True) and vals.get('end_type', 'count') in ('count', unicode('count')) and \
(vals.get('rrule_type') or vals.get('count') or vals.get('date') or vals.get('date_deadline')):
for data in self.read(cr, uid, ids, ['date', 'date_deadline', 'recurrency', 'rrule_type', 'count', 'end_type'], context=context):
end_date = self._set_recurrency_end_date(data, context=context)
super(calendar_event, self).write(cr, uid, [data['id']], {'end_date': end_date}, context=context)
if vals.get('partner_ids', False): if vals.get('partner_ids', False):
self.create_attendees(cr, uid, ids, context) self.create_attendees(cr, uid, ids, context)
@ -1554,6 +1559,21 @@ rule or repeating pattern of time to exclude from the recurring rule."),
self.unlink_events(cr, uid, ids, context=context) self.unlink_events(cr, uid, ids, context=context)
return res return res
def _set_recurrency_end_date(self, data, context=None):
end_date = data.get('end_date')
if data.get('recurrency') and data.get('end_type') in ('count', unicode('count')):
data_date_deadline = datetime.strptime(data.get('date_deadline'), '%Y-%m-%d %H:%M:%S')
if data.get('rrule_type') in ('daily', unicode('count')):
rel_date = relativedelta(days=data.get('count')+1)
elif data.get('rrule_type') in ('weekly', unicode('weekly')):
rel_date = relativedelta(days=(data.get('count')+1)*7)
elif data.get('rrule_type') in ('monthly', unicode('monthly')):
rel_date = relativedelta(months=data.get('count')+1)
elif data.get('rrule_type') in ('yearly', unicode('yearly')):
rel_date = relativedelta(years=data.get('count')+1)
end_date = data_date_deadline + rel_date
return end_date
def create(self, cr, uid, vals, context=None): def create(self, cr, uid, vals, context=None):
if context is None: if context is None:
context = {} context = {}
@ -1561,7 +1581,9 @@ rule or repeating pattern of time to exclude from the recurring rule."),
if vals.get('vtimezone', '') and vals.get('vtimezone', '').startswith('/freeassociation.sourceforge.net/tzfile/'): if vals.get('vtimezone', '') and vals.get('vtimezone', '').startswith('/freeassociation.sourceforge.net/tzfile/'):
vals['vtimezone'] = vals['vtimezone'][40:] vals['vtimezone'] = vals['vtimezone'][40:]
vals['end_date'] = self._set_recurrency_end_date(vals, context=context)
res = super(calendar_event, self).create(cr, uid, vals, context) res = super(calendar_event, self).create(cr, uid, vals, context)
alarm_obj = self.pool.get('res.alarm') alarm_obj = self.pool.get('res.alarm')
alarm_obj.do_alarm_create(cr, uid, [res], self._name, 'date', context=context) alarm_obj.do_alarm_create(cr, uid, [res], self._name, 'date', context=context)
self.create_attendees(cr, uid, [res], context) self.create_attendees(cr, uid, [res], context)

View File

@ -0,0 +1,185 @@
# Hindi translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
"PO-Revision-Date: 2013-10-09 05:55+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Hindi <hi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-10-10 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
#. module: base_report_designer
#: model:ir.model,name:base_report_designer.model_base_report_sxw
msgid "base.report.sxw"
msgstr "base.report.sxw"
#. module: base_report_designer
#: view:base_report_designer.installer:0
msgid "OpenERP Report Designer Configuration"
msgstr ""
#. module: base_report_designer
#: view:base_report_designer.installer:0
msgid ""
"This plug-in allows you to create/modify OpenERP Reports into OpenOffice "
"Writer."
msgstr ""
#. module: base_report_designer
#: view:base.report.sxw:0
msgid "Upload the modified report"
msgstr ""
#. module: base_report_designer
#: view:base.report.file.sxw:0
msgid "The .SXW report"
msgstr ""
#. module: base_report_designer
#: model:ir.model,name:base_report_designer.model_base_report_designer_installer
msgid "base_report_designer.installer"
msgstr ""
#. module: base_report_designer
#: model:ir.model,name:base_report_designer.model_base_report_rml_save
msgid "base.report.rml.save"
msgstr ""
#. module: base_report_designer
#: view:base_report_designer.installer:0
msgid "Configure"
msgstr ""
#. module: base_report_designer
#: view:base_report_designer.installer:0
msgid "title"
msgstr ""
#. module: base_report_designer
#: field:base.report.file.sxw,report_id:0
#: field:base.report.sxw,report_id:0
msgid "Report"
msgstr ""
#. module: base_report_designer
#: view:base.report.rml.save:0
msgid "The RML Report"
msgstr ""
#. module: base_report_designer
#: model:ir.ui.menu,name:base_report_designer.menu_action_report_designer_wizard
msgid "Report Designer"
msgstr ""
#. module: base_report_designer
#: field:base_report_designer.installer,name:0
msgid "File name"
msgstr ""
#. module: base_report_designer
#: view:base.report.file.sxw:0
#: view:base.report.sxw:0
msgid "Get a report"
msgstr ""
#. module: base_report_designer
#: view:base_report_designer.installer:0
#: model:ir.actions.act_window,name:base_report_designer.action_report_designer_wizard
msgid "OpenERP Report Designer"
msgstr ""
#. module: base_report_designer
#: view:base.report.sxw:0
msgid "Continue"
msgstr ""
#. module: base_report_designer
#: field:base.report.rml.save,file_rml:0
msgid "Save As"
msgstr ""
#. module: base_report_designer
#: help:base_report_designer.installer,plugin_file:0
msgid ""
"OpenObject Report Designer plug-in file. Save as this file and install this "
"plug-in in OpenOffice."
msgstr ""
#. module: base_report_designer
#: view:base.report.rml.save:0
msgid "Save RML FIle"
msgstr ""
#. module: base_report_designer
#: field:base.report.file.sxw,file_sxw:0
#: field:base.report.file.sxw,file_sxw_upload:0
msgid "Your .SXW file"
msgstr ""
#. module: base_report_designer
#: view:base_report_designer.installer:0
msgid "Installation and Configuration Steps"
msgstr ""
#. module: base_report_designer
#: field:base_report_designer.installer,description:0
msgid "Description"
msgstr ""
#. module: base_report_designer
#: view:base.report.file.sxw:0
msgid ""
"This is the template of your requested report.\n"
"Save it as a .SXW file and open it with OpenOffice.\n"
"Don't forget to install the OpenERP SA OpenOffice package to modify it.\n"
"Once it is modified, re-upload it in OpenERP using this wizard."
msgstr ""
#. module: base_report_designer
#: model:ir.actions.act_window,name:base_report_designer.action_view_base_report_sxw
msgid "Base Report sxw"
msgstr ""
#. module: base_report_designer
#: model:ir.model,name:base_report_designer.model_base_report_file_sxw
msgid "base.report.file.sxw"
msgstr ""
#. module: base_report_designer
#: field:base_report_designer.installer,plugin_file:0
msgid "OpenObject Report Designer Plug-in"
msgstr ""
#. module: base_report_designer
#: model:ir.actions.act_window,name:base_report_designer.action_report_designer_installer
msgid "OpenERP Report Designer Installation"
msgstr ""
#. module: base_report_designer
#: view:base.report.sxw:0
msgid "Cancel"
msgstr ""
#. module: base_report_designer
#: view:base.report.sxw:0
msgid "or"
msgstr ""
#. module: base_report_designer
#: model:ir.model,name:base_report_designer.model_ir_actions_report_xml
msgid "ir.actions.report.xml"
msgstr ""
#. module: base_report_designer
#: view:base.report.sxw:0
msgid "Select your report"
msgstr ""

View File

@ -73,6 +73,7 @@ class base_config_settings(osv.osv_memory):
user = self.pool.get('res.users').browse(cr, uid, uid, context) user = self.pool.get('res.users').browse(cr, uid, uid, context)
user.company_id.write({'font':wizard.font,'rml_header': self._change_header(user.company_id.rml_header,wizard.font), 'rml_header2': self._change_header(user.company_id.rml_header2,wizard.font), 'rml_header3': self._change_header(user.company_id.rml_header3,wizard.font)}) user.company_id.write({'font':wizard.font,'rml_header': self._change_header(user.company_id.rml_header,wizard.font), 'rml_header2': self._change_header(user.company_id.rml_header2,wizard.font), 'rml_header3': self._change_header(user.company_id.rml_header3,wizard.font)})
return {} return {}
# Preferences wizard for Sales & CRM. # Preferences wizard for Sales & CRM.
# It is defined here because it is inherited independently in modules sale, crm, # It is defined here because it is inherited independently in modules sale, crm,
# plugin_outlook and plugin_thunderbird. # plugin_outlook and plugin_thunderbird.

View File

@ -0,0 +1,33 @@
# Estonian translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
"PO-Revision-Date: 2013-10-09 14:42+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Estonian <et@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: 2013-10-10 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
#. module: claim_from_delivery
#: view:stock.picking.out:0
msgid "Claims"
msgstr "Nõuded"
#. module: claim_from_delivery
#: model:res.request.link,name:claim_from_delivery.request_link_claim_from_delivery
msgid "Delivery Order"
msgstr "Tarnetellimus"
#. module: claim_from_delivery
#: model:ir.actions.act_window,name:claim_from_delivery.action_claim_from_delivery
msgid "Claim From Delivery"
msgstr ""

View File

@ -19,6 +19,7 @@
# #
############################################################################## ##############################################################################
import calendar
from datetime import date, datetime from datetime import date, datetime
from dateutil import relativedelta from dateutil import relativedelta
@ -117,9 +118,9 @@ class crm_case_section(osv.osv):
""" """
month_begin = date.today().replace(day=1) month_begin = date.today().replace(day=1)
section_result = [{ section_result = [{
'value': 0, 'value': 0,
'tooltip': (month_begin + relativedelta.relativedelta(months=-i)).strftime('%B'), 'tooltip': (month_begin + relativedelta.relativedelta(months=-i)).strftime('%B'),
} for i in range(self._period_number - 1, -1, -1)] } for i in range(self._period_number - 1, -1, -1)]
group_obj = obj.read_group(cr, uid, domain, read_fields, groupby_field, context=context) group_obj = obj.read_group(cr, uid, domain, read_fields, groupby_field, context=context)
for group in group_obj: for group in group_obj:
group_begin_date = datetime.strptime(group['__domain'][0][2], tools.DEFAULT_SERVER_DATE_FORMAT) group_begin_date = datetime.strptime(group['__domain'][0][2], tools.DEFAULT_SERVER_DATE_FORMAT)
@ -135,12 +136,14 @@ class crm_case_section(osv.osv):
obj = self.pool.get('crm.lead') obj = self.pool.get('crm.lead')
res = dict.fromkeys(ids, False) res = dict.fromkeys(ids, False)
month_begin = date.today().replace(day=1) month_begin = date.today().replace(day=1)
groupby_begin = (month_begin + relativedelta.relativedelta(months=-4)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT) date_begin = month_begin - relativedelta.relativedelta(months=self._period_number - 1)
date_end = month_begin.replace(day=calendar.monthrange(month_begin.year, month_begin.month)[1])
date_domain = [('create_date', '>=', date_begin.strftime(tools.DEFAULT_SERVER_DATE_FORMAT)), ('create_date', '<=', date_end.strftime(tools.DEFAULT_SERVER_DATE_FORMAT))]
for id in ids: for id in ids:
res[id] = dict() res[id] = dict()
lead_domain = [('type', '=', 'lead'), ('section_id', '=', id), ('create_date', '>=', groupby_begin)] lead_domain = date_domain + [('type', '=', 'lead'), ('section_id', '=', id)]
res[id]['monthly_open_leads'] = self.__get_bar_values(cr, uid, obj, lead_domain, ['create_date'], 'create_date_count', 'create_date', context=context) res[id]['monthly_open_leads'] = self.__get_bar_values(cr, uid, obj, lead_domain, ['create_date'], 'create_date_count', 'create_date', context=context)
opp_domain = [('type', '=', 'opportunity'), ('section_id', '=', id), ('create_date', '>=', groupby_begin)] opp_domain = date_domain + [('type', '=', 'opportunity'), ('section_id', '=', id)]
res[id]['monthly_planned_revenue'] = self.__get_bar_values(cr, uid, obj, opp_domain, ['planned_revenue', 'create_date'], 'planned_revenue', 'create_date', context=context) res[id]['monthly_planned_revenue'] = self.__get_bar_values(cr, uid, obj, opp_domain, ['planned_revenue', 'create_date'], 'planned_revenue', 'create_date', context=context)
return res return res
@ -255,13 +258,6 @@ class crm_case_resource_type(osv.osv):
'section_id': fields.many2one('crm.case.section', 'Sales Team'), 'section_id': fields.many2one('crm.case.section', 'Sales Team'),
} }
def _links_get(self, cr, uid, context=None):
"""Gets links value for reference field"""
obj = self.pool.get('res.request.link')
ids = obj.search(cr, uid, [])
res = obj.read(cr, uid, ids, ['object', 'name'], context)
return [(r['object'], r['name']) for r in res]
class crm_payment_mode(osv.osv): class crm_payment_mode(osv.osv):
""" Payment Mode for Fund """ """ Payment Mode for Fund """
_name = "crm.payment.mode" _name = "crm.payment.mode"

View File

@ -23,6 +23,7 @@ import crm
from datetime import datetime from datetime import datetime
from operator import itemgetter from operator import itemgetter
import openerp
from openerp import SUPERUSER_ID from openerp import SUPERUSER_ID
from openerp import tools from openerp import tools
from openerp.addons.base.res.res_partner import format_address from openerp.addons.base.res.res_partner import format_address
@ -258,8 +259,8 @@ class crm_lead(format_address, osv.osv):
# Only used for type opportunity # Only used for type opportunity
'probability': fields.float('Success Rate (%)', group_operator="avg"), 'probability': fields.float('Success Rate (%)', group_operator="avg"),
'planned_revenue': fields.float('Expected Revenue', track_visibility='always'), 'planned_revenue': fields.float('Expected Revenue', track_visibility='always'),
'ref': fields.reference('Reference', selection=crm._links_get, size=128), 'ref': fields.reference('Reference', selection=openerp.addons.base.res.res_request.referencable_models),
'ref2': fields.reference('Reference 2', selection=crm._links_get, size=128), 'ref2': fields.reference('Reference 2', selection=openerp.addons.base.res.res_request.referencable_models),
'phone': fields.char("Phone", size=64), 'phone': fields.char("Phone", size=64),
'date_deadline': fields.date('Expected Closing', help="Estimate of the date on which the opportunity will be won."), 'date_deadline': fields.date('Expected Closing', help="Estimate of the date on which the opportunity will be won."),
'date_action': fields.date('Next Action Date', select=True), 'date_action': fields.date('Next Action Date', select=True),

View File

@ -1,7 +1,7 @@
- -
Create a user as 'Crm Salesmanager' Create a user as 'Crm Salesmanager'
- -
!record {model: res.users, id: crm_res_users_salesmanager}: !record {model: res.users, id: crm_res_users_salesmanager, view: False}:
company_id: base.main_company company_id: base.main_company
name: Crm Sales manager name: Crm Sales manager
login: csm login: csm
@ -16,7 +16,7 @@
- -
Create a user as 'Crm Salesman' Create a user as 'Crm Salesman'
- -
!record {model: res.users, id: crm_res_users_salesman}: !record {model: res.users, id: crm_res_users_salesman, view: False}:
company_id: base.main_company company_id: base.main_company
name: Crm Salesman name: Crm Salesman
login: csu login: csu

View File

@ -63,7 +63,7 @@ class crm_lead2opportunity_partner(osv.osv_memory):
for id in ids: for id in ids:
tomerge.add(id) tomerge.add(id)
if email: if email:
ids = lead_obj.search(cr, uid, [('email_from', 'ilike', email[0]), ('probability', '<', '100')]) ids = lead_obj.search(cr, uid, [('email_from', '=ilike', email[0]), ('probability', '<', '100')])
for id in ids: for id in ids:
tomerge.add(id) tomerge.add(id)

View File

@ -19,6 +19,7 @@
# #
############################################################################## ##############################################################################
import openerp
from openerp.addons.crm import crm from openerp.addons.crm import crm
from openerp.osv import fields, osv from openerp.osv import fields, osv
from openerp import tools from openerp import tools
@ -83,7 +84,7 @@ class crm_claim(osv.osv):
'date_deadline': fields.date('Deadline'), 'date_deadline': fields.date('Deadline'),
'date_closed': fields.datetime('Closed', readonly=True), 'date_closed': fields.datetime('Closed', readonly=True),
'date': fields.datetime('Claim Date', select=True), 'date': fields.datetime('Claim Date', select=True),
'ref' : fields.reference('Reference', selection=crm._links_get, size=128), 'ref': fields.reference('Reference', selection=openerp.addons.base.res.res_request.referencable_models),
'categ_id': fields.many2one('crm.case.categ', 'Category', \ 'categ_id': fields.many2one('crm.case.categ', 'Category', \
domain="[('section_id','=',section_id),\ domain="[('section_id','=',section_id),\
('object_id.model', '=', 'crm.claim')]"), ('object_id.model', '=', 'crm.claim')]"),

View File

@ -19,6 +19,7 @@
# #
############################################################################## ##############################################################################
import openerp
from openerp.addons.crm import crm from openerp.addons.crm import crm
from openerp.osv import fields, osv from openerp.osv import fields, osv
from openerp import tools from openerp import tools
@ -53,8 +54,8 @@ class crm_helpdesk(osv.osv):
'email_cc': fields.text('Watchers Emails', size=252 , help="These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma"), 'email_cc': fields.text('Watchers Emails', size=252 , help="These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma"),
'email_from': fields.char('Email', size=128, help="Destination email for email gateway"), 'email_from': fields.char('Email', size=128, help="Destination email for email gateway"),
'date': fields.datetime('Date'), 'date': fields.datetime('Date'),
'ref' : fields.reference('Reference', selection=crm._links_get, size=128), 'ref': fields.reference('Reference', selection=openerp.addons.base.res.res_request.referencable_models),
'ref2' : fields.reference('Reference 2', selection=crm._links_get, size=128), 'ref2': fields.reference('Reference 2', selection=openerp.addons.base.res.res_request.referencable_models),
'channel_id': fields.many2one('crm.case.channel', 'Channel', help="Communication channel."), 'channel_id': fields.many2one('crm.case.channel', 'Channel', help="Communication channel."),
'planned_revenue': fields.float('Planned Revenue'), 'planned_revenue': fields.float('Planned Revenue'),
'planned_cost': fields.float('Planned Costs'), 'planned_cost': fields.float('Planned Costs'),

View File

@ -0,0 +1,85 @@
# Estonian translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
"PO-Revision-Date: 2013-10-09 15:39+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Estonian <et@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: 2013-10-10 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
#. module: crm_todo
#: model:ir.model,name:crm_todo.model_project_task
msgid "Task"
msgstr "Ülesanne"
#. module: crm_todo
#: view:crm.lead:0
msgid "Timebox"
msgstr "Ajalahter"
#. module: crm_todo
#: view:crm.lead:0
msgid "Lead"
msgstr ""
#. module: crm_todo
#: view:crm.lead:0
msgid "For cancelling the task"
msgstr "Ülesande katkestamiseks"
#. module: crm_todo
#: view:crm.lead:0
msgid "Next"
msgstr "Järgmine"
#. module: crm_todo
#: model:ir.actions.act_window,name:crm_todo.crm_todo_action
#: model:ir.ui.menu,name:crm_todo.menu_crm_todo
msgid "My Tasks"
msgstr "Minu ülesanded"
#. module: crm_todo
#: view:crm.lead:0
#: field:crm.lead,task_ids:0
msgid "Tasks"
msgstr "Ülesanded"
#. module: crm_todo
#: view:crm.lead:0
msgid "Done"
msgstr "Valmis"
#. module: crm_todo
#: view:crm.lead:0
msgid "Cancel"
msgstr "Katkesta"
#. module: crm_todo
#: model:ir.model,name:crm_todo.model_crm_lead
msgid "Lead/Opportunity"
msgstr ""
#. module: crm_todo
#: field:project.task,lead_id:0
msgid "Lead / Opportunity"
msgstr ""
#. module: crm_todo
#: view:crm.lead:0
msgid "For changing to done state"
msgstr ""
#. module: crm_todo
#: view:crm.lead:0
msgid "Previous"
msgstr "Eelmine"

View File

@ -33,48 +33,45 @@ class actions_server(osv.Model):
return res return res
_columns = { _columns = {
'email_from': fields.char('From', 'email_from': fields.related(
help="Sender address; define the template to see its value. If not set, the default " 'template_id', 'email_from', type='char',
"value will be the author's email alias if configured, or email address."), readonly=True, string='From'
'email_to': fields.char('To (Emails)', ),
help="Comma-separated recipient addresses; define the template to see its value"), 'email_to': fields.related(
'partner_to': fields.char('To (Partners)', 'template_id', 'email_to', type='char',
help="Comma-separated ids of recipient partners; define the template to see its value"), readonly=True, string='To (Emails)'
'subject': fields.char('Subject', ),
help="Email subject; define the template to see its value"), 'partner_to': fields.related(
'body_html': fields.text('Body', 'template_id', 'partner_to', type='char',
help="Rich-text/HTML version of the message; define the template to see its value"), readonly=True, string='To (Partners)'
'template_id': fields.many2one('email.template', 'Email Template', ondelete='set null', ),
help="Define the email template to use for the email to send.") 'subject': fields.related(
'template_id', 'subject', type='char',
readonly=True, string='Subject'
),
'body_html': fields.related(
'template_id', 'body_html', type='text',
readonly=True, string='Body'
),
'template_id': fields.many2one(
'email.template', 'Email Template', ondelete='set null',
domain="[('model_id', '=', model_id)]",
),
} }
def on_change_template_id(self, cr, uid, ids, template_id, context=None): def on_change_template_id(self, cr, uid, ids, template_id, context=None):
""" Render the raw template in the server action fields. """ """ Render the raw template in the server action fields. """
fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to']
if template_id: if template_id:
fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids']
template_values = self.pool.get('email.template').read(cr, uid, template_id, fields, context) template_values = self.pool.get('email.template').read(cr, uid, template_id, fields, context)
values = dict((field, template_values[field]) for field in fields if template_values.get(field)) values = dict((field, template_values[field]) for field in fields if template_values.get(field))
if not values.get('email_from'): if not values.get('email_from'):
return {'warning': {'title': 'Incomplete template', 'message': 'Your template should define email_from'}, 'value': values} return {'warning': {'title': 'Incomplete template', 'message': 'Your template should define email_from'}, 'value': values}
else: else:
values = self.default_get(cr, uid, ['subject', 'body_html', 'email_from', 'email_to', 'partner_to'], context=context) values = dict.fromkeys(fields, False)
return {'value': values} return {'value': values}
def create(self, cr, uid, values, context=None):
if values.get('template_id'):
fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids']
template_values = self.pool.get('email.template').read(cr, uid, values.get('template_id'), fields, context)
values.update(dict((field, template_values[field]) for field in fields if template_values.get(field)))
return super(actions_server, self).create(cr, uid, values, context=context)
def write(self, cr, uid, ids, values, context=None):
if values.get('template_id'):
fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids']
template_values = self.pool.get('email.template').read(cr, uid, values.get('template_id'), fields, context)
values.update(dict((field, template_values[field]) for field in fields if template_values.get(field)))
return super(actions_server, self).write(cr, uid, ids, values, context=context)
def run_action_email(self, cr, uid, action, eval_context=None, context=None): def run_action_email(self, cr, uid, action, eval_context=None, context=None):
if not action.template_id or not context.get('active_id'): if not action.template_id or not context.get('active_id'):
return False return False

View File

@ -16,7 +16,6 @@
<group attrs="{'invisible': [('model_id', '=', False)]}"> <group attrs="{'invisible': [('model_id', '=', False)]}">
<field name="template_id" <field name="template_id"
on_change='on_change_template_id(template_id)' on_change='on_change_template_id(template_id)'
domain="[('model_id', '=', model_id)]"
attrs="{'required': [('state', '=', 'email')]}"/> attrs="{'required': [('state', '=', 'email')]}"/>
<p colspan="2" attrs="{'invisible': [('template_id', '!=', False)]}"> <p colspan="2" attrs="{'invisible': [('template_id', '!=', False)]}">
Choose a template to display its values. Choose a template to display its values.

View File

@ -1,7 +1,7 @@
- -
Create a user as 'Event manager' Create a user as 'Event manager'
- -
!record {model: res.users, id: res_users_eventmanager}: !record {model: res.users, id: res_users_eventmanager, view: False}:
company_id: base.main_company company_id: base.main_company
name: Event manager name: Event manager
login: em login: em
@ -16,7 +16,7 @@
- -
Create a user as 'Event user' Create a user as 'Event user'
- -
!record {model: res.users, id: res_users_eventuser}: !record {model: res.users, id: res_users_eventuser, view: False}:
company_id: base.main_company company_id: base.main_company
name: User name: User
login: eu login: eu

View File

@ -346,26 +346,9 @@ class res_users(osv.osv):
_name = 'res.users' _name = 'res.users'
_inherit = 'res.users' _inherit = 'res.users'
def create(self, cr, uid, data, context=None):
user_id = super(res_users, self).create(cr, uid, data, context=context)
# add shortcut unless 'noshortcut' is True in context
if not(context and context.get('noshortcut', False)):
data_obj = self.pool.get('ir.model.data')
try:
data_id = data_obj._get_id(cr, uid, 'hr', 'ir_ui_view_sc_employee')
view_id = data_obj.browse(cr, uid, data_id, context=context).res_id
self.pool.get('ir.ui.view_sc').copy(cr, uid, view_id, default = {
'user_id': user_id}, context=context)
except:
# Tolerate a missing shortcut. See product/product.py for similar code.
_logger.debug('Skipped meetings shortcut for user "%s".', data.get('name','<new'))
return user_id
_columns = { _columns = {
'employee_ids': fields.one2many('hr.employee', 'user_id', 'Related employees'), 'employee_ids': fields.one2many('hr.employee', 'user_id', 'Related employees'),
} }

View File

@ -224,13 +224,6 @@
<menuitem action="open_view_employee_list_my" id="menu_open_view_employee_list_my" sequence="3" parent="menu_hr_main"/> <menuitem action="open_view_employee_list_my" id="menu_open_view_employee_list_my" sequence="3" parent="menu_hr_main"/>
<record id="ir_ui_view_sc_employee" model="ir.ui.view_sc">
<field name="name">Employees</field>
<field name="resource">ir.ui.menu</field>
<field name="user_id" ref="base.user_root"/>
<field name="res_id" ref="hr.menu_open_view_employee_list_my"/>
</record>
<!-- Employee architecture --> <!-- Employee architecture -->
<record id="view_partner_tree2" model="ir.ui.view"> <record id="view_partner_tree2" model="ir.ui.view">
<field name="name">hr.employee.tree</field> <field name="name">hr.employee.tree</field>

View File

@ -1,7 +1,7 @@
- -
Create a user as 'HR Manager' Create a user as 'HR Manager'
- -
!record {model: res.users, id: res_users_hr_manager}: !record {model: res.users, id: res_users_hr_manager, view: False}:
company_id: base.main_company company_id: base.main_company
name: HR manager name: HR manager
login: hrm login: hrm
@ -15,7 +15,7 @@
- -
Create a user as 'HR Officer' Create a user as 'HR Officer'
- -
!record {model: res.users, id: res_users_hr_officer}: !record {model: res.users, id: res_users_hr_officer, view: False}:
company_id: base.main_company company_id: base.main_company
name: HR Officer name: HR Officer
login: hro login: hro
@ -29,7 +29,7 @@
- -
Create a user as 'Employee' Create a user as 'Employee'
- -
!record {model: res.users, id: res_users_employee}: !record {model: res.users, id: res_users_employee, view: False}:
company_id: base.main_company company_id: base.main_company
name: Employee name: Employee
login: emp login: emp

View File

@ -1,7 +1,7 @@
- -
Create a user as 'HR Attendance Officer' Create a user as 'HR Attendance Officer'
- -
!record {model: res.users, id: res_users_attendance_officer}: !record {model: res.users, id: res_users_attendance_officer, view: False}:
company_id: base.main_company company_id: base.main_company
name: HR Officer name: HR Officer
login: ao login: ao

View File

@ -1,7 +1,7 @@
- -
Create a user as 'HR Recruitment Officer' Create a user as 'HR Recruitment Officer'
- -
!record {model: res.users, id: res_users_hr_recruitment_officer}: !record {model: res.users, id: res_users_hr_recruitment_officer, view: False}:
company_id: base.main_company company_id: base.main_company
name: HR Recruitment Officer name: HR Recruitment Officer
login: hrro login: hrro

View File

@ -1,7 +1,7 @@
- -
Create a user as 'HR timesheet Manager' Create a user as 'HR timesheet Manager'
- -
!record {model: res.users, id: res_hr_timesheet_manager}: !record {model: res.users, id: res_hr_timesheet_manager, view: False}:
company_id: base.main_company company_id: base.main_company
name: HR timesheet manager name: HR timesheet manager
login: hrtm login: hrtm
@ -15,7 +15,7 @@
- -
Create a user as 'HR timesheet Officer' Create a user as 'HR timesheet Officer'
- -
!record {model: res.users, id: res_hr_timesheet_officer}: !record {model: res.users, id: res_hr_timesheet_officer, view: False}:
company_id: base.main_company company_id: base.main_company
name: HR timesheet Officer name: HR timesheet Officer
login: hrto login: hrto
@ -29,7 +29,7 @@
- -
Create a user as 'Timesheet Employee' Create a user as 'Timesheet Employee'
- -
!record {model: res.users, id: res_hr_timesheet_employee}: !record {model: res.users, id: res_hr_timesheet_employee, view: False}:
company_id: base.main_company company_id: base.main_company
name: Timesheet Employee name: Timesheet Employee
login: empt login: empt

View File

@ -133,7 +133,7 @@ class hr_si_project(osv.osv_memory):
def check_state(self, cr, uid, ids, context=None): def check_state(self, cr, uid, ids, context=None):
obj_model = self.pool.get('ir.model.data') obj_model = self.pool.get('ir.model.data')
emp_id = self.default_get(cr, uid, context)['emp_id'] emp_id = self.default_get(cr, uid, ['emp_id'], context)['emp_id']
# get the latest action (sign_in or out) for this employee # get the latest action (sign_in or out) for this employee
cr.execute('select action from hr_attendance where employee_id=%s and action in (\'sign_in\',\'sign_out\') order by name desc limit 1', (emp_id,)) cr.execute('select action from hr_attendance where employee_id=%s and action in (\'sign_in\',\'sign_out\') order by name desc limit 1', (emp_id,))
res = (cr.fetchone() or ('sign_out',))[0] res = (cr.fetchone() or ('sign_out',))[0]

View File

@ -458,7 +458,7 @@ class hr_timesheet_sheet_sheet_day(osv.osv):
THEN (SUM(total_attendance) + THEN (SUM(total_attendance) +
CASE WHEN current_date <> name CASE WHEN current_date <> name
THEN 1440 THEN 1440
ELSE (EXTRACT(hour FROM current_time) * 60) + EXTRACT(minute FROM current_time) ELSE (EXTRACT(hour FROM current_time AT TIME ZONE 'UTC') * 60) + EXTRACT(minute FROM current_time AT TIME ZONE 'UTC')
END END
) )
ELSE SUM(total_attendance) ELSE SUM(total_attendance)

View File

@ -1218,7 +1218,7 @@ openerp.mail = function (session) {
init: function (parent, datasets, options) { init: function (parent, datasets, options) {
var self = this; var self = this;
this._super(parent, options); this._super(parent, options);
this.MailWidget = parent.__proto__ == mail.Widget.prototype ? parent : false; this.MailWidget = parent instanceof mail.Widget ? parent : false;
this.domain = options.domain || []; this.domain = options.domain || [];
this.context = _.extend(options.context || {}); this.context = _.extend(options.context || {});

View File

@ -48,7 +48,8 @@ openerp.mail.suggestions = function(session, mail) {
join_group: function (event) { join_group: function (event) {
var self = this; var self = this;
return this.mail_group.call('message_subscribe_users', [[$(event.currentTarget).attr('id')],[this.session.uid]]).then(function(res) { var group_id = parseInt($(event.currentTarget).attr('id'), 10);
return this.mail_group.call('message_subscribe_users', [[group_id], [this.session.uid]]).then(function(res) {
self.fetch_suggested_groups(); self.fetch_suggested_groups();
}); });
}, },

View File

@ -194,10 +194,13 @@ class MassMailing(osv.Model):
} }
for id in ids: for id in ids:
res[id] = {} res[id] = {}
date_begin = self.browse(cr, uid, id, context=context).date date_begin = datetime.strptime(self.browse(cr, uid, id, context=context).date, tools.DEFAULT_SERVER_DATETIME_FORMAT)
domain = [('mass_mailing_id', '=', id), ('opened', '>=', date_begin)] date_end = date_begin + relativedelta.relativedelta(days=self._period_number - 1)
date_begin_str = date_begin.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)
date_end_str = date_end.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)
domain = [('mass_mailing_id', '=', id), ('opened', '>=', date_begin_str), ('opened', '<=', date_end_str)]
res[id]['opened_monthly'] = self.__get_bar_values(cr, uid, id, obj, domain, ['opened'], 'opened_count', 'opened', context=context) res[id]['opened_monthly'] = self.__get_bar_values(cr, uid, id, obj, domain, ['opened'], 'opened_count', 'opened', context=context)
domain = [('mass_mailing_id', '=', id), ('replied', '>=', date_begin)] domain = [('mass_mailing_id', '=', id), ('replied', '>=', date_begin_str), ('replied', '<=', date_end_str)]
res[id]['replied_monthly'] = self.__get_bar_values(cr, uid, id, obj, domain, ['replied'], 'replied_count', 'replied', context=context) res[id]['replied_monthly'] = self.__get_bar_values(cr, uid, id, obj, domain, ['replied'], 'replied_count', 'replied', context=context)
return res return res

View File

@ -77,6 +77,7 @@ Dashboard / Reports for MRP will include:
#TODO: This yml tests are needed to be completely reviewed again because the product wood panel is removed in product demo as it does not suit for new demo context of computer and consultant company #TODO: This yml tests are needed to be completely reviewed again because the product wood panel is removed in product demo as it does not suit for new demo context of computer and consultant company
# so the ymls are too complex to change at this stage # so the ymls are too complex to change at this stage
'test': [ 'test': [
'test/bom_with_service_type_product.yml',
'test/mrp_users.yml', 'test/mrp_users.yml',
'test/order_demo.yml', 'test/order_demo.yml',
'test/order_process.yml', 'test/order_process.yml',

View File

@ -292,8 +292,10 @@ class mrp_bom(osv.osv):
""" """
if properties is None: if properties is None:
properties = [] properties = []
cr.execute('select id from mrp_bom where product_id=%s and bom_id is null order by sequence', (product_id,)) domain = [('product_id', '=', product_id), ('bom_id', '=', False),
ids = map(lambda x: x[0], cr.fetchall()) '|', ('date_start', '=', False), ('date_start', '<=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
'|', ('date_stop', '=', False), ('date_stop', '>=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT))]
ids = self.search(cr, uid, domain)
max_prop = 0 max_prop = 0
result = False result = False
for bom in self.pool.get('mrp.bom').browse(cr, uid, ids): for bom in self.pool.get('mrp.bom').browse(cr, uid, ids):
@ -601,12 +603,12 @@ class mrp_production(osv.osv):
""" """
self.write(cr, uid, ids, {'state': 'picking_except'}) self.write(cr, uid, ids, {'state': 'picking_except'})
return True return True
def action_compute(self, cr, uid, ids, properties=None, context=None): def _action_compute_lines(self, cr, uid, ids, properties=None, context=None):
""" Computes bills of material of a product. """ Compute product_lines and workcenter_lines from BoM structure
@param properties: List containing dictionaries of properties. @return: product_lines
@return: No. of products.
""" """
if properties is None: if properties is None:
properties = [] properties = []
results = [] results = []
@ -614,13 +616,15 @@ class mrp_production(osv.osv):
uom_obj = self.pool.get('product.uom') uom_obj = self.pool.get('product.uom')
prod_line_obj = self.pool.get('mrp.production.product.line') prod_line_obj = self.pool.get('mrp.production.product.line')
workcenter_line_obj = self.pool.get('mrp.production.workcenter.line') workcenter_line_obj = self.pool.get('mrp.production.workcenter.line')
for production in self.browse(cr, uid, ids):
p_ids = prod_line_obj.search(cr, SUPERUSER_ID, [('production_id', '=', production.id)], context=context)
prod_line_obj.unlink(cr, SUPERUSER_ID, p_ids, context=context)
w_ids = workcenter_line_obj.search(cr, SUPERUSER_ID, [('production_id', '=', production.id)], context=context)
workcenter_line_obj.unlink(cr, SUPERUSER_ID, w_ids, context=context)
for production in self.browse(cr, uid, ids, context=context):
#unlink product_lines
prod_line_obj.unlink(cr, SUPERUSER_ID, [line.id for line in production.product_lines], context=context)
#unlink workcenter_lines
workcenter_line_obj.unlink(cr, SUPERUSER_ID, [line.id for line in production.workcenter_lines], context=context)
# search BoM structure and route
bom_point = production.bom_id bom_point = production.bom_id
bom_id = production.bom_id.id bom_id = production.bom_id.id
if not bom_point: if not bom_point:
@ -629,20 +633,33 @@ class mrp_production(osv.osv):
bom_point = bom_obj.browse(cr, uid, bom_id) bom_point = bom_obj.browse(cr, uid, bom_id)
routing_id = bom_point.routing_id.id or False routing_id = bom_point.routing_id.id or False
self.write(cr, uid, [production.id], {'bom_id': bom_id, 'routing_id': routing_id}) self.write(cr, uid, [production.id], {'bom_id': bom_id, 'routing_id': routing_id})
if not bom_id: if not bom_id:
raise osv.except_osv(_('Error!'), _("Cannot find a bill of material for this product.")) raise osv.except_osv(_('Error!'), _("Cannot find a bill of material for this product."))
# get components and workcenter_lines from BoM structure
factor = uom_obj._compute_qty(cr, uid, production.product_uom.id, production.product_qty, bom_point.product_uom.id) factor = uom_obj._compute_qty(cr, uid, production.product_uom.id, production.product_qty, bom_point.product_uom.id)
res = bom_obj._bom_explode(cr, uid, bom_point, factor / bom_point.product_qty, properties, routing_id=production.routing_id.id) res = bom_obj._bom_explode(cr, uid, bom_point, factor / bom_point.product_qty, properties, routing_id=production.routing_id.id)
results = res[0] results = res[0] # product_lines
results2 = res[1] results2 = res[1] # workcenter_lines
# reset product_lines in production order
for line in results: for line in results:
line['production_id'] = production.id line['production_id'] = production.id
prod_line_obj.create(cr, uid, line) prod_line_obj.create(cr, uid, line)
#reset workcenter_lines in production order
for line in results2: for line in results2:
line['production_id'] = production.id line['production_id'] = production.id
workcenter_line_obj.create(cr, uid, line) workcenter_line_obj.create(cr, uid, line)
return len(results) return results
def action_compute(self, cr, uid, ids, properties=None, context=None):
""" Computes bills of material of a product.
@param properties: List containing dictionaries of properties.
@return: No. of products.
"""
return len(self._action_compute_lines(cr, uid, ids, properties=properties, context=context))
def action_cancel(self, cr, uid, ids, context=None): def action_cancel(self, cr, uid, ids, context=None):
""" Cancels the production order and related stock moves. """ Cancels the production order and related stock moves.
@ -669,8 +686,12 @@ class mrp_production(osv.osv):
move_obj = self.pool.get('stock.move') move_obj = self.pool.get('stock.move')
self.write(cr, uid, ids, {'state': 'ready'}) self.write(cr, uid, ids, {'state': 'ready'})
for (production_id,name) in self.name_get(cr, uid, ids): for production in self.browse(cr, uid, ids, context=context):
production = self.browse(cr, uid, production_id) if not production.move_created_ids:
produce_move_id = self._make_production_produce_line(cr, uid, production, context=context)
for scheduled in production.product_lines:
self._make_production_line_procurement(cr, uid, scheduled, False, context=context)
if production.move_prod_id and production.move_prod_id.location_id.id != production.location_dest_id.id: if production.move_prod_id and production.move_prod_id.location_id.id != production.location_dest_id.id:
move_obj.write(cr, uid, [production.move_prod_id.id], move_obj.write(cr, uid, [production.move_prod_id.id],
{'location_id': production.location_dest_id.id}) {'location_id': production.location_dest_id.id})
@ -722,6 +743,10 @@ class mrp_production(osv.osv):
stock_mov_obj = self.pool.get('stock.move') stock_mov_obj = self.pool.get('stock.move')
production = self.browse(cr, uid, production_id, context=context) production = self.browse(cr, uid, production_id, context=context)
if not production.move_lines and production.state == 'ready':
# trigger workflow if not products to consume (eg: services)
self.signal_button_produce(cr, uid, [production_id])
produced_qty = 0 produced_qty = 0
for produced_product in production.move_created_ids2: for produced_product in production.move_created_ids2:
if (produced_product.scrapped) or (produced_product.product_id.id != production.product_id.id): if (produced_product.scrapped) or (produced_product.product_id.id != production.product_id.id):
@ -784,9 +809,9 @@ class mrp_production(osv.osv):
subproduct_factor = self._get_subproduct_factor(cr, uid, production.id, produce_product.id, context=context) subproduct_factor = self._get_subproduct_factor(cr, uid, production.id, produce_product.id, context=context)
rest_qty = (subproduct_factor * production.product_qty) - produced_qty rest_qty = (subproduct_factor * production.product_qty) - produced_qty
if rest_qty < production_qty: if rest_qty < (subproduct_factor * production_qty):
prod_name = produce_product.product_id.name_get()[0][1] prod_name = produce_product.product_id.name_get()[0][1]
raise osv.except_osv(_('Warning!'), _('You are going to produce total %s quantities of "%s".\nBut you can only produce up to total %s quantities.') % (production_qty, prod_name, rest_qty)) raise osv.except_osv(_('Warning!'), _('You are going to produce total %s quantities of "%s".\nBut you can only produce up to total %s quantities.') % ((subproduct_factor * production_qty), prod_name, rest_qty))
if rest_qty > 0 : if rest_qty > 0 :
stock_mov_obj.action_consume(cr, uid, [produce_product.id], (subproduct_factor * production_qty), context=context) stock_mov_obj.action_consume(cr, uid, [produce_product.id], (subproduct_factor * production_qty), context=context)
@ -861,13 +886,19 @@ class mrp_production(osv.osv):
""" """
res = True res = True
for production in self.browse(cr, uid, ids): for production in self.browse(cr, uid, ids):
if not production.product_lines: boms = self._action_compute_lines(cr, uid, [production.id])
if not self.action_compute(cr, uid, [production.id]): res = False
res = False for bom in boms:
product = self.pool.get('product.product').browse(cr, uid, bom['product_id'])
if product.type in ('product', 'consu'):
res = True
return res return res
def _get_auto_picking(self, cr, uid, production): def _get_auto_picking(self, cr, uid, production):
return True return True
def _hook_create_post_procurement(self, cr, uid, production, procurement_id, context=None):
return True
def _make_production_line_procurement(self, cr, uid, production_line, shipment_move_id, context=None): def _make_production_line_procurement(self, cr, uid, production_line, shipment_move_id, context=None):
procurement_order = self.pool.get('procurement.order') procurement_order = self.pool.get('procurement.order')
@ -1015,11 +1046,13 @@ class mrp_production(osv.osv):
for line in production.product_lines: for line in production.product_lines:
consume_move_id = self._make_production_consume_line(cr, uid, line, produce_move_id, source_location_id=source_location_id, context=context) consume_move_id = self._make_production_consume_line(cr, uid, line, produce_move_id, source_location_id=source_location_id, context=context)
shipment_move_id = self._make_production_internal_shipment_line(cr, uid, line, shipment_id, consume_move_id,\ if shipment_id:
shipment_move_id = self._make_production_internal_shipment_line(cr, uid, line, shipment_id, consume_move_id,\
destination_location_id=source_location_id, context=context) destination_location_id=source_location_id, context=context)
self._make_production_line_procurement(cr, uid, line, shipment_move_id, context=context) self._make_production_line_procurement(cr, uid, line, shipment_move_id, context=context)
self.pool.get('stock.picking').signal_button_confirm(cr, uid, [shipment_id]) if shipment_id:
self.pool.get('stock.picking').signal_button_confirm(cr, uid, [shipment_id])
production.write({'state':'confirmed'}, context=context) production.write({'state':'confirmed'}, context=context)
return shipment_id return shipment_id

View File

@ -0,0 +1,134 @@
-
I create Bill of Materials with one service type product and one consumable product.
-
!record {model: mrp.bom, id: mrp_bom_test1}:
company_id: base.main_company
name: PC Assemble SC234
product_id: product.product_product_3
product_qty: 1.0
type: normal
bom_lines:
- company_id: base.main_company
name: On Site Assistance
product_id: product.product_product_2
product_qty: 1.0
- company_id: base.main_company
name: GrapWorks Software
product_id: product.product_product_44
product_qty: 1.0
-
I make the production order using BoM having one service type product and one consumable product.
-
!record {model: mrp.production, id: mrp_production_servicetype_mo1}:
product_id: product.product_product_5
product_qty: 1.0
bom_id: mrp_bom_test1
date_planned: !eval time.strftime('%Y-%m-%d %H:%M:%S')
-
I compute the data of production order.
-
!python {model: mrp.production}: |
self.action_compute(cr, uid, [ref("mrp_production_servicetype_mo1")], {"lang": "en_US", "tz": False, "search_default_Current": 1,
"active_model": "ir.ui.menu", "active_ids": [ref("mrp.menu_mrp_production_action")],
"active_id": ref("mrp.menu_mrp_production_action"), })
-
I confirm the production order.
-
!workflow {model: mrp.production, action: button_confirm, ref: mrp_production_servicetype_mo1}
-
I confirm the Consume Products.
-
!python {model: mrp.production}: |
order = self.browse(cr, uid, ref("mrp_production_servicetype_mo1"))
assert order.state == 'confirmed', "Production order should be confirmed."
for move_line in order.move_lines:
move_line.action_consume(move_line.product_qty)
-
I processed the Product Entirely.
-
!python {model: mrp.production}: |
order = self.browse(cr, uid, ref("mrp_production_servicetype_mo1"))
assert order.state == 'in_production', 'Production order should be in production State.'
for move_created in order.move_created_ids:
move_created.action_done()
-
I produce product.
-
!python {model: mrp.product.produce}: |
context.update({'active_id': ref('mrp_production_servicetype_mo1')})
-
!record {model: mrp.product.produce, id: mrp_product_produce_1}:
mode: 'consume_produce'
-
!python {model: mrp.product.produce}: |
self.do_produce(cr, uid, [ref('mrp_product_produce_1')], context=context)
-
I check production order after produced.
-
!python {model: mrp.production}: |
order = self.browse(cr, uid, ref("mrp_production_servicetype_mo1"))
assert order.state == 'done', "Production order should be closed."
-
I create Bill of Materials with two service type products.
-
!record {model: mrp.bom, id: mrp_bom_test_2}:
company_id: base.main_company
name: PC Assemble SC234
product_id: product.product_product_3
product_qty: 1.0
type: normal
bom_lines:
- company_id: base.main_company
name: On Site Monitoring
product_id: product.product_product_1
product_qty: 1.0
- company_id: base.main_company
name: On Site Assistance
product_id: product.product_product_2
product_qty: 1.0
-
I make the production order using BoM having two service type products.
-
!record {model: mrp.production, id: mrp_production_servicetype_2}:
product_id: product.product_product_5
product_qty: 1.0
bom_id: mrp_bom_test_2
date_planned: !eval time.strftime('%Y-%m-%d %H:%M:%S')
-
I compute the data of production order.
-
!python {model: mrp.production}: |
self.action_compute(cr, uid, [ref("mrp_production_servicetype_2")], {"lang": "en_US", "tz": False, "search_default_Current": 1,
"active_model": "ir.ui.menu", "active_ids": [ref("mrp.menu_mrp_production_action")],
"active_id": ref("mrp.menu_mrp_production_action"), })
-
I confirm the production order.
-
!workflow {model: mrp.production, action: button_confirm, ref: mrp_production_servicetype_2}
-
Now I start production.
-
!workflow {model: mrp.production, action: button_produce, ref: mrp_production_servicetype_2}
-
I check that production order in production state after start production.
-
!python {model: mrp.production}: |
order = self.browse(cr, uid, ref("mrp_production_servicetype_2"))
assert order.state == 'in_production', 'Production order should be in production State.'
-
I produce product.
-
!python {model: mrp.product.produce}: |
context.update({'active_id': ref('mrp_production_servicetype_2')})
-
!record {model: mrp.product.produce, id: mrp_product_produce_2}:
mode: 'consume_produce'
-
!python {model: mrp.product.produce}: |
self.do_produce(cr, uid, [ref('mrp_product_produce_2')], context=context)
-
I check production order after produced.
-
!python {model: mrp.production}: |
order = self.browse(cr, uid, ref("mrp_production_servicetype_2"))
assert order.state == 'done', "Production order should be closed."

View File

@ -1,7 +1,7 @@
- -
Create a user as 'MRP Manager' Create a user as 'MRP Manager'
- -
!record {model: res.users, id: res_users_mrp_manager}: !record {model: res.users, id: res_users_mrp_manager, view: False}:
company_id: base.main_company company_id: base.main_company
name: MRP Manager name: MRP Manager
login: mam login: mam
@ -17,7 +17,7 @@
- -
Create a user as 'MRP User' Create a user as 'MRP User'
- -
!record {model: res.users, id: res_users_mrp_user}: !record {model: res.users, id: res_users_mrp_user, view: False}:
company_id: base.main_company company_id: base.main_company
name: MRP User name: MRP User
login: mau login: mau

View File

@ -9,7 +9,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//field[@name='workcenter_lines']/form//field[@name='name']" position="before"> <xpath expr="//field[@name='workcenter_lines']/form//field[@name='name']" position="before">
<header colspan="8"> <header colspan="8">
<button name="button_start_working" string="Start" states="draft" icon="terp-gtk-jump-to-ltr" help="Start Working"/> <button name="button_start_working" string="Start" states="draft" icon="gtk-media-play" help="Start Working"/>
<button name="button_cancel" string="Cancel Order" states="draft,startworking" icon="gtk-stop" help="Cancel Order"/> <button name="button_cancel" string="Cancel Order" states="draft,startworking" icon="gtk-stop" help="Cancel Order"/>
<button name="button_draft" string="Set Draft" states="cancel" icon="gtk-convert" help="Set to Draft"/> <button name="button_draft" string="Set Draft" states="cancel" icon="gtk-convert" help="Set to Draft"/>
<button name="button_resume" string="Resume" states="pause" icon="gtk-media-pause" help="Resume Work Order"/> <button name="button_resume" string="Resume" states="pause" icon="gtk-media-pause" help="Resume Work Order"/>
@ -29,7 +29,7 @@
<xpath expr="//field[@name='workcenter_lines']/tree/field[@name='hour']" position="after"> <xpath expr="//field[@name='workcenter_lines']/tree/field[@name='hour']" position="after">
<field name="state"/> <field name="state"/>
<button name="button_draft" string="Set Draft" states="cancel" icon="gtk-convert"/> <button name="button_draft" string="Set Draft" states="cancel" icon="gtk-convert"/>
<button name="button_start_working" string="Start" states="draft" icon="terp-gtk-jump-to-ltr"/> <button name="button_start_working" string="Start" states="draft" icon="gtk-media-play"/>
<button name="button_resume" string="Resume" states="pause" icon="gtk-media-pause"/> <button name="button_resume" string="Resume" states="pause" icon="gtk-media-pause"/>
<button name="button_pause" string="Pending" states="startworking" icon="gtk-media-pause"/> <button name="button_pause" string="Pending" states="startworking" icon="gtk-media-pause"/>
<button name="button_done" string="Finished" states="startworking" icon="terp-check"/> <button name="button_done" string="Finished" states="startworking" icon="terp-check"/>

View File

@ -1,7 +1,7 @@
- -
Create a user as 'MRP User' Create a user as 'MRP User'
- -
!record {model: res.users, id: res_mrp_operation_user}: !record {model: res.users, id: res_mrp_operation_user, view: False}:
company_id: base.main_company company_id: base.main_company
name: MRP User name: MRP User
login: maou login: maou

View File

@ -1,7 +1,7 @@
- -
Create a user as 'MRP Repair Manager' Create a user as 'MRP Repair Manager'
- -
!record {model: res.users, id: res_mrp_repair_manager}: !record {model: res.users, id: res_mrp_repair_manager, view: False}:
company_id: base.main_company company_id: base.main_company
name: MRP Manager name: MRP Manager
login: marm login: marm
@ -16,7 +16,7 @@
- -
Create a user as 'MRP Repair User' Create a user as 'MRP Repair User'
- -
!record {model: res.users, id: res_mrp_repair_user}: !record {model: res.users, id: res_mrp_repair_user, view: False}:
company_id: base.main_company company_id: base.main_company
name: MRP User name: MRP User
login: maru login: maru

View File

@ -377,20 +377,6 @@ namespace OpenERPClient
return version; return version;
} }
public bool check_connectivity()
{
/*
It will check connection on given server url.
:return : True or False.
*/
this.Open(OpenERPClient.OpenERPService.Common);
bool flag = this.rpcclient.check_connectivity();
this.Close();
return flag;
}
} }

View File

@ -47,10 +47,6 @@ namespace OpenERPClient
[XmlRpcMethod("server_version")] [XmlRpcMethod("server_version")]
string ServerVersion(); string ServerVersion();
[XmlRpcMethod("check_connectivity")]
bool check_connectivity();
} }
public interface Ixmlrpcconnect : IOpenERPCommon, IOpenERPDB, IOpenERPObject public interface Ixmlrpcconnect : IOpenERPCommon, IOpenERPDB, IOpenERPObject
{ {
@ -84,11 +80,6 @@ namespace OpenERPClient
{ {
return rpcclient.ServerVersion(); return rpcclient.ServerVersion();
} }
public bool check_connectivity()
{
return rpcclient.check_connectivity();
}
#endregion #endregion

View File

@ -64,6 +64,7 @@
this.chkSSL.TabIndex = 19; this.chkSSL.TabIndex = 19;
this.chkSSL.Text = "SSL (https)"; this.chkSSL.Text = "SSL (https)";
this.chkSSL.UseVisualStyleBackColor = true; this.chkSSL.UseVisualStyleBackColor = true;
this.chkSSL.CheckedChanged += new System.EventHandler(this.chkSSL_CheckedChanged);
// //
// txt_server_port // txt_server_port
// //

View File

@ -20,6 +20,13 @@
using System; using System;
using System.Windows.Forms; using System.Windows.Forms;
using OpenERPClient; using OpenERPClient;
using System.Net;
using System.IO;
using System.Text;
using System.Security;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
namespace OpenERPOutlookPlugin namespace OpenERPOutlookPlugin
{ {
@ -50,6 +57,15 @@ namespace OpenERPOutlookPlugin
} }
} }
public static bool ValidateServerCertificate(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
// Somehow the cert always has PolicyErrors so I am returning true regardless.
return true;
}
private void btn_server_ok_Click(object sender, EventArgs e) private void btn_server_ok_Click(object sender, EventArgs e)
{ {
@ -59,7 +75,10 @@ namespace OpenERPOutlookPlugin
OpenERPConnect openerp_connect = openerp_outlook.Connection; OpenERPConnect openerp_connect = openerp_outlook.Connection;
string url = Tools.JoinURL(this.txt_server_host.Text, this.txt_server_port.Text, this.chkSSL.Checked); string url = Tools.JoinURL(this.txt_server_host.Text, this.txt_server_port.Text, this.chkSSL.Checked);
this.txtServerURL.Text = url; this.txtServerURL.Text = url;
openerp_connect.check_connectivity(); if (this.chkSSL.Checked)
{
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateServerCertificate);
}
this.Close(); this.Close();
} }
catch (Exception ex) catch (Exception ex)
@ -74,6 +93,16 @@ namespace OpenERPOutlookPlugin
this.Close(); this.Close();
} }
private void chkSSL_CheckedChanged(object sender, EventArgs e)
{
if (this.chkSSL.Checked)
{
txt_server_port.Text = "443";
}
else
{
txt_server_port.Text = "8069";
}
}
} }
} }

View File

@ -162,7 +162,7 @@ class pos_details(report_sxw.rml_parse):
for tax in line_taxes['taxes']: for tax in line_taxes['taxes']:
taxes.setdefault(tax['id'], {'name': tax['name'], 'amount':0.0}) taxes.setdefault(tax['id'], {'name': tax['name'], 'amount':0.0})
taxes[tax['id']]['amount'] += tax['amount'] taxes[tax['id']]['amount'] += tax['amount']
return [value for value in taxes.values()] or False return taxes.values()
def _get_user_names(self, user_ids): def _get_user_names(self, user_ids):
user_obj = self.pool.get('res.users') user_obj = self.pool.get('res.users')

View File

@ -143,7 +143,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
var self = this; var self = this;
this._super(); this._super();
this.$el.click(function(){ this.$el.click(function(){
self.order.selectLine(this.model); self.order.selectLine(self.model);
self.trigger('order_line_selected'); self.trigger('order_line_selected');
}); });
if(this.model.is_selected()){ if(this.model.is_selected()){

View File

@ -31,3 +31,9 @@ class portal(osv.osv):
'is_portal': fields.boolean('Portal', help="If checked, this group is usable as a portal."), 'is_portal': fields.boolean('Portal', help="If checked, this group is usable as a portal."),
} }
class res_users(osv.Model):
_inherit = 'res.users'
def _signup_create_user(self, cr, uid, values, context=None):
values['share'] = True
return super(res_users, self)._signup_create_user(cr, uid, values, context=context)

View File

@ -103,4 +103,10 @@
</record> </record>
</data> </data>
<data>
<record id="auth_signup.default_template_user" model="res.users">
<field name="share" eval="True"/>
</record>
</data>
</openerp> </openerp>

View File

@ -18,6 +18,7 @@
Mr Demo Portal</field> Mr Demo Portal</field>
<!-- Avoid auto-including this user in any default group --> <!-- Avoid auto-including this user in any default group -->
<field name="groups_id" eval="[(5,)]"/> <field name="groups_id" eval="[(5,)]"/>
<field name="share" eval="True" />
</record> </record>
<!-- Add the demo user to the portal (and therefore to the portal member group) --> <!-- Add the demo user to the portal (and therefore to the portal member group) -->

View File

@ -92,6 +92,7 @@
<field name="view_mode">form</field> <field name="view_mode">form</field>
<field name="view_id" ref="contact_form_view"/> <field name="view_id" ref="contact_form_view"/>
<field name="target">inline</field> <field name="target">inline</field>
<field name="context">{'default_type': 'lead'}</field>
</record> </record>
<!-- attach it to the portal menu --> <!-- attach it to the portal menu -->

View File

@ -104,6 +104,14 @@ class account_invoice(osv.Model):
pass pass
return action_dict return action_dict
def invoice_validate(self, cr, uid, ids, context=None):
# fetch the partner's id and subscribe the partner to the invoice
for invoice in self.browse(cr, uid, ids, context=context):
partner = invoice.partner_id
if partner.id not in invoice.message_follower_ids:
self.message_subscribe(cr, uid, [invoice.id], [partner.id], context=context)
return super(account_invoice, self).invoice_validate(cr, uid, ids, context=context)
def get_signup_url(self, cr, uid, ids, context=None): def get_signup_url(self, cr, uid, ids, context=None):
assert len(ids) == 1 assert len(ids) == 1
document = self.browse(cr, uid, ids[0], context=context) document = self.browse(cr, uid, ids[0], context=context)

View File

@ -54,7 +54,6 @@ Print product labels with barcode.
'product_data.xml', 'product_data.xml',
'product_report.xml', 'product_report.xml',
'product_view.xml', 'product_view.xml',
'product_shortcut_data.xml',
'pricelist_view.xml', 'pricelist_view.xml',
'partner_view.xml', 'partner_view.xml',
'process/product_process.xml' 'process/product_process.xml'

View File

@ -171,9 +171,7 @@ class product_pricelist(osv.osv):
if context is None: if context is None:
context = {} context = {}
date = time.strftime('%Y-%m-%d') date = context.get('date') or time.strftime('%Y-%m-%d')
if 'date' in context:
date = context['date']
currency_obj = self.pool.get('res.currency') currency_obj = self.pool.get('res.currency')
product_obj = self.pool.get('product.product') product_obj = self.pool.get('product.product')

View File

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record id="ir_ui_view_sc_product0" model="ir.ui.view_sc">
<field name="name">Products</field>
<field name="resource">ir.ui.menu</field>
<field name="user_id" ref="base.user_root"/>
<field name="res_id" ref="product.menu_products"/>
</record>
</data>
</openerp>

View File

@ -93,8 +93,7 @@
</div> </div>
</div> </div>
<div class="oe_right oe_button_box" name="buttons" groups="base.group_user"> <div class="oe_right oe_button_box" name="buttons" groups="base.group_user">
<button name="%(act_project_project_2_project_task_all)d" string="Tasks" <field name="tasks" widget="x2many_counter" string="Tasks" attrs="{'invisible':[('use_tasks','=', False)]}" options='{"views": [[false, "kanban"], [false, "tree"], [false, "form"], [false, "calendar"], [false, "gantt"], [false, "graph"]]}'/>
type="action" attrs="{'invisible':[('use_tasks','=', 0)]}"/>
<button name="attachment_tree_view" string="Documents" type="object"/> <button name="attachment_tree_view" string="Documents" type="object"/>
</div> </div>
<group> <group>
@ -128,7 +127,7 @@
<notebook> <notebook>
<page string="Team" name="team"> <page string="Team" name="team">
<field colspan="4" name="members" widget="many2many_kanban" context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'group_project_user']}"> <field colspan="4" name="members" widget="many2many_kanban" context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'group_project_user']}">
<kanban quick_create="false" create="true"> <kanban quick_create="false" create="true" delete="true">
<field name="name"/> <field name="name"/>
<templates> <templates>
<t t-name="kanban-box"> <t t-name="kanban-box">

View File

@ -1,7 +1,7 @@
- -
Create a user as 'Project manager' Create a user as 'Project manager'
- -
!record {model: res.users, id: res_users_project_issue_manager}: !record {model: res.users, id: res_users_project_issue_manager, view: False}:
company_id: base.main_company company_id: base.main_company
name: Project Manager name: Project Manager
login: prim login: prim
@ -16,7 +16,7 @@
- -
Create a user as 'Project user' Create a user as 'Project user'
- -
!record {model: res.users, id: res_users_project_issue_user}: !record {model: res.users, id: res_users_project_issue_user, view: False}:
company_id: base.main_company company_id: base.main_company
name: Project User name: Project User
login: priu login: priu

View File

@ -46,12 +46,29 @@
Process Transition Process Transition
--> -->
<!-- This "foreign" process node is duplicated here from the corresponding sale_stock node because
`project_mrp` implements a basic procurement system for services without actually using the
full-fledged procurement process from sale_stock, and without the dependency. So it stil
represents a "procurement system".
TODO: To cleanup this invalid foreign external ID, the node should probably be moved to the
`sale` module directly, and removed from both `sale_stock` and `project_mrp`.
-->
<record id="sale_stock.process_node_saleprocurement0" model="process.node">
<field name="menu_id" ref="procurement.menu_stock_procurement_action"/>
<field name="model_id" ref="procurement.model_procurement_order"/>
<field name="kind">subflow</field>
<field name="name">Procurement</field>
<field name="subflow_id" ref="procurement.process_process_procurementprocess0"/>
<field name="process_id" ref="sale.process_process_salesprocess0"/>
<field name="model_states">object.state=='confirmed'</field>
<field name="flow_start" eval="1"/>
</record>
<record id="process_transition_procuretask0" model="process.transition"> <record id="process_transition_procuretask0" model="process.transition">
<field eval="[(6,0,[])]" name="transition_ids"/> <field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Procurement Task&quot;&quot;&quot;" name="name"/> <field eval="&quot;&quot;&quot;Procurement Task&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;if product type is 'service' then it creates the task.&quot;&quot;&quot;" name="note"/> <field eval="&quot;&quot;&quot;if product type is 'service' then it creates the task.&quot;&quot;&quot;" name="note"/>
<field name="target_node_id" ref="process_node_procuretasktask0"/> <field name="target_node_id" ref="process_node_procuretasktask0"/>
<field name="source_node_id" ref="mrp.process_node_productionorder0"/> <field name="source_node_id" ref="sale_stock.process_node_saleprocurement0"/>
</record> </record>
<record id="process_transition_createtask0" model="process.transition"> <record id="process_transition_createtask0" model="process.transition">

View File

@ -125,4 +125,3 @@ class sale_order(osv.osv):
'picked_rate': fields.function(_picked_rate, method=True, string='Picked', type='float'), 'picked_rate': fields.function(_picked_rate, method=True, string='Picked', type='float'),
} }
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,7 +1,7 @@
- -
Create a user 'HR Manager' Create a user 'HR Manager'
- -
!record {model: res.users, id: res_users_hrmanager0}: !record {model: res.users, id: res_users_hrmanager0, view: False}:
company_id: base.main_company company_id: base.main_company
name: HR Manager name: HR Manager
login: hr login: hr

View File

@ -1238,8 +1238,8 @@ class account_invoice(osv.Model):
res = super(account_invoice, self).invoice_validate(cr, uid, ids, context=context) res = super(account_invoice, self).invoice_validate(cr, uid, ids, context=context)
purchase_order_obj = self.pool.get('purchase.order') purchase_order_obj = self.pool.get('purchase.order')
po_ids = purchase_order_obj.search(cr, uid, [('invoice_ids', 'in', ids)], context=context) po_ids = purchase_order_obj.search(cr, uid, [('invoice_ids', 'in', ids)], context=context)
if po_ids: for po_id in po_ids:
purchase_order_obj.message_post(cr, uid, po_ids, body=_("Invoice received"), context=context) purchase_order_obj.message_post(cr, uid, po_id, body=_("Invoice received"), context=context)
return res return res
def confirm_paid(self, cr, uid, ids, context=None): def confirm_paid(self, cr, uid, ids, context=None):

View File

@ -1,7 +1,7 @@
- -
Create a user as 'Purchase manager' Create a user as 'Purchase manager'
- -
!record {model: res.users, id: res_users_purchase_manager}: !record {model: res.users, id: res_users_purchase_manager, view: False}:
company_id: base.main_company company_id: base.main_company
name: Purchase Manager name: Purchase Manager
login: pm login: pm
@ -16,7 +16,7 @@
- -
Create a user as 'Purchase user' Create a user as 'Purchase user'
- -
!record {model: res.users, id: res_users_purchase_user}: !record {model: res.users, id: res_users_purchase_user, view: False}:
company_id: base.main_company company_id: base.main_company
name: Purchase User name: Purchase User
login: pu login: pu

View File

@ -1,7 +1,7 @@
- -
Create a user as 'Purchase Requisition Manager' Create a user as 'Purchase Requisition Manager'
- -
!record {model: res.users, id: res_users_purchase_requisition_manager}: !record {model: res.users, id: res_users_purchase_requisition_manager, view: False}:
company_id: base.main_company company_id: base.main_company
name: Purchase requisition Manager name: Purchase requisition Manager
login: prm login: prm
@ -16,7 +16,7 @@
- -
Create a user as 'Purchase Requisition User' Create a user as 'Purchase Requisition User'
- -
!record {model: res.users, id: res_users_purchase_requisition_user}: !record {model: res.users, id: res_users_purchase_requisition_user, view: False}:
company_id: base.main_company company_id: base.main_company
name: Purchase requisition User name: Purchase requisition User
login: pru login: pru

View File

@ -335,7 +335,7 @@ class WebKitParser(report_sxw):
try : try :
html = body_mako_tpl.render(dict(self.parser_instance.localcontext)) html = body_mako_tpl.render(dict(self.parser_instance.localcontext))
htmls.append(html) htmls.append(html)
except Exception: except Exception, e:
msg = u"%s" % e msg = u"%s" % e
_logger.error(msg) _logger.error(msg)
raise except_osv(_('Webkit render!'), msg) raise except_osv(_('Webkit render!'), msg)

View File

@ -251,7 +251,7 @@
<field name="view_mode">tree,form,calendar</field> <field name="view_mode">tree,form,calendar</field>
<field name="search_view_id" ref="view_resource_calendar_leaves_search"/> <field name="search_view_id" ref="view_resource_calendar_leaves_search"/>
</record> </record>
<menuitem id="menu_resource_config" name="Resource" parent="base.next_id_4" sequence="5"/> <menuitem id="menu_resource_config" name="Resource" parent="base.menu_custom" sequence="30"/>
<menuitem action="resource.action_resource_calendar_leave_tree" id="menu_view_resource_calendar_leaves_search" parent="menu_resource_config" sequence="1"/> <menuitem action="resource.action_resource_calendar_leave_tree" id="menu_view_resource_calendar_leaves_search" parent="menu_resource_config" sequence="1"/>
</data> </data>
</openerp> </openerp>

2132
addons/sale/i18n/hi.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -43,6 +43,7 @@ class sale_order(osv.osv):
if not default: if not default:
default = {} default = {}
default.update({ default.update({
'date_order': fields.date.context_today(self, cr, uid, context=context),
'state': 'draft', 'state': 'draft',
'invoice_ids': [], 'invoice_ids': [],
'date_confirm': False, 'date_confirm': False,

View File

@ -1,7 +1,7 @@
- -
Create a user as 'Salesmanager' Create a user as 'Salesmanager'
- -
!record {model: res.users, id: res_users_salesmanager}: !record {model: res.users, id: res_users_salesmanager, view: False}:
company_id: base.main_company company_id: base.main_company
name: Sales manager name: Sales manager
login: sm login: sm
@ -16,7 +16,7 @@
- -
Create a user as 'Salesman' Create a user as 'Salesman'
- -
!record {model: res.users, id: res_users_salesman}: !record {model: res.users, id: res_users_salesman, view: False}:
company_id: base.main_company company_id: base.main_company
name: Salesman name: Salesman
login: su login: su

View File

@ -19,6 +19,7 @@
# #
############################################################################## ##############################################################################
import calendar
from datetime import date from datetime import date
from dateutil import relativedelta from dateutil import relativedelta
@ -31,7 +32,7 @@ class sale_order(osv.osv):
_columns = { _columns = {
'section_id': fields.many2one('crm.case.section', 'Sales Team'), 'section_id': fields.many2one('crm.case.section', 'Sales Team'),
'categ_ids': fields.many2many('crm.case.categ', 'sale_order_category_rel', 'order_id', 'category_id', 'Categories', \ 'categ_ids': fields.many2many('crm.case.categ', 'sale_order_category_rel', 'order_id', 'category_id', 'Categories', \
domain="['|',('section_id','=',section_id),('section_id','=',False), ('object_id.model', '=', 'crm.lead')]") domain="['|',('section_id','=',section_id),('section_id','=',False), ('object_id.model', '=', 'crm.lead')]", context="{'object_name': 'crm.lead'}")
} }
def _prepare_invoice(self, cr, uid, order, lines, context=None): def _prepare_invoice(self, cr, uid, order, lines, context=None):
@ -48,12 +49,13 @@ class crm_case_section(osv.osv):
obj = self.pool.get('sale.order') obj = self.pool.get('sale.order')
res = dict.fromkeys(ids, False) res = dict.fromkeys(ids, False)
month_begin = date.today().replace(day=1) month_begin = date.today().replace(day=1)
groupby_begin = (month_begin + relativedelta.relativedelta(months=-4)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT) date_begin = (month_begin - relativedelta.relativedelta(months=self._period_number - 1)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT)
date_end = month_begin.replace(day=calendar.monthrange(month_begin.year, month_begin.month)[1]).strftime(tools.DEFAULT_SERVER_DATE_FORMAT)
for id in ids: for id in ids:
res[id] = dict() res[id] = dict()
created_domain = [('section_id', '=', id), ('state', 'in', ['draft', 'sent']), ('date_order', '>=', groupby_begin)] created_domain = [('section_id', '=', id), ('state', 'in', ['draft', 'sent']), ('date_order', '>=', date_begin), ('date_order', '<=', date_end)]
res[id]['monthly_quoted'] = self.__get_bar_values(cr, uid, obj, created_domain, ['amount_total', 'date_order'], 'amount_total', 'date_order', context=context) res[id]['monthly_quoted'] = self.__get_bar_values(cr, uid, obj, created_domain, ['amount_total', 'date_order'], 'amount_total', 'date_order', context=context)
validated_domain = [('section_id', '=', id), ('state', 'not in', ['draft', 'sent']), ('date_confirm', '>=', groupby_begin)] validated_domain = [('section_id', '=', id), ('state', 'not in', ['draft', 'sent']), ('date_confirm', '>=', date_begin), ('date_order', '<=', date_end)]
res[id]['monthly_confirmed'] = self.__get_bar_values(cr, uid, obj, validated_domain, ['amount_total', 'date_confirm'], 'amount_total', 'date_confirm', context=context) res[id]['monthly_confirmed'] = self.__get_bar_values(cr, uid, obj, validated_domain, ['amount_total', 'date_confirm'], 'amount_total', 'date_confirm', context=context)
return res return res
@ -61,9 +63,10 @@ class crm_case_section(osv.osv):
obj = self.pool.get('account.invoice.report') obj = self.pool.get('account.invoice.report')
res = dict.fromkeys(ids, False) res = dict.fromkeys(ids, False)
month_begin = date.today().replace(day=1) month_begin = date.today().replace(day=1)
groupby_begin = (month_begin + relativedelta.relativedelta(months=-4)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT) date_begin = (month_begin - relativedelta.relativedelta(months=self._period_number - 1)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT)
date_end = month_begin.replace(day=calendar.monthrange(month_begin.year, month_begin.month)[1]).strftime(tools.DEFAULT_SERVER_DATE_FORMAT)
for id in ids: for id in ids:
created_domain = [('section_id', '=', id), ('state', 'not in', ['draft', 'cancel']), ('date', '>=', groupby_begin)] created_domain = [('section_id', '=', id), ('state', 'not in', ['draft', 'cancel']), ('date', '>=', date_begin), ('date', '<=', date_end)]
res[id] = self.__get_bar_values(cr, uid, obj, created_domain, ['price_total', 'date'], 'price_total', 'date', context=context) res[id] = self.__get_bar_values(cr, uid, obj, created_domain, ['price_total', 'date'], 'price_total', 'date', context=context)
return res return res

View File

@ -249,8 +249,8 @@
</div> </div>
</xpath> </xpath>
<xpath expr="//div[@class='oe_salesteams_opportunities']" position="after"> <xpath expr="//div[@class='oe_salesteams_opportunities']" position="after">
<div class="oe_salesteams_invoices"> <div class="oe_salesteams_invoices" groups="account.group_account_invoice">
<a name="%(action_invoice_salesteams)d" type="action" groups="account.group_account_invoice">Invoices</a> <a name="%(action_invoice_salesteams)d" type="action">Invoices</a>
<a name="%(account.action_account_invoice_report_all)d" type="action" class="oe_sparkline_bar_link"> <a name="%(account.action_account_invoice_report_all)d" type="action" class="oe_sparkline_bar_link">
<field name="monthly_invoiced" widget="sparkline_bar"> <field name="monthly_invoiced" widget="sparkline_bar">
Revenue of sent invoices per month.<br/>Click to see a detailed analysis of invoices. Revenue of sent invoices per month.<br/>Click to see a detailed analysis of invoices.

View File

@ -69,6 +69,19 @@ class mrp_production(osv.osv):
res[production.id] = move.sale_line_id and move.sale_line_id.order_id.client_order_ref or False res[production.id] = move.sale_line_id and move.sale_line_id.order_id.client_order_ref or False
return res return res
def _hook_create_post_procurement(self, cr, uid, production, procurement_id, context=None):
def get_parent_move(move):
if move.move_dest_id:
return get_parent_move(move.move_dest_id)
return move
res = super(mrp_production, self)._hook_create_post_procurement(cr, uid, production, procurement_id, context)
if production.move_prod_id:
parent_move_line = get_parent_move(production.move_prod_id)
if parent_move_line and parent_move_line.sale_line_id:
self.pool.get('procurement.order').write(cr, uid, procurement_id, {'sale_line_id': parent_move_line.sale_line_id.id})
return res
_columns = { _columns = {
'sale_name': fields.function(_ref_calc, multi='sale_name', type='char', string='Sale Name', help='Indicate the name of sales order.'), 'sale_name': fields.function(_ref_calc, multi='sale_name', type='char', string='Sale Name', help='Indicate the name of sales order.'),
'sale_ref': fields.function(_ref_calc, multi='sale_name', type='char', string='Sale Reference', help='Indicate the Customer Reference from sales order.'), 'sale_ref': fields.function(_ref_calc, multi='sale_name', type='char', string='Sale Reference', help='Indicate the Customer Reference from sales order.'),

View File

@ -1,7 +1,7 @@
- -
Create a user as 'Stock Salesmanager' Create a user as 'Stock Salesmanager'
- -
!record {model: res.users, id: res_sale_stock_salesmanager}: !record {model: res.users, id: res_sale_stock_salesmanager, view: False}:
company_id: base.main_company company_id: base.main_company
name: Stock Sales manager name: Stock Sales manager
login: ssm login: ssm
@ -16,7 +16,7 @@
- -
Create a user as 'Stock Salesman' Create a user as 'Stock Salesman'
- -
!record {model: res.users, id: res_sale_stock_salesman}: !record {model: res.users, id: res_sale_stock_salesman, view: False}:
company_id: base.main_company company_id: base.main_company
name: Stock Salesman name: Stock Salesman
login: ssu login: ssu
@ -31,7 +31,7 @@
- -
Create a user as 'Stock User' Create a user as 'Stock User'
- -
!record {model: res.users, id: res_stock_user}: !record {model: res.users, id: res_stock_user, view: False}:
company_id: base.main_company company_id: base.main_company
name: Stock User name: Stock User
login: sau login: sau
@ -46,7 +46,7 @@
- -
Create a user as 'Stock Manager' Create a user as 'Stock Manager'
- -
!record {model: res.users, id: res_stock_manager}: !record {model: res.users, id: res_stock_manager, view: False}:
company_id: base.main_company company_id: base.main_company
name: Stock Manager name: Stock Manager
login: sam login: sam

View File

@ -151,9 +151,9 @@ class share_wizard(osv.TransientModel):
result = dict.fromkeys(ids, '') result = dict.fromkeys(ids, '')
for this in self.browse(cr, uid, ids, context=context): for this in self.browse(cr, uid, ids, context=context):
if this.result_line_ids: if this.result_line_ids:
ctx = dict(context, share_url_template_hash_arguments=['action_id']) ctx = dict(context, share_url_template_hash_arguments=['action'])
user = this.result_line_ids[0] user = this.result_line_ids[0]
data = dict(dbname=cr.dbname, login=user.login, password=user.password, action_id=this.action_id.id) data = dict(dbname=cr.dbname, login=user.login, password=user.password, action=this.action_id.id)
result[this.id] = this.share_url_template(context=ctx) % data result[this.id] = this.share_url_template(context=ctx) % data
return result return result
@ -289,32 +289,14 @@ class share_wizard(osv.TransientModel):
return created_ids, existing_ids return created_ids, existing_ids
def _create_shortcut(self, cr, uid, values, context=None): def _create_action(self, cr, uid, values, context=None):
if context is None: if context is None:
context = {} context = {}
new_context = context.copy() new_context = context.copy()
for key in context: for key in context:
if key.startswith('default_'): if key.startswith('default_'):
del new_context[key] del new_context[key]
dataobj = self.pool.get('ir.model.data')
menu_id = dataobj._get_id(cr, uid, 'base', 'menu_administration_shortcut')
shortcut_menu_id = int(dataobj.read(cr, uid, menu_id, ['res_id'], new_context)['res_id'])
action_id = self.pool.get('ir.actions.act_window').create(cr, UID_ROOT, values, new_context) action_id = self.pool.get('ir.actions.act_window').create(cr, UID_ROOT, values, new_context)
menu_data = {'name': values['name'],
'sequence': 10,
'action': 'ir.actions.act_window,'+str(action_id),
'parent_id': shortcut_menu_id,
'icon': 'STOCK_JUSTIFY_FILL'}
menu_obj = self.pool.get('ir.ui.menu')
menu_id = menu_obj.create(cr, UID_ROOT, menu_data)
sc_data = {'name': values['name'], 'sequence': UID_ROOT,'res_id': menu_id }
self.pool.get('ir.ui.view_sc').create(cr, uid, sc_data, new_context)
# update menu cache
user_groups = set(self.pool.get('res.users').read(cr, UID_ROOT, uid, ['groups_id'])['groups_id'])
key = (cr.dbname, shortcut_menu_id, tuple(user_groups))
menu_obj._cache[key] = True
return action_id return action_id
def _cleanup_action_context(self, context_str, user_id): def _cleanup_action_context(self, context_str, user_id):
@ -383,7 +365,7 @@ class share_wizard(osv.TransientModel):
values = self._shared_action_def(cr, uid, wizard_data, context=None) values = self._shared_action_def(cr, uid, wizard_data, context=None)
user_obj = self.pool.get('res.users') user_obj = self.pool.get('res.users')
for user_id in user_ids: for user_id in user_ids:
action_id = self._create_shortcut(cr, user_id, values) action_id = self._create_action(cr, user_id, values)
if make_home: if make_home:
# We do this only for new share users, as existing ones already have their initial home # We do this only for new share users, as existing ones already have their initial home
# action. Resetting to the default menu does not work well as the menu is rather empty # action. Resetting to the default menu does not work well as the menu is rather empty

View File

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n" "Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n" "Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n" "POT-Creation-Date: 2012-12-21 17:04+0000\n"
"PO-Revision-Date: 2013-08-06 09:26+0000\n" "PO-Revision-Date: 2013-09-30 10:54+0000\n"
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\n" "Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 05:01+0000\n" "X-Launchpad-Export-Date: 2013-10-01 05:18+0000\n"
"X-Generator: Launchpad (build 16761)\n" "X-Generator: Launchpad (build 16774)\n"
#. module: stock #. module: stock
#: field:stock.inventory.line.split,line_exist_ids:0 #: field:stock.inventory.line.split,line_exist_ids:0
@ -1876,7 +1876,7 @@ msgstr "点击此项从下面列表中选择一个已有的系列号,否则你
#: selection:stock.picking.in,type:0 #: selection:stock.picking.in,type:0
#: selection:stock.picking.out,type:0 #: selection:stock.picking.out,type:0
msgid "Sending Goods" msgid "Sending Goods"
msgstr "货" msgstr "待发货"
#. module: stock #. module: stock
#: model:ir.ui.menu,name:stock.menu_product_category_config_stock #: model:ir.ui.menu,name:stock.menu_product_category_config_stock
@ -4305,7 +4305,7 @@ msgstr "请为产品 \"%s\" (id: %d) 定义一个入库科目。"
#: model:ir.actions.act_window,name:stock.action_reception_picking_move #: model:ir.actions.act_window,name:stock.action_reception_picking_move
#: model:ir.ui.menu,name:stock.menu_action_pdct_in #: model:ir.ui.menu,name:stock.menu_action_pdct_in
msgid "Incoming Products" msgid "Incoming Products"
msgstr "入库产品" msgstr "待收货"
#. module: stock #. module: stock
#: view:product.product:0 #: view:product.product:0

View File

@ -397,7 +397,16 @@ class stock_location(osv.osv):
uom_rounding = self.pool.get('product.product').browse(cr, uid, product_id, context=context).uom_id.rounding uom_rounding = self.pool.get('product.product').browse(cr, uid, product_id, context=context).uom_id.rounding
if context.get('uom'): if context.get('uom'):
uom_rounding = uom_obj.browse(cr, uid, context.get('uom'), context=context).rounding uom_rounding = uom_obj.browse(cr, uid, context.get('uom'), context=context).rounding
for id in self.search(cr, uid, [('location_id', 'child_of', ids)]):
locations_ids = self.search(cr, uid, [('location_id', 'child_of', ids)])
# Fetch only the locations in which this product has ever been processed (in or out)
cr.execute("""SELECT l.id FROM stock_location l WHERE l.id in %s AND
EXISTS (SELECT 1 FROM stock_move m WHERE m.product_id = %s
AND ((state = 'done' AND m.location_dest_id = l.id)
OR (state in ('done','assigned') AND m.location_id = l.id)))
""", (tuple(locations_ids), product_id,))
for id in [i for (i,) in cr.fetchall()]:
if lock: if lock:
try: try:
# Must lock with a separate select query because FOR UPDATE can't be used with # Must lock with a separate select query because FOR UPDATE can't be used with
@ -1910,7 +1919,8 @@ class stock_move(osv.osv):
""" """
if not prod_id: if not prod_id:
return {} return {}
lang = False user = self.pool.get('res.users').browse(cr, uid, uid)
lang = user and user.lang or False
if partner_id: if partner_id:
addr_rec = self.pool.get('res.partner').browse(cr, uid, partner_id) addr_rec = self.pool.get('res.partner').browse(cr, uid, partner_id)
if addr_rec: if addr_rec:

View File

@ -759,7 +759,7 @@
<header> <header>
<button name="draft_force_assign" states="draft" string="Confirm" type="object" class="oe_highlight" groups="base.group_user"/> <button name="draft_force_assign" states="draft" string="Confirm" type="object" class="oe_highlight" groups="base.group_user"/>
<button name="draft_validate" states="draft" string="Confirm &amp; Transfer" type="object" class="oe_highlight" groups="base.group_user"/> <button name="draft_validate" states="draft" string="Confirm &amp; Transfer" type="object" class="oe_highlight" groups="base.group_user"/>
<!-- <button name="action_assign" states="confirmed" string="Check Availability" type="object"/> --> <button name="action_assign" states="confirmed" string="Check Availability" type="object" class="oe_highlight"/>
<button name="force_assign" states="confirmed" string="Force Availability" type="object" class="oe_highlight" groups="base.group_user"/> <button name="force_assign" states="confirmed" string="Force Availability" type="object" class="oe_highlight" groups="base.group_user"/>
<button name="action_process" states="assigned" string="Confirm &amp; Transfer" groups="stock.group_stock_user" type="object" class="oe_highlight"/> <button name="action_process" states="assigned" string="Confirm &amp; Transfer" groups="stock.group_stock_user" type="object" class="oe_highlight"/>
<button name="%(action_stock_invoice_onshipping)d" string="Create Invoice/Refund" attrs="{'invisible': ['|','|',('state','&lt;&gt;','done'),('invoice_state','=','invoiced'),('invoice_state','=','none')]}" context="{'group_field_invisible': True}" type="action" class="oe_highlight" groups="base.group_user"/> <button name="%(action_stock_invoice_onshipping)d" string="Create Invoice/Refund" attrs="{'invisible': ['|','|',('state','&lt;&gt;','done'),('invoice_state','=','invoiced'),('invoice_state','=','none')]}" context="{'group_field_invisible': True}" type="action" class="oe_highlight" groups="base.group_user"/>
@ -909,7 +909,6 @@
</xpath> </xpath>
<xpath expr="/form/header//button[@name='draft_validate']" position="replace"> <xpath expr="/form/header//button[@name='draft_validate']" position="replace">
<button name="draft_validate" states="draft" string="Confirm &amp; Deliver" type="object" class="oe_highlight"/> <button name="draft_validate" states="draft" string="Confirm &amp; Deliver" type="object" class="oe_highlight"/>
<button name="action_assign" states="confirmed" string="Check Availability" type="object" class="oe_highlight"/>
</xpath> </xpath>
<xpath expr="/form/header//button[@name='action_process']" position="replace"> <xpath expr="/form/header//button[@name='action_process']" position="replace">
<button name="action_process" states="assigned" string="Deliver" type="object" class="oe_highlight"/> <button name="action_process" states="assigned" string="Deliver" type="object" class="oe_highlight"/>

View File

@ -1,7 +1,7 @@
- -
Create a user as 'Stock Manager' Create a user as 'Stock Manager'
- -
!record {model: res.users, id: res_users_stock_manager}: !record {model: res.users, id: res_users_stock_manager, view: False}:
company_id: base.main_company company_id: base.main_company
name: Stock Manager name: Stock Manager
login: sam login: sam
@ -16,7 +16,7 @@
- -
Create a user as 'Stock User' Create a user as 'Stock User'
- -
!record {model: res.users, id: res_users_stock_user}: !record {model: res.users, id: res_users_stock_user, view: False}:
company_id: base.main_company company_id: base.main_company
name: Stock User name: Stock User
login: sau login: sau

View File

@ -27,7 +27,7 @@ class change_standard_price(osv.osv_memory):
_name = "stock.change.standard.price" _name = "stock.change.standard.price"
_description = "Change Standard Price" _description = "Change Standard Price"
_columns = { _columns = {
'new_price': fields.float('Price', required=True, digits_compute=dp.get_precision('Account'), 'new_price': fields.float('Price', required=True, digits_compute=dp.get_precision('Product Price'),
help="If cost price is increased, stock variation account will be debited " help="If cost price is increased, stock variation account will be debited "
"and stock output account will be credited with the value = (difference of amount * quantity available).\n" "and stock output account will be credited with the value = (difference of amount * quantity available).\n"
"If cost price is decreased, stock variation account will be creadited and stock input account will be debited."), "If cost price is decreased, stock variation account will be creadited and stock input account will be debited."),

View File

@ -27,6 +27,7 @@ from openerp import tools
from openerp.report import report_sxw from openerp.report import report_sxw
from openerp.report.interface import report_rml from openerp.report.interface import report_rml
from openerp.tools import to_xml from openerp.tools import to_xml
from openerp.tools.translate import _
class survey_browse_response(report_rml): class survey_browse_response(report_rml):
def create(self, cr, uid, ids, datas, context): def create(self, cr, uid, ids, datas, context):
@ -69,7 +70,7 @@ class survey_browse_response(report_rml):
rml +=""" rml +="""
<fill color="gray"/> <fill color="gray"/>
<setFont name="Helvetica" size="10"/> <setFont name="Helvetica" size="10"/>
<drawRightString x='"""+tools.ustr(float(_pageSize[0].replace('cm','')) - float(1.00))+'cm'+"""' y="0.6cm">Page : <pageNumber/> </drawRightString>""" <drawRightString x='"""+tools.ustr(float(_pageSize[0].replace('cm','')) - float(1.00))+'cm'+"""' y="0.6cm">"""+_('Page : ')+"""<pageNumber/> </drawRightString>"""
rml +="""</pageGraphics> rml +="""</pageGraphics>
</pageTemplate> </pageTemplate>
</template> </template>
@ -209,29 +210,29 @@ class survey_browse_response(report_rml):
resp_create = tools.ustr(time.strftime('%d-%m-%Y %I:%M:%S %p', time.strptime(response.date_create.split('.')[0], '%Y-%m-%d %H:%M:%S'))) resp_create = tools.ustr(time.strftime('%d-%m-%Y %I:%M:%S %p', time.strptime(response.date_create.split('.')[0], '%Y-%m-%d %H:%M:%S')))
rml += """<blockTable colWidths='""" + colwidth + """' style="Table_heading"> rml += """<blockTable colWidths='""" + colwidth + """' style="Table_heading">
<tr> <tr>
<td><para style="terp_default_9_Bold">Print Date : </para></td> <td><para style="terp_default_9_Bold">""" + _('Print Date : ') + """</para></td>
<td><para style="terp_default_9">""" + to_xml(rml_obj.formatLang(time.strftime("%Y-%m-%d %H:%M:%S"),date_time=True)) + """</para></td> <td><para style="terp_default_9">""" + to_xml(rml_obj.formatLang(time.strftime("%Y-%m-%d %H:%M:%S"),date_time=True)) + """</para></td>
<td><para style="terp_default_9"></para></td> <td><para style="terp_default_9"></para></td>
<td><para style="terp_default_9_Bold">Answered by : </para></td> <td><para style="terp_default_9_Bold">""" +_('Answered by : ') + """</para></td>
<td><para style="terp_default_9">""" + to_xml(response.user_id.login or '') + """</para></td> <td><para style="terp_default_9">""" + to_xml(response.user_id.login or '') + """</para></td>
</tr> </tr>
<tr> <tr>
<td><para style="terp_default_9"></para></td> <td><para style="terp_default_9"></para></td>
<td><para style="terp_default_9"></para></td> <td><para style="terp_default_9"></para></td>
<td><para style="terp_default_9"></para></td> <td><para style="terp_default_9"></para></td>
<td><para style="terp_default_9_Bold">Answer Date : </para></td> <td><para style="terp_default_9_Bold">""" +_('Answer Date : ') + """</para></td>
<td><para style="terp_default_9">""" + to_xml(resp_create) + """</para></td> <td><para style="terp_default_9">""" + to_xml(resp_create) + """</para></td>
</tr> </tr>
</blockTable><para style="P2"></para>""" </blockTable><para style="P2"></para>"""
status = "Not Finished" status = _("Not Finished")
if response.state == "done": status = "Finished" if response.state == "done": status = _("Finished")
colwidth = str(tbl_width - 7) + "cm," colwidth = str(tbl_width - 7) + "cm,"
colwidth += "7cm" colwidth += "7cm"
rml += """<blockTable colWidths='""" + str(colwidth) + """' style="title_tbl"> rml += """<blockTable colWidths='""" + str(colwidth) + """' style="title_tbl">
<tr> <tr>
<td><para style="title">""" + to_xml(tools.ustr(survey.title)) + """</para><para style="P2"><font></font></para></td> <td><para style="title">""" + to_xml(tools.ustr(survey.title)) + """</para><para style="P2"><font></font></para></td>
<td><para style="descriptive_text_heading">Status :- """ + to_xml(tools.ustr(status)) + """</para><para style="P2"><font></font></para></td> <td><para style="descriptive_text_heading">"""+_('Status :- ')+ to_xml(tools.ustr(status)) + """</para><para style="P2"><font></font></para></td>
</tr> </tr>
</blockTable>""" </blockTable>"""
@ -242,7 +243,7 @@ class survey_browse_response(report_rml):
for page in survey.page_ids: for page in survey.page_ids:
rml += """<blockTable colWidths='""" + str(_tbl_widths) + """' style="page_tbl"> rml += """<blockTable colWidths='""" + str(_tbl_widths) + """' style="page_tbl">
<tr><td><para style="page">Page :- """ + to_xml(tools.ustr(page.title or '')) + """</para></td></tr> <tr><td><para style="page">"""+_('Page :- ') + to_xml(tools.ustr(page.title or '')) + """</para></td></tr>
</blockTable>""" </blockTable>"""
if page.note: if page.note:
rml += """<para style="P2"></para> rml += """<para style="P2"></para>
@ -302,7 +303,7 @@ class survey_browse_response(report_rml):
else: else:
rml +="""<blockTable colWidths='""" + str(_tbl_widths) + """' style="simple_table"> rml +="""<blockTable colWidths='""" + str(_tbl_widths) + """' style="simple_table">
<tr><td> <para style="response">No Answer</para></td> </tr> <tr><td> <para style="response">"""+ _('No Answer') + """</para></td> </tr>
</blockTable>""" </blockTable>"""
elif que.type in ['multiple_choice_only_one_ans','multiple_choice_multiple_ans']: elif que.type in ['multiple_choice_only_one_ans','multiple_choice_multiple_ans']:

View File

@ -173,8 +173,8 @@ class survey_question_wiz(osv.osv_memory):
# TODO: l10n, cleanup this code to make it readable. Or template? # TODO: l10n, cleanup this code to make it readable. Or template?
xml_group = etree.SubElement(xml_form, 'group', {'col': '40', 'colspan': '4'}) xml_group = etree.SubElement(xml_form, 'group', {'col': '40', 'colspan': '4'})
record = sur_response_obj.browse(cr, uid, context['response_id'][context['response_no']]) record = sur_response_obj.browse(cr, uid, context['response_id'][context['response_no']])
etree.SubElement(xml_group, 'label', {'string': to_xml(tools.ustr('Answer Of :- ' + record.user_id.name + ', Date :- ' + record.date_create.split('.')[0] )), 'align':"0.0"}) etree.SubElement(xml_group, 'label', {'string': to_xml(tools.ustr(_('Answer Of :- ') + record.user_id.name + _(', Date :- ') + record.date_create.split('.')[0] )), 'align':"0.0"})
etree.SubElement(xml_group, 'label', {'string': to_xml(tools.ustr(" Answer :- " + str(context.get('response_no',0) + 1) +"/" + str(len(context.get('response_id',0))) )), 'align':"0.0"}) etree.SubElement(xml_group, 'label', {'string': to_xml(tools.ustr(_(" Answer :- ") + str(context.get('response_no',0) + 1) +"/" + str(len(context.get('response_id',0))) )), 'align':"0.0"})
if context.get('response_no',0) > 0: if context.get('response_no',0) > 0:
etree.SubElement(xml_group, 'button', {'colspan':"1",'icon':"gtk-go-back",'name':"action_forward_previous",'string': tools.ustr("Previous Answer"),'type':"object"}) etree.SubElement(xml_group, 'button', {'colspan':"1",'icon':"gtk-go-back",'name':"action_forward_previous",'string': tools.ustr("Previous Answer"),'type':"object"})
if context.get('response_no',0) + 1 < len(context.get('response_id',0)): if context.get('response_no',0) + 1 < len(context.get('response_id',0)):
@ -221,7 +221,7 @@ class survey_question_wiz(osv.osv_memory):
selection.append((tools.ustr(ans.id), ans.answer)) selection.append((tools.ustr(ans.id), ans.answer))
xml_group = etree.SubElement(xml_group, 'group', {'col': '2', 'colspan': '2'}) xml_group = etree.SubElement(xml_group, 'group', {'col': '2', 'colspan': '2'})
etree.SubElement(xml_group, 'field', {'readonly':str(readonly), 'name': tools.ustr(que.id) + "_selection"}) etree.SubElement(xml_group, 'field', {'readonly':str(readonly), 'name': tools.ustr(que.id) + "_selection"})
fields[tools.ustr(que.id) + "_selection"] = {'type':'selection', 'selection' :selection, 'string':"Answer"} fields[tools.ustr(que.id) + "_selection"] = {'type':'selection', 'selection' :selection, 'string':_('Answer')}
elif que_rec.type == 'multiple_choice_multiple_ans': elif que_rec.type == 'multiple_choice_multiple_ans':
xml_group = etree.SubElement(xml_group, 'group', {'col': '4', 'colspan': '4'}) xml_group = etree.SubElement(xml_group, 'group', {'col': '4', 'colspan': '4'})
@ -374,10 +374,10 @@ class survey_question_wiz(osv.osv_memory):
if pre_button: if pre_button:
etree.SubElement(xml_footer, 'label', {'string': ""}) etree.SubElement(xml_footer, 'label', {'string': ""})
etree.SubElement(xml_footer, 'button', {'name':"action_previous",'string':"Previous",'type':"object"}) etree.SubElement(xml_footer, 'button', {'name':"action_previous",'string':_('Previous'),'type':"object"})
but_string = "Next" but_string = _('Next')
if int(page_number) + 1 == total_pages: if int(page_number) + 1 == total_pages:
but_string = "Done" but_string = _('Done')
if context.has_key('active') and context.get('active',False) and int(page_number) + 1 == total_pages and context.has_key('response_id') and context.has_key('response_no') and context.get('response_no',0) + 1 == len(context.get('response_id',0)): if context.has_key('active') and context.get('active',False) and int(page_number) + 1 == total_pages and context.has_key('response_id') and context.has_key('response_no') and context.get('response_no',0) + 1 == len(context.get('response_id',0)):
etree.SubElement(xml_footer, 'label', {'string': ""}) etree.SubElement(xml_footer, 'label', {'string': ""})
etree.SubElement(xml_footer, 'button', {'special' : 'cancel','string': tools.ustr("Done") ,'context' : tools.ustr(context), 'class':"oe_highlight"}) etree.SubElement(xml_footer, 'button', {'special' : 'cancel','string': tools.ustr("Done") ,'context' : tools.ustr(context), 'class':"oe_highlight"})
@ -390,8 +390,8 @@ class survey_question_wiz(osv.osv_memory):
else: else:
etree.SubElement(xml_footer, 'label', {'string': ""}) etree.SubElement(xml_footer, 'label', {'string': ""})
etree.SubElement(xml_footer, 'button', {'name':"action_next",'string': tools.ustr(but_string) ,'type':"object",'context' : tools.ustr(context), 'class':"oe_highlight"}) etree.SubElement(xml_footer, 'button', {'name':"action_next",'string': tools.ustr(but_string) ,'type':"object",'context' : tools.ustr(context), 'class':"oe_highlight"})
etree.SubElement(xml_footer, 'label', {'string': "or"}) etree.SubElement(xml_footer, 'label', {'string': _('or')})
etree.SubElement(xml_footer, 'button', {'special': "cancel",'string':"Exit",'class':"oe_link"}) etree.SubElement(xml_footer, 'button', {'special': "cancel",'string':_('Exit'),'class':"oe_link"})
etree.SubElement(xml_footer, 'label', {'string': tools.ustr(page_number+ 1) + "/" + tools.ustr(total_pages), 'class':"oe_survey_title_page oe_right"}) etree.SubElement(xml_footer, 'label', {'string': tools.ustr(page_number+ 1) + "/" + tools.ustr(total_pages), 'class':"oe_survey_title_page oe_right"})
root = xml_form.getroottree() root = xml_form.getroottree()

View File

@ -1,15 +0,0 @@
OpenERP, Open Source Management Solution
Copyright © 2010-2011 OpenERP SA (<http://openerp.com>).
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public Lice
along with this program. If not, see <http://www.gnu.org/licenses/>.

View File

@ -1,21 +0,0 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2010 OpenERP s.a. (<http://openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,44 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2010-2011 OpenERP s.a. (<http://openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Web Shortcuts',
'version': '1.0',
'category': 'Tools',
'description': """
Enable shortcuts feature in the web client.
===========================================
Add a Shortcut icon in the systray in order to access the user's shortcuts (if any).
Add a Shortcut icon besides the views title in order to add/remove a shortcut.
""",
'author': 'OpenERP SA',
'website': 'http://openerp.com',
'depends': ['base'],
'data': [],
'js' : ['static/src/js/web_shortcuts.js'],
'css' : ['static/src/css/web_shortcuts.css'],
'qweb' : ['static/src/xml/*.xml'],
'installable': True,
'auto_install': False,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,25 +0,0 @@
# Czech translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2013-02-20 13:43+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Czech <cs@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Přidat / Odebrat zkratku..."

View File

@ -1,25 +0,0 @@
# German translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2012-12-04 07:22+0000\n"
"Last-Translator: Ferdinand @ Camptocamp <Unknown>\n"
"Language-Team: German <de@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Hinzufügen/Entfernen Lesezeichen ..."

View File

@ -1,25 +0,0 @@
# English (United Kingdom) translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2013-08-23 16:45+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Add / Remove Shortcut..."

View File

@ -1,25 +0,0 @@
# Spanish translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2012-12-12 12:54+0000\n"
"Last-Translator: Pedro Manuel Baeza <pedro.baeza@gmail.com>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Añadir / Eliminar acceso directo..."

View File

@ -1,25 +0,0 @@
# French translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2012-12-01 08:11+0000\n"
"Last-Translator: WANTELLET Sylvain <Swantellet@tetra-info.com>\n"
"Language-Team: French <fr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Ajouter / supprimer un raccourci..."

View File

@ -1,25 +0,0 @@
# Croatian translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2012-12-10 06:51+0000\n"
"Last-Translator: Goran Kliska <gkliska@gmail.com>\n"
"Language-Team: Croatian <hr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Dodaj / ukloni prečac..."

View File

@ -1,25 +0,0 @@
# Hungarian translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2013-01-04 12:01+0000\n"
"Last-Translator: krnkris <Unknown>\n"
"Language-Team: Hungarian <hu@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Billentyűkombináció hozzáadása/eltávolítása"

View File

@ -1,25 +0,0 @@
# Italian translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2012-11-29 07:33+0000\n"
"Last-Translator: Davide Corio <enlightx@gmail.com>\n"
"Language-Team: Italian <it@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Aggiungi / Rimuovi Scorciatoia..."

View File

@ -1,25 +0,0 @@
# Lithuanian translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2013-04-24 18:29+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Lithuanian <lt@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Pridėti / pašalinti trumpinį..."

View File

@ -1,25 +0,0 @@
# Macedonian translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2013-03-01 14:20+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Macedonian <mk@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Додади / Отстрани кратенка"

View File

@ -1,25 +0,0 @@
# Mongolian translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2013-02-07 11:26+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Mongolian <mn@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Шуут холбоосыг Нэмэх / Устгах ..."

View File

@ -1,25 +0,0 @@
# Dutch translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2012-11-27 19:29+0000\n"
"Last-Translator: Erwin van der Ploeg (BAS Solutions) <Unknown>\n"
"Language-Team: Dutch <nl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Toevoegen/verwijderen snelkoppeling"

View File

@ -1,25 +0,0 @@
# Polish translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2012-12-17 10:08+0000\n"
"Last-Translator: Grzegorz Grzelak (OpenGLOBE.pl) <grzegorz@openglobe.pl>\n"
"Language-Team: Polish <pl@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: 2013-09-12 06:37+0000\n"
"X-Generator: Launchpad (build 16761)\n"
#. module: web_shortcuts
#. openerp-web
#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21
#, python-format
msgid "Add / Remove Shortcut..."
msgstr "Dodaj / Usuń skrót"

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