From 9d2cf73253089464ec06c23e029ea74be5655a35 Mon Sep 17 00:00:00 2001 From: "dle@openerp.com" <> Date: Wed, 17 Apr 2013 18:17:03 +0200 Subject: [PATCH 01/33] [FIX]crm: lead/opp convert/opp wizard: Add salesperson and salesteam in wizard form bzr revid: dle@openerp.com-20130417161703-z3id6hb20c9pceho --- addons/crm/crm_lead.py | 7 +++- addons/crm/wizard/crm_lead_to_opportunity.py | 28 +++++++++++++--- .../wizard/crm_lead_to_opportunity_view.xml | 14 ++++---- addons/crm/wizard/crm_merge_opportunities.py | 19 ++++++++++- .../wizard/crm_merge_opportunities_view.xml | 33 +++++++++++-------- 5 files changed, 75 insertions(+), 26 deletions(-) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 2361f12d61b..b8e8b58aaf4 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -628,7 +628,7 @@ class crm_lead(base_stage, format_address, osv.osv): attachment.write(values) return True - def merge_opportunity(self, cr, uid, ids, context=None): + def merge_opportunity(self, cr, uid, ids, user_id=False, section_id=False, context=None): """ Different cases of merge: - merge leads together = 1 new lead @@ -662,6 +662,11 @@ class crm_lead(base_stage, format_address, osv.osv): fields = list(CRM_LEAD_FIELDS_TO_MERGE) merged_data = self._merge_data(cr, uid, ids, highest, fields, context=context) + if user_id: + merged_data['user_id'] = user_id + if section_id: + merged_data['section_id'] = section_id + # Merge messages and attachements into the first opportunity self._merge_opportunity_history(cr, uid, highest.id, tail_opportunities, context=context) self._merge_opportunity_attachments(cr, uid, highest.id, tail_opportunities, context=context) diff --git a/addons/crm/wizard/crm_lead_to_opportunity.py b/addons/crm/wizard/crm_lead_to_opportunity.py index e67b7c0c7be..ca99de80779 100644 --- a/addons/crm/wizard/crm_lead_to_opportunity.py +++ b/addons/crm/wizard/crm_lead_to_opportunity.py @@ -35,6 +35,8 @@ class crm_lead2opportunity_partner(osv.osv_memory): ('merge', 'Merge with existing opportunities') ], 'Conversion Action', required=True), 'opportunity_ids': fields.many2many('crm.lead', string='Opportunities'), + 'user_id': fields.many2one('res.users', 'Salesperson', select=True), + 'section_id': fields.many2one('crm.case.section', 'Sales Team', select=True), } def default_get(self, cr, uid, fields, context=None): @@ -74,9 +76,27 @@ class crm_lead2opportunity_partner(osv.osv_memory): res.update({'name' : len(tomerge) >= 2 and 'merge' or 'convert'}) if 'opportunity_ids' in fields and len(tomerge) >= 2: res.update({'opportunity_ids': list(tomerge)}) - + if lead.user_id: + res.update({'user_id': lead.user_id.id}) + if lead.section_id: + res.update({'section_id': lead.section_id.id}) return res + def on_change_user(self, cr, uid, ids, user_id, section_id, context=None): + """ When changing the user, also set a section_id or restrict section id + to the ones user_id is member of. """ + if user_id: + if section_id: + user_in_section = self.pool.get('crm.case.section').search(cr, uid, [('id', '=', section_id), '|', ('user_id', '=', user_id), ('member_ids', '=', user_id)], context=context, count=True) + else: + user_in_section = False + if not user_in_section: + section_id = False + section_ids = self.pool.get('crm.case.section').search(cr, uid, ['|', ('user_id', '=', user_id), ('member_ids', '=', user_id)], context=context) + if section_ids: + section_id = section_ids[0] + return {'value': {'section_id': section_id}} + def view_init(self, cr, uid, fields, context=None): """ Check some preconditions before the wizard executes. @@ -118,15 +138,15 @@ class crm_lead2opportunity_partner(osv.osv_memory): w = self.browse(cr, uid, ids, context=context)[0] opp_ids = [o.id for o in w.opportunity_ids] if w.name == 'merge': - lead_id = self.pool.get('crm.lead').merge_opportunity(cr, uid, opp_ids, context=context) + lead_id = self.pool.get('crm.lead').merge_opportunity(cr, uid, opp_ids, w.user_id.id, w.section_id.id, context=context) lead_ids = [lead_id] lead = self.pool.get('crm.lead').read(cr, uid, lead_id, ['type'], context=context) if lead['type'] == "lead": context.update({'active_ids': lead_ids}) - self._convert_opportunity(cr, uid, ids, {'lead_ids': lead_ids}, context=context) + self._convert_opportunity(cr, uid, ids, {'lead_ids': lead_ids, 'user_ids': [w.user_id.id], 'section_id': w.section_id.id}, context=context) else: lead_ids = context.get('active_ids', []) - self._convert_opportunity(cr, uid, ids, {'lead_ids': lead_ids}, context=context) + self._convert_opportunity(cr, uid, ids, {'lead_ids': lead_ids, 'user_ids': [w.user_id.id], 'section_id': w.section_id.id}, context=context) return self.pool.get('crm.lead').redirect_opportunity_view(cr, uid, lead_ids[0], context=context) diff --git a/addons/crm/wizard/crm_lead_to_opportunity_view.xml b/addons/crm/wizard/crm_lead_to_opportunity_view.xml index 4093df910d0..e06ff091960 100644 --- a/addons/crm/wizard/crm_lead_to_opportunity_view.xml +++ b/addons/crm/wizard/crm_lead_to_opportunity_view.xml @@ -10,6 +10,10 @@ + + + + @@ -56,6 +60,10 @@ attrs="{'required': [('action', '=', 'exist')], 'invisible':[('action','!=','exist')]}" class="oe_inline"/> + + + + @@ -72,12 +80,6 @@ - - - - - - - - - - - - Re-evaluate Task - ir.actions.act_window - project.task.reevaluate - form - form - new - - - diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 33e4fcb409c..4c89c4def60 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -21,7 +21,6 @@ from openerp import SUPERUSER_ID from openerp.addons.base_status.base_stage import base_stage -from openerp.addons.project.project import _TASK_STATE from openerp.addons.crm import crm from datetime import datetime from openerp.osv import fields, osv, orm @@ -247,13 +246,6 @@ class project_issue(base_stage, osv.osv): 'partner_id': fields.many2one('res.partner', 'Contact', select=1), 'company_id': fields.many2one('res.company', 'Company'), 'description': fields.text('Private Note'), - 'state': fields.related('stage_id', 'state', type="selection", store=True, - selection=_TASK_STATE, string="Status", readonly=True, - help='The status is set to \'Draft\', when a case is created.\ - If the case is in progress the status is set to \'Open\'.\ - When the case is over, the status is set to \'Done\'.\ - If the case needs to be reviewed then the status is \ - set to \'Pending\'.'), 'kanban_state': fields.selection([('normal', 'Normal'),('blocked', 'Blocked'),('done', 'Ready for next stage')], 'Kanban State', track_visibility='onchange', help="A Issue's kanban state indicates special situations affecting it:\n" From 9e17dd58d819d00fa6c00d7f28355d6c1ba94d32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 26 Jun 2013 16:22:42 +0200 Subject: [PATCH 03/33] [FIX] project: fixed various report views + some filters. bzr revid: tde@openerp.com-20130626142242-aztr40zazsl20eif --- addons/project/project.py | 11 ++++--- addons/project/project_view.xml | 3 +- addons/project/report/project_cumulative.xml | 4 +-- addons/project/report/project_report.py | 6 ++-- addons/project/report/project_report_view.xml | 29 ++++++++++--------- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index 738c512fe16..2e6e351fefb 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1301,7 +1301,7 @@ class project_task_history(osv.osv): def _get_date(self, cr, uid, ids, name, arg, context=None): result = {} for history in self.browse(cr, uid, ids, context=context): - if history.state in ('done','cancelled'): + if history.type_id and history.type_id.fold: result[history.id] = history.date continue cr.execute('''select @@ -1335,14 +1335,13 @@ class project_task_history(osv.osv): _columns = { 'task_id': fields.many2one('project.task', 'Task', ondelete='cascade', required=True, select=True), 'type_id': fields.many2one('project.task.type', 'Stage'), - 'state': fields.selection([('draft', 'New'), ('cancelled', 'Cancelled'),('open', 'In Progress'),('pending', 'Pending'), ('done', 'Done')], 'Status'), - 'kanban_state': fields.selection([('normal', 'Normal'),('blocked', 'Blocked'),('done', 'Ready for next stage')], 'Kanban State', required=False), + 'kanban_state': fields.selection([('normal', 'Normal'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')], 'Kanban State', required=False), 'date': fields.date('Date', select=True), 'end_date': fields.function(_get_date, string='End Date', type="date", store={ 'project.task.history': (_get_related_date, None, 20) }), - 'remaining_hours': fields.float('Remaining Time', digits=(16,2)), - 'planned_hours': fields.float('Planned Time', digits=(16,2)), + 'remaining_hours': fields.float('Remaining Time', digits=(16, 2)), + 'planned_hours': fields.float('Planned Time', digits=(16, 2)), 'user_id': fields.many2one('res.users', 'Responsible'), } _defaults = { @@ -1372,7 +1371,7 @@ class project_task_history_cumulative(osv.osv): SELECT h.id AS history_id, h.date+generate_series(0, CAST((coalesce(h.end_date, DATE 'tomorrow')::date - h.date) AS integer)-1) AS date, - h.task_id, h.type_id, h.user_id, h.kanban_state, h.state, + h.task_id, h.type_id, h.user_id, h.kanban_state, greatest(h.remaining_hours, 1) AS remaining_hours, greatest(h.planned_hours, 1) AS planned_hours, t.project_id FROM diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 8eafacd3bc0..cc040983030 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -36,8 +36,9 @@ + - + diff --git a/addons/project/report/project_cumulative.xml b/addons/project/report/project_cumulative.xml index 17e059c8de7..9b9490f0b28 100644 --- a/addons/project/report/project_cumulative.xml +++ b/addons/project/report/project_cumulative.xml @@ -14,7 +14,6 @@ - @@ -40,8 +39,7 @@ - - + diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py index a14ca10dfce..e7d431662b3 100644 --- a/addons/project/report/project_report.py +++ b/addons/project/report/project_report.py @@ -19,9 +19,11 @@ # ############################################################################## +from openerp.tools.misc import MONTHS from openerp.osv import fields, osv from openerp import tools + class report_project_task_user(osv.osv): _name = "report.project.task.user" _description = "Tasks by user and project" @@ -36,7 +38,7 @@ class report_project_task_user(osv.osv): 'date_end': fields.date('Ending Date', readonly=True), 'date_deadline': fields.date('Deadline', readonly=True), 'date_last_stage_update': fields.date('Last Stage Update', readonly=True), - 'month_last_stage_update': fields.date('Month of Last Stage Update', readonly=True), + 'month_last_stage_update': fields.selection(MONTHS, 'Month of Last Stage Update', readonly=True), 'project_id': fields.many2one('project.project', 'Project', readonly=True), 'hours_planned': fields.float('Planned Hours', readonly=True), 'hours_effective': fields.float('Effective Hours', readonly=True), @@ -52,7 +54,7 @@ class report_project_task_user(osv.osv): 'nbr': fields.integer('# of tasks', readonly=True), 'priority': fields.selection([('4', 'Very Low'), ('3', 'Low'), ('2', 'Medium'), ('1', 'Urgent'), ('0', 'Very urgent')], string='Priority', readonly=True), - 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')], 'Month', readonly=True), + 'month':fields.selection(MONTHS, 'Month', readonly=True), 'state': fields.selection([('draft', 'Draft'), ('open', 'In Progress'), ('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')],'Status', readonly=True), 'company_id': fields.many2one('res.company', 'Company', readonly=True), 'partner_id': fields.many2one('res.partner', 'Contact', readonly=True), diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml index 38107ab9bcf..ffaf23ccc4e 100644 --- a/addons/project/report/project_report_view.xml +++ b/addons/project/report/project_report_view.xml @@ -11,19 +11,6 @@ report.project.task.user - - - - - - - - - - - - - @@ -35,6 +22,21 @@ + + + + + + + + + + + + + + + @@ -63,6 +65,7 @@ + Date: Wed, 26 Jun 2013 16:26:28 +0200 Subject: [PATCH 04/33] [FIX] project_gtd: fixed reference to state field of task bzr revid: tde@openerp.com-20130626142628-30ti78hg5xh0kue0 --- addons/project_gtd/wizard/project_gtd_empty.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project_gtd/wizard/project_gtd_empty.py b/addons/project_gtd/wizard/project_gtd_empty.py index 3233e2534af..b477c12567a 100644 --- a/addons/project_gtd/wizard/project_gtd_empty.py +++ b/addons/project_gtd/wizard/project_gtd_empty.py @@ -52,7 +52,7 @@ class project_timebox_empty(osv.osv_memory): raise osv.except_osv(_('Error!'), _('No timebox child of this one!')) tids = obj_task.search(cr, uid, [('timebox_id', '=', context['active_id'])]) for task in obj_task.browse(cr, uid, tids, context): - if (task.state in ('cancel','done')) or (task.user_id.id <> uid): + if (task.stage_id and task.stage_id.fold) or (task.user_id.id <> uid): close.append(task.id) else: up.append(task.id) From 991f907dece1e58e8279d54b688904e205cab5ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 26 Jun 2013 16:31:29 +0200 Subject: [PATCH 05/33] [FIX] project_gtd: some fixes and improvements in task related views bzr revid: tde@openerp.com-20130626143129-zio6ied20h7nnjct --- addons/project_gtd/project_gtd_view.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/project_gtd/project_gtd_view.xml b/addons/project_gtd/project_gtd_view.xml index 4bfd5b783c7..8335ae35c93 100644 --- a/addons/project_gtd/project_gtd_view.xml +++ b/addons/project_gtd/project_gtd_view.xml @@ -79,7 +79,6 @@ -