SysAnnouncements: Use entities, add one item during installation

- Replace custom visibility with roles (ROLE_ADMIN, ROLE_STUDENT, etc)
- Creates a welcome announcement during an installation with
SysAnnouncementFixtures.php
- Add repos: CareerRepository.php, PromotionRepository.php,
SysAnnouncementRepository.php
- Use entities when adding a career/promotion
- Add migration
- Add simple phpunit test
pull/3924/head
Julio Montoya 4 years ago
parent 1a7924555e
commit 8ee120f6ed
  1. 115
      public/main/admin/system_announcements.php
  2. 151
      public/main/inc/lib/system_announcements.lib.php
  3. 31
      src/CoreBundle/DataFixtures/SysAnnouncementFixtures.php
  4. 81
      src/CoreBundle/Entity/SysAnnouncement.php
  5. 18
      src/CoreBundle/Framework/Container.php
  6. 40
      src/CoreBundle/Migrations/Schema/V200/Version20200922224343.php
  7. 19
      src/CoreBundle/Repository/CareerRepository.php
  8. 19
      src/CoreBundle/Repository/PromotionRepository.php
  9. 42
      src/CoreBundle/Repository/SysAnnouncementRepository.php
  10. 33
      tests/CoreBundle/Repository/SysAnnouncementRepositoryTest.php

@ -2,6 +2,9 @@
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\SysAnnouncement;
use Chamilo\CoreBundle\Framework\Container;
/** /**
* This page allows the administrator to manage the system announcements. * This page allows the administrator to manage the system announcements.
*/ */
@ -24,11 +27,13 @@ $allowCareers = api_get_configuration_value('allow_careers_in_global_announcemen
// Setting breadcrumbs. // Setting breadcrumbs.
$interbreadcrumb[] = [ $interbreadcrumb[] = [
"url" => 'index.php', 'url' => 'index.php',
"name" => get_lang('Administration'), 'name' => get_lang('Administration'),
]; ];
$visibleList = SystemAnnouncementManager::getVisibilityList(); $repo = Container::getSysAnnouncementRepository();
$visibleList = $repo->getVisibilityList();
$tool_name = null; $tool_name = null;
if (empty($_GET['lang'])) { if (empty($_GET['lang'])) {
@ -136,30 +141,27 @@ switch ($action) {
break; break;
case 'edit': case 'edit':
// Edit an announcement. // Edit an announcement.
$announcement = SystemAnnouncementManager::get_announcement($_GET['id']); /** @var SysAnnouncement $announcement */
$values['id'] = $announcement->id; $announcement = $repo->find($_GET['id']);
$values['title'] = $announcement->title; $values['id'] = $announcement->getId();
$values['content'] = $announcement->content; $values['title'] = $announcement->getTitle();
$values['start'] = api_get_local_time($announcement->date_start); $values['content'] = $announcement->getContent();
$values['end'] = api_get_local_time($announcement->date_end); $values['start'] = api_get_local_time($announcement->getDateStart());
$values['range'] = substr(api_get_local_time($announcement->date_start), 0, 16).' / '. $values['end'] = api_get_local_time($announcement->getDateEnd());
substr(api_get_local_time($announcement->date_end), 0, 16); $values['range'] = substr(api_get_local_time($announcement->getDateStart()), 0, 16).' / '.
substr(api_get_local_time($announcement->getDateEnd()), 0, 16);
$data = (array) $announcement;
foreach ($visibleList as $key => $value) { $values['roles'] = $announcement->getRoles();
if (isset($data[$key])) {
$values[$key] = $data[$key];
}
}
if ($allowCareers) { if ($allowCareers) {
$values['career_id'] = $announcement->career_id; $values['career_id'] = $announcement->getCareer() ? $announcement->getCareer()->getId() : 0;
$values['promotion_id'] = $announcement->promotion_id; $values['promotion_id'] = $announcement->getPromotion() ? $announcement->getPromotion() : 0;
} }
$values['lang'] = $announcement->lang; $values['lang'] = $announcement->getLang();
$values['action'] = 'edit'; $values['action'] = 'edit';
$groups = SystemAnnouncementManager::get_announcement_groups($announcement->id); $groups = SystemAnnouncementManager::get_announcement_groups($announcement->getId());
$values['group'] = isset($groups['group_id']) ? $groups['group_id'] : 0; $values['group'] = $groups['group_id'] ?? 0;
$action_todo = true; $action_todo = true;
break; break;
} }
@ -276,7 +278,6 @@ if ($action_todo) {
error_log($e); error_log($e);
} }
$group = []; $group = [];
foreach ($visibleList as $key => $name) { foreach ($visibleList as $key => $name) {
$group[] = $form->createElement( $group[] = $form->createElement(
@ -287,7 +288,9 @@ if ($action_todo) {
); );
} }
$form->addGroup($group, null, get_lang('Visible')); //$form->addGroup($group, null, get_lang('Visible'));
$form->addSelect('roles', get_lang('Visible'), $visibleList, ['multiple' => 'multiple']);
$form->addElement('hidden', 'id'); $form->addElement('hidden', 'id');
$userGroup = new UserGroupModel(); $userGroup = new UserGroupModel();
$group_list = $userGroup->get_all(); $group_list = $userGroup->get_all();
@ -303,7 +306,7 @@ if ($action_todo) {
); );
} }
$values['group'] = isset($values['group']) ? $values['group'] : '0'; $values['group'] = $values['group'] ?? '0';
$form->addElement('checkbox', 'send_mail', null, get_lang('Send mail')); $form->addElement('checkbox', 'send_mail', null, get_lang('Send mail'));
if ('add' === $action) { if ('add' === $action) {
@ -322,19 +325,19 @@ if ($action_todo) {
if ($form->validate()) { if ($form->validate()) {
$values = $form->getSubmitValues(); $values = $form->getSubmitValues();
$visibilityResult = []; /*$visibilityResult = [];
foreach ($visibleList as $key => $value) { foreach ($visibleList as $key => $value) {
if (!isset($values[$key])) { if (!isset($values[$key])) {
$values[$key] = false; $values[$key] = false;
} }
$visibilityResult[$key] = (int) $values[$key]; $visibilityResult[$key] = (int) $values[$key];
} }*/
if ('all' === $values['lang']) { if ('all' === $values['lang']) {
$values['lang'] = null; $values['lang'] = null;
} }
$sendMail = isset($values['send_mail']) ? $values['send_mail'] : null; $sendMail = $values['send_mail'] ?? null;
switch ($values['action']) { switch ($values['action']) {
case 'add': case 'add':
@ -343,7 +346,7 @@ if ($action_todo) {
$values['content'], $values['content'],
$values['range_start'], $values['range_start'],
$values['range_end'], $values['range_end'],
$visibilityResult, $values['roles'],
$values['lang'], $values['lang'],
$sendMail, $sendMail,
empty($values['add_to_calendar']) ? false : true, empty($values['add_to_calendar']) ? false : true,
@ -378,7 +381,7 @@ if ($action_todo) {
break; break;
case 'edit': case 'edit':
$sendMailTest = isset($values['send_email_test']) ? $values['send_email_test'] : null; $sendMailTest = $values['send_email_test'] ?? null;
if (SystemAnnouncementManager::update_announcement( if (SystemAnnouncementManager::update_announcement(
$values['id'], $values['id'],
@ -386,24 +389,25 @@ if ($action_todo) {
$values['content'], $values['content'],
$values['range_start'], $values['range_start'],
$values['range_end'], $values['range_end'],
$visibilityResult, $values['roles'],
$values['lang'], $values['lang'],
$sendMail, $sendMail,
$sendMailTest $sendMailTest
)) { )) {
$deletePicture = isset($values['delete_picture']) ? $values['delete_picture'] : ''; $deletePicture = $values['delete_picture'] ?? '';
if ($deletePicture) { if ($deletePicture) {
SystemAnnouncementManager::deleteAnnouncementPicture($values['id']); SystemAnnouncementManager::deleteAnnouncementPicture($values['id']);
} else { } else {
$picture = $_FILES['picture']; // @todo
/*$picture = $_FILES['picture'];
if (!empty($picture['name'])) { if (!empty($picture['name'])) {
$picture_uri = SystemAnnouncementManager::update_announcements_picture( $picture_uri = SystemAnnouncementManager::update_announcements_picture(
$values['id'], $values['id'],
$picture['tmp_name'], $picture['tmp_name'],
$values['picture_crop_result'] $values['picture_crop_result']
); );
} }*/
} }
if (isset($values['group'])) { if (isset($values['group'])) {
@ -434,32 +438,38 @@ if ($action_todo) {
} }
if ($show_announcement_list) { if ($show_announcement_list) {
$announcements = SystemAnnouncementManager :: get_all_announcements(); $criteria = [ 'url' => api_get_url_entity()];
$announcements = $repo->findBy($criteria);
$announcement_data = []; $announcement_data = [];
foreach ($announcements as $index => $announcement) { /** @var SysAnnouncement $announcement */
foreach ($announcements as $announcement) {
$row = []; $row = [];
$row[] = $announcement->id; $row[] = $announcement->getId();
$row[] = Display::return_icon(($announcement->visible ? 'accept.png' : 'exclamation.png'), ($announcement->visible ? get_lang('The announcement is available') : get_lang('The announcement is not available'))); $row[] = Display::return_icon(($announcement->isVisible() ? 'accept.png' : 'exclamation.png'), ($announcement->isVisible() ? get_lang('The announcement is available') : get_lang('The announcement is not available')));
$row[] = $announcement->title; $row[] = $announcement->getTitle();
$row[] = api_convert_and_format_date($announcement->date_start); $row[] = api_convert_and_format_date($announcement->getDateStart());
$row[] = api_convert_and_format_date($announcement->date_end); $row[] = api_convert_and_format_date($announcement->getDateEnd());
$data = (array) $announcement; //$data = (array) $announcement;
foreach ($visibleList as $key => $value) { $roles = [];
/*foreach ($visibleList as $key => $value) {
$value = $data[$key]; $value = $data[$key];
$action = $value ? 'make_invisible' : 'make_visible'; $action = $value ? 'make_invisible' : 'make_visible';
$row[] = "<a href=\"?id=".$announcement->id."&person=".$key."&action=".$action."\">". $row[] = "<a href=\"?id=".$announcement->id."&person=".$key."&action=".$action."\">".
Display::return_icon(($value ? 'eyes.png' : 'eyes-close.png'), get_lang('Show/Hide'))."</a>"; Display::return_icon(($value ? 'eyes.png' : 'eyes-close.png'), get_lang('Show/Hide'))."</a>";
} }*/
$row[] = implode(', ', $announcement->getRoles());
/*$row[] = "<a href=\"?id=".$announcement->id."&person=".SystemAnnouncementManager::VISIBLE_TEACHER."&action=".($announcement->visible_teacher ? 'make_invisible' : 'make_visible')."\">".Display::return_icon(($announcement->visible_teacher ? 'eyes.png' : 'eyes-close.png'), get_lang('Show/Hide'))."</a>"; /*$row[] = "<a href=\"?id=".$announcement->id."&person=".SystemAnnouncementManager::VISIBLE_TEACHER."&action=".($announcement->visible_teacher ? 'make_invisible' : 'make_visible')."\">".Display::return_icon(($announcement->visible_teacher ? 'eyes.png' : 'eyes-close.png'), get_lang('Show/Hide'))."</a>";
$row[] = "<a href=\"?id=".$announcement->id."&person=".SystemAnnouncementManager::VISIBLE_STUDENT."&action=".($announcement->visible_student ? 'make_invisible' : 'make_visible')."\">".Display::return_icon(($announcement->visible_student ? 'eyes.png' : 'eyes-close.png'), get_lang('Show/Hide'))."</a>"; $row[] = "<a href=\"?id=".$announcement->id."&person=".SystemAnnouncementManager::VISIBLE_STUDENT."&action=".($announcement->visible_student ? 'make_invisible' : 'make_visible')."\">".Display::return_icon(($announcement->visible_student ? 'eyes.png' : 'eyes-close.png'), get_lang('Show/Hide'))."</a>";
$row[] = "<a href=\"?id=".$announcement->id."&person=".SystemAnnouncementManager::VISIBLE_GUEST."&action=".($announcement->visible_guest ? 'make_invisible' : 'make_visible')."\">".Display::return_icon(($announcement->visible_guest ? 'eyes.png' : 'eyes-close.png'), get_lang('Show/Hide'))."</a>";*/ $row[] = "<a href=\"?id=".$announcement->id."&person=".SystemAnnouncementManager::VISIBLE_GUEST."&action=".($announcement->visible_guest ? 'make_invisible' : 'make_visible')."\">".Display::return_icon(($announcement->visible_guest ? 'eyes.png' : 'eyes-close.png'), get_lang('Show/Hide'))."</a>";*/
$row[] = $announcement->lang; $row[] = $announcement->getLang();
$row[] = "<a href=\"?action=edit&id=".$announcement->id."\">". $row[] = "<a href=\"?action=edit&id=".$announcement->getId()."\">".
Display::return_icon('edit.png', get_lang('Edit'), [], ICON_SIZE_SMALL)."</a> Display::return_icon('edit.png', get_lang('Edit'), [], ICON_SIZE_SMALL)."</a>
<a <a
href=\"?action=delete&id=".$announcement->id."\" href=\"?action=delete&id=".$announcement->getId()."\"
title=".addslashes(api_htmlentities(get_lang('Please confirm your choice')))." class='delete-swal' >". title=".addslashes(api_htmlentities(get_lang('Please confirm your choice')))." class='delete-swal' >".
Display::return_icon('delete.png', get_lang('Delete'), [], ICON_SIZE_SMALL). Display::return_icon('delete.png', get_lang('Delete'), [], ICON_SIZE_SMALL).
"</a>"; "</a>";
@ -471,12 +481,13 @@ if ($show_announcement_list) {
$table->set_header(2, get_lang('Title')); $table->set_header(2, get_lang('Title'));
$table->set_header(3, get_lang('Start')); $table->set_header(3, get_lang('Start'));
$table->set_header(4, get_lang('End')); $table->set_header(4, get_lang('End'));
$table->set_header(5, get_lang('Roles'));
$count = 5; $count = 6;
foreach ($visibleList as $key => $title) { /*foreach ($visibleList as $key => $title) {
$table->set_header($count, $title); $table->set_header($count, $title);
$count++; $count++;
} }*/
$table->set_header($count++, get_lang('Language')); $table->set_header($count++, get_lang('Language'));
$table->set_header($count++, get_lang('Edit'), false, 'width="50px"'); $table->set_header($count++, get_lang('Edit'), false, 'width="50px"');

@ -3,6 +3,7 @@
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\SysAnnouncement; use Chamilo\CoreBundle\Entity\SysAnnouncement;
use Chamilo\CoreBundle\Framework\Container;
/** /**
* Class SystemAnnouncementManager. * Class SystemAnnouncementManager.
@ -331,35 +332,6 @@ class SystemAnnouncementManager
return $i; return $i;
} }
/**
* Get all announcements.
*
* @return array An array with all available system announcements (as php
* objects)
*/
public static function get_all_announcements()
{
$table = Database::get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
$now = api_get_utc_datetime();
$sql = "SELECT *, IF ( '$now' >= date_start AND '$now' <= date_end, '1', '0') AS visible
FROM $table";
$current_access_url_id = 1;
if (api_is_multiple_url_enabled()) {
$current_access_url_id = api_get_current_access_url_id();
}
$sql .= " WHERE access_url_id = '$current_access_url_id' ";
$sql .= " ORDER BY date_start ASC";
$result = Database::query($sql);
$announcements = [];
while ($announcement = Database::fetch_object($result)) {
$announcements[] = $announcement;
}
return $announcements;
}
/** /**
* Adds an announcement to the database. * Adds an announcement to the database.
* *
@ -431,8 +403,8 @@ class SystemAnnouncementManager
return false; return false;
} }
$start = api_get_utc_datetime($date_start); $start = api_get_utc_datetime($date_start, null, true);
$end = api_get_utc_datetime($date_end); $end = api_get_utc_datetime($date_end, null, true);
//Fixing urls that are sent by email //Fixing urls that are sent by email
//$content = str_replace('src=\"/home/', 'src=\"'.api_get_path(WEB_PATH).'home/', $content); //$content = str_replace('src=\"/home/', 'src=\"'.api_get_path(WEB_PATH).'home/', $content);
@ -449,42 +421,40 @@ class SystemAnnouncementManager
); );
$lang = is_null($lang) ? '' : $lang; $lang = is_null($lang) ? '' : $lang;
$current_access_url_id = 1; $sysRepo = Container::getSysAnnouncementRepository();
if (api_is_multiple_url_enabled()) {
$current_access_url_id = api_get_current_access_url_id();
}
$params = [ $sysAnnouncement = (new SysAnnouncement())
'title' => $title, ->setTitle($title)
'content' => $content, ->setContent($content)
'date_start' => $start, ->setDateStart($start)
'date_end' => $end, ->setDateEnd($end)
'lang' => $lang, ->setLang($lang)
'access_url_id' => $current_access_url_id, ->setUrl(api_get_url_entity())
]; ->setRoles($visibility)
;
if (api_get_configuration_value('allow_careers_in_global_announcements') && !empty($careerId)) { if (api_get_configuration_value('allow_careers_in_global_announcements') && !empty($careerId)) {
$params['career_id'] = (int) $careerId; $careerRepo = Container::getCareerRepository();
$params['promotion_id'] = (int) $promotionId; $sysAnnouncement->setCareer($careerRepo->find($careerId));
}
foreach ($visibility as $key => $value) { $promotionRepo = Container::getPromotionRepository();
$params[$key] = $value; $sysAnnouncement->setPromotion($promotionRepo->find($promotionId));
} }
$resultId = Database::insert($db_table, $params); $sysRepo->update($sysAnnouncement);
$resultId = $sysAnnouncement->getId();
if ($resultId) { if ($resultId) {
if ($sendEmailTest) { if ($sendEmailTest) {
self::send_system_announcement_by_email( self::send_system_announcement_by_email(
$resultId, $sysAnnouncement,
$visibility, $visibility,
true true
); );
} else { } else {
if (1 == $send_mail) { if (1 == $send_mail) {
self::send_system_announcement_by_email( self::send_system_announcement_by_email(
$resultId, $sysAnnouncement,
$visibility $visibility
); );
} }
@ -600,9 +570,10 @@ class SystemAnnouncementManager
$careerId = 0, $careerId = 0,
$promotionId = 0 $promotionId = 0
) { ) {
$em = Database::getManager(); $sysRepo = Container::getSysAnnouncementRepository();
$announcement = $em->find(SysAnnouncement::class, $id); /** @var SysAnnouncement $announcement */
if (!$announcement) { $announcement = $sysRepo->find($id);
if (null === $announcement) {
return false; return false;
} }
@ -666,13 +637,13 @@ class SystemAnnouncementManager
->setContent($content) ->setContent($content)
->setDateStart($dateStart) ->setDateStart($dateStart)
->setDateEnd($dateEnd) ->setDateEnd($dateEnd)
->setUrl(api_get_url_entity()); ->setRoles($visibility)
;
$em->persist($announcement); $sysRepo->update($announcement);
$em->flush();
// Update visibility // Update visibility
$list = self::getVisibilityList(); //$list = self::getVisibilityList();
$table = Database::get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS); $table = Database::get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
if (api_get_configuration_value('allow_careers_in_global_announcements') && !empty($careerId)) { if (api_get_configuration_value('allow_careers_in_global_announcements') && !empty($careerId)) {
@ -686,24 +657,17 @@ class SystemAnnouncementManager
); );
} }
foreach ($list as $key => $title) { /*foreach ($list as $key => $title) {
$value = isset($visibility[$key]) && $visibility[$key] ? 1 : 0; $value = isset($visibility[$key]) && $visibility[$key] ? 1 : 0;
$sql = "UPDATE $table SET $key = '$value' WHERE id = $id"; $sql = "UPDATE $table SET $key = '$value' WHERE id = $id";
Database::query($sql); Database::query($sql);
} }*/
if ($sendEmailTest) { if ($sendEmailTest) {
self::send_system_announcement_by_email( self::send_system_announcement_by_email($announcement, true);
$id,
$visibility,
true
);
} else { } else {
if (1 == $send_mail) { if (1 == $send_mail) {
self::send_system_announcement_by_email( self::send_system_announcement_by_email($announcement);
$id,
$visibility
);
} }
} }
@ -783,32 +747,18 @@ class SystemAnnouncementManager
/** /**
* Send a system announcement by e-mail to all teachers/students depending on parameters. * Send a system announcement by e-mail to all teachers/students depending on parameters.
* *
* @param int $id
* @param array $visibility
* @param bool $sendEmailTest
*
* @return bool True if the message was sent or there was no destination matching. * @return bool True if the message was sent or there was no destination matching.
* False on database or e-mail sending error. * False on database or e-mail sending error.
*/ */
public static function send_system_announcement_by_email( public static function send_system_announcement_by_email(SysAnnouncement $announcement, bool $sendEmailTest = false)
$id, {
$visibility, $title = $announcement->getTitle();
$sendEmailTest = false $content = $announcement->getContent();
) { $language = $announcement->getLang();
$announcement = self::get_announcement($id);
if (empty($announcement)) {
return false;
}
$title = $announcement->title;
$content = $announcement->content;
$language = $announcement->lang;
$content = str_replace(['\r\n', '\n', '\r'], '', $content); $content = str_replace(['\r\n', '\n', '\r'], '', $content);
$now = api_get_utc_datetime(); $now = api_get_utc_datetime();
$teacher = $visibility['visible_teacher'];
$student = $visibility['visible_student'];
if ($sendEmailTest) { if ($sendEmailTest) {
MessageManager::send_message_simple(api_get_user_id(), $title, $content); MessageManager::send_message_simple(api_get_user_id(), $title, $content);
@ -825,20 +775,11 @@ class SystemAnnouncementManager
$urlCondition = " AND access_url_id = '".$current_access_url_id."' "; $urlCondition = " AND access_url_id = '".$current_access_url_id."' ";
} }
if (0 != $teacher && 0 == $student) {
$sql = "SELECT DISTINCT u.id as user_id FROM $user_table u $urlJoin
WHERE status = '1' $urlCondition";
}
if (0 == $teacher && 0 != $student) {
$sql = "SELECT DISTINCT u.id as user_id FROM $user_table u $urlJoin $sql = "SELECT DISTINCT u.id as user_id FROM $user_table u $urlJoin
WHERE status = '5' $urlCondition"; WHERE status = '1' $urlCondition ";
}
if (0 != $teacher && 0 != $student) { $announcement;
$sql = "SELECT DISTINCT u.id as user_id FROM $user_table u $urlJoin $sql .= " AND roles IN () ";
WHERE 1 = 1 $urlCondition";
}
if (!isset($sql)) { if (!isset($sql)) {
return false; return false;
@ -861,12 +802,12 @@ class SystemAnnouncementManager
$userListToFilter = []; $userListToFilter = [];
// @todo check if other filters will apply for the career/promotion option. // @todo check if other filters will apply for the career/promotion option.
if (isset($announcement->career_id) && !empty($announcement->career_id)) { if (null !== $announcement->getCareer()) {
$promotion = new Promotion(); $promotion = new Promotion();
$promotionList = $promotion->get_all_promotions_by_career_id($announcement->career_id); $promotionList = $promotion->get_all_promotions_by_career_id($announcement->getCareer()->getId());
if (isset($announcement->promotion_id) && !empty($announcement->promotion_id)) { if (null !== $announcement->getPromotion()) {
$promotionList = []; $promotionList = [];
$promotionList[] = $promotion->get($announcement->promotion_id); $promotionList[] = $promotion->get($announcement->getPromotion()->getId());
} }
if (!empty($promotionList)) { if (!empty($promotionList)) {

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\DataFixtures;
use Chamilo\CoreBundle\Entity\SysAnnouncement;
use DateTime;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
class SysAnnouncementFixtures extends Fixture
{
public function load(ObjectManager $manager): void
{
$url = $this->getReference(AccessUserFixtures::ACCESS_URL_REFERENCE);
$sysAnnouncement = (new SysAnnouncement())
->setTitle('Welcome')
->setContent('Welcome message')
->addRole('ROLE_USER')
->setUrl($url)
->setDateStart(new DateTime())
->setDateEnd(new DateTime('now +30 days'))
;
$manager->persist($sysAnnouncement);
$manager->flush();
}
}

@ -11,7 +11,7 @@ use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
/** /**
* SysAnnouncement. * Portal announcements.
* *
* @ORM\Table(name="sys_announcement") * @ORM\Table(name="sys_announcement")
* @ORM\Entity * @ORM\Entity
@ -91,25 +91,35 @@ class SysAnnouncement
protected AccessUrl $url; protected AccessUrl $url;
/** /**
* @ORM\Column(name="career_id", type="integer", nullable=true) * An array of roles. Example: ROLE_USER, ROLE_TEACHER, ROLE_ADMIN.
*
* @ORM\Column(type="array")
*
* @var string[]
*/
protected array $roles = [];
/**
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Career")
* @ORM\JoinColumn(name="career_id", referencedColumnName="id", onDelete="CASCADE")
*/ */
protected ?int $careerId; protected ?Career $career = null;
/** /**
* @ORM\Column(name="promotion_id", type="integer", nullable=true) * @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Promotion")
* @ORM\JoinColumn(name="promotion_id", referencedColumnName="id", onDelete="CASCADE")
*/ */
protected ?int $promotionId; protected ?Promotion $promotion = null;
public function __construct() public function __construct()
{ {
$this->roles = [];
$this->visibleBoss = false; $this->visibleBoss = false;
$this->visibleDrh = false; $this->visibleDrh = false;
$this->visibleGuest = false; $this->visibleGuest = false;
$this->visibleSessionAdmin = false; $this->visibleSessionAdmin = false;
$this->visibleStudent = false; $this->visibleStudent = false;
$this->visibleTeacher = false; $this->visibleTeacher = false;
$this->careerId = 0;
$this->promotionId = 0;
} }
/** /**
@ -305,4 +315,61 @@ class SysAnnouncement
return $this; return $this;
} }
public function getCareer(): ?Career
{
return $this->career;
}
public function setCareer(?Career $career): self
{
$this->career = $career;
return $this;
}
public function getPromotion(): ?Promotion
{
return $this->promotion;
}
public function setPromotion(?Promotion $promotion): self
{
$this->promotion = $promotion;
return $this;
}
public function getRoles(): array
{
return $this->roles;
}
public function setRoles(array $roles): self
{
$this->roles = [];
foreach ($roles as $role) {
$this->addRole($role);
}
return $this;
}
public function addRole(string $role): self
{
$role = strtoupper($role);
if (!\in_array($role, $this->roles, true)) {
$this->roles[] = $role;
}
return $this;
}
public function isVisible(): bool
{
$now = new DateTime();
return $this->getDateStart() <= $now && $now <= $this->getDateEnd();
}
} }

@ -8,6 +8,7 @@ namespace Chamilo\CoreBundle\Framework;
use Chamilo\CoreBundle\Component\Editor\Editor; use Chamilo\CoreBundle\Component\Editor\Editor;
use Chamilo\CoreBundle\Repository\AssetRepository; use Chamilo\CoreBundle\Repository\AssetRepository;
use Chamilo\CoreBundle\Repository\CareerRepository;
use Chamilo\CoreBundle\Repository\CourseCategoryRepository; use Chamilo\CoreBundle\Repository\CourseCategoryRepository;
use Chamilo\CoreBundle\Repository\GradeBookCategoryRepository; use Chamilo\CoreBundle\Repository\GradeBookCategoryRepository;
use Chamilo\CoreBundle\Repository\Node\AccessUrlRepository; use Chamilo\CoreBundle\Repository\Node\AccessUrlRepository;
@ -17,9 +18,11 @@ use Chamilo\CoreBundle\Repository\Node\MessageAttachmentRepository;
use Chamilo\CoreBundle\Repository\Node\PersonalFileRepository; use Chamilo\CoreBundle\Repository\Node\PersonalFileRepository;
use Chamilo\CoreBundle\Repository\Node\UsergroupRepository; use Chamilo\CoreBundle\Repository\Node\UsergroupRepository;
use Chamilo\CoreBundle\Repository\Node\UserRepository; use Chamilo\CoreBundle\Repository\Node\UserRepository;
use Chamilo\CoreBundle\Repository\PromotionRepository;
use Chamilo\CoreBundle\Repository\SequenceRepository; use Chamilo\CoreBundle\Repository\SequenceRepository;
use Chamilo\CoreBundle\Repository\SequenceResourceRepository; use Chamilo\CoreBundle\Repository\SequenceResourceRepository;
use Chamilo\CoreBundle\Repository\SessionRepository; use Chamilo\CoreBundle\Repository\SessionRepository;
use Chamilo\CoreBundle\Repository\SysAnnouncementRepository;
use Chamilo\CoreBundle\Settings\SettingsManager; use Chamilo\CoreBundle\Settings\SettingsManager;
use Chamilo\CoreBundle\ToolChain; use Chamilo\CoreBundle\ToolChain;
use Chamilo\CourseBundle\Repository\CAnnouncementAttachmentRepository; use Chamilo\CourseBundle\Repository\CAnnouncementAttachmentRepository;
@ -275,6 +278,11 @@ class Container
return self::$container->get(CourseRepository::class); return self::$container->get(CourseRepository::class);
} }
public static function getCareerRepository(): CareerRepository
{
return self::$container->get(CareerRepository::class);
}
public static function getCourseCategoryRepository(): CourseCategoryRepository public static function getCourseCategoryRepository(): CourseCategoryRepository
{ {
return self::$container->get(CourseCategoryRepository::class); return self::$container->get(CourseCategoryRepository::class);
@ -410,6 +418,11 @@ class Container
return self::$container->get(PersonalFileRepository::class); return self::$container->get(PersonalFileRepository::class);
} }
public static function getPromotionRepository(): PromotionRepository
{
return self::$container->get(PromotionRepository::class);
}
public static function getUserRepository(): UserRepository public static function getUserRepository(): UserRepository
{ {
return self::$container->get(UserRepository::class); return self::$container->get(UserRepository::class);
@ -470,6 +483,11 @@ class Container
return self::$container->get(CSurveyQuestionRepository::class); return self::$container->get(CSurveyQuestionRepository::class);
} }
public static function getSysAnnouncementRepository(): SysAnnouncementRepository
{
return self::$container->get(SysAnnouncementRepository::class);
}
public static function getThematicRepository(): CThematicRepository public static function getThematicRepository(): CThematicRepository
{ {
return self::$container->get(CThematicRepository::class); return self::$container->get(CThematicRepository::class);

@ -19,41 +19,27 @@ final class Version20200922224343 extends AbstractMigrationChamilo
public function up(Schema $schema): void public function up(Schema $schema): void
{ {
$table = $schema->getTable('sys_announcement'); $table = $schema->getTable('sys_announcement');
if ($table->hasColumn('visible_drh')) {
$this->addSql('ALTER TABLE sys_announcement CHANGE visible_drh visible_drh TINYINT(1) NOT NULL');
} else {
$this->addSql('ALTER TABLE sys_announcement ADD COLUMN visible_drh TINYINT(1) NOT NULL');
}
if (false === $table->hasColumn('career_id')) {
$this->addSql('ALTER TABLE sys_announcement ADD career_id INT DEFAULT NULL');
}
if (false === $table->hasColumn('promotion_id')) { if (!$table->hasColumn('roles')) {
$this->addSql('ALTER TABLE sys_announcement ADD promotion_id INT DEFAULT NULL'); $this->addSql("ALTER TABLE sys_announcement ADD roles LONGTEXT NOT NULL COMMENT '(DC2Type:array)'");
} }
if ($table->hasColumn('visible_session_admin')) { if (!$table->hasColumn('career_id')) {
$this->addSql( $this->addSql('ALTER TABLE sys_announcement ADD career_id INT DEFAULT NULL');
'ALTER TABLE sys_announcement CHANGE visible_session_admin visible_session_admin TINYINT(1) NOT NULL' $this->addSql('ALTER TABLE sys_announcement ADD CONSTRAINT FK_E4A3EAD4B58CDA09 FOREIGN KEY (career_id) REFERENCES career (id) ON DELETE CASCADE');
);
} else { } else {
$this->addSql( if (!$table->hasForeignKey('FK_E4A3EAD4B58CDA09')) {
'ALTER TABLE sys_announcement ADD COLUMN visible_session_admin TINYINT(1) NOT NULL' $this->addSql('ALTER TABLE sys_announcement ADD CONSTRAINT FK_E4A3EAD4B58CDA09 FOREIGN KEY (career_id) REFERENCES career (id) ON DELETE CASCADE');
);
} }
if ($table->hasColumn('visible_boss')) {
$this->addSql('ALTER TABLE sys_announcement CHANGE visible_boss visible_boss TINYINT(1) NOT NULL');
} else {
$this->addSql('ALTER TABLE sys_announcement ADD COLUMN visible_boss TINYINT(1) NOT NULL');
} }
if ($table->hasColumn('career_id')) { if (!$table->hasColumn('promotion_id')) {
$this->addSql('ALTER TABLE sys_announcement ADD career_id INT DEFAULT NULL'); $this->addSql('ALTER TABLE sys_announcement ADD promotion_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE sys_announcement ADD CONSTRAINT FK_E4A3EAD4139DF194 FOREIGN KEY (promotion_id) REFERENCES promotion (id) ON DELETE CASCADE');
} else {
if (!$table->hasForeignKey('FK_E4A3EAD4139DF194')) {
$this->addSql('ALTER TABLE sys_announcement ADD CONSTRAINT FK_E4A3EAD4139DF194 FOREIGN KEY (promotion_id) REFERENCES promotion (id) ON DELETE CASCADE');
} }
if ($table->hasColumn('promotion_id')) {
$this->addSql('ALTER TABLE sys_announcement ADD promotion_id INT DEFAULT NULL;');
} }
} }

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\Career;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
class CareerRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Career::class);
}
}

@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\Promotion;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
class PromotionRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Promotion::class);
}
}

@ -0,0 +1,42 @@
<?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\SysAnnouncement;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class SysAnnouncementRepository extends ServiceEntityRepository
{
protected ParameterBagInterface $parameterBag;
public function __construct(ManagerRegistry $registry, ParameterBagInterface $parameterBag)
{
parent::__construct($registry, SysAnnouncement::class);
$this->parameterBag = $parameterBag;
}
public function getVisibilityList()
{
$hierarchy = $this->parameterBag->get('security.role_hierarchy.roles');
$roles = [];
array_walk_recursive($hierarchy, function ($role) use (&$roles): void {
$roles[$role] = $role;
});
return $roles;
}
public function update(SysAnnouncement $sysAnnouncement, $andFlush = true): void
{
$this->getEntityManager()->persist($sysAnnouncement);
if ($andFlush) {
$this->getEntityManager()->flush();
}
}
}

@ -0,0 +1,33 @@
<?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */
namespace Chamilo\Tests\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Repository\SysAnnouncementRepository;
use Chamilo\Tests\ChamiloTestTrait;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**
* @covers \SysAnnouncementRepository
*/
class SysAnnouncementRepositoryTest extends WebTestCase
{
use ChamiloTestTrait;
/**
* Create a course with no creator.
*/
public function testCreateNoCreator(): void
{
self::bootKernel();
$repo = self::getContainer()->get(SysAnnouncementRepository::class);
$count = $repo->count([]);
// SysAnnouncementFixtures created one announcement during installation.
$this->assertSame(1, $count);
}
}
Loading…
Cancel
Save