Merge pull request #12119 from nextcloud/add_circle_to_caldav_and_filepanel-15
Add Circle to Caldav and Filepanel
This commit is contained in:
commit
6331f174d3
7 changed files with 77 additions and 11 deletions
|
@ -25,6 +25,7 @@
|
|||
namespace OCA\DAV\Connector\Sabre;
|
||||
|
||||
use OC\Files\View;
|
||||
use OCP\App\IAppManager;
|
||||
use Sabre\DAV\Exception\PreconditionFailed;
|
||||
use Sabre\DAV\Exception\BadRequest;
|
||||
use Sabre\DAV\ServerPlugin;
|
||||
|
@ -46,6 +47,7 @@ class FilesReportPlugin extends ServerPlugin {
|
|||
const NS_OWNCLOUD = 'http://owncloud.org/ns';
|
||||
const REPORT_NAME = '{http://owncloud.org/ns}filter-files';
|
||||
const SYSTEMTAG_PROPERTYNAME = '{http://owncloud.org/ns}systemtag';
|
||||
const CIRCLE_PROPERTYNAME = '{http://owncloud.org/ns}circle';
|
||||
|
||||
/**
|
||||
* Reference to main server object
|
||||
|
@ -96,6 +98,11 @@ class FilesReportPlugin extends ServerPlugin {
|
|||
*/
|
||||
private $userFolder;
|
||||
|
||||
/**
|
||||
* @var IAppManager
|
||||
*/
|
||||
private $appManager;
|
||||
|
||||
/**
|
||||
* @param Tree $tree
|
||||
* @param View $view
|
||||
|
@ -105,6 +112,7 @@ class FilesReportPlugin extends ServerPlugin {
|
|||
* @param IUserSession $userSession
|
||||
* @param IGroupManager $groupManager
|
||||
* @param Folder $userFolder
|
||||
* @param IAppManager $appManager
|
||||
*/
|
||||
public function __construct(Tree $tree,
|
||||
View $view,
|
||||
|
@ -113,7 +121,8 @@ class FilesReportPlugin extends ServerPlugin {
|
|||
ITagManager $fileTagger,
|
||||
IUserSession $userSession,
|
||||
IGroupManager $groupManager,
|
||||
Folder $userFolder
|
||||
Folder $userFolder,
|
||||
IAppManager $appManager
|
||||
) {
|
||||
$this->tree = $tree;
|
||||
$this->fileView = $view;
|
||||
|
@ -123,6 +132,7 @@ class FilesReportPlugin extends ServerPlugin {
|
|||
$this->userSession = $userSession;
|
||||
$this->groupManager = $groupManager;
|
||||
$this->userFolder = $userFolder;
|
||||
$this->appManager = $appManager;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -256,14 +266,19 @@ class FilesReportPlugin extends ServerPlugin {
|
|||
$ns = '{' . $this::NS_OWNCLOUD . '}';
|
||||
$resultFileIds = null;
|
||||
$systemTagIds = [];
|
||||
$circlesIds = [];
|
||||
$favoriteFilter = null;
|
||||
foreach ($filterRules as $filterRule) {
|
||||
if ($filterRule['name'] === $ns . 'systemtag') {
|
||||
$systemTagIds[] = $filterRule['value'];
|
||||
}
|
||||
if ($filterRule['name'] === self::CIRCLE_PROPERTYNAME) {
|
||||
$circlesIds[] = $filterRule['value'];
|
||||
}
|
||||
if ($filterRule['name'] === $ns . 'favorite') {
|
||||
$favoriteFilter = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ($favoriteFilter !== null) {
|
||||
|
@ -282,6 +297,15 @@ class FilesReportPlugin extends ServerPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
if (!empty($circlesIds)) {
|
||||
$fileIds = $this->getCirclesFileIds($circlesIds);
|
||||
if (empty($resultFileIds)) {
|
||||
$resultFileIds = $fileIds;
|
||||
} else {
|
||||
$resultFileIds = array_intersect($fileIds, $resultFileIds);
|
||||
}
|
||||
}
|
||||
|
||||
return $resultFileIds;
|
||||
}
|
||||
|
||||
|
@ -328,6 +352,19 @@ class FilesReportPlugin extends ServerPlugin {
|
|||
return $resultFileIds;
|
||||
}
|
||||
|
||||
/**
|
||||
* @suppress PhanUndeclaredClassMethod
|
||||
* @param array $circlesIds
|
||||
* @return array
|
||||
*/
|
||||
private function getCirclesFileIds(array $circlesIds) {
|
||||
if (!$this->appManager->isEnabledForUser('circles') || !class_exists('\OCA\Circles\Api\v1\Circles')) {
|
||||
return [];
|
||||
}
|
||||
return \OCA\Circles\Api\v1\Circles::getFilesForCircles($circlesIds);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Prepare propfind response for the given nodes
|
||||
*
|
||||
|
|
|
@ -45,7 +45,7 @@ use OCP\IUserManager;
|
|||
use OCP\IUserSession;
|
||||
use OCP\Share\IManager as IShareManager;
|
||||
use Sabre\DAV\Exception;
|
||||
use \Sabre\DAV\PropPatch;
|
||||
use Sabre\DAV\PropPatch;
|
||||
use Sabre\DAVACL\PrincipalBackend\BackendInterface;
|
||||
|
||||
class Principal implements BackendInterface {
|
||||
|
@ -145,7 +145,11 @@ class Principal implements BackendInterface {
|
|||
return $this->userToPrincipal($user);
|
||||
}
|
||||
} else if ($prefix === 'principals/circles') {
|
||||
return $this->circleToPrincipal($name);
|
||||
try {
|
||||
return $this->circleToPrincipal($name);
|
||||
} catch (QueryException $e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -406,6 +410,7 @@ class Principal implements BackendInterface {
|
|||
/**
|
||||
* @param string $circleUniqueId
|
||||
* @return array|null
|
||||
* @throws \OCP\AppFramework\QueryException
|
||||
* @suppress PhanUndeclaredClassMethod
|
||||
* @suppress PhanUndeclaredClassCatch
|
||||
*/
|
||||
|
@ -438,9 +443,9 @@ class Principal implements BackendInterface {
|
|||
* Returns the list of circles a principal is a member of
|
||||
*
|
||||
* @param string $principal
|
||||
* @param bool $needGroups
|
||||
* @return array
|
||||
* @throws Exception
|
||||
* @throws \OCP\AppFramework\QueryException
|
||||
* @suppress PhanUndeclaredClassMethod
|
||||
*/
|
||||
public function getCircleMembership($principal):array {
|
||||
|
@ -458,13 +463,13 @@ class Principal implements BackendInterface {
|
|||
$circles = \OCA\Circles\Api\v1\Circles::joinedCircles($name, true);
|
||||
|
||||
$circles = array_map(function($circle) {
|
||||
/** @var \OCA\Circles\Model\Circle $group */
|
||||
/** @var \OCA\Circles\Model\Circle $circle */
|
||||
return 'principals/circles/' . urlencode($circle->getUniqueId());
|
||||
}, $circles);
|
||||
|
||||
return $circles;
|
||||
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
|
|
|
@ -180,7 +180,8 @@ class ServerFactory {
|
|||
\OC::$server->getTagManager(),
|
||||
$this->userSession,
|
||||
\OC::$server->getGroupManager(),
|
||||
$userFolder
|
||||
$userFolder,
|
||||
\OC::$server->getAppManager()
|
||||
));
|
||||
// custom properties plugin must be the last one
|
||||
$server->addPlugin(
|
||||
|
|
|
@ -271,7 +271,8 @@ class Server {
|
|||
\OC::$server->getTagManager(),
|
||||
$userSession,
|
||||
\OC::$server->getGroupManager(),
|
||||
$userFolder
|
||||
$userFolder,
|
||||
\OC::$server->getAppManager()
|
||||
));
|
||||
$lazySearchBackend->setBackend(new \OCA\DAV\Files\FileSearchBackend(
|
||||
$this->server->tree,
|
||||
|
|
|
@ -86,6 +86,10 @@ class PublicCalendarRootTest extends TestCase {
|
|||
->withAnyParameters()
|
||||
->willReturn([]);
|
||||
|
||||
$this->principal->expects($this->any())->method('getCircleMembership')
|
||||
->withAnyParameters()
|
||||
->willReturn([]);
|
||||
|
||||
$this->backend = new CalDavBackend(
|
||||
$db,
|
||||
$this->principal,
|
||||
|
@ -112,6 +116,11 @@ class PublicCalendarRootTest extends TestCase {
|
|||
$this->principal->expects($this->any())->method('getGroupMembership')
|
||||
->withAnyParameters()
|
||||
->willReturn([]);
|
||||
|
||||
$this->principal->expects($this->any())->method('getCircleMembership')
|
||||
->withAnyParameters()
|
||||
->willReturn([]);
|
||||
|
||||
$books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
|
||||
foreach ($books as $book) {
|
||||
$this->backend->deleteCalendar($book['id']);
|
||||
|
|
|
@ -28,6 +28,7 @@ namespace OCA\DAV\Tests\unit\Connector\Sabre;
|
|||
|
||||
use OCA\DAV\Connector\Sabre\Directory;
|
||||
use OCA\DAV\Connector\Sabre\FilesReportPlugin as FilesReportPluginImplementation;
|
||||
use OCP\App\IAppManager;
|
||||
use OCP\Files\File;
|
||||
use OCP\IConfig;
|
||||
use OCP\IPreview;
|
||||
|
@ -81,6 +82,9 @@ class FilesReportPluginTest extends \Test\TestCase {
|
|||
/** @var IPreview|\PHPUnit_Framework_MockObject_MockObject * */
|
||||
private $previewManager;
|
||||
|
||||
/** @var IAppManager|\PHPUnit_Framework_MockObject_MockObject * */
|
||||
private $appManager;
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
$this->tree = $this->getMockBuilder(Tree::class)
|
||||
|
@ -112,6 +116,10 @@ class FilesReportPluginTest extends \Test\TestCase {
|
|||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->appManager = $this->getMockBuilder(IAppManager::class)
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->tagManager = $this->createMock(ISystemTagManager::class);
|
||||
$this->tagMapper = $this->createMock(ISystemTagObjectMapper::class);
|
||||
$this->userSession = $this->createMock(IUserSession::class);
|
||||
|
@ -140,7 +148,8 @@ class FilesReportPluginTest extends \Test\TestCase {
|
|||
$privateTagManager,
|
||||
$this->userSession,
|
||||
$this->groupManager,
|
||||
$this->userFolder
|
||||
$this->userFolder,
|
||||
$this->appManager
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -503,7 +503,7 @@
|
|||
|
||||
/**
|
||||
* Fetches a flat list of files filtered by a given filter criteria.
|
||||
* (currently only system tags is supported)
|
||||
* (currently system tags and circles are supported)
|
||||
*
|
||||
* @param {Object} filter filter criteria
|
||||
* @param {Object} [filter.systemTagIds] list of system tag ids to filter by
|
||||
|
@ -525,7 +525,8 @@
|
|||
properties = options.properties;
|
||||
}
|
||||
|
||||
if (!filter || (!filter.systemTagIds && _.isUndefined(filter.favorite))) {
|
||||
if (!filter ||
|
||||
(!filter.systemTagIds && _.isUndefined(filter.favorite) && !filter.circlesIds) ) {
|
||||
throw 'Missing filter argument';
|
||||
}
|
||||
|
||||
|
@ -551,6 +552,9 @@
|
|||
_.each(filter.systemTagIds, function(systemTagIds) {
|
||||
body += ' <oc:systemtag>' + escapeHTML(systemTagIds) + '</oc:systemtag>\n';
|
||||
});
|
||||
_.each(filter.circlesIds, function(circlesIds) {
|
||||
body += ' <oc:circle>' + escapeHTML(circlesIds) + '</oc:circle>\n';
|
||||
});
|
||||
if (filter.favorite) {
|
||||
body += ' <oc:favorite>' + (filter.favorite ? '1': '0') + '</oc:favorite>\n';
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue