Proyectos de Subversion Moodle

Rev

Rev 1 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 1 Rev 1441
Línea 29... Línea 29...
29
/* Include required award criteria library. */
29
/* Include required award criteria library. */
30
require_once($CFG->dirroot . '/badges/criteria/award_criteria.php');
30
require_once($CFG->dirroot . '/badges/criteria/award_criteria.php');
Línea 31... Línea 31...
31
 
31
 
32
/* Include required user badge exporter */
32
/* Include required user badge exporter */
-
 
33
use core_badges\external\user_badge_exporter;
-
 
34
/* Include required badge class exporter */
Línea 33... Línea 35...
33
use core_badges\external\user_badge_exporter;
35
use core_badges\external\badgeclass_exporter;
34
 
36
 
35
/*
37
/*
36
 * Number of records per page.
38
 * Number of records per page.
Línea 100... Línea 102...
100
 * URL of backpack. Custom ones can be added.
102
 * URL of backpack. Custom ones can be added.
101
 */
103
 */
102
define('BADGRIO_BACKPACKAPIURL', 'https://api.badgr.io/v2');
104
define('BADGRIO_BACKPACKAPIURL', 'https://api.badgr.io/v2');
103
define('BADGRIO_BACKPACKWEBURL', 'https://badgr.io');
105
define('BADGRIO_BACKPACKWEBURL', 'https://badgr.io');
Línea 104... Línea 106...
104
 
106
 
105
/*
107
/**
-
 
108
 * @deprecated since Moodle 4.5.
106
 * @deprecated since 3.9 (MDL-66357).
109
 * @todo Final deprecation in Moodle 6.0. See MDL-82332.
107
 */
-
 
108
define('BADGE_BACKPACKAPIURL', 'https://backpack.openbadges.org');
110
 */
Línea 109... Línea 111...
109
define('BADGE_BACKPACKWEBURL', 'https://backpack.openbadges.org');
111
define('OPEN_BADGES_V1', 1);
110
 
112
 
111
/*
113
/*
112
 * Open Badges specifications.
-
 
113
 */
114
 * Open Badges specifications.
114
define('OPEN_BADGES_V1', 1);
115
 */
Línea 115... Línea 116...
115
define('OPEN_BADGES_V2', 2);
116
define('OPEN_BADGES_V2', 2);
116
define('OPEN_BADGES_V2P1', 2.1);
117
define('OPEN_BADGES_V2P1', 2.1);
Línea 121... Línea 122...
121
define('OPEN_BADGES_V2_CONTEXT', 'https://w3id.org/openbadges/v2');
122
define('OPEN_BADGES_V2_CONTEXT', 'https://w3id.org/openbadges/v2');
122
define('OPEN_BADGES_V2_TYPE_ASSERTION', 'Assertion');
123
define('OPEN_BADGES_V2_TYPE_ASSERTION', 'Assertion');
123
define('OPEN_BADGES_V2_TYPE_BADGE', 'BadgeClass');
124
define('OPEN_BADGES_V2_TYPE_BADGE', 'BadgeClass');
124
define('OPEN_BADGES_V2_TYPE_ISSUER', 'Issuer');
125
define('OPEN_BADGES_V2_TYPE_ISSUER', 'Issuer');
125
define('OPEN_BADGES_V2_TYPE_ENDORSEMENT', 'Endorsement');
126
define('OPEN_BADGES_V2_TYPE_ENDORSEMENT', 'Endorsement');
126
define('OPEN_BADGES_V2_TYPE_AUTHOR', 'Author');
-
 
Línea 127... Línea 127...
127
 
127
 
128
define('BACKPACK_MOVE_UP', -1);
128
define('BACKPACK_MOVE_UP', -1);
Línea 129... Línea 129...
129
define('BACKPACK_MOVE_DOWN', 1);
129
define('BACKPACK_MOVE_DOWN', 1);
130
 
130
 
Línea -... Línea 131...
-
 
131
// Global badge class has been moved to the component namespace.
-
 
132
class_alias('\core_badges\badge', 'badge');
131
// Global badge class has been moved to the component namespace.
133
 
132
class_alias('\core_badges\badge', 'badge');
134
use core_badges\png_metadata_handler;
133
 
135
 
134
/**
136
/**
135
 * Sends notifications to users about awarded badges.
137
 * Sends notifications to users about awarded badges.
Línea 420... Línea 422...
420
 * @param stdClass $badge
422
 * @param stdClass $badge
421
 * @param stdClass $user
423
 * @param stdClass $user
422
 * @return object
424
 * @return object
423
 */
425
 */
424
function badges_prepare_badge_for_external(stdClass $badge, stdClass $user): object {
426
function badges_prepare_badge_for_external(stdClass $badge, stdClass $user): object {
425
    global $PAGE, $USER;
427
    global $PAGE, $SITE, $USER;
426
    if ($badge->type == BADGE_TYPE_SITE) {
428
    if ($badge->type == BADGE_TYPE_SITE) {
427
        $context = context_system::instance();
429
        $context = context_system::instance();
428
    } else {
430
    } else {
429
        $context = context_course::instance($badge->courseid);
431
        $context = context_course::instance($badge->courseid);
430
    }
432
    }
Línea 442... Línea 444...
442
            'uniquehash'    => $badge->uniquehash,
444
            'uniquehash'    => $badge->uniquehash,
443
            'dateissued'    => $badge->dateissued,
445
            'dateissued'    => $badge->dateissued,
444
            'dateexpire'    => $badge->dateexpire,
446
            'dateexpire'    => $badge->dateexpire,
445
            'version'       => $badge->version,
447
            'version'       => $badge->version,
446
            'language'      => $badge->language,
448
            'language'      => $badge->language,
447
            'imageauthorname'  => $badge->imageauthorname,
-
 
448
            'imageauthoremail' => $badge->imageauthoremail,
-
 
449
            'imageauthorurl'   => $badge->imageauthorurl,
-
 
450
            'imagecaption'     => $badge->imagecaption,
449
            'imagecaption'     => $badge->imagecaption,
451
        ];
450
        ];
452
    }
451
    }
Línea -... Línea 452...
-
 
452
 
-
 
453
    // Course.
-
 
454
    if ($badge->type == BADGE_TYPE_COURSE) {
-
 
455
        $course = get_course($context->instanceid);
-
 
456
        $badge->coursefullname = \core_external\util::format_string($course->fullname, $context);
-
 
457
    }
-
 
458
 
-
 
459
    // Recipient (the badge was awarded to this person).
-
 
460
    $badge->recipientid = $user->id;
-
 
461
    if ($user->deleted) {
-
 
462
        $strdata = new stdClass();
-
 
463
        $strdata->user = fullname($user);
-
 
464
        $strdata->site = format_string($SITE->fullname, true, ['context' => context_system::instance()]);
-
 
465
        $badge->recipientfullname = get_string('error:userdeleted', 'badges', $strdata);
-
 
466
    } else {
-
 
467
        $badge->recipientfullname = fullname($user);
-
 
468
    }
453
 
469
 
454
    // Create a badge instance to be able to get the endorsement and other info.
470
    // Create a badge instance to be able to get the endorsement and other info.
455
    $badgeinstance = new badge($badge->id);
471
    $badgeinstance = new badge($badge->id);
456
    $endorsement   = $badgeinstance->get_endorsement();
-
 
457
    $alignments    = $badgeinstance->get_alignments();
472
    $endorsement   = $badgeinstance->get_endorsement();
-
 
473
    $relatedbadges = $badgeinstance->get_related_badges();
-
 
474
    $alignments    = [];
-
 
475
    foreach ($badgeinstance->get_alignments() as $alignment) {
-
 
476
        $alignmentobj = (object) [
-
 
477
            'id' => $alignment->id,
-
 
478
            'badgeid' => $alignment->badgeid,
-
 
479
            'targetName' => $alignment->targetname,
-
 
480
            'targetUrl' => $alignment->targeturl,
-
 
481
        ];
-
 
482
        // Include only the properties visible by the user.
-
 
483
        if ($canconfiguredetails) {
-
 
484
            $alignmentobj->targetDescription = $alignment->targetdescription;
-
 
485
            $alignmentobj->targetFramework = $alignment->targetframework;
-
 
486
            $alignmentobj->targetCode = $alignment->targetcode;
-
 
487
        }
-
 
488
        $alignments[] = $alignmentobj;
Línea 458... Línea 489...
458
    $relatedbadges = $badgeinstance->get_related_badges();
489
    }
459
 
490
 
460
    if (!$canconfiguredetails) {
-
 
461
        // Return only the properties visible by the user.
-
 
462
        if (!empty($alignments)) {
-
 
463
            foreach ($alignments as $alignment) {
-
 
464
                unset($alignment->targetdescription);
-
 
465
                unset($alignment->targetframework);
-
 
466
                unset($alignment->targetcode);
-
 
467
            }
-
 
468
        }
491
    if (!$canconfiguredetails) {
469
 
492
        // Return only the properties visible by the user.
470
        if (!empty($relatedbadges)) {
493
        if (!empty($relatedbadges)) {
471
            foreach ($relatedbadges as $relatedbadge) {
494
            foreach ($relatedbadges as $relatedbadge) {
472
                unset($relatedbadge->version);
495
                unset($relatedbadge->version);
Línea 486... Línea 509...
486
    $exporter = new user_badge_exporter($badge, $related);
509
    $exporter = new user_badge_exporter($badge, $related);
487
    return $exporter->export($PAGE->get_renderer('core'));
510
    return $exporter->export($PAGE->get_renderer('core'));
488
}
511
}
Línea 489... Línea 512...
489
 
512
 
-
 
513
/**
-
 
514
 * Prepare badgeclass for external functions.
-
 
515
 * @param core_badges\output\badgeclass $badgeclass
-
 
516
 * @return stdClass
-
 
517
 */
-
 
518
function badges_prepare_badgeclass_for_external(core_badges\output\badgeclass $badgeclass): stdClass {
-
 
519
    global $PAGE;
-
 
520
    $context = $badgeclass->context;
-
 
521
    $canconfiguredetails = has_capability('moodle/badges:configuredetails', $context);
-
 
522
 
-
 
523
    $badgeurl = new \moodle_url('/badges/badgeclass.php', [
-
 
524
        'id' => $badgeclass->badge->id,
-
 
525
    ]);
-
 
526
    $badgeurl = $badgeurl->out(false);
-
 
527
    $file = \moodle_url::make_webservice_pluginfile_url(
-
 
528
        $badgeclass->context->id,
-
 
529
        'badges',
-
 
530
        'badgeimage',
-
 
531
        $badgeclass->badge->id,
-
 
532
        '/',
-
 
533
        'f3'
-
 
534
    );
-
 
535
    $image = $file->out(false);
-
 
536
 
-
 
537
    $badge = (object) [
-
 
538
        'id'            => $badgeurl,
-
 
539
        'name'          => $badgeclass->badge->name,
-
 
540
        'type'          => OPEN_BADGES_V2_TYPE_BADGE,
-
 
541
        'description'   => $badgeclass->badge->description,
-
 
542
        'issuer'        => $badgeclass->badge->issuername,
-
 
543
        'hostedUrl'     => $badgeclass->badge->issuerurl,
-
 
544
        'image'         => $image,
-
 
545
    ];
-
 
546
 
-
 
547
    // Course.
-
 
548
    if ($badgeclass->badge->type == BADGE_TYPE_COURSE) {
-
 
549
        $course = get_course($badgeclass->badge->courseid);
-
 
550
        $badge->coursefullname = \core_external\util::format_string($course->fullname, $context);
-
 
551
        if ($canconfiguredetails) {
-
 
552
            $badge->courseid = $course->id;
-
 
553
        }
-
 
554
    }
-
 
555
 
-
 
556
    // Create a badge instance to be able to get the endorsement and other info.
-
 
557
    $badgeinstance = new badge($badgeclass->badge->id);
-
 
558
    $endorsement   = $badgeinstance->get_endorsement();
-
 
559
    $relatedbadges = $badgeinstance->get_related_badges();
-
 
560
    $alignments = [];
-
 
561
    foreach ($badgeinstance->get_alignments() as $alignment) {
-
 
562
        $alignmentobj = (object) [
-
 
563
            'id' => $alignment->id,
-
 
564
            'badgeid' => $alignment->badgeid,
-
 
565
            'targetName' => $alignment->targetname,
-
 
566
            'targetUrl' => $alignment->targeturl,
-
 
567
        ];
-
 
568
        // Include only the properties visible by the user.
-
 
569
        if ($canconfiguredetails) {
-
 
570
            $alignmentobj->targetDescription = $alignment->targetdescription;
-
 
571
            $alignmentobj->targetFramework = $alignment->targetframework;
-
 
572
            $alignmentobj->targetCode = $alignment->targetcode;
-
 
573
        }
-
 
574
        $alignments[] = $alignmentobj;
-
 
575
    }
-
 
576
 
-
 
577
    if (!$canconfiguredetails) {
-
 
578
        // Return only the properties visible by the user.
-
 
579
        if (!empty($relatedbadges)) {
-
 
580
            foreach ($relatedbadges as $relatedbadge) {
-
 
581
                unset($relatedbadge->version);
-
 
582
                unset($relatedbadge->language);
-
 
583
                unset($relatedbadge->type);
-
 
584
            }
-
 
585
        }
-
 
586
    }
-
 
587
 
-
 
588
    $related = [
-
 
589
        'context'       => $context,
-
 
590
        'endorsement'   => $endorsement ? $endorsement : null,
-
 
591
        'relatedbadges' => $relatedbadges,
-
 
592
    ];
-
 
593
 
-
 
594
    if (!empty($alignments)) {
-
 
595
        $related['alignment'] = $alignments;
-
 
596
    }
-
 
597
 
-
 
598
    $exporter = new badgeclass_exporter($badge, $related);
-
 
599
    return $exporter->export($PAGE->get_renderer('core', 'badges'));
-
 
600
}
-
 
601
 
490
/**
602
/**
491
 * Extends the course administration navigation with the Badges page
603
 * Extends the course administration navigation with the Badges page
492
 *
604
 *
493
 * @param navigation_node $coursenode
605
 * @param navigation_node $coursenode
494
 * @param object $course
606
 * @param object $course
Línea 515... Línea 627...
515
 
627
 
516
        $coursenode->get('coursebadges')->add(get_string('managebadges', 'badges'), $url,
628
        $coursenode->get('coursebadges')->add(get_string('managebadges', 'badges'), $url,
Línea 517... Línea 629...
517
            navigation_node::TYPE_SETTING, null, 'coursebadges');
629
            navigation_node::TYPE_SETTING, null, 'coursebadges');
518
 
630
 
Línea 519... Línea 631...
519
        if (has_capability('moodle/badges:createbadge', $coursecontext)) {
631
        if (has_capability('moodle/badges:createbadge', $coursecontext)) {
520
            $url = new moodle_url('/badges/newbadge.php', array('type' => BADGE_TYPE_COURSE, 'id' => $course->id));
632
            $url = new moodle_url('/badges/edit.php', ['action' => 'new', 'courseid' => $course->id]);
521
 
633
 
522
            $coursenode->get('coursebadges')->add(get_string('newbadge', 'badges'), $url,
634
            $coursenode->get('coursebadges')->add(get_string('newbadge', 'badges'), $url,
Línea 563... Línea 675...
563
    require_once($CFG->libdir. '/gdlib.php');
675
    require_once($CFG->libdir. '/gdlib.php');
Línea 564... Línea 676...
564
 
676
 
565
    if (!empty($CFG->gdversion)) {
677
    if (!empty($CFG->gdversion)) {
566
        process_new_icon($badge->get_context(), 'badges', 'badgeimage', $badge->id, $iconfile, true);
678
        process_new_icon($badge->get_context(), 'badges', 'badgeimage', $badge->id, $iconfile, true);
567
        @unlink($iconfile);
-
 
568
 
-
 
569
        // Clean up file draft area after badge image has been saved.
-
 
570
        $context = context_user::instance($USER->id, MUST_EXIST);
-
 
571
        $fs = get_file_storage();
-
 
572
        $fs->delete_area_files($context->id, 'user', 'draft');
679
        @unlink($iconfile);
573
    }
680
    }
Línea 574... Línea 681...
574
}
681
}
575
 
682
 
Línea 600... Línea 707...
600
 * @param boolean $pathhash Return file pathhash instead of image url (optional).
707
 * @param boolean $pathhash Return file pathhash instead of image url (optional).
601
 * @return string|moodle_url|null Returns either new file path hash or new file URL
708
 * @return string|moodle_url|null Returns either new file path hash or new file URL
602
 */
709
 */
603
function badges_bake($hash, $badgeid, $userid = 0, $pathhash = false) {
710
function badges_bake($hash, $badgeid, $userid = 0, $pathhash = false) {
604
    global $CFG, $USER;
711
    global $CFG, $USER;
605
    require_once(__DIR__ . '/../badges/lib/bakerlib.php');
-
 
Línea 606... Línea 712...
606
 
712
 
607
    $badge = new badge($badgeid);
713
    $badge = new badge($badgeid);
608
    $badge_context = $badge->get_context();
714
    $badge_context = $badge->get_context();
609
    $userid = ($userid) ? $userid : $USER->id;
715
    $userid = ($userid) ? $userid : $USER->id;
Línea 612... Línea 718...
612
    $fs = get_file_storage();
718
    $fs = get_file_storage();
613
    if (!$fs->file_exists($user_context->id, 'badges', 'userbadge', $badge->id, '/', $hash . '.png')) {
719
    if (!$fs->file_exists($user_context->id, 'badges', 'userbadge', $badge->id, '/', $hash . '.png')) {
614
        if ($file = $fs->get_file($badge_context->id, 'badges', 'badgeimage', $badge->id, '/', 'f3.png')) {
720
        if ($file = $fs->get_file($badge_context->id, 'badges', 'badgeimage', $badge->id, '/', 'f3.png')) {
615
            $contents = $file->get_content();
721
            $contents = $file->get_content();
Línea 616... Línea 722...
616
 
722
 
617
            $filehandler = new PNG_MetaDataHandler($contents);
723
            $filehandler = new png_metadata_handler($contents);
618
            // For now, the site backpack OB version will be used as default.
724
            // For now, the site backpack OB version will be used as default.
619
            $obversion = badges_open_badges_backpack_api();
725
            $obversion = badges_open_badges_backpack_api();
620
            $assertion = new core_badges_assertion($hash, $obversion);
726
            $assertion = new core_badges_assertion($hash, $obversion);
621
            $assertionjson = json_encode($assertion->get_badge_assertion());
727
            $assertionjson = json_encode($assertion->get_badge_assertion());
Línea 1098... Línea 1204...
1098
 *
1204
 *
1099
 * @return array(version)
1205
 * @return array(version)
1100
 */
1206
 */
1101
function badges_get_badge_api_versions() {
1207
function badges_get_badge_api_versions() {
1102
    return [
1208
    return [
1103
        (string)OPEN_BADGES_V1 => get_string('openbadgesv1', 'badges'),
-
 
1104
        (string)OPEN_BADGES_V2 => get_string('openbadgesv2', 'badges'),
1209
        (string)OPEN_BADGES_V2 => get_string('openbadgesv2', 'badges'),
1105
        (string)OPEN_BADGES_V2P1 => get_string('openbadgesv2p1', 'badges')
1210
        (string)OPEN_BADGES_V2P1 => get_string('openbadgesv2p1', 'badges')
1106
    ];
1211
    ];
1107
}
1212
}