Merge lp:~openerp-dev/openobject-addons/trunk-bug-713367-jam into lp:openobject-addons

Proposed by Jigar A.
Status: Merged
Approved by: tfr (Openerp)
Approved revision: no longer in the source branch.
Merged at revision: 4474
Proposed branch: lp:~openerp-dev/openobject-addons/trunk-bug-713367-jam
Merge into: lp:openobject-addons
Diff against target: 169 lines (+68/-26)
1 file modified
project/project.py (+68/-26)
To merge this branch: bzr merge lp:~openerp-dev/openobject-addons/trunk-bug-713367-jam
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+52011@code.launchpad.net

Description of the change

Hello,
  Changes with Merge Proposal :
    + Bug lp:713367: Project Template Duplication Error Remove
    + Project Task : Check Recursion Algorithm Re Worked By TFR
  Kindly Review this.
Thank You

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'project/project.py'
--- project/project.py 2011-02-21 14:05:10 +0000
+++ project/project.py 2011-03-03 07:01:33 +0000
@@ -205,20 +205,37 @@
205 if context is None:205 if context is None:
206 context = {}206 context = {}
207207
208 proj = self.browse(cr, uid, id, context=context)
209 default = default or {}208 default = default or {}
210 context['active_test'] = False209 context['active_test'] = False
211 default['state'] = 'open'210 default['state'] = 'open'
212 if not default.get('name', False):211 if not default.get('name', False):
213 default['name'] = proj.name + _(' (copy)')212 default['name'] = proj.name + _(' (copy)')
213
214 res = super(project, self).copy(cr, uid, id, default, context)214 res = super(project, self).copy(cr, uid, id, default, context)
215 return res
216
217
218 def template_copy(self, cr, uid, id, default={}, context=None):
219 task_obj = self.pool.get('project.task')
220 proj = self.browse(cr, uid, id, context=context)
221
222 default['tasks'] = [] #avoid to copy all the task automaticly
223 res = self.copy(cr, uid, id, default=default, context=context)
224
225 #copy all the task manually
226 map_task_id = {}
227 for task in proj.tasks:
228 map_task_id[task.id] = task_obj.copy(cr, uid, task.id, {}, context=context)
229
230 self.write(cr, uid, res, {'tasks':[(6,0, map_task_id.values())]})
231 task_obj.duplicate_task(cr, uid, map_task_id, context=context)
215232
216 return res233 return res
217234
218 def duplicate_template(self, cr, uid, ids, context=None):235 def duplicate_template(self, cr, uid, ids, context=None):
219 if context is None:236 if context is None:
220 context = {}237 context = {}
221 project_obj = self.pool.get('project.project')238 task_pool = self.pool.get('project.task')
222 data_obj = self.pool.get('ir.model.data')239 data_obj = self.pool.get('ir.model.data')
223 result = []240 result = []
224 for proj in self.browse(cr, uid, ids, context=context):241 for proj in self.browse(cr, uid, ids, context=context):
@@ -231,7 +248,7 @@
231 end_date = date(*time.strptime(proj.date,'%Y-%m-%d')[:3])248 end_date = date(*time.strptime(proj.date,'%Y-%m-%d')[:3])
232 new_date_end = (datetime(*time.strptime(new_date_start,'%Y-%m-%d')[:3])+(end_date-start_date)).strftime('%Y-%m-%d')249 new_date_end = (datetime(*time.strptime(new_date_start,'%Y-%m-%d')[:3])+(end_date-start_date)).strftime('%Y-%m-%d')
233 context.update({'copy':True})250 context.update({'copy':True})
234 new_id = project_obj.copy(cr, uid, proj.id, default = {251 new_id = self.template_copy(cr, uid, proj.id, default = {
235 'name': proj.name +_(' (copy)'),252 'name': proj.name +_(' (copy)'),
236 'state':'open',253 'state':'open',
237 'date_start':new_date_start,254 'date_start':new_date_start,
@@ -332,7 +349,7 @@
332349
333 def onchange_planned(self, cr, uid, ids, planned = 0.0, effective = 0.0):350 def onchange_planned(self, cr, uid, ids, planned = 0.0, effective = 0.0):
334 return {'value':{'remaining_hours': planned - effective}}351 return {'value':{'remaining_hours': planned - effective}}
335 352
336 def onchange_project(self, cr, uid, id, project_id):353 def onchange_project(self, cr, uid, id, project_id):
337 if not project_id:354 if not project_id:
338 return {}355 return {}
@@ -341,7 +358,7 @@
341 if partner_id:358 if partner_id:
342 return {'value':{'partner_id':partner_id.id}}359 return {'value':{'partner_id':partner_id.id}}
343 return {}360 return {}
344 361
345 def _default_project(self, cr, uid, context=None):362 def _default_project(self, cr, uid, context=None):
346 if context is None:363 if context is None:
347 context = {}364 context = {}
@@ -349,6 +366,25 @@
349 return int(context['project_id'])366 return int(context['project_id'])
350 return False367 return False
351368
369 def duplicate_task(self, cr, uid, map_ids, context=None):
370 for new in map_ids.values():
371 task = self.browse(cr, uid, new, context)
372 child_ids = [ ch.id for ch in task.child_ids]
373 if task.child_ids:
374 for child in task.child_ids:
375 if child.id in map_ids.keys():
376 child_ids.remove(child.id)
377 child_ids.append(map_ids[child.id])
378
379 parent_ids = [ ch.id for ch in task.parent_ids]
380 if task.parent_ids:
381 for parent in task.parent_ids:
382 if parent.id in map_ids.keys():
383 parent_ids.remove(parent.id)
384 parent_ids.append(map_ids[parent.id])
385 #FIXME why there is already the copy and the old one
386 self.write(cr, uid, new, {'parent_ids':[(6,0,set(parent_ids))], 'child_ids':[(6,0, set(child_ids))]})
387
352 def copy_data(self, cr, uid, id, default={}, context=None):388 def copy_data(self, cr, uid, id, default={}, context=None):
353 default = default or {}389 default = default or {}
354 default.update({'work_ids':[], 'date_start': False, 'date_end': False, 'date_deadline': False})390 default.update({'work_ids':[], 'date_start': False, 'date_end': False, 'date_deadline': False})
@@ -360,7 +396,7 @@
360 default['name'] = self.browse(cr, uid, id, context=context).name or ''396 default['name'] = self.browse(cr, uid, id, context=context).name or ''
361 if not context.get('copy',False):397 if not context.get('copy',False):
362 new_name = _("%s (copy)")%default.get('name','')398 new_name = _("%s (copy)")%default.get('name','')
363 default.update({'name':new_name}) 399 default.update({'name':new_name})
364 return super(task, self).copy_data(cr, uid, id, default, context)400 return super(task, self).copy_data(cr, uid, id, default, context)
365401
366 def _check_dates(self, cr, uid, ids, context=None):402 def _check_dates(self, cr, uid, ids, context=None):
@@ -448,27 +484,33 @@
448 _order = "sequence,priority, date_start, name, id"484 _order = "sequence,priority, date_start, name, id"
449485
450 def _check_recursion(self, cr, uid, ids, context=None):486 def _check_recursion(self, cr, uid, ids, context=None):
451 obj_task = self.browse(cr, uid, ids[0], context=context)487 for id in ids:
452 parent_ids = [x.id for x in obj_task.parent_ids]488 visited_branch = set()
453 children_ids = [x.id for x in obj_task.child_ids]489 visited_node = set()
454490 res = self._check_cycle(cr, uid, id, visited_branch, visited_node, context=context)
455 if (obj_task.id in children_ids) or (obj_task.id in parent_ids):491 if not res:
492 return False
493
494 return True
495
496 def _check_cycle(self, cr, uid, id, visited_branch, visited_node, context=None):
497 if id in visited_branch: #Cycle
456 return False498 return False
457499
458 while(ids):500 if id in visited_node: #Already tested don't work one more time for nothing
459 cr.execute('SELECT DISTINCT task_id '\501 return True
460 'FROM project_task_parent_rel '\502
461 'WHERE parent_id IN %s', (tuple(ids),))503 visited_branch.add(id)
462 child_ids = map(lambda x: x[0], cr.fetchall())504 visited_node.add(id)
463 c_ids = child_ids505
464 if (list(set(parent_ids).intersection(set(c_ids)))) or (obj_task.id in c_ids):506 #visit child using DFS
507 task = self.browse(cr, uid, id, context=context)
508 for child in task.child_ids:
509 res = self._check_cycle(cr, uid, child.id, visited_branch, visited_node, context=context)
510 if not res:
465 return False511 return False
466 while len(c_ids):512
467 s_ids = self.search(cr, uid, [('parent_ids', 'in', c_ids)])513 visited_branch.remove(id)
468 if (list(set(parent_ids).intersection(set(s_ids)))):
469 return False
470 c_ids = s_ids
471 ids = child_ids
472 return True514 return True
473515
474 def _check_dates(self, cr, uid, ids, context=None):516 def _check_dates(self, cr, uid, ids, context=None):
@@ -478,9 +520,9 @@
478 start = obj_task.date_start or False520 start = obj_task.date_start or False
479 end = obj_task.date_end or False521 end = obj_task.date_end or False
480 if start and end :522 if start and end :
481 if start > end: 523 if start > end:
482 return False524 return False
483 return True 525 return True
484526
485 _constraints = [527 _constraints = [
486 (_check_recursion, 'Error ! You cannot create recursive tasks.', ['parent_ids']),528 (_check_recursion, 'Error ! You cannot create recursive tasks.', ['parent_ids']),

Subscribers

People subscribed via source and target branches

to all changes: