From 8392b4d3d08809050a1238a3f6bbd0e6b7805839 Mon Sep 17 00:00:00 2001 From: Thibault Francois Date: Thu, 24 Feb 2011 15:22:16 +0100 Subject: [PATCH 01/77] [FIX] hard code template bzr revid: tfr@openerp.com-20110224142216-x61sd77ad269cquk --- addons/crm/wizard/crm_send_email.py | 3 +- .../wizard/crm_forward_to_partner.py | 56 +++++++++++-------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/addons/crm/wizard/crm_send_email.py b/addons/crm/wizard/crm_send_email.py index 3ce5942272d..8dff88296ab 100644 --- a/addons/crm/wizard/crm_send_email.py +++ b/addons/crm/wizard/crm_send_email.py @@ -57,7 +57,7 @@ class crm_send_new_email(osv.osv_memory): 'body': fields.text('Message Body', required=True), 'state': fields.selection(AVAILABLE_STATES, string='Set New State To', required=True), 'attachment_ids' : fields.one2many('crm.send.mail.attachment', 'wizard_id'), - 'html': fields.boolean('HTML formatting?', help="Select this if you want to send email with HTML formatting."), + 'html': fields.boolean('HTML formatting?', help="Select this if you want to send email with HTML formatting."), } def action_send(self, cr, uid, ids, context=None): @@ -180,7 +180,6 @@ class crm_send_new_email(osv.osv_memory): user_obj = self.pool.get('res.users') user_mail_from = user_obj._get_email_from(cr, uid, [uid], context=context)[uid] - for case in mod_obj.browse(cr, uid, res_id, context=context): if 'email_to' in fields: res.update({'email_to': case.email_from and tools.ustr(case.email_from) or ''}) diff --git a/addons/crm_partner_assign/wizard/crm_forward_to_partner.py b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py index 7173f466148..b06881f6b60 100644 --- a/addons/crm_partner_assign/wizard/crm_forward_to_partner.py +++ b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py @@ -44,9 +44,10 @@ class crm_lead_forward_to_partner(osv.osv_memory): _defaults = { 'name' : 'email', 'history': 'latest', - 'email_from': lambda self, cr, uid, *a: self.pool.get('res.users')._get_email_from(cr, uid, uid)[uid] + 'email_from': lambda self, cr, uid, *a: self.pool.get('res.users')._get_email_from(cr, uid, uid)[uid], } + def get_whole_history(self, cr, uid, ids, context=None): """This function gets whole communication history and returns as top posting style @param self: The object pointer @@ -87,7 +88,7 @@ class crm_lead_forward_to_partner(osv.osv_memory): @param uid: the current user’s ID for security checks, @param ids: List of Mail’s IDs @param user: Changed User id - @param partner: Changed Partner id + @param partner: Changed Partner id """ if not user: return {'value': {'email_to': False}} @@ -146,7 +147,7 @@ class crm_lead_forward_to_partner(osv.osv_memory): @param uid: the current user’s ID for security checks, @param ids: List of Mail’s IDs @param user: Changed User id - @param partner: Changed Partner id + @param partner: Changed Partner id """ if not partner_id: return {'value' : {'email_to' : False, 'address_id': False}} @@ -155,13 +156,13 @@ class crm_lead_forward_to_partner(osv.osv_memory): addr = partner_obj.address_get(cr, uid, [partner_id], ['contact']) data = {'address_id': addr['contact']} data.update(self.on_change_address(cr, uid, ids, addr['contact'])['value']) - + partner = partner_obj.browse(cr, uid, [partner_id]) user_id = partner and partner[0].user_id or False email = user_id and user_id.user_email or '' data.update({'email_cc' : email}) return { - 'value' : data, + 'value' : data, 'domain' : {'address_id' : partner_id and "[('partner_id', '=', partner_id)]" or "[]"} } @@ -207,7 +208,17 @@ class crm_lead_forward_to_partner(osv.osv_memory): return {'type': 'ir.actions.act_window_close'} def get_lead_details(self, cr, uid, lead_id, context=None): - body = [] + body = ["""Hello, + +OpenERP Leads are now forwarded to our trusted partners, through the CRM, we hope that they provide you with interesting projects, we know that they have shown keen interest in our software. +Below is an interesting lead for you. I have notified the lead that you would contact them. + +Please let us know about the advancements of this lead or if you are not able to answer to its requests by replying to this email. This way, we can keep track of closed leads or forward them to other partners. +Don't forget to propose our maintenance at the beginning of your implementation projects, together with your services quotation. The maintenance provides unlimited bugfixing that will avoid you waste time on bugs detected during the implementation. It also provides free migration services for the current stable version at the time of signature; otherwise if we released a new version during your implementation, the customer would not always be able to easily migrate to newer versions. + +Kind regards, OpenERP Team + + """, "\n\n"] 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' or not lead.partner_address_id: @@ -237,22 +248,22 @@ class crm_lead_forward_to_partner(osv.osv_memory): elif lead.type == 'opportunity': pa = lead.partner_address_id body = [ - "Partner: %s" % (lead.partner_id and lead.partner_id.name_get()[0][1]), - "Contact: %s" % (pa.name or ''), - "Title: %s" % (pa.title or ''), - "Function: %s" % (pa.function or ''), - "Street: %s" % (pa.street or ''), - "Street2: %s" % (pa.street2 or ''), - "Zip: %s" % (pa.zip or ''), - "City: %s" % (pa.city or ''), - "Country: %s" % (pa.country_id and pa.country_id.name_get()[0][1] or ''), - "State: %s" % (pa.state_id and pa.state_id.name_get()[0][1] or ''), - "Email: %s" % (pa.email or ''), - "Phone: %s" % (pa.phone or ''), - "Fax: %s" % (pa.fax or ''), - "Mobile: %s" % (pa.mobile or ''), - "Lead Category: %s" % (lead.categ_id and lead.categ_id.name or ''), - "Details: %s" % (lead.description or ''), + "Partner: %s" % (lead.partner_id and lead.partner_id.name_get()[0][1]), + "Contact: %s" % (pa.name or ''), + "Title: %s" % (pa.title or ''), + "Function: %s" % (pa.function or ''), + "Street: %s" % (pa.street or ''), + "Street2: %s" % (pa.street2 or ''), + "Zip: %s" % (pa.zip or ''), + "City: %s" % (pa.city or ''), + "Country: %s" % (pa.country_id and pa.country_id.name_get()[0][1] or ''), + "State: %s" % (pa.state_id and pa.state_id.name_get()[0][1] or ''), + "Email: %s" % (pa.email or ''), + "Phone: %s" % (pa.phone or ''), + "Fax: %s" % (pa.fax or ''), + "Mobile: %s" % (pa.mobile or ''), + "Lead Category: %s" % (lead.categ_id and lead.categ_id.name or ''), + "Details: %s" % (lead.description or ''), ] return "\n".join(body + ['---']) @@ -264,7 +275,6 @@ class crm_lead_forward_to_partner(osv.osv_memory): context = {} defaults = super(crm_lead_forward_to_partner, self).default_get(cr, uid, fields, context=context) - active_id = context.get('active_id') if not active_id: return defaults From 739dd7000e04030896c7f63c2a16426ef14ef966 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Thu, 24 Feb 2011 16:28:50 +0100 Subject: [PATCH 02/77] [IMP] We use the analytic account associated to the project bzr revid: stephane@openerp.com-20110224152850-3poei06fhja3wm5w --- addons/project_issue_sheet/project_issue_sheet.py | 12 +++++++++++- .../project_issue_sheet/project_issue_sheet_view.xml | 9 ++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/addons/project_issue_sheet/project_issue_sheet.py b/addons/project_issue_sheet/project_issue_sheet.py index f96ce9a4ac5..ed14fc99177 100644 --- a/addons/project_issue_sheet/project_issue_sheet.py +++ b/addons/project_issue_sheet/project_issue_sheet.py @@ -27,8 +27,18 @@ class project_issue(osv.osv): _description = 'project issue' _columns = { 'timesheet_ids': fields.one2many('hr.analytic.timesheet', 'issue_id', 'Timesheets'), - 'analytic_account_id': fields.related('project_id', 'analytic_account_id', type='many2one', relation='account.analytic.account',string='Analytic Account') + 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account'), } + + def on_change_project(self, cr, uid, ids, project_id, context=None): + if not project_id: + return {} + project = self.pool.get('project.project').browse(cr, uid, project_id, context=context) + account = project.analytic_account_id + if account: + return {'value' : {'analytic_account_id' : account.id}} + else: + return {} project_issue() diff --git a/addons/project_issue_sheet/project_issue_sheet_view.xml b/addons/project_issue_sheet/project_issue_sheet_view.xml index 2222ef12ea5..78950e5f749 100644 --- a/addons/project_issue_sheet/project_issue_sheet_view.xml +++ b/addons/project_issue_sheet/project_issue_sheet_view.xml @@ -7,9 +7,16 @@ form + + on_change_project(project_id) + + + + - From c0bee8c4e3924c33d66a20b7b47325fd8e3971e0 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Thu, 24 Feb 2011 17:09:53 +0100 Subject: [PATCH 03/77] [IMP] The responsible of the project issue is the manager of the associated project. [IMP] There is a new domain on the resolution field, allow to select the project.task.type associated to the selected project. [IMP] The assigned_to field is the connected user, but can be changed by the user bzr revid: stephane@openerp.com-20110224160953-fv9p2qhkqdseh183 --- addons/project/project.py | 5 +++ addons/project_issue/project_issue.py | 9 +++--- addons/project_issue/project_issue_view.xml | 35 ++++++++++----------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index bff63746d9a..d197da37709 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -26,6 +26,10 @@ from datetime import datetime, date from tools.translate import _ from osv import fields, osv +class project_project(osv.osv): + _name = 'project.project' + +project_project() class project_task_type(osv.osv): _name = 'project.task.type' @@ -35,6 +39,7 @@ class project_task_type(osv.osv): 'name': fields.char('Stage Name', required=True, size=64, translate=True), 'description': fields.text('Description'), 'sequence': fields.integer('Sequence'), + 'project_ids': fields.many2many('project.project', 'project_task_type_rel', 'type_id', 'project_id', 'Projects'), } _defaults = { diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index aaaff37305e..b4ec852a558 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -45,7 +45,7 @@ class project_issue(crm.crm_case, osv.osv): _description = "Project Issue" _order = "priority, id desc" _inherit = ['mailgate.thread'] - + def case_open(self, cr, uid, ids, *args): """ @param self: The object pointer @@ -175,7 +175,7 @@ class project_issue(crm.crm_case, osv.osv): '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.'), - 'user_id': fields.many2one('res.users', 'Responsible'), + 'user_id': fields.related('project_id', 'user_id', type='many2one', relation='res.users', store=True, select=1, string='Responsible'), 'partner_id': fields.many2one('res.partner', 'Partner'), 'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \ domain="[('partner_id','=',partner_id)]"), @@ -200,7 +200,7 @@ class project_issue(crm.crm_case, osv.osv): 'partner_name': fields.char("Employee's Name", size=64), 'partner_mobile': fields.char('Mobile', size=32), 'partner_phone': fields.char('Phone', size=32), - 'type_id': fields.many2one ('project.task.type', 'Resolution'), + 'type_id': fields.many2one ('project.task.type', 'Resolution', domain="[('project_ids', '=', project_id)]"), 'project_id':fields.many2one('project.project', 'Project'), 'duration': fields.float('Duration'), 'task_id': fields.many2one('project.task', 'Task', domain="[('project_id','=',project_id)]"), @@ -208,7 +208,7 @@ class project_issue(crm.crm_case, osv.osv): method=True, multi='day_open', type="float", store=True), 'day_close': fields.function(_compute_day, string='Days to Close', \ method=True, multi='day_close', type="float", store=True), - 'assigned_to': fields.related('task_id', 'user_id', string = 'Assigned to', type="many2one", relation="res.users", store=True, help='This is the current user to whom the related task have been assigned'), + 'assigned_to': fields.many2one('res.users', 'Assigned to', required=True, select=1), 'working_hours_open': fields.function(_compute_day, string='Working Hours to Open the Issue', \ method=True, multi='working_days_open', type="float", store=True), 'working_hours_close': fields.function(_compute_day, string='Working Hours to Close the Issue', \ @@ -241,6 +241,7 @@ class project_issue(crm.crm_case, osv.osv): 'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.helpdesk', context=c), 'priority': crm.AVAILABLE_PRIORITIES[2][0], 'project_id':_get_project, + 'assigned_to' : lambda obj, cr, uid, context: uid, } def convert_issue_task(self, cr, uid, ids, context=None): diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index 23a361b0ff9..36fee3f661c 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -52,13 +52,14 @@
- - - - - + + + + + + - + + Forward to Partner crm.lead.forward.to.partner form form - + new + + + crm.new.mass.forward.mail.form + crm.lead.mass.forward.to.partner + form + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +