--- /dev/null
+<?php // $Id$
+
+///////////////////////////////////////////////////////////////////////////
+// //
+// NOTICE OF COPYRIGHT //
+// //
+// Moodle - Modular Object-Oriented Dynamic Learning Environment //
+// http://moodle.com //
+// //
+// Copyright (C) 2001-2003 Martin Dougiamas http://dougiamas.com //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation; either version 2 of the License, or //
+// (at your option) any later version. //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License for more details: //
+// //
+// http://www.gnu.org/copyleft/gpl.html //
+// //
+///////////////////////////////////////////////////////////////////////////
+
+require_once('grade_object.php');
+
+/**
+ * A calculation string used to compute the value displayed by a grade_item.
+ * There can be only one grade_calculation per grade_item (one-to-one).
+ */
+class grade_calculation extends grade_object
+{
+ /**
+ * The table name
+ * @var string $table
+ */
+ var $table = 'grade_calculations';
+
+ /**
+ * A reference to the grade_item this calculation belongs to.
+ * @var int $itemid
+ */
+ var $itemid;
+
+ /**
+ * The string representation of the calculation.
+ * @var string $calculation
+ */
+ var $calculation;
+
+ /**
+ * The userid of the person who last modified this calculation.
+ * @var int $usermodified
+ */
+ var $usermodified;
+
+ /**
+ * Constructor.
+ * @param object $params Object or array of variables=>values to assign to this object upon creation
+ */
+ function grade_calculation($params = null)
+ {
+
+ }
+
+
+ /**
+ * Finds and returns a grade_calculation object based on 1-3 field values.
+ *
+ * @param boolean $static Unless set to true, this method will also set $this object with the returned values.
+ * @param string $field1
+ * @param string $value1
+ * @param string $field2
+ * @param string $value2
+ * @param string $field3
+ * @param string $value3
+ * @param string $fields
+ * @return object grade_calculation object or false if none found.
+ */
+ function get_record($static=false, $field1, $value1, $field2='', $value2='', $field3='', $value3='', $fields="*")
+ {
+ // In Moodle 2.0 (PHP5) we can replace table names with the static class var grade_calculation::$table
+ if ($grade_calculation = get_record('grade_calculations', $field1, $value1, $field2, $value2, $field3, $value3, $fields)) {
+ if ($static) {
+ $grade_calculation = new grade_calculation($grade_calculation);
+ return $grade_calculation;
+ } else {
+ foreach ($grade_calculation as $param => $value) {
+ $this->$param = $value;
+ }
+ return $this;
+ }
+ } else {
+ return false;
+ }
+ }
+
+}
+?>
--- /dev/null
+<?php // $Id$
+
+///////////////////////////////////////////////////////////////////////////
+// //
+// NOTICE OF COPYRIGHT //
+// //
+// Moodle - Modular Object-Oriented Dynamic Learning Environment //
+// http://moodle.com //
+// //
+// Copyright (C) 2001-2003 Martin Dougiamas http://dougiamas.com //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation; either version 2 of the License, or //
+// (at your option) any later version. //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License for more details: //
+// //
+// http://www.gnu.org/copyleft/gpl.html //
+// //
+///////////////////////////////////////////////////////////////////////////
+
+require_once('grade_object.php');
+
+class grade_category extends grade_object
+{
+ /**
+ * The table name
+ * @var string $table
+ */
+ var $table = 'grade_categories';
+
+ /**
+ * Array of class variables that are not part of the DB table fields
+ * @var array $nonfields
+ */
+ var $nonfields = array('table', 'nonfields', 'required_fields');
+
+ /**
+ * Array of required fields (keys) and their default values (values).
+ * @var array $required_fields
+ */
+ var $required_fields = array('aggregation' => 0,
+ 'keephigh' => 0,
+ 'fullname' => null,
+ 'droplow' => 0,
+ 'hidden' => 0);
+
+ /**
+ * The course this category belongs to.
+ * @var int $courseid
+ */
+ var $courseid;
+
+ /**
+ * The category this category belongs to (optional).
+ * @var int $categoryid
+ */
+ var $categoryid;
+
+ /**
+ * The name of this category.
+ * @var string $fullname
+ */
+ var $fullname;
+
+ /**
+ * A constant pointing to one of the predefined aggregation strategies (none, mean, median, sum etc) .
+ * @var int $aggregation
+ */
+ var $aggregation;
+
+ /**
+ * Keep only the X highest items.
+ * @var int $keephigh
+ */
+ var $keephigh;
+
+ /**
+ * Drop the X lowest items.
+ * @var int $droplow
+ */
+ var $droplow;
+
+ /**
+ * Date until which to hide this category. If null, 0 or false, category is not hidden.
+ * @var int $hidden
+ */
+ var $hidden;
+
+ /**
+ * Array of grade_items or grade_categories nested exactly 1 level below this category
+ * @var array $children
+ */
+ var $children;
+
+ /**
+ * Constructor
+ * @param object $params an object with named parameters for this category.
+ */
+ function grade_category($params=NULL)
+ {
+ if (!empty($params) && (is_array($params) || is_object($params))) {
+ foreach ($params as $param => $value) {
+ if (in_object_vars($param, $this)) {
+ $this->$param = $value;
+ }
+ }
+
+ $this->set_defaults();
+ }
+ }
+
+
+ /**
+ * Finds and returns a grade_category object based on its ID number.
+ *
+ * @param int $id
+ * @param boolean $static Unless set to true, this method will also set $this object with the returned values.
+ * @return object grade_category object or false if none found.
+ */
+ function get_by_id($id, $static=false)
+ {
+ if ($static) {
+ return grade_category::get_record(true, 'id', $id);
+ } else {
+ return $this->get_record(false, 'id', $id);
+ }
+ }
+
+
+ /**
+ * Finds and returns a grade_category object based on 1-3 field values.
+ *
+ * @param boolean $static Unless set to true, this method will also set $this object with the returned values.
+ * @param string $field1
+ * @param string $value1
+ * @param string $field2
+ * @param string $value2
+ * @param string $field3
+ * @param string $value3
+ * @param string $fields
+ * @return object grade_category object or false if none found.
+ */
+ function get_record($static=false, $field1, $value1, $field2='', $value2='', $field3='', $value3='', $fields="*")
+ {
+ // In Moodle 2.0 (PHP5) we can replace table names with the static class var grade_category::$table
+ if ($grade_category = get_record('grade_categories', $field1, $value1, $field2, $value2, $field3, $value3, $fields)) {
+ if ($static) {
+ $grade_category = new grade_category($grade_category);
+ return $grade_category;
+ } else {
+ foreach ($grade_category as $param => $value) {
+ $this->$param = $value;
+ }
+ return $this;
+ }
+ } else {
+ return false;
+ }
+ }
+
+}
+
+?>
--- /dev/null
+<?php // $Id$
+
+///////////////////////////////////////////////////////////////////////////
+// //
+// NOTICE OF COPYRIGHT //
+// //
+// Moodle - Modular Object-Oriented Dynamic Learning Environment //
+// http://moodle.com //
+// //
+// Copyright (C) 2001-2003 Martin Dougiamas http://dougiamas.com //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation; either version 2 of the License, or //
+// (at your option) any later version. //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License for more details: //
+// //
+// http://www.gnu.org/copyleft/gpl.html //
+// //
+///////////////////////////////////////////////////////////////////////////
+
+require_once('grade_object.php');
+
+/**
+ * Class representing a grade item. It is responsible for handling its DB representation,
+ * modifying and returning its metadata.
+ */
+class grade_item extends grade_object
+{
+ /**
+ * The table name
+ * @var string $table
+ */
+ var $table = 'grade_items';
+
+ /**
+ * Array of class variables that are not part of the DB table fields
+ * @var array $nonfields
+ */
+ var $nonfields = array('table', 'nonfields', 'required_fields', 'calculation');
+
+ /**
+ * Array of required fields (keys) and their default values (values).
+ * @var array $required_fields
+ */
+ var $required_fields = array('gradetype' => 0,
+ 'grademax' => 100.00000,
+ 'grademin' => 0.00000,
+ 'gradepass' => 0.00000,
+ 'multfactor' => 1.00000,
+ 'plusfactor' => 0.00000,
+ 'sortorder' => 0,
+ 'hidden' => 0,
+ 'locked' => 0,
+ 'needsupdate' => 0);
+
+ /**
+ * The course this grade_item belongs to.
+ * @var int $courseid
+ */
+ var $courseid;
+
+ /**
+ * The category this grade_item belongs to (optional).
+ * @var int $categoryid
+ */
+ var $categoryid;
+
+ /**
+ * The name of this grade_item (pushed by the module).
+ * @var string $itemname
+ */
+ var $itemname;
+
+ /**
+ * e.g. 'mod', 'blocks', 'import', 'calculate' etc...
+ * @var string $itemtype
+ */
+ var $itemtype;
+
+ /**
+ * The module pushing this grade (e.g. 'forum', 'quiz', 'assignment' etc).
+ * @var string $itemmodule
+ */
+ var $itemmodule;
+
+ /**
+ * ID of the item module
+ * @var int $iteminstance
+ */
+ var $iteminstance;
+
+ /**
+ * Number of the item in a series of multiple grades pushed by an activity.
+ * @var int $itemnumber
+ */
+ var $itemnumber;
+
+ /**
+ * Info and notes about this item.
+ * @var string $iteminfo
+ */
+ var $iteminfo;
+
+ /**
+ * The type of grade (0 = value, 1 = scale, 2 = text)
+ * @var int $gradetype
+ */
+ var $gradetype;
+
+ /**
+ * Maximum allowable grade.
+ * @var float $grademax
+ */
+ var $grademax;
+
+ /**
+ * Minimum allowable grade.
+ * @var float $grademin
+ */
+ var $grademin;
+
+ /**
+ * The scale this grade is based on, if applicable.
+ * @var object $scale
+ */
+ var $scale;
+
+ /**
+ * The Outcome this grade is associated with, if applicable.
+ * @var object $outcome
+ */
+ var $outcome;
+
+ /**
+ * grade required to pass. (grademin < gradepass <= grademax)
+ * @var float $gradepass
+ */
+ var $gradepass;
+
+ /**
+ * Multiply all grades by this number.
+ * @var float $multfactor
+ */
+ var $multfactor;
+
+ /**
+ * Add this to all grades.
+ * @var float $plusfactor
+ */
+ var $plusfactor;
+
+ /**
+ * Sorting order of the columns.
+ * @var int $sortorder
+ */
+ var $sortorder;
+
+ /**
+ * Date until which to hide this grade_item. If null, 0 or false, grade_item is not hidden. Hiding prevents viewing.
+ * @var int $hidden
+ */
+ var $hidden;
+
+ /**
+ * Date until which to lock this grade_item. If null, 0 or false, grade_item is not locked. Locking prevents updating.
+ * @var int $locked
+ */
+ var $locked;
+
+ /**
+ * If set, the whole column will be recalculated, then this flag will be switched off.
+ * @var boolean $needsupdate
+ */
+ var $needsupdate;
+
+ /**
+ * Calculation string used for this item.
+ * @var string $calculation
+ */
+ var $calculation;
+
+ /**
+ * Constructor
+ * @param object $params an object with named parameters for this grade item.
+ */
+ function grade_item($params=NULL)
+ {
+ if (!empty($params) && (is_array($params) || is_object($params))) {
+ foreach ($params as $param => $value) {
+ if (in_object_vars($param, $this)) {
+ $this->$param = $value;
+ }
+ }
+ $this->set_defaults();
+ }
+ }
+
+
+ /**
+ * Finds and returns a grade_item object based on its ID number.
+ *
+ * @param int $id
+ * @param boolean $static Unless set to true, this method will also set $this object with the returned values.
+ * @return object grade_item object or false if none found.
+ */
+ function get_by_id($id, $static=false)
+ {
+ if ($static) {
+ return grade_item::get_record(true, 'id', $id);
+ } else {
+ return $this->get_record(false, 'id', $id);
+ }
+ }
+
+
+ /**
+ * Finds and returns a grade_item object based on 1-3 field values.
+ *
+ * @param boolean $static Unless set to true, this method will also set $this object with the returned values.
+ * @param string $field1
+ * @param string $value1
+ * @param string $field2
+ * @param string $value2
+ * @param string $field3
+ * @param string $value3
+ * @param string $fields
+ * @return object grade_item object or false if none found.
+ */
+ function get_record($static=false, $field1, $value1, $field2='', $value2='', $field3='', $value3='', $fields="*")
+ {
+ // In Moodle 2.0 (PHP5) we can replace table names with the static class var grade_item::$table
+ if ($grade_item = get_record('grade_items', $field1, $value1, $field2, $value2, $field3, $value3, $fields)) {
+ if ($static) {
+ $grade_item = new grade_item($grade_item);
+ return $grade_item;
+ } else {
+ foreach ($grade_item as $param => $value) {
+ $this->$param = $value;
+ }
+ return $this;
+ }
+ } else {
+ return false;
+ }
+ }
+
+
+ /**
+ * Returns the raw value for this grade item (as imported by module or other source).
+ *
+ * @return mixed grades_Raw object if found, or false.
+ */
+ function get_raw()
+ {
+ $grade_raw = get_record('grade_grades_raw', 'itemid', $this->id);
+ return $grade_raw;
+ }
+
+ /**
+ * Returns the final value for this grade item.
+ *
+ * @return mixed grades_Final object if found, or false.
+ */
+ function get_final()
+ {
+ $grade_final = get_record('grade_grades_final', 'itemid', $this->id);
+ return $grade_final;
+ }
+
+ /**
+ * Returns this object's calculation.
+ * @param boolean $fetch Whether to fetch the value from the DB or not (false == just use the object's value)
+ * @return mixed $calculation A string if found, false otherwise.
+ */
+ function get_calculation($fetch = false)
+ {
+ if (!$fetch) {
+ return $this->calculation;
+ }
+
+ $grade_calculation = grade_calculation::get_record(true, 'itemid', $this->id);
+
+ if (empty($grade_calculation)) { // There is no calculation in DB
+ return false;
+ } elseif ($grade_calculation->calculation != $this->calculation->calculation) { // The object's calculation is not in sync with the DB (new value??)
+ $this->calculation = $grade_calculation;
+ return $grade_calculation;
+ } else { // The object's calculation is already in sync with the database
+ return $this->calculation;
+ }
+ }
+
+ /**
+ * Sets this item's calculation (creates it) if not yet set, or
+ * updates it if already set (in the DB). If no calculation is given,
+ * the method will attempt to retrieve one from the Database, based on
+ * the variables set in the current object.
+ * @param string $calculation
+ * @return boolean
+ */
+ function set_calculation($calculation = null)
+ {
+ if (empty($calculation)) { // We are setting this item object's calculation variable from the DB
+ $grade_calculation = $this->get_calculation(true);
+ if (empty($grade_calculation)) {
+ return false;
+ } else {
+ $this->calculation = $grade_calculation;
+ }
+ } else { // We are updating or creating the calculation entry in the DB
+ $grade_calculation = $this->get_calculation();
+
+ if (empty($grade_calculation)) { // Creating
+ $grade_calculation = new grade_calculation();
+ $grade_calculation->calculation = $calculation;
+ $grade_calculation->itemid = $this->id;
+
+ if ($grade_calculation->insert()) {
+ $this->calculation = $grade_calculation;
+ return true;
+ } else {
+ return false;
+ }
+ } else { // Updating
+ $grade_calculation->calculation = $calculation;
+ $this->calculation = $grade_calculation;
+ return $grade_calculation->update();
+ }
+ }
+ }
+
+ /**
+ * Returns the grade_category object this grade_item belongs to (if any).
+ *
+ * @return mixed grade_category object if applicable, NULL otherwise
+ */
+ function get_category()
+ {
+ if (!empty($this->categoryid)) {
+ $grade_category = new grade_category($this->category_id);
+ return $grade_category;
+ } else {
+ return null;
+ }
+ }
+}
+?>
--- /dev/null
+<?php // $Id$
+
+///////////////////////////////////////////////////////////////////////////
+// //
+// NOTICE OF COPYRIGHT //
+// //
+// Moodle - Modular Object-Oriented Dynamic Learning Environment //
+// http://moodle.com //
+// //
+// Copyright (C) 2001-2003 Martin Dougiamas http://dougiamas.com //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation; either version 2 of the License, or //
+// (at your option) any later version. //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License for more details: //
+// //
+// http://www.gnu.org/copyleft/gpl.html //
+// //
+///////////////////////////////////////////////////////////////////////////
+
+/**
+ * An abstract object that holds methods and attributes common to all grade_* objects defined here.
+ * @abstract
+ */
+class grade_object
+{
+ /**
+ * The table name
+ * @var string $table
+ */
+ var $table = null;
+
+ /**
+ * Array of class variables that are not part of the DB table fields
+ * @var array $nonfields
+ */
+ var $nonfields = array('table', 'nonfields', 'required_fields');
+
+ /**
+ * Array of required fields (keys) and their default values (values).
+ * @var array $required_fields
+ */
+ var $required_fields = array();
+
+ /**
+ * The PK.
+ * @var int $id
+ */
+ var $id;
+
+ /**
+ * The first time this grade_calculation was created.
+ * @var int $timecreated
+ */
+ var $timecreated;
+
+ /**
+ * The last time this grade_calculation was modified.
+ * @var int $timemodified
+ */
+ var $timemodified;
+
+ /**
+ * Finds and returns a grade_object based on its ID number.
+ *
+ * @abstract
+ * @param int $id
+ * @param boolean $static Unless set to true, this method will also set $this object with the returned values.
+ * @return object grade_object or false if none found.
+ */
+ function get_by_id($id, $static=false)
+ {
+ // Implemented in child objects
+ }
+
+
+ /**
+ * Finds and returns a grade_object based on 1-3 field values.
+ *
+ * @param boolean $static Unless set to true, this method will also set $this object with the returned values.
+ * @param string $field1
+ * @param string $value1
+ * @param string $field2
+ * @param string $value2
+ * @param string $field3
+ * @param string $value3
+ * @param string $fields
+ * @return object grade_object or false if none found.
+ */
+ function get_record($static=false, $field1, $value1, $field2='', $value2='', $field3='', $value3='', $fields="*")
+ {
+ // Implemented in child objects
+ }
+
+ /**
+ * Updates this object in the Database, based on its object variables. ID must be set.
+ *
+ * @return boolean
+ */
+ function update()
+ {
+ $this->set_defaults();
+ $result = update_record($this->table, $this);
+ if ($result) {
+ $this->timemodified = mktime();
+ }
+ return $result;
+ }
+
+ /**
+ * Deletes this object from the database.
+ */
+ function delete()
+ {
+ return delete_records($this->table, 'id', $this->id);
+ }
+
+ /**
+ * Replaces NULL values with defaults defined in the DB, for required fields.
+ * This should use the DB table METADATA, but to start with I am hard-coding it.
+ *
+ * @return void
+ */
+ function set_defaults()
+ {
+ foreach ($this->required_fields as $field => $default) {
+ if (is_null($this->$field)) {
+ $this->$field = $default;
+ }
+ }
+ }
+
+ /**
+ * Records this object in the Database, sets its id to the returned value, and returns that value.
+ * @return int PK ID if successful, false otherwise
+ */
+ function insert()
+ {
+ $this->set_defaults();
+ $this->set_timecreated();
+ $this->id = insert_record($this->table, $this, true);
+ return $this->id;
+ }
+
+ /**
+ * Uses the variables of this object to retrieve all matching objects from the DB.
+ * @return array $objects
+ */
+ function get_records_select()
+ {
+ $variables = get_object_vars($this);
+ $wheresql = '';
+
+ foreach ($variables as $var => $value) {
+ if (!empty($value) && !in_array($var, $this->nonfields)) {
+ $wheresql .= " $var = '$value' AND ";
+ }
+ }
+
+ // Trim trailing AND
+ $wheresql = substr($wheresql, 0, strrpos($wheresql, 'AND'));
+
+ return get_records_select($this->table, $wheresql, 'id');
+ }
+
+ /**
+ * If this object hasn't yet been saved in DB (empty $id), this method sets the timecreated variable
+ * to the current or given time. If a value is already set in DB,
+ * this method will do nothing, unless the $override parameter is set to true. This is to avoid
+ * unintentional overwrites.
+ *
+ * @param int $timestamp Optional timestamp to override current timestamp.
+ * @param boolean $override Whether to override an existing value for this field in the DB.
+ * @return boolean True if successful, false otherwise.
+ */
+ function set_timecreated($timestamp = null, $override = false)
+ {
+ if (empty($timestamp)) {
+ $timestamp = mktime();
+ }
+
+ if (empty($this->id)) {
+ $this->timecreated = $timestamp;
+ $this->timemodified = $timestamp;
+ } else {
+ $current_time = get_field($this->table, 'timecreated', 'id', $this->id);
+
+ if (empty($current_time) || $override) {
+ $this->timecreated = $timestamp;
+ $this->timemodified = $timestamp;
+ return $this->timecreated;
+ } else {
+ return false;
+ }
+ }
+ return $this->timecreated;
+ }
+}
+?>