Skip to content

Commit

Permalink
Cert (#255)
Browse files Browse the repository at this point in the history
Optionally generate certificates, remind students and/or reset progress periodically
  • Loading branch information
rlucke authored Jun 29, 2021
1 parent d7f58ca commit fa0023a
Show file tree
Hide file tree
Showing 17 changed files with 1,187 additions and 5 deletions.
Binary file added assets/images/pdf_default_background.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
149 changes: 148 additions & 1 deletion blocks/Courseware/Courseware.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,22 @@ public function initialize()
$this->defineField('sections_as_chapters', \Mooc\SCOPE_BLOCK, false);

$this->defineField('scrollytelling', \Mooc\SCOPE_BLOCK, false);

$this->defineField('certificate', \Mooc\SCOPE_BLOCK, false);
$this->defineField('certificate_limit', \Mooc\SCOPE_BLOCK, 100);
$this->defineField('certificate_image_id', \Mooc\SCOPE_BLOCK, '');

$this->defineField('reminder', \Mooc\SCOPE_BLOCK, false);
$this->defineField('reminder_message', \Mooc\SCOPE_BLOCK, '');
$this->defineField('reminder_interval', \Mooc\SCOPE_BLOCK, 0);
$this->defineField('reminder_start_date', \Mooc\SCOPE_BLOCK, 0);
$this->defineField('reminder_end_date', \Mooc\SCOPE_BLOCK, '');

$this->defineField('resetter', \Mooc\SCOPE_BLOCK, false);
$this->defineField('resetter_message', \Mooc\SCOPE_BLOCK, '');
$this->defineField('resetter_interval', \Mooc\SCOPE_BLOCK, 0);
$this->defineField('resetter_start_date', \Mooc\SCOPE_BLOCK, '');
$this->defineField('resetter_end_date', \Mooc\SCOPE_BLOCK, '');
}

public function student_view($context = array())
Expand Down Expand Up @@ -130,6 +146,7 @@ public function student_view($context = array())
'show_section_nav' => $this->show_section_nav,
'sections_as_chapters' => $this->sections_as_chapters,
'scrollytelling' => $this->scrollytelling,
'certificate' => $this->certificate,
'isSequential' => $this->progression == 'seq',
'active_section' => $active_section,
'cw_title' => $courseware->title,
Expand Down Expand Up @@ -437,6 +454,136 @@ public function getScrollytelling()
return $this->scrollytelling;
}

public function setCertificate($state)
{
$this->certificate = $state;
}

public function getCertificate()
{
return $this->certificate;
}

public function setCertificateLimit($state)
{
$this->certificate_limit = $state;
}

public function getCertificateLimit()
{
return $this->certificate_limit;
}

public function setCertificateImageId($state)
{
$this->certificate_image_id = $state;
}

public function getCertificateImageId()
{
return $this->certificate_image_id;
}

public function setReminder($state)
{
$this->reminder = $state;
}

public function getReminder()
{
return $this->reminder;
}

public function setReminderInterval($state)
{
$this->reminder_interval = $state;
}

public function getReminderInterval()
{
return $this->reminder_interval;
}

public function setReminderMessage($state)
{
$this->reminder_message = $state;
}

public function getReminderMessage()
{
return $this->reminder_message;
}

public function setReminderStartDate($state)
{
$this->reminder_start_date = $state;
}

public function getReminderStartDate()
{
return $this->reminder_start_date == '' ? '': date('d.m.Y', (int) $this->reminder_start_date);
}

public function setReminderEndDate($state)
{
$this->reminder_end_date = $state;
}

public function getReminderEndDate()
{
return $this->reminder_end_date == '' ? '': date('d.m.Y', (int) $this->reminder_end_date);
}

public function setResetter($state)
{
$this->resetter = $state;
}

public function getResetter()
{
return $this->resetter;
}

public function setResetterInterval($state)
{
$this->resetter_interval = $state;
}

public function getResetterInterval()
{
return $this->resetter_interval;
}

public function setResetterStartDate($state)
{
return $this->resetter_start_date = $state;
}

public function getResetterStartDate()
{
return $this->resetter_start_date == '' ? '': date('d.m.Y', (int) $this->resetter_start_date);
}

public function setResetterEndDate($state)
{
return $this->resetter_end_date = $state;
}

public function getResetterEndDate()
{
return $this->resetter_end_date == '' ? '': date('d.m.Y', (int) $this->resetter_end_date);
}

public function setResetterMessage($state)
{
$this->resetter_message = $state;
}

public function getResetterMessage()
{
return $this->resetter_message;
}

///////////////////////
// PRIVATE FUNCTIONS //
///////////////////////
Expand Down Expand Up @@ -784,4 +931,4 @@ private function getFilesForSubChapter(\Mooc\DB\Block $subChapter)

return $files;
}
}
}
141 changes: 141 additions & 0 deletions controllers/courseware.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,16 @@ public function settings_action()

return $this->redirect('courseware/settings');
}
$folders = \Folder::findBySQL('range_id = ? AND folder_type = ?', array($this->container['cid'], 'HiddenFolder'));
$this->files = array();
foreach ($folders as $folder) {
$file_refs = \FileRef::findBySQL('folder_id = ?', array($folder->id));
foreach($file_refs as $ref){
if (($ref->isImage()) && (!$ref->isLink())) {
$this->files[] = $ref;
}
}
}
}

public function news_action()
Expand Down Expand Up @@ -306,6 +316,68 @@ private function storeSettings()
$this->storeMaxCountIAV($courseware_settings['max-tries-iav']);
}

////////////////////////
// Certificate //
////////////////////////
if ($courseware_settings['certificate'] === '1') {
$this->storeCertificate(true);
$this->storeCertificateLimit($courseware_settings['certificate_limit']);
$this->storeCertificateImageId($courseware_settings['certificate_image_id']);
} else {
$this->storeCertificate(false);
}

////////////////////
// Reminder //
////////////////////
if ($courseware_settings['reminder'] === '1') {
$this->storeReminder(true);
if(isset($courseware_settings['reminder_interval'])){
$this->storeReminderInterval($courseware_settings['reminder_interval']);
} else {
$this->storeReminderInterval(\Mooc\YEARLY); // default jährlich
}
if(isset($courseware_settings['reminder_start_date'])){
$this->storeReminderStartDate($courseware_settings['reminder_start_date']);
} else {
$this->storeReminderStartDate(date("d.m.Y"));
}
if(isset($courseware_settings['reminder_end_date'])){
$this->storeReminderEndDate($courseware_settings['reminder_end_date']);
}
if(isset($courseware_settings['reminder_message'])){
$this->storeReminderMessage($courseware_settings['reminder_message']);
}
} else {
$this->storeReminder(false);
}


///////////////////
// Resetter //
///////////////////
if ($courseware_settings['resetter'] === '1') {
$this->storeResetter(true);
if(isset($courseware_settings['resetter_interval'])){
$this->storeResetterInterval($courseware_settings['resetter_interval']);
} else {
$this->storeResetterInterval(\Mooc\YEARLY); // default jährlich
}
if(isset($courseware_settings['resetter_start_date'])){
$this->storeResetterStartDate($courseware_settings['resetter_start_date']);
} else {
$this->storeResetterStartDate(date("d.m.Y"));
}
if(isset($courseware_settings['resetter_end_date'])){
$this->storeResetterEndDate($courseware_settings['resetter_end_date']);
}
if(isset($courseware_settings['resetter_message'])){
$this->storeResetterMessage($courseware_settings['resetter_message']);
}
} else {
$this->storeResetter(false);
}

$this->courseware_block->save();
}

Expand Down Expand Up @@ -362,6 +434,75 @@ private function storeScrollytelling($active)
}
}

private function storeCertificate($active)
{
if (!$this->courseware_block->setCertificate($active)) {
}
}

private function storeCertificateLimit($value)
{
if (!$this->courseware_block->setCertificateLimit($value)) {
}
}

private function storeCertificateImageId($value)
{
if (!$this->courseware_block->setCertificateImageId($value)) {
}
}

private function storeReminder($active)
{
if (!$this->courseware_block->setReminder($active)) {
}
}

private function storeReminderInterval($interval)
{
$this->courseware_block->setReminderInterval($interval);
}

private function storeReminderStartDate($date)
{
$this->courseware_block->setReminderStartDate(strtotime($date));
}

private function storeReminderEndDate($date)
{
$this->courseware_block->setReminderEndDate(strtotime($date));
}

private function storeReminderMessage($text)
{
$this->courseware_block->setReminderMessage(Studip\Markup::purifyHtml(trim($text)));
}

private function storeResetter($active)
{
$this->courseware_block->setResetter($active);
}

private function storeResetterInterval($interval)
{
$this->courseware_block->setResetterInterval($interval);
}

private function storeResetterStartDate($date)
{
$this->courseware_block->setResetterStartDate(strtotime($date));
}

private function storeResetterEndDate($date)
{
$this->courseware_block->setResetterEndDate(strtotime($date));
}

private function storeResetterMessage($text)
{
$this->courseware_block->setResetterMessage(Studip\Markup::purifyHtml(trim($text)));
}

private function storeEditingPermission($tutor_may_edit)
{
$perm = $tutor_may_edit
Expand Down
43 changes: 43 additions & 0 deletions controllers/progress.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<?php

use Mooc\DB\MailLog;

class ProgressController extends CoursewareStudipController
{
public function before_filter(&$action, &$args)
Expand Down Expand Up @@ -50,6 +52,11 @@ function ($memo, $item) {

$this->courseware = current($grouped['']);
$this->buildTree($grouped, $progress, $this->courseware);

$courseware = \Mooc\DB\Block::findCourseware($cid);
$courseware_ui = $this->plugin->getBlockFactory()->makeBlock($courseware);

$this->hasCert = MailLog::hasCertificate($uid,$cid) && $courseware_ui->getCertificate();
}

public function reset_action()
Expand All @@ -63,6 +70,42 @@ public function reset_action()
return $this->redirect('progress?cid='.$this->plugin->getCourseId());
}

public function certificate_action()
{
$cid =$this->plugin->getCourseId();

if(!MailLog::hasCertificate($this->plugin->getCurrentUserId(),$cid)) {
return $this->redirect('progress?cid='.$cid);
}

require_once dirname(__FILE__).'/../pdf/coursewareCertificatePDF.php';

$user = User::find($this->plugin->getCurrentUserId());
$course = Course::find($cid);

$template_factory = new Flexi_TemplateFactory(dirname(__FILE__) . '/../views');
$template = $template_factory->open('mails/_pdf_certificate');
$html = $template->render(compact('user', 'course'));

$courseware = \Mooc\DB\Block::findCourseware($cid);
$courseware_ui = $this->plugin->getBlockFactory()->makeBlock($courseware);

$file_ref = new \FileRef($courseware_ui->getCertificateImageId());
if ($file_ref) {
$file = new \File($file_ref->file_id);
$background_image = $file['path'];
} else {
$background_image = false;
}

$pdf = new CoursewareCertificatePDF($background = $background_image);
$pdf->AddPage();
$pdf->writeHTML($html, true, false, true, false, '');
$filename = _('Zertifikat');
$pdf->Output($user->nachname.'_'.$course->name.'_'.$filename.'.pdf', 'I');
die;
}

private function buildTree($grouped, $progress, &$root)
{
$this->addChildren($grouped, $root);
Expand Down
Loading

0 comments on commit fa0023a

Please sign in to comment.