/** * @covers Alchemy\Phrasea\Controller\Prod\Property::changeStatus */ public function testChangeStatus() { $file = new File(self::$DI['app'], self::$DI['app']['mediavorus']->guess(__DIR__ . '/../../../../../files/cestlafete.jpg'), self::$DI['collection']); $record = \record_adapter::createFromFile($file, self::$DI['app']); $record2 = \record_adapter::createFromFile($file, self::$DI['app']); $story = \record_adapter::createStory(self::$DI['app'], self::$DI['collection']); $story->appendChild($record2); self::$DI['client']->request('POST', '/prod/records/property/status/', ['apply_to_children' => [$story->get_sbas_id() => true], 'status' => [$record->get_sbas_id() => [6 => true, 8 => true, 11 => true]], 'lst' => implode(';', [$record->get_serialize_key(), $story->get_serialize_key()])]); $response = self::$DI['client']->getResponse(); $datas = (array) json_decode($response->getContent()); $this->assertArrayHasKey('success', $datas); $this->assertTrue($datas['success']); $this->assertArrayHasKey('updated', $datas); $record = new \record_adapter(self::$DI['app'], $record->get_sbas_id(), $record->get_record_id()); $story = new \record_adapter(self::$DI['app'], $story->get_sbas_id(), $story->get_record_id()); $recordStatus = strrev($record->get_status()); $storyStatus = strrev($story->get_status()); $this->assertEquals(1, substr($recordStatus, 6, 1)); $this->assertEquals(1, substr($recordStatus, 8, 1)); $this->assertEquals(1, substr($recordStatus, 11, 1)); $this->assertEquals(1, substr($storyStatus, 6, 1)); $this->assertEquals(1, substr($storyStatus, 8, 1)); $this->assertEquals(1, substr($storyStatus, 11, 1)); foreach ($story->get_children() as $child) { $childStatus = strrev($child->get_status()); $this->assertEquals(1, substr($childStatus, 6, 1)); $this->assertEquals(1, substr($childStatus, 8, 1)); $this->assertEquals(1, substr($childStatus, 11, 1)); } $record->delete(); $record2->delete(); $story->delete(); unset($response, $datas, $story, $record, $record2, $story, $file); }
/** * @covers Alchemy\Phrasea\Controller\Prod\Property::changeStatus */ public function testChangeStatus() { $file = new File(self::$DI['app'], self::$DI['app']['mediavorus']->guess(__DIR__ . '/../../../../../files/cestlafete.jpg'), self::$DI['collection']); $record = \record_adapter::createFromFile($file, self::$DI['app']); $record2 = \record_adapter::createFromFile($file, self::$DI['app']); $story = \record_adapter::createStory(self::$DI['app'], self::$DI['collection']); $story->appendChild($record2); $acl = $this->getMockBuilder('ACL')->disableOriginalConstructor()->getMock(); $acl->expects($this->any())->method('has_access_to_record')->with($this->isInstanceOf('\\record_adapter'))->will($this->returnValue(true)); $acl->expects($this->any())->method('has_right_on_base')->with($this->isType(\PHPUnit_Framework_Constraint_IsType::TYPE_INT), $this->equalTo('chgstatus'))->will($this->returnValue(true)); $acl->expects($this->any())->method('has_right_on_sbas')->with($this->isType(\PHPUnit_Framework_Constraint_IsType::TYPE_INT), $this->equalTo('chgstatus'))->will($this->returnValue(true)); $aclProvider = $this->getMockBuilder('Alchemy\\Phrasea\\Authentication\\ACLProvider')->disableOriginalConstructor()->getMock(); $aclProvider->expects($this->any())->method('get')->will($this->returnValue($acl)); self::$DI['app']['acl'] = $aclProvider; self::$DI['client']->request('POST', '/prod/records/property/status/', ['apply_to_children' => [$story->get_sbas_id() => true], 'status' => [$record->get_sbas_id() => [6 => true, 8 => true, 11 => true]], 'lst' => implode(';', [$record->get_serialize_key(), $story->get_serialize_key()])]); $response = self::$DI['client']->getResponse(); $datas = (array) json_decode($response->getContent()); $this->assertArrayHasKey('success', $datas); $this->assertTrue($datas['success']); $this->assertArrayHasKey('updated', $datas); $record = new \record_adapter(self::$DI['app'], $record->get_sbas_id(), $record->get_record_id()); $story = new \record_adapter(self::$DI['app'], $story->get_sbas_id(), $story->get_record_id()); $recordStatus = strrev($record->get_status()); $storyStatus = strrev($story->get_status()); $this->assertEquals(1, substr($recordStatus, 6, 1)); $this->assertEquals(1, substr($recordStatus, 8, 1)); $this->assertEquals(1, substr($recordStatus, 11, 1)); $this->assertEquals(1, substr($storyStatus, 6, 1)); $this->assertEquals(1, substr($storyStatus, 8, 1)); $this->assertEquals(1, substr($storyStatus, 11, 1)); foreach ($story->get_children() as $child) { $childStatus = strrev($child->get_status()); $this->assertEquals(1, substr($childStatus, 6, 1)); $this->assertEquals(1, substr($childStatus, 8, 1)); $this->assertEquals(1, substr($childStatus, 11, 1)); } $record->delete(); $record2->delete(); $story->delete(); unset($response, $datas, $story, $record, $record2, $story, $file); }
/** * * @param array $lst * @param Boolean $flatten_groupings * * @return set_selection */ public function load_list(array $lst, $flatten_groupings = false) { foreach ($lst as $basrec) { $basrec = explode('_', $basrec); if (count($basrec) == 2) { try { $record = new record_adapter($this->app, (int) $basrec[0], (int) $basrec[1], count($this->elements)); } catch (\Exception $e) { continue; } if ($record->isStory() && $flatten_groupings === true) { foreach ($record->get_children() as $rec) { $this->add_element($rec); } } else { $this->add_element($record); } } } return $this; }
/** * * @param Application $app * @param string $lst * @param integer $sstid * @param integer $storyWZid * @return set_export */ public function __construct(Application $app, $lst, $sstid, $storyWZid = null) { $this->app = $app; $download_list = []; $remain_hd = []; if ($storyWZid) { $repository = $app['EM']->getRepository('\\Entities\\StoryWZ'); $storyWZ = $repository->findByUserAndId($this->app, $app['authentication']->getUser(), $storyWZid); $lst = $storyWZ->getRecord($this->app)->get_serialize_key(); } if ($sstid != "") { $repository = $app['EM']->getRepository('Phraseanet:Basket'); /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ $Basket = $repository->findUserBasket($sstid, $app['authentication']->getUser(), false); $this->exportName = str_replace([' ', '\\', '/'], '_', $Basket->getName()) . "_" . date("Y-n-d"); foreach ($Basket->getElements() as $basket_element) { $base_id = $basket_element->getRecord($this->app)->get_base_id(); $record_id = $basket_element->getRecord($this->app)->get_record_id(); if (!isset($remain_hd[$base_id])) { if ($app['acl']->get($app['authentication']->getUser())->is_restricted_download($base_id)) { $remain_hd[$base_id] = $app['acl']->get($app['authentication']->getUser())->remaining_download($base_id); } else { $remain_hd[$base_id] = false; } } $current_element = $download_list[] = new record_exportElement($app, $basket_element->getRecord($this->app)->get_sbas_id(), $record_id, $Basket->getName(), $remain_hd[$base_id]); $remain_hd[$base_id] = $current_element->get_remain_hd(); } } else { $this->exportName = "Export_" . date("Y-n-d") . '_' . mt_rand(100, 999); $tmp_lst = explode(';', $lst); $n = 1; foreach ($tmp_lst as $basrec) { $basrec = explode('_', $basrec); if (count($basrec) != 2) { continue; } try { $record = new record_adapter($this->app, $basrec[0], $basrec[1]); } catch (\Exception_Record_AdapterNotFound $e) { continue; } if ($record->is_grouping()) { foreach ($record->get_children() as $child_basrec) { $base_id = $child_basrec->get_base_id(); $record_id = $child_basrec->get_record_id(); if (!isset($remain_hd[$base_id])) { if ($app['acl']->get($app['authentication']->getUser())->is_restricted_download($base_id)) { $remain_hd[$base_id] = $app['acl']->get($app['authentication']->getUser())->remaining_download($base_id); } else { $remain_hd[$base_id] = false; } } $current_element = $download_list[] = new record_exportElement($app, $child_basrec->get_sbas_id(), $record_id, $record->get_title(null, null, true) . '_' . $n, $remain_hd[$base_id]); $remain_hd[$base_id] = $current_element->get_remain_hd(); } } else { $base_id = $record->get_base_id(); $record_id = $record->get_record_id(); if (!isset($remain_hd[$base_id])) { if ($app['acl']->get($app['authentication']->getUser())->is_restricted_download($base_id)) { $remain_hd[$base_id] = $app['acl']->get($app['authentication']->getUser())->remaining_download($base_id); } else { $remain_hd[$base_id] = false; } } $current_element = $download_list[$basrec[0] . '_' . $basrec[1]] = new record_exportElement($app, $record->get_sbas_id(), $record_id, '', $remain_hd[$base_id]); $remain_hd[$base_id] = $current_element->get_remain_hd(); } $n++; } } $this->elements = $download_list; $display_download = []; $display_orderable = []; $this->total_download = 0; $this->total_order = 0; $this->total_ftp = 0; $this->businessFieldsAccess = false; foreach ($this->elements as $download_element) { if ($app['acl']->get($app['authentication']->getUser())->has_right_on_base($download_element->get_base_id(), 'canmodifrecord')) { $this->businessFieldsAccess = true; } foreach ($download_element->get_downloadable() as $name => $properties) { if (!isset($display_download[$name])) { $display_download[$name] = ['size' => 0, 'total' => 0, 'available' => 0, 'refused' => []]; } $display_download[$name]['total']++; if ($properties !== false) { $display_download[$name]['available']++; $display_download[$name]['label'] = $properties['label']; $display_download[$name]['class'] = $properties['class']; $this->total_download++; $display_download[$name]['size'] += $download_element->get_size($name); } else { $display_download[$name]['refused'][] = $download_element->get_thumbnail(); } } foreach ($download_element->get_orderable() as $name => $properties) { if (!isset($display_orderable[$name])) { $display_orderable[$name] = ['total' => 0, 'available' => 0, 'refused' => []]; } $display_orderable[$name]['total']++; if ($properties !== false) { $display_orderable[$name]['available']++; $this->total_order++; } else { $display_orderable[$name]['refused'][] = $download_element->get_thumbnail(); } } } foreach ($display_download as $name => $values) { $display_download[$name]['size'] = (int) $values['size']; } $display_ftp = []; $hasadminright = $app['acl']->get($app['authentication']->getUser())->has_right('addrecord') || $app['acl']->get($app['authentication']->getUser())->has_right('deleterecord') || $app['acl']->get($app['authentication']->getUser())->has_right('modifyrecord') || $app['acl']->get($app['authentication']->getUser())->has_right('coll_manage') || $app['acl']->get($app['authentication']->getUser())->has_right('coll_modify_struct'); $this->ftp_datas = []; if ($this->app['conf']->get(['registry', 'ftp', 'ftp-enabled']) && ($hasadminright || $this->app['conf']->get(['registry', 'ftp', 'ftp-user-access']))) { $display_ftp = $display_download; $this->total_ftp = $this->total_download; $lst_base_id = array_keys($app['acl']->get($app['authentication']->getUser())->get_granted_base()); if ($hasadminright) { $sql = "SELECT Users.id AS usr_id ,Users.login AS usr_login ,Users.email AS usr_mail, FtpCredential.*\n FROM (\n FtpCredential INNER JOIN Users ON (\n FtpCredential.active = 1 AND FtpCredential.user_id = Users.id\n ) INNER JOIN basusr ON (\n Users.id=basusr.usr_id\n AND (basusr.base_id=\n '" . implode("' OR basusr.base_id='", $lst_base_id) . "'\n )\n )\n )\n GROUP BY Users.id "; $params = []; } elseif ($this->app['conf']->get(['registry', 'ftp', 'ftp-user-access'])) { $sql = "SELECT Users.id AS usr_id ,Users.login AS usr_login ,Users.email AS usr_mail, FtpCredential.*\n FROM (\n FtpCredential INNER JOIN Users ON (\n FtpCredential.active = 1 AND FtpCredential.id = Users.id\n ) INNER JOIN basusr ON (\n Users.id=basusr.usr_id\n AND Users.id = :usr_id\n AND (basusr.base_id=\n '" . implode("' OR basusr.base_id='", $lst_base_id) . "'\n )\n )\n )\n GROUP BY Users.id "; $params = [':usr_id' => $app['authentication']->getUser()->getId()]; } $datas[] = ['name' => $app->trans('export::ftp: reglages manuels'), 'usr_id' => '0', 'address' => '', 'login' => '', 'password' => '', 'ssl' => false, 'dest_folder' => '', 'prefix_folder' => 'Export_' . date("Y-m-d_H.i.s"), 'passive' => false, 'max_retry' => 5, 'sendermail' => $app['authentication']->getUser()->getEmail()]; $stmt = $app['phraseanet.appbox']->get_connection()->prepare($sql); $stmt->execute($params); $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt->closeCursor(); foreach ($rs as $row) { $datas[] = ['name' => $row["usr_login"], 'usr_id' => $row['usr_id'], 'address' => $row['address'], 'login' => $row['login'], 'password' => $row['password'], 'ssl' => !!$row['tls'], 'dest_folder' => $row['reception_folder'], 'prefix_folder' => strlen(trim($row['repository_prefix_name'])) > 0 ? trim($row['repository_prefix_name']) : 'Export_' . date("Y-m-d_H.i.s"), 'passive' => !!$row['passive'], 'max_retry' => $row['max_retry'], 'usr_mail' => $row['usr_mail'], 'sender_mail' => $app['authentication']->getUser()->getEmail()]; } $this->ftp_datas = $datas; } $this->display_orderable = $display_orderable; $this->display_download = $display_download; $this->display_ftp = $display_ftp; return $this; }
/** * Retrieve detailled informations about one story * * @param \record_adapter $story * * @return array */ public function list_story(Application $app, Request $request, \record_adapter $story) { if (!$story->is_grouping()) { return Result::createError($request, 404, 'Story not found')->createResponse(); } $that = $this; $records = array_map(function (\record_adapter $record) use($that, $app) { return $that->list_record($app, $record); }, array_values($story->get_children()->get_elements())); $caption = $story->get_caption(); $format = function (\caption_record $caption, $dcField) { $field = $caption->get_dc_field($dcField); if (!$field) { return null; } return $field->get_serialized_values(); }; return ['@entity@' => self::OBJECT_TYPE_STORY, 'databox_id' => $story->get_sbas_id(), 'story_id' => $story->get_record_id(), 'updated_on' => $story->get_modification_date()->format(DATE_ATOM), 'created_on' => $story->get_creation_date()->format(DATE_ATOM), 'collection_id' => \phrasea::collFromBas($app, $story->get_base_id()), 'thumbnail' => $this->list_embedable_media($app, $story, $story->get_thumbnail()), 'uuid' => $story->get_uuid(), 'metadatas' => ['@entity@' => self::OBJECT_TYPE_STORY_METADATA_BAG, 'dc:contributor' => $format($caption, \databox_Field_DCESAbstract::Contributor), 'dc:coverage' => $format($caption, \databox_Field_DCESAbstract::Coverage), 'dc:creator' => $format($caption, \databox_Field_DCESAbstract::Creator), 'dc:date' => $format($caption, \databox_Field_DCESAbstract::Date), 'dc:description' => $format($caption, \databox_Field_DCESAbstract::Description), 'dc:format' => $format($caption, \databox_Field_DCESAbstract::Format), 'dc:identifier' => $format($caption, \databox_Field_DCESAbstract::Identifier), 'dc:language' => $format($caption, \databox_Field_DCESAbstract::Language), 'dc:publisher' => $format($caption, \databox_Field_DCESAbstract::Publisher), 'dc:relation' => $format($caption, \databox_Field_DCESAbstract::Relation), 'dc:rights' => $format($caption, \databox_Field_DCESAbstract::Rights), 'dc:source' => $format($caption, \databox_Field_DCESAbstract::Source), 'dc:subject' => $format($caption, \databox_Field_DCESAbstract::Subject), 'dc:title' => $format($caption, \databox_Field_DCESAbstract::Title), 'dc:type' => $format($caption, \databox_Field_DCESAbstract::Type)], 'records' => $records]; }