aboutsummaryrefslogtreecommitdiff
path: root/lib/models/eTask
diff options
context:
space:
mode:
authorJan-Hendrik Willms <tleilax+github@gmail.com>2021-07-22 16:07:19 +0200
committerJan-Hendrik Willms <tleilax+github@gmail.com>2021-07-22 16:19:12 +0200
commita3da1483a9e689846179159355badfec8073dbec (patch)
tree770dcca6bdf5f6f2a11b0e7fcbbeda6919a3fc52 /lib/models/eTask
current code from svn, revision 62608
Diffstat (limited to 'lib/models/eTask')
-rw-r--r--lib/models/eTask/Assignment.php66
-rw-r--r--lib/models/eTask/AssignmentRange.php36
-rw-r--r--lib/models/eTask/Attempt.php58
-rw-r--r--lib/models/eTask/ConfigureTrait.php62
-rw-r--r--lib/models/eTask/Response.php84
-rw-r--r--lib/models/eTask/Task.php111
-rw-r--r--lib/models/eTask/Test.php145
-rw-r--r--lib/models/eTask/TestTask.php42
8 files changed, 604 insertions, 0 deletions
diff --git a/lib/models/eTask/Assignment.php b/lib/models/eTask/Assignment.php
new file mode 100644
index 0000000..6320684
--- /dev/null
+++ b/lib/models/eTask/Assignment.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace eTask;
+
+/**
+ * eTask conforming assignment definition.
+ *
+ * @property int id database column
+ * @property int test_id database column
+ * @property string range_type database column
+ * @property string range_id database column
+ * @property string type database column
+ * @property string start database column
+ * @property string end database column
+ * @property int active database column
+ * @property string options database column
+ * @property eTask\Test test belongs_to etask\Test
+ * @property SimpleORMapCollection attempts has_many etask\Attempt
+ * @property SimpleORMapCollection ranges has_many etask\AssignmentRange
+ * @property SimpleORMapCollection responses has_many etask\Response
+ * @property JSONArrayobject options serialized database column
+ */
+class Assignment extends \SimpleORMap
+{
+ use ConfigureTrait;
+
+ /**
+ * @see SimpleORMap::configure
+ */
+ protected static function configure($config = [])
+ {
+ $config['db_table'] = 'etask_assignments';
+
+ $config['relationTypes'] = self::configureClassNames($config);
+
+ $config['belongs_to']['test'] = [
+ 'class_name' => $config['relationTypes']['Test'],
+ 'foreign_key' => 'test_id'
+ ];
+
+ $config['has_many']['attempts'] = [
+ 'class_name' => $config['relationTypes']['Attempt'],
+ 'assoc_foreign_key' => 'assignment_id',
+ 'on_delete' => 'delete',
+ 'on_store' => 'store'
+ ];
+
+ $config['has_many']['ranges'] = [
+ 'class_name' => $config['relationTypes']['AssignmentRange'],
+ 'assoc_foreign_key' => 'assignment_id',
+ 'on_delete' => 'delete',
+ 'on_store' => 'store'
+ ];
+
+ $config['has_many']['responses'] = [
+ 'class_name' => $config['relationTypes']['Response'],
+ 'assoc_foreign_key' => 'assignment_id',
+ 'on_delete' => 'delete',
+ 'on_store' => 'store'
+ ];
+
+ $config['serialized_fields']['options'] = 'JSONArrayObject';
+
+ parent::configure($config);
+ }
+}
diff --git a/lib/models/eTask/AssignmentRange.php b/lib/models/eTask/AssignmentRange.php
new file mode 100644
index 0000000..c0c3a3d
--- /dev/null
+++ b/lib/models/eTask/AssignmentRange.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace eTask;
+
+/**
+ * eTask conforming assignment-range relation definition.
+ *
+ * @property int assignment_id database column
+ * @property string range_type database column
+ * @property string range_id database column
+ * @property eTask\Assignment assignment belongs_to etask\Assignment
+ * @property JSONArrayobject options serialized database column
+ */
+class AssignmentRange extends \SimpleORMap
+{
+ use ConfigureTrait;
+
+ /**
+ * @see SimpleORMap::configure
+ */
+ protected static function configure($config = [])
+ {
+ $config['db_table'] = 'etask_assignment_ranges';
+
+ $config['relationTypes'] = self::configureClassNames($config);
+
+ $config['belongs_to']['assignment'] = [
+ 'class_name' => $config['relationTypes']['Assignment'],
+ 'foreign_key' => 'assignment_id'
+ ];
+
+ $config['serialized_fields']['options'] = 'JSONArrayObject';
+
+ parent::configure($config);
+ }
+}
diff --git a/lib/models/eTask/Attempt.php b/lib/models/eTask/Attempt.php
new file mode 100644
index 0000000..f4a6cbe
--- /dev/null
+++ b/lib/models/eTask/Attempt.php
@@ -0,0 +1,58 @@
+<?php
+namespace eTask;
+
+/**
+ * eTask conforming assignment attempt definition.
+ *
+ * @property int id database column
+ * @property int assignment_id database column
+ * @property string user_id database column
+ * @property string start database column
+ * @property string end database column
+ * @property string options database column
+ * @property eTask\Assignment assignment belongs_to etask\Assignment
+ * @property JSONArrayobject options serialized database column
+ */
+class Attempt extends \SimpleORMap implements \PrivacyObject
+{
+ use ConfigureTrait;
+
+ /**
+ * @see SimpleORMap::configure
+ */
+ protected static function configure($config = [])
+ {
+ $config['db_table'] = 'etask_assignment_attempts';
+
+ $config['relationTypes'] = self::configureClassNames($config);
+
+ $config['belongs_to']['assignment'] = [
+ 'class_name' => $config['relationTypes']['Assignment'],
+ 'foreign_key' => 'assignment_id'
+ ];
+
+ $config['serialized_fields']['options'] = 'JSONArrayObject';
+
+ parent::configure($config);
+ }
+
+ /**
+ * Export available data of a given user into a storage object
+ * (an instance of the StoredUserData class) for that user.
+ *
+ * @param StoredUserData $storage object to store data into
+ */
+ public static function exportUserData(\StoredUserData $storage)
+ {
+ $sorm = self::findBySQL("user_id = ?", [$storage->user_id]);
+ if ($sorm) {
+ $field_data = [];
+ foreach ($sorm as $row) {
+ $field_data[] = $row->toRawArray();
+ }
+ if ($field_data) {
+ $storage->addTabularData(_('eTask Zuweisungen'), 'etask_assignment_attempts', $field_data);
+ }
+ }
+ }
+}
diff --git a/lib/models/eTask/ConfigureTrait.php b/lib/models/eTask/ConfigureTrait.php
new file mode 100644
index 0000000..10f4dda
--- /dev/null
+++ b/lib/models/eTask/ConfigureTrait.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace eTask;
+
+/**
+ * eTask SORM class relationship configuration trait.
+ *
+ * eTask models are meant to be subclassed. As the current SORM
+ * implementation hardcodes the types of relationships, this trait is
+ * used to re-wire the relationships according to the applications
+ * needs.
+ *
+ * In this case your application should add configuration either via
+ * the #configure method or via another trait.
+ *
+ * Example:
+ * \code
+ * $config['relationTypes'] = [
+ * 'Assignment' => '\\Example\\Assignment',
+ * 'AssignmentRange' => '\\Example\\AssignmentRange',
+ * 'Attempt' => '\\Example\\Attempt',
+ * 'Response' => '\\Example\\Response',
+ * 'Task' => '\\Example\\Task',
+ * 'Test' => '\\Example\\Test',
+ * 'TestTask' => '\\Example\\TestTask'
+ * ];
+ * \encode
+ */
+trait ConfigureTrait
+{
+ /**
+ * @property array relationTypes lookup table of potential
+ * subclasses to be used as types of the eTask SORMs
+ */
+ protected $relationTypes = [];
+
+ // set default relationship types
+ private static function configureClassNames($config = [])
+ {
+ $defaultTypes = [
+ 'Assignment' => '\\eTask\\Assignment',
+ 'AssignmentRange' => '\\eTask\\AssignmentRange',
+ 'Attempt' => '\\eTask\\Attempt',
+ 'Response' => '\\eTask\\Response',
+ 'Task' => '\\eTask\\Task',
+ 'Test' => '\\eTask\\Test',
+ 'TestTask' => '\\eTask\\TestTask'
+ ];
+
+ $types = [];
+
+ if (!isset($config['relationTypes'])) {
+ $types = $defaultTypes;
+ } else {
+ foreach ($defaultTypes as $key => $classname) {
+ $types[$key] = $config['relationTypes'][$key] ?: $classname;
+ }
+ }
+
+ return $types;
+ }
+}
diff --git a/lib/models/eTask/Response.php b/lib/models/eTask/Response.php
new file mode 100644
index 0000000..5b2edb5
--- /dev/null
+++ b/lib/models/eTask/Response.php
@@ -0,0 +1,84 @@
+<?php
+namespace eTask;
+
+/**
+ * eTask conforming assignment definition.
+ *
+ * @property int id database column
+ * @property int assignment_id database column
+ * @property int task_id database column
+ * @property string user_id database column
+ * @property string response database column
+ * @property int state database column
+ * @property float points database column
+ * @property string feedback database column
+ * @property string grader_id database column
+ * @property string mkdate database column
+ * @property string chdate database column
+ * @property string options database column
+ * @property eTask\Assignment assignment belongs_to etask\Assignment
+ * @property eTask\Task task belongs_to etask\Task
+ * @property User user belongs_to User
+ * @property User grader belongs_to User
+ * @property JSONArrayobject response serialized database column
+ * @property JSONArrayobject options serialized database column
+ */
+class Response extends \SimpleORMap implements \PrivacyObject
+{
+ use ConfigureTrait;
+
+ /**
+ * @see SimpleORMap::configure
+ */
+ protected static function configure($config = [])
+ {
+ $config['db_table'] = 'etask_responses';
+
+ $config['relationTypes'] = self::configureClassNames($config);
+
+ $config['belongs_to']['assignment'] = [
+ 'class_name' => $config['relationTypes']['Assignment'],
+ 'foreign_key' => 'assignment_id'
+ ];
+
+ $config['belongs_to']['task'] = [
+ 'class_name' => $config['relationTypes']['Task'],
+ 'foreign_key' => 'task_id'
+ ];
+
+ $config['belongs_to']['user'] = [
+ 'class_name' => '\\User',
+ 'foreign_key' => 'user_id'
+ ];
+
+ $config['belongs_to']['grader'] = [
+ 'class_name' => '\\User',
+ 'foreign_key' => 'user_id'
+ ];
+
+ $config['serialized_fields']['response'] = 'JSONArrayObject';
+ $config['serialized_fields']['options'] = 'JSONArrayObject';
+
+ parent::configure($config);
+ }
+
+ /**
+ * Export available data of a given user into a storage object
+ * (an instance of the StoredUserData class) for that user.
+ *
+ * @param StoredUserData $storage object to store data into
+ */
+ public static function exportUserData(\StoredUserData $storage)
+ {
+ $sorm = self::findBySQL("user_id = ?", [$storage->user_id]);
+ if ($sorm) {
+ $field_data = [];
+ foreach ($sorm as $row) {
+ $field_data[] = $row->toRawArray();
+ }
+ if ($field_data) {
+ $storage->addTabularData(_('eTask Antworten'), 'etask_responses', $field_data);
+ }
+ }
+ }
+}
diff --git a/lib/models/eTask/Task.php b/lib/models/eTask/Task.php
new file mode 100644
index 0000000..68d4a20
--- /dev/null
+++ b/lib/models/eTask/Task.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace eTask;
+
+/**
+ * eTask conforming task definition.
+ *
+ * @property int id database column
+ * @property string type database column
+ * @property string title database column
+ * @property string description database column
+ * @property string task database column
+ * @property string user_id database column
+ * @property string mkdate database column
+ * @property string chdate database column
+ * @property string options database column
+ * @property User owner belongs_to User
+ * @property SimpleORMapCollection tests additional field etask\Test
+ * @property SimpleORMapCollection test_tasks has_many etask\TestTask
+ * @property SimpleORMapCollection responses has_many etask\Response
+ * @property JSONArrayobject task serialized database column
+ * @property JSONArrayobject options serialized database column
+ */
+class Task extends \SimpleORMap implements \PrivacyObject
+{
+ use ConfigureTrait;
+
+ /**
+ * @see SimpleORMap::configure
+ */
+ protected static function configure($config = [])
+ {
+ $config['db_table'] = 'etask_tasks';
+
+ $config['relationTypes'] = self::configureClassNames($config);
+
+ $config['belongs_to']['owner'] = [
+ 'class_name' => '\\User',
+ 'foreign_key' => 'user_id'
+ ];
+
+ $config['additional_fields']['tests']['get'] = 'getTests';
+
+ $config['has_many']['test_tasks'] = [
+ 'class_name' => $config['relationTypes']['TestTask'],
+ 'assoc_foreign_key' => 'task_id',
+ 'on_delete' => 'delete',
+ 'on_store' => 'store'
+ ];
+
+ $config['has_many']['responses'] = [
+ 'class_name' => $config['relationTypes']['Response'],
+ 'assoc_foreign_key' => 'task_id',
+ 'on_delete' => 'delete',
+ 'on_store' => 'store'
+ ];
+
+ $config['serialized_fields']['task'] = 'JSONArrayObject';
+ $config['serialized_fields']['options'] = 'JSONArrayObject';
+
+ parent::configure($config);
+ }
+
+ /**
+ * Retrieve the tests associated to this task.
+ *
+ * @return SimpleORMapCollection the associated tests
+ */
+ public function getTests()
+ {
+ $klass = $this->relationTypes['Test'];
+
+ return \SimpleORMapCollection::createFromArray(
+ $klass::findThru(
+ $this->id,
+ [
+ 'thru_table' => 'etask_test_tasks',
+ 'thru_key' => 'task_id',
+ 'thru_assoc_key' => 'test_id',
+ 'assoc_foreign_key' => 'id',
+ 'order_by' => 'ORDER BY etask_tests.chdate ASC'
+ ]
+ )
+ );
+ }
+
+ /**
+ * Export available data of a given user into a storage object
+ * (an instance of the StoredUserData class) for that user.
+ *
+ * @param StoredUserData $storage object to store data into
+ */
+ public static function exportUserData(\StoredUserData $storage)
+ {
+ $sorm = self::findBySQL("user_id = ?", [$storage->user_id]);
+ if ($sorm) {
+ $field_data = [];
+ foreach ($sorm as $row) {
+ $field_data[] = $row->toRawArray();
+ }
+ if ($field_data) {
+ $storage->addTabularData(_('eTask Aufgaben'), 'etask_tasks', $field_data);
+ }
+ }
+
+ $field_data = \DBManager::get()->fetchAll("SELECT * FROM etask_task_tags WHERE user_id =?", [$storage->user_id]);
+ if ($field_data) {
+ $storage->addTabularData(_('eTask Aufgaben Tags'), 'etask_task_tags', $field_data);
+ }
+ }
+}
diff --git a/lib/models/eTask/Test.php b/lib/models/eTask/Test.php
new file mode 100644
index 0000000..a6279a0
--- /dev/null
+++ b/lib/models/eTask/Test.php
@@ -0,0 +1,145 @@
+<?php
+
+namespace eTask;
+
+/**
+ * eTask conforming test definition.
+ *
+ * @property int id database column
+ * @property string title database column
+ * @property string description database column
+ * @property string user_id database column
+ * @property string mkdate database column
+ * @property string chdate database column
+ * @property string options database column
+ * @property SimpleORMapCollection tasks additional field etask\Task
+ * @property SimpleORMapCollection testtasks has_many etask\TestTask
+ * @property User owner belongs_to User
+ * @property SimpleORMapCollection assignments has_many etask\Assignment
+ * @property JSONArrayobject options serialized database column
+ */
+class Test extends \SimpleORMap implements \PrivacyObject
+{
+ use ConfigureTrait;
+
+ /**
+ * @see SimpleORMap::configure
+ */
+ protected static function configure($config = [])
+ {
+ $config['db_table'] = 'etask_tests';
+
+ $config['relationTypes'] = self::configureClassNames($config);
+
+ $config['additional_fields']['tasks']['get'] = 'getTasks';
+
+ $config['has_many']['testtasks'] = [
+ 'class_name' => $config['relationTypes']['TestTask'],
+ 'assoc_foreign_key' => 'test_id',
+ 'on_delete' => 'delete',
+ 'on_store' => 'store'
+ ];
+
+ $config['belongs_to']['owner'] = [
+ 'class_name' => '\\User',
+ 'foreign_key' => 'user_id'
+ ];
+
+ $config['has_many']['assignments'] = [
+ 'class_name' => $config['relationTypes']['Assignment'],
+ 'assoc_foreign_key' => 'test_id',
+ 'on_delete' => 'delete',
+ 'on_store' => 'store'
+ ];
+
+ $config['serialized_fields']['options'] = 'JSONArrayObject';
+
+ parent::configure($config);
+ }
+
+ /**
+ * Retrieve the tasks associated to this test.
+ *
+ * @return SimpleORMapCollection the associated tasks
+ */
+ public function getTasks()
+ {
+ $klass = $this->relationTypes['Task'];
+
+ return \SimpleORMapCollection::createFromArray(
+ $klass::findThru(
+ $this->id,
+ [
+ 'thru_table' => 'etask_test_tasks',
+ 'thru_key' => 'test_id',
+ 'thru_assoc_key' => 'task_id',
+ 'assoc_foreign_key' => 'id',
+ 'order_by' => 'ORDER BY etask_test_tasks.position ASC'
+ ]
+ )
+ );
+ }
+
+ /**
+ * Count all the tasks related to this test.
+ *
+ * @return int the number of related tasks
+ */
+ public function countTasks()
+ {
+ $klass = $this->relationTypes['TestTask'];
+
+ return $klass::countBySql('test_id = ?', [$this->id]);
+ }
+
+ /**
+ * Convenience method to associate a task to this test.
+ * Creates a TestTask object and returns it.
+ *
+ * @param eTask\Task task the task to associate
+ *
+ * @return eTask\TestTask the created TestTask object
+ */
+ public function addTask($task)
+ {
+ $klass = $this->relationTypes['TestTask'];
+
+ $testTask = $klass::create(
+ [
+ 'test_id' => $this->id,
+ 'task_id' => $task->id,
+ 'position' => $this->countTasks() + 1,
+ 'options' => []
+ ]
+ );
+
+ $this->resetRelation('testtasks');
+
+ return $testTask;
+ }
+
+ /**
+ * Export available data of a given user into a storage object
+ * (an instance of the StoredUserData class) for that user.
+ *
+ * @param StoredUserData $storage object to store data into
+ */
+ public static function exportUserData(\StoredUserData $storage)
+ {
+ $sorm = self::findBySQL("user_id = ?", [$storage->user_id]);
+ if ($sorm) {
+ $field_data = [];
+ foreach ($sorm as $row) {
+ $field_data[] = $row->toRawArray();
+ }
+ if ($field_data) {
+ $storage->addTabularData(_('eTask Tests'), 'etask_tests', $field_data);
+ }
+ }
+
+ $field_data = \DBManager::get()->fetchAll("SELECT * FROM etask_test_tags WHERE user_id =?", [$storage->user_id]);
+ if ($field_data) {
+ $storage->addTabularData(_('eTask Tests Tags'), 'etask_test_tags', $field_data);
+ }
+ }
+}
diff --git a/lib/models/eTask/TestTask.php b/lib/models/eTask/TestTask.php
new file mode 100644
index 0000000..ecedad7
--- /dev/null
+++ b/lib/models/eTask/TestTask.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace eTask;
+
+/**
+ * eTask conforming test task relation.
+ *
+ * @property int test_id database column
+ * @property int task_id database column
+ * @property int position database column
+ * @property float points database column
+ * @property string options database column
+ * @property eTask\Test test belongs_to etask\Test
+ * @property eTask\Task task belongs_to etask\Task
+ * @property JSONArrayobject options serialized database column
+ */
+class TestTask extends \SimpleORMap
+{
+ use ConfigureTrait;
+
+ /**
+ * @see SimpleORMap::configure
+ */
+ protected static function configure($config = [])
+ {
+ $config['db_table'] = 'etask_test_tasks';
+
+ $config['relationTypes'] = self::configureClassNames($config);
+
+ $config['belongs_to']['test'] = [
+ 'class_name' => $config['relationTypes']['Test'],
+ 'foreign_key' => 'test_id'];
+
+ $config['belongs_to']['task'] = [
+ 'class_name' => $config['relationTypes']['Task'],
+ 'foreign_key' => 'task_id'];
+
+ $config['serialized_fields']['options'] = 'JSONArrayObject';
+
+ parent::configure($config);
+ }
+}