Skip to content

Commit fa0023a

Browse files
author
Ron Lucke
authored
Cert (#255)
Optionally generate certificates, remind students and/or reset progress periodically
1 parent d7f58ca commit fa0023a

17 files changed

Lines changed: 1187 additions & 5 deletions

File tree

133 KB
Loading

blocks/Courseware/Courseware.php

Lines changed: 148 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,22 @@ public function initialize()
4848
$this->defineField('sections_as_chapters', \Mooc\SCOPE_BLOCK, false);
4949

5050
$this->defineField('scrollytelling', \Mooc\SCOPE_BLOCK, false);
51+
52+
$this->defineField('certificate', \Mooc\SCOPE_BLOCK, false);
53+
$this->defineField('certificate_limit', \Mooc\SCOPE_BLOCK, 100);
54+
$this->defineField('certificate_image_id', \Mooc\SCOPE_BLOCK, '');
55+
56+
$this->defineField('reminder', \Mooc\SCOPE_BLOCK, false);
57+
$this->defineField('reminder_message', \Mooc\SCOPE_BLOCK, '');
58+
$this->defineField('reminder_interval', \Mooc\SCOPE_BLOCK, 0);
59+
$this->defineField('reminder_start_date', \Mooc\SCOPE_BLOCK, 0);
60+
$this->defineField('reminder_end_date', \Mooc\SCOPE_BLOCK, '');
61+
62+
$this->defineField('resetter', \Mooc\SCOPE_BLOCK, false);
63+
$this->defineField('resetter_message', \Mooc\SCOPE_BLOCK, '');
64+
$this->defineField('resetter_interval', \Mooc\SCOPE_BLOCK, 0);
65+
$this->defineField('resetter_start_date', \Mooc\SCOPE_BLOCK, '');
66+
$this->defineField('resetter_end_date', \Mooc\SCOPE_BLOCK, '');
5167
}
5268

5369
public function student_view($context = array())
@@ -130,6 +146,7 @@ public function student_view($context = array())
130146
'show_section_nav' => $this->show_section_nav,
131147
'sections_as_chapters' => $this->sections_as_chapters,
132148
'scrollytelling' => $this->scrollytelling,
149+
'certificate' => $this->certificate,
133150
'isSequential' => $this->progression == 'seq',
134151
'active_section' => $active_section,
135152
'cw_title' => $courseware->title,
@@ -437,6 +454,136 @@ public function getScrollytelling()
437454
return $this->scrollytelling;
438455
}
439456

457+
public function setCertificate($state)
458+
{
459+
$this->certificate = $state;
460+
}
461+
462+
public function getCertificate()
463+
{
464+
return $this->certificate;
465+
}
466+
467+
public function setCertificateLimit($state)
468+
{
469+
$this->certificate_limit = $state;
470+
}
471+
472+
public function getCertificateLimit()
473+
{
474+
return $this->certificate_limit;
475+
}
476+
477+
public function setCertificateImageId($state)
478+
{
479+
$this->certificate_image_id = $state;
480+
}
481+
482+
public function getCertificateImageId()
483+
{
484+
return $this->certificate_image_id;
485+
}
486+
487+
public function setReminder($state)
488+
{
489+
$this->reminder = $state;
490+
}
491+
492+
public function getReminder()
493+
{
494+
return $this->reminder;
495+
}
496+
497+
public function setReminderInterval($state)
498+
{
499+
$this->reminder_interval = $state;
500+
}
501+
502+
public function getReminderInterval()
503+
{
504+
return $this->reminder_interval;
505+
}
506+
507+
public function setReminderMessage($state)
508+
{
509+
$this->reminder_message = $state;
510+
}
511+
512+
public function getReminderMessage()
513+
{
514+
return $this->reminder_message;
515+
}
516+
517+
public function setReminderStartDate($state)
518+
{
519+
$this->reminder_start_date = $state;
520+
}
521+
522+
public function getReminderStartDate()
523+
{
524+
return $this->reminder_start_date == '' ? '': date('d.m.Y', (int) $this->reminder_start_date);
525+
}
526+
527+
public function setReminderEndDate($state)
528+
{
529+
$this->reminder_end_date = $state;
530+
}
531+
532+
public function getReminderEndDate()
533+
{
534+
return $this->reminder_end_date == '' ? '': date('d.m.Y', (int) $this->reminder_end_date);
535+
}
536+
537+
public function setResetter($state)
538+
{
539+
$this->resetter = $state;
540+
}
541+
542+
public function getResetter()
543+
{
544+
return $this->resetter;
545+
}
546+
547+
public function setResetterInterval($state)
548+
{
549+
$this->resetter_interval = $state;
550+
}
551+
552+
public function getResetterInterval()
553+
{
554+
return $this->resetter_interval;
555+
}
556+
557+
public function setResetterStartDate($state)
558+
{
559+
return $this->resetter_start_date = $state;
560+
}
561+
562+
public function getResetterStartDate()
563+
{
564+
return $this->resetter_start_date == '' ? '': date('d.m.Y', (int) $this->resetter_start_date);
565+
}
566+
567+
public function setResetterEndDate($state)
568+
{
569+
return $this->resetter_end_date = $state;
570+
}
571+
572+
public function getResetterEndDate()
573+
{
574+
return $this->resetter_end_date == '' ? '': date('d.m.Y', (int) $this->resetter_end_date);
575+
}
576+
577+
public function setResetterMessage($state)
578+
{
579+
$this->resetter_message = $state;
580+
}
581+
582+
public function getResetterMessage()
583+
{
584+
return $this->resetter_message;
585+
}
586+
440587
///////////////////////
441588
// PRIVATE FUNCTIONS //
442589
///////////////////////
@@ -784,4 +931,4 @@ private function getFilesForSubChapter(\Mooc\DB\Block $subChapter)
784931

785932
return $files;
786933
}
787-
}
934+
}

controllers/courseware.php

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ public function settings_action()
5656

5757
return $this->redirect('courseware/settings');
5858
}
59+
$folders = \Folder::findBySQL('range_id = ? AND folder_type = ?', array($this->container['cid'], 'HiddenFolder'));
60+
$this->files = array();
61+
foreach ($folders as $folder) {
62+
$file_refs = \FileRef::findBySQL('folder_id = ?', array($folder->id));
63+
foreach($file_refs as $ref){
64+
if (($ref->isImage()) && (!$ref->isLink())) {
65+
$this->files[] = $ref;
66+
}
67+
}
68+
}
5969
}
6070

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

319+
////////////////////////
320+
// Certificate //
321+
////////////////////////
322+
if ($courseware_settings['certificate'] === '1') {
323+
$this->storeCertificate(true);
324+
$this->storeCertificateLimit($courseware_settings['certificate_limit']);
325+
$this->storeCertificateImageId($courseware_settings['certificate_image_id']);
326+
} else {
327+
$this->storeCertificate(false);
328+
}
329+
330+
////////////////////
331+
// Reminder //
332+
////////////////////
333+
if ($courseware_settings['reminder'] === '1') {
334+
$this->storeReminder(true);
335+
if(isset($courseware_settings['reminder_interval'])){
336+
$this->storeReminderInterval($courseware_settings['reminder_interval']);
337+
} else {
338+
$this->storeReminderInterval(\Mooc\YEARLY); // default jährlich
339+
}
340+
if(isset($courseware_settings['reminder_start_date'])){
341+
$this->storeReminderStartDate($courseware_settings['reminder_start_date']);
342+
} else {
343+
$this->storeReminderStartDate(date("d.m.Y"));
344+
}
345+
if(isset($courseware_settings['reminder_end_date'])){
346+
$this->storeReminderEndDate($courseware_settings['reminder_end_date']);
347+
}
348+
if(isset($courseware_settings['reminder_message'])){
349+
$this->storeReminderMessage($courseware_settings['reminder_message']);
350+
}
351+
} else {
352+
$this->storeReminder(false);
353+
}
354+
355+
356+
///////////////////
357+
// Resetter //
358+
///////////////////
359+
if ($courseware_settings['resetter'] === '1') {
360+
$this->storeResetter(true);
361+
if(isset($courseware_settings['resetter_interval'])){
362+
$this->storeResetterInterval($courseware_settings['resetter_interval']);
363+
} else {
364+
$this->storeResetterInterval(\Mooc\YEARLY); // default jährlich
365+
}
366+
if(isset($courseware_settings['resetter_start_date'])){
367+
$this->storeResetterStartDate($courseware_settings['resetter_start_date']);
368+
} else {
369+
$this->storeResetterStartDate(date("d.m.Y"));
370+
}
371+
if(isset($courseware_settings['resetter_end_date'])){
372+
$this->storeResetterEndDate($courseware_settings['resetter_end_date']);
373+
}
374+
if(isset($courseware_settings['resetter_message'])){
375+
$this->storeResetterMessage($courseware_settings['resetter_message']);
376+
}
377+
} else {
378+
$this->storeResetter(false);
379+
}
380+
309381
$this->courseware_block->save();
310382
}
311383

@@ -362,6 +434,75 @@ private function storeScrollytelling($active)
362434
}
363435
}
364436

437+
private function storeCertificate($active)
438+
{
439+
if (!$this->courseware_block->setCertificate($active)) {
440+
}
441+
}
442+
443+
private function storeCertificateLimit($value)
444+
{
445+
if (!$this->courseware_block->setCertificateLimit($value)) {
446+
}
447+
}
448+
449+
private function storeCertificateImageId($value)
450+
{
451+
if (!$this->courseware_block->setCertificateImageId($value)) {
452+
}
453+
}
454+
455+
private function storeReminder($active)
456+
{
457+
if (!$this->courseware_block->setReminder($active)) {
458+
}
459+
}
460+
461+
private function storeReminderInterval($interval)
462+
{
463+
$this->courseware_block->setReminderInterval($interval);
464+
}
465+
466+
private function storeReminderStartDate($date)
467+
{
468+
$this->courseware_block->setReminderStartDate(strtotime($date));
469+
}
470+
471+
private function storeReminderEndDate($date)
472+
{
473+
$this->courseware_block->setReminderEndDate(strtotime($date));
474+
}
475+
476+
private function storeReminderMessage($text)
477+
{
478+
$this->courseware_block->setReminderMessage(Studip\Markup::purifyHtml(trim($text)));
479+
}
480+
481+
private function storeResetter($active)
482+
{
483+
$this->courseware_block->setResetter($active);
484+
}
485+
486+
private function storeResetterInterval($interval)
487+
{
488+
$this->courseware_block->setResetterInterval($interval);
489+
}
490+
491+
private function storeResetterStartDate($date)
492+
{
493+
$this->courseware_block->setResetterStartDate(strtotime($date));
494+
}
495+
496+
private function storeResetterEndDate($date)
497+
{
498+
$this->courseware_block->setResetterEndDate(strtotime($date));
499+
}
500+
501+
private function storeResetterMessage($text)
502+
{
503+
$this->courseware_block->setResetterMessage(Studip\Markup::purifyHtml(trim($text)));
504+
}
505+
365506
private function storeEditingPermission($tutor_may_edit)
366507
{
367508
$perm = $tutor_may_edit

controllers/progress.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<?php
22

3+
use Mooc\DB\MailLog;
4+
35
class ProgressController extends CoursewareStudipController
46
{
57
public function before_filter(&$action, &$args)
@@ -50,6 +52,11 @@ function ($memo, $item) {
5052

5153
$this->courseware = current($grouped['']);
5254
$this->buildTree($grouped, $progress, $this->courseware);
55+
56+
$courseware = \Mooc\DB\Block::findCourseware($cid);
57+
$courseware_ui = $this->plugin->getBlockFactory()->makeBlock($courseware);
58+
59+
$this->hasCert = MailLog::hasCertificate($uid,$cid) && $courseware_ui->getCertificate();
5360
}
5461

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

73+
public function certificate_action()
74+
{
75+
$cid =$this->plugin->getCourseId();
76+
77+
if(!MailLog::hasCertificate($this->plugin->getCurrentUserId(),$cid)) {
78+
return $this->redirect('progress?cid='.$cid);
79+
}
80+
81+
require_once dirname(__FILE__).'/../pdf/coursewareCertificatePDF.php';
82+
83+
$user = User::find($this->plugin->getCurrentUserId());
84+
$course = Course::find($cid);
85+
86+
$template_factory = new Flexi_TemplateFactory(dirname(__FILE__) . '/../views');
87+
$template = $template_factory->open('mails/_pdf_certificate');
88+
$html = $template->render(compact('user', 'course'));
89+
90+
$courseware = \Mooc\DB\Block::findCourseware($cid);
91+
$courseware_ui = $this->plugin->getBlockFactory()->makeBlock($courseware);
92+
93+
$file_ref = new \FileRef($courseware_ui->getCertificateImageId());
94+
if ($file_ref) {
95+
$file = new \File($file_ref->file_id);
96+
$background_image = $file['path'];
97+
} else {
98+
$background_image = false;
99+
}
100+
101+
$pdf = new CoursewareCertificatePDF($background = $background_image);
102+
$pdf->AddPage();
103+
$pdf->writeHTML($html, true, false, true, false, '');
104+
$filename = _('Zertifikat');
105+
$pdf->Output($user->nachname.'_'.$course->name.'_'.$filename.'.pdf', 'I');
106+
die;
107+
}
108+
66109
private function buildTree($grouped, $progress, &$root)
67110
{
68111
$this->addChildren($grouped, $root);

0 commit comments

Comments
 (0)