[MERGE] Merged trunk.

bzr revid: jra@tinyerp.com-20121008072110-hqkawy5jeu8m8r49
bzr revid: jra@tinyerp.com-20121009053950-2d6zka93ly9n50fl
This commit is contained in:
Jiten (OpenERP) 2012-10-09 11:09:50 +05:30
commit 72dc91ec26
47 changed files with 700 additions and 499 deletions

View File

@ -461,10 +461,9 @@ class account_bank_statement(osv.osv):
return {}
balance_start = self._compute_balance_end_real(cr, uid, journal_id, context=context)
journal_data = self.pool.get('account.journal').read(cr, uid, journal_id, ['default_debit_account_id', 'company_id'], context=context)
account_id = journal_data['default_debit_account_id']
journal_data = self.pool.get('account.journal').read(cr, uid, journal_id, ['company_id'], context=context)
company_id = journal_data['company_id']
return {'value': {'balance_start': balance_start, 'account_id': account_id, 'company_id': company_id}}
return {'value': {'balance_start': balance_start, 'company_id': company_id}}
def unlink(self, cr, uid, ids, context=None):
stat = self.read(cr, uid, ids, ['state'], context=context)

View File

@ -1360,6 +1360,7 @@ class account_invoice_line(osv.osv):
_columns = {
'name': fields.text('Description', required=True),
'origin': fields.char('Source', size=256, help="Reference of the document that produced this invoice."),
'sequence': fields.integer('Sequence', help="Gives the sequence of this line when displaying the invoice."),
'invoice_id': fields.many2one('account.invoice', 'Invoice Reference', ondelete='cascade', select=True),
'uos_id': fields.many2one('product.uom', 'Unit of Measure', ondelete='set null'),
'product_id': fields.many2one('product.product', 'Product', ondelete='set null'),

View File

@ -21,7 +21,7 @@
-
I create a supplier invoice
-
!record {model: account.invoice, id: account_invoice_supplier0}:
!record {model: account.invoice, id: account_invoice_supplier0, view: invoice_supplier_form}:
account_id: account.a_pay
check_total: 3000.0
company_id: base.main_company

View File

@ -6,7 +6,12 @@
<field name="model">account.invoice.confirm</field>
<field name="arch" type="xml">
<form string="Confirm Draft Invoices" version="7.0">
<separator string="Confirm Draft Invoices"/>
<p class="oe_grey">
Once draft invoices are confirmed, you will not be able
to modify them. The invoices will receive a unique
number and journal items will be created in your chart
of accounts.
</p>
<footer>
<button string="Confirm Invoices" name="invoice_confirm" type="object" default_focus="1" class="oe_highlight"/>
or
@ -27,7 +32,6 @@
<field name="model">account.invoice.cancel</field>
<field name="arch" type="xml">
<form string="Cancel Selected Invoices" version="7.0">
<separator string="Cancel Selected Invoices"/>
<footer>
<button string="Cancel Invoices" name="invoice_cancel" type="object" default_focus="1" class="oe_highlight"/>
or

View File

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
"PO-Revision-Date: 2009-02-03 06:24+0000\n"
"Last-Translator: <>\n"
"PO-Revision-Date: 2012-10-08 15:59+0000\n"
"Last-Translator: waleed bazaza <waleed_bazaza@yahoo.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-08-28 06:07+0000\n"
"X-Generator: Launchpad (build 15864)\n"
"X-Launchpad-Export-Date: 2012-10-09 04:51+0000\n"
"X-Generator: Launchpad (build 16112)\n"
#. module: account_followup
#: view:account_followup.followup:0
@ -42,7 +42,7 @@ msgstr "متابعة"
#: help:account.followup.print.all,test_print:0
msgid ""
"Check if you want to print followups without changing followups level."
msgstr ""
msgstr "اختر هذه الخانة إذا أردت طباعة المتابعات بدون تغيير متوى المتابعات."
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line2
@ -101,7 +101,7 @@ msgstr "الدليل"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Follow up Entries with period in current year"
msgstr ""
msgstr "مدخلات المتابعات بفترات في السنة الحالية"
#. module: account_followup
#: view:account.followup.print.all:0
@ -314,6 +314,9 @@ msgid ""
"\n"
"%s"
msgstr ""
"جميع رسائل البريد الالكتروني قد أرسلت بنجاح للشركاء:.\n"
"\n"
"%s"
#. module: account_followup
#: constraint:account_followup.followup.line:0
@ -362,6 +365,11 @@ msgid ""
"\n"
"%s"
msgstr ""
"\n"
"\n"
"رسالة البريد الالكتروني قد أرسلت للشركاء التاليين.!\n"
"\n"
"%s"
#. module: account_followup
#: help:account.followup.print,date:0
@ -503,7 +511,7 @@ msgstr "تقرير المتابعة"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "Follow-Up Steps"
msgstr ""
msgstr "خطوات المتابعة"
#. module: account_followup
#: field:account_followup.stat,period_id:0
@ -514,7 +522,7 @@ msgstr "فترة"
#: code:addons/account_followup/wizard/account_followup_print.py:307
#, python-format
msgid "Followup Summary"
msgstr ""
msgstr "خلاصة المتابعة"
#. module: account_followup
#: view:account.followup.print:0
@ -535,7 +543,7 @@ msgstr "مستوى اعلى متابعة"
#. module: account_followup
#: model:ir.actions.act_window,name:account_followup.action_view_account_followup_followup_form
msgid "Review Invoicing Follow-Ups"
msgstr ""
msgstr "استعراض متابعة الفوترة"
#. module: account_followup
#: constraint:account.move.line:0
@ -595,7 +603,7 @@ msgstr "الوصف"
#. module: account_followup
#: constraint:account_followup.followup:0
msgid "Only One Followup by Company."
msgstr ""
msgstr "متابعة واحدة غقط من الشركة."
#. module: account_followup
#: view:account_followup.stat:0

View File

@ -86,24 +86,24 @@ class account_payment_populate_statement(osv.osv_memory):
'name': line.name,
'partner_id': line.partner_id.id,
'journal_id': statement.journal_id.id,
'account_id': result.get('account_id', statement.journal_id.default_credit_account_id.id),
'account_id': result['value'].get('account_id', statement.journal_id.default_credit_account_id.id),
'company_id': statement.company_id.id,
'currency_id': statement.currency.id,
'date': line.date or time.strftime('%Y-%m-%d'),
'amount': abs(amount),
'period_id': statement.period_id.id
'period_id': statement.period_id.id,
}
voucher_id = voucher_obj.create(cr, uid, voucher_res, context=context)
voucher_line_dict = False
if result['value']['line_ids']:
for line_dict in result['value']['line_ids']:
move_line = move_line_obj.browse(cr, uid, line_dict['move_line_id'], context)
if line.move_line_id.move_id.id == move_line.move_id.id:
voucher_line_dict = line_dict
voucher_line_dict = {}
for line_dict in result['value']['line_cr_ids'] + result['value']['line_dr_ids']:
move_line = move_line_obj.browse(cr, uid, line_dict['move_line_id'], context)
if line.move_line_id.move_id.id == move_line.move_id.id:
voucher_line_dict = line_dict
if voucher_line_dict:
voucher_line_dict.update({'voucher_id': voucher_id})
voucher_line_obj.create(cr, uid, voucher_line_dict, context=context)
st_line_id = statement_line_obj.create(cr, uid, {
'name': line.order_id.reference or '?',
'amount': - amount,

View File

@ -547,6 +547,19 @@ class account_voucher(osv.osv):
vals = self.recompute_payment_rate(cr, uid, ids, res, currency_id, date, ttype, journal_id, amount, context=context)
for key in vals.keys():
res[key].update(vals[key])
#TODO: onchange_partner_id() should not returns [pre_line, line_dr_ids, payment_rate...] for type sale, and not
# [pre_line, line_cr_ids, payment_rate...] for type purchase.
# We should definitively split account.voucher object in two and make distinct on_change functions. In the
# meanwhile, bellow lines must be there because the fields aren't present in the view, what crashes if the
# onchange returns a value for them
if ttype == 'sale':
del(res['value']['line_dr_ids'])
del(res['value']['pre_line'])
del(res['value']['payment_rate'])
elif ttype == 'purchase':
del(res['value']['line_cr_ids'])
del(res['value']['pre_line'])
del(res['value']['payment_rate'])
return res
def recompute_voucher_lines(self, cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=None):
@ -588,7 +601,7 @@ class account_voucher(osv.osv):
#set default values
default = {
'value': {'line_ids': [] ,'line_dr_ids': [] ,'line_cr_ids': [] ,'pre_line': False,},
'value': {'line_dr_ids': [] ,'line_cr_ids': [] ,'pre_line': False,},
}
#drop existing lines
@ -667,6 +680,7 @@ class account_voucher(osv.osv):
#voucher line creation
for line in account_move_lines:
if _remove_noise_in_o2m():
continue
@ -771,8 +785,10 @@ class account_voucher(osv.osv):
if account_id and account_id.tax_ids:
tax_id = account_id.tax_ids[0].id
vals = self.onchange_price(cr, uid, ids, line_ids, tax_id, partner_id, context)
vals['value'].update({'tax_id':tax_id,'amount': amount})
vals = {'value':{} }
if ttype in ('sale', 'purchase'):
vals = self.onchange_price(cr, uid, ids, line_ids, tax_id, partner_id, context)
vals['value'].update({'tax_id':tax_id,'amount': amount})
currency_id = False
if journal.currency:
currency_id = journal.currency.id
@ -1183,6 +1199,7 @@ class account_voucher(osv.osv):
account_id = voucher_brw.partner_id.property_account_receivable.id
else:
account_id = voucher_brw.partner_id.property_account_payable.id
sign = voucher_brw.type == 'payment' and -1 or 1
move_line = {
'name': write_off_name or name,
'account_id': account_id,
@ -1191,7 +1208,7 @@ class account_voucher(osv.osv):
'date': voucher_brw.date,
'credit': diff > 0 and diff or 0.0,
'debit': diff < 0 and -diff or 0.0,
'amount_currency': company_currency <> current_currency and voucher_brw.writeoff_amount or False,
'amount_currency': company_currency <> current_currency and (sign * -1 * voucher_brw.writeoff_amount) or False,
'currency_id': company_currency <> current_currency and current_currency or False,
'analytic_account_id': voucher_brw.analytic_id and voucher_brw.analytic_id.id or False,
}

View File

@ -34,6 +34,7 @@
</field>
</record>
<!-- where and when is this view used?? -->
<record model="ir.ui.view" id="view_voucher_form">
<field name="name">account.voucher.form</field>
<field name="model">account.voucher</field>

View File

@ -1,7 +1,8 @@
-
In order to check account voucher module in OpenERP I create a customer voucher
-
!record {model: account.voucher, id: account_voucher_voucherforaxelor0}:
!record {model: account.voucher, id: account_voucher_voucherforaxelor0, view: view_sale_receipt_form}:
type: sale
account_id: account.cash
amount: 1000.0
company_id: base.main_company
@ -47,7 +48,8 @@
-
Now I create a Vendor Voucher
-
!record {model: account.voucher, id: account_voucher_voucheraxelor0, view: False}:
!record {model: account.voucher, id: account_voucher_voucheraxelor0, view: view_voucher_filter_vendor}:
type: purchase
account_id: account.cash
amount: 1000.0
company_id: base.main_company

View File

@ -1,7 +1,8 @@
-
Demo for Account Voucher
-
!record {model: account.voucher, id: account_voucher_voucheraxelor0again}:
!record {model: account.voucher, id: account_voucher_voucheraxelor0again, view: view_sale_receipt_form}:
type: sale
account_id: account.cash
company_id: base.main_company
journal_id: account.bank_journal

View File

@ -216,6 +216,10 @@
assert move_line.credit == 63.00, "Debtor account has wrong entry."
elif move_line.amount_currency == 10.00:
assert move_line.debit == 9.00, "Writeoff amount is wrong."
elif move_line.amount_currency == 240.00:
assert move_line.debit == 216.00, "Bank entry is wrong."
else:
assert False, "Unrecognized journal entry"
-
I check the residual amount of Invoice1, should be 20 in amount_currency
-
@ -237,7 +241,7 @@
-
On the first April, I create the second voucher of payment with values 45 USD, journal USD,
-
!record {model: account.voucher, id: account_voucher_2_case1}:
!record {model: account.voucher, id: account_voucher_2_case1, view: view_vendor_receipt_form}:
account_id: account.cash
amount: 45.0
company_id: base.main_company
@ -323,8 +327,16 @@
assert move_line.debit == 4.75, "Writeoff amount is wrong."
elif move_line.debit == 11.5 and move_line.account_id.reconcile:
assert move_line.amount_currency == 0.0 and move_line.reconcile_id.id == reconcile_a, "Exchange difference entry for the invoice of 100$ is wrong"
elif move_line.credit == 11.5:
assert move_line.amount_currency == 0.0
elif move_line.debit == 31.0 and move_line.account_id.reconcile:
assert move_line.amount_currency == 0.0 and move_line.reconcile_id.id == reconcile_b, "Exchange difference entry for the invoice of 200$ is wrong"
elif move_line.credit == 31.0:
assert move_line.amount_currency == 0.0
elif move_line.amount_currency == 45.00:
assert move_line.debit == 42.75, "Bank entry is wrong."
else:
assert False, "Unrecognized journal entry"
-
I check the residual amount of Invoice1, should be 0 in residual currency and 0 in amount_residual and paid
-

View File

@ -164,7 +164,7 @@
-
I check that my currency rate difference is correct. 0 in debit with no amount_currency
-
I check that my writeoff is correct. 11.05 credit and 13.26 amount_currency
I check that my writeoff is correct. 11.05 credit and -13.26 amount_currency
-
!python {model: account.voucher}: |
voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 4'), ('partner_id', '=', ref('base.res_partner_19'))])
@ -179,7 +179,7 @@
elif move_line.debit == 0.00 and move_line.credit == 0.00:
assert move_line.amount_currency == 0.00, "Incorrect Currency Difference."
elif move_line.credit == 10.61:
assert move_line.amount_currency == 13.26, "Writeoff amount is wrong."
assert move_line.amount_currency == -13.26, "Writeoff amount is wrong."
else:
assert False, "Wrong entry"
-

View File

@ -1,7 +1,7 @@
-
Creating a Voucher Receipt for partner Seagate with amount 30000.0
-
!record {model: account.voucher, id: account_voucher_seagate_0}:
!record {model: account.voucher, id: account_voucher_seagate_0, view: view_sale_receipt_form}:
account_id: account.a_recv
amount: 30000.0
company_id: base.main_company

View File

@ -72,6 +72,7 @@
<h1><label for="number" string="Sale Receipt"/> <field name="number" class="oe_inline" readonly="1"/></h1>
<group>
<group>
<field name="type" invisible="True"/>
<field name="partner_id" domain="[('customer','=',True)]" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date, context)" string="Customer" context="{'search_default_customer':1, 'show_address': 1}" options='{"always_reload": true}'/>
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
</group>
@ -80,9 +81,9 @@
<field name="date" on_change="onchange_date(date, currency_id, currency_id, amount, company_id, context)"/>
<field name="name"/>
<field name="paid" invisible="1"/>
<field name="paid_amount_in_company_currency" invisible="1"/>
<field name="currency_id" invisible="1"/>
</group>
<field name="type" invisible="True"/>
</group>
<notebook>
<page string="Sales Information">
@ -235,6 +236,7 @@
widget="selection"
on_change="onchange_journal(journal_id, line_dr_ids, tax_id, partner_id, date, amount, type, company_id, context)"
groups="account.group_account_user"/>
<field name="paid_amount_in_company_currency" invisible="1"/>
</group>
</group>
<notebook>

View File

@ -125,7 +125,8 @@ class account_analytic_account(osv.osv):
if account.company_id:
if account.company_id.currency_id.id != value:
raise osv.except_osv(_('Error!'), _("If you set a company, the currency selected has to be the same as it's currency. \nYou can remove the company belonging, and thus change the currency, only on analytic account of type 'view'. This can be really usefull for consolidation purposes of several companies charts with different currencies, for example."))
return cr.execute("""update account_analytic_account set currency_id=%s where id=%s""", (value, account.id, ))
if value:
return cr.execute("""update account_analytic_account set currency_id=%s where id=%s""", (value, account.id, ))
def _currency(self, cr, uid, ids, field_name, arg, context=None):
result = {}
@ -163,7 +164,7 @@ class account_analytic_account(osv.osv):
'date': fields.date('Date End', select=True),
'company_id': fields.many2one('res.company', 'Company', required=False), #not required because we want to allow different companies to use the same chart of account, except for leaf accounts.
'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'), ('cancelled', 'Cancelled'),('pending','To Renew'),('close','Closed')], 'Status', required=True,),
'currency_id': fields.function(_currency, fnct_inv=_set_company_currency,
'currency_id': fields.function(_currency, fnct_inv=_set_company_currency, #the currency_id field is readonly except if it's a view account and if there is no company
store = {
'res.company': (_get_analytic_account, ['currency_id'], 10),
}, string='Currency', type='many2one', relation='res.currency'),

View File

@ -24,6 +24,7 @@
<field name="partner_id" on_change="on_change_partner_id(partner_id, name)" attrs="{'required':[('type','=','contract')]}"/>
<field name="manager_id"/>
<field name="code"/>
<field name="currency_id" attrs="{'invisible': ['|',('type', '&lt;&gt;', 'view'), ('company_id', '&lt;&gt;', False)]}"/>
</group>
<group>
<field name="type"/>

View File

@ -39,11 +39,11 @@ months = {
def get_recurrent_dates(rrulestring, exdate, startdate=None, exrule=None):
"""
Get recurrent dates based on Rule string considering exdate and start date
@param rrulestring: Rulestring
@param exdate: List of exception dates for rrule
@param startdate: Startdate for computing recurrent dates
@return: List of Recurrent dates
Get recurrent dates based on Rule string considering exdate and start date.
@param rrulestring: rulestring
@param exdate: list of exception dates for rrule
@param startdate: startdate for computing recurrent dates
@return: list of Recurrent dates
"""
def todate(date):
val = parser.parse(''.join((re.compile('\d')).findall(date)))
@ -67,11 +67,12 @@ def get_recurrent_dates(rrulestring, exdate, startdate=None, exrule=None):
def base_calendar_id2real_id(base_calendar_id=None, with_date=False):
"""
This function converts virtual event id into real id of actual event
@param base_calendar_id: Id of calendar
@param with_date: If value passed to this param it will return dates based on value of withdate + base_calendar_id
Convert a "virtual/recurring event id" (type string) into a real event id (type int).
E.g. virtual/recurring event id is 4-20091201100000, so it will return 4.
@param base_calendar_id: id of calendar
@param with_date: if a value is passed to this param it will return dates based on value of withdate + base_calendar_id
@return: real event id
"""
if base_calendar_id and isinstance(base_calendar_id, (str, unicode)):
res = base_calendar_id.split('-')
@ -89,12 +90,13 @@ def base_calendar_id2real_id(base_calendar_id=None, with_date=False):
def real_id2base_calendar_id(real_id, recurrent_date):
"""
Convert real id of record into virtual id using recurrent_date
e.g. real id is 1 and recurrent_date is 01-12-2009 10:00:00 then it will return
1-20091201100000
@return: real id with recurrent date.
Convert a real event id (type int) into a "virtual/recurring event id" (type string).
E.g. real event id is 1 and recurrent_date is set to 01-12-2009 10:00:00, so
it will return 1-20091201100000.
@param real_id: real event id
@param recurrent_date: real event recurrent date
@return: string containing the real id and the recurrent date
"""
if real_id and recurrent_date:
recurrent_date = time.strftime("%Y%m%d%H%M%S", \
time.strptime(recurrent_date, "%Y-%m-%d %H:%M:%S"))
@ -104,10 +106,10 @@ def real_id2base_calendar_id(real_id, recurrent_date):
def _links_get(self, cr, uid, context=None):
"""
Get request link.
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
@return: list of dictionary which contain object and name and id.
@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, [])
@ -216,9 +218,9 @@ class calendar_attendee(osv.osv):
def _get_address(self, name=None, email=None):
"""
Gives email information in ical CAL-ADDRESS type format
@param name: Name for CAL-ADDRESS value
@param email: Email address for CAL-ADDRESS value
Gives email information in ical CAL-ADDRESS type format.
@param name: name for CAL-ADDRESS value
@param email: email address for CAL-ADDRESS value
"""
if name and email:
name += ':'
@ -226,13 +228,13 @@ class calendar_attendee(osv.osv):
def _compute_data(self, cr, uid, ids, name, arg, context=None):
"""
Compute data on function fields for attendee values .
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of calendar attendees IDs.
@param name: name of field.
@param context: A standard dictionary for contextual values
@return: Dictionary of form {id: {'field Name': value'}}.
Compute data on function fields for attendee values.
@param cr: the current row, from the database cursor
@param uid: the current user's ID for security checks
@param ids: list of calendar attendee's IDs
@param name: name of field
@param context: a standard dictionary for contextual values
@return: dictionary of form {id: {'field Name': value'}}
"""
name = name[0]
result = {}
@ -297,10 +299,10 @@ class calendar_attendee(osv.osv):
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 users ID for security checks,
@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.
@return: list of dictionary which contain object and name and id
"""
obj = self.pool.get('res.request.link')
ids = obj.search(cr, uid, [])
@ -310,10 +312,10 @@ class calendar_attendee(osv.osv):
def _lang_get(self, cr, uid, context=None):
"""
Get language for language selection field.
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
@return: list of dictionary which contain code and name and id.
@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 code and name and id
"""
obj = self.pool.get('res.lang')
ids = obj.search(cr, uid, [])
@ -375,7 +377,6 @@ property or property parameter."),
'ref': fields.reference('Event Ref', selection=_links_get, size=128),
'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"),
}
_defaults = {
'state': 'needs-action',
'role': 'req-participant',
@ -388,12 +389,12 @@ property or property parameter."),
def get_ics_file(self, cr, uid, event_obj, context=None):
"""
Returns iCalendar file for the event invitation
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param event_obj: Event object (browse record)
@param context: A standard dictionary for contextual values
Returns iCalendar file for the event invitation.
@param self: the object pointer
@param cr: the current row, from the database cursor
@param uid: the current user's id for security checks
@param event_obj: event object (browse record)
@param context: a standard dictionary for contextual values
@return: .ics file content
"""
res = None
@ -471,7 +472,7 @@ property or property parameter."),
def _send_mail(self, cr, uid, ids, mail_to, email_from=tools.config.get('email_from', False), context=None):
"""
Send mail for event invitation to event attendees.
@param email_from: Email address for user sending the mail
@param email_from: email address for user sending the mail
@return: True
"""
company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.name
@ -517,11 +518,11 @@ property or property parameter."),
def onchange_user_id(self, cr, uid, ids, user_id, *args, **argv):
"""
Make entry on email and availbility on change of user_id field.
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of calendar attendees IDs.
@param user_id: Changed value of User id
@return: dictionary of value. which put value in email and availability fields.
@param cr: the current row, from the database cursor
@param uid: the current user's ID for security checks
@param ids: list of calendar attendee's IDs
@param user_id: changed value of User id
@return: dictionary of values which put value in email and availability fields
"""
if not user_id:
@ -531,24 +532,25 @@ property or property parameter."),
return {'value': {'email': user.email, 'availability':user.availability}}
def do_tentative(self, cr, uid, ids, context=None, *args):
""" Makes event invitation as Tentative
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of calendar attendees IDs
@param *args: Get Tupple value
@param context: A standard dictionary for contextual values
"""
Makes event invitation as Tentative.
@param self: the object pointer
@param cr: the current row, from the database cursor
@param uid: the current user's ID for security checks
@param ids: list of calendar attendee's IDs
@param *args: get Tupple value
@param context: a standard dictionary for contextual values
"""
return self.write(cr, uid, ids, {'state': 'tentative'}, context)
def do_accept(self, cr, uid, ids, context=None, *args):
"""
Update state of invitation as Accepted and
if the invited user is other then event user it will make a copy of this event for invited user
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of calendar attendees IDs.
@param context: A standard dictionary for contextual values
Update state of invitation as Accepted and if the invited user is other
then event user it will make a copy of this event for invited user.
@param cr: the current row, from the database cursor
@param uid: the current user's ID for security checks
@param ids: list of calendar attendee's IDs
@param context: a standard dictionary for contextual values
@return: True
"""
if context is None:
@ -564,25 +566,28 @@ property or property parameter."),
return True
def do_decline(self, cr, uid, ids, context=None, *args):
""" Marks event invitation as Declined
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of calendar attendees IDs
@param *args: Get Tupple value
@param context: A standard dictionary for contextual values """
"""
Marks event invitation as Declined.
@param self: the object pointer
@param cr: the current row, from the database cursor
@param uid: the current user's ID for security checks
@param ids: list of calendar attendee's IDs
@param *args: get Tupple value
@param context: a standard dictionary for contextual values
"""
if context is None:
context = {}
return self.write(cr, uid, ids, {'state': 'declined'}, context)
def create(self, cr, uid, vals, context=None):
""" Overrides orm create method.
"""
Overrides orm create method.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param vals: Get Values
@param context: A standard dictionary for contextual values """
@param cr: the current row, from the database cursor
@param uid: the current user's ID for security checks
@param vals: get Values
@param context: a standard dictionary for contextual values
"""
if context is None:
context = {}
if not vals.get("email") and vals.get("cn"):
@ -592,6 +597,7 @@ property or property parameter."),
vals['cn'] = vals.get("cn")
res = super(calendar_attendee, self).create(cr, uid, vals, context)
return res
calendar_attendee()
class res_alarm(osv.osv):
@ -630,8 +636,8 @@ true, it will allow you to hide the event alarm information without removing it.
"""
Create Alarm for event.
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of res alarms IDs.
@param uid: the current user's ID for security checks,
@param ids: List of res alarm's IDs.
@param model: Model name.
@param date: Event date
@param context: A standard dictionary for contextual values
@ -704,8 +710,8 @@ true, it will allow you to hide the event alarm information without removing it.
"""
Delete alarm specified in ids
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of res alarms IDs.
@param uid: the current user's ID for security checks,
@param ids: List of res alarm's IDs.
@param model: Model name for which alarm is to be cleared.
@return: True
"""
@ -715,12 +721,12 @@ true, it will allow you to hide the event alarm information without removing it.
ir_obj = self.pool.get('ir.model')
model_id = ir_obj.search(cr, uid, [('model', '=', model)])[0]
model_obj = self.pool.get(model)
for datas in model_obj.browse(cr, uid, ids, context=context):
alarm_ids = alarm_obj.search(cr, uid, [('model_id', '=', model_id), ('res_id', '=', datas.id)])
for data in model_obj.browse(cr, uid, ids, context=context):
alarm_ids = alarm_obj.search(cr, uid, [('model_id', '=', model_id), ('res_id', '=', data.id)])
if alarm_ids:
alarm_obj.unlink(cr, uid, alarm_ids)
cr.execute('Update %s set base_calendar_alarm_id=NULL, alarm_id=NULL\
where id=%%s' % model_obj._table,(datas.id,))
where id=%%s' % model_obj._table,(data.id,))
return True
res_alarm()
@ -773,7 +779,7 @@ class calendar_alarm(osv.osv):
Overrides orm create method.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param vals: dictionary of fields value.{name_of_the_field: value, ...}
@param vals: dictionary of fields value.{'name_of_the_field': value, ...}
@param context: A standard dictionary for contextual values
@return: new record id for calendar_alarm.
"""
@ -798,8 +804,8 @@ class calendar_alarm(osv.osv):
"""Scheduler for event reminder
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of calendar alarms IDs.
@param uid: the current user's ID for security checks,
@param ids: List of calendar alarm's IDs.
@param use_new_cursor: False or the dbname
@param context: A standard dictionary for contextual values
"""
@ -891,8 +897,8 @@ class calendar_event(osv.osv):
"""Returns duration and/or end date based on values passed
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of calendar events IDs.
@param uid: the current user's ID for security checks,
@param ids: List of calendar event's IDs.
@param start_date: Starting date
@param duration: Duration between start date and end date
@param end_date: Ending Datee
@ -967,14 +973,14 @@ class calendar_event(osv.osv):
if not isinstance(ids, list):
ids = [ids]
for datas in self.read(cr, uid, ids, ['id','byday','recurrency', 'month_list','end_date', 'rrule_type', 'select1', 'interval', 'count', 'end_type', 'mo', 'tu', 'we', 'th', 'fr', 'sa', 'su', 'exrule', 'day', 'week_list' ], context=context):
event = datas['id']
if datas.get('interval', 0) < 0:
for data in self.read(cr, uid, ids, ['id','byday','recurrency', 'month_list','end_date', 'rrule_type', 'select1', 'interval', 'count', 'end_type', 'mo', 'tu', 'we', 'th', 'fr', 'sa', 'su', 'exrule', 'day', 'week_list' ], context=context):
event = data['id']
if data.get('interval', 0) < 0:
raise osv.except_osv(_('Warning!'), _('Interval cannot be negative.'))
if datas.get('count', 0) <= 0:
if data.get('count', 0) <= 0:
raise osv.except_osv(_('Warning!'), _('Count cannot be negative or 0.'))
if datas['recurrency']:
result[event] = self.compute_rule_string(datas)
if data['recurrency']:
result[event] = self.compute_rule_string(data)
else:
result[event] = ""
return result
@ -990,7 +996,6 @@ class calendar_event(osv.osv):
super(calendar_event, obj).write(cr, uid, ids, data, context=context)
return True
_columns = {
'id': fields.integer('ID', readonly=True),
'sequence': fields.integer('Sequence'),
@ -1006,21 +1011,24 @@ class calendar_event(osv.osv):
'show_as': fields.selection([('free', 'Free'), ('busy', 'Busy')], \
'Show Time as', states={'done': [('readonly', True)]}),
'base_calendar_url': fields.char('Caldav URL', size=264),
'state': fields.selection([('tentative', 'Tentative'),
('cancelled', 'Cancelled'),
('confirmed', 'Confirmed'),
], 'Status', readonly=True),
'state': fields.selection([
('tentative', 'Tentative'),
('cancelled', 'Cancelled'),
('confirmed', 'Confirmed'),
], 'Status', readonly=True),
'exdate': fields.text('Exception Date/Times', help="This property \
defines the list of date/time exceptions for a recurring calendar component."),
'exrule': fields.char('Exception Rule', size=352, help="Defines a \
rule or repeating pattern of time to exclude from the recurring rule."),
'rrule': fields.function(_get_rulestring, type='char', size=124, \
fnct_inv=_rrule_write, store=True, string='Recurrent Rule'),
'rrule_type': fields.selection([('none', ''), ('daily', 'Daily'), \
('weekly', 'Weekly'), ('monthly', 'Monthly'), \
('yearly', 'Yearly'),],
'Recurrency', states={'done': [('readonly', True)]},
help="Let the event automatically repeat at that interval"),
'rrule_type': fields.selection([
('daily', 'Daily'),
('weekly', 'Weekly'),
('monthly', 'Monthly'),
('yearly', 'Yearly')
], 'Recurrency', states={'done': [('readonly', True)]},
help="Let the event automatically repeat at that interval"),
'alarm_id': fields.many2one('res.alarm', 'Reminder', states={'done': [('readonly', True)]},
help="Set an alarm at this time, before the event occurs" ),
'base_calendar_alarm_id': fields.many2one('calendar.alarm', 'Alarm'),
@ -1028,7 +1036,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
'recurrent_id': fields.datetime('Recurrent ID date'),
'vtimezone': fields.selection(_tz_get, size=64, string='Timezone'),
'user_id': fields.many2one('res.users', 'Responsible', states={'done': [('readonly', True)]}),
'organizer': fields.char("Organizer", size=256, states={'done': [('readonly', True)]}), # Map with Organizer Attribure of VEvent.
'organizer': fields.char("Organizer", size=256, states={'done': [('readonly', True)]}), # Map with organizer attribute of VEvent.
'organizer_id': fields.many2one('res.users', 'Organizer', states={'done': [('readonly', True)]}),
'end_type' : fields.selection([('count', 'Number of repetitions'), ('end_date','End date')], 'Recurrence Termination'),
'interval': fields.integer('Repeat Every', help="Repeat every (Days/Week/Month/Year)"),
@ -1043,13 +1051,21 @@ rule or repeating pattern of time to exclude from the recurring rule."),
'select1': fields.selection([('date', 'Date of month'),
('day', 'Day of month')], 'Option'),
'day': fields.integer('Date of month'),
'week_list': fields.selection([('MO', 'Monday'), ('TU', 'Tuesday'), \
('WE', 'Wednesday'), ('TH', 'Thursday'), \
('FR', 'Friday'), ('SA', 'Saturday'), \
('SU', 'Sunday')], 'Weekday'),
'byday': fields.selection([('1', 'First'), ('2', 'Second'), \
('3', 'Third'), ('4', 'Fourth'), \
('5', 'Fifth'), ('-1', 'Last')], 'By day'),
'week_list': fields.selection([
('MO', 'Monday'),
('TU', 'Tuesday'),
('WE', 'Wednesday'),
('TH', 'Thursday'),
('FR', 'Friday'),
('SA', 'Saturday'),
('SU', 'Sunday')], 'Weekday'),
'byday': fields.selection([
('1', 'First'),
('2', 'Second'),
('3', 'Third'),
('4', 'Fourth'),
('5', 'Fifth'),
('-1', 'Last')], 'By day'),
'month_list': fields.selection(months.items(), 'Month'),
'end_date': fields.date('Repeat Until'),
'attendee_ids': fields.many2many('calendar.attendee', 'event_attendee_rel', \
@ -1101,9 +1117,9 @@ rule or repeating pattern of time to exclude from the recurring rule."),
return res
_defaults = {
'end_type' : 'count',
'count' : 1,
'rrule_type' : 'none',
'end_type': 'count',
'count': 1,
'rrule_type': False,
'state': 'tentative',
'class': 'public',
'show_as': 'busy',
@ -1113,7 +1129,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
'user_id': lambda self, cr, uid, ctx: uid,
'organizer': default_organizer,
}
def _check_closing_date(self, cr, uid, ids, context=None):
for event in self.browse(cr, uid, ids, context=context):
if event.date_deadline < event.date:
@ -1129,7 +1145,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
This method gives ids of dates that comes between start date and end date of calendar views
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param uid: the current user's ID for security checks,
@param limit: The Number of Results to Return """
if not context:
context = {}
@ -1140,7 +1156,8 @@ rule or repeating pattern of time to exclude from the recurring rule."),
result.append(data['id'])
continue
event_date = datetime.strptime(data['date'], "%Y-%m-%d %H:%M:%S")
# To check: If the start date is replace by event date .. the event date will be changed by that of calendar code
# TOCHECK: the start date should be replaced by event date; the event date will be changed by that of calendar code
if not data['rrule']:
continue
@ -1186,45 +1203,46 @@ rule or repeating pattern of time to exclude from the recurring rule."),
ids = list(set(result))
return ids
def compute_rule_string(self, datas):
def compute_rule_string(self, data):
"""
Compute rule string according to value type RECUR of iCalendar from the values given.
@param self: the object pointer
@param datas: dictionary of freq and interval value.
@param data: dictionary of freq and interval value
@return: string containing recurring rule (empty if no rule)
"""
def get_week_string(freq, datas):
def get_week_string(freq, data):
weekdays = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su']
if freq == 'weekly':
byday = map(lambda x: x.upper(), filter(lambda x: datas.get(x) and x in weekdays, datas))
byday = map(lambda x: x.upper(), filter(lambda x: data.get(x) and x in weekdays, data))
if byday:
return ';BYDAY=' + ','.join(byday)
return ''
def get_month_string(freq, datas):
def get_month_string(freq, data):
if freq == 'monthly':
if datas.get('select1')=='date' and (datas.get('day') < 1 or datas.get('day') > 31):
if data.get('select1')=='date' and (data.get('day') < 1 or data.get('day') > 31):
raise osv.except_osv(_('Error!'), ("Please select a proper day of the month."))
if datas.get('select1')=='day':
return ';BYDAY=' + datas.get('byday') + datas.get('week_list')
elif datas.get('select1')=='date':
return ';BYMONTHDAY=' + str(datas.get('day'))
if data.get('select1')=='day':
return ';BYDAY=' + data.get('byday') + data.get('week_list')
elif data.get('select1')=='date':
return ';BYMONTHDAY=' + str(data.get('day'))
return ''
def get_end_date(datas):
if datas.get('end_date'):
datas['end_date_new'] = ''.join((re.compile('\d')).findall(datas.get('end_date'))) + 'T235959Z'
def get_end_date(data):
if data.get('end_date'):
data['end_date_new'] = ''.join((re.compile('\d')).findall(data.get('end_date'))) + 'T235959Z'
return (datas.get('end_type') == 'count' and (';COUNT=' + str(datas.get('count'))) or '') +\
((datas.get('end_date_new') and datas.get('end_type') == 'end_date' and (';UNTIL=' + datas.get('end_date_new'))) or '')
return (data.get('end_type') == 'count' and (';COUNT=' + str(data.get('count'))) or '') +\
((data.get('end_date_new') and data.get('end_type') == 'end_date' and (';UNTIL=' + data.get('end_date_new'))) or '')
freq=datas.get('rrule_type')
if freq == 'none':
return ''
freq = data.get('rrule_type', False)
res = ''
if freq:
interval_srting = data.get('interval') and (';INTERVAL=' + str(data.get('interval'))) or ''
res = 'FREQ=' + freq.upper() + get_week_string(freq, data) + interval_srting + get_end_date(data) + get_month_string(freq, data)
interval_srting = datas.get('interval') and (';INTERVAL=' + str(datas.get('interval'))) or ''
return 'FREQ=' + freq.upper() + get_week_string(freq, datas) + interval_srting + get_end_date(datas) + get_month_string(freq, datas)
return res
def _get_empty_rrule_data(self):
return {
@ -1248,19 +1266,6 @@ rule or repeating pattern of time to exclude from the recurring rule."),
'week_list' : False
}
#def _write_rrule(self, cr, uid, ids, field_value, rule_date=False, context=None):
# data = self._get_empty_rrule_data()
#
# if field_value:
# data['recurrency'] = True
# for event in self.browse(cr, uid, ids, context=context):
# rdate = rule_date or event.date
# update_data = self._parse_rrule(field_value, dict(data), rdate)
# data.update(update_data)
# #parse_rrule
# self.write(cr, uid, event.id, data, context=context)
def _parse_rrule(self, rule, data, date_start):
day_list = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su']
rrule_type = ['yearly', 'monthly', 'weekly', 'daily']
@ -1278,7 +1283,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
if i in r._byweekday:
data[day_list[i]] = True
data['rrule_type'] = 'weekly'
#repeat monthly bynweekday ((weekday, weeknumber), )
#repeat monthly by nweekday ((weekday, weeknumber), )
if r._bynweekday:
data['week_list'] = day_list[r._bynweekday[0][0]].upper()
data['byday'] = r._bynweekday[0][1]
@ -1290,7 +1295,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
data['select1'] = 'date'
data['rrule_type'] = 'monthly'
#yearly but for openerp it's monthly, take same information as monthly but interval is 12 times
#repeat yearly but for openerp it's monthly, take same information as monthly but interval is 12 times
if r._bymonth:
data['interval'] = data['interval'] * 12
@ -1363,7 +1368,6 @@ rule or repeating pattern of time to exclude from the recurring rule."),
except Exception:
return True
def write(self, cr, uid, ids, vals, context=None, check=True, update_check=True):
context = context or {}
if isinstance(ids, (str, int, long)):
@ -1384,14 +1388,14 @@ rule or repeating pattern of time to exclude from the recurring rule."),
data = self.read(cr, uid, event_id, ['date', 'date_deadline', \
'rrule', 'duration', 'exdate'])
if data.get('rrule'):
data.update(vals)
data.update({
'recurrent_uid': real_event_id,
'recurrent_id': data.get('date'),
'rrule_type': 'none',
'rrule': '',
'recurrency' : False,
})
data.update(
vals,
recurrent_uid=real_event_id,
recurrent_id=data.get('date'),
rrule_type=False,
rrule='',
recurrency=False,
)
new_id = self.copy(cr, uid, real_event_id, default=data, context=context)
@ -1435,7 +1439,6 @@ rule or repeating pattern of time to exclude from the recurring rule."),
return res
def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
# FIXME This whole id mangling has to go!
if context is None:
context = {}
fields2 = fields and fields[:] or None
@ -1445,10 +1448,12 @@ rule or repeating pattern of time to exclude from the recurring rule."),
if fields and (f not in fields):
fields2.append(f)
# FIXME This whole id mangling has to go!
if isinstance(ids, (str, int, long)):
select = [ids]
else:
select = ids
select = map(lambda x: (x, base_calendar_id2real_id(x)), select)
result = []
@ -1477,7 +1482,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
if f not in ('id','date','date_deadline','duration','user_id','state'):
if isinstance(r[f], list):
r[f] = []
else:
else:
r[f] = False
if f=='name':
r[f] = _('Busy')
@ -1525,7 +1530,6 @@ rule or repeating pattern of time to exclude from the recurring rule."),
self.unlink_events(cr, uid, ids, context=context)
return res
def create(self, cr, uid, vals, context=None):
if context is None:
context = {}
@ -1543,7 +1547,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
""" Makes event invitation as Tentative
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param uid: the current user's ID for security checks,
@param ids: List of Event IDs
@param *args: Get Tupple value
@param context: A standard dictionary for contextual values
@ -1554,7 +1558,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
""" Makes event invitation as Tentative
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param uid: the current user's ID for security checks,
@param ids: List of Event IDs
@param *args: Get Tupple value
@param context: A standard dictionary for contextual values
@ -1565,7 +1569,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
""" Makes event invitation as Tentative
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param uid: the current user's ID for security checks,
@param ids: List of Event IDs
@param *args: Get Tupple value
@param context: A standard dictionary for contextual values
@ -1586,9 +1590,9 @@ class calendar_todo(osv.osv):
Get Date
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param uid: the current user's ID for security checks,
@param ids: List of calendar todo's IDs.
@param args: list of tuples of form [(name_of_the_field, operator, value), ...].
@param args: list of tuples of form [(name_of_the_field', operator', value), ...].
@param context: A standard dictionary for contextual values
"""
@ -1602,10 +1606,10 @@ class calendar_todo(osv.osv):
Set Date
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param uid: the current user's ID for security checks,
@param id: calendar's ID.
@param value: Get Value
@param args: list of tuples of form [(name_of_the_field, operator, value), ...].
@param args: list of tuples of form [('name_of_the_field', 'operator', value), ...].
@param context: A standard dictionary for contextual values
"""
@ -1633,7 +1637,7 @@ class ir_values(osv.osv):
Set IR Values
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param uid: the current user's ID for security checks,
@param model: Get The Model
"""
@ -1652,7 +1656,7 @@ class ir_values(osv.osv):
Get IR Values
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param uid: the current user's ID for security checks,
@param model: Get The Model
"""
if context is None:
@ -1678,8 +1682,8 @@ class ir_model(osv.osv):
Overrides orm read method.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of IR Models IDs.
@param uid: the current user's ID for security checks,
@param ids: List of IR Model's IDs.
@param context: A standard dictionary for contextual values
"""
new_ids = isinstance(ids, (str, int, long)) and [ids] or ids
@ -1696,24 +1700,24 @@ ir_model()
class virtual_report_spool(web_services.report_spool):
def exp_report(self, db, uid, object, ids, datas=None, context=None):
def exp_report(self, db, uid, object, ids, data=None, context=None):
"""
Export Report
@param self: The object pointer
@param db: get the current database,
@param uid: the current users ID for security checks,
@param uid: the current user's ID for security checks,
@param context: A standard dictionary for contextual values
"""
if object == 'printscreen.list':
return super(virtual_report_spool, self).exp_report(db, uid, \
object, ids, datas, context)
object, ids, data, context)
new_ids = []
for id in ids:
new_ids.append(base_calendar_id2real_id(id))
if datas.get('id', False):
datas['id'] = base_calendar_id2real_id(datas['id'])
return super(virtual_report_spool, self).exp_report(db, uid, object, new_ids, datas, context)
if data.get('id', False):
data['id'] = base_calendar_id2real_id(data['id'])
return super(virtual_report_spool, self).exp_report(db, uid, object, new_ids, data, context)
virtual_report_spool()
@ -1725,8 +1729,8 @@ class res_users(osv.osv):
Get User Availability
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of res users IDs.
@param uid: the current user's ID for security checks,
@param ids: List of res user's IDs.
@param context: A standard dictionary for contextual values
"""
@ -1755,8 +1759,8 @@ class res_users(osv.osv):
Get User Availability Function
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of res users IDs.
@param uid: the current user's ID for security checks,
@param ids: List of res user's IDs.
@param context: A standard dictionary for contextual values
"""
@ -1770,5 +1774,4 @@ class res_users(osv.osv):
res_users()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Attendee form view-->
<!-- Attendee form view -->
<record id="base_calendar_attendee_form_view" model="ir.ui.view">
<field name="name">calendar.attendee.form</field>
<field name="model">calendar.attendee</field>
@ -55,8 +54,7 @@
</field>
</record>
<!-- Attendee tree view-->
<!-- Attendee tree view -->
<record id="base_calendar_attendee_tree_view" model="ir.ui.view">
<field name="name">calendar.attendee.tree</field>
<field name="model">calendar.attendee</field>
@ -73,8 +71,7 @@
</field>
</record>
<!-- Attendee search view-->
<!-- Attendee search view -->
<record id="base_calendar_attendee_search_view" model="ir.ui.view">
<field name="name">calendar.attendee.search</field>
<field name="model">calendar.attendee</field>
@ -110,18 +107,16 @@
<field name="context">{'default_sent_by_uid': uid}</field>
</record>
<!-- Calenadar's menu -->
<!-- Calendar's menu -->
<menuitem id="base.menu_calendar_configuration" name="Calendar"
parent="base.menu_base_config" sequence="50" groups="base.group_no_one"/>
<!-- Invitation menu -->
<menuitem id="menu_attendee_invitations"
parent="base.menu_calendar_configuration"
sequence="10" action="action_view_attendee_form"/>
<!-- ALARM FORM VIEW-->
<!-- Alarm form view -->
<record id="res_alarm_form_view" model="ir.ui.view">
<field name="name">res.alarm.form</field>
<field name="model">res.alarm</field>
@ -140,8 +135,7 @@
</field>
</record>
<!-- ALARM TREE VIEW-->
<!-- Alarm list view -->
<record id="res_alarm_tree_view" model="ir.ui.view">
<field name="name">res.alarm.tree</field>
<field name="model">res.alarm</field>
@ -171,15 +165,13 @@
</field>
</record>
<!-- Menu for Alarms-->
<!-- Alarms menu -->
<menuitem id="menu_crm_meeting_avail_alarm"
groups="base.group_no_one"
action="base_calendar.action_res_alarm_view"
parent="base.menu_calendar_configuration" sequence="5"/>
<!-- Event Form View-->
<!-- Event form view -->
<record model="ir.ui.view" id="event_form_view">
<field name="name">Event Form</field>
<field name="model">calendar.event</field>
@ -334,8 +326,7 @@
</field>
</record>
<!-- Event Tree View -->
<!-- Event list view -->
<record model="ir.ui.view" id="event_tree_view">
<field name="name">Event Tree</field>
<field name="model">calendar.event</field>
@ -352,8 +343,7 @@
</field>
</record>
<!-- Event Calendar View -->
<!-- Event calendar view -->
<record model="ir.ui.view" id="event_calendar_view">
<field name="name">Events Calendar</field>
<field name="model">calendar.event</field>
@ -367,8 +357,7 @@
</field>
</record>
<!-- Event Search View-->
<!-- Event search view -->
<record id="view_calendar_event_filter" model="ir.ui.view">
<field name="name">Calendar Events Search</field>
<field name="model">calendar.event</field>
@ -393,8 +382,7 @@
</record>
<!-- Event action -->
<!-- Event action -->
<record id="action_view_event" model="ir.actions.act_window">
<field name="name">Events</field>
<field name="type">ir.actions.act_window</field>
@ -404,8 +392,7 @@
<field name="search_view_id" ref="view_calendar_event_filter"/>
</record>
<!-- Event menu -->
<!-- Event menu -->
<menuitem id="menu_events"
name="Events" parent="base.menu_calendar_configuration"
sequence="15" action="action_view_event"/>

View File

@ -43,14 +43,14 @@ class crm_meeting(base_state, osv.Model):
_name = 'crm.meeting'
_description = "Meeting"
_order = "id desc"
_inherit = ["calendar.event", "mail.thread", 'ir.needaction_mixin']
_inherit = ["calendar.event", "mail.thread", "ir.needaction_mixin"]
_columns = {
# base_state required fields
'create_date': fields.datetime('Creation Date', readonly=True),
'write_date': fields.datetime('Write Date', readonly=True),
'date_open': fields.datetime('Confirmed', readonly=True),
'date_closed': fields.datetime('Closed', readonly=True),
'partner_ids': fields.many2many('res.partner', 'crm_meeting_partner_rel', 'meeting_id','partner_id',
'partner_ids': fields.many2many('res.partner', 'crm_meeting_partner_rel', 'meeting_id', 'partner_id',
string='Attendees', states={'done': [('readonly', True)]}),
'state': fields.selection(
[('draft', 'Unconfirmed'), ('open', 'Confirmed')],
@ -115,5 +115,3 @@ class crm_meeting(base_state, osv.Model):
def case_close_send_note(self, cr, uid, ids, context=None):
return self.message_post(cr, uid, ids, body=_("Meeting <b>completed</b>."), context=context)

View File

@ -15,9 +15,9 @@
<record id="action_crm_meeting_read" model="ir.values">
<field name="name">action_crm_meeting_read</field>
<field name="action_id" ref="actions_server_crm_meeting_read"/>
<field name="value" eval="'ir.actions.server,' + str(ref('actions_server_crm_meeting_read'))" />
<field name="value" eval="'ir.actions.server,' + str(ref('actions_server_crm_meeting_read'))"/>
<field name="key">action</field>
<field name="model_id" ref="model_crm_meeting" />
<field name="model_id" ref="model_crm_meeting"/>
<field name="model">crm.meeting</field>
<field name="key2">client_action_multi</field>
</record>
@ -33,9 +33,9 @@
<record id="action_crm_meeting_unread" model="ir.values">
<field name="name">action_crm_meeting_unread</field>
<field name="action_id" ref="actions_server_crm_meeting_unread"/>
<field name="value" eval="'ir.actions.server,' + str(ref('actions_server_crm_meeting_unread'))" />
<field name="value" eval="'ir.actions.server,' + str(ref('actions_server_crm_meeting_unread'))"/>
<field name="key">action</field>
<field name="model_id" ref="model_crm_meeting" />
<field name="model_id" ref="model_crm_meeting"/>
<field name="model">crm.meeting</field>
<field name="key2">client_action_multi</field>
</record>
@ -73,7 +73,7 @@
<sheet>
<div class="oe_title">
<div class="oe_edit_only">
<label for="name"/>
<label for="name"/>
</div>
<h1>
<field name="name"/>
@ -116,9 +116,49 @@
</page>
<page string="Options">
<group>
<group>
<field name="recurrency"
attrs="{'readonly': [('recurrent_uid','!=',False)]}"/>
<group col="1">
<group>
<field name="recurrency"
attrs="{'readonly': [('recurrent_uid','!=',False)]}"/>
</group>
<group attrs="{'invisible': [('recurrency','=',False)]}">
<label for="interval"/>
<div>
<field name="interval" attrs="{'required': [('recurrency','==',True)]}" class="oe_inline"/>
<field name="rrule_type" attrs="{'required': [('recurrency','==',True)]}" class="oe_inline"/>
</div>
<label string="Until" for="end_type"/>
<div>
<field name="end_type" attrs="{'required': [('recurrency','==',True)]}" class="oe_inline"/>
<field name="count" attrs="{'invisible': [('end_type', '!=', 'count')], 'required': [('recurrency','==',True)]}" class="oe_inline"/>
<field name="end_date" attrs="{'invisible': [('end_type', '!=', 'end_date')], 'required': [('end_type', '=', 'end_date')]}" class="oe_inline"/>
</div>
<label string="Select Weekdays" attrs="{'invisible' :[('rrule_type','not in', ['weekly'])]}"/>
<group col="2" colspan="1" name="weekdays" attrs="{'invisible' :[('rrule_type','not in', ['weekly'])]}">
<field name="mo"/>
<field name="tu"/>
<field name="we"/>
<field name="th"/>
<field name="fr"/>
<field name="sa"/>
<field name="su"/>
</group>
<label string="Day of Month"
attrs="{'invisible': [('rrule_type','!=','monthly')]}"/>
<div attrs="{'invisible': [('rrule_type','!=','monthly')]}">
<field name="select1"/>
<field name="day"
attrs="{'required': [('select1','=','date'), ('rrule_type','=','monthly')],
'invisible': [('select1','=','day')]}"/>
<field name="byday" string="The"
attrs="{'required': [('select1','=','day'), ('rrule_type','=','monthly')], 'invisible': [('select1','=','date')]}"/>
<field name="week_list" nolabel="1"
attrs="{'required': [('select1','=','day'), ('rrule_type','=','monthly')], 'invisible': [('select1','=','date')]}"/>
</div>
</group>
</group>
<group>
<field name="alarm_id" widget="selection" groups="base.group_no_one"/>
@ -128,44 +168,6 @@
<field name="recurrent_id" invisible="1"/>
<field name="recurrent_uid" invisible="1"/>
</group>
<group attrs="{'invisible': [('recurrency','=',False)]}">
<label for="interval"/>
<div>
<field name="interval" class="oe_inline"/>
<field name="rrule_type" class="oe_inline"/>
</div>
<label string="Until" for="end_type"/>
<div>
<field name="end_type" class="oe_inline"/>
<field name="count" attrs="{'invisible' : [('end_type', '!=', 'count')] }" class="oe_inline"/>
<field name="end_date" attrs="{'invisible' : [('end_type', '!=', 'end_date')], 'required': [('end_type', '=', 'end_date')]}" class="oe_inline"/>
</div>
<label string="Select Weekdays" attrs="{'invisible' :[('rrule_type','not in', ['weekly'])]}"/>
<group col="2" colspan="1" name="weekdays" attrs="{'invisible' :[('rrule_type','not in', ['weekly'])]}">
<field name="mo" />
<field name="tu" />
<field name="we" />
<field name="th" />
<field name="fr" />
<field name="sa" />
<field name="su" />
</group>
<label string="Day of Month"
attrs="{'invisible' : [('rrule_type','!=','monthly')]}"/>
<div attrs="{'invisible' : [('rrule_type','!=','monthly')]}">
<field name="select1" />
<field name="day"
attrs="{'required' : [('select1','=','date'), ('rrule_type','=','monthly')],
'invisible' : [('select1','=','day')]}" />
<field name="byday" string="The"
attrs="{'required' : [('select1','=','day'), ('rrule_type','=','monthly')], 'invisible' : [('select1','=','date')]}" />
<field name="week_list" nolabel="1"
attrs="{'required' : [('select1','=','day'), ('rrule_type','=','monthly')], 'invisible' : [('select1','=','date')]}" />
</div>
</group>
</group>
</page>
<!--
@ -178,12 +180,11 @@
<tree string="Invitation details" editable="top">
<field name="partner_id"/>
<field name="email" string="Mail To"/>
<field name="state" />
<field name="state"/>
<button name="do_tentative"
states="needs-action,declined,accepted"
string="Uncertain" type="object"
icon="terp-crm"
/>
icon="terp-crm"/>
<button name="do_accept" string="Accept"
states="needs-action,tentative,declined"
type="object" icon="gtk-apply"/>
@ -195,21 +196,21 @@
<header>
<button name="do_tentative" type="object"
states="needs-action,declined,accepted"
string="Uncertain" />
string="Uncertain"/>
<button name="do_accept" type="object"
states="needs-action,tentative,declined"
string="Accept" />
string="Accept"/>
<button name="do_decline" type="object"
states="needs-action,tentative,accepted"
string="Decline" />
string="Decline"/>
<field name="state" widget="statusbar" statusbar_visible="draft,open,done"/>
</header>
<group>
<group>
<field name="email" />
<field name="rsvp" />
<field name="cutype" />
<field name="role" />
<field name="email"/>
<field name="rsvp"/>
<field name="cutype"/>
<field name="role"/>
</group>
<group>
<field name="partner_id"/>
@ -237,11 +238,11 @@
<field name="model">crm.meeting</field>
<field name="arch" type="xml">
<tree string="Meetings" fonts="bold:message_unread==True">
<field name="name" string="Subject" />
<field name="name" string="Subject"/>
<field name="user_id"/>
<field name="date"/>
<field name="state" invisible="True"/>
<field name="duration" />
<field name="duration"/>
<field name="message_unread" invisible="1"/>
</tree>
</field>
@ -299,7 +300,7 @@
<field name="context">{"calendar_default_user_id": uid}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to schedule a new meeting.
Click to schedule a new meeting.
</p><p>
The calendar is shared between employees and fully integrated with
other applications such as the employee holidays or the business

View File

@ -10,8 +10,7 @@
duration: 2.5
location: OpenERP S.A.
name: Technical Presentation
rrule_type: none
-
-
Now I will set recurrence for this event to occur monday and friday of week
-
!python {model: calendar.event}: |
@ -39,10 +38,9 @@
description: 'All day technical test '
location: School
name: All day test event
rrule_type: none
-
In order to check reminder I will first create reminder
-
-
!record {model: res.alarm, id: res_alarm_daybeforeeventstarts0}:
name: 1 Day before event starts
trigger_duration: 1

View File

@ -140,6 +140,7 @@
<field name="duration" widget="float_time"/>
<field name="section_id" colspan="1" widget="selection"/>
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
<field name="email_from" invisible="1"/> <!--not needed because of the chatter, thus invisible, but must be in the view as it's returned by onchange_partner_id()-->
<field name="categ_id" widget="selection"
domain="[('object_id.model', '=', 'crm.phonecall')]"/>
<field name="partner_mobile"/>

View File

@ -435,22 +435,6 @@ class event_registration(osv.osv):
'phone':contact_id.phone,
}}
def onchange_event(self, cr, uid, ids, event_id, context=None):
"""This function returns value of Product Name, Unit Price based on Event.
"""
if context is None:
context = {}
if not event_id:
return {}
event_obj = self.pool.get('event.event')
data_event = event_obj.browse(cr, uid, event_id, context=context)
return {'value':
{'event_begin_date': data_event.date_begin,
'event_end_date': data_event.date_end,
'company_id': data_event.company_id and data_event.company_id.id or False,
}
}
def onchange_partner_id(self, cr, uid, ids, part, context=None):
res_obj = self.pool.get('res.partner')
data = {}

View File

@ -1,7 +1,7 @@
<?xml version="1.0"?>
<openerp>
<data>
<record id="act_event_list_register_event" model="ir.actions.act_window">
<field name="res_model">event.registration</field>
<field name="view_type">form</field>
@ -136,10 +136,22 @@
<field name="type" on_change="onchange_event_type(type,context)"/>
<field name="date_begin"/>
<field name="date_end"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</group>
</div>
<notebook>
<page string="Email Configuration" groups="base.group_no_one">
<group>
<field name="reply_to"/>
<group>
<field name="email_registration_id"/>
</group>
<group>
<field name="email_confirmation_id"/>
</group>
</group>
</page>
<page string="Event Description">
<field name="note" colspan="4" nolabel="1"/>
</page>
@ -217,7 +229,7 @@
<field name="register_current"/>
<field name="register_min"/>
<field name="register_max" invisible="1"/>
<field name="main_speaker_id" groups="base.extended"/>
<field name="main_speaker_id" groups="base.group_no_one"/>
<field name="user_id"/>
<field name="state"/>
<field name="message_unread" invisible="1"/>
@ -452,7 +464,7 @@
<sheet string="Registration">
<label for="event_id" class="oe_edit_only"/>
<h1>
<field name="event_id" on_change="onchange_event(event_id, context)" domain="[('state','in',('draft','confirm'))]"/>
<field name="event_id" domain="[('state','in',('draft','confirm'))]"/>
</h1>
<group>
<group>

View File

@ -62,8 +62,8 @@
<newline/>
<group expand="1" string="Group By...">
<filter string="Participant / Contact" icon="terp-personal" context="{'group_by':'name_registration'}" help="Registration contact"/>
<filter string="Register" icon="terp-personal" context="{'group_by':'user_id_registration'}" help="Registration contact" groups="base.extended"/>
<filter string="Speaker" name="speaker" icon="terp-personal+" context="{'group_by': 'speaker_id'}" groups="base.extended"/>
<filter string="Register" icon="terp-personal" context="{'group_by':'user_id_registration'}" help="Registration contact" groups="base.group_no_one"/>
<filter string="Speaker" name="speaker" icon="terp-personal+" context="{'group_by': 'speaker_id'}" groups="base.group_no_one"/>
<filter string="Event Responsible" name="user_id" icon="terp-personal" context="{'group_by': 'user_id'}"/>
<filter string="Event" name="event" icon="terp-crm" context="{'group_by':'event_id', 'max_reg_event_visible':0}"/>
<filter string="Event Type" icon="terp-crm" context="{'group_by':'event_type'}"/>

View File

@ -212,13 +212,6 @@ class hr_holidays(osv.osv):
}
return result
def onchange_status_id(self, cr, uid, ids, status_id, context=None):
double_validation = False
if status_id:
holiday_status = self.pool.get('hr.holidays.status').browse(cr, uid, status_id, context=context)
double_validation = holiday_status.double_validation
return {'value': {'double_validation': double_validation}}
def set_to_draft(self, cr, uid, ids, context=None):
self.write(cr, uid, ids, {
'state': 'draft',

View File

@ -100,7 +100,7 @@
<group>
<group>
<field name="name" attrs="{'readonly':[('state','!=','draft'),('state','!=','confirm')]}"/>
<field name="holiday_status_id" on_change="onchange_status_id(holiday_status_id)" context="{'employee_id':employee_id}"/>
<field name="holiday_status_id" context="{'employee_id':employee_id}"/>
<label for="number_of_days_temp" string="Duration"/>
<div>
<group col="3">
@ -145,7 +145,7 @@
<group>
<group>
<field name="name" required="1" attrs="{'readonly':[('state','!=','draft'),('state','!=','confirm')]}"/>
<field name="holiday_status_id" on_change="onchange_status_id(holiday_status_id)" context="{'employee_id':employee_id}"/>
<field name="holiday_status_id" context="{'employee_id':employee_id}"/>
<field name="number_of_days_temp"/>
</group>
<group>

View File

@ -33,6 +33,7 @@ import report
import wizard
import res_config
import mail_group_menu
import update
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -13,6 +13,20 @@
<field eval="'()'" name="args"/>
</record>
<record id="ir_cron_module_update_notification" model="ir.cron">
<field name="name">Update Notification</field>
<field eval="True" name="active" />
<field name="user_id" ref="base.user_root" />
<field name="interval_number">1</field>
<field name="interval_type">weeks</field>
<field name="numbercall">-1</field>
<field eval="False" name="doall" />
<field eval="'ir.module.module'" name="model" />
<field eval="'update_notification'" name="function" />
<field eval="'(None,)'" name="args" />
<field name="priority">1000</field>
</record>
<record id="mt_comment" model="mail.message.subtype">
<field name="name">comment</field>
</record>

View File

@ -504,7 +504,7 @@ class mail_message(osv.Model):
if not values.get('message_id') and values.get('res_id') and values.get('model'):
values['message_id'] = tools.generate_tracking_message_id('%(model)s-%(res_id)s' % values)
newid = super(mail_message, self).create(cr, uid, values, context)
self._notify(cr, 1, newid, context=context)
self._notify(cr, SUPERUSER_ID, newid, context=context)
return newid
def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):

View File

@ -149,7 +149,6 @@ openerp_mail_followers = function(session, mail) {
var self = this;
var node_user_list = this.$('ul.oe_mail_followers_display').empty();
this.$('div.oe_mail_recthread_followers h4').html(this.options.title + (records.length>=5 ? ' (' + records.length + ')' : '') );
console.log(records);
for(var i=0; i<records.length&&i<5; i++) {
var record=records[i];
record.avatar_url = mail.ChatterUtils.get_image(self.session, 'res.partner', 'image_small', record.id);

112
addons/mail/update.py Normal file
View File

@ -0,0 +1,112 @@
# -*- coding: utf-8 -*-
import datetime
import logging
import sys
import urllib
import urllib2
import pooler
import release
from osv import osv, fields
from tools.translate import _
from tools.safe_eval import safe_eval
from tools.config import config
from tools import misc
_logger = logging.getLogger(__name__)
"""
Time interval that will be used to determine up to which date we will
check the logs to see if a message we just received was already logged.
@type: datetime.timedelta
"""
_PREVIOUS_LOG_CHECK = datetime.timedelta(days=365)
def get_sys_logs(cr, uid):
"""
Utility method to send a publisher warranty get logs messages.
"""
pool = pooler.get_pool(cr.dbname)
dbuuid = pool.get('ir.config_parameter').get_param(cr, uid, 'database.uuid')
db_create_date = pool.get('ir.config_parameter').get_param(cr, uid, 'database.create_date')
limit_date = datetime.datetime.now()
limit_date = limit_date - datetime.timedelta(15)
limit_date_str = limit_date.strftime(misc.DEFAULT_SERVER_DATETIME_FORMAT)
nbr_users = pool.get("res.users").search(cr, uid, [], count=True)
nbr_active_users = pool.get("res.users").search(cr, uid, [("date", ">=", limit_date_str)], count=True)
nbr_share_users = False
nbr_active_share_users = False
if "share" in pool.get("res.users")._all_columns:
nbr_share_users = pool.get("res.users").search(cr, uid, [("share", "=", True)], count=True)
nbr_active_share_users = pool.get("res.users").search(cr, uid, [("share", "=", True), ("date", ">=", limit_date_str)], count=True)
user = pool.get("res.users").browse(cr, uid, uid)
msg = {
"dbuuid": dbuuid,
"nbr_users": nbr_users,
"nbr_active_users": nbr_active_users,
"nbr_share_users": nbr_share_users,
"nbr_active_share_users": nbr_active_share_users,
"dbname": cr.dbname,
"db_create_date": db_create_date,
"version": release.version,
"language": user.lang,
}
msg.update(pool.get("res.company").read(cr,uid,[1],["name","email","phone"])[0])
add_arg = {"timeout":30} if sys.version_info >= (2,6) else {}
arguments = {'arg0': msg, "action": "update",}
arguments_raw = urllib.urlencode(arguments)
url = config.get("publisher_warranty_url")
uo = urllib2.urlopen(url, arguments_raw, **add_arg)
result = {}
try:
submit_result = uo.read()
result = safe_eval(submit_result)
finally:
uo.close()
return result
class publisher_warranty_contract(osv.osv):
_name = "publisher_warranty.contract"
def update_notification(self, cr, uid, ids, cron_mode=True, context=None):
"""
Send a message to OpenERP's publisher warranty server to check the
validity of the contracts, get notifications, etc...
@param cron_mode: If true, catch all exceptions (appropriate for usage in a cron).
@type cron_mode: boolean
"""
try:
try:
result = get_sys_logs(cr, uid)
except Exception:
if cron_mode: # we don't want to see any stack trace in cron
return False
_logger.debug("Exception while sending a get logs messages", exc_info=1)
raise osv.except_osv(_("Error"), _("Error during communication with the publisher warranty server."))
limit_date = (datetime.datetime.now() - _PREVIOUS_LOG_CHECK).strftime(misc.DEFAULT_SERVER_DATETIME_FORMAT)
# old behavior based on res.log; now on mail.message, that is not necessarily installed
proxy = self.pool.get('mail.message')
model, res_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'mail', 'group_all_employees')
for message in result["messages"]:
values = {
'body' : message,
'model' : 'mail.group',
'res_id' : res_id,
'user_id' : False,
}
proxy.create(cr, uid, values, context=context)
except Exception:
if cron_mode:
return False # we don't want to see any stack trace in cron
else:
raise
return True
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -8,19 +8,19 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-01-12 05:49+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2012-10-08 15:06+0000\n"
"Last-Translator: kifcaliph <Unknown>\n"
"Language-Team: Arabic <ar@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-08-28 06:38+0000\n"
"X-Generator: Launchpad (build 15864)\n"
"X-Launchpad-Export-Date: 2012-10-09 04:51+0000\n"
"X-Generator: Launchpad (build 16112)\n"
#. module: marketing_campaign
#: view:marketing.campaign:0
msgid "Manual Mode"
msgstr ""
msgstr "النمط اليدوي"
#. module: marketing_campaign
#: field:marketing.campaign.transition,activity_from_id:0
@ -31,12 +31,12 @@ msgstr "النشاط السابق"
#: code:addons/marketing_campaign/marketing_campaign.py:818
#, python-format
msgid "The current step for this item has no email or report to preview."
msgstr ""
msgstr "الخطوة الحالية لهذا الصنف لا تملك بريد إلكتروني أو تقرير للمعاينة"
#. module: marketing_campaign
#: constraint:marketing.campaign.transition:0
msgid "The To/From Activity of transition must be of the same Campaign "
msgstr ""
msgstr "الإنتقال من / إلى النشاط يجب أن يكون من نفس الحملة "
#. module: marketing_campaign
#: selection:marketing.campaign.transition,trigger:0
@ -46,7 +46,7 @@ msgstr "الوقت"
#. module: marketing_campaign
#: selection:marketing.campaign.activity,type:0
msgid "Custom Action"
msgstr ""
msgstr "تخصيص إجراء"
#. module: marketing_campaign
#: view:campaign.analysis:0
@ -63,11 +63,13 @@ msgid ""
"reached this point has generated a certain revenue. You can get revenue "
"statistics in the Reporting section"
msgstr ""
"تعيين الإيرادات المتوقعة إذا كنت ترى أن كل بند من بنود الحملة وصلت الى تلك "
"النقطة وولدت عائد معين. يمكنك الحصول على إحصاءات الإيرادات في قسم التقارير"
#. module: marketing_campaign
#: field:marketing.campaign.transition,trigger:0
msgid "Trigger"
msgstr ""
msgstr "زر"
#. module: marketing_campaign
#: field:campaign.analysis,count:0
@ -77,7 +79,7 @@ msgstr ""
#. module: marketing_campaign
#: view:marketing.campaign:0
msgid "Campaign Editor"
msgstr ""
msgstr "محرر الحملة"
#. module: marketing_campaign
#: view:campaign.analysis:0
@ -106,13 +108,13 @@ msgstr "كائن"
#. module: marketing_campaign
#: view:marketing.campaign.segment:0
msgid "Sync mode: only records created after last sync"
msgstr ""
msgstr "نمط المزامنة: السجلات فقط التي تم إنشاؤها بعد آخر المزامنة"
#. module: marketing_campaign
#: model:email.template,body_text:marketing_campaign.email_template_2
msgid ""
"Hello, We are happy to announce that you now become our Silver Partner."
msgstr ""
msgstr "مرحبا، ونحن سعداء أن نعلن أنك أصبحت الآن شريكاً فضياً لدينا."
#. module: marketing_campaign
#: view:marketing.campaign:0
@ -123,7 +125,7 @@ msgstr "حفظ كمسودة"
#. module: marketing_campaign
#: field:marketing.campaign.activity,to_ids:0
msgid "Next Activities"
msgstr ""
msgstr "النشاطات التالية"
#. module: marketing_campaign
#: view:marketing.campaign.segment:0
@ -133,7 +135,7 @@ msgstr "مزامنة"
#. module: marketing_campaign
#: sql_constraint:marketing.campaign.transition:0
msgid "The interval must be positive or zero"
msgstr ""
msgstr "الفترة يجب أن تكون إيجابية أو صفر"
#. module: marketing_campaign
#: code:addons/marketing_campaign/marketing_campaign.py:818
@ -145,7 +147,7 @@ msgstr "لا معاينة"
#: view:marketing.campaign.segment:0
#: field:marketing.campaign.segment,date_run:0
msgid "Launch Date"
msgstr ""
msgstr "تاريخ الإنشاء"
#. module: marketing_campaign
#: view:campaign.analysis:0
@ -156,7 +158,7 @@ msgstr "يوم"
#. module: marketing_campaign
#: view:marketing.campaign.activity:0
msgid "Outgoing Transitions"
msgstr ""
msgstr "التنقلات الصادرة"
#. module: marketing_campaign
#: view:marketing.campaign.workitem:0
@ -166,18 +168,18 @@ msgstr "إستعادة"
#. module: marketing_campaign
#: help:marketing.campaign,object_id:0
msgid "Choose the resource on which you want this campaign to be run"
msgstr ""
msgstr "اختيار المورد الذي تريده ليتم تشغيله لهذه الحملة"
#. module: marketing_campaign
#: field:marketing.campaign.segment,sync_last_date:0
msgid "Last Synchronization"
msgstr ""
msgstr "التزامن الأخير"
#. module: marketing_campaign
#: code:addons/marketing_campaign/marketing_campaign.py:214
#, python-format
msgid "You can not duplicate a campaign, it's not supported yet."
msgstr ""
msgstr "لا يمكنك تكرار الحملة، انها غير مدعومة حتى الآن."
#. module: marketing_campaign
#: selection:marketing.campaign.transition,interval_type:0
@ -189,7 +191,7 @@ msgstr "سنة/سنين"
msgid ""
"Date on which this segment was synchronized last time (automatically or "
"manually)"
msgstr ""
msgstr "التاريخ الذي تزامن هذا القطاع آخر مرة (آليا أو يدويا)"
#. module: marketing_campaign
#: selection:campaign.analysis,state:0
@ -216,11 +218,19 @@ msgid ""
"Normal - the campaign runs normally and automatically sends all emails and "
"reports (be very careful with this mode, you're live!)"
msgstr ""
"اختبار - وهو يخلق ويعالج كافة الأنشطة مباشرة (دون انتظار تأخير على التحولات) "
"ولكن لا يرسل رسائل البريد الإلكتروني أو يعد التقارير.\n"
" اختبار في الوقت الحقيقي - وهو يخلق ويعالج جميع الأنشطة بشكل مباشر ولكن لا "
"يرسل رسائل البريد الإلكتروني أو يعد التقارير.\n"
" مع التأكيد اليدوي - يعمل الحملات عادة، ولكن المستخدم لديه للتحقق من صحة كل "
"بنود العمل يدويا.\n"
" طبيعي - يعمل الحملة بشكل طبيعي يرسل تلقائيا جميع رسائل البريد الإلكتروني "
"والتقارير (نكون حذرين للغاية مع هذا الوضع، أنت على الهواء!)"
#. module: marketing_campaign
#: help:marketing.campaign.segment,date_run:0
msgid "Initial start date of this segment."
msgstr ""
msgstr "تاريخ بدء الأولي لهذا القطاع."
#. module: marketing_campaign
#: view:campaign.analysis:0
@ -237,7 +247,7 @@ msgstr "حملة"
#. module: marketing_campaign
#: model:email.template,subject:marketing_campaign.email_template_3
msgid "Congratulation! You become our Gold Partner."
msgstr ""
msgstr "تهنئة! لقد أصبحت شريكاً ذهبياً الآن."
#. module: marketing_campaign
#: view:campaign.analysis:0
@ -251,7 +261,7 @@ msgstr "قطعة"
#. module: marketing_campaign
#: view:marketing.campaign.activity:0
msgid "Cost / Revenue"
msgstr ""
msgstr "التكلفة/العائد"
#. module: marketing_campaign
#: help:marketing.campaign.activity,type:0
@ -313,7 +323,7 @@ msgstr ""
#. module: marketing_campaign
#: view:campaign.analysis:0
msgid "Marketing Reports"
msgstr ""
msgstr "تقارير التسويق"
#. module: marketing_campaign
#: selection:marketing.campaign,state:0
@ -342,7 +352,7 @@ msgstr ""
#. module: marketing_campaign
#: field:marketing.campaign.segment,sync_mode:0
msgid "Synchronization mode"
msgstr ""
msgstr "نمط التزامن"
#. module: marketing_campaign
#: view:marketing.campaign:0
@ -353,7 +363,7 @@ msgstr ""
#. module: marketing_campaign
#: field:marketing.campaign.activity,from_ids:0
msgid "Previous Activities"
msgstr ""
msgstr "النشاطات السابقة"
#. module: marketing_campaign
#: help:marketing.campaign.segment,date_done:0
@ -363,7 +373,7 @@ msgstr ""
#. module: marketing_campaign
#: view:marketing.campaign.workitem:0
msgid "Marketing Campaign Activities"
msgstr ""
msgstr "نشاطات حملة التسويق"
#. module: marketing_campaign
#: view:marketing.campaign.workitem:0
@ -427,7 +437,7 @@ msgstr ""
#. module: marketing_campaign
#: model:ir.model,name:marketing_campaign.model_marketing_campaign_segment
msgid "Campaign Segment"
msgstr ""
msgstr "حملة القطاع"
#. module: marketing_campaign
#: view:marketing.campaign:0
@ -456,7 +466,7 @@ msgstr ""
#. module: marketing_campaign
#: field:marketing.campaign,fixed_cost:0
msgid "Fixed Cost"
msgstr ""
msgstr "التكلفة الثابتة"
#. module: marketing_campaign
#: model:email.template,subject:marketing_campaign.email_template_2
@ -466,12 +476,12 @@ msgstr ""
#. module: marketing_campaign
#: view:marketing.campaign.segment:0
msgid "Newly Modified"
msgstr ""
msgstr "تم التعديل حديثاً"
#. module: marketing_campaign
#: field:marketing.campaign.transition,interval_nbr:0
msgid "Interval Value"
msgstr ""
msgstr "قيمة الفترة"
#. module: marketing_campaign
#: field:campaign.analysis,revenue:0
@ -512,22 +522,22 @@ msgstr ""
#. module: marketing_campaign
#: model:ir.actions.act_window,name:marketing_campaign.act_marketing_campaing_followup
msgid "Campaign Follow-up"
msgstr ""
msgstr "متابعة الحملة"
#. module: marketing_campaign
#: help:marketing.campaign.activity,email_template_id:0
msgid "The e-mail to send when this activity is activated"
msgstr ""
msgstr "بريد إلكتروني للإرسال عندما يتم تنشيط المنشط"
#. module: marketing_campaign
#: view:marketing.campaign:0
msgid "Test Mode"
msgstr ""
msgstr "نمط الإختبار"
#. module: marketing_campaign
#: selection:marketing.campaign.segment,sync_mode:0
msgid "Only records modified after last sync (no duplicates)"
msgstr ""
msgstr "فقط السجلات المعدلة بعد آخر مزامنة (بدون تكرار)"
#. module: marketing_campaign
#: model:ir.model,name:marketing_campaign.model_ir_actions_report_xml

View File

@ -910,12 +910,11 @@ class mrp_production(osv.osv):
# Internal shipment is created for Stockable and Consumer Products
if production_line.product_id.type not in ('product', 'consu'):
return False
move_name = _('PROD: %s') % production.name
source_location_id = production.location_src_id.id
if not destination_location_id:
destination_location_id = source_location_id
return stock_move.create(cr, uid, {
'name': move_name,
'name': production.name,
'picking_id': shipment_id,
'product_id': production_line.product_id.id,
'product_qty': production_line.product_qty,
@ -965,9 +964,8 @@ class mrp_production(osv.osv):
stock_move = self.pool.get('stock.move')
source_location_id = production.product_id.product_tmpl_id.property_stock_production.id
destination_location_id = production.location_dest_id.id
move_name = _('PROD: %s') + production.name
data = {
'name': move_name,
'name': production.name,
'date': production.date_planned,
'product_id': production.product_id.id,
'product_qty': production.product_qty,
@ -990,12 +988,11 @@ class mrp_production(osv.osv):
# Internal shipment is created for Stockable and Consumer Products
if production_line.product_id.type not in ('product', 'consu'):
return False
move_name = _('PROD: %s') % production.name
destination_location_id = production.product_id.product_tmpl_id.property_stock_production.id
if not source_location_id:
source_location_id = production.location_src_id.id
move_id = stock_move.create(cr, uid, {
'name': move_name,
'name': production.name,
'date': production.date_planned,
'product_id': production_line.product_id.id,
'product_qty': production_line.product_qty,

View File

@ -6,7 +6,6 @@ instance.web.ViewManager.include({
var self = this;
var _super = this._super();
this.process_help = this.action ? this.action.help : '';
self.process_help = $(this.process_help).text();
if(this.action) {
this.process_model = this.action.res_model;
} else {
@ -240,9 +239,7 @@ instance.web.ViewManager.include({
title: _t('Process')
});
var form_controller = pop.view_form;
pop.on_write_completed.add_last(function() {
self.initialize_process_view();
});
pop.on('on_write_complete', self, self.initialize_process_view);
}
});
};

View File

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
"PO-Revision-Date: 2012-02-08 02:55+0000\n"
"PO-Revision-Date: 2012-10-08 16:00+0000\n"
"Last-Translator: kifcaliph <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-07 04:56+0000\n"
"X-Generator: Launchpad (build 15914)\n"
"X-Launchpad-Export-Date: 2012-10-09 04:51+0000\n"
"X-Generator: Launchpad (build 16112)\n"
#. module: purchase
#: model:process.transition,note:purchase.process_transition_confirmingpurchaseorder0
@ -45,7 +45,7 @@ msgstr "المقصد"
#: code:addons/purchase/purchase.py:236
#, python-format
msgid "In order to delete a purchase order, it must be cancelled first!"
msgstr ""
msgstr "من أجل حذف أمر الشراء، يجب الإلغاء أولاً!"
#. module: purchase
#: help:purchase.report,date:0
@ -87,7 +87,7 @@ msgstr ""
#. module: purchase
#: view:purchase.order:0
msgid "Approved purchase order"
msgstr ""
msgstr "الموافقة على أمر الشراء"
#. module: purchase
#: view:purchase.order:0 field:purchase.order,partner_id:0
@ -149,7 +149,7 @@ msgstr "لا يوجد قائمة اسعار !"
#. module: purchase
#: model:ir.model,name:purchase.model_purchase_config_wizard
msgid "purchase.config.wizard"
msgstr ""
msgstr "شراء.ضبط.صندوق حوار"
#. module: purchase
#: view:board.board:0 model:ir.actions.act_window,name:purchase.purchase_draft
@ -249,7 +249,7 @@ msgstr "يوم"
#. module: purchase
#: selection:purchase.order,invoice_method:0
msgid "Based on generated draft invoice"
msgstr ""
msgstr "على أساس توليد مسودة فاتورة"
#. module: purchase
#: view:purchase.report:0
@ -259,7 +259,7 @@ msgstr "ترتيب اليوم"
#. module: purchase
#: view:board.board:0
msgid "Monthly Purchases by Category"
msgstr ""
msgstr "مشتريات شهرية حسب الفئة"
#. module: purchase
#: model:ir.actions.act_window,name:purchase.action_purchase_line_product_tree
@ -269,7 +269,7 @@ msgstr "المشتريات"
#. module: purchase
#: view:purchase.order:0
msgid "Purchase order which are in draft state"
msgstr ""
msgstr "أمر الشراء التي هي في حالة مسودة"
#. module: purchase
#: view:purchase.order:0
@ -392,7 +392,7 @@ msgstr "حركة مخزن"
#: code:addons/purchase/purchase.py:419
#, python-format
msgid "You must first cancel all invoices related to this purchase order."
msgstr ""
msgstr "يجب عليك أولا إلغاء جميع الفواتير المتعلقة بهذا أمر الشراء."
#. module: purchase
#: field:purchase.report,dest_address_id:0
@ -436,13 +436,13 @@ msgstr "تم التحقق من الصلاحية عن طريق"
#. module: purchase
#: view:purchase.report:0
msgid "Order in last month"
msgstr ""
msgstr "طلب في الشهر الماضي"
#. module: purchase
#: code:addons/purchase/purchase.py:412
#, python-format
msgid "You must first cancel all receptions related to this purchase order."
msgstr ""
msgstr "يجب عليك أولا إلغاء جميع حفلات الاستقبال المتعلقة بهذا أمر الشراء."
#. module: purchase
#: selection:purchase.order.line,state:0
@ -467,7 +467,7 @@ msgstr "توضح انه قد تم عمل الاختيار"
#. module: purchase
#: view:purchase.order:0
msgid "Purchase orders which are in exception state"
msgstr ""
msgstr "أوامر الشراء التي هي في حالة الاستثناء"
#. module: purchase
#: report:purchase.order:0 field:purchase.report,validator:0
@ -506,7 +506,7 @@ msgstr "تأكيد"
#: model:ir.ui.menu,name:purchase.menu_action_picking_tree4_picking_to_invoice
#: selection:purchase.order,invoice_method:0
msgid "Based on receptions"
msgstr ""
msgstr "استناداً على ما تم استقباله"
#. module: purchase
#: constraint:res.company:0
@ -541,7 +541,7 @@ msgstr ""
#. module: purchase
#: view:purchase.order:0
msgid "Purchase order which are in the exception state"
msgstr ""
msgstr "أمر الشراء التي هي في حالة استثناء"
#. module: purchase
#: model:ir.actions.act_window,help:purchase.action_stock_move_report_po
@ -597,7 +597,7 @@ msgstr "السعر الإجمالي"
#. module: purchase
#: model:ir.actions.act_window,name:purchase.action_import_create_supplier_installer
msgid "Create or Import Suppliers"
msgstr ""
msgstr "إنشاء أو استيراد الموردون"
#. module: purchase
#: view:stock.picking:0
@ -662,7 +662,7 @@ msgstr ""
#. module: purchase
#: report:purchase.order:0
msgid "Purchase Order Confirmation N°"
msgstr ""
msgstr "تأكيد أمر الشراء ن°"
#. module: purchase
#: model:ir.actions.act_window,help:purchase.action_purchase_order_report_all
@ -748,7 +748,7 @@ msgstr "الاستقبالات"
#: code:addons/purchase/purchase.py:285
#, python-format
msgid "You cannot confirm a purchase order without any lines."
msgstr ""
msgstr "لا يمكنك تأكيد أمر الشراء دون أية أسطر."
#. module: purchase
#: model:ir.actions.act_window,help:purchase.action_invoice_pending
@ -784,7 +784,7 @@ msgstr "يناير"
#. module: purchase
#: model:ir.actions.server,name:purchase.ir_actions_server_edi_purchase
msgid "Auto-email confirmed purchase orders"
msgstr ""
msgstr "البريد التلقائي لتأكيد طلبات الشراء"
#. module: purchase
#: model:process.transition,name:purchase.process_transition_approvingpurchaseorder0
@ -840,7 +840,7 @@ msgstr "دمج امر الشراء"
#. module: purchase
#: view:purchase.report:0
msgid "Order in current month"
msgstr ""
msgstr "طلب في الشهر الحالي"
#. module: purchase
#: view:purchase.report:0 field:purchase.report,delay_pass:0
@ -881,7 +881,7 @@ msgstr "خطوط الاوامر الكلية للمستخدم لكل شهر"
#. module: purchase
#: view:purchase.order:0
msgid "Approved purchase orders"
msgstr ""
msgstr "تأكيد أوامر الشراء"
#. module: purchase
#: view:purchase.report:0 field:purchase.report,month:0
@ -891,7 +891,7 @@ msgstr "شهر"
#. module: purchase
#: model:email.template,subject:purchase.email_template_edi_purchase
msgid "${object.company_id.name} Order (Ref ${object.name or 'n/a' })"
msgstr ""
msgstr "${object.company_id.name} أمر (Ref ${object.name or 'n/a' })"
#. module: purchase
#: report:purchase.quotation:0
@ -932,7 +932,7 @@ msgstr "ـكون هذه القائمة المختارة التي تم جمعها
#. module: purchase
#: view:stock.picking:0
msgid "Is a Back Order"
msgstr ""
msgstr "طلب عودة"
#. module: purchase
#: model:process.node,note:purchase.process_node_invoiceafterpacking0
@ -984,7 +984,7 @@ msgstr ""
#. module: purchase
#: selection:purchase.config.wizard,default_method:0
msgid "Pre-Generate Draft Invoices based on Purchase Orders"
msgstr ""
msgstr "قبل انشاء مسودة فاتورة على طلبات الشراء"
#. module: purchase
#: model:ir.actions.act_window,name:purchase.action_view_purchase_line_invoice
@ -1010,7 +1010,7 @@ msgstr "عرض النتيجة"
#. module: purchase
#: selection:purchase.config.wizard,default_method:0
msgid "Based on Purchase Order Lines"
msgstr ""
msgstr "اعتماداً على سطور طلب الشراء"
#. module: purchase
#: help:purchase.order,amount_untaxed:0
@ -1130,7 +1130,7 @@ msgstr "مرشحات مفصلة..."
#. module: purchase
#: view:purchase.config.wizard:0
msgid "Invoicing Control on Purchases"
msgstr ""
msgstr "التحكم في الفاتورة عند الشراء"
#. module: purchase
#: code:addons/purchase/wizard/purchase_order_group.py:48

View File

@ -50,6 +50,16 @@ class sale_order(osv.osv):
_inherit = ['mail.thread', 'ir.needaction_mixin']
_description = "Sales Order"
def onchange_shop_id(self, cr, uid, ids, shop_id, context=None):
v = {}
if shop_id:
shop = self.pool.get('sale.shop').browse(cr, uid, shop_id, context=context)
if shop.project_id.id:
v['project_id'] = shop.project_id.id
if shop.pricelist_id.id:
v['pricelist_id'] = shop.pricelist_id.id
return {'value': v}
def copy(self, cr, uid, id, default=None, context=None):
if not default:
default = {}
@ -783,6 +793,7 @@ class sale_order_line(osv.osv):
_('There is no Fiscal Position defined or Income category account defined for default properties of Product categories.'))
res = {
'name': line.name,
'sequence': line.sequence,
'origin': line.order_id.name,
'account_id': account_id,
'price_unit': pu,
@ -900,7 +911,6 @@ class sale_order_line(osv.osv):
fpos = fiscal_position and self.pool.get('account.fiscal.position').browse(cr, uid, fiscal_position) or False
if update_tax: #The quantity only have changed
result['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, product_obj.taxes_id)
result.update({'type': product_obj.procure_method})
if not flag:
result['name'] = self.pool.get('product.product').name_get(cr, uid, [product_obj.id], context=context_partner)[0][1]

View File

@ -181,7 +181,7 @@
</group>
<group>
<field name="date_order"/>
<field name="shop_id" invisible="1"/>
<field name="shop_id" groups="base.group_no_one" on_change="onchange_shop_id(shop_id, context)" widget="selection"/>
<field name="client_order_ref"/>
<field domain="[('type','=','sale')]" name="pricelist_id" groups="product.group_sale_pricelist" on_change="onchange_pricelist_id(pricelist_id,order_line)"/>
</group>
@ -200,7 +200,7 @@
<field name="product_id"
context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'shop':parent.shop_id, 'uom':product_uom}"
groups="base.group_user"
on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, True, parent.date_order, False, parent.fiscal_position, False, context)"/>
on_change="product_id_change(parent.pricelist_id, product_id, product_uom_qty, product_uom, product_uos_qty, product_uos, name, parent.partner_id, False, True, parent.date_order, False, parent.fiscal_position, False, context)"/>
<label for="product_uom_qty"/>
<div>
<field

View File

@ -5,10 +5,12 @@
partner_id: base.res_partner_2
note: Invoice after delivery
payment_term: account.account_payment_term
order_line:
- product_id: product.product_product_7
product_uom_qty: 8
-
!record {model: sale.order.line, id: line}:
name : 'LCD Monitor'
order_id: sale_order_test1
product_id: product.product_product_7
price_unit: 190.50
product_uom_qty: 8
I verify that the onchange was correctly triggered
-
!assert {model: sale.order, id: sale.sale_order_test1, string: The onchange function of product was not correctly triggered}:
- order_line[0].name == u'[LCD17] 17\u201d LCD Monitor'
- order_line[0].price_unit == 1350.0

View File

@ -39,4 +39,14 @@ class sale_order_line(osv.osv):
sale_order_line()
class sale_order(osv.osv):
_inherit = "sale.order"
def onchange_shop_id(self, cr, uid, ids, shop_id, context=None):
# Remove the project_id from the result of super() call, if any, as this field is not in the view anymore
res = super(sale_order, self).onchange_shop_id(cr, uid, ids, shop_id, context=context)
if res.get('value',{}).get('project_id'):
del(res['value']['project_id'])
return res
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -117,26 +117,13 @@
proc_ids = self.search(cr, uid, [('origin','=',so.name) and ('state','=','running')])
assert proc_ids, _('Procurement is not in the running state!')
-
I verify that a manufacturing order has been generated
I verify that a manufacturing order has been generated, and that its name and reference are correct
-
!python {model: sale.order}: |
mnf_obj = self.pool.get('mrp.production')
so = self.browse(cr, uid, ref("sale_order_so0"))
mnf_obj=self.pool.get('mrp.production')
mnf_id=mnf_obj.search(cr, uid, [('origin','=',so.name)])
mnf_id = mnf_obj.search(cr, uid, [('origin','=',so.name)])
assert mnf_id, _('Manufacturing order has not been generated')
-
I verify that a 'Sale Name' field of Manufacturing order gets bind with the value
-
!python {model: sale.order}: |
so = self.browse(cr, uid, ref("sale_order_so0"))
mnf_obj=self.pool.get('mrp.production')
mnf_id=mnf_obj.search(cr, uid, [('sale_name','=',so.name)])
assert mnf_id, _('Sale Name is not bind with the value')
-
I verify that a 'Sale Reference' field of Manufacturing order gets bind with the value
-
!python {model: sale.order}: |
so = self.browse(cr, uid, ref("sale_order_so0"))
mnf_obj=self.pool.get('mrp.production')
mnf_id=mnf_obj.search(cr, uid, [('sale_ref','=',so.client_order_ref)])
assert mnf_id, _('Sale Reference is not bind with the value')
mo = mnf_obj.browse(cr, uid, mnf_id)[0]
assert mo.sale_name == so.name, 'Wrong Name for the Manufacturing Order. Expected %s, Got %s' % (so.name, mo.name)
assert mo.sale_ref == so.client_order_ref, 'Wrong Sale Reference for the Manufacturing Order'

View File

@ -61,6 +61,7 @@ You can choose flexible invoicing methods:
'test': ['test/cancel_order_sale_stock.yml',
'test/picking_order_policy.yml',
'test/prepaid_order_policy.yml',
'test/sale_order_onchange.yml',
],
'installable': True,
'auto_install': True,

View File

@ -165,16 +165,6 @@ class sale_order(osv.osv):
return osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
def onchange_shop_id(self, cr, uid, ids, shop_id):
v = {}
if shop_id:
shop = self.pool.get('sale.shop').browse(cr, uid, shop_id)
v['project_id'] = shop.project_id.id
# Que faire si le client a une pricelist a lui ?
if shop.pricelist_id.id:
v['pricelist_id'] = shop.pricelist_id.id
return {'value': v}
def action_view_delivery(self, cr, uid, ids, context=None):
'''
This function returns an action that display existing delivery orders of given sale order ids. It can either be a in a list or in a form view, if there is only one delivery order to show.
@ -604,14 +594,18 @@ class sale_order_line(osv.osv):
lang=lang, update_tax=update_tax, date_order=date_order, packaging=packaging, fiscal_position=fiscal_position, flag=flag, context=context)
if not product:
return {'value': {'th_weight': 0, 'product_packaging': False,
'product_uos_qty': qty}, 'domain': {'product_uom': [],
'product_uos': []}}
res['value'].update({'product_packaging': False})
return res
#update of result obtained in super function
res_packing = self.product_packaging_change(cr, uid, ids, pricelist, product, qty, uom, partner_id, packaging, context=context)
res['value'].update(res_packing.get('value', {}))
warning_msgs = res_packing.get('warning') and res_packing['warning']['message'] or ''
product_obj = product_obj.browse(cr, uid, product, context=context)
res['value']['delay'] = (product_obj.sale_delay or 0.0)
res['value']['type'] = product_obj.procure_method
#check if product is available, and if not: raise an error
uom2 = False
if uom:
uom2 = product_uom_obj.browse(cr, uid, uom)
@ -619,7 +613,6 @@ class sale_order_line(osv.osv):
uom = False
if not uom2:
uom2 = product_obj.uom_id
compare_qty = float_compare(product_obj.virtual_available * uom2.factor, qty * product_obj.uom_id.factor, precision_rounding=product_obj.uom_id.rounding)
if (product_obj.type=='product') and int(compare_qty) == -1 \
and (product_obj.procure_method=='make_to_stock'):
@ -628,7 +621,8 @@ class sale_order_line(osv.osv):
max(0,product_obj.virtual_available), product_obj.uom_id.name,
max(0,product_obj.qty_available), product_obj.uom_id.name)
warning_msgs += _("Not enough stock ! : ") + warn_msg + "\n\n"
# get unit price
#update of warning messages
if warning_msgs:
warning = {
'title': _('Configuration Error!'),

View File

@ -1,7 +1,7 @@
<?xml version="1.0"?>
<openerp>
<data>
<record id="view_sale_shop_form_inherit" model="ir.ui.view">
<field name="name">sale.shop.inherit.form</field>
<field name="model">sale.shop</field>
@ -13,7 +13,7 @@
</xpath>
</field>
</record>
<record id="view_shop_tree_inherit" model="ir.ui.view">
<field name="name">sale.shop.sale.stock</field>
<field name="model">sale.shop</field>
@ -41,7 +41,8 @@
</xpath>
<xpath expr="//button[@name='action_view_invoice']" position="after">
<button name="action_view_delivery" string="View Delivery Order" type="object" class="oe_highlight"
attrs="{'invisible': ['|','|','|',('picking_ids','=',False),('picking_ids','=',[]), ('state', 'not in', ('progress','manual')),('shipped','=',True)]}"/> </xpath>
attrs="{'invisible': ['|','|','|',('picking_ids','=',False),('picking_ids','=',[]), ('state', 'not in', ('progress','manual')),('shipped','=',True)]}"/>
</xpath>
<xpath expr="//button[@name='action_cancel']" position="after">
<button name="ship_cancel" states="shipping_except" string="Cancel"/>
</xpath>

View File

@ -0,0 +1,22 @@
-
In order to test the onchange of the Sale Order, I create a product
-
!record {model: product.product, id: product_onchange1}:
name: 'Devil Worship Book'
list_price: 66.6
procure_method: 'make_to_order'
-
Now i create a sale order that uses my new product
-
!record {model: sale.order, id: sale_order_onchange1}:
partner_id: base.res_partner_2
order_line:
- product_id: sale_stock.product_onchange1
product_uom_qty: 10
-
I verify that the onchange of product on sale order line was correctly triggered
-
!assert {model: sale.order, id: sale_order_onchange1, string: The onchange function of product was not correctly triggered}:
- order_line[0].name == u'Devil Worship Book'
- order_line[0].price_unit == 66.6
- order_line[0].type == 'make_to_order'

View File

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
"PO-Revision-Date: 2012-01-13 21:14+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2012-10-08 15:06+0000\n"
"Last-Translator: almodhesh <Unknown>\n"
"Language-Team: Arabic <ar@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-08-28 06:34+0000\n"
"X-Generator: Launchpad (build 15864)\n"
"X-Launchpad-Export-Date: 2012-10-09 04:51+0000\n"
"X-Generator: Launchpad (build 16112)\n"
#. module: share
#: field:share.wizard,embed_option_title:0
@ -25,7 +25,7 @@ msgstr "عرض العنوان"
#. module: share
#: view:share.wizard:0
msgid "Access granted!"
msgstr ""
msgstr "منح الوصول!"
#. module: share
#: field:share.wizard,user_type:0
@ -50,13 +50,15 @@ msgstr "مشاركة"
#. module: share
#: field:share.wizard,share_root_url:0
msgid "Share Access URL"
msgstr ""
msgstr "مشاركة الوصول URL"
#. module: share
#: code:addons/share/wizard/share_wizard.py:782
#, python-format
msgid "You may use your current login (%s) and password to view them.\n"
msgstr ""
"يمكنك استخدام معلومات تسجيل الدخول الخاصة بك الحالية(%s) وكلمة المرور "
"لعرضها.\n"
#. module: share
#: code:addons/share/wizard/share_wizard.py:601
@ -83,24 +85,25 @@ msgstr ""
#. module: share
#: field:share.wizard,embed_url:0 field:share.wizard.result.line,share_url:0
msgid "Share URL"
msgstr ""
msgstr "مشاركة URL"
#. module: share
#: code:addons/share/wizard/share_wizard.py:776
#, python-format
msgid "These are your credentials to access this protected area:\n"
msgstr ""
msgstr "هذا هو اعتمادك للوصول إلى هذه المناطق المحمية\n"
#. module: share
#: code:addons/share/wizard/share_wizard.py:643
#, python-format
msgid "You must be a member of the Share/User group to use the share wizard"
msgstr ""
"يجب أن تكون عضوا في المجموعة مشاركة / المستخدم لاستخدام مشاركة صندوق الحوار"
#. module: share
#: view:share.wizard:0
msgid "Access info"
msgstr ""
msgstr "معلومات الولوج"
#. module: share
#: view:share.wizard:0
@ -111,12 +114,12 @@ msgstr "حصة"
#: code:addons/share/wizard/share_wizard.py:551
#, python-format
msgid "(Duplicated for modified sharing permissions)"
msgstr ""
msgstr "(تكرار للحصول على أذونات مشاركة تعديل)"
#. module: share
#: help:share.wizard,domain:0
msgid "Optional domain for further data filtering"
msgstr ""
msgstr "المجال اختياري لمزيد من بيانات التصفية"
#. module: share
#: sql_constraint:res.users:0
@ -159,7 +162,7 @@ msgstr "إغلاق"
#: code:addons/share/wizard/share_wizard.py:640
#, python-format
msgid "Action and Access Mode are required to create a shared access"
msgstr ""
msgstr "نمط الإجراء والوصول لإنشاء مشاركة الوصول"
#. module: share
#: view:share.wizard:0
@ -167,6 +170,7 @@ msgid ""
"Please select the action that opens the screen containing the data you want "
"to share."
msgstr ""
"الرجاء اختيار الإجراء الذي يفتح شاشة تحتوي على البيانات التي تريد مشاركتها."
#. module: share
#: code:addons/share/wizard/share_wizard.py:781
@ -174,7 +178,7 @@ msgstr ""
msgid ""
"The documents have been automatically added to your current OpenERP "
"documents.\n"
msgstr ""
msgstr "المستندات تمت إضافتها بشكل تلقائي لمستندات اوبن اي ار بي الخاصة بك\n"
#. module: share
#: view:share.wizard:0
@ -184,7 +188,7 @@ msgstr "إلغاء"
#. module: share
#: field:res.groups,share:0
msgid "Share Group"
msgstr ""
msgstr "مشاركة المجموعة"
#. module: share
#: code:addons/share/wizard/share_wizard.py:763
@ -197,12 +201,12 @@ msgstr "لا بدّ من ذكر عنوان بريد إلكتروني"
msgid ""
"Optionally, you may specify an additional domain restriction that will be "
"applied to the shared data."
msgstr ""
msgstr "اختيارياً، اختيار محدودية مجال لتطبيقها على المعلومات المشاركة."
#. module: share
#: help:share.wizard,name:0
msgid "Title for the share (displayed to users as menu and shortcut name)"
msgstr ""
msgstr "عنوان المشاركة (تعرض للمستخدمين كقائمة واسم مختصر)"
#. module: share
#: view:share.wizard:0
@ -212,7 +216,7 @@ msgstr "خيارات"
#. module: share
#: view:res.groups:0
msgid "Regular groups only (no share groups"
msgstr ""
msgstr "المجموعات المنتظمة فقط( لا مجموعات مشاركة)"
#. module: share
#: code:addons/share/wizard/share_wizard.py:787
@ -222,27 +226,32 @@ msgid ""
"Sales, HR, etc.)\n"
"It is open source and can be found on http://www.openerp.com."
msgstr ""
"OpenERP هي قوية ومجموعة من تطبيقات الأعمال سهل الاستعمال(إدارة علاقات "
"العملاء,المبيعات, موارد بشرية, الخ.)\n"
"هي مفتوحة المصدر ويمكنك الوصول إليها عن طريق هذا الرابط "
"http://www.openerp.com."
#. module: share
#: field:share.wizard,action_id:0
msgid "Action to share"
msgstr ""
msgstr "إجراء للمشاركة"
#. module: share
#: view:share.wizard:0
msgid "Optional: include a personal message"
msgstr ""
msgstr "اختياري: تضمين رسالة خاصة"
#. module: share
#: field:res.users,share:0
msgid "Share User"
msgstr ""
msgstr "مشاركة المستخدم"
#. module: share
#: code:addons/share/wizard/share_wizard.py:647
#, python-format
msgid "Please indicate the emails of the persons to share with, one per line"
msgstr ""
"يرجى الإشارة إلى رسائل البريد الإلكتروني للأشخاص للمشاركة معه، واحد في كل سطر"
#. module: share
#: field:share.wizard,embed_code:0 field:share.wizard.result.line,user_id:0
@ -252,13 +261,13 @@ msgstr "مجهول"
#. module: share
#: help:res.groups,share:0
msgid "Group created to set access rights for sharing data with some users."
msgstr ""
msgstr "إنشاء مجموعة لتعيين حقوق الوصول لتبادل البيانات مع بعض المستخدمين."
#. module: share
#: help:share.wizard,action_id:0
msgid ""
"The action that opens the screen containing the data you wish to share."
msgstr ""
msgstr "الإجراء الذي يفتح شاشة تحتوي على البيانات التي ترغب في مشاركتها."
#. module: share
#: constraint:res.users:0
@ -270,12 +279,12 @@ msgstr ""
#: code:addons/share/wizard/share_wizard.py:526
#, python-format
msgid "(Copy for sharing)"
msgstr ""
msgstr "(نسخة من المشاركة)"
#. module: share
#: field:share.wizard.result.line,newly_created:0
msgid "Newly created"
msgstr ""
msgstr "منشأة حديثاً"
#. module: share
#: code:addons/share/wizard/share_wizard.py:616
@ -292,7 +301,7 @@ msgstr ""
#. module: share
#: help:share.wizard,share_root_url:0
msgid "Main access page for users that are granted shared access"
msgstr ""
msgstr "صفحة الوصول الرئيسية للمستخدمين لضمان مشاركة الوصول"
#. module: share
#: sql_constraint:res.groups:0
@ -343,12 +352,12 @@ msgstr "ملخّص"
#: code:addons/share/wizard/share_wizard.py:493
#, python-format
msgid "Copied access for sharing"
msgstr ""
msgstr "نسخ الوصول للمشاركة"
#. module: share
#: model:ir.actions.act_window,name:share.action_share_wizard_step1
msgid "Share your documents"
msgstr ""
msgstr "مشاركة المستندات الخاصة بك"
#. module: share
#: view:share.wizard:0
@ -370,22 +379,22 @@ msgstr "share.wizard.result.line"
#. module: share
#: help:share.wizard,user_type:0
msgid "Select the type of user(s) you would like to share data with."
msgstr ""
msgstr "استخدم نوع المستخدم الذي تود مشاركة المعلومات معه"
#. module: share
#: field:share.wizard,view_type:0
msgid "Current View Type"
msgstr ""
msgstr "نوع عرض الحالي"
#. module: share
#: selection:share.wizard,access_mode:0
msgid "Can view"
msgstr ""
msgstr "امكانية المشاهدة"
#. module: share
#: selection:share.wizard,access_mode:0
msgid "Can edit"
msgstr ""
msgstr "امكانية التعديل"
#. module: share
#: help:share.wizard,message:0
@ -528,3 +537,10 @@ msgstr "مشاركة مع..."
#~ msgid "Share with these people (one e-mail per line)"
#~ msgstr "المشاركة مع هؤلاء الناس (بريد إلكتروني واحد في كل سطر)"
#~ msgid ""
#~ "An optional personal message, to be included in the e-mail notification."
#~ msgstr "رسالة اختيارية شخصية، ليتم تضمينها في اخطار البريد الإلكتروني."
#~ msgid "Use this link"
#~ msgstr "استخدم هذا الرابط"

View File

@ -1125,7 +1125,8 @@
<field name="date_deadline"/>
<field name="survey_id"/>
<field name="user_id" on_change="on_change_user(user_id)"/>
<field name="response" readonly="1"/>
<field name="email"/>
<field name="response" readonly="1"/>
</group>
</sheet>
</form>
@ -1139,6 +1140,7 @@
<tree string="Evaluation Plan Phase" colors="red:date_deadline&lt;current_date">
<field name="date_deadline"/>
<field name="user_id"/>
<field name="email"/>
<field name="survey_id"/>
<field name="response" />
<field name="state" />