Fixes on track chairs filters

Change-Id: Iac273f90df83f590a9c3a1382ca3c5d7f36ff7f6
Signed-off-by: smarcet <smarcet@gmail.com>
This commit is contained in:
smarcet 2021-03-09 09:53:07 -03:00
parent 40e5e8e9c6
commit b76542f7c2
3 changed files with 337 additions and 30 deletions

View File

@ -15,7 +15,6 @@
use App\Models\Exceptions\AuthzException;
use App\Models\Foundation\Summit\Repositories\ISummitCategoryChangeRepository;
use App\Services\Model\ISummitSelectionPlanService;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Request;
@ -27,7 +26,6 @@ use models\summit\ISummitEventRepository;
use models\summit\ISummitRepository;
use Exception;
use ModelSerializers\IPresentationSerializerTypes;
use ModelSerializers\ISerializerTypeSelector;
use ModelSerializers\SerializerRegistry;
use utils\Filter;
use utils\FilterElement;
@ -122,7 +120,7 @@ final class OAuth2SummitSelectionPlansApiController extends OAuth2ProtectedContr
try {
if (!Request::isJson()) return $this->error400();
$payload = Input::json()->all();
$payload = Request::json()->all();
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
@ -164,7 +162,7 @@ final class OAuth2SummitSelectionPlansApiController extends OAuth2ProtectedContr
try {
if (!Request::isJson()) return $this->error400();
$payload = Input::json()->all();
$payload = Request::json()->all();
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
@ -389,6 +387,10 @@ final class OAuth2SummitSelectionPlansApiController extends OAuth2ProtectedContr
if ($filter instanceof Filter) {
$filter->addFilterCondition(FilterElement::makeEqual('summit_id', $summit->getId()));
$filter->addFilterCondition(FilterElement::makeEqual('selection_plan_id', $selection_plan_id));
$current_member = $this->resource_server_context->getCurrentUser(false);
if(!is_null($current_member)) {
$filter->addFilterCondition(FilterElement::makeEqual('current_member_id', $current_member->getId()));
}
}
return $filter;
},

View File

@ -11,28 +11,35 @@
* See the License for the specific language governing permissions and
* limitations under the License.
**/
use App\Models\Foundation\Main\IGroup;
use App\Repositories\SilverStripeDoctrineRepository;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\Tools\Pagination\Paginator;
<<<<<<< HEAD
use Illuminate\Support\Facades\App;
use models\main\Tag;
use models\oauth2\IResourceServerContext;
=======
use Illuminate\Support\Facades\Log;
use models\main\Tag;
>>>>>>> 76f1b0cb... Fixes on track chairs filters
use models\summit\ISummitCategoryChangeStatus;
use models\summit\ISummitEventRepository;
use models\summit\Presentation;
use models\summit\Summit;
use models\summit\SummitEvent;
use App\Repositories\SilverStripeDoctrineRepository;
use models\summit\SummitGroupEvent;
use utils\DoctrineCaseFilterMapping;
use utils\DoctrineFilterMapping;
use utils\DoctrineJoinFilterMapping;
use utils\DoctrineLeftJoinFilterMapping;
use utils\DoctrineSwitchFilterMapping;
use utils\Filter;
use utils\Order;
use utils\PagingInfo;
use utils\PagingResponse;
use Doctrine\ORM\Query\Expr\Join;
use utils\DoctrineLeftJoinFilterMapping;
use models\summit\SummitGroupEvent;
/**
* Class DoctrineSummitEventRepository
* @package App\Repositories\Summit
@ -71,7 +78,7 @@ final class DoctrineSummitEventRepository
$idx = 1;
foreach(self::$forbidden_classes as $forbidden_class){
$query = $query
->andWhere("not e INSTANCE OF :forbidden_class".$idx);
->andWhere("not e INSTANCE OF :forbidden_class".$idx);
$query->setParameter("forbidden_class".$idx, $forbidden_class);
$idx++;
}
@ -172,27 +179,92 @@ final class DoctrineSummitEventRepository
"(sprs.name :operator :value)"
),
'selection_status' => new DoctrineSwitchFilterMapping([
'selected' => new DoctrineCaseFilterMapping(
'selected',
"ssp.order is not null and sspl.list_type = 'Group' and sspl.category = e.category"
),
'accepted' => new DoctrineCaseFilterMapping(
'accepted',
"ssp.order is not null and ssp.order <= cc.session_count and sspl.list_type = 'Group' and sspl.list_class = 'Session' and sspl.category = e.category"
),
'alternate' => new DoctrineCaseFilterMapping(
'selected' => new DoctrineCaseFilterMapping(
'selected',
"ssp.order is not null and sspl.list_type = 'Group' and sspl.category = e.category"
),
'accepted' => new DoctrineCaseFilterMapping(
'accepted',
"ssp.order is not null and ssp.order <= cc.session_count and sspl.list_type = 'Group' and sspl.list_class = 'Session' and sspl.category = e.category"
),
'alternate' => new DoctrineCaseFilterMapping(
'alternate',
"ssp.order is not null and ssp.order > cc.session_count and sspl.list_type = 'Group' and sspl.list_class = 'Session' and sspl.category = e.category"
),
'lightning-accepted' => new DoctrineCaseFilterMapping(
),
'lightning-accepted' => new DoctrineCaseFilterMapping(
'lightning-accepted',
"ssp.order is not null and ssp.order <= cc.lightning_count and sspl.list_type = 'Group' and sspl.list_class = 'Lightning' and sspl.category = e.category"
),
'lightning-alternate' => new DoctrineCaseFilterMapping(
),
'lightning-alternate' => new DoctrineCaseFilterMapping(
'lightning-alternate',
"ssp.order is not null and ssp.order > cc.lightning_count and sspl.list_type = 'Group' and sspl.list_class = 'Lightning' and sspl.category = e.category"
),
]
),
]
),
'track_chairs_status' => new DoctrineSwitchFilterMapping
(
[
'voted' => new DoctrineCaseFilterMapping(
'voted',
"exists (select ssp1 from models\summit\SummitSelectedPresentation ssp1 inner join ssp1.presentation p1 where p1.id = p.id)"
),
'untouched' => new DoctrineCaseFilterMapping(
'untouched',
"not exists (select ssp1 from models\summit\SummitSelectedPresentation ssp1 inner join ssp1.presentation p1 where p1.id = p.id)"
),
'team_selected' => new DoctrineCaseFilterMapping(
'team_selected',
"sspl.list_type = 'Group' and sspl.list_class = 'Session' and ssp.collection= 'selected'"
),
'selected' => new DoctrineCaseFilterMapping(
'selected',
"sspl.list_type = 'Individual' and sspl.list_class = 'Session' and ssp.collection = 'selected' and ssp_member.id = ".$current_member_id
),
'maybe' => new DoctrineCaseFilterMapping(
'maybe',
"sspl.list_type = 'Individual' and sspl.list_class = 'Session' and ssp.collection = 'maybe' and ssp_member.id = ".$current_member_id
),
'pass' => new DoctrineCaseFilterMapping(
'selected',
"sspl.list_type = 'Individual' and sspl.list_class = 'Session' and ssp.collection = 'pass' and ssp_member.id = ".$current_member_id
),
]
),
'viewed_status' => new DoctrineSwitchFilterMapping
(
[
'seen' => new DoctrineCaseFilterMapping(
'seen',
sprintf("exists (select vw1 from models\summit\PresentationTrackChairView vw1 inner join vw1.presentation p1 join vw1.viewer v1 where p1.id = p.id and v1.id = %s)", $current_member_id)
),
'unseen' => new DoctrineCaseFilterMapping(
'unseen',
sprintf("not exists (select vw1 from models\summit\PresentationTrackChairView vw1 inner join vw1.presentation p1 join vw1.viewer v1 where p1.id = p.id and v1.id = %s)", $current_member_id)
),
'moved' => new DoctrineCaseFilterMapping(
'moved',
sprintf
(
"not exists
(
select vw1 from models\summit\PresentationTrackChairView vw1
inner join vw1.presentation p1 join vw1.viewer v1 where p1.id = p.id and v1.id = %s
)
and exists
(
select cch from models\summit\SummitCategoryChange cch
inner join cch.presentation p2
inner join cch.new_category nc
where p2.id = p.id and
cch.status = %s and
nc.id = %s
) ",
$current_member_id,
ISummitCategoryChangeStatus::Approved,
$current_track_id
)
),
]
),
'track_chairs_status' => new DoctrineSwitchFilterMapping
(
@ -282,10 +354,27 @@ final class DoctrineSummitEventRepository
public function getAllByPage(PagingInfo $paging_info, Filter $filter = null, Order $order = null)
{
<<<<<<< HEAD
$track_id_filter = $filter->getFilter('track_id');
$current_track_id = 0;
if(!is_null($track_id_filter)){
$current_track_id = intval($track_id_filter->getValue());
=======
Log::debug("DoctrineSummitEventRepository::getAllByPage");
$current_track_id = 0;
$current_member_id = 0;
if(!is_null($filter)){
// check for dependant filtering
$track_id_filter = $filter->getUniqueFilter('track_id');
if (!is_null($track_id_filter)) {
$current_track_id = intval($track_id_filter->getValue());
}
$current_member_id_filter = $filter->getUniqueFilter('current_member_id');
if (!is_null($current_member_id_filter)) {
$current_member_id = intval($current_member_id_filter->getValue());
}
>>>>>>> 76f1b0cb... Fixes on track chairs filters
}
$query = $this->getEntityManager()->createQueryBuilder()
@ -307,9 +396,13 @@ final class DoctrineSummitEventRepository
->leftJoin('spm.registration_request', "sprr2", Join::LEFT_JOIN);
if(!is_null($filter)){
<<<<<<< HEAD
$resource_server_ctx = App::make(IResourceServerContext::class);
$member = $resource_server_ctx->getCurrentUser(false);
$filter->apply2Query($query, $this->getCustomFilterMappings($member->getId(), $current_track_id));
=======
$filter->apply2Query($query, $this->getCustomFilterMappings($current_member_id, $current_track_id));
>>>>>>> 76f1b0cb... Fixes on track chairs filters
}
if (!is_null($order)) {
@ -347,6 +440,7 @@ final class DoctrineSummitEventRepository
foreach($paginator as $entity)
$data[]= $entity;
Log::debug("DoctrineSummitEventRepository::getAllByPage End");
return new PagingResponse
(
$total,
@ -386,6 +480,21 @@ final class DoctrineSummitEventRepository
public function getAllByPageLocationTBD(PagingInfo $paging_info, Filter $filter = null, Order $order = null)
{
$current_track_id = 0;
$current_member_id = 0;
if(!is_null($filter)){
// check for dependant filtering
$track_id_filter = $filter->getUniqueFilter('track_id');
if (!is_null($track_id_filter)) {
$current_track_id = intval($track_id_filter->getValue());
}
$current_member_id_filter = $filter->getUniqueFilter('current_member_id');
if (!is_null($current_member_id_filter)) {
$current_member_id = intval($current_member_id_filter->getValue());
}
}
$query = $this->getEntityManager()->createQueryBuilder()
->select("e")
->from($this->getBaseEntity(), "e")
@ -400,7 +509,7 @@ final class DoctrineSummitEventRepository
->where("l.id is null or l.id = 0");
if(!is_null($filter)){
$filter->apply2Query($query, $this->getFilterMappings());
$filter->apply2Query($query, $this->getCustomFilterMappings($current_member_id, $current_track_id));
}
if (!is_null($order)) {

View File

@ -1,8 +1,11 @@
<?php
<<<<<<< HEAD
use App\Models\Foundation\Main\IGroup;
use models\summit\SummitSelectedPresentation;
=======
>>>>>>> 76f1b0cb... Fixes on track chairs filters
/**
* Copyright 2018 OpenStack Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
@ -15,12 +18,18 @@ use models\summit\SummitSelectedPresentation;
* See the License for the specific language governing permissions and
* limitations under the License.
**/
use App\Models\Foundation\Main\IGroup;
use models\summit\SummitSelectedPresentation;
/**
* Class OAuth2SelectionPlansApiTest
* @package Tests
*/
final class OAuth2SelectionPlansApiTest extends ProtectedApiTest
{
use \InsertSummitTestData;
use InsertSummitTestData;
protected function setUp()
protected function setUp():void
{
$this->setCurrentGroup(IGroup::TrackChairs);
parent::setUp();
@ -34,7 +43,7 @@ final class OAuth2SelectionPlansApiTest extends ProtectedApiTest
self::$em->flush();
}
protected function tearDown()
protected function tearDown():void
{
self::clearTestData();
parent::tearDown();
@ -285,7 +294,7 @@ final class OAuth2SelectionPlansApiTest extends ProtectedApiTest
$this->assertResponseStatus(201);
$params = [
'status' => $status,
'status' => $status,
'expand' => 'track_groups,summit'
];
@ -312,6 +321,98 @@ final class OAuth2SelectionPlansApiTest extends ProtectedApiTest
public function testGetPresentationsBySelectionPlanAndConditions(){
<<<<<<< HEAD
=======
$params = [
'id' => self::$summit->getId(),
'track_id' => self::$defaultTrack->getId(),
];
$headers = [
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action(
"POST",
"OAuth2SummitSelectedPresentationListApiController@createIndividualSelectionList",
$params,
[],
[],
[],
$headers,
""
);
$content = $response->getContent();
$this->assertResponseStatus(201);
$selection_list = json_decode($content);
$this->assertTrue(!is_null($selection_list));
$params = [
'id' => self::$summit->getId(),
'track_id' => self::$defaultTrack->getId(),
'collection' => SummitSelectedPresentation::CollectionSelected,
'presentation_id' => self::$presentations[0]->getId(),
'expand' => 'selected_presentations,interested_presentations,'
];
$headers = [
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action(
"POST",
"OAuth2SummitSelectedPresentationListApiController@assignPresentationToMyIndividualList",
$params,
[],
[],
[],
$headers,
""
);
$content = $response->getContent();
$this->assertResponseStatus(201);
$selection_list = json_decode($content);
$this->assertTrue(!is_null($selection_list));
$this->assertTrue(count($selection_list->selected_presentations) > 0);
$params = [
'id' => self::$summit->getId(),
'selection_plan_id' => self::$default_selection_plan->getId(),
'filter' => [
'status==Received',
'is_chair_visible==1',
'track_chairs_status==voted'
],
];
$headers = [
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action(
"GET",
"OAuth2SummitSelectionPlansApiController@getSelectionPlanPresentations",
$params,
[],
[],
[],
$headers
);
$content = $response->getContent();
$this->assertResponseStatus(200);
$presentations = json_decode($content);
$this->assertTrue(!is_null($presentations));
$this->assertTrue($presentations->total >= 1);
}
public function testGetPresentationsBySelectionPlanAndConditionsMoved(){
>>>>>>> 76f1b0cb... Fixes on track chairs filters
$params = [
'id' => self::$summit->getId(),
@ -369,13 +470,106 @@ final class OAuth2SelectionPlansApiTest extends ProtectedApiTest
$this->assertTrue(!is_null($selection_list));
$this->assertTrue(count($selection_list->selected_presentations) > 0);
<<<<<<< HEAD
=======
$params = [
'summit' => self::$summit->getId(),
'id' => self::$summit->getId(),
'selection_plan_id' => self::$default_selection_plan->getId(),
'filter' => [
'status==Received',
'is_chair_visible==1',
'viewed_status==moved'
],
];
$headers = [
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action(
"GET",
"OAuth2SummitSelectionPlansApiController@getSelectionPlanPresentations",
$params,
[],
[],
[],
$headers
);
$content = $response->getContent();
$this->assertResponseStatus(200);
$presentations = json_decode($content);
$this->assertTrue(!is_null($presentations));
$this->assertTrue($presentations->total == 0);
}
public function testGetPresentationsBySelectionPlanAndConditionsPass(){
$params = [
'id' => self::$summit->getId(),
'track_id' => self::$defaultTrack->getId(),
];
$headers = [
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action(
"POST",
"OAuth2SummitSelectedPresentationListApiController@createIndividualSelectionList",
$params,
[],
[],
[],
$headers,
""
);
$content = $response->getContent();
$this->assertResponseStatus(201);
$selection_list = json_decode($content);
$this->assertTrue(!is_null($selection_list));
>>>>>>> 76f1b0cb... Fixes on track chairs filters
$params = [
'id' => self::$summit->getId(),
'track_id' => self::$defaultTrack->getId(),
'collection' => SummitSelectedPresentation::CollectionPass,
'presentation_id' => self::$presentations[0]->getId(),
'expand' => 'selected_presentations,interested_presentations,'
];
$headers = [
"HTTP_Authorization" => " Bearer " . $this->access_token,
"CONTENT_TYPE" => "application/json"
];
$response = $this->action(
"POST",
"OAuth2SummitSelectedPresentationListApiController@assignPresentationToMyIndividualList",
$params,
[],
[],
[],
$headers,
""
);
$content = $response->getContent();
$this->assertResponseStatus(201);
$selection_list = json_decode($content);
$this->assertTrue(!is_null($selection_list));
$params = [
'id' => self::$summit->getId(),
'selection_plan_id' => self::$default_selection_plan->getId(),
'filter' => [
'status==Received',
'is_chair_visible==1',
<<<<<<< HEAD
'track_chairs_status==voted'
],
];
@ -466,6 +660,8 @@ final class OAuth2SelectionPlansApiTest extends ProtectedApiTest
'filter' => [
'status==Received',
'is_chair_visible==1',
=======
>>>>>>> 76f1b0cb... Fixes on track chairs filters
'track_chairs_status==pass'
],
];