#207 Follow-up UX improvements

The majority of this change involved moving
the report page logic into the view page for
both browser and mobile.
This commit is contained in:
Mark Nelson 2018-07-01 20:18:09 +08:00
parent 6926280807
commit c395c7dadc
14 changed files with 194 additions and 335 deletions

View file

@ -86,8 +86,8 @@ class restore_customcert_activity_task extends restore_activity_task {
$rules[] = new restore_log_rule('customcert', 'add', 'view.php?id={course_module}', '{customcert}'); $rules[] = new restore_log_rule('customcert', 'add', 'view.php?id={course_module}', '{customcert}');
$rules[] = new restore_log_rule('customcert', 'update', 'view.php?id={course_module}', '{customcert}'); $rules[] = new restore_log_rule('customcert', 'update', 'view.php?id={course_module}', '{customcert}');
$rules[] = new restore_log_rule('customcert', 'view', 'view.php?id={course_module}', '{customcert}'); $rules[] = new restore_log_rule('customcert', 'view', 'view.php?id={course_module}', '{customcert}');
$rules[] = new restore_log_rule('customcert', 'received', 'report.php?a={customcert}', '{customcert}'); $rules[] = new restore_log_rule('customcert', 'received', 'view.php?id={course_module}', '{customcert}');
$rules[] = new restore_log_rule('customcert', 'view report', 'report.php?id={customcert}', '{customcert}'); $rules[] = new restore_log_rule('customcert', 'view report', 'view.php?id={course_module}', '{customcert}');
return $rules; return $rules;
} }

View file

@ -107,7 +107,7 @@ class email_certificate implements \renderable, \templatable {
} else { } else {
$data->emailgreeting = get_string('emailnonstudentgreeting', 'customcert'); $data->emailgreeting = get_string('emailnonstudentgreeting', 'customcert');
$data->emailbody = get_string('emailnonstudentbody', 'customcert', $info); $data->emailbody = get_string('emailnonstudentbody', 'customcert', $info);
$data->emailcertificatelink = new \moodle_url('/mod/customcert/report.php', array('id' => $this->cmid)); $data->emailcertificatelink = new \moodle_url('/mod/customcert/view.php', array('id' => $this->cmid));
$data->emailcertificatetext = get_string('emailnonstudentcertificatelinktext', 'customcert'); $data->emailcertificatetext = get_string('emailnonstudentcertificatelinktext', 'customcert');
} }

View file

@ -46,6 +46,7 @@ class mobile {
$args = (object) $args; $args = (object) $args;
$cmid = $args->cmid; $cmid = $args->cmid;
$groupid = empty($args->group) ? 0 : $args->group; // By default, group 0.
// Capabilities check. // Capabilities check.
$cm = get_coursemodule_from_id('customcert', $cmid); $cm = get_coursemodule_from_id('customcert', $cmid);
@ -77,15 +78,24 @@ class mobile {
} }
$showreport = false; $showreport = false;
$numissues = 0; $groups = [];
$recipients = [];
if (has_capability('mod/customcert:viewreport', $context)) { if (has_capability('mod/customcert:viewreport', $context)) {
// Get the total number of issues.
$showreport = true; $showreport = true;
// Get the groups (if any) to display - also sets active group.
$groups = self::get_groups($cm, $groupid, $USER->id);
$groupmode = groups_get_activity_groupmode($cm); $groupmode = groups_get_activity_groupmode($cm);
if (has_capability('moodle/site:accessallgroups', $context)) { if (has_capability('moodle/site:accessallgroups', $context)) {
$groupmode = 'aag'; $groupmode = 'aag';
} }
$numissues = \mod_customcert\certificate::get_number_of_issues($certificate->id, $cm, $groupmode);
$recipients = \mod_customcert\certificate::get_issues($certificate->id, $groupmode, $cm, 0, 0);
foreach ($recipients as $recipient) {
$recipient->displayname = fullname($recipient);
$recipient->fileurl = new \moodle_url('/mod/customcert/mobile/pluginfile.php', ['certificateid' => $certificate->id,
'userid' => $recipient->id]);
}
} }
$data = [ $data = [
@ -93,11 +103,14 @@ class mobile {
'cmid' => $cm->id, 'cmid' => $cm->id,
'hasissues' => !empty($issues), 'hasissues' => !empty($issues),
'issues' => array_values($issues), 'issues' => array_values($issues),
'showgroups' => !empty($groups),
'groups' => array_values($groups),
'canmanage' => $canmanage, 'canmanage' => $canmanage,
'candownload' => $candownload, 'candownload' => $candownload,
'fileurl' => $fileurl, 'fileurl' => $fileurl,
'showreport' => $showreport, 'showreport' => $showreport,
'numissuesinreport' => $numissues, 'hasrecipients' => !empty($recipients),
'recipients' => array_values($recipients),
'currenttimestamp' => time() 'currenttimestamp' => time()
]; ];
@ -113,69 +126,6 @@ class mobile {
]; ];
} }
/**
* Returns the list of issues certificates for the activity for the mobile app.
*
* @param array $args Arguments from tool_mobile_get_content WS
* @return array HTML, javascript and other data
*/
public static function mobile_view_report($args) {
global $DB, $OUTPUT, $USER;
$args = (object) $args;
$cmid = $args->cmid;
$groupid = empty($args->group) ? 0 : $args->group; // By default, group 0.
// Capabilities check.
$cm = get_coursemodule_from_id('customcert', $cmid);
$context = \context_module::instance($cm->id);
self::require_capability($cm, $context, 'mod/customcert:viewreport');
// Get the groups (if any) to display - also sets active group.
$groups = self::get_groups($cm, $groupid, $USER->id);
$certificate = $DB->get_record('customcert', ['id' => $cm->instance], '*', MUST_EXIST);
$certificate->name = format_string($certificate->name);
list($certificate->intro, $certificate->introformat) = external_format_text($certificate->intro,
$certificate->introformat, $context->id, 'mod_customcert', 'intro');
$groupmode = groups_get_activity_groupmode($cm);
if (has_capability('moodle/site:accessallgroups', $context)) {
$groupmode = 'aag';
}
$issues = \mod_customcert\certificate::get_issues($certificate->id, $groupmode, $cm, 0, 0);
foreach ($issues as $issue) {
$issue->displayname = fullname($issue);
$issue->fileurl = new \moodle_url('/mod/customcert/mobile/pluginfile.php', ['certificateid' => $certificate->id,
'userid' => $issue->id]);
}
$data = [
'certificate' => $certificate,
'cmid' => $cmid,
'showgroups' => !empty($groups),
'groups' => array_values($groups),
'canmanage' => has_capability('mod/customcert:manage', $context),
'hasissues' => !empty($issues),
'issues' => array_values($issues),
'currenttimestamp' => time()
];
return [
'templates' => [
[
'id' => 'main',
'html' => $OUTPUT->render_from_template('mod_customcert/mobile_report_page', $data),
],
],
'javascript' => '',
'otherdata' => ''
];
}
/** /**
* Returns an array of groups to be displayed (if applicable) for the activity. * Returns an array of groups to be displayed (if applicable) for the activity.
* *

View file

@ -137,10 +137,12 @@ class report_table extends \table_sql {
global $OUTPUT; global $OUTPUT;
$icon = new \pix_icon('download', get_string('download'), 'customcert'); $icon = new \pix_icon('download', get_string('download'), 'customcert');
$link = new \moodle_url('/mod/customcert/report.php', $link = new \moodle_url('/mod/customcert/view.php',
array('id' => $this->cm->id, [
'downloadcert' => '1', 'id' => $this->cm->id,
'userid' => $user->id)); 'downloadissue' => $user->id
]
);
return $OUTPUT->action_link($link, '', null, null, $icon); return $OUTPUT->action_link($link, '', null, null, $icon);
} }
@ -155,7 +157,7 @@ class report_table extends \table_sql {
global $OUTPUT; global $OUTPUT;
$icon = new \pix_icon('i/delete', get_string('delete')); $icon = new \pix_icon('i/delete', get_string('delete'));
$link = new \moodle_url('/mod/customcert/report.php', $link = new \moodle_url('/mod/customcert/view.php',
[ [
'id' => $this->cm->id, 'id' => $this->cm->id,
'deleteissue' => $user->issueid, 'deleteissue' => $user->issueid,

View file

@ -44,8 +44,7 @@ $addons = array(
['pluginname', 'customcert'], ['pluginname', 'customcert'],
['receiveddate', 'customcert'], ['receiveddate', 'customcert'],
['requiredtimenotmet', 'customcert'], ['requiredtimenotmet', 'customcert'],
['selectagroup', 'moodle'], ['selectagroup', 'moodle']
['viewcustomcertissues', 'customcert']
], ],
] ]
); );

View file

@ -83,7 +83,7 @@ $string['fontcolour'] = 'Colour';
$string['fontcolour_help'] = 'The colour of the font.'; $string['fontcolour_help'] = 'The colour of the font.';
$string['fontsize'] = 'Size'; $string['fontsize'] = 'Size';
$string['fontsize_help'] = 'The size of the font in points.'; $string['fontsize_help'] = 'The size of the font in points.';
$string['getcustomcert'] = 'Download certificate'; $string['getcustomcert'] = 'View certificate';
$string['height'] = 'Height'; $string['height'] = 'Height';
$string['height_help'] = 'This is the height of the certificate PDF in mm. For reference an A4 piece of paper is 297mm high and a letter is 279mm high.'; $string['height_help'] = 'This is the height of the certificate PDF in mm. For reference an A4 piece of paper is 297mm high and a letter is 279mm high.';
$string['invalidcode'] = 'Invalid code supplied.'; $string['invalidcode'] = 'Invalid code supplied.';
@ -113,6 +113,7 @@ $string['name'] = 'Name';
$string['nametoolong'] = 'You have exceeded the maximum length allowed for the name'; $string['nametoolong'] = 'You have exceeded the maximum length allowed for the name';
$string['nocustomcerts'] = 'There are no certificates for this course'; $string['nocustomcerts'] = 'There are no certificates for this course';
$string['noimage'] = 'No image'; $string['noimage'] = 'No image';
$string['norecipients'] = 'No recipients';
$string['notemplates'] = 'No templates'; $string['notemplates'] = 'No templates';
$string['notissued'] = 'Not issued'; $string['notissued'] = 'Not issued';
$string['notverified'] = 'Not verified'; $string['notverified'] = 'Not verified';
@ -173,6 +174,5 @@ $string['verifycertificate'] = 'Verify certificate';
$string['verifycertificatedesc'] = 'This link will take you to a new screen where you will be able to verify certificates on the site'; $string['verifycertificatedesc'] = 'This link will take you to a new screen where you will be able to verify certificates on the site';
$string['verifycertificateanyone'] = 'Allow anyone to verify a certificate'; $string['verifycertificateanyone'] = 'Allow anyone to verify a certificate';
$string['verifycertificateanyone_help'] = 'This setting enables anyone with the certificate verification link (including users not logged in) to verify a certificate.'; $string['verifycertificateanyone_help'] = 'This setting enables anyone with the certificate verification link (including users not logged in) to verify a certificate.';
$string['viewcustomcertissues'] = 'View {$a} issued certificates';
$string['width'] = 'Width'; $string['width'] = 'Width';
$string['width_help'] = 'This is the width of the certificate PDF in mm. For reference an A4 piece of paper is 210mm wide and a letter is 216mm wide.'; $string['width_help'] = 'This is the width of the certificate PDF in mm. For reference an A4 piece of paper is 210mm wide and a letter is 216mm wide.';

View file

@ -17,6 +17,8 @@
/** /**
* Handles viewing a report that shows who has received a customcert. * Handles viewing a report that shows who has received a customcert.
* *
* This is now just a stub page - all logic has been moved to view.php.
*
* @package mod_customcert * @package mod_customcert
* @copyright 2013 Mark Nelson <markn@moodle.com> * @copyright 2013 Mark Nelson <markn@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
@ -25,96 +27,10 @@
require_once('../../config.php'); require_once('../../config.php');
$id = required_param('id', PARAM_INT); $id = required_param('id', PARAM_INT);
$download = optional_param('download', null, PARAM_ALPHA);
$downloadcert = optional_param('downloadcert', '', PARAM_BOOL);
$deleteissue = optional_param('deleteissue', 0, PARAM_INT);
$confirm = optional_param('confirm', 0, PARAM_BOOL);
if ($downloadcert) {
$userid = required_param('userid', PARAM_INT);
}
$page = optional_param('page', 0, PARAM_INT);
$perpage = optional_param('perpage', \mod_customcert\certificate::CUSTOMCERT_PER_PAGE, PARAM_INT);
$pageurl = $url = new moodle_url('/mod/customcert/report.php', array('id' => $id, 'page' => $page, 'perpage' => $perpage));
$cm = get_coursemodule_from_id('customcert', $id, 0, false, MUST_EXIST); $cm = get_coursemodule_from_id('customcert', $id, 0, false, MUST_EXIST);
$course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST); $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
$customcert = $DB->get_record('customcert', array('id' => $cm->instance), '*', MUST_EXIST);
// Requires a course login.
require_login($course, false, $cm); require_login($course, false, $cm);
// Check capabilities. redirect(new moodle_url('/mod/customcert/view.php', ['id' => $id]));
$context = context_module::instance($cm->id);
require_capability('mod/customcert:viewreport', $context);
// Set up the page.
$title = $customcert->name;
$heading = format_string($title);
\mod_customcert\page_helper::page_setup($pageurl, $context, $title);
// Additional page setup.
if ($deleteissue && confirm_sesskey()) {
$PAGE->navbar->add(get_string('listofissues', 'customcert'),
new moodle_url('/mod/customcert/report.php', ['id' => $id]));
} else {
$PAGE->navbar->add(get_string('listofissues', 'customcert'));
}
if ($deleteissue && confirm_sesskey()) {
require_capability('mod/customcert:manage', $context);
if (!$confirm) {
$nourl = new moodle_url('/mod/customcert/report.php', ['id' => $id]);
$yesurl = new moodle_url('/mod/customcert/report.php',
[
'id' => $id,
'deleteissue' => $deleteissue,
'confirm' => 1,
'sesskey' => sesskey()
]
);
// Show a confirmation page.
$PAGE->navbar->add(get_string('deleteconfirm', 'customcert'));
$message = get_string('deleteissueconfirm', 'customcert');
echo $OUTPUT->header();
echo $OUTPUT->heading($heading);
echo $OUTPUT->confirm($message, $yesurl, $nourl);
echo $OUTPUT->footer();
exit();
}
// Delete the issue.
$DB->delete_records('customcert_issues', array('id' => $deleteissue, 'customcertid' => $customcert->id));
// Redirect back to the manage templates page.
redirect(new moodle_url('/mod/customcert/report.php', array('id' => $id)));
}
// Check if we requested to download another user's certificate.
if ($downloadcert) {
$template = $DB->get_record('customcert_templates', array('id' => $customcert->templateid), '*', MUST_EXIST);
$template = new \mod_customcert\template($template);
$template->generate_pdf(false, $userid);
exit();
}
// Check if we are in group mode.
if ($groupmode = groups_get_activity_groupmode($cm)) {
groups_get_activity_group($cm, true);
}
$table = new \mod_customcert\report_table($customcert->id, $cm, $groupmode, $download);
$table->define_baseurl($pageurl);
if ($table->is_downloading()) {
$table->download();
exit();
}
echo $OUTPUT->header();
echo $OUTPUT->heading(format_string($customcert->name), 2);
groups_print_activity_menu($cm, $url);
$table->out($perpage, false);
echo $OUTPUT->footer();

View file

@ -1,122 +0,0 @@
{{!
This file is part of Moodle - http://moodle.org/
Moodle is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Moodle is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Moodle. If not, see <http://www.gnu.org/licenses/>.
}}
{{!
@template mod_customcert/mobile_report_page
The page that lists the custom certificates issued
Classes required for JS:
* None
Data attibutes required for JS:
* All data attributes are required
Context variables required for this template:
* certificate
* cmid
* showgroups
* groups
* canmanage
* hasissues
* issues
* currenttimestamp
Example context (json):
{
"certificate": {
"id": "1",
"course": "2",
"name": "A rad certificate name!",
"intro": "A certificate"
},
"cmid": "25",
"showgroups": "true",
"groups": [
{
"id": "2",
"selected": "false",
"name": "Group A"
}
],
"canmanage": "true",
"hasissues": "true",
"issues": [
{
"id": "2",
"issueid": "3",
"displayname": "Michaelangelo (Mickey)",
"fileurl": "http://yoursite.com/mod/customcert/mobile/pluginfile.php?id=4",
"code": "Xyt78axR",
"timecreated": "1528370177"
}
],
"currenttimestamp": "1528370177"
}
}}
{{=<% %>=}}
<div>
<core-course-module-description description="<% certificate.intro %>" component="mod_customcert" componentId="<% cmid %>"></core-course-module-description>
<%#showgroups%>
<ion-item>
<ion-label>{{ 'plugin.mod_customcert.selectagroup' | translate }}</ion-label>
<ion-select (ionChange)="updateContent({cmid: <% cmid %>, courseid: <% certificate.course %>, group: $event})" interface="popover">
<%#groups%>
<ion-option value="<% id %>" <%#selected%>selected<%/selected%>><% name %></ion-option>
<%/groups%>
</ion-select>
</ion-item>
<%/showgroups%>
<ion-item class="text-center">
<p class="item-heading">{{ 'plugin.mod_customcert.listofissues' | translate }}</p>
</ion-item>
<%#hasissues%>
<ion-list>
<%#issues%>
<ion-item>
<ion-grid>
<ion-row>
<ion-col col-6 class="text-left">
<% displayname %>
<br />
{{ <% timecreated %> | coreToLocaleString }}
</ion-col>
<ion-col col-6 class="text-right">
<button ion-button icon-only clear [core-download-file]="{fileurl: '<% fileurl %>', timemodified: '<% currenttimestamp %>'}" moduleId="<% cmid %>" courseId="<% certificate.course %>" component="mod_customcert">
<ion-icon name="download"></ion-icon>
</button>
<%#canmanage%>
<button ion-button icon-only clear core-site-plugins-call-ws name="mod_customcert_delete_issue"
[params]="{certificateid: <% certificate.id %>, issueid: <% issueid %>}"
[preSets]="{getFromCache: 0, saveToCache: 0, typeExpected: 'boolean'}"
confirmMessage="{{ 'plugin.mod_customcert.deleteissueconfirm' | translate }}"
refreshOnSuccess="true">
<ion-icon name="trash"></ion-icon>
</button>
<%/canmanage%>
</ion-col>
</ion-row>
</ion-grid>
</ion-item>
<%/issues%>
</ion-list>
<%/hasissues%>
<%^hasissues%>
<ion-item class="text-center">
{{ 'plugin.mod_customcert.nothingtodisplay' | translate }}
</ion-item>
<%/hasissues%>
</div>

View file

@ -30,10 +30,14 @@
* cmid * cmid
* hasissues * hasissues
* issues * issues
* showgroups
* groups
* canmanage
* candownload * candownload
* hasrecipients
* recipients
* fileurl * fileurl
* showreport * showreport
* numissuesinreport
* currenttimestamp * currenttimestamp
Example context (json): Example context (json):
@ -52,21 +56,34 @@
"timecreated": "1528370177" "timecreated": "1528370177"
} }
], ],
"showgroups": "true",
"groups": [
{
"id": "2",
"selected": "false",
"name": "Group A"
}
],
"canmanage": "true",
"candownload": "true", "candownload": "true",
"fileurl": "http://yoursite.com/mod/customcert/mobile/pluginfile.php?id=4", "fileurl": "http://yoursite.com/mod/customcert/mobile/pluginfile.php?id=4",
"showreport": "true", "showreport": "true",
"numissuesinreport": "5", "hasrecipients": "true",
"recipients": [
{
"id": "2",
"issueid": "3",
"displayname": "Michaelangelo (Mickey)",
"fileurl": "http://yoursite.com/mod/customcert/mobile/pluginfile.php?id=4",
"timecreated": "1528370177"
}
],
"currenttimestamp": "1528370177" "currenttimestamp": "1528370177"
} }
}} }}
{{=<% %>=}} {{=<% %>=}}
<div> <div>
<core-course-module-description description="<% certificate.intro %>" component="mod_customcert" componentId="<% cmid %>"></core-course-module-description> <core-course-module-description description="<% certificate.intro %>" component="mod_customcert" componentId="<% cmid %>"></core-course-module-description>
<%#showreport%>
<a ion-item class="text-right" core-site-plugins-new-content component="mod_customcert" method="mobile_view_report" [args]="{cmid: <% cmid %>}">
{{ 'plugin.mod_customcert.viewcustomcertissues' | translate: {$a: <% numissuesinreport %>} }}
</a>
<%/showreport%>
<%#hasissues%> <%#hasissues%>
<%^canmanage%> <%^canmanage%>
<ion-list> <ion-list>
@ -94,4 +111,55 @@
<p>{{ 'plugin.mod_customcert.requiredtimenotmet' | translate: {$a: { requiredtime: <% certificate.requiredtime %>} } }}</p> <p>{{ 'plugin.mod_customcert.requiredtimenotmet' | translate: {$a: { requiredtime: <% certificate.requiredtime %>} } }}</p>
</ion-item> </ion-item>
<%/candownload%> <%/candownload%>
<%#showreport%>
<ion-item>
{{ 'plugin.mod_customcert.listofissues' | translate }}
</ion-item>
<%#showgroups%>
<ion-item>
<ion-label>{{ 'plugin.mod_customcert.selectagroup' | translate }}</ion-label>
<ion-select (ionChange)="updateContent({cmid: <% cmid %>, courseid: <% certificate.course %>, group: $event})" interface="popover">
<%#groups%>
<ion-option value="<% id %>" <%#selected%>selected<%/selected%>><% name %></ion-option>
<%/groups%>
</ion-select>
</ion-item>
<%/showgroups%>
<%#hasrecipients%>
<ion-list>
<%#recipients%>
<ion-item>
<ion-grid>
<ion-row>
<ion-col col-6 class="text-left">
<% displayname %>
<br />
{{ <% timecreated %> | coreToLocaleString }}
</ion-col>
<ion-col col-6 class="text-right">
<button ion-button icon-only clear [core-download-file]="{fileurl: '<% fileurl %>', timemodified: '<% currenttimestamp %>'}" moduleId="<% cmid %>" courseId="<% certificate.course %>" component="mod_customcert">
<ion-icon name="download"></ion-icon>
</button>
<%#canmanage%>
<button ion-button icon-only clear core-site-plugins-call-ws name="mod_customcert_delete_issue"
[params]="{certificateid: <% certificate.id %>, issueid: <% issueid %>}"
[preSets]="{getFromCache: 0, saveToCache: 0, typeExpected: 'boolean'}"
confirmMessage="{{ 'plugin.mod_customcert.deleteissueconfirm' | translate }}"
refreshOnSuccess="true">
<ion-icon name="trash"></ion-icon>
</button>
<%/canmanage%>
</ion-col>
</ion-row>
</ion-grid>
</ion-item>
<%/recipients%>
</ion-list>
<%/hasrecipients%>
<%^hasrecipients%>
<ion-item>
{{ 'plugin.mod_customcert.nothingtodisplay' | translate }}
</ion-item>
<%/hasrecipients%>
<%/showreport%>
</div> </div>

View file

@ -25,14 +25,14 @@ Feature: Being able to view the certificates you have been issued
And I log in as "student1" And I log in as "student1"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 1" And I follow "Custom certificate 1"
And I press "Download certificate" And I press "View certificate"
And I follow "Profile" in the user menu And I follow "Profile" in the user menu
And I follow "My certificates" And I follow "My certificates"
And I should see "Custom certificate 1" And I should see "Custom certificate 1"
And I should not see "Custom certificate 2" And I should not see "Custom certificate 2"
And I am on "Course 2" course homepage And I am on "Course 2" course homepage
And I follow "Custom certificate 2" And I follow "Custom certificate 2"
And I press "Download certificate" And I press "View certificate"
And I follow "Profile" in the user menu And I follow "Profile" in the user menu
And I follow "My certificates" And I follow "My certificates"
And I should see "Custom certificate 1" And I should see "Custom certificate 1"

View file

@ -25,7 +25,7 @@ Feature: Being able to set the required minutes in a course before viewing the c
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 1" And I follow "Custom certificate 1"
And I should see "You must spend at least a minimum of" And I should see "You must spend at least a minimum of"
And I should not see "Download certificate" And I should not see "View certificate"
And I press "Continue" And I press "Continue"
And I should see "Custom certificate 1" And I should see "Custom certificate 1"
@ -36,4 +36,4 @@ Feature: Being able to set the required minutes in a course before viewing the c
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 1" And I follow "Custom certificate 1"
And I should not see "You must spend at least a minimum of" And I should not see "You must spend at least a minimum of"
And I should see "Download certificate" And I should see "View certificate"

View file

@ -25,7 +25,7 @@ Feature: Being able to verify that a certificate is valid or not
And I log in as "student1" And I log in as "student1"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 1" And I follow "Custom certificate 1"
And I press "Download certificate" And I press "View certificate"
And I log out And I log out
And I log in as "teacher1" And I log in as "teacher1"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
@ -45,7 +45,7 @@ Feature: Being able to verify that a certificate is valid or not
And I log in as "student1" And I log in as "student1"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 2" And I follow "Custom certificate 2"
And I press "Download certificate" And I press "View certificate"
And I log out And I log out
And I visit the verification url for the "Custom certificate 2" certificate And I visit the verification url for the "Custom certificate 2" certificate
And I set the field "Code" to "NOTAVALIDCODE" And I set the field "Code" to "NOTAVALIDCODE"
@ -74,10 +74,10 @@ Feature: Being able to verify that a certificate is valid or not
And I log in as "student1" And I log in as "student1"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 1" And I follow "Custom certificate 1"
And I press "Download certificate" And I press "View certificate"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 2" And I follow "Custom certificate 2"
And I press "Download certificate" And I press "View certificate"
And I log out And I log out
And I log in as "admin" And I log in as "admin"
# The admin (or anyone with the capability 'mod/customcert:verifyallcertificates') can visit the URL regardless of the setting. # The admin (or anyone with the capability 'mod/customcert:verifyallcertificates') can visit the URL regardless of the setting.
@ -95,10 +95,10 @@ Feature: Being able to verify that a certificate is valid or not
And I log in as "student1" And I log in as "student1"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 1" And I follow "Custom certificate 1"
And I press "Download certificate" And I press "View certificate"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 2" And I follow "Custom certificate 2"
And I press "Download certificate" And I press "View certificate"
And I log out And I log out
And I visit the verification url for the site And I visit the verification url for the site
And I set the field "Code" to "NOTAVALIDCODE" And I set the field "Code" to "NOTAVALIDCODE"

View file

@ -26,17 +26,16 @@ Feature: Being able to view the certificates that have been issued
And I log in as "student1" And I log in as "student1"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 1" And I follow "Custom certificate 1"
And I press "Download certificate" And I press "View certificate"
And I log out And I log out
And I log in as "student2" And I log in as "student2"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 1" And I follow "Custom certificate 1"
And I press "Download certificate" And I press "View certificate"
And I log out And I log out
And I log in as "teacher1" And I log in as "teacher1"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 1" And I follow "Custom certificate 1"
And I follow "View 2 issued certificates"
And I should see "Student 1" And I should see "Student 1"
And I should see "Student 2" And I should see "Student 2"
@ -44,17 +43,16 @@ Feature: Being able to view the certificates that have been issued
And I log in as "student1" And I log in as "student1"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 1" And I follow "Custom certificate 1"
And I press "Download certificate" And I press "View certificate"
And I log out And I log out
And I log in as "student2" And I log in as "student2"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 1" And I follow "Custom certificate 1"
And I press "Download certificate" And I press "View certificate"
And I log out And I log out
And I log in as "teacher1" And I log in as "teacher1"
And I am on "Course 1" course homepage And I am on "Course 1" course homepage
And I follow "Custom certificate 1" And I follow "Custom certificate 1"
And I follow "View 2 issued certificates"
And I should see "Student 1" And I should see "Student 1"
And I should see "Student 2" And I should see "Student 2"
And I click on ".delete-icon" "css_element" in the "Student 2" "table_row" And I click on ".delete-icon" "css_element" in the "Student 2" "table_row"

View file

@ -25,7 +25,13 @@
require_once('../../config.php'); require_once('../../config.php');
$id = required_param('id', PARAM_INT); $id = required_param('id', PARAM_INT);
$action = optional_param('action', '', PARAM_ALPHA); $downloadown = optional_param('downloadown', false, PARAM_BOOL);
$downloadtable = optional_param('download', null, PARAM_ALPHA);
$downloadissue = optional_param('downloadissue', 0, PARAM_INT);
$deleteissue = optional_param('deleteissue', 0, PARAM_INT);
$confirm = optional_param('confirm', false, PARAM_BOOL);
$page = optional_param('page', 0, PARAM_INT);
$perpage = optional_param('perpage', \mod_customcert\certificate::CUSTOMCERT_PER_PAGE, PARAM_INT);
$cm = get_coursemodule_from_id('customcert', $id, 0, false, MUST_EXIST); $cm = get_coursemodule_from_id('customcert', $id, 0, false, MUST_EXIST);
$course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST); $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
@ -38,6 +44,7 @@ $context = context_module::instance($cm->id);
require_capability('mod/customcert:view', $context); require_capability('mod/customcert:view', $context);
$canmanage = has_capability('mod/customcert:manage', $context); $canmanage = has_capability('mod/customcert:manage', $context);
$canviewreport = has_capability('mod/customcert:viewreport', $context);
// Initialise $PAGE. // Initialise $PAGE.
$pageurl = new moodle_url('/mod/customcert/view.php', array('id' => $cm->id)); $pageurl = new moodle_url('/mod/customcert/view.php', array('id' => $cm->id));
@ -53,6 +60,36 @@ if ($customcert->requiredtime && !$canmanage) {
} }
} }
// Check if we are deleting an issue.
if ($deleteissue && $canmanage && confirm_sesskey()) {
if (!$confirm) {
$nourl = new moodle_url('/mod/customcert/view.php', ['id' => $id]);
$yesurl = new moodle_url('/mod/customcert/view.php',
[
'id' => $id,
'deleteissue' => $deleteissue,
'confirm' => 1,
'sesskey' => sesskey()
]
);
// Show a confirmation page.
$PAGE->navbar->add(get_string('deleteconfirm', 'customcert'));
$message = get_string('deleteissueconfirm', 'customcert');
echo $OUTPUT->header();
echo $OUTPUT->heading(format_string($customcert->name));
echo $OUTPUT->confirm($message, $yesurl, $nourl);
echo $OUTPUT->footer();
exit();
}
// Delete the issue.
$DB->delete_records('customcert_issues', array('id' => $deleteissue, 'customcertid' => $customcert->id));
// Redirect back to the manage templates page.
redirect(new moodle_url('/mod/customcert/view.php', array('id' => $id)));
}
$event = \mod_customcert\event\course_module_viewed::create(array( $event = \mod_customcert\event\course_module_viewed::create(array(
'objectid' => $customcert->id, 'objectid' => $customcert->id,
'context' => $context, 'context' => $context,
@ -61,22 +98,23 @@ $event->add_record_snapshot('course', $course);
$event->add_record_snapshot('customcert', $customcert); $event->add_record_snapshot('customcert', $customcert);
$event->trigger(); $event->trigger();
// Check that no action was passed, if so that means we are not outputting to PDF. // Check that we are not downloading a certificate PDF.
if (empty($action)) { if (!$downloadown && !$downloadissue) {
// Get the current groups mode. // Get the current groups mode.
if ($groupmode = groups_get_activity_groupmode($cm)) { if ($groupmode = groups_get_activity_groupmode($cm)) {
groups_get_activity_group($cm, true); groups_get_activity_group($cm, true);
} }
// Generate the link to the report if there are issues to display. // Generate the table to the report if there are issues to display.
$reportlink = ''; if ($canviewreport) {
if (has_capability('mod/customcert:viewreport', $context)) {
// Get the total number of issues. // Get the total number of issues.
$numissues = \mod_customcert\certificate::get_number_of_issues($customcert->id, $cm, $groupmode); $reporttable = new \mod_customcert\report_table($customcert->id, $cm, $groupmode, $downloadtable);
$href = new moodle_urL('/mod/customcert/report.php', array('id' => $cm->id)); $reporttable->define_baseurl($pageurl);
$url = html_writer::tag('a', get_string('viewcustomcertissues', 'customcert', $numissues),
array('href' => $href->out())); if ($reporttable->is_downloading()) {
$reportlink = html_writer::tag('div', $url, array('class' => 'reportlink')); $reporttable->download();
exit();
}
} }
// Generate the intro content if it exists. // Generate the intro content if it exists.
@ -106,28 +144,38 @@ if (empty($action)) {
// Create the button to download the customcert. // Create the button to download the customcert.
$linkname = get_string('getcustomcert', 'customcert'); $linkname = get_string('getcustomcert', 'customcert');
$link = new moodle_url('/mod/customcert/view.php', array('id' => $cm->id, 'action' => 'download')); $link = new moodle_url('/mod/customcert/view.php', array('id' => $cm->id, 'downloadown' => true));
$downloadbutton = new single_button($link, $linkname); $downloadbutton = new single_button($link, $linkname);
$downloadbutton = html_writer::tag('div', $OUTPUT->render($downloadbutton), array('style' => 'text-align:center')); $downloadbutton = html_writer::tag('div', $OUTPUT->render($downloadbutton), array('style' => 'text-align:center'));
// Output all the page data. // Output all the page data.
echo $OUTPUT->header(); echo $OUTPUT->header();
echo $OUTPUT->heading(format_string($customcert->name), 2); echo $OUTPUT->heading(format_string($customcert->name));
echo $reportlink;
echo $intro; echo $intro;
echo $issuelist; echo $issuelist;
echo $downloadbutton; echo $downloadbutton;
echo $OUTPUT->footer($course); if (isset($reporttable)) {
exit; echo $OUTPUT->heading(get_string('listofissues', 'customcert'), 3);
} else { // Output to pdf. groups_print_activity_menu($cm, $pageurl);
// Create new customcert issue record if one does not already exist. echo $reporttable->out($perpage, false);
if (!$DB->record_exists('customcert_issues', array('userid' => $USER->id, 'customcertid' => $customcert->id))) {
\mod_customcert\certificate::issue_certificate($customcert->id, $USER->id);
} }
echo $OUTPUT->footer($course);
exit();
} else { // Output to pdf.
// Set the userid value of who we are downloading the certificate for.
$userid = $USER->id;
if ($downloadown) {
// Create new customcert issue record if one does not already exist.
if (!$DB->record_exists('customcert_issues', array('userid' => $USER->id, 'customcertid' => $customcert->id))) {
\mod_customcert\certificate::issue_certificate($customcert->id, $USER->id);
}
// Set the custom certificate as viewed. // Set the custom certificate as viewed.
$completion = new completion_info($course); $completion = new completion_info($course);
$completion->set_module_viewed($cm); $completion->set_module_viewed($cm);
} else if ($downloadissue && $canviewreport) {
$userid = $downloadissue;
}
// Hack alert - don't initiate the download when running Behat. // Hack alert - don't initiate the download when running Behat.
if (defined('BEHAT_SITE_RUNNING')) { if (defined('BEHAT_SITE_RUNNING')) {
@ -136,6 +184,6 @@ if (empty($action)) {
// Now we want to generate the PDF. // Now we want to generate the PDF.
$template = new \mod_customcert\template($template); $template = new \mod_customcert\template($template);
$template->generate_pdf(); $template->generate_pdf(false, $userid);
exit(); exit();
} }