Merge branch 'MDL-66496-master' of git://github.com/tobiasreischmann/moodle
authorAndrew Nicols <andrew@nicols.co.uk>
Thu, 17 Oct 2019 03:05:34 +0000 (11:05 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Thu, 17 Oct 2019 03:05:34 +0000 (11:05 +0800)
1  2 
mod/data/lib.php

diff --combined mod/data/lib.php
@@@ -973,16 -973,17 +973,17 @@@ function data_numentries($data, $userid
   * @global object
   * @param object $data
   * @param int $groupid
+  * @param int $userid
   * @return bool
   */
- function data_add_record($data, $groupid=0){
+ function data_add_record($data, $groupid=0, $userid=null) {
      global $USER, $DB;
  
      $cm = get_coursemodule_from_instance('data', $data->id);
      $context = context_module::instance($cm->id);
  
      $record = new stdClass();
-     $record->userid = $USER->id;
+     $record->userid = $userid ?? $USER->id;
      $record->dataid = $data->id;
      $record->groupid = $groupid;
      $record->timecreated = $record->timemodified = time();
@@@ -1444,7 -1445,7 +1445,7 @@@ function data_print_template($template
              $checkbox = new \core\output\checkbox_toggleall('listview-entries', false, [
                  'id' => "entry_{$record->id}",
                  'name' => 'delcheck[]',
 -                'class' => 'recordcheckbox',
 +                'classes' => 'recordcheckbox',
                  'value' => $record->id,
              ]);
              $replacement[] = $OUTPUT->render($checkbox);
@@@ -3044,6 -3045,135 +3045,135 @@@ function data_supports($feature) 
          default: return null;
      }
  }
+ /**
+  * Import records for a data instance from csv data.
+  *
+  * @param object $cm Course module of the data instance.
+  * @param object $data The data instance.
+  * @param string $csvdata The csv data to be imported.
+  * @param string $encoding The encoding of csv data.
+  * @param string $fielddelimiter The delimiter of the csv data.
+  * @return int Number of records added.
+  */
+ function data_import_csv($cm, $data, &$csvdata, $encoding, $fielddelimiter) {
+     global $CFG, $DB;
+     // Large files are likely to take their time and memory. Let PHP know
+     // that we'll take longer, and that the process should be recycled soon
+     // to free up memory.
+     core_php_time_limit::raise();
+     raise_memory_limit(MEMORY_EXTRA);
+     $iid = csv_import_reader::get_new_iid('moddata');
+     $cir = new csv_import_reader($iid, 'moddata');
+     $context = context_module::instance($cm->id);
+     $readcount = $cir->load_csv_content($csvdata, $encoding, $fielddelimiter);
+     $csvdata = null; // Free memory.
+     if (empty($readcount)) {
+         print_error('csvfailed', 'data', "{$CFG->wwwroot}/mod/data/edit.php?d={$data->id}");
+     } else {
+         if (!$fieldnames = $cir->get_columns()) {
+             print_error('cannotreadtmpfile', 'error');
+         }
+         // Check the fieldnames are valid.
+         $rawfields = $DB->get_records('data_fields', array('dataid' => $data->id), '', 'name, id, type');
+         $fields = array();
+         $errorfield = '';
+         $usernamestring = get_string('username');
+         $safetoskipfields = array(get_string('user'), get_string('email'),
+             get_string('timeadded', 'data'), get_string('timemodified', 'data'),
+             get_string('approved', 'data'), get_string('tags', 'data'));
+         $userfieldid = null;
+         foreach ($fieldnames as $id => $name) {
+             if (!isset($rawfields[$name])) {
+                 if ($name == $usernamestring) {
+                     $userfieldid = $id;
+                 } else if (!in_array($name, $safetoskipfields)) {
+                     $errorfield .= "'$name' ";
+                 }
+             } else {
+                 // If this is the second time, a field with this name comes up, it must be a field not provided by the user...
+                 // like the username.
+                 if (isset($fields[$name])) {
+                     if ($name == $usernamestring) {
+                         $userfieldid = $id;
+                     }
+                     unset($fieldnames[$id]); // To ensure the user provided content fields remain in the array once flipped.
+                 } else {
+                     $field = $rawfields[$name];
+                     require_once("$CFG->dirroot/mod/data/field/$field->type/field.class.php");
+                     $classname = 'data_field_' . $field->type;
+                     $fields[$name] = new $classname($field, $data, $cm);
+                 }
+             }
+         }
+         if (!empty($errorfield)) {
+             print_error('fieldnotmatched', 'data',
+                 "{$CFG->wwwroot}/mod/data/edit.php?d={$data->id}", $errorfield);
+         }
+         $fieldnames = array_flip($fieldnames);
+         $cir->init();
+         $recordsadded = 0;
+         while ($record = $cir->next()) {
+             $authorid = null;
+             if ($userfieldid) {
+                 if (!($author = core_user::get_user_by_username($record[$userfieldid], 'id'))) {
+                     $authorid = null;
+                 } else {
+                     $authorid = $author->id;
+                 }
+             }
+             if ($recordid = data_add_record($data, 0, $authorid)) {  // Add instance to data_record.
+                 foreach ($fields as $field) {
+                     $fieldid = $fieldnames[$field->field->name];
+                     if (isset($record[$fieldid])) {
+                         $value = $record[$fieldid];
+                     } else {
+                         $value = '';
+                     }
+                     if (method_exists($field, 'update_content_import')) {
+                         $field->update_content_import($recordid, $value, 'field_' . $field->field->id);
+                     } else {
+                         $content = new stdClass();
+                         $content->fieldid = $field->field->id;
+                         $content->content = $value;
+                         $content->recordid = $recordid;
+                         $DB->insert_record('data_content', $content);
+                     }
+                 }
+                 if (core_tag_tag::is_enabled('mod_data', 'data_records') &&
+                     isset($fieldnames[get_string('tags', 'data')])) {
+                     $columnindex = $fieldnames[get_string('tags', 'data')];
+                     $rawtags = $record[$columnindex];
+                     $tags = explode(',', $rawtags);
+                     foreach ($tags as $tag) {
+                         $tag = trim($tag);
+                         if (empty($tag)) {
+                             continue;
+                         }
+                         core_tag_tag::add_item_tag('mod_data', 'data_records', $recordid, $context, $tag);
+                     }
+                 }
+                 $recordsadded++;
+                 print get_string('added', 'moodle', $recordsadded) . ". " . get_string('entry', 'data') . " (ID $recordid)<br />\n";
+             }
+         }
+         $cir->close();
+         $cir->cleanup(true);
+         return $recordsadded;
+     }
+     return 0;
+ }
  /**
   * @global object
   * @param array $export