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');
 }