Minor - partial merge with 1.11.x

pull/2487/merge
Julio Montoya 7 years ago
parent b3cfb3d2d8
commit fea198c8ca
  1. 15
      .htaccess
  2. 2
      certificates/index.php
  3. 785
      documentation/changelog.html
  4. 97
      documentation/installation_guide.html
  5. 1482
      documentation/installation_guide_es_ES.html
  6. 101
      documentation/installation_guide_fr_FR.html
  7. 4
      documentation/optimization.html
  8. 4
      documentation/readme.html
  9. 58
      documentation/security.html
  10. 51
      index.php
  11. 2
      plugin/advanced_subscription/ajax/advanced_subscription.ajax.php
  12. 2
      plugin/advanced_subscription/src/open_session.php
  13. 21
      plugin/bbb/README.md
  14. 13
      plugin/bbb/admin.php
  15. 27
      plugin/bbb/changelog.md
  16. 17
      plugin/bbb/lang/english.php
  17. 22
      plugin/bbb/lang/french.php
  18. 9
      plugin/bbb/lang/german.php
  19. 23
      plugin/bbb/lang/spanish.php
  20. 173
      plugin/bbb/lib/bbb.lib.php
  21. 10
      plugin/bbb/lib/bbb_api.php
  22. 94
      plugin/bbb/lib/bbb_plugin.class.php
  23. 95
      plugin/bbb/listing.php
  24. 6
      plugin/bbb/start.php
  25. 23
      plugin/buycourses/lang/english.php
  26. 27
      plugin/buycourses/lang/french.php
  27. 30
      plugin/buycourses/src/buy_course_plugin.class.php
  28. 2
      plugin/buycourses/src/configure_course.php
  29. 6
      plugin/buycourses/src/sales_report.php
  30. 10
      plugin/buycourses/src/service_process.php
  31. 7
      plugin/buycourses/src/services_add.php
  32. 6
      plugin/buycourses/src/services_edit.php
  33. 110
      plugin/buycourses/view/process.tpl
  34. 2
      plugin/ext_auth_chamilo_logout_button_behaviour/plugin.php
  35. 1
      plugin/ims_lti/install.php
  36. 3
      plugin/ims_lti/uninstall.php
  37. 185
      plugin/notebookteacher/src/NotebookTeacher.php
  38. 11
      plugin/notebookteacher/src/NotebookTeacherPlugin.php
  39. 517
      plugin/notebookteacher/src/index.php
  40. 13
      plugin/olpc_peru_filter/lib/olpc_peru_filter_plugin.class.php
  41. 3
      plugin/pens/pens.php
  42. 1
      plugin/test2pdf/README.md
  43. 10
      plugin/test2pdf/class/font/courier.php
  44. 10
      plugin/test2pdf/class/font/courierb.php
  45. 10
      plugin/test2pdf/class/font/courierbi.php
  46. 10
      plugin/test2pdf/class/font/courieri.php
  47. 20
      plugin/test2pdf/class/font/helvetica.php
  48. 20
      plugin/test2pdf/class/font/helveticab.php
  49. 20
      plugin/test2pdf/class/font/helveticabi.php
  50. 20
      plugin/test2pdf/class/font/helveticai.php
  51. 19
      plugin/test2pdf/class/font/symbol.php
  52. 20
      plugin/test2pdf/class/font/times.php
  53. 20
      plugin/test2pdf/class/font/timesb.php
  54. 20
      plugin/test2pdf/class/font/timesbi.php
  55. 20
      plugin/test2pdf/class/font/timesi.php
  56. 19
      plugin/test2pdf/class/font/zapfdingbats.php
  57. 1949
      plugin/test2pdf/class/fpdf.php
  58. 12
      plugin/test2pdf/config.php
  59. 27
      plugin/test2pdf/database.php
  60. 2
      plugin/test2pdf/index.php
  61. 2
      plugin/test2pdf/install.php
  62. 2
      plugin/test2pdf/lang/spanish.php
  63. 2
      plugin/test2pdf/plugin.php
  64. 332
      plugin/test2pdf/src/download-pdf.php
  65. 233
      plugin/test2pdf/src/test2pdf.lib.php
  66. 40
      plugin/test2pdf/src/test2pdf_plugin.class.php
  67. 34
      plugin/test2pdf/src/view-pdf.php
  68. 17
      plugin/test2pdf/start.php
  69. 2
      plugin/test2pdf/uninstall.php
  70. 12
      plugin/test2pdf/view/view-pdf.tpl
  71. 3
      plugin/vchamilo/install.php
  72. 17
      plugin/vchamilo/lib/Virtual.php
  73. 3
      plugin/vchamilo/vcron.php
  74. 7
      plugin/vchamilo/views/manage.controller.php
  75. 4
      plugin/vchamilo/views/manage.testcnx.php
  76. 2
      tests/behat/README.md
  77. 43
      tests/behat/features/bootstrap/FeatureContext.php
  78. 4
      tests/behat/features/course_user_registration.feature
  79. 2
      tests/behat/features/toolAnnouncement.feature
  80. 36
      tests/behat/features/toolExercise.feature
  81. 14
      tests/behat/features/toolGroup.feature
  82. 15
      tests/behat/features/toolLp.feature
  83. 4
      tests/behat/features/toolWork.feature
  84. 39
      tests/scripts/fix_lp_id_to_iid.php
  85. 1
      tests/travis/php-config.ini
  86. 2
      tests/travis/setup-php-fpm.sh
  87. 4
      tests/travis/travis-apache

@ -1,7 +1,19 @@
# Check that your Apache virtualhost have this settings:
#<Directory "/var/www/chamilo-classic">
# AllowOverride All
# Order allow,deny
# Allow from all
#</Directory>
RewriteEngine on
# Prevent execution of PHP from directories used for different types of uploads
RedirectMatch 403 ^/app/(cache|courses|home|logs|upload|Resources/public/css)/.*\.ph(p[3457]?|t|tml|ar)$
RedirectMatch 403 ^/main/default_course_document/images/.*\.ph(p[3457]?|t|tml|ar)$
RedirectMatch 403 ^/main/lang/.*\.ph(p[3457]?|t|tml|ar)$
RedirectMatch 403 ^/web/css/.*\.ph(p[3457]?|t|tml|ar)$
# http://my.chamilo.net/certificates/?id=123 to http://my.chamilo.net/certificates/index.php?id=123
RewriteCond %{QUERY_STRING} ^id=(.*)$
RewriteRule ^certificates/$ certificates/index.php?id=%1 [L]
@ -34,6 +46,9 @@ RewriteRule ^courses/([^/]+)/(.*)$ app/courses/$1/$2 [QSA,L]
# About session
RewriteRule ^session/(\d{1,})/about/?$ main/session/about.php?session_id=$1 [L]
# About course
RewriteRule ^course/(\d{1,})/about/?$ main/course_info/about.php?course_id=$1 [L]
# Issued individual badge friendly URL
RewriteRule ^badge/(\d{1,}) main/badge/issued.php?issue=$1 [L]

@ -10,6 +10,8 @@ require_once '../main/inc/global.inc.php';
$action = isset($_GET['action']) ? $_GET['action'] : null;
$certificate = new Certificate($_GET['id']);
CustomCertificatePlugin::redirectCheck($certificate, $_GET['id']);
switch ($action) {
case 'export':
$hideExportLink = api_get_setting('hide_certificate_export_link');

@ -57,24 +57,19 @@
date = city;
city = '';
}
var link = $("<a/>", {
text: title,
"title": title,
"href": "#"+version
});
$("#index").append(
$('<tr>').append($('<td>').append(link), $('<td>').append(city), $('<td>').append(date))
);
});
});
</script>
<div class="container"><div class="row"><div class="col-md-12">
<ul class="breadcrumb">
<li>
<a href="index.html">Documentation</a>
@ -114,24 +109,785 @@
<div class="version" aria-role="article" aria-label="1.11.8">
<a name="1.11.8"></a>
<h1>Chamilo 1.11.8 - ??????, ??/??/????</h1>
<h1>Chamilo 1.11.8 - Sayaxché, ??/08/2018</h1>
<h3>Release notes - summary</h3>
<p>Chamilo 1.11.8 is a minor, bugfix release on top of 1.11.6.</p>
<p>Chamilo 1.11.8 is a minor, bug fix and security fix release on top of 1.11.6 that contains a series of
small new features, including first support for European RGPD. Given the security fixes it contains,
we highly recommend you to update from previous versions as soon as possible.</p>
<h3>Release name</h3>
<p>?????????????</p>
<p><a href="https://en.wikipedia.org/wiki/Sayaxch%C3%A9">Sayaxché</a> is a small municipality in the Guatemalan
jungle of El Petén. It is a notable point that requires taking a small ferry to cross the La Pasión river
and get from the ancient ruins of Tikal to the modern capital city of Guatemala. This represents the jump we
are hoping to make after 1.11.8 to get out of the 1.11 versions and into our restructured version 2.0.
</p>
<h3>Security fixes</h3>
<ul aria-role="log" aria-live="off">
<li>[2018-07-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/385a84efe62a1910700465c1748e4036dc43bf18">385a84ef</a>) Security: Add app/Resources/public/css to the list of directories where execution of PHP is forbidden</li>
<li>[2018-07-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/b0041b6250b3fdbe5a939c549e8d0ce69dd686e1">b0041b62</a>) Security: Add documentation about X-Frame-Options in configuration.dist.php</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/0de84700648f098c1fbf6b807dee28ec640efe62">4ffe5edb</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2532">#2532</a>) Security: Add Security::remove_XSS to clean variables from $_REQUEST</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/d5129ad7ede4d8f21b039689559c77616cf8a891">d5129ad7</a>) Security: Update PHP files extension matching pattern in .htaccess and documentation to match all possible forms supported by PHP 5 and PHP 7.</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/1c27a8b42aa4df5fb870d1303488bc35ab91bd95">1c27a8b4</a>) Security: add rules to .htaccess to prevent direct PHP execution from the corresponding directories and updates security.html with a missing change in the previous commit. Using security.html is still the recommended way to go for security, but in the absence of that, we want to make sure Chamilo is always more secure.</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/6ff87c3ae6106e32eb3dd76b78c952acccbd1529">6ff87c3a</a>) Security: Add Nginx rules to security documentation, in order to prevent execution of PHP files from the uploadable-files directories</li>
<li>[2018-05-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/d400657bfa7ca08ca7a26abb73f607244cc48e73">d400657b</a>) Security: Fix who is online access: now it will check chamilo settings api_get_setting('showonline', 'world') api_get_setting('showonline', 'users') api_get_setting('showonline', 'course')</li>
<li>[2018-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/0de84700648f098c1fbf6b807dee28ec640efe62">0de84700</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2532">GH#2532</a>) Security: Use json_decode/json_encode instead base64 - Add Security::remove_XSSS</li>
<li>[2018-05-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/d69719233ce93e5590c77653436b6bdc8ab66aac">d6971923</a>) Security: Check access to "who is online in session"</li>
<li>[2018-04-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/00f3e4a6506035674a58ccdf4ebe098bd6f607e3">00f3e4a6</a>) Security: Fix work access for teachers and students </li>
</ul>
<h3>Possibly breaking changes</h3>
<ul aria-role="log" aria-live="off">
<li>[2018-07-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/6750c5f582038458378194ca0d14992441c942c5">6750c5f5</a> - <a href="https://task.beeznest.com/issues/14687">BT#14687</a>) Gradebook: Rename disable_gradebook_stats to gradebook_enable_best_score and fix behaviour: now the setting will be required to *enable* the 3 last columns of the gradebook results table (avg, best score and ranking)</li>
<li>[2018-07-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/4d67dfb66a3e489ef12fa4db7eef3c3f5e89367a">4d67dfb6</a> - <a href="https://task.beeznest.com/issues/14687">BT#14687</a>) Gradebook: Avoid conflict between gradebook_detailed_admin_view and disable_gradebook_stats</li>
</ul>
<h3>Notable new Features</h3>
<h4>For end-users, teachers and Chamilo admins</h4>
<ul aria-role="log" aria-live="off">
<li>[2018-07-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/33dc232d6ffcd985f52bf8b1a56b497033b6b52f">33dc232d</a> - <a href="https://task.beeznest.com/issues/14609">BT#14609</a>) Learnpath: SCORM change: Default value of olms.lesson_status is "not attempted"</li>
<li>[2018-06-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/43bf48686b636cdb6623d5bd53a4eae6e14a1ea6">43bf4868</a> - <a href="https://task.beeznest.com/issues/14435">BT#14435</a>) Quiz: Change color from blue to black in ASCIIMathML scripts to highlight formulas (now will appear in a normal black)</li>
<li>[2018-06-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/dd3390a6b9c638bec466e4b18e2e73682e417f31">dd3390a6</a>) Global: Adding page about the course</li>
<li>[2018-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/0a345a939ab66e5b52fb417eefa10a515d693ecb">0a345a93</a> - <a href="https://task.beeznest.com/issues/14453">BT#14453</a>) Message: Add voice recorder button when sending a msg in the chamilo inbox</li>
<li>[2018-05-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/c91f572daab3d25df961429bf06898bda6f033fd">c91f572d</a> - <a href="https://task.beeznest.com/issues/14350">BT#14350</a>) Session: Session coach can now edit documents</li>
<li>[2018-05-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/187acee1d197de36835c6457098e78a27bf1ca28">187acee1</a> - <a href="https://task.beeznest.com/issues/14338">BT#14338</a>) Quiz: Droppable questions: Add counter in boxes</li>
<li>[2018-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/87c4804c3304aaff2440baf3d656e6f1af2bac11">87c4804c</a> - <a href="https://task.beeznest.com/issues/14111">BT#14111</a>) Course homepage: if LP links are added, use the LP order</li>
<li>[2018-04-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/43d53a73f6536f6b66ffcc002f1d0bb58253e994">43d53a73</a> - <a href="https://task.beeznest.com/issues/5776">BT#5776</a>) Learnpath: Add more prerequisite information if available when loading an item</li>
<li>[2018-04-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/98efe2a62d1c07a9da84e3dbb006240fd6d1f920">98efe2a6</a>) Quiz: Add "certainty level" question type</li>
<li>[2018-04-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/57b88a5d4b4b182044219f0930aaedb0be5ff838">57b88a5d</a>) Template: Use SYS_TEMPLATE_PATH to find template file</li>
<li>[2018-04-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/da569547cd679b267faac7a8a55247fce150d35c">da569547</a>) Template: Add twig function to get template file inside template. This changes the way how template files are included or extended. Add twig filter to get template file inside template This changes the way how template files are included or extended</li>
<li>[2018-04-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/b99aaa338a0f8b4a60e9eb7a437d514bd276e7fe">b99aaa33</a>) Template: Add hot sessions block - sessions_current.tpl</li>
<li>[2018-03-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/d76db9c8481160f83c4fe1f450fe807fb490b88a">d76db9c8</a>) Template: Add dashboard TPL</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/e13bb5130d8806119a319f2aabc772ff15540300">e13bb513</a>) Template: Add tpl index.tpl for myspace</li>
<li>[2018-03-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/4b5f86c413bed7c28006f4a0ba4a33e9c0d90a1b">4b5f86c4</a> - <a href="https://task.beeznest.com/issues/11913">BT#11913</a>) Survey: Add pending surveys page</li>
<li>[2018-03-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/d04996a32c2d4ad16ade984d3a86dda0a6779401">d04996a3</a> - <a href="https://task.beeznest.com/issues/14141">BT#14141</a>) Work: Add teacher comment to the notification</li>
<li>[2018-03-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/b256c09001123d01154edff3eea8c6f0b8f096bb">b256c090</a> - <a href="https://task.beeznest.com/issues/14056">BT#14056</a>) Portfolio: Add Portfolio Tool. Requires DB changes</li>
</ul>
<h4>For developers and sysadmins</h4>
<ul>
<li>(<a href="https://github.com/chamilo/chamilo-lms/commit/604950ff544088ee30632b9a85857cfee2adbc1d">604950ff</a>) Don't clear class for audio/video when removing xss - refs BT#14026 </li>
<ul aria-role="log" aria-live="off">
<li>[2018-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/9472341ef0b207235f75e65cf64604b3846c21cc">9472341e</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2606">GH#2606</a>) WIP: GDPR (#2606) Admin: Add configuration setting 'enable_gdpr' to enable special privacy options to ease implementation of European GDPR. Add personal data info page, LegalRepository, personal data treatment types display and update getLastLogin() results including track_e_login for legacy users</li>
<li>[2018-07-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/c0259638105253f1148cce5fd23da1c90ab27dcd">c0259638</a> - <a href="https://task.beeznest.com/issues/14687">BT#14687</a>) Gradebook: Delete gradebook categories when deleting course</li>
<li>[2018-07-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/5acc3b24c4b68e1030fc6924549c904df5801267">5acc3b24</a> - <a href="https://task.beeznest.com/issues/14687">BT#14687</a>) Admin: Allow search course by ajax to platform admin</li>
<li>[2018-07-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/85ef745825150efca772b22ad0340bf9e53afc14">85ef7458</a> - <a href="https://task.beeznest.com/issues/14664">BT#14664</a>) Plugin: BBB: Add bbb interface option (flash or html5)</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/bd7d1ad19bfc530338748dc7457ae3f5a803c7e7">bd7d1ad1</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2601">GH#2601</a>) Installation: replace check of app/course/X/test.php with an html file</li>
<li>[2018-07-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/4d65d4e84b7f5319e85c7266462150d4c5538910">4d65d4e8</a>) Admin: Add multiple-selection enabling/disabling of users</li>
<li>[2018-06-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/3107f0f6f8574fdeac0f31edafa690576ca38e05">3107f0f6</a> - <a href="https://task.beeznest.com/issues/14512">BT#14512</a>) Tracking: Add audit logging for removal/addition of users into a session</li>
<li>[2018-06-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/c2efa245d15fe7f783556eaa9bf90f75cbe5afcb">c2efa245</a> - <a href="https://task.beeznest.com/issues/14468">BT#14468</a>) Survey: Add configuration setting allow_survey_availability_datetime</li>
<li>[2018-06-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/44833e2d826183b9556c224f3f0da2e0d5d75d98">44833e2d</a> - <a href="https://task.beeznest.com/issues/14371">BT#14371</a>) Admin: Add configuration show_conditions_to_user setting to show conditions during sign up</li>
<li>[2018-05-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/4473bd11ac49390104d05ac91fc080b475d81faf">4473bd11</a> - <a href="https://task.beeznest.com/issues/14395">BT#14395</a>) Admin: Add configuration setting show_pending_survey_in_menu to show pending survey link in user menu</li>
<li>[2018-05-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/73ae4cf7f67d04697477dfa1a59927c788be9085">73ae4cf7</a> - <a href="https://task.beeznest.com/issues/14385">BT#14385</a>) Admin: Add configuration setting gradebook_hide_graph</li>
<li>[2018-05-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/73ae4cf7f67d04697477dfa1a59927c788be9085">73ae4cf7</a> - <a href="https://task.beeznest.com/issues/14385">BT#14385</a>) Admin: Add configuration setting gradebook_hide_pdf_report_button</li>
<li>[2018-05-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/662e9221766b7d7585ccd7a80fcb3c4802dd0dec">662e9221</a> - <a href="https://task.beeznest.com/issues/14324">BT#14324</a>) Maintenance: Add support for learnpath category in course backup</li>
<li>[2018-05-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/69545e0f7401f105fe38e44a1a1222da36856c05">69545e0f</a>) Plugin: Custom certificate: Add customcertificate plugin</li>
<li>[2018-05-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/1326c869739a7f6f50c27b6d26c697350b329cce">1326c869</a> - <a href="https://task.beeznest.com/issues/14324">BT#14324</a>) Admin: Add configuration setting 'allow_import_scorm_package_in_course_builder': When we export a course backup file the course/ABC/scorm/ folder is added in the zip packages. This setting imports that folder, e.g. course/ABC/scorm/my_scorm is saved in the new location course/DESTINATION/scorm/my_scorm/</li>
<li>[2018-05-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/247e1a04f1886e5c7c71b1d743350bd7b066b9dd">247e1a04</a> - <a href="https://task.beeznest.com/issues/14252">BT#14252</a>) Admin: Add configuration setting 'my_courses_session_order'. Userportal session list - Show end date null values at the end. If setting "my_courses_session_order" is set to: $_configuration['my_courses_session_order'] = ['field' => 'end_date', 'order' => 'asc']; Null values will be shown at the end.</li>
<li>[2018-05-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/409ca7ad2c143213ab419ad79099b4e6290f2ec1">409ca7ad</a> - <a href="https://task.beeznest.com/issues/14196">BT#14196</a>) Admin: Add configuration setting session_courses_read_only_mode (was lock_course_in_session)</li>
<li>[2018-05-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/caad4bbb94b5643f273b949e7d4911dedad1a440">caad4bbb</a> - <a href="https://task.beeznest.com/issues/14113">BT#14113</a>) Admin: Security: Add configuration setting 'disable_token_in_new_message' to avoid issues when sending messages for very active users with several open tabs. This introduces a security vulnerability as it can allow some third party to send DOS attacks through the PHP sending script, but might be necessary to reduce user anxiety</li>
<li>[2018-04-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/ac7665e531d883f64ee8d4509fe101991ea3e399">ac7665e5</a> - <a href="https://task.beeznest.com/issues/14254">BT#14254</a>) Admin: Add "Hide from catalog" (hide_from_catalog) course extra field in order to hide courses from the course catalog. Refactor course/session/course category code. Change function name and move functions to CourseAndSessionsCatalog</li>
<li>[2018-04-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/90ea4936eb1e5161cdcac14f6dd39beb62af57e9">90ea4936</a> - <a href="https://task.beeznest.com/issues/14251">BT#14251</a>) Admin: Add configuration setting "allow_exercise_auto_launch" to allow auto launch for documents and exercises - requires DB change</li>
<li>[2018-04-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/4cecc047adbdaa16f8e997205113806112a9b5e1">4cecc047</a> - <a href="https://task.beeznest.com/issues/14192">BT#14192</a>) Admin: Tracking: Add url(portal)/session/user stats</li>
<li>[2018-04-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/53adbbcf8e2fd3c05357a86e034df4da235495f9">53adbbcf</a> - <a href="https://task.beeznest.com/issues/14262">BT#14262</a>) Global: Show users only from current portal in who is online</li>
<li>[2018-04-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/fe0aaebfeab671316a6f3f99ecee0741e7049759">fe0aaebf</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Admin: Add configuration setting "allow_lp_chamilo_export" to export learning paths with the course builder system (from course maintenance)</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/c056499ecf131e72c68e1257d61013fb61171702">c056499e</a> - <a href="https://task.beeznest.com/issues/10769">BT#10769</a>) Admin: Add configuration setting "group_document_access" to allow sharing options for the documents inside a group. Requires DB changes.
<li>[2018-03-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/1b75983654d396b2ca446d87417f593b30f4f6f7">1b759836</a> - <a href="https://task.beeznest.com/issues/13964">BT#13964</a>) Admin: Add configuration setting "send_notification_when_document_added"</li>
<li>[2018-02-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/604950ff544088ee30632b9a85857cfee2adbc1d">604950ff</a> - <a href="https://task.beeznest.com/issues/14026">BT#14026</a>) Document: Don't clear class for audio/video when removing xss</li>
<li>[2018-02-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/50cb6f058a567e0307f04b30da083a31bc8801a2">50cb6f05</a> - <a href="https://task.beeznest.com/issues/13924">BT#13924</a>) Admin: Add configuration setting "allow_user_message_tracking"</li>
<li>[2018-02-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/6e619d2835e526e455e1df726dfb488b75d07da9">6e619d28</a> - <a href="https://task.beeznest.com/issues/14034">BT#14034</a>) Admin: Add configuration setting "send_inscription_msg_to_inbox"</li>
<li>[2018-02-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/fe04224eec4e4a641361bb2b8ea1ab67d151470c">fe04224e</a> - <a href="https://task.beeznest.com/issues/13950">BT#13950</a>) Admin: Add configuration setting "exercise_hide_label" to hide exercise question label (ribbon)
<li>[2018-02-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/531f5aa24e3f66c730bf48d2cd78f8e950c3364c">531f5aa2</a> - <a href="https://task.beeznest.com/issues/13950">BT#13950</a>) Admin: Add configuration setting "show_exercise_expected_choice" to show more information when resolving an exercise</li>
<li>[2018-02-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/01c864bfab6ac4ec3fb0d119324de1a082664a5c">01c864bf</a> - <a href="https://task.beeznest.com/issues/13794">BT#13794</a>) Admin: Add configuration setting "lp_view_settings" to hide reporting icon in lp view</li>
<li>[2018-02-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/93a64d5f4a6b31b967e05dbff9a73152d8b543be">93a64d5f</a> - <a href="https://task.beeznest.com/issues/13334">BT#13334</a>) Admin: Add configuration setting "allow_skill_rel_items" to link skills to things. Requires DB changes</li>
<li>[2018-02-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/155235edc9905898315a3c5a2be7b880c1f05d1c">155235ed</a> - <a href="https://task.beeznest.com/issues/13943">BT#13943</a>) Admin: Add configuration setting "send_two_inscription_confirmation_mail"- This will send 2 emails to the user, one with the username, the other with the password.</li>
<li>[2018-02-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/597a7456c7fc23387028aef62a697d543897e9cb">597a7456</a> - <a href="https://task.beeznest.com/issues/13829">BT#13829</a>) Admin: Add configuration setting "allow_base_course_category"</li>
<li>[2018-02-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/28daf39dc05702bea603c6d9dee5c54854243955">28daf39d</a> - <a href="https://task.beeznest.com/issues/13924">BT#13924</a>) Admin: Add configuration setting "allow_user_message_tracking"</li>
<li>[2018-02-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/bae37ae8953dbc729444aec3d18ea0592d5376ee">bae37ae8</a> - <a href="https://task.beeznest.com/issues/10895">BT#10895</a>) Admin: Add configuration setting "allow_remove_tags_in_glossary_export"</li>
<li>[2018-02-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/110f7fc2d12a00d5c9ac3ef2950e992b9fe93a40">110f7fc2</a> - <a href="https://task.beeznest.com/issues/13944">BT#13944</a>) Admin: Add configuration setting "generate_random_login" when importing users by CSV</li>
<li>[2018-01-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/423e9b64664aeb18cb6c045c5913ea9fc4ecd982">423e9b64</a> - <a href="https://task.beeznest.com/issues/13923">BT#13923</a>) Admin: Add configuration setting allow_teachers_to_access_blocked_lp_by_prerequisite to allow teachers, drhs and admins to access blocked LP's because a prerequisite.</li>
</ul>
<h3>Improvements (minor features) and debug</h3>
<ul aria-role="log" aria-live="off">
<li>[2018-08-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/c2b4f937520fe843f757b78bd77e88c10c091527">c2b4f937</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2616">GH#2616</a>) Quiz: Fix empty lines appearing when no question details set to appear</li>
<li>[2018-08-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/3400f430a5a70bbd49c261affe5288330abf2291">3400f430</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2572">GH#2572</a>) Learnpath: Quiz: Fix issue preventing save buttons for individual questions and end of test when quizzes are included into learning paths on Apple devices</li>
<li>[2018-08-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/618c56cd90e1f00fac11df9cb0c35dd4c68539da">618c56cd</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2555">GH#2555</a>) Privacy: Add "Delete legal agreement" button</li>
<li>[2018-08-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/48304997bf2cb5c3ebdcc128b3a9595358e2ab28">48304997</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2503">GH#2503</a>) Privacy: Adding courses, classes, sessions in the personal data page</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/1721979c0df1be16da819973b522bb87dabc791a">1721979c</a>) Quiz: Certainty level: Change e-mail message format</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/fa5644466acb4978eeba1f2b58bca42455f2e5f6">fa564446</a>) Learnpath: Change language term linked to buy course plugin for certificate service</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/fca22196eb4107d3334db1e3fd0eaf334de731f2">fca22196</a>) Course introduction: Fix language variable for group PDF import</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/87d7828ac4aed1432355ca3f924f4b3c5b08c246">87d7828a</a>) Internal: Add option to hide terms for plugins in language script</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/0fbc5a5107345641e6acef50e58e2b2167b4bfce">0fbc5a51</a>) Plugin: Learning calendar: Extra code cleanup</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/8a58dd2f83c62c0ad6c07944d20a8df9b28e47af">8a58dd2f</a>) Session: Fix erroneous variable capitalization</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/c4c17b19bf61d37ba5e40d878e77328873bef842">c4c17b19</a>) Plugin: Learning calendar: Security: clean up GET variables and language terms</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/6413516bfd53050deb97eb0425ec5392d4281883">6413516b</a>) Internal: Improve language terms scanning script - re-enable die() call to avoid non-authorized execution</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/c1478e829702662c89003967764df4b1691305a1">c1478e82</a>) Internal: Improve language terms scanning script</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/992b79c624a8f524a4fb33a139befb0e1c7f10d1">992b79c6</a>) Template: Fix missing get_lang call for LightBlue in skill wheel</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/7a6691647c213b1b950b622de685710b2220a4a8">7a669164</a>) Internal: Add error checking before writing web/build/main.language.js</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/13676a5dcbbe59e51304dd7eb6ba971726965942">13676a5d</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2574">GH#2574</a>) Install: Use "SET SESSION sql_mode" to avoid issues with bin/doctrine.php when we don't have global DB privileges</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/dd29d0f3126e5d62bd1d3aea646e10766a752766">dd29d0f3</a>) Internal: Remove TEACHER case from get_status_from_code(): TEACHER constant doesn't exist.</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/6075671b780dd703ab4e03a6e33771d83f97198f">6075671b</a>) Quiz: Add link to user profile in test results header table</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/a7567be9c54fbd1ed16779479b7a051c76c3a282">a7567be9</a>) Privacy: Personal data - Add extra fields in export</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/0483dcf95f647c747af5c7b0408e624ff883e693">0483dcf9</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2553">GH#2553</a>) Privacy: Add terms page and link from personal_data.php</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/c6991d19842a2f78053d4a2bbe4eeca54e2899d4">c6991d19</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2554">GH#2554</a>) Privacy: Add new event when user confirms the email LOG_USER_CONFIRMED_EMAIL</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/9990290c3d59af96a6e75e329ed72830e4deca7b">9990290c</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2554">GH#2554</a>) Privacy: Add log "LOG_TERM_CONDITION_ACCEPTED" when accepting a condition #2554</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/06905e10723008dafe39e1756818daa76c78dbac">06905e10</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2554">GH#2554</a>) Privacy: Add text "WeNeedYouToAcceptOurTreatmentOfYourData"</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/233ca604954898011854385e4ea2a57aa60ddcc9">233ca604</a>) Plugin: Add new option "translate_options" when using a select</li>
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/ac98b7a990901072f754cec88b29ebf062f6d567">ac98b7a9</a>) Internal: Remove use of "api_" functions in entities - This fires errors when serializing an object</li>
<li>[2018-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/20a450adfed5b13c3f3a36f02cd88cd7d8d42181">20a450ad</a>) Plugin: BBB: Update language terms</li>
<li>[2018-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/b6cf173fdcb58b49a070c62756f462ef699e2612">b6cf173f</a>) Plugin: BBB: Synchronize translations</li>
<li>[2018-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/e3caef56be014d0c8694607aa67ca60f47e07be1">e3caef56</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2574">GH#2574</a>) Install: Add extra setting of sql_mode to "" to avoid NO_ZERO_DATE in 1.9 to 1.10 upgrade -</li>
<li>[2018-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/cc61f12eeef0fc0fb3d67d1c13c353639ed9f669">cc61f12e</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2609">GH#2609</a>) Install: Add reference in changelog to possibly breaking change in variables names around gradebook_detailed_admin_view</li>
<li>[2018-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/2109fc9591040cc627a94dfb2d70fd1fdcfb86bd">2109fc95</a> - <a href="https://task.beeznest.com/issues/14644">BT#14644</a>) Learnpath: WIP - Fix FillInBlank question export from LP to SCORM</li>
<li>[2018-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/74d3c82f4a8af95621d91505b4304fdbc1bd7f5a">74d3c82f</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Only take into account one attempt</li>
<li>[2018-07-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/41780885526efccb17df95c0bdbb99c88ef85c43">41780885</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2582">GH#2582</a>) Internal - Fix static permissions for files/directories: use API functions to get the right permissions</li>
<li>[2018-07-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/474520ce3f4fff1948a72ceef54c0591d371ffb3">474520ce</a>) Internal: rename French-based suivi_group_space.php to group_space_tracking.php</li>
<li>[2018-07-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/46801a74b8b17ed5fe06d0d01fd467e6719c3d26">46801a74</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2491">GH#2491</a>) Gradebook: fix issues shifting gradebook charts - fix #2491</li>
<li>[2018-07-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/475f58e72c893c1c689df64432b7a21cdb171263">475f58e7</a> - <a href="https://task.beeznest.com/issues/14372">BT#14372</a>) Internal: Add session_id = 0 to fix c_tool LP links</li>
<li>[2018-07-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/673dd3d346439ab4261ef796e15716e313d3717f">673dd3d3</a> - <a href="https://task.beeznest.com/issues/14372">BT#14372</a>) Document: Change "video/mpeg4-generic" to "video/mp4", fix video tag BT#14372 Remove filename when using "inline" not needed https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition</li>
<li>[2018-07-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/302ec74db1002edb053ea0f8fc6b9aa0903674c9">302ec74d</a> - <a href="https://task.beeznest.com/issues/14688">BT#14688</a>) Quiz: Fix inter-version issue introduced by 5a80a12c58e3864cead851c43ad10d0048b7acd6 in which the comments and scores in exercises corrections were not taken into account</li>
<li>[2018-07-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/f9b0c9c2a9abc3c05401601868d9ccc7d0967f50">f9b0c9c2</a> - <a href="https://task.beeznest.com/issues/14688">BT#14688</a>) Document: Add api_detect_encoding() call into api_replace_dangerous_char() to avoid URLify::filter() removing the complete string. This was altering the behaviour of Chamilo as the same file was uploading correctly in 1.10.4</li>
<li>[2018-07-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/191d5fc35b4f47b6324d482355e20ecf3ef30d0d">191d5fc3</a> - <a href="https://task.beeznest.com/issues/14664">BT#14664</a>) Internal: Move tpl</li>
<li>[2018-07-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/be82d6afefacc958fdb1c16e3c05a4592dc078ce">be82d6af</a> - <a href="https://task.beeznest.com/issues/14664">BT#14664</a>) Plugin: BBB: Add icons for conference type</li>
<li>[2018-07-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/6509cc5032e379f0f5cedf343d2f4314bca3bcfa">6509cc50</a> - <a href="https://task.beeznest.com/issues/14644">BT#14644</a>) Learnpath: Fix fill in blank question from LP to SCORM export see</li>
<li>[2018-07-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/4918896b0cd178b2b66c35906e8588068de27cb1">4918896b</a> - <a href="https://task.beeznest.com/issues/14664">BT#14664</a>) Plugin: BBB: Add share blocks for html or flash</li>
<li>[2018-07-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/c51000cb5cb67c34825ade9abc51a091a8646f44">c51000cb</a> - <a href="https://task.beeznest.com/issues/14687">BT#14687</a>) Gradebook: Fix export gradebook to pdf</li>
<li>[2018-07-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/8073dfb0c83fb15ee172dabe57a4e703023e4bf3">8073dfb0</a> - <a href="https://task.beeznest.com/issues/14687">BT#14687</a>) Gradebook: Fix disable_gradebook_stats in gradebook results</li>
<li>[2018-07-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/a3fadca53424d334210b10ed1f7d6a45f9506f8a">a3fadca5</a> - <a href="https://task.beeznest.com/issues/14696">BT#14696</a>) Certificates: Add username to list of available tags (sometimes username is used as national ID number)</li>
<li>[2018-07-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/9ce5eb789a69847e60244ed5c9ec7ba63854a1f2">9ce5eb78</a> - <a href="https://task.beeznest.com/issues/14644">BT#14644</a>) Learnpath: Fix Chamilo quiz to scorm export</li>
<li>[2018-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/1c43f3c256ca08f54f40a3637b92866114b986f6">1c43f3c2</a>) Internal: Add validation for empty file fields in extra_field_value.lib.php::saveFieldValues()</li>
<li>[2018-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/828841c55758a43148e3c51667908705ff2b3334">828841c5</a>) Registration: Add support for course and session parameters in registration confirmation e-mail</li>
<li>[2018-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/378cae873cd63ab2a73a883bf21c54fe83a51045">378cae87</a>) Registration: Add 'confirmation' type to allowed auto-registration processes</li>
<li>[2018-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/866eaff548b59c38ea664c21e211f49f05c1db81">866eaff5</a>) Internal: Update api_get_course_url() to support session-only URLs too. Always returns string now (empty string if no match found).</li>
<li>[2018-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/51206c13ff81d44860d613a4aea19f94e218f108">51206c13</a>) Course settings: fix inter-versions issue showing all extra fields as admins to teachers</li>
<li>[2018-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/e9b0d9a5691322f580e81939b4ed37d120f40f54">e9b0d9a5</a>) Documentation: Add Nginx redirect for course catalogue's new 'about' page</li>
<li>[2018-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/37b00ec534735632ea2cecdee858c84eef426b2e">37b00ec5</a>) Course settings: Fix issue preventing tags and video_url to appear when allow_teachers_to_classes is enabled</li>
<li>[2018-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/b739373a9e6792fb5e4146050b3e442a721cc7c6">b739373a</a> - <a href="https://task.beeznest.com/issues/14666">BT#14666</a>) Tracking: Set user as event data in update user hook</li>
<li>[2018-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/638f5e6bc86dff2793a76cdef578ba4931d6bf46">638f5e6b</a> - <a href="https://task.beeznest.com/issues/14644">BT#14644</a>) Learnpath: Fix LP export of document paths</li>
<li>[2018-07-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/0de0e3a03d9f43438e311213f3b755d12a2ead07">0de0e3a0</a>) Install: Remove date.timezone message for PHP versions >= 7.0 as it does not trigger a PHP Warning anymore.</li>
<li>[2018-07-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/628018e6d9992ecb625803d4eeea689dfeed6d13">628018e6</a> - <a href="https://task.beeznest.com/issues/14688">BT#14688</a>) Ticket: Revert previous commit making project 1 visible to all, and instead make the ticket floating tab always visible but reaching a page where you only see your own tickets</li>
<li>[2018-07-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/90e92d219f13f5bbca33e883240cc89cc1971839">90e92d21</a>) Ticket: project 1 is always available to all unless specifically defined otherwise in configuration.php</li>
<li>[2018-07-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/f7e784db9a388a8286cbb66538215c0d71cd8c61">f7e784db</a>) Plugin: BBB: Add copy text to clipboard, add warning message</li>
<li>[2018-07-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/b8aa1fd4991ca59d7ebf3b8278f65a8a9bc70a2b">b8aa1fd4</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2607">GH#2607</a>) Display: Fix courses/session menus</li>
<li>[2018-07-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/e72d179bd4f648545a274e98be60f82326858818">e72d179b</a> - <a href="https://task.beeznest.com/issues/14688">BT#14688</a>) Internal: Update cache cleaning message to dissociate app/cache/ permissions from web/ permissions errors</li>
<li>[2018-07-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/085779cc33c645426b20ac9ee31882b3c5cca833">085779cc</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: improve plot UI, improve js calls</li>
<li>[2018-07-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/5bdc33e235c167c4df762663b2ab510174af7825">5bdc33e2</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Fix IE issue when updating calendar</li>
<li>[2018-07-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/3f1c90bd3756b66365018a6a84abc19b19a3ac06">3f1c90bd</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Add new table "learning_calendar_control_point" - Add jqplot - Add multiple users to a calendar</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/5dd7561cb293f8b607092215f730363d03c94150">5dd7561c</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2605">GH#2605</a>) Quiz: Remove French hardcoded texts in certainty question type</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/804e3690a7d08092ae8cb9b435719489ddca3af1">804e3690</a> - <a href="https://task.beeznest.com/issues/14115">BT#14115</a>) Optimization: Largely optimize session courses list on My Courses page by splitting list query in two. Reduces execution time from 85s to ~0.2s for campus with 58K sessions</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/321095f186e9ccc53d129b2394dcffb91ab4e8de">321095f1</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2600">GH#2600</a>) Quiz: Change of colors and improvement of presentation of results for certainty question type</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/e7fcee62b080dcb53f143d438a067a2fa43dda59">e7fcee62</a> - <a href="https://task.beeznest.com/issues/14688">BT#14688</a>) Install: Add check on sso_authentication_subclass to avoid insertion of an empty one if SSO was already implemented</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/1510ec9def68a600e06aca34b565eff385ee8cb1">1510ec9d</a>) Internal: Replace create_function with anonymous function</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/7c0a032079f55ce1423e6f13b0990873d659e45e">7c0a0320</a> - <a href="https://task.beeznest.com/issues/14506">BT#14506</a>) Learnpath: Check first the iid then try the id to get the correct item</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/c2d40c5df3fa501c19563e1647f8beb0592c3cc3">c2d40c5d</a>) Internal: Use "ajax async" to save the course logout correctly, only when course object is set.</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/74e32e33bb29113a347908b2465fdc06d89caac1">74e32e33</a>) Social: Use classic query instead of using doctrine repository, to avoid an error because the message.msg_status is boolean instead of smallint in the entity Message.php we use a simple query. message.msg_status is fixed already in v2</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/47542dc8685a19ef51ba9337199307607dca4988">47542dc8</a> - <a href="https://task.beeznest.com/issues/14644">BT#14644</a>) Learnpath: Fix LP export</li>
<li>[2018-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/e201e9ae87edd014f572fa9d048629eac23689c1">e201e9ae</a>) Internal: Delete course image when cleaning the course.</li>
<li>[2018-07-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/2d8934429ba0082e35f6898e80c9b25ebd670e4e">2d893442</a>) Optimization: CDN: Improve speed of api_get_cdn_path() by checking first for the 'cdn_enable' option's value</li>
<li>[2018-07-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/ddf3db2c1b0eab617bdd41e1e38bcb7dc1d4e849">ddf3db2c</a>) Optimization: CDN: Add CORS information to configuration.php in CDN feature block</li>
<li>[2018-07-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/5bfb14aa033c9318660db3d7fe75a93a3502d841">5bfb14aa</a>) Optimization: CDN: Implement missing CDN path feature for main JS and CSS files (was only working on custom CSS)</li>
<li>[2018-07-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/8839965e7fc93c1b664b1cbf4c65265c04d5df4b">8839965e</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2549">GH#2549</a>) Quiz: Improvement for responsive email template</li>
<li>[2018-07-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/ba8bb15e1311d3feea83d73403f53a96af843746">ba8bb15e</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2584">GH#2584</a>) Optimization: Make main.js file generation language-aware</li>
<li>[2018-07-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/5a80a12c58e3864cead851c43ad10d0048b7acd6">5a80a12c</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2549">GH#2549</a>) Quiz: Add tpl exercise_result_alert_body</li>
<li>[2018-07-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/de60f7ed3b16574896702a9df279ee6c4bd9022f">de60f7ed</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2584">GH#2584</a>) Global: Improve delete popup</li>
<li>[2018-07-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/0af3ddabe6e0cbd1699b64aa1f5ca6afde2dc44c">0af3ddab</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2584">GH#2584</a>) Optimization: Move js code into a file web/build/main.js #2584</li>
<li>[2018-07-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/d7a4bceee6e2e1965061536ef95ae81c69ba0a6c">d7a4bcee</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2599">GH#2599</a>) Internal: Remove unused UserRepository file #2599, update references - Copy functions from old UserRepository to the new one. - Use shortcut UserManager::getRepository() instead of all path</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/34aa5348b5be075650ef7b76da0bd73486252c15">34aa5348</a>) Display: Fix "delete" icon size</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/7e884009f18514c85425446417aa2762bde6d0db">7e884009</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2598">GH#2598</a>) Display: Add "anonymous" icon</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/7906aaf452623b192be814a641cce8ecaf2b58e7">7906aaf4</a>) Global: Avoid notice in course catalogue when security token is not defined</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/b153845228990f97c327906c1b3abd83c7e68b9f">b1538452</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2598">GH#2598</a>) Privacy: Add user information anonymization feature</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/20e3c49c78fa525ff6a98329a991ff6caabccd7d">20e3c49c</a>) Internal: Add constants for c_userinfo_def and c_userinfo_content tables</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/c18a4fddd6e062e7bceff6f5f312fbb4126cf2f2">c18a4fdd</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2515">GH#2515</a>) Global: Replace "select all checkbox" with move all right/left buttons</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/a15168c4669ea0fc7d4d5442eea0b645e25a1a2f">a15168c4</a> - <a href="https://task.beeznest.com/issues/14644">BT#14644</a>) Learnpath: Fix LP export to scorm</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/062d56083436f90bf22c216fe0dce03bcbbea552">062d5608</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Add classroom activity column in main/admin/usergroup_users.php BT#14608</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/fa309d9f61c4e3ab5aa82ffa53d182f881c6afd2">fa309d9f</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Fixing mixed calculation between variables</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/96f4057edc07eac0879278d8c76ef7bdc8971c45">96f4057e</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Learning Calendar WIP -</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/f645280e307949c971e6d348ba6b0e881352812d">f645280e</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Learning Calendar WIP -</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/89ac2f824f0f10e692fa115996309a0cd86d0945">89ac2f82</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Learning calendar plugin changed dir name to "learning_calendar" BT#14608</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/cf347d9d33f17a0f212accfef0cf630ca2f9f62e">cf347d9d</a> - <a href="https://task.beeznest.com/issues/14678">BT#14678</a>) Learnpath: Fix query, use c_lp_item.iid instead of c_lp_item.id</li>
<li>[2018-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/75741aafc056401108cc92e7e7a757a8ac25d878">75741aaf</a> - <a href="https://task.beeznest.com/issues/14678">BT#14678</a>) Learnpath: Fix query, use c_lp_item.iid instead of c_lp_item.id</li>
<li>[2018-07-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/af90fc346f33cc28fd55ffdfb07c43378bf6c44f">af90fc34</a> - <a href="https://task.beeznest.com/issues/14593">BT#14593</a>) Survey: Fix url param in surveys</li>
<li>[2018-07-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/67e45cd9eea9da877bb55d624df43e03c922cce8">67e45cd9</a> - <a href="https://task.beeznest.com/issues/14593">BT#14593</a>) Survey: Show finish survey button in last page of questions</li>
<li>[2018-07-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/67d3eb3a759b38581865479469808f1f476353e9">67d3eb3a</a> - <a href="https://task.beeznest.com/issues/14593">BT#14593</a>) Survey: Fix paged questions in surveys</li>
<li>[2018-07-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/a9bee37266b8ec676e6bf583c3d54e2e68b647d7">a9bee372</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Add learning_calendar.author_id</li>
<li>[2018-07-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/7e68f46d6cf686526ca9ad2de525492323b86b48">7e68f46d</a>) Plugin: Learning calendar: Add learning_calendar.author_id</li>
<li>[2018-07-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/834622f8f6943803a13578504ef732ececa9a3f9">834622f8</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: LpCalendar WIP -</li>
<li>[2018-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/75ea810a403ace0f505077c29b4068031b80090e">75ea810a</a>) Quiz: Reduced 3 methods into one, simplify and improve presentation of degree of certainty questions results</li>
<li>[2018-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/148a4217b15db16f0bee709c9af2c7869af4369d">148a4217</a>) Quiz: Add check to avoid errors when no degree of certainty question is in the quiz</li>
<li>[2018-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/42d75cb3905e646f8de194a7c1d94f291ced2e97">42d75cb3</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2593">GH#2593</a>) Quiz: Adding greyscale question icons</li>
<li>[2018-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/3bf525eea3038428f7f92f07b36d3495c7c1e136">3bf525ee</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2593">GH#2593</a>) Quiz: Fix class</li>
<li>[2018-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/495b6ea3e0d7b5212df1d6990cbb5b133af50b79">495b6ea3</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2593">GH#2593</a>) Display: Add icon mccert</li>
<li>[2018-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/305ae64f510b32918d23c36866df5cf314d5a28e">305ae64f</a>) Internal: Use MessageManager::send_message_simple to send email instead of api_mail_html</li>
<li>[2018-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/a853f7dddb8fb5f60025500ad85db3dbce6dc4b7">a853f7dd</a>) Internal: Apply patch from analyses/8906</li>
<li>[2018-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/0e2a01c30c79b759c1dd22c58b270113296d5164">0e2a01c3</a>) Quiz: Correct bot check</li>
<li>[2018-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/d44da64f0ed1b8593c7533819df2f02cafc3383e">d44da64f</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: LpCalendarPlugin (WIP) fix php notices, use plugin lang vars BT#14608</li>
<li>[2018-07-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/e11513db5a8795519bb131cc26bf71c2f755c96b">e11513db</a>) Quiz: Remove undefined JS var myChoiceDegreeCertainty temporarily</li>
<li>[2018-07-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/3a647d3aea260ff839e2b89fca95823955df9bc3">3a647d3a</a>) Learnpath: Increase LP item length in build mode menu</li>
<li>[2018-07-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/d4252007682186e7b1f1fd87dcf65e9521bf92f1">d4252007</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: WIP Lp calendar - Fix php warning, errors, format code, fix query. BT#14608</li>
<li>[2018-07-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/f4f92c9d8a9c1c3cb512682941773b50b37793d5">f4f92c9d</a> - <a href="https://task.beeznest.com/issues/14450">BT#14450</a>) Tracking: Fix "Accesses by user overview" report page</li>
<li>[2018-07-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/590410f435c5ff7338aa1ba5dec5a04ebee8ed46">590410f4</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Add stats columns in class user list</li>
<li>[2018-07-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/d7b19f1c0e425b267ec31712559dde45bdbab241">d7b19f1c</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Add LpCalendar stats info</li>
<li>[2018-07-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/0c07c1e92e66ad1858e712703409181af5e8a711">0c07c1e9</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Add personal events option in plugins</li>
<li>[2018-07-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/44208472ce74f09f86d4ee591f3b86c69e09f491">44208472</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Plugin: Learning calendar: Add new plugin LPCalendar (WIP)</li>
<li>[2018-07-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/652a26031dcbcbd9e0ec0adcaab7e77a8f64b05f">652a2603</a> - <a href="https://task.beeznest.com/issues/14593">BT#14593</a>) Maintenance: Fix restore course by user foreing keys</li>
<li>[2018-07-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/a53955940e5480b9d9f88cb09e0ec86cdde69bfd">a5395594</a> - <a href="https://task.beeznest.com/issues/14625">BT#14625</a>) Session: Session course list, order only by position as in resume_session.php</li>
<li>[2018-07-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/2104b21834cf78bf92a36baa92d8f44e3317436a">2104b218</a> - <a href="https://task.beeznest.com/issues/14625">BT#14625</a>) Session: Session course list, order only by position as in resume_session.php</li>
<li>[2018-07-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/7583bca0d49ad0d4e1064a210de7f0ffd90462e7">7583bca0</a> - <a href="https://task.beeznest.com/issues/14642">BT#14642</a>) Tracking: Fix teacher time report by teacher</li>
<li>[2018-07-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/cba0999d2c0881fd3272f857ac8e60b2feb9b4ef">cba0999d</a>) Security: Remove duplicate header name from XSS protection default (disabled) params in configuration.dist.php</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/cfa814699fb13c02d4e96bbe37e5d7d2863e3974">cfa81469</a>) Plugin: LTI: Fixed form.php to send to the LTI Provider using POST arguments instead of querystring as specified into the IMS/LTI spec</li>
<li>[2018-07-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/ba0e253e24eb526e2eadc263b66f1e951745c19e">ba0e253e</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2583">GH#2583</a>) Course description: Add JS confirmation popup on course description delete icon</li>
<li>[2018-07-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/b03d8eab04e33f55350eb3c30ce6676124aced1a">b03d8eab</a> - <a href="https://task.beeznest.com/issues/14631">BT#14631</a>) Portfolio: Fix constraints for portfolio</li>
<li>[2018-07-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/10de63aa8bd52eb01f22722f31697eeaeb9cea39">10de63aa</a> - <a href="https://task.beeznest.com/issues/14506">BT#14506</a>) Install: Fix possible migration issue with personal_agenda indexes</li>
<li>[2018-07-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/97ca4064f92211c16c0061af02940111113d99a7">97ca4064</a> - <a href="https://task.beeznest.com/issues/14589">BT#14589</a>) Global: Keep CKEditor toolbar config when switching toolbar</li>
<li>[2018-07-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/e23a11644b7f453dfbf5d703c459cb5b0f3c0cc3">e23a1164</a> - <a href="https://task.beeznest.com/issues/14625">BT#14625</a>) Global: Fix course list order inside a session in userportal.php</li>
<li>[2018-07-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/96de1ea1a32b521b463ca7c31d66411dc265cbb4">96de1ea1</a>) Internal: Remove qfamsHandler.js lib replaced by multiselect.js</li>
<li>[2018-07-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/f76775a95d3ca011463eb727c845f8e41381902d">f76775a9</a>) Internal: Update UserManager variable names, return values and PHPDoc to match coding conventions</li>
<li>[2018-07-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/14600e66d1d58d3e4bbf77d790736411a771583f">14600e66</a>) Internal: Remove UserManager::delete_inactive_student(). Misnamed (doesn't delete) and unused method Minor: improve PHPDoc</li>
<li>[2018-07-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/9f5620bb0b8358d2ad8771cdf78006fafb371305">9f5620bb</a> - <a href="https://task.beeznest.com/issues/14596">BT#14596</a>) Internal: Fix touchstart event</li>
<li>[2018-07-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/977184b87a491fd83b831d65830b4d47d0002dd3">977184b8</a> - <a href="https://task.beeznest.com/issues/14589">BT#14589</a>) Global: Keep ckeditor fullpage value when switching toolbar</li>
<li>[2018-07-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/77f1a9415e4944424593595eb643e15cd44dbee2">77f1a941</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2515">GH#2515</a>) Internal: Add js lib "multiselect-two-sides"</li>
<li>[2018-07-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/1fe839bef7f2ec5417cd921ad0c0c3658ad954ad">1fe839be</a> - <a href="https://task.beeznest.com/issues/14505">BT#14505</a>) Gradebook: Take only current subscribed users in average/best stats</li>
<li>[2018-07-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/dbfd99b0c144beb77aca812829a3089474fe7aaa">dbfd99b0</a> - <a href="https://task.beeznest.com/issues/13308">BT#13308</a>) Global: Fix mathajax elements when previewing a question</li>
<li>[2018-07-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/1671d725500e9cf76fb127e57ed9ef9f160f0b16">1671d725</a> - <a href="https://task.beeznest.com/issues/13308">BT#13308</a>) Global: Remove change $_POST variables see BT# 13308 Chars "\" are deleted so, latex code don't work</li>
<li>[2018-07-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/ba32004c0b890a638b0add91046a396f38dc943d">ba32004c</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2513">GH#2513</a>) Chat: Fix send message in course chat for groups</li>
<li>[2018-07-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/fae300d042c659096df6955712fabc3f0540cef3">fae300d0</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2513">GH#2513</a>) Chat: Fix user list for course chat in group</li>
<li>[2018-07-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/44761c433519e9a8ce5b6c88c4899a9d6b91dfeb">44761c43</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2514">GH#2514</a>) Chat: Fix user status in chat</li>
<li>[2018-07-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/0bf462dc3b49dc754f2952e7a0021d64c41e003a">0bf462dc</a>) Global: Fix call of api_get_setting('catalog_show_courses_sessions')</li>
<li>[2018-07-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/07ca7f8939509362346332c5bbb77c105c740260">07ca7f89</a> - <a href="https://task.beeznest.com/issues/13187">BT#13187</a>) Quiz: Fix round scores in results screen</li>
<li>[2018-07-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/85b509b86a46f255de1405a1e305a792429be458">85b509b8</a> - <a href="https://task.beeznest.com/issues/13187">BT#13187</a>) Quiz: Fix round values in results screen</li>
<li>[2018-07-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/286c4e9cca480bd7261ac3fdae8935fe688ce892">286c4e9c</a> - <a href="https://task.beeznest.com/issues/14608">BT#14608</a>) Display: Add agenda-na icon</li>
<li>[2018-07-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/175847560a7d06761d44a83d33475f179ae04fda">17584756</a> - <a href="https://task.beeznest.com/issues/14388">BT#14388</a>) Global: Add jquery.ui.touch-punch.min.js lib to fix issue of non-responsive elements on mobile devices</li>
<li>[2018-07-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/36430c6bf7dcd58b71c9b63bcca3e7fcc5960577">36430c6b</a> - <a href="https://task.beeznest.com/issues/13187">BT#13187</a>) Quiz: Fix show "round values" in report</li>
<li>[2018-07-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/0bdb3ca91360553a60ac56e032ac5d471c07498d">0bdb3ca9</a> - <a href="https://task.beeznest.com/issues/13187">BT#13187</a>) Quiz: Fix round values</li>
<li>[2018-07-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/9cf547490d53fb6bc3faa931fae4a0ffd50c43ac">9cf54749</a> - <a href="https://task.beeznest.com/issues/14535">BT#14535</a>) Message: Change pagination number use list 10, 20 ,50, 100 ,500, 1000</li>
<li>[2018-07-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/163b788b0ab2e652549539bcf01dd4b0c3ca9c79">163b788b</a> - <a href="https://task.beeznest.com/issues/14572">BT#14572</a>) Plugin: Buy courses: Fix for multiurl using the currentUrlId and not always 1</li>
<li>[2018-06-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/5dbc14cca38949a761378ec6f592b34b9424af6a">5dbc14cc</a> - <a href="https://task.beeznest.com/issues/14571">BT#14571</a>) Global: classes block: Fixing query to avoid repetition of usergroup_id refs BT#14571</li>
<li>[2018-06-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/83840528ca23a03255f89d6f044618441e624b61">83840528</a> - <a href="https://task.beeznest.com/issues/14560">BT#14560</a>) Portfolio: Fix lang var + set null on delete</li>
<li>[2018-06-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/daea8c6eb7df5733cb74af8faaee3d9fe1932b1c">daea8c6e</a> - <a href="https://task.beeznest.com/issues/14468">BT#14468</a>) Survey: Fix get mandatory survey by course</li>
<li>[2018-06-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/d78f948885a8cbc79a79c0755b4adcd1cbf6e3bf">d78f9488</a> - <a href="https://task.beeznest.com/issues/14525">BT#14525</a>) Link: Fix icon link external</li>
<li>[2018-06-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/ae6bdd617db886481b9e62954b8382d5a33510b5">ae6bdd61</a> - <a href="https://task.beeznest.com/issues/14497">BT#14497</a>) Display: Corrections in courses grid</li>
<li>[2018-06-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/35300bf6e95b4096ea5c9b2557f6a0c4137d1cc3">35300bf6</a>) Plugin: Buy course: Fixing Paypal Payout button not appearing in main sales report actions</li>
<li>[2018-06-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/370129da5a2d88bb00d86fb5e17bcc1dfce6ff4b">370129da</a>) Plugin: Buy course: Adding french translations and missing variables</li>
<li>[2018-06-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/6a21f38c32b5d90836e421a5b8c6b5289ec26aba">6a21f38c</a> - <a href="https://task.beeznest.com/issues/14552">BT#14552</a>) Plugin: Allow add hooks when creating course</li>
<li>[2018-06-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/97c6113de12219c3d9ffe65a2dc9cf224dee42ca">97c6113d</a> - <a href="https://task.beeznest.com/issues/14497">BT#14497</a>) Internal: Fix display_coursecode_in_courselist</li>
<li>[2018-06-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/8af928eab58ffbcfb1cd24597f4dfbe5781d1da8">8af928ea</a>) Plugin: Custom certificates: Add option to hide the content rear of certificates</li>
<li>[2018-06-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/99041a75d589a5076c63617b98f09bbae42bed9f">99041a75</a> - <a href="https://task.beeznest.com/issues/14512">BT#14512</a>) Internal: Add return value and PHPDoc to SessionManager::add_courses_to_session()</li>
<li>[2018-06-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/f85988579e9f74f6ce4fee69124898c463f752ea">f8598857</a> - <a href="https://task.beeznest.com/issues/14512">BT#14512</a>) Session: Fix issue not defining the right session visibility when adding a new course to an existing session</li>
<li>[2018-06-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/30095bd57248a5acb10d600341e8dfcd8cfaa994">30095bd5</a> - <a href="https://task.beeznest.com/issues/14468">BT#14468</a>) Survey: Fix off-by-59 seconds issue to validate survey availability</li>
<li>[2018-06-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/bdfb1ca9200ffcd8816027ce449b3bea9f53fba9">bdfb1ca9</a> - <a href="https://task.beeznest.com/issues/14345">BT#14345</a>) Plugin: Redirection: Fix show include files when Redirection plugin is enabled</li>
<li>[2018-06-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/760c6c6b4cfa2be4282acf00fe18b44b704147ce">760c6c6b</a> - <a href="https://task.beeznest.com/issues/14345">BT#14345</a>) Session: Fix link to edit session when grid view is enabled</li>
<li>[2018-06-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/abe5fd81f2957ceb718a3fc5602d72847aba2c1e">abe5fd81</a> - <a href="https://task.beeznest.com/issues/14513">BT#14513</a>) Announcements: (global) Clear security token after using it in announcements. Prevents sending twice</li>
<li>[2018-06-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/3691c6f9b516803c6a75c1491e1cead587248862">3691c6f9</a> - <a href="https://task.beeznest.com/issues/14435">BT#14435</a>) Learnpath: Display: Fix SCORM/LP CSS</li>
<li>[2018-06-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/0f25790214670c5f23c5a9997f8e316dc4ba9050">0f257902</a> - <a href="https://task.beeznest.com/issues/14457">BT#14457</a>) Global: Redirect index to url for logged in users</li>
<li>[2018-06-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/2cba428ab8b86043105781fe236cfd9afbe0c5b6">2cba428a</a> - <a href="https://task.beeznest.com/issues/14497">BT#14497</a>) Session: Grid session list closed by default</li>
<li>[2018-06-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/b0081b68467d1a3454dfb48e1d3012721ac103a9">b0081b68</a> - <a href="https://task.beeznest.com/issues/13187">BT#13187</a>) Quiz: Add setting "exercise_category_round_score_in_export" - Round values using the ceil function in the exercise category reports</li>
<li>[2018-06-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/01359302f59dc7ca664456deb14989331a691434">01359302</a> - <a href="https://task.beeznest.com/issues/14497">BT#14497</a>) Session: Fix grid courses session collapsable link</li>
<li>[2018-06-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/b909a0cff20cd69adea8f39f37e60d42ec0f2fad">b909a0cf</a> - <a href="https://task.beeznest.com/issues/14371">BT#14371</a>) Global: Change textarea with div to allow hrefs</li>
<li>[2018-06-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/6e68e851201c348607aeffd3513e78b219f5ee3f">6e68e851</a>) Global: Adding js mediaelementplayer for videos within iframes</li>
<li>[2018-06-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/838a4d2912742427ae8fbb2dc514dc88efb1d294">838a4d29</a> - <a href="https://task.beeznest.com/issues/14495">BT#14495</a>) Quiz: Fix exercise count (fix query including session id is null)</li>
<li>[2018-06-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/059d96f068aaa2621071b97ef29bc12446daee2f">059d96f0</a> - <a href="https://task.beeznest.com/issues/14425">BT#14425</a>) Maintenance: Fix export/import orphan questions in backup</li>
<li>[2018-06-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/bb00c108f28e8d053b914e79d0734c907add365f">bb00c108</a> - <a href="https://task.beeznest.com/issues/14425">BT#14425</a>) Maintenance: Improve backup export/import speed</li>
<li>[2018-06-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/f94d73aa05df00acd3bfdc90869392e374ebb4c7">f94d73aa</a> - <a href="https://task.beeznest.com/issues/14468">BT#14468</a>) Survey: Fix edit survey dates when allow_survey_availability_datetime is enabled</li>
<li>[2018-06-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/9b4ff0c1758270ca1ffd77ab232da10ee10d3979">9b4ff0c1</a> - <a href="https://task.beeznest.com/issues/14425">BT#14425</a>) Maintenance: Improve course backup memory consumption</li>
<li>[2018-06-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/970718c98f3bf25856770312d87abea533377c5a">970718c9</a>) Global: Remove deprecated function return_teacher_link() for teacher block in My courses page</li>
<li>[2018-06-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/fef9f5bc9019fd87f06c993eca5bf68b793fb1ed">fef9f5bc</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2563">GH#2563</a>) Global: Update extra fields tags and video url in course settings</li>
<li>[2018-06-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/daec6b98304ca35febedd6b3eb702b9e73b0ed85">daec6b98</a>) Global: Add api not allowed in course's about page</li>
<li>[2018-06-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/5cf8168ac5c88ebf344503dd2c8ef8bcb0fe7421">5cf8168a</a>) Display: Add btn suscriber in course's about page</li>
<li>[2018-06-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/ff1c3f5609629c14b5889bce588b1e97ad1b03e6">ff1c3f56</a>) Display: Add integration with Buy course plugin in course's about page</li>
<li>[2018-06-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/1ee57376636073f288465a37facc52ade170628b">1ee57376</a> - <a href="https://task.beeznest.com/issues/14425">BT#14425</a>) Maintenance: Use gzdeflate/gzinflate to compress the course backup</li>
<li>[2018-06-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/0a0da902a9e6c0f76392ae78f7c974c4abe19ce5">0a0da902</a> - <a href="https://task.beeznest.com/issues/14459">BT#14459</a>) Maintenance: Ignore deleted files when creating course backups</li>
<li>[2018-06-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/44d167cce7025a152c3d18c7a488af4953f06fc6">44d167cc</a> - <a href="https://task.beeznest.com/issues/14459">BT#14459</a>) Maintenance: Ignore deleted files when creating course backups</li>
<li>[2018-06-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/bdd8c78886554f8cd8052fe045a87f847cf1b3c0">bdd8c788</a> - <a href="https://task.beeznest.com/issues/14425">BT#14425</a>) Internal: Factorize memory/execution time limits into a function</li>
<li>[2018-06-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/fe1b1382a833544b202fde222323a653386a075c">fe1b1382</a> - <a href="https://task.beeznest.com/issues/14465">BT#14465</a>) Internal: Replace strip_tags with Security::remove_XSS</li>
<li>[2018-06-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/cce29556be567cd8af8c11a0c1ae74954c578085">cce29556</a> - <a href="https://task.beeznest.com/issues/14460">BT#14460</a>) Session: Get isStudentView from session</li>
<li>[2018-06-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/f79c1416eedd47ac89d323c2f00202c7e3289414">f79c1416</a> - <a href="https://task.beeznest.com/issues/14456">BT#14456</a>) Global: Send alert to all student bosses when sending a msg to a student</li>
<li>[2018-06-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/370f4b481db7fed8db3965f8611bec729a367a8b">370f4b48</a> - <a href="https://task.beeznest.com/issues/14464">BT#14464</a>) Tracking: Show only students in session course report</li>
<li>[2018-06-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/4a45e4b1ee1d8c2cf159218b0e6e213ce1fd4d66">4a45e4b1</a> - <a href="https://task.beeznest.com/issues/14464">BT#14464</a>) Session: Use SessionManager::parseSessionDates to show session dates</li>
<li>[2018-06-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/294c3b6e3d4d4cba0dbdf6fcaeef35aa113598d3">294c3b6e</a> - <a href="https://task.beeznest.com/issues/14464">BT#14464</a>) Tracking: Show session dates in local time</li>
<li>[2018-06-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/8c9a2de6ceb70d0449c1523a82163137b9d3b208">8c9a2de6</a> - <a href="https://task.beeznest.com/issues/14464">BT#14464</a>) Tracking: Fix session count</li>
<li>[2018-06-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/1004ed06daa7e7f9f52590996fa11758fdfb434f">1004ed06</a> - <a href="https://task.beeznest.com/issues/14445">BT#14445</a>) Document: Show document quota for all users</li>
<li>[2018-06-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/98797de102bf51af6a86df58e950b18e8d7ed3e7">98797de1</a> - <a href="https://task.beeznest.com/issues/14459">BT#14459</a>) Learnpath: Fix document edition inside a LP, check id and iid</li>
<li>[2018-06-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/fe4dae7c401c45d821925e849759a1797b726c86">fe4dae7c</a> - <a href="https://task.beeznest.com/issues/14461">BT#14461</a>) Tracking: Move check on permission to access tracking pages into Tracking::isAllowToTrack()</li>
<li>[2018-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/0d4e57d176675c56e01415aead90cf33aba617c1">0d4e57d1</a>) Display: Fix css optimize base.css chat.css editor.css print.css scorm.css</li>
<li>[2018-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/19046660ef9ce3aa38f4f26c487eaf9fa43ac797">19046660</a>) Display: Fix base.css optimize</li>
<li>[2018-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/c43e06b8ead718aa13bbf51c88f19cfd869602a4">c43e06b8</a>) Internal: Replace "objeto" instances by "myObject" in several JS codes. Does not seem to be used in any part.</li>
<li>[2018-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/d9409e2b8bde7a05298b6a5ee6acdefd4c24126c">d9409e2b</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2523">GH#2523</a>) Internal: Set default value for student_delete_own_publication course setting, if not defined</li>
<li>[2018-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/a49f36c69daed79a79f27261081b4f4b82c25f6e">a49f36c6</a>) Template: Add course and session possible contexts to add OpenGraph meta tags in Template::set_header_parameters()</li>
<li>[2018-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/045262a02e715cea1ac556c96532f8618838eb96">045262a0</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2546">GH#2546</a>) Global: Fix the position of the tool introduction section in all tools (previously was appearing above or below action bar)</li>
<li>[2018-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/d787bd5b54e1fedb0df383fa504a1f42f7607c3e">d787bd5b</a> - <a href="https://task.beeznest.com/issues/14455">BT#14455</a>) Certificate: Change custom certificate values, show courses and total lp time</li>
<li>[2018-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/6da2c499b20cdbbcf80af3316261c033d816b11b">6da2c499</a> - <a href="https://task.beeznest.com/issues/14446">BT#14446</a>) Learnpath: When adding new chapter select last position</li>
<li>[2018-06-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/14d5975d6f9504a04153f495f8059487fae90551">14d5975d</a> - <a href="https://task.beeznest.com/issues/14334">BT#14334</a>) Learnpath: Replace flash player in edition of lp item</li>
<li>[2018-06-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/2c9701e4762701ad60bc47508737b3ceabcebf1d">2c9701e4</a> - <a href="https://task.beeznest.com/issues/14409">BT#14409</a>) Global: Fix delete message when save_titles_as_html is enabled</li>
<li>[2018-06-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/dbc0ff4c9db4d2ebf0e4a2e1cda2fc79c17831d8">dbc0ff4c</a> - <a href="https://task.beeznest.com/issues/14409">BT#14409</a>) Global: Fix exercise title when save_titles_as_html is enabled</li>
<li>[2018-06-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/84f01bc0a5d058f0e4150df748a174bca118a8b1">84f01bc0</a> - <a href="https://task.beeznest.com/issues/14449">BT#14449</a>) Learnpath: Fix "position" menu when editing an LP item</li>
<li>[2018-06-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/a8b8f36393fa2d023b2d079bd56fc421372c36e4">a8b8f363</a> - <a href="https://task.beeznest.com/issues/14447">BT#14447</a>) Learnpath: Allow edit parent and position of LP chapter during edition (previously chapters only allowed for title edition)</li>
<li>[2018-06-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/5d12e49912eab4000201dbde780d06bba94a9bda">5d12e499</a> - <a href="https://task.beeznest.com/issues/14343">BT#14343</a>) Global: Advanced settings for CKEditor image</li>
<li>[2018-06-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/33a2af09efd408a760e16df6843a50a7fbf942d9">33a2af09</a>) Global: Fix popular courses view</li>
<li>[2018-06-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/cb8e321862ae4a622bfabca8fb4b25904d10436e">cb8e3218</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2523">GH#2523</a>) Work: Move student publications settings in the course settings page</li>
<li>[2018-06-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/36f8b2d3d77e94fc4314ffed05e724b6ff46e757">36f8b2d3</a> - <a href="https://task.beeznest.com/issues/14437">BT#14437</a>) Admin: Learnpath: Add configuration setting hide_accessibility_label_on_lp_item to hide lp item prerequisite label</li>
<li>[2018-06-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/a5caa9259393a952ae004cc71cd0c74bc28e6122">a5caa925</a> - <a href="https://task.beeznest.com/issues/14434">BT#14434</a>) Global: Fix blocked page when allow registration is set to "approval"</li>
<li>[2018-06-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/6b829d662b9e6db3310a52fc0867754ad7daf54d">6b829d66</a>) Internal: Remove unused bootstrap files</li>
<li>[2018-06-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/3f9d5cfe716718cd0c465516baafd3f43b2f3757">3f9d5cfe</a>) Internal: Convert call to each() to foreach() as each() is now deprecated, in exercise's HotPotatoes management</li>
<li>[2018-06-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/825ac2ca251f1fd3fc5cc6d919f57be2d6237508">825ac2ca</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2521">GH#2521</a>) CI: Add #behat test to check hide_scorm_pdf_link - #2521</li>
<li>[2018-06-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/c9934cbf765f0404b676ad3510eefac60350a92d">c9934cbf</a>) Internal: Fix typo in function name iInviteAFriendToASocialGroup() in Behat features</li>
<li>[2018-06-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/353fbb08a9e0030471ce68d6b54c4f4bd5d5667f">353fbb08</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2489">GH#2489</a>) Install: Add IIS configuration example, as contributed by @ullfindsmit, to installation guide</li>
<li>[2018-06-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/e33790788ab17d7f043c5ab430669ad24d4c7316">e3379078</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2420">GH#2420</a>) Global: Fix issue preventing main menu to appear to anonymous users when a link was added in homepage edition without adding it to the menu</li>
<li>[2018-06-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/923972e2829c2b0850a4a1d9247d3e4971004d5d">923972e2</a>) Internal: Avoid notices by checking definition of POST elements in homepage link edition</li>
<li>[2018-06-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/aedd08128cd5ad7554f47bad5a2d10a1458e7c91">aedd0812</a> - <a href="https://task.beeznest.com/issues/14429">BT#14429</a>) Tracking: Don't register stats if user is logged in as another user</li>
<li>[2018-06-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/cd43f30d83ff1375c873295b2abd87f3ddbee1e7">cd43f30d</a> - <a href="https://task.beeznest.com/issues/14429">BT#14429</a>) Tracking: Don't register access if user is logged in as another user</li>
<li>[2018-06-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/c2788a8b8ba426b4fa17f1bdd5a749ed3cd86d62">c2788a8b</a> - <a href="https://task.beeznest.com/issues/14394">BT#14394</a>) Tracking: Lp reports - show all LP even if they are blocked by a prerequisite</li>
<li>[2018-06-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/dda242e42b206770a454c52705069b4a030f1355">dda242e4</a> - <a href="https://task.beeznest.com/issues/14391">BT#14391</a>) Portfolio: Allow save_titles_as_html in portfolio</li>
<li>[2018-06-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/6942706600f3819d99dfc87d026a50479adf0ced">69427066</a> - <a href="https://task.beeznest.com/issues/14391">BT#14391</a>) Global: Fix doc about save_titles_as_html</li>
<li>[2018-06-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/d2382d6aef9dcd7befcfb630465b665d9a0cd8cf">d2382d6a</a>) Display: Fix block-level tags are ignored inside tables</li>
<li>[2018-06-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/b1724eaeb4356a38d77935270de721dfd876dbf5">b1724eae</a>) Plugin: Custom certificates: Allow specific title tags</li>
<li>[2018-06-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/921a6ff5629faa5edf0417a90c32a24bb9a9c24e">921a6ff5</a> - <a href="https://task.beeznest.com/issues/13309">BT#13309</a>) Calendar: Fix creating a repeated event, use the same time no matter time saving</li>
<li>[2018-06-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/249b64cf20ad86feb13bce6d62fe128b454973db">249b64cf</a> - <a href="https://task.beeznest.com/issues/14334">BT#14334</a>) Learnpath: Fix move lp item</li>
<li>[2018-06-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/275ae9644ddcb8df6694e05cfab8e0e8d1fa4067">275ae964</a> - <a href="https://task.beeznest.com/issues/14143">BT#14143</a>) Global: PDF export: Don't fix images that are in app/upload</li>
<li>[2018-06-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/bb9770c4f7034ecda0bf50b49a9af11a9bd7ea40">bb9770c4</a> - <a href="https://task.beeznest.com/issues/14143">BT#14143</a>) Plugin: Custom certificates: Fix export pdf in custom certificate</li>
<li>[2018-06-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/90d29cac101a065b1db0846331dba419a55f16cd">90d29cac</a> - <a href="https://task.beeznest.com/issues/14143">BT#14143</a>) Plugin: Custom certificates: Fix wrong HTML in custom certificate plugin</li>
<li>[2018-06-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/3449aa17c995e0064ab5f7cc3ccc4243949399ff">3449aa17</a> - <a href="https://task.beeznest.com/issues/14143">BT#14143</a>) Plugin: Custom certificates: Fix image path when exporting to PDF</li>
<li>[2018-06-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/785ec3cb90fb9a5457b63a0561243858904ebb0e">785ec3cb</a> - <a href="https://task.beeznest.com/issues/14143">BT#14143</a>) Plugin: Custom certificates: Default tool icon in "custom certificate plugin" is invisible</li>
<li>[2018-06-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/2563d53868a9ff92b4c5c07c333ed58b305c5613">2563d538</a> - <a href="https://task.beeznest.com/issues/14392">BT#14392</a>) Learnpath last connection now depends in the status not in the total_time > 0</li>
<li>[2018-06-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/6050ef097a4bd024ab50f3cd78f132b84abec9f2">6050ef09</a> - <a href="https://task.beeznest.com/issues/14232">BT#14232</a>) Work: Changing language variable to put a better description for expiration date specific to works</li>
<li>[2018-06-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/c2becb19760815bc8972afd1289b2807a94e823b">c2becb19</a> - <a href="https://task.beeznest.com/issues/14371">BT#14371</a>) Extra Fields: Fix loading extra fields when extra conditions are set</li>
<li>[2018-06-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/0d7e49607caffc786fb71b478e927465ede97f00">0d7e4960</a>) Global: Fix empty form when "allow_registration" is set to "confirmation"</li>
<li>[2018-06-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/dec201b557446d549db40427b4c4ff46cc4015b6">dec201b5</a> - <a href="https://task.beeznest.com/issues/14371">BT#14371</a>) Internal: Fix setting definition "show_conditions_to_user"</li>
<li>[2018-05-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/9005fbb77f3aad2d2345e43527c84885247fbe55">9005fbb7</a>) Global: Fix "main/auth/inscription.php" checkbox UI</li>
<li>[2018-05-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/95433c05f369b8ceb64bacd5556265114ff2cad9">95433c05</a> - <a href="https://task.beeznest.com/issues/14393">BT#14393</a>) Learnpath: Fix learnpath progress value calculation</li>
<li>[2018-05-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/6f3a543f181f445d93aa509bb3052e9f13447991">6f3a543f</a> - <a href="https://task.beeznest.com/issues/13309">BT#13309</a>) Calendar: Fix repeated dates in agenda</li>
<li>[2018-05-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/bb760de133860851cb2a207258dd494133a7b139">bb760de1</a> - <a href="https://task.beeznest.com/issues/14381">BT#14381</a>) Global: Fix CKEditor styles when creating HTML documents or single blocks</li>
<li>[2018-05-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/d9d7d6d010a4eceab73591291b3ccfba4f3e52d7">d9d7d6d0</a> - <a href="https://task.beeznest.com/issues/14231">BT#14231</a>) Tracking: Add "total" row and csv/excel export per session in student progress</li>
<li>[2018-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/258ffd17ba0092f353369805519a789077ee3727">258ffd17</a> - <a href="https://task.beeznest.com/issues/14381">BT#14381</a>) Global: Fix align-center for images in CKEditor</li>
<li>[2018-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/39ab577b2e5b16ebc232b934ecf08520550df200">39ab577b</a> - <a href="https://task.beeznest.com/issues/14381">BT#14381</a>) Portfolio: Show portfolio dates in time ago string</li>
<li>[2018-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/15f99ccdd54dccee2df2fb35b84576c63f23de36">15f99ccd</a> - <a href="https://task.beeznest.com/issues/14381">BT#14381</a>) Template: Add twig filter to display date in time ago string</li>
<li>[2018-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/f7f782b51ef3a5f8f8b0eae945d7dd5282720a6f">f7f782b5</a> - <a href="https://task.beeznest.com/issues/14342">BT#14342</a>) Display: Fix grid with one row and multiples columns</li>
<li>[2018-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/7ab5981b636fd22755b4ad9e96b00d82a6b93a31">7ab5981b</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2537">GH#2537</a>) Document: Fix empty svg editor page</li>
<li>[2018-05-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/43b88f4c13cfcc814107a2a4c876c03497e7d63d">43b88f4c</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2524">GH#2524</a>) Quiz: Fix hotspot when using time limit</li>
<li>[2018-05-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/8ee45b89710610e161041ef818acef806062e76c">8ee45b89</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2521">GH#2521</a>) Learnpath: Fix button pdf in lp list view</li>
<li>[2018-05-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/904f6b72f28aec9c91a3c552f1681d5f552d57bc">904f6b72</a>) Plugin: BBB: Fix error when creating a table</li>
<li>[2018-05-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/c6ec467508954639aa1b7324848434f4721a7933">c6ec4675</a> - <a href="https://task.beeznest.com/issues/14363">BT#14363</a>) Announcement: Check if announcement was already sent by email and skip it</li>
<li>[2018-05-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/5d0255d27f249b628cdc0bb5f812f74677f785d8">5d0255d2</a>) Internal: Restore file app/cache/.gitkeep</li>
<li>[2018-05-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/51b8cfe13f38d808cfc2d9004ff3a6dbb587149a">51b8cfe1</a>) Internal: Add PHPDoc and change headers functions</li>
<li>[2018-05-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/d2854b4f05b27a328bc7db74903b84e31b3bb253">d2854b4f</a> - <a href="https://task.beeznest.com/issues/14219">BT#14219</a>) Quiz: Show exercise result link in e-mail even if exercise is in a LP</li>
<li>[2018-05-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/0b36b50629ca627fa73a8f057b70aed339379957">0b36b506</a> - <a href="https://task.beeznest.com/issues/14327">BT#14327</a>) Session: Fix creation session without users</li>
<li>[2018-05-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/76040c66b364caff6437cf418819695ed512bcc8">76040c66</a> - <a href="https://task.beeznest.com/issues/14365">BT#14365</a>) Announcement: Hide announcement "sent to" label</li>
<li>[2018-05-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/98fa407b9a6548505346a6f10882348c8114c0b9">98fa407b</a> - <a href="https://task.beeznest.com/issues/14059">BT#14059</a>) Global: Fix show custom pages when user is not logged</li>
<li>[2018-05-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/d1b04140ba93dd24f0da699602c4d667d7252470">d1b04140</a>) CI: Behat tests: Improve fill in blanks questions - Fill in blank question now is tested with more complicated text values.</li>
<li>[2018-05-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/ded87e0874a3995aceee76a6502a7b4c2b79cb58">ded87e08</a> - <a href="https://task.beeznest.com/issues/14030">BT#14030</a>) Quiz: Fix answer with apostrophe in fill in blanks</li>
<li>[2018-05-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/85d0d4feca74a83405e7ea5016a90d9b6f16db16">85d0d4fe</a> - <a href="https://task.beeznest.com/issues/14030">BT#14030</a>) Quiz: Fix "ALL" random question option</li>
<li>[2018-05-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/65a69b752ec7ad34886d03dfdd461cd3a660db88">65a69b75</a> - <a href="https://task.beeznest.com/issues/14352">BT#14352</a>) Admin: Fix SQL error in admin users list</li>
<li>[2018-05-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/2d4ebcb068736ea31630b3f58d854dcaa1d57e65">2d4ebcb0</a> - <a href="https://task.beeznest.com/issues/14294">BT#14294</a>) Quiz: Fix "are you sure you want to leave this page" in safari</li>
<li>[2018-05-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/42a621a5e6c9bc7b17b253dd6291643e527df7c9">42a621a5</a> - <a href="https://task.beeznest.com/issues/14310">BT#14310</a>) Learnpath: Fix blank page in exercise inside a LP with all question in one page</li>
<li>[2018-05-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/c3b4fc17456c35988a7f73d047eb2d3b07985be0">c3b4fc17</a>) Admin: Fix delete course when setting "allow_skill_rel_items" is enabled</li>
<li>[2018-05-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/594bd3061107da47bf87d62a450bd5e8f0c889c7">594bd306</a>) Global: Fix error in course home - query fixed</li>
<li>[2018-05-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/3c1271c2222bb96caf3044333aac8070d8742c1e">3c1271c2</a> - <a href="https://task.beeznest.com/issues/14332">BT#14332</a>) Message: Fix add attachment by email</li>
<li>[2018-05-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/4bf22d97ff4519ff0ff7e656294226822f6415bd">4bf22d97</a> - <a href="https://task.beeznest.com/issues/14332">BT#14332</a>) Message: When forwarding a message, also forward attachment files</li>
<li>[2018-05-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/71c5ee1d3afa55c82e30b6663cb231aa39f6ed98">71c5ee1d</a> - <a href="https://task.beeznest.com/issues/13926">BT#13926</a>) Session: Add function to detect if other sessions use the same session name</li>
<li>[2018-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/c448a1e5d18d0968225c11d42fc0b2ca65ae6047">c448a1e5</a> - <a href="https://task.beeznest.com/issues/14253">BT#14253</a>) Message: If message tool is disabled then don't show inbox link</li>
<li>[2018-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/2861630ff06e82aa53f5b3294eacb062c476b768">2861630f</a> - <a href="https://task.beeznest.com/issues/14251">BT#14251</a>) Quiz: Fix exercise auto-launch when using it inside a session</li>
<li>[2018-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/f6c2f4940c2a7f2fd09eeff45df6cd4890a4fcc9">f6c2f494</a> - <a href="https://task.beeznest.com/issues/14192">BT#14192</a>) Tracking: Change user session stats - Now it shows user subscribed in according the field session_rel_user.registered_at</li>
<li>[2018-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/17fc89e990caff093a81b6bdfb1ac79b70b6ecfd">17fc89e9</a> - <a href="https://task.beeznest.com/issues/14324">BT#14324</a>) Learnpath: Default LP visibility after import now depends on platform setting - Checks api_get_setting(tool_visible_by_default_at_creation)</li>
<li>[2018-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/b1a4aa30e0962ecba137da12b774189fc5c569f5">b1a4aa30</a> - <a href="https://task.beeznest.com/issues/14330">BT#14330</a>) Learnpath: Allow add student publications to a LP inside a session</li>
<li>[2018-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/c5b60453c2abb51adb1398096ff9522bdb69e5e8">c5b60453</a> - <a href="https://task.beeznest.com/issues/14111">BT#14111</a>) Group: When deleting a course, also delete content of the group directly without checking the group id in order to avoid FK problems</li>
<li>[2018-05-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/7b138d7531eaf4a5e0d1217a56f6140b4a3b9f42">7b138d75</a> - <a href="https://task.beeznest.com/issues/14323">BT#14323</a>) Session: Use general coach user id to send session scheduled announcements</li>
<li>[2018-05-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/f7e7b7dda12be8dffd8c40e4ce284426e00527d4">f7e7b7dd</a> - <a href="https://task.beeznest.com/issues/14323">BT#14323</a>) Session: Fix unsent message (set correct sender id) in scheduled announcements</li>
<li>[2018-05-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/eec420a6642cdf2cf02d30358cd1b7e04100c459">eec420a6</a> - <a href="https://task.beeznest.com/issues/14313">BT#14313</a>) Tracking: Fix firstname/lastname order in reporting pages</li>
<li>[2018-05-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/8e69387db19cc890c11a5d7ade0f728fdc61a139">8e69387d</a>) Global: Add pagination in who is online session</li>
<li>[2018-05-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/e9547a40c4b9305fc2db392771f08948865f556a">e9547a40</a>) Internal: Update return values types and update PHPDoc</li>
<li>[2018-05-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/d231d45c20ca6278b2a24cd4a23f4d938fc14a9e">d231d45c</a>) Global: Fix issue with browser name and version detection</li>
<li>[2018-05-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/252dff94099b04af865c241c80ee8663fe6e6a8b">252dff94</a> - <a href="https://task.beeznest.com/issues/14196">BT#14196</a>) Admin: Rename lock_course_in_session conf setting to session_courses_read_only_mode</li>
<li>[2018-05-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/507e2369b081644b823f056c560b70ac527ac534">507e2369</a> - <a href="https://task.beeznest.com/issues/14262">BT#14262</a>) Global: Refactor whoisonlinesession, check the current session</li>
<li>[2018-05-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/cf3373de42aebeae40a0b6891efa3b1d6de875dc">cf3373de</a> - <a href="https://task.beeznest.com/issues/14262">BT#14262</a>) Global: Show only users that are connected in current session id (in who is online)</li>
<li>[2018-05-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/43821d80fdff44c17eafeee1bd69e5ddca92977b">43821d80</a> - <a href="https://task.beeznest.com/issues/14248">BT#14248</a>) Learnpath: Fix call of api_is_coach() so coach can access blocked learnpaths</li>
<li>[2018-05-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/19adf981b0ffc0c3431a454e7fb6e4069731cdd1">19adf981</a> - <a href="https://task.beeznest.com/issues/14271">BT#14271</a>) Internal: Don't reset session_rel_user.registered_at of users</li>
<li>[2018-05-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/3320f1527a84e93ae1e409d1aa60d3c9c0b018b7">3320f152</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Learnpath: Fix LP item drag and drop</li>
<li>[2018-05-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/859eb4ae707d9bac0f5f2d3e918ddd5087897777">859eb4ae</a> - <a href="https://task.beeznest.com/issues/14283">BT#14283</a>) Tracking: Ignore session time limit for reports (previously, a finished session would not show results anymore in reporting pages)</li>
<li>[2018-05-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/8d1d2a98240058bdc46c87b0ce23f130654c9b61">8d1d2a98</a> - <a href="https://task.beeznest.com/issues/14300">BT#14300</a>) Internal: Learnpath: Use iid instead of id to save the LP item list</li>
<li>[2018-05-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/12903abb08858845f5bb3d47e2ed3971a4fbcd59">12903abb</a> - <a href="https://task.beeznest.com/issues/14293">BT#14293</a>) Gradebook: Fix double exercise in gradebook, check first iid then id</li>
<li>[2018-05-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/a6a085a8204339252b21ba4b4a66416ccea04d96">a6a085a8</a> - <a href="https://task.beeznest.com/issues/14293">BT#14293</a>) Install: Fix query: gradebook_link.id is already unique just make sure it's the right row</li>
<li>[2018-05-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/3fb261e4256581fea41a2aa8f40a400d327405ce">3fb261e4</a> - <a href="https://task.beeznest.com/issues/14284">BT#14284</a>) Learnpath: Avoid show Publish LP Category button when it has no visibility</li>
<li>[2018-05-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/8bc268e3437c74f8128c414d7d330ddc076e4473">8bc268e3</a> - <a href="https://task.beeznest.com/issues/14284">BT#14284</a>) Learnpath: Set default visibility to lp categories</li>
<li>[2018-05-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/1d5a89126a5518d1c156171876bdadd6b9514e11">1d5a8912</a> - <a href="https://task.beeznest.com/issues/14289">BT#14289</a>) Course description: Fix show empty course description</li>
<li>[2018-05-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/e6adfb3cf7ebcb0cae78cecd77340d4e8b93825e">e6adfb3c</a> - <a href="https://task.beeznest.com/issues/14289">BT#14289</a>) Course description: Fix description list from session course</li>
<li>[2018-05-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/ebbe95c2600cbd6c34a0980033e5baf6a648f61a">ebbe95c2</a> - <a href="https://task.beeznest.com/issues/14289">BT#14289</a>) Course description: Format code tpl course description</li>
<li>[2018-05-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/f65301747583489757aa9b2d345cd5f901d9499b">f6530174</a> - <a href="https://task.beeznest.com/issues/14289">BT#14289</a>) Course description: Fix tpl course description</li>
<li>[2018-05-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/999c77b6de2ff8dff17057cfb7bb92cafa1495a5">999c77b6</a> - <a href="https://task.beeznest.com/issues/14289">BT#14289</a>) Course description: Fix tpl description course</li>
<li>[2018-05-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/c585b3b8cd1b9e0b136920a0efe9dad355ab6863">c585b3b8</a> - <a href="https://task.beeznest.com/issues/14289">BT#14289</a>) Course description: Add tpl for course description</li>
<li>[2018-05-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/3ee4e663dad3c9bb305f60b72823624387234c09">3ee4e663</a> - <a href="https://task.beeznest.com/issues/14262">BT#14262</a>) Global: Fix added to who is online in session page</li>
<li>[2018-05-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/8e82345054f9b161757ca18aabde615fa980d54a">8e823450</a> - <a href="https://task.beeznest.com/issues/14248">BT#14248</a>) Learnpath: Allow session admins to access lp with prerequisites</li>
<li>[2018-05-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/62a3de4ac02d7aa12ac6adb88557cad06332b639">62a3de4a</a>) Internal: Fix access to "message tracking" in social network interactions.</li>
<li>[2018-05-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/687a5ad91e4d0edc551b1e9fb5ffe434ae9933c4">687a5ad9</a> - <a href="https://task.beeznest.com/issues/14248">BT#14248</a>) Learnpath: Allow session coach to see LP no matter the prerequisites. Settings must be on allow_teachers_to_access_blocked_lp_by_prerequisite.</li>
<li>[2018-05-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/0412ae3ad32cd2d8be1b745a03b268a9efaa0f60">0412ae3a</a> - <a href="https://task.beeznest.com/issues/14282">BT#14282</a>) Tracking: Check session visibility in reporting</li>
<li>[2018-04-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/4c0b6306a5332859a81560b65ced753fb5c86c3c">4c0b6306</a>) Plugin: Learning calendar: Add header and block pages (initial version without plugin)</li>
<li>[2018-04-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/c280667c140b89070d13b2d96bc6e76c0f3d51e3">c280667c</a> - <a href="https://task.beeznest.com/issues/14111">BT#14111</a>) Plugin: Learning calendar: Add extra code to be cleaned</li>
<li>[2018-04-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/5dbffe6ce45eb739de6570a0bccaa9812d6bd75b">5dbffe6c</a> - <a href="https://task.beeznest.com/issues/14252">BT#14252</a>) Session: My courses session order</li>
<li>[2018-04-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/0b13cf3962f0264a5f4b4edf95e56062c6f1dadc">0b13cf39</a> - <a href="https://task.beeznest.com/issues/12861">BT#12861</a>) Career: Fix diagram link</li>
<li>[2018-04-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/204172f4ba9fde984f69120cd187973523bec019">204172f4</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2511">GH#2511</a>) Admin: Document: Add configuration setting "video_features" to enable speed controller in video player // $_configuration['video_features'] = ['features' => ['speed']];</li>
<li>[2018-04-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/505d1b8ec46f81af9b4354aa542332ae75a0f9b9">505d1b8e</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2415">GH#2415</a>) Quiz: Improvement in view of fill-in-the-blanks questions</li>
<li>[2018-04-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/8c6e2d5f69c93abae49a4999539514cc81ebf808">8c6e2d5f</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2509">GH#2509</a>) Learnpath: Improve styles of selected items (white)</li>
<li>[2018-04-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/38fc9d6d654b6700204a21a89b2abb6068fe28d8">38fc9d6d</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Learnpath: Only show the "export to chamilo format" icon for learnpaths that have been created in Chamilo</li>
<li>[2018-04-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/0ad2057171bb3388ccfad8650b7763e990499d62">0ad20571</a>) Learnpath: Add "upload/learning_path/images" when exporting LP</li>
<li>[2018-04-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/737aa26bda8119c9fb32ee2db5a9f92cbd7cab6d">737aa26b</a>) Learnpath: Fix CSS class used for SCORM status changes</li>
<li>[2018-04-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/7fe66536c4b79ca0d6c40953831dd53a05e6a703">7fe66536</a> - <a href="https://task.beeznest.com/issues/14273">BT#14273</a>) Global: Use mediaelement.js to show videos instead of unmaintained jsplayer</li>
<li>[2018-04-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/e72f3a2c9a2879b4649ca5a1d0d7cf15ec41fb3b">e72f3a2c</a> - <a href="https://task.beeznest.com/issues/14273">BT#14273</a>) Global: Replace jplayer with mediaelement.js to preview mp3 files in document tool</li>
<li>[2018-04-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/ce472d7ba2e4ef641b2014ef07d147dc4a0ce17c">ce472d7b</a>) CI: Check if download is available for user - Fix behat test</li>
<li>[2018-04-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/866586749cd48aa910a2c25fc5cbd9aef69fc73a">86658674</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2508">GH#2508</a>) Quiz: Fix excel import + add behat test</li>
<li>[2018-04-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/beb51b9df19db7e7202a98ce3f5ee77c29a0329c">beb51b9d</a> - <a href="https://task.beeznest.com/issues/14271">BT#14271</a>) Session: Show user registration time in session page</li>
<li>[2018-04-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/5e86f35768676e9924b922305e1e3f0f8e072f49">5e86f357</a>) Learnpath: Undo "invisible" link in LP</li>
<li>[2018-04-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/29c41d55b8b4c4ed9ee5d8600069b01338877335">29c41d55</a> - <a href="https://task.beeznest.com/issues/14269">BT#14269</a>) Learnpath: Fix lp when loading a document, try with iid if not try with id</li>
<li>[2018-04-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/e1e90eb92a1d060ad98fc1338c4cda92df9fd083">e1e90eb9</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Display: Fix tools title style</li>
<li>[2018-04-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/a423d0714ea25d2654c49816a2f9b88a1397a0a3">a423d071</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Learnpath: Fix LP items list in collapsible panel</li>
<li>[2018-04-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/eac99f27fa9605f291dd6f7bee9e9f8c5c5516eb">eac99f27</a>) Display: Fix learnpath table of contents style</li>
<li>[2018-04-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/a167eb0528d12503a06aa7311567ccfefc94dfd2">a167eb05</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Learnpath: Don't add the scorm/ folder when exporting a LP</li>
<li>[2018-04-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/cd694bdd2972d37ed4c7d38f165a9332a23d18fb">cd694bdd</a>) Learnpath: Fix some invisible links due to CSS</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/ddbae4d3973e265fb3326a4aef23f309796ed881">ddbae4d3</a>) Learnpath: Fix LP list CSS</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/c26d3f00298bc6fe28f1d95198b102cdd429870d">c26d3f00</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Learnpath: Improvement in the list of lessons with category interface</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/e384c7b1fc1a83ba3bcd62d18ee4efa67236acb9">e384c7b1</a> - <a href="https://task.beeznest.com/issues/14212">BT#14212</a>) Quiz: Add username column to exercise report</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/aa6658fc127668c17c8c7211ece4c5e1e3a64a29">aa6658fc</a> - <a href="https://task.beeznest.com/issues/14259">BT#14259</a>) Document: Avoid showing link to a document if AJAX upload failed</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/8b3d27dc41a26fbdfa094a504cf31b1eb6ae8db2">8b3d27dc</a>) Learnpath: Fix author edit lp</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/57c78b6d3adcdede117cf75838e9e1b43e0a12a2">57c78b6d</a>) Template: Fix template for activity view and base.css</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/2e60f9bd3cfb6d0f1d4e404052c2a5b325aa3bfe">2e60f9bd</a> - <a href="https://task.beeznest.com/issues/14192">BT#14192</a>) Admin: Tracking: Add "course" column in user sessions report on admin page</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/bb5ddd815661bd4b0f51d40289e77fcea0de7e04">bb5ddd81</a> - <a href="https://task.beeznest.com/issues/14266">BT#14266</a>) Learnpath: LP delete item fix - Use iid instead of id</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/7be9028e613726785183b87881460a8a5c9b6de0">7be9028e</a> - <a href="https://task.beeznest.com/issues/14266">BT#14266</a>) Learnpath: Fix delete_item link</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/dd5a1002d071340fe254e9299bc995b8a1a36c73">dd5a1002</a> - <a href="https://task.beeznest.com/issues/14266">BT#14266</a>) Learnpath: Use iid to get item information</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/21b622ff01da0ca94e27a9b1e5451780ed6819f5">21b622ff</a> - <a href="https://task.beeznest.com/issues/14242">BT#14242</a>) Gradebook: Get correct exercise id</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/9c77f73aa94e8203b650eb010ba06f307b0b6a90">9c77f73a</a>) Tracking: Allow access to certificate_report.php for admins and student bosses</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/6fefb77c6ec087bc87ec495e5ab1931153b7158d">6fefb77c</a> - <a href="https://task.beeznest.com/issues/14267">BT#14267</a>) Tracking: Allow teachers to see additional reporting pages</li>
<li>[2018-04-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/8f8ce57fa204c6e28fc49ccc8432ce1328db44e4">8f8ce57f</a> - <a href="https://task.beeznest.com/issues/14192">BT#14192</a>) Admin: Tracking: Add "export to excel" button in user sessions report on admin page</li>
<li>[2018-04-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/4028c2d99d0d0b0c6329f5800e7abc34adf58175">4028c2d9</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Global: Add source button to CKEditor's minimal toolbar</li>
<li>[2018-04-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/79fb32c24d0046700640fc43909ae1eedd7f7f82">79fb32c2</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Global: Change from TrainingDescription toolbar to CKEditor's Basic toolbar in many tools</li>
<li>[2018-04-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/8eb12f7263e5f39585e2376772539be45571b604">8eb12f72</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2415">GH#2415</a>) Change color of label for correct answer, in question fill in blanks</li>
<li>[2018-04-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/6b28ec89efa2b71a167d754da6fb40f2c89c2d70">6b28ec89</a> - <a href="https://task.beeznest.com/issues/14260">BT#14260</a>) Learnpath: Use "proxy_settings" when using curl to translate blocked links</li>
<li>[2018-04-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/aee59a5b9d10f06297d7b9087c6ca426497ae976">aee59a5b</a> - <a href="https://task.beeznest.com/issues/14192">BT#14192</a>) Admin: Tracking: Allow access to portal-specific user-sessions stats only if multiple urls are enabled</li>
<li>[2018-04-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/2d0be54f553b714b8128c4abf4eb7e5e0f321ef6">2d0be54f</a>) Global: Add "last month"/"this month" options in date range field.</li>
<li>[2018-04-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/244afaf867ec86997820e44a4eae7d3889499494">244afaf8</a> - <a href="https://task.beeznest.com/issues/10769">BT#10769</a>) Admin: Group: Add configuration setting "group_category_document_access" to allow sharing options for the documents to be set from inside a course-group category. Requires DB change</li>
<li>[2018-04-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/bdd03a3fd892ae29ac3ac6922a6f5d692249a488">bdd03a3f</a> - <a href="https://task.beeznest.com/issues/13954">BT#13954</a>) Quiz: Fix exercise report access</li>
<li>[2018-04-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/7085dd82cfea71c316bb3e93e85d49c7a8a87811">7085dd82</a>) Quiz: Fix undefined $id in item_property update for hotpotatoes upload</li>
<li>[2018-04-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/d9ea0e02ff53ebed7e7aa1a06d0a1d32125cadd6">d9ea0e02</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2497">GH#2497</a>) Quiz: Fix exercise import when importing courses from 1.10</li>
<li>[2018-04-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/638f07257a0fb2088a99bf2e3920a82381ebe5c5">638f0725</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2498">GH#2498</a>) Display: Add mising file_flash and order-course icons</li>
<li>[2018-04-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/776d10a632c01a936e3e0d80f15efec8bb8f4b64">776d10a6</a>) Session: Fix issue using wrong field_id for session images</li>
<li>[2018-04-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/9511290bc8e02751844d6d82cf703e57f0f1eb9a">9511290b</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Session: Fix session about css</li>
<li>[2018-04-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/50e80f05acf1a0cc981a2d7205169dd003c95cbb">50e80f05</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Template: Improvements in session's about page</li>
<li>[2018-04-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/06eaf176194da450898570eb8e96dbf54d76de78">06eaf176</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Document: Fix web/editor.css path when exporting/importing documents</li>
<li>[2018-04-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/5a5921e8caad47062cae7bbb6f5f4495c5b6e206">5a5921e8</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Maintenance: Add hotspot pictures when creating a course backup</li>
<li>[2018-04-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/e8472ca4097df7dadaaeb2ba98f587951f47081e">e8472ca4</a> - <a href="https://task.beeznest.com/issues/12835">BT#12835</a>) Internal: Add js callbacks to webcam tool</li>
<li>[2018-04-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/923367232b4a26f38f7a5293790abc453e5170ec">92336723</a>) Internal: Fix "root_rel" when "url_append" is set. Error appears in ckeditor when adding images, path is wrong.</li>
<li>[2018-04-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/92059474b24ecb85654cd95f8821ae90f9d261ac">92059474</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Learnpath: Fix LP export to chamilo format</li>
<li>[2018-04-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/67e99523161d4894f6e343f7d1c160b8b4aec6f6">67e99523</a> - <a href="https://task.beeznest.com/issues/10769">BT#10769</a>) Group: Add extra document group access settings: DOCUMENT_MODE_SHARE: default behaviour; DOCUMENT_MODE_READ_ONLY: students can only see content cannot upload or edit; DOCUMENT_MODE_COLLABORATION: free for all, students can edit all content</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/4134443bbed57441e5afc169de306029c42caa12">4134443b</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Template: Fix social media info in session's about page</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/dd5a7f76c1744e1c1bcee73e07334b515c2b2a10">dd5a7f76</a> - <a href="https://task.beeznest.com/issues/12835">BT#12835</a>) Internal: Start webcam when document is already loaded</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/cad3e29e7d67a2b5a568b68009ae759db7218bff">cad3e29e</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Plugin: Buy courses: Template: Fix service information page</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/6d728f64d2cb1e8293282b1f9ae260050ce43c6c">6d728f64</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Plugin: Buy courses: Template: Fix service process</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/f283df55c9b3c8c1713c43114067027bb0f1781f">f283df55</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Plugin: Buy courses: Template: Improvement of service detail interface</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/121b21d8310eb77fc181aa343d204b1e2abd2c2a">121b21d8</a> - <a href="https://task.beeznest.com/issues/12835">BT#12835</a>) Internal: Move js code for webcam tool</li>
<li>[2017-12-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/355066261c39f6eddff6c077935d8837d8af3a6f">35506626</a> - <a href="https://task.beeznest.com/issues/12835">BT#12835</a>) Document: Create template for document/webcam</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/c57e4c0303663f537f5ea85ddb61783694795530">c57e4c03</a>) Plugin: Buy courses: Template: Fix style service_process.ptl</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/7a2b9466eebb68812d6e7384bd9779a825cb04a1">7a2b9466</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2415">GH#2415</a>) Quiz: Improvement in the feedback icons in fill in the blanks questions</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/76fbb2b8799510136c8502bb6e1e6e333f065819">76fbb2b8</a>) Global: Protect pages against unauthorized users</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/fdc6933cfa38d2f5bff4f063e9d2dcc2d572237b">fdc6933c</a>) Global: Protect pages against unauthorized users</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/070258d12272319c80b073cf0c10b1133099dacf">070258d1</a> - <a href="https://task.beeznest.com/issues/14250">BT#14250</a>) Quiz: Add "select all/unselect all" button when reviewing answers in an exercise</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/6ab526dcf1045cba88875da08ca41cb60ab2ae91">6ab526dc</a>) Global: Protect pages against unauthorized users.</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/568d5fd2d505cefe23a50859b8bc4fb241e81f50">568d5fd2</a>) Global: Fix PHP warnings, improve security access.</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/139468477381d5aeee4eb2168a63be2ab996ecd1">13946847</a>) Global: Protect pages against unauthorized users</li>
<li>[2018-04-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/cdaf3abee94ca5f78c45640fbbbfd0371192a7d2">cdaf3abe</a>) Global: Protect pages against unauthorised users</li>
<li>[2018-04-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/3e77f7d09d3900e82fd2ee835d67009d87b46de1">3e77f7d0</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Plugin: Buy courses: Separating service template from process.tpl to service_process.tpl</li>
<li>[2018-04-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/29d861af96a14d50a0a419c0b2697b80525358e6">29d861af</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Plugin: Buy courses: Separating service template from process.tpl to service_process.tpl</li>
<li>[2018-04-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/065fde43cebbf37a7cc3ee33bbfe30930b25607b">065fde43</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Plugin: Buy courses: Visual improvements in plugin buycourses</li>
<li>[2018-04-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/3106b56643995e8365ef57f1223f09cd4272089e">3106b566</a>) Global: Protect reporting page against users with no permissions.</li>
<li>[2018-04-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/1dd0d78af25f9a2615aebcabed7009ac6885a715">1dd0d78a</a> - <a href="https://task.beeznest.com/issues/11727">BT#11727</a>) Global: Block access to registration page when the generated form doesn't have a submit button</li>
<li>[2018-04-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/9d6fddcbadcc69bf44e36d0b295f6d6e0cf624c6">9d6fddcb</a> - <a href="https://task.beeznest.com/issues/11727">BT#11727</a>) Global: Block access to registration page when the generated form doesn't have a submit button</li>
<li>[2018-04-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/53d0e31537a0cc60e90b720b41dd4667ca596fe6">53d0e315</a> - <a href="https://task.beeznest.com/issues/14242">BT#14242</a>) Gradebook: Fix url with correct exercise id, fix is_valid_link() with correct info</li>
<li>[2018-04-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/3d7c168adc68cadf7e0a3dcbb234a5b125cbb3f1">3d7c168a</a>) Gradebook: Fix link with correct exercise id</li>
<li>[2018-04-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/d3645f4f8d5116777426a79d896853def813a525">d3645f4f</a>) Display: Fix check feedback question icon</li>
<li>[2018-04-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/1d574e466bce28bc966351efec2e60da2589b757">1d574e46</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2492">GH#2492</a>) Display: Learnpath: Improvement of lp_view and SCORM title placing</li>
<li>[2018-04-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/d36fb8fa20cf7d1d7c593436fb8fa08e47269393">d36fb8fa</a>) Display: Add learnpath view icons</li>
<li>[2018-04-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/8433e74ac90aa14d8ca1485749b13417d75e158b">8433e74a</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2352">GH#2352</a>) Quiz: Fix order "categories alphabetically with random questions"</li>
<li>[2018-04-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/9a498d576b56c33953890c86f6eb1e917af77ba4">9a498d57</a>) Internal: Remove e_notice when editing multiple-answer questions</li>
<li>[2018-04-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/1ce92aebba7ce4f52da36be16579060fb45e921c">1ce92aeb</a>) Session: Add permissions check when getting user coach info</li>
<li>[2018-04-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/8cd27f4173014d286571c4da66efa03e5da0f8e3">8cd27f41</a> - <a href="https://task.beeznest.com/issues/10882">BT#10882</a>) Learnpath: If lp/lp category visibility settings are off, show everything. Uses the settings: allow_add_users_to_lp_category allow_add_users_to_lp</li>
<li>[2018-04-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/f64787d7680b1984575e49e35aec269cb3118034">f64787d7</a> - <a href="https://task.beeznest.com/issues/14237">BT#14237</a>) Global: Set gidReq = 0 when group is not set</li>
<li>[2018-04-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/5749562994de782c948e126f1611457cf30264f9">57495629</a> - <a href="https://task.beeznest.com/issues/14229">BT#14229</a>) Admin: Tracking: Fix date in queries</li>
<li>[2018-04-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/091a0689f19d8a75032be129213d15889404023b">091a0689</a>) Install: Add web.config for IIS, as contributed by @ullfindsmit</li>
<li>[2018-04-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/3b99aa45c74d065246b572056ad8410f9e5132a3">3b99aa45</a>) Announcement: Fix get course info when getting announcements</li>
<li>[2018-04-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/64c1ab7041e973cdac53c7e58af32d1523eeaadd">64c1ab70</a>) Display: Format CSS code</li>
<li>[2018-04-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/a1eef028ccb5cb851c2b76a39789cc74d52eb8d2">a1eef028</a>) Display: View correction in user addition's password strength validation</li>
<li>[2018-04-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/fbb1fb065fd838191d7510c94714e4704e616505">fbb1fb06</a> - <a href="https://task.beeznest.com/issues/14212">BT#14212</a>) Admin: Add configuration setting "exercise_attempts_report_show_username"</li>
<li>[2018-04-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/eda5c56e55fc927e8571cbe23d983e23054c5021">eda5c56e</a>) Session: Set sessionIsPremium = null by default to avoid issues in about page</li>
<li>[2018-04-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/476cee51fc33316a71cb99881d0d81b0cd333352">476cee51</a> - <a href="https://task.beeznest.com/issues/14181">BT#14181</a>) Learnpath: Fix hide lp category for students</li>
<li>[2018-04-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/27bf0a26d0991882cdd7a575b2bf38480f8f174f">27bf0a26</a> - <a href="https://task.beeznest.com/issues/14235">BT#14235</a>) Admin: Fix delete course category from access_url relation table</li>
<li>[2018-04-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/d613095de76306709f9f4c14b2257825d065cab3">d613095d</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Maintenance: Learnpath: Fix "thread" import in chamilo format</li>
<li>[2018-04-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/38fc1a8348b85fe7fcd0b68be17490cd6ab9b7ec">38fc1a83</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Maintenance: Learnpath: Fix LP import in chamilo format</li>
<li>[2018-04-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/9a15a43564310703fc33d76ea54fb6ec007da69b">9a15a435</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Maintenance: Learnpath: Fix import of LP in "Chamilo format"</li>
<li>[2018-04-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/e68b60dd1d7f20cfd6a42e9fad9851067ad73d97">e68b60dd</a>) Display: Fix users online AJAX indicator in header</li>
<li>[2018-04-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/91888ab60459d13e478f0afbf8394f2189af9af9">91888ab6</a>) Security: SQL-escape the return value of api_get_real_ip() as HTTP headers are vulnerable to remote tampering</li>
<li>[2018-04-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/b358b8a0bf510baf95786303f332b5ab82c797e9">b358b8a0</a>) Internal: Remove useless quoting and rename some variables inside methods</li>
<li>[2018-04-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/a2bdf73df14ed4b65d878ede51614a6ca891016f">a2bdf73d</a>) Internal: Rename variables in Events::updateEventExercise() and avoid unecessary Database::escape_string() calls</li>
<li>[2018-04-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/0feba7c055d532b2d91226272d31d0f12f2f1f7e">0feba7c0</a>) Internal: Convert all intval() calls to (int) casting (micro-optimization)</li>
<li>[2018-04-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/0f758eca5bc3b3e03807288508615e2871d20428">0f758eca</a>) Internal: Convert all intval() calls to (int) casting (micro-optimization)</li>
<li>[2018-04-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/09c92fe68be568fd00a2b006e2a4b8ad2a99f1a6">09c92fe6</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Maintenance: Learnpath: Add import/export LP using CourseBuilder/CourseRestorer</li>
<li>[2018-04-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/8725ef0a94230b612ea7a0c1844522550dfd46d9">8725ef0a</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2488">GH#2488</a>) Admin: Tracking: Fix user stats count in Admin -> Statistics -> Login</li>
<li>[2018-04-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/f386d5ddc45b4fdf8f58b6e09706f1c4d670d133">f386d5dd</a> - <a href="https://task.beeznest.com/issues/14221">BT#14221</a>) Internal: Ignore editor.css in the introduction page</li>
<li>[2018-04-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/725a60245a6a90ca610028ed58470eb10360aecc">725a6024</a> - <a href="https://task.beeznest.com/issues/14221">BT#14221</a>) Internal: Fix "editor.css" inclusion when using style menu. "style" parameter removed, now editor.css is only included when the ckeditor is in fullpage and it's controlled by FormValidator.</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/2c5af06cb30fe03d780a621dc47f54a0e87be79e">2c5af06c</a>) Internal: Remove useless quoting in queries in legal.lib.php</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/f5a05ac0527bbda01edce922c6bf65a4f5d6307d">f5a05ac0</a>) Internal: Add validation on values used as params to other functions in events.lib.php</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/a170ad835e43acf47bc86ec913212e7bab5d6b3e">a170ad83</a>) Internal: Add validation on values used as params to other functions in course.lib.php</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/88381609830f11722bd0567493d5975db349dfd8">88381609</a>) Internal: Minor: Change phpdoc to allow array type as $event_value argument to addEvent()</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/1335887901ac5f50856b000fce05423ff0ccf67b">13358879</a>) Internal: Remove useless quoting in queries (and rename a few local variables) in course.lib.php</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/cfe84ae0aa95c805b2b7a341d5b70e23b8d58c14">cfe84ae0</a>) Internal: Ensure return value of api_get_current_access_url_id() is -1 on failure</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/a7d41d39399159ea47811b7f0f0221225258987b">a7d41d39</a>) Internal: Ensure numeric value $rowi is what is as expected in exercise.php</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/a1666c72c607922ed60c44adfb794b7d2176f9c8">a1666c72</a>) Internal: Exit stylesheet upload if name_stylesheet is not properly defined</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/e7b59a8f9858e344491de19cd4fcb69937614ad2">e7b59a8f</a>) Internal: Ensure return value is boolean in UrlManager::add_session_to_url()</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/ef0f19e0344713db5e65d0e7302cbb97decf719e">ef0f19e0</a>) Internal: Ensure return value in Database::result()</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/539fda37309e34130e1c46de75eeb469dd5743d2">539fda37</a>) Tracking: Give more precision to "Average number of courses per student assigned to me" in general tracking tab page</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/c1f3658203277ebb7716790160e79fffbb700e6d">c1f36582</a>) Install: Update spanish installation guide</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/0a618726bbeb622ad88368adee6750caa92145ea">0a618726</a> - <a href="https://task.beeznest.com/issues/14219">BT#14219</a>) Global: Reset course access if login comes from another page than login. The parameter "redirect_after_not_allow_page" is set when entering a course page but we don't have access, so the user have to enter login/password, after entering the course access should be reset with the new permissions</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/8a1e9cdf045d169d3d176fb20884e4b5111f2dfb">8a1e9cdf</a> - <a href="https://task.beeznest.com/issues/14222">BT#14222</a>) Quiz: Check access when rendering hotspot answers</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/0185b2f2a604985d26169a4062df96ebfc63b966">0185b2f2</a> - <a href="https://task.beeznest.com/issues/14222">BT#14222</a>) Quiz: Fix hotspot preview question + add security access</li>
<li>[2018-04-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/51828642162338419b84bde2f5d0d047ed724adb">51828642</a> - <a href="https://task.beeznest.com/issues/14222">BT#14222</a>) Quiz: Fix hotspot question copy from question pool</li>
<li>[2018-04-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/9c41b7438b808d840c9f39e2bacd19e544a3d24b">9c41b743</a>) Internal: Add comment about possible gradebook tables optimization query</li>
<li>[2018-04-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/6e7977a6b9913832f37b23a75a521415c449b801">6e7977a6</a> - <a href="https://task.beeznest.com/issues/13964">BT#13964</a>) Gradebook: Don't send notification when certificate/shared folder is added</li>
<li>[2018-04-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/add33b0517826aeef22fbe194c25532d16b5532d">add33b05</a> - <a href="https://task.beeznest.com/issues/13964">BT#13964</a>) Chat: Don't send notification when document is added in chat</li>
<li>[2018-04-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/f0af5355d8dee10fe81fa76ba1dc433be4687732">f0af5355</a> - <a href="https://task.beeznest.com/issues/14180">BT#14180</a>) Display: Learnpath: Restore update scorm action in lp list for accordion view</li>
<li>[2018-04-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/fa49d13e96a2db29d9f9342d9cc8dd5bc793c2c9">fa49d13e</a> - <a href="https://task.beeznest.com/issues/14209">BT#14209</a>) Quiz: Escape delete popup text to avoid JS issues</li>
<li>[2018-04-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/00f3e4a6506035674a58ccdf4ebe098bd6f607e3">00f3e4a6</a>) Work: Fix work access for teachers and students</li>
<li>[2018-04-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/c3b64189a91659077d0c2ace640801ed281db181">c3b64189</a>) Learnpath: Fix lp_view code</li>
<li>[2018-04-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/64a3f5cbf01804927671f0e75aa56975ee64759b">64a3f5cb</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2483">GH#2483</a>) Plugin: Buy courses: Avoid showing "Free" price tag when buy course is not enabled</li>
<li>[2018-04-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/a669291acef65a43fe0545cc76f2c7e6867a880a">a669291a</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2483">GH#2483</a>) Session: Show sessions without category in hot sessions list</li>
<li>[2018-04-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/8e267f930c11f1517798b74c4349f080a22d6fef">8e267f93</a>) Display: Fix registration progress bar height</li>
<li>[2018-04-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/53cf769dfb27edc95bad68a42b2484360dcb0b72">53cf769d</a> - <a href="https://task.beeznest.com/issues/14200">BT#14200</a>) Admin: Add configuration setting "lp_view_accordion"</li>
<li>[2018-04-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/fc176cb915f51850b350bb87a5c7b7af3d37fd77">fc176cb9</a>) Display: Improve the design of the most popular session and course</li>
<li>[2018-04-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/b45fbc4e7a192592f8a38b35a6979311beb3d847">b45fbc4e</a>) Display: Improve the design of the most popular session and course</li>
<li>[2018-04-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/8a6bb2f59317853e9785205ea721777081dc677d">8a6bb2f5</a> - <a href="https://task.beeznest.com/issues/14182">BT#14182</a>) Display: Fix accordion view for lp categories</li>
<li>[2018-04-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/134aa8ed4b4a237d77729fc7d87c86fbf7c87a46">134aa8ed</a>) Display: Icon correction to buy course catalog and price text</li>
<li>[2018-04-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/686a50c6eedbfd2e94218b72cbd428f0853dacdc">686a50c6</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2477">GH#2477</a>) Global: Fix issue by which the string 'false' is considered not empty to decide if the image cropping must be scalable</li>
<li>[2018-04-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/04d30c87d98bdfa90d2fb1bc3966c7d94e253bb9">04d30c87</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Learnpath: Fix wrong time duration when doing an exercise inside a LP</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/760ad80efc9d5002cc62963bb8ade86aaa484ea8">760ad80e</a>) Template: Add "Buy now" button on the "About" page for the session</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/88b19e26af2b3bd1c752556a0085a482ca8547ee">88b19e26</a>) Registration: Old password verification bar removed</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/8e257a3e7a03b3213f7c0309419a325c720f4d04">8e257a3e</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2346">GH#2346</a>) Internal: Add script to switch from get_lang() variables conversion to gettext-like strings</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/36d5c6e70f574a66ebc01738dd0edba972f2e03e">36d5c6e7</a>) Display: Fix registration page CSS</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/5900c595b72790bccb7b2edd395d46dd369f5a7d">5900c595</a>) Internal: Move get_all_php_files() to FileManage library as getAllPhpFiles() - part 3/3 :-) Improve code syntax, fix warnings and fix typo.</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/6d1b1c7781a61b30a58c4cc2858b42b81b71f0a7">6d1b1c77</a>) Internal: Move get_all_php_files() to FileManage library as getAllPhpFiles() - part 2/2</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/41333741b51dbe0eff4f40846e6b5709d40682e7">41333741</a>) Internal: Move get_all_php_files() to FileManage library as getAllPhpFiles()</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/72ef121a367f2f7d9495012592d485cedcc3cc27">72ef121a</a>) Display: Add svg icons for coursemanager and coursestudent</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/200fb486ff82f8f642ecb24aae7d9b3e99208821">200fb486</a>) Display: Registration: Improve registration form design</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/a547f60ec2e77664088b6b4a1f262dc8e1004a4a">a547f60e</a> - <a href="https://task.beeznest.com/issues/5776">BT#5776</a>) Learnpath: If no data then show simple message "LearnpathPrereqNotCompleted"</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/553b10aba8598d8c20dec02e8e0359e2bcb256f0">553b10ab</a> - <a href="https://task.beeznest.com/issues/5776">BT#5776</a>) Learnpath: Improve ajax prerequisite result</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/9c5860abe3353b4616740639faa0dc5e970bb90d">9c5860ab</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Learnpath: Update lp_view_item.total_time</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/bcbe4100497610b0f1320223b2b70a4d7874151c">bcbe4100</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2461">GH#2461</a>) Plugin: SEPE: Fix foreign key constraint issue</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/d9b53ee886c088ed6cac8957a29ae78021f9f036">d9b53ee8</a> - <a href="https://task.beeznest.com/issues/14193">BT#14193</a>) Skill: Fix badge view for anons</li>
<li>[2018-04-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/1bd1d63c5258936eaaa6aa1457e93f409bd6d876">1bd1d63c</a> - <a href="https://task.beeznest.com/issues/5776">BT#5776</a>) Learnpath: Allow to change max score in LP when using an exercise as a prereq - format code - change lang var -</li>
<li>[2018-04-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/a5571013452233d76611732975b8912c0c3ea363">a5571013</a> - <a href="https://task.beeznest.com/issues/14170">BT#14170</a>) Session: Fix session block in course list when courses_list_session_title_link is set</li>
<li>[2018-04-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/d9f225ca0276e5ca592f369902c15a540d6cd18f">d9f225ca</a> - <a href="https://task.beeznest.com/issues/14193">BT#14193</a>) Skill: Allow anon to see badge issue page</li>
<li>[2018-04-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/ce8a2bfb65dcbd37aabc2f9669882744d1394933">ce8a2bfb</a> - <a href="https://task.beeznest.com/issues/14188">BT#14188</a>) Announcement: Add user extra fields as dynamic tags when adding an Announcement</li>
<li>[2018-04-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/80894dd7a5895ead2c8305878db0513a43f399df">80894dd7</a>) Global: Enable variable ratio in image cropping JS</li>
<li>[2018-04-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/0d4698c4d80975a3b190d9c71f412cb2bf856ece">0d4698c4</a>) Global: Fix black background issue wehn uploading and resizing/cropping images with transparency</li>
<li>[2018-04-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/1611bcba154fd0b134dde8066b8243d8f2fcc05d">1611bcba</a>) Gradebook: Use of the api_sort_by_first_name function in export all certificates</li>
<li>[2018-04-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/4157c25c0ce93b42f06d0eef74ebfb4beb98a4ce">4157c25c</a> - <a href="https://task.beeznest.com/issues/5776">BT#5776</a>) Learnpath: Add ajax call to load prerequisites information</li>
<li>[2018-04-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/034656cc41b07aa61ddc32fabb6d3a8ad5c92930">034656cc</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2463">GH#2463</a>) Notebook: Use ChamiloSession instead of $_SESSION - Rename classes - Use api_get_plugin_setting - deleted unused file</li>
<li>[2018-04-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/ba8afd8443f299db5a235407e710341aa49723c3">ba8afd84</a> - <a href="https://task.beeznest.com/issues/14182">BT#14182</a>) Document: Allow pixlr only when enabled_support_pixlr is enabled</li>
<li>[2018-04-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/16953afc33b6cf43e00b418b5050c0a987d6684a">16953afc</a> - <a href="https://task.beeznest.com/issues/14180">BT#14180</a>) Language: Fix search language variables in sublanguage</li>
<li>[2018-04-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/3219455a4c67f0481818166a8c0c9f96db4a8c54">3219455a</a> - <a href="https://task.beeznest.com/issues/14180">BT#14180</a>) Language: Hide the filename colum in sublanguages</li>
<li>[2018-04-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/daceb16ec5f5a543a68b10d208ad95573f61c82a">daceb16e</a> - <a href="https://task.beeznest.com/issues/14180">BT#14180</a>) Language: Improve table for found language variables when translating</li>
<li>[2018-04-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/f0c7b3f0f1613c4c167e97cb36da2735357721f8">f0c7b3f0</a> - <a href="https://task.beeznest.com/issues/14180">BT#14180</a>) Language: Fix duplicates rows when searching variables in sublanguage</li>
<li>[2018-04-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/5468ea249967ff89985df5c0514631ca52c974b2">5468ea24</a> - <a href="https://task.beeznest.com/issues/14180">BT#14180</a>) Learnpath: Fix save max score when saving lp</li>
<li>[2018-04-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/3ce1da62e847a0e0ff830b533570251e4a56c203">3ce1da62</a>) Display: Add skill_acquirers.svg icon</li>
<li>[2018-04-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/5944a886d8f678c74e18ed581532b49e6febb61e">5944a886</a>) Session: Fix empty session duration time</li>
<li>[2018-04-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/2b4c678e6853d0897be8d5e11cd35e5450bac4a0">2b4c678e</a>) Session: Fix session edition, error when updating session duration.</li>
<li>[2018-04-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/6773bc839a6303cc81807b308b5543240405d173">6773bc83</a> - <a href="https://task.beeznest.com/issues/14174">BT#14174</a>) Install: Fix lp.id to lp.iid migration (a script is also available in tests/scripts/)</li>
<li>[2018-04-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/9dfc19cadb25cf85e2a0ae07080f3c68a1b07a4f">9dfc19ca</a> - <a href="https://task.beeznest.com/issues/14184">BT#14184</a>) Quiz: Fix fill in blanks FILL_THE_BLANK_SEVERAL_ANSWER with ö/ë chars BT#14184</li>
<li>[2018-04-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/ee1b479fd3a73133c32076b7ef169c57f202f7c4">ee1b479f</a>) Tracking: Clean differences in students reports scripts in main/mySpace/</li>
<li>[2018-03-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/37f3010afa71a2ce998a7ff30d83065f9b8e2d97">37f3010a</a> - <a href="https://task.beeznest.com/issues/12861">BT#12861</a>) Career: Add new option to read "Connections" like "G1-123"</li>
<li>[2018-03-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/3e252155f81f315c6b5a19a320ce8f3694327aa1">3e252155</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Global: Fix ajax call not working on firefox for course logout registration</li>
<li>[2018-03-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/7ff3883a17552de0ceeef6ecd25c62a1be8dab3c">7ff3883a</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2415">GH#2415</a>) Display: Quiz: Fix fill in blanks style</li>
<li>[2018-03-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/8a14be221b8912e8bb12a42a3a6476d53c9c8840">8a14be22</a>) Internal: Use symfony ExceptionHandler object to handle errors (only in test mode) - If a database error exists a more informative debug appears. - tag "@throws \Doctrine\DBAL\DBALException" will be not needed</li>
<li>[2018-03-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/8a465b29dd9a3bea7211e23d903841a5d42770d3">8a465b29</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2470">GH#2470</a>) Maintenance: Fix course backup creation. Fix scorm folder</li>
<li>[2018-03-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/26b1a690257b2b705206e5b45c9a48b4a969a339">26b1a690</a>) Display: Tracking: Fix reporting menu</li>
<li>[2018-03-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/0cdf7538d686793529ee0b9662f687faa40ff16e">0cdf7538</a>) Display: Tracking: Add jquery easypiechart</li>
<li>[2018-03-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/923755416e7f6b167bdb87b7718ba940338a9971">92375541</a>) Display: Tracking: Fix css and structure reports</li>
<li>[2018-03-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/72f9fe2a80495d7ea0ae400e89d7ea1732c976fc">72f9fe2a</a>) Forum: Fix operator error in forum change notification</li>
<li>[2018-03-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/d866b762a909f0d7ed9953f0d91d9987612eab5c">d866b762</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Tracking: Learnpath: Show correct time duration, not calculated time duration</li>
<li>[2018-03-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/90cb90bd52f4d31ba6b8239e17a31fc93a1c820b">90cb90bd</a> - <a href="https://task.beeznest.com/issues/14161">BT#14161</a>) Skill: Show all skills if "allow_teacher_access_student_skills"</li>
<li>[2018-03-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/d89a608baa4be7180d4277ea02d21f873c38c57a">d89a608b</a> - <a href="https://task.beeznest.com/issues/14165">BT#14165</a>) Message: Fix "not allowed" error when sending a message</li>
<li>[2018-03-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/b0c85057adeedb59cb28ec2ca96820a56d29f4d2">b0c85057</a> - <a href="https://task.beeznest.com/issues/14161">BT#14161</a>) Quiz: Save duration instead of calculation of start/end date</li>
<li>[2018-03-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/62b741710f7d386ecbfacc7ae93c00e28b0f59df">62b74171</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Quiz: Fix exercise duration time</li>
<li>[2018-03-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/e67e7355766629f7a54eeb8261178fd029855702">e67e7355</a> - <a href="https://task.beeznest.com/issues/14161">BT#14161</a>) Admin: Add configuration setting 'allow_teacher_access_student_skills' to allow teachers to access student skills. Skills setting must be enabled in the platform.</li>
<li>[2018-03-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/1ebd8ae59656c856ffc6d60ddcf0b0d562c4a7bb">1ebd8ae5</a> - <a href="https://task.beeznest.com/issues/13954">BT#13954</a>) Install: Migration from 1.9.x/1.10.x - Add fix LP.id to LP.iid</li>
<li>[2018-03-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/26e3a1bee183b9f41e24357a40acdda5412d4851">26e3a1be</a>) Internal: Use table object to remove index and drop FK, to avoid DB error.</li>
<li>[2018-03-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/5c1a25f660ebd52b8739dd5fccfab58907d497db">5c1a25f6</a>) Plugin: Test2PDF: Secure parameters using int casting.</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/353d3541d3576f189c3ba9206a4602c49b191ac8">353d3541</a> - <a href="https://task.beeznest.com/issues/14162">BT#14162</a>) Ticket: Ticket icon depends of setting "ticket_project_user_roles"</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/f76015b7ceb1ccbcc533ebc2d4b90ecd944e6a86">f76015b7</a> - <a href="https://task.beeznest.com/issues/12861">BT#12861</a>) Career: Career diagram allow "DrawArrowFrom" to read subgroup connections</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/461de7bc0523cb7af57837aba35500c6f2d536a6">461de7bc</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Internal: Learnpath: Add AJAX action get_parent_names</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/59c224fcbb4d504af9b43433044178834183aaf0">59c224fc</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Internal: Learnpath: Set oLP in session</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/d7c45de980ae73baef5bc7a94e395624c43169e8">d7c45de9</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Learnpath: Add correct "lp_view_session_id" makes LP to double time</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/bdd2195f51e968579938f8af002615d88568fb15">bdd2195f</a>) Learnpath: Add other option for course setting "lp_return_link"</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/1b65896ad2f5e6f5f6075bbadc17e5737d5f3ea1">1b65896a</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Internal: Fix incorrect web_cid_query</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/7b7d8d1e724b46b35856b6762585d01568c214ee">7b7d8d1e</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Internal: Learnpath: Add Session::write('oLP', $oLP)</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/f5071f294c6f8d81b264b8ca19776452faa9a1c2">f5071f29</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Internal: Learnpath: Add lp_id when loading lp_nav.php + loading correct LP object BT#14149</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/efbc92df0823d5c0adb283b875840ee737232ba7">efbc92df</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Internal: Learnpath: Be sure to delete LP sessions</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/6d0fe5cfd8c0a7e00a6f9d9a6988027554cabc1f">6d0fe5cf</a> - <a href="https://task.beeznest.com/issues/14149">BT#14149</a>) Internal: Learnpath: Be sure to delete LP sessions</li>
<li>[2018-03-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/1b07b6d64b36c484c149979f1028dcbfcf9b066a">1b07b6d6</a>) Skill: Fix localte skill in wheel</li>
<li>[2018-03-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/a6777d2a35f5b706242427589e6182638ce529b5">a6777d2a</a>) Skill: Display: Add skill_acquirers icon</li>
<li>[2018-03-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/954b23a95d6c1cdc72e070320eccf7ba1f2fce4d">954b23a9</a>) Plugin: Add plugin Notebookteacher</li>
<li>[2018-03-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/e1f8c48325c5fcc731db0d8bd5ca2dd0fc19bd83">e1f8c483</a> - <a href="https://task.beeznest.com/issues/11913">BT#11913</a>) Survey: Improve pending surveys page</li>
<li>[2018-03-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/324646f1efe56258cae34c93cbdff0d0f033811e">324646f1</a> - <a href="https://task.beeznest.com/issues/11913">BT#11913</a>) Survey: Add message when no pending surveys</li>
<li>[2018-03-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/78c8041e5e784eee39cc51cda2734f608b068662">78c8041e</a> - <a href="https://task.beeznest.com/issues/11913">BT#11913</a>) Survey: Fix filter for pending surveys</li>
<li>[2018-03-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/24f866c15ecc4f29bc9807a0fd9a7bbc1041be9d">24f866c1</a> - <a href="https://task.beeznest.com/issues/10895">BT#10895</a>) Glossary: Import from CSV/XLS and export to CSV/XLS</li>
<li>[2018-03-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/4fe79baf7c088f5d761daa11d6e4930c5cb325b8">4fe79baf</a> - <a href="https://task.beeznest.com/issues/14150">BT#14150</a>) Gradebook: Change to vertical view when exporting gradebook report to XLS</li>
<li>[2018-03-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/a2612dcc6f9bc1dc1aa77c6200cca756ccf96e89">a2612dcc</a> - <a href="https://task.beeznest.com/issues/14145">BT#14145</a>) Group: Use c_group_info.iid to set correct group</li>
<li>[2018-03-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/d11cd8e3d906e8c9fe4ead49ecc139dfd4aeb248">d11cd8e3</a>) Plugin: Test2PDF: Apply mpdf library + format code</li>
<li>[2018-03-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/9cf0839cfff621a9a8a533917560c0bd66142a21">9cf0839c</a> - <a href="https://task.beeznest.com/issues/13964">BT#13964</a>) Document: Don't send attachment when sending document notification</li>
<li>[2018-03-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/a8b4e48ba84ab32f699a6119b43a7e191cc2f97d">a8b4e48b</a> - <a href="https://task.beeznest.com/issues/14145">BT#14145</a>) Group: Try group iid if group.id doesn't work</li>
<li>[2018-03-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/5bd16daeb6de94e9c0cc11bf6a9e1616bdf1731d">5bd16dae</a> - <a href="https://task.beeznest.com/issues/14142">BT#14142</a>) Install: Add docs about missing index for DB optimization</li>
<li>[2018-03-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/3fe40cafab07d9b31205072fa32532ab18411417">3fe40caf</a> - <a href="https://task.beeznest.com/issues/14126">BT#14126</a>) Admin: Add configuration setting "disable_gradebook_stats" to disable average, ranking cols.</li>
<li>[2018-03-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/9e571cdc0fc8484009d887254dc64ef46415cb6e">9e571cdc</a>) CI: Add test file to generate a large number of users</li>
<li>[2018-03-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/9ae471fee72cb4c742f5dc26f4fecca615720411">9ae471fe</a>) Internal: Fix api_get_utc_datetime return obj is set to UTC</li>
<li>[2018-03-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/4ee2932bd3aa725f61ad99ee346cfa064337d072">4ee2932b</a> - <a href="https://task.beeznest.com/issues/14056">BT#14056</a>) Portfolio: Add sql query to enable portfolio tool</li>
<li>[2018-03-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/e3fe5e1da1cd98f80b2eb952c0ac74bc3270d6d8">e3fe5e1d</a>) Internal: Use official kigkonsult/icalcreator lib now it has a tag</li>
<li>[2018-03-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/44fe555a4d4d0eaf88bd039b2f2c501c5611359b">44fe555a</a> - <a href="https://task.beeznest.com/issues/14125">BT#14125</a>) Internal: Session: Add SCHEDULE_ANNOUNCEMENT constant</li>
<li>[2018-03-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/902f0c6ba7faabaee1d15250d020ab4a6e7222ea">902f0c6b</a> - <a href="https://task.beeznest.com/issues/14125">BT#14125</a>) Session: Add extra fields for schedule announcements</li>
<li>[2018-03-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/656ceddfc8b23a5609aecf59e8579cc976c40cfe">656ceddf</a> - <a href="https://task.beeznest.com/issues/14127">BT#14127</a>) Quiz: Fix error when sending an oral question notification</li>
<li>[2018-03-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/0e5679ca946083218845a9bca93b08f4d389a425">0e5679ca</a>) Internal: Replace non-existent ToolbarSet "IntroductionTool" in CKEditor</li>
<li>[2018-03-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/6919041abda2547325c353928c74d95d1a2772ee">6919041a</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2415">GH#2415</a>) Quiz: Fix hidden select when previewing fill in the blanks questions</li>
<li>[2018-03-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/c81fe1e3715d822e3cf7a55b6142e4b5435ca2ed">c81fe1e3</a> - <a href="https://task.beeznest.com/issues/5758">BT#5758</a>) Learnpath: Fix LP folder creation when group session id is set</li>
<li>[2018-03-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/11ffa3a29f3cc0ffaed7fbc6bb0aa4fb9c432b9d">11ffa3a2</a> - <a href="https://support.chamilo.org/issues/8462">CT#8462</a> - <a href="https://task.beeznest.com/issues/14020">BT#14020</a>) Fix Chrome issue when changing audio/video progress - Undo changes in video plugin that replaces the /courses/document to app/courses/document - Add "Accept-Ranges: bytes"</li>
<li>[2018-03-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/f11e2ffc6665fe27a2ab6dcd289d18ce8edca8b7">f11e2ffc</a>) Internal: Update mediaelement.js lib to v4.2.8</li>
<li>[2018-03-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/6011aed609fa0a44f45b56f4cfdafa9001d6a674">6011aed6</a> - <a href="https://task.beeznest.com/issues/13665">BT#13665</a>) Course homepage: Avoid double tool icons in course homepage</li>
<li>[2018-03-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/28a817ec6d2c5a04281916671d937404f0ab7b9c">28a817ec</a> - <a href="https://task.beeznest.com/issues/12756">BT#12756</a>) Session: Revert "Allow show tools categories from session</li>
<li>[2018-03-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/8ee48cc6839e3388e3842cec06b17ce140732c71">8ee48cc6</a>) Plugin: LTI: Fix fatal error table already created "plugin_ims_lti_tool"</li>
<li>[2018-03-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/57200e26b259e79855879cc02a9c65d17d2f87b4">57200e26</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2266">GH#2266</a>) Admin: Update CSV examples for users imports and stuff, converted to UTF8</li>
<li>[2018-03-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/87067478299667339577ec7c4bf0055e4357301e">87067478</a> - <a href="https://task.beeznest.com/issues/12756">BT#12756</a>) Session: Allow show tools categories from session</li>
<li>[2018-03-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/94084c60e8b381281328f2b5d9355e20dd7e1cde">94084c60</a> - <a href="https://task.beeznest.com/issues/14056">BT#14056</a>) Learnpath: Fix save Lp extrafields</li>
<li>[2018-03-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/7a22367257951ce556b0d88f0555c7ced5c6e76b">7a223672</a>) Template: Fix ID of login_block</li>
<li>[2018-03-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/b30663c627f465a4eb40d2a6b3b1607c8badeb9a">b30663c6</a>) Template: Rename login_block to loginBlock</li>
<li>[2018-03-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/f22ee038ad6fcd99c167267c2331b2bf7452258b">f22ee038</a> - <a href="https://task.beeznest.com/issues/13961">BT#13961</a>) Social: Fix user count in social groups</li>
<li>[2018-03-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/b646a2d1fbd621171cff8dcf3dabadf7ecb0e40d">b646a2d1</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2230">GH#2230</a>) Install: Fix memory_limit and display_errors info in installer</li>
<li>[2018-03-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/d5dc2ff753418b3c83dbf55ac2bc8106ba033253">d5dc2ff7</a> - <a href="https://task.beeznest.com/issues/12861">BT#12861</a>) Career: Add diagram.tpl for new mxgraph career diagram</li>
<li>[2018-03-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/a23b614683c4b64ec37e40d5a26f3bb869336459">a23b6146</a> - <a href="https://task.beeznest.com/issues/12861">BT#12861</a>) Career: Add new career diagram using mxgraph v3.9.3</li>
<li>[2018-03-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/83162fae3b40ec812de9d9ae854460251a86006f">83162fae</a>) Template: Fix language selector</li>
<li>[2018-03-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/fe7fc1fe22d988c937fb69401055e724b159d187">fe7fc1fe</a> - <a href="https://task.beeznest.com/issues/14091">BT#14091</a>) Plugin: Dictionary: Add link to dictionary plugin (if enabled)</li>
<li>[2018-03-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/58dafe56ec392e27e6f0ae965c6d7579ce3c48ac">58dafe56</a> - <a href="https://task.beeznest.com/issues/14091">BT#14091</a>) Plugin: Add "dictionary" plugin</li>
<li>[2018-03-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/6a76c25689fc543490e50ae97b13252b4bb8aac1">6a76c256</a>) Template: Improvement of structure tpl about_session panel info</li>
<li>[2018-03-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/e78b69f8d36a5fa8221e442bb0b534f2ed0d010d">e78b69f8</a>) Template: Improvement of structure tpl about_session</li>
<li>[2018-03-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/0793e1d645311e3dc5beadce68829de9b2ff75b6">0793e1d6</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2382">GH#2382</a>) Display: Add calculated_answer.png icon</li>
<li>[2018-03-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/ee05f8a6ddb9f38e84b5e9a57d0ff52e0cb45812">ee05f8a6</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2383">GH#2383</a>) Display: Fix color in the matchingdrag.png icon</li>
<li>[2018-03-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/c118215cebf98acbd6bf8ee1ba2ee95db07b150c">c118215c</a> - <a href="https://task.beeznest.com/issues/14056">BT#14056</a>) Display: Add wiki_task.png icon</li>
<li>[2018-03-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/042c265e139fc3bc85c1605903098d9e96341fe6">042c265e</a> - <a href="https://task.beeznest.com/issues/14096">BT#14096</a>) Calendar: Import calendar events by CSV: delete event if session doesn't exists</li>
<li>[2018-03-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/fb76863246325322b52efc85af9972f57be78647">fb768632</a> - <a href="https://task.beeznest.com/issues/12861">BT#12861</a>) Career: Add new diagram layout</li>
<li>[2018-03-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/b872335f8e6d87a8d12371dffccb62c532324c53">b872335f</a> - <a href="https://task.beeznest.com/issues/13334">BT#13334</a>) Skill: Fix PHP error when updating profile/level. Add flash msgs</li>
<li>[2018-03-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/178eee13dfc7aa8e41f71b2b9b3184f9bbe1643b">178eee13</a>) Quiz: Fix copy exercise in sessions</li>
<li>[2018-03-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/fd42421453b66e728483e5f6d13701242da0c96a">fd424214</a>) Quiz: Fix import qti2 in sessions</li>
<li>[2018-03-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/52fd5b9fe27cc4917f4ce00b34e875f608fee48f">52fd5b9f</a> - <a href="https://task.beeznest.com/issues/12667">BT#12667</a>) Admin: Remove E_NOTICE when admin edits user</li>
<li>[2018-03-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/b62b010ea15d94c15204cb6cc151c019d7d33348">b62b010e</a> - <a href="https://task.beeznest.com/issues/14084">BT#14084</a>) Session: Fix load session template when using multiple options</li>
<li>[2018-03-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/9ec102fb804eb0773051b1025b7869410f79e478">9ec102fb</a> - <a href="https://task.beeznest.com/issues/14089">BT#14089</a>) Survey: Don't edit survey code, "freeze" the input</li>
<li>[2018-03-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/bd12778eda6da29c5386ca51795701594e10e23f">bd12778e</a> - <a href="https://task.beeznest.com/issues/14084">BT#14084</a>) Session: Add dates and image when creating sessions through a session template</li>
<li>[2018-03-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/78b24dd82d89bb649b421e262fcbf8a1b9f72604">78b24dd8</a> - <a href="https://task.beeznest.com/issues/10887">BT#10887</a>) Document: Fix multiple file upload return message when using zip files</li>
<li>[2018-03-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/0af32bb72886d3ab9140d371cff2881a273a384f">0af32bb7</a>) Document: Use default platform "document if exists" option in LP upload document.</li>
<li>[2018-03-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/d444a0d789d1dc9cc9020bb4b42ff5819652ad66">d444a0d7</a> - <a href="https://task.beeznest.com/issues/14082">BT#14082</a>) Display: Fixes bootstrap select long text options</li>
<li>[2018-02-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/ec9998d5f0571322bdf29cf0e431baf3744880ce">ec9998d5</a> - <a href="https://task.beeznest.com/issues/14028">BT#14028</a>) Glossary: Add toolbars with Back button</li>
<li>[2018-02-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/8847c8b7d2859bc8ea11d190736962144061261b">8847c8b7</a> - <a href="https://task.beeznest.com/issues/14028">BT#14028</a>) Notebook: Avoid double condition block</li>
<li>[2018-02-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/0cdf70ffcff94c4aeb1bbfd3108ca6f296f2d300">0cdf70ff</a> - <a href="https://task.beeznest.com/issues/14081">BT#14081</a>) Internal: Fix return to use array instead of iterator</li>
<li>[2018-02-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/cf36145daa0fd1b5e76e4da087028d98d3d128ad">cf36145d</a> - <a href="https://task.beeznest.com/issues/10887">BT#10887</a>) Document: Allow rename/overwrite/do nothing if file exists when unzipping file</li>
<li>[2018-02-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/415f063576d113bb28ed42944dced050acaeb6c6">415f0635</a> - <a href="https://task.beeznest.com/issues/14031">BT#14031</a>) Work: Fix download all student publication file names</li>
<li>[2018-02-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/acd689747680999195565057e719957190db8997">acd68974</a> - <a href="https://task.beeznest.com/issues/13954">BT#13954</a>) Announcement: Announcement group list, use iid instead if id</li>
<li>[2018-02-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/f4188df2a1eb9d6c86d616cfbffedcfdb9e07c52">f4188df2</a> - <a href="https://task.beeznest.com/issues/13334">BT#13334</a>) Skill: Add SkillRelCourse table</li>
<li>[2018-02-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/f2e14449de7c7fb01382d0cf45f514c6e85a7f45">f2e14449</a> - <a href="https://task.beeznest.com/issues/14069">BT#14069</a>) Plugin: BBB: Fix global user bbb meeting creation</li>
<li>[2018-02-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/8d7d1a9aa3047d96594890dfc556c8d67ecbf067">8d7d1a9a</a> - <a href="https://task.beeznest.com/issues/13954">BT#13954</a>) Learnpath: Fix c_tool.link field using the new c_lp.iid field</li>
<li>[2018-02-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/91e140f684095cdc4c3ab78cb947ee214432d57e">91e140f6</a> - <a href="https://task.beeznest.com/issues/13954">BT#13954</a>) Learnpath: Fix "-1" error when loading a document inside LPs</li>
<li>[2018-02-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/49e95b9d03e10b3041ef7675755a8da8668c262a">49e95b9d</a> - <a href="https://task.beeznest.com/issues/13996">BT#13996</a>) Plugin: VChamilo: Fix sync params using key instead of id</li>
<li>[2018-02-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/a9c6a8dceb259e13da5bab08536a10a0ba15686a">a9c6a8dc</a> - <a href="https://task.beeznest.com/issues/13996">BT#13996</a>) Plugin: VChamilo: Fix creation/enabling plugin</li>
<li>[2018-02-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/07f35b37839421be82003be43fa58a21900eb9db">07f35b37</a> - <a href="https://task.beeznest.com/issues/13334">BT#13334</a>) Gradebook: Only show students in gradebook report</li>
<li>[2018-02-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/322cdeb2ec0ca542bba0e8c467341f793e494962">322cdeb2</a> - <a href="https://task.beeznest.com/issues/14043">BT#14043</a>) Session: Fix error when session admin cannot see exercise results</li>
<li>[2018-02-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/65a9b564344d9e898efbed74b04eab196a60f7e5">65a9b564</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Learnpath: Change variable name to add scorm information on export</li>
<li>[2018-02-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/a1d2eeb338ff2651bca48e9113834e8b1da2b19b">a1d2eeb3</a> - <a href="https://task.beeznest.com/issues/14026">BT#14026</a>) Global: Fix set course visual theme</li>
<li>[2018-02-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/7218fd1c1278a2f231d4f89537edbea42653eaaa">7218fd1c</a> - <a href="https://task.beeznest.com/issues/13187">BT#13187</a>) Quiz: Add $decimalSeparator and $thousandSeparator params - Used comma as separator for the exercise_category_report.php page</li>
<li>[2018-02-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/a6a772b74bfdabed715d3adf1862732a0049f96d">a6a772b7</a> - <a href="https://task.beeznest.com/issues/14030">BT#14030</a>) Quiz: Fix wrong answer in exercise with calculated question</li>
<li>[2018-02-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/baad87a1118abff774be7330ef7c5dab4283f44b">baad87a1</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2388">GH#2388</a>) Session: Document: Fix visibility of base-course documents from session</li>
<li>[2018-02-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/2a4ea89fd63dea0ff0beecd82206b58f62fa166f">2a4ea89f</a> - <a href="https://task.beeznest.com/issues/10895">BT#10895</a>) Global: Export csv file as utf8</li>
<li>[2018-02-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/a905f9c8d87e2062887df7587d9e1d9ca3db5936">a905f9c8</a> - <a href="https://task.beeznest.com/issues/10895">BT#10895</a>) Global: Try to convert imported CSV from ISO-8859-15 to utf8 if is not valid</li>
<li>[2018-02-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/6679227bd00ba786194819985ccfeac0a8048ef5">6679227b</a> - <a href="https://task.beeznest.com/issues/14030">BT#14030</a>) Quiz: WIP: Fix calculated question result</li>
<li>[2018-02-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/71cc9fc0a2a411f59a885ef84b24f2c23ab37aaa">71cc9fc0</a> - <a href="https://task.beeznest.com/issues/14029">BT#14029</a>) Work: Fix double extension when uploading work with ajax</li>
<li>[2018-02-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/158d0cc542db827c07a53126884c84b7cce7723b">158d0cc5</a> - <a href="https://task.beeznest.com/issues/13950">BT#13950</a>) Quiz: Show "your choice" column when "expected choice" is on</li>
<li>[2018-02-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/98dd6d5890de9815a653cb6913dd91eaf5955daf">98dd6d58</a> - <a href="https://task.beeznest.com/issues/10895">BT#10895</a>) Internal: Use League\Csv\Reader instead of Ddeboer\DataImport</li>
<li>[2018-02-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/e1a02f3707f2a6de654e1322e179ab05ff7e77d5">e1a02f37</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2278">GH#2278</a>) Quiz: Fix menu width in fill in the blanks questions</li>
<li>[2018-02-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/f90ac3c0d59442d86fbdbb7137fe26eb639efc3d">f90ac3c0</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2380">GH#2380</a>) Internal: Update ViewerJS library to version 0.5.8 #2380</li>
<li>[2018-02-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/2f3689c4c9299737b7b20efeaa7a1d9d2c8c921b">2f3689c4</a> - <a href="https://task.beeznest.com/issues/13334">BT#13334</a>) Skill: Add "result_id" in SkillRelItemRelUser</li>
<li>[2018-02-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/739ed0c6326bd1278be8dd01e18ad12bd11a696d">739ed0c6</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2351">GH#2351</a>) Quiz: Fix copy exercise when using category order</li>
<li>[2018-02-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/68819d8519263d3e1b13eac8940bb63ee8c1daac">68819d85</a> - <a href="https://task.beeznest.com/issues/14004">BT#14004</a>) Course homepage: Fix tool icons to load correctly in Chrome (Chrome bug)</li>
<li>[2018-02-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/c209282cc44abc740058bf6606da8755f3478f78">c209282c</a> - <a href="https://task.beeznest.com/issues/10885">BT#10885</a>) Learnpath: Add option to update scorm files only</li>
<li>[2018-02-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/ec189ea5ce1eb983fa9c8f9d9195edc231ba034f">ec189ea5</a> - <a href="https://task.beeznest.com/issues/13334">BT#13334</a>) Skill: Add DB changes for setting "allow_skill_rel_items"</li>
<li>[2018-02-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/b3a1760fb7230695893c8b73678b83125ee7f445">b3a1760f</a> - <a href="https://task.beeznest.com/issues/10887">BT#10887</a>) Document: File upload now reads the default "if exist" value or the selected one</li>
<li>[2018-02-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/2c1617d036aebf270c531ca1f49b46e4abaaa3c1">2c1617d0</a> - <a href="https://task.beeznest.com/issues/14006">BT#14006</a>) Document: Fix redirect after changing visibility</li>
<li>[2018-02-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/27dcf0a73d086b4cbbfbb82c8da607c6973adfba">27dcf0a7</a> - <a href="https://task.beeznest.com/issues/14007">BT#14007</a>) Document: Fix pixlr create/edit process</li>
<li>[2018-02-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/5408d55f4449e91a7d80a09afdac930bfc9b4e7d">5408d55f</a>) Document: Fix pixlr paint path dir.</li>
<li>[2018-02-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/96cd3ddedc6287262c9157f4fe5b768796cd2820">96cd3dde</a>) Document: Remove api_not_allowed() in order to avoid double headers</li>
<li>[2018-02-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/9835041cca2bd9189e74e442843d8641d16ef20e">9835041c</a> - <a href="https://task.beeznest.com/issues/14005">BT#14005</a>) Document: Fix move document feature</li>
<li>[2018-02-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/3d837cf4883d254f53eedcb59f119dff7b2720d8">3d837cf4</a> - <a href="https://task.beeznest.com/issues/13829">BT#13829</a>) Global: Course catalog: Hide course categories with no courses</li>
<li>[2018-02-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/2e7c681bee5cc143a3a7eaabdd0a94111f85dd7c">2e7c681b</a> - <a href="https://task.beeznest.com/issues/13556">BT#13556</a>) Message: Replace not valid tag </br> to <br /> when parsing message</li>
<li>[2018-02-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/f4c672195362161b11219b8af563dd9e7be981a6">f4c67219</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2351">GH#2351</a>) Quiz: Hide question category if setting is on</li>
<li>[2018-02-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/f78ca9d963e5df3ae4b29d8b599b00f762f4d161">f78ca9d9</a> - <a href="https://task.beeznest.com/issues/13992">BT#13992</a>) Tracking: Fix "onbeforeunload" not calling course logout in firefox</li>
<li>[2018-02-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/fbffecbfb44b776af1af6b2ea10903a742300d4d">fbffecbf</a> - <a href="https://task.beeznest.com/issues/13808">BT#13808</a>) Display: Fix wrong css styles when printing</li>
<li>[2018-02-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/19536a78b00345821ddfed63b7ec83b99cf12d88">19536a78</a> - <a href="https://task.beeznest.com/issues/13808">BT#13808</a>) Display: Fix printing html because of media=screen</li>
<li>[2018-02-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/0b4238c170e896fb33e56ab70ebbc387a5a69842">0b4238c1</a> - <a href="https://task.beeznest.com/issues/13808">BT#13808</a>) Display: Keep editor.css when printing</li>
<li>[2018-02-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/0eed7fd8e4651a58c05b94397b878737fbaeb647">0eed7fd8</a> - <a href="https://task.beeznest.com/issues/13808">BT#13808</a>) Display: Add bootstrap to keep HTML structure when printing</li>
<li>[2018-02-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/876c4a821477ad5e2b564a72f8202b8dcca4dee9">876c4a82</a> - <a href="https://task.beeznest.com/issues/13913">BT#13913</a>) Plugin: "getToolIconVisibility" added to allow plugins to show icon to teachers</li>
<li>[2018-02-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/2b26a9ca508ddd237c2dde4d7b5894892085c002">2b26a9ca</a> - <a href="https://task.beeznest.com/issues/13954">BT#13954</a>) Internal: Add script to fix issues with migrations from Chamilo <1.11.6 where lp.id and lp.iid could be mixed in the c_lp_item table</li>
<li>[2018-02-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/102264d49a7010a838f58a3db1b696b6f76b4e49">102264d4</a> - <a href="https://task.beeznest.com/issues/13979">BT#13979</a>) Global: Wrap recover password url in a <a> tag</li>
<li>[2018-02-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/06d0d12ee52a3e5907e7bca44454639793fcf992">06d0d12e</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2351">GH#2351</a>) Quiz: Save question category when duplicate exercise</li>
<li>[2018-02-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/772dbcb74be89b711e2e9d961ac53de91bde8556">772dbcb7</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2351">GH#2351</a>) Quiz: Save question category when cloning a question</li>
<li>[2018-02-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/57984f132717ae6a88e0f3571691260cb0ab8cd2">57984f13</a> - <a href="https://task.beeznest.com/issues/13187">BT#13187</a>) Global: Use real xls export instead of html table in generic data export AJAX</li>
<li>[2018-02-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/b9dd8d710c5a31cd56df31a1ca7d595d406241a1">b9dd8d71</a> - <a href="https://task.beeznest.com/issues/13976">BT#13976</a>) Quiz: Fix exercise list in question pool (fix query session id = '' or null)</li>
<li>[2018-02-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/46cc7ca2add66b8fe0dd61d6ffe584d42144a546">46cc7ca2</a> - <a href="https://task.beeznest.com/issues/10892">BT#10892</a>) Quiz: Add cid_req to annotation requests</li>
<li>[2018-02-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/cbbe78f79e82ab0321907d4ca39d324d81a30e95">cbbe78f7</a> - <a href="https://task.beeznest.com/issues/10882">BT#10882</a>) Learnpath: Replace custom tpl with a generic, fix php error, fix message when adding users to a LP category</li>
<li>[2018-02-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/7f30868194f64f2e046ac7712c440802ace206ea">7f308681</a> - <a href="https://task.beeznest.com/issues/10892">BT#10892</a>) Quiz: Fix PHP warnings that blocked annotation question</li>
<li>[2018-02-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/3d6e011560de555212a67f50593709c2e8fb4461">3d6e0115</a> - <a href="https://task.beeznest.com/issues/13956">BT#13956</a>) Announcement: Fix wrong user in announcement view</li>
<li>[2018-02-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/710841436e9aa14206204b8cccb022ff7b25b303">71084143</a>) Global: Fix error when no course docs in ckeditor, api_get_cidreq() added.</li>
<li>[2018-02-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/99f39aa7cf913981e249e3c7db8dbb9458926afd">99f39aa7</a> - <a href="https://task.beeznest.com/issues/13672">BT#13672</a>) Announcements: Add "sender id" arg when sending an email</li>
<li>[2018-02-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/457e3b596ad7f6012d11e735df9fee4fa1857d60">457e3b59</a> - <a href="https://task.beeznest.com/issues/13923">BT#13923</a>) Admin: Update setting "allow_teacher_to_blocked_lp_by_prerequisite" - Allow teachers, drhs and admins to access blocked LP's because a prerequisite.</li>
<li>[2018-02-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/2b14c67bf5dc64a427a2c0870f31884e7f44db7d">2b14c67b</a> - <a href="https://task.beeznest.com/issues/13952">BT#13952</a>) Survey: Use survey.iid to get survey data</li>
<li>[2018-02-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/f754acb2dbce96965e100e20d6ad9457b9e0fa20">f754acb2</a> - <a href="https://task.beeznest.com/issues/13947">BT#13947</a>) Announcement: Change configuration value of access by DRH value and use DB setting</li>
<li>[2018-01-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/69cfbfd4bf97c53f26fc0006beaa45650287c353">69cfbfd4</a> - <a href="https://task.beeznest.com/issues/13926">BT#13926</a>) Session: Check if session name exists before update (cron/import_csv.php)</li>
<li>[2018-01-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/de1a966322861fae9c7f694eaa94ebeb0d728c00">de1a9663</a> - <a href="https://task.beeznest.com/issues/13926">BT#13926</a>) Session: Fix error when updating a session with the same name as another</li>
<li>[2018-01-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/b55835b7c80c1a01fd7de1cedfbc645183cf5008">b55835b7</a> - <a href="https://task.beeznest.com/issues/13920">BT#13920</a>) Quiz: Allow stop and save oral expresion question</li>
<li>[2018-01-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/8ed61f4eaa9dcc5c899174eb6c10c81f9a340d21">8ed61f4e</a> - <a href="https://task.beeznest.com/issues/13856">BT#13856</a>) Gradebook: Avoid show margins when exporting certificates without header and footer</li>
<li>[2018-01-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/cadbe03119a287872b6e78335323989f5572a574">cadbe031</a> - <a href="https://task.beeznest.com/issues/13920">BT#13920</a>) Quiz: Fix get correct answers in all attempts for oral expression</li>
<li>[2018-01-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/536b8a0c2c82aa4e14624c999fd68e37711b4399">536b8a0c</a> - <a href="https://task.beeznest.com/issues/13925">BT#13925</a>) Admin: Add users to sessions in page main/admin/user_import.php</li>
<li>[2018-01-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/ef44f61a2fc16bb15b8086f79808ce3fb0b28e6e">ef44f61a</a> - <a href="https://task.beeznest.com/issues/13856">BT#13856</a>) Global: Fix absolute image paths when exporting docs/certs to pdf</li>
<li>[2018-01-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/cfac7f38ee1b5ac2e36e8f2102a5782767f33b5f">cfac7f38</a> - <a href="https://task.beeznest.com/issues/13917">BT#13917</a>) Forum: Fix forum visibility whe date has expired</li>
<li>[2018-01-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/6743e9719e97479a11a8cc1f294cd0f7aec81755">6743e971</a> - <a href="https://task.beeznest.com/issues/13469">BT#13469</a>) Plugin: LTI: Fixes to LTI plugin</li>
<li>[2018-01-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/021355930497ccd3a06d1b8edf01ee9a13bd1cdf">02135593</a> - <a href="https://task.beeznest.com/issues/13894">BT#13894</a>) Quiz: Show feedback audio when feedback text is empty</li>
<li>[2018-01-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/9ad848c28b6ee33da33fdf29fb6712b2d3ad97cf">9ad848c2</a> - <a href="https://task.beeznest.com/issues/13870">BT#13870</a>) Survey: Fix parse of survey direct link (session id added)</li>
<li>[2018-01-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/2fafe47b60fb46f17b0c7d67d807e00d97912cef">2fafe47b</a> - <a href="https://task.beeznest.com/issues/13697">BT#13697</a>) Ticket: Fix inbox attachment when ticket is sent</li>
<li>[2018-01-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/7ededc83970b6a293b00380e5eb2ee26916c653d">7ededc83</a> - <a href="https://task.beeznest.com/issues/13697">BT#13697</a>) Ticket: Send ticket attachments in email</li>
</ul>
<h3>Stylesheets and theming</h3>
<ul aria-role="log" aria-live="off">
<li>[2018-04-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/a12959e2139e7ba23f5031ff4fbedb534c359077">a12959e2</a>) Template: Added the variable home_include in the tpl layout_2_col.tpl</li>
<li>[2018-04-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/d6c5d52a485e55ab97c3fc86c02b391c1c4fe64a">d6c5d52a</a> - <a href="https://support.chamilo.org/issues/11338">CT#11338</a>) Template: Add template variable home_include when including static HTML page through main menu. Add parameter to return_home_page(). Add SECTION_INCLUDE constant</li>
<li>[2018-04-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/4507d6b92bec3259b7b06c0f79e9028e79fdfc41">4507d6b9</a>) Template: Fix duplicate plugin_main_top condition in layout_2_col.tpl</li>
<li>[2018-04-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/55969b05960fb67f703e0e1dbf56af28b30b7385">55969b05</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Template: Add macros for twig in tpl</li>
<li>[2018-04-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/1c1e68bba1b3fef89e8191f6fcdadecd16e84fb7">1c1e68bb</a> - <a href="https://task.beeznest.com/issues/11338">BT#11338</a>) Template: Add notice_block and help_block</li>
</ul>
<h3>Web services</h3>
<ul aria-role="log" aria-live="off">
<li>[2018-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/9ab965d95808a6b473fe757ec426e8c3e21fce7d">9ab965d9</a> - <a href="https://task.beeznest.com/issues/14613">BT#14613</a>) Webservice: Webservice can register user to a course no matter the course config Webservice is kind of "admin" $checkTeacherPermission parameter added</li>
<li>[2018-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/7b1bf11218ea9dbec342bb0ea02f627e1e98fd26">7b1bf112</a> - <a href="https://task.beeznest.com/issues/14613">BT#14613</a>) Webservice: Add "webservice_validation" conf to validate login against a webservice</li>
<li>[2018-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/df10c53f2203724a85e39d3c1e16f80fef4bcd69">df10c53f</a> - <a href="https://task.beeznest.com/issues/14613">BT#14613</a>) Webservice: WSGetUserFromUsername now returns extra fields</li>
<li>[2018-07-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/e861636c1ea3156bc42041f4d2ed8db0954e2a6c">e861636c</a> - <a href="https://task.beeznest.com/issues/14613">BT#14613</a>) Webservice: Get extra fields from user in webservice</li>
<li>[2018-07-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/6cc1a3f25cec2baf3373fea7824a934e32a96092">6cc1a3f2</a> - <a href="https://task.beeznest.com/issues/14613">BT#14613</a>) Webservice: Fix WSGetUserFromUsername webservice</li>
<li>[2018-03-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/3f4800295bd3171246e750ed2f227033c84554f7">3f480029</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2471">GH#2471</a>) Webservice: Fix add course by using REST API #2471</li>
<li>Parameters encode change from base64 to json in file main/webservices/api/v2.php <a href="https://github.com/chamilo/chamilo-lms/commit/0de84700648f098c1fbf6b807dee28ec640efe62">4ffe5edb</a></li>
</ul>
<h3>Removals</h3>
<ul aria-role="log" aria-live="off">
<li>[2018-04-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/bc808c832d7f54eeb6f9f041f5c458111ed5bfa1">bc808c83</a> - <a href="https://task.beeznest.com/issues/14242">BT#14242</a>) Gradebook: Remove unused code get_not_created_links, try find exercise with iid.</li>
<li>[2018-04-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/6094513dfc52402c84a0c2b4fffdbb6bfc26b7cb">6094513d</a>) Course info: Remove unused variables</li>
<li>[2018-03-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/82f724d67510c6dae44b0c5ae0d9b21e6b3523a9">82f724d6</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2469">GH#2469</a>) Internal: Remove call of setting "user_name_sort_by" not used anymore</li>
<li>[2018-03-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/6465b5c3e6fbd5231f234253ffe68b5dbc2357f6">6465b5c3</a>) Internal: Remove unused php_session_id</li>
<li>[2018-03-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/7a8d695278a6c5ca6e2ad94fc1b3a5feef50b82f">7a8d6952</a>) Internal: Remove unused file</li>
<li>[2018-03-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/3820130360e885ed7bc53f658913936910ae44b6">38201303</a>) Internal: Remove repository chamilo/pclzip. Library is added to packagist.</li>
<li>[2018-03-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/35ead262b2a5121fb4e7813c853d2de00ef10a9d">35ead262</a>) Internal: Remove custom repo PHPWord, PHPWord updated zend lib dependencies</li>
<li>[2018-03-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/285442e5ed3972bbd24d77ad9b34b2a842434c76">285442e5</a>) Internal: Remove use of create_function, replaced with anon function.</li>
<li>[2018-03-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/f38583cf0df8716caa6c7e5ab7b552403c396437">f38583cf</a>) Internal: Remove deprecated use "create_function" in compare rule - FormValidator Shows error in php 7.2</li>
</ul>
<h3>Known issues</h3>
<ul aria-role="log" aria-live="off">
</ul>
</div>
<div class="version" aria-role="article" aria-label="1.11.6">
@ -9626,11 +10382,14 @@ a simple videoconferencing interface.</p>
<li>Attendance</li>
<li>Blog</li>
<li>Calendar</li>
<li>Career</li>
<li>Chat</li>
<li>Description</li>
<li>CI (for Continuous Integration, automated tests, etc)</li>
<li>Course description</li>
<li>Course Progress</li>
<li>Cron</li>
<li>Dashboard</li>
<li>Display</li>
<li>Document</li>
<li>Dropbox</li>
<li>Quiz (not exercise)</li>
@ -9647,7 +10406,11 @@ a simple videoconferencing interface.</p>
<li>Maintenance</li>
<li>Message</li>
<li>Notebook</li>
<li>Optimization</li>
<li>Portfolio</li>
<li>Privacy</li>
<li>Search (for fulltext search)</li>
<li>Security</li>
<li>Session</li>
<li>Skill</li>
<li>Social (for social network)</li>

@ -768,6 +768,7 @@ If you have issues with files taking a long time to download, make sure you reco
rewrite ^/courses/([^/]+)/work/(.*)$ /main/work/download.php?file=work/$2&cDir=$1 last;
rewrite ^/courses/([^/]+)/(.*)$ /app/courses/$1/$2 last;
rewrite ^/session/([^/]+)/about/?$ /main/session/about.php?session_id=$1 last;
rewrite ^/course/([^/]+)/about/?$ /main/course_info/about.php?course_id=$1 last;
rewrite ^/badge/(\d+) /main/badge/issued.php?issue=$1 last;
rewrite ^/skill/(\d+)/user/(\d+)$ /main/badge/issued_all.php?skill=$1&user=$2 last;
rewrite ^/badge/(\d+)/user/(\d+)$ /main/badge/issued_all.php?skill=$1&user=$2 last;
@ -827,6 +828,102 @@ If you have issues with files taking a long time to download, make sure you reco
You cannot, however, only allow .htaccess files in the main httpd.conf file, as OS X will override it with the
domain-specific configuration file.
</div>
<h3>IIS</h3>
<div>
User @ullfindsmit on Github was kind enough to provide this IIS configuration after testing it based on our
configurations above. This has not been tested by the Chamilo team, but the rules look legit:<br /><br />
<pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;configuration&gt;
&lt;system.webServer&gt;
&lt;rewrite&gt;
&lt;rules&gt;
&lt;rule name="rule 1v" stopProcessing="true"&gt;
&lt;match url="^certificates/$" /&gt;
&lt;action type="Rewrite" url="/certificates/index.php?id=%1" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 2v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/?$" /&gt;
&lt;action type="Rewrite" url="/main/course_home/course_home.php?cDir={R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 3v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/index.php$" /&gt;
&lt;action type="Rewrite" url="/main/course_home/course_home.php?cDir={R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 4v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/scorm/(.*)$" /&gt;
&lt;action type="Rewrite" url="/main/document/download_scorm.php?doc_url=/{R:2}&amp;cDir={R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 5v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/document/certificates/(.*)$" /&gt;
&lt;action type="Rewrite" url="/app/courses/{R:1}/document/certificates/{R:2}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 6v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/document/(.*)$" /&gt;
&lt;action type="Rewrite" url="/main/document/download.php?doc_url=/{R:2}&amp;cDir={R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 7v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/upload/([^/]+)/(.*)$" /&gt;
&lt;action type="Rewrite" url="/main/document/download_uploaded_files.php?code={R:1}&amp;type={R:2}&amp;file={R:3}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 8v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/work/(.*)$" /&gt;
&lt;action type="Rewrite" url="/main/work/download.php?file=work/{R:2}&amp;cDir={R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 9v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/course-pic85x85.png$" /&gt;
&lt;action type="Rewrite" url="/main/inc/ajax/course.ajax.php?a=get_course_image&amp;code={R:1}&amp;image=course_image_source" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 10v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/course-pic.png$" /&gt;
&lt;action type="Rewrite" url="/main/inc/ajax/course.ajax.php?a=get_course_image&amp;code={R:1}&amp;image=course_image_large_source" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 11v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/(.*)$" /&gt;
&lt;action type="Rewrite" url="/app/courses/{R:1}/{R:2}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 12v" stopProcessing="true"&gt;
&lt;match url="^session/(\d{1,})/about/?$" /&gt;
&lt;action type="Rewrite" url="/main/session/about.php?session_id={R:1}" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 13v" stopProcessing="true"&gt;
&lt;match url="^badge/(\d{1,})" /&gt;
&lt;action type="Rewrite" url="/main/badge/issued.php?issue={R:1}" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 14v" stopProcessing="true"&gt;
&lt;match url="^skill/(\d{1,})/user/(\d{1,})" /&gt;
&lt;action type="Rewrite" url="/main/badge/issued_all.php?skill={R:1}&amp;user={R:2}" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 15v" stopProcessing="true"&gt;
&lt;match url="^badge/(\d{1,})/user/(\d{1,})" /&gt;
&lt;action type="Rewrite" url="/main/badge/issued_all.php?skill={R:1}&amp;user={R:2}" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 16v" stopProcessing="true"&gt;
&lt;match url="^main/exercice/(.*)$" /&gt;
&lt;action type="Rewrite" url="/main/exercise/{R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 17v" stopProcessing="true"&gt;
&lt;match url="^main/newscorm/(.*)$" /&gt;
&lt;action type="Rewrite" url="/main/lp/{R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 18v" stopProcessing="true"&gt;
&lt;match url="^service/(\d{1,})$" /&gt;
&lt;action type="Rewrite" url="/plugin/buycourses/src/service_information.php?service_id={R:1}" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 19v" stopProcessing="true"&gt;
&lt;match url="^([^/.]+)/?$" /&gt;
&lt;action type="Rewrite" url="/user.php?{R:1}" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 20v" stopProcessing="true"&gt;
&lt;match url="^(tests|.git)" ignoreCase="true" /&gt;
&lt;action type="Rewrite" url="/-" /&gt;
&lt;/rule&gt;
&lt;/rules&gt;
&lt;/rewrite&gt;
&lt;/system.webServer&gt;
&lt;/configuration&gt;
</pre>
</div>
<h2><a name="17._Git_Upgrade"></a>15. Upgrading from Git</h2>
If you have sufficient experience with Git and have installed your initial Chamilo portal

File diff suppressed because it is too large Load Diff

@ -876,7 +876,106 @@ Ce sont uniquement les redirections à placer dans un bloc server{}, comme les a
deny all;
}
</pre>
<hr style="width: 100%; height: 2px;" />
<h3>IIS</h3>
<div>
L'utilisateur @ullfindsmit sur Github a été bien aimable en nous partageant la configuration suivante
pour IIS, qu'il a testé au préalable. Ces règles sont basées sur les configurations ci-dessus et, bien
que nous n'ayons pas testé la configuration nous-même, elle est suffisamment proche de la configuration
d'Apache et de Nginx pour nous permettre de vous la suggérer ici:<br /><br />
<pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;configuration&gt;
&lt;system.webServer&gt;
&lt;rewrite&gt;
&lt;rules&gt;
&lt;rule name="rule 1v" stopProcessing="true"&gt;
&lt;match url="^certificates/$" /&gt;
&lt;action type="Rewrite" url="/certificates/index.php?id=%1" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 2v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/?$" /&gt;
&lt;action type="Rewrite" url="/main/course_home/course_home.php?cDir={R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 3v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/index.php$" /&gt;
&lt;action type="Rewrite" url="/main/course_home/course_home.php?cDir={R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 4v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/scorm/(.*)$" /&gt;
&lt;action type="Rewrite" url="/main/document/download_scorm.php?doc_url=/{R:2}&amp;cDir={R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 5v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/document/certificates/(.*)$" /&gt;
&lt;action type="Rewrite" url="/app/courses/{R:1}/document/certificates/{R:2}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 6v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/document/(.*)$" /&gt;
&lt;action type="Rewrite" url="/main/document/download.php?doc_url=/{R:2}&amp;cDir={R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 7v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/upload/([^/]+)/(.*)$" /&gt;
&lt;action type="Rewrite" url="/main/document/download_uploaded_files.php?code={R:1}&amp;type={R:2}&amp;file={R:3}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 8v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/work/(.*)$" /&gt;
&lt;action type="Rewrite" url="/main/work/download.php?file=work/{R:2}&amp;cDir={R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 9v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/course-pic85x85.png$" /&gt;
&lt;action type="Rewrite" url="/main/inc/ajax/course.ajax.php?a=get_course_image&amp;code={R:1}&amp;image=course_image_source" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 10v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/course-pic.png$" /&gt;
&lt;action type="Rewrite" url="/main/inc/ajax/course.ajax.php?a=get_course_image&amp;code={R:1}&amp;image=course_image_large_source" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 11v" stopProcessing="true"&gt;
&lt;match url="^courses/([^/]+)/(.*)$" /&gt;
&lt;action type="Rewrite" url="/app/courses/{R:1}/{R:2}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 12v" stopProcessing="true"&gt;
&lt;match url="^session/(\d{1,})/about/?$" /&gt;
&lt;action type="Rewrite" url="/main/session/about.php?session_id={R:1}" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 13v" stopProcessing="true"&gt;
&lt;match url="^badge/(\d{1,})" /&gt;
&lt;action type="Rewrite" url="/main/badge/issued.php?issue={R:1}" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 14v" stopProcessing="true"&gt;
&lt;match url="^skill/(\d{1,})/user/(\d{1,})" /&gt;
&lt;action type="Rewrite" url="/main/badge/issued_all.php?skill={R:1}&amp;user={R:2}" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 15v" stopProcessing="true"&gt;
&lt;match url="^badge/(\d{1,})/user/(\d{1,})" /&gt;
&lt;action type="Rewrite" url="/main/badge/issued_all.php?skill={R:1}&amp;user={R:2}" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 16v" stopProcessing="true"&gt;
&lt;match url="^main/exercice/(.*)$" /&gt;
&lt;action type="Rewrite" url="/main/exercise/{R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 17v" stopProcessing="true"&gt;
&lt;match url="^main/newscorm/(.*)$" /&gt;
&lt;action type="Rewrite" url="/main/lp/{R:1}" appendQueryString="true" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 18v" stopProcessing="true"&gt;
&lt;match url="^service/(\d{1,})$" /&gt;
&lt;action type="Rewrite" url="/plugin/buycourses/src/service_information.php?service_id={R:1}" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 19v" stopProcessing="true"&gt;
&lt;match url="^([^/.]+)/?$" /&gt;
&lt;action type="Rewrite" url="/user.php?{R:1}" /&gt;
&lt;/rule&gt;
&lt;rule name="rule 20v" stopProcessing="true"&gt;
&lt;match url="^(tests|.git)" ignoreCase="true" /&gt;
&lt;action type="Rewrite" url="/-" /&gt;
&lt;/rule&gt;
&lt;/rules&gt;
&lt;/rewrite&gt;
&lt;/system.webServer&gt;
&lt;/configuration&gt;
</pre>
</div>
<hr style="width: 100%; height: 2px;" />
<p>
<br />

@ -206,6 +206,10 @@ ALTER TABLE c_lp_item_view ADD INDEX idx_clpiv_c_i_v (c_id, id, view_count);
<pre>
CREATE INDEX idx_accessurs_sid ON access_url_rel_session (session_id);
</pre>
And finally, if you have lots of gradebook stuff, add this
<pre>
ALTER TABLE gradebook_result ADD INDEX idx_gb_uid_eid (user_id, evaluation_id);
</pre>
<hr />
<h2><a name="3.Indexes-caching"></a>3. Indexes caching</h2>
One good reference: <a href="http://dev.mysql.com/doc/refman/5.6/en/multiple-key-caches.html">MySQL documentation on multiple key caches</a><br />

@ -114,9 +114,9 @@ We officially recommend Debian and Ubuntu operating systems for their security,
<p>Chamilo includes a LDAP module that allows admin to disable database
authentication and replace it by connecting to a LDAP directory.</p>
<p>Client side, Chamilo runs on any browser : Firefox, MS Internet Explorer
<p>Client side, Chamilo runs on any browser : Firefox, Internet Explorer
(9+), Chrome, Safari, Opera, ...<br />
For better user experience, we recommend Firefox 3.5+ (you can download it
For better user experience, we recommend Firefox (you can download it
freely from <a href="http://getfirefox.com">http://getfirefox.com</a>).</p>
<h1>Chamilo.org</h1>

@ -106,36 +106,56 @@ This will prevent direct access to your settings and make it seem totally the sa
account we authorize overrides through .htaccess, we need to set
something that a .htaccess file cannot revert, and we need to set it
for each of those directories. This can be done as follows inside
your VirtualHost definition in Apache (you'll have to translate it for
Nginx configueations), where "/var/www/URL/" is the path of your VirtualHost web root:<br />
your VirtualHost definition in Apache, where "/var/www/URL/" is the path of your VirtualHost web root:<br />
<pre>
<Directory /var/www/URL/app/cache>
&lt;Directory /var/www/URL/app/cache&gt;
php_admin_value engine Off
</Directory>
<Directory /var/www/URL/app/courses>
&lt;/Directory&gt;
&lt;Directory /var/www/URL/app/courses&gt;
php_admin_value engine Off
</Directory>
<Directory /var/www/URL/app/home>
&lt;/Directory&gt;
&lt;Directory /var/www/URL/app/home&gt;
php_admin_value engine Off
</Directory>
<Directory /var/www/URL/app/logs>
&lt;/Directory&gt;
&lt;Directory /var/www/URL/app/logs&gt;
php_admin_value engine Off
</Directory>
<Directory /var/www/URL/app/upload>
&lt;/Directory&gt;
&lt;Directory /var/www/URL/app/upload&gt;
php_admin_value engine Off
</Directory>
<Directory /var/www/URL/main/default_course_document/images>
&lt;/Directory&gt;
&lt;Directory /var/www/URL/app/Resources/public/css>
php_admin_value engine Off
</Directory>
<Directory /var/www/URL/main/lang>
&lt;/Directory&gt;
&lt;Directory /var/www/URL/main/default_course_document/images&gt;
php_admin_value engine Off
</Directory>
<Directory /var/www/URL/web/css>
&lt;/Directory&gt;
&lt;Directory /var/www/URL/main/lang&gt;
php_admin_value engine Off
</Directory>
&lt;/Directory&gt;
&lt;Directory /var/www/URL/web/css&gt;
php_admin_value engine Off
&lt;/Directory&gt;
</pre>
For Nginx, this would look like the following rules. However, do
remember that Nginx interprets rules in order of appearance, so these
rules would have to be at the top of your location rules to take the
highest priority:
<pre>
location ~ ^/app/(cache|courses|home|logs|upload|Resources/public/css)/.*\.ph(p[3457]?|t|tml|ar)$ {
deny all;
}
location ~ ^/main/default_course_document/images/.*\.ph(p[3457]?|t|tml|ar)$ {
deny all;
}
location ~ ^/main/lang/.*\.ph(p[3457]?|t|tml|ar)$ {
deny all;
}
location ~ ^/web/css/.*\.ph(p[3457]?|t|tml|ar)$ {
deny all;
}
</pre>
<br />
<hr />
<h2><a name="6.HSTS">HTTP Headers Security</a></h2>
<p>A relatively recent development in web security, HTTP headers can be modified either

@ -17,17 +17,20 @@ define('CHAMILO_LOAD_WYSIWYG', false);
$cidReset = true;
require_once 'main/inc/global.inc.php';
$allow = api_get_configuration_value('plugin_redirection_enabled');
if ($allow) {
// The section (for the tabs).
$this_section = SECTION_CAMPUS; //rewritten below if including HTML file
$includeFile = !empty($_GET['include']);
if ($includeFile) {
$this_section = SECTION_INCLUDE;
} elseif (api_get_configuration_value('plugin_redirection_enabled')) {
RedirectionPlugin::redirectUser(api_get_user_id());
}
// The section (for the tabs).
$this_section = SECTION_CAMPUS;
$header_title = null;
if (!api_is_anonymous()) {
$header_title = ' ';
}
$controller = new IndexManager($header_title);
//Actions
$loginFailed = isset($_GET['loginFailed']) ? true : isset($loginFailed);
@ -99,24 +102,32 @@ if (!empty($_POST['submitAuth'])) {
// Only if login form was not sent because if the form is sent the user was already on the page.
Event::open();
}
if (!api_is_anonymous()) {
$url = api_get_configuration_value('redirect_index_to_url_for_logged_users');
if (!empty($url)) {
header("Location: $url");
exit;
}
}
if (api_get_setting('display_categories_on_homepage') === 'true') {
$controller->tpl->assign('course_category_block', $controller->return_courses_in_categories());
}
$controller->set_login_form();
//@todo move this inside the IndexManager
if (!api_is_anonymous()) {
$controller->tpl->assign('profile_block', $controller->return_profile_block());
$controller->tpl->assign('user_image_block', $controller->return_user_image_block());
if (api_is_platform_admin()) {
$controller->tpl->assign('course_block', $controller->return_course_block());
} else {
$controller->tpl->assign('teacher_block', $controller->return_teacher_link());
}
$controller->tpl->assign('course_block', $controller->return_course_block());
}
$hot_courses = '';
$hotCourses = '';
$announcements_block = '';
// Display the Site Use Cookie Warning Validation
$useCookieValidation = api_get_setting('cookie_warning');
if ($useCookieValidation === 'true') {
if (isset($_POST['acceptCookies'])) {
api_set_site_use_cookie_warning_cookie();
@ -132,14 +143,26 @@ if ($useCookieValidation === 'true') {
// When loading a chamilo page do not include the hot courses and news
if (!isset($_REQUEST['include'])) {
if (api_get_setting('show_hot_courses') == 'true') {
$hot_courses = $controller->return_hot_courses();
$hotCourses = $controller->return_hot_courses();
}
$announcements_block = $controller->return_announcements();
}
$controller->tpl->assign('hot_courses', $hot_courses);
if (api_get_configuration_value('show_hot_sessions') === true) {
$hotSessions = SessionManager::getHotSessions();
$controller->tpl->assign('hot_sessions', $hotSessions);
}
$controller->tpl->assign('hot_courses', $hotCourses);
$controller->tpl->assign('announcements_block', $announcements_block);
$controller->tpl->assign('home_page_block', $controller->return_home_page());
$controller->tpl->assign('navigation_course_links', $controller->return_navigation_links());
if ($includeFile) {
// If we are including a static page, then home_welcome is empty
$controller->tpl->assign('home_welcome', '');
$controller->tpl->assign('home_include', $controller->return_home_page($includeFile));
} else {
// If we are including the real homepage, then home_include is empty
$controller->tpl->assign('home_welcome', $controller->return_home_page(false));
$controller->tpl->assign('home_include', '');
}
$controller->tpl->assign('navigation_links', $controller->return_navigation_links());
$controller->tpl->assign('notice_block', $controller->return_notice());
//$controller->tpl->assign('main_navigation_block', $controller->return_navigation_links());
$controller->tpl->assign('help_block', $controller->return_help());

@ -312,7 +312,7 @@ if ($verified) {
// Student Session inscription
if ($data['newStatus'] == ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED) {
SessionManager::subscribe_users_to_session(
SessionManager::subscribeUsersToSession(
$data['sessionId'],
[$data['studentUserId']],
null,

@ -44,7 +44,7 @@ if (SessionManager::isUserSubscribedAsStudent(
$tpl->assign('is_subscribed', false);
$tpl->assign('errorMessages', $plugin->getErrorMessages());
} else {
SessionManager::subscribe_users_to_session(
SessionManager::subscribeUsersToSession(
$_GET['session_id'],
[$_GET['user_id']],
SESSION_VISIBLE_READ_ONLY,

@ -28,19 +28,20 @@ ALTER TABLE plugin_bbb_meeting ADD access_url int NOT NULL DEFAULT 1;
```
For version 2.5 you need execute these SQL queries
```sql
CREATE TABLE plugin_bbb_room (
CREATE TABLE IF NOT EXISTS plugin_bbb_room (
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
meeting_id int(10) unsigned NOT NULL,
participant_id int(11) NOT NULL,
in_at datetime NOT NULL,
out_at datetime NOT NULL,
FOREIGN KEY (meeting_id) REFERENCES plugin_bbb_meeting (id),
FOREIGN KEY (participant_id) REFERENCES user (id)
out_at datetime NOT NULL
);
ALTER TABLE plugin_bbb_meeting ADD video_url TEXT NULL;
ALTER TABLE plugin_bbb_meeting ADD has_video_m4v TINYINT NOT NULL DEFAULT 0;
ALTER TABLE plugin_bbb_meeting ADD COLUMN video_url TEXT NULL;
ALTER TABLE plugin_bbb_meeting ADD COLUMN has_video_m4v TINYINT NOT NULL DEFAULT 0;
ALTER TABLE plugin_bbb_meeting ADD COLUMN user_id INT DEFAULT 0;
ALTER TABLE plugin_bbb_meeting ADD COLUMN access_url INT DEFAULT 0;
ALTER TABLE plugin_bbb_meeting ADD COLUMN remote_id char(30);
ALTER TABLE plugin_bbb_meeting ADD COLUMN visibility TINYINT NOT NULL DEFAULT 1;
ALTER TABLE plugin_bbb_meeting ADD COLUMN session_id INT DEFAULT 0;
```
For version 2.6 (adding limits) you need execute these SQL queries
```sql
@ -48,3 +49,11 @@ INSERT INTO settings_current (variable, subkey, type, category, selected_value,
INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, default_value, field_order, visible_to_self, visible_to_others, changeable, filter, created_at) VALUES (2, 15, 'plugin_bbb_course_users_limit', 'MaxUsersInConferenceRoom', '0', 1, 1, 0, 1, null, '2017-05-28 01:19:32');
INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, default_value, field_order, visible_to_self, visible_to_others, changeable, filter, created_at) VALUES (3, 15, 'plugin_bbb_session_users_limit', 'MaxUsersInConferenceRoom', null, 1, 1, 0, 1, null, '2017-05-28 01:19:32');
```
For version 2.7
```sql
ALTER TABLE plugin_bbb_meeting ADD COLUMN interface INT NOT NULL DEFAULT 0;
ALTER TABLE plugin_bbb_room ADD COLUMN interface INT NOT NULL DEFAULT 0;
ALTER TABLE plugin_bbb_room MODIFY COLUMN in_at datetime;
ALTER TABLE plugin_bbb_room MODIFY COLUMN out_at datetime;
```

@ -1,11 +1,13 @@
<?php
/* For license terms, see /license.txt */
use Chamilo\UserBundle\Entity\User;
/**
* This script initiates a video conference session, calling the BigBlueButton API.
*
* @package chamilo.plugin.bigbluebutton
*/
use Chamilo\UserBundle\Entity\User;
$course_plugin = 'bbb'; //needed in order to load the plugin lang variables
$cidReset = true;
@ -43,13 +45,12 @@ if ($form->validate()) {
$meetings = $bbb->getMeetings(0, 0, 0, true, $dateRange);
foreach ($meetings as &$meeting) {
$participants = $bbb->findMeetingParticipants($meeting['id']);
$participants = $bbb->findConnectedMeetingParticipants($meeting['id']);
foreach ($participants as $meetingParticipant) {
/** @var User $participant */
$participant = $meetingParticipant['participant'];
$meeting['participants'][] = $participant->getCompleteName()
.' ('.$participant->getEmail().')';
$meeting['participants'][] = $participant->getCompleteName().' ('.$participant->getEmail().')';
}
}
@ -104,7 +105,7 @@ $tpl = new Template($tool_name);
$tpl->assign('meetings', $meetings);
$tpl->assign('search_form', $form->returnForm());
$content = $tpl->fetch('bbb/admin.tpl');
$content = $tpl->fetch('bbb/view/admin.tpl');
if ($meetings) {
$actions = Display::toolbarButton(

@ -1,37 +1,33 @@
Version 2.7 - 2018-07
---------------------
* Add interface option (HTML5 or Flash)
Version 2.6 - 2017-05
---------------------
* Add max users limit
* Requires the following database changes
* INSERT INTO chamilo111x.settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url, access_url_changeable, access_url_locked) VALUES ('bbb_max_users_limit', 'bbb', 'setting', 'Plugins', '3', 'bbb', null, null, null, 1, 1, 0);
* INSERT INTO chamilo111x.extra_field (extra_field_type, field_type, variable, display_text, default_value, field_order, visible_to_self, visible_to_others, changeable, filter, created_at) VALUES (2, 15, 'plugin_bbb_course_users_limit', 'MaxUsersInConferenceRoom', '0', 1, 1, 0, 1, null, '2017-05-28 01:19:32');
* INSERT INTO chamilo111x.extra_field (extra_field_type, field_type, variable, display_text, default_value, field_order, visible_to_self, visible_to_others, changeable, filter, created_at) VALUES (3, 15, 'plugin_bbb_session_users_limit', 'MaxUsersInConferenceRoom', null, 1, 1, 0, 1, null, '2017-05-28 01:19:32');
Version 2.5 - 2016-07
---------------------
* User global conference support
* Requires a database change: "ALTER TABLE plugin_bbb_meeting ADD COLUMN user_id INT DEFAULT 0"
* Requires a database change: "ALTER TABLE plugin_bbb_meeting ADD COLUMN access_url INT DEFAULT 0"
Version 2.4 - 2016-05
------------------------
Changes:
* Global conference support (Requires to update the plugin settings).
* Course group conference support
* Requires a database change: "ALTER TABLE plugin_bbb_meeting ADD COLUMN group_id INT DEFAULT 0"
* Requires to update the plugin settings.
Version 2.3 - 2015-05-18
------------------------
Changes:
* Added support for variable voiceBridge to be sent on meeting creation. See https://code.google.com/p/bigbluebutton/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Component%20Summary&groupby=&sort=&id=1186 and https://support.chamilo.org/issues/7669 for details.
* Requires a database change: "ALTER TABLE plugin_bbb_meeting ADD COLUMN voice_bridge INT NOT NULL DEFAULT 1;"
* Added support for variable voiceBridge to be sent on meeting creation. See:
https://code.google.com/p/bigbluebutton/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Component%20Summary&groupby=&sort=&id=1186
and https://support.chamilo.org/issues/7669 for details.
Version 2.2 - 2014-10-15
------------------------
Changes:
* Add a pseudo-random guid to avoid clashing conferences when several Chamilo portals use the same server. If you were using this plugin before, you will have to update the plugin_bbb_meeting table to "alter table plugin_bbb_meeting add column remote_id char(36);".
* Add possibility to hide recordings of previous conferences from the list. If you were using this plugin before, you will have to update the plugin_bbb_meeting table to "alter table plugin_bbb_meeting add column visibility tinytint not null default 1;".
* Add a pseudo-random guid to avoid clashing conferences when several Chamilo portals use the same server.
* Add possibility to hide recordings of previous conferences from the list.
* Show action icons in the action column
* Hide the ID of the meeting (this was an internal ID, useless to the final user). It is still in the HTML source, however
* Show number of minutes of the recording (in the recordings list)
@ -39,8 +35,7 @@ Changes:
Version 2.1
-----------
Released with: Chamilo LMS 1.9.8
Changes:
* now supports sessions (requires you to "alter table plugin_bbb_meeting add column session_id int default 0;")
* Session support
Version 2.0
-----------

@ -1,9 +1,5 @@
<?php
/**
* @copyright (c) 2012 University of Geneva
* @license GNU General Public License - http://www.gnu.org/copyleft/gpl.html
* @author Laurent Opprecht <laurent@opprecht.info>
*/
/* License: see /license.txt */
// Needed in order to show the plugin title
$strings['plugin_title'] = "Videoconference";
$strings['plugin_comment'] = "Add a videoconference room in a Chamilo course using BigBlueButton (BBB)";
@ -66,4 +62,13 @@ $strings['MaxXUsersReached'] = 'The limit of %s simultaneous users has been reac
$strings['MaxXUsersReachedManager'] = 'The limit of %s simultaneous users has been reached for this conference room. To increase this limit, please contact the platform administrator.';
$strings['MaxUsersInConferenceRoom'] = 'Max simultaneous users in a conference room';
$strings['global_conference_allow_roles'] = "Global conference link only visible for this user roles";
$strings['CreatedAt'] = "Created at";
$strings['CreatedAt'] = 'Created at';
$strings['interface'] = 'Default Interface';
$strings['launch_type'] = 'Client launch choice';
$strings['EnterConferenceFlash'] = 'Enter the videoconference (Flash client)';
$strings['EnterConferenceHTML5'] = 'Enter the videoconference (HTML5 client)';
$strings['ParticipantsWillUseSameInterface'] = 'Participants will use the same interface as you';
$strings['SetByStudent'] = 'Set by student';
$strings['SetByTeacher'] = 'Set by teacher';
$strings['SetByDefault'] = 'Set to default interface';

@ -13,25 +13,38 @@ $strings['CloseMeeting'] = "Fermer la session";
$strings['VideoConferenceXCourseX'] = "Vidéoconférence #%s, cours %s";
$strings['VideoConferenceAddedToTheCalendar'] = "Vidéoconférence ajoutée au calendrier";
$strings['VideoConferenceAddedToTheLinkTool'] = "Vidéoconférence ajoutée comme lien. Vous pouvez éditer et publier le lien sur la page principale du cours depuis l'outil liens.";
$strings['GoToTheVideoConference'] = "Entrer dans la salle de conférence";
$strings['Records'] = "Enregistrement";
$strings['Meeting'] = "Salle de conférence";
$strings['ViewRecord'] = "Voir l'enregistrement";
$strings['CopyToLinkTool'] = "Ajouter comme lien du cours";
$strings['EnterConference'] = "Entrer dans la salle de conférence";
$strings['RecordList'] = "Liste des enregistrements";
$strings['ServerIsNotRunning'] = "Le serveur de vidéoconférence ne fonctionne pas";
$strings['ServerIsNotConfigured'] = "Le serveur de vidéoconférence n'est pas configuré correctement";
$strings['XUsersOnLine'] = "%s utilisateurs dans la salle";
$strings['host'] = 'Hôte de BigBlueButton';
$strings['host_help'] = "C'est le nom du serveur où le serveur de vidéoconférence a été habilité. Cela peut être localhost, une adresse IP (du genre 192.168.13.54) ou un nom de domaine (du genre ma.video.com).";
$strings['salt'] = 'Clef BigBlueButton';
$strings['salt_help'] = "C'est la clef de sécurité de votre serveur BigBlueButton (appelée 'salt' en anglais) qui permet à votre serveur de vérifier l'identité de votre installation de Chamilo et ainsi l'autoriser à se connecter. Veuillez vous référer à la documentation de BigBlueButton pour la localiser, ou utilisez la commande 'bbb-conf --salt' si vous disposez d'un accès en ligne de commande au serveur de vidéoconférence.";
$strings['tool_enable'] = 'Outil de vidéoconférence BigBlueButton activé';
$strings['tool_enable_help'] = "Choisissez si vous souhaitez activer l'outil de vidéoconférence BigBlueButton.
Une fois activé, il apparaîtra comme un outil additionnel sur toutes les pages principales de cours, et les enseignants pourront démarrer une conférence à n'importe quel moment. Les étudiants ne pourront pas lancer de nouvelle session de conférence, seulement se joindre à une session existante. Si vous ne disposez pas d'un serveur de vidéoconférence BigBlueButton, veuillez <a target=\"_blank\" href=\"http://bigbluebutton.org/\">en installer un</a> avant de poursuivre, ou demander un devis à l'un des fournisseurs officiels de Chamilo. BigBlueButton est un outil de logiciel libre (et gratuit), mais son installation pourrait présenter une certaine complexité et demander des compétences qui ne sont peut-être pas à la portée de tous. Vous pouvez l'installer vous-même à partir de la documentation (disponible publiquement) de BigBlueButton, ou recherchez un soutien professionnel. Ce soutien pourrait générer certains coûts (au moins le temps de la personne qui vous assiste dans l'opération). Dans le plus pur esprit du logiciel libre, nous vous fournissons les outils pour simplifier votre travail dans la mesure de nos possibilités, et nous vous recommandons des professionnels (les fournisseurs officiels de Chamilo) pour vous venir en aide au cas où ceux-ci seraient insuffisants.<br />";
$strings['big_blue_button_welcome_message'] = 'Message de bienvenue de BigBlueButton';
$strings['enable_global_conference'] = 'Activer les conférences globales';
$strings['enable_global_conference_per_user'] = 'Activer les conférences globales par utilisateur';
$strings['enable_conference_in_course_groups'] = 'Activer les conférences dans les groupes';
$strings['enable_global_conference_link'] = 'Activer le lien vers la conférence globale sur la page principale';
$strings['big_blue_button_record_and_store'] = 'Enregistrer les sessions de vidéoconférence';
$strings['bbb_enable_conference_in_groups'] = 'Permettre la création de vidéoconférence pour les groupes';
$strings['plugin_tool_bbb'] = 'Vidéo';
@ -50,3 +63,12 @@ $strings['MaxXUsersReachedManager'] = 'La limite de %s utilisateurs simultanés
$strings['MaxUsersInConferenceRoom'] = 'Nombre max d\'utilisateurs simultanés dans une salle de conférence';
$strings['global_conference_allow_roles'] = "Visibilité du lien de vidéo conférence global pour les profils suivant";
$strings['CreatedAt'] = "Créé à";
$strings['interface'] = 'Interface par défaut';
$strings['launch_type'] = 'Type d\'interface au lancement';
$strings['EnterConferenceFlash'] = 'Entrer dans la salle de conférence (Flash)';
$strings['EnterConferenceHTML5'] = 'Entrer dans la salle de conférence (HTML5)';
$strings['ParticipantsWillUseSameInterface'] = 'Les apprenants utiliseront la même interface que vous';
$strings['SetByDefault'] = 'Lancement de l\'interface par défaut';
$strings['SetByTeacher'] = 'Choisi par le professeur';
$strings['SetByStudent'] = 'Choisi par l\'apprenant';

@ -63,3 +63,12 @@ $strings['MaxXUsersReachedManager'] = 'The limit of %s simultaneous users has be
$strings['MaxUsersInConferenceRoom'] = 'Max simultaneous users in a conference room';
$strings['global_conference_allow_roles'] = "Globaler Konferenz-Link nur für diese Benutzerrollen sichtbar";
$strings['CreatedAt'] = "Erstellt am";
$strings['interface'] = 'Standardbenutzeroberfläche';
$strings['launch_type'] = 'Wahl der Benutzeroberfläche beim Start';
$strings['EnterConferenceFlash'] = 'Videokonferenz starten (Flash-Client)';
$strings['EnterConferenceHTML5'] = 'Videokonferenz starten (HTML5-Client)';
$strings['ParticipantsWillUseSameInterface'] = 'Die Teilnehmer verwenden dieselbe Benutzeroberfläche wie Sie';
$strings['SetByDefault'] = 'Auf die Standardbenutzeroberfläche einstellen';
$strings['SetByTeacher'] = 'Set von Lehrer';
$strings['SetByStudent'] = 'Set von Teilnehmer';

@ -1,6 +1,6 @@
<?php
/* License: see /license.txt */
//Needed in order to show the plugin title
// Needed in order to show the plugin title
$strings['plugin_title'] = "Videoconferencia";
$strings['plugin_comment'] = "Añade una sala de videoconferencia en los cursos de Chamilo con BigBlueButton (BBB)";
@ -40,14 +40,18 @@ $strings['tool_enable_help'] = "Escoja si desea activar la herramienta de videoc
Una vez activada, se mostrará como una herramienta adicional en todas las páginas principales de cursos, y los profesores podrán iniciar una conferencia en cualquier momento. Los estudiantes no podrían lanzar una conferencia, solo juntarse a una existente. Si no tiene un servidor de videoconferencia BigBlueButton, por favor <a target=\"_blank\" href=\"http://bigbluebutton.org/\">configure uno</a> antes de seguir, o pida una cotización a uno de los proveedores oficiales de Chamilo. BigBlueButton es una herramienta de software libre (y gratuita), pero su instalación requiere de competencias que quizás no sean inmediatamente disponibles para todos. Puede instalarla usted mismo o buscar ayuda profesional. Esta ayuda podría no obstante generar algunos costos (por lo menos el tiempo de la persona quien lo ayude). En el puro espíritu del software libre, le ofrecemos las herramientas para hacer su trabajo más simple, en la medida de nuestras posibilidades, y le recomendamos profesionales (los proveedores oficiales de Chamilo) para ayudarlo en caso esto fuera demasiado complicado.<br />";
$strings['big_blue_button_welcome_message'] = 'Mensaje de bienvenida de BigBlueButton';
$strings['enable_global_conference'] = 'Activar la conferencia global';
$strings['enable_global_conference_per_user'] = 'Activar la conferencia global por usuario';
$strings['enable_conference_in_course_groups'] = 'Activar las conferencias en grupos';
$strings['enable_global_conference_link'] = 'Actvivar el enlace hacia la conferencia global desde la página principal';
$strings['big_blue_button_record_and_store'] = 'Grabar las sesiones de videoconferencia.';
$strings['bbb_enable_conference_in_groups'] = 'Activar la creación de videoconferencia en los grupos.';
$strings['plugin_tool_bbb'] = 'Video';
$strings['plugin_tool_bbb'] = 'Videoconferencia';
$strings['ThereAreNotRecordingsForTheMeetings'] = 'No hay grabaciones de sesiones de videoconferencia';
$strings['NoRecording'] = 'No hay grabación';
$strings['ClickToContinue'] = 'Hacer click para continuar';
$strings['NoGroup'] = 'No hay grupo';
$strings['UrlMeetingToShare'] = 'URL a compartir';
$strings['AdminView'] = 'Vista para administradores';
@ -57,3 +61,14 @@ $strings['MaxXUsersWarning'] = 'Esta sala de conferencia es limitada a un máxim
$strings['MaxXUsersReached'] = 'El límite de %s usuarios simultáneos ha sido alcanzado en esta sala de conferencia. Por favor refresque la página en unos minutos para ver si un asiento se ha liberado, o espere la apertura de una nueva sala para poder participar.';
$strings['MaxXUsersReachedManager'] = 'El límite de %s usuarios simultáneos ha sido alcanzado en esta sala de conferencia. Para aumentar el límite, contáctese con el administrador del portal.';
$strings['MaxUsersInConferenceRoom'] = 'Número máximo de usuarios simultáneos en una sala de conferencia';
$strings['global_conference_allow_roles'] = 'El enlace para la videoconferencia ';
$strings['CreatedAt'] = 'Creado el';
$strings['interface'] = 'Interfaz por defecto';
$strings['launch_type'] = 'Elección de la interfaz en el lanzamiento';
$strings['EnterConferenceFlash'] = 'Ingresar a la conferencia (con Flash)';
$strings['EnterConferenceHTML5'] = 'Ingresar a la conferencia (con HTML5)';
$strings['ParticipantsWillUseSameInterface'] = 'Los participantes usarán la misma interfaz que Ud';
$strings['SetByDefault'] = 'Lanzamiento con la interfaz por defecto';
$strings['SetByTeacher'] = 'Elegido por el profesor';
$strings['SetByStudent'] = 'Elegido por el alumno';

@ -113,13 +113,18 @@ class bbb
$this->salt = $bbb_salt;
$info = parse_url($bbb_host);
$this->url = $bbb_host.'/bigbluebutton/';
if (isset($info['scheme'])) {
$this->protocol = $info['scheme'].'://';
$this->url = str_replace($this->protocol, '', $this->url);
$urlWithProtocol = $bbb_host;
} else {
$urlWithProtocol = '://'.$bbb_host;
}
// Setting BBB api
define('CONFIG_SECURITY_SALT', $this->salt);
define('CONFIG_SERVER_URL_WITH_PROTOCOL', $urlWithProtocol);
define('CONFIG_SERVER_BASE_URL', $this->url);
$this->api = new BigBlueButtonBN();
@ -228,7 +233,7 @@ class bbb
$extraValue = new ExtraFieldValue('course');
$value = $extraValue->get_values_by_handler_and_field_id($this->courseId, $fieldId[0]['id']);
if (!empty($value['value'])) {
$courseLimit = $value['value'];
$courseLimit = (int) $value['value'];
}
}
if (!empty($this->sessionId)) {
@ -239,7 +244,7 @@ class bbb
$extraValue = new ExtraFieldValue('session');
$value = $extraValue->get_values_by_handler_and_field_id($this->sessionId, $fieldId[0]['id']);
if (!empty($value['value'])) {
$sessionLimit = $value['value'];
$sessionLimit = (int) $value['value'];
}
}
if (!empty($sessionLimit)) {
@ -247,7 +252,7 @@ class bbb
} elseif (!empty($courseLimit)) {
return $courseLimit;
}
return $limit;
return (int) $limit;
}
/**
@ -333,6 +338,14 @@ class bbb
$params['created_at'] = api_get_utc_datetime();
$params['access_url'] = $this->accessUrl;
// Check interface feature is installed
$interfaceFeature = $this->plugin->get('interface');
if ($interfaceFeature === false) {
if (isset($params['interface'])) {
unset($params['interface']);
}
}
$id = Database::insert($this->table, $params);
if ($id) {
@ -395,34 +408,38 @@ class bbb
* Save a participant in a meeting room
* @param int $meetingId
* @param int $participantId
* @param int $interface
*
* @return false|int The last inserted ID. Otherwise return false
*/
public function saveParticipant($meetingId, $participantId)
public function saveParticipant($meetingId, $participantId, $interface = 0)
{
$params = [
'meeting_id' => $meetingId,
'participant_id' => $participantId,
'in_at' => api_get_utc_datetime(),
'out_at' => api_get_utc_datetime()
];
if ($this->plugin->get('interface') !== false) {
$params['interface'] = $interface;
}
return Database::insert(
'plugin_bbb_room',
[
'meeting_id' => $meetingId,
'participant_id' => $participantId,
'in_at' => api_get_utc_datetime(),
'out_at' => api_get_utc_datetime()
]
$params
);
}
/**
* Tells whether the given meeting exists and is running
* (using course code as name)
* @param string $meetingName Meeting name (usually the course code)
* @param string $meetingName
*
* @return bool True if meeting exists, false otherwise
* @assert ('') === false
* @assert ('abcdefghijklmnopqrstuvwxyzabcdefghijklmno') === false
* @return array
*/
public function meetingExists($meetingName)
public function getMeetingByName($meetingName)
{
if (empty($meetingName)) {
return false;
return [];
}
$courseId = api_get_course_int_id();
@ -457,16 +474,27 @@ class bbb
'first'
);
if ($this->debug) {
error_log("meeting_exists ".print_r($meetingData, 1));
error_log('meeting_exists '.print_r($meetingData, 1));
}
if (empty($meetingData)) {
return false;
} else {
return true;
}
return $meetingData;
}
/**
* Tells whether the given meeting exists and is running
* (using course code as name)
* @param string $meetingName Meeting name (usually the course code)
*
* @return bool True if meeting exists, false otherwise
* @assert ('') === false
* @assert ('abcdefghijklmnopqrstuvwxyzabcdefghijklmno') === false
*/
public function meetingExists($meetingName)
{
$meetingData = $this->getMeetingByName($meetingName);
return !empty($meetingData);
}
/**
@ -565,14 +593,15 @@ class bbb
$url = false;
if ($meetingInfoExists) {
$joinParams = array(
$joinParams = [
'meetingId' => $meetingData['remote_id'], // -- REQUIRED - A unique id for the meeting
'username' => $this->userCompleteName, //-- REQUIRED - The name that will display for the user in the meeting
'password' => $pass, //-- REQUIRED - The attendee or moderator password, depending on what's passed here
//'createTime' => api_get_utc_datetime(), //-- OPTIONAL - string. Leave blank ('') unless you set this correctly.
'userID' => api_get_user_id(), //-- OPTIONAL - string
'webVoiceConf' => '' // -- OPTIONAL - string
);
'webVoiceConf' => '', // -- OPTIONAL - string
'interface' => $this->checkInterface($meetingData),
];
$url = $this->api->getJoinMeetingURL($joinParams);
$url = $this->protocol.$url;
}
@ -836,14 +865,15 @@ class bbb
$item['unpublish_url'] = $this->unPublishUrl($meetingBBB);
if ($meetingDB['status'] == 1) {
$joinParams = array(
$joinParams = [
'meetingId' => $meetingDB['remote_id'], //-- REQUIRED - A unique id for the meeting
'username' => $this->userCompleteName, //-- REQUIRED - The name that will display for the user in the meeting
'password' => $pass, //-- REQUIRED - The attendee or moderator password, depending on what's passed here
'createTime' => '', //-- OPTIONAL - string. Leave blank ('') unless you set this correctly.
'userID' => '', // -- OPTIONAL - string
'webVoiceConf' => '' // -- OPTIONAL - string
);
'webVoiceConf' => '', // -- OPTIONAL - string
'interface' => $this->checkInterface($meetingDB),
];
$item['go_url'] = $this->protocol.$this->api->getJoinMeetingURL($joinParams);
}
$item = array_merge($item, $meetingDB, $meetingBBB);
@ -856,6 +886,42 @@ class bbb
return $newMeetingList;
}
/**
* @param $meetingInfo
*
* @return int
*/
public function checkInterface($meetingInfo)
{
$interface = BBBPlugin::LAUNCH_TYPE_DEFAULT;
$type = $this->plugin->get('launch_type');
switch ($type) {
case BBBPlugin::LAUNCH_TYPE_DEFAULT:
$interface = $this->plugin->get('interface');
break;
case BBBPlugin::LAUNCH_TYPE_SET_BY_TEACHER:
if (isset($meetingInfo['interface'])) {
$interface = $meetingInfo['interface'];
}
break;
case BBBPlugin::LAUNCH_TYPE_SET_BY_STUDENT:
if (isset($meetingInfo['id'])) {
$roomInfo = $this->getMeetingParticipantInfo($meetingInfo['id'], api_get_user_id());
if (!empty($roomInfo) && isset($roomInfo['interface'])) {
$interface = $roomInfo['interface'];
} else {
if (isset($_REQUEST['interface'])) {
$interface = isset($_REQUEST['interface']) ? (int) $_REQUEST['interface'] : 0;
}
}
}
break;
}
return $interface;
}
/**
* Function disabled
*/
@ -1334,6 +1400,7 @@ class bbb
/**
* Get the meeting info from DB by its name
* @param string $name
*
* @return array
*/
public function findMeetingByName($name)
@ -1348,16 +1415,34 @@ class bbb
return $meetingData;
}
/**
* Get the meeting info from DB by its name
* @param int $id
*
* @return array
*/
public function getMeeting($id)
{
$meetingData = Database::select(
'*',
'plugin_bbb_meeting',
array('where' => array('id = ?' => $id)),
'first'
);
return $meetingData;
}
/**
* @param int $meetingId
* @return array
*/
public function findMeetingParticipants($meetingId)
public function findConnectedMeetingParticipants($meetingId)
{
$meetingData = Database::select(
'*',
'plugin_bbb_room',
array('where' => array('meeting_id = ?' => intval($meetingId)))
array('where' => array('meeting_id = ? AND in_at IS NOT NULL' => $meetingId))
);
$participantIds = [];
$return = [];
@ -1381,6 +1466,28 @@ class bbb
return $return;
}
/**
* @param int $meetingId
* @param int $userId
*
* @return array
*/
public function getMeetingParticipantInfo($meetingId, $userId)
{
$meetingData = Database::select(
'*',
'plugin_bbb_room',
array('where' => array('meeting_id = ? AND participant_id = ?' => [$meetingId, $userId])),
'first'
);
if ($meetingData) {
return $meetingData;
}
return [];
}
/**
* @param array $meetingInfo
* @param array $recordInfo

@ -219,8 +219,16 @@ class BigBlueButtonBN {
if (((isset($joinParams['createTime'])) && ($joinParams['createTime'] != ''))) {
$params .= '&createTime='.urlencode($joinParams['createTime']);
}
if (isset($joinParams['interface']) && (int) $joinParams['interface'] === BBBPlugin::INTERFACE_HTML5) {
$bbbHost = api_remove_trailing_slash(CONFIG_SERVER_URL_WITH_PROTOCOL);
$params .= '&redirectClient=true&clientURL='.$bbbHost.'/html5client/join';
}
// Return the URL:
return ($joinUrl.$params.'&checksum='.sha1("join".$params.$this->_securitySalt));
$url = $joinUrl.$params.'&checksum='.sha1('join'.$params.$this->_securitySalt);
return $url;
}
public function getEndMeetingURL($endParams) {

@ -1,5 +1,6 @@
<?php
/* For licensing terms, see /license.txt */
/* To show the plugin course icons you need to add these icons:
* main/img/icons/22/plugin_name.png
* main/img/icons/64/plugin_name.png
@ -8,12 +9,19 @@
/**
* Videoconference plugin with BBB
*/
//namespace Chamilo\Plugin\BBB;
/**
* Class BBBPlugin
*/
class BBBPlugin extends Plugin
{
const INTERFACE_FLASH = 0;
const INTERFACE_HTML5 = 1;
const LAUNCH_TYPE_DEFAULT = 0;
const LAUNCH_TYPE_SET_BY_TEACHER = 1;
const LAUNCH_TYPE_SET_BY_STUDENT = 2;
public $isCoursePlugin = true;
// When creating a new course this settings are added to the course
@ -34,7 +42,7 @@ class BBBPlugin extends Plugin
protected function __construct()
{
parent::__construct(
'2.6',
'2.7',
'Julio Montoya, Yannick Warnier, Angel Fernando Quiroz Campos',
[
'tool_enable' => 'boolean',
@ -54,6 +62,22 @@ class BBBPlugin extends Plugin
STUDENT_BOSS => get_lang('StudentBoss')
],
'attributes' => ['multiple' => 'multiple']
],
'interface' => [
'type' => 'select',
'options' => [
self::INTERFACE_FLASH => 'Flash',
self::INTERFACE_HTML5 => 'HTML5',
]
],
'launch_type' => [
'type' => 'select',
'options' => [
self::LAUNCH_TYPE_DEFAULT => 'SetByDefault',
self::LAUNCH_TYPE_SET_BY_TEACHER => 'SetByTeacher',
self::LAUNCH_TYPE_SET_BY_STUDENT => 'SetByStudent',
],
'translate_options' => true, // variables will be translated using the plugin->get_lang
]
]
);
@ -92,8 +116,7 @@ class BBBPlugin extends Plugin
*/
public function install()
{
$table = Database::get_main_table('plugin_bbb_meeting');
$sql = "CREATE TABLE IF NOT EXISTS $table (
$sql = "CREATE TABLE IF NOT EXISTS plugin_bbb_meeting (
id INT unsigned NOT NULL auto_increment PRIMARY KEY,
c_id INT unsigned NOT NULL DEFAULT 0,
group_id INT unsigned NOT NULL DEFAULT 0,
@ -113,19 +136,19 @@ class BBBPlugin extends Plugin
voice_bridge INT NOT NULL DEFAULT 1,
access_url INT NOT NULL DEFAULT 1,
video_url TEXT NULL,
has_video_m4v TINYINT NOT NULL DEFAULT 0
has_video_m4v TINYINT NOT NULL DEFAULT 0,
interface INT NOT NULL DEFAULT 0
)";
Database::query($sql);
Database::query(
"CREATE TABLE IF NOT EXISTS plugin_bbb_room (
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
meeting_id int unsigned NOT NULL,
participant_id int NOT NULL,
in_at datetime NOT NULL,
out_at datetime NOT NULL,
FOREIGN KEY (meeting_id) REFERENCES plugin_bbb_meeting (id),
FOREIGN KEY (participant_id) REFERENCES user (id)
meeting_id int NOT NULL,
participant_id int(11) NOT NULL,
in_at datetime,
out_at datetime,
interface int NOT NULL DEFAULT 0
);"
);
$fieldLabel = 'plugin_bbb_course_users_limit';
@ -192,7 +215,9 @@ class BBBPlugin extends Plugin
'bbb_plugin_host',
'bbb_plugin_salt',
'max_users_limit',
'global_conference_allow_roles'
'global_conference_allow_roles',
'interface',
'launch_type',
];
foreach ($variables as $variable) {
@ -227,4 +252,49 @@ class BBBPlugin extends Plugin
// Deleting course settings
$this->uninstall_course_fields_in_all_courses($this->course_settings);
}
/**
* Return an array with URL
*
* @param string $conferenceUrl
*
* @return array
*/
public function getUrlInterfaceLinks($conferenceUrl)
{
$urlList[] = $this->getFlashUrl($conferenceUrl);
$urlList[] = $this->getHtmlUrl($conferenceUrl);
return $urlList;
}
/**
* @param string $conferenceUrl
*
* @return array
*/
public function getFlashUrl($conferenceUrl)
{
$data = [
'text' => $this->get_lang('EnterConferenceFlash'),
'url' => $conferenceUrl . '&interface=' . self::INTERFACE_FLASH,
'icon' => 'resources/img/64/videoconference_flash.png'
];
return $data;
}
/**
* @param string $conferenceUrl
*
* @return array
*/
public function getHtmlUrl($conferenceUrl)
{
$data = [
'text' => $this->get_lang('EnterConferenceHTML5'),
'url' => $conferenceUrl . '&interface=' . self::INTERFACE_HTML5,
'icon' => 'resources/img/64/videoconference_html5.png'
];
return $data;
}
}

@ -12,16 +12,11 @@ require_once __DIR__.'/config.php';
$plugin = BBBPlugin::create();
$tool_name = $plugin->get_lang('Videoconference');
$htmlHeadXtra[] = api_get_js_simple(
api_get_path(WEB_PLUGIN_PATH).'bbb/resources/utils.js'
);
$htmlHeadXtra[] = "<script>var _p = {web_plugin: '".api_get_path(WEB_PLUGIN_PATH)."'}</script>";
$tpl = new Template($tool_name);
$htmlHeadXtra[] = api_get_js_simple(api_get_path(WEB_PLUGIN_PATH).'bbb/resources/utils.js');
$isGlobal = isset($_GET['global']) ? true : false;
$isGlobalPerUser = isset($_GET['user_id']) ? (int) $_GET['user_id'] : false;
$action = isset($_GET['action']) ? $_GET['action'] : null;
$action = isset($_GET['action']) ? $_GET['action'] : '';
$bbb = new bbb('', '', $isGlobal, $isGlobalPerUser);
@ -41,7 +36,7 @@ if ($conferenceManager) {
}
$courseInfo = api_get_course_info();
$agenda = new Agenda('course');
$id = intval($_GET['id']);
$id = (int) $_GET['id'];
$title = sprintf($plugin->get_lang('VideoConferenceXCourseX'), $id, $courseInfo['name']);
$content = Display::url($plugin->get_lang('GoToTheVideoConference'), $_GET['url']);
@ -91,12 +86,10 @@ if ($conferenceManager) {
if (file_exists(__DIR__.'/config.vm.php')) {
require __DIR__.'/../../vendor/autoload.php';
require __DIR__.'/lib/vm/AbstractVM.php';
require __DIR__.'/lib/vm/VMInterface.php';
require __DIR__.'/lib/vm/DigitalOceanVM.php';
require __DIR__.'/lib/VM.php';
$config = require __DIR__.'/config.vm.php';
$vm = new VM($config);
@ -129,7 +122,8 @@ if (!empty($meetings)) {
$usersOnline = $bbb->getUsersOnlineInCurrentRoom();
$maxUsers = $bbb->getMaxUsersLimit();
$status = $bbb->isServerRunning();
$meetingExists = $bbb->meetingExists($bbb->getCurrentVideoConferenceName());
$videoConferenceName = $bbb->getCurrentVideoConferenceName();
$meetingExists = $bbb->meetingExists($videoConferenceName);
$showJoinButton = false;
// Only conference manager can see the join button
@ -138,6 +132,7 @@ if ($bbb->isGlobalConference() && $bbb->isGlobalConferencePerUserEnabled()) {
// Any user can see the "join button" BT#12620
$userCanSeeJoinButton = true;
}
if (($meetingExists || $userCanSeeJoinButton) && ($maxUsers == 0 || $maxUsers > $usersOnline)) {
$showJoinButton = true;
}
@ -160,7 +155,7 @@ if ($bbb->isGlobalConference() === false &&
window.location.replace(url+groupId);
});
});
</script>';
</script>';
$form = new FormValidator(api_get_self().'?'.api_get_cidreq());
$groupId = api_get_group_id();
@ -197,11 +192,81 @@ $tpl->assign('show_join_button', $showJoinButton);
$tpl->assign('message', $message);
$tpl->assign('form', $formToString);
$listing_tpl = 'bbb/listing.tpl';
$content = $tpl->fetch($listing_tpl);
// Default URL
$urlList[] = Display::url(
$plugin->get_lang('EnterConference'),
$conferenceUrl,
['target' => '_blank', 'class' => 'btn btn-primary btn-large']
);
$type = $plugin->get('launch_type');
$warningIntefaceMessage = '';
$showClientOptions = false;
switch ($type) {
case BBBPlugin::LAUNCH_TYPE_DEFAULT:
$urlList = [];
$urlList[] = Display::url(
$plugin->get_lang('EnterConference'),
$conferenceUrl.'&interface='.$plugin->get('interface'),
['target' => '_blank', 'class' => 'btn btn-primary btn-large']
);
break;
case BBBPlugin::LAUNCH_TYPE_SET_BY_TEACHER:
if ($conferenceManager) {
$urlList = $plugin->getUrlInterfaceLinks($conferenceUrl);
$warningIntefaceMessage = Display::return_message($plugin->get_lang('ParticipantsWillUseSameInterface'));
$showClientOptions = true;
} else {
$meetingInfo = $bbb->getMeetingByName($videoConferenceName);
switch ($meetingInfo['interface']) {
case BBBPlugin::INTERFACE_FLASH:
$url = $plugin->getFlashUrl($conferenceUrl);
break;
case BBBPlugin::INTERFACE_HTML5:
$url = $plugin->getHtmlUrl($conferenceUrl);
break;
}
}
break;
case BBBPlugin::LAUNCH_TYPE_SET_BY_STUDENT:
if ($conferenceManager) {
$urlList = $plugin->getUrlInterfaceLinks($conferenceUrl);
$showClientOptions = true;
} else {
if ($meetingExists) {
$meetingInfo = $bbb->getMeetingByName($videoConferenceName);
$meetinUserInfo = $bbb->getMeetingParticipantInfo($meetingInfo['id'], api_get_user_id());
$urlList = $plugin->getUrlInterfaceLinks($conferenceUrl);
$showClientOptions = true;
/*if (empty($meetinUserInfo)) {
$url = $plugin->getUrlInterfaceLinks($conferenceUrl);
} else {
switch ($meetinUserInfo['interface']) {
case BBBPlugin::INTERFACE_FLASH:
$url = $plugin->getFlashUrl($conferenceUrl);
break;
case BBBPlugin::INTERFACE_HTML5:
$url = $plugin->getHtmlUrl($conferenceUrl);
break;
}
}*/
}
}
break;
}
$tpl->assign('enter_conference_links', $urlList);
$tpl->assign('warning_inteface_msg', $warningIntefaceMessage);
$tpl->assign('show_client_options', $showClientOptions);
$listing_tpl = 'bbb/view/listing.tpl';
$content = $tpl->fetch($listing_tpl);
$actionLinks = '';
if (api_is_platform_admin()) {
$actionLinks = Display::toolbarButton(
$actionLinks .= Display::toolbarButton(
$plugin->get_lang('AdminView'),
api_get_path(WEB_PLUGIN_PATH).'bbb/admin.php',
'list',

@ -19,6 +19,8 @@ $host = '';
$salt = '';
$isGlobal = isset($_GET['global']) ? true : false;
$isGlobalPerUser = isset($_GET['user_id']) ? (int) $_GET['user_id'] : false;
$interface = isset($_GET['interface']) ? (int) $_GET['interface'] : 0;
$bbb = new bbb('', '', $isGlobal, $isGlobalPerUser);
$conferenceManager = $bbb->isConferenceManager();
@ -56,6 +58,8 @@ if ($bbb->pluginEnabled) {
$meetingParams = [];
$meetingParams['meeting_name'] = $bbb->getCurrentVideoConferenceName();
$meetingParams['interface'] = $interface;
if ($bbb->meetingExists($meetingParams['meeting_name'])) {
$joinUrl = $bbb->joinMeeting($meetingParams['meeting_name']);
if ($joinUrl) {
@ -69,7 +73,7 @@ if ($bbb->pluginEnabled) {
$meetingInfo = $bbb->findMeetingByName($meetingParams['meeting_name']);
if (!empty($meetingInfo) && $url) {
$bbb->saveParticipant($meetingInfo['id'], api_get_user_id());
$bbb->saveParticipant($meetingInfo['id'], api_get_user_id(), $interface);
$bbb->redirectToBBB($url);
} else {
$url = $bbb->getListingUrl();

@ -137,3 +137,26 @@ $strings['PleaseSelectThePaymentMethodBeforeConfirmYourOrder'] = "Please select
$strings['NoPaymentOptionAvailable'] = 'No payment option available. Please report to the administrator.';
$strings['XIsOnlyPaymentMethodAvailable'] = '%s is the only payment method available for this purchase.';
$strings['hide_free_text'] = "Hide 'Free' text";
$strings['culqi_enable'] = "Enable culqi";
$strings['include_services'] = "Include services";
$strings['Services'] = "Services";
$strings['ServiceName'] = "Service name";
$strings['AppliesTo'] = "Applies to";
$strings['ListOfServicesOnSale'] = "List of services on sale";
$strings['GlobalConfig'] = "Global configuration";
$strings['WriteHereTheTermsAndConditionsOfYourECommerce'] = "Write here the terms and conditions of your e-commerce";
$strings['NewService'] = "New service";
$strings['Service'] = "Service";
$strings['ServiceInformation'] = "Service information";
$strings['EditService'] = "Edit service";
$strings['DeleteThisService'] = "Delete this service";
$strings['IConfirmIReadAndAcceptTermsAndCondition'] = "I confirm I read and accept the terms and conditions";
$strings['PleaseSelectTheCorrectInfoToApplyTheService'] = "Please select the correct info to apply the service";
$strings['SaleStatusCancelled'] = "Sale cancelled";
$strings['ServiceSaleInfo'] = "Service sale info";
$strings['ServiceId'] = "Service Id";
$strings['BoughtBy'] = "BoughtBy";
$strings['PurchaserUser'] = "Purchaser user";
$strings['Pending'] = "Pending";
$strings['Names'] = "Names";

@ -121,7 +121,7 @@ $strings['ApiPassword'] = "Mot de passe de l'API";
$strings['ApiSignature'] = "Signature de l'API";
$strings['InfoApiCredentials'] = "Pour générer vos données API pour intégrer votre compte PayPal à Chamilo, il vous faudra suivre les étapes suivantes";
$strings['InfoApiStepOne'] = "Aller dans l'option <strong>profil</strong> de PayPal, et ensuite dans <strong>Outils de vente</strong>";
$strings['InfoApiStepTwo'] = "Dans la section <strong>API d'accès</strong>, cloquer sur l'option <strong>Mettre à jour</strong>";
$strings['InfoApiStepTwo'] = "Dans la section <strong>API d'accès</strong>, cliquer sur l'option <strong>Mettre à jour</strong>";
$strings['InfoApiStepThree'] = "Dans l'option 2 de Configuration des données et permissions API, cliquer sur <strong>Voir signature API</strong>. Copier ces donées dans le formulaire de configuration de ce plugin";
$strings['ErrorOccurred'] = "<strong>Une erreur est survenue</strong>. Code: %s. Message: %s. Veuillez contacter l'administrateur de la plateforme";
$strings['VisibleInCatalog'] = "Visible dans le catalogue";
@ -136,3 +136,28 @@ $strings['SWIFT_help'] = "Format standard des codes d'identification de banque (
$strings['PleaseSelectThePaymentMethodBeforeConfirmYourOrder'] = 'Veuillez sélectionner votre méthode de paiement préférée avant de confirmer';
$strings['NoPaymentOptionAvailable'] = 'Aucune méthode de paiement disponible. Merci de bien vouloir rapporter ce problème à l\'administrateur.';
$strings['XIsOnlyPaymentMethodAvailable'] = '%s est la seule méthode de paiement disponible pour cet achat.';
$strings['public_main_menu_tab'] = "Montrer l'onglet dans le menu principal aux utilisateurs anonyme également";
$strings['culqi_enable'] = "Activé culqi";
$strings['include_services'] = "Inclure les services";
$strings['hide_free_text'] = "Cacher le texte 'Free' ou 'Gratuit'";
$strings['Services'] = "Services";
$strings['ServiceName'] = "Nom du service";
$strings['AppliesTo'] = "S'applique à";
$strings['ListOfServicesOnSale'] = "Liste de services en vente";
$strings['GlobalConfig'] = "Configuration globale";
$strings['WriteHereTheTermsAndConditionsOfYourECommerce'] = "Écrire les conditions de ventes de votre e-commerce";
$strings['NewService'] = "Nouveau service";
$strings['Service'] = "Service";
$strings['ServiceInformation'] = "Information sur le service";
$strings['EditService'] = "Edition du service";
$strings['DeleteThisService'] = "Supprimer ce service";
$strings['IConfirmIReadAndAcceptTermsAndCondition'] = "Je confirme que j'ai lu et que j'accepte les termes et conditions";
$strings['PleaseSelectTheCorrectInfoToApplyTheService'] = "Veuillez choisir l'information à appliquer au service";
$strings['SaleStatusCancelled'] = "Vente annulée";
$strings['ServiceSaleInfo'] = "Information de vente";
$strings['ServiceId'] = "Id du service";
$strings['BoughtBy'] = "Acheté par";
$strings['PurchaserUser'] = "Utilisateur acheteur";
$strings['Pending'] = "En attente";
$strings['Names'] = "Nom";

@ -882,7 +882,7 @@ class BuyCoursesPlugin extends Plugin
$saleIsCompleted = CourseManager::subscribe_user($sale['user_id'], $course['code']);
break;
case self::PRODUCT_TYPE_SESSION:
SessionManager::subscribe_users_to_session(
SessionManager::subscribeUsersToSession(
$sale['product_id'],
[$sale['user_id']],
api_get_session_visibility($sale['product_id']),
@ -2192,6 +2192,30 @@ class BuyCoursesPlugin extends Plugin
return $paths[$var];
}
/**
* @param Session $session
*
* @return array
*/
public function getBuyCoursePluginPrice(Session $session)
{
// start buycourse validation
// display the course price and buy button if the buycourses plugin is enabled and this course is configured
$isThisCourseInSale = $this->buyCoursesForGridCatalogValidator($session->getId(), self::PRODUCT_TYPE_SESSION);
$return = [];
if ($isThisCourseInSale) {
// set the Price label
$return['html'] = $isThisCourseInSale['html'];
// set the Buy button instead register.
if ($isThisCourseInSale['verificator']) {
$return['buy_button'] = $this->returnBuyCourseButton($session->getId(), self::PRODUCT_TYPE_SESSION);
}
}
// end buycourse validation
return $return;
}
/**
* Filter the registered courses for show in plugin catalog.
*
@ -2514,8 +2538,8 @@ class BuyCoursesPlugin extends Plugin
return Database::update(
$serviceSaleTable,
['status' => intval($newStatus)],
['id = ?' => intval($serviceSaleId)]
['status' => (int) $newStatus],
['id = ?' => (int) $serviceSaleId]
);
}
}

@ -33,7 +33,7 @@ $editingCourse = intval($_REQUEST['t']) === BuyCoursesPlugin::PRODUCT_TYPE_COURS
$editingSession = intval($_REQUEST['t']) === BuyCoursesPlugin::PRODUCT_TYPE_SESSION;
$entityManager = Database::getManager();
$userRepo = $entityManager->getRepository('ChamiloUserBundle:User');
$userRepo = UserManager::getRepository();
$currency = $plugin->getSelectedCurrency();
$currencyIso = null;

@ -140,8 +140,10 @@ $templateName = $plugin->get_lang('SalesReport');
$template = new Template($templateName);
$toolbar = "";
if ($paypalEnable == "true" && $commissionsEnable == "true") {
$toolbar = Display::toolbarButton(
$toolbar .= Display::toolbarButton(
$plugin->get_lang('PaypalPayoutCommissions'),
api_get_path(WEB_PLUGIN_PATH).'buycourses/src/paypal_payout.php',
'paypal',
@ -156,7 +158,7 @@ if ($paypalEnable == "true" && $commissionsEnable == "true") {
}
if ($commissionsEnable == "true") {
$toolbar = Display::toolbarButton(
$toolbar .= Display::toolbarButton(
$plugin->get_lang('PayoutReport'),
api_get_path(WEB_PLUGIN_PATH).'buycourses/src/payout_report.php',
'money',

@ -116,7 +116,7 @@ $selectOptions = [
];
if ($typeUser) {
$users = $em->getRepository('ChamiloUserBundle:User')->findAll();
$users = UserManager::getRepository()->findAll();
$selectOptions[$userInfo['user_id']] = api_get_person_name(
$userInfo['firstname'],
$userInfo['lastname']
@ -133,7 +133,7 @@ if ($typeUser) {
$form->addSelect('info_select', get_lang('User'), $selectOptions);
} elseif ($typeCourse) {
/** @var User $user */
$user = $em->getRepository('ChamiloUserBundle:User')->find($currentUserId);
$user = UserManager::getRepository()->find($currentUserId);
$courses = $user->getCourses();
$checker = false;
foreach ($courses as $course) {
@ -152,7 +152,7 @@ if ($typeUser) {
} elseif ($typeSession) {
$sessions = [];
/** @var User $user */
$user = $em->getRepository('ChamiloUserBundle:User')->find($currentUserId);
$user = UserManager::getRepository()->find($currentUserId);
$userSubscriptions = $user->getSessionCourseSubscriptions();
/** @var SessionRelCourseRelUser $userSubscription */
@ -175,7 +175,7 @@ if ($typeUser) {
} elseif ($typeFinalLp) {
// We need here to check the current user courses first
/** @var User $user */
$user = $em->getRepository('ChamiloUserBundle:User')->find($currentUserId);
$user = UserManager::getRepository()->find($currentUserId);
$courses = $user->getCourses();
$courseLpList = [];
$sessionLpList = [];
@ -254,6 +254,6 @@ $tpl->assign('buying_service', true);
$tpl->assign('service', $serviceInfo);
$tpl->assign('user', api_get_user_info());
$tpl->assign('form', $form->returnForm());
$content = $tpl->fetch('buycourses/view/process.tpl');
$content = $tpl->fetch('buycourses/view/service_process.tpl');
$tpl->assign('content', $content);
$tpl->display_one_col_template();

@ -13,7 +13,7 @@ require_once '../../../main/inc/global.inc.php';
$plugin = BuyCoursesPlugin::create();
$currency = $plugin->getSelectedCurrency();
$em = Database::getManager();
$users = $em->getRepository('ChamiloUserBundle:User')->findAll();
$users = UserManager::getRepository()->findAll();
$userOptions = [];
if (!empty($users)) {
foreach ($users as $user) {
@ -22,8 +22,9 @@ if (!empty($users)) {
}
api_protect_admin_script(true);
//$htmlHeadXtra[] = api_get_css_asset('cropper/dist/cropper.min.css');
//$htmlHeadXtra[] = api_get_asset('cropper/dist/cropper.min.js');
$htmlHeadXtra[] = api_get_css_asset('cropper/dist/cropper.min.css');
$htmlHeadXtra[] = api_get_asset('cropper/dist/cropper.min.js');
//view
$interbreadcrumb[] = [

@ -19,7 +19,7 @@ if (!$serviceId) {
$plugin = BuyCoursesPlugin::create();
$currency = $plugin->getSelectedCurrency();
$em = Database::getManager();
$users = $em->getRepository('ChamiloUserBundle:User')->findAll();
$users = UserManager::getRepository()->findAll();
$userOptions = [];
if (!empty($users)) {
foreach ($users as $user) {
@ -28,8 +28,8 @@ if (!empty($users)) {
}
api_protect_admin_script(true);
//$htmlHeadXtra[] = api_get_css_asset('cropper/dist/cropper.min.css');
//$htmlHeadXtra[] = api_get_asset('cropper/dist/cropper.min.js');
$htmlHeadXtra[] = api_get_css_asset('cropper/dist/cropper.min.css');
$htmlHeadXtra[] = api_get_asset('cropper/dist/cropper.min.js');
//view
$interbreadcrumb[] = [

@ -101,116 +101,6 @@
</div>
</div>
</div>
<script>
$(document).ready(function () {
$("label").removeClass('control-label');
$('.form_required').remove();
$("small").remove();
$("label[for=submit]").remove();
});
</script><div class="actions">
<a href="{{ _p.web }}main/auth/courses.php" title="{{ "Back"|get_lang }}">
<img src="{{ "back.png"|icon(32) }}" width="32" height="32" alt="{{ "Back"|get_lang }}"
title="{{ "Back"|get_lang }}"/>
</a>
</div>
<div class="page-header">
<h3>{{ 'PurchaseData'|get_plugin_lang('BuyCoursesPlugin') }}</h3>
</div>
<div class="row">
<div class="col-md-12">
<div class="panel panel-default panel-box-buy">
<div class="panel-body">
<div class="buy-info">
{% if buying_course %}
<div class="row">
<div class="col-md-3">
<a class="ajax" data-title="{{ course.title }}"
href="{{ _p.web_ajax ~ 'course_home.ajax.php?' ~ {'a': 'show_course_information', 'code': course.code}|url_encode() }}">
<img alt="{{ course.title }}" class="img-rounded img-responsive"
src="{{ course.course_img ? course.course_img : 'session_default.png'|icon() }}">
</a>
<div class="price">
{{ 'Total'|get_plugin_lang('BuyCoursesPlugin')}} :
{{ course.currency == 'BRL' ? 'R$' : course.currency }} {{ course.price }}
</div>
</div>
<div class="col-md-9">
<div class="buy-item">
<h3 class="title">
<a class="ajax" data-title="{{ course.title }}"
href="{{ _p.web_ajax ~ 'course_home.ajax.php?' ~ {'a': 'show_course_information', 'code': course.code}|url_encode() }}">
{{ course.title }}
</a>
</h3>
{% if course.description %}
<div class="description">
{{ course.description }}
</div>
{% endif %}
<div class="coaches">
<p>
{{ 'Teachers'|get_plugin_lang('BuyCoursesPlugin')}} :
{% for teacher in course.teachers %}
<em class="fa fa-user" aria-hidden="true"></em>
<a href="{{ _p.web }}main/social/profile.php?u={{ teacher.id }}"
class="teacher-item"> {{ teacher.name }}</a>,
{% endfor %}
</p>
</div>
</div>
</div>
</div>
{% elseif buying_session %}
<div class="row">
<div class="col-md-3">
<img alt="{{ session.name }}" class="img-rounded img-responsive""
src="{{ session.image ? session.image : 'session_default.png'|icon() }}">
<div class="price">
{{ 'Total'|get_plugin_lang('BuyCoursesPlugin')}} :
{{ session.currency == 'BRL' ? 'R$' : session.currency }} {{ session.price }}
</div>
</div>
<div class="col-md-9">
<div class="buy-item">
<h3 class="title">{{ session.name }}</h3>
{% if session.description %}
<div class="description">
{{ session.description }}
</div>
{% endif %}
<div class="date">
<em class="fa fa-calendar" aria-hidden="true"></em> {{ session.dates.display }}
</div>
<div class="coaches">
{% for course in session.courses %}
<p class="course"><em class="fa fa-book" aria-hidden="true"></em> {{ course.title }}
</p>
<p>
{{ 'Teachers'|get_plugin_lang('BuyCoursesPlugin')}} :
{% if course.coaches|length %}
{% for coach in course.coaches %}
<em class="fa fa-user" aria-hidden="true"></em>
<a href="{{ _p.web }}main/social/profile.php?u={{ coach.id }}"
class="teacher-item"> {{ coach.name }}</a>,
{% endfor %}
{% endif %}
</p>
{% endfor %}
</div>
</div>
</div>
</div>
{% endif %}
</div>
<div class="buy-summary">
<h3>{{ 'PaymentMethods'|get_plugin_lang('BuyCoursesPlugin') }}</h3>
{{ form }}
</div>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function () {
$("label").removeClass('control-label');

@ -20,8 +20,6 @@ $plugin_info['comment'] = "If you use some other authentication than local Chami
$plugin_info['version'] = '1.0';
//the plugin author
$plugin_info['author'] = 'Hubert Borderiou';
return;
//the plugin configuration
$form = new FormValidator('eaclbb_form');
$form->addElement("html", "<div class='normal-message'>Fill the text boxes below to overwrite the default values used in this plugin</div>");

@ -1,5 +1,6 @@
<?php
/* For license terms, see /license.txt */
/**
* Install the MSI/LTI Plugin
* @package chamilo.plugin.ims_lti

@ -2,7 +2,8 @@
/* For license terms, see /license.txt */
/**
* Uninstall the MSI/LTI Plugin
* Uninstall the MSI/LTI Plugin.
*
* @package chamilo.plugin.ims_lti
*/

@ -3,14 +3,13 @@
use ChamiloSession as Session;
require_once __DIR__.'/../config.php';
/**
* This class provides methods for the notebook management.
* Include/require it in your code to use its features.
*
* @author Carlos Vargas <litox84@gmail.com>, move code of main/notebook up here
* @author Jose Angel Ruiz <desarrollo@nosolored.com>, adaptation for the plugin
* @author Julio Montoya
*
* @package chamilo.library
*/
@ -131,6 +130,7 @@ class NotebookTeacher
if (!is_array($values) or empty($values['note_title'])) {
return false;
}
// Database table definition
$table = Database::get_main_table(NotebookTeacherPlugin::TABLE_NOTEBOOKTEACHER);
@ -174,7 +174,6 @@ class NotebookTeacher
// Database table definition
$tableNotebook = Database::get_main_table(NotebookTeacherPlugin::TABLE_NOTEBOOKTEACHER);
$courseId = api_get_course_int_id();
$sql = "DELETE FROM $tableNotebook
@ -198,78 +197,38 @@ class NotebookTeacher
{
$plugin = NotebookTeacherPlugin::create();
$userInfo = api_get_user_info();
$sortDirection = 'DESC';
$linkSortDirection = 'ASC';
if (!isset($_GET['direction'])) {
$sortDirection = 'ASC';
$linkSortDirection = 'DESC';
} elseif ($_GET['direction'] == 'ASC') {
$sortDirection = 'ASC';
$linkSortDirection = 'DESC';
} else {
$sortDirection = 'DESC';
$linkSortDirection = 'ASC';
}
$studentId = isset($_GET['student_id']) ? $_GET['student_id'] : null;
$studentId = isset($_GET['student_id']) ? (int) $_GET['student_id'] : 0;
$currentUrl = api_get_self().'?'.api_get_cidreq().'&student_id='.$studentId;
$sessionId = api_get_session_id();
$courseCode = api_get_course_id();
$active = isset($_GET['active']) ? $_GET['active'] : null;
$status = STUDENT;
$courseInfo = api_get_course_info();
$courseId = $courseInfo['real_id'];
$currentAccessUrlId = api_get_current_access_url_id();
$sortByfirstName = api_sort_by_first_name();
$type = isset($_REQUEST['type']) ? intval($_REQUEST['type']) : STUDENT;
if (!empty($sessionId)) {
$tableSessionCourseUser = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$tableUsers = Database::get_main_table(TABLE_MAIN_USER);
$isWesternNameOrder = api_is_western_name_order();
$sql = "SELECT DISTINCT
user.user_id, ".($isWesternNameOrder
? "user.firstname, user.lastname"
: "user.lastname, user.firstname")."
FROM $tableSessionCourseUser as session_course_user,
$tableUsers as user ";
if (api_is_multiple_url_enabled()) {
$sql .= ' , '.Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER).' au ';
}
$sql .= " WHERE c_id = '$courseId' AND session_course_user.user_id = user.user_id ";
$sql .= ' AND session_id = '.$sessionId;
if (api_is_multiple_url_enabled()) {
$sql .= " AND user.user_id = au.user_id AND access_url_id = $currentAccessUrlId ";
}
// only users no coaches/teachers
if ($type == COURSEMANAGER) {
$sql .= " AND session_course_user.status = 2 ";
} else {
$sql .= " AND session_course_user.status = 0 ";
}
$sql .= $sortByfirstName
? ' ORDER BY user.firstname, user.lastname'
: ' ORDER BY user.lastname, user.firstname';
$rs = Database::query($sql);
$courseId = api_get_course_int_id();
$courseUsersList = [];
while ($row = Database::fetch_assoc($rs)) {
$courseUsersList[$row['user_id']] = $row;
}
} else {
$courseUsersList = CourseManager::get_user_list_from_course_code(
if (empty($sessionId)) {
$userList = CourseManager::get_user_list_from_course_code(
$courseCode,
0,
null,
null,
$status,
null,
false,
false,
null,
STUDENT
);
} else {
$userList = CourseManager::get_user_list_from_course_code(
$courseCode,
$sessionId,
null,
null,
$active
0
);
}
@ -278,8 +237,8 @@ class NotebookTeacher
// Status
$students = [];
$students[] = $plugin->get_lang('AllStudent');
foreach ($courseUsersList as $key => $userItem) {
$students[$key] = $userItem['firstname'].' '.$userItem['lastname'];
foreach ($userList as $key => $userItem) {
$students[$key] = api_get_person_name($userItem['firstname'], $userItem['lastname']);
}
$form->addElement(
@ -289,7 +248,7 @@ class NotebookTeacher
$students,
[
'id' => 'student_filter',
'onchange' => 'javascript: filter_student();',
'onchange' => 'javascript: studentFilter();',
]
);
$user_data = ['student_filter' => $studentId];
@ -301,8 +260,8 @@ class NotebookTeacher
echo '<div class="actions">';
if (!api_is_drh()) {
if (!api_is_anonymous()) {
if (api_get_session_id() == 0) {
echo '<a href="index.php?'.api_get_cidreq().'&action=addnote">'.
if (empty($sessionId)) {
echo '<a href="'.$currentUrl.'&action=addnote">'.
Display::return_icon(
'new_note.png',
get_lang('NoteAddNew'),
@ -310,7 +269,7 @@ class NotebookTeacher
'32'
).'</a>';
} elseif (api_is_allowed_to_session_edit(false, true)) {
echo '<a href="index.php?'.api_get_cidreq().'&action=addnote">'.
echo '<a href="'.$currentUrl.'&action=addnote">'.
Display::return_icon('new_note.png', get_lang('NoteAddNew'), '', '32').'</a>';
}
} else {
@ -319,22 +278,18 @@ class NotebookTeacher
}
}
echo '<a href="index.php?'.
api_get_cidreq().
'&action=changeview&view=creation_date&direction='.$linkSortDirection.'&student_id='.$studentId.'">'.
echo '<a href="'.$currentUrl.
'&action=changeview&view=creation_date&direction='.$linkSortDirection.'">'.
Display::return_icon('notes_order_by_date_new.png', get_lang('OrderByCreationDate'), '', '32').'</a>';
echo '<a href="index.php?'.
api_get_cidreq().
'&action=changeview&view=update_date&direction='.$linkSortDirection.'&student_id='.$studentId.'">'.
echo '<a href="'.$currentUrl.
'&action=changeview&view=update_date&direction='.$linkSortDirection.'">'.
Display::return_icon('notes_order_by_date_mod.png', get_lang('OrderByModificationDate'), '', '32').'</a>';
echo '<a href="index.php?'.
api_get_cidreq().
'&action=changeview&view=title&direction='.$linkSortDirection.'&student_id='.$studentId.'">'.
echo '<a href="'.$currentUrl.
'&action=changeview&view=title&direction='.$linkSortDirection.'">'.
Display::return_icon('notes_order_by_title.png', get_lang('OrderByTitle'), '', '32').'</a>';
echo '</div>';
echo '<div class="row">'.$selectStudent.'</div>';
$view = Session::read('notebook_view');
if (!isset($view) ||
!in_array($view, ['creation_date', 'update_date', 'title'])
@ -343,7 +298,6 @@ class NotebookTeacher
}
$view = Session::read('notebook_view');
// Database table definition
$tableNotebook = Database::get_main_table(NotebookTeacherPlugin::TABLE_NOTEBOOKTEACHER);
if ($view == 'creation_date' || $view == 'update_date') {
@ -352,12 +306,9 @@ class NotebookTeacher
$orderBy = " ORDER BY $view $sortDirection ";
}
//condition for the session
$session_id = api_get_session_id();
$conditionSession = api_get_session_condition($session_id);
// condition for the session
$conditionSession = api_get_session_condition($sessionId);
$condExtra = $view == 'update_date' ? " AND update_date <> ''" : " ";
$courseId = api_get_course_int_id();
if ($studentId > 0) {
// Only one student
@ -378,11 +329,12 @@ class NotebookTeacher
$studentText = '';
if ($row['student_id'] > 0) {
$studentInfo = api_get_user_info($row['student_id']);
$studentText = $studentInfo['complete_name'];
$studentText = $studentInfo['complete_name_with_username'];
}
echo Display::page_subheader($studentText);
echo Display::page_subheader2($studentText);
$first = false;
}
// Validation when belongs to a session
$sessionImg = api_get_session_image($row['session_id'], $userInfo['status']);
$updateValue = '';
@ -396,11 +348,11 @@ class NotebookTeacher
if (intval($row['user_id']) == api_get_user_id()) {
$actions = '<a href="'.
api_get_self().'?'.
api_get_cidreq().'action=editnote&notebook_id='.$row['id'].'">'.
api_get_cidreq().'&student_id='.$studentId.'&action=editnote&notebook_id='.$row['id'].'">'.
Display::return_icon('edit.png', get_lang('Edit'), '', ICON_SIZE_SMALL).'</a>';
$actions .= '<a href="'.
api_get_self().
'?action=deletenote&notebook_id='.$row['id'].
'?action=deletenote&student_id='.$studentId.'&notebook_id='.$row['id'].
'" onclick="return confirmation(\''.$row['title'].'\');">'.
Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL).'</a>';
}
@ -416,7 +368,7 @@ class NotebookTeacher
}
} else {
// All students
foreach ($courseUsersList as $key => $userItem) {
foreach ($userList as $key => $userItem) {
$studentId = $key;
$studentText = $userItem['firstname'].' '.$userItem['lastname'];
$conditionStudent = " AND student_id = $studentId";
@ -445,6 +397,7 @@ class NotebookTeacher
$userInfo = api_get_user_info($row['user_id']);
$author = ', '.get_lang('Teacher').': '.$userInfo['complete_name'];
$actions = '';
if (intval($row['user_id']) == api_get_user_id()) {
$actions = '<a href="'.api_get_self().
'?action=editnote&notebook_id='.$row['id'].'&'.api_get_cidreq().'">'.
@ -458,8 +411,6 @@ class NotebookTeacher
'',
ICON_SIZE_SMALL
).'</a>';
} else {
$actions = '';
}
echo Display::panel(
@ -507,6 +458,7 @@ class NotebookTeacher
'" onclick="return confirmation(\''.$row['title'].'\');">'.
Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL).'</a>';
}
echo Display::panel(
$row['description'],
$row['title'].$sessionImg.' <div class="pull-right">'.$actions.'</div>',
@ -517,4 +469,63 @@ class NotebookTeacher
}
}
}
/**
* @param FormValidator $form
* @param int $studentId
*
* @return FormValidator
*/
public static function getForm($form, $studentId)
{
$sessionId = api_get_session_id();
$courseCode = api_get_course_id();
if (empty($sessionId)) {
$userList = CourseManager::get_user_list_from_course_code(
$courseCode,
0,
null,
null,
STUDENT
);
} else {
$userList = CourseManager::get_user_list_from_course_code(
$courseCode,
$sessionId,
null,
null,
0
);
}
$students = ['' => ''];
foreach ($userList as $key => $userItem) {
$students[$key] = api_get_person_name($userItem['firstname'], $userItem['lastname']);
}
$form->addElement(
'select',
'student_id',
get_lang('Student'),
$students
);
$form->addElement('text', 'note_title', get_lang('NoteTitle'), ['id' => 'note_title']);
$form->addElement(
'html_editor',
'note_comment',
get_lang('NoteComment'),
null,
api_is_allowed_to_edit()
? ['ToolbarSet' => 'Notebook', 'Width' => '100%', 'Height' => '300']
: ['ToolbarSet' => 'NotebookStudent', 'Width' => '100%', 'Height' => '300', 'UserStatus' => 'student']
);
$form->addButtonCreate(get_lang('Save'), 'SubmitNote');
// Setting the rules
$form->addRule('note_title', get_lang('ThisFieldIsRequired'), 'required');
return $form;
}
}

@ -7,12 +7,16 @@
* @package chamilo.plugin.notebookteacher
*
* @author Jose Angel Ruiz <desarrollo@nosolored.com>
* @author Julio Montoya
*/
class NotebookTeacherPlugin extends Plugin
{
const TABLE_NOTEBOOKTEACHER = 'plugin_notebook_teacher';
public $isCoursePlugin = true;
/**
* NotebookTeacherPlugin constructor.
*/
protected function __construct()
{
parent::__construct(
@ -41,7 +45,7 @@ class NotebookTeacherPlugin extends Plugin
*/
public function install()
{
//Installing course settings
// Installing course settings
$this->install_course_fields_in_all_courses();
$tablesToBeCompared = [self::TABLE_NOTEBOOKTEACHER];
@ -76,7 +80,7 @@ class NotebookTeacherPlugin extends Plugin
public function uninstall()
{
// Deleting course settings.
$this->uninstall_course_fields_in_all_courses($this->course_settings);
$this->uninstall_course_fields_in_all_courses();
$tablesToBeDeleted = [self::TABLE_NOTEBOOKTEACHER];
foreach ($tablesToBeDeleted as $tableToBeDeleted) {
@ -87,6 +91,9 @@ class NotebookTeacherPlugin extends Plugin
$this->manageTab(false);
}
/**
* Update.
*/
public function update()
{
$tableNotebookTeacher = self::TABLE_NOTEBOOKTEACHER;

@ -6,389 +6,220 @@ use ChamiloSession as Session;
$course_plugin = 'notebookteacher';
require_once __DIR__.'/../config.php';
// Notice for unauthorized people.
api_protect_course_script(true);
$_setting['student_view_enabled'] = 'false';
$plugin = NotebookTeacherPlugin::create();
$current_course_tool = $plugin->get_lang('NotebookTeacher');
$enable = $plugin->get('enable_plugin_notebookteacher') == 'true';
if ($enable) {
if (api_is_teacher() || api_is_drh()) {
// The section (tabs)
$this_section = SECTION_COURSES;
if (!$enable) {
api_not_allowed(true, $plugin->get_lang('ToolDisabled'));
}
// Notice for unauthorized people.
api_protect_course_script(true);
$location = 'index.php?'.api_get_cidreq();
$allow = api_is_teacher() || api_is_drh();
if (!$allow) {
api_not_allowed(true);
}
// Additional javascript
$htmlHeadXtra[] = NotebookTeacher::javascriptNotebook();
$htmlHeadXtra[] = '<script>
function setFocus(){
$("#note_title").focus();
}
$(document).ready(function () {
setFocus();
});
$current_course_tool = $plugin->get_lang('NotebookTeacher');
$notebookId = isset($_GET['notebook_id']) ? (int) $_GET['notebook_id'] : 0;
$studentId = isset($_GET['student_id']) ? $_GET['student_id'] : 0;
$action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : '';
$currentUrl = api_get_self().'?'.api_get_cidreq().'&student_id='.$studentId;
// The section (tabs)
$this_section = SECTION_COURSES;
$location = api_get_self().'?'.api_get_cidreq();
// Additional javascript
$htmlHeadXtra[] = NotebookTeacher::javascriptNotebook();
$htmlHeadXtra[] = '<script>
function setFocus(){
$("#note_title").focus();
}
$(document).ready(function () {
setFocus();
});
function filter_student() {
var student_id = $("#student_filter").val();
location.href ="'.$location.'&student_id="+student_id;
}
</script>';
function studentFilter() {
var student_id = $("#student_filter").val();
location.href ="'.$location.'&student_id="+student_id;
}
</script>';
// Setting the tool constants
$tool = $plugin->get_lang('NotebookTeacher');
// Tracking
Event::event_access_tool('notebookteacher');
// Tracking
Event::event_access_tool('notebookteacher');
$noteBookTeacher = $tool = $plugin->get_lang('NotebookTeacher');
$action = isset($_GET['action']) ? $_GET['action'] : '';
switch ($action) {
case 'addnote':
$tool = 'NoteAddNew';
$interbreadcrumb[] = [
'url' => 'index.php?'.api_get_cidreq(),
'name' => $noteBookTeacher,
];
// Tool name
if ($action === 'addnote') {
$tool = 'NoteAddNew';
$interbreadcrumb[] = [
'url' => 'index.php?'.api_get_cidreq(),
'name' => $plugin->get_lang('NotebookTeacher'),
];
}
if ($action === 'editnote') {
$tool = 'ModifyNote';
$interbreadcrumb[] = [
'url' => 'index.php?'.api_get_cidreq(),
'name' => $plugin->get_lang('NotebookTeacher'),
];
if ((api_get_session_id() != 0 &&
!api_is_allowed_to_session_edit(false, true) || api_is_drh())) {
api_not_allowed();
}
Session::write('notebook_view', 'creation_date');
// Displaying the header
Display::display_header(get_lang(ucfirst($tool)));
// Tool introduction
Display::display_introduction_section($plugin->get_lang('NotebookTeacher'));
// Action handling: Adding a note
if ($action === 'addnote') {
if ((api_get_session_id() != 0 &&
!api_is_allowed_to_session_edit(false, true) || api_is_drh())) {
api_not_allowed();
}
Session::write('notebook_view', 'creation_date');
$form = new FormValidator(
'note',
'post',
api_get_self().'?action='.Security::remove_XSS($_GET['action']).'&'.api_get_cidreq()
);
// Setting the form elements
$form->addElement('header', '', get_lang('NoteAddNew'));
$form->addElement('text', 'note_title', get_lang('NoteTitle'), ['id' => 'note_title']);
$student_id = isset($_GET['student_id']) ? $_GET['student_id'] : null;
$sessionId = api_get_session_id();
$courseCode = api_get_course_id();
$active = isset($_GET['active']) ? $_GET['active'] : null;
$status = STUDENT;
$course_info = api_get_course_info();
$courseId = $course_info['real_id'];
$current_access_url_id = api_get_current_access_url_id();
$sort_by_first_name = api_sort_by_first_name();
if (!empty($sessionId)) {
$table_session_course_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$table_users = Database::get_main_table(TABLE_MAIN_USER);
$sql = "SELECT DISTINCT
user.user_id, ".($is_western_name_order
? "user.firstname, user.lastname"
: "user.lastname, user.firstname")."
FROM $table_session_course_user as session_course_user,
$table_users as user ";
if (api_is_multiple_url_enabled()) {
$sql .= ' , '.Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER).' au ';
}
$sql .= " WHERE c_id = '$courseId' AND session_course_user.user_id = user.user_id ";
$sql .= ' AND session_id = '.$sessionId;
if (api_is_multiple_url_enabled()) {
$sql .= " AND user.user_id = au.user_id AND access_url_id = $current_access_url_id ";
}
// only users no coaches/teachers
if ($type == COURSEMANAGER) {
$sql .= " AND session_course_user.status = 2 ";
} else {
$sql .= " AND session_course_user.status = 0 ";
}
$sql .= $sort_by_first_name
? ' ORDER BY user.firstname, user.lastname'
: ' ORDER BY user.lastname, user.firstname';
$rs = Database::query($sql);
$a_course_users = [];
while ($row = Database::fetch_assoc($rs)) {
$a_course_users[$row['user_id']] = $row;
}
} else {
$a_course_users = CourseManager::get_user_list_from_course_code(
$courseCode,
0,
null,
null,
$status,
null,
false,
false,
null,
null,
null,
$active
);
}
$studentList = [];
$studentList[0] = '';
foreach ($a_course_users as $key => $user_item) {
$studentList[$key] = $user_item['firstname'].' '.$user_item['lastname'];
}
$form->addElement(
'select',
'student_id',
get_lang('Student'),
$studentList,
[
'id' => 'student_id',
]
);
$form->addElement(
'html_editor',
'note_comment',
get_lang('NoteComment'),
null,
api_is_allowed_to_edit()
? ['ToolbarSet' => 'Notebook', 'Width' => '100%', 'Height' => '300']
: ['ToolbarSet' => 'NotebookStudent', 'Width' => '100%', 'Height' => '300', 'UserStatus' => 'student']
);
$form->addButtonCreate(get_lang('AddNote'), 'SubmitNote');
// Setting the rules
$form->addRule('note_title', get_lang('ThisFieldIsRequired'), 'required');
// The validation or display
if ($form->validate()) {
$check = Security::check_token('post');
if ($check) {
$values = $form->exportValues();
$res = NotebookTeacher::saveNote($values);
if ($res) {
echo Display::return_message(get_lang('NoteAdded'), 'confirmation');
}
}
Security::clear_token();
NotebookTeacher::displayNotes();
} else {
echo '<div class="actions">';
echo '<a href="index.php">'.
Display::return_icon('back.png', get_lang('BackToNotesList'), '', ICON_SIZE_MEDIUM).
'</a>';
echo '</div>';
$token = Security::get_token();
$form->addElement('hidden', 'sec_token');
$form->setConstants(['sec_token' => $token]);
$form->display();
}
} elseif ($action === 'editnote' && is_numeric($_GET['notebook_id'])) {
// Action handling: Editing a note
if (!empty($_GET['isStudentView']) || api_is_drh()) {
NotebookTeacher::displayNotes();
exit;
}
// Initialize the object
$form = new FormValidator(
'note',
'post',
api_get_self().'?action='.Security::remove_XSS($_GET['action']).
'&notebook_id='.intval($_GET['notebook_id']).'&'.api_get_cidreq()
);
// Setting the form elements
$form->addElement('header', '', get_lang('ModifyNote'));
$form->addElement('hidden', 'notebook_id');
$form->addElement('text', 'note_title', get_lang('NoteTitle'), ['size' => '100']);
$sessionId = api_get_session_id();
$courseCode = api_get_course_id();
$active = isset($_GET['active']) ? $_GET['active'] : null;
$status = STUDENT;
$student_id = isset($_GET['student_id']) ? $_GET['student_id'] : null;
$course_info = api_get_course_info();
$courseId = $course_info['real_id'];
$current_access_url_id = api_get_current_access_url_id();
$sort_by_first_name = api_sort_by_first_name();
if (!empty($sessionId)) {
$table_session_course_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$table_users = Database::get_main_table(TABLE_MAIN_USER);
$sql = "SELECT DISTINCT
user.user_id, ".($is_western_name_order
? "user.firstname, user.lastname"
: "user.lastname, user.firstname")."
FROM $table_session_course_user as session_course_user,
$table_users as user ";
if (api_is_multiple_url_enabled()) {
$sql .= ' , '.Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER).' au ';
}
$sql .= " WHERE c_id = '$courseId' AND session_course_user.user_id = user.user_id ";
$sql .= ' AND session_id = '.$sessionId;
if (api_is_multiple_url_enabled()) {
$sql .= " AND user.user_id = au.user_id AND access_url_id = $current_access_url_id ";
}
// only users no coaches/teachers
if ($type == COURSEMANAGER) {
$sql .= " AND session_course_user.status = 2 ";
} else {
$sql .= " AND session_course_user.status = 0 ";
}
$sql .= $sort_by_first_name
? ' ORDER BY user.firstname, user.lastname'
: ' ORDER BY user.lastname, user.firstname';
$rs = Database::query($sql);
$a_course_users = [];
while ($row = Database::fetch_assoc($rs)) {
$a_course_users[$row['user_id']] = $row;
$form = new FormValidator(
'note',
'post',
$currentUrl.'&action=addnote'
);
$form->addHeader(get_lang('NoteAddNew'));
$form = NotebookTeacher::getForm($form, $studentId);
$form->setDefaults(['student_id' => $studentId]);
// The validation or display
if ($form->validate()) {
$check = Security::check_token('post');
if ($check) {
$values = $form->exportValues();
$res = NotebookTeacher::saveNote($values);
if ($res) {
Display::addFlash(Display::return_message(get_lang('NoteAdded'), 'confirmation'));
}
} else {
$a_course_users = CourseManager::get_user_list_from_course_code(
$courseCode,
0,
null,
null,
$status,
null,
false,
false,
null,
null,
null,
$active
);
}
$studentList = [];
$studentList[0] = '';
foreach ($a_course_users as $key => $user_item) {
$studentList[$key] = $user_item['firstname'].' '.$user_item['lastname'];
}
$form->addElement(
'select',
'student_id',
get_lang('Student'),
$studentList,
[
'id' => 'student_id',
]
);
$form->addElement(
'html_editor',
'note_comment',
get_lang('NoteComment'),
null,
api_is_allowed_to_edit()
? ['ToolbarSet' => 'Notebook', 'Width' => '100%', 'Height' => '300']
: ['ToolbarSet' => 'NotebookStudent', 'Width' => '100%', 'Height' => '300', 'UserStatus' => 'student']
);
$form->addButtonUpdate(get_lang('ModifyNote'), 'SubmitNote');
header('Location: '.$currentUrl);
exit;
} else {
// Displaying the header
Display::display_header(get_lang(ucfirst($tool)));
// Tool introduction
Display::display_introduction_section($noteBookTeacher);
echo '<div class="actions">';
echo '<a href="index.php">'.
Display::return_icon('back.png', get_lang('BackToNotesList'), '', ICON_SIZE_MEDIUM).
'</a>';
echo '</div>';
$token = Security::get_token();
$form->addElement('hidden', 'sec_token');
$form->setConstants(['sec_token' => $token]);
$form->display();
}
break;
case 'editnote':
$tool = 'ModifyNote';
$interbreadcrumb[] = [
'url' => 'index.php?'.api_get_cidreq(),
'name' => $noteBookTeacher,
];
if (empty($notebookId)) {
api_not_allowed(true);
}
// Setting the defaults
$defaults = NotebookTeacher::getNoteInformation(Security::remove_XSS($_GET['notebook_id']));
$form->setDefaults($defaults);
$defaults = NotebookTeacher::getNoteInformation($notebookId);
// Setting the rules
$form->addRule('note_title', get_lang('ThisFieldIsRequired'), 'required');
if (empty($defaults)) {
api_not_allowed(true);
}
// The validation or display
if ($form->validate()) {
$check = Security::check_token('post');
if ($check) {
$values = $form->exportValues();
$res = NotebookTeacher::updateNote($values);
if ($res) {
echo Display::return_message(get_lang('NoteUpdated'), 'confirmation');
}
$form = new FormValidator(
'note',
'post',
$currentUrl.'&action='.$action.'&notebook_id='.$notebookId
);
// Setting the form elements
$form->addHeader(get_lang('ModifyNote'));
$form->addHidden('notebook_id', $notebookId);
$form = NotebookTeacher::getForm($form, $defaults['student_id']);
// Setting the defaults
$form->setDefaults($defaults);
// The validation or display
if ($form->validate()) {
$check = Security::check_token('post');
if ($check) {
$values = $form->exportValues();
$res = NotebookTeacher::updateNote($values);
if ($res) {
Display::addFlash(Display::return_message(get_lang('NoteUpdated'), 'confirmation'));
}
Security::clear_token();
NotebookTeacher::displayNotes();
} else {
echo '<div class="actions">';
echo '<a href="index.php">'.
Display::return_icon('back.png', get_lang('BackToNotesList'), '', ICON_SIZE_MEDIUM).'</a>';
echo '</div>';
$token = Security::get_token();
$form->addElement('hidden', 'sec_token');
$form->setConstants(['sec_token' => $token]);
$form->display();
}
} elseif ($action === 'deletenote' && is_numeric($_GET['notebook_id'])) {
// Action handling: deleting a note
$res = NotebookTeacher::deleteNote($_GET['notebook_id']);
if ($res) {
echo Display::return_message(get_lang('NoteDeleted'), 'confirmation');
}
NotebookTeacher::displayNotes();
} elseif ($action === 'changeview' && in_array($_GET['view'], ['creation_date', 'update_date', 'title'])) {
// Action handling: changing the view (sorting order)
header('Location: '.$currentUrl);
exit;
} else {
// Displaying the header
Display::display_header(get_lang(ucfirst($tool)));
// Tool introduction
Display::display_introduction_section($noteBookTeacher);
echo '<div class="actions">';
echo '<a href="index.php">'.
Display::return_icon('back.png', get_lang('BackToNotesList'), '', ICON_SIZE_MEDIUM).'</a>';
echo '</div>';
$token = Security::get_token();
$form->addElement('hidden', 'sec_token');
$form->setConstants(['sec_token' => $token]);
$form->display();
}
break;
case 'deletenote':
$res = NotebookTeacher::deleteNote($notebookId);
if ($res) {
Display::addFlash(Display::return_message(get_lang('NoteDeleted'), 'confirmation'));
}
header('Location: '.$currentUrl);
exit;
break;
case 'changeview':
if (in_array($_GET['view'], ['creation_date', 'update_date', 'title'])) {
switch ($_GET['view']) {
case 'creation_date':
if (!$_GET['direction'] || $_GET['direction'] == 'ASC') {
echo Display::return_message(get_lang('NotesSortedByCreationDateAsc'), 'confirmation');
Display::addFlash(
Display::return_message(get_lang('NotesSortedByCreationDateAsc'), 'confirmation')
);
} else {
echo Display::return_message(get_lang('NotesSortedByCreationDateDESC'), 'confirmation');
Display::addFlash(
Display::return_message(get_lang('NotesSortedByCreationDateDESC'), 'confirmation')
);
}
break;
case 'update_date':
if (!$_GET['direction'] || $_GET['direction'] == 'ASC') {
echo Display::return_message(get_lang('NotesSortedByUpdateDateAsc'), 'confirmation');
Display::addFlash(
Display::return_message(get_lang('NotesSortedByUpdateDateAsc'), 'confirmation')
);
} else {
echo Display::return_message(get_lang('NotesSortedByUpdateDateDESC'), 'confirmation');
Display::addFlash(
Display::return_message(get_lang('NotesSortedByUpdateDateDESC'), 'confirmation')
);
}
break;
case 'title':
if (!$_GET['direction'] || $_GET['direction'] == 'ASC') {
echo Display::return_message(get_lang('NotesSortedByTitleAsc'), 'confirmation');
Display::addFlash(Display::return_message(get_lang('NotesSortedByTitleAsc'), 'confirmation'));
} else {
echo Display::return_message(get_lang('NotesSortedByTitleDESC'), 'confirmation');
Display::addFlash(Display::return_message(get_lang('NotesSortedByTitleDESC'), 'confirmation'));
}
break;
}
Session::write('notebook_view', Security::remove_XSS($_GET['view']));
NotebookTeacher::displayNotes();
} else {
NotebookTeacher::displayNotes();
header('Location: '.$currentUrl);
exit;
}
break;
default:
// Displaying the header
Display::display_header(get_lang(ucfirst($tool)));
Display::display_footer();
} else {
$session = api_get_session_entity(api_get_session_id());
$_course = api_get_course_info();
$web_course_path = api_get_path(WEB_COURSE_PATH);
$url = $web_course_path.$_course['path'].'/index.php'.($session ? '?id_session='.$session->getId() : '');
Display::addFlash(
Display::return_message($plugin->get_lang('ToolForTeacher'))
);
header('Location: '.$url);
exit;
}
} else {
echo $plugin->get_lang('ToolDisabled');
// Tool introduction
Display::display_introduction_section($noteBookTeacher);
NotebookTeacher::displayNotes();
break;
}
Display::display_footer();

@ -6,16 +6,17 @@
* main/img/icons/64/plugin_name.png
* main/img/icons/64/plugin_name_na.png
*/
/**
* Class OLPC_Peru_FilterPlugin.
*/
class OLPC_Peru_FilterPlugin extends Plugin
{
public $blacklist_enabled_file = '/var/sqg/blacklists';
public $blacklists_dir = '/var/squidGuard/blacklists';
public $isCoursePlugin = true;
//When creating a new course, these settings are added to the course
public $course_settings = [
];
// When creating a new course, these settings are added to the course
public $course_settings = [];
public $course_settings_callback = true;
public $error = '';
@ -54,7 +55,7 @@ class OLPC_Peru_FilterPlugin extends Plugin
public function uninstall()
{
//Deleting course settings
$this->uninstall_course_fields_in_all_courses($this->course_settings);
$this->uninstall_course_fields_in_all_courses();
}
/**

@ -35,7 +35,8 @@ class ChamiloPackageHandler extends PENSPackageHandler
// Moves the package to archive/pens
$path_to_archives = api_get_path(SYS_ARCHIVE_PATH).'pens';
if (!is_dir($path_to_archives)) {
mkdir($path_to_archives, 0777, true);
$mode = api_get_permissions_for_new_directories();
mkdir($path_to_archives, $mode, true);
}
rename($path_to_package, $path_to_archives.'/'.$request->getFilename());
// Insert the request in the database

@ -2,6 +2,7 @@ Test2Pdf plugin
===============
This plugin allows you to export questions from exercises to PDF
Este plugin da la posibilidad de obtener en formato PDF aquellas preguntas tipos test en los ejercicios de un curso.
Credits

@ -1,10 +0,0 @@
<?php
$type = 'Core';
$name = 'Courier';
$up = -100;
$ut = 50;
for ($i=0;$i<=255;$i++) {
$cw[chr($i)] = 600;
}
$enc = 'cp1252';
$uv = [0=>[0,128],128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>[8224,2],136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>[8216,2],147=>[8220,2],149=>8226,150=>[8211,2],152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>[160,96]];

@ -1,10 +0,0 @@
<?php
$type = 'Core';
$name = 'Courier-Bold';
$up = -100;
$ut = 50;
for ($i=0;$i<=255;$i++) {
$cw[chr($i)] = 600;
}
$enc = 'cp1252';
$uv = [0=>[0,128],128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>[8224,2],136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>[8216,2],147=>[8220,2],149=>8226,150=>[8211,2],152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>[160,96]];

@ -1,10 +0,0 @@
<?php
$type = 'Core';
$name = 'Courier-BoldOblique';
$up = -100;
$ut = 50;
for ($i=0;$i<=255;$i++) {
$cw[chr($i)] = 600;
}
$enc = 'cp1252';
$uv = [0=>[0,128],128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>[8224,2],136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>[8216,2],147=>[8220,2],149=>8226,150=>[8211,2],152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>[160,96]];

@ -1,10 +0,0 @@
<?php
$type = 'Core';
$name = 'Courier-Oblique';
$up = -100;
$ut = 50;
for ($i=0;$i<=255;$i++) {
$cw[chr($i)] = 600;
}
$enc = 'cp1252';
$uv = [0=>[0,128],128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>[8224,2],136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>[8216,2],147=>[8220,2],149=>8226,150=>[8211,2],152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>[160,96]];

@ -1,20 +0,0 @@
<?php
$type = 'Core';
$name = 'Helvetica';
$up = -100;
$ut = 50;
$cw = [
chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584,
','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667,
'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833,
'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556,
chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556,
chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500];
$enc = 'cp1252';
$uv = [0=>[0,128],128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>[8224,2],136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>[8216,2],147=>[8220,2],149=>8226,150=>[8211,2],152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>[160,96]];

@ -1,20 +0,0 @@
<?php
$type = 'Core';
$name = 'Helvetica-Bold';
$up = -100;
$ut = 50;
$cw = [
chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584,
','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722,
'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889,
'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556,
chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611,
chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556];
$enc = 'cp1252';
$uv = [0=>[0,128],128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>[8224,2],136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>[8216,2],147=>[8220,2],149=>8226,150=>[8211,2],152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>[160,96]];

@ -1,20 +0,0 @@
<?php
$type = 'Core';
$name = 'Helvetica-BoldOblique';
$up = -100;
$ut = 50;
$cw = [
chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584,
','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722,
'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889,
'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556,
chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611,
chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556];
$enc = 'cp1252';
$uv = [0=>[0,128],128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>[8224,2],136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>[8216,2],147=>[8220,2],149=>8226,150=>[8211,2],152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>[160,96]];

@ -1,20 +0,0 @@
<?php
$type = 'Core';
$name = 'Helvetica-Oblique';
$up = -100;
$ut = 50;
$cw = [
chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584,
','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667,
'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833,
'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556,
chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556,
chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500];
$enc = 'cp1252';
$uv = [0=>[0,128],128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>[8224,2],136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>[8216,2],147=>[8220,2],149=>8226,150=>[8211,2],152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>[160,96]];

@ -1,19 +0,0 @@
<?php
$type = 'Core';
$name = 'Symbol';
$up = -100;
$ut = 50;
$cw = [
chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549,
','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722,
'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768,
'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576,
'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0,
chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0,
chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603,
chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768,
chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042,
chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329,
chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0];
$uv = [32=>160,33=>33,34=>8704,35=>35,36=>8707,37=>[37,2],39=>8715,40=>[40,2],42=>8727,43=>[43,2],45=>8722,46=>[46,18],64=>8773,65=>[913,2],67=>935,68=>[916,2],70=>934,71=>915,72=>919,73=>921,74=>977,75=>[922,4],79=>[927,2],81=>920,82=>929,83=>[931,3],86=>962,87=>937,88=>926,89=>936,90=>918,91=>91,92=>8756,93=>93,94=>8869,95=>95,96=>63717,97=>[945,2],99=>967,100=>[948,2],102=>966,103=>947,104=>951,105=>953,106=>981,107=>[954,4],111=>[959,2],113=>952,114=>961,115=>[963,3],118=>982,119=>969,120=>958,121=>968,122=>950,123=>[123,3],126=>8764,160=>8364,161=>978,162=>8242,163=>8804,164=>8725,165=>8734,166=>402,167=>9827,168=>9830,169=>9829,170=>9824,171=>8596,172=>[8592,4],176=>[176,2],178=>8243,179=>8805,180=>215,181=>8733,182=>8706,183=>8226,184=>247,185=>[8800,2],187=>8776,188=>8230,189=>[63718,2],191=>8629,192=>8501,193=>8465,194=>8476,195=>8472,196=>8855,197=>8853,198=>8709,199=>[8745,2],201=>8835,202=>8839,203=>8836,204=>8834,205=>8838,206=>[8712,2],208=>8736,209=>8711,210=>63194,211=>63193,212=>63195,213=>8719,214=>8730,215=>8901,216=>172,217=>[8743,2],219=>8660,220=>[8656,4],224=>9674,225=>9001,226=>[63720,3],229=>8721,230=>[63723,10],241=>9002,242=>8747,243=>8992,244=>63733,245=>8993,246=>[63734,9]];

@ -1,20 +0,0 @@
<?php
$type = 'Core';
$name = 'Times-Roman';
$up = -100;
$ut = 50;
$cw = [
chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564,
','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722,
'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944,
'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778,
'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980,
chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333,
chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500,
chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500];
$enc = 'cp1252';
$uv = [0=>[0,128],128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>[8224,2],136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>[8216,2],147=>[8220,2],149=>8226,150=>[8211,2],152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>[160,96]];

@ -1,20 +0,0 @@
<?php
$type = 'Core';
$name = 'Times-Bold';
$up = -100;
$ut = 50;
$cw = [
chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570,
','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722,
'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000,
'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833,
'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333,
chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556,
chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500];
$enc = 'cp1252';
$uv = [0=>[0,128],128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>[8224,2],136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>[8216,2],147=>[8220,2],149=>8226,150=>[8211,2],152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>[160,96]];

@ -1,20 +0,0 @@
<?php
$type = 'Core';
$name = 'Times-BoldItalic';
$up = -100;
$ut = 50;
$cw = [
chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570,
','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667,
'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889,
'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778,
'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333,
chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556,
chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444];
$enc = 'cp1252';
$uv = [0=>[0,128],128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>[8224,2],136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>[8216,2],147=>[8220,2],149=>8226,150=>[8211,2],152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>[160,96]];

@ -1,20 +0,0 @@
<?php
$type = 'Core';
$name = 'Times-Italic';
$up = -100;
$ut = 50;
$cw = [
chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675,
','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611,
'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833,
'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722,
'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980,
chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333,
chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611,
chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500,
chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444];
$enc = 'cp1252';
$uv = [0=>[0,128],128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>[8224,2],136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>[8216,2],147=>[8220,2],149=>8226,150=>[8211,2],152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>[160,96]];

@ -1,19 +0,0 @@
<?php
$type = 'Core';
$name = 'ZapfDingbats';
$up = -100;
$ut = 50;
$cw = [
chr(0)=>0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0,
chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939,
','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692,
'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776,
'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873,
'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317,
chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0,
chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788,
chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788,
chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918,
chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874,
chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0];
$uv = [32=>32,33=>[9985,4],37=>9742,38=>[9990,4],42=>9755,43=>9758,44=>[9996,28],72=>9733,73=>[10025,35],108=>9679,109=>10061,110=>9632,111=>[10063,4],115=>9650,116=>9660,117=>9670,118=>10070,119=>9687,120=>[10072,7],128=>[10088,14],161=>[10081,7],168=>9827,169=>9830,170=>9829,171=>9824,172=>[9312,10],182=>[10102,31],213=>8594,214=>[8596,2],216=>[10136,24],241=>[10161,14]];

File diff suppressed because it is too large Load Diff

@ -1,8 +1,12 @@
<?php
/* For licensing terms, see /license.txt */
define('TABLE_TEST2PDF', 'plugin_ranking_score_global');
/**
* Config the plugin.
*
* @package chamilo.plugin.test2pdf
*
* @author Jose Angel Ruiz <desarrollo@nosolored.com>
*/
require_once __DIR__.'/../../main/inc/global.inc.php';
require_once api_get_path(LIBRARY_PATH).'plugin.class.php';
require_once 'src/test2pdf.lib.php';
require_once api_get_path(SYS_PLUGIN_PATH).'test2pdf/src/test2pdf_plugin.class.php';

@ -1,27 +0,0 @@
<?php
/* For license terms, see /license.txt */
/**
* Plugin database installation script. Can only be executed if included
* inside another script loading global.inc.php.
*
* @package chamilo.plugin.test2pdf
*/
/**
* Check if script can be called.
*/
if (!function_exists('api_get_path')) {
die('This script must be loaded through the Chamilo plugin installer sequence');
}
/**
* Create the script context, then execute database queries to enable.
*/
$table = Database::get_main_table(TABLE_TEST2PDF);
/*
$sql = "CREATE TABLE IF NOT EXISTS $table (
id INT unsigned NOT NULL auto_increment PRIMARY KEY,
tool_id INT unsigned NOT NULL DEFAULT '0',
score INT,
enable INT(1)
)";
Database::query($sql);
*/

@ -4,4 +4,4 @@
* Show form.
*/
require_once 'config.php';
//require_once('src/index.test2pdf.php');
require_once 'src/index.test2pdf.php';

@ -9,7 +9,7 @@
/**
* Initialization.
*/
require_once dirname(__FILE__).'/config.php';
require_once __DIR__.'/config.php';
if (!api_is_platform_admin()) {
die('You must have admin permissions to install plugins');
}

@ -6,7 +6,7 @@ $strings['enable_plugin'] = "Activar plugin";
$strings['ViewExercises'] = "Ver ejercicios";
$strings['NoExercise'] = "Sin ejercicios creados en el curso";
$strings['Exercise'] = "Ejercicio";
$strings['DownloadOnlyQuestion'] = "Descargar cuestiones";
$strings['DownloadOnlyQuestion'] = "Descargar preguntas";
$strings['DownloadOnlyAnswer'] = "Descargar respuestas";
$strings['DownloadAll'] = "Descargar todo";
$strings['PluginDisabledFromAdminPanel'] = "La herramienta está deshabilitada desde la administración";

@ -9,5 +9,5 @@
/**
* Plugin details (must be present).
*/
require_once dirname(__FILE__).'/config.php';
require_once __DIR__.'/config.php';
$plugin_info = Test2pdfPlugin::create()->get_info();

@ -1,281 +1,66 @@
<?php
/* For license terms, see /license.txt */
/**
* Configuration script for the Ranking plugin.
*
* @package chamilo.plugin.ranking
*/
require_once '../../../main/inc/global.inc.php';
$test2pdfPlugin = Test2pdfPlugin::create();
$enable = $test2pdfPlugin->get('enable_plugin');
if ($enable != "true") {
require_once '../config.php';
$plugin = Test2pdfPlugin::create();
$enable = $plugin->get('enable_plugin') == 'true';
if (!$enable) {
header('Location: ../../../index.php');
exit;
}
api_protect_course_script();
$course_id = (int) $_GET['c_id'];
$id_quiz = (int) $_GET['id_quiz'];
class TestToPDF extends FPDF
{
public $B;
public $I;
public $U;
public $HREF;
public $fontList;
public $issetfont;
public $issetcolor;
public function Header()
{
global $title_course;
global $title_quiz;
$logo = '../resources/img/logo.png';
$this->Image($logo, 10, 0);
// Title
$this->SetFont('Courier', 'I', 14);
$this->Cell(0, 5, $title_course, 0, 1, 'R');
$this->SetFont('Helvetica', 'I', 14);
$this->Cell(0, 5, $title_quiz, 0, 1, 'R');
// Line break
$this->SetLineWidth(0.5);
$this->SetDrawColor(60, 120, 255);
$this->Line(10, 24, 200, 24);
$this->SetLineWidth(0.4);
$this->SetDrawColor(200);
$this->Line(11, 24.5, 199, 24.5);
$this->Ln(10);
}
public function Footer()
{
global $test2pdfPlugin;
// Position at 1.5 cm from bottom
$this->SetY(-15);
$y = $this->GetY();
// Line break
$this->SetLineWidth(0.5);
$this->SetDrawColor(60, 120, 255);
$this->Line(10, $y, 200, $y);
$this->SetLineWidth(0.4);
$this->SetDrawColor(200);
$this->Line(11, $y + 0.5, 199, $y + 0.5);
// Arial italic 8
$this->SetFont('Arial', 'I', 8);
// Text color in gray
$this->SetTextColor(128);
// Page number
$this->Cell(0, 10, utf8_decode(sprintf($test2pdfPlugin->get_lang('PageX'), $this->PageNo())), 0, 0, 'C');
$this->Cell(0, 10, date('Y'), 0, 0, 'R');
}
public function PDF($orientation = 'P', $unit = 'mm', $format = 'A4')
{
//Call parent constructor
$this->__construct($orientation, $unit, $format);
//Initialization
$this->B = 0;
$this->I = 0;
$this->U = 0;
$this->HREF = '';
$this->fontlist = ['arial', 'times', 'courier', 'helvetica', 'symbol'];
$this->issetfont = false;
$this->issetcolor = false;
}
public function WriteHTML($html)
{
//HTML parser
$html = strip_tags($html, "<b><u><i><a><img><p><br><strong><em><font><tr><blockquote><style>"); //supprime tous les tags sauf ceux reconnus
$html = str_replace("\n", ' ', $html); //remplace retour à la ligne par un espace
$a = preg_split('/<(.*)>/U', $html, -1, PREG_SPLIT_DELIM_CAPTURE); //éclate la chaîne avec les balises
foreach ($a as $i => $e) {
if ($i % 2 == 0) {
//Text
if ($this->HREF) {
$this->PutLink($this->HREF, $e);
} else {
$this->Write(5, stripslashes(txtentities($e)));
}
} else {
//Tag
if ($e[0] == '/') {
$this->CloseTag(strtoupper(substr($e, 1)));
} else {
//Extract attributes
$a2 = explode(' ', $e);
$tag = strtoupper(array_shift($a2));
$attr = [];
foreach ($a2 as $v) {
if (preg_match('/([^=]*)=["\']?([^"\']*)/', $v, $a3)) {
$attr[strtoupper($a3[1])] = $a3[2];
}
}
$this->OpenTag($tag, $attr);
}
}
}
}
public function OpenTag($tag, $attr)
{
//Opening tag
switch ($tag) {
case 'STRONG':
$this->SetStyle('B', true);
break;
case 'EM':
$this->SetStyle('I', true);
break;
case 'B':
case 'I':
case 'U':
$this->SetStyle($tag, true);
break;
case 'A':
$this->HREF = $attr['HREF'];
break;
case 'IMG':
if (isset($attr['SRC']) && (isset($attr['WIDTH']) || isset($attr['HEIGHT']))) {
if (!isset($attr['WIDTH'])) {
$attr['WIDTH'] = 0;
}
if (!isset($attr['HEIGHT'])) {
$attr['HEIGHT'] = 0;
}
$this->Image($attr['SRC'], $this->GetX(), $this->GetY(), px2mm($attr['WIDTH']), px2mm($attr['HEIGHT']));
}
break;
case 'TR':
case 'BLOCKQUOTE':
case 'BR':
$this->Ln(5);
break;
case 'P':
$this->Ln(10);
break;
case 'FONT':
if (isset($attr['COLOR']) && $attr['COLOR'] != '') {
$coul = hex2dec($attr['COLOR']);
$this->SetTextColor($coul['R'], $coul['V'], $coul['B']);
$this->issetcolor = true;
}
if (isset($attr['FACE']) && in_array(strtolower($attr['FACE']), $this->fontlist)) {
$this->SetFont(strtolower($attr['FACE']));
$this->issetfont = true;
}
break;
}
}
$courseId = intval($_GET['c_id']);
$sessionId = api_get_session_id();
$quizId = intval($_GET['id_quiz']);
public function CloseTag($tag)
{
//Closing tag
if ($tag == 'STRONG') {
$tag = 'B';
}
if ($tag == 'EM') {
$tag = 'I';
}
if ($tag == 'B' || $tag == 'I' || $tag == 'U') {
$this->SetStyle($tag, false);
}
if ($tag == 'A') {
$this->HREF = '';
}
if ($tag == 'FONT') {
if ($this->issetcolor == true) {
$this->SetTextColor(0);
}
if ($this->issetfont) {
$this->SetFont('arial');
$this->issetfont = false;
}
}
}
$infoCourse = api_get_course_info_by_id($courseId);
$infoQuiz = getInfoQuiz($courseId, $quizId);
$titleCourse = removeHtml($infoCourse['title']);
$titleQuiz = removeHtml($infoQuiz['title']);
public function SetStyle($tag, $enable)
{
//Modify style and select corresponding font
$this->$tag += ($enable ? 1 : -1);
$style = '';
foreach (['B', 'I', 'U'] as $s) {
if ($this->$s > 0) {
$style .= $s;
}
}
$this->SetFont('', $style);
}
$mpdf = new PDF();
$mpdf->set_header($infoCourse);
$mpdf->set_footer();
$pdf = $mpdf->pdf;
$pdf->SetTitle($titleCourse.' - '.$titleQuiz);
$pdf->AddPage();
public function PutLink($URL, $txt)
{
//Put a hyperlink
$this->SetTextColor(0, 0, 255);
$this->SetStyle('U', true);
$this->Write(5, $txt, $URL);
$this->SetStyle('U', false);
$this->SetTextColor(0);
}
$pdf->SetFont('Arial', '', 16);
$pdf->SetTextColor(64);
$pdf->MultiCell(0, 7, $infoQuiz['title'], 0, 'L', false);
if (!empty($infoQuiz['description'])) {
$pdf->WriteHTML(removeQuotes($infoQuiz['description']));
}
//Obtener nombre del curso y nombre del ejercicio
//$info_course = CourseManager::get_course_information_by_id($course_id);
$info_course = api_get_course_info_by_id($course_id);
$info_quiz = getInfoQuiz($course_id, $id_quiz);
$title_course = utf8_decode(removeHtml($info_course['title']));
$title_quiz = utf8_decode(removeHtml($info_quiz['title']));
$pdf = new TestToPDF();
$pdf->SetTitle($title_course.' - '.$title_quiz);
$pdf->AddPage();
// Select all questions of the supported types from the given course
$array_question_id = getQuestions($course_id, $id_quiz);
$questionsList = getQuestions($courseId, $quizId, $sessionId);
// Go through all questions and get the answers
if ($_GET['type'] == 'question' || $_GET['type'] == 'all') {
$j = 1;
foreach ($array_question_id as $key => $value) {
$InfoQuestion = getInfoQuestion($course_id, $value);
if ($pdf->GetY() > 240) {
foreach ($questionsList as $key => $value) {
$infoQuestion = getInfoQuestion($courseId, $value);
if ($pdf->y > 240) {
$pdf->AddPage();
}
$pdf->SetFont('Arial', '', 12);
$pdf->SetTextColor(64);
if (trim($InfoQuestion['description']) != '') {
$j = 0;
$pdf->WriteHTML(utf8_decode(removeQuotes($InfoQuestion['description'])));
$pdf->Ln();
} else {
$pdf->MultiCell(0, 7, ($key + $j).' - '.utf8_decode($InfoQuestion['question']), 0, 'L', false);
$pdf->MultiCell(0, 7, ($key + $j).' - '.$infoQuestion['question'], 0, 'L', false);
if (!empty($infoQuestion['description'])) {
$pdf->WriteHTML(removeQuotes($infoQuestion['description']));
}
/*
if($InfoQuestion['question'] == "Enunciado"){
$j = 0;
$pdf->MultiCell(0,7,utf8_decode($InfoQuestion['question']),0,'L',false);
if(trim($InfoQuestion['description'])!=''){
$pdf->WriteHTML(utf8_decode(quitar_acentos($InfoQuestion['description'])));
$pdf->Ln();
}
}else{
$pdf->MultiCell(0,7,($key+$j).' - '.utf8_decode($InfoQuestion['question']),0,'L',false);
}*/
$InfoAnswer = getAnswers($course_id, $value);
foreach ($InfoAnswer as $key2 => $value2) {
$infoAnswer = getAnswers($courseId, $value);
foreach ($infoAnswer as $key2 => $value2) {
$pdf->SetFont('Arial', 'I', 10);
$pdf->SetTextColor(96);
$pdf->Cell(1, 7, '', 0, 0);
$pdf->Rect($pdf->GetX() + 2, $pdf->GetY(), 4, 4);
$pdf->Rect($pdf->x + 2, $pdf->y, 4, 4);
$pdf->Cell(7, 7, '', 0, 0);
$pdf->MultiCell(0, 5, $letters[$key2].' - '.utf8_decode(removeHtml($value2['answer'])), 0, 'L', false);
$pdf->MultiCell(0, 5, $letters[$key2].' - '.removeHtml($value2['answer']), 0, 'L', false);
$pdf->Ln(1);
}
$pdf->Ln(4);
@ -283,46 +68,51 @@ if ($_GET['type'] == 'question' || $_GET['type'] == 'all') {
}
$j = 1;
if ($_GET['type'] == 'answer' || $_GET['type'] == 'all') {
$array_resp = [];
foreach ($array_question_id as $key => $value) {
$InfoQuestion = getInfoQuestion($course_id, $value);
if ($InfoQuestion['question'] == $test2pdfPlugin->get_lang('Statement')) {
$answerList = [];
foreach ($questionsList as $key => $value) {
$infoQuestion = getInfoQuestion($courseId, $value);
if ($infoQuestion['question'] == $plugin->get_lang('Statement')) {
$j = 0;
} else {
$respuestas = '';
$InfoQuestion = getInfoQuestion($course_id, $value);
if ($InfoQuestion['type'] == 2 || $InfoQuestion['type'] == 9 || $InfoQuestion['type'] == 11 || $InfoQuestion['type'] == 12 || $InfoQuestion['type'] == 14) {
$InfoAnswer = getAnswers($course_id, $value);
$respuestas .= ' '.($key + $j).' -';
foreach ($InfoAnswer as $key2 => $value2) {
$answers = '';
$infoQuestion = getInfoQuestion($courseId, $value);
if ($infoQuestion['type'] == 2 ||
$infoQuestion['type'] == 9 ||
$infoQuestion['type'] == 11 ||
$infoQuestion['type'] == 12 ||
$infoQuestion['type'] == 14
) {
$infoAnswer = getAnswers($courseId, $value);
$answers .= ' '.($key + $j).' -';
foreach ($infoAnswer as $key2 => $value2) {
if ($value2['correct'] == 1) {
$respuestas .= ' '.$letters[$key2].',';
$answers .= ' '.$letters[$key2].',';
}
}
$i = strrpos($respuestas, ',');
$respuestas = substr($respuestas, 0, $i);
$respuestas .= ' ';
$array_resp[] = $respuestas;
$i = strrpos($answers, ',');
$answers = substr($answers, 0, $i);
$answers .= ' ';
$answerList[] = $answers;
} else {
$InfoAnswer = getAnswers($course_id, $value);
foreach ($InfoAnswer as $key2 => $value2) {
$infoAnswer = getAnswers($courseId, $value);
foreach ($infoAnswer as $key2 => $value2) {
if ($value2['correct'] == 1) {
$respuestas .= ' '.($key + $j).' - '.$letters[$key2].' ';
$answers .= ' '.($key + $j).' - '.$letters[$key2].' ';
break;
}
}
$array_resp[] = $respuestas;
$answerList[] = $answers;
}
}
}
$pdf->SetFont('Arial', '', 12);
$pdf->SetTextColor(64);
$pdf->Cell(0, 7, utf8_decode($test2pdfPlugin->get_lang('AnswersColumn')), 0, 1, 'L', false);
$pdf->Cell(0, 7, $plugin->get_lang('AnswersColumn'), 0, 1, 'L', false);
$pdf->SetFont('Arial', 'I', 10);
$pdf->SetTextColor(64, 64, 255);
$i = 1;
foreach ($array_resp as $resp) {
foreach ($answerList as $resp) {
$pdf->Cell(50, 6, $resp, 0);
if ($i % 4 == 0) {
$pdf->Ln();

@ -5,43 +5,60 @@
*
* @package chamilo.plugin.test2pdf
*/
/**
* Init.
*/
require_once '../../../main/inc/global.inc.php';
require_once '../config.php';
require_once api_get_path(LIBRARY_PATH).'plugin.class.php';
$letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
$letters = [
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z',
];
/**
* List exercises.
*
* @param int $course_id Course ID
* @param int $session_id Session ID
* @param int $courseId Course ID
* @param int $sessionId Session ID
*
* @throws Exception
*
* @return array Results (list of exercice details)
* @return array Results (list of exercise details)
*/
function showExerciseCourse($course_id, $session_id = 0)
function showExerciseCourse($courseId, $sessionId = 0)
{
$course_id = (int) $course_id;
$session_id = (int) $session_id;
$tableQuiz = Database::get_course_table(TABLE_QUIZ_TEST);
$tableLpItem = Database::get_course_table(TABLE_LP_ITEM);
$courseId = (int) $courseId;
$sessionId = (int) $sessionId;
$conditionSession = api_get_session_condition($sessionId, true, true, 'a.session_id');
$sql = "SELECT a.*
FROM $tableQuiz a
LEFT JOIN $tableLpItem b
ON a.iid = b.path AND a.c_id = b.c_id
WHERE a.c_id = $course_id
AND (a.session_id = $session_id OR a.session_id IS NULL)
AND (a.active = 1 OR (item_type = 'quiz' AND b.c_id = $course_id))
ORDER BY a.title ASC;";
FROM $tableQuiz a
LEFT JOIN $tableLpItem b ON a.iid = b.path AND a.c_id = b.c_id
WHERE a.c_id = $courseId
AND (a.active = 1 OR (item_type = 'quiz' AND b.c_id = $courseId))
$conditionSession
ORDER BY a.title ASC;";
$res = Database::query($sql);
if (!$res) {
die("Error Database $tableQuiz");
}
$aux = [];
while ($row = Database::fetch_assoc($res)) {
$aux[] = $row;
@ -57,16 +74,13 @@ function showExerciseCourse($course_id, $session_id = 0)
*
* @return array Results (list of quiz details)
*/
function getInfoQuiz($c_id, $id)
function getInfoQuiz($courseId, $id)
{
$c_id = (int) $c_id;
$courseId = (int) $courseId;
$id = (int) $id;
$tableQuiz = Database::get_course_table(TABLE_QUIZ_TEST);
$sql = "SELECT * FROM $tableQuiz WHERE c_id = $c_id AND iid = $id";
$sql = "SELECT * FROM $tableQuiz WHERE c_id = $courseId AND iid = $id";
$res = Database::query($sql);
if (!$res) {
die("Error Database $tableQuiz");
}
$row = Database::fetch_assoc($res);
return $row;
@ -79,22 +93,26 @@ function getInfoQuiz($c_id, $id)
*
* @return array Results (list question ID)
*/
function getQuestions($c_id, $quizId)
function getQuestions($courseId, $quizId, $sessionId = 0)
{
$c_id = (int) $c_id;
$courseId = (int) $courseId;
$quizId = (int) $quizId;
$sessionId = (int) $sessionId;
$tableQuizQuestion = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);
$tableQuestion = Database::get_course_table(TABLE_QUIZ_QUESTION);
$tableQuiz = Database::get_course_table(TABLE_QUIZ_TEST);
$conditionSession = api_get_session_condition($sessionId, true, true, 'q.session_id');
$sql = "SELECT a.question_id AS question_id
FROM $tableQuizQuestion a
INNER JOIN $tableQuestion b ON a.question_id = b.iid
WHERE a.c_id = $c_id AND b.c_id = a.c_id AND a.exercice_id = $quizId
AND (b.type IN (1, 2, 9, 10, 11, 12, 14))
ORDER BY question_order ASC;";
FROM $tableQuizQuestion a
INNER JOIN $tableQuestion b ON a.question_id = b.iid
INNER JOIN $tableQuiz q ON q.iid = a.exercice_id
WHERE a.c_id = $courseId AND b.c_id = a.c_id AND a.exercice_id = $quizId
AND (b.type IN (1, 2, 9, 10, 11, 12, 14))
$conditionSession
ORDER BY question_order ASC;";
$res = Database::query($sql);
if (!$res) {
die("Error Database $tableQuizQuestion");
}
$aux = [];
while ($row = Database::fetch_assoc($res)) {
$aux[] = $row['question_id'];
@ -110,19 +128,16 @@ function getQuestions($c_id, $quizId)
*
* @return array Results (list of question details)
*/
function getInfoQuestion($c_id, $id)
function getInfoQuestion($courseId, $id)
{
$c_id = (int) $c_id;
$courseId = (int) $courseId;
$id = (int) $id;
$tableQuestion = Database::get_course_table(TABLE_QUIZ_QUESTION);
$sql = "SELECT * FROM $tableQuestion
WHERE c_id = $c_id
AND iid = $id
AND (type IN (1, 2, 9, 10, 11, 12, 14))";
WHERE c_id = $courseId
AND iid = $id
AND (type IN (1, 2, 9, 10, 11, 12, 14))";
$res = Database::query($sql);
if (!$res) {
die("Error Database $tableQuestion");
}
$row = Database::fetch_assoc($res);
return $row;
@ -135,18 +150,15 @@ function getInfoQuestion($c_id, $id)
*
* @return array Results (list of answer by question_id)
*/
function getAnswers($c_id, $id)
function getAnswers($courseId, $id)
{
$c_id = (int) $c_id;
$courseId = (int) $courseId;
$id = (int) $id;
$tableQuizAnswer = Database::get_course_table(TABLE_QUIZ_ANSWER);
$sql = "SELECT * FROM $tableQuizAnswer
WHERE c_id = $c_id AND question_id = $id
ORDER BY position ASC;";
WHERE c_id = $courseId AND question_id = $id
ORDER BY position ASC;";
$res = Database::query($sql);
if (!$res) {
die("Error Database $tableQuizAnswer");
}
$aux = [];
while ($row = Database::fetch_assoc($res)) {
$aux[] = $row;
@ -174,37 +186,35 @@ function removeHtml($string)
$txt = str_replace("</html>", "", $txt);
$txt = strip_tags($txt);
$txt = str_replace(chr(13).chr(10), "", $txt);
/*
$txt=str_replace("&nbsp;"," ",$txt);
$txt=str_replace("&Aacute;","Á",$txt);
$txt=str_replace("&aacute;","á",$txt);
$txt=str_replace("&Eacute;","É",$txt);
$txt=str_replace("&eacute;","é",$txt);
$txt=str_replace("&Iacute;","Í",$txt);
$txt=str_replace("&iacute;","í",$txt);
$txt=str_replace("&Oacute;","Ó",$txt);
$txt=str_replace("&oacute;","ó",$txt);
$txt=str_replace("&Uacute;","Ú",$txt);
$txt=str_replace("&uacute;","ú",$txt);
$txt=str_replace("&Ntilde;","Ñ",$txt);
$txt=str_replace("&ntilde;","ñ",$txt);
$txt=str_replace("&agrave;","à",$txt);
$txt=str_replace("&Agrave;","À",$txt);
$txt=str_replace("&iexcl;","¡",$txt);
$txt=str_replace("&middot;","·",$txt);
$txt=str_replace("&Ccedil;","Ç",$txt);
$txt=str_replace("&ccedil;","ç",$txt);
$txt=str_replace("&quot;",'"',$txt);
$txt=str_replace("&ordf;",'ª',$txt);
$txt=str_replace("&ordm;",'º',$txt);
$txt=str_replace("&amp;",'&',$txt);
$txt=str_replace("&bull;",'•',$txt);
$txt=str_replace("&iquest;",'¿',$txt);
$txt=str_replace("&euro;",'EUR',$txt);
$txt=str_replace("&uuml;",'ü',$txt);
$txt=str_replace("&Uuml;",'Ü',$txt);
$txt=str_replace("&uml;",'¨',$txt);*/
$txt = str_replace("&nbsp;", " ", $txt);
$txt = str_replace("&Aacute;", "Á", $txt);
$txt = str_replace("&aacute;", "á", $txt);
$txt = str_replace("&Eacute;", "É", $txt);
$txt = str_replace("&eacute;", "é", $txt);
$txt = str_replace("&Iacute;", "Í", $txt);
$txt = str_replace("&iacute;", "í", $txt);
$txt = str_replace("&Oacute;", "Ó", $txt);
$txt = str_replace("&oacute;", "ó", $txt);
$txt = str_replace("&Uacute;", "Ú", $txt);
$txt = str_replace("&uacute;", "ú", $txt);
$txt = str_replace("&Ntilde;", "Ñ", $txt);
$txt = str_replace("&ntilde;", "ñ", $txt);
$txt = str_replace("&agrave;", "à", $txt);
$txt = str_replace("&Agrave;", "À", $txt);
$txt = str_replace("&iexcl;", "¡", $txt);
$txt = str_replace("&middot;", "·", $txt);
$txt = str_replace("&Ccedil;", "Ç", $txt);
$txt = str_replace("&ccedil;", "ç", $txt);
$txt = str_replace("&quot;", '"', $txt);
$txt = str_replace("&ordf;", 'ª', $txt);
$txt = str_replace("&ordm;", 'º', $txt);
$txt = str_replace("&amp;", '&', $txt);
$txt = str_replace("&bull;", '•', $txt);
$txt = str_replace("&iquest;", '¿', $txt);
$txt = str_replace("&euro;", 'EUR', $txt);
$txt = str_replace("&uuml;", 'ü', $txt);
$txt = str_replace("&Uuml;", 'Ü', $txt);
$txt = str_replace("&uml;", '¨', $txt);
return $txt;
}
@ -218,7 +228,6 @@ function removeHtml($string)
*/
function removeQuotes($string)
{
//$txt=strip_tags($cadena);
$txt = str_replace("&nbsp;", " ", $string);
$txt = str_replace("&Aacute;", "Á", $txt);
$txt = str_replace("&aacute;", "á", $txt);
@ -251,53 +260,3 @@ function removeQuotes($string)
return $txt;
}
/**
* Returns an associative array (keys: R,G,B) from a hex html code (e.g. #3FE5AA).
*
* @param string $color
*
* @return array
*/
function hex2dec($color = '#000000')
{
$R = substr($color, 1, 2);
$rouge = hexdec($R);
$V = substr($color, 3, 2);
$vert = hexdec($V);
$B = substr($color, 5, 2);
$bleu = hexdec($B);
$tbl_couleur = [];
$tbl_couleur['R'] = $rouge;
$tbl_couleur['V'] = $vert;
$tbl_couleur['B'] = $bleu;
return $tbl_couleur;
}
/**
* Conversion of pixel -> millimeter at 72 dpi.
*
* @param $px
*
* @return float|int
*/
function px2mm($px)
{
return $px * 25.4 / 72;
}
/**
* Transform from HTML to text.
*
* @param string $html HTML string
*
* @return string Pure text version of the given string
*/
function txtentities($html)
{
$trans = get_html_translation_table(HTML_ENTITIES);
$trans = array_flip($trans);
return strtr($html, $trans);
}

@ -1,19 +1,10 @@
<?php
/* For license terms, see /license.txt
/* To show the plugin course icons you need to add these icons:
* main/img/icons/22/ranking.png
* main/img/icons/64/ranking.png
* main/img/icons/64/ranking_na.png
*/
/**
* Description of test2pdf_plugin.
* Plugin class for the Test2Pdf plugin.
*
* @package chamilo.plugin.test2pdf
*
* @author Jose Angel Ruiz <jaruiz@nosolored.com>
*/
/**
* Plugin class for the Test2pdf plugin.
* @author Jose Angel Ruiz <desarrollo@nosolored.com>
*/
class Test2pdfPlugin extends Plugin
{
@ -47,7 +38,21 @@ class Test2pdfPlugin extends Plugin
{
//Installing course settings
$this->install_course_fields_in_all_courses();
require_once api_get_path(SYS_PLUGIN_PATH).'test2pdf/database.php';
$srcfile1 = __DIR__.'/../resources/img/64/test2pdf.png';
$srcfile2 = __DIR__.'/../resources/img/64/test2pdf_na.png';
$srcfile3 = __DIR__.'/../resources/img/22/test2pdf.png';
$dstfile1 = __DIR__.'/../../../main/img/icons/64/test2pdf.png';
$dstfile2 = __DIR__.'/../../../main/img/icons/64/test2pdf_na.png';
$dstfile3 = __DIR__.'/../../../main/img/test2pdf.png';
$res1 = @copy($srcfile1, $dstfile1);
$res2 = @copy($srcfile2, $dstfile2);
$res3 = @copy($srcfile3, $dstfile3);
if (!$res1 || !$res2 || !$res3) {
$warning = 'Test2PDF plugin icons could not be copied to main/img/ because of folder permissions. To fix, give web server user permissions to write to main/img/ before enabling this plugin.';
Display::addFlash($warning);
error_log($warning);
}
}
/**
@ -55,17 +60,8 @@ class Test2pdfPlugin extends Plugin
*/
public function uninstall()
{
//Deleting course settings
// Deleting course settings.
$this->uninstall_course_fields_in_all_courses($this->course_settings);
$tablesToBeDeleted = [
TABLE_TEST2PDF,
];
foreach ($tablesToBeDeleted as $tableToBeDeleted) {
$table = Database::get_main_table($tableToBeDeleted);
$sql = "DROP TABLE IF EXISTS $tableToBeDeleted";
Database::query($sql);
}
$this->manageTab(false);
}
}

@ -5,35 +5,31 @@
*
* @package chamilo.plugin.test2pdf
*/
/**
* Initialization.
*/
require_once dirname(__FILE__).'/test2pdf.lib.php';
require_once '../../../main/inc/global.inc.php';
require_once 'test2pdf_plugin.class.php';
require_once '../config.php';
api_protect_course_script(true);
$plugin = Test2pdfPlugin::create();
$t2p_plugin = $plugin->get('enable_plugin');
$enable = $plugin->get('enable_plugin') == 'true';
if ($t2p_plugin === 'true') {
if ($enable) {
$templateName = $plugin->get_lang('ViewExercises');
$tpl = new Template($templateName);
$course_id = api_get_course_int_id();
$courseId = api_get_course_int_id();
$sessionId = api_get_session_id();
// Leer Datos y Mostrar tabla
$iconInfo = api_get_path(WEB_PLUGIN_PATH).'test2pdf/resources/img/24/info.png';
$iconDownload = api_get_path(WEB_PLUGIN_PATH).'test2pdf/resources/img/32/download.png';
$info_exercise = showExerciseCourse($course_id);
$tpl->assign('infoExercise', $info_exercise);
$tpl->assign('course_id', $course_id);
$tpl->assign('iconInfo', $iconInfo);
$tpl->assign('iconDownload', $iconDownload);
$infoExercise = showExerciseCourse($courseId, $sessionId);
$tpl->assign('infoExercise', $infoExercise);
$tpl->assign('course_id', $courseId);
$listing_tpl = 'test2pdf/view/view-pdf.tpl';
$content = $tpl->fetch($listing_tpl);
$tpl->assign('content', $content);
$tpl->display_one_col_template();
} else {
header('Location: ../../../index.php');
Display::addFlash(Display::return_message($plugin->get_lang('PluginDisabledFromAdminPanel')));
header(
'Location:'.api_get_path(WEB_PATH).'courses/'.
api_get_course_id().'/index.php?id_session='.api_get_session_id()
);
exit;
}

@ -1,27 +1,28 @@
<?php
/* For license terms, see /license.txt */
/**
* This script initiates a test2pdf plugin.
*
* @package chamilo.plugin.test2pdf
*/
require __DIR__.'/../../vendor/autoload.php';
require_once __DIR__.'/../../vendor/autoload.php';
$course_plugin = 'test2pdf'; //needed in order to load the plugin lang variables
require_once dirname(__FILE__).'/config.php';
//$_setting['student_view_enabled'] = 'false';
require_once __DIR__.'/config.php';
$tool_name = get_lang('Test2pdf');
$tpl = new Template($tool_name);
$plugin = Test2pdfPlugin::create();
$t2p_plugin = $plugin->get('enable_plugin');
$enable = $plugin->get('enable_plugin') == 'true';
if ($t2p_plugin == "true") {
if ($enable) {
$url = 'src/view-pdf.php?'.api_get_cidreq();
header('Location: '.$url);
exit;
} else {
echo get_lang('PluginDisabledFromAdminPanel');
Display::addFlash(Display::return_message($plugin->get_lang('PluginDisabledFromAdminPanel')));
$url = api_get_path(WEB_PATH).'courses/'.api_get_course_id().'/index.php?id_session='.api_get_session_id();
header('Location:'.$url);
exit;
}

@ -10,5 +10,5 @@
/**
* Queries.
*/
require_once dirname(__FILE__).'/config.php';
require_once __DIR__.'/config.php';
Test2pdfPlugin::create()->uninstall();

@ -7,9 +7,9 @@
<table id="courses_table" class="data_table table">
<tr class="row_odd">
<th class="th-header">{{ 'Exercise'|get_plugin_lang('Test2pdfPlugin') }}</th>
<th class="th-header ta-center">{{ 'DownloadOnlyQuestion'|get_plugin_lang('Test2pdfPlugin') }}</th>
<th class="th-header ta-center">{{ 'DownloadOnlyAnswer'|get_plugin_lang('Test2pdfPlugin') }}</th>
<th class="th-header ta-center">{{ 'DownloadAll'|get_plugin_lang('Test2pdfPlugin') }}</th>
<th class="th-header text-center">{{ 'DownloadOnlyQuestion'|get_plugin_lang('Test2pdfPlugin') }}</th>
<th class="th-header text-center">{{ 'DownloadOnlyAnswer'|get_plugin_lang('Test2pdfPlugin') }}</th>
<th class="th-header text-center">{{ 'DownloadAll'|get_plugin_lang('Test2pdfPlugin') }}</th>
</tr>
{% set i = 0 %}
@ -20,13 +20,13 @@
&nbsp;&nbsp;&nbsp;<img src="{{ 'quiz.png'|icon(32) }}">
<strong>{{ item.title }}</strong>
</td>
<td class="ta-center">
<td class="text-center">
<a target="_blank" href="download-pdf.php?type=question&c_id={{course_id}}&id_quiz={{item.id}}" title="{{ 'DownloadOnlyQuestion'|get_plugin_lang('Test2pdfPlugin') }}"><img src="{{ 'pdf.png'|icon(32) }}" /></a>
</td>
<td class="ta-center">
<td class="text-center">
<a target="_blank" href="download-pdf.php?type=answer&c_id={{course_id}}&id_quiz={{item.id}}" title="{{ 'DownloadOnlyAnswer'|get_plugin_lang('Test2pdfPlugin') }}"><img src="{{ 'pdf.png'|icon(32) }}" /></a>
</td>
<td class="ta-center">
<td class="text-center">
<a target="_blank" href="download-pdf.php?type=all&c_id={{course_id}}&id_quiz={{item.id}}" title="{{ 'DownloadAll'|get_plugin_lang('Test2pdfPlugin') }}"><img src="{{ 'pdf.png'|icon(32) }}" /></a>
</td>
</tr>

@ -74,5 +74,6 @@ api_add_setting(0, 'vchamilo_vcrontickperiod', 'vchamilo', 'setting', 'Plugins')
// create root storage directory for templates
global $_configuration;
if (!is_dir($_configuration['root_sys'].'plugin/vchamilo/templates')) {
mkdir($_configuration['root_sys'].'plugin/vchamilo/templates', 0777, true);
$mode = api_get_permissions_for_new_directories();
mkdir($_configuration['root_sys'].'plugin/vchamilo/templates', $mode, true);
}

@ -211,13 +211,12 @@ class Virtual
try {
$database = new \Database();
$database->connect(
$connection = $database->connect(
$dbParams,
$_configuration['root_sys'],
$_configuration['root_sys'],
true
);
$connection = $database->getConnection();
} catch (Exception $e) {
echo 'Side connection failure with '.$_configuration['db_host'].', '.$_configuration['db_user'].', ******** ';
die();
@ -605,7 +604,8 @@ class Virtual
// Scans the templates.
if (!is_dir($tempDir)) {
mkdir($tempDir, 0777, true);
$mode = api_get_permissions_for_new_directories();
mkdir($tempDir, $mode, true);
}
$finder = new \Symfony\Component\Finder\Finder();
@ -902,7 +902,7 @@ class Virtual
try {
$database = new \Database();
$database->connect(
$manager = $database->connect(
$dbParams,
api_get_configuration_value('root_sys'),
api_get_configuration_value('root_sys'),
@ -910,12 +910,11 @@ class Virtual
true
);
$manager = $database->getManager();
if ($getManager) {
return $manager;
}
return $database->getConnection();
return $manager->getConnection();
} catch (Exception $e) {
error_log($e->getMessage());
}
@ -1280,10 +1279,10 @@ class Virtual
// this is very important here (DO NOT USE api_get_path() !!) because storage may be remotely located
$absAlternateCourse = self::getConfig('vchamilo', 'course_real_root');
$courseDir = $absAlternateCourse.'/'.$slug;
$mode = api_get_permissions_for_new_directories();
if (!is_dir($courseDir)) {
self::ctrace("Creating physical course dir in $courseDir");
mkdir($courseDir, 0777, true);
mkdir($courseDir, $mode, true);
// initiate default index
$indexFile = $courseDir.'/index.html';
if ($indexFile) {
@ -1316,7 +1315,7 @@ class Virtual
self::ctrace("Making dir as $dir");
if (!is_dir($dir)) {
if (!mkdir($dir, 0777, true)) {
if (!mkdir($dir, $mode, true)) {
self::ctrace("Error creating dir $dir \n");
}
}

@ -41,7 +41,8 @@ $VCRON->TRACE = '/data/log/chamilo/vcrontrace.log'; // Trace file where to colle
$VCRON->TRACE_ENABLE = true; // enables tracing
if (!is_dir($_configuration['root_sys'].'plugin/vchamilo/log')) {
mkdir($_configuration['root_sys'].'plugin/vchamilo/log', 0777, true);
$mode = api_get_permissions_for_new_directories();
mkdir($_configuration['root_sys'].'plugin/vchamilo/log', $mode, true);
}
/**

@ -125,6 +125,7 @@ switch ($action) {
// Make template directory (files and SQL).
$separator = DIRECTORY_SEPARATOR;
$dirMode = api_get_permissions_for_new_directories();
$backupDir = api_get_path(SYS_PATH).'plugin'.$separator.'vchamilo'.$separator.'templates'.$separator.$vhost->slug.$separator;
@ -132,7 +133,7 @@ switch ($action) {
$absolute_sqldir = $backupDir.'dump.sql';
if (!is_dir($backupDir)) {
$result = mkdir($backupDir, 0777, true);
$result = mkdir($backupDir, $dirMode, true);
if ($result) {
Display::addFlash(
Display::return_message('Directory created: '.$backupDir)
@ -147,8 +148,8 @@ switch ($action) {
if ($vchamilostep == 0) {
// Create directories, if necessary.
if (!is_dir($absolute_datadir)) {
mkdir($absolute_datadir, 0777, true);
mkdir($absolute_datadir.'/home', 0777, true);
mkdir($absolute_datadir, $dirMode, true);
mkdir($absolute_datadir.'/home', $dirMode, true);
}
if (empty($fullautomation)) {

@ -40,14 +40,14 @@ $dbParams = [
try {
$database = new \Database();
$database->connect(
$connection = $database->connect(
$dbParams,
$_configuration['root_sys'],
$_configuration['root_sys'],
true
);
$list = $database->getConnection()->getSchemaManager()->listDatabases();
$list = $connection->getSchemaManager()->listDatabases();
echo $plugin->get_lang('connectionok');
} catch (Exception $e) {
echo $plugin->get_lang('badconnection');

@ -1,7 +1,7 @@
In order to run behat tests locally with the right support for browser
and JS environments under Linux, you will need to:
- Download Selenium Standalone Server v3.1.0
- Download Selenium Standalone Server v3.*
http://www.seleniumhq.org/download/

@ -180,7 +180,7 @@ class FeatureContext extends MinkContext
/**
* @When /^I invite to a friend with id "([^"]*)" to a social group with id "([^"]*)"$/
*/
public function iInviteAFrienToASocialGroup($friendId, $groupId)
public function iInviteAFriendToASocialGroup($friendId, $groupId)
{
$this->visit('/main/social/group_invitation.php?id=' . $groupId);
$this->fillField('invitation[]', $friendId);
@ -336,6 +336,22 @@ class FeatureContext extends MinkContext
");
}
/**
* @When /^(?:|I )fill in select bootstrap static by text "(?P<field>(?:[^"]|\\")*)" select "(?P<value>(?:[^"]|\\")*)"$/
*/
public function iFillInSelectStaticBootstrapInputWithAndSelectByText($field, $value)
{
$this->getSession()->wait(1000);
$this->getSession()->executeScript("
$('$field > option').each(function(index, option) {
if (option.text == '$value') {
$('$field').selectpicker('val', option.value);
}
});
");
}
/**
* @When /^wait for the page to be loaded$/
*/
@ -404,4 +420,29 @@ class FeatureContext extends MinkContext
return true;
}
/**
* @Then /^I should see an icon with title "([^"]*)"$/
*/
public function iShouldSeeAnIconWithTitle($value)
{
$el = $this->getSession()->getPage()->find('xpath', "//img[@title='$value']");
if (null === $el) {
throw new Exception(
'Could not find an icon with title: '.$value
);
}
return true;
}
/**
* @Then /^I should not see an icon with title "([^"]*)"$/
*/
public function iShouldNotSeeAnIconWithTitle($value)
{
$el = $this->getSession()->getPage()->find('xpath', "//img[@title='$value']");
if (null === $el) {
return true;
}
return false;
}
}

@ -7,7 +7,7 @@ Feature: Subscribe users to the course
Given I am on "/main/user/subscribe_user.php?keyword=amann&type=5&cidReq=TEMP"
Then I should see "Aimee"
Then I follow "Register"
Then I should see "Aimee Mann has been registered to your course"
Then I should see "Aimee Mann (amann) has been registered to your course"
Scenario: Unsubscribe user "amann" the course "TEMP"
Given I am on "/main/user/user.php?cidReq=TEMP"
@ -20,4 +20,4 @@ Feature: Subscribe users to the course
Given I am on "/main/user/subscribe_user.php?keyword=acostea&type=5&cidReq=TEMP"
Then I should see "Andrea"
Then I follow "Register"
Then I should see "Andrea Costea has been registered to your course"
Then I should see "Andrea Costea (acostea) has been registered to your course"

@ -11,7 +11,7 @@ Feature: Announcement tool
When I fill in the following:
| title | Announcement test |
And I press "choose_recipients"
And I select "John Doe" from "users-f"
And I select "John Doe" from "users"
And I press "add"
And I fill in ckeditor field "content" with "Announcement description"
And I press "submit"

@ -89,7 +89,7 @@ Feature: Exercise tool
And I follow "Fill blanks or form"
When I fill in the following:
| questionName | Fill blanks |
Then I fill in ckeditor field "answer" with "Romeo and [Juliet]"
Then I fill in ckeditor field "answer" with "Romeo and [Juliet] [Hätten||Haetten] [möchte||moechte] [wäre||waere] [können||koennen] [Könnten||Koennten] [Ärger] [voilà] [müssen] [l'été] [cherchent à] [Übung] [Ärger|Möglichkeit]"
And I press "submitQuestion"
Then I should see "Item added"
@ -208,7 +208,6 @@ Feature: Exercise tool
And I press "submitQuestion"
Then I should see "Item added"
Scenario: Add question "Global multiple answer" to exercise created "Exercise 1"
Given I am on "/main/exercise/exercise.php?cidReq=TEMP"
And I follow "Exercise 1"
@ -233,7 +232,6 @@ Feature: Exercise tool
And I press "submitQuestion"
Then I should see "Item added"
Scenario: Try exercise "Exercise 1"
Given I am on "/main/exercise/exercise.php?cidReq=TEMP"
And I follow "Exercise 1"
@ -251,6 +249,18 @@ Feature: Exercise tool
# Question 3
Then I fill in the following:
| choice_id_3_0 | Juliet |
| choice_id_3_1 | Hätten |
| choice_id_3_2 | möchte |
| choice_id_3_3 | wäre |
| choice_id_3_4 | können |
| choice_id_3_5 | Könnten |
| choice_id_3_6 | Ärger |
| choice_id_3_7 | voilà |
| choice_id_3_8 | müssen |
| choice_id_3_9 | l'été |
| choice_id_3_10 | cherchent à |
| choice_id_3_11 | Übung |
Then I fill in select bootstrap static by text "#choice_id_3_12" select "Ärger"
And wait for the page to be loaded
Then I press "Next question"
# Question 4 - Matching
@ -265,11 +275,13 @@ Feature: Exercise tool
Then wait for the page to be loaded
Then I press "Next question"
# Question 7 - Exact answers combination
#Then I check radio button with label "Answer true"
Then I check "Answer true"
Then I press "Next question"
Then wait for the page to be loaded
# Question 8 - Unique answer with unknown
#@todo
And I check the "Answer true" radio button
Then I press "Next question"
Then wait for the page to be loaded
# Question 9 - Multiple answer true - false - dont know
#@todo
Then I press "Next question"
@ -277,9 +289,9 @@ Feature: Exercise tool
#@todo
Then I press "Next question"
# Question 11 - Global multiple answer
#Then I check radio button with label "Answer true"
Then I check "Answer true"
Then I press "End test"
Then I should see "Score for the test: 41 / 105"
Then I should see "Score for the test: 83 / 117"
Scenario: Check exercise result
Given I am on "/main/exercise/exercise.php?cidReq=TEMP"
@ -289,7 +301,7 @@ Feature: Exercise tool
Then I should see "Learner score"
And wait for the page to be loaded
And I follow "Grade activity"
Then I should see "Score for the test: 41 / 105"
Then I should see "Score for the test: 83 / 117"
Scenario: Duplicate exercise
Given I am on "/main/exercise/exercise.php?cidReq=TEMP"
@ -313,3 +325,11 @@ Feature: Exercise tool
Given I am on "/main/exercise/tests_category.php?cidReq=TEMP"
And I follow "Delete"
Then I should see "Category deleted"
Scenario: Import exercise from excel
Given I am on "/main/exercise/upload_exercise.php?cidReq=TEMP"
Then I should see "Import quiz from Excel"
Then I attach the file "/main/exercise/quiz_template.xls" to "user_upload_quiz"
And I press "Upload"
And wait for the page to be loaded
Then I should see "Definition of oligarchy"

@ -24,7 +24,6 @@ Feature: Group tool
And I press "submit"
Then I should see "group(s) has (have) been added"
Scenario: Create document folder in group
Given I am on "/main/group/group.php?cidReq=TEMP&id_session=0"
And I follow "Group 0001"
@ -77,11 +76,9 @@ Feature: Group tool
Then I should see "My folder in group"
Then I follow "My folder in group"
Then I follow "Delete"
And I confirm the popup
Then I should see "Document deleted"
Then I follow "Delete"
And I confirm the popup
Then I should see "Document deleted"
Then wait for the page to be loaded
Then I should see "Are you sure to delete"
Then I follow "delete_item"
Scenario: Delete directory
Given I am on "/main/group/group.php?cidReq=TEMP&id_session=0"
@ -90,5 +87,6 @@ Feature: Group tool
And I follow "Documents"
Then I should see "My folder in group"
Then I follow "Delete"
And I confirm the popup
Then I should see "Document deleted"
Then wait for the page to be loaded
Then I should see "Are you sure to delete"
Then I follow "delete_item"

@ -54,9 +54,22 @@ Feature: LP tool
And I follow "Delete"
Then I should not see "LP category 1"
# Scenario: Check the PDF export in LP list if hide SCORM PDF link is false
# Given I am on "/main/admin/settings.php?category=Course"
# And I check the "hide_scorm_pdf_link" radio button with "false" value
# And I press "Save settings"
# And I am on "/main/lp/lp_controller.php?cidReq=TEMP&action=list&isStudentView=true"
# Then I should see an icon with title "Export to PDF"
#
# Scenario: Check the PDF export in LP list if hide SCORM PDF link is true
# Given I am on "/main/admin/settings.php?category=Course"
# And I check the "hide_scorm_pdf_link" radio button with "true" value
# And I press "Save settings"
# And I am on "/main/lp/lp_controller.php?cidReq=TEMP&action=list&isStudentView=true"
# Then I should not see an icon with title "Export to PDF"
Scenario: Delete a LP
Given I am on "/main/lp/lp_controller.php?cidReq=TEMP&action=list"
And I follow "Delete"
And I confirm the popup
Then I should not see "LP 1"

@ -47,8 +47,8 @@ Feature: Work tool
And I follow "Work 1"
And wait for the page to be loaded
Then I should see "Work description"
Then I follow "Correct and rate"
Then I follow "Download"
And wait for the page to be loaded
Then I should see "base.css"
# Scenario: Add a comment and a attachment to the work previously uploaded by student
# Given I am a platform administrator

@ -7,9 +7,9 @@ exit;
require_once '../../main/inc/global.inc.php';
/** @var The course id $courseId */
/** @var int $courseId */
$onlyCourseId = 0;
/** @var The LP id $lpId */
/** @var int $lpId lp id */
$lpId = 0;
$courses = Database::select('id, title, code', Database::get_main_table(TABLE_MAIN_COURSE));
@ -20,6 +20,8 @@ $toolTable = Database::get_course_table(TABLE_TOOL_LIST);
$sessions = Database::select('id', Database::get_main_table(TABLE_MAIN_SESSION));
if (!empty($sessions)) {
$sessions = array_column($sessions, 'id');
// Add session_id = 0
$sessions[] = 0;
} else {
$sessions = [0];
}
@ -34,6 +36,7 @@ foreach ($courses as $course) {
$sql = "SELECT * FROM $tblCLp WHERE c_id = $courseId AND iid <> id ORDER by iid";
echo 'Select all lps';
var_dump($sql);
error_log($sql);
$result = Database::query($sql);
$myOnlyLpList = [];
@ -43,8 +46,8 @@ foreach ($courses as $course) {
$oldId = $lpInfo['id'];
$sql = "SELECT * FROM $tblCLpItem
WHERE c_id = $courseId AND lp_id = $oldId ORDER by iid";
echo "<h3>$sql</h3>";
echo "New lp.iid $lpIid / old lp.id $oldId";
//echo "<h3>$sql</h3>";
//echo "New lp.iid $lpIid / old lp.id $oldId";
$items = Database::store_result(Database::query($sql),'ASSOC');
$lpInfo['lp_list'] = $items;
$myOnlyLpList[] = $lpInfo;
@ -99,7 +102,7 @@ foreach ($courses as $course) {
$sql = "UPDATE $tblCLpItem SET $variable = $newId
WHERE iid = $itemIid AND c_id = $courseId AND lp_id = $oldId";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
}
}
@ -114,7 +117,7 @@ foreach ($courses as $course) {
$sql = "UPDATE $tblCLpItem SET path = $newDocumentId
WHERE iid = $itemIid AND c_id = $courseId";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
}
}
}
@ -123,25 +126,25 @@ foreach ($courses as $course) {
$sql = "UPDATE c_lp_view SET last_item = $itemIid
WHERE c_id = $courseId AND last_item = $itemId AND lp_id = $oldId";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
// c_lp_item_view
$sql = "UPDATE c_lp_item_view SET lp_item_id = $itemIid
WHERE c_id = $courseId AND lp_item_id = $itemId ";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
// Update track_exercises
$sql = "UPDATE track_e_exercises SET orig_lp_item_id = $itemIid
WHERE c_id = $courseId AND orig_lp_id = $oldId AND orig_lp_item_id = $itemId";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
// c_forum_thread
$sql = "UPDATE c_forum_thread SET lp_item_id = $itemIid
WHERE c_id = $courseId AND lp_item_id = $itemId";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
// orig_lp_item_view_id
$sql = "SELECT * FROM c_lp_view
@ -166,40 +169,42 @@ foreach ($courses as $course) {
exe_user_id = $userId
";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
}
}
$sql = "UPDATE $tblCLpItem SET lp_id = $lpIid
WHERE c_id = $courseId AND lp_id = $oldId AND id = $itemId";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
$sql = "UPDATE $tblCLpItem SET id = iid
WHERE c_id = $courseId AND lp_id = $oldId AND id = $itemId";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
}
$sql = "UPDATE c_lp_view SET lp_id = $lpIid WHERE c_id = $courseId AND lp_id = $oldId";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
$sql = "UPDATE c_forum_forum SET lp_id = $lpIid WHERE c_id = $courseId AND lp_id = $oldId";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
// Update track_exercises
$sql = "UPDATE track_e_exercises SET orig_lp_id = $lpIid
WHERE c_id = $courseId AND orig_lp_id = $oldId";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
$sql = "UPDATE $tblCLp SET id = iid WHERE c_id = $courseId AND id = $oldId ";
Database::query($sql);
var_dump($sql);
//var_dump($sql);
}
}
}
echo 'finished';
error_log('finished');

@ -2,3 +2,4 @@
; see http://docs.travis-ci.com/user/languages/php/#Custom-PHP-configuration
date.timezone = Europe/Paris
phar.readonly = Off
memory_limit = 4096M

@ -18,7 +18,7 @@ sudo sed -e "s?;error_log = log/php-fpm.log?error_log = /var/log/php-fpm.log?g"
echo "cgi.fix_pathinfo = 1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
echo "always_populate_raw_post_data = -1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
echo "error_log = /var/log/php-fpm.log" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
echo "memory_limit = 2G" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
echo "memory_limit = 4G" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
# Starting PHP FPM
~/.phpenv/versions/$(phpenv version-name)/sbin/php-fpm

@ -8,9 +8,9 @@
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/%VHOST_URL%-error.log
#ErrorLog ${APACHE_LOG_DIR}/%VHOST_URL%-error.log
LogLevel notice
CustomLog ${APACHE_LOG_DIR}/%VHOST_URL%-access.log combined
#CustomLog ${APACHE_LOG_DIR}/%VHOST_URL%-access.log combined
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php

Loading…
Cancel
Save