PageRenderTime 86ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/php/lib/data_manager/mdb2.class.php

https://bitbucket.org/cbenelug/chamilo-app-weblcms
PHP | 4404 lines | 3200 code | 638 blank | 566 comment | 195 complexity | 45de56de5777c7b858cbe4290ded7e4f MD5 | raw file
  1. <?php
  2. namespace application\weblcms;
  3. use application\weblcms\tool\survey\SurveyInvitation;
  4. use common\libraries\ArrayResultSet;
  5. use common\libraries\SubselectCondition;
  6. use common\libraries\ConditionTranslator;
  7. use common\libraries\NotCondition;
  8. use common\libraries\PlatformSetting;
  9. use common\libraries\Session;
  10. use common\libraries\OrCondition;
  11. use common\libraries\InCondition;
  12. use common\libraries\Utilities;
  13. use common\libraries\ObjectTableOrder;
  14. use common\libraries\AndCondition;
  15. use common\libraries\InequalityCondition;
  16. use common\libraries\EqualityCondition;
  17. use common\libraries\Request;
  18. use common\libraries\Mdb2Database;
  19. use common\libraries\Translation;
  20. use group\Group;
  21. use group\GroupDataManager;
  22. use group\GroupRelUser;
  23. use user\User;
  24. use user\UserDataManager;
  25. use repository\ContentObject;
  26. use repository\content_object\introduction\Introduction;
  27. use repository\ContentObjectPublicationAttributes;
  28. use repository\RepositoryDataManager;
  29. use repository\ComplexContentObjectItem;
  30. use repository\DatabaseRepositoryDataManager;
  31. use common\libraries\Mdb2ResultSet;
  32. use tracking\TrackingDataManager;
  33. use rights\RightsLocation;
  34. use application\weblcms\course\CourseUserRelation;
  35. use application\weblcms\course\CourseGroupRelation;
  36. use application\weblcms\course_type\CourseType;
  37. use application\weblcms\course\Course;
  38. use application\weblcms\course_type\CourseTypeRelCourseSetting;
  39. use application\weblcms\course_type\CourseTypeRelCourseSettingValue;
  40. use application\weblcms\course\CourseRelCourseSetting;
  41. use application\weblcms\course\CourseRelCourseSettingValue;
  42. use common\libraries\DataClass;
  43. use common\libraries\DataClassCache;
  44. use Doctrine\DBAL\Query\QueryBuilder;
  45. use application\weblcms\ContentObjectPublication;
  46. use application\weblcms\tool\assignment\AssignmentTool;
  47. use common\libraries\DoctrineResultSet;
  48. class Mdb2WeblcmsDataManager extends Mdb2Database implements WeblcmsDataManagerInterface
  49. {
  50. private $course_group_cache;
  51. function initialize()
  52. {
  53. parent :: initialize();
  54. $this->set_prefix('weblcms_');
  55. }
  56. function retrieve_content_object_publication($publication_id)
  57. {
  58. $condition = new EqualityCondition(ContentObjectPublication :: PROPERTY_ID, $publication_id);
  59. return $this->retrieve_object(ContentObjectPublication :: get_table_name(), $condition, array(),
  60. ContentObjectPublication :: CLASS_NAME);
  61. }
  62. function retrieve_content_object_publication_feedback($publication_id)
  63. {
  64. $condition = new EqualityCondition(ContentObjectPublication :: PROPERTY_PARENT_ID, $publication_id);
  65. return $this->retrieve_objects(ContentObjectPublication :: get_table_name(), $condition, null, null, array(),
  66. ContentObjectPublication :: CLASS_NAME)->as_array();
  67. }
  68. public function content_object_is_published($object_id)
  69. {
  70. $condition = new EqualityCondition(ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID, $object_id);
  71. return $this->count_objects(ContentObjectPublication :: get_table_name(), $condition) >= 1;
  72. }
  73. public function any_content_object_is_published($object_ids)
  74. {
  75. $condition = new InCondition(ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID, $object_ids);
  76. return $this->count_objects(ContentObjectPublication :: get_table_name(), $condition) >= 1;
  77. }
  78. function get_content_object_publication_attributes($user, $object_id, $type = null, $offset = null, $count = null,
  79. $order_properties = null)
  80. {
  81. if (isset($type))
  82. {
  83. if ($type == 'user')
  84. {
  85. $rdm = RepositoryDataManager :: get_instance();
  86. $co_alias = $rdm->get_alias(ContentObject :: get_table_name());
  87. $pub_alias = $this->get_alias(ContentObjectPublication :: get_table_name());
  88. $query = 'SELECT ' . $pub_alias . '.*, ' . $co_alias . '.' . $this->escape_column_name(
  89. ContentObject :: PROPERTY_TITLE) . ' FROM ' . $this->escape_table_name(
  90. ContentObjectPublication :: get_table_name()) . ' AS ' . $pub_alias . ' JOIN ' . $rdm->escape_table_name(
  91. ContentObject :: get_table_name()) . ' AS ' . $co_alias . ' ON ' . $this->escape_column_name(
  92. ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID, $pub_alias) . '=' . $this->escape_column_name(
  93. ContentObject :: PROPERTY_ID, $co_alias);
  94. $condition = new EqualityCondition(ContentObjectPublication :: PROPERTY_PUBLISHER_ID,
  95. Session :: get_user_id());
  96. $translator = ConditionTranslator :: factory($this);
  97. $query .= $translator->render_query($condition);
  98. $order = array();
  99. foreach ($order_properties as $order_property)
  100. {
  101. if ($order_property->get_property() == 'application')
  102. {
  103. }
  104. elseif ($order_property->get_property() == 'location')
  105. {
  106. }
  107. elseif ($order_property->get_property() == 'title')
  108. {
  109. $order[] = $this->escape_column_name('title') . ' ' . ($order_property->get_direction() == SORT_DESC ? 'DESC' : 'ASC');
  110. }
  111. else
  112. {
  113. $order[] = $this->escape_column_name($order_property->get_property()) . ' ' . ($order_property->get_direction() == SORT_DESC ? 'DESC' : 'ASC');
  114. }
  115. }
  116. if (count($order) > 0)
  117. $query .= ' ORDER BY ' . implode(', ', $order);
  118. }
  119. }
  120. else
  121. {
  122. $query = 'SELECT * FROM ' . $this->escape_table_name(ContentObjectPublication :: get_table_name());
  123. $condition = new EqualityCondition(ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID, $object_id);
  124. $translator = ConditionTranslator :: factory($this);
  125. $query .= $translator->render_query($condition);
  126. }
  127. $this->set_limit($count, $offset);
  128. $res = $this->query($query);
  129. $publication_attr = array();
  130. while ($record = $res->fetchRow(MDB2_FETCHMODE_ASSOC))
  131. {
  132. $info = new ContentObjectPublicationAttributes();
  133. $info->set_id($record[ContentObjectPublication :: PROPERTY_ID]);
  134. $info->set_publisher_user_id($record[ContentObjectPublication :: PROPERTY_PUBLISHER_ID]);
  135. $info->set_publication_date($record[ContentObjectPublication :: PROPERTY_PUBLICATION_DATE]);
  136. $info->set_application('weblcms');
  137. // TODO: i8n location string
  138. $info->set_location(
  139. $record[ContentObjectPublication :: PROPERTY_COURSE_ID] . ' &gt; ' . $record[ContentObjectPublication :: PROPERTY_TOOL]);
  140. // TODO: set correct URL
  141. $info->set_url(
  142. 'index.php?application=weblcms&amp;go=' . WeblcmsManager :: ACTION_VIEW_COURSE . '&course=' . $record[ContentObjectPublication :: PROPERTY_COURSE_ID] . '&amp;tool=' . $record[ContentObjectPublication :: PROPERTY_TOOL] . '&amp;tool_action=' . Tool :: ACTION_VIEW . '&amp;' . Tool :: PARAM_PUBLICATION_ID . '=' . $info->get_id());
  143. $info->set_publication_object_id($record[ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID]);
  144. $publication_attr[] = $info;
  145. }
  146. $res->free();
  147. return $publication_attr;
  148. }
  149. function get_content_object_publication_attribute($publication_id)
  150. {
  151. $query = 'SELECT * FROM ' . $this->escape_table_name('content_object_publication') . ' WHERE ' . $this->escape_column_name(
  152. ContentObjectPublication :: PROPERTY_ID) . '=' . $this->quote($publication_id);
  153. $this->get_connection()->setLimit(0, 1);
  154. $res = $this->query($query);
  155. $publication_attr = array();
  156. $record = $res->fetchRow(MDB2_FETCHMODE_ASSOC);
  157. $res->free();
  158. $publication_attr = new ContentObjectPublicationAttributes();
  159. $publication_attr->set_id($record[ContentObjectPublication :: PROPERTY_ID]);
  160. $publication_attr->set_publisher_user_id($record[ContentObjectPublication :: PROPERTY_PUBLISHER_ID]);
  161. $publication_attr->set_publication_date($record[ContentObjectPublication :: PROPERTY_PUBLICATION_DATE]);
  162. $publication_attr->set_application('weblcms');
  163. // TODO: i8n location string
  164. $publication_attr->set_location(
  165. $record[ContentObjectPublication :: PROPERTY_COURSE_ID] . ' &gt; ' . $record[ContentObjectPublication :: PROPERTY_TOOL]);
  166. // TODO: set correct URL
  167. $publication_attr->set_url(
  168. 'index_weblcms.php?tool=' . $record[ContentObjectPublication :: PROPERTY_TOOL] . '&amp;cidReq=' . $record[ContentObjectPublication :: PROPERTY_COURSE_ID]);
  169. $publication_attr->set_publication_object_id($record[ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID]);
  170. return $publication_attr;
  171. }
  172. function count_publication_attributes($user = null, $object_id = null, $condition = null)
  173. {
  174. if (! $object_id)
  175. {
  176. $condition = new EqualityCondition(ContentObjectPublication :: PROPERTY_PUBLISHER_ID, $user->get_id());
  177. }
  178. else
  179. {
  180. $condition = new EqualityCondition(ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID, $object_id);
  181. }
  182. return $this->count_objects(ContentObjectPublication :: get_table_name(), $condition);
  183. }
  184. function retrieve_content_object_publications($condition = null, $order_by = array(), $offset = 0, $max_objects = -1)
  185. {
  186. $publication_table_alias = $this->get_alias(ContentObjectPublication :: get_table_name());
  187. $repo_data_manager = RepositoryDataManager :: get_instance();
  188. $content_object_table_alias = $repo_data_manager->get_alias(ContentObject :: get_table_name());
  189. $query = 'SELECT ' . $publication_table_alias . '.*, ' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_TITLE . ',' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_DESCRIPTION . ',' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_TYPE . ', ' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_OWNER_ID;
  190. $query .= ' FROM ' . $this->escape_table_name(ContentObjectPublication :: get_table_name()) . ' AS ' . $publication_table_alias;
  191. $query .= ' JOIN ' . $repo_data_manager->escape_table_name(ContentObject :: get_table_name()) . ' AS ' . $content_object_table_alias . ' ON ' . $repo_data_manager->escape_column_name(
  192. ContentObject :: PROPERTY_ID, $content_object_table_alias) . '=';
  193. $query .= $this->escape_column_name(ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID,
  194. $publication_table_alias);
  195. return $this->retrieve_object_set($query, ContentObjectPublication :: get_table_name(), $condition, $offset,
  196. $max_objects, $order_by, ContentObjectPublication :: CLASS_NAME);
  197. }
  198. function count_content_object_publications($condition)
  199. {
  200. $publication_table_alias = $this->get_alias(ContentObjectPublication :: get_table_name());
  201. $repo_data_manager = RepositoryDataManager :: get_instance();
  202. $content_object_table_alias = $repo_data_manager->get_alias(ContentObject :: get_table_name());
  203. $query = 'SELECT COUNT(*)';
  204. $query .= ' FROM ' . $this->escape_table_name(ContentObjectPublication :: get_table_name()) . ' AS ' . $publication_table_alias;
  205. $query .= ' JOIN ' . $repo_data_manager->escape_table_name(ContentObject :: get_table_name()) . ' AS ' . $content_object_table_alias . ' ON ' . $repo_data_manager->escape_column_name(
  206. ContentObject :: PROPERTY_ID, $content_object_table_alias) . '=';
  207. $query .= $this->escape_column_name(ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID,
  208. $publication_table_alias);
  209. return $this->count_result_set($query, ContentObjectPublication :: get_table_name(), $condition);
  210. }
  211. function subscribe_user_to_allowed_courses($user_id)
  212. {
  213. $conditions = array();
  214. $conditions[] = new EqualityCondition(CommonRequest :: PROPERTY_USER_ID, $user_id);
  215. $conditions[] = new InequalityCondition(CommonRequest :: PROPERTY_DECISION_DATE,
  216. InequalityCondition :: LESS_THAN_OR_EQUAL, time());
  217. $conditions[] = new EqualityCondition(CommonRequest :: PROPERTY_DECISION, CommonRequest :: ALLOWED_DECISION);
  218. $condition = new AndCondition($conditions);
  219. $course_subscribe_requests = $this->retrieve_requests($condition);
  220. while ($course_request = $course_subscribe_requests->next_result())
  221. {
  222. $course = $this->retrieve_course($course_request->get_course_id());
  223. $user = UserDataManager :: get_instance()->retrieve_user($user_id);
  224. if (! $this->is_subscribed($course, $user))
  225. {
  226. $this->subscribe_user_to_course($course, '5', '0', $user_id);
  227. }
  228. $course_request->delete();
  229. }
  230. }
  231. function count_requests($condition = null)
  232. {
  233. return $this->count_objects(CourseRequest :: get_table_name(), $condition);
  234. }
  235. function count_course_create_requests($condition = null)
  236. {
  237. return $this->count_objects(CourseCreateRequest :: get_table_name(), $condition);
  238. }
  239. function count_course_categories($condition = null)
  240. {
  241. return $this->count_objects(CourseCategory :: get_table_name(), $condition);
  242. }
  243. function count_user_courses($condition = null)
  244. {
  245. $course_alias = $this->get_alias(Course :: get_table_name());
  246. $course_user_relation_alias = $this->get_alias(CourseUserRelation :: get_table_name());
  247. $course_group_relation_alias = $this->get_alias(CourseGroupRelation :: get_table_name());
  248. $query = 'SELECT COUNT(*) FROM ' . $this->escape_table_name(Course :: get_table_name()) . ' AS ' . $course_alias;
  249. $query .= ' LEFT JOIN ' . $this->escape_table_name(CourseUserRelation :: get_table_name()) . ' AS ' . $course_user_relation_alias . ' ON ' . $this->escape_column_name(
  250. Course :: PROPERTY_ID, $course_alias) . ' = ' . $this->escape_column_name(
  251. CourseUserRelation :: PROPERTY_COURSE_ID, $course_user_relation_alias);
  252. $query .= ' LEFT JOIN ' . $this->escape_table_name(CourseGroupRelation :: get_table_name()) . ' AS ' . $course_group_relation_alias . ' ON ' . $this->escape_column_name(
  253. Course :: PROPERTY_ID, $course_alias) . ' = ' . $this->escape_column_name(
  254. CourseGroupRelation :: PROPERTY_COURSE_ID, $course_group_relation_alias);
  255. return $this->count_result_set($query, Course :: get_table_name(), $condition);
  256. }
  257. function retrieve_user_courses($condition = null, $offset = 0, $max_objects = -1, $order_by = null)
  258. {
  259. $course_alias = $this->get_alias(Course :: get_table_name());
  260. $course_user_relation_alias = $this->get_alias(CourseUserRelation :: get_table_name());
  261. $course_group_relation_alias = $this->get_alias(CourseGroupRelation :: get_table_name());
  262. $query = 'SELECT DISTINCT ' . $course_alias . '.* FROM ' . $this->escape_table_name(Course :: get_table_name()) . ' AS ' . $course_alias;
  263. $query .= ' LEFT JOIN ' . $this->escape_table_name(CourseUserRelation :: get_table_name()) . ' AS ' . $course_user_relation_alias . ' ON ' . $this->escape_column_name(
  264. Course :: PROPERTY_ID, $course_alias) . ' = ' . $this->escape_column_name(
  265. CourseUserRelation :: PROPERTY_COURSE_ID, $course_user_relation_alias);
  266. $query .= ' LEFT JOIN ' . $this->escape_table_name(CourseGroupRelation :: get_table_name()) . ' AS ' . $course_group_relation_alias . ' ON ' . $this->escape_column_name(
  267. Course :: PROPERTY_ID, $course_alias) . ' = ' . $this->escape_column_name(
  268. CourseGroupRelation :: PROPERTY_COURSE_ID, $course_group_relation_alias);
  269. if (is_null($order_by))
  270. {
  271. $order_by[] = new ObjectTableOrder(Course :: PROPERTY_TITLE);
  272. }
  273. return $this->retrieve_object_set($query, Course :: get_table_name(), $condition, $offset, $max_objects,
  274. $order_by, Course :: class_name());
  275. }
  276. function count_course_user_categories($condition = null)
  277. {
  278. return $this->count_objects(CourseUserCategory :: get_table_name(), $condition);
  279. }
  280. function count_course_type_user_categories($condition = null)
  281. {
  282. return $this->count_objects(CourseTypeUserCategory :: get_table_name(), $condition);
  283. }
  284. function retrieve_course_list_of_user_as_course_admin($user_id)
  285. {
  286. $conditions = array();
  287. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_USER_ID, $user_id);
  288. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_STATUS, 1);
  289. $condition = new AndCondition($conditions);
  290. return $this->retrieve_course_user_relations($condition);
  291. }
  292. function count_distinct_course_user_relations()
  293. {
  294. return $this->count_distinct(CourseUserRelation :: get_table_name(), CourseUserRelation :: PROPERTY_USER_ID);
  295. }
  296. function count_course_user_relations($condition = null)
  297. {
  298. return $this->count_objects(CourseUserRelation :: get_table_name(), $condition);
  299. }
  300. function count_course_group_relations($condition = null)
  301. {
  302. return $this->count_objects(CourseGroupRelation :: get_table_name(), $condition);
  303. }
  304. function retrieve_course_group_group_relation($id)
  305. {
  306. $condition = new EqualityCondition(CourseGroupGroupRelation :: PROPERTY_ID, $id);
  307. return $this->retrieve_object(CourseGroupGroupRelation :: get_table_name(), $condition, array(),
  308. CourseGroupGroupRelation :: CLASS_NAME);
  309. }
  310. function retrieve_course_group_group_relation_custom($condition)
  311. {
  312. return $this->retrieve_object(CourseGroupGroupRelation :: get_table_name(), $condition, array(),
  313. CourseGroupGroupRelation :: CLASS_NAME);
  314. }
  315. function retrieve_course_group_group_relation_by_name($name)
  316. {
  317. $condition = new EqualityCondition(CourseGroupGroupRelation :: PROPERTY_NAME, $name);
  318. return $this->retrieve_object(CourseGroupGroupRelation :: get_table_name(), $condition, array(),
  319. CourseGroupGroupRelation :: CLASS_NAME);
  320. }
  321. function retrieve_course_group_group_relations($condition = null, $offset = null, $count = null, $order_property = null)
  322. {
  323. return $this->retrieve_objects(CourseGroupGroupRelation::get_table_name(), $condition, $offset, $count,
  324. $order_property, CourseGroupGroupRelation::CLASS_NAME);
  325. }
  326. function update_course_group_group_relation($course_group_group_relation)
  327. {
  328. $conditions = array();
  329. $conditions[] = new EqualityCondition(CourseGroupGroupRelation :: PROPERTY_ID,
  330. $course_group_group_relation->get_id());
  331. $condition = new AndCondition($conditions);
  332. return $this->update($course_group_group_relation, $condition);
  333. }
  334. function delete_course_group_group_relation($course_group_group_relation)
  335. {
  336. $condition = new EqualityCondition(CourseGroup::PROPERTY_GROUP_ID, $course_group_group_relation->get_id());
  337. $course_groups = $this->retrieve_course_groups($condition);
  338. $success = true;
  339. while($course_group = $course_groups->next_result())
  340. {
  341. if(!$this->delete_course_group($course_group))
  342. {
  343. $success = false;
  344. }
  345. }
  346. if(!$success)
  347. {
  348. return false;
  349. }
  350. $condition = new EqualityCondition(CourseGroupGroupRelation :: PROPERTY_ID, $course_group_group_relation->get_id());
  351. $succes = $this->delete(CourseGroupGroupRelation :: get_table_name(), $condition);
  352. return $succes;
  353. }
  354. function retrieve_course_groups_by_group_id($condition = null, $offset = null, $count = null, $order_property = null)
  355. {
  356. return $this->retrieve_objects(CourseGroup :: get_table_name(), $condition, $offset, $count, $order_property,
  357. CourseGroup :: CLASS_NAME);
  358. }
  359. function retrieve_course_groups_by_course_group_group_relation_id($course_id, $course_group_group_relation_id)
  360. {
  361. $conditions[] = new EqualityCondition(CourseGroup :: PROPERTY_GROUP_ID, $course_group_group_relation_id);
  362. $conditions[] = new EqualityCondition(CourseGroup :: PROPERTY_COURSE_CODE, $course_id);
  363. $condition = new AndCondition($conditions);
  364. return $this->retrieve_objects(CourseGroup :: get_table_name(), $condition, null, null, null,
  365. CourseGroup :: CLASS_NAME);
  366. }
  367. function update_content_object_publication_id($publication_attr)
  368. {
  369. $where = $this->escape_column_name(ContentObjectPublication :: PROPERTY_ID) . '=' . $publication_attr->get_id();
  370. $props = array();
  371. $props[$this->escape_column_name(ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID)] = $publication_attr->get_publication_object_id();
  372. $this->get_connection()->loadModule('Extended');
  373. if ($this->get_connection()->extended->autoExecute($this->get_table_name('content_object_publication'), $props,
  374. MDB2_AUTOQUERY_UPDATE, $where))
  375. {
  376. return true;
  377. }
  378. else
  379. {
  380. return false;
  381. }
  382. }
  383. function delete_content_object_publication($publication)
  384. {
  385. if (is_numeric($publication))
  386. {
  387. $publication = $this->retrieve_content_object_publication($publication);
  388. }
  389. $publication_id = $publication->get_id();
  390. $query = 'DELETE FROM ' . $this->escape_table_name('content_object_publication_user') . ' WHERE publication_id = ' . $this->quote(
  391. $publication_id);
  392. $res = $this->exec($query);
  393. $query = 'DELETE FROM ' . $this->escape_table_name('content_object_publication_course_group') . ' WHERE publication_id = ' . $this->quote(
  394. $publication_id);
  395. $res = $this->exec($query);
  396. $query = 'UPDATE ' . $this->escape_table_name('content_object_publication') . ' SET ' . $this->escape_column_name(
  397. ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX) . '=' . $this->escape_column_name(
  398. ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX) . '-1 WHERE ' . $this->escape_column_name(
  399. ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX) . '>' . $this->quote(
  400. $publication->get_display_order_index()) . ' AND ' . $this->escape_column_name(
  401. ContentObjectPublication :: PROPERTY_COURSE_ID) . '=' . $publication->get_course_id() . ' AND ' . $this->escape_column_name(
  402. ContentObjectPublication :: PROPERTY_TOOL) . '=\'' . $publication->get_tool() . '\' AND ' . $this->escape_column_name(
  403. ContentObjectPublication :: PROPERTY_CATEGORY_ID) . '=' . $publication->get_category_id();
  404. $res = $this->exec($query);
  405. $query = 'DELETE FROM ' . $this->escape_table_name('content_object_publication') . ' WHERE ' . $this->escape_column_name(
  406. ContentObjectPublication :: PROPERTY_ID) . '=' . $this->quote($publication_id);
  407. $this->get_connection()->setLimit(0, 1);
  408. $res = $this->exec($query);
  409. return true;
  410. }
  411. function delete_content_object_publications($object_id)
  412. {
  413. $condition = new EqualityCondition(ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID, $object_id);
  414. $publications = $this->retrieve_content_object_publications($condition);
  415. while ($publication = $publications->next_result())
  416. {
  417. $publication->delete();
  418. }
  419. return true;
  420. }
  421. function retrieve_content_object_publication_category($id)
  422. {
  423. $condition = new EqualityCondition(ContentObjectPublicationCategory :: PROPERTY_ID, $id);
  424. return $this->retrieve_object(ContentObjectPublicationCategory :: get_table_name(), $condition, array(),
  425. ContentObjectPublicationCategory :: CLASS_NAME);
  426. }
  427. function move_content_object_publication($publication, $places)
  428. {
  429. if ($places < 0)
  430. {
  431. return $this->move_content_object_publication_up($publication, - $places);
  432. }
  433. else
  434. {
  435. return $this->move_content_object_publication_down($publication, $places);
  436. }
  437. }
  438. function retrieve_course_module_access($condition = null, $order_by = array())
  439. {
  440. return $this->retrieve_object(CourseModuleLastAccess :: get_table_name(), $condition, $order_by,
  441. CourseModuleLastAccess :: CLASS_NAME);
  442. }
  443. function retrieve_course_module_accesses($condition = null, $offset = null, $max_objects = null, $order_by = null)
  444. {
  445. return $this->retrieve_objects(CourseModuleLastAccess :: get_table_name(), $condition, $offset, $max_objects,
  446. $order_by, CourseModuleLastAccess :: CLASS_NAME);
  447. }
  448. function log_course_module_access($course_code, $user_id, $module_name = null, $category_id = 0)
  449. {
  450. $conditions = array();
  451. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_COURSE_CODE, $course_code);
  452. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_USER_ID, $user_id);
  453. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_MODULE_NAME, $module_name);
  454. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_CATEGORY_ID, $category_id);
  455. $condition = new AndCondition($conditions);
  456. $course_module_last_access = $this->retrieve_course_module_access($condition);
  457. if (! $course_module_last_access)
  458. {
  459. $course_module_last_access = new CourseModuleLastAccess();
  460. $course_module_last_access->set_course_code($course_code);
  461. $course_module_last_access->set_user_id($user_id);
  462. $course_module_last_access->set_module_name($module_name);
  463. $course_module_last_access->set_category_id($category_id);
  464. $course_module_last_access->set_access_date(time());
  465. return $course_module_last_access->create();
  466. }
  467. else
  468. {
  469. $course_module_last_access->set_access_date(time());
  470. return $course_module_last_access->update();
  471. }
  472. }
  473. /**
  474. * Creates a course module last acces in the database
  475. *
  476. * @param $coursemodule_last_accces CourseModuleLastAccess
  477. */
  478. function update_course_module_last_access($coursemodule_last_accces)
  479. {
  480. $conditions = array();
  481. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_COURSE_CODE,
  482. $coursemodule_last_accces->get_course_code());
  483. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_MODULE_NAME,
  484. $coursemodule_last_accces->get_module_name());
  485. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_USER_ID,
  486. $coursemodule_last_accces->get_user_id());
  487. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_CATEGORY_ID,
  488. $coursemodule_last_accces->get_category_id());
  489. $condition = new AndCondition($conditions);
  490. $this->update($coursemodule_last_accces, $condition);
  491. }
  492. /**
  493. * Returns the last visit date per course and module
  494. *
  495. * @param $course_code <type>
  496. * @param $module_name <type>
  497. * @return <type>
  498. */
  499. function get_last_visit_date_per_course($course_code, $module_name = null, $user_id = null)
  500. {
  501. $conditions = array();
  502. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_COURSE_CODE, $course_code);
  503. if (! is_null($module_name))
  504. {
  505. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_MODULE_NAME, $module_name);
  506. }
  507. if (! is_null($user_id))
  508. {
  509. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_USER_ID, $user_id);
  510. }
  511. $condition = new AndCondition($conditions);
  512. $order_by = new ObjectTableOrder(CourseModuleLastAccess :: PROPERTY_ACCESS_DATE, SORT_DESC);
  513. $course_module_access = $this->retrieve_course_module_access($condition, $order_by);
  514. if (! $course_module_access)
  515. {
  516. return 0;
  517. }
  518. else
  519. {
  520. return $course_module_access->get_access_date();
  521. }
  522. }
  523. function get_last_visit_date($course_code, $user_id, $module_name = null, $category_id = 0)
  524. {
  525. $conditions = array();
  526. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_COURSE_CODE, $course_code);
  527. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_USER_ID, $user_id);
  528. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_CATEGORY_ID, $category_id);
  529. if (! is_null($module_name))
  530. {
  531. $conditions[] = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_MODULE_NAME, $module_name);
  532. }
  533. $condition = new AndCondition($conditions);
  534. $order_by = new ObjectTableOrder(CourseModuleLastAccess :: PROPERTY_ACCESS_DATE, SORT_DESC);
  535. $course_module_access = $this->retrieve_course_module_access($condition, $order_by);
  536. if (! $course_module_access)
  537. {
  538. return 0;
  539. }
  540. else
  541. {
  542. return $course_module_access->get_access_date();
  543. }
  544. }
  545. function get_course_modules($course_code, $order_by_name = false)
  546. {
  547. $query = 'SELECT * FROM ' . $this->escape_table_name('course_module') . ' WHERE course_id = ' . $this->quote(
  548. $course_code);
  549. if ($order_by_name)
  550. {
  551. $query .= ' ORDER BY ' . CourseModule :: PROPERTY_NAME;
  552. }
  553. else
  554. {
  555. $query .= ' ORDER BY ' . CourseModule :: PROPERTY_SORT;
  556. }
  557. $res = $this->query($query);
  558. $modules = array();
  559. $module = null;
  560. while ($module = $res->fetchRow(MDB2_FETCHMODE_OBJECT))
  561. {
  562. $modules[$module->name] = $module;
  563. }
  564. $res->free();
  565. return $modules;
  566. }
  567. // DEPRECATED
  568. function get_all_course_modules()
  569. {
  570. return $this->retrieve_distinct(CourseModule :: get_table_name(), CourseModule :: PROPERTY_NAME);
  571. }
  572. function retrieve_course_module($id)
  573. {
  574. $condition = new EqualityCondition(CourseModule :: PROPERTY_ID, $id);
  575. return $this->retrieve_object(CourseModule :: get_table_name(), $condition, array(), CourseModule :: CLASS_NAME);
  576. }
  577. /**
  578. * Retrieves a single course tool by id
  579. *
  580. * @param $tool_id type
  581. * @return type
  582. */
  583. function retrieve_course_tool($tool_id)
  584. {
  585. $condition = new EqualityCondition(CourseTool :: PROPERTY_ID, $tool_id);
  586. return $this->retrieve_objects(CourseTool :: get_table_name(), $condition, $offset, $max_objects, $order_by);
  587. }
  588. /**
  589. * Returns the course tools
  590. *
  591. * @param $condition Condition
  592. * @param $offset int
  593. * @param $max_objects int
  594. * @param $order_by int
  595. *
  596. * @return ResultSet <CourseTool>
  597. */
  598. function retrieve_course_tools($condition = null, $offset = null, $max_objects = null, $order_by = null)
  599. {
  600. return $this->retrieve_objects(CourseTool :: get_table_name(), $condition, $offset, $max_objects, $order_by);
  601. }
  602. function retrieve_course_module_by_name($course_id, $course_module)
  603. {
  604. $conditions = array();
  605. $conditions[] = new EqualityCondition(CourseModule :: PROPERTY_COURSE_CODE, $course_id);
  606. $conditions[] = new EqualityCondition(CourseModule :: PROPERTY_NAME, $course_module);
  607. $condition = new AndCondition($conditions);
  608. return $this->retrieve_object(CourseModule :: get_table_name(), $condition, array(), CourseModule :: CLASS_NAME);
  609. }
  610. // CTODO - move this to course datamanager
  611. function retrieve_course_user_relation($course_code, $user_id)
  612. {
  613. $conditions = array();
  614. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_COURSE_ID, $course_code);
  615. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_USER_ID, $user_id);
  616. $condition = new AndCondition($conditions);
  617. return $this->retrieve_object(CourseUserRelation :: get_table_name(), $condition, array(),
  618. 'application\weblcms\course\CourseUserRelation');
  619. }
  620. // CTODO - move this to course datamanager
  621. function retrieve_course_user_relations($condition = null, $offset = null, $count = null, $order_property = null)
  622. {
  623. return $this->retrieve_objects(CourseUserRelation :: get_table_name(), $condition, $offset, $count,
  624. $order_property, 'application\weblcms\course\CourseUserRelation');
  625. }
  626. // CTODO - move this to course datamanager
  627. function retrieve_course_group_relations($condition = null, $offset = null, $count = null, $order_property = null)
  628. {
  629. return $this->retrieve_objects(CourseGroupRelation :: get_table_name(), $condition, $offset, $count,
  630. $order_property, 'application\weblcms\course\CourseGroupRelation');
  631. }
  632. function retrieve_course_type_user_category_at_sort($user_id, $course_type_id, $sort, $direction)
  633. {
  634. $conditions = array();
  635. $conditions[] = new EqualityCondition(CourseTypeUserCategory :: PROPERTY_USER_ID, $user_id);
  636. $conditions[] = new EqualityCondition(CourseTypeUserCategory :: PROPERTY_COURSE_TYPE_ID, $course_type_id);
  637. if ($direction == 'up')
  638. {
  639. $conditions[] = new InequalityCondition(CourseTypeUserCategory :: PROPERTY_SORT,
  640. InequalityCondition :: LESS_THAN, $sort);
  641. $order_direction = SORT_DESC;
  642. }
  643. elseif ($direction == 'down')
  644. {
  645. $conditions[] = new InequalityCondition(CourseTypeUserCategory :: PROPERTY_SORT,
  646. InequalityCondition :: GREATER_THAN, $sort);
  647. $order_direction = SORT_ASC;
  648. }
  649. $condition = new AndCondition($conditions);
  650. return $this->retrieve_object(CourseTypeUserCategory :: get_table_name(), $condition,
  651. array(new ObjectTableOrder(CourseTypeUserCategory :: PROPERTY_SORT, $order_direction)),
  652. CourseTypeUserCategory :: CLASS_NAME);
  653. }
  654. function create_course_modules($course_modules, $course_id)
  655. {
  656. $condition = new EqualityCondition(CourseSection :: PROPERTY_COURSE_ID, $course_id);
  657. $sections_set = $this->retrieve_course_sections($condition);
  658. $sections = array();
  659. while ($section = $sections_set->next_result())
  660. {
  661. $sections[$section->get_type()][] = $section;
  662. }
  663. foreach ($course_modules as $module)
  664. {
  665. $section_id = $sections[CourseSection :: TYPE_TOOL][0]->get_id();
  666. $module->set_section($section_id);
  667. if (! $module->create())
  668. return false;
  669. }
  670. $admin_tools = WeblcmsDataManager :: get_tools('course_admin');
  671. foreach ($admin_tools as $index => $tool_name)
  672. {
  673. $section_id = $sections[CourseSection :: TYPE_ADMIN][0]->get_id();
  674. $module = new CourseModule();
  675. $module->set_course_code($course_code);
  676. $module->set_name($tool_name);
  677. $module->set_visible(1);
  678. $module->set_section($section_id);
  679. $module->set_sort($index);
  680. if (! $module->create())
  681. return false;
  682. }
  683. return true;
  684. }
  685. private $is_subscribed_cache;
  686. function is_subscribed($course, $user)
  687. {
  688. $course_id = $course;
  689. if ($course instanceof Course)
  690. {
  691. $course_id = $course->get_id();
  692. }
  693. if(!$user instanceof \user\User)
  694. {
  695. $user = \user\DataManager :: retrieve_user($user);
  696. }
  697. if (is_null($this->is_subscribed_cache[$course_id][$user->get_id()]))
  698. {
  699. $conditions = array();
  700. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_USER_ID, $user->get_id());
  701. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_COURSE_ID, $course_id);
  702. $condition = new AndCondition($conditions);
  703. $has_user_relations = $this->count_objects(CourseUserRelation :: get_table_name(), $condition) > 0;
  704. $groups = $user->get_groups(true);
  705. if ($groups)
  706. {
  707. $conditions = array();
  708. $conditions[] = new InCondition(CourseGroupRelation :: PROPERTY_GROUP_ID, $user->get_groups(true));
  709. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_COURSE_ID, $course_id);
  710. $condition = new AndCondition($conditions);
  711. $has_group_relations = $this->count_objects(CourseGroupRelation :: get_table_name(), $condition) > 0;
  712. }
  713. else
  714. $has_group_relations = false;
  715. $this->is_subscribed_cache[$course_id][$user->get_id()] = $has_user_relations || $has_group_relations;
  716. }
  717. return $this->is_subscribed_cache[$course_id][$user->get_id()];
  718. }
  719. function is_group_subscribed($course_id, $group_id)
  720. {
  721. $conditions = array();
  722. $conditions[] = new EqualityCondition(CourseGroupRelation :: PROPERTY_GROUP_ID, $group_id);
  723. $conditions[] = new EqualityCondition(CourseGroupRelation :: PROPERTY_COURSE_ID, $course_id);
  724. $condition = new AndCondition($conditions);
  725. return $this->count_objects(CourseGroupRelation :: get_table_name(), $condition) > 0;
  726. }
  727. function is_course_category($category)
  728. {
  729. $condition = new EqualityCondition(CourseCategory :: PROPERTY_ID, $category);
  730. return $this->count_objects(CourseCategory :: get_table_name(), $condition) > 0;
  731. }
  732. function is_course($course_code)
  733. {
  734. $condition = new EqualityCondition(Course :: PROPERTY_ID, $course_code);
  735. return $this->count_objects(Course :: get_table_name(), $condition) > 0;
  736. }
  737. function is_course_admin($course, $user_id)
  738. {
  739. $course_id = $course;
  740. if ($course instanceof Course)
  741. {
  742. $course_id = $course->get_id();
  743. }
  744. $conditions = array();
  745. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_COURSE_ID, $course_id);
  746. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_USER_ID, $user_id);
  747. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_STATUS, 1);
  748. $condition = new AndCondition($conditions);
  749. return $this->count_objects(CourseUserRelation :: get_table_name(), $condition) > 0;
  750. }
  751. function retrieve_next_course_user_relation_sort_value(CourseUserRelation $course_user_relation)
  752. {
  753. $course = $this->retrieve_course($course_user_relation->get_course());
  754. $subcondition = new EqualityCondition(Course :: PROPERTY_COURSE_TYPE_ID, $course->get_course_type_id());
  755. $conditions[] = new SubselectCondition(CourseUserRelation :: PROPERTY_COURSE_ID, Course :: PROPERTY_ID,
  756. Course :: get_table_name(), $subcondition);
  757. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_USER_ID, $course_user_relation->get_user());
  758. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_CATEGORY,
  759. $course_user_relation->get_category());
  760. $condition = new AndCondition($conditions);
  761. return $this->retrieve_max_sort_value(CourseUserRelation :: get_table_name(),
  762. CourseUserRelation :: PROPERTY_SORT, $condition) + 1;
  763. }
  764. function subscribe_user_to_course($course, $status, $tutor_id, $user_id)
  765. {
  766. $course_id = $course;
  767. if ($course instanceof Course)
  768. {
  769. $course_id = $course->get_id();
  770. }
  771. $course_user_relation = new CourseUserRelation();
  772. $course_user_relation->set_course_id($course_id);
  773. $course_user_relation->set_user_id($user_id);
  774. $course_user_relation->set_status($status);
  775. if ($course_user_relation->create())
  776. {
  777. return true;
  778. }
  779. else
  780. {
  781. return false;
  782. }
  783. }
  784. function subscribe_group_to_course(Course $course, $group_id, $status)
  785. {
  786. $this->get_connection()->loadModule('Extended');
  787. $course_group_relation = new CourseGroupRelation();
  788. $course_group_relation->set_course_id($course->get_id());
  789. $course_group_relation->set_group_id($group_id);
  790. $course_group_relation->set_status($status);
  791. if ($course_group_relation->create())
  792. {
  793. return true;
  794. }
  795. else
  796. {
  797. return false;
  798. }
  799. }
  800. function create_course_user_relation($courseuserrelation)
  801. {
  802. $props = array();
  803. foreach ($courseuserrelation->get_default_properties() as $key => $value)
  804. {
  805. $props[$this->escape_column_name($key)] = $value;
  806. }
  807. $this->get_connection()->loadModule('Extended');
  808. if ($this->get_connection()->extended->autoExecute(
  809. $this->get_table_name(CourseUserRelation :: get_table_name()), $props, MDB2_AUTOQUERY_INSERT))
  810. {
  811. return true;
  812. }
  813. else
  814. {
  815. return false;
  816. }
  817. }
  818. function unsubscribe_user_from_course($course, $user_id)
  819. {
  820. $conditions = array();
  821. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_COURSE_ID, $course->get_id());
  822. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_USER_ID, $user_id);
  823. $condition = new AndCondition($conditions);
  824. return $this->delete_objects(CourseUserRelation :: get_table_name(), $condition);
  825. }
  826. function unsubscribe_group_from_course(Course $course, $group_id)
  827. {
  828. $conditions = array();
  829. $conditions[] = new EqualityCondition(CourseGroupRelation :: PROPERTY_COURSE_ID, $course->get_id());
  830. $conditions[] = new EqualityCondition(CourseGroupRelation :: PROPERTY_GROUP_ID, $group_id);
  831. $condition = new AndCondition($conditions);
  832. return $this->delete_objects(CourseGroupRelation :: get_table_name(), $condition);
  833. }
  834. function delete_course_type_user_category($course_type_user_category)
  835. {
  836. $condition = new EqualityCondition(CourseTypeUserCategory :: PROPERTY_ID, $course_type_user_category->get_id());
  837. if ($this->delete_objects(CourseTypeUserCategory :: get_table_name(), $condition))
  838. {
  839. $condition = new EqualityCondition(CourseTypeUserCategory :: PROPERTY_COURSE_USER_CATEGORY_ID,
  840. $course_type_user_category->get_course_user_category_id());
  841. $count = $this->count_course_type_user_categories($condition);
  842. if ($count == 0)
  843. {
  844. $condition = new EqualityCondition(CourseUserCategory :: PROPERTY_ID,
  845. $course_type_user_category->get_course_user_category_id());
  846. $course_user_category = $this->retrieve_course_user_category($condition);
  847. if (! $course_user_category->delete())
  848. {
  849. return false;
  850. }
  851. }
  852. $conditions = array();
  853. $conditions[] = new EqualityCondition(
  854. CourseTypeUserCategoryRelCourse :: PROPERTY_COURSE_TYPE_USER_CATEGORY_ID,
  855. $course_type_user_category->get_id());
  856. $condition = new AndCondition($conditions);
  857. $course_type_user_category_rel_courses = $this->retrieve_course_type_user_category_rel_courses($condition);
  858. while ($course_type_user_category_rel_course = $course_type_user_category_rel_courses->next_result())
  859. {
  860. if (! $course_type_user_category_rel_course->delete())
  861. {
  862. return false;
  863. }
  864. }
  865. $conditions = array();
  866. $conditions[] = new InEqualityCondition(CourseTypeUserCategory :: PROPERTY_SORT,
  867. InEqualityCondition :: GREATER_THAN, $course_type_user_category->get_sort());
  868. $conditions[] = new EqualityCondition(CourseTypeUserCategory :: PROPERTY_COURSE_TYPE_ID,
  869. $course_type_user_category->get_course_type_id());
  870. $conditions[] = new EqualityCondition(CourseTypeUserCategory :: PROPERTY_USER_ID,
  871. $course_type_user_category->get_user_id());
  872. $condition = new AndCondition($conditions);
  873. $properties = array();
  874. $properties[CourseTypeUserCategory :: PROPERTY_SORT] = $this->escape_column_name(
  875. CourseTypeUserCategory :: PROPERTY_SORT) . '-1';
  876. return $this->update_objects(CourseTypeUserCategory :: get_table_name(), $properties, $condition);
  877. }
  878. else
  879. {
  880. return false;
  881. }
  882. }
  883. function delete_course_user($courseuser)
  884. {
  885. $conditions = array();
  886. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_COURSE_ID, $courseuser->get_course());
  887. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_USER_ID, $courseuser->get_user());
  888. $condition = new AndCondition($conditions);
  889. return $this->delete_objects(CourseUserRelation :: get_table_name(), $condition);
  890. }
  891. function delete_course_category($course_category)
  892. {
  893. $condition = new EqualityCondition(CourseCategory :: PROPERTY_ID, $course_category->get_id());
  894. $success = $this->delete_objects(CourseCategory :: get_table_name(), $condition);
  895. if ($success)
  896. {
  897. $condition = new EqualityCondition(CourseCategory :: PROPERTY_PARENT, $course_category->get_id());
  898. $properties = array(CourseCategory :: PROPERTY_PARENT => $course_category->get_parent());
  899. $success = $this->update_objects(CourseCategory :: get_table_name(), $properties, $condition);
  900. if ($success)
  901. {
  902. $condition = new EqualityCondition(Course :: PROPERTY_CATEGORY_ID, $course_category->get_id());
  903. $properties = array(Course :: PROPERTY_CATEGORY_ID => $course_category->get_parent());
  904. return $this->update_objects(Course :: get_table_name(), $properties, $condition);
  905. }
  906. else
  907. {
  908. return false;
  909. }
  910. }
  911. else
  912. {
  913. return false;
  914. }
  915. }
  916. function update_courses($properties, $condition)
  917. {
  918. return $this->update_objects(Course :: get_table_name(), $properties, $condition);
  919. }
  920. function update_course_module($course_module)
  921. {
  922. $conditions = array();
  923. $conditions[] = new EqualityCondition(CourseModule :: PROPERTY_COURSE_CODE, $course_module->get_course_code());
  924. $conditions[] = new EqualityCondition(CourseModule :: PROPERTY_NAME, $course_module->get_name());
  925. $condition = new AndCondition($conditions);
  926. return $this->update($course_module, $condition);
  927. }
  928. /**
  929. * Updates the visibility of the course modules
  930. *
  931. * @param $condition Condition define the to be updated modules and course
  932. * @param $visibility bool visibility
  933. */
  934. function update_course_module_visibility($condition, $visibility)
  935. {
  936. // $and_condition = new AndConditon
  937. $properties = array(CourseModule :: PROPERTY_VISIBLE => $visibility);
  938. $this->update_objects(CourseModule :: get_table_name(), $properties, $condition);
  939. }
  940. function update_course_type_user_category($course_type_user_category)
  941. {
  942. $conditions = array();
  943. $conditions[] = new EqualityCondition(CourseTypeUserCategory :: PROPERTY_COURSE_TYPE_ID,
  944. $course_type_user_category->get_course_type_id());
  945. $conditions[] = new EqualityCondition(CourseTypeUserCategory :: PROPERTY_COURSE_USER_CATEGORY_ID,
  946. $course_type_user_category->get_course_user_category_id());
  947. $condition = new AndCondition($conditions);
  948. return $this->update($course_type_user_category, $condition);
  949. }
  950. function update_course_user_relation($course_user_relation)
  951. {
  952. $conditions = array();
  953. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_COURSE_ID,
  954. $course_user_relation->get_course_id());
  955. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_USER_ID,
  956. $course_user_relation->get_user_id());
  957. $condition = new AndCondition($conditions);
  958. return $this->update($course_user_relation, $condition);
  959. }
  960. function delete_courses_by_course_type_id($course_type_id)
  961. {
  962. $condition = new EqualityCondition(Course :: PROPERTY_COURSE_TYPE_ID, $course_type_id);
  963. $resultset = $this->retrieve_courses($condition);
  964. while ($result = $resultset->next_result())
  965. {
  966. if (! $this->delete_course($result->get_id()))
  967. return false;
  968. }
  969. return true;
  970. }
  971. function delete_course($course_code)
  972. {
  973. // Delete publication categories
  974. $condition = new EqualityCondition(ContentObjectPublicationCategory :: PROPERTY_COURSE, $course_code);
  975. if (! $this->delete_objects(ContentObjectPublicationCategory :: get_table_name(), $condition))
  976. {
  977. return false;
  978. }
  979. // Delete publications
  980. $condition = new EqualityCondition(ContentObjectPublication :: PROPERTY_COURSE_ID, $course_code);
  981. if (! $this->delete_objects(ContentObjectPublication :: get_table_name(), $condition))
  982. {
  983. return false;
  984. }
  985. // Delete course sections
  986. $condition = new EqualityCondition(CourseSection :: PROPERTY_COURSE_ID, $course_code);
  987. if (! $this->delete_objects(CourseSection :: get_table_name(), $condition))
  988. {
  989. return false;
  990. }
  991. // Delete modules
  992. $condition = new EqualityCondition(CourseModule :: PROPERTY_COURSE_CODE, $course_code);
  993. if (! $this->delete_objects(CourseModule :: get_table_name(), $condition))
  994. {
  995. return false;
  996. }
  997. // Delete module last access
  998. $condition = new EqualityCondition(CourseModuleLastAccess :: PROPERTY_COURSE_CODE, $course_code);
  999. if (! $this->delete_objects(CourseModuleLastAccess :: get_table_name(), $condition))
  1000. {
  1001. return false;
  1002. }
  1003. // Delete subscriptions of classes in the course
  1004. $condition = new EqualityCondition(CourseGroupRelation :: PROPERTY_COURSE_ID, $course_code);
  1005. if (! $this->delete_objects(CourseGroupRelation :: get_table_name(), $condition))
  1006. {
  1007. return false;
  1008. }
  1009. // Delete subscriptions of users in the course
  1010. $condition = new EqualityCondition(CourseUserRelation :: PROPERTY_COURSE_ID, $course_code);
  1011. if (! $this->delete_objects(CourseUserRelation :: get_table_name(), $condition))
  1012. {
  1013. return false;
  1014. }
  1015. $condition = new EqualityCondition(CourseRequest :: PROPERTY_COURSE_ID, $course_code);
  1016. if (! $this->delete_objects(CourseRequest :: get_table_name(), $condition))
  1017. {
  1018. return false;
  1019. }
  1020. // Delete course
  1021. $condition = new EqualityCondition(Course :: PROPERTY_ID, $course_code);
  1022. if (! $this->delete_objects(Course :: get_table_name(), $condition))
  1023. {
  1024. return false;
  1025. }
  1026. return true;
  1027. }
  1028. function delete_course_module($course_code, $course_name)
  1029. {
  1030. $conditions = array();
  1031. $conditions[] = new EqualityCondition(CourseModule :: PROPERTY_COURSE_CODE, $course_code);
  1032. $conditions[] = new EqualityCondition(CourseModule :: PROPERTY_NAME, $course_name);
  1033. $condition = new AndCondition($conditions);
  1034. return $this->delete_objects(CourseModule :: get_table_name(), $condition);
  1035. }
  1036. function retrieve_course_category($category)
  1037. {
  1038. $condition = new EqualityCondition(CourseCategory :: PROPERTY_ID, $category);
  1039. return $this->retrieve_object(CourseCategory :: get_table_name(), $condition, array(), CourseCategory :: CLASS_NAME);
  1040. }
  1041. function retrieve_course_category_by_code($category_code)
  1042. {
  1043. $condition = new EqualityCondition(CourseCategory :: PROPERTY_CODE, $category_code);
  1044. return $this->retrieve_object(CourseCategory :: get_table_name(), $condition, array(), CourseCategory :: CLASS_NAME);
  1045. }
  1046. function retrieve_course_categories($condition = null, $offset = null, $max_objects = null, $order_by = null)
  1047. {
  1048. $order_by[] = new ObjectTableOrder(CourseCategory :: PROPERTY_NAME);
  1049. $order_dir[] = SORT_ASC;
  1050. return $this->retrieve_objects(CourseCategory :: get_table_name(), $condition, $offset, $max_objects, $order_by,
  1051. CourseCategory :: CLASS_NAME);
  1052. }
  1053. function retrieve_course_user_categories($condition = null, $offset = null, $max_objects = null, $order_by = null)
  1054. {
  1055. return $this->retrieve_objects(CourseUserCategory :: get_table_name(), $condition, $offset, $max_objects,
  1056. $order_by, CourseUserCategory :: CLASS_NAME);
  1057. }
  1058. function retrieve_course_user_category($condition = null)
  1059. {
  1060. return $this->retrieve_object(CourseUserCategory :: get_table_name(), $condition, array(),
  1061. CourseUserCategory :: CLASS_NAME);
  1062. }
  1063. function set_module_visible($course_code, $module, $visible)
  1064. {
  1065. $conditions = array();
  1066. $conditions[] = new EqualityCondition(CourseModule :: PROPERTY_COURSE_CODE, $course_code);
  1067. $conditions[] = new EqualityCondition(CourseModule :: PROPERTY_NAME, $module);
  1068. $condition = new AndCondition($conditions);
  1069. $properties = array(CourseModule :: PROPERTY_VISIBLE => $visible);
  1070. return $this->update_objects(CourseModule :: get_table_name(), $properties, $condition);
  1071. }
  1072. function set_module_id_visible($module_id, $visible)
  1073. {
  1074. $condition = new EqualityCondition(CourseModule :: PROPERTY_VISIBLE, $visible);
  1075. $sort = $this->retrieve_max_sort_value(CourseModule :: get_table_name(), CourseModule :: PROPERTY_SORT,
  1076. $condition);
  1077. $condition = new EqualityCondition(CourseModule :: PROPERTY_ID, $module_id);
  1078. $properties = array(CourseModule :: PROPERTY_VISIBLE => $visible, CourseModule :: PROPERTY_SORT => $sort + 1);
  1079. return $this->update_objects(CourseModule :: get_table_name(), $properties, $condition);
  1080. }
  1081. /**
  1082. * Moves learning object publication up
  1083. *
  1084. * @param $publication ContentObjectPublication The publication to move
  1085. * @param $places int The number of places to move the publication up
  1086. */
  1087. private function move_content_object_publication_up($publication, $places)
  1088. {
  1089. $oldIndex = $publication->get_display_order_index();
  1090. $conditions = array();
  1091. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_COURSE_ID,
  1092. $publication->get_course_id());
  1093. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_TOOL, $publication->get_tool());
  1094. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_CATEGORY_ID,
  1095. $publication->get_category_id());
  1096. $conditions[] = new InequalityCondition(ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX,
  1097. InequalityCondition :: LESS_THAN, $oldIndex);
  1098. $condition = new AndCondition($conditions);
  1099. $properties[ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX] = $this->escape_column_name(
  1100. ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX) . '+1';
  1101. if (! $this->update_objects(ContentObjectPublication :: get_table_name(), $properties, $condition, null,
  1102. $places, new ObjectTableOrder(ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX, SORT_DESC)))
  1103. {
  1104. return false;
  1105. }
  1106. $condition = new EqualityCondition(ContentObjectPublication :: PROPERTY_ID, $publication->get_id());
  1107. $properties[ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX] = $oldIndex - $places;
  1108. return $this->update_objects(ContentObjectPublication :: get_table_name(), $properties, $condition, null, 1);
  1109. }
  1110. /**
  1111. * Moves learning object publication down
  1112. *
  1113. * @param $publication ContentObjectPublication The publication to move
  1114. * @param $places int The number of places to move the publication down
  1115. */
  1116. private function move_content_object_publication_down($publication, $places)
  1117. {
  1118. $oldIndex = $publication->get_display_order_index();
  1119. $conditions = array();
  1120. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_COURSE_ID,
  1121. $publication->get_course_id());
  1122. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_TOOL, $publication->get_tool());
  1123. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_CATEGORY_ID,
  1124. $publication->get_category_id());
  1125. $conditions[] = new InequalityCondition(ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX,
  1126. InequalityCondition :: GREATER_THAN, $oldIndex);
  1127. $condition = new AndCondition($conditions);
  1128. $properties[ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX] = $this->escape_column_name(
  1129. ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX) . '-1';
  1130. if (! $this->update_objects(ContentObjectPublication :: get_table_name(), $properties, $condition, null,
  1131. $places, new ObjectTableOrder(ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX, SORT_ASC)))
  1132. {
  1133. return false;
  1134. }
  1135. $condition = new EqualityCondition(ContentObjectPublication :: PROPERTY_ID, $publication->get_id());
  1136. $properties[ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX] = $oldIndex + $places;
  1137. return $this->update_objects(ContentObjectPublication :: get_table_name(), $properties, $condition, null, 1);
  1138. }
  1139. function fix_publication_display_order($course, $tool, $category_id = 0, $start_display_order = 1)
  1140. {
  1141. $conditions = array();
  1142. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_COURSE_ID, $course);
  1143. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_TOOL, $tool);
  1144. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_CATEGORY_ID, $category_id);
  1145. $conditions[] = new InequalityCondition(ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX,
  1146. InequalityCondition :: GREATER_THAN, $start_display_order);
  1147. $condition = new AndCondition($conditions);
  1148. $properties[ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX] = $this->escape_column_name(
  1149. ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX) . '-1';
  1150. return $this->update_objects(ContentObjectPublication :: get_table_name(), $properties, $condition, null, null,
  1151. new ObjectTableOrder(ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX, SORT_ASC));
  1152. }
  1153. function get_next_content_object_publication_display_order_index($course, $tool, $category)
  1154. {
  1155. $conditions = array();
  1156. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_COURSE_ID, $course);
  1157. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_TOOL, $tool);
  1158. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_CATEGORY_ID, $category);
  1159. $condition = new AndCondition($conditions);
  1160. return $this->retrieve_next_sort_value(ContentObjectPublication :: get_table_name(),
  1161. ContentObjectPublication :: PROPERTY_DISPLAY_ORDER_INDEX, $condition);
  1162. }
  1163. private function get_publication_category_tree($parent, $categories)
  1164. {
  1165. $subtree = array();
  1166. foreach ($categories[$parent] as $child)
  1167. {
  1168. $id = $child->get_id();
  1169. $ar = array();
  1170. $ar['obj'] = $child;
  1171. $ar['sub'] = $this->get_publication_category_tree($id, $categories);
  1172. $subtree[$id] = $ar;
  1173. }
  1174. return $subtree;
  1175. }
  1176. function retrieve_publication_target_user_ids($publication_id)
  1177. {
  1178. $course_id = $this->retrieve_content_object_publication($publication_id)->get_course_id();
  1179. $target_entities = WeblcmsRights :: get_instance()->get_target_entities(WeblcmsRights :: VIEW_RIGHT,
  1180. WeblcmsManager :: APPLICATION_NAME, $publication_id, WeblcmsRights :: TYPE_PUBLICATION, $course_id,
  1181. WeblcmsRights :: TREE_TYPE_COURSE);
  1182. return $target_entities[CourseUserEntity :: ENTITY_TYPE];
  1183. }
  1184. function retrieve_publication_target_course_group_ids($publication_id)
  1185. {
  1186. $course_id = $this->retrieve_content_object_publication($publication_id)->get_course_id();
  1187. $target_entities = WeblcmsRights :: get_instance()->get_target_entities(WeblcmsRights :: VIEW_RIGHT,
  1188. WeblcmsManager :: APPLICATION_NAME, $publication_id, WeblcmsRights :: TYPE_PUBLICATION, $course_id,
  1189. WeblcmsRights :: TREE_TYPE_COURSE);
  1190. return $target_entities[CourseGroupEntity :: ENTITY_TYPE];
  1191. }
  1192. function retrieve_publication_target_platform_group_ids($publication_id)
  1193. {
  1194. $course_id = $this->retrieve_content_object_publication($publication_id)->get_course_id();
  1195. $target_entities = WeblcmsRights :: get_instance()->get_target_entities(WeblcmsRights :: VIEW_RIGHT,
  1196. WeblcmsManager :: APPLICATION_NAME, $publication_id, WeblcmsRights :: TYPE_PUBLICATION, $course_id,
  1197. WeblcmsRights :: TREE_TYPE_COURSE);
  1198. return $target_entities[CoursePlatformGroupEntity :: ENTITY_TYPE];
  1199. }
  1200. function retrieve_publication_target_users($publication_id, $course_id, $offset = null, $count = null, $order_by = null,
  1201. $condition = null)
  1202. {
  1203. if (is_null($course_id))
  1204. {
  1205. $course_id = $this->retrieve_content_object_publication($publication_id)->get_course_id();
  1206. }
  1207. $target_entities = WeblcmsRights :: get_instance()->get_target_entities(WeblcmsRights :: VIEW_RIGHT,
  1208. WeblcmsManager :: APPLICATION_NAME, $publication_id, WeblcmsRights :: TYPE_PUBLICATION, $course_id,
  1209. WeblcmsRights :: TREE_TYPE_COURSE);
  1210. $users_ids = array();
  1211. $user_data_manager = UserDataManager :: get_instance();
  1212. foreach ($target_entities as $entity_type => $entity_ids)
  1213. {
  1214. switch ($entity_type)
  1215. {
  1216. case CourseUserEntity :: ENTITY_TYPE :
  1217. foreach ($entity_ids as $user_id)
  1218. {
  1219. $users_ids[$user_id] = $user_id;
  1220. }
  1221. break;
  1222. case CourseGroupEntity :: ENTITY_TYPE :
  1223. $course_groups = $this->retrieve_course_groups_and_subgroups(
  1224. $target_entities[CourseGroupEntity :: ENTITY_TYPE]);
  1225. while ($course_group = $course_groups->next_result())
  1226. {
  1227. $course_group_users = $this->retrieve_course_group_user_ids($course_group);
  1228. foreach ($course_group_users as $id)
  1229. {
  1230. $users_ids[$id] = $id;
  1231. }
  1232. }
  1233. break;
  1234. case CoursePlatformGroupEntity :: ENTITY_TYPE :
  1235. $group_manager = GroupDataManager :: get_instance();
  1236. $group_condition = new InCondition(Group :: PROPERTY_ID, $entity_ids);
  1237. $groups_resultset = $group_manager->retrieve_groups($group_condition);
  1238. while ($group = $groups_resultset->next_result())
  1239. {
  1240. $user_ids_from_group = $group->get_users(true, true);
  1241. foreach ($user_ids_from_group as $user)
  1242. {
  1243. $users_ids[$user] = $user;
  1244. }
  1245. }
  1246. break;
  1247. case 0 :
  1248. return $this->retrieve_all_course_users($course_id, $condition, $offset, $count, $order_by);
  1249. }
  1250. }
  1251. if (count($users_ids) == 0)
  1252. {
  1253. $users_ids[] = - 1;
  1254. }
  1255. $conditions = array();
  1256. $conditions[] = new InCondition(User :: PROPERTY_ID, $users_ids);
  1257. if ($condition)
  1258. {
  1259. $conditions[] = $condition;
  1260. }
  1261. $user_condition = new AndCondition($conditions);
  1262. return $user_data_manager->retrieve_users($user_condition, $offset, $count, $order_by);
  1263. }
  1264. function retrieve_publication_target_course_groups($publication_id, $course_id, $offset = null, $count = null,
  1265. $order_by = null, $condition = null)
  1266. {
  1267. if (is_null($course_id))
  1268. {
  1269. $course_id = $this->retrieve_content_object_publication($publication_id)->get_course_id();
  1270. }
  1271. $target_entities = WeblcmsRights :: get_instance()->get_target_entities(WeblcmsRights :: VIEW_RIGHT,
  1272. WeblcmsManager :: APPLICATION_NAME, $publication_id, WeblcmsRights :: TYPE_PUBLICATION, $course_id,
  1273. WeblcmsRights :: TREE_TYPE_COURSE);
  1274. if ($target_entities[0])
  1275. {
  1276. $conditions = array();
  1277. $conditions[] = new EqualityCondition(CourseGroup :: PROPERTY_COURSE_CODE, $course_id);
  1278. $conditions[] = new InequalityCondition(CourseGroup :: PROPERTY_PARENT_ID,
  1279. InequalityCondition :: GREATER_THAN, 0);
  1280. if ($condition)
  1281. {
  1282. $conditions[] = $condition;
  1283. }
  1284. $group_condition = new AndCondition($conditions);
  1285. }
  1286. else
  1287. {
  1288. return $this->retrieve_course_groups_and_subgroups($target_entities[CourseGroupEntity :: ENTITY_TYPE],
  1289. $condition, $offset, $count, $order_by);
  1290. }
  1291. return $this->retrieve_course_groups($group_condition, $offset, $count, $order_by);
  1292. }
  1293. function retrieve_publication_target_platform_groups($publication_id, $course_id, $offset = null, $count = null,
  1294. $order_by = null, $condition = null)
  1295. {
  1296. if (is_null($course_id))
  1297. {
  1298. $course_id = $this->retrieve_content_object_publication($publication_id)->get_course_id();
  1299. }
  1300. $target_entities = WeblcmsRights :: get_instance()->get_target_entities(WeblcmsRights :: VIEW_RIGHT,
  1301. WeblcmsManager :: APPLICATION_NAME, $publication_id, WeblcmsRights :: TYPE_PUBLICATION, $course_id,
  1302. WeblcmsRights :: TREE_TYPE_COURSE);
  1303. $gdm = GroupDataManager :: get_instance();
  1304. if ($target_entities[0])
  1305. {
  1306. $cgr_condition = new EqualityCondition(CourseGroupRelation :: PROPERTY_COURSE_ID, $course_id);
  1307. $cgr_resultset = $this->retrieve_course_group_relations($cgr_condition);
  1308. $group_ids = array();
  1309. while ($course_group_rel = $cgr_resultset->next_result())
  1310. {
  1311. $group_ids[] = $course_group_rel->get_group_id();
  1312. }
  1313. return $gdm->retrieve_groups_and_subgroups($group_ids, $offset, $count, $order_by, $condition);
  1314. }
  1315. return $gdm->retrieve_groups_and_subgroups($target_entities[CoursePlatformGroupEntity :: ENTITY_TYPE], $offset,
  1316. $count, $order_by, $condition);
  1317. }
  1318. // Inherited
  1319. function delete_course_group($course_group)
  1320. {
  1321. // Delete subscription of users in this course_group
  1322. $condition = new EqualityCondition(CourseGroupUserRelation :: PROPERTY_COURSE_GROUP, $course_group->get_id());
  1323. $succes = $this->delete(CourseGroupUserRelation :: get_table_name(), $condition);
  1324. if (! $succes)
  1325. {
  1326. return false;
  1327. }
  1328. $condition = new EqualityCondition(CourseGroup :: PROPERTY_ID, $course_group->get_id());
  1329. $succes = $this->delete(CourseGroup :: get_table_name(), $condition);
  1330. return $succes;
  1331. }
  1332. // Inherited
  1333. function create_course_group_user_relation($course_group_user_relation)
  1334. {
  1335. return $this->create($course_group_user_relation);
  1336. }
  1337. // Inherited
  1338. function retrieve_course_group($id)
  1339. {
  1340. if (is_null($this->course_group_cache[$id]))
  1341. {
  1342. $condition = new EqualityCondition(CourseGroup :: PROPERTY_ID, $id);
  1343. $this->course_group_cache[$id] = $this->retrieve_object(CourseGroup :: get_table_name(), $condition,
  1344. array(), CourseGroup :: CLASS_NAME);
  1345. }
  1346. return $this->course_group_cache[$id];
  1347. }
  1348. function retrieve_request($id)
  1349. {
  1350. $condition = new EqualityCondition(CourseRequest :: PROPERTY_ID, $id);
  1351. return $this->retrieve_object(CourseRequest :: get_table_name(), $condition, array(), CourseRequest :: CLASS_NAME);
  1352. }
  1353. function retrieve_course_create_request($id)
  1354. {
  1355. $condition = new EqualityCondition(CourseCreateRequest :: PROPERTY_ID, $id);
  1356. return $this->retrieve_object(CourseCreateRequest :: get_table_name(), $condition, array(),
  1357. CourseCreateRequest :: CLASS_NAME);
  1358. }
  1359. function retrieve_requests($condition = null, $offset = null, $max_objects = null, $order_by = null)
  1360. {
  1361. $order_by[] = new ObjectTableOrder(CourseRequest :: PROPERTY_SUBJECT);
  1362. return $this->retrieve_objects(CourseRequest :: get_table_name(), $condition, $offset, $max_objects, $order_by,
  1363. CourseRequest :: CLASS_NAME);
  1364. }
  1365. function retrieve_course_create_requests($condition = null, $offset = null, $max_objects = null, $order_by = null)
  1366. {
  1367. $order_by[] = new ObjectTableOrder(CourseCreateRequest :: PROPERTY_SUBJECT);
  1368. return $this->retrieve_objects(CourseCreateRequest :: get_table_name(), $condition, $offset, $max_objects,
  1369. $order_by, CourseCreateRequest :: CLASS_NAME);
  1370. }
  1371. function retrieve_course_group_by_name($name)
  1372. {
  1373. $condition = new EqualityCondition(CourseGroup :: PROPERTY_NAME, $name);
  1374. return $this->retrieve_object(CourseGroup :: get_table_name(), $condition, array(), CourseGroup :: CLASS_NAME);
  1375. }
  1376. function count_requests_by_course($condition)
  1377. {
  1378. return $this->count_objects(CourseRequest :: get_table_name(), $condition);
  1379. }
  1380. // Inherited
  1381. function retrieve_course_groups($condition = null, $offset = null, $count = null, $order_property = null)
  1382. {
  1383. return $this->retrieve_objects(CourseGroup :: get_table_name(), $condition, $offset, $count, $order_property,
  1384. CourseGroup :: CLASS_NAME);
  1385. }
  1386. function count_course_groups($condition)
  1387. {
  1388. return $this->count_objects(CourseGroup :: get_table_name(), $condition);
  1389. }
  1390. // Inherited
  1391. function retrieve_course_group_user_ids($course_group)
  1392. {
  1393. $condition = new EqualityCondition(CourseGroupUserRelation :: PROPERTY_COURSE_GROUP, $course_group->get_id());
  1394. $relations = $this->retrieve_objects(CourseGroupUserRelation :: get_table_name(), $condition, null, null,
  1395. array(), CourseGroupUserRelation :: CLASS_NAME);
  1396. $user_ids = array();
  1397. while ($relation = $relations->next_result())
  1398. {
  1399. $user_ids[] = $relation->get_user();
  1400. }
  1401. return $user_ids;
  1402. }
  1403. function retrieve_course_type_user_categories($condition = null, $offset = null, $count = null, $order_property = null)
  1404. {
  1405. return $this->retrieve_objects(CourseTypeUserCategory :: get_table_name(), $condition, $offset, $count,
  1406. $order_property, CourseTypeUserCategory :: CLASS_NAME);
  1407. }
  1408. function retrieve_course_type_user_category($condition = null)
  1409. {
  1410. return $this->retrieve_object(CourseTypeUserCategory :: get_table_name(), $condition, array(),
  1411. CourseTypeUserCategory :: CLASS_NAME);
  1412. }
  1413. // Inherited
  1414. function retrieve_course_groups_from_user($user_id, $course_id = null)
  1415. {
  1416. $group_alias = $this->get_alias(CourseGroup :: get_table_name());
  1417. $group_relation_alias = $this->get_alias(CourseGroupUserRelation :: get_table_name());
  1418. $query = 'SELECT ' . $group_alias . '.* FROM ' . $this->escape_table_name(CourseGroup :: get_table_name()) . ' AS ' . $group_alias;
  1419. $query .= ' JOIN ' . $this->escape_table_name(CourseGroupUserRelation :: get_table_name()) . ' AS ' . $group_relation_alias . ' ON ' . $this->escape_column_name(
  1420. CourseGroup :: PROPERTY_ID, $group_alias) . ' = ' . $this->escape_column_name(
  1421. CourseGroupUserRelation :: PROPERTY_COURSE_GROUP, $group_relation_alias);
  1422. $conditions = array();
  1423. $conditions[] = new EqualityCondition(CourseGroupUserRelation :: PROPERTY_USER, $user_id,
  1424. CourseGroupUserRelation :: get_table_name());
  1425. if (! is_null($course_id))
  1426. {
  1427. $conditions[] = new EqualityCondition(CourseGroup :: PROPERTY_COURSE_CODE, $course_id);
  1428. }
  1429. $condition = new AndCondition($conditions);
  1430. return $this->retrieve_object_set($query, CourseGroup :: get_table_name(), $condition, null, null, array(),
  1431. CourseGroup :: CLASS_NAME);
  1432. }
  1433. // Inherited
  1434. function retrieve_course_group_users($course_group, $condition = null, $offset = null, $count = null, $order_property = null)
  1435. {
  1436. $user_ids = $this->retrieve_course_group_user_ids($course_group);
  1437. if (count($user_ids) > 0)
  1438. {
  1439. $user_condition = new InCondition(User :: PROPERTY_ID, $user_ids);
  1440. if (is_null($condition))
  1441. {
  1442. $condition = $user_condition;
  1443. }
  1444. else
  1445. {
  1446. $condition = new AndCondition($condition, $user_condition);
  1447. }
  1448. }
  1449. else
  1450. {
  1451. // TODO: We need a better fix for this !
  1452. $condition = new EqualityCondition(User :: PROPERTY_ID, '-1000');
  1453. }
  1454. return \user\DataManager :: retrieves(
  1455. User :: class_name(),
  1456. new \common\libraries\DataClassRetrievesParameters($condition, $count, $offset, $order_property)
  1457. );
  1458. }
  1459. function retrieve_course_group_user_relations($condition = null, $offset = null, $count = null, $order_property = null)
  1460. {
  1461. return $this->retrieve_objects(CourseGroupUserRelation :: get_table_name(), $condition, $offset, $count,
  1462. $order_property, CourseGroupUserRelation :: CLASS_NAME);
  1463. }
  1464. // Inherited
  1465. function count_course_group_users($course_group, $conditions = null)
  1466. {
  1467. $user_ids = $this->retrieve_course_group_user_ids($course_group);
  1468. if (count($user_ids) > 0)
  1469. {
  1470. $condition = new InCondition(User :: PROPERTY_ID, $user_ids);
  1471. if (is_null($conditions))
  1472. {
  1473. $conditions = $condition;
  1474. }
  1475. else
  1476. {
  1477. $conditions = new AndCondition($condition, $conditions);
  1478. }
  1479. $udm = UserDataManager :: get_instance();
  1480. return $udm->count_users($conditions);
  1481. }
  1482. else
  1483. {
  1484. return 0;
  1485. }
  1486. }
  1487. // Inherited
  1488. function retrieve_possible_course_group_users($course_group, $condition = null, $offset = null, $count = null,
  1489. $order_property = null)
  1490. {
  1491. $course_condition = new EqualityCondition(CourseUserRelation :: PROPERTY_COURSE_ID,
  1492. $course_group->get_course_code());
  1493. $course_users = $this->retrieve_course_user_relations($course_condition);
  1494. $group_user_ids = $this->retrieve_course_group_user_ids($course_group);
  1495. $course_user_ids = array();
  1496. while ($course_user = $course_users->next_result())
  1497. {
  1498. $course_user_ids[] = $course_user->get_user();
  1499. }
  1500. $conditions = array();
  1501. $conditions[] = $condition;
  1502. $conditions[] = new InCondition(User :: PROPERTY_ID, $course_user_ids);
  1503. $conditions[] = new NotCondition(new InCondition(User :: PROPERTY_ID, $group_user_ids));
  1504. $condition = new AndCondition($conditions);
  1505. $udm = UserDataManager :: get_instance();
  1506. return $udm->retrieve_users($condition, $offset, $count, $order_property);
  1507. }
  1508. // Inherited
  1509. function count_possible_course_group_users($course_group, $conditions = null)
  1510. {
  1511. if (! is_array($conditions))
  1512. {
  1513. $conditions = array();
  1514. }
  1515. $udm = UserDataManager :: get_instance();
  1516. $query = 'SELECT user_id FROM ' . $this->escape_table_name(CourseUserRelation :: get_table_name()) . ' WHERE ' . $this->escape_column_name(
  1517. CourseUserRelation :: PROPERTY_COURSE_ID) . '=' . $this->quote($course_group->get_course_code());
  1518. $res = $this->query($query);
  1519. while ($record = $res->fetchRow(MDB2_FETCHMODE_ASSOC))
  1520. {
  1521. $course_user_ids[] = $record[User :: PROPERTY_ID];
  1522. }
  1523. $res->free();
  1524. $conditions[] = new InCondition(User :: PROPERTY_ID, $course_user_ids);
  1525. $user_ids = $this->retrieve_course_group_user_ids($course_group);
  1526. if (count($user_ids) > 0)
  1527. {
  1528. $user_condition = new NotCondition(new InCondition(User :: PROPERTY_ID, $user_ids));
  1529. $conditions[] = $user_condition;
  1530. }
  1531. $condition = new AndCondition($conditions);
  1532. return $udm->count_users($condition);
  1533. }
  1534. // Inherited
  1535. function subscribe_users_to_course_groups($users, $course_group)
  1536. {
  1537. if (! is_array($users))
  1538. {
  1539. $users = array($users);
  1540. }
  1541. foreach ($users as $user)
  1542. {
  1543. $course_group_user_relation = new CourseGroupUserRelation();
  1544. $course_group_user_relation->set_course_group($course_group->get_id());
  1545. $course_group_user_relation->set_user($user->get_id());
  1546. if (! $course_group_user_relation->create())
  1547. {
  1548. return false;
  1549. }
  1550. }
  1551. return true;
  1552. }
  1553. function more_subscriptions_allowed_for_user_in_group($course_group_id, $user_id)
  1554. {
  1555. if ($course_group_id == null)
  1556. return true;
  1557. $group_group = $this->retrieve_course_group_group_relation($course_group_id);
  1558. $condition = new EqualityCondition(CourseGroup :: PROPERTY_GROUP_ID, $group_group->get_id());
  1559. $all_groups = $this->retrieve_course_groups($condition);
  1560. $num_groups = 0;
  1561. $max_groups = $group_group->get_max_number_of_course_group_per_member();
  1562. while ($group_course_group = $all_groups->next_result())
  1563. {
  1564. $conditions = array();
  1565. $conditions[] = new EqualityCondition(CourseGroupUserRelation :: PROPERTY_COURSE_GROUP, $group_course_group->get_id());
  1566. $conditions[] = new EqualityCondition(CourseGroupUserRelation :: PROPERTY_USER, $user_id);
  1567. $condition = new AndCondition($conditions);
  1568. $users = $this->retrieve_course_group_user_relations($condition);
  1569. if ($users->next_result() != null)
  1570. {
  1571. $num_groups++;
  1572. }
  1573. }
  1574. return $num_groups < $max_groups;
  1575. }
  1576. // Inherited
  1577. function unsubscribe_users_from_course_groups($users, $course_group)
  1578. {
  1579. if (! is_array($users))
  1580. {
  1581. $users = array($users);
  1582. }
  1583. $conditions = array();
  1584. $conditions[] = new EqualityCondition(CourseGroupUserRelation :: PROPERTY_COURSE_GROUP, $course_group->get_id());
  1585. $conditions[] = new InCondition(CourseGroupUserRelation :: PROPERTY_USER, $users);
  1586. $condition = new AndCondition($conditions);
  1587. return $this->delete_objects(CourseGroupUserRelation :: get_table_name(), $condition);
  1588. }
  1589. // Inherited
  1590. function is_course_group_member($course_group, $user)
  1591. {
  1592. $conditions = array();
  1593. $conditions[] = new EqualityCondition(CourseGroupUserRelation :: PROPERTY_COURSE_GROUP, $course_group->get_id());
  1594. $conditions[] = new EqualityCondition(CourseGroupUserRelation :: PROPERTY_USER, $user->get_id());
  1595. $condition = new AndCondition($conditions);
  1596. return $this->count_objects(CourseGroupUserRelation :: get_table_name(), $condition) > 0;
  1597. }
  1598. private static function from_db_date($date)
  1599. {
  1600. return DatabaseRepositoryDataManager :: from_db_date($date);
  1601. }
  1602. function delete_category($category)
  1603. {
  1604. $condition = new EqualityCondition(CourseCategory :: PROPERTY_ID, $category->get_id());
  1605. $succes = $this->delete(CourseCategory :: get_table_name(), $condition);
  1606. $conditions = array();
  1607. $conditions[] = new InequalityCondition(CourseCategory :: PROPERTY_DISPLAY_ORDER,
  1608. InequalityCondition :: GREATER_THAN, $category->get_display_order());
  1609. $conditions[] = new EqualityCondition(CourseCategory :: PROPERTY_PARENT, $category->get_parent());
  1610. $condition = new AndCondition($conditions);
  1611. $properties = array(
  1612. CourseCategory :: PROPERTY_DISPLAY_ORDER => $this->escape_column_name(
  1613. CourseCategory :: PROPERTY_DISPLAY_ORDER) . ' - 1');
  1614. return $this->update_objects(CourseCategory :: get_table_name(), $properties, $condition);
  1615. }
  1616. function count_categories($conditions = null)
  1617. {
  1618. return $this->count_objects(CourseCategory :: get_table_name(), $conditions);
  1619. }
  1620. function retrieve_categories($condition = null, $offset = null, $count = null, $order_property = null)
  1621. {
  1622. return $this->retrieve_objects(CourseCategory :: get_table_name(), $condition, $offset, $count, $order_property,
  1623. CourseCategory :: CLASS_NAME);
  1624. }
  1625. function delete_content_object_publication_category($content_object_publication_category)
  1626. {
  1627. $condition = new EqualityCondition(ContentObjectPublicationCategory :: PROPERTY_ID,
  1628. $content_object_publication_category->get_id());
  1629. $succes = $this->delete(ContentObjectPublicationCategory :: get_table_name(), $condition);
  1630. $conditions = array();
  1631. $conditions[] = new InequalityCondition(ContentObjectPublicationCategory :: PROPERTY_DISPLAY_ORDER,
  1632. InequalityCondition :: GREATER_THAN, $content_object_publication_category->get_display_order());
  1633. $conditions[] = new EqualityCondition(ContentObjectPublicationCategory :: PROPERTY_PARENT,
  1634. $content_object_publication_category->get_parent());
  1635. $conditions[] = new EqualityCondition(ContentObjectPublicationCategory :: PROPERTY_COURSE,
  1636. $content_object_publication_category->get_course());
  1637. $conditions[] = new EqualityCondition(ContentObjectPublicationCategory :: PROPERTY_TOOL,
  1638. $content_object_publication_category->get_tool());
  1639. $condition = new AndCondition($conditions);
  1640. $properties = array(
  1641. ContentObjectPublicationCategory :: PROPERTY_DISPLAY_ORDER => $this->escape_column_name(
  1642. ContentObjectPublicationCategory :: PROPERTY_DISPLAY_ORDER) . '-1');
  1643. $this->update_objects(ContentObjectPublicationCategory :: get_table_name(), $properties, $condition);
  1644. $this->delete_content_object_publication_children($content_object_publication_category->get_id());
  1645. return $succes;
  1646. }
  1647. function delete_content_object_publication_children($parent_id)
  1648. {
  1649. $condition = new EqualityCondition(ContentObjectPublicationCategory :: PROPERTY_PARENT, $parent_id);
  1650. $categories = $this->retrieve_content_object_publication_categories($condition);
  1651. while ($category = $categories->next_result())
  1652. {
  1653. $category->delete();
  1654. $this->delete_content_object_publication_children($category->get_id());
  1655. }
  1656. }
  1657. function count_content_object_publication_categories($conditions = null)
  1658. {
  1659. return $this->count_objects(ContentObjectPublicationCategory :: get_table_name(), $conditions);
  1660. }
  1661. function retrieve_content_object_publication_categories($condition = null, $offset = null, $count = null, $order_property = null)
  1662. {
  1663. return $this->retrieve_objects(ContentObjectPublicationCategory :: get_table_name(), $condition, $offset,
  1664. $count, $order_property, ContentObjectPublicationCategory :: CLASS_NAME);
  1665. }
  1666. function get_maximum_score($assessment)
  1667. {
  1668. $condition = new EqualityCondition(ComplexContentObjectItem :: PROPERTY_PARENT, $assessment->get_id(),
  1669. ComplexContentObjectItem :: get_table_name());
  1670. $clo_questions = RepositoryDataManager :: get_instance()->retrieve_complex_content_object_items($condition);
  1671. while ($clo_question = $clo_questions->next_result())
  1672. {
  1673. $maxscore += $clo_question->get_weight();
  1674. }
  1675. return $maxscore;
  1676. }
  1677. function retrieve_survey_invitations($condition = null, $offset = null, $max_objects = null, $order_by = null)
  1678. {
  1679. return $this->retrieve_objects(SurveyInvitation :: get_table_name(), $condition, $offset, $max_objects,
  1680. $order_by, SurveyInvitation :: CLASS_NAME);
  1681. }
  1682. function delete_course_section($course_section)
  1683. {
  1684. $condition = new EqualityCondition(CourseSection :: PROPERTY_ID, $course_section->get_id());
  1685. if (! $this->delete(CourseSection :: get_table_name(), $condition))
  1686. {
  1687. return false;
  1688. }
  1689. else
  1690. {
  1691. $conditions = array();
  1692. $conditions[] = new InequalityCondition(CourseSection :: PROPERTY_DISPLAY_ORDER,
  1693. InequalityCondition :: GREATER_THAN, $course_section->get_display_order());
  1694. $conditions[] = new EqualityCondition(CourseSection :: PROPERTY_COURSE_ID, $course_section->get_course_id());
  1695. $condition = new AndCondition($conditions);
  1696. $properties = array(
  1697. CourseSection :: PROPERTY_DISPLAY_ORDER => $this->escape_column_name(
  1698. CourseSection :: PROPERTY_DISPLAY_ORDER) . ' - 1');
  1699. if (! $this->update_objects(CourseSection :: get_table_name(), $properties, $condition))
  1700. {
  1701. return false;
  1702. }
  1703. else
  1704. {
  1705. $condition = new EqualityCondition(CourseToolRelCourseSection :: PROPERTY_SECTION_ID,
  1706. $course_section->get_id());
  1707. return $this->delete_objects(CourseToolRelCourseSection :: get_table_name(), $condition);
  1708. }
  1709. }
  1710. }
  1711. /*
  1712. * Deprecated function change_module_course_section($module_id, $course_section_id) { $condition = new
  1713. * EqualityCondition(CourseModule :: PROPERTY_ID, $module_id); $properties = array(CourseModule :: PROPERTY_SECTION
  1714. * => $course_section_id); return $this->update_objects(CourseModule :: get_table_name(), $properties, $condition);
  1715. * }
  1716. */
  1717. function count_course_sections($conditions = null)
  1718. {
  1719. return $this->count_objects(CourseSection :: get_table_name(), $conditions);
  1720. }
  1721. function retrieve_course_sections($condition = null, $offset = null, $count = null, $order_property = null)
  1722. {
  1723. $order_property = array(new ObjectTableOrder(CourseSection :: PROPERTY_DISPLAY_ORDER));
  1724. return $this->retrieve_objects(CourseSection :: get_table_name(), $condition, $offset, $count, $order_property,
  1725. CourseSection :: CLASS_NAME);
  1726. }
  1727. function times_taken($user_id, $assessment_id)
  1728. {
  1729. /*
  1730. * $query = 'SELECT COUNT('.$this->escape_column_name(UserAssessment :: PROPERTY_ID).') FROM
  1731. * '.$this->escape_table_name(UserAssessment :: get_table_name()).' WHERE
  1732. * '.$this->escape_column_name(UserAssessment :: PROPERTY_ASSESSMENT_ID).'='.$assessment_id.' AND
  1733. * '.$this->escape_column_name(UserAssessment :: PROPERTY_USER_ID).'='.$user_id; $sth =
  1734. * $this->get_connection()->prepare($query); $res = $sth->execute(); $row =
  1735. * $res->fetchRow(MDB2_FETCHMODE_ORDERED); return $row[0];
  1736. */
  1737. return 0;
  1738. }
  1739. // Inherited.
  1740. function is_visual_code_available($visual_code, $id = null) // course
  1741. {
  1742. $condition = new EqualityCondition(Course :: PROPERTY_VISUAL_CODE, $visual_code);
  1743. if ($id)
  1744. {
  1745. $conditions = array();
  1746. $conditions[] = new EqualityCondition(Course :: PROPERTY_VISUAL_CODE, $visual_code);
  1747. $conditions = new EqualityCondition(Course :: PROPERTY_ID, $id);
  1748. $condition = new AndCondition($conditions);
  1749. }
  1750. return ! ($this->count_courses($condition) == 1);
  1751. }
  1752. function retrieve_course_by_visual_code($visual_code)
  1753. {
  1754. $condition = new EqualityCondition(Course :: PROPERTY_VISUAL_CODE, $visual_code);
  1755. return $this->retrieve_object(Course :: get_table_name(), $condition, array(), Course :: class_name());
  1756. }
  1757. // nested trees functions for course_groups
  1758. function count_course_group_children($node)
  1759. {
  1760. return $this->count_children($node, $this->get_course_group_nested_condition($node));
  1761. }
  1762. function get_course_group_children($node, $recursive = false)
  1763. {
  1764. return $this->get_children($node, $recursive, $this->get_course_group_nested_condition($node));
  1765. }
  1766. function count_course_group_parents($node, $include_object = false)
  1767. {
  1768. return $this->count_parents($node, $include_object, $this->get_course_group_nested_condition($node));
  1769. }
  1770. function get_course_group_parents($node, $recursive = false, $include_object = false)
  1771. {
  1772. return $this->get_parents($node, $recursive, $include_object, $this->get_course_group_nested_condition($node));
  1773. }
  1774. function count_course_group_siblings($node, $include_object = false)
  1775. {
  1776. return $this->count_siblings($node, $include_object, $this->get_course_group_nested_condition($node));
  1777. }
  1778. function get_course_group_siblings($node, $include_object = false)
  1779. {
  1780. return $this->get_siblings($node, $include_object, $this->get_course_group_nested_condition($node));
  1781. }
  1782. function move_course_group($node, $new_parent_id = 0, $new_previous_id = 0)
  1783. {
  1784. return $this->move($node, $new_parent_id, $new_previous_id, $this->get_course_group_nested_condition($node));
  1785. }
  1786. function add_course_group_nested_values($node, $previous_visited, $number_of_elements = 1)
  1787. {
  1788. return $this->add_nested_values($node, $previous_visited, $number_of_elements,
  1789. $this->get_course_group_nested_condition($node));
  1790. }
  1791. function delete_course_group_nested_values($node)
  1792. {
  1793. return $this->delete_nested_values($node, $this->get_course_group_nested_condition($node));
  1794. }
  1795. /**
  1796. * Gets the conditions for the course group nested tree functions
  1797. *
  1798. * @param $course_group CourseGroup
  1799. */
  1800. private function get_course_group_nested_condition($course_group)
  1801. {
  1802. return new EqualityCondition(CourseGroup :: PROPERTY_COURSE_CODE, $course_group->get_course_code());
  1803. }
  1804. function retrieve_course_group_root($course_id)
  1805. {
  1806. $conditions = array();
  1807. $conditions[] = new EqualityCondition(CourseGroup :: PROPERTY_COURSE_CODE, $course_id);
  1808. $conditions[] = new EqualityCondition(CourseGroup :: PROPERTY_PARENT_ID, 0);
  1809. $condition = new AndCondition($conditions);
  1810. return $this->retrieve_course_groups($condition)->next_result();
  1811. }
  1812. function retrieve_new_publication_icon_ids($course_id, $user_id, $is_teacher = false, $tool = null, $category_id = null)
  1813. {
  1814. $publication_alias = $this->get_alias(ContentObjectPublication :: get_table_name());
  1815. $course_module_last_access_alias = $this->get_alias(CourseModuleLastAccess :: get_table_name());
  1816. $conditions = array();
  1817. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_COURSE_ID, $course_id);
  1818. // $access_conditions[] = new
  1819. // InequalityCondition(ContentObjectPublication::
  1820. // PROPERTY_MODIFIED_DATE, InequalityCondition::GREATER_THAN_OR_EQUAL,
  1821. // CourseModuleLastAccess::PROPERTY_ACCESS_DATE);
  1822. // $access_conditions[] = new EqualityCondition(CourseModuleLastAccess
  1823. // :: PROPERTY_ACCESS_DATE, NULL, $course_module_last_access_alias,
  1824. // true);
  1825. // $conditions[] = new OrCondition($access_conditions);
  1826. if ($is_teacher)
  1827. { // as the teacher has view right on all publications, there is no need
  1828. // to retrieve the individual publications ids
  1829. $query = 'SELECT DISTINCT ' . $publication_alias . '.' . ContentObjectPublication :: PROPERTY_TOOL;
  1830. }
  1831. else
  1832. { // for a student the publication ids are needed, to check the view
  1833. // right
  1834. $query = 'SELECT ' . $publication_alias . '.' . ContentObjectPublication :: PROPERTY_ID . ', ' . $publication_alias . '.' . ContentObjectPublication :: PROPERTY_TOOL;
  1835. $query .= ', ' . $publication_alias . '.' . ContentObjectPublication :: PROPERTY_CATEGORY_ID;
  1836. }
  1837. $query .= ' FROM ' . $this->escape_table_name(ContentObjectPublication :: get_table_name()) . ' AS ' . $publication_alias;
  1838. $query .= ' LEFT JOIN ' . $this->escape_table_name(CourseModuleLastAccess :: get_table_name()) . ' AS ' . $course_module_last_access_alias . ' ON ';
  1839. $query .= $this->escape_column_name(CourseModuleLastAccess :: PROPERTY_COURSE_CODE,
  1840. $course_module_last_access_alias);
  1841. $query .= '=' . $this->escape_column_name(ContentObjectPublication :: PROPERTY_COURSE_ID, $publication_alias);
  1842. $query .= ' AND ' . $this->escape_column_name(CourseModuleLastAccess :: PROPERTY_MODULE_NAME,
  1843. $course_module_last_access_alias);
  1844. $query .= '=' . $this->escape_column_name(ContentObjectPublication :: PROPERTY_TOOL, $publication_alias);
  1845. $query .= ' AND ' . $this->escape_column_name(CourseModuleLastAccess :: PROPERTY_USER_ID,
  1846. $course_module_last_access_alias);
  1847. $query .= '=' . $user_id;
  1848. $query .= ' AND ' . $this->escape_column_name(CourseModuleLastAccess :: PROPERTY_CATEGORY_ID,
  1849. $course_module_last_access_alias);
  1850. $query .= '=' . $this->escape_column_name(ContentObjectPublication :: PROPERTY_CATEGORY_ID, $publication_alias);
  1851. if (! is_null($tool))
  1852. {
  1853. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_TOOL, $tool);
  1854. }
  1855. if (! is_null($category_id))
  1856. {
  1857. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_CATEGORY_ID, $category_id);
  1858. }
  1859. $conditions[] = new EqualityCondition(ContentObjectPublication :: PROPERTY_HIDDEN, 0);
  1860. $conditions_publication_period = array();
  1861. $conditions_publication_period[] = new InequalityCondition(ContentObjectPublication :: PROPERTY_FROM_DATE,
  1862. InequalityCondition :: LESS_THAN_OR_EQUAL, time());
  1863. $conditions_publication_period[] = new InequalityCondition(ContentObjectPublication :: PROPERTY_TO_DATE,
  1864. InequalityCondition :: GREATER_THAN_OR_EQUAL, time());
  1865. $condition_publication_period = new AndCondition($conditions_publication_period);
  1866. $condition_publication_forever = new EqualityCondition(ContentObjectPublication :: PROPERTY_FROM_DATE, 0);
  1867. $conditions[] = new OrCondition($condition_publication_forever, $condition_publication_period);
  1868. $conditions[] = new NotCondition(new EqualityCondition(ContentObjectPublication :: PROPERTY_TOOL, 'home'));
  1869. $condition = new AndCondition($conditions);
  1870. $translator = ConditionTranslator :: factory($this,
  1871. $this->get_alias(ContentObjectPublication :: get_table_name()));
  1872. $query .= $translator->render_query($condition);
  1873. $query .= ' AND (' . $publication_alias . '.modified >= ' . $course_module_last_access_alias . '.access_date OR ' . $course_module_last_access_alias . '.access_date IS NULL )';
  1874. $result = $this->retrieve_object_set($query, ContentObjectPublication :: get_table_name());
  1875. // We need to do this due to issues with the dataclass cache for joins
  1876. DataClassCache :: truncate(ContentObjectPublication :: class_name());
  1877. return $result;
  1878. }
  1879. function get_user_with_most_publications_in_course($course_id, $only_teachers = true)
  1880. {
  1881. $content_object_publication_table_name = $this->get_table_name(ContentObjectPublication :: get_table_name());
  1882. $course_rel_user_table_name = $this->get_table_name(CourseUserRelation :: get_table_name());
  1883. $content_object_publication_table_alias = $this->get_alias(ContentObjectPublication :: get_table_name());
  1884. $course_rel_user_table_alias = $this->get_alias(CourseUserRelation :: get_table_name());
  1885. $query = 'SELECT ' . $this->escape_column_name(CourseUserRelation :: PROPERTY_USER_ID,
  1886. $course_rel_user_table_alias);
  1887. $query .= ', COUNT(' . $this->escape_column_name(ContentObjectPublication :: PROPERTY_ID,
  1888. $content_object_publication_table_alias) . ') as count';
  1889. $query .= ' FROM ' . $course_rel_user_table_name . ' AS ' . $course_rel_user_table_alias;
  1890. $query .= ' LEFT JOIN ' . $content_object_publication_table_name . ' AS ' . $content_object_publication_table_alias . ' ON ';
  1891. $query .= $this->escape_column_name(CourseUserRelation :: PROPERTY_COURSE_ID, $course_rel_user_table_alias) . ' = ' . $this->escape_column_name(
  1892. ContentObjectPublication :: PROPERTY_COURSE_ID, $content_object_publication_table_alias);
  1893. $query .= ' AND ' . $this->escape_column_name(CourseUserRelation :: PROPERTY_USER_ID,
  1894. $course_rel_user_table_alias) . ' = ' . $this->escape_column_name(
  1895. ContentObjectPublication :: PROPERTY_PUBLISHER_ID, $content_object_publication_table_alias);
  1896. if ($only_teachers)
  1897. {
  1898. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_STATUS,
  1899. CourseUserRelation :: STATUS_TEACHER, CourseUserRelation :: get_table_name());
  1900. }
  1901. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_COURSE_ID, $course_id,
  1902. CourseUserRelation :: get_table_name());
  1903. $condition = new AndCondition($conditions);
  1904. $translator = ConditionTranslator :: factory($this);
  1905. $query .= $translator->render_query($condition);
  1906. $query .= ' GROUP BY ' . $this->escape_column_name(CourseUserRelation :: PROPERTY_USER_ID,
  1907. $course_rel_user_table_alias);
  1908. $query .= ' ORDER BY count DESC LIMIT 0,1';
  1909. $result = $this->query($query);
  1910. $res = $this->query($query);
  1911. $record = $res->fetchRow(MDB2_FETCHMODE_ASSOC);
  1912. $res->free();
  1913. if ($record['count'] >= 0)
  1914. {
  1915. return $record[CourseUserRelation :: PROPERTY_USER_ID];
  1916. }
  1917. }
  1918. // Additional Rights System
  1919. function retrieve_course_group_right_location($right_id, $course_group_id, $location_id)
  1920. {
  1921. $conditions = array();
  1922. $conditions[] = new EqualityCondition(CourseGroupRightLocation :: PROPERTY_RIGHT_ID, $right_id);
  1923. $conditions[] = new EqualityCondition(CourseGroupRightLocation :: PROPERTY_COURSE_GROUP_ID, $course_group_id);
  1924. $conditions[] = new EqualityCondition(CourseGroupRightLocation :: PROPERTY_LOCATION_ID, $location_id);
  1925. $condition = new AndCondition($conditions);
  1926. return $this->retrieve_object(CourseGroupRightLocation :: get_table_name(), $condition, array(),
  1927. CourseGroupRightLocation :: CLASS_NAME);
  1928. }
  1929. function retrieve_course_group_right_locations($condition = null, $offset = null, $max_objects = null, $order_by = null)
  1930. {
  1931. return $this->retrieve_objects(CourseGroupRightLocation :: get_table_name(), $condition, $offset, $max_objects,
  1932. $order_by, CourseGroupRightLocation :: CLASS_NAME);
  1933. }
  1934. function delete_course_type_user_category_rel_course(
  1935. CourseTypeUserCategoryRelCourse $course_type_user_category_rel_course)
  1936. {
  1937. $conditions = array();
  1938. $conditions[] = new EqualityCondition(CourseTypeUserCategoryRelCourse :: PROPERTY_COURSE_ID,
  1939. $course_type_user_category_rel_course->get_course_id());
  1940. $conditions[] = new EqualityCondition(CourseTypeUserCategoryRelCourse :: PROPERTY_COURSE_TYPE_USER_CATEGORY_ID,
  1941. $course_type_user_category_rel_course->get_course_type_user_category_id());
  1942. $condition = new AndCondition($conditions);
  1943. return $this->delete(CourseTypeUserCategoryRelCourse :: get_table_name(), $condition);
  1944. }
  1945. function update_course_type_user_category_rel_course(
  1946. CourseTypeUserCategoryRelCourse $course_type_user_category_rel_course)
  1947. {
  1948. $conditions = array();
  1949. $conditions[] = new EqualityCondition(CourseTypeUserCategoryRelCourse :: PROPERTY_COURSE_ID,
  1950. $course_type_user_category_rel_course->get_course_id());
  1951. $conditions[] = new EqualityCondition(CourseTypeUserCategoryRelCourse :: PROPERTY_COURSE_TYPE_USER_CATEGORY_ID,
  1952. $course_type_user_category_rel_course->get_course_type_user_category_id());
  1953. $condition = new AndCondition($conditions);
  1954. return $this->update($course_type_user_category_rel_course, $condition);
  1955. }
  1956. function count_course_type_user_category_rel_courses($conditions = null)
  1957. {
  1958. return $this->count_objects(CourseTypeUserCategoryRelCourse :: get_table_name(), $conditions);
  1959. }
  1960. function retrieve_course_type_user_category_rel_courses($condition = null, $offset = null, $count = null, $order_property = null)
  1961. {
  1962. return $this->retrieve_objects(CourseTypeUserCategoryRelCourse :: get_table_name(), $condition, $offset, $count,
  1963. $order_property, CourseTypeUserCategoryRelCourse :: CLASS_NAME);
  1964. }
  1965. /**
  1966. * Cleans the sort value of a current course_type_user_category starting by the given sort value
  1967. *
  1968. * @param $start_sort_value int
  1969. * @param $course_type_user_category_id int
  1970. */
  1971. function clean_course_type_user_category_rel_course_sort($start_sort_value, $course_type_user_category_id)
  1972. {
  1973. $conditions = array();
  1974. $conditions[] = new InEqualityCondition(CourseTypeUserCategoryRelCourse :: PROPERTY_SORT,
  1975. InEqualityCondition :: GREATER_THAN, $start_sort_value);
  1976. $conditions[] = new EqualityCondition(CourseTypeUserCategoryRelCourse :: PROPERTY_COURSE_TYPE_USER_CATEGORY_ID,
  1977. $course_type_user_category_id);
  1978. $condition = new AndCondition($conditions);
  1979. $properties = array();
  1980. $properties[CourseTypeUserCategoryRelCourse :: PROPERTY_SORT] = $this->escape_column_name(
  1981. CourseTypeUserCategoryRelCourse :: PROPERTY_SORT) . '-1';
  1982. return $this->update_objects(CourseTypeUserCategoryRelCourse :: get_table_name(), $properties, $condition);
  1983. }
  1984. function retrieve_course_user_categories_from_course_type($course_type_id, $user_id)
  1985. {
  1986. $conditions = array();
  1987. $conditions[] = new EqualityCondition(CourseTypeUserCategory :: PROPERTY_COURSE_TYPE_ID, $course_type_id,
  1988. CourseTypeUserCategory :: get_table_name());
  1989. $conditions[] = new EqualityCondition(CourseTypeUserCategory :: PROPERTY_USER_ID, $user_id,
  1990. CourseTypeUserCategory :: get_table_name());
  1991. $condition = new AndCondition($conditions);
  1992. $course_user_category_table_name = $this->get_table_name(CourseUserCategory :: get_table_name());
  1993. $course_type_user_category_table_name = $this->get_table_name(CourseTypeUserCategory :: get_table_name());
  1994. $course_user_category_alias = $this->get_alias(CourseUserCategory :: get_table_name());
  1995. $course_type_user_category_alias = $this->get_alias(CourseTypeUserCategory :: get_table_name());
  1996. $course_user_category_id = $this->escape_column_name(CourseUserCategory :: PROPERTY_ID,
  1997. $course_user_category_alias);
  1998. $course_type_user_category_id = $this->escape_column_name(
  1999. CourseTypeUserCategory :: PROPERTY_COURSE_USER_CATEGORY_ID, $course_type_user_category_alias);
  2000. $query = 'SELECT ' . $course_type_user_category_alias . '.*, ' . $course_user_category_alias . '.title FROM ' . $course_type_user_category_table_name . ' AS ' . $course_type_user_category_alias;
  2001. $query .= ' JOIN ' . $course_user_category_table_name . ' AS ' . $course_user_category_alias . ' ON ' . $course_user_category_id . '=' . $course_type_user_category_id;
  2002. return $this->retrieve_object_set($query, CourseTypeUserCategory :: get_table_name(), $condition, null, null,
  2003. new ObjectTableOrder(CourseTypeUserCategory :: PROPERTY_SORT, SORT_ASC),
  2004. CourseTypeUserCategory :: CLASS_NAME);
  2005. }
  2006. function retrieve_all_courses_with_course_categories($user_id, $group_ids)
  2007. {
  2008. $course_alias = $this->get_alias(Course :: get_table_name());
  2009. $course_user_relation_alias = $this->get_alias(CourseUserRelation :: get_table_name());
  2010. $course_group_relation_alias = $this->get_alias(CourseGroupRelation :: get_table_name());
  2011. $course_type_user_category_rel_course_table = $this->get_table_name(
  2012. CourseTypeUserCategoryRelCourse :: get_table_name());
  2013. $course_type_user_category_rel_course_alias = $this->get_alias(
  2014. CourseTypeUserCategoryRelCourse :: get_table_name());
  2015. $sort_column = $this->escape('sort');
  2016. $name_column = $this->escape('course_name');
  2017. $course_type_user_category_rel_course_user_column = $this->escape_column_name(
  2018. CourseTypeUserCategoryRelCourse :: PROPERTY_USER_ID, $course_type_user_category_rel_course_alias);
  2019. $course_type_user_category_rel_course_course_column = $this->escape_column_name(
  2020. CourseTypeUserCategoryRelCourse :: PROPERTY_COURSE_ID, $course_type_user_category_rel_course_alias);
  2021. $course_id_column = $this->escape_column_name(Course :: PROPERTY_ID, $course_alias);
  2022. $condition_translator = ConditionTranslator :: factory($this);
  2023. $common_query_part = ' LEFT JOIN ' . $course_type_user_category_rel_course_table . ' AS ' . $course_type_user_category_rel_course_alias . ' ON ';
  2024. $common_query_part .= $course_type_user_category_rel_course_user_column . ' = ' . $user_id . ' AND ';
  2025. $common_query_part .= $course_type_user_category_rel_course_course_column . ' = ' . $course_id_column;
  2026. $query = 'SELECT ' . $course_alias . '.*, ' . $course_type_user_category_rel_course_alias . '.course_type_user_category_id, ' . $course_type_user_category_rel_course_alias . '.sort ' . $sort_column . ', ' . $course_alias . '.title ' . $name_column;
  2027. $query .= ' FROM ' . $this->escape_table_name(CourseUserRelation :: get_table_name()) . ' AS ' . $course_user_relation_alias;
  2028. $query .= ' JOIN ' . $this->escape_table_name(Course :: get_table_name()) . ' AS ' . $course_alias . ' ON ' . $this->escape_column_name(
  2029. Course :: PROPERTY_ID, $course_alias) . ' = ' . $this->escape_column_name(
  2030. CourseUserRelation :: PROPERTY_COURSE_ID, $course_user_relation_alias);
  2031. $query .= $common_query_part;
  2032. $user_condition = new EqualityCondition(CourseUserRelation :: PROPERTY_USER_ID, $user_id,
  2033. $course_user_relation_alias, true);
  2034. $query .= $condition_translator->render_query($user_condition);
  2035. if (count($group_ids) > 0)
  2036. {
  2037. $query .= ' UNION ';
  2038. $query .= 'SELECT ' . $course_alias . '.*, ' . $course_type_user_category_rel_course_alias . '.course_type_user_category_id, ' . $course_type_user_category_rel_course_alias . '.sort ' . $sort_column . ', ' . $course_alias . '.title ' . $name_column;
  2039. $query .= ' FROM ' . $this->escape_table_name(CourseGroupRelation :: get_table_name()) . ' AS ' . $course_group_relation_alias;
  2040. $query .= ' JOIN ' . $this->escape_table_name(Course :: get_table_name()) . ' AS ' . $course_alias . ' ON ' . $this->escape_column_name(
  2041. Course :: PROPERTY_ID, $course_alias) . ' = ' . $this->escape_column_name(
  2042. CourseGroupRelation :: PROPERTY_COURSE_ID, $course_group_relation_alias);
  2043. $query .= $common_query_part;
  2044. $group_condition = new InCondition(CourseGroupRelation :: PROPERTY_GROUP_ID, $group_ids,
  2045. $course_group_relation_alias, true);
  2046. $query .= $condition_translator->render_query($group_condition);
  2047. }
  2048. $query .= ' ORDER BY ' . $sort_column . ' ASC, ' . $name_column . ' ASC';
  2049. return $this->retrieve_object_set($query, Course :: get_table_name(), null, null, null, null,
  2050. '\application\weblcms\course\Course');
  2051. }
  2052. /**
  2053. * Retrieves all users subscribed to a course, including the users in all subscribed (sub-)groups.
  2054. *
  2055. * @param $condition Condition
  2056. * @param $offset int
  2057. * @param $count int
  2058. * @param $order_property order
  2059. */
  2060. function retrieve_users_directly_subscribed_to_course($condition = null, $offset = null, $count = null, $order_property = null)
  2061. {
  2062. // datamanagers
  2063. $user_dm = UserDataManager :: get_instance();
  2064. // - SELECT
  2065. $query .= 'SELECT ';
  2066. // -- id
  2067. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2068. User :: PROPERTY_ID);
  2069. $query .= ', ';
  2070. // -- official code
  2071. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2072. User :: PROPERTY_OFFICIAL_CODE);
  2073. $query .= ', ';
  2074. // -- lastname
  2075. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2076. User :: PROPERTY_LASTNAME);
  2077. $query .= ', ';
  2078. // -- firstname
  2079. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2080. User :: PROPERTY_FIRSTNAME);
  2081. $query .= ', ';
  2082. // -- username
  2083. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2084. User :: PROPERTY_USERNAME);
  2085. $query .= ', ';
  2086. // -- email
  2087. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2088. User :: PROPERTY_EMAIL);
  2089. $query .= ', ';
  2090. // -- record_subscription_status
  2091. $query .= $this->get_alias(CourseUserRelation :: get_table_name()) . '.' . $this->escape_column_name(
  2092. CourseUserRelation :: PROPERTY_STATUS);
  2093. // $query .= ' AS "record_subscription_status"';
  2094. // - FROM course_user_relation
  2095. $query .= ' FROM ' . $this->escape_table_name(CourseUserRelation :: get_table_name()) . ' AS ' . $this->get_alias(
  2096. CourseUserRelation :: get_table_name());
  2097. // - JOIN user
  2098. $query .= ' JOIN ' . $user_dm->escape_table_name(User :: get_table_name()) . ' AS ' . $user_dm->get_alias(
  2099. User :: get_table_name());
  2100. $query .= ' ON ' . $this->get_alias(CourseUserRelation :: get_table_name()) . '.' . $this->escape_column_name(
  2101. CourseUserRelation :: PROPERTY_USER_ID);
  2102. $query .= ' = ' . $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2103. User :: PROPERTY_ID);
  2104. return $this->retrieve_object_set($query, User :: get_table_name(), $condition, $offset, $count,
  2105. $order_property, User :: CLASS_NAME);
  2106. }
  2107. /**
  2108. * Counts all users directly subscribed to a course, users that are subscribed through groups are not counted.
  2109. *
  2110. * @param $condition Condition
  2111. */
  2112. function count_users_directly_subscribed_to_course($condition = null)
  2113. {
  2114. // datamanagers
  2115. $user_dm = UserDataManager :: get_instance();
  2116. // - SELECT
  2117. $query .= 'SELECT COUNT(1)';
  2118. // - FROM course_user_relation
  2119. $query .= ' FROM ' . $this->escape_table_name(CourseUserRelation :: get_table_name()) . ' AS ' . $this->get_alias(
  2120. CourseUserRelation :: get_table_name());
  2121. // - JOIN user
  2122. $query .= ' JOIN ' . $user_dm->escape_table_name(User :: get_table_name()) . ' AS ' . $user_dm->get_alias(
  2123. User :: get_table_name());
  2124. $query .= ' ON ' . $this->get_alias(CourseUserRelation :: get_table_name()) . '.' . $this->escape_column_name(
  2125. CourseUserRelation :: PROPERTY_USER_ID);
  2126. $query .= ' = ' . $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2127. User :: PROPERTY_ID);
  2128. return $this->count_result_set($query, CourseUserRelation :: get_table_name(), $condition);
  2129. }
  2130. /**
  2131. * Retrieves all groups directly subscribed to a course.
  2132. *
  2133. * @param $condition Condition
  2134. * @param $offset int
  2135. * @param $count int
  2136. * @param $order_property order
  2137. */
  2138. function retrieve_groups_directly_subscribed_to_course($condition = null, $offset = null, $count = null, $order_property = null)
  2139. {
  2140. // datamanagers
  2141. $group_dm = GroupDataManager :: get_instance();
  2142. // - SELECT
  2143. $query .= 'SELECT ';
  2144. // -- id
  2145. $query .= $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2146. Group :: PROPERTY_ID);
  2147. $query .= ', ';
  2148. // -- name
  2149. $query .= $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2150. Group :: PROPERTY_NAME);
  2151. $query .= ', ';
  2152. // -- description
  2153. $query .= $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2154. Group :: PROPERTY_DESCRIPTION);
  2155. $query .= ', ';
  2156. // -- code
  2157. $query .= $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2158. Group :: PROPERTY_CODE);
  2159. $query .= ', ';
  2160. // -- record_subscription_status
  2161. $query .= $this->get_alias(CourseGroupRelation :: get_table_name()) . '.' . $this->escape_column_name(
  2162. CourseGroupRelation :: PROPERTY_STATUS);
  2163. // - FROM course_group_relation
  2164. $query .= ' FROM ' . $this->escape_table_name(CourseGroupRelation :: get_table_name()) . ' AS ' . $this->get_alias(
  2165. CourseGroupRelation :: get_table_name());
  2166. // - JOIN user
  2167. $query .= ' JOIN ' . $group_dm->escape_table_name(Group :: get_table_name()) . ' AS ' . $group_dm->get_alias(
  2168. Group :: get_table_name());
  2169. $query .= ' ON ' . $this->get_alias(CourseGroupRelation :: get_table_name()) . '.' . $this->escape_column_name(
  2170. CourseGroupRelation :: PROPERTY_GROUP_ID);
  2171. $query .= ' = ' . $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2172. Group :: PROPERTY_ID);
  2173. return $this->retrieve_object_set($query, Group :: get_table_name(), $condition, $offset, $count,
  2174. $order_property, Group :: CLASS_NAME);
  2175. }
  2176. /**
  2177. * Counts all groups directly subscribed to a course.
  2178. *
  2179. * @param $condition Condition
  2180. */
  2181. function count_groups_directly_subscribed_to_course($condition = null)
  2182. {
  2183. // datamanagers
  2184. $group_dm = GroupDataManager :: get_instance();
  2185. // - SELECT
  2186. $query .= 'SELECT COUNT(1)';
  2187. // - FROM course_user_relation
  2188. $query .= ' FROM ' . $this->escape_table_name(CourseGroupRelation :: get_table_name()) . ' AS ' . $this->get_alias(
  2189. CourseGroupRelation :: get_table_name());
  2190. // - JOIN user
  2191. $query .= ' JOIN ' . $group_dm->escape_table_name(Group :: get_table_name()) . ' AS ' . $group_dm->get_alias(
  2192. Group :: get_table_name());
  2193. $query .= ' ON ' . $this->get_alias(CourseGroupRelation :: get_table_name()) . '.' . $this->escape_column_name(
  2194. CourseGroupRelation :: PROPERTY_GROUP_ID);
  2195. $query .= ' = ' . $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2196. Group :: PROPERTY_ID);
  2197. return $this->count_result_set($query, CourseGroupRelation :: get_table_name(), $condition);
  2198. }
  2199. /**
  2200. * Retrieves all users not directly subscribed to a course, users that are subscribed through groups are still shown
  2201. * in this list. The course_id is not given in the condition statement because it is used in an advanced JOIN that
  2202. * replaces a NOT EXITS. Including the course_id in the condition statement could result in invalid queries.
  2203. *
  2204. * @param $condition Condition
  2205. * @param $offset int
  2206. * @param $count int
  2207. * @param $order_property order
  2208. */
  2209. function retrieve_users_not_subscribed_to_course($course_id, $condition = null, $offset = null, $count = null,
  2210. $order_property = null)
  2211. {
  2212. // datamanagers
  2213. $user_dm = UserDataManager :: get_instance();
  2214. $user_table = $user_dm->get_table_name(User :: get_table_name());
  2215. $user_table_alias = $user_dm->get_alias(User :: get_table_name());
  2216. $course_user_relation_table = $this->escape_table_name(CourseUserRelation :: get_table_name());
  2217. $course_user_relation_table_alias = $user_dm->get_alias(CourseUserRelation :: get_table_name());
  2218. // - SELECT
  2219. // $query .= 'SELECT ';
  2220. $properties = array(User :: PROPERTY_ID, User :: PROPERTY_OFFICIAL_CODE, User :: PROPERTY_AUTH_SOURCE,
  2221. User :: PROPERTY_LASTNAME, User :: PROPERTY_FIRSTNAME, User :: PROPERTY_USERNAME, User :: PROPERTY_EMAIL,
  2222. User :: PROPERTY_STATUS);
  2223. $esccaped_properties = array();
  2224. foreach ($properties as $property)
  2225. {
  2226. $escaped_properties[] = $user_dm->escape_column_name($property, $user_table_alias);
  2227. }
  2228. $query_builder = $user_dm->get_connection()->createQueryBuilder();
  2229. $query_builder->select(implode(',', $escaped_properties));
  2230. // // -- id
  2231. // $query .= $user_dm->get_alias(User :: get_table_name()) . '.' .
  2232. // $user_dm->escape_column_name(User :: PROPERTY_ID);
  2233. // $query .= ', ';
  2234. //
  2235. // // -- official code
  2236. // $query .= $user_dm->get_alias(User :: get_table_name()) . '.' .
  2237. // $user_dm->escape_column_name(User :: PROPERTY_OFFICIAL_CODE);
  2238. // $query .= ', ';
  2239. //
  2240. // // -- auth source
  2241. // $query .= $user_dm->get_alias(User :: get_table_name()) . '.' .
  2242. // $user_dm->escape_column_name(User :: PROPERTY_AUTH_SOURCE);
  2243. // $query .= ', ';
  2244. //
  2245. // // -- lastname
  2246. // $query .= $user_dm->get_alias(User :: get_table_name()) . '.' .
  2247. // $user_dm->escape_column_name(User :: PROPERTY_LASTNAME);
  2248. // $query .= ', ';
  2249. //
  2250. // // -- firstname
  2251. // $query .= $user_dm->get_alias(User :: get_table_name()) . '.' .
  2252. // $user_dm->escape_column_name(User :: PROPERTY_FIRSTNAME);
  2253. // $query .= ', ';
  2254. //
  2255. // // -- username
  2256. // $query .= $user_dm->get_alias(User :: get_table_name()) . '.' .
  2257. // $user_dm->escape_column_name(User :: PROPERTY_USERNAME);
  2258. // $query .= ', ';
  2259. //
  2260. // // -- email
  2261. // $query .= $user_dm->get_alias(User :: get_table_name()) . '.' .
  2262. // $user_dm->escape_column_name(User :: PROPERTY_EMAIL);
  2263. // $query .= ', ';
  2264. //
  2265. // // -- status
  2266. // $query .= $user_dm->get_alias(User :: get_table_name()) . '.' .
  2267. // $user_dm->escape_column_name(User :: PROPERTY_STATUS);
  2268. //
  2269. // // - FROM course_user_relation
  2270. // $query .= ' FROM ' . $user_dm->escape_table_name(User ::
  2271. // get_table_name()) . ' AS ' .
  2272. // $user_dm->get_alias(User :: get_table_name());
  2273. $query_builder->from($user_table, $user_table_alias);
  2274. // - JOIN user
  2275. // $query .= ' LEFT JOIN ' . $this->escape_table_name(CourseUserRelation
  2276. // :: get_table_name()) . ' AS ' .
  2277. // $user_dm->get_alias(CourseUserRelation :: get_table_name());
  2278. // $query .= ' ON ' . $user_dm->get_alias(User :: get_table_name()) .
  2279. // '.' .
  2280. // $user_dm->escape_column_name(User :: PROPERTY_ID);
  2281. // $query .= ' = ' . $user_dm->get_alias(CourseUserRelation ::
  2282. // get_table_name()) . '.' .
  2283. // $this->escape_column_name(CourseUserRelation :: PROPERTY_USER_ID);
  2284. // $query .= ' AND ' . $user_dm->get_alias(CourseUserRelation ::
  2285. // get_table_name()) . '.' .
  2286. // $this->escape_column_name(CourseUserRelation :: PROPERTY_COURSE_ID);
  2287. // $query .= ' = ' . $course_id;
  2288. $join_condition = $user_dm->escape_column_name(User :: PROPERTY_ID, $user_table_alias);
  2289. $join_condition .= ' = ' . $this->escape_column_name(CourseUserRelation :: PROPERTY_USER_ID,
  2290. $course_user_relation_table_alias);
  2291. $join_condition .= ' AND ' . $this->escape_column_name(CourseUserRelation :: PROPERTY_COURSE_ID,
  2292. $course_user_relation_table_alias);
  2293. $join_condition .= ' = ' . $course_id;
  2294. $query_builder->leftJoin($user_table_alias, $course_user_relation_table, $course_user_relation_table_alias,
  2295. $join_condition);
  2296. // additional where condition to mimic NOT EXISTS
  2297. $not_exist_mimic = new EqualityCondition(CourseUserRelation :: PROPERTY_USER_ID, null,
  2298. CourseUserRelation :: get_table_name());
  2299. // reconstruct conditions
  2300. $conditions = array();
  2301. $conditions[] = $not_exist_mimic;
  2302. if (isset($condition))
  2303. {
  2304. $conditions[] = $condition;
  2305. }
  2306. $condition = new AndCondition($conditions);
  2307. // retrieve
  2308. return $user_dm->retrieve_object_set($query_builder, User :: get_table_name(), $condition, $offset, $count,
  2309. $order_property, User :: CLASS_NAME);
  2310. }
  2311. /**
  2312. * Counts all users not directly subscribed to a course, users that are subscribed through groups are still counted.
  2313. * The course_id is not given in the condition statement because it is used in an advanced JOIN that replaces a NOT
  2314. * EXITS. Including the course_id in the condition statement could result in invalid queries.
  2315. *
  2316. * @param $condition Condition
  2317. */
  2318. function count_users_not_subscribed_to_course($course_id, $condition = null)
  2319. {
  2320. $query_builder = new QueryBuilder();
  2321. // datamanagers
  2322. $user_dm = UserDataManager :: get_instance();
  2323. // Table definitions
  2324. $user_table = $user_dm->escape_table_name(User :: get_table_name());
  2325. $user_table_alias = $user_dm->get_alias(User :: get_table_name());
  2326. $course_user_relation_table = $this->escape_table_name(CourseUserRelation :: get_table_name());
  2327. $course_user_relation_table_alias = $user_dm->get_alias(CourseUserRelation :: get_table_name());
  2328. // - SELECT
  2329. // $query .= 'SELECT COUNT(1)';
  2330. $query_builder->select('COUNT(1)');
  2331. // - FROM course_user_relation
  2332. // $query .= ' FROM ' . $user_dm->escape_table_name(User ::
  2333. // get_table_name()) . ' AS ' .
  2334. // $user_dm->get_alias(User :: get_table_name());
  2335. $query_builder->from($user_table, $user_table_alias);
  2336. // - JOIN user
  2337. // $query .= ' LEFT JOIN ' . $this->escape_table_name(CourseUserRelation
  2338. // :: get_table_name()) . ' AS ' .
  2339. // $user_dm->get_alias(CourseUserRelation :: get_table_name());
  2340. // $query .= ' ON ' . $user_dm->get_alias(User :: get_table_name()) .
  2341. // '.' .
  2342. // $user_dm->escape_column_name(User :: PROPERTY_ID);
  2343. // $query .= ' = ' . $user_dm->get_alias(CourseUserRelation ::
  2344. // get_table_name()) . '.' .
  2345. // $this->escape_column_name(CourseUserRelation :: PROPERTY_USER_ID);
  2346. // $query .= ' AND ' . $user_dm->get_alias(CourseUserRelation ::
  2347. // get_table_name()) . '.' .
  2348. // $this->escape_column_name(CourseUserRelation :: PROPERTY_COURSE_ID);
  2349. // $query .= ' = ' . $course_id;
  2350. $join_condition = $user_dm->escape_column_name(User :: PROPERTY_ID, $user_table_alias);
  2351. $join_condition .= ' = ' . $this->escape_column_name(CourseUserRelation :: PROPERTY_USER_ID,
  2352. $course_user_relation_table_alias);
  2353. $join_condition .= ' AND ' . $this->escape_column_name(CourseUserRelation :: PROPERTY_COURSE_ID,
  2354. $course_user_relation_table_alias);
  2355. $join_condition .= ' = ' . $course_id;
  2356. $query_builder->leftJoin($user_table_alias, $course_user_relation_table, $course_user_relation_table_alias,
  2357. $join_condition);
  2358. // additional where condition to mimic NOT EXISTS
  2359. $not_exist_mimic = new EqualityCondition(CourseUserRelation :: PROPERTY_USER_ID, null,
  2360. CourseUserRelation :: get_table_name());
  2361. // reconstruct conditions
  2362. $conditions = array();
  2363. $conditions[] = $not_exist_mimic;
  2364. if (isset($condition))
  2365. {
  2366. $conditions[] = $condition;
  2367. }
  2368. $condition = new AndCondition($conditions);
  2369. // retrieve
  2370. return $user_dm->count_result_set($query_builder, User :: get_table_name(), $condition);
  2371. }
  2372. /**
  2373. * Retrieves all the platform groups subscribed in the given courses
  2374. *
  2375. * @param $course_ids <type>
  2376. * @return Mdb2ResultSet
  2377. */
  2378. function retrieve_all_subscribed_platform_groups($course_ids)
  2379. {
  2380. $condition = new InCondition(CourseGroupRelation :: PROPERTY_COURSE_ID, $course_ids);
  2381. $group_dm = GroupDataManager :: get_instance();
  2382. $group_rel_course_alias = $this->get_alias(CourseGroupRelation :: get_table_name());
  2383. $group_alias = $group_dm->get_alias(Group :: get_table_name());
  2384. $query = 'SELECT ' . $group_dm->escape_column_name(Group :: PROPERTY_LEFT_VALUE, $table_alias) . ', ' . $group_dm->escape_column_name(
  2385. Group :: PROPERTY_RIGHT_VALUE, $table_alias);
  2386. $query .= ' FROM ' . $this->escape_table_name(CourseGroupRelation :: get_table_name()) . ' as ' . $group_rel_course_alias;
  2387. $query .= ' JOIN ' . $group_dm->escape_table_name(Group :: get_table_name()) . ' as ' . $group_alias . ' on ' . $this->escape_column_name(
  2388. CourseGroupRelation :: PROPERTY_GROUP_ID, $group_rel_course_alias) . ' = ' . $group_dm->escape_column_name(
  2389. Group :: PROPERTY_ID, $group_alias);
  2390. $direct_subscribed_groups = $this->retrieve_object_set($query, CourseGroupRelation :: get_table_name(),
  2391. $condition, null, null, null, Group :: CLASS_NAME);
  2392. while ($direct_subscribed_group = $direct_subscribed_groups->next_result())
  2393. {
  2394. $and_conditions = array();
  2395. $and_conditions[] = new InequalityCondition(Group :: PROPERTY_LEFT_VALUE,
  2396. InequalityCondition :: GREATER_THAN_OR_EQUAL, $direct_subscribed_group->get_left_value(),
  2397. $group_alias, true);
  2398. $and_conditions[] = new InequalityCondition(Group :: PROPERTY_RIGHT_VALUE,
  2399. InequalityCondition :: LESS_THAN_OR_EQUAL, $direct_subscribed_group->get_right_value(), $group_alias,
  2400. true);
  2401. $sub_conditions[] = new AndCondition($and_conditions);
  2402. }
  2403. $condition = new OrCondition($sub_conditions);
  2404. $query = 'SELECT *';
  2405. $query .= ' FROM ' . $group_dm->escape_table_name(Group :: get_table_name()) . ' as ' . $group_alias;
  2406. return $this->retrieve_object_set($query, Group :: get_table_name(), $condition, null, null, null,
  2407. Group :: CLASS_NAME);
  2408. }
  2409. /**
  2410. * Retrieves all users subscribed to a course, including the users in all subscribed (sub-)groups. The course_id is
  2411. * not given in the condition statement because it is used to select the subgroups BEFORE running the actual select.
  2412. * Including the course_id in the condition statement could result in invalid queries.
  2413. *
  2414. * @param $course_id int The course for which we want to retrieve the users
  2415. * @param $condition Condition
  2416. * @param $offset int
  2417. * @param $count int
  2418. * @param $order_property order
  2419. */
  2420. function retrieve_all_course_users($course_id, $condition = null, $offset = null, $count = null, $order_property = null)
  2421. {
  2422. // datamanagers
  2423. $user_dm = UserDataManager :: get_instance();
  2424. $group_dm = GroupDataManager :: get_instance();
  2425. // ////////////////////////////////////////////////////////////////////
  2426. // GET RELATED GROUPS
  2427. // --------------------------------------------------------------------
  2428. // SELECT
  2429. $tree_values_query = 'SELECT ' . $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2430. Group :: PROPERTY_LEFT_VALUE);
  2431. $tree_values_query .= ', ' . $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2432. Group :: PROPERTY_RIGHT_VALUE);
  2433. $tree_values_query .= ', ' . $this->get_alias(CourseGroupRelation :: get_table_name()) . '.' . $this->escape_column_name(
  2434. CourseGroupRelation :: PROPERTY_STATUS);
  2435. // FROM course_group_relation
  2436. $tree_values_query .= ' FROM ' . $this->escape_table_name(CourseGroupRelation :: get_table_name()) . ' AS ' . $this->get_alias(
  2437. CourseGroupRelation :: get_table_name());
  2438. // JOIN group
  2439. $tree_values_query .= ' JOIN ' . $group_dm->escape_table_name(Group :: get_table_name()) . ' AS ' . $group_dm->get_alias(
  2440. Group :: get_table_name());
  2441. $tree_values_query .= ' ON ' . $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2442. Group :: PROPERTY_ID);
  2443. $tree_values_query .= ' = ' . $this->get_alias(CourseGroupRelation :: get_table_name()) . '.' . $this->escape_column_name(
  2444. CourseGroupRelation :: PROPERTY_GROUP_ID);
  2445. // WHERE
  2446. $tree_values_condition = new EqualityCondition(CourseGroupRelation :: PROPERTY_COURSE_ID, $course_id,
  2447. $this->get_alias(CourseGroupRelation :: get_table_name()), true);
  2448. // RETRIEVE
  2449. $direct_groups_with_tree_values = $group_dm->retrieve_object_set($tree_values_query, Group :: get_table_name(),
  2450. $tree_values_condition, null, null, null, Group :: CLASS_NAME);
  2451. // ////////////////////////////////////////////////////////////////////
  2452. // SELECT RESULT + STATUS
  2453. // 1 = individual, 2 = group --> sum(status)>=3? both user and group
  2454. // --------------------------------------------------------------------
  2455. $query = 'SELECT ';
  2456. // -- id
  2457. $query .= 'result.' . $user_dm->escape_column_name(User :: PROPERTY_ID);
  2458. $query .= ', ';
  2459. // -- official code
  2460. $query .= 'result.' . $user_dm->escape_column_name(User :: PROPERTY_OFFICIAL_CODE);
  2461. $query .= ', ';
  2462. // -- lastname
  2463. $query .= 'result.' . $user_dm->escape_column_name(User :: PROPERTY_LASTNAME);
  2464. $query .= ', ';
  2465. // -- firstname
  2466. $query .= 'result.' . $user_dm->escape_column_name(User :: PROPERTY_FIRSTNAME);
  2467. $query .= ', ';
  2468. // -- username
  2469. $query .= 'result.' . $user_dm->escape_column_name(User :: PROPERTY_USERNAME);
  2470. $query .= ', ';
  2471. // -- email
  2472. $query .= 'result.' . $user_dm->escape_column_name(User :: PROPERTY_EMAIL);
  2473. $query .= ', ';
  2474. // -- status
  2475. $query .= 'result.' . $user_dm->escape_column_name(User :: PROPERTY_STATUS);
  2476. // -->-- subscription status
  2477. $query .= ', MIN(result.record_subscription_status) AS "subscription_status"';
  2478. // -->-- subscription type
  2479. $query .= ', SUM(result.record_subscription_type) AS "subscription_type" FROM (';
  2480. // ////////////////////////////////////////////////////////////////////
  2481. // CONSTRUCT RESULT
  2482. // 1. individual users
  2483. // --------------------------------------------------------------------
  2484. // - SELECT
  2485. $query .= ' SELECT ';
  2486. // -- id
  2487. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2488. User :: PROPERTY_ID);
  2489. $query .= ', ';
  2490. // -- official code
  2491. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2492. User :: PROPERTY_OFFICIAL_CODE);
  2493. $query .= ', ';
  2494. // -- lastname
  2495. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2496. User :: PROPERTY_LASTNAME);
  2497. $query .= ', ';
  2498. // -- firstname
  2499. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2500. User :: PROPERTY_FIRSTNAME);
  2501. $query .= ', ';
  2502. // -- username
  2503. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2504. User :: PROPERTY_USERNAME);
  2505. $query .= ', ';
  2506. // -- email
  2507. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2508. User :: PROPERTY_EMAIL);
  2509. $query .= ', ';
  2510. // -- status
  2511. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2512. User :: PROPERTY_STATUS);
  2513. $query .= ', ';
  2514. // - record_subscription_status
  2515. $query .= $this->get_alias(CourseUserRelation :: get_table_name()) . '.' . $this->escape_column_name(
  2516. CourseUserRelation :: PROPERTY_STATUS);
  2517. $query .= ' AS "record_subscription_status"';
  2518. $query .= ', ';
  2519. // -- record_subscription_type
  2520. $query .= '1 AS "record_subscription_type"';
  2521. // - FROM course_user_relation
  2522. $query .= ' FROM ' . $this->escape_table_name(CourseUserRelation :: get_table_name()) . ' AS ' . $this->get_alias(
  2523. CourseUserRelation :: get_table_name());
  2524. // - JOIN user
  2525. $query .= ' JOIN ' . $user_dm->escape_table_name(User :: get_table_name()) . ' AS ' . $user_dm->get_alias(
  2526. User :: get_table_name());
  2527. $query .= ' ON ' . $this->get_alias(CourseUserRelation :: get_table_name()) . '.' . $this->escape_column_name(
  2528. CourseUserRelation :: PROPERTY_USER_ID);
  2529. $query .= ' = ' . $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2530. User :: PROPERTY_ID);
  2531. // WHERE
  2532. $translator = ConditionTranslator :: factory($this);
  2533. $conditions = array();
  2534. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_COURSE_ID, $course_id,
  2535. CourseUserRelation :: get_table_name());
  2536. if (isset($condition))
  2537. {
  2538. $conditions[] = $condition;
  2539. }
  2540. $direct_user_condition = new AndCondition($conditions);
  2541. $query .= $translator->render_query($direct_user_condition);
  2542. // ////////////////////////////////////////////////////////////////////
  2543. // CONSTRUCT RESULT
  2544. // 2a. union with groups
  2545. // --------------------------------------------------------------------
  2546. if ($direct_groups_with_tree_values->size() > 0)
  2547. {
  2548. $query .= ' UNION';
  2549. // - SELECT
  2550. $query .= ' SELECT ';
  2551. // -- id
  2552. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2553. User :: PROPERTY_ID);
  2554. $query .= ', ';
  2555. // -- official code
  2556. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2557. User :: PROPERTY_OFFICIAL_CODE);
  2558. $query .= ', ';
  2559. // -- lastname
  2560. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2561. User :: PROPERTY_LASTNAME);
  2562. $query .= ', ';
  2563. // -- firstname
  2564. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2565. User :: PROPERTY_FIRSTNAME);
  2566. $query .= ', ';
  2567. // -- username
  2568. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2569. User :: PROPERTY_USERNAME);
  2570. $query .= ', ';
  2571. // -- email
  2572. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2573. User :: PROPERTY_EMAIL);
  2574. $query .= ', ';
  2575. // -- status
  2576. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2577. User :: PROPERTY_STATUS);
  2578. $query .= ', ';
  2579. // -- record_subscription_status
  2580. $query .= ' CASE ';
  2581. $direct_group_conditions = array();
  2582. while ($group = $direct_groups_with_tree_values->next_result())
  2583. {
  2584. $and_conditions = array();
  2585. $and_conditions[] = new InequalityCondition(Group :: PROPERTY_LEFT_VALUE,
  2586. InequalityCondition :: GREATER_THAN_OR_EQUAL, $group->get_left_value());
  2587. $and_conditions[] = new InequalityCondition(Group :: PROPERTY_RIGHT_VALUE,
  2588. InequalityCondition :: LESS_THAN_OR_EQUAL, $group->get_right_value());
  2589. $direct_group_conditions[] = new AndCondition($and_conditions);
  2590. $query .= ' WHEN ' . $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2591. Group :: PROPERTY_LEFT_VALUE);
  2592. $query .= ' >= ' . $group->get_left_value();
  2593. $query .= ' AND ' . $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2594. Group :: PROPERTY_RIGHT_VALUE);
  2595. $query .= ' <= ' . $group->get_right_value();
  2596. $query .= ' THEN ' . $group->get_optional_property(CourseGroupRelation :: PROPERTY_STATUS);
  2597. }
  2598. $query .= ' END ';
  2599. $query .= ' AS "record_subscription_status"';
  2600. $query .= ', ';
  2601. // -- subscription_type
  2602. $query .= '2 AS "record_subscription_type"';
  2603. // - FROM group
  2604. $query .= ' FROM ' . $group_dm->escape_table_name(Group :: get_table_name()) . ' AS ' . $group_dm->get_alias(
  2605. Group :: get_table_name());
  2606. // - JOIN group_rel_user
  2607. $query .= ' JOIN ' . $group_dm->escape_table_name(GroupRelUser :: get_table_name()) . ' AS ' . $group_dm->get_alias(
  2608. GroupRelUser :: get_table_name());
  2609. $query .= ' ON ' . $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2610. Group :: PROPERTY_ID);
  2611. $query .= ' = ' . $group_dm->get_alias(GroupRelUser :: get_table_name()) . '.' . $this->escape_column_name(
  2612. GroupRelUser :: PROPERTY_GROUP_ID);
  2613. // - JOIN user
  2614. $query .= ' JOIN ' . $user_dm->escape_table_name(User :: get_table_name()) . ' AS ' . $user_dm->get_alias(
  2615. User :: get_table_name());
  2616. $query .= ' ON ' . $group_dm->get_alias(GroupRelUser :: get_table_name()) . '.' . $this->escape_column_name(
  2617. GroupRelUser :: PROPERTY_USER_ID);
  2618. $query .= ' = ' . $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2619. User :: PROPERTY_ID);
  2620. // 2b. construct WHERE
  2621. $or_condition = new OrCondition($direct_group_conditions);
  2622. $user_conditions = array();
  2623. $user_conditions[] = $or_condition;
  2624. if (isset($condition))
  2625. {
  2626. $user_conditions[] = $condition;
  2627. }
  2628. $group_user_condition = new AndCondition($user_conditions);
  2629. $translator = ConditionTranslator :: factory($this);
  2630. $query .= $translator->render_query($group_user_condition);
  2631. }
  2632. // ////////////////////////////////////////////////////////////////////
  2633. // 3. end subquery
  2634. // --------------------------------------------------------------------
  2635. $query .= ') AS result ';
  2636. // ////////////////////////////////////////////////////////////////////
  2637. // COMPLETE QUERY
  2638. // --------------------------------------------------------------------
  2639. // GROUP BY
  2640. $query .= ' GROUP BY result.' . $user_dm->escape_column_name(User :: PROPERTY_USERNAME);
  2641. // ORDER BY
  2642. $orders = array();
  2643. if (is_null($order_property))
  2644. {
  2645. $order_property = array();
  2646. }
  2647. elseif (! is_array($order_property))
  2648. {
  2649. $order_property = array($order_property);
  2650. }
  2651. foreach ($order_property as $order)
  2652. {
  2653. if ($order)
  2654. {
  2655. // subscription_status and subscription_type are calculated
  2656. // fields, mysql doesn't allow table bames in front of them...
  2657. switch ($order->get_property())
  2658. {
  2659. case 'subscription_status' :
  2660. case 'subscription_type' :
  2661. $orders[] = $this->escape_column_name($order->get_property()) . ' ' . ($order->get_direction() == SORT_DESC ? 'DESC' : 'ASC');
  2662. break;
  2663. default :
  2664. $orders[] = $this->escape_column_name($order->get_property(), 'result') . ' ' . ($order->get_direction() == SORT_DESC ? 'DESC' : 'ASC');
  2665. break;
  2666. }
  2667. }
  2668. }
  2669. if (count($orders))
  2670. {
  2671. $query .= ' ORDER BY ' . implode(', ', $orders);
  2672. }
  2673. // LIMIT
  2674. if (isset($count))
  2675. {
  2676. $query .= ' LIMIT ';
  2677. $query .= isset($offset) ? $offset : 0;
  2678. $query .= ',';
  2679. $query .= $count;
  2680. }
  2681. DataClassCache :: truncate(User :: class_name());
  2682. return new Mdb2ResultSet($this, $this->query($query), User :: CLASS_NAME);
  2683. }
  2684. /**
  2685. * Counts all users subscribed to a course, including the users in all subscribed (sub-)groups. The course_id is not
  2686. * given in the condition statement because it is used to select the subgroups BEFORE running the actual select.
  2687. * Including the course_id in the condition statement could result in invalid queries.
  2688. *
  2689. * @param $course_id int The course for which we want to retrieve the users
  2690. * @param $condition Condition
  2691. */
  2692. function count_all_course_users($course_id, $condition = null)
  2693. {
  2694. // datamanagers
  2695. $user_dm = UserDataManager :: get_instance();
  2696. $group_dm = GroupDataManager :: get_instance();
  2697. // ////////////////////////////////////////////////////////////////////
  2698. // GET RELATED GROUPS
  2699. // --------------------------------------------------------------------
  2700. // SELECT
  2701. $tree_values_query = 'SELECT ' . $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2702. Group :: PROPERTY_LEFT_VALUE);
  2703. $tree_values_query .= ', ' . $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2704. Group :: PROPERTY_RIGHT_VALUE);
  2705. // FROM course_group_relation
  2706. $tree_values_query .= ' FROM ' . $this->escape_table_name(CourseGroupRelation :: get_table_name()) . ' AS ' . $this->get_alias(
  2707. CourseGroupRelation :: get_table_name());
  2708. // JOIN group
  2709. $tree_values_query .= ' JOIN ' . $group_dm->escape_table_name(Group :: get_table_name()) . ' AS ' . $group_dm->get_alias(
  2710. Group :: get_table_name());
  2711. $tree_values_query .= ' ON ' . $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2712. Group :: PROPERTY_ID);
  2713. $tree_values_query .= ' = ' . $this->get_alias(CourseGroupRelation :: get_table_name()) . '.' . $this->escape_column_name(
  2714. CourseGroupRelation :: PROPERTY_GROUP_ID);
  2715. // WHERE
  2716. $tree_values_condition = new EqualityCondition(CourseGroupRelation :: PROPERTY_COURSE_ID, $course_id,
  2717. $this->get_alias(CourseGroupRelation :: get_table_name()), true);
  2718. // RETRIEVE
  2719. $direct_groups_with_tree_values = $group_dm->retrieve_object_set($tree_values_query, Group :: get_table_name(),
  2720. $tree_values_condition, null, null, null, Group :: CLASS_NAME);
  2721. // ////////////////////////////////////////////////////////////////////
  2722. // SELECT RESULT + STATUS
  2723. // 1 = individual, 2 = group --> sum(status)>=3? both user and group
  2724. // --------------------------------------------------------------------
  2725. $query = 'SELECT COUNT(DISTINCT result.username) AS "count" FROM (';
  2726. // ////////////////////////////////////////////////////////////////////
  2727. // CONSTRUCT RESULT
  2728. // 1. individual users
  2729. // --------------------------------------------------------------------
  2730. // - SELECT
  2731. $query .= 'SELECT ';
  2732. // -- username
  2733. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2734. User :: PROPERTY_USERNAME);
  2735. // - FROM course_user_relation
  2736. $query .= ' FROM ' . $this->escape_table_name(CourseUserRelation :: get_table_name()) . ' AS ' . $this->get_alias(
  2737. CourseUserRelation :: get_table_name());
  2738. // - JOIN user
  2739. $query .= ' JOIN ' . $user_dm->escape_table_name(User :: get_table_name()) . ' AS ' . $user_dm->get_alias(
  2740. User :: get_table_name());
  2741. $query .= ' ON ' . $this->get_alias(CourseUserRelation :: get_table_name()) . '.' . $this->escape_column_name(
  2742. CourseUserRelation :: PROPERTY_USER_ID);
  2743. $query .= ' = ' . $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2744. User :: PROPERTY_ID);
  2745. // WHERE
  2746. $translator = ConditionTranslator :: factory($this);
  2747. $conditions = array();
  2748. $conditions[] = new EqualityCondition(CourseUserRelation :: PROPERTY_COURSE_ID, $course_id,
  2749. CourseUserRelation :: get_table_name());
  2750. if (isset($condition))
  2751. {
  2752. $conditions[] = $condition;
  2753. }
  2754. $direct_user_condition = new AndCondition($conditions);
  2755. $query .= $translator->render_query($direct_user_condition);
  2756. // ////////////////////////////////////////////////////////////////////
  2757. // CONSTRUCT RESULT
  2758. // 2a. union with groups
  2759. // --------------------------------------------------------------------
  2760. if ($direct_groups_with_tree_values->size() > 0)
  2761. {
  2762. $query .= ' UNION';
  2763. // - SELECT
  2764. $query .= ' SELECT ';
  2765. // -- username
  2766. $query .= $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2767. User :: PROPERTY_USERNAME);
  2768. // - FROM group
  2769. $query .= ' FROM ' . $group_dm->escape_table_name(Group :: get_table_name()) . ' AS ' . $group_dm->get_alias(
  2770. Group :: get_table_name());
  2771. // - JOIN group_rel_user
  2772. $query .= ' JOIN ' . $group_dm->escape_table_name(GroupRelUser :: get_table_name()) . ' AS ' . $group_dm->get_alias(
  2773. GroupRelUser :: get_table_name());
  2774. $query .= ' ON ' . $group_dm->get_alias(Group :: get_table_name()) . '.' . $group_dm->escape_column_name(
  2775. Group :: PROPERTY_ID);
  2776. $query .= ' = ' . $group_dm->get_alias(GroupRelUser :: get_table_name()) . '.' . $this->escape_column_name(
  2777. GroupRelUser :: PROPERTY_GROUP_ID);
  2778. // - JOIN user
  2779. $query .= ' JOIN ' . $user_dm->escape_table_name(User :: get_table_name()) . ' AS ' . $user_dm->get_alias(
  2780. User :: get_table_name());
  2781. $query .= ' ON ' . $group_dm->get_alias(GroupRelUser :: get_table_name()) . '.' . $this->escape_column_name(
  2782. GroupRelUser :: PROPERTY_USER_ID);
  2783. $query .= ' = ' . $user_dm->get_alias(User :: get_table_name()) . '.' . $user_dm->escape_column_name(
  2784. User :: PROPERTY_ID);
  2785. // 2b. construct WHERE
  2786. $direct_group_conditions = array();
  2787. while ($group = $direct_groups_with_tree_values->next_result())
  2788. {
  2789. $and_conditions = array();
  2790. $and_conditions[] = new InequalityCondition(Group :: PROPERTY_LEFT_VALUE,
  2791. InequalityCondition :: GREATER_THAN_OR_EQUAL, $group->get_left_value());
  2792. $and_conditions[] = new InequalityCondition(Group :: PROPERTY_RIGHT_VALUE,
  2793. InequalityCondition :: LESS_THAN_OR_EQUAL, $group->get_right_value());
  2794. $direct_group_conditions[] = new AndCondition($and_conditions);
  2795. }
  2796. $or_condition = new OrCondition($direct_group_conditions);
  2797. if (isset($condition))
  2798. {
  2799. $group_condition = new AndCondition(array($or_condition, $condition));
  2800. }
  2801. else
  2802. {
  2803. $group_condition = $or_condition;
  2804. }
  2805. $translator = ConditionTranslator :: factory($this);
  2806. $query .= $translator->render_query($group_condition);
  2807. }
  2808. // ////////////////////////////////////////////////////////////////////
  2809. // 3. end subquery
  2810. // --------------------------------------------------------------------
  2811. $query .= ') AS result ';
  2812. $record = $this->retrieve_row($query, User :: get_table_name());
  2813. $record_values = array_values($record);
  2814. return $record_values[0];
  2815. }
  2816. function retrieve_platform_groups_from_user($user_id, $course_id, $offset = null, $count = null, $order_property = null)
  2817. {
  2818. $group_manager = GroupDataManager :: get_instance();
  2819. $group_alias = $group_manager->get_alias(Group :: get_table_name());
  2820. $group_rel_user_alias = $group_manager->get_alias(GroupRelUser :: get_table_name());
  2821. $course_group_relation_alias = $this->get_alias(CourseGroupRelation :: get_table_name());
  2822. $query = 'SELECT ' . $group_alias . '.' . Group :: PROPERTY_ID . ', ' . Group :: PROPERTY_NAME . ' FROM ' . $group_manager->escape_table_name(
  2823. Group :: get_table_name()) . ' AS ' . $group_alias . ' JOIN ' . $group_manager->escape_table_name(
  2824. GroupRelUser :: get_table_name()) . ' AS ' . $group_rel_user_alias . ' ON ' . $this->escape_column_name(
  2825. Group :: PROPERTY_ID, $group_alias) . ' = ' . $this->escape_column_name(
  2826. GroupRelUser :: PROPERTY_GROUP_ID, $group_rel_user_alias) . ' JOIN ' . $this->escape_table_name(
  2827. CourseGroupRelation :: get_table_name()) . ' AS ' . $course_group_relation_alias . ' ON ' . $this->escape_column_name(
  2828. Group :: PROPERTY_ID, $group_alias) . ' = ' . $this->escape_column_name(
  2829. CourseGroupRelation :: PROPERTY_GROUP_ID, $course_group_relation_alias) . ' WHERE ' . $this->escape_column_name(
  2830. GroupRelUser :: PROPERTY_USER_ID, $group_rel_user_alias) . ' = ' . $user_id;
  2831. return $this->retrieve_object_set($query, Group :: get_table_name(), null, $offset, $count, $order_property,
  2832. Group :: CLASS_NAME);
  2833. }
  2834. function retrieve_submissions_by_submitter_type($publication_id, $submitter_type, $class_name = null)
  2835. {
  2836. $tracking_data_manager = TrackingDataManager :: get_instance();
  2837. $query = 'SELECT ' . WeblcmsAssignmentSubmissionsTracker :: PROPERTY_SUBMITTER_ID . ', min(' . WeblcmsAssignmentSubmissionsTracker :: PROPERTY_DATE_SUBMITTED . ') AS first_date, ' . 'max(' . WeblcmsAssignmentSubmissionsTracker :: PROPERTY_DATE_SUBMITTED . ') AS last_date, ' . 'count(*) AS count, ' . WeblcmsAssignmentSubmissionsTracker :: PROPERTY_SUBMITTER_TYPE . ' FROM ' . $tracking_data_manager->escape_table_name(
  2838. WeblcmsAssignmentSubmissionsTracker :: get_table_name()) . ' WHERE ' . WeblcmsAssignmentSubmissionsTracker :: PROPERTY_PUBLICATION_ID . ' = ' . $publication_id . ' AND ' . WeblcmsAssignmentSubmissionsTracker :: PROPERTY_SUBMITTER_TYPE . ' = ' . $submitter_type . ' GROUP BY ' . WeblcmsAssignmentSubmissionsTracker :: PROPERTY_SUBMITTER_ID;
  2839. return $this->retrieve_object_set($query, WeblcmsAssignmentSubmissionsTracker :: get_table_name(), null, null,
  2840. null, null, $class_name);
  2841. }
  2842. function count_submitter_feedbacks($publication_id, $submitter_type, $class_name = null)
  2843. {
  2844. $tracking_data_manager = TrackingDataManager :: get_instance();
  2845. $submission_alias = $this->get_alias(WeblcmsAssignmentSubmissionsTracker :: get_table_name());
  2846. $feedback_alias = $this->get_alias(WeblcmsSubmissionFeedbackTracker :: get_table_name());
  2847. $query = 'SELECT ' . WeblcmsAssignmentSubmissionsTracker :: PROPERTY_SUBMITTER_ID . ', count(*) AS count ' . ' FROM ' . $tracking_data_manager->escape_table_name(
  2848. WeblcmsAssignmentSubmissionsTracker :: get_table_name()) . ' AS ' . $submission_alias . ' JOIN ' . $tracking_data_manager->escape_table_name(
  2849. WeblcmsSubmissionFeedbackTracker :: get_table_name()) . ' AS ' . $feedback_alias . ' ON ' . $this->escape_column_name(
  2850. WeblcmsAssignmentSubmissionsTracker :: PROPERTY_ID, $submission_alias) . " = " . $this->escape_column_name(
  2851. WeblcmsSubmissionFeedbackTracker :: PROPERTY_SUBMISSION_ID, $feedback_alias) . ' WHERE ' . WeblcmsAssignmentSubmissionsTracker :: PROPERTY_PUBLICATION_ID . ' = ' . $publication_id . ' AND ' . WeblcmsAssignmentSubmissionsTracker :: PROPERTY_SUBMITTER_TYPE . ' = ' . $submitter_type . ' GROUP BY ' . WeblcmsAssignmentSubmissionsTracker :: PROPERTY_SUBMITTER_ID;
  2852. return $this->retrieve_object_set($query, WeblcmsAssignmentSubmissionsTracker :: get_table_name(), null, null,
  2853. null, null, $class_name);
  2854. }
  2855. function retrieve_introduction($condition)
  2856. {
  2857. $rdm = RepositoryDataManager :: get_instance();
  2858. $publication_table_alias = $this->get_alias(ContentObjectPublication :: get_table_name());
  2859. $content_object_table_alias = $rdm->get_alias(ContentObject :: get_table_name());
  2860. $query = 'SELECT ' . $publication_table_alias . '.*, ' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_TITLE . ',' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_DESCRIPTION . ',' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_TYPE . ' FROM ' . $this->escape_table_name(
  2861. ContentObjectPublication :: get_table_name()) . ' AS ' . $publication_table_alias;
  2862. $query .= ' JOIN ' . $rdm->escape_table_name(ContentObject :: get_table_name()) . ' AS ' . $content_object_table_alias . ' ON ' . $rdm->escape_column_name(
  2863. ContentObject :: PROPERTY_ID, $content_object_table_alias) . '=' . $this->escape_column_name(
  2864. ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID, $publication_alias);
  2865. $conditions[] = new EqualityCondition(ContentObject :: PROPERTY_TYPE, Introduction :: get_type_name(),
  2866. $content_object_table_alias, true);
  2867. $conditions[] = $condition;
  2868. $condition = new AndCondition($conditions);
  2869. return $this->retrieve_object_set($query, ContentObjectPublication :: get_table_name(), $condition, $offset,
  2870. $max_objects, $order_by, ContentObjectPublication :: CLASS_NAME)->next_result();
  2871. }
  2872. /**
  2873. * Retrieves your publications AND the publications you have the edit right for Otherwise there is no way to view
  2874. * 'invisible' publications if you're not the owner, but you do have the edit right
  2875. *
  2876. * @param $condition Condition
  2877. * @param $order_by Array
  2878. * @param $offset <type>
  2879. * @param $max_objects <type>
  2880. * @return Mdb2ResultSet
  2881. */
  2882. function retrieve_my_publications($parent_location, $entities, $condition = null, $order_by = array(), $offset = 0,
  2883. $max_objects = -1, $user_id = null)
  2884. {
  2885. $rdm = RepositoryDataManager :: get_instance();
  2886. $publication_table_alias = $this->get_alias(ContentObjectPublication :: get_table_name());
  2887. $content_object_table_alias = $rdm->get_alias(ContentObject :: get_table_name());
  2888. $query = 'SELECT ' . $publication_table_alias . '.*, ' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_TITLE . ',' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_DESCRIPTION . ',' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_TYPE . ',' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_OWNER_ID . ' FROM ' . $this->escape_table_name(
  2889. ContentObjectPublication :: get_table_name()) . ' AS ' . $publication_table_alias;
  2890. $query .= ' JOIN ' . $rdm->escape_table_name(ContentObject :: get_table_name()) . ' AS ' . $content_object_table_alias . ' ON ' . $rdm->escape_column_name(
  2891. ContentObject :: PROPERTY_ID, $content_object_table_alias) . '=' . $this->escape_column_name(
  2892. ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID, $publication_alias);
  2893. $granted_location_ids = WeblcmsRights :: get_instance()->get_identifiers_with_right_granted(
  2894. WeblcmsRights :: EDIT_RIGHT, WeblcmsManager :: APPLICATION_NAME, $parent_location,
  2895. WeblcmsRights :: TYPE_PUBLICATION, $user_id, $entities);
  2896. if (! empty($granted_location_ids))
  2897. {
  2898. $conditions[] = $condition;
  2899. $conditions[] = new InCondition(ContentObjectPublication :: PROPERTY_ID, $granted_location_ids);
  2900. $condition = new OrCondition($conditions);
  2901. }
  2902. return $this->retrieve_object_set($query, ContentObjectPublication :: get_table_name(), $condition, $offset,
  2903. $max_objects, $order_by, ContentObjectPublication :: CLASS_NAME);
  2904. }
  2905. function retrieve_all_publications($condition = null, $order_by = array(), $offset = null, $max_objects = null)
  2906. {
  2907. $rdm = RepositoryDataManager :: get_instance();
  2908. $publication_table_alias = $this->get_alias(ContentObjectPublication :: get_table_name());
  2909. $content_object_table_alias = $rdm->get_alias(ContentObject :: get_table_name());
  2910. $query = 'SELECT ' . $publication_table_alias . '.*, ' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_TITLE . ',' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_DESCRIPTION . ',' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_TYPE . ',' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_OWNER_ID . ' FROM ' . $this->escape_table_name(
  2911. ContentObjectPublication :: get_table_name()) . ' AS ' . $publication_table_alias;
  2912. $query .= ' JOIN ' . $rdm->escape_table_name(ContentObject :: get_table_name()) . ' AS ' . $content_object_table_alias . ' ON ' . $rdm->escape_column_name(
  2913. ContentObject :: PROPERTY_ID, $content_object_table_alias) . '=' . $this->escape_column_name(
  2914. ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID, $publication_alias);
  2915. return $this->retrieve_object_set($query, ContentObjectPublication :: get_table_name(), $condition, $offset,
  2916. $max_objects, $order_by, ContentObjectPublication :: CLASS_NAME);
  2917. }
  2918. function count_my_publications($parent_location, $entities, $condition = null, $user_id = null)
  2919. {
  2920. $rdm = RepositoryDataManager :: get_instance();
  2921. $publication_table_alias = $this->get_alias(ContentObjectPublication :: get_table_name());
  2922. $content_object_table_alias = $rdm->get_alias(ContentObject :: get_table_name());
  2923. $query = 'SELECT count(1) FROM ' . $this->escape_table_name(ContentObjectPublication :: get_table_name()) . ' AS ' . $publication_table_alias;
  2924. $query .= ' JOIN ' . $rdm->escape_table_name(ContentObject :: get_table_name()) . ' AS ' . $content_object_table_alias . ' ON ' . $rdm->escape_column_name(
  2925. ContentObject :: PROPERTY_ID, $content_object_table_alias) . '=' . $this->escape_column_name(
  2926. ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID, $publication_alias);
  2927. $granted_location_ids = WeblcmsRights :: get_instance()->get_identifiers_with_right_granted(
  2928. WeblcmsRights :: EDIT_RIGHT, WeblcmsManager :: APPLICATION_NAME, $parent_location,
  2929. WeblcmsRights :: TYPE_PUBLICATION, $user_id, $entities);
  2930. if (! empty($granted_location_ids))
  2931. {
  2932. $conditions[] = $condition;
  2933. $conditions[] = new InCondition(ContentObjectPublication :: PROPERTY_ID, $granted_location_ids);
  2934. $condition = new OrCondition($conditions);
  2935. }
  2936. return $this->count_result_set($query, ContentObjectPublication :: get_table_name(), $condition);
  2937. }
  2938. /**
  2939. *
  2940. * @param $parent_location <Location>
  2941. * @param $entities <Array>
  2942. * @param $order_by <type>
  2943. * @param $offset <type>
  2944. * @param $max_objects <type>
  2945. * @return <type>
  2946. */
  2947. function retrieve_content_object_publications_with_view_right_granted_in_category_location($parent_location,
  2948. $entities, $condition, $order_by = array(), $offset = 0, $max_objects = -1, $user_id = null)
  2949. {
  2950. $granted_location_ids = WeblcmsRights :: get_instance()->get_identifiers_with_right_granted(1,
  2951. WeblcmsManager :: APPLICATION_NAME, $parent_location, WeblcmsRights :: TYPE_PUBLICATION, $user_id,
  2952. $entities);
  2953. if (empty($granted_location_ids))
  2954. {
  2955. return 0;
  2956. }
  2957. $publication_table_alias = $this->get_alias(ContentObjectPublication :: get_table_name());
  2958. $repo_data_manager = RepositoryDataManager :: get_instance();
  2959. $content_object_table_alias = $repo_data_manager->get_alias(ContentObject :: get_table_name());
  2960. $query = 'SELECT ' . $publication_table_alias . '.*, ' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_TITLE . ',' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_DESCRIPTION . ',' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_TYPE . ', ' . $content_object_table_alias . '.' . ContentObject :: PROPERTY_OWNER_ID;
  2961. $query .= ' FROM ' . $this->escape_table_name(ContentObjectPublication :: get_table_name()) . ' AS ' . $publication_table_alias;
  2962. $query .= ' JOIN ' . $repo_data_manager->escape_table_name(ContentObject :: get_table_name()) . ' AS ' . $content_object_table_alias . ' ON ' . $repo_data_manager->escape_column_name(
  2963. ContentObject :: PROPERTY_ID, $content_object_table_alias) . '=';
  2964. $query .= $this->escape_column_name(ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID,
  2965. $publication_table_alias);
  2966. $conditions = array();
  2967. $conditions[] = new InCondition(ContentObjectPublication :: PROPERTY_ID, $granted_location_ids);
  2968. if ($condition)
  2969. {
  2970. $conditions[] = $condition;
  2971. }
  2972. $condition = new AndCondition($conditions);
  2973. return $this->retrieve_object_set($query, ContentObjectPublication :: get_table_name(), $condition, $offset,
  2974. $max_objects, $order_by, ContentObjectPublication :: CLASS_NAME);
  2975. }
  2976. function count_content_object_publications_with_view_right_granted_in_category_location($parent_location, $entities,
  2977. $condition, $user_id = null)
  2978. {
  2979. $granted_location_ids = WeblcmsRights :: get_instance()->get_identifiers_with_right_granted(1,
  2980. WeblcmsManager :: APPLICATION_NAME, $parent_location, WeblcmsRights :: TYPE_PUBLICATION, $user_id,
  2981. $entities);
  2982. if (empty($granted_location_ids))
  2983. {
  2984. return 0;
  2985. }
  2986. $publication_table_alias = $this->get_alias(ContentObjectPublication :: get_table_name());
  2987. $repo_data_manager = RepositoryDataManager :: get_instance();
  2988. $content_object_table_alias = $repo_data_manager->get_alias(ContentObject :: get_table_name());
  2989. $query = 'SELECT count(1)';
  2990. $query .= ' FROM ' . $this->escape_table_name(ContentObjectPublication :: get_table_name()) . ' AS ' . $publication_table_alias;
  2991. $query .= ' JOIN ' . $repo_data_manager->escape_table_name(ContentObject :: get_table_name()) . ' AS ' . $content_object_table_alias . ' ON ' . $repo_data_manager->escape_column_name(
  2992. ContentObject :: PROPERTY_ID, $content_object_table_alias) . '=';
  2993. $query .= $this->escape_column_name(ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID,
  2994. $publication_table_alias);
  2995. $conditions = array();
  2996. $conditions[] = new InCondition(ContentObjectPublication :: PROPERTY_ID, $granted_location_ids);
  2997. if ($condition)
  2998. {
  2999. $conditions[] = $condition;
  3000. }
  3001. $condition = new AndCondition($conditions);
  3002. return $this->count_result_set($query, ContentObjectPublication :: get_table_name(), $condition);
  3003. }
  3004. /**
  3005. * Checks if the publication is published for the given user or a group he is member of. It does NOT check if the
  3006. * user is subscribed to the course.
  3007. *
  3008. * @param $user_id int
  3009. * @param $publication_id int
  3010. * @return boolean
  3011. */
  3012. function is_publication_target_user($user_id, $publication_id, $course_id = null)
  3013. {
  3014. if (is_null($course_id))
  3015. {
  3016. $course_id = $this->retrieve_content_object_publication($publication_id)->get_course_id();
  3017. }
  3018. $target_entities = WeblcmsRights :: get_instance()->get_target_entities(WeblcmsRights :: VIEW_RIGHT,
  3019. WeblcmsManager :: APPLICATION_NAME, $publication_id, WeblcmsRights :: TYPE_PUBLICATION, $course_id,
  3020. WeblcmsRights :: TREE_TYPE_COURSE);
  3021. $user_data_manager = UserDataManager :: get_instance();
  3022. if (count($target_entities) == 0)
  3023. {
  3024. return true;
  3025. }
  3026. foreach ($target_entities as $entity_type => $entity_ids)
  3027. {
  3028. switch ($entity_type)
  3029. {
  3030. case CourseUserEntity :: ENTITY_TYPE :
  3031. foreach ($entity_ids as $uid)
  3032. {
  3033. if ($user_id == $uid)
  3034. {
  3035. return true;
  3036. }
  3037. }
  3038. break;
  3039. case CourseGroupEntity :: ENTITY_TYPE :
  3040. foreach ($entity_ids as $course_group_id)
  3041. {
  3042. $course_group = $this->retrieve_course_group($course_group_id);
  3043. $course_group_users = $this->retrieve_course_group_user_ids($course_group);
  3044. foreach ($course_group_users as $id)
  3045. {
  3046. if ($user_id == $id)
  3047. {
  3048. return true;
  3049. }
  3050. }
  3051. }
  3052. break;
  3053. case CoursePlatformGroupEntity :: ENTITY_TYPE :
  3054. $group_manager = GroupDataManager :: get_instance();
  3055. $groups_resultset = $group_manager->retrieve_groups_and_subgroups($entity_ids);
  3056. while ($group = $groups_resultset->next_result())
  3057. {
  3058. $condition = new EqualityCondition(GroupRelUser :: PROPERTY_GROUP_ID, $group->get_id());
  3059. $group_user_rels = $group_manager->retrieve_group_rel_users($condition);
  3060. while ($group_user_rel = $group_user_rels->next_result())
  3061. {
  3062. if ($user_id == $group_user_rel->get_user_id())
  3063. {
  3064. return true;
  3065. }
  3066. }
  3067. }
  3068. break;
  3069. case 0 :
  3070. return true;
  3071. }
  3072. }
  3073. }
  3074. function retrieve_course_groups_and_subgroups($group_ids, $condition = null, $offset = null, $count = null, $order_by = null)
  3075. {
  3076. if (count($group_ids) == 0)
  3077. {
  3078. $group_ids[] = - 1;
  3079. }
  3080. $dg_condition = new InCondition(CourseGroup :: PROPERTY_ID, $group_ids);
  3081. $direct_groups = $this->retrieve_course_groups($dg_condition);
  3082. $direct_group_conditions = array();
  3083. while ($group = $direct_groups->next_result())
  3084. {
  3085. $and_conditions = array();
  3086. $and_conditions[] = new InequalityCondition(CourseGroup :: PROPERTY_LEFT_VALUE,
  3087. InequalityCondition :: GREATER_THAN_OR_EQUAL, $group->get_left_value());
  3088. $and_conditions[] = new InequalityCondition(CourseGroup :: PROPERTY_RIGHT_VALUE,
  3089. InequalityCondition :: LESS_THAN_OR_EQUAL, $group->get_right_value());
  3090. $and_conditions[] = new EqualityCondition(CourseGroup :: PROPERTY_COURSE_CODE, $group->get_course_code());
  3091. $direct_group_conditions[] = new AndCondition($and_conditions);
  3092. }
  3093. if (count($direct_group_conditions) > 0)
  3094. {
  3095. $group_conditions = array();
  3096. if ($condition)
  3097. {
  3098. $group_conditions[] = $condition;
  3099. }
  3100. $group_conditions[] = new OrCondition($direct_group_conditions);
  3101. $group_conditions[] = new InequalityCondition(CourseGroup :: PROPERTY_PARENT_ID,
  3102. InequalityCondition :: GREATER_THAN, 0);
  3103. $group_condition = new AndCondition($group_conditions);
  3104. }
  3105. else
  3106. {
  3107. $group_condition = new EqualityCondition(CourseGroup :: PROPERTY_ID, - 1);
  3108. }
  3109. return $this->retrieve_course_groups($group_condition, $offset, $count, $order_by);
  3110. }
  3111. /**
  3112. * **************************************************************************************************************
  3113. * Course Settings Functions *
  3114. * **************************************************************************************************************
  3115. */
  3116. /**
  3117. * Retrieves a course setting with a given id
  3118. *
  3119. * @param $id int
  3120. *
  3121. * @return CourseSetting
  3122. */
  3123. function retrieve_course_setting($id)
  3124. {
  3125. $condition = new EqualityCondition(CourseSetting :: PROPERTY_ID, $id);
  3126. return $this->retrieve_object(CourseSetting :: get_table_name(), $condition);
  3127. }
  3128. /**
  3129. * Retrieves the course_settings joined with the course_tool (name property)
  3130. *
  3131. * @param $condition Condition
  3132. * @param $offset int
  3133. * @param $count int
  3134. * @param $order_by int
  3135. *
  3136. * @return ResultSet
  3137. */
  3138. function retrieve_course_settings_with_tools($condition = null, $offset = null, $count = null, $order_by = null)
  3139. {
  3140. $settings_table = $this->get_table_name(CourseSetting :: get_table_name());
  3141. $settings_alias = $this->get_alias(CourseSetting :: get_table_name());
  3142. $tools_table = $this->get_table_name(CourseTool :: get_table_name());
  3143. $tools_alias = $this->get_alias(CourseTool :: get_table_name());
  3144. $settings_tool_id_column = $this->escape_column_name(CourseSetting :: PROPERTY_TOOL_ID, $settings_alias);
  3145. $tool_id_column = $this->escape_column_name(CourseTool :: PROPERTY_ID, $tools_alias);
  3146. $tool_name_column = $this->escape_column_name(CourseTool :: PROPERTY_NAME, $tools_alias);
  3147. $tool_name_alias = CourseSetting :: PROPERTY_COURSE_TOOL_NAME;
  3148. $query = 'SELECT ' . $settings_alias . '.*, ' . $tool_name_column . ' AS ' . $tool_name_alias;
  3149. $query .= ' FROM ' . $settings_table . ' AS ' . $settings_alias;
  3150. $query .= ' LEFT JOIN ' . $tools_table . ' AS ' . $tools_alias;
  3151. $query .= ' ON ' . $settings_tool_id_column . ' = ' . $tool_id_column;
  3152. $result_set = $this->retrieve_object_set($query, CourseSetting :: get_table_name(), $condition, $offset, $count,
  3153. $order_by);
  3154. DataClassCache :: truncate(CourseSetting :: class_name());
  3155. return $result_set;
  3156. }
  3157. /**
  3158. * Retrieves the course settings joined with the course type setting values
  3159. *
  3160. * @param $condition Condition
  3161. * @param $offset int
  3162. * @param $count int
  3163. * @param $order_by int
  3164. *
  3165. * @return ResultSet
  3166. */
  3167. function retrieve_course_settings_with_course_type_values($condition, $offset, $count, $order_by)
  3168. {
  3169. $query = $this->get_course_settings_with_values_query(CourseTypeRelCourseSetting :: get_table_name(),
  3170. CourseTypeRelCourseSettingValue :: get_table_name(),
  3171. CourseTypeRelCourseSetting :: PROPERTY_COURSE_SETTING_ID,
  3172. CourseTypeRelCourseSettingValue :: PROPERTY_COURSE_TYPE_REL_COURSE_SETTING_ID);
  3173. return $this->retrieve_object_set($query, CourseSetting :: get_table_name(), $condition, $offset, $count,
  3174. $order_by);
  3175. }
  3176. /**
  3177. * Retrieves the course settings joined with the course setting values
  3178. *
  3179. * @param $condition Condition
  3180. * @param $offset int
  3181. * @param $count int
  3182. * @param $order_by int
  3183. *
  3184. * @return ResultSet
  3185. */
  3186. function retrieve_course_settings_with_course_values($condition, $offset, $count, $order_by)
  3187. {
  3188. $query = $this->get_course_settings_with_values_query(CourseRelCourseSetting :: get_table_name(),
  3189. CourseRelCourseSettingValue :: get_table_name(), CourseRelCourseSetting :: PROPERTY_COURSE_SETTING_ID,
  3190. CourseRelCourseSettingValue :: PROPERTY_COURSE_REL_COURSE_SETTING_ID);
  3191. return $this->retrieve_object_set($query, CourseSetting :: get_table_name(), $condition, $offset, $count,
  3192. $order_by);
  3193. }
  3194. /**
  3195. * Retrieves the course settings joined with the course setting default values
  3196. *
  3197. * @param $condition Condition
  3198. * @param $offset int
  3199. * @param $count int
  3200. * @param $order_by int
  3201. *
  3202. * @return ResultSet
  3203. */
  3204. function retrieve_course_settings_with_default_values($condition, $offset, $count, $order_by)
  3205. {
  3206. $settings_table = $this->get_table_name(CourseSetting :: get_table_name());
  3207. $settings_alias = $this->get_alias(CourseSetting :: get_table_name());
  3208. $settings_default_values_table = $this->get_table_name(CourseSettingDefaultValue :: get_table_name());
  3209. $settings_default_values_alias = $this->get_alias(CourseSettingDefaultValue :: get_table_name());
  3210. $value_column = $this->escape_column_name('value', $settings_default_values_alias);
  3211. $course_setting_id_column = $this->escape_column_name(DataClass :: PROPERTY_ID, $settings_alias);
  3212. $course_setting_foreign_column = $this->escape_column_name(
  3213. CourseSettingDefaultValue :: PROPERTY_COURSE_SETTING_ID, $settings_default_values_alias);
  3214. $query = 'SELECT ' . $settings_alias . '.*, ' . $value_column;
  3215. $query .= ' FROM ' . $settings_table . ' AS ' . $settings_alias;
  3216. $query .= ' JOIN ' . $settings_default_values_table . ' AS ' . $settings_default_values_alias;
  3217. $query .= ' ON ' . $course_setting_id_column . '=' . $course_setting_foreign_column;
  3218. return $this->retrieve_object_set($query, CourseSetting :: get_table_name(), $condition, $offset, $count,
  3219. $order_by);
  3220. }
  3221. /**
  3222. * **************************************************************************************************************
  3223. * Course Settings Helper Functions *
  3224. * **************************************************************************************************************
  3225. */
  3226. /**
  3227. * Builds the query to retrieve course settings with a course setting relation table. Returns course settings with
  3228. * their compliant values.
  3229. *
  3230. * @param $course_setting_relation_table String - The table name for the course setting relation table
  3231. * @param $course_setting_relation_value_table String - The table name for the course setting relation value table
  3232. * @param $course_setting_foreign_property String - The foreign property for the course setting id
  3233. * @param $course_setting_relation_foreign_property String - The foreign property for the course setting relation id
  3234. * @return String
  3235. */
  3236. private function get_course_settings_with_values_query($course_setting_relation_table,
  3237. $course_setting_relation_value_table, $course_setting_foreign_property,
  3238. $course_setting_relation_foreign_property)
  3239. {
  3240. $settings_table = $this->get_table_name(CourseSetting :: get_table_name());
  3241. $settings_alias = $this->get_alias(CourseSetting :: get_table_name());
  3242. $course_setting_relation_table_name = $this->get_table_name($course_setting_relation_table);
  3243. $course_setting_relation_table_alias = $this->get_alias($course_setting_relation_table);
  3244. $course_setting_relation_value_table_name = $this->get_table_name($course_setting_relation_value_table);
  3245. $course_setting_relation_value_table_alias = $this->get_alias($course_setting_relation_value_table);
  3246. $course_setting_id_column = $this->escape_column_name(DataClass :: PROPERTY_ID, $settings_alias);
  3247. $course_setting_relation_id_column = $this->escape_column_name(DataClass :: PROPERTY_ID,
  3248. $course_setting_relation_table_alias);
  3249. $value_column = $this->escape_column_name('value', $course_setting_relation_value_table_alias);
  3250. $course_setting_foreign_column = $this->escape_column_name($course_setting_foreign_property,
  3251. $course_setting_relation_table_alias);
  3252. $course_setting_relation_foreign_column = $this->escape_column_name($course_setting_relation_foreign_property,
  3253. $course_setting_relation_value_table_alias);
  3254. $query = 'SELECT ' . $settings_alias . '.*, ' . $value_column;
  3255. $query .= ' FROM ' . $settings_table . ' AS ' . $settings_alias;
  3256. $query .= ' JOIN ' . $course_setting_relation_table_name . ' AS ' . $course_setting_relation_table_alias;
  3257. $query .= ' ON ' . $course_setting_id_column . ' = ' . $course_setting_foreign_column;
  3258. $query .= ' JOIN ' . $course_setting_relation_value_table_name . ' AS ';
  3259. $query .= $course_setting_relation_value_table_alias;
  3260. $query .= ' ON ' . $course_setting_relation_id_column . ' = ' . $course_setting_relation_foreign_column;
  3261. return $query;
  3262. }
  3263. /**
  3264. * **************************************************************************************************************
  3265. * CourseToolRelCourseSection Dataclass Functionality *
  3266. * **************************************************************************************************************
  3267. */
  3268. /**
  3269. * Retrieves a course tool_rel course section with the given id
  3270. *
  3271. * @param $id int
  3272. *
  3273. * @return CourseToolRelCourseSection
  3274. */
  3275. function retrieve_course_tool_rel_course_section($id)
  3276. {
  3277. $condition = new EqualityCondition(CourseToolRelCourseSection :: PROPERTY_ID, $id);
  3278. return $this->retrieve_object(CourseToolRelCourseSection :: get_table_name(), $condition);
  3279. }
  3280. /**
  3281. * Retrieves a list of course tool_rel course section
  3282. *
  3283. * @param $condition \common\libraries\Condition
  3284. * @param $offset int
  3285. * @param $max_objects int
  3286. * @param $order_by \common\libraries\ObjectTableOrder
  3287. *
  3288. * @return \common\libraries\ResultSet <CourseToolRelCourseSection>
  3289. */
  3290. function retrieve_course_tool_rel_course_sections($condition = null, $offset = null, $max_objects = null, $order_by = null)
  3291. {
  3292. return $this->retrieve_objects(CourseToolRelCourseSection :: get_table_name(), $condition, $offset,
  3293. $max_objects, $order_by);
  3294. }
  3295. /**
  3296. * Counts the course tool_rel course section
  3297. *
  3298. * @param $condition \common\libraries\Condition
  3299. *
  3300. * @return int
  3301. */
  3302. function count_course_tool_rel_course_sections($condition = null)
  3303. {
  3304. return $this->count_objects(CourseToolRelCourseSection :: get_table_name(), $condition);
  3305. }
  3306. /**
  3307. * Retrieves the basic data for a raw export of the results in the assessment tool. This method uses dynamic
  3308. * variables and dynamic query construction. For each new table added, care must be taken. Example: Add new table
  3309. * 'x' for class 'X'. The following constants must also be declared. $x_ref = 'x'; $x_table =
  3310. * {DataManager}::get_instance()->escape_table_name(X::get_table_name()); //DataManager must be the appropriate data
  3311. * manager. $x_alias = {DataManager}::get_instance()->get_alias(X::get_table_name()); //DataManager must be the
  3312. * appropriate data manager. Failure to declare them will break the code using dynamic variables. New columns to be
  3313. * added to $select. New tables to be added to $table_aliases using $x_ref. New joins to be added to
  3314. * $join_declarations. Subselects are not catered for.
  3315. *
  3316. * @param $condition type conditions to be applied to the query.
  3317. * @param $offset type the required offset.
  3318. * @param $max_objects type the required number ob rows.
  3319. * @param $order_by type the order in which the rows are to be returned.
  3320. * @return type A result set of WeblcmsQuestionAttemptsTracker objects.
  3321. */
  3322. function retrieve_assessment_raw_export_data($condition = null, $offset = null, $max_objects = null, $order_by = null)
  3323. {
  3324. $rdm = RepositoryDataManager :: get_instance();
  3325. $tdm = TrackingDataManager :: get_instance();
  3326. $udm = UserDataManager :: get_instance();
  3327. // Dynamic variable constants (requires the following variables for each table 'x': x_ref = 'x', x_table,
  3328. // x_alias).
  3329. $ref_table = '_table';
  3330. $ref_alias = '_alias';
  3331. // tracking_weblcms_question_attempts_tracker (\application\weblcms\WeblcmsQuestionAttemptsTracker)
  3332. $twqat_ref = 'twqat';
  3333. $twqat_table = $tdm->escape_table_name(WeblcmsQuestionAttemptsTracker :: get_table_name());
  3334. $twqat_alias = $tdm->get_alias(WeblcmsQuestionAttemptsTracker :: get_table_name());
  3335. $twqat_answer = $tdm->escape_column_name(WeblcmsQuestionAttemptsTracker :: PROPERTY_ANSWER, $twqat_alias);
  3336. $twqat_assessment_attempt_id = $tdm->escape_column_name(
  3337. WeblcmsQuestionAttemptsTracker :: PROPERTY_ASSESSMENT_ATTEMPT_ID, $twqat_alias);
  3338. $twqat_question_cid = $tdm->escape_column_name(WeblcmsQuestionAttemptsTracker :: PROPERTY_QUESTION_CID,
  3339. $twqat_alias);
  3340. $twqat_score = $tdm->escape_column_name(WeblcmsQuestionAttemptsTracker :: PROPERTY_SCORE, $twqat_alias);
  3341. // tracking_weblcms_assessment_attempts_tracker (\application\weblcms\WeblcmsAssessmentAttemptsTracker)
  3342. $twaat_ref = 'twaat';
  3343. $twaat_table = $tdm->escape_table_name(WeblcmsAssessmentAttemptsTracker :: get_table_name());
  3344. $twaat_alias = $tdm->get_alias(WeblcmsAssessmentAttemptsTracker :: get_table_name());
  3345. $twaat_assessment_id = $tdm->escape_column_name(WeblcmsAssessmentAttemptsTracker :: PROPERTY_ASSESSMENT_ID,
  3346. $twaat_alias);
  3347. $twaat_date = $tdm->escape_column_name(WeblcmsAssessmentAttemptsTracker :: PROPERTY_DATE, $twaat_alias);
  3348. $twaat_id = $tdm->escape_column_name(WeblcmsAssessmentAttemptsTracker :: PROPERTY_ID, $twaat_alias);
  3349. $twaat_start_time = $tdm->escape_column_name(WeblcmsAssessmentAttemptsTracker :: PROPERTY_START_TIME,
  3350. $twaat_alias);
  3351. $twaat_total_score = $tdm->escape_column_name(WeblcmsAssessmentAttemptsTracker :: PROPERTY_TOTAL_SCORE,
  3352. $twaat_alias);
  3353. $twaat_total_time = $tdm->escape_column_name(WeblcmsAssessmentAttemptsTracker :: PROPERTY_TOTAL_TIME,
  3354. $twaat_alias);
  3355. $twaat_user_id = $tdm->escape_column_name(WeblcmsAssessmentAttemptsTracker :: PROPERTY_USER_ID, $twaat_alias);
  3356. // user_user (User)
  3357. $uu_ref = 'uu';
  3358. $uu_table = $udm->escape_table_name(User :: get_table_name());
  3359. $uu_alias = $udm->get_alias(User :: get_table_name());
  3360. $uu_firstname = $udm->escape_column_name(User :: PROPERTY_FIRSTNAME, $uu_alias);
  3361. $uu_id = $udm->escape_column_name(User :: PROPERTY_ID, $uu_alias);
  3362. $uu_lastname = $udm->escape_column_name(User :: PROPERTY_LASTNAME, $uu_alias);
  3363. $uu_official_code = $udm->escape_column_name(User :: PROPERTY_OFFICIAL_CODE, $uu_alias);
  3364. // weblcms_content_object_publication (\application\weblcms\WeblcmsContentObjectPublication)
  3365. $wcop_ref = 'wcop';
  3366. $wcop_table = $this->escape_table_name(ContentObjectPublication :: get_table_name());
  3367. $wcop_alias = $this->get_alias(ContentObjectPublication :: get_table_name());
  3368. $wcop_content_object_id = $this->escape_column_name(ContentObjectPublication :: PROPERTY_CONTENT_OBJECT_ID,
  3369. $wcop_alias);
  3370. $wcop_id = $this->escape_column_name(ContentObjectPublication :: PROPERTY_ID, $wcop_alias);
  3371. // repository_content_object (\repository\ContentObject)
  3372. $rco_ref = 'rco';
  3373. $rco_table = $rdm->escape_table_name(ContentObject :: get_table_name());
  3374. $rco_alias = $rdm->get_alias(ContentObject :: get_table_name());
  3375. $rco_id = $rdm->escape_column_name(ContentObject :: PROPERTY_ID, $rco_alias);
  3376. $rco_title = $rdm->escape_column_name(ContentObject :: PROPERTY_TITLE, $rco_alias);
  3377. // repository_complex_content_object_item (\repository\ComplexContentObjectItem)
  3378. $rccoi_ref = 'rccoi';
  3379. $rccoi_table = $rdm->escape_table_name(ComplexContentObjectItem :: get_table_name());
  3380. $rccoi_alias = $rdm->get_alias(ComplexContentObjectItem :: get_table_name());
  3381. $rccoi_display_order = $rdm->escape_column_name(ComplexContentObjectItem :: PROPERTY_DISPLAY_ORDER,
  3382. $rccoi_alias);
  3383. $rccoi_id = $rdm->escape_column_name(ComplexContentObjectItem :: PROPERTY_ID, $rccoi_alias);
  3384. $selects = array();
  3385. $selects[] = $uu_official_code;
  3386. $selects[] = $uu_firstname;
  3387. $selects[] = $uu_lastname;
  3388. $selects[] = $twaat_assessment_id;
  3389. $selects[] = $rco_title;
  3390. $selects[] = $twaat_date;
  3391. $selects[] = $twaat_start_time;
  3392. $selects[] = $twaat_total_time;
  3393. $selects[] = $twaat_total_score;
  3394. $selects[] = $twqat_question_cid;
  3395. $selects[] = $rccoi_display_order;
  3396. $selects[] = $twqat_answer;
  3397. $selects[] = $twqat_score;
  3398. $select = implode(', ', $selects);
  3399. $table_aliases = array();
  3400. $table_aliases[] = $twqat_ref;
  3401. $table_aliases[] = $twaat_ref;
  3402. $table_aliases[] = $uu_ref;
  3403. $table_aliases[] = $wcop_ref;
  3404. $table_aliases[] = $rco_ref;
  3405. $table_aliases[] = $rccoi_ref;
  3406. // Uses dynamic variables.
  3407. $tables = array();
  3408. foreach ($table_aliases as $table_alias)
  3409. {
  3410. $tables[${$table_alias . $ref_table}] = ${$table_alias . $ref_table} . ' AS ' . ${$table_alias . $ref_alias};
  3411. }
  3412. // Join syntax: $join_left_table JOIN $join_right_table ON $join_left_value = $join_right_value.
  3413. // $join_left_table may be null.
  3414. $join_left_table = 'left_table';
  3415. $join_left_value = 'left_value';
  3416. $join_right_table = 'right_table';
  3417. $join_right_value = 'right_value';
  3418. $join_declarations = array();
  3419. $join_declarations[] = array($join_left_table => $tables[$twqat_table],
  3420. $join_right_table => $tables[$twaat_table], $join_left_value => $twqat_assessment_attempt_id,
  3421. $join_right_value => $twaat_id);
  3422. $join_declarations[] = array($join_left_table => null, $join_right_table => $tables[$uu_table],
  3423. $join_left_value => $twaat_user_id, $join_right_value => $uu_id);
  3424. $join_declarations[] = array($join_left_table => null, $join_right_table => $tables[$wcop_table],
  3425. $join_left_value => $twaat_assessment_id, $join_right_value => $wcop_id);
  3426. $join_declarations[] = array($join_left_table => null, $join_right_table => $tables[$rco_table],
  3427. $join_left_value => $wcop_content_object_id, $join_right_value => $rco_id);
  3428. $join_declarations[] = array($join_left_table => null, $join_right_table => $tables[$rccoi_table],
  3429. $join_left_value => $twqat_question_cid, $join_right_value => $rccoi_id);
  3430. $joins = array();
  3431. foreach ($join_declarations as $join_declaration)
  3432. {
  3433. $joins_entry_parts = array();
  3434. if ($join_declaration[$join_left_table])
  3435. {
  3436. $joins_entry_parts[] = $join_declaration[$join_left_table];
  3437. }
  3438. $joins_entry_parts[] = 'JOIN';
  3439. $joins_entry_parts[] = $join_declaration[$join_right_table];
  3440. $joins_entry_parts[] = 'ON';
  3441. $joins_entry_parts[] = $join_declaration[$join_left_value];
  3442. $joins_entry_parts[] = '=';
  3443. $joins_entry_parts[] = $join_declaration[$join_right_value];
  3444. $joins[] = implode(' ', $joins_entry_parts);
  3445. }
  3446. $join = implode(' ', $joins);
  3447. $query_parts = array();
  3448. $query_parts[] = 'SELECT';
  3449. $query_parts[] = $select;
  3450. $query_parts[] = 'FROM';
  3451. $query_parts[] = $join;
  3452. $query = implode(' ', $query_parts);
  3453. return $this->retrieve_object_set($query, WeblcmsQuestionAttemptsTracker :: get_table_name(), $condition,
  3454. $offset, $max_objects, $order_by);
  3455. }
  3456. function retrieve_assignment_publication_targets($publication_id, $submitter_type, $condition, $offset = null, $count = null,
  3457. $order_by = null)
  3458. {
  3459. $gdm = GroupDataManager::get_instance();
  3460. $tdm = TrackingDataManager :: get_instance();
  3461. $udm = UserDataManager :: get_instance();
  3462. // Dynamic variable constants (requires the following variables for each table 'x': x_ref = 'x', x_table,
  3463. // x_alias).
  3464. $ref_table = '_table';
  3465. $ref_alias = '_alias';
  3466. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_COURSE_GROUP)
  3467. {
  3468. //weblcms_course_grou (\application\weblcms\CourseGroup)
  3469. $wcg_ref = 'wcg';
  3470. $wcg_table = $this->escape_table_name(CourseGroup::get_table_name());
  3471. $wcg_alias = $this->get_alias(CourseGroup::get_table_name());
  3472. $wcg_id = $this->escape_column_name(CourseGroup::PROPERTY_ID, $wcg_alias);
  3473. $wcg_name = $this->escape_column_name(CourseGroup::PROPERTY_NAME, $wcg_alias);
  3474. }
  3475. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_PLATFORM_GROUP)
  3476. {
  3477. //group_group (\group\Group)
  3478. $gg_ref = 'gg';
  3479. $gg_table = $gdm->escape_table_name(Group::get_table_name());
  3480. $gg_alias = $gdm->get_alias(Group::get_table_name());
  3481. $gg_id = $gdm->escape_column_name(Group::PROPERTY_ID, $gg_alias);
  3482. $gg_name = $gdm->escape_column_name(Group::PROPERTY_NAME, $gg_alias);
  3483. }
  3484. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_USER)
  3485. {
  3486. // user_user (\user\User)
  3487. $uu_ref = 'uu';
  3488. $uu_table = $udm->escape_table_name(User :: get_table_name());
  3489. $uu_alias = $udm->get_alias(User :: get_table_name());
  3490. $uu_firstname = $udm->escape_column_name(User :: PROPERTY_FIRSTNAME, $uu_alias);
  3491. $uu_id = $udm->escape_column_name(User :: PROPERTY_ID, $uu_alias);
  3492. $uu_lastname = $udm->escape_column_name(User :: PROPERTY_LASTNAME, $uu_alias);
  3493. }
  3494. // tracking_weblcms_assignment_submissions_tracker (\application\weblcms\WeblcmsAssignmentSubmissionsTracker)
  3495. $twast_ref = 'twast';
  3496. $twast_table = $tdm->escape_table_name(WeblcmsAssignmentSubmissionsTracker :: get_table_name());
  3497. $twast_alias = $tdm->get_alias(WeblcmsAssignmentSubmissionsTracker :: get_table_name());
  3498. $twast_date_submitted = $tdm->escape_column_name(WeblcmsAssignmentSubmissionsTracker :: PROPERTY_DATE_SUBMITTED,
  3499. $twast_alias);
  3500. $twast_publication_id = $tdm->escape_column_name(WeblcmsAssignmentSubmissionsTracker :: PROPERTY_PUBLICATION_ID,
  3501. $twast_alias);
  3502. $twast_submitter_id = $tdm->escape_column_name(WeblcmsAssignmentSubmissionsTracker :: PROPERTY_SUBMITTER_ID,
  3503. $twast_alias);
  3504. $twast_submitter_type = $tdm->escape_column_name(WeblcmsAssignmentSubmissionsTracker :: PROPERTY_SUBMITTER_TYPE,
  3505. $twast_alias);
  3506. // aggregate_columns
  3507. $max_twast_date_submitted = 'MAX(' . $twast_date_submitted . ')';
  3508. $min_twast_date_submitted = 'MIN(' . $twast_date_submitted . ')';
  3509. $count_twast_date_submitted = 'COUNT(' . $twast_date_submitted . ')';
  3510. $selects = array();
  3511. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_COURSE_GROUP)
  3512. {
  3513. $selects[] = $wcg_id . ' AS ' . WeblcmsAssignmentSubmissionsTracker::PROPERTY_SUBMITTER_ID;
  3514. $selects[] = $wcg_name;
  3515. }
  3516. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_PLATFORM_GROUP)
  3517. {
  3518. $selects[] = $gg_id . ' AS ' . WeblcmsAssignmentSubmissionsTracker::PROPERTY_SUBMITTER_ID;
  3519. $selects[] = $gg_name;
  3520. }
  3521. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_USER)
  3522. {
  3523. $selects[] = $uu_id . ' AS ' . WeblcmsAssignmentSubmissionsTracker::PROPERTY_SUBMITTER_ID;
  3524. $selects[] = $uu_firstname;
  3525. $selects[] = $uu_lastname;
  3526. }
  3527. $selects[] = $min_twast_date_submitted . ' AS ' . AssignmentTool :: PROPERTY_FIRST_SUBMISSION;
  3528. $selects[] = $max_twast_date_submitted . ' AS ' . AssignmentTool :: PROPERTY_LAST_SUBMISSION;
  3529. $selects[] = $count_twast_date_submitted . ' AS ' . AssignmentTool :: PROPERTY_NUMBER_OF_SUBMISSIONS;
  3530. $select = implode(', ', $selects);
  3531. $table_aliases = array();
  3532. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_COURSE_GROUP)
  3533. {
  3534. $table_aliases[] = $wcg_ref;
  3535. }
  3536. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_PLATFORM_GROUP)
  3537. {
  3538. $table_aliases[] = $gg_ref;
  3539. }
  3540. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_USER)
  3541. {
  3542. $table_aliases[] = $uu_ref;
  3543. }
  3544. $table_aliases[] = $twast_ref;
  3545. // Uses dynamic variables.
  3546. $tables = array();
  3547. foreach ($table_aliases as $table_alias)
  3548. {
  3549. $tables[${$table_alias . $ref_table}] = ${$table_alias . $ref_table} . ' AS ' . ${$table_alias . $ref_alias};
  3550. }
  3551. // Join syntax: $join_left_table JOIN $join_right_table ON $join_left_value = $join_right_value [AND $conditions].
  3552. // Condition syntax: $join_condition_column $join_condition_operator $join_condition_value.
  3553. // $join_left_table may be null.
  3554. $join_condition_column = 'column';
  3555. $join_condition_operator = 'operator';
  3556. $join_condition_value = 'value';
  3557. $join_conditions = 'conditions';
  3558. $join_left_table = 'left_table';
  3559. $join_left_value = 'left_value';
  3560. $join_right_table = 'right_table';
  3561. $join_right_value = 'right_value';
  3562. $join_type = 'type';
  3563. $join_type_inner = 'JOIN';
  3564. $join_type_left = 'LEFT JOIN';
  3565. $join_type_outer = 'OUTER JOIN';
  3566. $join_type_right = 'RIGHT JOIN';
  3567. $join_declarations = array();
  3568. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_COURSE_GROUP)
  3569. {
  3570. $conditions = array();
  3571. $conditions[] = array($join_condition_column => $twast_publication_id, $join_condition_operator => '=',
  3572. $join_condition_value => $publication_id);
  3573. $conditions[] = array($join_condition_column => $twast_submitter_type, $join_condition_operator => '=',
  3574. $join_condition_value => $submitter_type);
  3575. $join_declarations[] = array($join_left_table => $tables[$wcg_table], $join_type => $join_type_left,
  3576. $join_right_table => $tables[$twast_table], $join_left_value => $wcg_id,
  3577. $join_right_value => $twast_submitter_id, $join_conditions => $conditions);
  3578. }
  3579. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_PLATFORM_GROUP)
  3580. {
  3581. $conditions = array();
  3582. $conditions[] = array($join_condition_column => $twast_publication_id, $join_condition_operator => '=',
  3583. $join_condition_value => $publication_id);
  3584. $conditions[] = array($join_condition_column => $twast_submitter_type, $join_condition_operator => '=',
  3585. $join_condition_value => $submitter_type);
  3586. $join_declarations[] = array($join_left_table => $tables[$gg_table], $join_type => $join_type_left,
  3587. $join_right_table => $tables[$twast_table], $join_left_value => $gg_id,
  3588. $join_right_value => $twast_submitter_id, $join_conditions => $conditions);
  3589. }
  3590. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_USER)
  3591. {
  3592. $conditions = array();
  3593. $conditions[] = array($join_condition_column => $twast_publication_id, $join_condition_operator => '=',
  3594. $join_condition_value => $publication_id);
  3595. $conditions[] = array($join_condition_column => $twast_submitter_type, $join_condition_operator => '=',
  3596. $join_condition_value => $submitter_type);
  3597. $join_declarations[] = array($join_left_table => $tables[$uu_table], $join_type => $join_type_left,
  3598. $join_right_table => $tables[$twast_table], $join_left_value => $uu_id,
  3599. $join_right_value => $twast_submitter_id, $join_conditions => $conditions);
  3600. }
  3601. $joins = array();
  3602. foreach ($join_declarations as $join_declaration)
  3603. {
  3604. $joins_entry_parts = array();
  3605. if ($join_declaration[$join_left_table])
  3606. {
  3607. $joins_entry_parts[] = $join_declaration[$join_left_table];
  3608. }
  3609. $joins_entry_parts[] = $join_declaration[$join_type];
  3610. $joins_entry_parts[] = $join_declaration[$join_right_table];
  3611. $joins_entry_parts[] = 'ON';
  3612. $joins_entry_parts[] = $join_declaration[$join_left_value];
  3613. $joins_entry_parts[] = '=';
  3614. $joins_entry_parts[] = $join_declaration[$join_right_value];
  3615. foreach($join_declaration[$join_conditions] as $join_condition)
  3616. {
  3617. $joins_entry_parts[] = 'AND';
  3618. $joins_entry_parts[] = $join_condition[$join_condition_column];
  3619. $joins_entry_parts[] = $join_condition[$join_condition_operator];
  3620. $joins_entry_parts[] = $join_condition[$join_condition_value];
  3621. }
  3622. $joins[] = implode(' ', $joins_entry_parts);
  3623. }
  3624. $join = implode(' ', $joins);
  3625. $group_bys = array();
  3626. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_COURSE_GROUP)
  3627. {
  3628. $group_bys[] = $wcg_id;
  3629. }
  3630. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_PLATFORM_GROUP)
  3631. {
  3632. $group_bys[] = $gg_id;
  3633. }
  3634. if($submitter_type == WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_USER)
  3635. {
  3636. $group_bys[] = $uu_id;
  3637. }
  3638. $group_by = implode(', ', $group_bys);
  3639. $query_parts = array();
  3640. $query_parts[] = 'SELECT';
  3641. $query_parts[] = $select;
  3642. $query_parts[] = 'FROM';
  3643. $query_parts[] = $join;
  3644. if (isset($condition))
  3645. {
  3646. $translator = ConditionTranslator :: factory($this);
  3647. $query_parts[] = $translator->render_query($condition);
  3648. }
  3649. $query_parts[] = 'GROUP BY';
  3650. $query_parts[] = $group_by;
  3651. $orders = array();
  3652. if (is_null($order_by))
  3653. {
  3654. $order_by = array();
  3655. }
  3656. elseif (! is_array($order_by))
  3657. {
  3658. $order_by = array($order_by);
  3659. }
  3660. foreach ($order_by as $order)
  3661. {
  3662. $order_parts = array();
  3663. if ($order)
  3664. {
  3665. if ($order->alias_is_set())
  3666. {
  3667. switch ($order->get_alias())
  3668. {
  3669. case '' :
  3670. $order_parts[] = $this->escape_column_name($order->get_property());
  3671. break;
  3672. default :
  3673. $order_parts[] = $this->escape_column_name($order->get_property(), $order->get_alias());
  3674. break;
  3675. }
  3676. }
  3677. else
  3678. {
  3679. $order_parts[] = $this->escape_column_name($order->get_property(),
  3680. $this->get_alias(User :: get_table_name()));
  3681. }
  3682. $order_parts[] = $order->get_direction() == SORT_DESC ? 'DESC' : 'ASC';
  3683. $orders[] = implode(' ', $order_parts);
  3684. }
  3685. }
  3686. $order = implode(', ', $orders);
  3687. if (count($orders))
  3688. {
  3689. $query_parts[] = 'ORDER BY';
  3690. $query_parts[] = $order;
  3691. }
  3692. if ($count < 0)
  3693. {
  3694. $count = null;
  3695. }
  3696. $this->set_limit(intval($count), intval($offset));
  3697. $query = implode(' ', $query_parts);
  3698. return new Mdb2ResultSet($this, $this->query($query), WeblcmsAssignmentSubmissionsTracker :: class_name());
  3699. }
  3700. function retrieve_assignment_publication_target_users($publication_id, $course_id, $offset = null, $count = null,
  3701. $order_by = null, $condition = null)
  3702. {
  3703. $udm = UserDataManager :: get_instance();
  3704. $users = $this->retrieve_publication_target_users($publication_id, $course_id, null, null, null, $condition)->as_array();
  3705. $user_ids = array();
  3706. foreach ($users as $user)
  3707. {
  3708. $user_ids[$user->get_id()] = $user->get_id();
  3709. }
  3710. if(count($user_ids) < 1)
  3711. {
  3712. $user_ids[] = -1;
  3713. }
  3714. $conditions = array();
  3715. ! is_null($condition) ? $conditions[] = $condition : $condition;
  3716. $conditions[] = new InCondition(User :: PROPERTY_ID, $user_ids, $udm->get_alias(User :: get_table_name()),
  3717. true);
  3718. $condition = new AndCondition($conditions);
  3719. return $this->retrieve_assignment_publication_targets($publication_id, WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_USER,
  3720. $condition, $offset, $count, $order_by);
  3721. }
  3722. function retrieve_assignment_publication_target_course_groups($publication_id, $course_id, $offset = null, $count = null,
  3723. $order_by = null, $condition = null)
  3724. {
  3725. $course_groups = $this->retrieve_publication_target_course_groups($publication_id, $course_id, null, null, null, $condition)->as_array();
  3726. $course_group_ids = array();
  3727. foreach ($course_groups as $course_group)
  3728. {
  3729. $course_group_ids[$course_group->get_id()] = $course_group->get_id();
  3730. }
  3731. if(count($course_group_ids) < 1)
  3732. {
  3733. $course_group_ids[] = -1;
  3734. }
  3735. $conditions = array();
  3736. ! is_null($condition) ? $conditions[] = $condition : $condition;
  3737. $conditions[] = new InCondition(CourseGroup :: PROPERTY_ID, $course_group_ids, $this->get_alias(CourseGroup :: get_table_name()),
  3738. true);
  3739. $condition = new AndCondition($conditions);
  3740. return $this->retrieve_assignment_publication_targets($publication_id, WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_COURSE_GROUP,
  3741. $condition, $offset, $count, $order_by);
  3742. }
  3743. function retrieve_assignment_publication_target_platform_groups($publication_id, $course_id, $offset = null, $count = null,
  3744. $order_by = null, $condition = null)
  3745. {
  3746. $gdm = GroupDataManager :: get_instance();
  3747. $platform_groups = $this->retrieve_publication_target_platform_groups($publication_id, $course_id, null, null, null, $condition)->as_array();
  3748. $platform_group_ids = array();
  3749. foreach ($platform_groups as $platform_group)
  3750. {
  3751. $platform_group_ids[$platform_group->get_id()] = $platform_group->get_id();
  3752. }
  3753. if(count($platform_group_ids) < 1)
  3754. {
  3755. $platform_group_ids[] = -1;
  3756. }
  3757. $conditions = array();
  3758. ! is_null($condition) ? $conditions[] = $condition : $condition;
  3759. $conditions[] = new InCondition(Group :: PROPERTY_ID, $platform_group_ids, $gdm->get_alias(Group :: get_table_name()),
  3760. true);
  3761. $condition = new AndCondition($conditions);
  3762. return $this->retrieve_assignment_publication_targets($publication_id, WeblcmsAssignmentSubmissionsTracker::SUBMITTER_TYPE_PLATFORM_GROUP,
  3763. $condition, $offset, $count, $order_by);
  3764. }
  3765. }
  3766. ?>