Badge/Skill: Update code to v2

pull/3959/head
Julio 4 years ago
parent 6ef08aa39b
commit 00640684d9
  1. 22
      public/main/admin/skill_list.php
  2. 147
      public/main/badge/issued.php
  3. 196
      public/main/badge/issued_all.php
  4. 60
      public/main/inc/lib/SkillModel.php
  5. 1
      public/main/mySpace/myStudents.php
  6. 28
      public/main/template/default/admin/skill_level.html.twig
  7. 32
      public/main/template/default/admin/skill_profile.html.twig
  8. 6
      public/main/template/default/admin/user_information.html.twig
  9. 19
      public/main/template/default/skill/issued.html.twig
  10. 52
      public/main/template/default/skill/issued_all.html.twig
  11. 53
      src/CoreBundle/Entity/SkillRelUserComment.php
  12. 12
      src/CoreBundle/Entity/User.php
  13. 27
      src/CoreBundle/Repository/Node/UserRepository.php

@ -3,11 +3,13 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Skill;
use Chamilo\CoreBundle\Framework\Container;
/**
* Skill list for management.
*
* @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com>
* @author Julio Montoya
*/
$cidReset = true;
@ -24,9 +26,11 @@ $skillId = isset($_GET['id']) ? (int) $_GET['id'] : 0;
$entityManager = Database::getManager();
$skillRepo = Container::getSkillRepository();
switch ($action) {
case 'enable':
$skill = $entityManager->find(Skill::class, $skillId);
$skill = $skillRepo->find($skillId);
if (is_null($skill)) {
Display::addFlash(
@ -60,7 +64,7 @@ switch ($action) {
break;
case 'disable':
/** @var Skill $skill */
$skill = $entityManager->find(Skill::class, $skillId);
$skill = $skillRepo->find($skillId);
if (is_null($skill)) {
Display::addFlash(
@ -84,12 +88,9 @@ switch ($action) {
$children = $skillObj->getChildren($skill->getId());
foreach ($children as $child) {
$skill = $entityManager->find(
Skill::class,
$child['id']
);
$skill = $skillRepo->find($child['id']);
if (empty($skill)) {
if (null === $skill) {
continue;
}
@ -177,13 +178,10 @@ switch ($action) {
$tpl->assign('skills', $skillList);
$tpl->assign('current_tag_id', $extraFieldSearchTagId);
$tpl->assign('tags', $tags);
$templateName = $tpl->get_template('skill/list.tpl');
$templateName = $tpl->get_template('skill/list.html.twig');
$content = $tpl->fetch($templateName);
$tpl->assign(
'actions',
Display::toolbarAction('toolbar', [$toolbar])
);
$tpl->assign('actions', Display::toolbarAction('toolbar', [$toolbar]));
$tpl->assign('content', $content);
$tpl->display_one_col_template();
break;

@ -3,7 +3,6 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Level;
use Chamilo\CoreBundle\Entity\Skill;
use Chamilo\CoreBundle\Entity\SkillRelUser;
use Chamilo\CoreBundle\Entity\SkillRelUserComment;
use Chamilo\CoreBundle\Framework\Container;
@ -25,10 +24,11 @@ if (empty($issue)) {
}
$entityManager = Database::getManager();
/** @var SkillRelUser $skillIssue */
$skillIssue = $entityManager->find(SkillRelUser::class, $issue);
/** @var SkillRelUser $skillRelUser */
$skillRelUser = $entityManager->find(SkillRelUser::class, $issue);
$currentUrl = api_get_self().'?issue='.$issue;
if (null === $skillIssue) {
if (null === $skillRelUser) {
Display::addFlash(
Display::return_message(
get_lang('Skill not found'),
@ -42,8 +42,8 @@ if (null === $skillIssue) {
$skillRepo = Container::getSkillRepository();
$skillLevelRepo = $entityManager->getRepository(Level::class);
$user = $skillIssue->getUser();
$skill = $skillIssue->getSkill();
$user = $skillRelUser->getUser();
$skill = $skillRelUser->getSkill();
if (null === $user || null === $skill) {
Display::addFlash(
@ -73,7 +73,7 @@ $skillInfo = [
ICON_SIZE_BIG,
null,
true
), // SkillModel::getWebIconPath($skill),
),
'courses' => [],
];
@ -88,57 +88,60 @@ $htmlHeadXtra[] = "
<meta property='og:image' content='".$skillInfo['badge_image']."' />
";
$currentUserId = api_get_user_id();
$currentUser = api_get_user_entity($currentUserId);
$allowExport = $currentUser ? $currentUser->getId() === $user->getId() : false;
$allowComment = $currentUser ? SkillModel::userCanAddFeedbackToUser($currentUser, $user) : false;
$currentUser = api_get_user_entity();
$allowExport = false;
$allowComment = false;
if (null !== $currentUser) {
$allowExport = $currentUser->getId() === $user->getId() || api_is_platform_admin();
$allowComment = SkillModel::userCanAddFeedbackToUser($currentUser, $user);
}
$skillIssueDate = api_get_local_time($skillIssue->getAcquiredSkillAt());
$skillRelUserDate = api_get_local_time($skillRelUser->getAcquiredSkillAt());
$currentSkillLevel = get_lang('No level acquired yet');
if ($skillIssue->getAcquiredLevel()) {
$currentSkillLevel = $skillLevelRepo->find(['id' => $skillIssue->getAcquiredLevel()])->getName();
if ($skillRelUser->getAcquiredLevel()) {
$currentSkillLevel = $skillLevelRepo->find(['id' => $skillRelUser->getAcquiredLevel()])->getName();
}
$author = api_get_user_info($skillIssue->getArgumentationAuthorId());
$tempDate = DateTime::createFromFormat('Y-m-d H:i:s', $skillIssueDate);
$author = api_get_user_info($skillRelUser->getArgumentationAuthorId());
$tempDate = DateTime::createFromFormat('Y-m-d H:i:s', $skillRelUserDate);
$linkedinOrganizationId = api_get_configuration_value('linkedin_organization_id');
if ((false === $linkedinOrganizationId)) {
$linkedinOrganizationId = null;
}
$skillIssueInfo = [
'id' => $skillIssue->getId(),
'datetime' => api_format_date($skillIssueDate, DATE_TIME_FORMAT_SHORT),
$skillRelUserInfo = [
'id' => $skillRelUser->getId(),
'datetime' => api_format_date($skillRelUserDate, DATE_TIME_FORMAT_SHORT),
'year' => $tempDate->format('Y'),
'month' => $tempDate->format('m'),
'linkedin_organization_id' => $linkedinOrganizationId,
'acquired_level' => $currentSkillLevel,
'argumentation_author_id' => $skillIssue->getArgumentationAuthorId(),
'argumentation_author_id' => $skillRelUser->getArgumentationAuthorId(),
'argumentation_author_name' => $author['complete_name'],
'argumentation' => $skillIssue->getArgumentation(),
'source_name' => $skillIssue->getSourceName(),
'user_id' => $skillIssue->getUser()->getId(),
'user_complete_name' => UserManager::formatUserFullName($skillIssue->getUser()),
'skill_id' => $skillIssue->getSkill()->getId(),
'skill_badge_image' => SkillModel::getWebIconPath($skillIssue->getSkill()),
'skill_name' => $skillIssue->getSkill()->getName(),
'skill_short_code' => $skillIssue->getSkill()->getShortCode(),
'skill_description' => $skillIssue->getSkill()->getDescription(),
'skill_criteria' => $skillIssue->getSkill()->getCriteria(),
'badge_assertion' => SkillRelUserModel::getAssertionUrl($skillIssue),
'argumentation' => $skillRelUser->getArgumentation(),
'source_name' => $skillRelUser->getSourceName(),
'user_id' => $skillRelUser->getUser()->getId(),
'user_complete_name' => UserManager::formatUserFullName($skillRelUser->getUser()),
'skill_id' => $skillRelUser->getSkill()->getId(),
'skill_badge_image' => SkillModel::getWebIconPath($skillRelUser->getSkill()),
'skill_name' => $skillRelUser->getSkill()->getName(),
'skill_short_code' => $skillRelUser->getSkill()->getShortCode(),
'skill_description' => $skillRelUser->getSkill()->getDescription(),
'skill_criteria' => $skillRelUser->getSkill()->getCriteria(),
'badge_assertion' => SkillRelUserModel::getAssertionUrl($skillRelUser),
'comments' => [],
'feedback_average' => $skillIssue->getAverage(),
'feedback_average' => $skillRelUser->getAverage(),
];
$skillIssueComments = $skillIssue->getComments(true);
$skillRelUserComments = $skillRelUser->getComments(true);
$userId = $skillIssueInfo['user_id'];
$skillId = $skillIssueInfo['skill_id'];
$userId = $skillRelUserInfo['user_id'];
$skillId = $skillRelUserInfo['skill_id'];
/** @var SkillRelUserComment $comment */
foreach ($skillIssueComments as $comment) {
foreach ($skillRelUserComments as $comment) {
$commentDate = api_get_local_time($comment->getFeedbackDateTime());
$skillIssueInfo['comments'][] = [
$skillRelUserInfo['comments'][] = [
'text' => $comment->getFeedbackText(),
'value' => $comment->getFeedbackValue(),
'giver_complete_name' => UserManager::formatUserFullName($comment->getFeedbackGiver()),
@ -195,20 +198,20 @@ $allowToEdit = SkillModel::isAllowed($user->getId(), false);
if ($showLevels && $allowToEdit) {
$formAcquiredLevel = new FormValidator('acquired_level');
$formAcquiredLevel->addSelect('acquired_level', get_lang('Level acquired'), $acquiredLevel);
$formAcquiredLevel->addHidden('user', (string) $skillIssue->getUser()->getId());
$formAcquiredLevel->addHidden('issue', (string) $skillIssue->getId());
$formAcquiredLevel->addHidden('user', (string) $skillRelUser->getUser()->getId());
$formAcquiredLevel->addHidden('issue', (string) $skillRelUser->getId());
$formAcquiredLevel->addButtonSave(get_lang('Save'));
if ($formAcquiredLevel->validate() && $allowComment) {
$values = $formAcquiredLevel->exportValues();
$level = $skillLevelRepo->find($values['acquired_level']);
$skillIssue->setAcquiredLevel($level);
$skillRelUser->setAcquiredLevel($level);
$entityManager->persist($skillIssue);
$entityManager->persist($skillRelUser);
$entityManager->flush();
Display::addFlash(Display::return_message(get_lang('Saved')));
header('Location: '.SkillRelUserModel::getIssueUrl($skillIssue));
header('Location: '.SkillRelUserModel::getIssueUrl($skillRelUser));
exit;
}
}
@ -225,8 +228,8 @@ $form->addSelect(
],
['-', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
);
$form->addHidden('user', (string) $skillIssue->getUser()->getId());
$form->addHidden('issue', (string) $skillIssue->getId());
$form->addHidden('user', (string) $skillRelUser->getUser()->getId());
$form->addHidden('issue', (string) $skillRelUser->getId());
$form->addButtonSend(get_lang('Send message'));
if ($form->validate() && $allowComment && $allowToEdit) {
@ -237,69 +240,28 @@ if ($form->validate() && $allowComment && $allowToEdit) {
->setFeedbackGiver($currentUser)
->setFeedbackText($values['comment'])
->setFeedbackValue($values['value'] ? $values['value'] : null)
->setSkillRelUser($skillIssue)
->setSkillRelUser($skillRelUser)
;
$entityManager->persist($skillUserComment);
$entityManager->flush();
Display::addFlash(Display::return_message(get_lang('Added')));
header('Location: '.SkillRelUserModel::getIssueUrl($skillIssue));
header('Location: '.SkillRelUserModel::getIssueUrl($skillRelUser));
exit;
}
$badgeInfoError = '';
$personalBadge = '';
$allowExport = true;
if ($allowExport) {
$backpack = 'https://backpack.openbadges.org/';
$configBackpack = api_get_setting('openbadges_backpack');
if (0 !== strcmp($backpack, $configBackpack)) {
$backpack = $configBackpack;
if ('/' !== substr($backpack, -1)) {
$backpack .= '/';
}
}
$htmlHeadXtra[] = '<script src="'.$backpack.'issuer.js"></script>';
if ($skill->hasAsset()) {
$assetRepo = Container::getAssetRepository();
$unbakedBadge = $assetRepo->getAssetContent($skill->getAsset());
} else {
$unbakedBadge = api_get_path(SYS_PUBLIC_PATH).'img/icons/128/badges-default.png';
$unbakedBadge = file_get_contents($unbakedBadge);
}
$badgeInfoError = false;
$personalBadge = '';
$png = new PNGImageBaker($unbakedBadge);
if ($png->checkChunks("tEXt", "openbadges")) {
$bakedInfo = $png->addChunk('tEXt', 'openbadges', $skillIssueInfo['badge_assertion']);
$skillRelUserId = $skillIssueInfo['id'];
$verifyBakedBadge = $png->extractBadgeInfo($bakedInfo);
if (!is_array($verifyBakedBadge)) {
$badgeInfoError = true;
}
if (!$badgeInfoError) {
$personalBadge = api_get_self().'?issue='.$issue.'&export=1';
if ($export) {
header('Content-type: image/png');
echo $bakedInfo;
exit;
}
}
SkillModel::setBackPackJs($htmlHeadXtra);
$personalBadge = api_get_self().'?issue='.$issue.'&export=1';
if ($export) {
SkillModel::exportBadge($skill, $skillRelUser, $currentUrl);
}
}
$template = new Template(get_lang('Issued badge information'));
$template->assign('issue_info', $skillIssueInfo);
$template->assign('issue_info', $skillRelUserInfo);
$template->assign('allow_comment', $allowComment);
$template->assign('allow_export', $allowExport);
@ -314,7 +276,6 @@ if ($showLevels && $allowToEdit && $formAcquiredLevel) {
$levelForm = $formAcquiredLevel->returnForm();
}
$template->assign('acquired_level_form', $levelForm);
$template->assign('badge_error', $badgeInfoError);
$template->assign('personal_badge', $personalBadge);
$template->assign('show_level', $showLevels);
$content = $template->fetch($template->get_template('skill/issued.tpl'));

@ -2,31 +2,38 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Level;
use Chamilo\CoreBundle\Entity\SkillRelUser;
use Chamilo\CoreBundle\Entity\SkillRelUserComment;
use Chamilo\CoreBundle\Framework\Container;
/**
* Show information about all issued badges with same skill by user.
*
* @author José Loguercio Silva <jose.loguercio@beeznest.com>
* @author Julio Montoya
*/
require_once __DIR__.'/../inc/global.inc.php';
$userId = isset($_GET['user']) ? (int) $_GET['user'] : 0;
$skillId = isset($_GET['skill']) ? (int) $_GET['skill'] : 0;
$export = isset($_REQUEST['export']);
if (!$userId || !$skillId) {
api_not_allowed(true);
}
$currentUrl = api_get_self().'?user='.$userId.'&skill='.$skillId;
SkillModel::isAllowed($userId);
$em = Database::getManager();
$user = api_get_user_entity($userId);
$skill = $em->find(\Chamilo\CoreBundle\Entity\Skill::class, $skillId);
$skillRepo = Container::getSkillRepository();
$skill = $skillRepo->find($skillId);
$currentUserId = api_get_user_id();
if (!$user || !$skill) {
if (null === $user || null === $skill) {
Display::addFlash(
Display::return_message(get_lang('No results found'), 'error')
);
@ -35,75 +42,64 @@ if (!$user || !$skill) {
exit;
}
$skillRepo = $em->getRepository(\Chamilo\CoreBundle\Entity\Skill::class);
$skillUserRepo = $em->getRepository(SkillRelUser::class);
$skillLevelRepo = $em->getRepository(\Chamilo\CoreBundle\Entity\Level::class);
$skillLevelRepo = $em->getRepository(Level::class);
$userSkills = $skillUserRepo->findBy([
'user' => $user,
'skill' => $skill,
]);
$userInfo = [
'id' => $user->getId(),
'complete_name' => UserManager::formatUserFullName($user),
];
$skillInfo = [
'id' => $skill->getId(),
'name' => $skill->getName(),
'short_code' => $skill->getShortCode(),
'description' => $skill->getDescription(),
'criteria' => $skill->getCriteria(),
'badge_image' => SkillModel::getWebIconPath($skill),
'courses' => [],
];
$currentUser = api_get_user_entity();
$allowDownloadExport = false;
$allowComment = false;
if (null !== $currentUser) {
$allowDownloadExport = $currentUser->getId() === $user->getId() || api_is_platform_admin();
$allowComment = SkillModel::userCanAddFeedbackToUser($currentUser, $user);
}
$allUserBadges = [];
/** @var SkillRelUser $skillIssue */
foreach ($userSkills as $index => $skillIssue) {
$currentUser = api_get_user_entity($currentUserId);
$allowDownloadExport = $currentUser ? $currentUser->getId() === $user->getId() : false;
$allowComment = $currentUser ? SkillModel::userCanAddFeedbackToUser($currentUser, $user) : false;
$skillIssueDate = api_get_local_time($skillIssue->getAcquiredSkillAt());
/** @var SkillRelUser $skillRelUser */
foreach ($userSkills as $index => $skillRelUser) {
$skillRelUserDate = api_get_local_time($skillRelUser->getAcquiredSkillAt());
$currentSkillLevel = get_lang('No level acquired yet');
if ($skillIssue->getAcquiredLevel()) {
$currentSkillLevel = $skillLevelRepo->find(['id' => $skillIssue->getAcquiredLevel()])->getName();
if ($skillRelUser->getAcquiredLevel()) {
$currentSkillLevel = $skillLevelRepo->find($skillRelUser->getAcquiredLevel()->getId())->getName();
}
$argumentationAuthor = api_get_user_info($skillIssue->getArgumentationAuthorId());
$argumentationAuthor = api_get_user_info($skillRelUser->getArgumentationAuthorId());
$skillIssueInfo = [
'id' => $skillIssue->getId(),
'datetime' => api_format_date($skillIssueDate, DATE_TIME_FORMAT_SHORT),
$skillRelUserInfo = [
'id' => $skillRelUser->getId(),
'datetime' => api_format_date($skillRelUserDate, DATE_TIME_FORMAT_SHORT),
'acquired_level' => $currentSkillLevel,
'argumentation_author_id' => $skillIssue->getArgumentationAuthorId(),
'argumentation_author_id' => $skillRelUser->getArgumentationAuthorId(),
'argumentation_author_name' => api_get_person_name(
$argumentationAuthor['firstname'],
$argumentationAuthor['lastname']
),
'argumentation' => $skillIssue->getArgumentation(),
'source_name' => $skillIssue->getSourceName(),
'user_id' => $skillIssue->getUser()->getId(),
'user_complete_name' => UserManager::formatUserFullName($skillIssue->getUser()),
'skill_id' => $skillIssue->getSkill()->getId(),
'skill_badge_image' => SkillModel::getWebIconPath($skillIssue->getSkill()),
'skill_name' => $skillIssue->getSkill()->getName(),
'skill_short_code' => $skillIssue->getSkill()->getShortCode(),
'skill_description' => $skillIssue->getSkill()->getDescription(),
'skill_criteria' => $skillIssue->getSkill()->getCriteria(),
'badge_assertion' => SkillRelUserModel::getAssertionUrl($skillIssue),
'argumentation' => $skillRelUser->getArgumentation(),
'source_name' => $skillRelUser->getSourceName(),
'user_id' => $skillRelUser->getUser()->getId(),
'user_complete_name' => UserManager::formatUserFullName($skillRelUser->getUser()),
'skill_id' => $skillRelUser->getSkill()->getId(),
'skill_badge_image' => SkillModel::getWebIconPath($skillRelUser->getSkill()),
'skill_name' => $skillRelUser->getSkill()->getName(),
'skill_short_code' => $skillRelUser->getSkill()->getShortCode(),
'skill_description' => $skillRelUser->getSkill()->getDescription(),
'skill_criteria' => $skillRelUser->getSkill()->getCriteria(),
'badge_assertion' => SkillRelUserModel::getAssertionUrl($skillRelUser),
'comments' => [],
'feedback_average' => $skillIssue->getAverage(),
'feedback_average' => $skillRelUser->getAverage(),
];
$skillIssueComments = $skillIssue->getComments(true);
$userId = $skillRelUserInfo['user_id'];
$skillId = $skillRelUserInfo['skill_id'];
$userId = $skillIssueInfo['user_id'];
$skillId = $skillIssueInfo['skill_id'];
foreach ($skillIssueComments as $comment) {
$skillRelUserComments = $skillRelUser->getComments(true);
foreach ($skillRelUserComments as $comment) {
$commentDate = api_get_local_time($comment->getFeedbackDateTime());
$skillIssueInfo['comments'][] = [
$skillRelUserInfo['comments'][] = [
'text' => $comment->getFeedbackText(),
'value' => $comment->getFeedbackValue(),
'giver_complete_name' => UserManager::formatUserFullName($comment->getFeedbackGiver()),
@ -153,34 +149,25 @@ foreach ($userSkills as $index => $skillIssue) {
}
}
$formAcquiredLevel = new FormValidator(
'acquired_level'.$skillIssue->getId(),
'post',
SkillRelUserModel::getIssueUrlAll($skillIssue)
);
$formAcquiredLevel = new FormValidator('acquired_level'.$skillRelUser->getId(), 'post', $currentUrl);
$formAcquiredLevel->addSelect('acquired_level', get_lang('Level acquired'), $acquiredLevel);
$formAcquiredLevel->addHidden('user', $skillIssue->getUser()->getId());
$formAcquiredLevel->addHidden('issue', $skillIssue->getId());
$formAcquiredLevel->addHidden('user', $skillRelUser->getUser()->getId());
$formAcquiredLevel->addHidden('issue', $skillRelUser->getId());
$formAcquiredLevel->addButtonSend(get_lang('Save'));
if ($formAcquiredLevel->validate() && $allowComment) {
if ($allowComment && $formAcquiredLevel->validate()) {
$values = $formAcquiredLevel->exportValues();
$level = $skillLevelRepo->find($values['acquired_level']);
$skillIssue->setAcquiredLevel($level);
$skillRelUser->setAcquiredLevel($level);
$em->persist($skillIssue);
$em->persist($skillRelUser);
$em->flush();
header('Location: '.SkillRelUserModel::getIssueUrlAll($skillIssue));
exit;
api_location($currentUrl);
}
$form = new FormValidator(
'comment'.$skillIssue->getId(),
'post',
SkillRelUserModel::getIssueUrlAll($skillIssue)
);
$form = new FormValidator('comment'.$skillRelUser->getId(), 'post', $currentUrl);
$form->addTextarea('comment', get_lang('New comment'), ['rows' => 4]);
$form->applyFilter('comment', 'trim');
$form->addRule('comment', get_lang('Required field'), 'required');
@ -194,11 +181,11 @@ foreach ($userSkills as $index => $skillIssue) {
],
['-', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
);
$form->addHidden('user', $skillIssue->getUser()->getId());
$form->addHidden('issue', $skillIssue->getId());
$form->addHidden('user', $skillRelUser->getUser()->getId());
$form->addHidden('issue', $skillRelUser->getId());
$form->addButtonSend(get_lang('Send message'));
if ($form->validate() && $allowComment) {
if ($allowComment && $form->validate()) {
$values = $form->exportValues();
$skillUserComment = new SkillRelUserComment();
@ -206,87 +193,38 @@ foreach ($userSkills as $index => $skillIssue) {
->setFeedbackDateTime(new DateTime())
->setFeedbackGiver($currentUser)
->setFeedbackText($values['comment'])
->setFeedbackValue($values['value'] ? $values['value'] : null)
->setSkillRelUser($skillIssue);
->setFeedbackValue($values['value'] ?: null)
->setSkillRelUser($skillRelUser)
;
$em->persist($skillUserComment);
$em->flush();
header('Location: '.SkillRelUserModel::getIssueUrlAll($skillIssue));
exit;
api_location($currentUrl);
}
$badgeInfoError = '';
$personalBadge = '';
if ($allowDownloadExport) {
$backpack = 'https://backpack.openbadges.org/';
$configBackpack = api_get_setting('openbadges_backpack');
if (0 !== strcmp($backpack, $configBackpack)) {
$backpack = $configBackpack;
if ('/' !== substr($backpack, -1)) {
$backpack .= '/';
}
}
$htmlHeadXtra[] = '<script src="'.$backpack.'issuer.js"></script>';
$objSkill = new SkillModel();
$assertionUrl = $skillIssueInfo['badge_assertion'];
$skills = $objSkill->get($skillId);
$unbakedBadge = api_get_path(SYS_UPLOAD_PATH)."badges/".$skills['icon'];
if (!is_file($unbakedBadge)) {
$unbakedBadge = api_get_path(WEB_CODE_PATH).'img/icons/128/badges-default.png';
}
$unbakedBadge = file_get_contents($unbakedBadge);
$badgeInfoError = false;
$personalBadge = "";
$png = new PNGImageBaker($unbakedBadge);
if ($png->checkChunks("tEXt", "openbadges")) {
$bakedInfo = $png->addChunk("tEXt", "openbadges", $assertionUrl);
$bakedBadge = UserManager::getUserPathById($userId, "system");
$bakedBadge = $bakedBadge.'badges';
if (!file_exists($bakedBadge)) {
mkdir($bakedBadge, api_get_permissions_for_new_directories(), true);
}
$skillRelUserId = $skillIssueInfo['id'];
if (!file_exists($bakedBadge."/badge_".$skillRelUserId)) {
file_put_contents($bakedBadge."/badge_".$skillRelUserId.".png", $bakedInfo);
}
//Process to validate a baked badge
$badgeContent = file_get_contents($bakedBadge."/badge_".$skillRelUserId.".png");
$verifyBakedBadge = $png->extractBadgeInfo($badgeContent);
if (!is_array($verifyBakedBadge)) {
$badgeInfoError = true;
}
if (!$badgeInfoError) {
$personalBadge = UserManager::getUserPathById($userId, "web");
$personalBadge = $personalBadge."badges/badge_".$skillRelUserId.".png";
}
SkillModel::setBackPackJs($htmlHeadXtra);
$personalBadge = $currentUrl.'&export=1';
if ($export) {
SkillModel::exportBadge($skill, $skillRelUser, $currentUrl);
}
}
$allUserBadges[$index]['issue_info'] = $skillIssueInfo;
$allUserBadges[$index]['issue_info'] = $skillRelUserInfo;
$allUserBadges[$index]['allow_comment'] = $allowComment;
$allUserBadges[$index]['allow_download_export'] = $allowDownloadExport;
$allUserBadges[$index]['comment_form'] = $form->returnForm();
$allUserBadges[$index]['acquired_level_form'] = $formAcquiredLevel->returnForm();
$allUserBadges[$index]['badge_error'] = $badgeInfoError;
$allUserBadges[$index]['personal_badge'] = $personalBadge;
}
$template = new Template(get_lang('Issued badge information'));
$template->assign('user_badges', $allUserBadges);
$template->assign('show_level', false == api_get_configuration_value('hide_skill_levels'));
$content = $template->fetch(
$template->get_template('skill/issued_all.tpl')
);
$template->assign('show_level', false === api_get_configuration_value('hide_skill_levels'));
$content = $template->fetch($template->get_template('skill/issued_all.html.twig'));
$template->assign('header', get_lang('Issued badge information'));
$template->assign('content', $content);
$template->display_one_col_template();

@ -13,6 +13,7 @@ use Chamilo\CoreBundle\Entity\SkillRelItemRelUser;
use Chamilo\CoreBundle\Entity\SkillRelSkill;
use Chamilo\CoreBundle\Entity\SkillRelUser;
use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Entity\UserRelUser;
use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CourseBundle\Entity\CAttendance;
use Chamilo\CourseBundle\Entity\CForumThread;
@ -1547,9 +1548,10 @@ class SkillModel extends Model
}
break;
case STUDENT_BOSS:
$studentBosses = $userRepo->getStudentBosses($toUser);
$studentBosses = $toUser->getFriendsByRelationType(UserRelUser::USER_RELATION_TYPE_BOSS);
//$studentBosses = $userRepo->getStudentBosses($toUser);
foreach ($studentBosses as $studentBoss) {
if ($studentBoss->getId() !== $fromUser->getId()) {
if ($studentBoss->getFriend()->getId() !== $fromUser->getId()) {
continue;
}
@ -2372,4 +2374,58 @@ class SkillModel extends Model
return $skillUser;
}
public static function setBackPackJs(&$htmlHeadXtra)
{
$backpack = 'https://backpack.openbadges.org/';
$configBackpack = api_get_setting('openbadges_backpack');
if (0 !== strcmp($backpack, $configBackpack)) {
$backpack = $configBackpack;
if ('/' !== substr($backpack, -1)) {
$backpack .= '/';
}
}
$htmlHeadXtra[] = '<script src="'.$backpack.'issuer.js"></script>';
}
public static function exportBadge(Skill $skill, SkillRelUser $skillRelUser, string $urlToRedirect)
{
if ($skill->hasAsset()) {
$assetRepo = Container::getAssetRepository();
$imageContent = $assetRepo->getAssetContent($skill->getAsset());
} else {
$defaultBadge = api_get_path(SYS_PUBLIC_PATH).'img/icons/128/badges-default.png';
$imageContent = file_get_contents($defaultBadge);
}
$png = new PNGImageBaker($imageContent);
if ($png->checkChunks('tEXt', 'openbadges')) {
$result = $png->addChunk('tEXt', 'openbadges', SkillRelUserModel::getAssertionUrl($skillRelUser));
$verifyBadge = $png->extractBadgeInfo($result);
$error = true;
if (is_array($verifyBadge)) {
$error = false;
}
if (!$error) {
header('Content-type: image/png');
echo $result;
exit;
}
}
Display::addFlash(
Display::return_message(
get_lang(
'There was a problem embedding the badge assertion info into the badge image, but you can still use this page as a valid proof.'
),
'warning'
)
);
api_location($urlToRedirect);
}
}

@ -468,6 +468,7 @@ switch ($action) {
if (!empty($messageId)) {
$messageRepo = Container::getMessageRepository();
$message = $messageRepo->find($messageId);
// Only delete a message I created.
if (null !== $message && $message->getSender()->getId() === $currentUser->getId()) {
Event::addEvent(

@ -1,13 +1,15 @@
{% autoescape false %}
{{ form }}
<table class="data_table">
<tr>
<th>{{ 'Name' | get_lang }}</th>
<th>{{ 'ShortName' | get_lang }}</th>
{% if form is defined %}
{{ form }}
{% endif %}
<th>{{ 'Profile' | get_lang }}</th>
<th>{{ 'Actions' | get_lang }}</th>
<table class="table">
<tr>
<th>{{ 'Name' | trans }}</th>
<th>{{ 'Short name' | trans }}</th>
<th>{{ 'Profile' | trans }}</th>
<th>{{ 'Actions' | trans }}</th>
</tr>
{% for item in list %}
<tr>
@ -15,12 +17,16 @@
<td>{{ item.shortName }}</td>
<td> {{ item.profile }}</td>
<td>
<a href="{{ _p.web_main }}admin/skill_level.php?action=edit&id={{ item.id }}">
<img src="{{ 'edit.png'|icon(22) }}">
<a
href="{{ url('legacy_main', {'name' : 'admin/skill_level.php'}) }}?action=edit&id={{ item.id }}"
>
<img src="{{ 'edit.png'|icon(22) }}" />
</a>
<a href="{{ _p.web_main }}admin/skill_level.php?action=delete&id={{ item.id }}">
<img src="{{ 'delete.png'|icon(22) }}">
<a
href="{{ url('legacy_main', {'name' : 'admin/skill_level.php'}) }}?action=delete&id={{ item.id }}"
>
<img src="{{ 'delete.png'|icon(22) }}" />
</a>
</td>
</tr>

@ -1,15 +1,23 @@
{% autoescape false %}
{{ form }}
{% if form is defined %}
{{ form }}
{% endif %}
{% for item in list %}
<h4>{{ item.name }}
{#<a href="{{ _p.web_main }}admin/skill_level.php?action=add_level&id={{ item.id }}">#}
{#<img src="{{ 'add.png'|icon(22) }}">#}
{#</a>#}
<a href="{{ _p.web_main }}admin/skill_profile.php?action=edit&id={{ item.id }}">
<img src="{{ 'edit.png'|icon(22) }}"> </a>
<a
href="{{ url('legacy_main', {'name' : 'admin/skill_profile.php'}) }}?action=edit&id={{ item.id }}"
>
<img src="{{ 'edit.png'|icon(22) }}">
</a>
<a href="{{ _p.web_main }}admin/skill_profile.php?action=delete&id={{ item.id }}">
<a
href="{{ url('legacy_main', {'name' : 'admin/skill_profile.php'}) }}?action=delete&id={{ item.id }}"
>
<img src="{{ 'delete.png'|icon(22) }}">
</a>
</h4>
@ -18,18 +26,22 @@
<li>
{{ level }}
{% if loop.first %}
<img src="{{ 'up_na.png'|icon(22) }}">
<img src="{{ 'up_na.png'|icon(22) }}" />
{% else %}
<a href="{{ _p.web_main }}admin/skill_profile.php?action=move_up&level_id={{ level.id }}&id={{ item.id }}">
<img src="{{ 'up.png'|icon(22) }}">
<a
href="{{ url('legacy_main', {'name' : 'admin/skill_profile.php'}) }}?action=move_up&level_id={{ level.id }}&id={{ item.id }}"
>
<img src="{{ 'up.png'|icon(22) }}" />
</a>
{% endif %}
{% if loop.last %}
<img src="{{ 'down_na.png'|icon(22) }}">
<img src="{{ 'down_na.png'|icon(22) }}" />
{% else %}
<a href="{{ _p.web_main }}admin/skill_profile.php?action=move_down&level_id={{ level.id }}&id={{ item.id }}">
<img src="{{ 'down.png'|icon(22) }}">
<a
href="{{ url('legacy_main', {'name' : 'admin/skill_profile.php'}) }}?action=move_down&level_id={{ level.id }}&id={{ item.id }}"
>
<img src="{{ 'down.png'|icon(22) }}" />
</a>
{% endif %}
</li>

@ -7,10 +7,10 @@
</div>
<div class="col-md-8">
<div class="list-card">
{{ display.card_widget('FirstLoginInPlatform'|get_lang, params.first_connection, 'calendar') }}
{{ display.card_widget('LatestLoginInPlatform'|get_lang, params.last_connection, 'calendar') }}
{{ display.card_widget('First login in platform'|get_lang, params.first_connection, 'calendar') }}
{{ display.card_widget('Latest login in platform'|get_lang, params.last_connection, 'calendar') }}
{% if params.legal is defined %}
{{ display.card_widget('LegalAccepted'|get_lang, params.legal.datetime, 'gavel', user.legal.icon) }}
{{ display.card_widget('Legal accepted'|get_lang, params.legal.datetime, 'gavel', user.legal.icon) }}
{% endif %}
</div>
{% if social_tool %}

@ -24,12 +24,7 @@
</div>
</div>
{% if badge_error %}
<hr>
<div class="alert alert-danger">
{{ 'There was a problem embedding the badge assertion info into the badge image, but you can still use this page as a valid proof.'|trans }}
</div>
{% elseif not personal_badge is empty %}
{% if not personal_badge is empty %}
<p class="text-center">
<a href="{{ personal_badge }}" class="btn btn-primary" target="_blank" >
<em class="fa fa-download fa-fw"></em> {{ 'Download badges'|trans }}
@ -83,13 +78,11 @@
{{ issue_info.datetime }}
{% endif %}
{% if issue_info.argumentation %}
{% if issue_info.argumentation %}
<strong>
<p style="font-style: italic;">
{{ 'User %s indicated:'|trans|format(issue_info.argumentation_author_name) }}
</p>
</strong>
{% endif %}
<strong>
<p style="font-style: italic;">
{{ 'User %s indicated:'|trans|format(issue_info.argumentation_author_name) }}
</p>
</strong>
<p>{{ issue_info.argumentation }}</p>
{% endif %}
</li>

@ -1,11 +1,14 @@
{% import '@ChamiloCore/Macros/box.html.twig' as display %}
{% for badge in user_badges %}
<div class="row issued">
<div class="col-md-5">
<div class="thumbnail">
<figure class="text-center">
<img class="img-fluid center-block"
src="{{ badge.issue_info.skill_badge_image }}"
alt="{{ badge.issue_info.skill_name }}">
src="{{ badge.issue_info.skill_badge_image }}?w=120"
alt="{{ badge.issue_info.skill_name }}"
/>
<figcaption>
<p class="lead">{{ badge.issue_info.skill_name }}</p>
{% if badge.issue_info.skill_short_code %}
@ -24,18 +27,11 @@
</div>
</div>
{% if badge.allow_download_export %}
{% if badge.badge_error %}
<hr>
<div class="alert alert-danger">
{{ 'There was a problem embedding the badge assertion info into the badge image, but you can still use this page as a valid proof.'|trans }}
</div>
{% else %}
<p class="text-center">
<a href="{{ badge.personal_badge }}" class="btn btn-primary" target="_new" download="badge">
<em class="fa fa-download fa-fw"></em> {{ 'Download badges'|trans }}
</a>
</p>
{% endif %}
<p class="text-center">
<a href="{{ badge.personal_badge }}" class="btn btn-primary">
<em class="fa fa-download fa-fw"></em> {{ 'Download badges'|trans }}
</a>
</p>
<hr>
<p class="text-center">
<a href="#" class="btn btn-success" id="badge-export-button-{{ badge.issue_info.id }}">
@ -45,11 +41,14 @@
{% if "display.hide_social_media_links" | api_get_setting == 'false' %}
<div class='col-md-12 text-center'>
<h5><b> {{ 'Share with your friends' | trans }} </b></h5>
<a href="http://www.facebook.com/sharer.php?u={{ _p.web }}badge/{{ badge.issue_info.id }}" target="_new">
<a
href="http://www.facebook.com/sharer.php?u={{ url('index') }}badge/{{ badge.issue_info.id }}"
target="_new"
>
<em class='fa fa-facebook-square fa-3x text-info' aria-hidden='true'></em>
</a>
<a
href="https://twitter.com/home?status={{ 'I have achieved skill %s on %s' | trans |format(skill_info.name, _s.site_name)}} - {{ _p.web }}badge/{{ badge.issue_info.id }}"
href="https://twitter.com/home?status={{ 'I have achieved skill %s on %s' | trans |format(badge.issue_info.skill_name, chamilo_settings_get('platform.site_name'))}} - {{ url('index')}}badge/{{ badge.issue_info.id }}"
target="_new">
<em class='fa fa-twitter-square fa-3x text-light' aria-hidden='true'></em>
</a>
@ -92,19 +91,10 @@
{% endif %}
{% if badge.allow_comment %}
<hr />
{{ display.panel('Change acquired level'|trans, badge.acquired_level_form) }}
<hr>
<div class="panel panel-info">
<div class="panel-heading">
<em class="fa fa-check-circle-o fa-fw" aria-hidden="true"></em>
{{ 'Change acquired level'|trans }}
</div>
<div class="panel-body">
{% autoescape false %}
{{ badge.acquired_level_form }}
{% endautoescape %}
</div>
</div>
<hr>
<div class="panel panel-info">
<div class="panel-heading">
<em class="fa fa-comment-o fa-fw" aria-hidden="true"></em>
@ -113,13 +103,14 @@
<em class="fa fa-thumbs-o-up fa-fw" aria-hidden="true"></em>
{{ 'Average rating %s'|trans|format(badge.issue_info.feedback_average) }}
</div>
<div class="panel-body">
{% autoescape false %}
{{ badge.comment_form }}
{% endautoescape %}
<hr />
{% for comment in badge.issue_info.comments %}
<article class="media">
<article>
<div class="media-body">
<h4 class="media-heading">{{ comment.giver_complete_name }}</h4>
<p><small>{{ comment.datetime }}</small></p>
@ -129,7 +120,8 @@
<div style="width: 80px;">
{% if comment.value %}
<em class="fa fa-certificate fa-fw" aria-label="{{ 'Average rating' }}"></em>
<span class="sr-only">{{ 'Average rating' }}</span> {{ comment.value }}
<span class="sr-only">{{ 'Average rating' }}</span>
{{ comment.value }}
{% endif %}
</div>
</div>

@ -10,8 +10,6 @@ use DateTime;
use Doctrine\ORM\Mapping as ORM;
/**
* SkillRelUserComment class.
*
* @ORM\Table(
* name="skill_rel_user_comment",
* indexes={
@ -49,7 +47,7 @@ class SkillRelUserComment
/**
* @ORM\Column(name="feedback_value", type="integer", nullable=true, options={"default":1})
*/
protected int $feedbackValue;
protected ?int $feedbackValue;
/**
* @ORM\Column(name="feedback_datetime", type="datetime", nullable=false)
@ -86,22 +84,12 @@ class SkillRelUserComment
return $this->feedbackGiver;
}
/**
* Get feedbackText.
*
* @return string
*/
public function getFeedbackText()
public function getFeedbackText(): string
{
return $this->feedbackText;
}
/**
* Get feedbackValue.
*
* @return int
*/
public function getFeedbackValue()
public function getFeedbackValue(): ?int
{
return $this->feedbackValue;
}
@ -116,60 +104,35 @@ class SkillRelUserComment
return $this->feedbackDateTime;
}
/**
* Set skillRelUser.
*
* @return SkillRelUserComment
*/
public function setSkillRelUser(SkillRelUser $skillRelUser)
public function setSkillRelUser(SkillRelUser $skillRelUser): self
{
$this->skillRelUser = $skillRelUser;
return $this;
}
/**
* Set feedbackGiver.
*
* @return SkillRelUserComment
*/
public function setFeedbackGiver(User $feedbackGiver)
public function setFeedbackGiver(User $feedbackGiver): self
{
$this->feedbackGiver = $feedbackGiver;
return $this;
}
/**
* Set feedbackText.
*
* @return SkillRelUserComment
*/
public function setFeedbackText(string $feedbackText)
public function setFeedbackText(string $feedbackText): self
{
$this->feedbackText = $feedbackText;
return $this;
}
/**
* Set feebackValue.
*
* @return SkillRelUserComment
*/
public function setFeedbackValue(int $feedbackValue)
public function setFeedbackValue(?int $feedbackValue): self
{
$this->feedbackValue = $feedbackValue;
return $this;
}
/**
* Set feedbackDateTime.
*
* @return SkillRelUserComment
*/
public function setFeedbackDateTime(DateTime $feedbackDateTime)
public function setFeedbackDateTime(DateTime $feedbackDateTime): self
{
$this->feedbackDateTime = $feedbackDateTime;

@ -2129,6 +2129,18 @@ class User implements UserInterface, EquatableInterface, ResourceInterface, Reso
return $this->friends;
}
/**
* @param int $relationType Example: UserRelUser::USER_RELATION_TYPE_BOSS
*
* @return UserRelUser[]|Collection
*/
public function getFriendsByRelationType(int $relationType)
{
return $this->friends->filter(function (UserRelUser $userRelUser) use ($relationType) {
return $relationType === $userRelUser->getRelationType();
});
}
/**
* @return UserRelUser[]|Collection
*/

@ -411,33 +411,6 @@ class UserRepository extends ResourceRepository implements PasswordUpgraderInter
return $qb->getQuery()->getResult();
}
/**
* Get the student bosses for a user.
*
* @return array
*/
public function getStudentBosses(User $user)
{
$qb = $this->createQueryBuilder('u');
$qb
->distinct()
->innerJoin(
'ChamiloCoreBundle:UserRelUser',
'uu',
Join::WITH,
'u.id = uu.friendUserId'
)
->where(
$qb->expr()->eq('uu.relationType', UserRelUser::USER_RELATION_TYPE_BOSS)
)
->andWhere(
$qb->expr()->eq('uu.userId', $user->getId())
)
;
return $qb->getQuery()->getResult();
}
/**
* Get number of users in URL.
*

Loading…
Cancel
Save