From 33c550f1c94088ac935964e39c94cbf8466886fd Mon Sep 17 00:00:00 2001 From: gpa Date: Tue, 11 Jan 2011 12:14:20 +0530 Subject: [PATCH 001/331] [IMP]partner:added suppliers menu domain bzr revid: gpa@tinyerp.com-20110111064420-9p05fwjsizqbtubz --- bin/addons/base/res/partner/partner_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/addons/base/res/partner/partner_view.xml b/bin/addons/base/res/partner/partner_view.xml index 8c949a7f410..3f225f29e49 100644 --- a/bin/addons/base/res/partner/partner_view.xml +++ b/bin/addons/base/res/partner/partner_view.xml @@ -394,7 +394,7 @@ ir.actions.act_window res.partner form - [] + [('supplier','=',1)] {'default_customer':0, 'search_default_supplier': 1, 'default_supplier':1} You can access all information regarding your suppliers from the supplier form: accounting data, history of emails, meetings, purchases, etc. You can uncheck the 'Suppliers' filter button in order to search in all your partners, including customers and prospects. From 6a11b89e1729c6ac06efba1e75405e1ecd24dc8a Mon Sep 17 00:00:00 2001 From: Julien Thewys Date: Wed, 9 Feb 2011 11:07:35 +0100 Subject: [PATCH 002/331] [FIX] ensures no illegitimate cli argument is silently discarded This avoids an insidious behavior: when copy-pasting a command from a Microsoft document to the cmd terminal, one might not see that a hyphen ('-') preceding an option has been converted to a dash (u'\u2012') which is then interpreted as a normal cli argument (i.e. not an option) and thus silently discarded. bzr revid: jth@openerp.com-20110209100735-jaschhlv3cfqjry5 --- openerp/tools/config.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/openerp/tools/config.py b/openerp/tools/config.py index 7d0b04739e4..626720a43c2 100644 --- a/openerp/tools/config.py +++ b/openerp/tools/config.py @@ -251,12 +251,14 @@ class configmanager(object): self.parse_config() def parse_config(self, args=[]): - opt = self.parser.parse_args(args)[0] + opt, args = self.parser.parse_args() def die(cond, msg): if cond: - print msg - sys.exit(1) + self.parser.error(msg) + + # Ensures no illegitimate argument is silently discarded (avoids insidious "hyphen to dash" problem) + die(args, "unrecognized parameters were passed: '%s'" % " ".join(args)) die(bool(opt.syslog) and bool(opt.logfile), "the syslog and logfile options are exclusive") From 8392b4d3d08809050a1238a3f6bbd0e6b7805839 Mon Sep 17 00:00:00 2001 From: Thibault Francois Date: Thu, 24 Feb 2011 15:22:16 +0100 Subject: [PATCH 003/331] [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 004/331] [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 005/331] [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 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +