From cd0311609ad434ed36e9b81a94ab8b5da35e6e8e Mon Sep 17 00:00:00 2001 From: Matheus456 Date: Mon, 10 Jun 2019 18:20:08 -0300 Subject: [PATCH 1/2] =?UTF-8?q?Adaptando=20funcionalidades=20para=20a=20no?= =?UTF-8?q?va=20vers=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/observer.php | 18 +++++++++++------- classes/util.php | 40 +++++++++++++++++++--------------------- db/events.php | 6 +++--- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/classes/observer.php b/classes/observer.php index 9f258dc..fbe0edf 100644 --- a/classes/observer.php +++ b/classes/observer.php @@ -2,7 +2,7 @@ require_once($CFG->dirroot.'/config.php'); -include_once('../lib/httpful.phar'); +include_once($CFG->dirroot.'/blocks/escola_modelo/lib/httpful.phar'); include_once('util.php'); class block_escola_modelo_observer { @@ -34,10 +34,9 @@ class block_escola_modelo_observer { public static function course_updated(\core\event\base $event) { global $DB, $CFG; $curso = $DB->get_record($event->objecttable,array('id'=>$event->objectid)); - atualizaCursoEVL($curso); } - + /** * Trata evento de remoção de um curso. * TODO: tratar situações em que isso pode ou não ocorrer, bem como a forma adequada de tratar o evento. @@ -45,11 +44,17 @@ class block_escola_modelo_observer { public static function course_deleted(\core\event\base $event) { global $DB, $CFG; $curso = $DB->get_record($event->objecttable,array('id'=>$event->objectid)); - + // Por enquanto, atualizamos o curso na EVL, porém o mesmo fica invisível atualizaCursoEVL($curso, false); } + // EVENTOS RELACIONADOS A CERTIFICADOS + public static function certificate_created(\core\event\base $event) { + atualizaCertificadoEVL($event->other); + } + + // // EVENTOS RELACIONADOS A CATEGORIAS // @@ -66,9 +71,8 @@ class block_escola_modelo_observer { public static function course_category_updated(\core\event\base $event) { global $DB, $CFG; $categoria = $DB->get_record($event->objecttable,array('id'=>$event->objectid)); - - // A forma mais segura de fazê-lo é modificar timemodified de todos os cursos, - // de modo que na próxima sincronização eles tenham seu status modificado + A forma mais segura de fazê-lo é modificar timemodified de todos os cursos, + de modo que na próxima sincronização eles tenham seu status modificado atualizaCategoriaEVL($categoria); } diff --git a/classes/util.php b/classes/util.php index 29fd80a..463da7e 100644 --- a/classes/util.php +++ b/classes/util.php @@ -4,7 +4,7 @@ */ require_once($CFG->dirroot.'/config.php'); -include_once('../lib/httpful.phar'); +include_once($CFG->dirroot.'/blocks/escola_modelo/lib/httpful.phar'); /** * Verifica se um curso é público, conforme critérios da EVL. @@ -56,7 +56,6 @@ function categoriaPublica($category) { */ function atualizaCursoEVL($curso, $visivel = null) { global $DB, $CFG, $USER; - mtrace("curso " . $curso->id); // Detecta status, caso ele não tenha sido especificado @@ -87,13 +86,11 @@ function atualizaCursoEVL($curso, $visivel = null) { "certificador" => $CFG->emSigla, "carga_horaria" => $ch ); - // Monta o JSON que será enviado ao Web Service $obj->school = $CFG->emSigla; $obj->course = $camposCurso; - $obj->key = $CFG->emApplicationToken; + $obj->key = $CFG->emApplicationToken; // Precisa passar a chave do usuário $json = json_encode($obj); - $response = \Httpful\Request::post($uri) ->sendsJson() ->body($json) @@ -112,14 +109,17 @@ function atualizaCursoEVL($curso, $visivel = null) { */ function registraSincronizacaoCurso($curso) { global $DB; - + + // VALUES (' . $curso->id . ',' . date('H:i:s') . ') + // ON CONFLICT (' . $curso->id . ') DO UPDATE + // SET time_sync = ?'; $qry = ' INSERT INTO {ilb_sync_course} (course_id, time_sync) VALUES (?,?) ON CONFLICT (course_id) DO UPDATE - SET time_sync = ?'; + SET time_sync = ?'; $params = array($curso->id, $curso->timemodified, $curso->timemodified); - + return $DB->execute($qry, $params); } @@ -218,7 +218,6 @@ function atualizaCategoriaEVL($categoria) { function atualizaCertificadoEVL($certificado) { global $DB, $CFG, $USER; - mtrace("certificado " . $certificado->code); $school = $DB->get_record('course',array('id'=>'1')); @@ -226,31 +225,31 @@ function atualizaCertificadoEVL($certificado) { $uri = $CFG->emURLWS . '/api/v1/certificados/adicionar/'; $obj = new StdClass(); - $certArray = array(); // Gravação de certificado para envio ao Web Service da EVL $certItem = array( - 'course' => $certificado->courseid, - 'student' => $certificado->username, + 'course' => $certificado->course, + 'student' => $certificado->user, 'date' => $certificado->timecreated, - 'grade' => $certificado->finalgrade, - 'code' => $certificado->code, + 'grade' => $certificado->gradefmt, + 'code' => $certificado->id, ); array_push($certArray, $certItem); - $mainArray = array( + 'key' => $CFG->emApplicationToken, 'school' => $CFG->emSigla, 'certificates' => $certArray, - 'key' =>$ $CFG->emApplicationToken ); + $json = json_encode($mainArray); + echo "AQUI O CERT ARRAY -> {$json}\n"; $response = \Httpful\Request::post($uri) ->sendsJson() ->body($json) - ->send(); - + ->send(); + // Se o registro foi criado no servidor, registra em tabela de controle if(!$response->hasErrors()) { registraSincronizacaoCertificado($certificado); @@ -264,7 +263,6 @@ function atualizaCertificadoEVL($certificado) { */ function registraSincronizacaoCertificado($certificado) { global $DB; - $qry = ' INSERT INTO {ilb_sync_certificate} (certificate_id, time_sync) VALUES (?,?) @@ -293,8 +291,8 @@ function atualizaDadosEscola($dadosEscola) { 'name' => $dadosEscola->nome_escola, 'url' => $dadosEscola->url_escola, 'logo' => $dadosEscola->url_logo_escola, - 'initials' => $dadosEscola->sigla_escola, - 'key' => $CFG->emApplicationToken + 'initials' => $dadosEscola->sigla_escola, + 'key' => $CFG->emApplicationToken ); $json = json_encode($schoolArray); diff --git a/db/events.php b/db/events.php index b625857..8fe2d16 100644 --- a/db/events.php +++ b/db/events.php @@ -21,9 +21,9 @@ $observers = array( ), // Eventos de certificados array( - 'eventname' => 'mod_certificate\event\certificates_created', - 'callback' => 'block_escola_modelo_observer::certificates_created' - ) + 'eventname' => 'mod_certificate\event\certificate_created', + 'callback' => 'block_escola_modelo_observer::certificate_created' + ), // ), // // Eventos de matrícula a cursos // array( From af9f20110ffb39bcfe16af2d78c142a5c62215ca Mon Sep 17 00:00:00 2001 From: mgbf Date: Tue, 11 Jun 2019 10:46:42 -0300 Subject: [PATCH 2/2] =?UTF-8?q?Parametriza=C3=A7=C3=A3o=20para=20integra?= =?UTF-8?q?=C3=A7=C3=A3o=20com=20EVL,=20corre=C3=A7=C3=A3o=20de=20bugs=20e?= =?UTF-8?q?=20outros=20ajustes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/observer.php | 9 +- classes/util.php | 157 +++++++++++++++++++------------- db/events.php | 2 +- lang/en/block_escola_modelo.php | 9 ++ settings.php | 25 ++++- version.php | 4 +- 6 files changed, 134 insertions(+), 72 deletions(-) diff --git a/classes/observer.php b/classes/observer.php index fbe0edf..d7a097f 100644 --- a/classes/observer.php +++ b/classes/observer.php @@ -2,7 +2,7 @@ require_once($CFG->dirroot.'/config.php'); -include_once($CFG->dirroot.'/blocks/escola_modelo/lib/httpful.phar'); +include_once($CFG->dirroot . '/blocks/escola_modelo/lib/httpful.phar'); include_once('util.php'); class block_escola_modelo_observer { @@ -77,13 +77,14 @@ class block_escola_modelo_observer { } // EVENTOS RELACIONADOS A CERTIFICADOS - public static function certificates_created(\core\event\base $event) { + public static function certificate_created(\mod_certificate\event\certificate_created $event) { global $DB, $CFG; - $categoria = $DB->get_record($event->objecttable,array('id'=>$event->objectid)); + //$categoria = $DB->get_record($event->objecttable,array('id'=>$event->objectid)); // A forma mais segura de fazê-lo é modificar timemodified de todos os cursos, // de modo que na próxima sincronização eles tenham seu status modificado - atualizaCategoriaEVL($categoria); + //atualizaCategoriaEVL($categoria); + mtrace('Criando certificado para ' . $event->objectid . ' e other ' . $event->other); } // TODO: verificar se é necessário tratar remoção de categoria diff --git a/classes/util.php b/classes/util.php index 463da7e..a9f0de0 100644 --- a/classes/util.php +++ b/classes/util.php @@ -4,34 +4,66 @@ */ require_once($CFG->dirroot.'/config.php'); -include_once($CFG->dirroot.'/blocks/escola_modelo/lib/httpful.phar'); +include_once($CFG->dirroot . '/blocks/escola_modelo/lib/httpful.phar'); +include_once($CFG->dirroot . '/course/externallib.php'); + +define("CURSO_CUSTOMFIELD_PUBLICO", "publico"); +define("CURSO_CUSTOMFIELD_AREATEMATICA", "areatematica"); +define("CURSO_CUSTOMFIELD_CARGAHORARIA", "cargahoraria"); +define("CURSO_CUSTOMFIELD_SENADOR", "senador"); +define("CURSO_CUSTOMFIELD_MUNICIPIO", "municipio"); +define("CURSO_CUSTOMFIELD_TIPOOFICINA", "tipooficina"); +define("CURSO_CUSTOMFIELD_INSTRUTOR", "instrutor"); +define("CURSO_CUSTOMFIELD_MONITOR", "monitor"); /** * Verifica se um curso é público, conforme critérios da EVL. - * Pelas regras estabelecidas, um curso é público se a categoria raiz em que ele - * estiver for uma categoria pública. + * Pelas regras estabelecidas, um curso é público se foi marcado como público + * em campo customizado */ function cursoPublico($course) { global $DB; - $category = $DB->get_record('course_categories', array('id'=>$course->category)); - $path = explode('/',$category->path); - $root_category_id = $path[1]; - $root_category = $DB->get_record('course_categories',array('id'=>$root_category_id)); + // Um curso é público se estiver marcado como público em campo personalizado + $publico = (obtemCampoCustomizadoCurso($course->id, CURSO_CUSTOMFIELD_PUBLICO) == '1'); + return $publico; +} - return categoriaPublica($root_category); +function evlHabilitada() { + $config = get_config('block_escola_modelo'); + return ($config->config_habilitar_evl == 1); } -/** - * Verifica se uma categoria é pública, conforme critérios da EVL - * Pelas regras estabelecidas, uma categoria é pública se possuir idnumber iniciado por PUB_ - */ -function categoriaPublica($category) { - $idnumber=$category->idnumber; - $isPublic=(strcasecmp(substr($idnumber,0,4), 'PUB_') == 0); +// TODO mover para outro local, usado também em certificado +function obtemCampoCustomizadoCurso($idCurso, $nomeCampo) { + global $DB; + + $sql = " + SELECT d.value, f.configdata::json->>'options' as options + FROM mdl_course c + JOIN mdl_context ctx + ON c.id = ? + AND ctx.contextlevel = 50 + AND ctx.instanceid = c.id + JOIN mdl_customfield_field f + ON f.shortname = ? + JOIN mdl_customfield_data d + ON d.fieldid = f.id + AND d.contextid = ctx.id + "; - return $isPublic; -} + $valueArray = $DB->get_record_sql($sql, [$idCurso, $nomeCampo]); + $value = $valueArray->value; + $options = $valueArray->options; + + if($options == null) { + return $value; + } else { + + $optionsArray = preg_split("/\s*\n\s*/", trim($options)); + return $optionsArray[$value-1]; + } +} /** * Registra um determinado curso na EVL, com o status informado @@ -56,51 +88,54 @@ function categoriaPublica($category) { */ function atualizaCursoEVL($curso, $visivel = null) { global $DB, $CFG, $USER; - mtrace("curso " . $curso->id); - - // Detecta status, caso ele não tenha sido especificado - $visivel = $visivel ?? cursoPublico($curso); - - // Hack: enquanto não há campos personalizados no curso, a carga horária - // precisa ser obtida a partir do idnumber - $idnumber = $curso->idnumber; - $ch = 0; - if(preg_match("/\_CH([0-9]+)/", $idnumber, $x)) { - $ch = $x[1]; - } - - $school = $DB->get_record('course',array('id'=>'1')); - - $uri = $CFG->emURLWS . '/api/v1/cursos/registrar/'; - - $obj = new StdClass(); - $camposCurso = array( - "name" => $curso->fullname, - "url" => "", - "description" => $curso->summary, - "logo" => "", - "ead_id" => $curso->id, - "visible" => $visivel, - "conteudista" => "", - "certificador" => $CFG->emSigla, - "carga_horaria" => $ch - ); - // Monta o JSON que será enviado ao Web Service - $obj->school = $CFG->emSigla; - $obj->course = $camposCurso; - $obj->key = $CFG->emApplicationToken; // Precisa passar a chave do usuário - $json = json_encode($obj); - $response = \Httpful\Request::post($uri) - ->sendsJson() - ->body($json) - ->send(); - - // Se o registro foi criado no servidor, registra em tabela de controle - if(!$response->hasErrors()) { - registraSincronizacaoCurso($curso); - } else { - mtrace("Erro sincronizando ". $curso->fullname . ": " . $response->code . " " ); + if( evlHabilitada() ) { + // Detecta status, caso ele não tenha sido especificado + $visivel = $visivel ?? cursoPublico($curso); + + // Hack: enquanto não há campos personalizados no curso, a carga horária + // precisa ser obtida a partir do idnumber + $idnumber = $curso->idnumber; + $ch = 0; + if(preg_match("/\_CH([0-9]+)/", $idnumber, $x)) { + $ch = $x[1]; + } + + $school = $DB->get_record('course',array('id'=>'1')); + + $uri = $CFG->emURLWS . '/api/v1/cursos/registrar/'; + + $obj = new StdClass(); + + $camposCurso = array( + "name" => $curso->fullname, + "url" => "", + "description" => $curso->summary, + "logo" => "", + "ead_id" => $curso->id, + "visible" => $visivel, + "conteudista" => "", + "certificador" => $CFG->emSigla, + "carga_horaria" => $ch + ); + + // Monta o JSON que será enviado ao Web Service + $obj->school = $CFG->emSigla; + $obj->course = $camposCurso; + $obj->key = $CFG->emApplicationToken; + $json = json_encode($obj); + + $response = \Httpful\Request::post($uri) + ->sendsJson() + ->body($json) + ->send(); + + // Se o registro foi criado no servidor, registra em tabela de controle + if(!$response->hasErrors()) { + registraSincronizacaoCurso($curso); + } else { + mtrace("Erro sincronizando ". $curso->fullname . ": " . $response->code . " " ); + } } } diff --git a/db/events.php b/db/events.php index 8fe2d16..27ebd17 100644 --- a/db/events.php +++ b/db/events.php @@ -23,7 +23,7 @@ $observers = array( array( 'eventname' => 'mod_certificate\event\certificate_created', 'callback' => 'block_escola_modelo_observer::certificate_created' - ), + ) // ), // // Eventos de matrícula a cursos // array( diff --git a/lang/en/block_escola_modelo.php b/lang/en/block_escola_modelo.php index 5c58aa2..22f2c71 100644 --- a/lang/en/block_escola_modelo.php +++ b/lang/en/block_escola_modelo.php @@ -2,8 +2,17 @@ $string['pluginname'] = 'Escola Modelo'; $string['escola_modelo'] = 'Bloco para Escola Modelo'; +$string['config_habilitar_evl_titulo'] = 'Habilitar EVL'; +$string['config_habilitar_evl_descricao'] = 'Indica se esta instalação está integrada a Escola Virtual do Legislativo'; + $string['config_sigla_evl_titulo'] = 'Sigla da Escola Modelo'; $string['config_sigla_evl_descricao'] = 'Sigla da Escola Modelo na EVL'; $string['config_apikey_titulo'] = 'Chave de API'; $string['config_apikey_descricao'] = 'Chave de API para interação com EVL'; + +$string['config_url_portal_evl_titulo'] = 'Portal da EVL'; +$string['config_url_portal_evl_descricao'] = 'URL do Portal da EVL'; + +$string['config_url_ws_evl_titulo'] = 'Web Services da EVL'; +$string['config_url_ws_evl_descricao'] = 'URL Raiz do Servidor de Web Services da EVL'; diff --git a/settings.php b/settings.php index 9834bf2..9ba183c 100644 --- a/settings.php +++ b/settings.php @@ -27,15 +27,32 @@ defined('MOODLE_INTERNAL') || die(); if ($ADMIN->fulltree) { -/* // Sigla da Escola na EVL + $setting = new admin_setting_configcheckbox('block_escola_modelo/config_habilitar_evl', + get_string('config_habilitar_evl_titulo', 'block_escola_modelo'), + get_string('config_habilitar_evl_descricao', 'block_escola_modelo'), 1); + $settings->add($setting); + + // Sigla da Escola na EVL $setting = new admin_setting_configtext('block_escola_modelo/config_sigla_evl', get_string('config_sigla_evl_titulo', 'block_escola_modelo'), - get_string('config_sigla_evl_descricao', 'block_escola_modelo'), '', PARAM_ALPHA, 3); + get_string('config_sigla_evl_descricao', 'block_escola_modelo'), '', PARAM_TEXT, 3); $settings->add($setting); + // API Key desta instalação $setting = new admin_setting_configtext('block_escola_modelo/config_apikey', get_string('config_apikey_titulo', 'block_escola_modelo'), - get_string('config_apikey_descricao', 'block_escola_modelo'), '', PARAM_ALPHA, 50); + get_string('config_apikey_descricao', 'block_escola_modelo'), '', PARAM_TEXT, 50); + $settings->add($setting); + + // URL do Portal da EVL + $setting = new admin_setting_configtext('block_escola_modelo/config_url_portal_evl', + get_string('config_url_portal_evl_titulo', 'block_escola_modelo'), + get_string('config_url_portal_evl_descricao', 'block_escola_modelo'), '', PARAM_TEXT, 100); + $settings->add($setting); + + // URL do servidor de Web Services da EVL + $setting = new admin_setting_configtext('block_escola_modelo/config_url_ws_evl', + get_string('config_url_ws_evl_titulo', 'block_escola_modelo'), + get_string('config_url_ws_evl_descricao', 'block_escola_modelo'), '', PARAM_TEXT, 100); $settings->add($setting); - */ } diff --git a/version.php b/version.php index 597799b..e63f22f 100644 --- a/version.php +++ b/version.php @@ -1,5 +1,5 @@ version = 2019012102; +$plugin->version = 2019060701; $plugin->requires = 2017110800; $plugin->component = 'block_escola_modelo'; - \ No newline at end of file +