* Infolog - Fix parent contact going missing when creating a sub entry

This commit is contained in:
nathangray 2017-11-06 15:16:08 -07:00
parent 1848f6d35f
commit 590b23b2a8
4 changed files with 80 additions and 7 deletions

View File

@ -1054,7 +1054,7 @@ class infolog_bo
// Update modified timestamp of parent // Update modified timestamp of parent
if($values['info_id_parent'] && $touch_modified) if($values['info_id_parent'] && $touch_modified)
{ {
$parent = $this->read($values['info_id_parent'], false, 'server', true); $parent = $this->read($values['info_id_parent'], true, 'server', true);
$this->write($parent, false, true, false, true, false, null, $ignore_acl); $this->write($parent, false, true, false, true, false, null, $ignore_acl);
} }
} }
@ -1072,6 +1072,8 @@ class infolog_bo
protected function write_check_links(&$values) protected function write_check_links(&$values)
{ {
$old_link_id = (int)$values['info_link_id']; $old_link_id = (int)$values['info_link_id'];
$from = $values['info_from'];
if($values['info_contact'] && !( if($values['info_contact'] && !(
is_array($values['info_contact']) && $values['info_contact']['id'] == 'none' is_array($values['info_contact']) && $values['info_contact']['id'] == 'none'
) || ( ) || (
@ -1132,7 +1134,8 @@ class infolog_bo
else else
{ {
unset($values['info_link_id']); unset($values['info_link_id']);
$values['info_from'] = null; unset($values['info_contact']);
$values['info_from'] = $from ? $from : null;
} }
if($values['info_id'] && $values['old_pm_id'] !== $values['pm_id']) if($values['info_id'] && $values['old_pm_id'] !== $values['pm_id'])
{ {

View File

@ -207,7 +207,7 @@
</box> </box>
<box id="enddate_popup" class="action_popup prompt"> <box id="enddate_popup" class="action_popup prompt">
<vbox> <vbox>
<description value="End date" class="promptheader"/> <description value="Due date" class="promptheader"/>
<description id="enddate_action[title]"/> <description id="enddate_action[title]"/>
<date-time id="enddate" class="action_popup-content"/> <date-time id="enddate" class="action_popup-content"/>
<hbox> <hbox>

View File

@ -42,9 +42,11 @@ class ContactTest extends \EGroupware\Api\AppTest
public function tearDown() public function tearDown()
{ {
// Double delete to make sure it's gone, not preserved due to history setting // Double delete to make sure it's gone, not preserved due to history setting
$this->bo->delete($this->info_id); if($this->info_id)
$this->bo->delete($this->info_id); {
$this->bo->delete($this->info_id);
$this->bo->delete($this->info_id);
}
$this->bo = null; $this->bo = null;
} }
@ -153,6 +155,71 @@ class ContactTest extends \EGroupware\Api\AppTest
// Make a call to edit, looks like initial load // Make a call to edit, looks like initial load
$_REQUEST['info_id'] = $this->info_id; $_REQUEST['info_id'] = $this->info_id;
$this->ui->edit(); $this->ui->edit();
unset($_REQUEST['info_id']);
}
/**
* Test that creating a sub-infolog keeps info_contact on the parent
*
* @ticket 24920
*/
public function testSubEntry()
{
// Parent needs a project & contact for this
$content = array(
'contact' => array(
'app' => 'addressbook',
'id' => Null,
'search'=> 'Free text'
)
);
$parent = $this->getTestInfolog($content);
// Skipping notifications - save initial state
$parent_id = $this->bo->write($parent, true, true, true, true);
// Mock the etemplate call to check sub gets parent's contact
$sub = array();
$this->ui->tmpl->expects($this->once())
->method('exec')
->will(
$this->returnCallback(function($method, $info) use($parent, &$sub) {
$this->assertNull($info['info_id']);
$this->assertEquals($parent['info_id'], $info['info_id_parent']);
$this->assertEquals($parent['info_contact']['id'], $info['info_contact']['id']);
$this->assertEquals($parent['info_contact']['app'], $info['info_contact']['app']);
$this->assertEquals($parent['info_from'], $info['info_from']);
$sub = $info;
return true;
})
);
// Make a sub-entry
$_REQUEST['action'] = 'sp';
$_REQUEST['action_id'] = $parent['info_id'];
$this->ui->edit();
// Skipping notifications - save initial state
$this->info_id = $this->bo->write($sub, true, true, true, true);
// Read it back to check
$saved = $this->bo->read($this->info_id);
$this->assertEquals($parent['pm_id'], $saved['pm_id']);
$this->assertEquals($parent['info_from'], $saved['info_from']);
$this->assertEquals(json_encode($parent['info_contact']), json_encode($saved['info_contact']));
$this->assertEquals($parent_id, $saved['info_id_parent']);
// Check parent
$parent_reload = $this->bo->read($parent_id);
$this->assertEquals($parent['pm_id'], $parent_reload['pm_id']);
$this->assertEquals($parent['info_from'], $parent_reload['info_from']);
$this->assertEquals($parent['info_contact'], $parent_reload['info_contact']);
// Remove parent (twice, for history preservation)
$this->bo->delete($parent_id);
$this->bo->delete($parent_id);
} }
/** /**

View File

@ -481,7 +481,10 @@ class SetProjectManagerTest extends \EGroupware\Api\AppTest
$info = $this->bo->read($this->info_id); $info = $this->bo->read($this->info_id);
// Check contact was cleared // Check contact was cleared
$this->assertNull($info['info_contact'], 'Contact was not cleared'); $this->assertTrue(is_null($info['info_contact']) || (
$info['info_contact']['id'] == 'none' && !$info['info_contact']['search']),
'Contact was not cleared'
);
// Check pm_id is gone // Check pm_id is gone
$this->assertNull($info['pm_id'], 'Project was not removed'); $this->assertNull($info['pm_id'], 'Project was not removed');