summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--app/Filter/TaskCreatorFilter.php74
-rw-r--r--app/Model/TaskFinder.php1
-rw-r--r--app/ServiceProvider/FilterProvider.php8
-rw-r--r--doc/search.markdown13
-rw-r--r--tests/units/Filter/TaskCreatorFilterTest.php159
6 files changed, 253 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 941c46c9..1bbe8062 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,7 @@ Version 1.0.28 (unreleased)
New features:
* Search in comments
+* Search by task creator
Improvements:
diff --git a/app/Filter/TaskCreatorFilter.php b/app/Filter/TaskCreatorFilter.php
new file mode 100644
index 00000000..af35e6bc
--- /dev/null
+++ b/app/Filter/TaskCreatorFilter.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Kanboard\Filter;
+
+use Kanboard\Core\Filter\FilterInterface;
+use Kanboard\Model\Task;
+
+/**
+ * Filter tasks by creator
+ *
+ * @package filter
+ * @author Frederic Guillot
+ */
+class TaskCreatorFilter extends BaseFilter implements FilterInterface
+{
+ /**
+ * Current user id
+ *
+ * @access private
+ * @var int
+ */
+ private $currentUserId = 0;
+
+ /**
+ * Set current user id
+ *
+ * @access public
+ * @param integer $userId
+ * @return TaskAssigneeFilter
+ */
+ public function setCurrentUserId($userId)
+ {
+ $this->currentUserId = $userId;
+ return $this;
+ }
+
+ /**
+ * Get search attribute
+ *
+ * @access public
+ * @return string[]
+ */
+ public function getAttributes()
+ {
+ return array('creator');
+ }
+
+ /**
+ * Apply filter
+ *
+ * @access public
+ * @return string
+ */
+ public function apply()
+ {
+ if (is_int($this->value) || ctype_digit($this->value)) {
+ $this->query->eq(Task::TABLE.'.creator_id', $this->value);
+ } else {
+ switch ($this->value) {
+ case 'me':
+ $this->query->eq(Task::TABLE.'.creator_id', $this->currentUserId);
+ break;
+ case 'nobody':
+ $this->query->eq(Task::TABLE.'.creator_id', 0);
+ break;
+ default:
+ $this->query->beginOr();
+ $this->query->ilike('uc.username', '%'.$this->value.'%');
+ $this->query->ilike('uc.name', '%'.$this->value.'%');
+ $this->query->closeOr();
+ }
+ }
+ }
+}
diff --git a/app/Model/TaskFinder.php b/app/Model/TaskFinder.php
index 1840b505..d406b794 100644
--- a/app/Model/TaskFinder.php
+++ b/app/Model/TaskFinder.php
@@ -138,6 +138,7 @@ class TaskFinder extends Base
Project::TABLE.'.name AS project_name'
)
->join(User::TABLE, 'id', 'owner_id', Task::TABLE)
+ ->left(User::TABLE, 'uc', 'id', Task::TABLE, 'creator_id')
->join(Category::TABLE, 'id', 'category_id', Task::TABLE)
->join(Column::TABLE, 'id', 'column_id', Task::TABLE)
->join(Swimlane::TABLE, 'id', 'swimlane_id', Task::TABLE)
diff --git a/app/ServiceProvider/FilterProvider.php b/app/ServiceProvider/FilterProvider.php
index 66608b8c..3100ae7e 100644
--- a/app/ServiceProvider/FilterProvider.php
+++ b/app/ServiceProvider/FilterProvider.php
@@ -10,6 +10,7 @@ use Kanboard\Filter\TaskColorFilter;
use Kanboard\Filter\TaskColumnFilter;
use Kanboard\Filter\TaskCommentFilter;
use Kanboard\Filter\TaskCreationDateFilter;
+use Kanboard\Filter\TaskCreatorFilter;
use Kanboard\Filter\TaskDescriptionFilter;
use Kanboard\Filter\TaskDueDateFilter;
use Kanboard\Filter\TaskIdFilter;
@@ -84,10 +85,15 @@ class FilterProvider implements ServiceProviderInterface
->setCurrentUserId($c['userSession']->getId())
)
->withFilter(new TaskCategoryFilter())
- ->withFilter(TaskColorFilter::getInstance()->setColorModel($c['color']))
+ ->withFilter(TaskColorFilter::getInstance()
+ ->setColorModel($c['color'])
+ )
->withFilter(new TaskColumnFilter())
->withFilter(new TaskCommentFilter())
->withFilter(new TaskCreationDateFilter())
+ ->withFilter(TaskCreatorFilter::getInstance()
+ ->setCurrentUserId($c['userSession']->getId())
+ )
->withFilter(new TaskDescriptionFilter())
->withFilter(new TaskDueDateFilter())
->withFilter(new TaskIdFilter())
diff --git a/doc/search.markdown b/doc/search.markdown
index 93c8214e..f6d343e9 100644
--- a/doc/search.markdown
+++ b/doc/search.markdown
@@ -27,8 +27,8 @@ Attribute: **status**
- Query to find open tasks: `status:open`
- Query to find closed tasks: `status:closed`
-Search by assignees
--------------------
+Search by assignee
+------------------
Attribute: **assignee**
@@ -38,6 +38,15 @@ Attribute: **assignee**
- Query for unassigned tasks: `assignee:nobody`
- Query for my assigned tasks: `assignee:me`
+Search by task creator
+----------------------
+
+Attribute: **creator**
+
+- Tasks created by myself: `creator:me`
+- Tasks created by John Doe: `creator:"John Doe"`
+- Tasks created by the user id #1: `creator:1`
+
Search by subtask assignee
--------------------------
diff --git a/tests/units/Filter/TaskCreatorFilterTest.php b/tests/units/Filter/TaskCreatorFilterTest.php
new file mode 100644
index 00000000..1c344de7
--- /dev/null
+++ b/tests/units/Filter/TaskCreatorFilterTest.php
@@ -0,0 +1,159 @@
+<?php
+
+use Kanboard\Filter\TaskCreatorFilter;
+use Kanboard\Model\Project;
+use Kanboard\Model\TaskCreation;
+use Kanboard\Model\TaskFinder;
+use Kanboard\Model\User;
+
+require_once __DIR__.'/../Base.php';
+
+class TaskCreatorFilterTest extends Base
+{
+ public function testWithIntegerAssigneeId()
+ {
+ $taskFinder = new TaskFinder($this->container);
+ $taskCreation = new TaskCreation($this->container);
+ $projectModel = new Project($this->container);
+ $query = $taskFinder->getExtendedQuery();
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
+ $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1, 'creator_id' => 1)));
+
+ $filter = new TaskCreatorFilter();
+ $filter->withQuery($query);
+ $filter->withValue(1);
+ $filter->apply();
+
+ $this->assertCount(1, $query->findAll());
+
+ $filter = new TaskCreatorFilter();
+ $filter->withQuery($query);
+ $filter->withValue(123);
+ $filter->apply();
+
+ $this->assertCount(0, $query->findAll());
+ }
+
+ public function testWithStringAssigneeId()
+ {
+ $taskFinder = new TaskFinder($this->container);
+ $taskCreation = new TaskCreation($this->container);
+ $projectModel = new Project($this->container);
+ $query = $taskFinder->getExtendedQuery();
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
+ $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1, 'creator_id' => 1)));
+
+ $filter = new TaskCreatorFilter();
+ $filter->withQuery($query);
+ $filter->withValue('1');
+ $filter->apply();
+
+ $this->assertCount(1, $query->findAll());
+
+ $filter = new TaskCreatorFilter();
+ $filter->withQuery($query);
+ $filter->withValue("123");
+ $filter->apply();
+
+ $this->assertCount(0, $query->findAll());
+ }
+
+ public function testWithUsername()
+ {
+ $taskFinder = new TaskFinder($this->container);
+ $taskCreation = new TaskCreation($this->container);
+ $projectModel = new Project($this->container);
+ $query = $taskFinder->getExtendedQuery();
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
+ $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1, 'creator_id' => 1)));
+
+ $filter = new TaskCreatorFilter();
+ $filter->withQuery($query);
+ $filter->withValue('admin');
+ $filter->apply();
+
+ $this->assertCount(1, $query->findAll());
+
+ $filter = new TaskCreatorFilter();
+ $filter->withQuery($query);
+ $filter->withValue('foobar');
+ $filter->apply();
+
+ $this->assertCount(0, $query->findAll());
+ }
+
+ public function testWithName()
+ {
+ $taskFinder = new TaskFinder($this->container);
+ $taskCreation = new TaskCreation($this->container);
+ $projectModel = new Project($this->container);
+ $userModel = new User($this->container);
+ $query = $taskFinder->getExtendedQuery();
+
+ $this->assertEquals(2, $userModel->create(array('username' => 'foobar', 'name' => 'Foo Bar')));
+ $this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
+ $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1, 'creator_id' => 2)));
+
+ $filter = new TaskCreatorFilter();
+ $filter->withQuery($query);
+ $filter->withValue('foo bar');
+ $filter->apply();
+
+ $this->assertCount(1, $query->findAll());
+
+ $filter = new TaskCreatorFilter();
+ $filter->withQuery($query);
+ $filter->withValue('bob');
+ $filter->apply();
+
+ $this->assertCount(0, $query->findAll());
+ }
+
+ public function testWithNobody()
+ {
+ $taskFinder = new TaskFinder($this->container);
+ $taskCreation = new TaskCreation($this->container);
+ $projectModel = new Project($this->container);
+ $query = $taskFinder->getExtendedQuery();
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
+ $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1)));
+
+ $filter = new TaskCreatorFilter();
+ $filter->withQuery($query);
+ $filter->withValue('nobody');
+ $filter->apply();
+
+ $this->assertCount(1, $query->findAll());
+ }
+
+ public function testWithCurrentUser()
+ {
+ $taskFinder = new TaskFinder($this->container);
+ $taskCreation = new TaskCreation($this->container);
+ $projectModel = new Project($this->container);
+ $query = $taskFinder->getExtendedQuery();
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
+ $this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1, 'creator_id' => 1)));
+
+ $filter = new TaskCreatorFilter();
+ $filter->setCurrentUserId(1);
+ $filter->withQuery($query);
+ $filter->withValue('me');
+ $filter->apply();
+
+ $this->assertCount(1, $query->findAll());
+
+ $filter = new TaskCreatorFilter();
+ $filter->setCurrentUserId(2);
+ $filter->withQuery($query);
+ $filter->withValue('me');
+ $filter->apply();
+
+ $this->assertCount(0, $query->findAll());
+ }
+}