Alterações iTarefa: --> quando o aluno tentava acessar uma atividade que foi removida, era gerado um bug :: com as alterações, o aluno recebe um alerta. SOLUÇÃO: * locallib.php função: view_iassign_current() if (!$iassign_statement_activity_item) { print $OUTPUT->header(); \core\notification::error(get_string('activity_not_found', 'iassign')); print $OUTPUT->footer(); exit; } --> quando o aluno finalizava uma tarefa no iFractions, a tela do iMA ficava preta problema: ao carregar a página inicial, o iTarefa entrega um código para acessar o ilm_security, mas com a finalização da atividade, o mesmo código era mantido, portanto, não tinha como acessar, pois o código do ilm_security só pode ser usado uma única vez. SOLUÇÃO: * iFractions/index.html: função: finish_redirect() parent.location.reload(true); // Ao passar o "true", o navegador não usa o cache e busca um novo código ilm_security --> manter selecionado o iLM que foi usado recentemente para criar a última atividade, a fim de melhorar a usabilidade e produtividade * arquivo alterado: iassign_form.php --> Gerenciamento de arquivos: 1. Criação da atividade: - O campo itemid passa a receber o statementid. - Função: new_iassign //locallib.php // IGOR: itemid do arquivo é o mesmo que o id do statemente registrado acima: $itemid = $id; 2. Alteração da atividade: - Atualmente, o arquivo anterior é removido, mas não remove também as entradas de diretórios. 3. Exclusão da atividade: - O iTarefa não removia as entradas do files, que estão associadas àquela atividade excluída. - Para corrigir, as linhas abaixo foram adicionadas: função deleteyes: // locallib.php $fs = get_file_storage(); $fs->delete_area_files( $iassign->context->id, 'mod_iassign', 'exercise', $this->activity->id ); 4. Cópia de atividade: - Com a alteração feita para a criação, a cópia também passou a registrar o itemid com o statementid. 5. Mover atividade: - Para preservar o itemid do arquivo, a seguinte linha foi atualizada: função move_activity: //locallib.php $newfile = $fs->create_file_from_storedfile(array('contextid' => $id_context, 'component' => 'mod_iassign', 'filearea' => 'exercise', 'itemid' => $iassign_id), $value); 5. No update: ..> Testar na nossa base: if ($oldversion < 2020102800) { // 1. encontrar os contextos dos arquivos do itarefa: $iassign_contexts_list = $DB->get_records_sql("SELECT contextid FROM {files} f " . " WHERE component='mod_iassign'"); // 2. compor um array com todos os contextos encontrados: $contexts = array(); foreach ($iassign_contexts_list as $iassign_context_item) { array_push($contexts, $iassign_context_item->contextid); } // 3. encontrar todas as atividades do itarefa, em que o arquivo não tenha o mesmo id do statement: $iassign_statement_list = $DB->get_records_sql("SELECT * FROM {iassign_statement} s " . " WHERE s.id != s.file"); $fs = get_file_storage(); // 4. percorrer o conjunto de atividades: foreach ($iassign_statement_list as $iassign_statement_activity_item) { // 5. encontrar o arquivo, considerando os possíveis contextos: $files = array(); foreach ($contexts as $context) { $files = $fs->get_area_files($context, 'mod_iassign', 'exercise', $iassign_statement_activity_item->file); // 6. se o arquivo for encontrado, fazer uma cópia do conteúdo, // com o itemid novo, atualizar o iassign_statement, e apagar o arquivo antigo: if ($files) { foreach ($files as $value) { if ($value != null && $value->get_filename() != ".") { // 6.A. Fazer uma cópia: $newfile = $fs->create_file_from_storedfile(array('contextid' => $context, 'component' => 'mod_iassign', 'filearea' => 'exercise', 'itemid' => $iassign_statement_activity_item->id), $value); // 6.B. Atualizar o registro da atividade para o arquivo novo: $update_entry = new stdClass(); $update_entry->id = $iassign_statement_activity_item->id; $update_entry->file = $newfile->get_itemid(); $DB->update_record("iassign_statement", $update_entry); // 6.C. Remover o arquivo antigo: $value->delete(); } else if ($value != null && $value->get_filename() == ".") { // 6.C.I. Remover também os indicadores de diretório: $value->delete(); } } break; } } } } // if ($oldversion < 2020102800) 09/11/2020: :: editingbehavior :: editingbehavior = 0: para iGeom, iHanoi => ter que clicar no "Refazer atividade" : desabilita botao "enviar" ao entrar em atividade feita editingbehavior = 1: para iVProg => permite continuar edicao (do ponto que parou) : deixa habilitado o botao "enviar" em qq situacao title do botão editingbehavior = 2: para iFraction => não tem o botão enviar, o envio é contínuo :: submissionbehavior :: se editingbehavior=0, entao: trocar 'title' para 'Este iMA nao permite continuar edicao de solucao enviada. Para editar, por favor, clique no botao 'Refazer atividade'" iassign_ilm: 2 novos campos 'editingbehavior' e 'submissionbehavior' Sendo: id name version type editingbehavior description url extension parent file_jar file_class width height enable timemodified author timecreated evaluate reevaluate editingbehavior = 0: para iGeom, iHanoi => ter que clicar no "Refazer atividade" : desabilita botao "enviar" ao entrar em atividade feita editingbehavior = 1: para iVProg => permite continuar edicao (do ponto que parou) : deixa habilitado o botao "enviar" em qq situacao submissionbehavior = 0: para iGeom, iVprog, iHanoi => NAO trocar de pagina submissionbehavior = 1: para iFractions => ao finalizar deve invocar iTarefa.finish_and_redirect() :: iassign_allsubmissions :: Criar nova tabela 'iassign_allsubmissions'. Se a atividade estiver marcada para gravar todas, qdo aluno clicar no "avaliar", gravar nova entrada. No formulario para criar atividade, se o iMA for do tipo (1,0), mostrar opcao para gravar tudo No 'locallib', sempre que o aluno clicar no "avaliar" No iVProg -> mensagem de fechar a janela com edição -->> AFAZERES: iassign_ilm: 2 novos campos 'editingbehavior' e 'submissionbehavior' Sendo: id name version type editingbehavior description url extension parent file_jar file_class width height enable timemodified author timecreated evaluate reevaluate editingbehavior = 0: para iGeom, iHanoi, iFractions => ter que clicar no "Refazer atividade" : desabilita botao "enviar" ao entrar em atividade feita editingbehavior = 1: para iVProg => permite continuar edicao (do ponto que parou) : deixa habilitado o botao "enviar" em qq situacao @Igor: Finalizada a implementação do 'editingbehavior' submissionbehavior = 0: para iGeom, iVprog, iHanoi => NAO trocar de pagina submissionbehavior = 1: para iFractions => ao finalizar deve invocar iTarefa.finish_and_redirect() Criar nova tabela 'iassign_allsubmissions'. Se a atividade estiver marcada para gravar todas, qdo aluno clicar no "avaliar", gravar nova entrada. No formulario para criar atividade, se o iMA for do tipo (1,0), mostrar opcao para gravar tudo No 'locallib', sempre que o aluno clicar no "avaliar" TODO 1. 1 tabela nova: iassign_allsubmissions @Igor: Campos na tabela iassign_allsubmissions: 1. id 2. iassign_statementid 3. userid 4. timecreated 5. grade 6. answer 2. 2 campos novos na tabela 'iassign_ilm': editingbehavior, submissionbehavior 3. 1 campo novo na tabela 'iassign_statement': store_all_submissions iMA: - getEvaluation(): tem que chamar o 'getEvaluation()' do iTarefa iTarefa: - Alterar com sua funcao 'getEvaluation()' com eventual codigo para gravar (senao ela e' vazia) 30/11/2020: --> tabela ilm: - action_button 0: submission desabilitado 1: padrão. submission habilitado. --> se o ima possui autoavaliador e é do tipo exercício, trocar o rótulo do botão para 'Avaliar': 'roda o avaliador e envia o registro, clicando no avaliar, automaticamente vai ser registrado' Verificar se a nota é maior ou menor