bzr revid: vir@tinyerp.com-20100716050854-ts13nuumojs01fkm
This commit is contained in:
Vir (Open ERP)
2010-07-16 10:38:54 +05:30
111 changed files with 1387 additions and 1004 deletions
+1
View File
@@ -127,6 +127,7 @@ module named account_vouchers
'board_account_demo.xml',
],
'test': [
'test/account_sequence_test.yml',
'test/account_customer_invoice.yml',
'test/account_supplier_invoice.yml',
'test/account_change_currency.yml',
+9
View File
@@ -2684,6 +2684,15 @@ class wizard_multi_charts_accounts(osv.osv_memory):
'position_id' : new_fp,
}
obj_ac_fp.create(cr, uid, vals_acc)
#fially inactive the demo chart of accounts
data_id = data_pool.search(cr, uid, [('model','=','account.account'), ('name','=','chart0')])
if data_id:
data = data_pool.browse(cr, uid, data_id[0])
account_id = data.res_id
if account_id:
cr.execute("update account_account set active='f' where id=%s" % (account_id))
wizard_multi_charts_accounts()
class account_bank_accounts_wizard(osv.osv_memory):
+3 -2
View File
@@ -25,6 +25,7 @@ from osv import fields, osv
from tools.misc import currency
from tools.translate import _
import decimal_precision as dp
class account_bank_statement(osv.osv):
@@ -130,9 +131,9 @@ class account_bank_statement(osv.osv):
states={'confirm': [('readonly', True)]}, domain=[('type', '=', 'cash')]),
'period_id': fields.many2one('account.period', 'Period', required=True,
states={'confirm':[('readonly', True)]}),
'balance_start': fields.float('Starting Balance', digits=(16,2),
'balance_start': fields.float('Starting Balance', digits_compute=dp.get_precision('Account'),
states={'confirm':[('readonly',True)]}),
'balance_end_real': fields.float('Ending Balance', digits=(16,2),
'balance_end_real': fields.float('Ending Balance', digits_compute=dp.get_precision('Account'),
states={'confirm':[('readonly', True)]}),
'balance_end': fields.function(_end_balance, method=True, string='Balance'),
'line_ids': fields.one2many('account.bank.statement.line',
+4 -3
View File
@@ -25,6 +25,7 @@ import time
from mx import DateTime
from decimal import Decimal
from tools.translate import _
import decimal_precision as dp
class account_cashbox_line(osv.osv):
@@ -55,9 +56,9 @@ class account_cashbox_line(osv.osv):
return {'value':{'subtotal': sub or 0.0}}
_columns = {
'pieces': fields.float('Values', digits=(16,2)),
'pieces': fields.float('Values', digits_compute=dp.get_precision('Account')),
'number': fields.integer('Number'),
'subtotal': fields.function(_sub_total, method=True, string='Sub Total', type='float',digits=(16,2)),
'subtotal': fields.function(_sub_total, method=True, string='Sub Total', type='float', digits_compute=dp.get_precision('Account')),
'starting_id': fields.many2one('account.bank.statement',ondelete='cascade'),
'ending_id': fields.many2one('account.bank.statement',ondelete='cascade'),
}
@@ -176,7 +177,7 @@ class account_cash_statement(osv.osv):
_columns = {
'company_id':fields.many2one('res.company', 'Company', required=False),
'journal_id': fields.many2one('account.journal', 'Journal', required=True),
'balance_end_real': fields.float('Closing Balance', digits=(16,2), states={'confirm':[('readonly', True)]}, help="closing balance entered by the cashbox verifier"),
'balance_end_real': fields.float('Closing Balance', digits_compute=dp.get_precision('Account'), states={'confirm':[('readonly', True)]}, help="closing balance entered by the cashbox verifier"),
'state': fields.selection(
[('draft', 'Draft'),
('confirm', 'Confirm'),
+4 -4
View File
@@ -201,13 +201,13 @@
<field name="amount_total"/>
<field name="state"/>
<field name="residual"/>
<group col="3" colspan="4">
<group col="4" colspan="4">
<button name="invoice_open" states="draft,proforma2" string="Approve" icon="terp-camera_test"/>
<button name="%(action_account_invoice_refund)d" type='action' string='Credit Note' states='open,paid' icon="gtk-execute"/>
<button name="%(action_account_invoice_pay)d" type='action' string='Pay Invoice' states='open' icon="gtk-ok"/>
<button name="invoice_cancel" states="draft,proforma2,sale,open" string="Cancel" icon="terp-gtk-stop"/>
<button name="action_cancel_draft" states="cancel" string="Set to Draft" type="object" icon="terp-stock_effects-object-colorize"/>
<button name="%(action_account_state_open)d" type='action' string='Re-Open' states='paid' icon="gtk-convert"/>
<button name="%(action_account_invoice_refund)d" type='action' string='Credit Note' states='paid' icon="terp-dolar"/>
</group>
</group>
</page>
@@ -295,14 +295,14 @@
<field name="amount_total"/>
<field name="state"/>
<field name="residual"/>
<group col="4" colspan="4" groups="base.group_user">
<group col="6" colspan="4" groups="base.group_user">
<button name="invoice_proforma2" states="draft" string="PRO-FORMA" icon="terp-check"/>
<button name="invoice_open" states="draft,proforma2" string="Create" icon="terp-document-new"/>
<button name="%(action_account_invoice_refund)d" type='action' string='Credit Note' states='open,paid' icon="gtk-execute"/>
<button name="%(action_account_invoice_pay)d" type='action' string='Pay Invoice' states='open' icon="gtk-ok"/>
<button name="invoice_cancel" states="draft,proforma2,sale,open" string="Cancel" icon="gtk-cancel"/>
<button name="action_cancel_draft" states="cancel" string="Set to Draft" type="object" icon="terp-stock_effects-object-colorize"/>
<button name='%(action_account_state_open)d' type='action' string='Re-Open' states='paid' icon="gtk-convert"/>
<button name="%(action_account_invoice_refund)d" type='action' string='Credit Note' states='paid' icon="gtk-execute"/>
</group>
</group>
</page>
+8 -7
View File
@@ -196,7 +196,7 @@
</search>
</field>
</record>
<record id="view_account_list" model="ir.ui.view">
<field name="name">account.account.list</field>
<field name="model">account.account</field>
@@ -206,6 +206,7 @@
<tree string="Chart of accounts" toolbar="1" colors="blue:type in ('view');black:type not in ('view')">
<field name="code"/>
<field name="name"/>
<field name="parent_id" invisible="1"/>
<field name="user_type" invisible="1"/>
<field name="debit"/>
<field name="credit"/>
@@ -365,7 +366,7 @@
<field name="view_id" widget="selection"/>
</group>
</group>
<group colspan="2" col="2">
<separator string="Company" colspan="4"/>
<field name="company_id" groups="base.group_multi_company"/>
@@ -1213,13 +1214,13 @@
<field name="search_view_id" ref="view_account_move_filter"/>
<field name="domain">[('to_check','=',True), ('state','=','draft')]</field>
</record>
<menuitem
action="action_move_to_review"
id="menu_action_move_to_review"
<menuitem
action="action_move_to_review"
id="menu_action_move_to_review"
parent="periodical_processing_journal_entries_validation"
/>
<!-- <menuitem id="next_id_29" name="Search Entries" parent="account.menu_finance_entries" sequence="40"/>-->
<!-- <menuitem action="action_move_line_form" id="menu_action_move_line_form" parent="next_id_29"/>-->
+8 -4
View File
@@ -27,15 +27,19 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Account Board">
<hpaned>
<vpaned>
<child1>
<action colspan="4" height="160" name="%(account.action_invoice_tree1)d" string="Draft Customer Invoices" domain="[('state','=','draft'),('type','=','out_invoice')]"/>
</child1>
<child2>
<action colspan="4" height="220" name="%(action_aged_receivable)d" string="Aged receivables"/>
<action colspan="4" height="220" name="%(action_aged_income)d" string="Aged income"/>
<group col="2" colspan="2" expand="1">
<action colspan="4" name="%(action_aged_receivable)d" string="Aged receivables"/>
</group>
<group col="2" colspan="2">
<action colspan="4" height="220" name="%(action_aged_income)d" string="Aged income"/>
</group>
</child2>
</hpaned>
</vpaned>
</form>
</field>
</record>
+6 -6
View File
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.6\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-07-13 03:12+0000\n"
"PO-Revision-Date: 2010-07-16 01:13+0000\n"
"Last-Translator: Black Jack <onetimespeed@hotmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-07-14 03:37+0000\n"
"X-Launchpad-Export-Date: 2010-07-16 03:39+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account
@@ -1182,7 +1182,7 @@ msgstr "银行收据"
#. module: account
#: view:res.partner:0
msgid "Bank account"
msgstr "银行账号"
msgstr "银行帐号"
#. module: account
#: field:account.chart.template,tax_template_ids:0
@@ -4555,7 +4555,7 @@ msgstr "辅助核算项统计"
msgid ""
"This will automatically configure your chart of accounts, bank accounts, "
"taxes and journals according to the selected template"
msgstr "将根据选择的模板自动设置你的科目一览表、银行帐号、税和记录集合"
msgstr "将根据选择的模板自动设置你的科目一览表、银行科目、税和记录集合"
#. module: account
#: view:account.bank.statement:0
@@ -5463,7 +5463,7 @@ msgstr "科目.税.模板"
#. module: account
#: field:wizard.multi.charts.accounts,bank_accounts_id:0
msgid "Bank Accounts"
msgstr "银行帐号"
msgstr "银行科目"
#. module: account
#: constraint:account.period:0
@@ -5739,7 +5739,7 @@ msgstr "打印记录集合 -"
#: field:account.chart.template,bank_account_view_id:0
#: field:account.invoice,partner_bank:0
msgid "Bank Account"
msgstr "银行帐号"
msgstr "银行科目"
#. module: account
#: model:ir.actions.act_window,name:account.action_model_form
+13 -5
View File
@@ -924,12 +924,20 @@ class account_invoice(osv.osv):
move_id = obj_inv.move_id and obj_inv.move_id.id or False
reference = obj_inv.reference
if not number:
if obj_inv.journal_id.invoice_sequence_id:
sid = obj_inv.journal_id.invoice_sequence_id.id
number = self.pool.get('ir.sequence').get_id(cr, uid, sid, 'id', {'fiscalyear_id': obj_inv.period_id.fiscalyear_id.id})
tmp_context = {
'fiscalyear_id': inv.period_id.fiscalyear_id.id
}
if inv.journal_id.invoice_sequence_id:
sequence_id = inv.journal_id.invoice_sequence_id.id
number = self.pool.get('ir.sequence').get_id(cr, uid,
sequence_id,
'id',
context=tmp_context)
else:
number = self.pool.get('ir.sequence').get(cr, uid,
'account.invoice.' + invtype)
number = self.pool.get('ir.sequence').get_id(cr, uid,
'account.invoice.%s' % invtype,
'code',
context=tmp_context)
if invtype in ('in_invoice', 'in_refund'):
ref = reference
else:
+25 -13
View File
@@ -19,19 +19,23 @@
#
##############################################################################
from osv import fields,osv
from osv import fields, osv
class ir_sequence_fiscalyear(osv.osv):
_name = 'account.sequence.fiscalyear'
_rec_name = "sequence_main_id"
_columns = {
"sequence_id": fields.many2one("ir.sequence", 'Sequence', required=True, ondelete='cascade'),
"sequence_main_id": fields.many2one("ir.sequence", 'Main Sequence', required=True, ondelete='cascade'),
"fiscalyear_id": fields.many2one('account.fiscalyear', 'Fiscal Year', required=True, ondelete='cascade')
"sequence_id": fields.many2one("ir.sequence", 'Sequence', required=True,
ondelete='cascade'),
"sequence_main_id": fields.many2one("ir.sequence", 'Main Sequence',
required=True, ondelete='cascade'),
"fiscalyear_id": fields.many2one('account.fiscalyear', 'Fiscal Year',
required=True, ondelete='cascade')
}
_sql_constraints = [
('main_id', 'CHECK (sequence_main_id != sequence_id)', 'Main Sequence must be different from current !'),
('main_id', 'CHECK (sequence_main_id != sequence_id)',
'Main Sequence must be different from current !'),
]
ir_sequence_fiscalyear()
@@ -39,17 +43,25 @@ ir_sequence_fiscalyear()
class ir_sequence(osv.osv):
_inherit = 'ir.sequence'
_columns = {
'fiscal_ids' : fields.one2many('account.sequence.fiscalyear', 'sequence_main_id', 'Sequences')
'fiscal_ids' : fields.one2many('account.sequence.fiscalyear',
'sequence_main_id', 'Sequences')
}
def get_id(self, cr, uid, sequence_id, test='id', context={}):
cr.execute('select id from ir_sequence where '+test+'=%s and active=%s', (sequence_id, True,))
def get_id(self, cr, uid, sequence_id, test='id', context=None):
if context is None:
context = {}
cr.execute('select id from ir_sequence where '
+ test + '=%s and active=%s', (sequence_id, True,))
res = cr.dictfetchone()
if res:
for line in self.browse(cr, uid, res['id'], context=context).fiscal_ids:
if line.fiscalyear_id.id==context.get('fiscalyear_id', False):
return super(ir_sequence, self).get_id(cr, uid, line.sequence_id.id, test="id", context=context)
return super(ir_sequence, self).get_id(cr, uid, sequence_id, test, context)
for line in self.browse(cr, uid, res['id'],
context=context).fiscal_ids:
if line.fiscalyear_id.id == context.get('fiscalyear_id', False):
return super(ir_sequence, self).get_id(cr, uid,
line.sequence_id.id,
test="id",
context=context)
return super(ir_sequence, self).get_id(cr, uid, sequence_id, test,
context=context)
ir_sequence()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+4
View File
@@ -14,6 +14,10 @@
<field name="fiscalyear_id"/>
<field name="sequence_id"/>
</tree>
<form string="Fiscal Year Sequence">
<field name="fiscalyear_id"/>
<field name="sequence_id"/>
</form>
</field>
</page>
</page>
@@ -0,0 +1,45 @@
- In order to test the invoice numbering, I create a sequence for out invoices.
- !record {model: ir.sequence, id: seq_out_invoice_test}:
name: Account Invoice Out for the demonstration Fiscal Year # XXX indicate the name of the fiscal year
code: account.invoice.out_invoice
padding: 3
prefix: FY-
suffix: -TEST
number_next: 42
- I link the new sequence to the demo sequence and the demo fiscal years.
- !record {model: account.sequence.fiscalyear, id: seq_out_invoice_test_fy}:
sequence_id: seq_out_invoice_test
sequence_main_id: seq_out_invoice
fiscalyear_id: data_fiscalyear
- I create a draft customer invoice in a period of the demo fiscal year
- !record {model: account.invoice, id: invoice_seq_test}:
account_id: account.a_recv
address_contact_id: base.res_partner_address_zen
address_invoice_id: base.res_partner_address_zen
company_id: base.main_company
currency_id: base.EUR
invoice_line:
- account_id: account.a_sale
name: '[PC3] Medium PC'
price_unit: 900.0
quantity: 10.0
product_id: product.product_product_pc3
uos_id: product.product_uom_unit
journal_id: account.sales_journal
partner_id: base.res_partner_3
reference_type: none
period_id: period_1
- I create the invoice, as is I clicked on the "Create" button
- !workflow {model: account.invoice, action: invoice_open, ref: invoice_seq_test}
- I check that the invoice state is "Open"
- !assert {model: account.invoice, id: invoice_seq_test}:
- state == 'open'
- I check that the invoice got the right number using our sequence
# This used to fail because of bug #602188
- !assert {model: account.invoice, id: invoice_seq_test}:
- number == 'FY-042-TEST'
@@ -38,10 +38,11 @@ class account_journal_select(osv.osv_memory):
id = mod_obj.read(cr, uid, [result], ['res_id'])[0]['res_id']
result = act_obj.read(cr, uid, [id])[0]
cr.execute('select journal_id, period_id from account_journal_period where id=%s', (context['active_id'],))
journal_id, period_id = cr.fetchone()
result['domain'] = str([('journal_id', '=', journal_id), ('period_id', '=', period_id)])
result['context'] = str({'journal_id': journal_id, 'period_id': period_id})
res = cr.fetchone()
if res:
journal_id, period_id = res
result['domain'] = str([('journal_id', '=', journal_id), ('period_id', '=', period_id)])
result['context'] = str({'journal_id': journal_id, 'period_id': period_id})
return result
+1 -1
View File
@@ -68,7 +68,7 @@ class account_pl_report(osv.osv_memory):
'fiscalyear' : False,
'display_account': 'bal_all',
'display_type': True,
}
}
def next_view(self, cr, uid, ids, context=None):
obj_model = self.pool.get('ir.model.data')
@@ -55,6 +55,8 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Select Chart">
<label string="Select account chart to print profit and loss account report" colspan="4"/>
<separator colspan="4"/>
<field name="Account_list"/>
<separator colspan="4"/>
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
@@ -2,51 +2,51 @@
<openerp>
<data>
<!---->
<!-- <record id="view_account_print_journal" model="ir.ui.view">-->
<!-- <record id="view_account_print_journal" model="ir.ui.view">-->
<!-- <field name="name">Account Print Journal</field>-->
<!-- <field name="model">account.print.journal</field>-->
<!-- <field name="type">form</field>-->
<!-- <field name="arch" type="xml">-->
<!-- <form string="Print Journal">-->
<!-- <group col="4" colspan="6">-->
<!-- <field name="journal_id"/>-->
<!-- <field name="period_id"/>-->
<!-- <newline/>-->
<!-- <field name="sort_selection"/>-->
<!-- </group>-->
<!-- <separator colspan="4"/>-->
<!-- <group col="2" colspan="4">-->
<!-- <button special="cancel" string="Cancel" icon='gtk-cancel'/>-->
<!-- <button name="check_data" string="Print" colspan="1" type="object" icon="gtk-ok"/>-->
<!-- </group>-->
<!-- </form>-->
<!-- <form string="Print Journal">-->
<!-- <group col="4" colspan="6">-->
<!-- <field name="journal_id"/>-->
<!-- <field name="period_id"/>-->
<!-- <newline/>-->
<!-- <field name="sort_selection"/>-->
<!-- </group>-->
<!-- <separator colspan="4"/>-->
<!-- <group col="2" colspan="4">-->
<!-- <button special="cancel" string="Cancel" icon='gtk-cancel'/>-->
<!-- <button name="check_data" string="Print" colspan="1" type="object" icon="gtk-ok"/>-->
<!-- </group>-->
<!-- </form>-->
<!-- </field>-->
<!-- </record>-->
<record id="view_account_print_journal" model="ir.ui.view">
<record id="view_account_print_journal" model="ir.ui.view">
<field name="name">Account Print Journal</field>
<field name="model">account.print.journal</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Print Journal">
<group height="400" width="400">
<group>
<separator string="Journals"/><newline/>
<field name="journal_id" nolabel="1"/><newline/>
<separator string="Periods"/><newline/>
<field name="period_id" nolabel="1"/><newline/>
</group>
<newline/>
<group>
<field name="sort_selection"/>
<newline/>
<separator colspan="4"/>
<button special="cancel" string="Cancel" icon='gtk-cancel'/>
<button name="check_data" string="Print" colspan="1" type="object" icon="gtk-ok"/>
</group>
</group>
</form>
<form string="Print Journal">
<group height="430" width="420">
<group>
<separator string="Journals"/><newline/>
<field name="journal_id" nolabel="1"/><newline/>
<separator string="Periods"/><newline/>
<field name="period_id" nolabel="1"/><newline/>
</group>
<newline/>
<group>
<field name="sort_selection"/>
<newline/>
<separator colspan="4"/>
<button special="cancel" string="Cancel" icon='gtk-cancel'/>
<button name="check_data" string="Print" colspan="1" type="object" icon="gtk-ok"/>
</group>
</group>
</form>
</field>
</record>
@@ -59,12 +59,12 @@
<field name="target">new</field>
</record>
<menuitem
name="Journals"
parent="account.menu_generic_report"
action="action_account_print_journal"
id="menu_account_print_journal"
icon="STOCK_PRINT"/>
<menuitem
name="Journals"
parent="account.menu_generic_report"
action="action_account_print_journal"
id="menu_account_print_journal"
icon="STOCK_PRINT"/>
</data>
</openerp>
</data>
</openerp>
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.6\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-03-20 07:34+0000\n"
"PO-Revision-Date: 2010-07-15 17:26+0000\n"
"Last-Translator: Black Jack <onetimespeed@hotmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-06-22 04:16+0000\n"
"X-Launchpad-Export-Date: 2010-07-16 03:39+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: audittrail
@@ -35,7 +35,7 @@ msgstr "日志"
#. module: audittrail
#: selection:audittrail.rule,state:0
msgid "Subscribed"
msgstr "订阅"
msgstr "已订阅"
#. module: audittrail
#: view:audittrail.log:0
@@ -105,7 +105,7 @@ msgstr "资源ID"
#. module: audittrail
#: selection:audittrail.log,method:0
msgid "Write"
msgstr "写"
msgstr "写入"
#. module: audittrail
#: model:ir.ui.menu,name:audittrail.menu_action_audittrail
+1 -1
View File
@@ -45,7 +45,7 @@
'update_xml': [
'security/ir.model.access.csv',
'base_contact_view.xml',
# 'base_contact_installer_view.xml',
'base_contact_installer_view.xml',
'process/base_contact_process.xml'
],
'demo_xml': ['base_contact_demo.xml'],
+1 -1
View File
@@ -83,8 +83,8 @@ Create dashboard for CRM that includes:
'wizard/crm_opportunity_to_phonecall_view.xml',
'wizard/crm_partner_to_opportunity_view.xml',
'wizard/crm_forward_to_partner_view.xml',
'wizard/crm_send_email_view.xml',
'wizard/crm_forward_to_partner_view.xml',
'wizard/crm_custom_create_menu_view.xml',
'crm_view.xml',
+4 -6
View File
@@ -441,14 +441,13 @@ class crm_case_section(osv.osv):
_columns = {
'name': fields.char('Sales Team', size=64, required=True, translate=True),
'code': fields.char('Code', size=8),
'active': fields.boolean('Active', help="If the active field is set to \
true, it will allow you to hide the sales team without removing it."),
'active': fields.boolean('Active', help="If the active field is set to "\
"true, it will allow you to hide the sales team without removing it."),
'allow_unlink': fields.boolean('Allow Delete', help="Allows to delete non draft cases"),
'change_responsible': fields.boolean('Change Responsible', help="Thick this box if you want that on escalation, the responsible of this sale team automatically becomes responsible of the lead/opportunity escaladed"),
'user_id': fields.many2one('res.users', 'Responsible User'),
'member_ids':fields.many2many('res.users', 'sale_member_rel', 'section_id', 'member_id', 'Team Members'),
'reply_to': fields.char('Reply-To', size=64, help="The email address put \
in the 'Reply-To' of all emails sent by Open ERP about cases in this sales team"),
'reply_to': fields.char('Reply-To', size=64, help="The email address put in the 'Reply-To' of all emails sent by Open ERP about cases in this sales team"),
'parent_id': fields.many2one('crm.case.section', 'Parent Team'),
'child_ids': fields.one2many('crm.case.section', 'parent_id', 'Child Teams'),
'resource_calendar_id': fields.many2one('resource.calendar', "Resource's Calendar"),
@@ -586,8 +585,7 @@ class crm_case_stage(osv.osv):
_columns = {
'name': fields.char('Stage Name', size=64, required=True, translate=True),
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
'sequence': fields.integer('Sequence', help="Gives the sequence order \
when displaying a list of case stages."),
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of case stages."),
'object_id': fields.many2one('ir.model', 'Object Name'),
'probability': fields.float('Probability (%)', required=True),
'on_change': fields.boolean('Change Probability Automatically', \
+2 -3
View File
@@ -113,11 +113,10 @@ class crm_lead(osv.osv, crm_case):
'date_action_next': fields.datetime('Next Action', readonly=1),
'email_from': fields.char('Email', size=128, help="E-mail address of the contact"),
'section_id': fields.many2one('crm.case.section', 'Sales Team', \
select=True, help='Sales team to which this case belongs to.\
Defines responsible user and e-mail address for the mail gateway.'),
select=True, help='Sales team to which this case belongs to. Defines responsible user and e-mail address for the mail gateway.'),
'create_date': fields.datetime('Creation Date' , readonly=True),
'email_cc': fields.text('Watchers Emails', size=252 , help="These \
addresses will receive a copy of the future e-mail communication between partner \
addresses(Comma-separated) will receive a copy of the future e-mail communication between partner \
and users"),
'description': fields.text('Notes'),
'write_date': fields.datetime('Update Date' , readonly=True),
+1 -2
View File
@@ -51,8 +51,7 @@ class crm_meeting(osv.osv, crm_case):
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
domain="[('partner_id','=',partner_id)]", states={'done': [('readonly', True)]}),
'section_id': fields.many2one('crm.case.section', 'Sales Team', states={'done': [('readonly', True)]}, \
select=True, help='Sales team to which Case belongs to.\
Define Responsible user and Email account for mail gateway.'),
select=True, help='Sales team to which Case belongs to.'),
'email_from': fields.char('Email', size=128, states={'done': [('readonly', True)]}, help="These people will receive email."),
'id': fields.integer('ID'),
'create_date': fields.datetime('Creation Date' , readonly=True),
+1 -2
View File
@@ -41,8 +41,7 @@ class crm_phonecall(osv.osv, crm_case):
'date_action_next': fields.datetime('Next Action', readonly=1),
'create_date': fields.datetime('Creation Date' , readonly=True),
'section_id': fields.many2one('crm.case.section', 'Sales Team', \
select=True, help='Sales team to which Case belongs to.\
Define Responsible user and Email account for mail gateway.'),
select=True, help='Sales team to which Case belongs to.'),
'user_id': fields.many2one('res.users', 'Responsible'),
'partner_id': fields.many2one('res.partner', 'Partner'),
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
+38 -73
View File
@@ -21,9 +21,8 @@
##############################################################################
import base64
import itertools
import time
import re
from osv import osv, fields
import tools
from tools.translate import _
@@ -31,6 +30,7 @@ from tools.translate import _
class crm_lead_forward_to_partner(osv.osv_memory):
"""Forwards lead history"""
_name = 'crm.lead.forward.to.partner'
_inherit = "crm.send.mail"
_columns = {
'name': fields.selection([('user', 'User'), ('partner', 'Partner'), \
@@ -38,19 +38,12 @@ class crm_lead_forward_to_partner(osv.osv_memory):
'user_id': fields.many2one('res.users', "User"),
'partner_id' : fields.many2one('res.partner', 'Partner'),
'address_id' : fields.many2one('res.partner.address', 'Address'),
'email_from' : fields.char('From', required=True, size=128),
'email_to' : fields.char('To', required=True, size=128),
'subject' : fields.char('Subject', required=True, size=128),
'message' : fields.text('Message', required=True),
'history': fields.selection([('latest', 'Latest email'), ('whole', 'Whole Story'), ('info', 'Case Information')], 'Send history', required=True),
'add_cc': fields.boolean('Add as CC', required=False, help="Check this box if you want this address to be added in the CC list"\
" for this case, in order to receive all future conversations"),
'history': fields.selection([('info', 'Case Information'), ('latest', 'Latest email'), ('whole', 'Whole Story')], 'Send history', required=True),
}
_defaults = {
'name' : 'email',
'history': 'info',
'add_cc': True,
'history': 'latest',
'email_from': lambda self, cr, uid, *a: self.pool.get('res.users')._get_email_from(cr, uid, uid)[uid]
}
@@ -117,7 +110,7 @@ class crm_lead_forward_to_partner(osv.osv_memory):
res_id = context.get('active_id')
msg_val = self._get_case_history(cr, uid, history_type, res_id, context=context)
if msg_val:
res = {'value': {'message' : '\n\n' + msg_val}}
res = {'value': {'body' : '\n\n' + msg_val}}
return res
def _get_case_history(self, cr, uid, history_type, res_id, context=None):
@@ -125,22 +118,23 @@ class crm_lead_forward_to_partner(osv.osv_memory):
return
msg_val = ''
case_info = self.get_lead_details(cr, uid, res_id, context=context)
model_pool = self.pool.get('crm.lead')
if history_type == 'info':
msg_val = self.get_lead_details(cr, uid, res_id, context=context)
msg_val = case_info
elif history_type == 'whole':
log_ids = model_pool.browse(cr, uid, res_id, context=context).message_ids
log_ids = [x.id for x in log_ids]
if not log_ids:
raise osv.except_osv('Warning!', 'There is no history to send')
msg_val = self.get_whole_history(cr, uid, log_ids, context=context)
msg_val = case_info + '\n\n' + self.get_whole_history(cr, uid, log_ids, context=context)
elif history_type == 'latest':
log_ids = model_pool.browse(cr, uid, res_id, context=context).message_ids
if not log_ids:
raise osv.except_osv('Warning!', 'There is no history to send')
msg_val = self.get_latest_history(cr, uid, log_ids[0].id, context=context)
msg_val = case_info
else:
msg_val = case_info + '\n\n' + self.get_latest_history(cr, uid, log_ids[0].id, context=context)
return msg_val
@@ -170,69 +164,40 @@ class crm_lead_forward_to_partner(osv.osv_memory):
email = self.pool.get('res.partner.address').browse(cr, uid, address_id).email
return {'value': {'email_to' : email}}
def action_cancel(self, cr, uid, ids, context=None):
return {'type' : 'ir.actions.act_window_close'}
def action_forward(self, cr, uid, ids, context=None):
"""
Forward the lead to a partner
"""
if context is None:
context = {}
res_id = context.get('active_id', False)
model = context.get('active_model', False)
if not res_id or not model:
return {}
this = self.browse(cr, uid, ids[0], context=context)
case_pool = self.pool.get(model)
case_pool = self.pool.get(context.get('active_model'))
res_id = context and context.get('active_id', False) or False
case = case_pool.browse(cr, uid, res_id, context=context)
emails = [this.email_to]
body = case_pool.format_body(this.message)
email_from = this.email_from or False
context.update({'mail': 'forward'})
super(crm_lead_forward_to_partner, self).action_send(cr, uid, ids, context=context)
# extract attachements from case and emails according to mode
attachments = []
attach_pool = self.pool.get('ir.attachment')
direct_attachments = attach_pool.search(cr, uid, [('res_model', '=', 'crm.lead'), ('res_id', '=', res_id)], context=context)
attachments += attach_pool.browse(cr, uid, direct_attachments, context=context)
if this.history in ['latest', 'whole'] and case.message_ids:
msgs = case.message_ids
if this.history == 'latest':
msgs = msgs[:1]
attachments.extend(itertools.chain(*[m.attachment_ids for m in msgs]))
attach = [(a.datas_fname or a.name, base64.decodestring(a.datas)) for a in attachments if a.datas]
to_write = {'date_assign': time.strftime('%Y-%m-%d')}
if (this.name == 'partner' and this.partner_id):
to_write['partner_assigned_id'] = this.partner_id.id
result = tools.email_send(
email_from,
emails,
this.subject,
body,
openobject_id=str(case.id),
attach=attach,
reply_to=case.section_id.reply_to,
)
if result:
case_pool.history(cr, uid, [case], _('Forward'), history=True, email=this.email_to, subject=this.subject, details=body, email_from=email_from, attach=attach)
to_write = {'date_assign': time.strftime('%Y-%m-%d')}
if (this.name == 'partner' and this.partner_id):
to_write['partner_assigned_id'] = this.partner_id.id
case_pool.write(cr, uid, case.id, to_write)
else:
raise osv.except_osv(_('Error!'), _('Unable to send mail. Please check SMTP is configured properly.'))
if this.add_cc and (not case.email_cc or not this.email_to in case.email_cc):
case_pool.write(cr, uid, case.id, {'email_cc' : case.email_cc and case.email_cc + ', ' + this.email_to or this.email_to})
if this.name == 'user':
to_write.update({'user_id' : this.user_id.id})
email_re = r'([^ ,<@]+@[^> ,]+)'
email_cc = re.findall(email_re, case.email_cc or '')
new_cc = ''
for to in this.email_to.split(','):
email_to = re.findall(email_re, to)
email_to = email_to and email_to[0] or ''
if email_to not in email_cc:
new_cc += ', ' + to
to_write.update({'email_cc' : case.email_cc and case.email_cc + new_cc})
case_pool.write(cr, uid, case.id, to_write, context=context)
return {}
def get_lead_details(self, cr, uid, lead_id, context=None):
message = []
body = []
lead_proxy = self.pool.get('crm.lead')
lead = lead_proxy.browse(cr, uid, lead_id, context=context)
if not lead.type or lead.type == 'lead':
@@ -258,10 +223,10 @@ class crm_lead_forward_to_partner(osv.osv_memory):
else:
value = lead[field_name]
message.append("%s: %s" % (field_definition.string, value or ''))
body.append("%s: %s" % (field_definition.string, value or ''))
elif lead.type == 'opportunity':
pa = lead.partner_address_id
message = [
body = [
"Partner: %s" % (lead.partner_id.name_get()[0][1]),
"Contact: %s" % (pa.name or ''),
"Title: %s" % (pa.title or ''),
@@ -277,7 +242,7 @@ class crm_lead_forward_to_partner(osv.osv_memory):
"Fax: %s" % (pa.fax or ''),
"Mobile: %s" % (pa.mobile or ''),
]
return "\n".join(message + ['---'])
return "\n".join(body + ['---'])
def default_get(self, cr, uid, fields, context=None):
"""
@@ -295,10 +260,10 @@ class crm_lead_forward_to_partner(osv.osv_memory):
lead_proxy = self.pool.get('crm.lead')
lead = lead_proxy.browse(cr, uid, active_id, context=context)
message = self._get_case_history(cr, uid, defaults.get('history', 'latest'), lead.id, context=context)
body = self._get_case_history(cr, uid, defaults.get('history', 'latest'), lead.id, context=context)
defaults.update({
'subject' : '%s: %s' % (_('Fwd'), lead.name),
'message' : message,
'body' : body,
})
return defaults
@@ -5,41 +5,45 @@
<field name="name">crm_lead_forward_to_partner</field>
<field name="model">crm.lead.forward.to.partner</field>
<field name="type">form</field>
<field name="inherit_id" ref="crm_send_new_mail_view"/>
<field name="arch" type="xml">
<form string="Forward to Partner">
<separator string="Sender" colspan="4" />
<field name="email_from" colspan="2" />
<field name="history" colspan="2" on_change="on_change_history(history, context)"/>
<separator string="Recipient" colspan="4" />
<field name="name" colspan="2" />
<group col="2" colspan="2" attrs="{ 'invisible' : [('name','!=','user')]}">
<field name="user_id"
attrs="{ 'required' : [('name','=','user')]}"
on_change="on_change_email(user_id)" />
<field name="email_from" position="before">
<separator string="Forward to Partner" colspan="4" />
<group col="4" colspan="6">
<field name="history" colspan="2" on_change="on_change_history(history, context)"/>
<field name="name" colspan="2" />
<group col="2" colspan="2" attrs="{ 'invisible' : [('name','!=','user')]}">
<field name="user_id"
attrs="{ 'required' : [('name','=','user')]}"
on_change="on_change_email(user_id)" />
</group>
<group col="4" colspan="4" attrs="{'invisible' : [('name','!=','partner')]}">
<field name="partner_id" attrs="{'required' : [('name','=','partner')]}" on_change="on_change_partner(partner_id)" colspan="2" />
<field name="address_id" string="Contact" on_change="on_change_address(address_id)" colspan="2" />
</group>
</group>
<group col="4" colspan="4" attrs="{'invisible' : [('name','!=','partner')]}">
<field name="partner_id" attrs="{'required' : [('name','=','partner')]}" on_change="on_change_partner(partner_id)" colspan="2" />
<field name="address_id" string="Contact" on_change="on_change_address(address_id)" colspan="2" />
</group>
<field colspan="2" name="email_to" attrs="{ 'required' : [('name','=','email')]}" />
<field name="add_cc"/>
<separator string="Message" colspan="4" />
<field name="subject" colspan="4" />
<field name="message" colspan="4" nolabel="1"/>
<separator string="" colspan="4" />
<group colspan="4" col="2">
<button name="action_cancel" special="cancel" string="Cancel" icon="gtk-cancel" type="object" />
<button name="action_forward" string="Forward" icon="gtk-go-forward" type="object" />
</group>
</form>
</field>
</field>
</record>
<record model="ir.ui.view" id="crm_lead_forward_to_partner_form1">
<field name="name">crm_lead_forward_to_partner1</field>
<field name="model">crm.lead.forward.to.partner</field>
<field name="type">form</field>
<field name="inherit_id" ref="crm_send_new_mail_view"/>
<field name="arch" type="xml">
<button name="action_send" position="replace">
<button name="action_forward" string="Forward" icon="gtk-go-forward" type="object" />
</button>
</field>
</record>
<record model="ir.actions.act_window" id="crm_lead_forward_to_partner_act">
<field name="name">Forward to Partner</field>
<field name="res_model">crm.lead.forward.to.partner</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="crm_lead_forward_to_partner_form1"/>
<field name="target">new</field>
</record>
+4 -4
View File
@@ -126,9 +126,9 @@ class crm_lead2opportunity(osv.osv_memory):
if lead.state in ['done', 'cancel']:
raise osv.except_osv(_("Warning !"), _("Closed/Cancelled \
Leads Could not convert into Opportunity"))
if lead.state != 'open':
if lead.state not in ('open', 'pending'):
raise osv.except_osv(_('Warning !'), _('Lead should be in \
\'Open\' state before converting to Opportunity.'))
\'Open\' or \'Pending\' state before converting to Opportunity.'))
return False
def default_get(self, cr, uid, fields, context=None):
@@ -289,9 +289,9 @@ class crm_lead2opportunity_partner(osv.osv_memory):
if lead.state in ['done', 'cancel']:
raise osv.except_osv(_("Warning !"), _("Closed/Cancelled \
Leads Could not convert into Opportunity"))
if lead.state != 'open':
if lead.state not in ('open', 'pending'):
raise osv.except_osv(_('Warning !'), _('Lead should be in \
\'Open\' state before converting to Opportunity.'))
\'Open\' or \'Pending\' state before converting to Opportunity.'))
return False
crm_lead2opportunity_partner()
+42 -28
View File
@@ -20,11 +20,13 @@
#
##############################################################################
from crm import crm
from osv import osv, fields
from tools.translate import _
import base64
import itertools
import tools
from crm import crm
import re
class crm_send_new_email_attachment(osv.osv_memory):
_name = 'crm.send.mail.attachment'
@@ -46,32 +48,25 @@ class crm_send_new_email(osv.osv_memory):
'email_to' : fields.char('To', size=512, required=True),
'email_from' : fields.char('From', size=128, required=True),
'reply_to' : fields.char('Reply To', size=128, required=True, help="Reply-to of the Sales team defined on this case"),
'email_cc' : fields.char('CC', size=512, help="Carbon Copy: list of recipients that will receive"\
" a copy of this mail, and future communication related to this case"),
'email_cc' : fields.char('CC', size=512, help="Carbon Copy: list of recipients that will receive a copy of this mail"),
'subject': fields.char('Subject', size=512, required=True),
'text': fields.text('Message', required=True),
'body': fields.text('Message Body', required=True),
'state': fields.selection(crm.AVAILABLE_STATES, string='Set New State To', required=True),
'attachment_ids' : fields.one2many('crm.send.mail.attachment', 'wizard_id'),
}
def action_cancel(self, cr, uid, ids, context=None):
""" Closes Phonecall to Opportunity form
"""
return {'type':'ir.actions.act_window_close'}
def action_send(self, cr, uid, ids, context=None):
""" This sends an email to ALL the addresses of the selected partners.
"""
hist_obj = self.pool.get('mailgate.message')
if not context:
context = {}
if not context.get('model'):
if not context.get('active_model'):
raise osv.except_osv(_('Error'), _('Can not send mail!'))
model = context.get('model')
model = context.get('active_model')
case_pool = self.pool.get(model)
res_id = context and context.get('active_id', False) or False
@@ -83,24 +78,38 @@ class crm_send_new_email(osv.osv_memory):
message_id = None
ref_id = None
case = case_pool.browse(cr, uid, res_id)
case = case_pool.browse(cr, uid, res_id, context=context)
if context.get('mail', 'new') == 'new':
if case.message_ids:
message_id = case.message_ids[0].message_id
elif context.get('mail') == 'forward':
# extract attachements from case and emails according to mode
attachments = []
attach_pool = self.pool.get('ir.attachment')
direct_attachments = attach_pool.search(cr, uid, [('res_model', '=', 'crm.lead'), ('res_id', '=', res_id)], context=context)
attachments += attach_pool.browse(cr, uid, direct_attachments, context=context)
if obj.history in ['latest', 'whole'] and case.message_ids:
msgs = case.message_ids
if obj.history == 'latest':
msgs = msgs[:1]
attachments.extend(itertools.chain(*[m.attachment_ids for m in msgs]))
attach_all = [(a.datas_fname or a.name, base64.decodestring(a.datas)) for a in attachments if a.datas]
attach += attach_all
else:
hist = hist_obj.browse(cr, uid, res_id)
hist = hist_obj.browse(cr, uid, res_id, context=context)
message_id = hist.message_id
model = hist.model
model_pool = self.pool.get(model)
case_pool = self.pool.get(model)
res_id = hist.res_id
ref_id = hist.ref_id
case = model_pool.browse(cr, uid, res_id)
case = case_pool.browse(cr, uid, res_id, context=context)
emails = [obj.email_to]
email_cc = obj.email_cc and obj.email_cc.split(',') or ''
email_cc = re.findall(r'([^ ,<@]+@[^> ,]+)', obj.email_cc)
emails = filter(None, emails)
body = obj.text
body = obj.body
body = case_pool.format_body(body)
body = body and tools.ustr(body) or ''
email_from = getattr(obj, 'email_from', False)
x_headers = {}
if message_id:
@@ -121,10 +130,11 @@ class crm_send_new_email(osv.osv_memory):
if not flag:
raise osv.except_osv(_('Error!'), _('Unable to send mail. Please check SMTP is configured properly.'))
case_pool.history(cr, uid, [case], _('Send'), history=True, \
msg_dict = {'new': 'Send', 'reply': 'Reply', 'forward': 'Forward'}
case_pool.history(cr, uid, [case], _(msg_dict[context.get('mail', 'new')]), history=True, \
email=obj.email_to, details=body, \
subject=obj.subject, email_from=email_from, \
email_cc=email_cc, message_id=message_id, \
email_cc=', '.join(email_cc), message_id=message_id, \
references=ref_id or message_id, attach=attach)
if obj.state == 'unchanged':
pass
@@ -145,7 +155,7 @@ class crm_send_new_email(osv.osv_memory):
if not context:
context = {}
if not context.get('model'):
if not context.get('active_model'):
raise osv.except_osv(_('Error'), _('Can not send mail!'))
res = super(crm_send_new_email, self).default_get(cr, uid, fields, context=context)
@@ -154,7 +164,7 @@ class crm_send_new_email(osv.osv_memory):
res.update(self.get_reply_defaults(cr, uid, fields, context=context))
return res
model = context.get('model')
model = context.get('active_model')
mod_obj = self.pool.get(model)
res_id = context and context.get('active_ids', []) or []
@@ -172,8 +182,8 @@ class crm_send_new_email(osv.osv_memory):
res.update({'subject': tools.ustr(context.get('subject', case.name) or '')})
if 'email_cc' in fields:
res.update({'email_cc': tools.ustr(case.email_cc or '')})
if 'text' in fields:
res.update({'text': u'\n'+(tools.ustr(case.user_id.signature or ''))})
if 'body' in fields:
res.update({'body': u'\n'+(tools.ustr(case.user_id.signature or ''))})
if 'state' in fields:
res.update({'state': u'pending'})
@@ -209,7 +219,7 @@ class crm_send_new_email(osv.osv_memory):
signature = u'\n' + (tools.ustr(case.user_id.signature or '')) + u'\n'
original = [signature]
if include_original == True and 'text' in fields:
if include_original == True and 'body' in fields:
header = u'-------- Original Message --------'
sender = u'From: %s' %(tools.ustr(hist.email_from or ''))
to = u'To: %s' % (tools.ustr(hist.email_to or ''))
@@ -218,10 +228,14 @@ class crm_send_new_email(osv.osv_memory):
original = [signature, header, sender, to, sentdate, desc]
res['text']= u'\n' + u'\n'.join(original)
res['body']= u'\n' + u'\n'.join(original)
if 'subject' in fields:
res.update({u'subject': u'Re: %s' %(tools.ustr(hist.name or ''))})
if 'email_cc' in fields:
res.update({'email_cc': case.email_cc and tools.ustr(case.email_cc) or False})
if 'reply_to' in fields:
res.update({'reply_to': case.section_id.reply_to})
if 'state' in fields:
res['state'] = u'pending'
return res
@@ -239,7 +253,7 @@ class crm_send_new_email(osv.osv_memory):
if not context:
context = {}
if not context.get('model'):
if not context.get('active_model'):
raise osv.except_osv(_('Error'), _('Can not send mail!'))
return True
+5 -5
View File
@@ -9,7 +9,7 @@
<field name="model">crm.send.mail</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Send New Mail" col="4">
<form string="Send Mail" col="4">
<group colspan="4" col="2">
<field name="email_from"/>
<field name="reply_to"/>
@@ -19,7 +19,7 @@
</group>
<notebook colspan="6">
<page string="Message">
<field name="text" nolabel="1" colspan="4" default_focus="1"/>
<field name="body" nolabel="1" colspan="4" default_focus="1"/>
</page>
<page string="Attachments">
<field name="attachment_ids" colspan="4" nolabel="1">
@@ -36,7 +36,7 @@
<separator string="" colspan="6"/>
<group colspan="6" col="4" >
<field name="state" />
<button name="action_cancel" string="_Cancel" icon="gtk-cancel" special="cancel" />
<button string="_Cancel" icon="gtk-cancel" special="cancel" />
<button name="action_send" type="object" string="_Send" icon="gtk-go-forward" />
</group>
</form>
@@ -46,7 +46,7 @@
<!-- Send New Mail action -->
<record model="ir.actions.act_window" id="action_crm_send_mail">
<field name="name">Send New Mail</field>
<field name="name">Send Mail</field>
<field name="res_model">crm.send.mail</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
@@ -77,7 +77,7 @@
</tree>
</field>
<separator string="" colspan="4"/>
<field name="text" nolabel="1" colspan="4"/>
<field name="body" nolabel="1" colspan="4"/>
<separator string=" " colspan="4"/>
<group colspan="4" col="3" >
<label string=" " />
+1 -1
View File
@@ -74,7 +74,7 @@ class crm_claim(osv.osv, crm.crm_case):
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
# domain="[('partner_id','=',partner_id)]"
),
'email_cc': fields.text('Watchers Emails', size=252, help="These people will receive a copy of the future communication between partner and users by email"),
'email_cc': fields.text('Watchers Emails', size=252, help="These addresses(Comma-separated) will receive a copy of the future communication between partner and users"),
'email_from': fields.char('Email', size=128, help="These people will receive email."),
'partner_name': fields.char("Employee's Name", size=64),
'partner_mobile': fields.char('Mobile', size=32),
+1 -1
View File
@@ -46,7 +46,7 @@ class crm_fundraising(osv.osv, crm.crm_case):
'partner_id': fields.many2one('res.partner', 'Partner'),
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
domain="[('partner_id','=',partner_id)]"),
'email_cc': fields.text('Watchers Emails', size=252 , help="These people will receive a copy of the future communication between partner and users by email"),
'email_cc': fields.text('Watchers Emails', size=252 , help="These addresses(Comma-separated) will receive a copy of the future communication between partner and users"),
'email_from': fields.char('Email', size=128, help="These people will receive email."),
'date_closed': fields.datetime('Closed', readonly=True),
'date': fields.datetime('Date'),
+1 -3
View File
@@ -49,9 +49,7 @@ class crm_helpdesk(osv.osv, crm.crm_case):
'partner_id': fields.many2one('res.partner', 'Partner'),
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
domain="[('partner_id','=',partner_id)]"),
'email_cc': fields.text('Watchers Emails', size=252 , help="These people\
will receive a copy of the future" \
" communication between partner and users by email"),
'email_cc': fields.text('Watchers Emails', size=252 , help="These addresses(Comma-separated) will receive a copy of the future communication between partner and users"),
'email_from': fields.char('Email', size=128, help="These people will receive email."),
'date': fields.datetime('Date'),
'ref' : fields.reference('Reference', selection=crm._links_get, size=128),
@@ -11,12 +11,19 @@
<form position="attributes">
<attribute name="string">Configure Calendars for CRM Sections</attribute>
</form>
<group string="res_config_contents" position="replace">
<label colspan="4" align="0.0"
string="OpenERP can create and pre-configure a series of integrated calendar for you."/>
<separator string="Create Pre-Configured Calendars"
colspan="4"/>
<newline/>
<separator string="title" position="attributes">
<attribute name="string"
>Create Pre-Configured Calendars</attribute>
</separator>
<xpath expr="//label[@string='description']" position="attributes">
<attribute name="string">OpenERP can create and pre-configure a series of integrated calendar for you.</attribute>
<attribute name="width">200</attribute>
</xpath>
<xpath expr='//separator[@string="vsep"]' position='attributes'>
<attribute name='rowspan'>15</attribute>
<attribute name='string'></attribute>
</xpath>
<group string="res_config_contents" position="replace">
<field name="meeting"/>
<field name="opportunity"/>
<field name="phonecall"/>
@@ -27,8 +34,6 @@
<field name="jobs"/>
<field name="fund"/>
</group>
<xpath expr='//button[@name="action_skip"]'
position='replace'/>
</data>
</field>
</record>
@@ -43,7 +48,7 @@
<field name="target">new</field>
</record>
<!-- register configuration wizard -->
register configuration wizard
<record id="config_wizard_step_case_section_menu" model="ir.actions.todo">
<field name="action_id" ref="action_view_document_ics_config_directories"/>
</record>
+1
View File
@@ -45,6 +45,7 @@
'init_xml': ['event_data.xml'],
'update_xml': [
'wizard/event_confirm_registration_view.xml',
'wizard/event_confirm_view.xml',
'event_view.xml',
'report/report_event_registration_view.xml',
'event_sequence.xml',
+249 -142
View File
@@ -26,7 +26,7 @@ import netsvc
import pooler
import time
import tools
import decimal_precision as dp
class event_type(osv.osv):
""" Event Type """
@@ -41,16 +41,8 @@ class event_event(osv.osv):
"""Event"""
_name = 'event.event'
_description = __doc__
_inherit = 'crm.case.section'
_order = 'date_begin'
def _get_currency(self, cr, uid, context):
user = self.pool.get('res.users').browse(cr, uid, [uid])[0]
if user.company_id:
return user.company_id.currency_id.id
else:
return self.pool.get('res.currency').search(cr, uid, [('rate','=',1.0)])[0]
def copy(self, cr, uid, id, default=None, context=None):
""" Copy record of Given id
@param id: Id of Event record.
@@ -87,14 +79,9 @@ class event_event(osv.osv):
def button_done(self, cr, uid, ids, context=None):
return self.write(cr, uid, ids, {'state': 'done'}, context=context)
def button_confirm(self, cr, uid, ids, context=None):
"""This Funtion send reminder who had already confirmed their event registration.
@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 Event IDs
@param return: True
"""
def do_confirm(self, cr, uid, ids, context=None):
""" Confirm Event and send confirmation email to all register peoples
"""
register_pool = self.pool.get('event.registration')
for event in self.browse(cr, uid, ids, context=context):
if event.mail_auto_confirm:
@@ -106,6 +93,39 @@ class event_event(osv.osv):
return self.write(cr, uid, ids, {'state': 'confirm'})
def button_confirm(self, cr, uid, ids, context=None):
"""This Function Confirm Event.
@param ids: List of Event IDs
@param context: A standard dictionary for contextual values
@return: True
"""
data_pool = self.pool.get('ir.model.data')
unconfirmed_ids = []
for event in self.browse(cr, uid, ids, context=context):
total_confirmed = event.register_current
if total_confirmed >= event.register_min or event.register_max == 0:
self.do_confirm(cr, uid, [event.id], context=context)
else:
unconfirmed_ids.append(event.id)
if unconfirmed_ids:
view_id = data_pool._get_id(cr, uid, 'event', 'view_event_confirm')
view_data = data_pool.browse(cr, uid, view_id)
view_id = view_data.res_id
context['event_ids'] = unconfirmed_ids
return {
'name': _('Confirm Event'),
'context': context,
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'event.confirm',
'views': [(view_id, 'form')],
'type': 'ir.actions.act_window',
'target': 'new',
'context': context,
'nodestroy': True
}
return True
def _get_register(self, cr, uid, ids, fields, args, context=None):
"""Get Confirm or uncofirm register value.
@@ -122,7 +142,7 @@ class event_event(osv.osv):
res[event.id][field] = False
state = []
if 'register_current' in fields:
state.append('open')
state += ['open', 'done']
if 'register_prospect' in fields:
state.append('draft')
@@ -169,77 +189,134 @@ class event_event(osv.osv):
return res
_columns = {
'type': fields.many2one('event.type', 'Type', help="Type of Event like Seminar, Exhibition, Conference, Training."),
'register_max': fields.integer('Maximum Registrations', help="Provide Maximun Number of Registrations"),
'register_min': fields.integer('Minimum Registrations', help="Providee Minimum Number of Registrations"),
'register_current': fields.function(_get_register, method=True, string='Confirmed Registrations', multi='register_current', help="Total of Open Registrations"),
'register_prospect': fields.function(_get_register, method=True, string='Unconfirmed Registrations', multi='register_prospect', help="Total of Prospect Registrations"),
'date_begin': fields.datetime('Beginning date', required=True, help="Beginning Date of Event"),
'date_end': fields.datetime('Closing date', required=True, help="Closing Date of Event"),
'state': fields.selection([('draft', 'Draft'), ('confirm', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled')], 'State', readonly=True, required=True, help='If event is created, the state is \'Draft\'.\n If event is confirmed for the particular dates the state is set to \'Confirmed\'.\
\nIf the event is over, the state is set to \'Done\'.\n If event is cancelled the state is set to \'Cancelled\'.'),
'mail_auto_registr': fields.boolean('Mail Auto Register', help='Check this box if you want to use the automatic mailing for new registration'),
'mail_auto_confirm': fields.boolean('Mail Auto Confirm', help='Check this box if you want ot use the automatic confirmation emailing or the reminder'),
'mail_registr': fields.text('Registration Email', help='This email will be sent when someone subscribes to the event.'),
'mail_confirm': fields.text('Confirmation Email', help="This email will be sent when the event gets confimed or when someone subscribes to a confirmed event. This is also the email sent to remind someone about the event."),
'product_id': fields.many2one('product.product', 'Product', required=True, help="Product which is provided cost of event. Invoice of event will be created with this Product."),
'note': fields.text('Notes', help="Description or Summary of Event"),
'currency_id': fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}),
"unit_price": fields.float('Cost'),
'main_speaker_id': fields.many2one('res.partner','Main Speaker'),
'speaker_ids':fields.many2many('res.partner', 'event_speaker_rel', 'speaker_id', 'partner_id', 'Other Speakers'),
'address_id': fields.many2one('res.partner.address','Location Room'),
'speaker_confirmed': fields.boolean('Speaker Confirmed'),
'name': fields.char('Name', size=64, required=True, translate=True, readonly=False, states={'done': [('readonly', True)]}),
'user_id': fields.many2one('res.users', 'Responsible User', readonly=False, states={'done': [('readonly', True)]}),
'parent_id': fields.many2one('event.event', 'Parent Event', readonly=False, states={'done': [('readonly', True)]}),
'section_id': fields.many2one('crm.case.section', 'Sale Team', readonly=False, states={'done': [('readonly', True)]}),
'child_ids': fields.one2many('event.event', 'parent_id', 'Child Events', readonly=False, states={'done': [('readonly', True)]}),
'reply_to': fields.char('Reply-To', size=64, readonly=False, states={'done': [('readonly', True)]}, help="The email address put in the 'Reply-To' of all emails sent by Open ERP"),
'type': fields.many2one('event.type', 'Type', help="Type of Event like Seminar, Exhibition, Conference, Training.", readonly=False, states={'done': [('readonly', True)]}),
'register_max': fields.integer('Maximum Registrations', help="Provide Maximun Number of Registrations", readonly=True, states={'draft': [('readonly', False)]}),
'register_min': fields.integer('Minimum Registrations', help="Providee Minimum Number of Registrations", readonly=True, states={'draft': [('readonly', False)]}),
'register_current': fields.function(_get_register, method=True, string='Confirmed Registrations', multi='register_current',
help="Total of Open and Done Registrations"),
'register_prospect': fields.function(_get_register, method=True, string='Unconfirmed Registrations', multi='register_prospect',
help="Total of Prospect Registrations"),
'registration_ids': fields.one2many('event.registration', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}),
'date_begin': fields.datetime('Beginning date', required=True, help="Beginning Date of Event", readonly=True, states={'draft': [('readonly', False)]}),
'date_end': fields.datetime('Closing date', required=True, help="Closing Date of Event", readonly=True, states={'draft': [('readonly', False)]}),
'state': fields.selection([
('draft', 'Draft'),
('confirm', 'Confirmed'),
('done', 'Done'),
('cancel', 'Cancelled')],
'State', readonly=True, required=True,
help='If event is created, the state is \'Draft\'.If event is confirmed for the particular dates the state is set to \'Confirmed\'. If the event is over, the state is set to \'Done\'.If event is cancelled the state is set to \'Cancelled\'.'),
'mail_auto_registr': fields.boolean('Mail Auto Register', readonly=False, states={'done': [('readonly', True)]}, help='Check this box if you want to use the automatic mailing for new registration'),
'mail_auto_confirm': fields.boolean('Mail Auto Confirm', readonly=False, states={'done': [('readonly', True)]}, help='Check this box if you want ot use the automatic confirmation emailing or the reminder'),
'mail_registr': fields.text('Registration Email', readonly=False, states={'done': [('readonly', True)]}, help='This email will be sent when someone subscribes to the event.'),
'mail_confirm': fields.text('Confirmation Email', readonly=False, states={'done': [('readonly', True)]}, help="This email will be sent when the event gets confimed or when someone subscribes to a confirmed event. This is also the email sent to remind someone about the event."),
'product_id': fields.many2one('product.product', 'Product', required=True, readonly=True, states={'draft': [('readonly', False)]}, help="Product which is provided cost of event. Invoice of event will be created with this Product."),
'note': fields.text('Notes', help="Description or Summary of Event", readonly=False, states={'done': [('readonly', True)]}),
'pricelist_id': fields.many2one('product.pricelist', 'Pricelist', readonly=True, states={'draft': [('readonly', False)]}, help="Pricelist version for current event."),
"unit_price": fields.float('Registration Cost', digits_compute= dp.get_precision('Event Price'), readonly=True, states={'draft': [('readonly', False)]}),
'main_speaker_id': fields.many2one('res.partner','Main Speaker', readonly=False, states={'done': [('readonly', True)]}),
'speaker_ids':fields.many2many('res.partner', 'event_speaker_rel', 'speaker_id', 'partner_id', 'Other Speakers', readonly=False, states={'done': [('readonly', True)]}),
'address_id': fields.many2one('res.partner.address','Location Address', readonly=False, states={'done': [('readonly', True)]}),
'speaker_confirmed': fields.boolean('Speaker Confirmed', readonly=False, states={'done': [('readonly', True)]}),
'country_id': fields.related('address_id', 'country_id',
type='many2one', relation='res.country', string='Country'),
'language': fields.char('Language',size=64),
type='many2one', relation='res.country', string='Country', readonly=False, states={'done': [('readonly', True)]}),
'language': fields.char('Language',size=64, readonly=False, states={'done': [('readonly', True)]}),
'note': fields.text('Description', readonly=False, states={'done': [('readonly', True)]}),
'company_id': fields.many2one('res.company', 'Company', required=True, change_default=True, readonly=False, states={'done': [('readonly', True)]}),
}
_defaults = {
'state': 'draft',
# 'code': lambda obj, cr, uid, context: obj.pool.get('ir.sequence').get(cr, uid, 'event.event'),
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'event.event', context=c),
'user_id': lambda obj, cr, uid, context: uid,
'currency_id': _get_currency,
}
def _check_recursion(self, cr, uid, ids):
"""
Checks for recursion level for event
"""
level = 100
while len(ids):
cr.execute('select distinct parent_id from event_event where id IN %s', (tuple(ids),))
ids = filter(None, map(lambda x: x[0], cr.fetchall()))
if not level:
return False
level -= 1
return True
_constraints = [
(_check_recursion, 'Error ! You cannot create recursive event.', ['parent_id'])
]
def do_team_change(self, cr, uid, ids, team_id, context=None):
"""
On Change Callback: when team change, this is call.
on this function, take value of reply_to from selected team.
"""
if not team_id:
return {}
if context is None:
context = {}
team_pool = self.pool.get('crm.case.section')
team = team_pool.browse(cr, uid, team_id, context=context)
res = {}
if team.reply_to:
res = {'value': {'reply_to': team.reply_to}}
return res
event_event()
class event_registration(osv.osv):
"""Event Registration"""
"""Event Registration"""
_name= 'event.registration'
_description = __doc__
_inherit = 'crm.meeting'
def _amount_line(self, cr, uid, ids, field_name, arg, context=None):
cur_obj = self.pool.get('res.currency')
res = {}
context = context or {}
for line in self.browse(cr, uid, ids, context=context):
price = line.unit_price * line.nb_register
pricelist = line.event_id.pricelist_id or line.partner_invoice_id.property_product_pricelist
cur = pricelist and pricelist.currency_id or False
res[line.id] = cur and cur_obj.round(cr, uid, cur, price) or price
return res
_columns = {
'email_cc': fields.text('CC', size=252 , help="These \
people will receive a copy of the future communication between partner \
and users by email"),
'nb_register': fields.integer('Number of Registration', readonly=True, states={'draft': [('readonly', False)]}),
'event_id': fields.many2one('event.event', 'Event Related', required=True),
"partner_invoice_id": fields.many2one('res.partner', 'Partner Invoiced'),
"contact_id": fields.many2one('res.partner.contact', 'Partner Contact'), #TODO: filter only the contacts that have a function into the selected partner_id
"unit_price": fields.float('Unit Price'),
"badge_title": fields.char('Badge Title', size=128),
"badge_name": fields.char('Badge Name', size=128),
"badge_partner": fields.char('Badge Partner', size=128),
"event_product": fields.char("Product Name", size=128, required=True),
"tobe_invoiced": fields.boolean("To be Invoiced"),
'name': fields.char('Summary', size=124, readonly=True, states={'draft': [('readonly', False)]}),
'email_cc': fields.text('CC', size=252 , readonly=False, states={'done': [('readonly', True)]}, help="These people will receive a copy of the future communication between partner and users by email"),
'nb_register': fields.integer('Quantity', required=True, readonly=True, states={'draft': [('readonly', False)]}, help="Number of Registrations or Tickets"),
'event_id': fields.many2one('event.event', 'Event Related', required=True, readonly=True, states={'draft': [('readonly', False)]}),
"partner_invoice_id": fields.many2one('res.partner', 'Partner Invoiced', readonly=True, states={'draft': [('readonly', False)]}),
"contact_id": fields.many2one('res.partner.contact', 'Partner Contact', readonly=False, states={'done': [('readonly', True)]}), #TODO: filter only the contacts that have a function into the selected partner_id
"unit_price": fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Event Price'), readonly=True, states={'draft': [('readonly', False)]}),
'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal', digits_compute= dp.get_precision('Event Price')),
"badge_ids": fields.one2many('event.registration.badge', 'registration_id', 'Badges', readonly=False, states={'done': [('readonly', True)]}),
"event_product": fields.char("Invoice Name", size=128, required=True, readonly=True, states={'draft': [('readonly', False)]}),
"tobe_invoiced": fields.boolean("To be Invoiced", readonly=True, states={'draft': [('readonly', False)]}),
"invoice_id": fields.many2one("account.invoice", "Invoice", readonly=True),
'date_closed': fields.datetime('Closed', readonly=True),
'ref': fields.reference('Reference', selection=crm._links_get, size=128),
'ref2': fields.reference('Reference 2', selection=crm._links_get, size=128),
'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('history', '=', True),('model','=',_name)]),
'log_ids': fields.one2many('mailgate.message', 'res_id', 'Logs', domain=[('history', '=', False),('model','=',_name)]),
'currency_id': fields.many2one('res.currency', 'Currency', readonly=True),
'section_id': fields.related('event_id', 'section_id', type='many2one', relation='crm.case.section', string='Sale Team', store=True, readonly=True, states={'draft':[('readonly',False)]}),
'company_id': fields.related('event_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True, states={'draft':[('readonly',False)]}),
}
_defaults = {
'nb_register': 1,
'tobe_invoiced': True,
'name': 'Registration',
# 'currency_id': _get_currency,
'date': time.strftime('%Y-%m-%d %H:%M:%S')
}
def _make_invoice(self, cr, uid, reg, lines, context=None):
@@ -323,16 +400,38 @@ and users by email"),
res = self._make_invoice(cr, uid, val[0][0], [v for k , v in val], context=context)
for k , v in val:
self.write(cr, uid, [k.id], {'state': 'done', 'invoice_id': res}, context=context)
self.do_close(cr, uid, [k.id], context={'invoice_id': res})
else:
for k , v in val:
res = self._make_invoice(cr, uid, k, [v], context=context)
self.write(cr, uid, [k.id], {'state': 'done', 'invoice_id': res}, context=context)
self.do_close(cr, uid, [k.id], context={'invoice_id': res})
if res: new_invoice_ids.append(res)
return new_invoice_ids
def do_open(self, cr, uid, ids, context=None):
""" Open Registration
"""
res = self.write(cr, uid, ids, {'state': 'open'}, context=context)
self.mail_user(cr, uid, ids)
self._history(cr, uid, ids, _('Open'))
return res
def do_close(self, cr, uid, ids, context=None):
""" Close Registration
"""
if not context:
context = {}
invoice_id = context.get('invoice_id', False)
values = {'state': 'done', 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')}
msg = _('Done')
if invoice_id:
values['invoice_id'] = invoice_id
res = self.write(cr, uid, ids, values)
self._history(cr, uid, ids, msg)
return res
def check_confirm(self, cr, uid, ids, context=None):
"""This Function Open Event Registration and send email to user.
@param ids: List of Event registration's IDs
@@ -344,9 +443,7 @@ and users by email"),
for registration in self.browse(cr, uid, ids, context=context):
total_confirmed = registration.event_id.register_current + registration.nb_register
if total_confirmed <= registration.event_id.register_max or registration.event_id.register_max == 0:
self.write(cr, uid, [registration.id], {'state': 'open'}, context=context)
self.mail_user(cr, uid, [registration.id])
self._history(cr, uid, [registration], _('Open'))
self.do_open(cr, uid, [registration.id], context)
else:
unconfirmed_ids.append(registration.id)
if unconfirmed_ids:
@@ -368,12 +465,35 @@ and users by email"),
}
return True
def button_reg_close(self, cr, uid, ids, *args):
def button_reg_close(self, cr, uid, ids, context=None):
"""This Function Close Event Registration.
"""
registrations = self.browse(cr, uid, ids)
self._history(cr, uid, registrations, _('Done'))
self.write(cr, uid, ids, {'state': 'done', 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')})
if not context:
context = {}
data_pool = self.pool.get('ir.model.data')
unclosed_ids = []
for registration in self.browse(cr, uid, ids, context=context):
if registration.tobe_invoiced and not registration.invoice_id:
unclosed_ids.append(registration.id)
else:
self.do_close(cr, uid, [registration.id])
if unclosed_ids:
view_id = data_pool._get_id(cr, uid, 'event', 'view_event_make_invoice')
view_data = data_pool.browse(cr, uid, view_id)
view_id = view_data.res_id
context['active_ids'] = unclosed_ids
return {
'name': _('Close Registration'),
'context': context,
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'event.make.invoice',
'views': [(view_id, 'form')],
'type': 'ir.actions.act_window',
'target': 'new',
'context': context,
'nodestroy': True
}
return True
def button_reg_cancel(self, cr, uid, ids, *args):
@@ -391,7 +511,6 @@ and users by email"),
event = event_obj.browse(cr, uid, values['event_id'], context=context)
values['date_deadline']= event.date_begin
values['description']= event.mail_confirm
values['currency_id'] = event.currency_id.id
res = super(event_registration, self).create(cr, uid, values, context=context)
registrations = self.browse(cr, uid, [res], context=context)
self._history(cr, uid, registrations, _('Created'))
@@ -414,32 +533,35 @@ and users by email"),
if not context:
context = {}
for reg_id in self.browse(cr, uid, ids):
src = reg_id.event_id.reply_to or False
dest = []
if reg_id.email_from:
dest += [reg_id.email_from]
if reg_id.email_cc:
dest += [reg_id.email_cc]
if dest and src:
if confirm:
tools.email_send(src, dest,
_('Auto Confirmation: [%s] %s') %(reg_id.id, reg_id.name),
reg_id.event_id.mail_confirm,
openobject_id = reg_id.id)
elif reg_id.event_id.mail_auto_confirm or reg_id.event_id.mail_auto_registr:
if reg_id.event_id.state in ['draft', 'fixed', 'open', 'confirm', 'running'] and reg_id.event_id.mail_auto_registr:
tools.email_send(src, dest,
_('Auto Registration: [%s] %s') %(reg_id.id, reg_id.name),
reg_id.event_id.mail_registr, openobject_id = reg_id.id)
if (reg_id.event_id.state in ['confirm', 'running']) and reg_id.event_id.mail_auto_confirm:
tools.email_send(src, dest,
_('Auto Confirmation: [%s] %s') %(reg_id.id, reg_id.name),
reg_id.event_id.mail_confirm, openobject_id = reg_id.id)
if not src:
raise osv.except_osv(_('Error!'), _('You must define a reply-to address in order to mail the participant. You can do this in the Mailing tab of your event. Note that this is also the place where you can configure your event to not send emails automaticly while registering'))
for regestration in self.browse(cr, uid, ids, context=context):
src = regestration.event_id.reply_to or False
email_to = []
email_cc = []
if regestration.email_from:
email_to = regestration.email_from
if regestration.email_cc:
email_cc += [regestration.email_cc]
if not (email_to and email_cc):
continue
subject = ""
body = ""
if confirm:
subject = _('Auto Confirmation: [%s] %s') %(regestration.id, regestration.name)
body = regestration.event_id.mail_confirm
elif regestration.event_id.mail_auto_confirm or regestration.event_id.mail_auto_registr:
if regestration.event_id.state in ['draft', 'fixed', 'open', 'confirm', 'running'] and regestration.event_id.mail_auto_registr:
subject = _('Auto Registration: [%s] %s') %(regestration.id, regestration.name)
body = regestration.event_id.mail_registr
if (regestration.event_id.state in ['confirm', 'running']) and regestration.event_id.mail_auto_confirm:
subject = _('Auto Confirmation: [%s] %s') %(regestration.id, regestration.name)
body = regestration.event_id.mail_confirm
if subject or body:
tools.email_send(src, email_to, subject, body, email_cc = email_cc, openobject_id = regestration.id)
self.history(cr, uid, [regestration], subject, history=True, \
email=email_to, details=body, \
subject=subject, email_from=src, \
email_cc=', '.join(email_cc))
return True
def mail_user_confirm(self, cr, uid, ids, context=None):
@@ -451,22 +573,7 @@ and users by email"),
def _create_invoice_lines(self, cr, uid, ids, vals):
""" Create account Invoice line for Registration Id.
"""
return self.pool.get('account.invoice.line').create(cr, uid, vals)
def onchange_badge_name(self, cr, uid, ids, badge_name):
"""This function returns value of Registration Name based on Partner Badge Name.
@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 Registration IDs
@param badge_name: Badge Name
"""
data ={}
if not badge_name:
return data
data['name'] = 'Registration: ' + badge_name
return {'value': data}
return self.pool.get('account.invoice.line').create(cr, uid, vals)
def onchange_contact_id(self, cr, uid, ids, contact, partner):
@@ -486,15 +593,11 @@ and users by email"),
job_obj = self.pool.get('res.partner.job')
contact_id = contact_obj.browse(cr, uid, contact)
data['badge_name'] = contact_id.name
data['badge_title'] = contact_id.title.name
if partner:
partner_addresses = addr_obj.search(cr, uid, [('partner_id', '=', partner)])
job_ids = job_obj.search(cr, uid, [('contact_id', '=', contact), ('address_id', 'in', partner_addresses)])
if job_ids:
data['email_from'] = job_obj.browse(cr, uid, job_ids[0]).email
d = self.onchange_badge_name(cr, uid, ids, data['badge_name'])
data.update(d['value'])
return {'value': data}
def onchange_event(self, cr, uid, ids, event_id, partner_invoice_id):
@@ -515,20 +618,17 @@ and users by email"),
res_obj = self.pool.get('res.partner')
data_event = event_obj.browse(cr, uid, event_id)
context['currency_id'] = data_event.currency_id.id
res = {'value': {'unit_price': False, 'event_product': False, 'user_id': False}}
if data_event.user_id.id:
return {'value': {'user_id':data_event.user_id.id}}
res['value'].update({'user_id':data_event.user_id.id})
if data_event.product_id:
if not partner_invoice_id:
unit_price=prod_obj.price_get(cr, uid, [data_event.product_id.id], context=context)[data_event.product_id.id]
return {'value': {'unit_price': unit_price, 'event_product': data_event.product_id.name, 'currency_id': data_event.currency_id.id}}
data_partner = res_obj.browse(cr, uid, partner_invoice_id)
context.update({'partner_id': data_partner})
unit_price = prod_obj._product_price(cr, uid, [data_event.product_id.id], False, False, {'pricelist': data_partner.property_product_pricelist.id})[data_event.product_id.id]
return {'value': {'unit_price': unit_price, 'event_product': data_event.product_id.name, 'currency_id': data_event.currency_id.id}}
return {'value': {'unit_price': False, 'event_product': False}}
pricelist_id = data_event.pricelist_id and data_event.pricelist_id.id or False
if partner_invoice_id:
partner = res_obj.browse(cr, uid, partner_invoice_id, context=context)
pricelist_id = pricelist_id or partner.property_product_pricelist.id
unit_price = prod_obj._product_price(cr, uid, [data_event.product_id.id], False, False, {'pricelist': pricelist_id})[data_event.product_id.id]
res['value'].update({'unit_price': unit_price, 'event_product': data_event.product_id.name})
return res
def onchange_partner_id(self, cr, uid, ids, part, event_id, email=False):
"""This function returns value of Patner Invoice id, Unit Price, badget title based on partner and Event.
@@ -542,8 +642,8 @@ and users by email"),
job_obj = self.pool.get('res.partner.job')
res_obj = self.pool.get('res.partner')
data={}
data['badge_partner'] = data['contact_id'] = data['partner_invoice_id'] = data['email_from'] = data['badge_title'] = data['badge_name'] = False
data = {}
data['contact_id'], data['partner_invoice_id'], data['email_from'] = (False, False, False)
if not part:
return {'value': data}
data['partner_invoice_id']=part
@@ -559,9 +659,7 @@ and users by email"),
data['contact_id'] = job_obj.browse(cr, uid, job_ids[0]).contact_id.id
d = self.onchange_contact_id(cr, uid, ids, data['contact_id'], part)
data.update(d['value'])
partner_data = res_obj.browse(cr, uid, part)
data['badge_partner'] = partner_data.name
partner_data = res_obj.browse(cr, uid, part)
return {'value': data}
def onchange_partner_invoice_id(self, cr, uid, ids, event_id, partner_invoice_id):
@@ -584,17 +682,26 @@ and users by email"),
return {'value': data}
data_event = event_obj.browse(cr, uid, event_id)
if data_event.product_id:
data['event_product']=data_event.product_id.name
if not partner_invoice_id:
data['unit_price']=prod_obj.price_get(cr, uid, [data_event.product_id.id], context=context)[data_event.product_id.id]
return {'value': data}
data_partner = res_obj.browse(cr, uid, partner_invoice_id)
context.update({'partner_id': data_partner})
data['unit_price'] = prod_obj._product_price(cr, uid, [data_event.product_id.id], False, False, {'pricelist': data_partner.property_product_pricelist.id})[data_event.product_id.id]
return {'value': data}
data['event_product'] = data_event.product_id.name
pricelist_id = data_event.pricelist_id and data_event.pricelist_id.id or False
if partner_invoice_id:
partner = res_obj.browse(cr, uid, partner_invoice_id, context=context)
pricelist_id = pricelist_id or partner.property_product_pricelist.id
data['unit_price'] = prod_obj._product_price(cr, uid, [data_event.product_id.id], False, False, {'pricelist': pricelist_id})[data_event.product_id.id]
return {'value': data}
event_registration()
class event_registration_badge(osv.osv):
_name = 'event.registration.badge'
_description = __doc__
_columns = {
'registration_id': fields.many2one('event.registration', 'Registration', required=True),
"title": fields.char('Title', size=128),
"name": fields.char('Name', size=128, required=True),
"address_id": fields.many2one('res.partner.address', 'Address'),
}
event_registration_badge()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+6 -28
View File
@@ -55,8 +55,8 @@
<!-- Demo data for Event -->
<record id="event_0" model="event.event">
<field name="name">Concert of Bon Jovi</field>
<field name="date_begin">2008-01-01 19:00:00</field>
<field name="date_end">2008-01-01 23:00:00</field>
<field eval="time.strftime('%Y-%m-01 19:05:15')" name="date_begin"/>
<field eval="time.strftime('%Y-%m-01 23:05:15')" name="date_end"/>
<field name="product_id" ref="event_product_0"/>
<field name="unit_price">68.00</field>
<field name="user_id" ref="base.user_root"/>
@@ -64,33 +64,11 @@
<field name="type" ref="event_type_1"/>
<field name="state">draft</field>
</record>
<!--
<record id="demo_event_0bis" model="event.event">
<field name="name">Concert of Bon Jovi - Brussel</field>
<field name="date_begin">2008-02-02 19:00:00</field>
<field name="date_end">2008-02-02 23:00:00</field>
<field name="product_id" ref="event_product_0"/>
<field name="parent_id" ref="event_0"/>
<field name="user_id" ref="base.user_root"/>
<field name="register_max">500</field>
<field name="type" ref="event_type_1"/>
</record>
<record id="demo_event_0ter" model="event.event">
<field name="name">Concert of Bon Jovi - London</field>
<field name="date_begin">2008-04-04 19:00:00</field>
<field name="date_end">2008-04-04 23:00:00</field>
<field name="product_id" ref="event_product_0"/>
<field name="parent_id" ref="event_0"/>
<field name="user_id" ref="base.user_root"/>
<field name="register_max">500</field>
<field name="type" ref="event_type_1"/>
</record>
-->
<record id="event_1" model="event.event">
<field name="name">Opera of Verdi</field>
<field name="date_begin">2008-03-05 18:00:00</field>
<field name="date_end">2008-03-05 21:00:00</field>
<field eval="time.strftime('%Y-%m-05 18:00:00')" name="date_begin"/>
<field eval="time.strftime('%Y-%m-05 21:00:00')" name="date_end"/>
<field name="product_id" ref="event_product_1"/>
<field name="unit_price">24.00</field>
<field name="type" ref="event_type_1"/>
@@ -101,8 +79,8 @@
<record id="event_2" model="event.event">
<field name="name">Conference on ERP Buisness</field>
<field name="date_begin">2008-09-09 14:00:00</field>
<field name="date_end">2008-09-09 16:30:00</field>
<field eval="time.strftime('%Y-%m-05 14:00:00')" name="date_begin"/>
<field eval="time.strftime('%Y-%m-05 16:30:00')" name="date_end"/>
<field name="product_id" ref="event_product_2"/>
<field name="unit_price">15.50</field>
<field name="type" ref="event_type_2"/>
+128 -85
View File
@@ -45,31 +45,33 @@
<field name="arch" type="xml">
<form string="Events">
<group col="6" colspan="4">
<field name="name" string="Event" select="1"/>
<field name="type" widget="selection"/>
<field name="user_id" select="1"/>
<field name="date_begin" select="1"/>
<field name="name" string="Event"/>
<field name="date_begin"/>
<field name="date_end"/>
<field name="product_id" on_change="onchange_product(product_id)"/>
<field name="type" widget="selection"/>
<field name="language"/>
<field name="parent_id"/>
</group>
<notebook colspan="4">
<page string="Event Information">
<separator string="Description" colspan="4"/>
<field name="unit_price"/>
<field name="currency_id"/>
<field name="register_min"/>
<field name="register_max"/>
<field name="parent_id" domain="[('parent_id','child_of','Event')]"/>
<field name="active"/>
<separator string="Location" colspan="4"/>
<field name="country_id" />
<field name="language"/>
<field name="address_id"/>
<separator string="Speaker Information" colspan="4"/>
<field name="main_speaker_id" domain="[('speaker','=',True)]"/>
<field name="speaker_confirmed"/>
<field name="speaker_ids" domain="[('speaker','=',True)]" colspan="4"/>
<newline/>
<page string="Event">
<group colspan="4" col="4">
<separator string="Invoice Information" colspan="4"/>
<field name="product_id" on_change="onchange_product(product_id)" colspan="4"/>
<field name="unit_price"/>
<field name="pricelist_id" domain="[('type','=','sale')]" groups="base.group_extended"/>
</group>
<group colspan="2" col="2">
<separator string="Contact" colspan="4"/>
<field name="user_id"/>
<field name="section_id" widget="selection" on_change="do_team_change(section_id)"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
</group>
<group colspan="2" col="2">
<separator string="Location" colspan="4"/>
<field name="country_id" />
<field name="address_id" domain="[('country_id','=',country_id)]"/>
</group>
<field name="state" select="1"/>
<group col="4" colspan="2">
<button string="Confirm Event" name="button_confirm" states="draft" type="object" icon="gtk-apply"/>
@@ -77,8 +79,54 @@
<button string="Event Done" name="button_done" states="confirm" type="object" icon="gtk-jump-to"/>
<button string="Set To Draft" name="button_draft" states="confirm,cancel,done" type="object" icon="gtk-convert"/>
</group>
</page>
<page string="Speakers">
<field name="main_speaker_id" domain="[('speaker','=',True)]"/>
<field name="speaker_confirmed"/>
<separator string="Other Speakers" colspan="4"/>
<field name="speaker_ids" domain="[('speaker','=',True)]" colspan="4" nolabel="1"/>
</page>
<page string="Mailing">
<page string="Registrations">
<field name="register_min"/>
<field name="register_max"/>
<field name="register_current"/>
<field name="register_prospect"/>
<field name="registration_ids" colspan="4" nolabel="1">
<form string="Registration">
<field name="name"/>
<field name="date" string="Date"/>
<field name="partner_id" required="1" on_change="onchange_partner_id(partner_id,event_id)"/>
<field name="partner_invoice_id" on_change="onchange_partner_invoice_id(event_id, partner_invoice_id)"/>
<group colspan="4" col="4">
<field name="event_product"/>
<field name="nb_register"/>
<field name="unit_price"/>
<field name="price_subtotal"/>
</group>
<group col="8" colspan="4">
<separator string="" colspan="4"/>
<newline/>
<field name="state" select="1" colspan="2"/>
<button name="button_reg_close" string="Close Registration" states="open" type="object" icon="gtk-close"/>
<button name="check_confirm" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
<button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
</group>
</form>
<tree string="Registration" editable="bottom">
<field name="date" string="Date"/>
<field name="partner_id" required="1" string="Partner" on_change="onchange_partner_id(partner_id,event_id)"/>
<field name="event_product"/>
<field name="nb_register"/>
<field name="unit_price"/>
<field name="price_subtotal"/>
<field name="state"/>
<button name="button_reg_close" string="Close Registration" states="open" type="object" icon="gtk-close"/>
<button name="check_confirm" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
<button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
</tree>
</field>
</page>
<page string="Mailing">
<field name="reply_to" />
<newline/>
@@ -86,23 +134,18 @@
<separator string="Auto Registration Email" colspan="2"/>
<newline/>
<field name="mail_auto_registr"/>
<separator string="Registration Email" colspan="2"/>
<separator string="Registration Email Body" colspan="2"/>
<newline/>
<field name="mail_registr" colspan="2" nolabel="1"/>
<field name="mail_registr" colspan="2" nolabel="1" attrs="{'readonly':[('mail_auto_registr','=',False)]}"/>
</group>
<group col="2" colspan="2" >
<separator string="Auto Confirmation Email" colspan="2"/>
<field name="mail_auto_confirm"/>
<newline/>
<separator string="Confirmation Email" colspan="2"/>
<field name="mail_confirm" colspan="2" nolabel="1"/>
<separator string="Confirmation Email Body" colspan="2"/>
<field name="mail_confirm" colspan="2" nolabel="1" attrs="{'readonly':[('mail_auto_confirm','=',False)]}"/>
</group>
</page>
<page string="Statistics">
<separator string="Registrations" colspan="4"/>
<field name="register_current"/>
<field name="register_prospect"/>
</page>
<page string="Notes">
<separator string="Notes" colspan="4"/>
<field name="note" colspan="4" nolabel="1"/>
@@ -129,6 +172,10 @@
<field name="register_min"/>
<field name="register_current"/>
<field name="state"/>
<button string="Confirm Event" help="Confirm Event" name="button_confirm" states="draft" type="object" icon="gtk-apply"/>
<button string="Cancel Event" help="Cancel Event" name="button_cancel" states="draft,confirm" type="object" icon="gtk-cancel"/>
<button string="Event Done" help="Event Done" name="button_done" states="confirm" type="object" icon="gtk-jump-to"/>
<button string="Set To Draft" help="Set To Draft" name="button_draft" states="confirm,cancel,done" type="object" icon="gtk-convert"/>
</tree>
</field>
</record>
@@ -233,7 +280,6 @@
<!-- EVENTS/REGISTRATIONS/EVENTS -->
<!-- Registration view (form) by _inherits .................. -->
<record model="ir.ui.view" id="view_event_registration_tree">
<field name="name">event.registration.tree</field>
@@ -241,12 +287,15 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Registration">
<field name="id"/>
<field name="create_date"/>
<field name="date" string="Date"/>
<field name="event_id"/>
<field name="partner_id"/>
<field name="nb_register"/>
<field name="price_subtotal"/>
<field name="state"/>
<button name="button_reg_close" string="Close Registration" states="open" type="object" icon="gtk-close"/>
<button name="check_confirm" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
<button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
</tree>
</field>
</record>
@@ -258,31 +307,29 @@
<field name="arch" type="xml">
<form string="Registration">
<group col="6" colspan="4">
<field name="name" select="1" colspan="2"/>
<field name="event_id" select="1" on_change="onchange_event(event_id, partner_invoice_id)" domain="[('state','in',('draft','confirm'))]"/>
<field name="user_id" select="1"/>
<newline/>
<field name="partner_id" required="1" select="1" on_change="onchange_partner_id(partner_id,event_id)" />
<field name="event_id" on_change="onchange_event(event_id, partner_invoice_id)" domain="[('state','in',('draft','confirm'))]"/>
<field name="date" string="Registration Date"/>
<field name="name"/>
<field name="partner_id" required="1" on_change="onchange_partner_id(partner_id,event_id)" />
<field name="partner_invoice_id" on_change="onchange_partner_invoice_id(event_id, partner_invoice_id)"/>
<field name="user_id"/>
</group>
<notebook colspan="4">
<page string="General">
<group colspan="4" col="6">
<page string="Registration">
<group colspan="2" col="2">
<separator string="Invoice" colspan="4"/>
<field name="event_product"/>
<field name="invoice_id"/>
<field name="tobe_invoiced"/>
</group>
<group colspan="2" col="2">
<separator string="Registration Cost" colspan="4"/>
<field name="nb_register"/>
<field name="unit_price"/>
<field name="currency_id"/>
</group>
<separator string="Communication Information" colspan="4"/>
<field name="contact_id" on_change="onchange_contact_id(contact_id, partner_id)" />
<field name="email_from"/>
<newline/>
<separator string="Badge" colspan="4"/>
<field name="badge_title"/>
<field name="badge_name" on_change="onchange_badge_name(badge_name)"/>
<field name="badge_partner"/>
<newline/>
<field name="price_subtotal"/>
</group>
<group col="8" colspan="4">
<separator string="Status" colspan="4"/>
<separator string="" colspan="4"/>
<newline/>
<field name="state" select="1" colspan="2"/>
<button name="button_reg_close" string="Close Registration" states="open" type="object" icon="gtk-close"/>
@@ -290,10 +337,32 @@
<button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
</group>
</page>
<page string="Payments">
<field name="event_product" select="1"/>
<field name="tobe_invoiced" select="1"/>
<field name="invoice_id"/>
<page string="Extra Info">
<separator string="Contact" colspan="4"/>
<field name="contact_id" on_change="onchange_contact_id(contact_id, partner_id)" />
<field name="email_from"/>
<field name="badge_ids" colspan="4" nolabel="1">
<tree string="Badges" editable="bottom">
<field name="name"/>
<field name="title"/>
<field name="address_id"/>
</tree>
<form string="Badges">
<field name="name"/>
<field name="title"/>
<field name="address_id"/>
</form>
</field>
<group col="2" colspan="2">
<separator string="Dates" colspan="2"/>
<field name="create_date"/>
<field name="date_closed"/>
</group>
<group col="2" colspan="2">
<separator string="Misc" colspan="2"/>
<field name="id"/>
<field name="active"/>
</group>
</page>
<page string="Emails" groups="base.group_extended">
<group colspan="4">
@@ -333,33 +402,7 @@
name="%(crm.action_crm_send_mail)d"
context="{'mail':'new', 'model': 'event.registration'}"
icon="gtk-go-forward" type="action" />
</page>
<page string="History">
<group col="2" colspan="2">
<separator string="Dates" colspan="2"/>
<field name="create_date"/>
<field name="date_closed"/>
</group>
<group col="2" colspan="2">
<separator string="Misc" colspan="2"/>
<field name="id"/>
<field name="active"/>
</group>
<!-- TODO-->
<field name="log_ids" nolabel="1" colspan="4">
<tree string="Logs">
<field name="name" colspan="4"/>
<field name="date"/>
<field name="user_id"/>
</tree>
<form string="Logs">
<separator string="Action Information" colspan="4"/>
<field name="name" colspan="4"/>
<field name="date"/>
<field name="user_id"/>
</form>
</field>
</page>
</page>
</notebook>
</form>
</field>
@@ -9,3 +9,5 @@
"access_crm_case_section_manager","crm.case.section manager","crm.model_crm_case_section","event.group_event_manager",1,1,1,1
"access_product_product","product.product.product manager","product.model_product_product","event.group_event_manager",1,1,1,1
"access_report_event_registration","report.event.registration","model_report_event_registration","event.group_event_manager",1,1,1,1
"access_event_registration_badge","event.registration.badge","model_event_registration_badge","event.group_event_subscriber",1,1,1,1
"access_event_registration_badge","event.registration.badge","model_event_registration_badge","event.group_event_manager",1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
9 access_crm_case_section_manager crm.case.section manager crm.model_crm_case_section event.group_event_manager 1 1 1 1
10 access_product_product product.product.product manager product.model_product_product event.group_event_manager 1 1 1 1
11 access_report_event_registration report.event.registration model_report_event_registration event.group_event_manager 1 1 1 1
12 access_event_registration_badge event.registration.badge model_event_registration_badge event.group_event_subscriber 1 1 1 1
13 access_event_registration_badge event.registration.badge model_event_registration_badge event.group_event_manager 1 1 1 1
-7
View File
@@ -54,7 +54,6 @@
we create it with a "Conference on OpenERP Offshore Business" event and provide "Beginning date", "Ending Date" and "Product" as Concert Ticket.
-
!record {model: event.event, id: event_event_conference0}:
code: C/004
date_begin: '2010-06-07 13:39:00'
date_end: '2010-06-10 13:39:00'
name: Conference on OpenERP Offshore Business.
@@ -94,8 +93,6 @@
I create New Registration for "Conference on OpenERP Offshore Business.
-
!record {model: event.registration, id: event_registration_registrationjacot0}:
badge_name: Jacot
badge_partner: Mark Johnson
contact_id: base_contact.res_partner_contact_jacot0
date_deadline: '2010-06-07 13:39:00'
event_id: event.event_event_conference0
@@ -128,8 +125,6 @@
They create New registraion for This event.
-
!record {model: event.registration, id: event_registration_registrationzen0}:
badge_name: Zen
badge_partner: China Export
contact_id: base_contact.res_partner_contact_zen0
date_deadline: '2010-06-07 13:39:00'
event_id: event.event_event_conference0
@@ -149,8 +144,6 @@
Third person create New Registration for "Conference on OpenERP Offshore Business" event.
-
!record {model: event.registration, id: event_registration_registrationpassot0}:
badge_name: Passot
badge_partner: Mediapole SPRL
contact_id: base_contact.res_partner_contact_passot0
date_deadline: '2010-06-07 13:39:00'
email_from: info@mediapole.net
+1
View File
@@ -21,5 +21,6 @@
import event_make_invoice
import event_confirm_registration
import event_confirm
import partner_event_registration
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+47
View File
@@ -0,0 +1,47 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import fields, osv
from tools.translate import _
class event_confirm(osv.osv_memory):
"""
Confirm Event
"""
_name = "event.confirm"
_description = "Event Confirmation"
_columns = {
'msg': fields.text('Message', readonly=True),
}
_defaults = {
'msg': _('Total Registrations of this Event could not reached Minimum Registration Limit. What do you want to do?')
}
def confirm(self, cr, uid, ids, context):
event_pool = self.pool.get('event.event')
event_ids = context.get('event_ids', [])
event_pool.do_confirm(cr, uid, event_ids, context=context)
return {}
event_confirm()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
@@ -50,8 +50,8 @@ class event_confirm_registration(osv.osv_memory):
register_max = registration.event_id.register_max
if registration.event_id.id not in overlimit_event_ids:
overlimit_event_ids.append(registration.event_id.id)
msg += _("The Event '%s' is reached Maximum Limit(%s). It has %s Confirmed registration\n") \
%(registration.event_id.name, register_max, total_confirmed)
msg += _("The Event '%s' is reached Maximum Limit(%s).") \
%(registration.event_id.name, register_max)
if 'msg' in fields:
res.update({'msg': msg})
@@ -60,10 +60,7 @@ class event_confirm_registration(osv.osv_memory):
def confirm(self, cr, uid, ids, context):
registration_pool = self.pool.get('event.registration')
registration_ids = context.get('registration_ids', [])
for reg_id in registration_ids:
registration_pool.write(cr, uid, [reg_id], {'state':'open', })
registration_pool._history(cr, uid, [reg_id], _('Open'))
registration_pool.mail_user(cr, uid, [reg_id])
registration_pool.do_open(cr, uid, registration_ids, context=context)
return {}
event_confirm_registration()
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_event_confirm" model="ir.ui.view">
<field name="name">Event Confirmation</field>
<field name="model">event.confirm</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Event Confirmation">
<field name="msg" nolabel="1" colspan="4"/>
<separator string="" colspan="4"/>
<group colspan="4" col="6">
<button icon="gtk-close" special="cancel" string="Close"/>
<button icon="gtk-ok" name="confirm" string="Confirm Anyway" type="object"/>
</group>
</form>
</field>
</record>
<record id="action_event_confirm" model="ir.actions.act_window">
<field name="name">Event Confirmation</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">event.confirm</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_event_confirm"/>
<field name="context">{'record_id' : active_id}</field>
<field name="target">new</field>
</record>
</data>
</openerp>
+4 -14
View File
@@ -10,21 +10,11 @@
<field name="inherit_id" ref="event.view_event_form"/>
<field name="type">form</field>
<field name="arch" type="xml">
<field name="register_max" position="after">
<notebook position="inside">
<page string="Tasks">
<separator string="Tasks management" colspan="4"/>
<field name="project_id"/>
<button string="Create Retro-Planning" name="%(action_event_project)d" type="action" icon="gtk-execute"/>
</field>
</field>
</record>
<record model="ir.ui.view" id="view_event_form_inherited2">
<field name="name">Events</field>
<field name="model">event.event</field>
<field name="inherit_id" ref="event.view_event_form"/>
<field name="type">form</field>
<field name="arch" type="xml">
<field name="register_prospect" position="after">
<field name="task_ids" colspan="4" nolabel="1" widget="one2many_list" >
<tree string="All tasks" colors="red:date_deadline&lt;current_date and state=='draft';blue:date_deadline==current_date and state=='draft';grey:state in ('cancel','done');black:state not in ('cancel','done')">
<field name="sequence"/>
@@ -36,10 +26,10 @@
<field name="state" />
</tree>
</field>
</field>
</page>
</notebook>
</field>
</record>
<act_window
id="act_event_task"
name="Tasks"
+20 -20
View File
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2009-09-08 15:55+0000\n"
"Last-Translator: Mario Riva <mario.riva@domsense.com>\n"
"PO-Revision-Date: 2010-07-15 07:49+0000\n"
"Last-Translator: Salvatore Udda <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: 2010-06-22 04:17+0000\n"
"X-Launchpad-Export-Date: 2010-07-16 03:39+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: hr_attendance
@@ -97,7 +97,7 @@ msgstr "Stampa Rapporto Errori Presenze"
#. module: hr_attendance
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
msgstr "Nome di modello non valido nella definizione dell'azione."
#. module: hr_attendance
#: model:ir.actions.wizard,name:hr_attendance.print_week
@@ -140,17 +140,17 @@ msgstr "Motivi Azione"
#. module: hr_attendance
#: selection:hr.attendance.print_month,init,month:0
msgid "March"
msgstr ""
msgstr "Marzo"
#. module: hr_attendance
#: selection:hr.attendance.print_month,init,month:0
msgid "August"
msgstr ""
msgstr "Agosto"
#. module: hr_attendance
#: selection:hr.attendance.print_month,init,month:0
msgid "May"
msgstr ""
msgstr "Maggio"
#. module: hr_attendance
#: wizard_field:hr.si_so,so_ask_si,last_time:0
@@ -160,7 +160,7 @@ msgstr "Ultima Entrata"
#. module: hr_attendance
#: selection:hr.attendance.print_month,init,month:0
msgid "June"
msgstr ""
msgstr "Giugno"
#. module: hr_attendance
#: model:ir.actions.wizard,name:hr_attendance.print_month
@@ -203,7 +203,7 @@ msgstr "Data"
#. module: hr_attendance
#: selection:hr.attendance.print_month,init,month:0
msgid "July"
msgstr ""
msgstr "Luglio"
#. module: hr_attendance
#: wizard_view:hr.si_so,si_ask_so:0
@@ -238,12 +238,12 @@ msgstr "Assente"
#. module: hr_attendance
#: selection:hr.attendance.print_month,init,month:0
msgid "February"
msgstr ""
msgstr "Febbraio"
#. module: hr_attendance
#: selection:hr.attendance.print_month,init,month:0
msgid "October"
msgstr ""
msgstr "Ottobre"
#. module: hr_attendance
#: wizard_field:hr.si_so,si_ask_so,last_time:0
@@ -285,12 +285,12 @@ msgstr "Stato Attuale"
#. module: hr_attendance
#: selection:hr.attendance.print_month,init,month:0
msgid "January"
msgstr ""
msgstr "Gennaio"
#. module: hr_attendance
#: selection:hr.attendance.print_month,init,month:0
msgid "April"
msgstr ""
msgstr "Aprile"
#. module: hr_attendance
#: model:ir.actions.act_window,name:hr_attendance.open_view_attendance
@@ -324,7 +324,7 @@ msgstr "Motivazioni Presenza"
#. module: hr_attendance
#: selection:hr.attendance.print_month,init,month:0
msgid "November"
msgstr ""
msgstr "Novembre"
#. module: hr_attendance
#: wizard_view:hr.attendance.report,init:0
@@ -334,7 +334,7 @@ msgstr ""
#. module: hr_attendance
#: wizard_field:hr.attendance.report,init,max_delay:0
msgid "Max. Delay (Min)"
msgstr ""
msgstr "Ritardo Massimo (min.)"
#. module: hr_attendance
#: wizard_view:hr.attendance.print_week,init:0
@@ -359,12 +359,12 @@ msgstr ""
#. module: hr_attendance
#: selection:hr.attendance.print_month,init,month:0
msgid "September"
msgstr ""
msgstr "Settembre"
#. module: hr_attendance
#: selection:hr.attendance.print_month,init,month:0
msgid "December"
msgstr ""
msgstr "Dicembre"
#. module: hr_attendance
#: view:hr.attendance:0
@@ -374,12 +374,12 @@ msgstr "Presenza Dipendente"
#. module: hr_attendance
#: wizard_view:hr.attendance.print_month,init:0
msgid "Select a month"
msgstr ""
msgstr "Selezionare un mese"
#. module: hr_attendance
#: wizard_field:hr.attendance.print_month,init,month:0
msgid "Month"
msgstr ""
msgstr "Mese"
#. module: hr_attendance
#: model:ir.module.module,description:hr_attendance.module_meta_information
@@ -394,7 +394,7 @@ msgstr "Report Errori Presenze"
#. module: hr_attendance
#: wizard_field:hr.attendance.print_month,init,year:0
msgid "Year"
msgstr ""
msgstr "Anno"
#. module: hr_attendance
#: wizard_button:hr.attendance.print_month,init,end:0
+1 -1
View File
@@ -69,7 +69,7 @@
<field name="state" colspan="2"/>
<group colspan="2">
<button string="Confirm" name="confirm" states="draft" type="workflow" icon="gtk-yes"/>
<button string="To Approve" name="validate" states="confirm" type="workflow" icon="gtk-apply"/>
<button string="Approve" name="validate" states="confirm" type="workflow" icon="gtk-apply"/>
<button string="Approved" name="second_validate" states="validate1" type="workflow" icon="gtk-apply"/>
<button string="Refuse" name="refuse" states="confirm,validate1" type="workflow" icon="gtk-no"/>
<button string="Cancel" name="cancel" states="validate,refuse" type="workflow" icon="gtk-cancel"/>
+25 -2
View File
@@ -76,7 +76,30 @@
<field name="model">olap.parameters.config.wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Parameters Configure">
<form string="Parameters Configure wizard">
<group colspan="4" col="8">
<group colspan="3" width="180" height="250">
<field name="config_logo" widget="image" width="200" height="100" nolabel="1" colspan="1"/>
<newline/>
<label align="0.0" string="This wizard will automatically configure the web client for Business Intelligence." width="200" colspan="2"/>
</group>
<separator string="" position="vertical" colspan="1" rowspan="12"/>
<group colspan="4">
<separator string=" Business Intelligence Web Client" colspan="4"/>
<field name="host_name" colspan="4"/>
<field name="host_port" colspan="4"/>
</group>
<group colspan="8" col="8">
<separator string="" colspan="8"/>
<group colspan="4" width="220">
<field name="progress" widget="progressbar" nolabel="1" colspan="2"/>
</group>
<button special="cancel" string="Cancel" name="action_cancel" type="object" icon='gtk-cancel'/>
<button name="action_config" string="Configure" icon='gtk-ok' type="object"/>
</group>
</group>
</form>
<!--form string="Parameters Configure">
<separator string="BI Web Client." colspan="4"/>
<label string="This wizard will automatically configure the web client for BI." align="0.0" colspan="4"/>
<field name="host_name" colspan="4"/>
@@ -87,7 +110,7 @@
<button special="cancel" string="Cancel" name="action_cancel" type="object" icon='gtk-cancel'/>
<button name="action_config" string="Configure" icon='gtk-ok' type="object"/>
</group>
</form>
</form-->
</field>
</record>
+21
View File
@@ -30,6 +30,9 @@ from osv import osv
from osv import fields, osv
import netsvc
import cube
import os
import tools
import base64
from cube import levels
@@ -2128,16 +2131,34 @@ class olap_parameters_config_wizard(osv.osv_memory):
Word(alphanums + "_" + " ").suppress()
return s_p.parseString(aid.url)[1]
def _get_image(self, cr, uid, context=None):
path = os.path.join('base','res','config_pixmaps/1.png')
file_data = tools.file_open(path,'rb').read()
return base64.encodestring(file_data)
def _progress(self, cr, uid, context=None):
total = self.pool.get('ir.actions.todo')\
.search_count(cr, uid, [], context)
open = self.pool.get('ir.actions.todo')\
.search_count(cr, uid, [('state','<>','open')], context)
if total:
return round(open*90./total)
return 100.
_columns = {
'host_name': fields.char('Server Name', size = 64, help = "Put here the server address or IP \
Put localhost if its not clear.", required = True),
'host_port': fields.char('Port', size = 4, help = "Put the port for the server. Put 8080 if \
its not clear.", required = True),
'config_logo': fields.binary('Image', readonly=True),
'progress': fields.float('Configuration Progress', readonly=True),
}
_defaults = {
'host_name': _get_host,
'host_port': _get_port,
'progress': _progress,
'config_logo': _get_image,
}
def action_cancel(self, cr, uid, ids, conect = None):
-1
View File
@@ -32,7 +32,6 @@ based on geolocalization.
'depends': ['crm'],
'data': [
'res_partner_view.xml',
'crm_lead_view.xml',
],
'installable': True,
'active': False,
+24 -4
View File
@@ -17,13 +17,33 @@
<field name="name"/>
<field name="project_id"/>
<field name="date_deadline"/>
<field name="planned_hours"/>
<field name="effective_hours"/>
<field name="priority"/>
<field name="planned_hours" widget="float_time"/>
<field name="effective_hours" widget="float_time"/>
<field name="progress" widget="progressbar"/>
</tree>
</field>
</record>
<record id="view_delegated_task_tree" model="ir.ui.view">
<field name="name">project.task.delegated.tree</field>
<field name="model">project.task</field>
<field name="type">tree</field>
<field eval="99" name="priority"/>
<field name="arch" type="xml">
<tree colors="red:date_deadline&lt;current_date;blue:date_deadline==current_date;black:date_deadline&gt;current_date" string="My Delegated Tasks">
<field name="user_id"/>
<field name="name"/>
<field name="project_id"/>
<field name="date_deadline"/>
<field name="total_hours" widget="float_time"/>
<field name="progress" widget="progressbar"/>
<field name="type_id"/>
</tree>
</field>
</record>
<record id="action_view_task_tree" model="ir.actions.act_window">
<field name="name">My Open Tasks</field>
<field name="res_model">project.task</field>
@@ -38,8 +58,8 @@
<field name="res_model">project.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">['|',('parent_ids.user_id','=',uid),('user_id','=',uid)]</field>
<field name="view_id" ref="project.view_task_tree2"/>
<field name="domain">[('parent_ids.user_id','=',uid),('state', 'in', ('draft','open','pending'))]</field>
<field name="view_id" ref="view_delegated_task_tree"/>
</record>
<record id="action_view_task_tree_deadline" model="ir.actions.act_window">
+10 -10
View File
@@ -359,7 +359,7 @@ class task(osv.osv):
'description': fields.text('Description'),
'priority' : fields.selection([('4','Very Low'), ('3','Low'), ('2','Medium'), ('1','Urgent'), ('0','Very urgent')], 'Importance'),
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of tasks."),
'type': fields.many2one('project.task.type', 'Stage',),
'type_id': fields.many2one('project.task.type', 'Stage',),
'state': fields.selection([('draft', 'Draft'),('open', 'In Progress'),('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')], 'State', readonly=True, required=True,
help='If the task is created the state is \'Draft\'.\n If the task is started, the state becomes \'In Progress\'.\n If review is needed the task is in \'Pending\' state.\
\n If the task is over, the states is set to \'Done\'.'),
@@ -549,25 +549,25 @@ class task(osv.osv):
return True
def next_type(self, cr, uid, ids, *args):
for typ in self.browse(cr, uid, ids):
typeid = typ.type.id
types = map(lambda x:x.id, typ.project_id.type_ids or [])
for task in self.browse(cr, uid, ids):
typeid = task.type_id.id
types = map(lambda x:x.id, task.project_id.type_ids or [])
if types:
if not typeid:
self.write(cr, uid, typ.id, {'type': types[0]})
self.write(cr, uid, task.id, {'type_id': types[0]})
elif typeid and typeid in types and types.index(typeid) != len(types)-1 :
index = types.index(typeid)
self.write(cr, uid, typ.id, {'type': types[index+1]})
self.write(cr, uid, task.id, {'type_id': types[index+1]})
return True
def prev_type(self, cr, uid, ids, *args):
for typ in self.browse(cr, uid, ids):
typeid = typ.type.id
types = map(lambda x:x.id, typ.project_id.type_ids)
for task in self.browse(cr, uid, ids):
typeid = task.type_id.id
types = map(lambda x:x.id, task.project_id.type_ids)
if types:
if typeid and typeid in types:
index = types.index(typeid)
self.write(cr, uid, typ.id, {'type': index and types[index-1] or False})
self.write(cr, uid, task.id, {'type_id': index and types[index-1] or False})
return True
task()
+4 -4
View File
@@ -321,7 +321,7 @@
<field name="partner_id"/>
<field name="company_id" select="1" groups="base.group_multi_company" widget="selection"/>
<group col="4" colspan="2">
<field name="type" widget="selection" readonly="1"/>
<field name="type_id" widget="selection" readonly="1"/>
<button name="prev_type" string="Previous" type="object" icon="gtk-go-back" help="Change to Previous Stage"/>
<button name="next_type" string="Next" type="object" icon="gtk-go-forward" help="Change to Next Stage"/>
</group>
@@ -354,7 +354,7 @@
icon="gtk-go-forward"
groups="base.group_extended"
help="Change Type"/>
<field name="type" groups="base.group_extended" invisible="context.get('set_visible',False)"/>
<field name="type_id" groups="base.group_extended" invisible="context.get('set_visible',False)"/>
<field name="date_start" invisible="1"/>
<field name="date_end" invisible="1"/>
<field name="progress" widget="progressbar" invisible="context.get('set_visible',False)"/>
@@ -441,7 +441,7 @@
<group expand="0" string="Group By..." colspan="4" col="20">
<filter string="Users" name="group_user_id" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
<filter string="Project" name="group_project_id" icon="terp-folder-blue" domain="[]" context="{'group_by':'project_id'}"/>
<filter string="Stage" name="group_stage_id" icon="terp-stage" domain="[]" context="{'group_by':'type'}"/>
<filter string="Stage" name="group_stage_id" icon="terp-stage" domain="[]" context="{'group_by':'type_id'}"/>
<filter string="State" name="group_state" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
<separator orientation="vertical"/>
<filter string="Deadline" icon="terp-gnome-cpu-frequency-applet+" domain="[]" context="{'group_by':'date_deadline'}"/>
@@ -659,4 +659,4 @@
<act_window domain="[('project_id', '=', active_id)]" id="act_project_messages" name="Messages" res_model="project.message" src_model="project.project"/>
</data>
</openerp>
</openerp>
+2 -2
View File
@@ -83,7 +83,7 @@ class report_project_task_user(osv.osv):
t.name as name,
t.company_id,
t.partner_id,
t.type,
t.type_id,
remaining_hours as remaining_hours,
total_hours as total_hours,
t.delay_hours as hours_delay,
@@ -115,7 +115,7 @@ class report_project_task_user(osv.osv):
name,
t.company_id,
t.partner_id,
t.type
t.type_id
""")
+9 -9
View File
@@ -39,18 +39,18 @@
<field name="name">Long Term</field>
<field name="icon">terp-project</field>
</record>
<record id="project.project_task_116" model="project.task">
<field name="planned_hours">38.0</field>
<field name="remaining_hours">38.0</field>
<field name="timebox_id" ref="timebox_daily"/>
<field name="context_id" ref="context_office"/>
<field name="type" ref="project.project_tt_development"/>
<field name="type_id" ref="project.project_tt_development"/>
<field name="user_id" ref="base.user_root"/>
<field name="project_id" ref="project.project_project_22"/>
<field name="name">Specific adaptation to MRP</field>
</record>
<record id="project.project_task_201" model="project.task">
<field name="sequence">40</field>
<field name="planned_hours">32.0</field>
@@ -71,19 +71,19 @@
<field name="user_id" ref="base.user_root"/>
<field name="project_id" ref="project.project_project_22"/>
<field name="name">Validation + latest modifications.</field>
</record>
</record>
<record id="project.project_task_116" model="project.task">
<field name="planned_hours">38.0</field>
<field name="remaining_hours">38.0</field>
<field name="timebox_id" ref="timebox_daily"/>
<field name="context_id" ref="context_office"/>
<field name="type" ref="project.project_tt_development"/>
<field name="type_id" ref="project.project_tt_development"/>
<field name="user_id" ref="base.user_root"/>
<field name="project_id" ref="project.project_project_22"/>
<field name="name">Specific adaptation to MRP</field>
</record>
<record id="project.project_task_201" model="project.task">
<field name="sequence">40</field>
<field name="planned_hours">32.0</field>
@@ -104,7 +104,7 @@
<field name="user_id" ref="base.user_root"/>
<field name="project_id" ref="project.project_project_22"/>
<field name="name">Validation + latest modifications.</field>
</record>
</record>
</data>
</openerp>
+2 -2
View File
@@ -214,7 +214,7 @@ class project_task(osv.osv):
def search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False):
if not context:
context = context
context = {}
if not context.get('planning'):
return super(project_task,self).search(cr, user, args, offset, limit, order, context)
cr.execute(" SELECT t.id, t.name \
@@ -498,7 +498,7 @@ class report_account_analytic_planning_stat(osv.osv):
WHERE user_id=%s and account_id=%s and date>=%s and date<=%s''', (line.user_id.id, line.account_id.id, line.planning_id.date_from, line.planning_id.date_to))
else:
cr.execute('SELECT sum(unit_amount) FROM account_analytic_line WHERE account_id=%s AND date>=%s AND date<=%s', (line.account_id.id, line.planning_id.date_from, line.planning_id.date_to))
sum = cr.fetchone()
if sum and sum[0]:
result[line.id] = sum[0] * div2
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
@@ -15,11 +15,11 @@
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import scrum
import project_scrum
import report
import wizard
@@ -51,15 +51,15 @@
'init_xml': [],
'update_xml': [
'security/ir.model.access.csv',
'scrum_report.xml',
'wizard/scrum_backlog_create_task_view.xml',
'scrum_view.xml',
'process/scrum_process.xml',
'wizard/scrum_backlog_sprint_view.xml',
'wizard/scrum_backlog_merger_view.xml',
"board_scrum_view.xml",
'project_scrum_report.xml',
'wizard/project_scrum_backlog_create_task_view.xml',
'project_scrum_view.xml',
'process/project_scrum_process.xml',
'wizard/project_scrum_backlog_sprint_view.xml',
'wizard/project_scrum_backlog_merger_view.xml',
"board_project_scrum_view.xml",
],
'demo_xml': ['scrum_demo.xml'],
'demo_xml': ['project_scrum_demo.xml'],
'installable': True,
'active': False,
'certificate': '0084121063261',
@@ -2,8 +2,8 @@
<openerp>
<data>
<record id="view_scrum_sprint_dashboard_tree" model="ir.ui.view">
<field name="name">scrum.sprint.dashboard.tree</field>
<field name="model">scrum.sprint</field>
<field name="name">project.scrum.sprint.dashboard.tree</field>
<field name="model">project.scrum.sprint</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Scrum Sprint">
@@ -14,21 +14,21 @@
<field name="date_start"/>
<field name="progress" widget="progressbar"/>
<field name="effective_hours" sum="Effective hours" widget="float_time"/>
<field name="planned_hours" sum="Planned hours" widget="float_time"/>
<!-- field name="planned_hours" sum="Planned hours" widget="float_time"/> -->
<field name="expected_hours" sum="Expected hours" widget="float_time"/>
<field name="state"/>
<button type="object" string="Open" name="button_open" states="draft,pending" icon="gtk-jump-to"/>
<button type="object" string="Pending" name="button_pending" states="open" icon="gtk-media-pause"/>
<button type="object" string="Close" name="button_close" states="open,pending" icon="gtk-jump-to"/>
<button type="object" string="Set to Draft" name="button_draft" states="cancel,done" icon="gtk-convert"/>
<button name="%(scrum.report_scrum_sprint_burndown_chart)d" states="open,draft,close,cancel"
<button name="%(project_scrum.report_scrum_sprint_burndown_chart)d" states="open,draft,close,cancel"
string="Burndown Chart" type="action" icon="gtk-print"/>
</tree>
</field>
</record>
<record id="action_sprint_all_dashboard_tree" model="ir.actions.act_window">
<field name="name">Sprint's List</field>
<field name="res_model">scrum.sprint</field>
<field name="res_model">project.scrum.sprint</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_scrum_sprint_dashboard_tree"/>
@@ -1,14 +1,14 @@
<?xml version="1.0" ?>
<openerp>
<data>
<!--
<!--
Process Node
-->
<record id="process_node_productbacklog0" model="process.node">
<field name="menu_id" ref="scrum.menu_action_product_backlog_form"/>
<field name="model_id" ref="scrum.model_scrum_product_backlog"/>
<field name="menu_id" ref="menu_action_product_backlog_form"/>
<field name="model_id" ref="model_project_scrum_product_backlog"/>
<field eval="&quot;&quot;&quot;state&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;Product backlog&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;Create task from backlogs&quot;&quot;&quot;" name="note"/>
@@ -16,11 +16,11 @@
<field eval="&quot;&quot;&quot;object.state=='draft'&quot;&quot;&quot;" name="model_states"/>
<field eval="1" name="flow_start"/>
</record>
<!--
<!--
Process Transition
-->
<record id="process_transition_backlogtask0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
@@ -29,6 +29,6 @@
<field model="process.node" name="target_node_id" ref="project.process_node_drafttask0"/>
<field model="process.node" name="source_node_id" ref="process_node_productbacklog0"/>
</record>
</data>
</openerp>
</openerp>
@@ -27,7 +27,7 @@ import re
import tools
from tools.translate import _
class scrum_project(osv.osv):
class project_scrum_project(osv.osv):
_inherit = 'project.project'
_columns = {
'product_owner_id': fields.many2one('res.users', 'Product Owner', help="The person who is responsible for the product"),
@@ -39,11 +39,11 @@ class scrum_project(osv.osv):
'sprint_size': 15,
'scrum': 1
}
scrum_project()
project_scrum_project()
class scrum_sprint(osv.osv):
_name = 'scrum.sprint'
_description = 'Scrum Sprint'
class project_scrum_sprint(osv.osv):
_name = 'project.scrum.sprint'
_description = 'Project Scrum Sprint'
def _calc_progress(self, cr, uid, ids, name, args, context):
res = {}
@@ -115,10 +115,10 @@ class scrum_sprint(osv.osv):
'project_id': fields.many2one('project.project', 'Project', required=True, domain=[('scrum','=',1)], help="If you have [?] in the project name, it means there are no analytic account linked to this project."),
'product_owner_id': fields.many2one('res.users', 'Product Owner', required=True,help="The person who is responsible for the product"),
'scrum_master_id': fields.many2one('res.users', 'Scrum Master', required=True,help="The person who is maintains the processes for the product"),
'meeting_ids': fields.one2many('scrum.meeting', 'sprint_id', 'Daily Scrum'),
'meeting_ids': fields.one2many('project.scrum.meeting', 'sprint_id', 'Daily Scrum'),
'review': fields.text('Sprint Review'),
'retrospective': fields.text('Sprint Retrospective'),
'backlog_ids': fields.one2many('scrum.product.backlog', 'sprint_id', 'Sprint Backlog'),
'backlog_ids': fields.one2many('project.scrum.product.backlog', 'sprint_id', 'Sprint Backlog'),
'progress': fields.function(_calc_progress, method=True, string='Progress (0-100)', help="Computed as: Time Spent / Total Time."),
'effective_hours': fields.function(_calc_effective, method=True, string='Effective hours', help="Computed using the sum of the task work done."),
'expected_hours': fields.function(_calc_expected, method=True, string='Planned Hours', help='Estimated time to do the task.'),
@@ -153,10 +153,10 @@ class scrum_sprint(osv.osv):
v['date_stop'] = (DateTime.now() + DateTime.RelativeDateTime(days=int(proj.sprint_size or 14))).strftime('%Y-%m-%d')
return {'value':v}
scrum_sprint()
project_scrum_sprint()
class scrum_product_backlog(osv.osv):
_name = 'scrum.product.backlog'
class project_scrum_product_backlog(osv.osv):
_name = 'project.scrum.product.backlog'
_description = 'Product Backlog'
def name_search(self, cr, uid, name, args=None, operator='ilike', context=None, limit=100):
@@ -200,9 +200,10 @@ class scrum_product_backlog(osv.osv):
return res
def button_cancel(self, cr, uid, ids, context={}):
obj_project_task = self.pool.get('project.task')
self.write(cr, uid, ids, {'state':'cancel'}, context=context)
for backlog in self.browse(cr, uid, ids, context=context):
self.pool.get('project.task').write(cr, uid, [i.id for i in backlog.tasks_id], {'state': 'cancelled'})
obj_project_task.write(cr, uid, [i.id for i in backlog.tasks_id], {'state': 'cancelled'})
return True
def button_draft(self, cr, uid, ids, context={}):
@@ -217,9 +218,10 @@ class scrum_product_backlog(osv.osv):
return True
def button_close(self, cr, uid, ids, context={}):
obj_project_task = self.pool.get('project.task')
self.write(cr, uid, ids, {'state':'done'}, context=context)
for backlog in self.browse(cr, uid, ids, context=context):
self.pool.get('project.task').write(cr, uid, [i.id for i in backlog.tasks_id], {'state': 'done'})
obj_project_task.write(cr, uid, [i.id for i in backlog.tasks_id], {'state': 'done'})
message = _('Product Backlog ') + " '" + backlog.name + "' "+ _("is Closed.")
self.log(cr, uid, backlog.id, message)
return True
@@ -249,7 +251,7 @@ class scrum_product_backlog(osv.osv):
'active' : fields.boolean('Active', help="If Active field is set to true, it will allow you to hide the product backlog without removing it."),
'project_id': fields.many2one('project.project', 'Project', required=True, domain=[('scrum','=',1)], help="If you have [?] in the project name, it means there are no analytic account linked to this project."),
'user_id': fields.many2one('res.users', 'Author'),
'sprint_id': fields.many2one('scrum.sprint', 'Sprint'),
'sprint_id': fields.many2one('project.scrum.sprint', 'Sprint'),
'sequence' : fields.integer('Sequence', help="Gives the sequence order when displaying a list of product backlog."),
'tasks_id': fields.one2many('project.task', 'product_backlog_id', 'Tasks Details'),
'state': fields.selection([('draft','Draft'),('open','Open'),('pending','Pending'),('done','Done'),('cancel','Cancelled')], 'State', required=True),
@@ -265,42 +267,42 @@ class scrum_product_backlog(osv.osv):
'user_id': lambda self, cr, uid, context: uid,
}
_order = "sequence"
scrum_product_backlog()
project_scrum_product_backlog()
class scrum_task(osv.osv):
class project_scrum_task(osv.osv):
_name = 'project.task'
_inherit = 'project.task'
def _get_task(self, cr, uid, ids, context={}):
result = {}
for line in self.pool.get('scrum.product.backlog').browse(cr, uid, ids, context=context):
for line in self.pool.get('project.scrum.product.backlog').browse(cr, uid, ids, context=context):
for task in line.tasks_id:
result[task.id] = True
return result.keys()
_columns = {
'product_backlog_id': fields.many2one('scrum.product.backlog', 'Product Backlog',help="Related product backlog that contains this task. Used in SCRUM methodology"),
'sprint_id': fields.related('product_backlog_id','sprint_id', type='many2one', relation='scrum.sprint', string='Sprint',
'product_backlog_id': fields.many2one('project.scrum.product.backlog', 'Product Backlog',help="Related product backlog that contains this task. Used in SCRUM methodology"),
'sprint_id': fields.related('product_backlog_id','sprint_id', type='many2one', relation='project.scrum.sprint', string='Sprint',
store={
'project.task': (lambda self, cr, uid, ids, c={}: ids, ['product_backlog_id'], 10),
'scrum.product.backlog': (_get_task, ['sprint_id'], 10)
'project.scrum.product.backlog': (_get_task, ['sprint_id'], 10)
}),
}
def onchange_backlog_id(self, cr, uid, backlog_id):
if not backlog_id:
return {}
project_id = self.pool.get('scrum.product.backlog').browse(cr, uid, backlog_id).project_id.id
project_id = self.pool.get('project.scrum.product.backlog').browse(cr, uid, backlog_id).project_id.id
return {'value': {'project_id': project_id}}
scrum_task()
project_scrum_task()
class scrum_meeting(osv.osv):
_name = 'scrum.meeting'
class project_scrum_meeting(osv.osv):
_name = 'project.scrum.meeting'
_description = 'Scrum Meeting'
_order = 'date desc'
_columns = {
'name' : fields.char('Meeting Name', size=64),
'date': fields.date('Meeting Date', required=True),
'sprint_id': fields.many2one('scrum.sprint', 'Sprint', required=True),
'sprint_id': fields.many2one('project.scrum.sprint', 'Sprint', required=True),
'project_id': fields.many2one('project.project', 'Project'),
'question_yesterday': fields.text('Tasks since yesterday'),
'question_today': fields.text('Tasks for today'),
@@ -357,5 +359,5 @@ class scrum_meeting(osv.osv):
return False
return True
scrum_meeting()
project_scrum_meeting()
@@ -13,9 +13,9 @@
<field model="res.users" name="product_owner_id" search="[('login','=','demo')]"/>
</record>
<!-- Resource: scrum.sprint -->
<!-- Resource: project_scrum.sprint -->
<record id="scrum_sprint_0" model="scrum.sprint">
<record id="scrum_sprint_0" model="project.scrum.sprint">
<field name="date_stop">2005-12-20</field>
<field name="name">Sprint for V3.2.0</field>
<field model="res.users" name="scrum_master_id" search="[('login','=','demo')]"/>
@@ -26,7 +26,7 @@
<!-- Resource: project.product.backlog -->
<record id="scrum_product_backlog_0" model="scrum.product.backlog">
<record id="scrum_product_backlog_0" model="project.scrum.product.backlog">
<field name="priority">3</field>
<field name="name">Automatic migration system</field>
<field name="expected_hours">6.0</field>
@@ -35,54 +35,54 @@
<field name="state">done</field>
<field name="project_id" ref="scrum_project_1"/>
</record>
<record id="scrum_product_backlog_1" model="scrum.product.backlog">
<record id="scrum_product_backlog_1" model="project.scrum.product.backlog">
<field name="priority">3</field>
<field name="name">New accounting module</field>
<field name="expected_hours">111.0</field>
<field name="note">The accounting module of Open ERP (financial accounting and management accounting) is being reshaped. New functionnalities will be added: intangible assets, a new way of presenting ledgers and bookings, new stock valuation calculation, and lots of predefined reports. </field>
<field name="sprint_id" ref="scrum_sprint_0"/>
<field name="state">open</field>
<field name="state">open</field>
<field name="project_id" ref="scrum_project_1"/>
</record>
<record id="scrum_product_backlog_2" model="scrum.product.backlog">
<record id="scrum_product_backlog_2" model="project.scrum.product.backlog">
<field name="priority">3</field>
<field name="name">Automated Plugin System to install/uninstall modules</field>
<field name="expected_hours">4.0</field>
<field name="note">We have to develop a plug-in system which will enable to install/remove modules. The basic version of Open ERP will include only the required minimum, and you will select the modules thanks to the plug-in manager. This allows you to limit your system to your real needs: quality management, localisations, project and service management, marketing campaigns, and so on... </field>
<field name="sprint_id" ref="scrum_sprint_0"/>
<field name="state">open</field>
<field name="state">open</field>
<field name="project_id" ref="scrum_project_1"/>
</record>
<record id="scrum_product_backlog_3" model="scrum.product.backlog">
<record id="scrum_product_backlog_3" model="project.scrum.product.backlog">
<field name="name">Review all terms</field>
<field name="expected_hours">8.0</field>
<field name="sprint_id" ref="scrum_sprint_0"/>
<field name="state">done</field>
<field name="state">done</field>
<field name="project_id" ref="scrum_project_1"/>
</record>
<record id="scrum_product_backlog_4" model="scrum.product.backlog">
<record id="scrum_product_backlog_4" model="project.scrum.product.backlog">
<field name="name">Bugfixes</field>
<field name="expected_hours">6.0</field>
<field name="sprint_id" ref="scrum_sprint_0"/>
<field name="state">open</field>
<field name="state">open</field>
<field name="project_id" ref="scrum_project_1"/>
</record>
<record id="scrum_product_backlog_5" model="scrum.product.backlog">
<record id="scrum_product_backlog_5" model="project.scrum.product.backlog">
<field name="name">Test for 3.2.0 Publishing</field>
<field name="expected_hours">5.0</field>
<field name="note">Test Open ERP to release stable 3.2.0 version. (may be 3.2.0-pre1 ?)</field>
<field name="sprint_id" ref="scrum_sprint_0"/>
<field name="project_id" ref="scrum_project_1"/>
</record>
<record id="scrum_product_backlog_6" model="scrum.product.backlog">
<record id="scrum_product_backlog_6" model="project.scrum.product.backlog">
<field name="name">Reshape the complete menu</field>
<field name="expected_hours">4.0</field>
<field name="note">Restructure the Open ERP menu to be more like others ERP.</field>
<field name="sprint_id" ref="scrum_sprint_0"/>
<field name="state">open</field>
<field name="state">open</field>
<field name="project_id" ref="scrum_project_1"/>
</record>
<record id="scrum_product_backlog_7" model="scrum.product.backlog">
<record id="scrum_product_backlog_7" model="project.scrum.product.backlog">
<field name="name">Editable Trees</field>
<field name="expected_hours">12.0</field>
<field name="note">Editable trees in list and one2many_list widgets.</field>
@@ -98,7 +98,7 @@
<field name="project_id" ref="scrum_project_1"/>
<field name="name">Review all English Terms</field>
<field name="state">done</field>
<field eval="time.strftime('%Y-%m-%d')" name="date_close"/>
<field eval="time.strftime('%Y-%m-%d')" name="date_close"/>
<field name="product_backlog_id" ref="scrum_product_backlog_3"/>
</record>
<record id="scrum_task_4" model="project.task">
@@ -107,7 +107,7 @@
<field name="project_id" ref="scrum_project_1"/>
<field name="name">Review all french terms</field>
<field name="state">done</field>
<field eval="time.strftime('%Y-%m-%d')" name="date_close"/>
<field eval="time.strftime('%Y-%m-%d')" name="date_close"/>
<field name="product_backlog_id" ref="scrum_product_backlog_3"/>
</record>
<record id="scrum_task_5" model="project.task">
@@ -116,7 +116,7 @@
<field name="project_id" ref="scrum_project_1"/>
<field name="name">Analytic Accounting features</field>
<field name="state">done</field>
<field eval="time.strftime('%Y-%m-%d')" name="date_close"/>
<field eval="time.strftime('%Y-%m-%d')" name="date_close"/>
<field name="product_backlog_id" ref="scrum_product_backlog_1"/>
</record>
<record id="scrum_task_6" model="project.task">
@@ -149,7 +149,7 @@
<field name="description">Cash book, general ledger, accounts list, aged trial balance</field>
<field name="name">Accounting Report General</field>
<field name="state">open</field>
<field eval="[(6,0,[ref('scrum.scrum_task_8')])]" name="child_ids"/>
<field eval="[(6,0,[ref('scrum_task_8')])]" name="child_ids"/>
<field name="product_backlog_id" ref="scrum_product_backlog_1"/>
</record>
<record id="scrum_task_10" model="project.task">
@@ -164,7 +164,7 @@
<field model="res.users" name="user_id" search="[('login','=','demo')]"/>
<field name="project_id" ref="scrum_project_1"/>
<field name="name">Accounting Report Analytic</field>
<field name="state">open</field>
<field name="state">open</field>
<field name="product_backlog_id" ref="scrum_product_backlog_1"/>
</record>
<record id="scrum_task_12" model="project.task">
@@ -173,7 +173,7 @@
<field name="project_id" ref="scrum_project_1"/>
<field name="name">Bugfix - memory leak</field>
<field name="state">done</field>
<field eval="time.strftime('%Y-%m-%d')" name="date_close"/>
<field eval="time.strftime('%Y-%m-%d')" name="date_close"/>
<field name="product_backlog_id" ref="scrum_product_backlog_4"/>
</record>
<record id="scrum_task_13" model="project.task">
@@ -181,8 +181,8 @@
<field model="res.users" name="user_id" search="[('login','=','demo')]"/>
<field name="project_id" ref="scrum_project_1"/>
<field name="name">Bugfix - Translations</field>
<field name="state">open</field>
<field eval="[(6,0,[ref('scrum.scrum_task_12')])]" name="child_ids"/>
<field name="state">open</field>
<field eval="[(6,0,[ref('scrum_task_12')])]" name="child_ids"/>
<field name="product_backlog_id" ref="scrum_product_backlog_4"/>
</record>
<record id="scrum_task_14" model="project.task">
@@ -205,7 +205,7 @@
<field model="res.users" name="user_id" search="[('login','=','demo')]"/>
<field name="project_id" ref="scrum_project_1"/>
<field name="name">Test 3.2.0 before releasing</field>
<field name="state">open</field>
<field name="state">open</field>
<field name="product_backlog_id" ref="scrum_product_backlog_5"/>
</record>
<record id="scrum_task_17" model="project.task">
@@ -214,10 +214,10 @@
<field name="project_id" ref="scrum_project_1"/>
<field name="description">default values, onchange, required, add on top or bottom and shortcuts (Ctrl S, Ctrl X, ...)</field>
<field name="name">Editable trees</field>
<field name="state">open</field>
<field name="state">open</field>
<field name="product_backlog_id" ref="scrum_product_backlog_7"/>
</record>
<record id="scrum_meeting_0" model="scrum.meeting">
<record id="scrum_meeting_0" model="project.scrum.meeting">
<field name="question_yesterday">
Admin: Worked on the Automatic migration system
Demo: Worked on the Test 3.2.0 before releasing
@@ -228,7 +228,7 @@ Demo: Work on Editable trees</field>
<field name="question_blocks">
Demo :Bugfix - memory leak
</field>
<field name="sprint_id" ref="scrum.scrum_sprint_0"/>
<field name="sprint_id" ref="scrum_sprint_0"/>
<field eval="time.strftime('%Y-%m-%d')" name="date"/>
</record>
<record id="project_task_work_scrum_task1" model="project.task.work">
@@ -247,7 +247,7 @@ Demo :Bugfix - memory leak
<field eval="5.0" name="hours"/>
<field eval="time.strftime('%Y-%m-%d')" name="date"/>
</record>
<record id="project_task_work_scrum_task2" model="project.task.work">
<field name="user_id" ref="base.user_root"/>
<field name="name">Create a script for migration and testing</field>
@@ -264,6 +264,6 @@ Demo :Bugfix - memory leak
<field eval="10.0" name="hours"/>
<field eval="time.strftime('%Y-%m-%d')" name="date"/>
</record>
</data>
</openerp>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<report auto="False" id="report_scrum_sprint_burndown_chart" model="scrum.sprint" name="scrum.sprint.burndown" string="Burndown Chart"/>
<report auto="False" id="report_scrum_sprint_burndown_chart" model="project.scrum.sprint" name="scrum.sprint.burndown" string="Burndown Chart"/>
</data>
</openerp>
@@ -29,8 +29,8 @@
-->
<record id="view_scrum_product_backlog_tree" model="ir.ui.view">
<field name="name">scrum.product.backlog.tree</field>
<field name="model">scrum.product.backlog</field>
<field name="name">project.scrum.product.backlog.tree</field>
<field name="model">project.scrum.product.backlog</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree colors="grey:state in ('cancel','done');blue:state in ('pending')" string="Product Backlog">
@@ -52,8 +52,8 @@
</record>
<record id="view_scrum_product_backlog_form" model="ir.ui.view">
<field name="name">scrum.product.backlog.form</field>
<field name="model">scrum.product.backlog</field>
<field name="name">project.scrum.product.backlog.form</field>
<field name="model">project.scrum.product.backlog</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Product backlog">
@@ -124,8 +124,8 @@
</record>
<record model="ir.ui.view" id="view_scrum_product_backlog_search">
<field name="name">scrum.product.backlog.search</field>
<field name="model">scrum.product.backlog</field>
<field name="name">project.scrum.product.backlog.search</field>
<field name="model">project.scrum.product.backlog</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Product Backlogs">
@@ -177,7 +177,7 @@
<record id="action_product_backlog_form" model="ir.actions.act_window">
<field name="name">Product Backlogs</field>
<field name="res_model">scrum.product.backlog</field>
<field name="res_model">project.scrum.product.backlog</field>
<field name="view_type">form</field>
<field name="context">{'search_default_current': 1}</field>
<field name="search_view_id" ref="view_scrum_product_backlog_search"/>
@@ -193,8 +193,8 @@
-->
<record id="view_scrum_sprint_tree" model="ir.ui.view">
<field name="name">scrum.sprint.tree</field>
<field name="model">scrum.sprint</field>
<field name="name">project.scrum.sprint.tree</field>
<field name="model">project.scrum.sprint</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree colors="blue:state in ('pending');grey:state in ('cancel','done')" string="Scrum Sprint">
@@ -215,8 +215,8 @@
</field>
</record>
<record id="view_scrum_sprint_form" model="ir.ui.view">
<field name="name">scrum.sprint.form</field>
<field name="model">scrum.sprint</field>
<field name="name">project.scrum.sprint.form</field>
<field name="model">project.scrum.sprint</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Scrum Sprint">
@@ -265,8 +265,8 @@
</record>
<record model="ir.ui.view" id="view_scrum_sprint_search">
<field name="name">scrum.sprint.search</field>
<field name="model">scrum.sprint</field>
<field name="name">project.scrum.sprint.search</field>
<field name="model">project.scrum.sprint</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Sprints">
@@ -296,7 +296,7 @@
<record id="action_sprint_all_tree" model="ir.actions.act_window">
<field name="name">Sprints</field>
<field name="res_model">scrum.sprint</field>
<field name="res_model">project.scrum.sprint</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_scrum_sprint_tree"/>
@@ -312,8 +312,8 @@
-->
<record id="view_scrum_meeting_tree" model="ir.ui.view">
<field name="name">scrum.meeting.tree</field>
<field name="model">scrum.meeting</field>
<field name="name">project.scrum.meeting.tree</field>
<field name="model">project.scrum.meeting</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Scrum Sprint">
@@ -324,7 +324,7 @@
</record>
<record id="view_scrum_meeting_form" model="ir.ui.view">
<field name="name">Scrum Meeting</field>
<field name="model">scrum.meeting</field>
<field name="model">project.scrum.meeting</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Scrum Sprint">
@@ -358,8 +358,8 @@
</record>
<record id="view_scrum_meeting_search" model="ir.ui.view">
<field name="name">scrum.meeting.search</field>
<field name="model">scrum.meeting</field>
<field name="name">project_scrum.meeting.search</field>
<field name="model">project.scrum.meeting</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Scrum Sprint">
@@ -383,7 +383,7 @@
<record id="action_meeting_form" model="ir.actions.act_window">
<field name="name">Scrum Meetings</field>
<field name="res_model">scrum.meeting</field>
<field name="res_model">project.scrum.meeting</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{'search_default_scrum_daily':1}</field>
@@ -405,14 +405,14 @@
</record>
<record id="ir_scrum_sprint_open_task" model="ir.values">
<field eval=" 'tree_but_open'" name="key2"/>
<field eval="'scrum.sprint'" name="model"/>
<field eval="'project.scrum.sprint'" name="model"/>
<field name="name">View sprint tasks</field>
<field eval="'ir.actions.act_window,'+str(action_sprint_task_open)" name="value"/>
<field eval="True" name="object"/>
</record>
<record id="action_sprint_backlog_open" model="ir.actions.act_window">
<field name="res_model">scrum.product.backlog</field>
<field name="res_model">project.scrum.product.backlog</field>
<field name="name">View sprint backlog</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
@@ -420,7 +420,7 @@
</record>
<record id="ir_scrum_sprint_open_sprint" model="ir.values">
<field eval=" 'tree_but_open'" name="key2"/>
<field eval="'scrum.sprint'" name="model"/>
<field eval="'project.scrum.sprint'" name="model"/>
<field name="name">View sprint backlog</field>
<field eval="'ir.actions.act_window,'+str(action_sprint_backlog_open)" name="value"/>
<field eval="True" name="object"/>
@@ -431,7 +431,7 @@
-->
<record id="dblc_proj" model="ir.actions.act_window">
<field name="res_model">scrum.product.backlog</field>
<field name="res_model">project.scrum.product.backlog</field>
<field name="name">View project's backlog</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
@@ -439,7 +439,7 @@
</record>
<record id="ir_scrum_project_backlog" model="ir.values">
<field eval=" 'tree_but_open'" name="key2"/>
<field eval="'scrum.project'" name="model"/>
<field eval="'project.scrum.project'" name="model"/>
<field name="name">View project's backlog</field>
<field eval="'ir.actions.act_window,'+str(dblc_proj)" name="value"/>
<field eval="True" name="object"/>
@@ -453,7 +453,7 @@
</record>
<record id="ir_scrum_project_task" model="ir.values">
<field eval=" 'tree_but_open'" name="key2"/>
<field eval="'scrum.project'" name="model"/>
<field eval="'project.scrum.project'" name="model"/>
<field name="name">View project's tasks</field>
<field eval="'ir.actions.act_window,'+str(dblc_proj2)" name="value"/>
<field eval="True" name="object"/>
@@ -509,6 +509,7 @@
<field name="project_id" position="after">
<field name="sprint_id" context="{'sprint_invisible':False}">
<filter icon="terp-check" string="Current" context="{'sprint_invisible':False}" domain="[('sprint_id.state','in',('draft','open'))]" help="Current Sprints"/>
<filter icon="terp-check" string="Current" context="{'sprint_invisible':False}" domain="[]" help="View Sprints"/>
</field>
</field>
</field>
@@ -532,8 +533,8 @@
domain="[('sprint_id', '=', active_id)]"
id="act_scrum_sprint_2_product_backlog"
name="Backlogs"
res_model="scrum.product.backlog"
src_model="scrum.sprint"
res_model="project.scrum.product.backlog"
src_model="project.scrum.sprint"
view_mode="tree,form"
view_type="form"/>
@@ -542,7 +543,7 @@
id="act_scrum_sprint_2_project_task"
name="Tasks"
res_model="project.task"
src_model="scrum.sprint"
src_model="project.scrum.sprint"
view_mode="tree,form"
view_type="form"/>
@@ -48,9 +48,9 @@ class report_tasks(report_int):
canv = canvas.init(fname=io, format='pdf')
canv.set_author("Open ERP")
cr.execute('select id,date_start,date_stop from scrum_sprint where id=%s', (datas['id'],))
cr.execute('select id,date_start,date_stop from project_scrum_sprint where id=%s', (datas['id'],))
for (id,date_start,date_stop) in cr.fetchall():
cr.execute('select id from project_task where product_backlog_id in(select id from scrum_product_backlog where sprint_id=%s)', (id,))
cr.execute('select id from project_task where product_backlog_id in(select id from project_scrum_product_backlog where sprint_id=%s)', (id,))
ids = map(lambda x: x[0], cr.fetchall())
datas = _burndown.compute_burndown(cr, uid, ids, date_start, date_stop)

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