Version 5.0.6
This commit is contained in:
1 parent
a3a4a9ccbd
commit
b89858b2ff
1214 files changed
+92828
-14859
No files matched your search
@@ -17,6 +17,8 @@ namespace IPS\core\Assignments;
|
||||
use IPS\Content;
|
||||
use IPS\Content\Comment;
|
||||
use IPS\Content\Item;
|
||||
use IPS\core\modules\admin\stats\points;
|
||||
use IPS\Data\Store;
|
||||
use IPS\DateTime;
|
||||
use IPS\Db;
|
||||
use IPS\Member;
|
||||
@@ -60,14 +62,26 @@ class Assignment extends ActiveRecord
|
||||
protected static array $multitonMap = [];
|
||||
|
||||
/**
|
||||
* @return Item
|
||||
* @throws OutOfRangeException
|
||||
* @brief [ActiveRecord] Caches
|
||||
* @note Defined cache keys will be cleared automatically as needed
|
||||
*/
|
||||
public function get_item() : Item
|
||||
protected array $caches = array( 'openAssignments' );
|
||||
|
||||
/**
|
||||
* @return Item|null
|
||||
*/
|
||||
public function get_item() : ?Item
|
||||
{
|
||||
/* @var Item $class */
|
||||
$class = $this->item_class;
|
||||
return $class::load( $this->item_id );
|
||||
try
|
||||
{
|
||||
$class = $this->item_class;
|
||||
return $class::load( $this->item_id );
|
||||
}
|
||||
catch(OutOfRangeException $e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -269,6 +283,71 @@ class Assignment extends ActiveRecord
|
||||
return DateTime::ts( $this->reply_time )->roundedDiff( DateTime::ts( $this->date ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Exactly what you think it does.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function totalOpenAssignments() : int
|
||||
{
|
||||
try
|
||||
{
|
||||
$cache = Store::i()->openAssignments;
|
||||
}
|
||||
catch( OutOfRangeException )
|
||||
{
|
||||
$cache = [
|
||||
'members' => iterator_to_array(
|
||||
Db::i()->select( 'assign_to, count(assign_id) as total', static::$databaseTable, [ 'assign_type=? and assign_closed=?', static::ASSIGNMENT_MEMBER, 0 ], null, null, 'assign_to' )
|
||||
->setKeyField( 'assign_to' )
|
||||
->setValueField( 'total' )
|
||||
),
|
||||
'teams' => iterator_to_array(
|
||||
Db::i()->select( 'assign_to, count(assign_id) as total', static::$databaseTable, [ 'assign_type=? and assign_closed=?', static::ASSIGNMENT_TEAM, 0 ], null, null, 'assign_to' )
|
||||
->setKeyField( 'assign_to' )
|
||||
->setValueField( 'total' )
|
||||
)
|
||||
];
|
||||
Store::i()->openAssignments = $cache;
|
||||
}
|
||||
|
||||
$totalOpenForMember = $cache['members'][ Member::loggedIn()->member_id ] ?? 0;
|
||||
|
||||
/* Do we have teams? */
|
||||
if( $teams = Member::loggedIn()->teams() )
|
||||
{
|
||||
foreach( $teams as $teamId => $team )
|
||||
{
|
||||
$totalOpenForMember += $cache['teams'][ $teamId ] ?? 0;
|
||||
}
|
||||
}
|
||||
|
||||
return $totalOpenForMember;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the member can access the assignments list
|
||||
*
|
||||
* @param Member|null $member
|
||||
* @return bool
|
||||
*/
|
||||
public static function canAccessAssignments( ?Member $member=null ) : bool
|
||||
{
|
||||
if( !Bridge::i()->featureIsEnabled( 'assignments' ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$member = $member ?? Member::loggedIn();
|
||||
if( static::canAssignOnAny( $member ) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/* If the member is on any team OR they have an assignment, let it through */
|
||||
return ( $teams = $member->teams() or $member->totalAssignments() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all assignments for this member or team
|
||||
*
|
||||
|
||||
@@ -42,28 +42,22 @@ class Table extends TableHelper
|
||||
public function getRows( array $advancedSearchValues=NULL ): array
|
||||
{
|
||||
$this->sortBy = in_array( $this->sortBy, $this->sortOptions ) ? $this->sortBy : 'assign_date';
|
||||
$sortBy = $this->sortBy . ' ' . ( $this->sortDirection and strtolower( $this->sortDirection ) == 'asc' ? 'asc' : 'desc' );
|
||||
$sortBy = $this->sortBy . ' ' . ( ( $this->sortDirection and strtolower( $this->sortDirection ) == 'asc' ) ? 'asc' : 'desc' );
|
||||
|
||||
/* If we can assign content, we can see all assignments.
|
||||
Otherwise, find anything assigned to the logged in member */
|
||||
$where = [];
|
||||
if( !Assignment::canAssignOnAny() or ( isset( Request::i()->filter ) and Request::i()->filter == 'assign_mine' ) )
|
||||
if( !Assignment::canAssignOnAny() or ( isset( Request::i()->filter ) and Request::i()->filter == 'assign_mine' ) or isset( Request::i()->overview ) and Request::i()->overview )
|
||||
{
|
||||
$clause = [
|
||||
"(assign_type=? and assign_to=?)"
|
||||
];
|
||||
$binds = [
|
||||
Assignment::ASSIGNMENT_MEMBER,
|
||||
Member::loggedIn()->member_id
|
||||
];
|
||||
|
||||
if( $teams = Member::loggedIn()->teams() )
|
||||
{
|
||||
$clause[] = "(assign_type=? and " . Db::i()->in( 'assign_to', array_keys( $teams ) ) . ")";
|
||||
$binds[] = Assignment::ASSIGNMENT_TEAM;
|
||||
$where[] = [ '( (assign_type=? and assign_to=?) or (assign_type=? and assign_to in (' . implode( ",", array_keys( Member::loggedIn()->teams() ) ) . ') ) )', Assignment::ASSIGNMENT_MEMBER, Member::loggedIn()->member_id, Assignment::ASSIGNMENT_TEAM ];
|
||||
}
|
||||
else
|
||||
{
|
||||
$where[] = [ 'assign_type=?', Assignment::ASSIGNMENT_MEMBER ];
|
||||
$where[] = [ 'assign_to=?', Member::loggedIn()->member_id ];
|
||||
}
|
||||
|
||||
$where = array_merge( array( implode( " OR ", $clause ) ), $binds );
|
||||
}
|
||||
|
||||
if( isset( Request::i()->filter ) )
|
||||
|
||||
Reference in new issue
Block a user