From af9f20110ffb39bcfe16af2d78c142a5c62215ca Mon Sep 17 00:00:00 2001 From: mgbf Date: Tue, 11 Jun 2019 10:46:42 -0300 Subject: [PATCH] =?UTF-8?q?Parametriza=C3=A7=C3=A3o=20para=20integra=C3=A7?= =?UTF-8?q?=C3=A3o=20com=20EVL,=20corre=C3=A7=C3=A3o=20de=20bugs=20e=20out?= =?UTF-8?q?ros=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 +