From c37015bd0e314e1fac4364bcbb7fbeaa223c198c Mon Sep 17 00:00:00 2001 From: jmontoyaa Date: Tue, 8 Aug 2017 09:42:24 +0200 Subject: [PATCH] Add grading electronic as is see BT#12404 --- plugin/grading_electronic/README.md | 13 ++ plugin/grading_electronic/generate.php | 181 ++++++++++++++++ plugin/grading_electronic/index.php | 16 ++ plugin/grading_electronic/install.php | 4 + plugin/grading_electronic/lang/english.php | 16 ++ plugin/grading_electronic/plugin.php | 5 + .../src/GradingElectronicPlugin.php | 200 ++++++++++++++++++ plugin/grading_electronic/uninstall.php | 4 + .../grading_electronic/view/grading.html.twig | 43 ++++ 9 files changed, 482 insertions(+) create mode 100644 plugin/grading_electronic/README.md create mode 100644 plugin/grading_electronic/generate.php create mode 100644 plugin/grading_electronic/index.php create mode 100644 plugin/grading_electronic/install.php create mode 100644 plugin/grading_electronic/lang/english.php create mode 100644 plugin/grading_electronic/plugin.php create mode 100644 plugin/grading_electronic/src/GradingElectronicPlugin.php create mode 100644 plugin/grading_electronic/uninstall.php create mode 100644 plugin/grading_electronic/view/grading.html.twig diff --git a/plugin/grading_electronic/README.md b/plugin/grading_electronic/README.md new file mode 100644 index 0000000000..ee53901019 --- /dev/null +++ b/plugin/grading_electronic/README.md @@ -0,0 +1,13 @@ +# Grading Electronic Form +v0.6 + +Generate a file necesary to the Grading Electronic form for RickyRescue + +* Install the plugin +* Asign the `content_top` region +* Enable tool in configuration page + +> During the installation this plugin create three course extra fields +> (`plugin_gradingelectronic_provider_id`, `plugin_gradingelectronic_course_id`, `plugin_gradingelectronic_coursehours`) +> and one user extra field +> (`fcdice_or_acadis_student_id`) diff --git a/plugin/grading_electronic/generate.php b/plugin/grading_electronic/generate.php new file mode 100644 index 0000000000..1498c733be --- /dev/null +++ b/plugin/grading_electronic/generate.php @@ -0,0 +1,181 @@ +get('tool_enable') === 'true'; + + if (!$toolIsEnabled) { + throw new Exception($gradingElectronic->get_lang('PluginDisabled')); + } + + $form = $gradingElectronic->getForm(); + + if (!$form->validate()) { + throw new Exception( + implode('
', $form->_errors) + ); + } + + $em = Database::getManager(); + + /** @var Course $course */ + $course = $em->find('ChamiloCoreBundle:Course', api_get_course_int_id()); + /** @var Session $session */ + $session = $em->find('ChamiloCoreBundle:Session', api_get_session_id()); + + $values = $form->exportValues(); + + $cFieldValue = new ExtraFieldValue('course'); + $uFieldValue = new ExtraFieldValue('user'); + + $cFieldValue->save([ + 'variable' => GradingElectronicPlugin::EXTRAFIELD_COURSE_ID, + 'item_id' => $course->getId(), + 'value' => $values['course'] + ]); + + $item = $cFieldValue->get_item_id_from_field_variable_and_field_value( + GradingElectronicPlugin::EXTRAFIELD_COURSE_ID, + $values['course'] + ); + + $fieldProvider = $cFieldValue->get_values_by_handler_and_field_variable( + $course->getId(), + GradingElectronicPlugin::EXTRAFIELD_COURSE_PROVIDER_ID + ); + $fieldHours = $cFieldValue->get_values_by_handler_and_field_variable( + $course->getId(), + GradingElectronicPlugin::EXTRAFIELD_COURSE_HOURS + ); + + if ($session) { + $criteria = Criteria::create()->where( + Criteria::expr()->eq('relationType', Session::STUDENT) + ); + + $subscriptions = $session + ->getUsers() + ->matching($criteria); + + $students = []; + + /** @var SessionRelUser $subscription */ + foreach ($subscriptions as $subscription) { + $students[] = $subscription->getUser(); + } + } else { + $subscriptions = $course->getStudents(); + + /** @var CourseRelUser $subscription */ + foreach ($subscriptions as $subscription) { + $students[] = $subscription->getUser(); + } + } + + $cats = Category::load( + null, + null, + $course->getCode(), + null, + null, + $session ? $session->getId() : 0, + 'ORDER By id' + ); + + /** @var \Category $gradebook */ + $gradebook = $cats[0]; + + $dateStart = new DateTime($values['range_start'], new DateTimeZone('UTC')); + $dateEnd = new DateTime($values['range_end'], new DateTimeZone('UTC')); + + $fileData = []; + $fileData[] = sprintf( + "1 %s %s%s", + $fieldProvider ? $fieldProvider['value'] : null, + $values['course'], + $dateStart->format('m/d/Y') + ); + + /** @var User $student */ + foreach ($students as $student) { + $userFinishedCourse = Category::userFinishedCourse( + $student->getId(), + $gradebook, + 0, + $course->getCode(), + $session ? $session->getId() : 0, + true + ); + + if (!$userFinishedCourse) { + continue; + } + + $fieldStudent = $uFieldValue->get_values_by_handler_and_field_variable( + $student->getId(), + GradingElectronicPlugin::EXTRAFIELD_STUDENT_ID + ); + + $score = Category::getCurrentScore( + $student->getId(), + $gradebook->get_id(), + $course->getCode(), + $session ? $session->getId() : 0 + ); + + $fileData[] = sprintf( + "2 %sPASS%s %s %s", + $fieldStudent ? $fieldStudent['value'] : null, + $fieldHours ? $fieldHours['value'] : null, + $score, + $dateEnd->format('m/d/Y') + ); + + if (!$gradebook->getGenerateCertificates()) { + continue; + } + + Category::register_user_certificate($gradebook->get_id(), $student->getId()); + } + + $fileName = implode('_', [ + $gradingElectronic->get_title(), + $values['course'], + $values['range_start'], + $values['range_end'], + ]); + $fileName = api_replace_dangerous_char($fileName).'.txt'; + $fileData[] = null; + + file_put_contents( + api_get_path(SYS_ARCHIVE_PATH).$fileName, + implode("\r\n", $fileData) + ); + + echo Display::toolbarButton( + get_lang('Download'), + api_get_path(WEB_ARCHIVE_PATH).$fileName, + 'download', + 'success', + ['target' => '_blank', 'download' => $fileName] + ); +} catch (Exception $e) { + echo Display::return_message($e->getMessage(), 'error'); +} diff --git a/plugin/grading_electronic/index.php b/plugin/grading_electronic/index.php new file mode 100644 index 0000000000..8244019913 --- /dev/null +++ b/plugin/grading_electronic/index.php @@ -0,0 +1,16 @@ +isAllowed()) { + return; +} + +$_template['show'] = true; +$_tempalte['plugin_title'] = $gradingElectronic->get_title(); +$_template['form'] = $gradingElectronic->getForm(); diff --git a/plugin/grading_electronic/install.php b/plugin/grading_electronic/install.php new file mode 100644 index 0000000000..d9f5dcfd39 --- /dev/null +++ b/plugin/grading_electronic/install.php @@ -0,0 +1,4 @@ +install(); diff --git a/plugin/grading_electronic/lang/english.php b/plugin/grading_electronic/lang/english.php new file mode 100644 index 0000000000..b155f098e0 --- /dev/null +++ b/plugin/grading_electronic/lang/english.php @@ -0,0 +1,16 @@ +Generate File button in the Assessments page. + You nee assign the content_top region. +'; + +$strings['PluginDisabled'] = 'Grading Electronic is disabed'; +$strings['StudentId'] = 'Student ID'; +$strings['ProviderId'] = 'Provider ID'; +$strings['CourseHours'] = 'Course hours'; diff --git a/plugin/grading_electronic/plugin.php b/plugin/grading_electronic/plugin.php new file mode 100644 index 0000000000..c707eef205 --- /dev/null +++ b/plugin/grading_electronic/plugin.php @@ -0,0 +1,5 @@ +get_info(); +$plugin_info['templates'] = ['view/grading.html.twig']; diff --git a/plugin/grading_electronic/src/GradingElectronicPlugin.php b/plugin/grading_electronic/src/GradingElectronicPlugin.php new file mode 100644 index 0000000000..a2fcaad2db --- /dev/null +++ b/plugin/grading_electronic/src/GradingElectronicPlugin.php @@ -0,0 +1,200 @@ + 'boolean', + ) + ); + } + + /** + * @inheritDoc + */ + public function get_name() + { + return 'grading_electronic'; + } + + /** + * Actions for install + */ + public function install() + { + $this->setUpExtraFields(); + } + + /** + * Actions for uninstall + */ + public function uninstall() + { + $this->setDownExtraFields(); + } + + /** + * Create extra fields for this plugin + */ + private function setUpExtraFields() + { + $uExtraField = new ExtraField('user'); + + if (!$uExtraField->get_handler_field_info_by_field_variable(self::EXTRAFIELD_STUDENT_ID)) { + $uExtraField->save([ + 'variable' => self::EXTRAFIELD_STUDENT_ID, + 'field_type' => ExtraField::FIELD_TYPE_TEXT, + 'display_text' => $this->get_lang('StudentId'), + 'visible_to_self' => true, + 'changeable' => true + ]); + } + + $cExtraField = new ExtraField('course'); + + if (!$cExtraField->get_handler_field_info_by_field_variable(self::EXTRAFIELD_COURSE_PROVIDER_ID)) { + $cExtraField->save([ + 'variable' => self::EXTRAFIELD_COURSE_PROVIDER_ID, + 'field_type' => ExtraField::FIELD_TYPE_TEXT, + 'display_text' => $this->get_lang('ProviderId'), + 'visible_to_self' => true, + 'changeable' => true + ]); + } + + if (!$cExtraField->get_handler_field_info_by_field_variable(self::EXTRAFIELD_COURSE_ID)) { + $cExtraField->save([ + 'variable' => self::EXTRAFIELD_COURSE_ID, + 'field_type' => ExtraField::FIELD_TYPE_TEXT, + 'display_text' => $this->get_lang('CourseId'), + 'visible_to_self' => true, + 'changeable' => true + ]); + } + + if (!$cExtraField->get_handler_field_info_by_field_variable(self::EXTRAFIELD_COURSE_HOURS)) { + $cExtraField->save([ + 'variable' => self::EXTRAFIELD_COURSE_HOURS, + 'field_type' => ExtraField::FIELD_TYPE_TEXT, + 'display_text' => $this->get_lang('CourseHours'), + 'visible_to_self' => true, + 'changeable' => true + ]); + } + } + + /** + * Remove extra fields for this plugin + */ + private function setDownExtraFields() + { + $uExtraField = new ExtraField('user'); + + $studentIdField = $uExtraField->get_handler_field_info_by_field_variable(self::EXTRAFIELD_STUDENT_ID); + + if ($studentIdField) { + $uExtraField->delete($studentIdField['id']); + } + + $cExtraField = new ExtraField('course'); + + $proviedIdField = $cExtraField->get_handler_field_info_by_field_variable(self::EXTRAFIELD_COURSE_PROVIDER_ID); + $courseIdField = $cExtraField->get_handler_field_info_by_field_variable(self::EXTRAFIELD_COURSE_ID); + $courseHoursField = $cExtraField->get_handler_field_info_by_field_variable(self::EXTRAFIELD_COURSE_HOURS); + + if ($proviedIdField) { + $cExtraField->delete($proviedIdField['id']); + } + + if ($courseIdField) { + $cExtraField->delete($courseIdField['id']); + } + + if ($courseHoursField) { + $cExtraField->delete($courseHoursField['id']); + } + } + + /** + * @return \FormValidator|void + */ + public function getForm() + { + $extraField = new ExtraField('course'); + $courseIdField = $extraField->get_handler_field_info_by_field_variable(self::EXTRAFIELD_COURSE_ID); + + if (!$courseIdField) { + return null; + } + + $extraFieldValue = new ExtraFieldValue('course'); + $courseIdValue = $extraFieldValue->get_values_by_handler_and_field_variable( + api_get_course_int_id(), + self::EXTRAFIELD_COURSE_ID + ); + + $form = new FormValidator('frm_grading_electronic'); + $form->addDateRangePicker( + 'range', + get_lang('DateRange'), + true, + [ + 'id' => 'range', + 'format' => 'YYYY-MM-DD', + 'timePicker' => 'false', + 'validate_format' => 'Y-m-d' + ] + ); + $form->addText('course', $this->get_lang('CourseId')); + $form->addButtonDownload(get_lang('Generate')); + $form->addRule('course', get_lang('ThisFieldIsRequired'), 'required'); + $form->setDefaults([ + 'course' => $courseIdValue ? $courseIdValue['value'] : null + ]); + + return $form; + } + + /** + * Check if the current use is allowed to see the button + * @return bool + */ + public function isAllowed() + { + $allowed = api_is_teacher() || api_is_platform_admin() || api_is_course_tutor(); + + if (!$allowed) { + return false; + } + + $toolIsEnabled = $this->get('tool_enable') === 'true'; + + if (!$toolIsEnabled) { + return false; + } + + return true; + } +} diff --git a/plugin/grading_electronic/uninstall.php b/plugin/grading_electronic/uninstall.php new file mode 100644 index 0000000000..5f8498a7ad --- /dev/null +++ b/plugin/grading_electronic/uninstall.php @@ -0,0 +1,4 @@ +uninstall(); diff --git a/plugin/grading_electronic/view/grading.html.twig b/plugin/grading_electronic/view/grading.html.twig new file mode 100644 index 0000000000..5d63ba3b98 --- /dev/null +++ b/plugin/grading_electronic/view/grading.html.twig @@ -0,0 +1,43 @@ +{% if grading_electronic.show %} + + + + + +{% endif %}