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. 153
      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. 42
      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 */
use Chamilo\CoreBundle\Entity\SysAnnouncement;
use Chamilo\CoreBundle\Framework\Container;
/**
* 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.
$interbreadcrumb[] = [
"url" => 'index.php',
"name" => get_lang('Administration'),
'url' => 'index.php',
'name' => get_lang('Administration'),
];
$visibleList = SystemAnnouncementManager::getVisibilityList();
$repo = Container::getSysAnnouncementRepository();
$visibleList = $repo->getVisibilityList();
$tool_name = null;
if (empty($_GET['lang'])) {
@ -136,30 +141,27 @@ switch ($action) {
break;
case 'edit':
// Edit an announcement.
$announcement = SystemAnnouncementManager::get_announcement($_GET['id']);
$values['id'] = $announcement->id;
$values['title'] = $announcement->title;
$values['content'] = $announcement->content;
$values['start'] = api_get_local_time($announcement->date_start);
$values['end'] = api_get_local_time($announcement->date_end);
$values['range'] = substr(api_get_local_time($announcement->date_start), 0, 16).' / '.
substr(api_get_local_time($announcement->date_end), 0, 16);
$data = (array) $announcement;
foreach ($visibleList as $key => $value) {
if (isset($data[$key])) {
$values[$key] = $data[$key];
}
}
/** @var SysAnnouncement $announcement */
$announcement = $repo->find($_GET['id']);
$values['id'] = $announcement->getId();
$values['title'] = $announcement->getTitle();
$values['content'] = $announcement->getContent();
$values['start'] = api_get_local_time($announcement->getDateStart());
$values['end'] = api_get_local_time($announcement->getDateEnd());
$values['range'] = substr(api_get_local_time($announcement->getDateStart()), 0, 16).' / '.
substr(api_get_local_time($announcement->getDateEnd()), 0, 16);
$values['roles'] = $announcement->getRoles();
if ($allowCareers) {
$values['career_id'] = $announcement->career_id;
$values['promotion_id'] = $announcement->promotion_id;
$values['career_id'] = $announcement->getCareer() ? $announcement->getCareer()->getId() : 0;
$values['promotion_id'] = $announcement->getPromotion() ? $announcement->getPromotion() : 0;
}
$values['lang'] = $announcement->lang;
$values['lang'] = $announcement->getLang();
$values['action'] = 'edit';
$groups = SystemAnnouncementManager::get_announcement_groups($announcement->id);
$values['group'] = isset($groups['group_id']) ? $groups['group_id'] : 0;
$groups = SystemAnnouncementManager::get_announcement_groups($announcement->getId());
$values['group'] = $groups['group_id'] ?? 0;
$action_todo = true;
break;
}
@ -276,7 +278,6 @@ if ($action_todo) {
error_log($e);
}
$group = [];
foreach ($visibleList as $key => $name) {
$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');
$userGroup = new UserGroupModel();
$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'));
if ('add' === $action) {
@ -322,19 +325,19 @@ if ($action_todo) {
if ($form->validate()) {
$values = $form->getSubmitValues();
$visibilityResult = [];
/*$visibilityResult = [];
foreach ($visibleList as $key => $value) {
if (!isset($values[$key])) {
$values[$key] = false;
}
$visibilityResult[$key] = (int) $values[$key];
}
}*/
if ('all' === $values['lang']) {
$values['lang'] = null;
}
$sendMail = isset($values['send_mail']) ? $values['send_mail'] : null;
$sendMail = $values['send_mail'] ?? null;
switch ($values['action']) {
case 'add':
@ -343,7 +346,7 @@ if ($action_todo) {
$values['content'],
$values['range_start'],
$values['range_end'],
$visibilityResult,
$values['roles'],
$values['lang'],
$sendMail,
empty($values['add_to_calendar']) ? false : true,
@ -378,7 +381,7 @@ if ($action_todo) {
break;
case 'edit':
$sendMailTest = isset($values['send_email_test']) ? $values['send_email_test'] : null;
$sendMailTest = $values['send_email_test'] ?? null;
if (SystemAnnouncementManager::update_announcement(
$values['id'],
@ -386,24 +389,25 @@ if ($action_todo) {
$values['content'],
$values['range_start'],
$values['range_end'],
$visibilityResult,
$values['roles'],
$values['lang'],
$sendMail,
$sendMailTest
)) {
$deletePicture = isset($values['delete_picture']) ? $values['delete_picture'] : '';
$deletePicture = $values['delete_picture'] ?? '';
if ($deletePicture) {
SystemAnnouncementManager::deleteAnnouncementPicture($values['id']);
} else {
$picture = $_FILES['picture'];
// @todo
/*$picture = $_FILES['picture'];
if (!empty($picture['name'])) {
$picture_uri = SystemAnnouncementManager::update_announcements_picture(
$values['id'],
$picture['tmp_name'],
$values['picture_crop_result']
);
}
}*/
}
if (isset($values['group'])) {
@ -434,32 +438,38 @@ if ($action_todo) {
}
if ($show_announcement_list) {
$announcements = SystemAnnouncementManager :: get_all_announcements();
$criteria = [ 'url' => api_get_url_entity()];
$announcements = $repo->findBy($criteria);
$announcement_data = [];
foreach ($announcements as $index => $announcement) {
/** @var SysAnnouncement $announcement */
foreach ($announcements as $announcement) {
$row = [];
$row[] = $announcement->id;
$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[] = $announcement->title;
$row[] = api_convert_and_format_date($announcement->date_start);
$row[] = api_convert_and_format_date($announcement->date_end);
$data = (array) $announcement;
foreach ($visibleList as $key => $value) {
$row[] = $announcement->getId();
$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->getTitle();
$row[] = api_convert_and_format_date($announcement->getDateStart());
$row[] = api_convert_and_format_date($announcement->getDateEnd());
//$data = (array) $announcement;
$roles = [];
/*foreach ($visibleList as $key => $value) {
$value = $data[$key];
$action = $value ? 'make_invisible' : 'make_visible';
$row[] = "<a href=\"?id=".$announcement->id."&person=".$key."&action=".$action."\">".
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_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[] = $announcement->lang;
$row[] = "<a href=\"?action=edit&id=".$announcement->id."\">".
$row[] = $announcement->getLang();
$row[] = "<a href=\"?action=edit&id=".$announcement->getId()."\">".
Display::return_icon('edit.png', get_lang('Edit'), [], ICON_SIZE_SMALL)."</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' >".
Display::return_icon('delete.png', get_lang('Delete'), [], ICON_SIZE_SMALL).
"</a>";
@ -471,12 +481,13 @@ if ($show_announcement_list) {
$table->set_header(2, get_lang('Title'));
$table->set_header(3, get_lang('Start'));
$table->set_header(4, get_lang('End'));
$table->set_header(5, get_lang('Roles'));
$count = 5;
foreach ($visibleList as $key => $title) {
$count = 6;
/*foreach ($visibleList as $key => $title) {
$table->set_header($count, $title);
$count++;
}
}*/
$table->set_header($count++, get_lang('Language'));
$table->set_header($count++, get_lang('Edit'), false, 'width="50px"');

@ -3,6 +3,7 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\SysAnnouncement;
use Chamilo\CoreBundle\Framework\Container;
/**
* Class SystemAnnouncementManager.
@ -331,35 +332,6 @@ class SystemAnnouncementManager
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.
*
@ -431,8 +403,8 @@ class SystemAnnouncementManager
return false;
}
$start = api_get_utc_datetime($date_start);
$end = api_get_utc_datetime($date_end);
$start = api_get_utc_datetime($date_start, null, true);
$end = api_get_utc_datetime($date_end, null, true);
//Fixing urls that are sent by email
//$content = str_replace('src=\"/home/', 'src=\"'.api_get_path(WEB_PATH).'home/', $content);
@ -449,42 +421,40 @@ class SystemAnnouncementManager
);
$lang = is_null($lang) ? '' : $lang;
$current_access_url_id = 1;
if (api_is_multiple_url_enabled()) {
$current_access_url_id = api_get_current_access_url_id();
}
$sysRepo = Container::getSysAnnouncementRepository();
$params = [
'title' => $title,
'content' => $content,
'date_start' => $start,
'date_end' => $end,
'lang' => $lang,
'access_url_id' => $current_access_url_id,
];
$sysAnnouncement = (new SysAnnouncement())
->setTitle($title)
->setContent($content)
->setDateStart($start)
->setDateEnd($end)
->setLang($lang)
->setUrl(api_get_url_entity())
->setRoles($visibility)
;
if (api_get_configuration_value('allow_careers_in_global_announcements') && !empty($careerId)) {
$params['career_id'] = (int) $careerId;
$params['promotion_id'] = (int) $promotionId;
}
$careerRepo = Container::getCareerRepository();
$sysAnnouncement->setCareer($careerRepo->find($careerId));
foreach ($visibility as $key => $value) {
$params[$key] = $value;
$promotionRepo = Container::getPromotionRepository();
$sysAnnouncement->setPromotion($promotionRepo->find($promotionId));
}
$resultId = Database::insert($db_table, $params);
$sysRepo->update($sysAnnouncement);
$resultId = $sysAnnouncement->getId();
if ($resultId) {
if ($sendEmailTest) {
self::send_system_announcement_by_email(
$resultId,
$sysAnnouncement,
$visibility,
true
);
} else {
if (1 == $send_mail) {
self::send_system_announcement_by_email(
$resultId,
$sysAnnouncement,
$visibility
);
}
@ -600,9 +570,10 @@ class SystemAnnouncementManager
$careerId = 0,
$promotionId = 0
) {
$em = Database::getManager();
$announcement = $em->find(SysAnnouncement::class, $id);
if (!$announcement) {
$sysRepo = Container::getSysAnnouncementRepository();
/** @var SysAnnouncement $announcement */
$announcement = $sysRepo->find($id);
if (null === $announcement) {
return false;
}
@ -666,13 +637,13 @@ class SystemAnnouncementManager
->setContent($content)
->setDateStart($dateStart)
->setDateEnd($dateEnd)
->setUrl(api_get_url_entity());
->setRoles($visibility)
;
$em->persist($announcement);
$em->flush();
$sysRepo->update($announcement);
// Update visibility
$list = self::getVisibilityList();
//$list = self::getVisibilityList();
$table = Database::get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
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;
$sql = "UPDATE $table SET $key = '$value' WHERE id = $id";
Database::query($sql);
}
}*/
if ($sendEmailTest) {
self::send_system_announcement_by_email(
$id,
$visibility,
true
);
self::send_system_announcement_by_email($announcement, true);
} else {
if (1 == $send_mail) {
self::send_system_announcement_by_email(
$id,
$visibility
);
self::send_system_announcement_by_email($announcement);
}
}
@ -783,32 +747,18 @@ class SystemAnnouncementManager
/**
* 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.
* False on database or e-mail sending error.
*/
public static function send_system_announcement_by_email(
$id,
$visibility,
$sendEmailTest = false
) {
$announcement = self::get_announcement($id);
if (empty($announcement)) {
return false;
}
$title = $announcement->title;
$content = $announcement->content;
$language = $announcement->lang;
public static function send_system_announcement_by_email(SysAnnouncement $announcement, bool $sendEmailTest = false)
{
$title = $announcement->getTitle();
$content = $announcement->getContent();
$language = $announcement->getLang();
$content = str_replace(['\r\n', '\n', '\r'], '', $content);
$now = api_get_utc_datetime();
$teacher = $visibility['visible_teacher'];
$student = $visibility['visible_student'];
if ($sendEmailTest) {
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."' ";
}
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
WHERE status = '5' $urlCondition";
}
$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
WHERE 1 = 1 $urlCondition";
}
$announcement;
$sql .= " AND roles IN () ";
if (!isset($sql)) {
return false;
@ -861,12 +802,12 @@ class SystemAnnouncementManager
$userListToFilter = [];
// @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();
$promotionList = $promotion->get_all_promotions_by_career_id($announcement->career_id);
if (isset($announcement->promotion_id) && !empty($announcement->promotion_id)) {
$promotionList = $promotion->get_all_promotions_by_career_id($announcement->getCareer()->getId());
if (null !== $announcement->getPromotion()) {
$promotionList = [];
$promotionList[] = $promotion->get($announcement->promotion_id);
$promotionList[] = $promotion->get($announcement->getPromotion()->getId());
}
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;
/**
* SysAnnouncement.
* Portal announcements.
*
* @ORM\Table(name="sys_announcement")
* @ORM\Entity
@ -91,25 +91,35 @@ class SysAnnouncement
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()
{
$this->roles = [];
$this->visibleBoss = false;
$this->visibleDrh = false;
$this->visibleGuest = false;
$this->visibleSessionAdmin = false;
$this->visibleStudent = false;
$this->visibleTeacher = false;
$this->careerId = 0;
$this->promotionId = 0;
}
/**
@ -305,4 +315,61 @@ class SysAnnouncement
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\Repository\AssetRepository;
use Chamilo\CoreBundle\Repository\CareerRepository;
use Chamilo\CoreBundle\Repository\CourseCategoryRepository;
use Chamilo\CoreBundle\Repository\GradeBookCategoryRepository;
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\UsergroupRepository;
use Chamilo\CoreBundle\Repository\Node\UserRepository;
use Chamilo\CoreBundle\Repository\PromotionRepository;
use Chamilo\CoreBundle\Repository\SequenceRepository;
use Chamilo\CoreBundle\Repository\SequenceResourceRepository;
use Chamilo\CoreBundle\Repository\SessionRepository;
use Chamilo\CoreBundle\Repository\SysAnnouncementRepository;
use Chamilo\CoreBundle\Settings\SettingsManager;
use Chamilo\CoreBundle\ToolChain;
use Chamilo\CourseBundle\Repository\CAnnouncementAttachmentRepository;
@ -275,6 +278,11 @@ class Container
return self::$container->get(CourseRepository::class);
}
public static function getCareerRepository(): CareerRepository
{
return self::$container->get(CareerRepository::class);
}
public static function getCourseCategoryRepository(): CourseCategoryRepository
{
return self::$container->get(CourseCategoryRepository::class);
@ -410,6 +418,11 @@ class Container
return self::$container->get(PersonalFileRepository::class);
}
public static function getPromotionRepository(): PromotionRepository
{
return self::$container->get(PromotionRepository::class);
}
public static function getUserRepository(): UserRepository
{
return self::$container->get(UserRepository::class);
@ -470,6 +483,11 @@ class Container
return self::$container->get(CSurveyQuestionRepository::class);
}
public static function getSysAnnouncementRepository(): SysAnnouncementRepository
{
return self::$container->get(SysAnnouncementRepository::class);
}
public static function getThematicRepository(): CThematicRepository
{
return self::$container->get(CThematicRepository::class);

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

@ -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