Skip to content

Commit

Permalink
course-create default values resolve #484
Browse files Browse the repository at this point in the history
  • Loading branch information
mi7chal committed Aug 29, 2024
1 parent 3787c24 commit 4dfdad0
Showing 1 changed file with 154 additions and 46 deletions.
200 changes: 154 additions & 46 deletions Moosh/Command/Moodle39/Course/CourseCreate.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,94 +4,202 @@
*
* @copyright 2012 onwards Tomasz Muras
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @author Jakub Kleban <[email protected]>
*/

namespace Moosh\Command\Moodle39\Course;
use http\Exception\InvalidArgumentException;
use Moosh\MooshCommand;

class CourseCreate extends MooshCommand
{
public function __construct()
{
/**
* Creates Moodle course(es).
* {@code moosh hp5-core-contenttypes-export [-n, --name] [-f, --fullname] [-d, --description] [-F, --format] [-n, --numsections] [-i, --idnumber] [-v, --visible] [-r, --reuse] <shortname>}
*
* @example 1: Creates new course "my-test-course" with default moodle values.
* moosh course-create my-test-course
*
* @example 2: Creates 10 courses ("my-test-course1", "my-test-course2" etc.) with default field
* values using bash/zim expansion.
* moosh course-create my-test-course{1..10}
*
* @example 3: Creates test course with format "site" and description "Awesome course". Another field set default.
* moosh course-create -f site -d "Awesome course" my-test-course
*
* @example 4: Creates 100 courses, skips if any of them exist.
* moosh course-create -r my-test-course{1..100}
*
* @package Moosh\Command\Moodle39\Course
* @author Jakub Kleban <[email protected]>
* @author Michal Chruscielski <[email protected]>
*/
class CourseCreate extends MooshCommand {
public function __construct() {
parent::__construct('create', 'course');

$this->addOption('c|category:', 'category id');
$this->addOption('f|fullname:', 'full name');
$this->addOption('d|description:', 'description');
$this->addOption('F|format:', 'format (e.g. one of site, weeks, topics, etc.)');
$this->addOption('n|numsections:', 'number of sections (i.e. of weeks, topics, etc.)');
$this->addOption('i|idnumber:', 'id number');
$this->addOption('v|visible:', 'visible (y or n, by default created visible)');
$this->addOption('i|idnumber:', 'id number.');
$this->addOption('v|visible:', 'visible (y or n, by default creates visible)');
$this->addOption('r|reuse', 'do not create new course if it a matching one already exists', false);

$this->addArgument('shortname');

$this->maxArguments = 255;
}

public function execute()
{
public function execute() {
global $CFG;

require_once $CFG->dirroot . '/course/lib.php';

foreach ($this->arguments as $argument) {
$this->expandOptionsManually(array($argument));
$commandOptionsKeys = array('category', 'fullname', 'description', 'format', 'numsections', 'idnumber');

// get course config as stdClass
$courseConfig = get_config("moodlecourse");

if($this->verbose) {
$count = count($this->arguments);
mtrace("Attempting creation of $count courses.");
}

// runs for every argument (course)
foreach ($this->arguments as $shortName) {
// we want to extend options for every course separately in order to specify our shortName
$this->expandOptionsManually(array($shortName));
$options = $this->expandedOptions;
$course = new \stdClass();
$course->fullname = $options['fullname'];
$course->shortname = $argument;
$course->description = $options['description'];
$format = $options['format'];
if(!$format){
$format = get_config('moodlecourse', 'format');

if($this->verbose) {
mtrace("Creating course $shortName");
}

// Moodle loads default options from config and sets them, so we do.
foreach($courseConfig as $key => $value){
// Skipping if key would be overwritten
if(isset($options[$key]) && $options[$key] !== "") {
continue;
}

$course->$key = $value;

if ($this->verbose) {
mtrace("Setting default $key: $value.");
}
}

// Shortname is always defined as argument
$course->shortname = $shortName;

// Setting user chosen options
foreach ($commandOptionsKeys as $optionKey) {
// empty options are empty strings (not nulls) if they are not given
if ($options[$optionKey] === "") {
continue;
}

$course->$optionKey = $options[$optionKey];

if($this->verbose) {
mtrace("Set $optionKey to value: $options[$optionKey]");
}
}

// setting course start date time to now
$startDateTime=time();
$course->startdate = $startDateTime;

if($this->verbose) {
mtrace("Set startdate: $startDateTime (now)");
}

if(isset($courseConfig->courseduration)) {
$course->enddate = $startDateTime + $courseConfig->courseduration;

if($this->verbose) {
$endDate = $course->enddate;
mtrace("Set enddte: $endDate");
}
}
$course->format = $format;
$numsections = $options['numsections'];
if(!$numsections){
$numsections = get_config('moodlecourse', 'numsections');

try {
$courseVisible = $this->formatCourseVisible($options['visible']);
} catch (\InvalidArgumentException $e) {
cli_error("-visible option must be equal 'n' or 'y'");
// cli_error breaks execution, but exit() suppresses IDE warnings.
exit();
}
$course->numsections = $numsections;
$course->idnumber = $options['idnumber'];
$visible = strtolower($options['visible']);
if($visible == 'n' || $visible == 'no' ){
$visible = 0;
}else{
$visible = 1;

// overwriting only when value given
if($courseVisible !== null) {
$course->visible = $courseVisible;

if($this->verbose) {
mtrace("Set visible: $courseVisible");
}
}
$course->visible = $visible;
$course->category = $options['category'];

// required, setting empty/default
$course->summary = '';
$course->summaryformat = FORMAT_HTML;
$course->startdate = time();
$course->enablecompletion = true;

if ($options['reuse'] && $existing = $this->find_course($course)) {
$newcourse = $existing;
if ($options['reuse'] && $existing = $this->findCourse($course)) {
$new_course = $existing;

$name = $new_course->shortname;
$id = $new_course->id;
print("Course $name with id: $id exists. Skipping.\n");
} else {
//either use API create_course
$newcourse = create_course($course);
}
$new_course = create_course($course);

echo $newcourse->id . "\n";
$name = $new_course->shortname;
$id = $new_course->id;
print("Added course $name with id: $id\n");
}
}
}

public function find_course($course)
{
/**
* Finds first course matching given argument
* @param \stdClass $course course which we're looking for
* @return \stdClass|null found course or null
*/
public function findCourse($course) {
global $DB;

// Shortname must be unique so it's our only parameter
$params = array('shortname' => $course->shortname);
foreach (array('category', 'fullname', 'format', 'idnumber') as $param) {
if ($course->$param) {
$params[$param] = $course->$param;
}
}

$courses = $DB->get_records('course', $params);
if (count($courses) == 1) {

// want to be exception safe
if (count($courses) >= 1) {
return array_pop($courses);
} else {
return null;
}
}

/**
* returns course visible value or null if empty argument given. if `$visible` is not equal
* to "0", "1", "y", "n", "yes" or "no" throw InvalidArgumentException.
* @param string $visible argument value
* @return int|null 0, 1 is visible or null if can't determine
*/
public function formatCourseVisible($visible) {
$visible = strtolower($visible);

if($visible === 'n' || $visible === 'no' || $visible === "0" ){
return 0;
} else if($visible === 'y' || $visible === 'yes' || $visible === "1"){
return 1;
} else if(strlen($visible) > 0) {
// invalid value given
throw new InvalidArgumentException("Visible must be equal n or y.");
} else {
// no argument given, we returns null
return null;
}
}
}

0 comments on commit 4dfdad0

Please sign in to comment.