Internal: Fix user image upload

pull/3451/head
Julio Montoya 5 years ago
parent dd6a342528
commit ba250d0fd9
  1. 556
      assets/vue/App.vue
  2. 1
      src/CoreBundle/Controller/AccountController.php
  3. 5
      src/CoreBundle/Entity/User.php
  4. 18
      src/CoreBundle/Repository/IllustrationRepository.php
  5. 3
      src/CoreBundle/Resources/views/Account/home.html.twig
  6. 5
      src/CoreBundle/Twig/Extension/ChamiloExtension.php

@ -1,289 +1,323 @@
<template> <template>
<v-app id="inspire"> <v-app id="inspire">
<snackbar></snackbar> <snackbar />
<v-navigation-drawer <v-navigation-drawer
app v-model="drawer"
dark app
v-model="drawer" dark
:clipped="$vuetify.breakpoint.lgAndUp" :clipped="$vuetify.breakpoint.lgAndUp"
disable-resize-watcher disable-resize-watcher
color="primary" color="primary"
> >
<v-list v-if="isAuthenticated"> <v-list v-if="isAuthenticated">
<v-list-item :to="{ name: 'Index' }"> <v-list-item :to="{ name: 'Index' }">
<v-list-item-action> <v-list-item-action>
<v-icon>mdi-home</v-icon> <v-icon>mdi-home</v-icon>
</v-list-item-action> </v-list-item-action>
<v-list-item-content> <v-list-item-content>
<v-list-item-title> <v-list-item-title>
Home Home
</v-list-item-title> </v-list-item-title>
</v-list-item-content> </v-list-item-content>
</v-list-item> </v-list-item>
<v-list-item :to="{ name: 'MyCourses' }">
<v-list-item-action>
<v-icon>mdi-book</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
My courses
</v-list-item-title>
</v-list-item-content>
</v-list-item>
<v-list-item :to="{ name: 'MySessions' }">
<v-list-item-action>
<v-icon>mdi-book-multiple</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
My sessions
</v-list-item-title>
</v-list-item-content>
</v-list-item>
<v-list-group <v-list-item :to="{ name: 'MyCourses' }">
v-if="isAdmin" <v-list-item-action>
prepend-icon="mdi-plus" <v-icon>mdi-book</v-icon>
value="true" </v-list-item-action>
> <v-list-item-content>
<template v-slot:activator> <v-list-item-title>
<v-list-item-title>Admin</v-list-item-title> My courses
</template> </v-list-item-title>
</v-list-item-content>
</v-list-item>
<v-list-item <v-list-item :to="{ name: 'MySessions' }">
:to="'/main/admin/user_list.php'"> <v-list-item-action>
<v-list-item-action> <v-icon>mdi-book-multiple</v-icon>
<v-icon>mdi-account</v-icon> </v-list-item-action>
</v-list-item-action> <v-list-item-content>
<v-list-item-content> <v-list-item-title>
<v-list-item-title>User list My sessions
</v-list-item-title> </v-list-item-title>
</v-list-item-content> </v-list-item-content>
</v-list-item> </v-list-item>
<v-list-item <v-list-group
:to="'/main/admin/course_list.php'"> v-if="isAdmin"
<v-list-item-action> prepend-icon="mdi-plus"
<v-icon>mdi-book</v-icon> value="true"
</v-list-item-action> >
<v-list-item-content> <template v-slot:activator>
<v-list-item-title>Courses <v-list-item-title>Admin</v-list-item-title>
</v-list-item-title> </template>
</v-list-item-content>
</v-list-item>
<v-list-item
:to="'/main/session/session_list.php'">
<v-list-item-action>
<v-icon>mdi-book-multiple</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>Sessions
</v-list-item-title>
</v-list-item-content>
</v-list-item>
<v-list-item <v-list-item
:to="'/main/admin/index.php'" :to="'/main/admin/user_list.php'"
> >
<v-list-item-action> <v-list-item-action>
<v-icon>mdi-settings</v-icon> <v-icon>mdi-account</v-icon>
</v-list-item-action> </v-list-item-action>
<v-list-item-content> <v-list-item-content>
<v-list-item-title>Settings <v-list-item-title>
</v-list-item-title> User list
</v-list-item-content> </v-list-item-title>
</v-list-item> </v-list-item-content>
</v-list-item>
<v-list-item
:to="'/main/admin/course_list.php'"
>
<v-list-item-action>
<v-icon>mdi-book</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
Courses
</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- <v-list-group--> <v-list-item
<!-- no-action--> :to="'/main/session/session_list.php'"
<!-- sub-group--> >
<!-- value="true"--> <v-list-item-action>
<!-- >--> <v-icon>mdi-book-multiple</v-icon>
<!-- <template v-slot:activator>--> </v-list-item-action>
<!-- <v-list-item-content>--> <v-list-item-content>
<!-- <v-list-item-title>Courses</v-list-item-title>--> <v-list-item-title>
<!-- </v-list-item-content>--> Sessions
<!-- </template>--> </v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- <v-list-item--> <v-list-item
<!-- :to="{ name: admin[2] }"--> :to="'/main/admin/index.php'"
<!-- v-for="(admin, i) in courses"--> >
<!-- :key="i"--> <v-list-item-action>
<!-- link--> <v-icon>mdi-settings</v-icon>
<!-- >--> </v-list-item-action>
<!-- <v-list-item-title>--> <v-list-item-content>
<!-- {{ admin[0] }}--> <v-list-item-title>
<!-- </v-list-item-title>--> Settings
<!-- <v-list-item-icon>--> </v-list-item-title>
<!-- <v-icon v-text="admin[1]"></v-icon>--> </v-list-item-content>
<!-- </v-list-item-icon>--> </v-list-item>
<!-- </v-list-item>-->
<!-- </v-list-group>-->
</v-list-group>
<!-- <v-list-item-->
<!-- :to="{ name: 'DocumentsList' }"-->
<!-- >-->
<!-- <v-list-item-action >-->
<!-- <v-icon>mdi-comment-quote</v-icon>-->
<!-- </v-list-item-action>-->
<!-- <v-list-item-content >-->
<!-- <v-list-item-title >-->
<!-- Documents-->
<!-- </v-list-item-title>-->
<!-- </v-list-item-content>-->
<!-- </v-list-item>-->
</v-list>
<v-list v-if="!isAuthenticated"> <!-- <v-list-group-->
<v-list-item :to="{ name: 'Index' }"> <!-- no-action-->
<v-list-item-action> <!-- sub-group-->
<v-icon>mdi-home</v-icon> <!-- value="true"-->
</v-list-item-action> <!-- >-->
<v-list-item-content> <!-- <template v-slot:activator>-->
<v-list-item-title> <!-- <v-list-item-content>-->
Home <!-- <v-list-item-title>Courses</v-list-item-title>-->
</v-list-item-title> <!-- </v-list-item-content>-->
</v-list-item-content> <!-- </template>-->
</v-list-item>
</v-list>
</v-navigation-drawer>
<!-- <v-navigation-drawer--> <!-- <v-list-item-->
<!-- v-model="drawerRight"--> <!-- :to="{ name: admin[2] }"-->
<!-- app--> <!-- v-for="(admin, i) in courses"-->
<!-- clipped--> <!-- :key="i"-->
<!-- right--> <!-- link-->
<!-- >--> <!-- >-->
<!-- <v-list dense>--> <!-- <v-list-item-title>-->
<!-- <v-list-item @click.stop="right = !right">--> <!-- {{ admin[0] }}-->
<!-- <v-list-item-action>--> <!-- </v-list-item-title>-->
<!-- <v-icon>mdi-exit-to-app</v-icon>--> <!-- <v-list-item-icon>-->
<!-- <v-icon v-text="admin[1]"></v-icon>-->
<!-- </v-list-item-icon>-->
<!-- </v-list-item>-->
<!-- </v-list-group>-->
</v-list-group>
<!-- <v-list-item-->
<!-- :to="{ name: 'DocumentsList' }"-->
<!-- >-->
<!-- <v-list-item-action >-->
<!-- <v-icon>mdi-comment-quote</v-icon>-->
<!-- </v-list-item-action>--> <!-- </v-list-item-action>-->
<!-- <v-list-item-content>--> <!-- <v-list-item-content >-->
<!-- <v-list-item-title>Open Temporary Drawer</v-list-item-title>--> <!-- <v-list-item-title >-->
<!-- Documents-->
<!-- </v-list-item-title>-->
<!-- </v-list-item-content>--> <!-- </v-list-item-content>-->
<!-- </v-list-item>--> <!-- </v-list-item>-->
<!-- </v-list>--> </v-list>
<!-- </v-navigation-drawer>-->
<!-- <v-app-bar app color="indigo" dark>--> <v-list v-if="!isAuthenticated">
<!-- <v-app-bar-nav-icon @click.stop="drawer = !drawer"></v-app-bar-nav-icon>--> <v-list-item :to="{ name: 'Index' }">
<!-- <v-toolbar-title>Chamilo</v-toolbar-title>--> <v-list-item-action>
<!-- </v-app-bar>--> <v-icon>mdi-home</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
Home
</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
</v-navigation-drawer>
<v-app-bar <!-- <v-navigation-drawer-->
:clipped-left="$vuetify.breakpoint.lgAndUp" <!-- v-model="drawerRight"-->
app <!-- app-->
color="white" <!-- clipped-->
> <!-- right-->
<v-app-bar-nav-icon @click.stop="drawer = !drawer"></v-app-bar-nav-icon> <!-- >-->
<!-- <v-list dense>-->
<!-- <v-list-item @click.stop="right = !right">-->
<!-- <v-list-item-action>-->
<!-- <v-icon>mdi-exit-to-app</v-icon>-->
<!-- </v-list-item-action>-->
<!-- <v-list-item-content>-->
<!-- <v-list-item-title>Open Temporary Drawer</v-list-item-title>-->
<!-- </v-list-item-content>-->
<!-- </v-list-item>-->
<!-- </v-list>-->
<!-- </v-navigation-drawer>-->
<!-- <v-app-bar app color="indigo" dark>-->
<!-- <v-app-bar-nav-icon @click.stop="drawer = !drawer"></v-app-bar-nav-icon>-->
<!-- <v-toolbar-title>Chamilo</v-toolbar-title>-->
<!-- </v-app-bar>-->
<v-toolbar-title <v-app-bar
style="width: 160px" :clipped-left="$vuetify.breakpoint.lgAndUp"
class="ml-0 pl-0" app
> color="white"
<v-img >
class="mx-2" <v-app-bar-nav-icon @click.stop="drawer = !drawer" />
src="/build/css/themes/chamilo/images/header-logo.png"
max-height="50"
contain
></v-img>
</v-toolbar-title> <v-toolbar-title
<v-spacer></v-spacer> style="width: 160px"
class="ml-0 pl-0"
>
<v-img
class="mx-2"
src="/build/css/themes/chamilo/images/header-logo.png"
max-height="50"
contain
/>
</v-toolbar-title>
<v-spacer />
<v-menu <v-menu
v-if="isAuthenticated" v-if="isAuthenticated"
offset-y offset-y
:nudge-width="200" :nudge-width="200"
> >
<template v-slot:activator="{ on }"> <template v-slot:activator="{ on }">
<v-btn icon v-on="on"> <v-btn
<v-avatar> icon
<v-icon dark>mdi-bell</v-icon> v-on="on"
</v-avatar> >
</v-btn> <v-avatar>
</template> <v-icon dark>
mdi-bell
</v-icon>
</v-avatar>
</v-btn>
</template>
<v-card> <v-card>
<v-card-text> <v-card-text>
<div>Notifications</div> <div>Notifications</div>
</v-card-text> </v-card-text>
<v-list> <v-list>
<v-list-item> <v-list-item>
<v-list-item-title> <v-list-item-title>
Notification 1 Notification 1
</v-list-item-title> </v-list-item-title>
</v-list-item> </v-list-item>
<v-list-item> <v-list-item>
<v-list-item-title> <v-list-item-title>
Notification 2 Notification 2
</v-list-item-title> </v-list-item-title>
</v-list-item> </v-list-item>
</v-list> </v-list>
</v-card> </v-card>
</v-menu> </v-menu>
<v-menu <v-menu
v-if="isAuthenticated" v-if="isAuthenticated"
offset-y offset-y
> >
<template v-slot:activator="{ on }"> <template v-slot:activator="{ on }">
<v-btn icon v-on="on"> <v-btn
<v-avatar> icon
<v-icon dark>mdi-account-circle</v-icon> v-on="on"
</v-avatar> >
</v-btn> <v-avatar>
</template> <v-icon dark>
<v-list> mdi-account-circle
<v-list-item </v-icon>
:to="'/main/social/home.php'"> </v-avatar>
<v-list-item-title>Profile</v-list-item-title> </v-btn>
</v-list-item> </template>
<v-list-item <v-list>
:to="'/main/messages/inbox.php'"> <v-list-item
<v-list-item-title>Inbox</v-list-item-title> :to="'/account/home'"
</v-list-item> >
<v-list-item> <v-list-item-title>Profile</v-list-item-title>
<v-list-item-title> </v-list-item>
<a href="/logout">Logout</a> <v-list-item
</v-list-item-title> :to="'/main/messages/inbox.php'"
</v-list-item> >
</v-list> <v-list-item-title>Inbox</v-list-item-title>
</v-menu> </v-list-item>
<v-list-item>
<v-list-item-title>
<a href="/logout">Logout</a>
</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
<div <div
v-else v-else
offset-y offset-y
> >
<v-btn small color="primary" :to="'/login'"> <v-btn
<v-icon left>mdi-account</v-icon> small
Login color="primary"
</v-btn> :to="'/login'"
>
<v-icon left>
mdi-account
</v-icon>
Login
</v-btn>
<v-btn small color="primary" :to="'/register'"> <v-btn
<v-icon left>mdi-pencil</v-icon> small
Register color="primary"
</v-btn> :to="'/register'"
</div> >
</v-app-bar> <v-icon left>
mdi-pencil
</v-icon>
Register
</v-btn>
</div>
</v-app-bar>
<v-main> <v-main>
<Breadcrumb layout-class="pl-3 py-3"/> <Breadcrumb layout-class="pl-3 py-3" />
<router-view></router-view> <router-view />
<div id="legacy_content" v-html="legacy_content"> <div
</div> id="legacy_content"
</v-main> v-html="legacy_content"
/>
</v-main>
<v-footer color="indigo" app> <v-footer
<span class="white--text">&copy; 2020</span> color="indigo"
</v-footer> app
</v-app> >
<span class="white--text">&copy; 2020</span>
</v-footer>
</v-app>
</template> </template>
<script> <script>

@ -45,7 +45,6 @@ class AccountController extends BaseController
{ {
$user = $this->getUser(); $user = $this->getUser();
//UserManagerInterface $userManager,
if (!is_object($user) || !$user instanceof UserInterface) { if (!is_object($user) || !$user instanceof UserInterface) {
throw $this->createAccessDeniedException('This user does not have access to this section'); throw $this->createAccessDeniedException('This user does not have access to this section');
} }

@ -639,9 +639,6 @@ class User implements UserInterface, EquatableInterface
return $this->username; return $this->username;
} }
/**
* @return $this
*/
public function setResourceNode(ResourceNode $resourceNode): self public function setResourceNode(ResourceNode $resourceNode): self
{ {
$this->resourceNode = $resourceNode; $this->resourceNode = $resourceNode;
@ -2059,10 +2056,12 @@ class User implements UserInterface, EquatableInterface
public function getFirstname() public function getFirstname()
{ {
return $this->firstname;
} }
public function getLastname() public function getLastname()
{ {
return $this->lastname;
} }
public function eraseCredentials() public function eraseCredentials()

@ -14,7 +14,7 @@ use Chamilo\CoreBundle\Entity\ResourceNode;
use Chamilo\CoreBundle\Entity\Session; use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Form\Resource\IllustrationType; use Chamilo\CoreBundle\Form\Resource\IllustrationType;
use Chamilo\CourseBundle\Entity\CGroupInfo; use Chamilo\CourseBundle\Entity\CGroup;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\HttpFoundation\File\UploadedFile;
@ -24,7 +24,7 @@ use Symfony\Component\HttpFoundation\File\UploadedFile;
*/ */
final class IllustrationRepository extends ResourceRepository implements GridInterface, UploadInterface final class IllustrationRepository extends ResourceRepository implements GridInterface, UploadInterface
{ {
public function getResources(User $user, ResourceNode $parentNode, Course $course = null, Session $session = null, CGroupInfo $group = null): QueryBuilder public function getResources(User $user, ResourceNode $parentNode, Course $course = null, Session $session = null, CGroup $group = null): QueryBuilder
{ {
$repo = $this->getRepository(); $repo = $this->getRepository();
$className = $repo->getClassName(); $className = $repo->getClassName();
@ -98,13 +98,12 @@ final class IllustrationRepository extends ResourceRepository implements GridInt
if (null === $illustrationNode) { if (null === $illustrationNode) {
$illustration = new Illustration(); $illustration = new Illustration();
$illustration->setParentResourceNode($user->getResourceNode()->getId());
$em->persist($illustration); $em->persist($illustration);
$this->createNodeForResource($illustration, $user, $user->getResourceNode());
} else { } else {
$illustration = $this->repository->findOneBy(['resourceNode' => $illustrationNode]); $illustration = $this->repository->findOneBy(['resourceNode' => $illustrationNode]);
} }
//$this->addResourceToEveryone($illustrationNode);
$file = $this->addFile($illustration, $uploadFile); $file = $this->addFile($illustration, $uploadFile);
$em->flush(); $em->flush();
@ -116,17 +115,18 @@ final class IllustrationRepository extends ResourceRepository implements GridInt
$nodeRepo = $this->getResourceNodeRepository(); $nodeRepo = $this->getResourceNodeRepository();
$name = $this->getResourceTypeName(); $name = $this->getResourceTypeName();
$qb = $nodeRepo->getEntityManager()->createQueryBuilder() $qb = $nodeRepo->createQueryBuilder('n')
->select('node') ->select('node')
->from(ResourceNode::class, 'node') ->from(ResourceNode::class, 'node')
->innerJoin('node.resourceType', 'type') ->innerJoin('node.resourceType', 'type')
->innerJoin('node.resourceFile', 'file') ->innerJoin('node.resourceFile', 'file')
->where('node.parent = :parent') ->where('node.parent = :parent')
->andWhere('type.name = :name') ->andWhere('type.name = :name')
->setParameters(['parent' => $resourceNode, 'name' => $name]) ->setParameters(['parent' => $resourceNode->getId(), 'name' => $name])
->setMaxResults(1)
; ;
return $qb->getQuery()->getFirstResult(); return $qb->getQuery()->getOneOrNullResult();
} }
public function deleteIllustration(AbstractResource $resource) public function deleteIllustration(AbstractResource $resource)
@ -147,9 +147,9 @@ final class IllustrationRepository extends ResourceRepository implements GridInt
return $this->getIllustrationUrlFromNode($resource->getResourceNode(), $filter); return $this->getIllustrationUrlFromNode($resource->getResourceNode(), $filter);
} }
public function getIllustrationUrlFromNode(ResourceNode $resourceNode, string $filter = ''): string public function getIllustrationUrlFromNode(ResourceNode $node, string $filter = ''): string
{ {
$node = $this->getIllustrationNodeFromParent($resourceNode); $node = $this->getIllustrationNodeFromParent($node);
if (null !== $node) { if (null !== $node) {
$params = [ $params = [

@ -3,10 +3,9 @@
{% block content %} {% block content %}
{% autoescape false %} {% autoescape false %}
<h2>{{ 'Profile' | trans }}</h2> <h2>{{ 'Profile' | trans }}</h2>
<h3>{{ user.username }} {{ user.firstname }} {{ user.lastname }}</h3> <h3> {{ user.firstname }} {{ user.lastname }} ({{ user.username }})</h3>
<img src="{{ app.user.resourceNode | user_illustration }}?w=300&h=300&fit=crop"> <img src="{{ app.user.resourceNode | user_illustration }}?w=300&h=300&fit=crop">
<br /> <br />
<a href="{{ url('chamilo_core_account_edit') }}" class="btn btn-primary"> <a href="{{ url('chamilo_core_account_edit') }}" class="btn btn-primary">

@ -4,6 +4,7 @@
namespace Chamilo\CoreBundle\Twig\Extension; namespace Chamilo\CoreBundle\Twig\Extension;
use Chamilo\CoreBundle\Entity\ResourceNode;
use Chamilo\CoreBundle\Repository\IllustrationRepository; use Chamilo\CoreBundle\Repository\IllustrationRepository;
use Twig\Extension\AbstractExtension; use Twig\Extension\AbstractExtension;
use Twig\TwigFilter; use Twig\TwigFilter;
@ -47,12 +48,12 @@ class ChamiloExtension extends AbstractExtension
return []; return [];
} }
public function getIllustration($node): string public function getIllustration(ResourceNode $node): string
{ {
return $this->illustrationRepository->getIllustrationUrlFromNode($node); return $this->illustrationRepository->getIllustrationUrlFromNode($node);
} }
public function getUserIllustration($node): string public function getUserIllustration(ResourceNode $node): string
{ {
$url = $this->getIllustration($node); $url = $this->getIllustration($node);

Loading…
Cancel
Save