Portfolio: Add portfolio_show_base_course_post_in_sessions configuration setting - refs BT#22232

It allows to show base course posts in session course
pull/5989/head
Angel Fernando Quiroz Campos 9 months ago
parent a1eaf3e9ad
commit 25cd738616
No known key found for this signature in database
GPG Key ID: B284841AE3E562CD
  1. 74
      main/inc/lib/PortfolioController.php
  2. 2
      main/install/configuration.dist.php
  3. 8
      main/template/default/portfolio/items.html.twig
  4. 5
      main/template/default/portfolio/list.html.twig
  5. 28
      src/Chamilo/CoreBundle/Entity/Portfolio.php

@ -4,6 +4,7 @@
use Chamilo\CoreBundle\Component\Utils\ChamiloApi;
use Chamilo\CoreBundle\Entity\Course as CourseEntity;
use Chamilo\CoreBundle\Entity\CourseRelUser;
use Chamilo\CoreBundle\Entity\ExtraField as ExtraFieldEntity;
use Chamilo\CoreBundle\Entity\ExtraFieldRelTag;
use Chamilo\CoreBundle\Entity\Portfolio;
@ -11,10 +12,12 @@ use Chamilo\CoreBundle\Entity\PortfolioAttachment;
use Chamilo\CoreBundle\Entity\PortfolioCategory;
use Chamilo\CoreBundle\Entity\PortfolioComment;
use Chamilo\CoreBundle\Entity\PortfolioRelTag;
use Chamilo\CoreBundle\Entity\SessionRelUser;
use Chamilo\CoreBundle\Entity\Tag;
use Chamilo\CourseBundle\Entity\CItemProperty;
use Chamilo\UserBundle\Entity\User;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use Mpdf\MpdfException;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\Request as HttpRequest;
@ -1203,6 +1206,8 @@ class PortfolioController
;
}
$this->filterCommentsByCourseAndSession($commentsQueryBuilder);
$comments = $commentsQueryBuilder
->orderBy('comment.root, comment.lft', 'ASC')
->setParameter('item', $item)
@ -1866,13 +1871,7 @@ class PortfolioController
->andWhere('i.course = :course')
->setParameter('course', $this->course);
if ($this->session) {
$qb
->andWhere('i.session = :session')
->setParameter('session', $this->session);
} else {
$qb->andWhere('i.session IS NULL');
}
$this->applySessionCondition($qb, 'i.session');
}
if ($isAllowedToFilterStudent && $currentUserId !== $this->owner->getId()) {
@ -1901,13 +1900,7 @@ class PortfolioController
->andWhere('item.course = :course_id')
->setParameter('course_id', $this->course);
if ($this->session) {
$qb
->andWhere('item.session = :session')
->setParameter('session', $this->session);
} else {
$qb->andWhere('item.session IS NULL');
}
$this->applySessionCondition($qb, 'item.session');
}
if ($isAllowedToFilterStudent && $currentUserId !== $this->owner->getId()) {
@ -3700,12 +3693,7 @@ class PortfolioController
->andWhere('pi.isHighlighted = TRUE')
->setParameter('course', $this->course);
if ($this->session) {
$queryBuilder->andWhere('pi.session = :session');
$queryBuilder->setParameter('session', $this->session);
} else {
$queryBuilder->andWhere('pi.session IS NULL');
}
$this->applySessionCondition($queryBuilder, 'pi.session');
if ($this->advancedSharingEnabled) {
$queryBuilder
@ -3770,12 +3758,7 @@ class PortfolioController
$queryBuilder->setParameter('course', $this->course);
if ($this->session) {
$queryBuilder->andWhere('pi.session = :session');
$queryBuilder->setParameter('session', $this->session);
} else {
$queryBuilder->andWhere('pi.session IS NULL');
}
$this->applySessionCondition($queryBuilder, 'pi.session');
if ($frmFilterList && $frmFilterList->validate()) {
$values = $frmFilterList->exportValues();
@ -4398,6 +4381,8 @@ class PortfolioController
;
}
$this->filterCommentsByCourseAndSession($queryBuilder);
$queryBuilder->orderBy('c.date', 'DESC');
return $queryBuilder->getQuery()->getResult();
@ -4430,4 +4415,41 @@ class PortfolioController
return $dateLabel;
}
// Rename this function properly
private function applySessionCondition(QueryBuilder $queryBuilder, string $sessionField)
{
$sessionCondition = api_get_session_condition(
$this->session ? $this->session->getId() : 0,
false,
api_get_configuration_value('portfolio_show_base_course_post_in_sessions'),
$sessionField,
true
);
$queryBuilder->andWhere($sessionCondition);
}
private function filterCommentsByCourseAndSession(QueryBuilder $queryBuilder)
{
if ($this->course) {
if ($this->session) {
$studentIdList = $this->session->getUsers()->map(fn(SessionRelUser $sru) => $sru->getUser()->getId());
if ($this->session->getSessionAdminId()) {
$studentIdList->add($this->session->getSessionAdminId());
}
if ($generalCoach = $this->session->getGeneralCoach()) {
$studentIdList->add($generalCoach->getId());
}
} else {
$studentIdList = $this->course->getUsers()->map(fn(CourseRelUser $cru) => $cru->getUser()->getId());
}
$queryBuilder
->andWhere('comment.author IN (:students)')
->setParameter('students', $studentIdList->getValues())
;
}
}
}

@ -1132,6 +1132,8 @@ INSERT INTO settings_current (variable, subkey, type, category, selected_value,
// ALTER TABLE portfolio_comment ADD visibility SMALLINT DEFAULT 1 NOT NULL;
// Then add the "@" symbol to the CPortfolioComment::$visibility property in the ORM\Column() line.
//$_configuration['portfolio_advanced_sharing'] = false;
// Show base course posts in session course
//$_configuration['portfolio_show_base_course_post_in_sessions'] = false;
// DEPRECATED: gradebook_enable_best_score is deprecated. Use gradebook_display_extra_stats instead.
// Enable best score column in gradebook. Previously called disable_gradebook_stats

@ -1,15 +1,15 @@
{% macro display(items, category_id, _c, _u, _p) %}
{% macro display(items, category_id, course, session, _u, _p) %}
{% set edit_img = 'edit.png'|img(22, 'Edit'|get_lang) %}
{% set visible_img = 'visible.png'|img(22, 'Invisible'|get_lang) %}
{% set invisible_img = 'invisible.png'|img(22, 'Visible'|get_lang) %}
{% set delete_img = 'delete.png'|img(22, 'Delete'|get_lang) %}
{% set baseurl = _p.web_self ~ '?' ~ (_p.web_cid_query ? _p.web_cid_query ~ '&' : '') %}
{% set is_advanced_sharing_enabled = 'portfolio_advanced_sharing'|api_get_configuration_value and not _c is empty %}
{% set is_advanced_sharing_enabled = 'portfolio_advanced_sharing'|api_get_configuration_value and course %}
<section class="portfolio-items">
{% for item in items %}
{% set item_url = baseurl ~ {'action':'view', 'id':item.id}|url_encode %}
{% set comments = item.lastComments(3, is_advanced_sharing_enabled) %}
{% set comments = item.lastComments(3, is_advanced_sharing_enabled, course, session) %}
<div class="panel panel-default">
<article class="panel-body portfolio-item" id="portfolio-item-{{ item.id }}">
@ -74,7 +74,7 @@
</h3>
<ul class="fa-ul list-inline">
{% if _c is empty %}
{% if course %}
{% if item.session %}
<li>
<span class="fa-li fa fa-book" aria-hidden="true"></span>

@ -58,7 +58,7 @@
<h4 class="page-header">{{ 'Posts'|get_lang }}</h4>
{% endif %}
{{ items.display(uncategorized_items, 0, _c, _u, _p) }}
{{ items.display(uncategorized_items, 0, course, session, _u, _p) }}
{% if found_comments %}
<section>
@ -127,7 +127,8 @@
items.display(
category.items(course, session, _u.id != category.user.id),
category.id,
_c,
course,
session,
_u,
_p
)

@ -376,8 +376,12 @@ class Portfolio
return $this->comments;
}
public function getLastComments(int $number = 3, bool $avoidPerUserVisibility = false): Collection
{
public function getLastComments(
int $number = 3,
bool $avoidPerUserVisibility = false,
?Course $course = null,
?Session $session = null
): Collection {
$criteria = Criteria::create();
$criteria
->orderBy(['date' => 'DESC'])
@ -389,6 +393,26 @@ class Portfolio
);
}
if ($course) {
if ($session) {
$studentIdList = $session->getUsers()->map(fn(SessionRelUser $sru) => $sru->getUser()->getId());
if ($session->getSessionAdminId()) {
$studentIdList->add($session->getSessionAdminId());
}
if ($generalCoach = $session->getGeneralCoach()) {
$studentIdList->add($generalCoach->getId());
}
} else {
$studentIdList = $course->getUsers()->map(fn(CourseRelUser $cru) => $cru->getUser()->getId());
}
$criteria->andWhere(
Criteria::expr()->in('author', $studentIdList->getValues())
);
}
return $this->comments->matching($criteria);
}

Loading…
Cancel
Save