Add user in the resource_node table, change "admin" tool to "global".

Create user repo using in the resource repository factory.
pull/3064/head
Julio 6 years ago
parent 99d196df37
commit bf9357cf5a
  1. 153
      public/main/inc/lib/usermanager.lib.php
  2. 23
      src/CoreBundle/Controller/ResourceController.php
  3. 5
      src/CoreBundle/Migrations/Schema/V200/Version20.php
  4. 2
      src/CoreBundle/Repository/ResourceRepository.php
  5. 13
      src/CoreBundle/Resources/config/tools.yml
  6. 4
      src/CoreBundle/Tool/GlobalTool.php
  7. 64
      src/UserBundle/Entity/User.php
  8. 24
      src/UserBundle/Repository/UserRepository.php
  9. 8
      src/UserBundle/Resources/config/services.yml

@ -2,6 +2,7 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\ExtraField as EntityExtraField;
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Chamilo\CoreBundle\Entity\SkillRelUser;
use Chamilo\CoreBundle\Entity\SkillRelUserComment;
use Chamilo\CoreBundle\Framework\Container;
@ -336,7 +337,25 @@ class UserManager
if (!empty($expirationDate)) {
$user->setExpirationDate($expirationDate);
}
try {
$factory = Container::$container->get('Chamilo\CoreBundle\Repository\ResourceFactory');
$repo = $factory->createRepository('global', 'users');
// Add user as a node:
$url = api_get_url_entity($access_url_id);
$resourceNode = new ResourceNode();
$resourceNode
->setSlug($loginName)
->setCreator(api_get_user_entity($creatorId))
->setResourceType($repo->getResourceType())
->setParent($url->getResourceNode())
;
$repo->getEntityManager()->persist($resourceNode);
$user->setResourceNode($resourceNode);
$repo->getEntityManager()->persist($user);
$userManager->updateUser($user);
$userId = $user->getId();
@ -738,8 +757,8 @@ class UserManager
$user = api_get_user_entity($user_id);
// Unsubscribe the user from all groups in all his courses
$sql = "SELECT c.id
FROM $table_course c
$sql = "SELECT c.id
FROM $table_course c
INNER JOIN $table_course_user cu
ON (c.id = cu.c_id)
WHERE
@ -2279,13 +2298,13 @@ class UserManager
</a>';
if ($showDelete) {
$production_list .= '&nbsp;&nbsp;
<input
style="width:16px;"
type="image"
name="remove_production['.urlencode($file).']"
src="'.$del_image.'"
alt="'.$del_text.'"
title="'.$del_text.' '.htmlentities($file).'"
<input
style="width:16px;"
type="image"
name="remove_production['.urlencode($file).']"
src="'.$del_image.'"
alt="'.$del_text.'"
title="'.$del_text.' '.htmlentities($file).'"
onclick="javascript: return confirmation(\''.htmlentities($file).'\');" /></li>';
}
}
@ -2677,7 +2696,7 @@ class UserManager
$res = Database::query($sql);
if (Database::num_rows($res) > 0) {
while ($row = Database::fetch_array($res)) {
$sqlu = "SELECT value as fval FROM $t_ufv v
$sqlu = "SELECT value as fval FROM $t_ufv v
INNER JOIN $t_uf f
ON (v.field_id = f.id)
WHERE
@ -3356,7 +3375,7 @@ class UserManager
INNER JOIN $tbl_course AS course
ON course.id = session_course_user.c_id AND session_course_user.session_id = $session_id
LEFT JOIN $tblCourseCategory course_category ON course.category_id = course_category.id
INNER JOIN $tbl_session as session
INNER JOIN $tbl_session as session
ON session_course_user.session_id = session.id
LEFT JOIN $tbl_user as user ON user.id = session_course_user.user_id
WHERE session_course_user.user_id = $user_id
@ -3444,7 +3463,7 @@ class UserManager
if (api_is_allowed_to_create_course()) {
$sql = "SELECT DISTINCT
c.visibility,
c.visibility,
c.id as real_id,
c.code as course_code,
sc.position
@ -3754,7 +3773,7 @@ class UserManager
return false;
}
$t_api = Database::get_main_table(TABLE_MAIN_USER_API_KEY);
$sql = "SELECT id FROM $t_api
$sql = "SELECT id FROM $t_api
WHERE user_id=".$user_id." AND api_service='".$api_service."'";
$res = Database::query($sql);
$num = Database::num_rows($res);
@ -3788,7 +3807,7 @@ class UserManager
}
$t_api = Database::get_main_table(TABLE_MAIN_USER_API_KEY);
$api_service = Database::escape_string($api_service);
$sql = "SELECT id FROM $t_api
$sql = "SELECT id FROM $t_api
WHERE user_id=".$user_id." AND api_service='".$api_service."'";
$res = Database::query($sql);
if (Database::num_rows($res) < 1) {
@ -3836,14 +3855,14 @@ class UserManager
$t_a = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
if (api_is_multiple_url_enabled()) {
$sql = "SELECT count(u.id)
FROM $t_u u
$sql = "SELECT count(u.id)
FROM $t_u u
INNER JOIN $t_a url_user
ON (u.id = url_user.user_id)
WHERE url_user.access_url_id = $access_url_id
WHERE url_user.access_url_id = $access_url_id
";
} else {
$sql = "SELECT count(u.id)
$sql = "SELECT count(u.id)
FROM $t_u u
WHERE 1 = 1 ";
}
@ -4488,10 +4507,10 @@ class UserManager
$js = '<script>
extra_field_toogle();
function extra_field_toogle() {
if (jQuery("select[name=search_type]").val() != "1") {
jQuery(".extra_field").hide();
} else {
jQuery(".extra_field").show();
if (jQuery("select[name=search_type]").val() != "1") {
jQuery(".extra_field").hide();
} else {
jQuery(".extra_field").show();
}
}
</script>';
@ -4605,13 +4624,13 @@ class UserManager
$extra_condition = ' AND relation_type = '.intval($with_status_condition);
}
$sql = 'DELETE FROM '.$tbl_my_friend.'
WHERE
relation_type <> '.USER_RELATION_TYPE_RRHH.' AND
WHERE
relation_type <> '.USER_RELATION_TYPE_RRHH.' AND
friend_user_id='.$friend_id.' '.$extra_condition;
Database::query($sql);
$sql = 'DELETE FROM '.$tbl_my_friend.'
WHERE
relation_type <> '.USER_RELATION_TYPE_RRHH.' AND
WHERE
relation_type <> '.USER_RELATION_TYPE_RRHH.' AND
user_id='.$friend_id.' '.$extra_condition;
Database::query($sql);
} else {
@ -4628,16 +4647,16 @@ class UserManager
WHERE user_id='.$user_id.' AND friend_user_id='.$friend_id;
$sql_j = 'UPDATE '.$tbl_my_message.' SET msg_status='.MESSAGE_STATUS_INVITATION_DENIED.'
WHERE
user_receiver_id='.$user_id.' AND
WHERE
user_receiver_id='.$user_id.' AND
user_sender_id='.$friend_id.' AND update_date="0000-00-00 00:00:00" ';
// Delete user
$sql_ij = 'UPDATE '.$tbl_my_friend.' SET relation_type='.USER_RELATION_TYPE_DELETED.'
WHERE user_id='.$friend_id.' AND friend_user_id='.$user_id;
$sql_ji = 'UPDATE '.$tbl_my_message.' SET msg_status='.MESSAGE_STATUS_INVITATION_DENIED.'
WHERE
user_receiver_id='.$friend_id.' AND
user_sender_id='.$user_id.' AND
WHERE
user_receiver_id='.$friend_id.' AND
user_sender_id='.$user_id.' AND
update_date="0000-00-00 00:00:00" ';
Database::query($sql_i);
Database::query($sql_j);
@ -4647,15 +4666,15 @@ class UserManager
}
// Delete accepted invitations
$sql = "DELETE FROM $tbl_my_message
$sql = "DELETE FROM $tbl_my_message
WHERE
msg_status = ".MESSAGE_STATUS_INVITATION_ACCEPTED." AND
(
user_receiver_id = $user_id AND
user_receiver_id = $user_id AND
user_sender_id = $friend_id
) OR
) OR
(
user_sender_id = $user_id AND
user_sender_id = $user_id AND
user_receiver_id = $friend_id
)
";
@ -4874,7 +4893,7 @@ class UserManager
$tbl_session_rel_access_url session_rel_access_rel_user
ON session_rel_access_rel_user.session_id = s.id
WHERE access_url_id = ".api_get_current_access_url_id()."
$sessionConditionsCoach
$sessionConditionsCoach
) OR sru.session_id IN (
SELECT DISTINCT(s.id) FROM $tbl_session s
INNER JOIN $tbl_session_rel_access_url url
@ -4884,7 +4903,7 @@ class UserManager
WHERE access_url_id = ".api_get_current_access_url_id()."
$sessionConditionsTeacher
)
)
)
$userConditions
)
UNION ALL(
@ -5053,29 +5072,29 @@ class UserManager
if ($deleteOtherAssignedUsers) {
if (api_get_multiple_access_url()) {
// Deleting assigned users to hrm_id
$sql = "SELECT s.user_id
FROM $userRelUserTable s
$sql = "SELECT s.user_id
FROM $userRelUserTable s
INNER JOIN $userRelAccessUrlTable a
ON (a.user_id = s.user_id)
WHERE
friend_user_id = $userId AND
relation_type = $relationType AND
ON (a.user_id = s.user_id)
WHERE
friend_user_id = $userId AND
relation_type = $relationType AND
access_url_id = ".api_get_current_access_url_id();
} else {
$sql = "SELECT user_id
FROM $userRelUserTable
WHERE
friend_user_id = $userId AND
$sql = "SELECT user_id
FROM $userRelUserTable
WHERE
friend_user_id = $userId AND
relation_type = $relationType";
}
$result = Database::query($sql);
if (Database::num_rows($result) > 0) {
while ($row = Database::fetch_array($result)) {
$sql = "DELETE FROM $userRelUserTable
$sql = "DELETE FROM $userRelUserTable
WHERE
user_id = {$row['user_id']} AND
friend_user_id = $userId AND
user_id = {$row['user_id']} AND
friend_user_id = $userId AND
relation_type = $relationType";
Database::query($sql);
}
@ -5083,8 +5102,8 @@ class UserManager
}
if ($deleteUsersBeforeInsert) {
$sql = "DELETE FROM $userRelUserTable
WHERE
$sql = "DELETE FROM $userRelUserTable
WHERE
user_id = $userId AND
relation_type = $relationType";
Database::query($sql);
@ -5094,11 +5113,11 @@ class UserManager
if (is_array($subscribedUsersId)) {
foreach ($subscribedUsersId as $subscribedUserId) {
$subscribedUserId = (int) $subscribedUserId;
$sql = "SELECT id
$sql = "SELECT id
FROM $userRelUserTable
WHERE
user_id = $subscribedUserId AND
friend_user_id = $userId AND
WHERE
user_id = $subscribedUserId AND
friend_user_id = $userId AND
relation_type = $relationType";
$result = Database::query($sql);
@ -5213,7 +5232,7 @@ class UserManager
$user_id = (int) $user_id;
$table = Database::get_main_table(TABLE_MAIN_GRADEBOOK_CERTIFICATE);
$sql = 'SELECT path_certificate
$sql = 'SELECT path_certificate
FROM '.$table.'
WHERE
cat_id = "'.$cat_id.'" AND
@ -5248,12 +5267,12 @@ class UserManager
$session_condition = " AND session_id = $session_id";
}
$sql = 'SELECT * FROM '.$tbl_grade_certificate.'
$sql = 'SELECT * FROM '.$tbl_grade_certificate.'
WHERE cat_id = (
SELECT id FROM '.$tbl_grade_category.'
WHERE
course_code = "'.Database::escape_string($course_code).'" '.$session_condition.'
LIMIT 1
course_code = "'.Database::escape_string($course_code).'" '.$session_condition.'
LIMIT 1
) AND user_id='.intval($user_id);
$rs = Database::query($sql);
@ -5422,7 +5441,7 @@ class UserManager
}
$userRelUserTable = Database::get_main_table(TABLE_MAIN_USER_REL_USER);
$sql = "DELETE FROM $userRelUserTable
$sql = "DELETE FROM $userRelUserTable
WHERE user_id = $userId AND relation_type = ".USER_RELATION_TYPE_BOSS;
Database::query($sql);
@ -5752,7 +5771,7 @@ class UserManager
$sql = <<<SQL
SELECT id, username, lastname, firstname
FROM $userTable
WHERE
WHERE
firstname LIKE '$firstname%' AND
lastname LIKE '$lastname%'
SQL;
@ -6492,11 +6511,11 @@ SQL;
$tableCareer = Database::get_main_table(TABLE_CAREER);
$userId = (int) $userId;
$sql = "SELECT c.id, c.name
FROM $table uc
INNER JOIN $tableCareer c
ON uc.career_id = c.id
WHERE user_id = $userId
$sql = "SELECT c.id, c.name
FROM $table uc
INNER JOIN $tableCareer c
ON uc.career_id = c.id
WHERE user_id = $userId
ORDER BY uc.created_at
";
$result = Database::query($sql);

@ -17,6 +17,7 @@ use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
use Chamilo\CourseBundle\Controller\CourseControllerInterface;
use Chamilo\CourseBundle\Controller\CourseControllerTrait;
use Chamilo\UserBundle\Entity\User;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\QueryBuilder;
@ -59,8 +60,17 @@ class ResourceController extends AbstractResourceController implements CourseCon
$tool = $request->get('tool');
$type = $request->get('type');
$course = $this->getCourse();
$grid = $this->getGrid($request, $grid, $course->getResourceNode()->getId());
$repository = $this->getRepositoryFromRequest($request);
$entityName = $repository->getResourceType()->getEntityName();
$parentResource = $this->getCourse();
if (null === $parentResource) {
/** @var User $user */
$parentResource = $this->getUser();
}
$grid = $this->getGrid($request, $grid, $parentResource->getResourceNode()->getId());
$breadcrumb = $this->getBreadCrumb();
$breadcrumb->addChild(
@ -939,12 +949,15 @@ class ResourceController extends AbstractResourceController implements CourseCon
}
/**
* @param string $mode show or download
* @param string $filter
* @param Request $request
* @param ResourceNode $resourceNode
* @param string $mode
* @param Glide|null $glide
* @param string $filter
*
* @return mixed|StreamedResponse
*/
private function showFile(Request $request, ResourceNode $resourceNode, string $mode = 'show', Glide $glide = null, $filter = '')
private function showFile(Request $request, ResourceNode $resourceNode, $mode = 'show', Glide $glide = null, $filter = '')
{
$this->denyAccessUnlessGranted(
ResourceNodeVoter::VIEW,

@ -965,6 +965,11 @@ class Version20 extends AbstractMigrationChamilo
$this->addSql("ALTER TABLE c_link ADD CONSTRAINT FK_9209C2A01BAD783F FOREIGN KEY (resource_node_id) REFERENCES resource_node (id) ON DELETE CASCADE;");
$this->addSql("CREATE UNIQUE INDEX UNIQ_9209C2A01BAD783F ON c_link (resource_node_id);");
$this->addSql("ALTER TABLE user ADD resource_node_id INT DEFAULT NULL;");
$this->addSql("ALTER TABLE user ADD CONSTRAINT FK_8D93D6491BAD783F FOREIGN KEY (resource_node_id) REFERENCES resource_node (id) ON DELETE CASCADE;");
$this->addSql("CREATE UNIQUE INDEX UNIQ_8D93D6491BAD783F ON user (resource_node_id);");
$this->addSql("ALTER TABLE user_audit ADD resource_node_id INT DEFAULT NULL;");
/* $this->addSql("");
$this->addSql("");
$this->addSql("");*/

@ -166,7 +166,7 @@ class ResourceRepository extends EntityRepository
* @param null $lockMode
* @param null $lockVersion
*/
public function find($id, $lockMode = null, $lockVersion = null): ?AbstractResource
public function find($id, $lockMode = null, $lockVersion = null) //: ?AbstractResource
{
return $this->getRepository()->find($id);
}

@ -9,12 +9,12 @@ services:
# Tool chain is filled in file DependencyInjection/Compiler/ToolCompilerClass.php
Chamilo\CoreBundle\ToolChain: ~
# Admin
chamilo_core.tool.admin:
class: Chamilo\CoreBundle\Tool\Admin
chamilo_core.tool.global:
class: Chamilo\CoreBundle\Tool\GlobalTool
arguments:
- 'admin'
- 'admin'
- 'admin'
- 'global'
- ''
- ''
- ''
- urls:
entity: Chamilo\CoreBundle\Entity\AccessUrl
@ -22,6 +22,9 @@ services:
courses:
entity: Chamilo\CoreBundle\Entity\Course
repository: Chamilo\CoreBundle\Repository\CourseRepository
users:
entity: Chamilo\UserBundle\Entity\User
repository: Chamilo\UserBundle\Repository\UserRepository
- 1
tags:
- {name: chamilo_core.tool}

@ -4,8 +4,8 @@
namespace Chamilo\CoreBundle\Tool;
/**
* Class Admin.
* Class GlobalTool.
*/
class Admin extends AbstractTool
class GlobalTool extends AbstractTool
{
}

@ -6,6 +6,8 @@ namespace Chamilo\UserBundle\Entity;
use Chamilo\CoreBundle\Entity\AccessUrl;
use Chamilo\CoreBundle\Entity\AccessUrlRelUser;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Resource\AbstractResource;
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Chamilo\CoreBundle\Entity\Skill;
use Chamilo\CoreBundle\Entity\UsergroupRelUser;
use Chamilo\ThemeBundle\Model\UserInterface as ThemeUser;
@ -16,7 +18,6 @@ use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Mapping as ORM;
use Sonata\UserBundle\Entity\BaseUser;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Security\Core\User\EquatableInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
@ -178,15 +179,6 @@ class User extends BaseUser implements ThemeUser, EquatableInterface //implement
*/
protected $address;
/**
* Vich\UploadableField(mapping="user_image", fileNameProperty="picture_uri").
*
* note This is not a mapped field of entity metadata, just a simple property.
*
* @var File
*/
protected $imageFile;
/**
* @var AccessUrl
*/
@ -506,6 +498,30 @@ class User extends BaseUser implements ThemeUser, EquatableInterface //implement
*/
protected $receivedMessages;
/**
*
* @ORM\OneToOne(
* targetEntity="Chamilo\CoreBundle\Entity\Resource\ResourceNode", cascade={"remove"}, orphanRemoval=true
* )
* @ORM\JoinColumn(name="resource_node_id", referencedColumnName="id", onDelete="CASCADE")
*/
public $resourceNode;
/**
* @return $this
*/
public function setResourceNode(ResourceNode $resourceNode): self
{
$this->resourceNode = $resourceNode;
return $this;
}
public function getResourceNode(): ResourceNode
{
return $this->resourceNode;
}
/**
* Constructor.
*/
@ -1432,34 +1448,6 @@ class User extends BaseUser implements ThemeUser, EquatableInterface //implement
return $this->getId();
}
/**
* If manually uploading a file (i.e. not using Symfony Form) ensure an instance
* of 'UploadedFile' is injected into this setter to trigger the update. If this
* bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
* must be able to accept an instance of 'File' as the bundle will inject one here
* during Doctrine hydration.
*
* @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image
*/
public function setImageFile(File $image)
{
$this->imageFile = $image;
if ($image) {
// It is required that at least one field changes if you are using doctrine
// otherwise the event listeners won't be called and the file is lost
$this->updatedAt = new \DateTime('now');
}
}
/**
* @return File
*/
public function getImageFile()
{
return $this->imageFile;
}
/**
* @return string
*/

@ -27,6 +27,8 @@ use Chamilo\CoreBundle\Entity\UserApiKey;
use Chamilo\CoreBundle\Entity\UserCourseCategory;
use Chamilo\CoreBundle\Entity\UsergroupRelUser;
use Chamilo\CoreBundle\Entity\UserRelCourseVote;
use Chamilo\CoreBundle\Repository\ResourceRepository;
use Chamilo\CoreBundle\Repository\ResourceRepositoryInterface;
use Chamilo\CourseBundle\Entity\CAttendanceResult;
use Chamilo\CourseBundle\Entity\CAttendanceSheet;
use Chamilo\CourseBundle\Entity\CBlogPost;
@ -59,19 +61,19 @@ use Symfony\Component\Serializer\Serializer;
* All functions that query the database (selects)
* Functions should return query builders.
*/
class UserRepository
class UserRepository extends ResourceRepository
{
/**
* @var EntityRepository
*/
private $repository;
//private $repository;
public function __construct(EntityManagerInterface $entityManager)
/*public function __construct(EntityManagerInterface $entityManager)
{
$this->repository = $entityManager->getRepository(User::class);
}
}*/
public function find($id): ?User
/*public function find($id)
{
$user = $this->repository->find($id);
@ -80,7 +82,7 @@ class UserRepository
}
return $user;
}
}*/
public function findByUsername(string $username): ?User
{
@ -455,7 +457,7 @@ class UserRepository
} else {
$dql = "SELECT DISTINCT U
FROM ChamiloCoreBundle:AccessUrlRelUser R, ChamiloCoreBundle:UserRelUser UF
INNER JOIN ChamiloUserBundle:User AS U
INNER JOIN ChamiloUserBundle:User AS U
WITH UF.friendUserId = U
WHERE
U.active = 1 AND
@ -473,7 +475,7 @@ class UserRepository
if ($allowSendMessageToAllUsers === 'true') {
$dql = "SELECT DISTINCT U
FROM ChamiloUserBundle:User U
LEFT JOIN ChamiloCoreBundle:AccessUrlRelUser R
LEFT JOIN ChamiloCoreBundle:AccessUrlRelUser R
WITH U = R.user
WHERE
U.active = 1 AND
@ -486,10 +488,10 @@ class UserRepository
$limit_date = api_get_utc_datetime($online_time);
$dql = "SELECT DISTINCT U
FROM ChamiloUserBundle:User U
INNER JOIN ChamiloCoreBundle:TrackEOnline T
INNER JOIN ChamiloCoreBundle:TrackEOnline T
WITH U.id = T.loginUserId
WHERE
U.active = 1 AND
WHERE
U.active = 1 AND
T.loginDate >= '".$limit_date."'";
}
}

@ -12,5 +12,11 @@ services:
chamilo_user.security.login_form_authenticator:
class: Chamilo\UserBundle\Security\LoginFormAuthenticator
Chamilo\UserBundle\Repository\UserRepository: ~
Chamilo\UserBundle\Repository\UserRepository:
arguments:
$tool: 'global'
$type: 'users'
# call a method on the specified factory service
factory: ['@Chamilo\CoreBundle\Repository\ResourceFactory', 'createRepository']
Chamilo\UserBundle\Repository\GroupRepository: ~

Loading…
Cancel
Save