public function testLazyLoadedFieldsOnVersionedRecords() { // Save another record, sanity check that we're getting the right one $obj2 = new VersionedTest_Subclass(); $obj2->Name = "test2"; $obj2->ExtraField = "foo2"; $obj2->write(); // Save the actual inspected record $obj1 = new VersionedTest_Subclass(); $obj1->Name = "test"; $obj1->ExtraField = "foo"; $obj1->write(); $version1 = $obj1->Version; $obj1->Name = "test2"; $obj1->ExtraField = "baz"; $obj1->write(); $version2 = $obj1->Version; $reloaded = Versioned::get_version('VersionedTest_Subclass', $obj1->ID, $version1); $this->assertEquals($reloaded->Name, 'test'); $this->assertEquals($reloaded->ExtraField, 'foo'); $reloaded = Versioned::get_version('VersionedTest_Subclass', $obj1->ID, $version2); $this->assertEquals($reloaded->Name, 'test2'); $this->assertEquals($reloaded->ExtraField, 'baz'); $reloaded = Versioned::get_latest_version('VersionedTest_Subclass', $obj1->ID); $this->assertEquals($reloaded->Version, $version2); $this->assertEquals($reloaded->Name, 'test2'); $this->assertEquals($reloaded->ExtraField, 'baz'); $allVersions = Versioned::get_all_versions('VersionedTest_Subclass', $obj1->ID); $this->assertEquals(2, $allVersions->Count()); $this->assertEquals($allVersions->First()->Version, $version1); $this->assertEquals($allVersions->First()->Name, 'test'); $this->assertEquals($allVersions->First()->ExtraField, 'foo'); $this->assertEquals($allVersions->Last()->Version, $version2); $this->assertEquals($allVersions->Last()->Name, 'test2'); $this->assertEquals($allVersions->Last()->ExtraField, 'baz'); $obj1->delete(); }
public function testAllVersions() { // In 2005 this file was created DBDatetime::set_mock_now('2005-01-01 00:00:00'); $testPage = new VersionedTest_Subclass(); $testPage->Title = 'Archived page'; $testPage->Content = 'This is the content from 2005'; $testPage->ExtraField = '2005'; $testPage->write(); // In 2007 we updated it DBDatetime::set_mock_now('2007-01-01 00:00:00'); $testPage->Content = "It's 2007 already!"; $testPage->ExtraField = '2007'; $testPage->write(); // Check both versions are returned $versions = Versioned::get_all_versions('VersionedTest_Subclass', $testPage->ID); $content = array(); $extraFields = array(); foreach ($versions as $version) { $content[] = $version->Content; $extraFields[] = $version->ExtraField; } $this->assertEquals($versions->Count(), 2, 'All versions returned'); $this->assertEquals($content, array('This is the content from 2005', "It's 2007 already!"), 'Version fields returned'); $this->assertEquals($extraFields, array('2005', '2007'), 'Version fields returned'); // In 2009 we updated it again DBDatetime::set_mock_now('2009-01-01 00:00:00'); $testPage->Content = "I'm enjoying 2009"; $testPage->ExtraField = '2009'; $testPage->write(); // End mock, back to the present day:) DBDatetime::clear_mock_now(); $versions = Versioned::get_all_versions('VersionedTest_Subclass', $testPage->ID); $content = array(); $extraFields = array(); foreach ($versions as $version) { $content[] = $version->Content; $extraFields[] = $version->ExtraField; } $this->assertEquals($versions->Count(), 3, 'Additional all versions returned'); $this->assertEquals($content, array('This is the content from 2005', "It's 2007 already!", "I'm enjoying 2009"), 'Additional version fields returned'); $this->assertEquals($extraFields, array('2005', '2007', '2009'), 'Additional version fields returned'); }
/** * Returns a JSON array for history of a given file ID. Returns a list of all the history. * * @param HTTPRequest $request * @return HTTPResponse */ public function apiHistory(HTTPRequest $request) { // CSRF check not required as the GET request has no side effects. $fileId = $request->getVar('fileId'); if (!$fileId || !is_numeric($fileId)) { return new HTTPResponse(null, 400); } $class = File::class; $file = DataObject::get($class)->byID($fileId); if (!$file) { return new HTTPResponse(null, 404); } if (!$file->canView()) { return new HTTPResponse(null, 403); } $versions = Versioned::get_all_versions($class, $fileId)->limit($this->config()->max_history_entries)->sort('Version', 'DESC'); $output = array(); $next = array(); $prev = null; // swap the order so we can get the version number to compare against. // i.e version 3 needs to know version 2 is the previous version $copy = $versions->map('Version', 'Version')->toArray(); foreach (array_reverse($copy) as $k => $v) { if ($prev) { $next[$v] = $prev; } $prev = $v; } $_cachedMembers = array(); /** @var File $version */ foreach ($versions as $version) { $author = null; if ($version->AuthorID) { if (!isset($_cachedMembers[$version->AuthorID])) { $_cachedMembers[$version->AuthorID] = DataObject::get(Member::class)->byID($version->AuthorID); } $author = $_cachedMembers[$version->AuthorID]; } if ($version->canView()) { if (isset($next[$version->Version])) { $summary = $version->humanizedChanges($version->Version, $next[$version->Version]); // if no summary returned by humanizedChanges, i.e we cannot work out what changed, just show a // generic message if (!$summary) { $summary = _t('SilverStripe\\AssetAdmin\\Controller\\AssetAdmin.SAVEDFILE', "Saved file"); } } else { $summary = _t('SilverStripe\\AssetAdmin\\Controller\\AssetAdmin.UPLOADEDFILE', "Uploaded file"); } $output[] = array('versionid' => $version->Version, 'date_ago' => $version->dbObject('LastEdited')->Ago(), 'date_formatted' => $version->dbObject('LastEdited')->Nice(), 'status' => $version->WasPublished ? _t('File.PUBLISHED', 'Published') : '', 'author' => $author ? $author->Name : _t('SilverStripe\\AssetAdmin\\Controller\\AssetAdmin.UNKNOWN', "Unknown"), 'summary' => $summary ? $summary : _t('SilverStripe\\AssetAdmin\\Controller\\AssetAdmin.NOSUMMARY', "No summary available")); } } return (new HTTPResponse(json_encode($output)))->addHeader('Content-Type', 'application/json'); }