ソースを参照

Finished all submissions management

Igor 3 年 前
コミット
6bb7c99a5b
5 ファイル変更338 行追加10 行削除
  1. 2 0
      lang/en/iassign.php
  2. 1 0
      lang/es/iassign.php
  3. 1 0
      lang/fr/iassign.php
  4. 2 0
      lang/pt_br/iassign.php
  5. 332 10
      locallib.php

+ 2 - 0
lang/en/iassign.php

@@ -30,6 +30,8 @@ $string['add_ilm_iassign']                = 'Add iLM';
 $string['add_ilm_iassign_help']           = 'What is a iLM';
 $string['add_param']                      = 'Add new parameter';
 $string['all_submissions_manager']        = 'Manage all submissions';
+$string['all_submissions_manager_confirm'] = 'Do you confirm the deletion?';
+$string['all_submissions_manager_date']   = 'Date';
 $string['answer']                         = 'answer';
 $string['applet']                         = 'interactive Learning Modules (iLM)';
 $string['applet_blocked']                 = 'It\'s not possible run this iLM, because your browser doesn\'t support Applets.';

+ 1 - 0
lang/es/iassign.php

@@ -30,6 +30,7 @@ $string['add_ilm_iassign']                = 'Añadir iMA';
 $string['add_ilm_iassign_help']           = 'O que é um iMA';
 $string['add_param']                      = 'Agregar nuevo parámetro';
 $string['all_submissions_manager']        = 'Manage all submissions';
+$string['all_submissions_manager_date']   = 'Date';
 $string['answer']                         = 'respuesta';
 $string['applet']                         = 'Módulo de Aprendizaje (Applet)';
 $string['applet_blocked']                 = 'No es posible ejecutar este iMA, porque su navegador no es compatible con Applets.';

+ 1 - 0
lang/fr/iassign.php

@@ -30,6 +30,7 @@ $string['add_ilm_iassign']                = 'Ajouter iMA';
 $string['add_ilm_iassign_help']           = 'Qu\'est-ce qu\'un iMA?';
 $string['add_param']                      = 'Ajouter un nouveau paramètre';
 $string['all_submissions_manager']        = 'Manage all submissions';
+$string['all_submissions_manager_date']   = 'Date';
 $string['answer']                         = 'réponse';
 $string['applet']                         = 'Module d\'Aprentissage (Applet)';
 $string['applet']                         = 'Modules d\'Apprentissage interactifs (iMA)';

+ 2 - 0
lang/pt_br/iassign.php

@@ -30,6 +30,8 @@ $string['add_ilm_iassign']                = 'Adicionar iMA';
 $string['add_ilm_iassign_help']           = 'O que é um iLM';
 $string['add_param']                      = 'Adicionar novo parâmetro';
 $string['all_submissions_manager']        = 'Gerenciar todas as submissões';
+$string['all_submissions_manager_confirm'] = 'Você tem certeza que deseja excluir?';
+$string['all_submissions_manager_date']   = 'Data';
 $string['answer']                         = 'resposta';
 $string['applet']                         = 'Módulo de Aprendizagem (Applet)';
 $string['applet_blocked']                 = 'Não é possível exibir o iMA, pois seu navegador não permite a execução de Applets.';

+ 332 - 10
locallib.php

@@ -306,6 +306,10 @@ class iassign {
       'move_activity' => '$this->move_activity();',
       'auto_evaluate' => '$this->auto_evaluate();',
       'all_submissions' => '$this->all_submissions();',
+      'delete_submissions' => '$this->delete_submissions();',
+      'download_submissions' => '$this->download_submissions();',
+      'open_individual_submission' => '$this->open_individual_submission();',
+      'get_individual_submission' => '$this->get_individual_submission();',
       'get_student_submission' => '$this->get_student_submission();',
       'get_teacher_exercise' => '$this->get_teacher_exercise();',
       'post_auto_eval_result' => '$this->post_auto_eval_result();'
@@ -393,6 +397,196 @@ class iassign {
 
   }
 
+
+  /// Function to help download all_submissions files
+  function download_submissions_help ($list) {
+    global $DB, $CFG, $OUTPUT;
+
+    
+    // Get list of iLMs
+    $ilm_list = $DB->get_records("iassign_ilm");
+
+    // Get list of enrolled students:
+    $params = array('shortname' => 'student');
+    $role = $DB->get_record_sql("SELECT s.id, s.shortname FROM {role} s WHERE s.shortname = :shortname", $params);
+    $context = context_course::instance($this->course->id);
+    $params = array('contextid' => $context->id, 'roleid' => $role->id);
+    $students_list = $DB->get_records_sql(
+        "SELECT s.userid, a.firstname, a.lastname FROM {role_assignments} s, {user} a " .  " WHERE s.contextid = :contextid AND s.userid = a.id AND s.roleid = :roleid " . " ORDER BY a.firstname ASC,a.lastname ASC", $params);
+    
+    $json_obj = new stdclass();
+    $json_obj->submissions = [];
+
+    $exercise_dir = [];
+    $exercises_list = []; 
+    foreach ($list as $item) {
+      
+      if (!in_array($item->iassign_statementid, $exercise_dir)) {
+        $temp = $DB->get_record("iassign_statement", array("id" => $item->iassign_statementid));
+        $exercises_list[] = $temp;
+        $exercise_dir[] = $temp->id;
+      }
+    }
+
+    $student_dir = [];
+    $students_list = [];
+    foreach ($list as $item) {
+      
+      if (!in_array($item->userid, $student_dir)) {
+        $temp = $DB->get_record("user", array("id" => $item->userid));
+        $students_list[] = $temp;
+        $student_dir[] = $temp->id;
+      }
+    }
+
+    $diretorio = $CFG->dataroot . DIRECTORY_SEPARATOR . 'temp' . DIRECTORY_SEPARATOR . 'files' . DIRECTORY_SEPARATOR;
+    
+    $zip_filename = $diretorio . 'package_iassign_'.time().'.zip';
+
+    $zip = new zip_archive(); // create ZIP
+    $zip->open($zip_filename);
+
+    foreach($exercises_list as $exercise) {
+      $dir_ex = iassign_utils::format_filename($exercise->name);
+
+      $zip->add_directory(
+        $dir_ex
+      );
+
+      $extension_ilm = '';
+      foreach ($ilm_list as $ilm) {
+        if ($exercise->iassign_ilmid == $ilm->id) {
+          $extension_ilm = $ilm->extension;
+          break;
+        }
+      }
+
+      foreach ($students_list as $student) {
+        $individual_dir = 
+          $dir_ex . DIRECTORY_SEPARATOR .
+          iassign_utils::format_filename($student->firstname . ' ' . $student->lastname);
+        
+        $zip->add_directory(
+          $individual_dir
+        );
+
+        $i = 1;
+        foreach($list as $item) {
+          if ($item->userid == $student->id 
+             && $item->iassign_statementid == $exercise->id) {
+
+              $date = new DateTime();
+              $date->setTimestamp($item->timecreated);
+              
+              $new_file = $individual_dir . DIRECTORY_SEPARATOR . iassign_utils::format_filename('submission_' . ($i++) . '_' . date_format($date, 'Y-m-d_H-i-s') . '.' . $extension_ilm);
+              $zip->add_file_from_string($new_file, $item->answer);
+
+              $temp_json = new stdclass();
+              $temp_json->submissionid = intval($item->id);
+              $temp_json->file = $new_file;
+              $temp_json->filesize = strlen($new_file);
+              $temp_json->timestamp = intval($item->timecreated);
+              $temp_json->humandate = date_format($date, 'Y-m-d H-i-s');
+              $temp_json->grade = doubleval($item->grade);
+              $temp_json->userid = intval($item->userid);
+              $temp_json->exerciseid = intval($exercise->id);
+
+              $json_obj->submissions[] = $temp_json;
+             }
+        }
+
+      }
+      
+    }
+
+    $zip->add_file_from_string('index.json', json_encode($json_obj, JSON_PRETTY_PRINT));
+
+    $zip->close();
+    iassign_utils::download_file($zip_filename);
+    exit;
+  }
+
+  /// Download submissions from table iassign_allsubmissions
+  function download_submissions () {
+    global $COURSE, $CFG, $USER, $DB, $OUTPUT, $PAGE;
+    
+    if (!has_capability('mod/iassign:runautoevaluate', $this->context, $USER->id))
+      exit;
+    
+    $type = optional_param('type', NULL, PARAM_TEXT);
+    $item = optional_param('item', NULL, PARAM_TEXT);
+    $exercise = optional_param('exercise', NULL, PARAM_TEXT);
+    $iassign_id = optional_param('iassign', NULL, PARAM_TEXT);
+
+    $sub_list = [];
+
+    if ($type == 'individual') {
+      $sub_list[] = $DB->get_record(
+        'iassign_allsubmissions', array('id' => $item));
+    } elseif ($type == 'student') {
+      $sub_list = $DB->get_records(
+          'iassign_allsubmissions', array('userid' => $item, 'iassign_statementid' => $exercise));
+    } elseif ($type == 'exercise') {
+      $sub_list = $DB->get_records(
+        'iassign_allsubmissions', array('iassign_statementid' => $item));
+    } elseif ($type == 'block') {
+      $exercises_in_block = $DB->get_records(
+        'iassign_statement', array('iassignid' => $iassign_id));
+      foreach ($exercises_in_block as $exercise) {
+        $temp = $DB->get_records(
+          'iassign_allsubmissions', array('iassign_statementid' => $exercise->id));
+        $sub_list = array_merge($sub_list, $temp);
+      }
+    }
+    $this->download_submissions_help($sub_list);
+  }
+
+  /// Delete submissions in table iassign_allsubmissions
+  function delete_submissions () {
+    global $COURSE, $CFG, $USER, $DB, $OUTPUT, $PAGE;
+    
+    if (!has_capability('mod/iassign:runautoevaluate', $this->context, $USER->id))
+      exit;
+    
+    $type = optional_param('type', NULL, PARAM_TEXT);
+    $item = optional_param('item', NULL, PARAM_TEXT);
+    $exercise = optional_param('exercise', NULL, PARAM_TEXT);
+
+    if ($type == 'individual') {
+      $DB->delete_records('iassign_allsubmissions', array('id' => $item));
+    } elseif ($type == 'student') {
+      $DB->delete_records('iassign_allsubmissions', array('userid' => $item, 'iassign_statementid' => $exercise));
+    } elseif ($type == 'exercise') {
+      $DB->delete_records('iassign_allsubmissions', array('iassign_statementid' => $item));
+    }
+  }
+
+  function get_individual_submission () {
+    global $DB, $USER;
+
+    if (!has_capability('mod/iassign:runautoevaluate', $this->context, $USER->id))
+      exit;
+    
+    $submissionid = optional_param('submissionid', NULL, PARAM_TEXT);
+    $submission = $DB->get_record("iassign_allsubmissions", array("id" => $submissionid));
+    print $submission->answer;
+  }
+
+  /// Open individual submission
+  function open_individual_submission () {
+    global $DB, $USER, $CFG;
+
+    if (!has_capability('mod/iassign:runautoevaluate', $this->context, $USER->id))
+      exit;
+
+    $submissionid = optional_param('item', NULL, PARAM_TEXT);
+    $id = $this->cm->id;
+    $param_aux = "id=" . $id . "&userid_iassign=" . $USER->id;
+    $url = "" . $CFG->wwwroot . "/mod/iassign/view.php?action=get_individual_submission&" . $param_aux . "&submissionid=" . $submissionid;
+
+    print ilm_settings::build_ilm_tags(1, ['type' => "view", 'Proposition' => $url]);
+  }
+
   /// Manage all submissions in exercises to table iassign_allsubmissions
   function all_submissions () {
     global $COURSE, $CFG, $USER, $DB, $OUTPUT, $PAGE;
@@ -402,12 +596,81 @@ class iassign {
     
     print $OUTPUT->header();
 
-    print '<h2>' . get_string('all_submissions_manager', 'iassign') . '</h2>';
+    $id = $this->cm->id;
+    $param_aux = "id=" . $id . "&userid_iassign=" . $USER->id;
+    $enderecoPOST = "" . $CFG->wwwroot . "/mod/iassign/view.php?" . $param_aux;
+
+    print '
+    <div class="modal" id="modalConfirm" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
+      <div class="modal-dialog modal-dialog-centered" role="document">
+        <div class="modal-content">
+          <div class="modal-header">
+            <h5 class="modal-title" id="exampleModalLongTitle">'.get_string('delete', 'iassign').'</h5>
+            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+              <span aria-hidden="true">&times;</span>
+            </button>
+          </div>
+          <div class="modal-body">'
+        . get_string('all_submissions_manager_confirm', 'iassign')    
+        . '</div>
+          <div class="modal-footer">
+            <button type="button" onclick="confirm_delete()" class="btn btn-primary">'.get_string('confirm', 'iassign').'</button>
+            <button type="button" class="btn btn-secondary" data-dismiss="modal">'.get_string('cancel', 'iassign').'</button>
+          </div>
+        </div>
+      </div>
+    </div>';
+
+    print '
+        <script>
+          var sub_type;
+          var sub_item;
+          var sub_el;
+          var sub_exercise;
+
+          function delete_submission (type, item, el, exercise = 0) {
+            sub_type = type;
+            sub_item = item;
+            sub_exercise = exercise;
+            sub_el = el.closest("tr");
+            if (!sub_el) sub_el = el.closest("a");
+            $("#modalConfirm").modal();
+          }
+          function confirm_delete () {
+            var url = "'.$enderecoPOST.'&action=delete_submissions";
+            var xhttp = new XMLHttpRequest();
+            xhttp.open("GET", url + "&type=" + sub_type + "&item=" + sub_item + "&exercise=" + sub_exercise, true);
+            xhttp.send();
+
+            $("#modalConfirm").modal("hide");
+            if ($(sub_el).attr("href"))
+              $($(sub_el).attr("href")).remove();
+            if (sub_el) sub_el.remove();
+          }
+          function download_submission(type, item, exercise = 0, iassign = 0) {
+            var url = "'.$enderecoPOST.'&action=download_submissions";
+            url += "&type=" + type + "&item=" + item + "&exercise=" + exercise + "&iassign=" + iassign;
+            document.location = url;
+          }
+          function open_submission(item) {
+            var url = "'.$enderecoPOST.'&action=open_individual_submission&item=" + item;
+            var poupup = window.open(
+              url, 
+              "popup",
+              "width=900,height=900");
+
+          }
+        </script>';
 
     // Get list of exercises in the instance:
     $iassignid = optional_param('iassignid', NULL, PARAM_TEXT);
     $exercises_list = $DB->get_records("iassign_statement", array("iassignid" => $iassignid));
 
+    
+
+    print '<h2>' . get_string('all_submissions_manager', 'iassign') . '';
+    print '<i onclick="download_submission(\'block\', 0, 0, '.$iassignid.')" class="fa fa-download" style="float: right; color: #1fa67a; font-size: 1.5rem; cursor: pointer; margin-left: 1rem; margin-top: .2rem;" aria-hidden="true"></i> </h2>';
+
     // Get list of enrolled students:
     $params = array('shortname' => 'student');
     $role = $DB->get_record_sql("SELECT s.id, s.shortname FROM {role} s WHERE s.shortname = :shortname", $params);
@@ -418,20 +681,79 @@ class iassign {
 
     print '<div class="list-group list-group-root">';
     foreach ($exercises_list as $exercise) {
+
+      $submissions_list = $DB->get_records("iassign_allsubmissions", array("iassign_statementid" => $exercise->id));
       
+      $iassign_ilm = $DB->get_record("iassign_ilm", array("id" => $exercise->iassign_ilmid));
+
       print '
-        <a href="#item-'.$exercise->id.'" class="list-group-item list-group-item-action" data-toggle="collapse" onclick=\'$(".fa", this).toggleClass("fa-caret-right").toggleClass("fa-caret-down");\' > <i class="fa fa-caret-right"></i> ' . $exercise->name . '</a>';
+        <a href="#item-'.$exercise->id.'" class="list-group-item list-group-item-action h4" data-toggle="collapse" onclick=\'$(".fa-caret-right, .fa-caret-down", this).toggleClass("fa-caret-right").toggleClass("fa-caret-down");\' > <i class="fa fa-caret-right"></i> ' 
+          . $exercise->name 
+          . ' - ' . $iassign_ilm->name
+          . '<i class="fa fa-times" onclick="event.stopPropagation(); delete_submission(\'exercise\', '
+          . $exercise->id .', this)" style="color:#C62828; cursor: pointer; font-size: 1.5rem; float: right; margin-left: .5rem;" aria-hidden="true"></i>'
+
+          . '<i onclick="event.stopPropagation(); download_submission(\'exercise\', '
+          . $exercise->id .')" class="fa fa-download" style="float: right; color: #1fa67a; font-size: 1.2rem; cursor: pointer; margin-left: 1rem; margin-top: .2rem;" aria-hidden="true"></i> '
+
+          . '<span class="badge badge-primary badge-pill" style="float: right;">' . count($submissions_list) . '</span>'
+          . '</a>';
 
-      print '<div class="list-group collapse" id="item-'.$exercise->id.'">';
+      print '<div class="list-group collapse p-x-2 p-b-1" id="item-'.$exercise->id.'">';
 
       foreach ($students_list as $student) {
 
-        print '<a href="#item-'.$exercise->id.'-'.$student->userid.'" class="list-group-item list-group-item-action" data-toggle="collapse" onclick=\'$(".fa", this).toggleClass("fa-caret-right").toggleClass("fa-caret-down");\'>
-              <i class="fa fa-caret-right"></i> ' . $student->firstname . ' ' . $student->lastname . ' </a>';
+        $total = 0;
+        $student_submissions = [];
+        foreach ($submissions_list as $submission) {
+          if ($submission->userid == $student->userid) {
+            $student_submissions[] = $submission;
+            $total ++;
+          }
+        }
+
+        print '<a href="#item-'.$exercise->id.'-'.$student->userid.'" class="list-group-item list-group-item-action" data-toggle="collapse" onclick=\'$(".fa-caret-right, .fa-caret-down", this).toggleClass("fa-caret-right").toggleClass("fa-caret-down");\'>
+              <i class="fa fa-caret-right"></i> ' . $student->firstname . ' ' . $student->lastname 
+              
+              . '<i class="fa fa-times" onclick="event.stopPropagation(); delete_submission(\'student\', '
+              . $student->userid .', this, '.$exercise->id.')" style="color:#C62828; cursor: pointer; font-size: 1.5rem; float: right; margin-left: .5rem;" aria-hidden="true"></i>'
+
+              . '<i onclick="event.stopPropagation(); download_submission(\'student\', '.$student->userid.', '.$exercise->id.')" class="fa fa-download" style="float: right; color: #1fa67a; font-size: 1.3rem; cursor: pointer; margin-left: 1rem; margin-top: .1rem;" aria-hidden="true"></i> '
 
-        print '<div class="list-group collapse" id="item-'.$exercise->id.'-'.$student->userid.'">';
+              . '<span class="badge badge-primary badge-pill" style="float: right;">' . $total . '</span>'
+              . ' </a>';
+
+        print '<div class="list-group collapse" style="padding-left: 5rem;padding-right: 5rem;" id="item-'.$exercise->id.'-'.$student->userid.'">';
+
+        print '<table class="table table-striped table-hover"><thead>
+                <tr>
+                  <th scope="col">#</th>
+                  <th scope="col">'.get_string('all_submissions_manager_date', 'iassign').'</th>
+                  <th scope="col">'.get_string('grade_student', 'iassign').'</th>
+                  <th scope="col">'.get_string('config_param_actions', 'iassign').'</th>
+                </tr>
+              </thead><tbody>';
         
-        print '<a href="#" class="list-group-item list-group-item-action">Item 1.1.1</a>';
+        $i = 1;
+        foreach ($student_submissions as $individual) {
+          $date = new DateTime();
+          $date->setTimestamp($individual->timecreated);
+          print '<tr>';
+          print '<td>'.$i++.'</td>';
+          print '<td>'.date_format($date, 'd/m/Y H:i:s').'</td>';
+          print '<td>'.$individual->grade.'</td>';
+          print '<td>
+            <i onclick="open_submission('.$individual->id.')" class="fa fa-external-link" style="color:#1177d1; cursor: pointer; font-size: 1.2rem; margin-right: .5rem;" aria-hidden="true"></i>
+          
+            <i onclick="download_submission(\'individual\', '.$individual->id.')" class="fa fa-download" style="color: #1fa67a; font-size: 1.2rem; cursor: pointer; margin-right: .5rem;" aria-hidden="true"></i> 
+            
+            <i class="fa fa-times" onclick="delete_submission(\'individual\', '.$individual->id.', this)" style="color:#C62828; cursor: pointer; font-size: 1.5rem; " aria-hidden="true"></i></td>';
+          print '</tr>';
+        }
+
+        print '</tbody></table>';
+        
+        //print '<a href="#" class="list-group-item list-group-item-action">Item 1.1.1</a>';
 
         print '</div>';
 
@@ -1994,10 +2316,10 @@ class iassign {
         
         $link_all_submissions_manager = "<a href='" . $CFG->wwwroot . "/mod/iassign/view.php?id=" . $id . "&action=all_submissions&iassignid=" . $this->iassign->id . "'><i class='fa fa-files-o' aria-hidden='true' style='color: red'></i>&nbsp;" . get_string('all_submissions_manager', 'iassign') . "</a>";
         
-        print '<td width=15% align="right">' . $link_stats . '</td>' . "\n";
-        print '<td width=15% align="right">' . $link_export . '</td>' . "\n";
+        print '<td width=10% align="right">' . $link_stats . '</td>' . "\n";
+        print '<td width=10% align="right">' . $link_export . '</td>' . "\n";
         print '<td width=15% align="right">' . $link_auto_evaluate . '</td>' . "\n";
-        print '<td width=15% align="right">' . $link_all_submissions_manager . '</td>' . "\n";
+        print '<td width=16% align="right">' . $link_all_submissions_manager . '</td>' . "\n";
         print '<td width=15% align="right">' . $link_print . '</td>' . "\n";
         } // if ($this->action != 'print')
       print '</tr></table>' . "\n";